Exemple #1
0
        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;
        }
Exemple #2
0
		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));
                }
            }
        }
Exemple #4
0
 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));
            }
        }
Exemple #8
0
        /// <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);
        }