public async Task <ActionResult> ModeratorDelete(string subverse, int submissionID)
        {
            if (!ModeratorPermission.HasPermission(User, subverse, Domain.Models.ModeratorAction.DeletePosts))
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.Unauthorized)));
            }

            //New Domain Submission
            //var q = new QuerySubmission(submissionID);
            //var s = await q.ExecuteAsync();

            //Legacy Data Submission (Since views expect this type, we use it for now)
            var s = DataCache.Submission.Retrieve(submissionID);

            ViewBag.Submission = s;

            if (s == null)
            {
                ModelState.AddModelError("", "Can not find submission. Is it hiding?");
                return(View(new ModeratorDeleteContentViewModel()));
            }
            if (s.IsDeleted)
            {
                ModelState.AddModelError("", "Can not delete a deleted post. Do you have no standards?");
            }

            return(View(new ModeratorDeleteContentViewModel()
            {
                ID = s.ID
            }));
        }
        public async Task <ActionResult> AddBan([Bind("Id,Subverse,UserName,Reason")] SubverseBan subverseBan)
        {
            if (!ModelState.IsValid)
            {
                return(View(subverseBan));
            }
            //check perms
            if (!ModeratorPermission.HasPermission(User, subverseBan.Subverse, Domain.Models.ModeratorAction.Banning))
            {
                return(RedirectToAction("Index", "Home"));
            }

            var cmd    = new SubverseBanCommand(subverseBan.UserName, subverseBan.Subverse, subverseBan.Reason, true).SetUserContext(User);
            var result = await cmd.Execute();

            if (result.Success)
            {
                return(RedirectToAction("SubverseBans"));
            }
            else
            {
                ModelState.AddModelError(string.Empty, result.Message);
                ViewBag.SubverseName     = subverseBan.Subverse;
                ViewBag.SelectedSubverse = string.Empty;
                SetNavigationViewModel(subverseBan.Subverse);

                return(View("~/Views/Subverses/Admin/AddBan.cshtml",
                            new SubverseBanViewModel
                {
                    UserName = subverseBan.UserName,
                    Reason = subverseBan.Reason
                }));
            }
        }
Exemplo n.º 3
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
            }));
        }
