Beispiel #1
0
        private (AkismetSpamCheck processor, CreateCommentArgs args, Mock <IAkismet> akismetApiMock) CreateAkismetSpamCheck(IWeBlogCommentSettings settings, IWorkflowProvider workflowProvider)
        {
            var linkManager = Mock.Of <BaseLinkManager>(x =>
#if FEATURE_URL_BUILDERS
                                                        x.GetItemUrl(It.IsAny <Item>(), It.Is <ItemUrlBuilderOptions>(y => y.AlwaysIncludeServerUrl == true)) == "link"
#else
                                                        x.GetItemUrl(It.IsAny <Item>(), It.Is <UrlOptions>(y => y.AlwaysIncludeServerUrl == true)) == "link"
#endif
                                                        );

            var blogItem = ItemFactory.CreateItem().Object;

            var blogManager = Mock.Of <IBlogManager>(x =>
                                                     x.GetCurrentBlog() == new BlogHomeItem(blogItem)
                                                     );

            var akismetApiMock = new Mock <IAkismet>();

            var processor = new AkismetSpamCheck(settings, blogManager, akismetApiMock.Object, linkManager);

            var item     = CreateCommentItem();
            var database = Mock.Of <Database>(x =>
                                              x.WorkflowProvider == workflowProvider
                                              );

            var args = new CreateCommentArgs();

            args.CommentItem = new CommentItem(item);
            args.Database    = database;

            return(processor, args, akismetApiMock);
        }
        public void NullLanguage()
        {
            var processor = new CreateCommentItem(Mock.Of <IBlogManager>(), Mock.Of <IBlogSettingsResolver>());

            using (var db = new Db
            {
                new DbItem("blog")
                {
                    new DbItem("entry")
                }
            })
            {
                var entry = db.GetItem("/sitecore/content/blog/entry");
                var args  = new CreateCommentArgs
                {
                    Database = entry.Database,
                    EntryID  = entry.ID,
                    Comment  = new Comment
                    {
                        AuthorEmail = "*****@*****.**",
                        AuthorName  = "commentor",
                        Text        = "the comment"
                    }
                };

                Assert.That(() => processor.Process(args), Throws.InvalidOperationException);
            }
        }
