예제 #1
0
        public async Task <ActionResult> ModeratorDelete(string subverse, int submissionID, int commentID)
        {
            if (!ModeratorPermission.HasPermission(User, subverse, Domain.Models.ModeratorAction.DeleteComments))
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.Unauthorized)));
            }
            var q       = new QueryComment(commentID);
            var comment = await q.ExecuteAsync();

            if (comment == null || comment.SubmissionID != submissionID)
            {
                ModelState.AddModelError("", "Can not find comment. Who did this?");
                return(View(new ModeratorDeleteContentViewModel()));
            }
            if (!comment.Subverse.IsEqual(subverse))
            {
                ModelState.AddModelError("", "Data mismatch detected");
                return(View(new ModeratorDeleteContentViewModel()));
            }

            ViewBag.Comment = comment;
            return(View(new ModeratorDeleteContentViewModel()
            {
                ID = commentID
            }));
        }
예제 #2
0
        public async Task <ActionResult> ModeratorDelete(string subverse, int submissionID, ModeratorDeleteContentViewModel model)
        {
            var q       = new QueryComment(model.ID);
            var comment = await q.ExecuteAsync();

            if (comment == null || comment.SubmissionID != submissionID)
            {
                ModelState.AddModelError("", "Can not find comment. Who did this?");
                return(View(new ModeratorDeleteContentViewModel()));
            }

            if (!ModeratorPermission.HasPermission(User.Identity.Name, comment.Subverse, Domain.Models.ModeratorAction.DeleteComments))
            {
                return(new HttpUnauthorizedResult());
            }

            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            var cmd = new DeleteCommentCommand(model.ID, model.Reason);
            var r   = await cmd.Execute();

            if (r.Success)
            {
                return(RedirectToRoute("SubverseCommentsWithSort_Short", new { subverseName = subverse, submissionID = submissionID }));
            }
            else
            {
                ModelState.AddModelError("", r.Message);
                return(View(model));
            }
        }
예제 #3
0
        public void Query_Comment_Anon()
        {
            var q      = new QueryComment(3, null);
            var result = q.ExecuteAsync().Result;

            Assert.IsNotNull(result);
            Assert.AreEqual(result.ID.ToString(), result.UserName);
        }
        public void Query_Comment_Anon()
        {
            VerifyValidHandler();

            var q = new QueryComment(3, null);

            q.CacheHandler = handler;
            var result = q.ExecuteAsync().Result;

            Assert.IsNotNull(result);
            Assert.AreEqual(result.ID.ToString(), result.UserName);
        }
예제 #5
0
        protected override RuleOutcome EvaluateRule(VoatRuleContext context)
        {
            var q       = new QueryComment(context.CommentID.Value);
            var comment = q.Execute();

            // do not execute downvoting if comment is older than 7 days
            var      commentPostingDate = comment.CreationDate;
            TimeSpan timeElapsed        = Repository.CurrentDate - commentPostingDate;

            if (timeElapsed.TotalDays > 7)
            {
                return(CreateOutcome(RuleResult.Denied, "Comment downvotes not registered after 7 days"));
            }
            return(base.EvaluateRule(context));
        }
        protected override RuleOutcome EvaluateRule(VoatRuleContext context)
        {
            var q       = new QueryComment(context.CommentID.Value);
            var comment = q.Execute();

            using (var repo = new Repository(context.User))
            {
                var count = repo.VoteCount(context.UserName, comment.UserName, Domain.Models.ContentType.Comment, Domain.Models.VoteValue.Down, _timeSpan);
                if (count >= _threshold)
                {
                    return(CreateOutcome(RuleResult.Denied, "You need a cooling down period"));
                }
            }
            return(base.EvaluateRule(context));
        }