Exemplo n.º 4
0
        public ActionResult ClearLinkFlair(int?submissionID)
        {
            if (submissionID == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            // get model for selected submission
            var submissionModel = _db.Submissions.Find(submissionID);

            if (submissionModel == null || submissionModel.IsDeleted)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            // check if caller is subverse moderator, if not, deny posting
            if (!ModeratorPermission.HasPermission(User.Identity.Name, submissionModel.Subverse, Domain.Models.ModeratorAction.AssignFlair))
            {
                return(new HttpUnauthorizedResult());
            }

            // clear flair and save submission
            submissionModel.FlairCss   = null;
            submissionModel.FlairLabel = null;
            _db.SaveChanges();
            DataCache.Submission.Remove(submissionID.Value);
            return(new HttpStatusCodeResult(HttpStatusCode.OK));
        }
        public ActionResult RecallModeratorInvitation(int?invitationId)
        {
            if (invitationId == null)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.NotFound)));
                //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            var moderatorInvitation = _db.ModeratorInvitation.Find(invitationId);

            if (moderatorInvitation == null)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.NotFound)));
                //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            if (!ModeratorPermission.HasPermission(User, moderatorInvitation.Subverse, Domain.Models.ModeratorAction.InviteMods))
            {
                return(RedirectToAction("SubverseModerators"));
            }
            //make sure mods can't remove invites
            var currentModLevel = ModeratorPermission.Level(User, moderatorInvitation.Subverse);

            if (moderatorInvitation.Power <= (int)currentModLevel && currentModLevel != Domain.Models.ModeratorLevel.Owner)
            {
                return(RedirectToAction("SubverseModerators"));
            }

            ViewBag.SubverseName = moderatorInvitation.Subverse;
            SetNavigationViewModel(moderatorInvitation.Subverse);

            return(View("~/Views/Subverses/Admin/RecallModeratorInvitation.cshtml", moderatorInvitation));
        }
        public async Task <CommandResponse <string> > RegenerateThumbnail(int submissionID)
        {
            DemandAuthentication();

            // get model for selected submission
            var submission = _db.Submission.Find(submissionID);
            var response   = CommandResponse.FromStatus(Status.Error);

            if (submission == null || submission.IsDeleted)
            {
                return(CommandResponse.FromStatus("", Status.Error, "Submission is missing or deleted"));
            }
            var subverse = submission.Subverse;

            // check if caller is subverse moderator, if not, deny change
            if (!ModeratorPermission.HasPermission(User, subverse, Domain.Models.ModeratorAction.AssignFlair))
            {
                return(CommandResponse.FromStatus("", Status.Denied, "Moderator Permissions are not satisfied"));
            }
            try
            {
                throw new NotImplementedException();

                await _db.SaveChangesAsync();

                return(CommandResponse.FromStatus("", Status.Success));
            }
            catch (Exception ex)
            {
                return(CommandResponse.Error <CommandResponse <string> >(ex));
            }
        }
        public ActionResult SubverseStylesheetEditor(string subverse)
        {
            var subverseObject = DataCache.Subverse.Retrieve(subverse);

            if (subverseObject == null)
            {
                ViewBag.SelectedSubverse = "404";
                return(ErrorView(ErrorViewModel.GetErrorViewModel(ErrorType.SubverseNotFound)));
            }
            if (!ModeratorPermission.HasPermission(User, subverse, Domain.Models.ModeratorAction.ModifyCSS))
            {
                return(RedirectToAction("Index", "Home"));
            }

            // map existing data to view model for editing and pass it to frontend
            var viewModel = new SubverseStylesheetViewModel
            {
                Name       = subverseObject.Name,
                Stylesheet = subverseObject.Stylesheet
            };

            ViewBag.SelectedSubverse = string.Empty;
            ViewBag.SubverseName     = subverseObject.Name;
            SetNavigationViewModel(subverseObject.Name);

            return(View("~/Views/Subverses/Admin/SubverseStylesheetEditor.cshtml", viewModel));
        }
        public async Task <CommandResponse <bool> > ToggleNSFW(int submissionID)
        {
            DemandAuthentication();

            // get model for selected submission
            var submission = _db.Submission.Find(submissionID);
            var response   = CommandResponse.FromStatus(Status.Error);

            if (submission == null || submission.IsDeleted)
            {
                return(CommandResponse.FromStatus(false, Status.Error, "Submission is missing or deleted"));
            }
            var subverse = submission.Subverse;

            if (!User.Identity.Name.IsEqual(submission.UserName))
            {
                // check if caller is subverse moderator, if not, deny change
                if (!ModeratorPermission.HasPermission(User, subverse, Domain.Models.ModeratorAction.AssignFlair))
                {
                    return(CommandResponse.FromStatus(false, Status.Denied, "Moderator Permissions are not satisfied"));
                }
            }
            try
            {
                submission.IsAdult = !submission.IsAdult;

                await _db.SaveChangesAsync();

                return(CommandResponse.FromStatus(submission.IsAdult, Status.Success));
            }
            catch (Exception ex)
            {
                return(CommandResponse.Error <CommandResponse <bool> >(ex));
            }
        }
        public ActionResult RemoveModerator(int?id)
        {
            if (id == null)
            {
                return(ErrorView(ErrorViewModel.GetErrorViewModel(ErrorType.NotFound)));
                //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            var subModerator = _db.SubverseModerator.Find(id);

            if (subModerator == null)
            {
                return(RedirectToAction("NotFound", "Error"));
            }

            if (!ModeratorPermission.HasPermission(User, subModerator.Subverse, Domain.Models.ModeratorAction.RemoveMods))
            {
                return(RedirectToAction("Index", "Home"));
            }

            ViewBag.SelectedSubverse = string.Empty;
            ViewBag.SubverseName     = subModerator.Subverse;
            SetNavigationViewModel(subModerator.Subverse);

            return(View("~/Views/Subverses/Admin/RemoveModerator.cshtml", subModerator));
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var data = String.Join(",", JArray.Load(reader).Select(t => t.ToString()).ToArray());

            ModeratorPermission result = ModeratorPermission.None;

            //var valid = Enum.TryParse(data, true, out result);

            var valid = true;

            try
            {
                result = (ModeratorPermission)Enum.Parse(typeof(ModeratorPermission), data);
            }
            catch (Exception)
            {
                valid = false;
            }

            if (!valid)
            {
                result = ModeratorPermission.None;
            }

            return(result);
        }
        public ActionResult SubverseBans(string subverse, int?page)
        {
            const int pageSize   = 25;
            int       pageNumber = (page ?? 0);

            if (pageNumber < 0)
            {
                return(ErrorView(ErrorViewModel.GetErrorViewModel(ErrorType.NotFound)));
            }

            // get model for selected subverse
            var subverseObject = DataCache.Subverse.Retrieve(subverse);

            if (subverseObject == null)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.SubverseNotFound)));
                //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            if (!ModeratorPermission.HasPermission(User, subverse, Domain.Models.ModeratorAction.Banning))
            {
                return(RedirectToAction("Index", "Home"));
            }

            var subverseBans          = _db.SubverseBan.Where(n => n.Subverse == subverse).OrderByDescending(s => s.CreationDate);
            var paginatedSubverseBans = new PaginatedList <SubverseBan>(subverseBans, page ?? 0, pageSize);

            ViewBag.SubverseModel    = subverseObject;
            ViewBag.SubverseName     = subverse;
            ViewBag.SelectedSubverse = string.Empty;
            SetNavigationViewModel(subverseObject.Name);

            return(View("~/Views/Subverses/Admin/SubverseBans.cshtml", paginatedSubverseBans));
        }
        public ActionResult ClearLinkFlair(int?submissionID)
        {
            if (submissionID == null)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.NotFound)));
                //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            // get model for selected submission
            var submissionModel = _db.Submission.Find(submissionID);

            if (submissionModel == null || submissionModel.IsDeleted)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.NotFound)));
                //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            // check if caller is subverse moderator, if not, deny posting
            if (!ModeratorPermission.HasPermission(User, submissionModel.Subverse, Domain.Models.ModeratorAction.AssignFlair))
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.Unauthorized)));
            }

            // clear flair and save submission
            submissionModel.FlairCss   = null;
            submissionModel.FlairLabel = null;
            _db.SaveChanges();
            DataCache.Submission.Remove(submissionID.Value);

            return(JsonResult(CommandResponse.FromStatus(Status.Success)));
            //return new HttpStatusCodeResult(HttpStatusCode.OK);
        }
        public async Task <ActionResult> RemoveLinkFlair(int id)
        {
            // get link flair for selected subverse
            var linkFlairToRemove = await _db.SubverseFlair.FindAsync(id);

            if (linkFlairToRemove == null)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.NotFound)));
                //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            var subverse = DataCache.Subverse.Retrieve(linkFlairToRemove.Subverse);

            if (subverse == null)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.SubverseNotFound)));
                //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            // check if caller has clearance to remove a link flair
            if (!ModeratorPermission.HasPermission(User, subverse.Name, Domain.Models.ModeratorAction.ModifyFlair))
            {
                return(RedirectToAction("Index", "Home"));
            }

            // execute removal
            var subverseFlairSetting = await _db.SubverseFlair.FindAsync(id);

            _db.SubverseFlair.Remove(subverseFlairSetting);
            await _db.SaveChangesAsync();

            //clear cache
            CacheHandler.Instance.Remove(CachingKey.SubverseFlair(subverse.Name));

            return(RedirectToAction("SubverseFlairSettings"));
        }
        public ActionResult RemoveBan(string subverse, int?id)
        {
            if (id == null)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.NotFound)));
            }

            // check if caller is subverse owner, if not, deny listing
            if (!ModeratorPermission.HasPermission(User, subverse, Domain.Models.ModeratorAction.Banning))
            {
                return(RedirectToAction("Index", "Home"));
            }
            var subverseBan = _db.SubverseBan.Find(id);

            if (subverseBan == null)
            {
                return(RedirectToAction("NotFound", "Error"));
            }

            ViewBag.SelectedSubverse = string.Empty;
            ViewBag.SubverseName     = subverseBan.Subverse;
            SetNavigationViewModel(subverseBan.Subverse);

            return(View("~/Views/Subverses/Admin/RemoveBan.cshtml", subverseBan));
        }