Beispiel #3
0
        public void Process(CreateCommentArgs args)
        {
            Assert.IsNotNull(args.CommentItem, "Comment Item cannot be null");

            if (!string.IsNullOrEmpty(Settings.AkismetAPIKey) && !string.IsNullOrEmpty(Settings.CommentWorkflowCommandSpam))
            {
                var workflow = args.Database.WorkflowProvider.GetWorkflow(args.CommentItem);

                if (workflow != null)
                {
                    var api    = new Akismet(Settings.AkismetAPIKey, ManagerFactory.BlogManagerInstance.GetCurrentBlog().SafeGet(x => x.Url), "WeBlog/2.1");
                    var isSpam = api.CommentCheck(args.CommentItem);

                    if (isSpam)
                    {
                        //Need to switch to shell website to execute workflow
                        using (new SiteContextSwitcher(SiteContextFactory.GetSiteContext(Sitecore.Constants.ShellSiteName)))
                        {
                            workflow.Execute(Settings.CommentWorkflowCommandSpam, args.CommentItem, "Akismet classified this comment as spam", false, new object[0]);
                        }

                        args.AbortPipeline();
                    }
                }
            }
        }
        public void InvalidEntryID()
        {
            var blogTemplateId = ID.NewID;

            using (var db = new Db
            {
                new DbItem("blog", ID.NewID, blogTemplateId)
            })
            {
                var blog = db.GetItem("/sitecore/content/blog");

                var blogManager = Mock.Of <IBlogManager>(x =>
                                                         x.GetCurrentBlog(It.IsAny <Item>()) == new BlogHomeItem(blog)
                                                         );
                var processor = new CreateCommentItem(blogManager);

                var args = new CreateCommentArgs
                {
                    Database = blog.Database,
                    Comment  = new Comment
                    {
                        AuthorName  = "commenter",
                        AuthorEmail = "*****@*****.**"
                    },
                    EntryID  = ID.NewID,
                    Language = Language.Parse("da")
                };

                processor.Process(args);

                Assert.That(args.CommentItem, Is.Null);
            }
        }
        public void InvalidEntryId()
        {
            using (var db = new Db
            {
                new DbItem("blog")
                {
                    new DbItem("entry")
                }
            })
            {
                var blog  = db.GetItem("/sitecore/content/blog");
                var entry = db.GetItem("/sitecore/content/blog/entry");

                var processor = CreateDuplicateSubmissionGuard(entry, blog, ID.NewID);
                var args      = new CreateCommentArgs
                {
                    Database = entry.Database,
                    EntryID  = entry.ID,
                    Language = Language.Parse("de"),
                    Comment  = new Comment
                    {
                        AuthorEmail = "*****@*****.**",
                        AuthorName  = "commentor",
                        Text        = "the comment"
                    }
                };

                processor.Process(args);

                Assert.That(args.Aborted, Is.False);
            }
        }
        public void InvalidEntryID()
        {
            var blogTemplateId = ID.NewID;

            using (var db = new Db
            {
                new DbItem("blog", ID.NewID, blogTemplateId)
            })
            {
                var blog = db.GetItem("/sitecore/content/blog");

                var processor = CreateCreateCommentItem(null, blog, ID.NewID);

                var args = new CreateCommentArgs
                {
                    Database = blog.Database,
                    Comment  = new Comment
                    {
                        AuthorName  = "commenter",
                        AuthorEmail = "*****@*****.**"
                    },
                    EntryID  = ID.NewID,
                    Language = Language.Parse("da")
                };

                processor.Process(args);

                Assert.That(args.CommentItem, Is.Null);
            }
        }
        public void NullEntryId()
        {
            var processor = new DuplicateSubmissionGuard();

            using (var db = new Db
            {
                new DbItem("blog")
                {
                    new DbItem("entry")
                }
            })
            {
                var entry = db.GetItem("/sitecore/content/blog/entry");
                var args  = new CreateCommentArgs
                {
                    Database = entry.Database,
                    Language = Language.Parse("de"),
                    Comment  = new Comment
                    {
                        AuthorEmail = "*****@*****.**",
                        AuthorName  = "commentor",
                        Text        = "the comment"
                    }
                };

                Assert.That(() => processor.Process(args), Throws.InvalidOperationException);
            }
        }
        public void MultipleCommentsSameName()
        {
            using (var db = new Db
            {
                new DbTemplate(Settings.CommentTemplateID)
                {
                    new DbField("Name"),
                    new DbField("Email"),
                    new DbField("Comment"),
                    new DbField("Website"),
                    new DbField("IP Address"),
                },
                new DbItem("blog")
                {
                    new DbItem("entry")
                }
            })
            {
                var blog  = db.GetItem("/sitecore/content/blog");
                var entry = db.GetItem("/sitecore/content/blog/entry");

                var blogManager = Mock.Of <IBlogManager>(x =>
                                                         x.GetCurrentBlog(entry) == new BlogHomeItem(blog)
                                                         );
                var processor = new TestableCreateCommentItemProcessor(blogManager);

                var args = new CreateCommentArgs
                {
                    Database = entry.Database,
                    Comment  = new Comment
                    {
                        AuthorName  = "commenter",
                        AuthorEmail = "*****@*****.**",
                        Text        = "the comment"
                    },
                    EntryID  = entry.ID,
                    Language = Language.Parse("da")
                };

                processor.Process(args);

                Assert.That(args.CommentItem, Is.Not.Null);
                Assert.That(args.CommentItem.InnerItem.Axes.IsDescendantOf(entry), Is.True);

                var firstComment = args.CommentItem;

                processor.Process(args);

                Assert.That(args.CommentItem, Is.Not.Null);
                Assert.That(args.CommentItem.InnerItem.Axes.IsDescendantOf(entry), Is.True);
                Assert.That(args.CommentItem.ID, Is.Not.EqualTo(firstComment.ID));
                Assert.That(args.CommentItem.InnerItem.Name, Is.Not.EqualTo(firstComment.InnerItem.Name));
                Assert.That(args.CommentItem.InnerItem.Name, Does.Match(".+\\d$"));
            }
        }
        public void CustomFields()
        {
            using (var db = new Db
            {
                new DbTemplate(Settings.CommentTemplateID)
                {
                    new DbField("Name"),
                    new DbField("Email"),
                    new DbField("Comment"),
                    new DbField("Website"),
                    new DbField("IP Address"),
                    new DbField("field1"),
                    new DbField("field2")
                },
                new DbItem("blog")
                {
                    new DbItem("entry")
                }
            })
            {
                var blog  = db.GetItem("/sitecore/content/blog");
                var entry = db.GetItem("/sitecore/content/blog/entry");

                var blogManager = Mock.Of <IBlogManager>(x =>
                                                         x.GetCurrentBlog(entry) == new BlogHomeItem(blog)
                                                         );
                var processor = new CreateCommentItem(blogManager);

                var args = new CreateCommentArgs
                {
                    Database = entry.Database,
                    Comment  = new Comment
                    {
                        AuthorName  = "commenter",
                        AuthorEmail = "*****@*****.**",
                        Text        = "the comment",
                        Fields      =
                        {
                            { "field1", "value1" },
                            { "field2", "value2" },
                        }
                    },
                    EntryID  = entry.ID,
                    Language = Language.Parse("da")
                };

                processor.Process(args);

                Assert.That(args.CommentItem, Is.Not.Null);
                Assert.That(args.CommentItem.InnerItem.Axes.IsDescendantOf(entry), Is.True);
                Assert.That(args.CommentItem["field1"], Is.EqualTo("value1"));
                Assert.That(args.CommentItem["field2"], Is.EqualTo("value2"));
            }
        }