예제 #7
0
        protected void VerifyCommentIsProtected(int submissionID, int commentID, string userName = null)
        {
            IPrincipal user = null;

            if (!String.IsNullOrEmpty(userName))
            {
                user = TestHelper.SetPrincipal(userName);
            }

            //verify comment segment hides user name
            var q = new QueryCommentContext(submissionID, commentID).SetUserContext(user);
            var r = q.Execute();

            Assert.IsNotNull(r, "Query response is null");
            Assert.IsNotNull(r.Comments, "Comment segment is null");

            VerifyCommentSegmentIsAnonProtected(r);
            var comment = r.Comments.FirstOrDefault();

            if (!String.IsNullOrEmpty(userName))
            {
                Assert.IsTrue(comment.IsOwner, $"Expected user {userName} to be submitter on comment {comment.ID}");
            }

            //Ensure direct comment is protected
            var q2 = new QueryComment(commentID, CachePolicy.None);
            var r2 = q2.Execute();

            Assert.IsNotNull(r2, "Query 2 response is null");
            EnsureAnonIsProtected(r2);

            //Ensure stream comment is protected
            var options = new SearchOptions();

            options.StartDate = r2.CreationDate.AddMinutes(-5);
            var q3 = new QueryComments(r2.Subverse, options, CachePolicy.None);
            var r3 = q3.Execute();

            Assert.IsNotNull(r3, "Expecting stream endpoint to return comment");
            Assert.AreNotEqual(0, r3.Count(), "Expected at least 1 comment to be returned");
            foreach (var c in r3)
            {
                EnsureAnonIsProtected(c);
            }
        }
        public QueryResult MapFromDatabaseToQueryResult(BsonDocument item)
        {
            QueryResult result = new QueryResult();
            BsonValue   val;

            item.TryGetValue("_id", out val);
            result.Id = val.AsInt32;

            item.TryGetValue("headline", out val);
            result.Headline = val.AsString;

            item.TryGetValue("body", out val);
            result.Body = val.AsString;

            item.TryGetValue("author", out val);
            result.Author = val.AsString;

            if (item.TryGetValue("image", out val))
            {
                result.Image = val.AsByteArray;
            }

            result.Comments = new List <QueryComment>();

            if (item.TryGetValue("comments", out val))
            {
                var commentList = val.AsBsonArray;
                foreach (var comment in commentList)
                {
                    QueryComment com = new QueryComment();
                    BsonValue    temp;
                    var          commentAsDocument = comment.AsBsonDocument;
                    commentAsDocument.TryGetValue("timestamp", out temp);
                    com.Timestamp = temp.ToUniversalTime();
                    commentAsDocument.TryGetValue("text", out temp);
                    com.Text = temp.AsString;

                    result.Comments.Add(com);
                }
            }

            return(result);
        }
예제 #9
0
        public async Task <ActionResult> ModeratorDelete(string subverse, int submissionID, int commentID)
        {
            if (!ModeratorPermission.HasPermission(User.Identity.Name, subverse, Domain.Models.ModeratorAction.DeleteComments))
            {
                return(new HttpUnauthorizedResult());
            }
            var q       = new QueryComment(commentID);
            var comment = await q.ExecuteAsync();

            if (comment == null || comment.SubmissionID != submissionID)
            {
                ModelState.AddModelError("", "Can not find comment. Who did this?");
                return(View(new ModeratorDeleteContentViewModel()));
            }
            ViewBag.Comment = comment;
            return(View(new ModeratorDeleteContentViewModel()
            {
                ID = commentID
            }));
        }