Exemplo n.º 15
0
        public ActionResult ApplyLinkFlair(int?submissionID, int?flairId)
        {
            if (submissionID == null || flairId == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            var submission = _db.Submissions.Find(submissionID);

            if (submission == null || submission.IsDeleted)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

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

            // find flair by id, apply it to submission
            var flairModel = _db.SubverseFlairs.Find(flairId);

            if (flairModel == null || flairModel.Subverse != submission.Subverse)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            // apply flair and save submission
            submission.FlairCss   = flairModel.CssClass;
            submission.FlairLabel = flairModel.Label;
            _db.SaveChanges();
            DataCache.Submission.Remove(submissionID.Value);

            return(new HttpStatusCodeResult(HttpStatusCode.OK));
        }
Exemplo n.º 16
0
        public ActionResult Compose()
        {
            ViewBag.PmView = "compose";
            ViewBag.Title  = "Compose";

            var recipient = Request.Params["recipient"];
            var subject   = Request.Params["subject"];
            var subverse  = (string)RouteData.Values["subverse"];
            var model     = new NewMessageViewModel()
            {
                Recipient = recipient, Subject = subject
            };

            var userData = UserData;

            model.RequireCaptcha = userData.Information.CommentPoints.Sum < Settings.MinimumCommentPointsForCaptchaMessaging && !Settings.CaptchaDisabled;

            if (!string.IsNullOrEmpty(subverse))
            {
                if (!ModeratorPermission.HasPermission(User.Identity.Name, subverse, ModeratorAction.SendMail))
                {
                    return(RedirectToAction("Home", "Index"));
                }
                ViewBag.PmView = "mod";
                model.Sender   = UserDefinition.Format(subverse, IdentityType.Subverse);
            }

            // return compose view
            return(View(model));
        }
        public ActionResult SubverseFlairSettings(string subverse)
        {
            // get model for selected subverse
            var subverseObject = DataCache.Subverse.Retrieve(subverse);

            if (subverseObject == null)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.SubverseNotFound)));
                //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            // check if caller is authorized for this sub, if not, deny listing
            if (!ModeratorPermission.HasPermission(User, subverse, Domain.Models.ModeratorAction.ModifyFlair))
            {
                return(RedirectToAction("Index", "Home"));
            }

            var subverseFlairsettings = _db.SubverseFlair
                                        .Where(n => n.Subverse == subverse)
                                        .Take(20)
                                        .OrderBy(s => s.ID)
                                        .ToList();

            ViewBag.SubverseModel    = subverseObject;
            ViewBag.SubverseName     = subverse;
            ViewBag.SelectedSubverse = string.Empty;
            SetNavigationViewModel(subverseObject.Name);

            return(View("~/Views/Subverses/Admin/Flair/FlairSettings.cshtml", subverseFlairsettings));
        }