Beispiel #10
0
        public void CustomFields()
        {
            using (var db = new Db
            {
                new DbTemplate(Settings.CommentTemplateID)
                {
                    new DbField("Name"),
                    new DbField("Email"),
                    new DbField("Comment"),
                    new DbField("Website"),
                    new DbField("IP Address"),
                    new DbField("field1"),
                    new DbField("field2")
                },
                new DbItem("blog")
                {
                    new DbItem("entry")
                }
            })
            {
                var blog = db.GetItem("/sitecore/content/blog");
                var entry = db.GetItem("/sitecore/content/blog/entry");

                var blogManager = Mock.Of<IBlogManager>(x =>
                    x.GetCurrentBlog(entry) == new BlogHomeItem(blog)
                    );
                var processor = new CreateCommentItem(blogManager);

                var args = new CreateCommentArgs
                {
                    Database = entry.Database,
                    Comment = new Comment
                    {
                        AuthorName = "commenter",
                        AuthorEmail = "*****@*****.**",
                        Text = "the comment",
                        Fields =
                        {
                            { "field1", "value1" },
                            { "field2", "value2" },
                        }
                    },
                    EntryID = entry.ID,
                    Language = Language.Parse("da")
                };

                processor.Process(args);

                Assert.That(args.CommentItem, Is.Not.Null);
                Assert.That(args.CommentItem.InnerItem.Axes.IsDescendantOf(entry), Is.True);
                Assert.That(args.CommentItem["field1"], Is.EqualTo("value1"));
                Assert.That(args.CommentItem["field2"], Is.EqualTo("value2"));
            }
        }
        public void DifferentText()
        {
            var commentTemplate = CreateCommentTemplate();

            using (var db = new Db
            {
                commentTemplate,
                new DbItem("blog")
                {
                    new DbItem("entry")
                    {
                        new DbItem("comment", ID.NewID, commentTemplate.ID)
                        {
                            new DbField("Name")
                            {
                                { "de", "commentor" }
                            },
                            new DbField("Email")
                            {
                                { "de", "*****@*****.**" }
                            },
                            new DbField("Comment")
                            {
                                { "de", "the comment" }
                            },
                        }
                    }
                }
            })
            {
                var blog  = db.GetItem("/sitecore/content/blog");
                var entry = db.GetItem("/sitecore/content/blog/entry");

                var processor = CreateDuplicateSubmissionGuard(entry, blog, commentTemplate.ID);

                var args = new CreateCommentArgs
                {
                    Database = entry.Database,
                    EntryID  = entry.ID,
                    Language = Language.Parse("de"),
                    Comment  = new Comment
                    {
                        AuthorEmail = "*****@*****.**",
                        AuthorName  = "commentor",
                        Text        = "the comment updated"
                    }
                };

                processor.Process(args);

                Assert.That(args.Aborted, Is.False);
            }
        }
Beispiel #12
0
        public void Process(CreateCommentArgs args)
        {
            Assert.IsNotNull(args.Comment, "Comment cannot be null");
            ProfanityFilterArgs filterArgs = new ProfanityFilterArgs
            {
                Input = args.Comment.Text
            };

            CorePipeline.Run("weblogProfanityFilter", filterArgs);
            if (!filterArgs.Valid)
            {
                args.AbortPipeline();
            }
            args.Comment.Text = filterArgs.Input;
        }
        public void MultipleCommentsSameName()
        {
            var commentTemplate = CreateCommentTemplate();

            using (var db = new Db
            {
                commentTemplate,
                new DbItem("blog")
                {
                    new DbItem("entry")
                }
            })
            {
                var blog  = db.GetItem("/sitecore/content/blog");
                var entry = db.GetItem("/sitecore/content/blog/entry");

                var processor = CreateCreateCommentItem(entry, blog, commentTemplate.ID);

                var args = new CreateCommentArgs
                {
                    Database = entry.Database,
                    Comment  = new Comment
                    {
                        AuthorName  = "commenter",
                        AuthorEmail = "*****@*****.**",
                        Text        = "the comment"
                    },
                    EntryID  = entry.ID,
                    Language = Language.Parse("da")
                };

                processor.Process(args);

                Assert.That(args.CommentItem, Is.Not.Null);
                Assert.That(args.CommentItem.InnerItem.Axes.IsDescendantOf(entry), Is.True);

                var firstComment = args.CommentItem;

                processor.Process(args);

                Assert.That(args.CommentItem, Is.Not.Null);
                Assert.That(args.CommentItem.InnerItem.Axes.IsDescendantOf(entry), Is.True);
                Assert.That(args.CommentItem.ID, Is.Not.EqualTo(firstComment.ID));
                Assert.That(args.CommentItem.InnerItem.Name, Is.Not.EqualTo(firstComment.InnerItem.Name));
                Assert.That(args.CommentItem.InnerItem.Name, Does.Match(".+\\d$"));
            }
        }
