public async Task <ActionResult> Delete(Domain.Models.DeleteAccountOptions model)
        {
            if (ModelState.IsValid)
            {
                var cmd      = new Domain.Command.DeleteAccountCommand(model).SetUserContext(User);
                var response = await cmd.Execute();

                if (response.Success)
                {
                    await _signInManager.SignOutAsync();

                    return(View("~/Views/Account/AccountDeleted.cshtml"));
                }
                else
                {
                    ModelState.AddModelError("", response.Message);
                }
            }

            return(View(model));
        }
Exemplo n.º 2
0
        private void VerifyDelete(Domain.Models.DeleteAccountOptions options)
        {
            using (var db = new Voat.Data.Models.VoatDataContext())
            {
                int count = 0;
                switch (options.Comments.Value)
                {
                case Domain.Models.DeleteOption.Anonymize:

                    count = db.Comment.Count(x => x.UserName.ToLower() == options.UserName && !x.IsAnonymized);
                    Assert.AreEqual(0, count, $"Comment {options.Comments.ToString()} setting found violations");

                    break;

                case Domain.Models.DeleteOption.Delete:

                    count = db.Comment.Count(x => x.UserName.ToLower() == options.UserName.ToLower() && !x.IsDeleted);
                    Assert.AreEqual(0, count, $"Comment {options.Comments.ToString()} setting found violations");
                    break;
                }

                var checkSubmissions = new Action <string, Domain.Models.SubmissionType, Domain.Models.DeleteOption>((userName, submissionType, deleteSetting) =>
                {
                    switch (deleteSetting)
                    {
                    case Domain.Models.DeleteOption.Anonymize:

                        count = db.Submission.Count(x => x.UserName.ToLower() == options.UserName.ToLower() && !x.IsAnonymized && x.Type == (int)submissionType);
                        Assert.AreEqual(0, count, $"{submissionType.ToString()} Submission {deleteSetting.ToString()} setting found violations");

                        break;

                    case Domain.Models.DeleteOption.Delete:

                        count = db.Submission.Count(x => x.UserName.ToLower() == options.UserName.ToLower() && !x.IsDeleted && x.Type == (int)submissionType);
                        Assert.AreEqual(0, count, $"{submissionType.ToString()} Submission {deleteSetting.ToString()} setting found violations");
                        break;
                    }
                });

                checkSubmissions(options.UserName, Domain.Models.SubmissionType.Text, options.TextSubmissions);
                checkSubmissions(options.UserName, Domain.Models.SubmissionType.Link, options.LinkSubmissions);

                //Check account VoatSettings.Instance.
                using (var userManager = VoatUserManager.Create())
                {
                    var userAccount = userManager.FindByName(options.UserName);

                    Assert.IsNotNull(userAccount, "Can't find user account using manager");
                    if (!String.IsNullOrEmpty(options.RecoveryEmailAddress))
                    {
                        //Verify recovery info
                        Assert.AreEqual(userAccount.Email, options.RecoveryEmailAddress);
                        Assert.IsNotNull(userAccount.LockoutEnd, "Lockout should be enabled");
                        Assert.IsTrue(userAccount.LockoutEnd.Value.Subtract(DateTime.UtcNow) >= TimeSpan.FromDays(89), "Lockout be set to roughly 90 days");
                    }
                    else
                    {
                        Assert.AreEqual(userAccount.Email, null);
                        Assert.IsNull(userAccount.LockoutEnd, "Lockout should not be enabled");
                    }



                    //Make sure password is reset
                    var passwordAccess = userManager.Find(options.UserName, options.CurrentPassword);
                    Assert.IsNull(passwordAccess, "Can access user account with old password");
                }
                var badgeToCheck = String.IsNullOrEmpty(options.RecoveryEmailAddress) ? "deleted" : "deleted2";
                Assert.AreEqual(1, db.UserBadge.Count(x => x.UserName == options.UserName && x.BadgeID == badgeToCheck), "Can not find delete badge");

                //Verify Bio and Avatar cleared
                var prefs = db.UserPreference.Where(x => x.UserName.ToLower() == options.UserName.ToLower()).ToList();
                foreach (var pref in prefs)
                {
                    Assert.AreEqual(null, pref.Avatar, "Avatar not cleared");
                    Assert.AreEqual(null, pref.Bio, "Bio not cleared");
                }
            }
        }