Exemplo n.º 18
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));
            }
        }
        public async Task <ActionResult> SubverseLinkFlairs(string subverse, int?id)
        {
            // get model for selected subverse
            var subverseObject = DataCache.Subverse.Retrieve(subverse);

            if (subverseObject == null || id == null)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.SubverseNotFound)));
            }

            var submission = DataCache.Submission.Retrieve(id);

            if (submission == null || submission.Subverse != subverse)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.NotFound)));
            }

            // check if caller is subverse owner or moderator, if not, deny listing
            if (!ModeratorPermission.HasPermission(User, subverse, Domain.Models.ModeratorAction.AssignFlair))
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.Unauthorized)));
            }

            var q      = new QuerySubverseFlair(subverseObject.Name);
            var flairs = await q.ExecuteAsync();

            ViewBag.SubmissionId = id;
            ViewBag.SubverseName = subverse;

            return(PartialView("~/Views/AjaxViews/_LinkFlairSelectDialog.cshtml", flairs));
        }
        public async Task <ActionResult> SubverseStylesheetEditor(SubverseStylesheetViewModel model)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    SetNavigationViewModel(model.Name);
                    return(View("~/Views/Subverses/Admin/SubverseStylesheetEditor.cshtml"));
                }
                var existingSubverse = _db.Subverse.FirstOrDefault(x => x.Name.ToUpper() == model.Name.ToUpper());

                // check if subverse exists before attempting to edit it
                if (existingSubverse != null)
                {
                    SetNavigationViewModel(model.Name);
                    // check if user requesting edit is authorized to do so for current subverse
                    // check that the user requesting to edit subverse settings is subverse owner!
                    if (!ModeratorPermission.HasPermission(User, existingSubverse.Name, Domain.Models.ModeratorAction.ModifyCSS))
                    {
                        return(new EmptyResult());
                    }

                    if (!String.IsNullOrEmpty(model.Stylesheet))
                    {
                        if (model.Stylesheet.Length < 50001)
                        {
                            existingSubverse.Stylesheet = model.Stylesheet;
                        }
                        else
                        {
                            ModelState.AddModelError(string.Empty, "Sorry, custom CSS limit is set to 50000 characters.");
                            return(View("~/Views/Subverses/Admin/SubverseStylesheetEditor.cshtml"));
                        }
                    }
                    else
                    {
                        existingSubverse.Stylesheet = model.Stylesheet;
                    }

                    await _db.SaveChangesAsync();

                    //purge new minified CSS
                    CacheHandler.Instance.Remove(CachingKey.SubverseStylesheet(existingSubverse.Name));
                    CacheHandler.Instance.Remove(CachingKey.Subverse(existingSubverse.Name));

                    // go back to this subverse
                    return(RedirectToRoute(Models.ROUTE_NAMES.SUBVERSE_INDEX, new { subverse = model.Name }));
                }

                ModelState.AddModelError(string.Empty, "Sorry, The subverse you are trying to edit does not exist.");
                return(View("~/Views/Subverses/Admin/SubverseStylesheetEditor.cshtml", model));
            }
            catch (Exception ex)
            {
                EventLogger.Instance.Log(ex);
                ModelState.AddModelError(string.Empty, "Something bad happened.");
                return(View("~/Views/Subverses/Admin/SubverseStylesheetEditor.cshtml", model));
            }
        }