Beispiel #14
0
        public void Process(CreateCommentArgs args)
        {
            if (!string.IsNullOrEmpty(Settings.CommentWorkflowCommandCreated))
            {
                var workflow = args.Database.WorkflowProvider.GetWorkflow(args.CommentItem);

                if (workflow != null)
                {
                    //Need to switch to shell website to execute workflow
                    using (new SiteContextSwitcher(SiteContextFactory.GetSiteContext(Sitecore.Constants.ShellSiteName)))
                    {
                        workflow.Execute(Settings.CommentWorkflowCommandCreated, args.CommentItem, "WeBlog automated submit", false, new object[0]);
                    }
                    //workflow should take care of publishing the item following this, if it's configured to do so
                }
            }
        }
        public void Process(CreateCommentArgs args)
        {
            Assert.IsNotNull(args.Database, "Database cannot be null");
            Assert.IsNotNull(args.Comment, "Comment cannot be null");
            Assert.IsNotNull(args.EntryID, "Entry ID cannot be null");

            var entryItem = args.Database.GetItem(args.EntryID, args.Language);

            if (entryItem != null)
            {
                // End at end of today to make sure we cover comments from today properly
                var dateEnd   = System.DateTime.UtcNow.Date.AddDays(1);
                var dateStart = dateEnd - TimeSpan;

                var blog = ManagerFactory.BlogManagerInstance.GetCurrentBlog(entryItem);
                if (blog != null)
                {
                    var commentTemplate = blog.BlogSettings.CommentTemplateID;

                    var query = "{0}//*[@@templateid='{1}' and @__created > '{2}' and @__created < '{3}']".FormatWith(
                        ContentHelper.EscapePath(entryItem.Paths.FullPath), commentTemplate, DateUtil.ToIsoDate(dateStart), DateUtil.ToIsoDate(dateEnd));

                    var comments = args.Database.SelectItems(query);

                    var match = false;

                    foreach (var item in comments)
                    {
                        var commentItem = (CommentItem)item;
                        if (string.Compare(commentItem.AuthorName, args.Comment.AuthorName, StringComparison.OrdinalIgnoreCase) == 0 &&
                            string.Compare(commentItem.Email.Raw, args.Comment.AuthorEmail, StringComparison.OrdinalIgnoreCase) == 0 &&
                            string.Compare(commentItem.Comment.Raw, args.Comment.Text, StringComparison.OrdinalIgnoreCase) == 0)
                        {
                            match = true;
                            Log.Warn("[WeBlog] Duplicate comment submission. Existing item: {0}".FormatWith(commentItem.ID), this);
                        }
                    }

                    if (match)
                    {
                        args.AbortPipeline();
                    }
                }
            }
        }
        public void NoDuplicateComment()
        {
            using (var db = new Db
            {
                new DbTemplate(Settings.CommentTemplateID)
                {
                    new DbField("Name"),
                    new DbField("Email"),
                    new DbField("Comment"),
                    new DbField("Website"),
                    new DbField("IP Address"),
                },
                new DbItem("blog")
                {
                    new DbItem("entry")
                }
            })
            {
                var blog  = db.GetItem("/sitecore/content/blog");
                var entry = db.GetItem("/sitecore/content/blog/entry");

                var blogManager = Mock.Of <IBlogManager>(x =>
                                                         x.GetCurrentBlog(entry) == new BlogHomeItem(blog)
                                                         );

                var processor = new DuplicateSubmissionGuard(blogManager);

                var args = new CreateCommentArgs
                {
                    Database = entry.Database,
                    EntryID  = entry.ID,
                    Language = Language.Parse("de"),
                    Comment  = new Comment
                    {
                        AuthorEmail = "*****@*****.**",
                        AuthorName  = "commentor",
                        Text        = "the comment"
                    }
                };

                processor.Process(args);

                Assert.That(args.Aborted, Is.False);
            }
        }
        public void NullEntryId()
        {
            var processor = new CreateCommentItem(Mock.Of <IBlogManager>(), Mock.Of <IBlogSettingsResolver>());

            using (var db = new Db
            {
                new DbItem("entry")
            })
            {
                var entry = db.GetItem("/sitecore/content/entry");
                var args  = new CreateCommentArgs
                {
                    Database = entry.Database,
                    Comment  = new Comment(),
                    Language = Language.Parse("da")
                };

                Assert.That(() => processor.Process(args), Throws.InvalidOperationException);
            }
        }
