/*************************************************************************************************/ private AddPasswordResult VerifyAddPasswordFields(Password password) { AddPasswordResult result = AddPasswordResult.Success; if (password != null) { if (string.IsNullOrEmpty(password.Passphrase)) { result = AddPasswordResult.PassphraseError; } if (string.IsNullOrEmpty(password.Username)) { result = AddPasswordResult.UsernameError; } if (string.IsNullOrEmpty(password.Application)) { result = AddPasswordResult.ApplicationError; } if (password.Email.Length != 0) { if (!password.Email.Contains("@") && !password.Email.Contains(".")) { result = AddPasswordResult.EmailError; } } } return(result); }
/*************************************************************************************************/ private void AddPassword(string application, string username, string email, string description, string website, string passphrase) { Password uiPassword = new Password(application, username, email, description, website, passphrase); AddPasswordResult result = _passwordService.AddPassword(uiPassword); if (result == AddPasswordResult.Success) { UpdatePasswordsUI(); } _mainView.DisplayAddPasswordResult(result); }
/*************************************************************************************************/ private void EditPasswordExecute(string application, string username, string email, string description, string website, string passphrase) { Password modifiedPassword = new Password(_editPassword.UniqueID, application, username, email, description, website, passphrase); AddPasswordResult result = _passwordService.ModifyPassword(_editPassword, modifiedPassword); if (result == AddPasswordResult.Success) { _editPassword = null; } _mainView.DisplayAddEditPasswordResult(result); }
/*************************************************************************************************/ public void DisplayAddEditPasswordResult(AddPasswordResult result) { switch (result) { case AddPasswordResult.DuplicatePassword: UIHelper.UpdateStatusLabel("Duplicate password.", userStatusLabel, ErrorLevel.Neutral); break; case AddPasswordResult.Failed: UIHelper.UpdateStatusLabel("Modify password failed.", userStatusLabel, ErrorLevel.Neutral); break; case AddPasswordResult.UsernameError: UIHelper.UpdateStatusLabel("Issue with username field!", userStatusLabel, ErrorLevel.Neutral); break; case AddPasswordResult.ApplicationError: UIHelper.UpdateStatusLabel("Issue with application field!", userStatusLabel, ErrorLevel.Neutral); break; case AddPasswordResult.PassphraseError: UIHelper.UpdateStatusLabel("Issue with passphrase field!", userStatusLabel, ErrorLevel.Neutral); break; case AddPasswordResult.EmailError: UIHelper.UpdateStatusLabel("Invalid email!", userStatusLabel, ErrorLevel.Neutral); break; case AddPasswordResult.Success: addButton.Text = "Add"; _editMode = false; editCancelButton.Enabled = false; editCancelButton.Visible = false; applicationTextBox.Text = ""; usernameTextBox.Text = ""; emailTextBox.Text = ""; descriptionTextBox.Text = ""; websiteTextBox.Text = ""; passphraseTextBox.Text = ""; applicationTextBox.Focus(); UIHelper.UpdateStatusLabel("Password modified.", userStatusLabel, ErrorLevel.Neutral); this.Refresh(); break; } }
/*************************************************************************************************/ public AddPasswordResult ModifyPassword(Password originalPassword, Password modifiedPassword) { AddPasswordResult result = AddPasswordResult.Failed; if (originalPassword != null && modifiedPassword != null) { if (IsLoggedIn()) { AddPasswordResult verifyResult = VerifyAddPasswordFields(modifiedPassword); if (verifyResult == AddPasswordResult.Success) { List <Password> modifiedPasswordResult = (from Password pass in _passwordList where pass.Application == modifiedPassword.Application select pass).ToList <Password>(); if ((modifiedPasswordResult.Count <= 0) || // verify that another password doesn't have the same application name (modifiedPassword.Application == originalPassword.Application)) // if the application name of the original and modified match, continue as this is not actually a duplicate { Password modifiedEncryptedPassword = ConvertPlaintextPasswordToEncryptedPassword(modifiedPassword); int index = _passwordList.FindIndex(x => (x.Application == originalPassword.Application) && (x.Username == originalPassword.Username) && (x.Description == originalPassword.Description) && (x.Website == originalPassword.Website)); if (index != -1) { _passwordList[index] = modifiedEncryptedPassword; _dbcontext.ModifyPassword(ConvertToEncryptedDatabasePassword(originalPassword), ConvertToEncryptedDatabasePassword(modifiedEncryptedPassword)); result = AddPasswordResult.Success; } } else { result = AddPasswordResult.DuplicatePassword; } } else { result = verifyResult; } } } return(result); }
public void DeleteUserWithPasswords() { IDatabase db = DatabaseFactory.GetDatabase(Database.InMemory); IPasswordService passwordService = new PasswordService(db, new MasterPassword(), new RijndaelManagedEncryption()); User user; CreateUserResult createResult; LoginResult loginResult; DeleteUserResult deleteResult; // Mock a user model that would be coming from the UI user = new User("testAccount", "testPassword1@", "testFirstName", "testLastName", "222-111-1111", "*****@*****.**"); createResult = passwordService.CreateNewUser(user); Assert.AreEqual(CreateUserResult.Successful, createResult); Assert.AreEqual(1, ((InMemoryDatabase)db).LocalUserDbAccess.Count); loginResult = passwordService.Login("testAccount", "testPassword1@"); Assert.AreEqual(LoginResult.Successful, loginResult); // Mock a password model that would be coming from the UI Password[] passwords = { new Password("FakeStore0", "NewUsername", "*****@*****.**", "This is my FakeStore account.", "www.FakeStore.com", "123456"), new Password("FakeStore1", "NewUsername", "*****@*****.**", "This is my FakeStore account.", "www.FakeStore.com", "123456"), new Password("FakeStore2", "NewUsername", "*****@*****.**", "This is my FakeStore account.", "www.FakeStore.com", "123456"), new Password("FakeStore3", "NewUsername", "*****@*****.**", "This is my FakeStore account.", "www.FakeStore.com", "123456"), }; Int32 addedPasswordsCount = 1; foreach (var password in passwords) { AddPasswordResult result = passwordService.AddPassword(password); Assert.AreEqual(AddPasswordResult.Success, result); Assert.AreEqual(addedPasswordsCount, ((InMemoryDatabase)db).LocalPasswordDbAccess.Count); addedPasswordsCount++; } deleteResult = passwordService.DeleteUser(user); Assert.AreEqual(DeleteUserResult.Success, deleteResult); Assert.AreEqual(0, ((InMemoryDatabase)db).LocalPasswordDbAccess.Count); Assert.AreEqual(0, ((InMemoryDatabase)db).LocalUserDbAccess.Count); }
/*************************************************************************************************/ public AddPasswordResult AddPassword(Password password) { AddPasswordResult addResult = AddPasswordResult.Failed; if (password != null) { if (IsLoggedIn()) { AddPasswordResult verifyResult = VerifyAddPasswordFields(password); if (verifyResult == AddPasswordResult.Success) { List <Password> queryResult = (from Password pass in _passwordList where pass.Application == password.Application select pass).ToList <Password>(); if (queryResult.Count <= 0) // Verify that new password is not a duplicate of an existing one { Password encryptPassword = ConvertPlaintextPasswordToEncryptedPassword(password); // Need to first encrypt the password _dbcontext.AddPassword(ConvertToEncryptedDatabasePassword(encryptPassword)); // Add the encrypted password to the database // Update the passwordservice list. // This solves issue when deleting a newly added password where the unique ID hasn't been updated in the service. // since the database autoincrements the unique ID. UpdatePasswordListFromDB(); addResult = AddPasswordResult.Success; } else { addResult = AddPasswordResult.DuplicatePassword; } } else { addResult = verifyResult; } } } return(addResult); }
/*************************************************************************************************/ public void DisplayAddPasswordResult(AddPasswordResult result) { switch (result) { case AddPasswordResult.Failed: UIHelper.UpdateStatusLabel("Add password failed.", userStatusLabel, ErrorLevel.Neutral); break; case AddPasswordResult.DuplicatePassword: UIHelper.UpdateStatusLabel("Duplicate password.", userStatusLabel, ErrorLevel.Neutral); break; case AddPasswordResult.UsernameError: UIHelper.UpdateStatusLabel("Issue with username field!", userStatusLabel, ErrorLevel.Neutral); break; case AddPasswordResult.ApplicationError: UIHelper.UpdateStatusLabel("Issue with application field!", userStatusLabel, ErrorLevel.Neutral); break; case AddPasswordResult.PassphraseError: UIHelper.UpdateStatusLabel("Issue with passphrase field!", userStatusLabel, ErrorLevel.Neutral); break; case AddPasswordResult.EmailError: UIHelper.UpdateStatusLabel("Invalid email!", userStatusLabel, ErrorLevel.Neutral); break; case AddPasswordResult.Success: UIHelper.UpdateStatusLabel("Success.", userStatusLabel, ErrorLevel.Neutral); applicationTextBox.Text = ""; descriptionTextBox.Text = ""; websiteTextBox.Text = ""; passphraseTextBox.Text = ""; usernameTextBox.Text = ""; emailTextBox.Text = ""; applicationTextBox.Focus(); break; } }
public void DeleteUserWithMultiplePasswords() { IDatabase db = DatabaseFactory.GetDatabase(Database.InMemory); IPasswordService passwordService = new PasswordService(db, new MasterPassword(), new RijndaelManagedEncryption()); CreateUserResult createResult; LoginResult loginResult; DeleteUserResult deleteResult; LogOutResult logOutResult; // Mock a user model that would be coming from the UI User[] users = { new User("testAccount0", "testPassword1@1", "testFirstName", "testLastName", "222-111-1111", "*****@*****.**"), new User("testAccount1", "testPassword1@2", "testFirstName", "testLastName", "222-111-1111", "*****@*****.**"), new User("testAccount2", "testPassword1@3", "testFirstName", "testLastName", "222-111-1111", "*****@*****.**"), new User("testAccount3", "testPassword1@4", "testFirstName", "testLastName", "222-111-1111", "*****@*****.**"), new User("testAccount4", "testPassword1@5", "testFirstName", "testLastName", "222-111-1111", "*****@*****.**"), }; // Mock a password model that would be coming from the UI Password[] passwords = { new Password("FakeStore0", "NewUsername", "*****@*****.**", "This is my FakeStore account.", "www.FakeStore.com", "123456"), new Password("FakeStore1", "NewUsername", "*****@*****.**", "This is my FakeStore account.", "www.FakeStore.com", "123456"), new Password("FakeStore2", "NewUsername", "*****@*****.**", "This is my FakeStore account.", "www.FakeStore.com", "123456"), new Password("FakeStore3", "NewUsername", "*****@*****.**", "This is my FakeStore account.", "www.FakeStore.com", "123456"), }; // Add each user to the database, log in, add each password to each user, logout Int32 addedUsersCount = 1; Int32 addedPasswordsCount = 1; foreach (var user in users) { createResult = passwordService.CreateNewUser(user); Assert.AreEqual(CreateUserResult.Successful, createResult); Assert.AreEqual(addedUsersCount, ((InMemoryDatabase)db).LocalUserDbAccess.Count); addedUsersCount++; loginResult = passwordService.Login(user.Username, user.PlainTextPassword); Assert.AreEqual(LoginResult.Successful, loginResult); foreach (var password in passwords) { AddPasswordResult result = passwordService.AddPassword(password); Assert.AreEqual(AddPasswordResult.Success, result); Assert.AreEqual(addedPasswordsCount, ((InMemoryDatabase)db).LocalPasswordDbAccess.Count); addedPasswordsCount++; } logOutResult = passwordService.Logout(); Assert.AreEqual(LogOutResult.Success, logOutResult); } // Login to the account to delete loginResult = passwordService.Login("testAccount0", "testPassword1@1"); Assert.AreEqual(LoginResult.Successful, loginResult); // Delete the account string currentUserGUID = passwordService.GetCurrentUser().GUID; deleteResult = passwordService.DeleteUser(passwordService.GetCurrentUser()); Assert.AreEqual(DeleteUserResult.Success, deleteResult); Assert.AreEqual(((passwords.Length * users.Length) - passwords.Length), ((InMemoryDatabase)db).LocalPasswordDbAccess.Count); Assert.AreEqual((users.Length - 1), ((InMemoryDatabase)db).LocalUserDbAccess.Count); // Verify that the deleted account's passwords are deleted from the password database table foreach (var password in ((InMemoryDatabase)db).LocalPasswordDbAccess) { if (password.UserGUID == currentUserGUID) { Assert.Fail(); } } }