Exemplo n.º 21
0
        protected override RuleOutcome EvaluateRule(VoatRuleContext context)
        {
            //bool isModerator = context.UserData.Information.Moderates.Any(x => x.Subverse.Equals(context.Subverse.Name, StringComparison.OrdinalIgnoreCase));
            bool isModerator = ModeratorPermission.IsModerator(context.User, context.Subverse.Name, null);

            // check posting quotas if user is posting to subs they do not moderate
            if (!isModerator)
            {
                // reject if user has reached global daily submission quota
                if (UserDailyGlobalPostingQuotaUsed(context))
                {
                    return(CreateOutcome(RuleResult.Denied, "You have reached your daily global submission quota"));
                }

                // reject if user has reached global hourly submission quota
                if (UserHourlyGlobalPostingQuotaUsed(context))
                {
                    return(CreateOutcome(RuleResult.Denied, "You have reached your hourly global submission quota"));
                }

                // check if user has reached hourly posting quota for target subverse
                if (UserHourlyPostingQuotaForSubUsed(context, context.Subverse.Name))
                {
                    return(CreateOutcome(RuleResult.Denied, "You have reached your hourly submission quota for this subverse"));
                }

                // check if user has reached daily posting quota for target subverse
                if (UserDailyPostingQuotaForSubUsed(context, context.Subverse.Name))
                {
                    return(CreateOutcome(RuleResult.Denied, "You have reached your daily submission quota for this subverse"));
                }
                if (context.Subverse.IsAuthorizedOnly)
                {
                    return(CreateOutcome(RuleResult.Denied, "You are not authorized to submit links or start discussions in this subverse. Please contact subverse moderators for authorization"));
                }
            }

            Domain.Models.UserSubmission userSubmission = context.PropertyBag.UserSubmission;
            if (userSubmission.Type == Domain.Models.SubmissionType.Link)
            {
                using (var repo = new Data.Repository())
                {
                    int crossPostCount = repo.FindUserLinkSubmissionCount(context.UserName, userSubmission.Url, TimeSpan.FromDays(1));
                    if (crossPostCount >= VoatSettings.Instance.DailyCrossPostingQuota)
                    {
                        return(CreateOutcome(RuleResult.Denied, "You have reached your daily crossposting quota for this Url"));
                    }
                }

                //Old code
                //if (UserHelper.DailyCrossPostingQuotaUsed(userName, submissionModel.Content))
                //{
                //    // ABORT
                //    return ("You have reached your daily crossposting quota for this URL.");
                //}
            }

            return(Allowed);
        }
        public async Task <CommandResponse <Comment> > DistinguishComment(int commentID)
        {
            DemandAuthentication();
            var response = CommandResponse.FromStatus <Comment>(null, Status.Invalid);
            var comment  = await this.GetComment(commentID);

            if (comment != null)
            {
                // check to see if request came from comment author
                if (User.Identity.Name == comment.UserName)
                {
                    // check to see if comment author is also sub mod or sub admin for comment sub
                    if (ModeratorPermission.HasPermission(User, comment.Subverse, ModeratorAction.DistinguishContent))
                    {
                        var m = new DapperMulti();

                        var u = new DapperUpdate();
                        //u.Update = $"{SqlFormatter.Table("Comment")} SET \"IsDistinguished\" = {SqlFormatter.ToggleBoolean("\"IsDistinguished\"")}";
                        u.Update = SqlFormatter.UpdateSetBlock($"\"IsDistinguished\" = {SqlFormatter.ToggleBoolean("\"IsDistinguished\"")}", SqlFormatter.Table("Comment"));
                        u.Where  = "\"ID\" = @id";
                        u.Parameters.Add("id", commentID);
                        m.Add(u);

                        var s = new DapperQuery();
                        s.Select = $"\"IsDistinguished\" FROM {SqlFormatter.Table("Comment")}";
                        s.Where  = "\"ID\" = @id";
                        m.Add(s);

                        //ProTip: The actual execution of code is important.
                        var result = await _db.Connection.ExecuteScalarAsync <bool>(m.ToCommandDefinition());

                        comment.IsDistinguished = result;

                        response = CommandResponse.FromStatus(comment, Status.Success);
                    }
                    else
                    {
                        response.Message = "User does not have permissions to distinquish content";
                        response.Status  = Status.Denied;
                    }
                }
                else
                {
                    response.Message = "User can only distinquish owned content";
                    response.Status  = Status.Denied;
                }
            }
            else
            {
                response.Message = "Comment can not be found";
                response.Status  = Status.Denied;
            }
            return(response);
        }