Beispiel #18
0
        public void Process(CreateCommentArgs args)
        {
            Assert.IsNotNull(args.Database, "Database cannot be null");
            Assert.IsNotNull(args.Comment, "Comment cannot be null");
            Assert.IsNotNull(args.EntryID, "Entry ID cannot be null");

            var entryItem = args.Database.GetItem(args.EntryID, args.Language);

            if (entryItem != null)
            {
                var query = "fast:{0}//*[@email='{1}' and @name='{2}' and @comment='{3}']".FormatWith(
                    entryItem.Paths.FullPath, args.Comment.AuthorEmail, args.Comment.AuthorName, args.Comment.Text);
                var comments = args.Database.SelectItems(query);

                if (comments.Length > 0)
                {
                    args.AbortPipeline();
                }
            }
        }
        public void NullLanguage()
        {
            var processor = new CreateCommentItem();

            using (var db = new Db
            {
                new DbItem("entry")
            })
            {
                var entry = db.GetItem("/sitecore/content/entry");
                var args  = new CreateCommentArgs
                {
                    Database = entry.Database,
                    Comment  = new Comment(),
                    EntryID  = entry.ID
                };

                Assert.That(() => processor.Process(args), Throws.InvalidOperationException);
            }
        }
Beispiel #20
0
        /// <summary>
        /// Adds a comment to a blog
        /// </summary>
        /// <param name="entryId">The ID of the entry to add the comment to</param>
        /// <param name="comment">The comment to add to the entry</param>
        /// <param name="language">The language to create the comment in</param>
        /// <returns>The ID of the created comment item, or ID.Null if creation failed</returns>
        public virtual ID AddCommentToEntry(ID entryId, Model.Comment comment, Language language = null)
        {
            var args = new CreateCommentArgs();

            args.EntryID  = entryId;
            args.Comment  = comment;
            args.Database = ContentHelper.GetContentDatabase();
            args.Language = language ?? Context.Language;

            CorePipeline.Run("weblogCreateComment", args, true);

            if (args.CommentItem != null)
            {
                return(args.CommentItem.ID);
            }
            else
            {
                return(ID.Null);
            }
        }
Beispiel #21
0
        public void Process(CreateCommentArgs args)
        {
            Assert.IsNotNull(args.CommentItem, "Comment Item cannot be null");

            if (!string.IsNullOrEmpty(_commentSettings.AkismetAPIKey) && !string.IsNullOrEmpty(_commentSettings.CommentWorkflowCommandSpam))
            {
                var workflow = args.Database.WorkflowProvider.GetWorkflow(args.CommentItem);

                if (workflow != null)
                {
                    var api = _akismetApi;
                    if (api == null)
                    {
                        api = new Akismet();
                    }

                    var version = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion;

                    var blogItem = _blogManager.GetCurrentBlog(args.CommentItem);
                    var url      = _linkManager.GetAbsoluteItemUrl(blogItem);

                    api.Init(_commentSettings.AkismetAPIKey, url, "WeBlog/" + version);

                    var isSpam = api.CommentCheck(args.CommentItem);

                    if (isSpam)
                    {
                        //Need to switch to shell website to execute workflow
                        using (new SiteContextSwitcher(SiteContextFactory.GetSiteContext(Sitecore.Constants.ShellSiteName)))
                        {
                            workflow.Execute(_commentSettings.CommentWorkflowCommandSpam, args.CommentItem, "Akismet classified this comment as spam", false, new object[0]);
                        }

                        args.AbortPipeline();
                    }
                }
            }
        }
        public void NullComment()
        {
            var processor = new DuplicateSubmissionGuard();

            using (var db = new Db
            {
                new DbItem("blog")
                {
                    new DbItem("entry")
                }
            })
            {
                var entry = db.GetItem("/sitecore/content/blog/entry");
                var args  = new CreateCommentArgs
                {
                    Database = entry.Database,
                    EntryID  = entry.ID,
                    Language = Language.Parse("de")
                };

                Assert.That(() => processor.Process(args), Throws.InvalidOperationException);
            }
        }
        public void DashesInPath()
        {
            var commentTemplate = CreateCommentTemplate();

            using (var db = new Db
            {
                commentTemplate,
                new DbItem("my-blog")
                {
                    new DbItem("the-entry")
                }
            })
            {
                var blog  = db.GetItem("/sitecore/content/my-blog");
                var entry = db.GetItem("/sitecore/content/my-blog/the-entry");

                var processor = CreateCreateCommentItem(entry, blog, commentTemplate.ID);

                var args = new CreateCommentArgs
                {
                    Database = entry.Database,
                    Comment  = new Comment
                    {
                        AuthorName  = "commenter",
                        AuthorEmail = "*****@*****.**",
                        Text        = "the comment"
                    },
                    EntryID  = entry.ID,
                    Language = Language.Parse("da")
                };

                processor.Process(args);

                Assert.That(args.CommentItem, Is.Not.Null);
                Assert.That(args.CommentItem.InnerItem.Axes.IsDescendantOf(entry), Is.True);
            }
        }
