|
|
- using System;
- using System.Configuration;
- using System.Linq;
- using System.Net.Mail;
- using System.Text.RegularExpressions;
- using System.Web;
- using System.Web.WebPages;
-
- public class CommentHandler : IHttpHandler
- {
- public void ProcessRequest(HttpContext context)
- {
- Post post = Storage.GetAllPosts().SingleOrDefault(p => p.ID == context.Request["postId"]);
-
- if (post == null)
- throw new HttpException(404, "The post does not exist");
-
- string mode = context.Request["mode"];
-
- if (mode == "save" && context.Request.HttpMethod == "POST" && post.AreCommentsOpen(new HttpContextWrapper(context)) && Blog.MatchesUniqueId(context))
- {
- Save(context, post);
- }
- else if (mode == "delete")
- {
- Delete(context, post);
- }
- else if (mode == "approve")
- {
- Approve(context, post);
- }
- }
-
- private static void Save(HttpContext context, Post post)
- {
- string name = context.Request.Form["name"];
- string email = context.Request.Form["email"];
- string website = context.Request.Form["website"];
- string content = context.Request.Form["content"];
-
- Validate(name, email, content);
-
- Comment comment = new Comment()
- {
- Author = name.Trim(),
- Email = email.Trim(),
- Website = GetUrl(website),
- Ip = context.Request.UserHostAddress,
- UserAgent = context.Request.UserAgent,
- IsAdmin = context.User.Identity.IsAuthenticated,
- Content = HttpUtility.HtmlEncode(content.Trim()).Replace("\n", "<br />"),
- IsApproved = !Blog.ModerateComments,
- };
-
- post.Comments.Add(comment);
- Storage.Save(post);
-
- if (!context.User.Identity.IsAuthenticated)
- System.Threading.ThreadPool.QueueUserWorkItem((s) => SendEmail(comment, post, context.Request));
-
- RenderComment(context, comment);
- }
-
- private static void RenderComment(HttpContext context, Comment comment)
- {
- var page = (WebPage)WebPageBase.CreateInstanceFromVirtualPath("~/themes/" + Blog.Theme + "/comment.cshtml");
- page.Context = new HttpContextWrapper(context);
- page.ExecutePageHierarchy(new WebPageContext(page.Context, page: null, model: comment), context.Response.Output);
- }
-
- private static void SendEmail(Comment comment, Post post, HttpRequest request)
- {
- try
- {
- MailMessage mail = new MailMessage();
- mail.From = new MailAddress(comment.Email, comment.Author);
- mail.ReplyToList.Add(comment.Email);
- mail.To.Add(ConfigurationManager.AppSettings.Get("blog:email"));
- mail.Subject = "Blog comment: " + post.Title;
- mail.IsBodyHtml = true;
-
- string absoluteUrl = request.Url.Scheme + "://" + request.Url.Authority;
- string deleteUrl = absoluteUrl + request.RawUrl + "?postId=" + post.ID + "&commentId=" + comment.ID + "&mode=delete";
- string approveUrl = absoluteUrl + request.RawUrl + "?postId=" + post.ID + "&commentId=" + comment.ID + "&mode=approve";
- mail.Body = "<div style=\"font: 11pt/1.5 calibri, arial;\">" +
- comment.Author + " on <a href=\"" + absoluteUrl + post.Url + "\">" + post.Title + "</a>:<br /><br />" +
- comment.Content + "<br /><br />" +
- (Blog.ModerateComments ? "<a href=\"" + approveUrl + "\">Approve comment</a> | " : string.Empty) +
- "<a href=\"" + deleteUrl + "\">Delete comment</a>" +
- "<br /><br /><hr />" +
- "Website: " + comment.Website + "<br />" +
- "E-mail: " + comment.Email + "<br />" +
- "IP-address: " + comment.Ip +
- "</div>";
-
-
- SmtpClient client = new SmtpClient();
- client.Send(mail);
- }
- catch
- { }
- }
-
- private static void Validate(string name, string email, string content)
- {
- bool isName = !string.IsNullOrEmpty(name);
- bool isMail = !string.IsNullOrEmpty(email) && Regex.IsMatch(email, @"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
- bool isContent = !string.IsNullOrEmpty(content);
-
- if (!isName || !isMail || !isContent)
- {
- if (!isName)
- HttpContext.Current.Response.Status = "403 Please enter a valid name";
- else if (!isMail)
- HttpContext.Current.Response.Status = "403 Please enter a valid e-mail address";
- else if (!isContent)
- HttpContext.Current.Response.Status = "403 Please enter a valid comment";
-
- HttpContext.Current.Response.End();
- }
- }
-
- private static string GetUrl(string website)
- {
- if (!website.Contains("://"))
- website = "http://" + website;
-
- Uri url;
- if (Uri.TryCreate(website, UriKind.Absolute, out url))
- return url.ToString();
-
- return string.Empty;
- }
-
- private static void Delete(HttpContext context, Post post)
- {
- if (!context.User.Identity.IsAuthenticated)
- throw new HttpException(403, "No access");
-
- string commentId = context.Request["commentId"];
- Comment comment = post.Comments.SingleOrDefault(c => c.ID == commentId);
-
- if (comment != null)
- {
- post.Comments.Remove(comment);
- Storage.Save(post);
- }
- else
- {
- throw new HttpException(404, "Comment could not be found");
- }
-
- if (context.Request.HttpMethod == "GET")
- {
- context.Response.Redirect(post.AbsoluteUrl.ToString() + "#comments", true);
- }
- }
-
- private static void Approve(HttpContext context, Post post)
- {
- if (!context.User.Identity.IsAuthenticated)
- throw new HttpException(403, "No access");
-
- string commentId = context.Request["commentId"];
- Comment comment = post.Comments.SingleOrDefault(c => c.ID == commentId);
-
- if (comment != null)
- {
- comment.IsApproved = true;
- Storage.Save(post);
- }
- else
- {
- throw new HttpException(404, "Comment could not be found");
- }
-
- if (context.Request.HttpMethod == "GET")
- {
- context.Response.Redirect(post.AbsoluteUrl.ToString() + "#comments", true);
- }
- }
-
- public bool IsReusable
- {
- get { return false; }
- }
- }
|