feat: Remove vault field if its value is empty string #62

Merged
awiteb merged 2 commits from awiteb/fix-53 into master 2024-07-24 09:45:35 +02:00 AGit
2 changed files with 33 additions and 9 deletions

View file

@ -55,6 +55,10 @@ custom fields.
For secrets like the password and TOTP secret, you can provide them as arguments For secrets like the password and TOTP secret, you can provide them as arguments
or you will be prompted for them. or you will be prompted for them.
## Field removal
If you want to remove a field from the vault, you can provide an empty value for
it, e.g. `-o ""`.
## Custom fields ## Custom fields
If you want to add a custom field to the vault, you can use the `-c, --custom` If you want to add a custom field to the vault, you can use the `-c, --custom`
option, and provide the key-value pair. If you want to delete a custom field, option, and provide the key-value pair. If you want to delete a custom field,

View file

@ -82,24 +82,44 @@ impl LprsCommand for Edit {
if let Some(new_name) = self.name { if let Some(new_name) = self.name {
vault.name = new_name; vault.name = new_name;
} }
if self.password.is_some() { if let Some(ref new_password) = self.password {
if new_password.as_deref().is_some_and(|s| s.is_empty()) {
vault.password = None;
} else {
vault.password = utils::user_secret(self.password, "New vault password:", false)?; vault.password = utils::user_secret(self.password, "New vault password:", false)?;
} }
}
if let Some(totp_secret) = utils::user_secret(self.totp_secret, "TOTP Secret:", false)? { if let Some(totp_secret) = utils::user_secret(self.totp_secret, "TOTP Secret:", false)? {
if totp_secret.is_empty() {
vault.totp_secret = None;
} else {
cipher::base32_decode(&totp_secret).map_err(|_| { cipher::base32_decode(&totp_secret).map_err(|_| {
LprsError::Base32("Invalid TOTP secret, must be valid base32 string".to_owned()) LprsError::Base32("Invalid TOTP secret, must be valid base32 string".to_owned())
})?; })?;
vault.totp_secret = Some(totp_secret); vault.totp_secret = Some(totp_secret);
} }
}
if let Some(new_username) = self.username { if let Some(new_username) = self.username {
if new_username.is_empty() {
vault.username = None;
} else {
vault.username = Some(new_username); vault.username = Some(new_username);
} }
}
if let Some(new_service) = self.service { if let Some(new_service) = self.service {
if new_service.is_empty() {
vault.service = None;
} else {
vault.service = Some(new_service); vault.service = Some(new_service);
} }
}
if let Some(new_note) = self.note { if let Some(new_note) = self.note {
if new_note.is_empty() {
vault.note = None;
} else {
vault.note = Some(new_note); vault.note = Some(new_note);
} }
}
utils::apply_custom_fields(&mut vault.custom_fields, self.custom_fields); utils::apply_custom_fields(&mut vault.custom_fields, self.custom_fields);
vault_manager.try_export() vault_manager.try_export()