Beispiel #24
0
        public void NullComment()
        {
            var processor = new DuplicateSubmissionGuard();

            using (var db = new Db
            {
                new DbItem("blog")
                {
                    new DbItem("entry")
                }
            })
            {
                var entry = db.GetItem("/sitecore/content/blog/entry");
                var args = new CreateCommentArgs
                {
                    Database = entry.Database,
                    EntryID = entry.ID,
                    Language = Language.Parse("de")
                };

                Assert.That(() => processor.Process(args), Throws.InvalidOperationException);
            }
        }
Beispiel #25
0
        public void NullLanguage()
        {
            var processor = new CreateCommentItem();
            using (var db = new Db
            {
                new DbItem("entry")
            })
            {
                var entry = db.GetItem("/sitecore/content/entry");
                var args = new CreateCommentArgs
                {
                    Database = entry.Database,
                    Comment = new Comment(),
                    EntryID = entry.ID
                };

                Assert.That(() => processor.Process(args), Throws.InvalidOperationException);
            }
        }
Beispiel #26
0
        public void Process(CreateCommentArgs args)
        {
            Assert.ArgumentNotNull(args, "args cannot be null");
            Assert.IsNotNull(args.Database, "Database cannot be null");
            Assert.IsNotNull(args.Comment, "Comment cannot be null");
            Assert.IsNotNull(args.EntryID, "Entry ID cannot be null");
            Assert.IsNotNull(args.Language, "Language cannot be null");

            var entryItem = args.Database.GetItem(args.EntryID, args.Language);

            if (entryItem != null)
            {
                var blogItem = BlogManager.GetCurrentBlog(entryItem);
                if (blogItem != null)
                {
                    var template = args.Database.GetTemplate(blogItem.BlogSettings.CommentTemplateID);
                    var itemName =
                        ItemUtil.ProposeValidItemName(string.Format("Comment at {0} by {1}",
                                                                    GetDateTime().ToString("yyyyMMdd HHmmss"), args.Comment.AuthorName));
                    if (itemName.Length > 100)
                    {
                        itemName = itemName.Substring(0, 100);
                    }

                    // verify the comment item name is unique for this entry
                    var query = BuildFastQuery(entryItem, itemName);

                    var num            = 1;
                    var nondupItemName = itemName;
                    while (entryItem.Database.SelectSingleItem(query) != null)
                    {
                        nondupItemName = itemName + " " + num;
                        num++;
                        query = BuildFastQuery(entryItem, nondupItemName);
                    }

                    // need to create the comment within the shell site to ensure workflow is applied to comment
                    var shellSite = SiteContextFactory.GetSiteContext(Sitecore.Constants.ShellSiteName);
                    SiteContextSwitcher siteSwitcher = null;

                    try
                    {
                        if (shellSite != null)
                        {
                            siteSwitcher = new SiteContextSwitcher(shellSite);
                        }

                        using (new SecurityDisabler())
                        {
                            var newItem = entryItem.Add(nondupItemName, template);

                            var newComment = new CommentItem(newItem);
                            newComment.BeginEdit();
                            newComment.Name.Field.Value    = args.Comment.AuthorName;
                            newComment.Email.Field.Value   = args.Comment.AuthorEmail;
                            newComment.Comment.Field.Value = args.Comment.Text;

                            foreach (var entry in args.Comment.Fields)
                            {
                                newComment.InnerItem[entry.Key] = entry.Value;
                            }

                            newComment.EndEdit();

                            args.CommentItem = newComment;
                        }
                    }
                    finally
                    {
                        siteSwitcher?.Dispose();
                    }
                }
                else
                {
                    var message = "Failed to find blog for entry {0}\r\nIgnoring comment: name='{1}', email='{2}', commentText='{3}'";
                    Logger.Error(string.Format(message, args.EntryID, args.Comment.AuthorName, args.Comment.AuthorEmail, args.Comment.Text), typeof(CreateCommentItem));
                }
            }
            else
            {
                var message = "Failed to find blog entry {0}\r\nIgnoring comment: name='{1}', email='{2}', commentText='{3}'";
                Logger.Error(string.Format(message, args.EntryID, args.Comment.AuthorName, args.Comment.AuthorEmail, args.Comment.Text), typeof(CreateCommentItem));
            }
        }
