Пример #1
0
        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);
        }
Пример #2
0
        protected void Page_PreRender(object sender, System.EventArgs e)
        {
            SharedBasePage requestPage = Page as SharedBasePage;

            Control            root  = this;
            HtmlGenericControl entry = new HtmlGenericControl("div");

            if (SiteSecurity.GetUserByEmail(comment.AuthorEmail) == null)
            {
                entry.Attributes["class"] = "commentBoxStyle";
            }
            else
            {
                entry.Attributes["class"] = "commentBoxStyle commentBoxAuthorStyle";
            }
            root.Controls.Add(entry);

            HtmlGenericControl entryTitle = new HtmlGenericControl("div");

            entryTitle.Attributes["class"] = "commentDateStyle";

            //Add the unique anchor for each comment
            HtmlAnchor anchor = new HtmlAnchor();

            anchor.Name = comment.EntryId;
            entryTitle.Controls.Add(anchor);

            if (requestPage.SiteConfig.AdjustDisplayTimeZone)
            {
                entryTitle.Controls.Add(new LiteralControl(requestPage.SiteConfig.GetConfiguredTimeZone().FormatAdjustedUniversalTime(comment.CreatedUtc)));
            }
            else
            {
                entryTitle.Controls.Add(new LiteralControl(comment.CreatedUtc.ToString("U") + " UTC"));
            }
            entry.Controls.Add(entryTitle);


            HtmlGenericControl entryBody = new HtmlGenericControl("div");

            if (SiteSecurity.GetUserByEmail(comment.AuthorEmail) == null)
            {
                entryBody.Attributes["class"] = "commentBodyStyle";
            }
            else
            {
                entryBody.Attributes["class"] = "commentBodyStyle commentBodyAuthorStyle";
            }

            if (comment.Content != null)
            {
                entryBody.Controls.Add(new LiteralControl(Regex.Replace(comment.Content, "\n", "<br />")));
            }
            if (!requestPage.HideAdminTools && SiteSecurity.IsInRole("admin"))
            {
                HtmlGenericControl spamStatus = new HtmlGenericControl("div");
                spamStatus.Attributes["class"] = "commentSpamStateStyle";
                spamStatus.InnerText           = ApplicationResourceTable.GetSpamStateDescription(comment.SpamState);
                entryBody.Controls.Add(spamStatus);
            }


            entry.Controls.Add(entryBody);

            HtmlGenericControl footer = new HtmlGenericControl("div");

            footer.Attributes["class"] = "commentBoxFooterStyle";
            entry.Controls.Add(footer);


            if (requestPage.SiteConfig.CommentsAllowGravatar && String.IsNullOrEmpty(comment.AuthorEmail) == false)
            {
                string hash = "";
                byte[] data, enc;

                data = Encoding.Default.GetBytes(comment.AuthorEmail.ToLowerInvariant());

                using (MD5 md5 = new MD5CryptoServiceProvider())
                {
                    enc = md5.TransformFinalBlock(data, 0, data.Length);
                    foreach (byte b in md5.Hash)
                    {
                        hash += Convert.ToString(b, 16).ToLower().PadLeft(2, '0');
                    }
                    md5.Clear();
                }

                string nogravpath = "";
                if (requestPage.SiteConfig.CommentsGravatarNoImgPath != null)
                {
                    if (requestPage.SiteConfig.CommentsGravatarNoImgPath != "")
                    {
                        if (requestPage.SiteConfig.CommentsGravatarNoImgPath.Substring(0, 4) == "http")
                        {
                            nogravpath = "&default=" + Server.UrlEncode(requestPage.SiteConfig.CommentsGravatarNoImgPath);
                        }
                        else
                        {
                            nogravpath = "&default=" + Server.UrlEncode(requestPage.SiteConfig.Root + requestPage.SiteConfig.CommentsGravatarNoImgPath);
                        }
                    }
                }

                if (String.IsNullOrEmpty(requestPage.SiteConfig.CommentsGravatarNoImgPath) == false)
                {
                    if (requestPage.SiteConfig.CommentsGravatarNoImgPath == "identicon" ||
                        requestPage.SiteConfig.CommentsGravatarNoImgPath == "wavatar" ||
                        requestPage.SiteConfig.CommentsGravatarNoImgPath == "monsterid" ||
                        requestPage.SiteConfig.CommentsGravatarNoImgPath.Substring(0, 4) == "http")
                    {
                        nogravpath = "&default=" + Server.UrlEncode(requestPage.SiteConfig.CommentsGravatarNoImgPath);
                    }
                    else
                    {
                        nogravpath = "&default=" + Server.UrlEncode(requestPage.SiteConfig.Root + requestPage.SiteConfig.CommentsGravatarNoImgPath);
                    }
                }

                string gravborder = "";
                if (requestPage.SiteConfig.CommentsGravatarBorder != null)
                {
                    if (requestPage.SiteConfig.CommentsGravatarBorder != "")
                    {
                        gravborder = "&border=" + requestPage.SiteConfig.CommentsGravatarBorder;
                    }
                }

                string gravsize = "";
                if (requestPage.SiteConfig.CommentsGravatarSize != null)
                {
                    if (requestPage.SiteConfig.CommentsGravatarSize != "")
                    {
                        gravsize = "&size=" + requestPage.SiteConfig.CommentsGravatarSize;
                    }
                }

                string gravrating = "";
                if (requestPage.SiteConfig.CommentsGravatarRating != null)
                {
                    if (requestPage.SiteConfig.CommentsGravatarRating != "")
                    {
                        gravrating = "&rating=" + requestPage.SiteConfig.CommentsGravatarRating;
                    }
                }



                HtmlGenericControl entryGRAVATAR = new HtmlGenericControl("span");
                entryGRAVATAR.Attributes["class"] = "commentGravatarBlock";
                entryGRAVATAR.InnerHtml           = "<img class=\"commentGravatar\" src=\"http://www.gravatar.com/avatar.php?gravatar_id=" + hash + gravrating + gravsize + nogravpath + gravborder + "\"/>";
                footer.Controls.Add(entryGRAVATAR);
            }

            string authorLink = null;

            if (comment.AuthorHomepage != null && comment.AuthorHomepage.Length > 0)
            {
                authorLink = FixUrl(comment.AuthorHomepage);
            }
            else if (comment.AuthorEmail != null && comment.AuthorEmail.Length > 0)
            {
                if (!requestPage.SiteConfig.SupressEmailAddressDisplay)
                {
                    authorLink = "mailto:" + SiteUtilities.SpamBlocker(comment.AuthorEmail);
                }
            }

            if (authorLink != null)
            {
                HyperLink link = new HyperLink();
                link.Attributes["class"] = "commentPermalinkStyle";
                link.NavigateUrl         = authorLink;
                link.Text = comment.Author;
                link.Attributes.Add("rel", "nofollow");
                footer.Controls.Add(link);

                if (comment.OpenId)
                {
                    System.Web.UI.WebControls.Image i = new System.Web.UI.WebControls.Image();
                    i.ImageUrl = "~/images/openid-icon-small.gif";
                    i.CssClass = "commentOpenId";
                    link.Controls.Add(i);
                    Literal l = new Literal();
                    l.Text = comment.Author;
                    link.Controls.Add(l);
                }
            }
            else
            {
                Label l = new Label();
                l.Attributes["class"] = "commentPermalinkStyle";
                l.Text = comment.Author;
                footer.Controls.Add(l);
            }


            if (!requestPage.SiteConfig.SupressEmailAddressDisplay)
            {
                if (comment.AuthorEmail != null && comment.AuthorEmail.Length > 0)
                {
                    footer.Controls.Add(new LiteralControl(" | "));

                    HtmlGenericControl mailto = new HtmlGenericControl("span");
                    footer.Controls.Add(mailto);

                    HyperLink link = new HyperLink();
                    link.CssClass    = "commentMailToStyle";
                    link.NavigateUrl = "mailto:" + SiteUtilities.SpamBlocker(comment.AuthorEmail);
                    link.Text        = SiteUtilities.SpamBlocker(comment.AuthorEmail);
                    mailto.Controls.Add(link);
                }
            }

            if (!requestPage.HideAdminTools && SiteSecurity.IsInRole("admin"))
            {
                if (!string.IsNullOrEmpty(comment.AuthorIPAddress))
                {
                    try
                    {
                        if (requestPage.SiteConfig.ResolveCommenterIP == true)
                        {
                            System.Net.IPHostEntry hostInfo = System.Net.Dns.GetHostEntry(comment.AuthorIPAddress);
                            footer.Controls.Add(
                                new LiteralControl(" (" + comment.AuthorIPAddress + " " + hostInfo.HostName + ") "));
                        }
                        else
                        {
                            footer.Controls.Add(new LiteralControl(" (" + comment.AuthorIPAddress + ") "));
                        }
                    }
                    catch
                    {
                        footer.Controls.Add(new LiteralControl(" (" + comment.AuthorIPAddress + ") "));
                    }
                }

                footer.Controls.Add(new LiteralControl(" "));

                // create delete hyperlink
                HyperLink deleteHl = new HyperLink();
                deleteHl.CssClass = "deleteLinkStyle";
                System.Web.UI.WebControls.Image img = new System.Web.UI.WebControls.Image();
                img.CssClass    = "deleteLinkImageStyle";
                img.ImageUrl    = new Uri(new Uri(SiteUtilities.GetBaseUrl(requestPage.SiteConfig)), requestPage.GetThemedImageUrl("deletebutton")).ToString();
                img.BorderWidth = 0;
                deleteHl.Controls.Add(img);
                deleteHl.NavigateUrl = String.Format("javascript:deleteComment(\"{0}\", \"{1}\", \"{2}\")", Comment.TargetEntryId, Comment.EntryId, Comment.Author == null ? String.Empty : Comment.Author.Replace("\"", "\\\""));

                ResourceManager resmgr = resmgr = ApplicationResourceTable.Get();

                if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "deleteCommentScript"))
                {
                    // add the javascript to allow deletion of the comment
                    string scriptString = "<script type=\"text/javascript\" language=\"JavaScript\">\n";
                    scriptString += "function deleteComment(entryId, commentId, commentFrom)\n";
                    scriptString += "{\n";
                    scriptString += String.Format("	if(confirm(\"{0} \\n\\n\" + commentFrom))\n", resmgr.GetString("text_delete_confirm"));
                    scriptString += "	{\n";
                    scriptString += "		location.href=\"deleteItem.ashx?entryid=\" +  entryId + \"&commentId=\" + commentId\n";
                    scriptString += "	}\n";
                    scriptString += "}\n";
                    scriptString += "</script>";

                    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "deleteCommentScript", scriptString);
                }


                footer.Controls.Add(deleteHl);

                // create approve hyperlink, when a comment is not public or if its marked as spam
                if ((!Comment.IsPublic) || (Comment.SpamState == SpamState.Spam))
                {
                    HyperLink approveHl = new HyperLink();
                    approveHl.CssClass = "approveLinkStyle";
                    System.Web.UI.WebControls.Image okImg = new System.Web.UI.WebControls.Image();
                    okImg.CssClass    = "approveImageStyle";
                    okImg.ImageUrl    = new Uri(new Uri(SiteUtilities.GetBaseUrl(requestPage.SiteConfig)), requestPage.GetThemedImageUrl("okbutton-list")).ToString();
                    okImg.BorderWidth = 0;
                    approveHl.Controls.Add(okImg);
                    approveHl.NavigateUrl = String.Format("javascript:approveComment(\"{0}\", \"{1}\")", Comment.TargetEntryId, Comment.EntryId);

                    if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "approveCommentScript"))
                    {
                        string approveScript = "<script type=\"text/javascript\" language=\"JavaScript\">\n";
                        approveScript += "function approveComment(entryId, commentId)\n";
                        approveScript += "{\n";
                        approveScript += "	location.href=\"approveItem.ashx?entryid=\" +  entryId + \"&commentId=\" + commentId\n";
                        approveScript += "}\n";
                        approveScript += "</script>";

                        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "approveCommentScript", approveScript);
                    }

                    footer.Controls.Add(approveHl);
                }
                ISpamBlockingService spamBlockingService = requestPage.SiteConfig.SpamBlockingService;
                if ((spamBlockingService != null) && (comment.SpamState != SpamState.Spam))
                {
                    HyperLink reportSpamLink = new HyperLink();
                    reportSpamLink.CssClass = "approveLinkStyle";
                    System.Web.UI.WebControls.Image spamImg = new System.Web.UI.WebControls.Image();
                    spamImg.CssClass    = "approveImageStyle";
                    spamImg.ImageUrl    = new Uri(new Uri(SiteUtilities.GetBaseUrl(requestPage.SiteConfig)), requestPage.GetThemedImageUrl("reportspambutton")).ToString();
                    spamImg.BorderWidth = 0;
                    reportSpamLink.Controls.Add(spamImg);
                    reportSpamLink.NavigateUrl = String.Format("javascript:reportComment(\"{0}\", \"{1}\", \"{2}\")", Comment.TargetEntryId, Comment.EntryId, Comment.Author == null ? String.Empty : Comment.Author.Replace("\"", "\\\""));

                    string reportScript = "<script type=\"text/javascript\" language=\"JavaScript\">\n";
                    reportScript += "function reportComment(entryId, commentId, commentFrom)\n";
                    reportScript += "{\n";
                    reportScript += String.Format("	if(confirm(\"{0} \\n\\n\" + commentFrom))\n", resmgr.GetString("text_reportspam_confirm"));
                    reportScript += "	{\n";
                    reportScript += "		location.href=\"deleteItem.ashx?report=true&entryid=\" +  entryId + \"&commentId=\" + commentId\n";
                    reportScript += "	}\n";
                    reportScript += "}\n";
                    reportScript += "</script>";

                    if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "reportCommentScript"))
                    {
                        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "reportCommentScript", reportScript);
                    }

                    footer.Controls.Add(reportSpamLink);
                }
            }
        }
Пример #3
0
        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));
            }
        }
Пример #4
0
        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);
        }