温馨提示:代码在线浏览功能只能做为源码浏览参考,如果想更进一步了解该代码请下载:SpaceBuilder v1.0正式版源码
1//------------------------------------------------------------------------------ 2
// <copyright company="Tunynet"> 3
// Copyright (c) Tunynet Network Technology Co., Ltd. All rights reserved. 4
// </copyright> 5
//------------------------------------------------------------------------------ 6
7
using System; 8
using System.Collections.Generic; 9
using System.Text; 10
using System.Web; 11
using SpaceBuilder.Components; 12
using SpaceBuilder.Blogs.Components; 13
using TunyNet.Utils; 14
using SpaceBuilder.Posts.Permissions; 15
using System.Xml; 16
using System.Text.RegularExpressions; 17
18
namespace SpaceBuilder.Blogs.Controls 19
{ 20
/// <summary> 21
/// Summary description for TrackBackHandler. 22
/// </summary> 23
public class TrackBackHandler : IHttpHandler 24
{ 25
public TrackBackHandler() 26
{ } 27
28
public void ProcessRequest(HttpContext context) 29
{ 30
context.Response.ContentType = "text/xml"; 31
User user = SBContext.Current.User; 32
int postId = 0; 33
try 34
{ 35
postId = int.Parse(context.Request.QueryString["postid"]); 36
} 37
catch 38
{ 39
trackbackResponse(context, 1, "EntryID is invalid or missing"); 40
} 41
42
43
if (context.Request.HttpMethod == "POST") 44
{ 45
string title = safeParam(context, "title"); 46
string excerpt = safeParam(context, "excerpt"); 47
string url = safeParam(context, "url"); 48
string blog_name = safeParam(context, "blog_name"); 49
50
if (!ValueHelper.IsNullOrEmpty(excerpt)) 51
excerpt = HtmlUtils.TrimHtml(excerpt, 250); 52
try 53
{ 54
// is the url valid ? 55
if (url == "") 56
trackbackResponse(context, 1, "no url parameter found, please try harder!"); 57
58
string pageTitle = null; 59
60
BlogThread trackedEntry = BlogPosts.GetThread(postId, true); 61
62
if (trackedEntry == null) 63
trackbackResponse(context, 2, "The link does not exist"); 64
65
66
Weblog wl = trackedEntry.Section as Weblog; 67
68
Permissions.AccessCheck(wl, Permission.View, user); 69
70
if (!wl.EnableTrackbacks) 71
{ 72
trackbackResponse(context, 2, "Trackbacks are not enabled"); 73
return; 74
} 75
76
if (!IsNewTrackBack(trackedEntry, url)) 77
{ 78
trackbackResponse(context, 2, "Trackbacks already exists"); 79
return; 80
81
} 82
83
if (trackedEntry != null && !SourceContainsTarget(url, WebUtils.FullPath(BlogUrls.Instance().ShowPost(trackedEntry, wl)), out pageTitle)) 84
{ 85
trackbackResponse(context, 2, "Sorry couldn't find a relevant link in " + url); 86
} 87
88
BlogPost entry = new BlogPost(); 89
entry.BlogPostType = BlogPostType.Trackback; 90
entry.SectionID = wl.SectionID; 91
entry.ParentID = postId; 92
entry.Subject = title; 93
entry.TitleUrl = url; 94
entry.TrackBackName = blog_name; 95
entry.Body = excerpt; 96
entry.IsApproved = true; 97
entry.PostDate = DateTime.Now; 98
//entry.BloggerTime = DateTime.Now; 99
BlogPosts.CreatePost(entry); 100
} 101
catch (System.Threading.ThreadAbortException) { } 102
catch (System.Exception ex) 103
{ 104
if (ex.Message != null) 105
trackbackResponse(context, 0, string.Format("Error occurred while processing Trackback: {0}", ex.Message)); 106
else 107
trackbackResponse(context, 0, "Unknown error occurred while processing Trackback."); 108
} 109
} 110
else 111
{ 112
BlogThread entry = BlogPosts.GetThread(postId, true); 113
114
Weblog wl = entry.Section as Weblog; 115
Permissions.AccessCheck(wl, Permission.View, user); 116
117
XmlTextWriter w = new XmlTextWriter(context.Response.Output); 118
w.Formatting = Formatting.Indented; 119
120
w.WriteStartDocument(); 121
w.WriteStartElement("response"); 122
w.WriteElementString("error", "0"); 123
w.WriteStartElement("rss"); 124
w.WriteAttributeString("version", "0.91"); 125
w.WriteStartElement("channel"); 126
w.WriteElementString("title", entry.Subject); 127
w.WriteElementString("link", BlogUrls.Instance().TrackbackPingUrl(postId)); 128
w.WriteElementString("description", ""); 129
w.WriteElementString("language", "en-us"); 130
131
w.WriteEndElement(); // channel 132
w.WriteEndElement(); // rss 133
w.WriteEndElement(); // response 134
w.WriteEndDocument(); 135
} 136
137
} 138
139
public bool IsReusable 140
{ 141
get { return true; } 142
} 143
144
private void trackbackResponse(HttpContext context, int errNum, string errText) 145
{ 146
// Log trackback failure messae to the EventLog 147
string message = String.Format("Trackback request received by SpaceBuilder but failed due to one or more reasons. The request URL was [{0}]. Error message returned was: {1}.", context.Request.RawUrl, errText); 148
149
XmlDocument d = new XmlDocument(); 150
XmlElement root = d.CreateElement("response"); 151
d.AppendChild(root); 152
XmlElement er = d.CreateElement("error"); 153
root.AppendChild(er); 154
er.AppendChild(d.CreateTextNode(errNum.ToString())); 155
if (errText != "") 156
{ 157
XmlElement msg = d.CreateElement("message"); 158
root.AppendChild(msg); 159
msg.AppendChild(d.CreateTextNode(errText)); 160
} 161
d.Save(context.Response.Output); 162
context.Response.End(); 163
} 164
165
private string safeParam(HttpContext context, string pName) 166
{ 167
if (context.Request.Form[pName] != null) 168
return WebUtils.HtmlEncode(context.Request.Form[pName]); 169
return string.Empty; 170
} 171
172
public static bool SourceContainsTarget(string sURI, string tURI, out string pageTitle) 173
{ 174
pageTitle = string.Empty; 175
string page = SBRequest.GetPageText(sURI, tURI); 176
if (page == null || page.IndexOf(tURI) < 0) 177
return false; 178
179
string pat = @"<head.*?>.*<title.*?>(.*)</title.*?>.*</head.*?>"; 180
Regex reg = new Regex(pat, RegexOptions.IgnoreCase | RegexOptions.Singleline); 181
Match m = reg.Match(page); 182
if (m.Success) 183
{ 184
pageTitle = HtmlUtils.TrimHtml(m.Result("$1")); 185
return true; 186
} 187
188
return false; 189
} 190
191
protected static bool IsNewTrackBack(BlogThread post, string trackbackUrl) 192
{ 193
BlogPostSetQuery query = new BlogPostSetQuery(); 194
query.PostID = post.PostID; 195
query.ReturnFullThread = true; 196
197
PostSet ps = BlogPosts.GetPostSet(query); 198
199
foreach (BlogPost p in ps.Replies) 200
{ 201
if ((string.Compare(trackbackUrl, p.TitleUrl, true) == 0) && (p.BlogPostType == BlogPostType.Trackback)) 202
return false; 203
} 204
205
return true; 206
} 207
208
209
210
} 211
} 212
213





}