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
                }));
            }
        }
Exemple #2
0
        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
            }));
        }