Exemplo n.º 23
0
        public ActionResult ToggleSticky(int submissionID)
        {
            // get model for selected submission
            var submissionModel = _db.Submissions.Find(submissionID);

            if (submissionModel == null || submissionModel.IsDeleted)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            // check if caller is subverse moderator, if not, deny change
            if (!ModeratorPermission.HasPermission(User.Identity.Name, submissionModel.Subverse, Domain.Models.ModeratorAction.AssignStickies))
            {
                return(new HttpUnauthorizedResult());
            }
            try
            {
                // find and clear current sticky if toggling
                var existingSticky = _db.StickiedSubmissions.FirstOrDefault(s => s.SubmissionID == submissionID);
                if (existingSticky != null)
                {
                    _db.StickiedSubmissions.Remove(existingSticky);
                }
                else
                {
                    // remove all stickies for subverse matching submission subverse
                    _db.StickiedSubmissions.RemoveRange(_db.StickiedSubmissions.Where(s => s.Subverse == submissionModel.Subverse));

                    // set new submission as sticky
                    var stickyModel = new StickiedSubmission
                    {
                        SubmissionID = submissionID,
                        CreatedBy    = User.Identity.Name,
                        CreationDate = Repository.CurrentDate,
                        Subverse     = submissionModel.Subverse
                    };

                    _db.StickiedSubmissions.Add(stickyModel);
                }

                _db.SaveChanges();

                StickyHelper.ClearStickyCache(submissionModel.Subverse);

                return(new HttpStatusCodeResult(HttpStatusCode.OK));
            }
            catch (Exception)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.InternalServerError));
            }
        }
        public async Task <ActionResult> SubverseIndex(string subverse, MessageTypeFlag type, MessageState?state = null, int?page = null)
        {
            if (!(type == MessageTypeFlag.Private || type == MessageTypeFlag.Sent))
            {
                return(RedirectToAction("Index", "Home"));
            }
            if (string.IsNullOrEmpty(subverse))
            {
                return(RedirectToAction("Index", "Home"));
            }
            if (!ModeratorPermission.HasPermission(User, subverse, ModeratorAction.ReadMail))
            {
                return(RedirectToAction("Index", "Home"));
            }

            ViewBag.Context = new MessageContextViewModel()
            {
                ViewerContext = new UserDefinition()
                {
                    Name = subverse, Type = IdentityType.Subverse
                }
            };

            var qSub = new QuerySubverse(subverse);
            var sub  = await qSub.ExecuteAsync();

            if (sub == null)
            {
                return(ErrorView(ErrorViewModel.GetErrorViewModel(ErrorType.SubverseNotFound)));
            }
            //ViewBag.PmView = "mod";
            //ViewBag.Title = string.Format("v/{0} {1}", sub.Name, (type == MessageTypeFlag.Sent ? "Sent" : "Inbox"));

            var q = new QueryMessages(sub.Name, IdentityType.Subverse, type, MessageState.All, false).SetUserContext(User);

            q.PageNumber = SetPage(page);
            var result = await q.ExecuteAsync();

            var pagedList = new PaginatedList <Message>(result, q.PageNumber, q.PageCount);

            //TODO: This needs to be the Smail Menu, right now it shows user menu
            var name = type == MessageTypeFlag.Sent ? "Sent" : "Inbox";

            ViewBag.Title = name;
            SetMenuNavigationModel(name, MenuType.Smail, subverse);

            return(View("Index", pagedList));
        }
        public ActionResult AddLinkFlair(SubverseFlairInput subverseFlairSetting)
        {
            if (!ModelState.IsValid)
            {
                return(View("~/Views/Subverses/Admin/Flair/AddLinkFlair.cshtml", subverseFlairSetting));
            }

            //check perms
            if (!ModeratorPermission.HasPermission(User, subverseFlairSetting.Subverse, Domain.Models.ModeratorAction.ModifyFlair))
            {
                return(RedirectToAction("Index", "Home"));
            }

            // get model for selected subverse
            var subverse = DataCache.Subverse.Retrieve(subverseFlairSetting.Subverse);

            if (subverse == null)
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.SubverseNotFound)));
            }
            var count = _db.SubverseFlair.Count(x => x.Subverse == subverseFlairSetting.Subverse);

            if (count >= 20)
            {
                ViewBag.SubverseModel    = subverse;
                ViewBag.SubverseName     = subverse.Name;
                ViewBag.SelectedSubverse = string.Empty;
                SetNavigationViewModel(subverse.Name);
                ModelState.AddModelError("", "Subverses are limited to 20 flairs");
                return(View("~/Views/Subverses/Admin/Flair/AddLinkFlair.cshtml", subverseFlairSetting));
            }

            subverseFlairSetting.Subverse = subverse.Name;
            _db.SubverseFlair.Add(new SubverseFlair()
            {
                Label    = subverseFlairSetting.Label,
                CssClass = subverseFlairSetting.CssClass,
                Subverse = subverseFlairSetting.Subverse
            });
            _db.SaveChanges();

            //clear cache
            CacheHandler.Instance.Remove(CachingKey.SubverseFlair(subverse.Name));

            return(RedirectToAction("SubverseFlairSettings"));
        }
        public async Task <ActionResult> ModeratorDelete(string subverse, int submissionID, ModeratorDeleteContentViewModel model)
        {
            //New Domain Submission
            //var q = new QuerySubmission(submissionID);
            //var s = await q.ExecuteAsync();

            //Legacy Data Submission (Since views expect this type, we use it for now)
            var s = DataCache.Submission.Retrieve(submissionID);

            ViewBag.Submission = s;
            if (s == null || s.ID != model.ID)
            {
                ModelState.AddModelError("", "Can not find submission. Is it hiding?");
                return(View(model));
            }
            if (s.IsDeleted)
            {
                ModelState.AddModelError("", "Can not delete a deleted post. Do you have no standards?");
                return(View(model));
            }

            if (!ModeratorPermission.HasPermission(User, s.Subverse, Domain.Models.ModeratorAction.DeletePosts))
            {
                return(HybridError(ErrorViewModel.GetErrorViewModel(ErrorType.Unauthorized)));
            }

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

            var cmd = new DeleteSubmissionCommand(model.ID, model.Reason).SetUserContext(User);
            var r   = await cmd.Execute();

            if (r.Success)
            {
                return(RedirectToRoute(Models.ROUTE_NAMES.SUBVERSE_INDEX, new { subverse = s.Subverse }));
            }
            else
            {
                ModelState.AddModelError("", r.Message);
                return(View(model));
            }
        }