예제 #10
0
        public void EnsureVoteSavedIsPopulated()
        {
            TestHelper.SetPrincipal("UnitTestUser18");

            var q       = new QueryComment(1);
            var comment = q.Execute();

            Assert.IsNotNull(comment, "Comment is null 1");
            Assert.AreEqual(0, comment.Vote, "vote value not set for logged in user 1");

            var cmd    = new CommentVoteCommand(1, 1, IpHash.CreateHash(Guid.NewGuid().ToString()));
            var result = cmd.Execute().Result;

            Assert.IsNotNull(result, "Result is null");
            Assert.AreEqual(Status.Success, result.Status);

            q       = new QueryComment(1);
            comment = q.Execute();
            Assert.IsNotNull(comment, "Comment is null 2");
            Assert.AreEqual(1, comment.Vote, "vote value not set for logged in user 2");
        }
        private void VerifyComment(int commentID, string expectedContent, bool isDeleted)
        {
            var queryCommentDirect = new QueryComment(commentID, Caching.CachePolicy.None);
            var comment            = queryCommentDirect.Execute();

            Assert.IsNotNull(comment);
            Assert.IsTrue(comment.Content.Contains(expectedContent));
            Assert.AreEqual(isDeleted, comment.IsDeleted);

            //purge cache to ensure fresh pull
            Caching.CacheHandler.Instance.Remove(Caching.CachingKey.CommentTree(comment.SubmissionID.Value));

            var queryCommentTree = new QueryCommentSegment(comment.SubmissionID.Value);
            var tree             = queryCommentTree.Execute();

            var treeComment = tree.Comments.FirstOrDefault(x => x.ID == commentID);

            Assert.IsNotNull(treeComment);
            Assert.IsTrue(treeComment.Content.Contains(expectedContent));
            Assert.AreEqual(isDeleted, treeComment.IsDeleted);
        }
예제 #12
0
        protected override object GetMissingValue(string name)
        {
            switch (name)
            {
            case "Subverse":
                if (SubmissionID != null)
                {
                    var cmd        = new QuerySubmission(SubmissionID.Value);
                    var submission = cmd.Execute();
                    PropertyBag.Submission = submission;

                    var cmdSubverse = new QuerySubverse(submission.Subverse);
                    var subverse    = cmdSubverse.Execute();

                    return(subverse);
                }
                if (CommentID != null)
                {
                    var cmdComment = new QueryComment(CommentID.Value);
                    var comment    = cmdComment.Execute();
                    PropertyBag.Comment = comment;

                    var cmd        = new QuerySubmission(comment.SubmissionID.Value);
                    var submission = cmd.Execute();
                    PropertyBag.Submission = submission;

                    var cmdSubverse = new QuerySubverse(submission.Subverse);
                    var subverse    = cmdSubverse.Execute();

                    return(subverse);
                }
                break;
            }

            return(base.GetMissingValue(name));
        }
예제 #13
0
        protected override object GetMissingValue(string name)
        {
            //TODO: This lazy loading needs to be optimized and rewritten. I. Don't. Like. This.
            switch (name)
            {
            case "Comment":
                if (CommentID != null)
                {
                    var cmdComment = new QueryComment(CommentID.Value);
                    var comment    = cmdComment.Execute();
                    PropertyBag.Comment = comment;

                    return(comment);
                }
                break;

            case "Submission":
                if (SubmissionID != null)
                {
                    var cmd        = new QuerySubmission(SubmissionID.Value);
                    var submission = cmd.Execute();
                    return(submission);
                }
                if (CommentID != null)
                {
                    var cmdComment = new QueryComment(CommentID.Value);
                    var comment    = cmdComment.Execute();
                    PropertyBag.Comment = comment;

                    var cmd        = new QuerySubmission(comment.SubmissionID.Value);
                    var submission = cmd.Execute();
                    return(submission);
                }
                break;

            case "Subverse":
                if (SubmissionID != null)
                {
                    var cmd        = new QuerySubmission(SubmissionID.Value);
                    var submission = cmd.Execute();
                    PropertyBag.Submission = submission;

                    var cmdSubverse = new QuerySubverse(submission.Subverse);
                    var subverse    = cmdSubverse.Execute();

                    return(subverse);
                }
                if (CommentID != null)
                {
                    var cmdComment = new QueryComment(CommentID.Value);
                    var comment    = cmdComment.Execute();
                    PropertyBag.Comment = comment;

                    var cmd        = new QuerySubmission(comment.SubmissionID.Value);
                    var submission = cmd.Execute();
                    PropertyBag.Submission = submission;

                    var cmdSubverse = new QuerySubverse(submission.Subverse);
                    var subverse    = cmdSubverse.Execute();

                    return(subverse);
                }
                break;
            }

            return(base.GetMissingValue(name));
        }