public static string CreateSeoMetaInformation(EntryCollection weblogEntries, IBlogDataService dataService) { string metaTags = "\r\n"; string currentUrl = HttpContext.Current.Request.Url.AbsoluteUri; if (currentUrl.IndexOf("categoryview.aspx", StringComparison.OrdinalIgnoreCase) > -1 || currentUrl.IndexOf("default.aspx?month=", StringComparison.OrdinalIgnoreCase) > -1) { metaTags += MetaNoindexFollowPattern; } else if (currentUrl.IndexOf("permalink.aspx", StringComparison.OrdinalIgnoreCase) > -1) { if (weblogEntries.Count >= 1) { Entry entry = weblogEntries[0]; metaTags = GetMetaTags(metaTags, entry); } } else if (currentUrl.IndexOf("commentview.aspx", StringComparison.OrdinalIgnoreCase) > -1 && !string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["guid"])) { Entry entry = dataService.GetEntry(HttpContext.Current.Request.QueryString["guid"]); if (entry != null) { metaTags = GetMetaTags(metaTags, entry); } } else if (currentUrl.IndexOf("commentview.aspx", StringComparison.OrdinalIgnoreCase) > -1 && !string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["title"])) { Entry entry = dataService.GetEntry(HttpContext.Current.Request.QueryString["title"]); if (entry != null) { metaTags = GetMetaTags(metaTags, entry); } } else if (currentUrl.IndexOf("default.aspx", StringComparison.OrdinalIgnoreCase) > -1) { var smt = new SeoMetaTags(); smt = smt.GetMetaTags(); if (smt != null) { if (!string.IsNullOrEmpty(smt.MetaDescription)) { metaTags += string.Format(MetaDescriptionTagPattern, smt.MetaDescription); } if (!string.IsNullOrEmpty(smt.MetaKeywords)) { metaTags += string.Format(MetaKeywordTagPattern, smt.MetaKeywords); } } metaTags += string.Format(CanonicalLinkPattern, SiteUtilities.GetBaseUrl()); } return metaTags; }
public static void RepairComments(DayExtra dayExtra, IBlogDataService dataService) { //SDH: Corruption or poorly imported comments can have no entry id! // Create one if it's missing. This will slowly repair the damage for (int i = 0; i < dayExtra.Comments.Count; i++) { if (dayExtra.Comments[i].EntryId == null) { dayExtra.Comments[i].EntryId = Guid.NewGuid().ToString(); Entry entry = dataService.GetEntry(dayExtra.Comments[i].TargetEntryId); if (entry != null) { dayExtra.Comments[i].TargetTitle = entry.Title; } WriteLine(String.Format("...Repaired Comments in {0}", dayExtra.FileName)); } } }
public void ProcessRequest(HttpContext context) { if (!SiteSecurity.IsValidContributor()) { context.Response.Redirect("~/FormatPage.aspx?path=SiteConfig/accessdenied.format.html"); } SiteConfig siteConfig = SiteConfig.GetSiteConfig(); string entryId = ""; string author = ""; string title = ""; string textToSave = ""; string redirectUrl = SiteUtilities.GetStartPageUrl(); System.Xml.XmlTextReader xtr = new System.Xml.XmlTextReader(context.Request.InputStream); try { while (!xtr.EOF) { xtr.Read(); if (xtr.Name == "entryid") { entryId = xtr.ReadInnerXml(); } if (xtr.Name == "author") { author = xtr.ReadInnerXml(); } if (xtr.Name == "title" && xtr.NodeType == System.Xml.XmlNodeType.Element) { // Ensure this is the start element before moving forward to the CDATA. xtr.Read(); // Brings us to the CDATA inside "title" title = xtr.Value; } if (xtr.Name == "posttext" && xtr.NodeType == System.Xml.XmlNodeType.Element) { xtr.Read(); textToSave = xtr.Value; } } } finally { xtr.Close(); } // make sure the entry param is there if (entryId == null || entryId.Length == 0) { context.Response.Redirect(SiteUtilities.GetStartPageUrl(siteConfig)); return; } else { ILoggingDataService logService = LoggingDataServiceFactory.GetService(SiteConfig.GetLogPathFromCurrentContext()); IBlogDataService dataService = BlogDataServiceFactory.GetService(SiteConfig.GetContentPathFromCurrentContext(), logService); // First, attempt to get the entry. If the entry exists, then get it for editing // and save. If not, create a brand new entry and save it instead. Entry entry = dataService.GetEntry(entryId); if (entry != null) { entry = dataService.GetEntryForEdit(entryId); Entry modifiedEntry = entry.Clone(); modifiedEntry.Content = textToSave; modifiedEntry.Title = title; modifiedEntry.Author = author; modifiedEntry.Syndicated = false; modifiedEntry.IsPublic = false; modifiedEntry.ModifiedUtc = DateTime.Now.ToUniversalTime(); modifiedEntry.Categories = ""; dataService.SaveEntry(modifiedEntry, null); //context.Request.Form["textbox1"]; logService.AddEvent( new EventDataItem( EventCodes.EntryChanged, entryId, context.Request.RawUrl)); } else { // This is a brand new entry. Create the entry and save it. entry = new Entry(); entry.EntryId = entryId; entry.CreatedUtc = DateTime.Now.ToUniversalTime(); entry.ModifiedUtc = DateTime.Now.ToUniversalTime(); entry.Title = title; entry.Author = author; entry.Content = textToSave; entry.Syndicated = false; entry.IsPublic = false; dataService.SaveEntry(entry, null); //context.Request.Form["textbox1"]; logService.AddEvent( new EventDataItem( EventCodes.EntryAdded, entryId, context.Request.RawUrl)); } } }
public Entry GetBlogPost(string postid) { return(_dataService.GetEntry(postid)); }
public void ProcessRequest(HttpContext context) { if (context.Request.ContentType == "text/xml" && context.Request.RequestType == "POST" && context.Request.QueryString["guid"] != null) { try { ILoggingDataService logService = LoggingDataServiceFactory.GetService(SiteConfig.GetLogPathFromCurrentContext()); IBlogDataService dataService = BlogDataServiceFactory.GetService(SiteConfig.GetContentPathFromCurrentContext(), logService); DataCache cache = CacheFactory.GetCache(); Entry entry = dataService.GetEntry(context.Request.QueryString["guid"]); if (entry != null && DasBlog.Web.Core.SiteUtilities.AreCommentsAllowed(entry, SiteConfig.GetSiteConfig())) { XmlSerializer ser = new XmlSerializer(typeof(RssItem)); RssItem item = (RssItem)ser.Deserialize(context.Request.InputStream); if (item != null) { Comment c = new Comment(); c.Initialize(); foreach (XmlElement el in item.anyElements) { if (el.NamespaceURI == "http://purl.org/dc/elements/1.1/" && el.LocalName == "creator") { c.Author = el.InnerText; break; } } c.AuthorEmail = item.Author; c.AuthorHomepage = item.Link; c.AuthorIPAddress = context.Request.UserHostAddress; c.Content = context.Server.HtmlEncode(item.Description); c.TargetEntryId = entry.EntryId; c.TargetTitle = ""; dataService.AddComment(c); // TODO: no comment mail? // break the caching cache.Remove("BlogCoreData"); context.Response.StatusCode = 200; context.Response.SuppressContent = true; context.Response.End(); } } else if (entry != null && !entry.AllowComments) { context.Response.StatusCode = 403; // Forbidden context.Response.SuppressContent = true; context.Response.End(); } else if (entry == null) { context.Response.StatusCode = 404; // Not Found context.Response.SuppressContent = true; context.Response.End(); } } catch (Exception exc) { ErrorTrace.Trace(System.Diagnostics.TraceLevel.Error, exc); } } }
public string ping( string sourceUri, string targetUri) { if (!siteConfig.EnablePingbackService) { throw new ServiceDisabledException(); } string returnValue = "0"; if (ReferralBlackList.IsBlockedReferrer(sourceUri)) { if (siteConfig.EnableReferralUrlBlackList404s) { this.Context.Response.StatusCode = 404; this.Context.Response.End(); throw new XmlRpcFaultException(404, "not found"); } } try { string entryId = null; // OmarS: need to rewrite the URL so w can find the entryId Uri uriTargetUri = new Uri(SiteUtilities.MapUrl(targetUri)); string query = uriTargetUri.Query; if (query.Length > 0 && query[0] == '?') { query = query.Substring(1); } else { return(returnValue); } string[] queryItems = query.Split('&'); if (queryItems == null) { return(returnValue); } foreach (string queryItem in queryItems) { string[] keyvalue = queryItem.Split('='); if (keyvalue.Length == 2) { string key = keyvalue[0]; string @value = keyvalue[1]; if (key == "guid") { entryId = @value; break; } } } if (entryId != null) { Entry entry = dataService.GetEntry(entryId); if (entry != null) { Tracking t = new Tracking(); t.PermaLink = sourceUri; t.Referer = this.Context.Request.UrlReferrer != null?this.Context.Request.UrlReferrer.ToString() : String.Empty; t.RefererBlogName = sourceUri; t.RefererExcerpt = String.Empty; t.RefererTitle = sourceUri; t.TargetEntryId = entryId; t.TargetTitle = entry.Title; t.TrackingType = TrackingType.Pingback; t.RefererIPAddress = this.Context.Request.UserHostAddress; ISpamBlockingService spamBlockingService = siteConfig.SpamBlockingService; if (spamBlockingService != null) { bool isSpam = false; try { isSpam = spamBlockingService.IsSpam(t); } catch (Exception ex) { logDataService.AddEvent(new EventDataItem(EventCodes.Error, String.Format("The external spam blocking service failed for pingback from {0}. Original exception: {1}", sourceUri, ex), targetUri)); } if (isSpam) { //TODO: May provide moderation in the future. For now we just ignore the pingback logDataService.AddEvent(new EventDataItem( EventCodes.PingbackBlocked, "Pingback blocked from " + sourceUri + " because it was considered spam by the external blocking service.", targetUri, sourceUri)); System.Web.HttpContext.Current.Response.StatusCode = 404; System.Web.HttpContext.Current.Response.End(); throw new XmlRpcFaultException(404, "not found"); } } if (siteConfig.SendPingbacksByEmail && siteConfig.SmtpServer != null && siteConfig.SmtpServer.Length > 0) { MailMessage emailMessage = new MailMessage(); if (siteConfig.NotificationEMailAddress != null && siteConfig.NotificationEMailAddress.Length > 0) { emailMessage.To.Add(siteConfig.NotificationEMailAddress); } else { emailMessage.To.Add(siteConfig.Contact); } emailMessage.Subject = String.Format("Weblog pingback by '{0}' on '{1}'", sourceUri, t.TargetTitle); emailMessage.Body = String.Format("You were pinged back by\n{0}\r\non your weblog entry '{1}'\n({2}\r\n\r\nDelete Trackback: {3})", sourceUri, t.TargetTitle, SiteUtilities.GetPermaLinkUrl(entry), SiteUtilities.GetTrackbackDeleteUrl(entryId, t.PermaLink, t.TrackingType)); emailMessage.IsBodyHtml = false; emailMessage.BodyEncoding = System.Text.Encoding.UTF8; emailMessage.From = new MailAddress(siteConfig.Contact); SendMailInfo sendMailInfo = new SendMailInfo(emailMessage, siteConfig.SmtpServer, siteConfig.EnableSmtpAuthentication, siteConfig.UseSSLForSMTP, siteConfig.SmtpUserName, siteConfig.SmtpPassword, siteConfig.SmtpPort); dataService.AddTracking(t, sendMailInfo); } else { dataService.AddTracking(t); } logDataService.AddEvent( new EventDataItem(EventCodes.PingbackReceived, entry.Title, targetUri, sourceUri)); returnValue = sourceUri; } } } catch (Exception e) { ErrorTrace.Trace(System.Diagnostics.TraceLevel.Error, e); return("0"); } return(returnValue); }
public void ProcessRequest(HttpContext context) { SiteConfig siteConfig = SiteConfig.GetSiteConfig(); string entryId; string title; string excerpt; string url; string blog_name; if (!siteConfig.EnableTrackbackService) { context.Response.StatusCode = 503; context.Response.Status = "503 Service Unavailable"; context.Response.End(); return; } // Try blocking them once, on the off chance they sent us a referrer string referrer = context.Request.UrlReferrer != null?context.Request.UrlReferrer.AbsoluteUri:""; if (ReferralBlackList.IsBlockedReferrer(referrer)) { if (siteConfig.EnableReferralUrlBlackList404s) { context.Response.StatusCode = 404; context.Response.End(); return; } } entryId = context.Request.QueryString["guid"]; if (context.Request.HttpMethod == "POST") { title = context.Request.Form["title"]; excerpt = context.Request.Form["excerpt"]; url = context.Request.Form["url"]; blog_name = context.Request.Form["blog_name"]; } /* GET is no longer in the Trackback spec. Keeping * this arround for testing. Just uncomment. * else if ( context.Request.HttpMethod == "GET" ) * { * title = context.Request.QueryString["title"]; * excerpt= context.Request.QueryString["excerpt"]; * url = context.Request.QueryString["url"]; * blog_name = context.Request.QueryString["blog_name"]; * } */ else { context.Response.Redirect(SiteUtilities.GetStartPageUrl(siteConfig)); return; } if (url != null && url.Length > 0) { try { // First line of defense, try blocking again with the URL they are tracking us back with if (ReferralBlackList.IsBlockedReferrer(url)) { if (siteConfig.EnableReferralUrlBlackList404s) { context.Response.StatusCode = 404; context.Response.End(); return; } } ILoggingDataService logService = LoggingDataServiceFactory.GetService(SiteConfig.GetLogPathFromCurrentContext()); IBlogDataService dataService = BlogDataServiceFactory.GetService(SiteConfig.GetContentPathFromCurrentContext(), logService); Entry entry = dataService.GetEntry(entryId); if (entry != null) { try { string requestBody = null; // see if this is a spammer HttpWebRequest webRequest = WebRequest.Create(url) as HttpWebRequest; webRequest.Method = "GET"; webRequest.UserAgent = SiteUtilities.GetUserAgent(); HttpWebResponse response = webRequest.GetResponse() as HttpWebResponse; // now we want to get the page contents of the target body using (StreamReader requestReader = new StreamReader(response.GetResponseStream())) { requestBody = requestReader.ReadToEnd(); } response.Close(); // the source URL in the page could be URL encoded like the ClickThroughHandler does string urlEncodedBaseUrl = HttpUtility.UrlEncode(SiteUtilities.GetBaseUrl()); // check to see if the source's page contains a link to us if (Regex.Match(requestBody, SiteUtilities.GetBaseUrl()).Success == false && Regex.Match(requestBody, urlEncodedBaseUrl).Success == false) { logService.AddEvent(new EventDataItem( EventCodes.TrackbackBlocked, context.Request.UserHostAddress + " because it did not contain a link", SiteUtilities.GetPermaLinkUrl(entryId), url, entry.Title )); context.Response.StatusCode = 404; context.Response.End(); return; } } catch { // trackback url is not even alive logService.AddEvent(new EventDataItem( EventCodes.TrackbackBlocked, context.Request.UserHostAddress + " because the server did not return a valid response", SiteUtilities.GetPermaLinkUrl(entryId), url, entry.Title )); context.Response.StatusCode = 404; context.Response.End(); return; } // if we've gotten this far, the trackback is real and valid Tracking t = new Tracking(); t.PermaLink = url; t.Referer = context.Request.UrlReferrer != null?context.Request.UrlReferrer.ToString() : String.Empty; t.RefererBlogName = blog_name; t.RefererExcerpt = excerpt; t.RefererTitle = title; t.RefererIPAddress = context.Request.UserHostAddress; t.TargetEntryId = entryId; t.TargetTitle = entry.Title; t.TrackingType = TrackingType.Trackback; ISpamBlockingService spamBlockingService = siteConfig.SpamBlockingService; if (spamBlockingService != null) { bool isSpam = false; try { isSpam = spamBlockingService.IsSpam(t); } catch (Exception ex) { logService.AddEvent(new EventDataItem(EventCodes.Error, String.Format("The external spam blocking service failed for trackback from {0}. Original exception: {1}", t.PermaLink, ex), SiteUtilities.GetPermaLinkUrl(entryId))); } if (isSpam) { //TODO: maybe we can add a configuration option to moderate trackbacks. // For now, we'll just avoid saving suspected spam logService.AddEvent(new EventDataItem( EventCodes.TrackbackBlocked, context.Request.UserHostAddress + " because it was considered spam by the external blocking service.", SiteUtilities.GetPermaLinkUrl(entryId), url, entry.Title )); context.Response.StatusCode = 404; context.Response.End(); return; } } if (siteConfig.SendTrackbacksByEmail && siteConfig.SmtpServer != null && siteConfig.SmtpServer.Length > 0) { MailMessage emailMessage = new MailMessage(); if (siteConfig.NotificationEMailAddress != null && siteConfig.NotificationEMailAddress.Length > 0) { emailMessage.To.Add(siteConfig.NotificationEMailAddress); } else { emailMessage.To.Add(siteConfig.Contact); } emailMessage.Subject = String.Format("Weblog trackback by '{0}' on '{1}'", t.PermaLink, t.TargetTitle); emailMessage.Body = String.Format("You were tracked back from\n{0}\r\non your weblog entry '{1}'\n({2}\r\n\r\nDelete Trackback: {3})", t.PermaLink, t.TargetTitle, SiteUtilities.GetPermaLinkUrl(entryId), SiteUtilities.GetTrackbackDeleteUrl(entryId, t.PermaLink, t.TrackingType)); emailMessage.IsBodyHtml = false; emailMessage.BodyEncoding = System.Text.Encoding.UTF8; emailMessage.From = new MailAddress(siteConfig.Contact); SendMailInfo sendMailInfo = new SendMailInfo(emailMessage, siteConfig.SmtpServer, siteConfig.EnableSmtpAuthentication, siteConfig.UseSSLForSMTP, siteConfig.SmtpUserName, siteConfig.SmtpPassword, siteConfig.SmtpPort); dataService.AddTracking(t, sendMailInfo); } else { dataService.AddTracking(t); } logService.AddEvent( new EventDataItem( EventCodes.TrackbackReceived, entry.Title, SiteUtilities.GetPermaLinkUrl(entryId), url)); // return the correct Trackback response // http://www.movabletype.org/docs/mttrackback.html context.Response.Write("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><response><error>0</error></response>"); return; } } catch (System.Threading.ThreadAbortException ex) { // absorb ErrorTrace.Trace(System.Diagnostics.TraceLevel.Error, ex); return; } catch (Exception exc) { // absorb ErrorTrace.Trace(System.Diagnostics.TraceLevel.Error, exc); // return the correct Trackback response // http://www.movabletype.org/docs/mttrackback.html context.Response.Write("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><response><error>1</error><message>" + exc.ToString() + "</message></response>"); return; } } if (entryId != null && entryId.Length > 0) { context.Response.Redirect(SiteUtilities.GetPermaLinkUrl(siteConfig, entryId)); } else { context.Response.Redirect(SiteUtilities.GetStartPageUrl(siteConfig)); } }
/// <summary> /// Deletes an entry, including comments enclosures etc. /// </summary> /// <remarks>Admins can delete all, contributors only their own.</remarks> /// <param name="entryId">The entry to delete.</param> /// <param name="siteConfig"></param> /// <param name="logService"></param> /// <param name="dataService"></param> public static void DeleteEntry(string entryId, SiteConfig siteConfig, ILoggingDataService logService, IBlogDataService dataService) { try { IPrincipal user = HttpContext.Current.User; Entry entry = dataService.GetEntry(entryId); //fix: admins can delete all, contributors only their own if (!CanEdit(user, entry)) { throw new SecurityException("Current user is not allowed to delete this entry!"); } string permalink = SiteUtilities.GetPermaLinkUrl(entry.EntryId); //string[] categories = entry.GetSplitCategories(); dataService.DeleteEntry(entryId, siteConfig.CrosspostSites); BreakCache(siteConfig, entry.GetSplitCategories()); // give the XSS upstreamer a hint that things have changed //FIX: XSSUpstreamer.TriggerUpstreaming(); // TODO: when we add support for more than just enclosures, we can't delete the entire folder DirectoryInfo enclosuresPath = new DirectoryInfo((Path.Combine(SiteConfig.GetBinariesPathFromCurrentContext(), entryId))); if (enclosuresPath.Exists) enclosuresPath.Delete(true); logService.AddEvent( new EventDataItem( EventCodes.EntryDeleted, entry.Title, permalink)); } catch (SecurityException) { throw; } catch (Exception ex) { StackTrace st = new StackTrace(); logService.AddEvent( new EventDataItem(EventCodes.Error, ex.ToString() + Environment.NewLine + st.ToString(), HttpContext.Current.Request.RawUrl)); // DESIGN: We should rethrow the exception for the calling class, but this break too much for this point release. } }
public void ProcessRequest(HttpContext context) { if (!SiteSecurity.IsValidContributor()) { context.Response.Redirect("~/FormatPage.aspx?path=SiteConfig/accessdenied.format.html"); } SiteConfig siteConfig = SiteConfig.GetSiteConfig(); string entryId; string commentId; string referralPermalink; string type; string redirectUrl = SiteUtilities.GetStartPageUrl(); bool reportAsSpam; entryId = context.Request.QueryString["entryId"]; commentId = context.Request.QueryString["commentId"]; referralPermalink = context.Request.QueryString["referralPermalink"]; type = context.Request.QueryString["type"]; reportAsSpam = context.Request.QueryString["report"] != null; // make sure the entry param is there if (entryId == null || entryId.Length == 0) { context.Response.Redirect(SiteUtilities.GetStartPageUrl(siteConfig)); return; } else { try { ILoggingDataService logService = LoggingDataServiceFactory.GetService(SiteConfig.GetLogPathFromCurrentContext()); IBlogDataService dataService = BlogDataServiceFactory.GetService(SiteConfig.GetContentPathFromCurrentContext(), logService); Entry entry = dataService.GetEntry(entryId); if (entry != null) { if (commentId != null && commentId.Length > 0) { if (reportAsSpam) { ISpamBlockingService spamBlockingService = siteConfig.SpamBlockingService; if (spamBlockingService != null) { Comment comment = dataService.GetCommentById(entryId, commentId); if ((comment != null) && (comment.SpamState != SpamState.Spam)) { try { spamBlockingService.ReportSpam(comment); } catch (Exception ex) { logService.AddEvent(new EventDataItem(EventCodes.Error, String.Format("Unable to report comment {0} as spam. Original exception: {1}", comment.EntryId, ex), SiteUtilities.GetPermaLinkUrl(entryId))); } } } } dataService.DeleteComment(entryId, commentId); logService.AddEvent( new EventDataItem( EventCodes.CommentDeleted, commentId, SiteUtilities.GetPermaLinkUrl(entryId))); redirectUrl = SiteUtilities.GetCommentViewUrl(entryId); } else if (referralPermalink != null && referralPermalink.Length > 0) { TrackingType trackingType = TrackingType.Referral; if (type != null && type.Length != 0) { trackingType = (TrackingType)Enum.Parse(typeof(TrackingType), type); } dataService.DeleteTracking(entryId, referralPermalink, trackingType); logService.AddEvent( new EventDataItem( EventCodes.ItemReferralDeleted, referralPermalink, SiteUtilities.GetPermaLinkUrl(entryId))); redirectUrl = SiteUtilities.GetPermaLinkUrl(entryId); } else // it must be an entry we are deleting { SiteUtilities.DeleteEntry(entryId, siteConfig, logService, dataService); redirectUrl = SiteUtilities.GetStartPageUrl(); } } } catch (Exception exc) { // absorb ErrorTrace.Trace(System.Diagnostics.TraceLevel.Error, exc); } } context.Response.Redirect(redirectUrl); }