public async Task <ActionResult> CreateSubverse([Bind(Include = "Name, Title, Description, Type, Sidebar, Creation_date, Owner")] AddSubverse subverseTmpModel)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    Subverse subverse = new Subverse();
                    subverse.name          = subverseTmpModel.Name;
                    subverse.title         = "/v/" + subverseTmpModel.Name;
                    subverse.description   = subverseTmpModel.Description;
                    subverse.type          = subverseTmpModel.Type;
                    subverse.sidebar       = subverseTmpModel.Sidebar;
                    subverse.creation_date = subverseTmpModel.Creation_date;

                    //check if subverse exists before attempting to create it
                    if (db.Subverses.Find(subverse.name) == null)
                    {
                        db.Subverses.Add(subverse);
                        await db.SaveChangesAsync();

                        //register user as the owner of the newly created subverse
                        SubverseAdmin tmpSubverseAdmin = new SubverseAdmin();

                        tmpSubverseAdmin.SubverseName = subverse.name;
                        tmpSubverseAdmin.Username     = subverseTmpModel.Owner;
                        tmpSubverseAdmin.Power        = 1;

                        db.SubverseAdmins.Add(tmpSubverseAdmin);
                        await db.SaveChangesAsync();

                        //go to newly created Subverse
                        return(RedirectToAction("Index", "Subverses", new { subversetoshow = subverse.name }));
                    }
                    else
                    {
                        ModelState.AddModelError(string.Empty, "Sorry, The subverse you are trying to create already exists.");
                        return(View());
                    }
                }
                else
                {
                    return(View());
                }
            }
            catch (Exception)
            {
                ModelState.AddModelError(string.Empty, "Something bad happened.");
                return(View());
            }
        }
        public ActionResult SubverseSettings(string subversetoshow)
        {
            Subverse subverse = db.Subverses.Find(subversetoshow);

            if (subverse == null)
            {
                ViewBag.SelectedSubverse = "404";
                return(View("~/Views/Errors/Subversenotfound.cshtml"));
            }

            SubverseAdmin subAdmin = db.SubverseAdmins
                                     .Where(x => x.SubverseName == subversetoshow && x.Username == User.Identity.Name && x.Power == 1).FirstOrDefault();

            if (subAdmin != null)
            {
                return(View(subverse));
            }
            else
            {
                return(new EmptyResult());
            }
        }
Beispiel #3
0
        public async Task<ActionResult> CreateSubverse([Bind(Include = "Name, Title, Description, Type, Sidebar, Creation_date, Owner")] AddSubverse subverseTmpModel)
        {
            // abort if model state is invalid
            if (!ModelState.IsValid) return View();

            int minimumCcp = Settings.MinimumCcp;
            int maximumOwnedSubs = Settings.MaximumOwnedSubs;

            // verify recaptcha if user has less than minimum required CCP
            if (Karma.CommentKarma(User.Identity.Name) < minimumCcp)
            {
                // begin recaptcha check
                bool isCaptchaCodeValid = await ReCaptchaUtility.Validate(Request);

                if (!isCaptchaCodeValid)
                {
                    ModelState.AddModelError("", "Incorrect recaptcha answer.");

                    // TODO 
                    // SET PREVENT SPAM DELAY TO 0

                    return View();
                }
            }

            // only allow users with less than maximum allowed subverses to create a subverse
            var amountOfOwnedSubverses = _db.SubverseAdmins
                .Where(s => s.Username == User.Identity.Name && s.Power == 1)
                .ToList();
            if (amountOfOwnedSubverses.Count >= maximumOwnedSubs)
            {
                ModelState.AddModelError(string.Empty, "Sorry, you can not own more than " + maximumOwnedSubs + " subverses.");
                return View();
            }

            // check if subverse already exists
            if (DataCache.Subverse.Retrieve(subverseTmpModel.Name) != null)
            {
                ModelState.AddModelError(string.Empty, "Sorry, The subverse you are trying to create already exists, but you can try to claim it by submitting a takeover request to /v/subverserequest.");
                return View();
            }

            try
            {
                // setup default values and create the subverse
                var subverse = new Subverse
                {
                    name = subverseTmpModel.Name,
                    title = "/v/" + subverseTmpModel.Name,
                    description = subverseTmpModel.Description,
                    sidebar = subverseTmpModel.Sidebar,
                    creation_date = DateTime.Now,
                    type = "link",
                    enable_thumbnails = true,
                    rated_adult = false,
                    private_subverse = false,
                    minimumdownvoteccp = 0,
                    admin_disabled = false
                };

                _db.Subverses.Add(subverse);
                await _db.SaveChangesAsync();

                // subscribe user to the newly created subverse
                Voat.Utilities.UserHelper.SubscribeToSubverse(subverseTmpModel.Owner, subverse.name);

                // register user as the owner of the newly created subverse
                var tmpSubverseAdmin = new SubverseAdmin
                {
                    SubverseName = subverseTmpModel.Name,
                    Username = User.Identity.Name,
                    Power = 1
                };
                _db.SubverseAdmins.Add(tmpSubverseAdmin);
                await _db.SaveChangesAsync();

                // go to newly created Subverse
                return RedirectToAction("SubverseIndex", "Subverses", new { subversetoshow = subverseTmpModel.Name });
            }
            catch (Exception)
            {
                ModelState.AddModelError(string.Empty, "Something bad happened, please report this to /v/voatdev. Thank you.");
                return View();
            }
        }