Beispiel #27
0
        public void Process(CreateCommentArgs args)
        {
            Assert.IsNotNull(args.Database, "Database cannot be null");
            Assert.IsNotNull(args.Comment, "Comment cannot be null");
            Assert.IsNotNull(args.EntryID, "Entry ID cannot be null");

            var entryItem = args.Database.GetItem(args.EntryID, args.Language);

            if (entryItem != null)
            {
                var blogItem = ManagerFactory.BlogManagerInstance.GetCurrentBlog(entryItem);
                if (blogItem != null)
                {
                    var template = args.Database.GetTemplate(blogItem.BlogSettings.CommentTemplateID);
                    var itemName = ItemUtil.ProposeValidItemName(string.Format("Comment at {0} by {1}", DateTime.Now.ToString("yyyyMMdd HHmmss"), args.Comment.AuthorName));

                    // verify the comment item name is unique for this entry
                    var query = "{0}//{1}".FormatWith(entryItem.Paths.FullPath, itemName);
#if !SC62
                    query = "fast:" + query;
#endif

                    var num            = 1;
                    var nondupItemName = itemName;
                    while (entryItem.Database.SelectSingleItem(query) != null)
                    {
                        nondupItemName = itemName + " " + num;
                        num++;
                        query = "fast:{0}//{1}".FormatWith(entryItem.Paths.FullPath, nondupItemName);
                    }

                    //need to emulate creation within shell site to ensure workflow is applied to comment
                    using (new SiteContextSwitcher(SiteContextFactory.GetSiteContext(Sitecore.Constants.ShellSiteName)))
                    {
                        using (new SecurityDisabler())
                        {
                            var newItem = entryItem.Add(nondupItemName, template);

                            var newComment = new CommentItem(newItem);
                            newComment.BeginEdit();
                            newComment.Name.Field.Value    = args.Comment.AuthorName;
                            newComment.Email.Field.Value   = args.Comment.AuthorEmail;
                            newComment.Comment.Field.Value = args.Comment.Text;

                            foreach (var entry in args.Comment.Fields)
                            {
                                newComment.InnerItem[entry.Key] = entry.Value;
                            }

                            newComment.EndEdit();

                            args.CommentItem = newComment;
                        }
                    }
                }
                else
                {
                    var message = "Failed to find blog for entry {0}\r\nIgnoring comment: name='{1}', email='{2}', commentText='{3}'";
                    Log.Error(string.Format(message, args.EntryID, args.Comment.AuthorName, args.Comment.AuthorEmail, args.Comment.Text), typeof(CreateCommentItem));
                }
            }
            else
            {
                var message = "Failed to find blog entry {0}\r\nIgnoring comment: name='{1}', email='{2}', commentText='{3}'";
                Log.Error(string.Format(message, args.EntryID, args.Comment.AuthorName, args.Comment.AuthorEmail, args.Comment.Text), typeof(CreateCommentItem));
            }
        }
Beispiel #28
0
        public void InvalidEntryId()
        {
            var processor = new DuplicateSubmissionGuard();

            using (var db = new Db
            {
                new DbItem("blog")
                {
                    new DbItem("entry")
                }
            })
            {
                var entry = db.GetItem("/sitecore/content/blog/entry");
                var args = new CreateCommentArgs
                {
                    Database = entry.Database,
                    EntryID = entry.ID,
                    Language = Language.Parse("de"),
                    Comment = new Comment
                    {
                        AuthorEmail = "*****@*****.**",
                        AuthorName = "commentor",
                        Text = "the comment"
                    }
                };

                processor.Process(args);

                Assert.That(args.Aborted, Is.False);
            }
        }
