public async Task <ActionResult> Add([FromForm] EncryptDecryptInfo info) { logger.LogDebug("Received encrypt info: {0}", info); if (!ModelState.IsValid) { return(new ObjectResult(new { Added = false, Reason = ActionFailReason.InvalidInput, Group = info.Group, Entry = info.Entry })); } var masterPassword = info.MasterPassword; if (string.IsNullOrWhiteSpace(masterPassword)) { masterPassword = this.RememberedMasterPassword(); } else if (info.RememberMasterPassword) { this.RememberMasterPassword(info.MasterPassword); } if (string.IsNullOrWhiteSpace(masterPassword)) { return(new ObjectResult(new { Added = false, Reason = ActionFailReason.NeedMasterPassword, Group = info.Group, Entry = info.Entry })); } using (var secure = new Secure()) { var userAccount = await userAccountRepository.GetUserAccountAsync(User); var passwordDb = userAccount.GetPasswordDb(); if (!secure.ValidateHash(masterPassword, passwordDb.MasterPassword)) { return(new ObjectResult(new { Added = false, Reason = ActionFailReason.MasterPasswordInvalid, Group = info.Group, Entry = info.Entry })); } var group = passwordDb.PasswordGroups.FirstOrDefault(pg => pg.GroupName == info.Group); if (group == null) { group = new PasswordGroup { GroupName = info.Group }; passwordDb.PasswordGroups.Add(group); } var entry = group.PasswordEntries.FirstOrDefault(pe => pe.Name == info.Entry); if (entry == null) { // no existing entry, adding a new one entry = new PasswordEntry { Name = info.Entry }; group.PasswordEntries.Add(entry); } entry.IsValueEncrypted = info.ValueEncrypted; if (info.ValueEncrypted) { var encryptedInfo = secure.Encrypt(masterPassword, passwordDb.IV, info.Value); entry.Salt = encryptedInfo.Salt; entry.Value = encryptedInfo.EncryptedValueBase64Encoded; passwordDb.IV = passwordDb.IV ?? encryptedInfo.IV; } else { entry.Salt = null; entry.Value = info.Value; } userAccount.SetPasswordDb(passwordDb); await userAccountRepository.SaveUserAccountAsync(userAccount); return(new ObjectResult(new { Added = true, Group = info.Group, Entry = info.Entry })); } }
public async Task <ActionResult> Delete([FromForm] EncryptDecryptInfo info) { logger.LogDebug("Received delete info: {0}", info); if (!ModelState.IsValid) { return(new ObjectResult(new { Deleted = false, Reason = ActionFailReason.InvalidInput, Group = info.Group, Entry = info.Entry })); } var masterPassword = info.MasterPassword; if (string.IsNullOrWhiteSpace(masterPassword)) { masterPassword = this.RememberedMasterPassword(); } else if (info.RememberMasterPassword) { this.RememberMasterPassword(info.MasterPassword); } if (string.IsNullOrWhiteSpace(masterPassword)) { return(new ObjectResult(new { Deleted = false, Reason = ActionFailReason.NeedMasterPassword, Group = info.Group, Entry = info.Entry })); } var userAccount = await userAccountRepository.GetUserAccountAsync(User); var passwordDb = userAccount.GetPasswordDb(); using (var secure = new Secure()) { if (!secure.ValidateHash(masterPassword, passwordDb.MasterPassword)) { return(new ObjectResult(new { Deleted = false, Reason = ActionFailReason.MasterPasswordInvalid, Group = info.Group, Entry = info.Entry })); } } var group = passwordDb.PasswordGroups.FirstOrDefault(pg => pg.GroupName == info.Group); if (group == null) { return(new ObjectResult(new { Deleted = false, Reason = ActionFailReason.InvalidInput, Group = info.Group, Entry = info.Entry })); } var entry = group.PasswordEntries.FirstOrDefault(pe => pe.Name == info.Entry); if (entry == null) { return(new ObjectResult(new { Deleted = false, Reason = ActionFailReason.InvalidInput, Group = info.Group, Entry = info.Entry })); } group.PasswordEntries.Remove(entry); if (group.PasswordEntries.Count == 0) { passwordDb.PasswordGroups.Remove(group); } userAccount.SetPasswordDb(passwordDb); await userAccountRepository.SaveUserAccountAsync(userAccount); return(new ObjectResult(new { Deleted = true, Group = info.Group, Entry = info.Entry })); }