Exemplo n.º 27
0
        public IEnumerable <ValidationResult> Validate(ValidationContext validationContext)
        {
            var    errors           = new List <ValidationResult>();
            string originalUserName = UserHelper.OriginalUsername(UserName);

            if (String.IsNullOrEmpty(originalUserName))
            {
                errors.Add(ValidationPathResult.Create(this, $"User '{UserName}' can not be found", x => x.UserName));
            }
            else if (!ModeratorPermission.IsModerator(UserName, Subverse))
            {
                errors.Add(ValidationPathResult.Create(this, $"User '{UserName}' is not a moderator of {Subverse}", x => x.UserName));
            }
            else
            {
                UserName = originalUserName;
            }
            return(errors);
        }
Exemplo n.º 28
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
            }));
        }
Exemplo n.º 29
0
        public async Task <ActionResult> Reports(string subverse, Domain.Models.ContentType?type = null, int days = 1, Domain.Models.ReviewStatus status = Domain.Models.ReviewStatus.Unreviewed, int[] ruleid = null)
        {
            days = days.EnsureRange(1, 7);

            if (subverse.IsEqual("all"))
            {
                subverse = null;
            }
            else
            {
                //check perms
                if (!ModeratorPermission.HasPermission(User, subverse, Domain.Models.ModeratorAction.AccessReports))
                {
                    return(ErrorView(ErrorViewModel.GetErrorViewModel(ErrorType.Unauthorized)));
                }
            }
            //TODO: Implement Command/Query - Remove direct Repository access
            using (var repo = new Repository(User))
            {
                var data = await repo.GetRuleReports(subverse, type, days * 24, status, ruleid);

                ViewBag.Days         = days;
                ViewBag.RuleID       = ruleid;
                ViewBag.ReviewStatus = status;

                //Add Mod Menu
                if (!subverse.IsEqual("all"))
                {
                    ViewBag.NavigationViewModel = new Models.ViewModels.NavigationViewModel()
                    {
                        Description = "Moderation",
                        Name        = subverse,
                        MenuType    = Models.ViewModels.MenuType.Moderator,
                        BasePath    = String.Format("/v/{0}/about", subverse),
                        Sort        = null
                    };
                }

                return(View(data));
            }
        }
        public ActionResult Update(string subverse)
        {
            var subverseObject = DataCache.Subverse.Retrieve(subverse);

            if (subverseObject == null)
            {
                ViewBag.SelectedSubverse = "404";
                return(ErrorView(ErrorViewModel.GetErrorViewModel(ErrorType.SubverseNotFound)));
            }

            if (!ModeratorPermission.HasPermission(User, subverse, Domain.Models.ModeratorAction.ModifySettings))
            {
                return(RedirectToRoute(Models.ROUTE_NAMES.SUBVERSE_INDEX, new { subverse = subverse }));
            }

            // map existing data to view model for editing and pass it to frontend
            // NOTE: we should look into a mapper which automatically maps these properties to corresponding fields to avoid tedious manual mapping
            var viewModel = new SubverseSettingsViewModel
            {
                Name        = subverseObject.Name,
                Title       = subverseObject.Title,
                Description = subverseObject.Description,
                SideBar     = subverseObject.SideBar,
                //Stylesheet = subverseObject.Stylesheet,
                IsAdult             = subverseObject.IsAdult,
                IsPrivate           = subverseObject.IsPrivate,
                IsThumbnailEnabled  = subverseObject.IsThumbnailEnabled,
                ExcludeSitewideBans = subverseObject.ExcludeSitewideBans,
                IsAuthorizedOnly    = subverseObject.IsAuthorizedOnly,
                IsAnonymized        = subverseObject.IsAnonymized,
                MinCCPForDownvote   = subverseObject.MinCCPForDownvote,
                LastUpdateDate      = subverseObject.LastUpdateDate
            };

            ViewBag.SelectedSubverse = string.Empty;
            ViewBag.SubverseName     = subverseObject.Name;
            SetNavigationViewModel(subverseObject.Name);

            return(View("~/Views/Subverses/Admin/SubverseSettings.cshtml", viewModel));
        }