Beispiel #29
0
        public void MultipleCommentsSameName()
        {
            using (var db = new Db
            {
                new DbTemplate(Settings.CommentTemplateID)
                {
                    new DbField("Name"),
                    new DbField("Email"),
                    new DbField("Comment"),
                    new DbField("Website"),
                    new DbField("IP Address"),
                },
                new DbItem("blog")
                {
                    new DbItem("entry")
                }
            })
            {
                var blog = db.GetItem("/sitecore/content/blog");
                var entry = db.GetItem("/sitecore/content/blog/entry");

                var blogManager = Mock.Of<IBlogManager>(x =>
                    x.GetCurrentBlog(entry) == new BlogHomeItem(blog)
                    );
                var processor = new TestableCreateCommentItemProcessor(blogManager);

                var args = new CreateCommentArgs
                {
                    Database = entry.Database,
                    Comment = new Comment
                    {
                        AuthorName = "commenter",
                        AuthorEmail = "*****@*****.**",
                        Text = "the comment"
                    },
                    EntryID = entry.ID,
                    Language = Language.Parse("da")
                };

                processor.Process(args);

                Assert.That(args.CommentItem, Is.Not.Null);
                Assert.That(args.CommentItem.InnerItem.Axes.IsDescendantOf(entry), Is.True);

                var firstComment = args.CommentItem;

                processor.Process(args);

                Assert.That(args.CommentItem, Is.Not.Null);
                Assert.That(args.CommentItem.InnerItem.Axes.IsDescendantOf(entry), Is.True);
                Assert.That(args.CommentItem.ID, Is.Not.EqualTo(firstComment.ID));
                Assert.That(args.CommentItem.InnerItem.Name, Is.Not.EqualTo(firstComment.InnerItem.Name));
                Assert.That(args.CommentItem.InnerItem.Name, Does.Match(".+\\d$"));
            }
        }
Beispiel #30
0
        public void DifferentText()
        {
            using (var db = new Db
            {
                new DbTemplate(Settings.CommentTemplateID)
                {
                    new DbField("Name"),
                    new DbField("Email"),
                    new DbField("Comment"),
                    new DbField("Website"),
                    new DbField("IP Address"),
                },
                new DbItem("blog")
                {
                    new DbItem("entry")
                    {
                        new DbItem("comment", ID.NewID, Settings.CommentTemplateID)
                        {
                            new DbField("Name")
                            {
                                { "de", "commentor" }
                            },
                            new DbField("Email")
                            {
                                { "de", "*****@*****.**" }
                            },
                            new DbField("Comment")
                            {
                                { "de", "the comment" }
                            },
                        }
                    }
                }
            })
            {
                var blog = db.GetItem("/sitecore/content/blog");
                var entry = db.GetItem("/sitecore/content/blog/entry");

                var blogManager = Mock.Of<IBlogManager>(x =>
                    x.GetCurrentBlog(entry) == new BlogHomeItem(blog)
                    );

                var processor = new DuplicateSubmissionGuard(blogManager);

                var args = new CreateCommentArgs
                {
                    Database = entry.Database,
                    EntryID = entry.ID,
                    Language = Language.Parse("de"),
                    Comment = new Comment
                    {
                        AuthorEmail = "*****@*****.**",
                        AuthorName = "commentor",
                        Text = "the comment updated"
                    }
                };

                processor.Process(args);

                Assert.That(args.Aborted, Is.False);
            }
        }
Beispiel #31
0
        public void NullLanguage()
        {
            var processor = new DuplicateSubmissionGuard();

            using (var db = new Db
            {
                new DbItem("blog")
                {
                    new DbItem("entry")
                }
            })
            {
                var entry = db.GetItem("/sitecore/content/blog/entry");
                var args = new CreateCommentArgs
                {
                    Database = entry.Database,
                    EntryID = entry.ID,
                    Comment = new Comment
                    {
                        AuthorEmail = "*****@*****.**",
                        AuthorName = "commentor",
                        Text = "the comment"
                    }
                };

                Assert.That(() => processor.Process(args), Throws.InvalidOperationException);
            }
        }
Beispiel #32
0
        public void InvalidEntryID()
        {
            var blogTemplateId = ID.NewID;

            using (var db = new Db
            {
                new DbItem("blog", ID.NewID, blogTemplateId)
            })
            {
                var blog = db.GetItem("/sitecore/content/blog");

                var blogManager = Mock.Of<IBlogManager>(x =>
                    x.GetCurrentBlog(It.IsAny<Item>()) == new BlogHomeItem(blog)
                    );
                var processor = new CreateCommentItem(blogManager);

                var args = new CreateCommentArgs
                {
                    Database = blog.Database,
                    Comment = new Comment
                    {
                        AuthorName = "commenter",
                        AuthorEmail = "*****@*****.**"
                    },
                    EntryID = ID.NewID,
                    Language = Language.Parse("da")
                };

                processor.Process(args);

                Assert.That(args.CommentItem, Is.Null);
            }
        }