Exemplo n.º 3
0
        public async Task DeleteAccount_Basic()
        {
            //EnsureBadges
            using (var db = new VoatDataContext())
            {
                if (!db.Badge.Any(x => x.ID == "deleted"))
                {
                    db.Badge.Add(new Badge()
                    {
                        ID = "deleted", Name = "Account Deleted", Graphic = "deleted.png", Title = "deleted"
                    });
                }
                if (!db.Badge.Any(x => x.ID == "deleted2"))
                {
                    db.Badge.Add(new Badge()
                    {
                        ID = "deleted2", Name = "Account Deleted", Graphic = "deleted2.png", Title = "deleted"
                    });
                }
                if (!db.Badge.Any(x => x.ID == "donor_upto_30"))
                {
                    db.Badge.Add(new Badge()
                    {
                        ID = "donor_upto_30", Name = "Donor Up To Thirty", Graphic = "donor30.png", Title = "Donor"
                    });
                }


                db.SaveChanges();
            }


            var userName = "******";

            TestDataInitializer.CreateUser(userName);
            var user = TestHelper.SetPrincipal(userName);
            DeleteAccountCommand cmd;
            CommandResponse      result;

            var options = new Domain.Models.DeleteAccountOptions()
            {
                UserName        = userName,
                ConfirmUserName = userName,
                CurrentPassword = userName,
                Comments        = Domain.Models.DeleteOption.Anonymize,
                LinkSubmissions = Domain.Models.DeleteOption.Anonymize,
                TextSubmissions = Domain.Models.DeleteOption.Anonymize
            };

            var submission = TestHelper.ContentCreation.CreateSubmission(options.UserName, new Domain.Models.UserSubmission()
            {
                Subverse = SUBVERSES.Unit,
                Title    = "Test Submission Yeah",
                Content  = "Test Submission Content"
            });

            var comment = TestHelper.ContentCreation.CreateComment(options.UserName, submission.ID, "This is a test comment");

            //Anon it all
            cmd    = new DeleteAccountCommand(options).SetUserContext(user);
            result = await cmd.Execute();

            VoatAssert.IsValid(result);
            VerifyDelete(options);


            userName = "******";

            TestDataInitializer.CreateUser(userName);
            user = TestHelper.SetPrincipal(userName);

            using (var db = new VoatDataContext())
            {
                //Trying to trap a bug with a user not getting delete badge
                db.UserBadge.Add(new Voat.Data.Models.UserBadge()
                {
                    BadgeID = "donor_upto_30", CreationDate = DateTime.UtcNow, UserName = userName
                });
                db.SaveChanges();
            }

            options = new Domain.Models.DeleteAccountOptions()
            {
                UserName        = userName,
                ConfirmUserName = userName,
                CurrentPassword = userName,
                Comments        = Domain.Models.DeleteOption.Delete,
                LinkSubmissions = Domain.Models.DeleteOption.Delete,
                TextSubmissions = Domain.Models.DeleteOption.Delete
            };

            submission = TestHelper.ContentCreation.CreateSubmission(options.UserName, new Domain.Models.UserSubmission()
            {
                Subverse = SUBVERSES.Unit,
                Title    = "Test Submission Yeah",
                Content  = "Test Submission Content"
            });

            comment = TestHelper.ContentCreation.CreateComment(options.UserName, submission.ID, "This is a test comment");

            //Delete
            cmd    = new DeleteAccountCommand(options).SetUserContext(user);
            result = await cmd.Execute();

            VoatAssert.IsValid(result);

            VerifyDelete(options);



            userName = "******";

            TestDataInitializer.CreateUser(userName);
            user = TestHelper.SetPrincipal(userName);

            //Need to ensure delete clears preferences
            var prefUpdate = new UpdateUserPreferencesCommand(new Domain.Models.UserPreferenceUpdate()
            {
                Bio = "My Bio"
            }).SetUserContext(user);
            var p = await prefUpdate.Execute();

            VoatAssert.IsValid(p);

            using (var db = new VoatDataContext())
            {
                var prefs = db.UserPreference.FirstOrDefault(x => x.UserName == userName);
                Assert.IsNotNull(prefs, "Expected user to have preference record at this stage");
                prefs.Avatar = userName + ".jpg";

                //Add badges to prevent duplicates
                db.UserBadge.Add(new Voat.Data.Models.UserBadge()
                {
                    BadgeID = "deleted", CreationDate = DateTime.UtcNow, UserName = userName
                });
                db.UserBadge.Add(new Voat.Data.Models.UserBadge()
                {
                    BadgeID = "deleted2", CreationDate = DateTime.UtcNow, UserName = userName
                });

                db.SaveChanges();
            }

            options = new Domain.Models.DeleteAccountOptions()
            {
                UserName                    = userName,
                ConfirmUserName             = userName,
                CurrentPassword             = userName,
                Comments                    = Domain.Models.DeleteOption.Delete,
                LinkSubmissions             = Domain.Models.DeleteOption.Delete,
                TextSubmissions             = Domain.Models.DeleteOption.Delete,
                RecoveryEmailAddress        = "*****@*****.**",
                ConfirmRecoveryEmailAddress = "*****@*****.**",
                Reason = "I need a break from the racialists"
            };

            submission = TestHelper.ContentCreation.CreateSubmission(options.UserName, new Domain.Models.UserSubmission()
            {
                Subverse = SUBVERSES.Unit,
                Title    = "Test Submission Yeah",
                Content  = "Test Submission Content"
            });

            comment = TestHelper.ContentCreation.CreateComment(options.UserName, submission.ID, "This is a test comment");

            //Delete
            cmd    = new DeleteAccountCommand(options).SetUserContext(user);
            result = await cmd.Execute();

            VoatAssert.IsValid(result);
            VerifyDelete(options);
        }