Beispiel #4
0
        public ActionResult AcceptModInvitation(int invitationId)
        {
            int maximumOwnedSubs = Settings.MaximumOwnedSubs;

            // check if there is an invitation for this user with this id
            var userInvitation = _db.Moderatorinvitations.Find(invitationId);
            if (userInvitation == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            // check if logged in user is actually the invited user
            if (!User.Identity.Name.Equals(userInvitation.Sent_to, StringComparison.OrdinalIgnoreCase))
            {
                return new HttpStatusCodeResult(HttpStatusCode.Unauthorized);
            }

            // check if user is over modding limits
            var amountOfSubsUserModerates = _db.SubverseAdmins.Where(s => s.Username.Equals(User.Identity.Name, StringComparison.OrdinalIgnoreCase));
            if (amountOfSubsUserModerates.Any())
            {
                if (amountOfSubsUserModerates.Count() >= maximumOwnedSubs)
                {
                    ModelState.AddModelError(string.Empty, "Sorry, you can not own or moderate more than " + maximumOwnedSubs + " subverses.");
                    return RedirectToAction("Index", "Home");
                }
            }

            // check if subverse exists
            var subverseToAddModTo = _db.Subverses.FirstOrDefault(s => s.name.Equals(userInvitation.Subverse, StringComparison.OrdinalIgnoreCase));
            if (subverseToAddModTo == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            // check if user is already a moderator of this sub
            var userModerating = _db.SubverseAdmins.Where(s => s.SubverseName.Equals(userInvitation.Subverse, StringComparison.OrdinalIgnoreCase) && s.Username.Equals(User.Identity.Name, StringComparison.OrdinalIgnoreCase));
            if (userModerating.Any())
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            // add user as moderator as specified in invitation
            var subAdm = new SubverseAdmin
            {
                SubverseName = userInvitation.Subverse,
                Username = userInvitation.Sent_to,
                Power = userInvitation.Power,
                Added_by = userInvitation.Sent_by,
                Added_on = DateTime.Now
            };

            _db.SubverseAdmins.Add(subAdm);

            // notify sender that user has accepted the invitation
            StringBuilder confirmation = new StringBuilder();
            confirmation.Append("User " + User.Identity.Name + " has accepted your invitation to moderate subverse /v/" + userInvitation.Subverse + ".");
            confirmation.AppendLine();
            MesssagingUtility.SendPrivateMessage("Voat", userInvitation.Sent_by, "Moderator invitation for " + userInvitation.Subverse + " accepted", confirmation.ToString());

            // delete the invitation from database
            _db.Moderatorinvitations.Remove(userInvitation);
            _db.SaveChanges();

            return RedirectToAction("SubverseSettings", "Subverses", new { subversetoshow = userInvitation.Subverse });
        }