feat: Support --verbose
flag #23
11 changed files with 55 additions and 5 deletions
|
@ -34,8 +34,12 @@ pub struct Add {
|
||||||
impl LprsCommand for Add {
|
impl LprsCommand for Add {
|
||||||
fn run(mut self, mut vault_manager: Vaults<Plain>) -> LprsResult<()> {
|
fn run(mut self, mut vault_manager: Vaults<Plain>) -> LprsResult<()> {
|
||||||
match self.password {
|
match self.password {
|
||||||
Some(Some(password)) => self.vault_info.password = Some(password),
|
Some(Some(password)) => {
|
||||||
|
log::debug!("User provided a password");
|
||||||
|
self.vault_info.password = Some(password);
|
||||||
|
}
|
||||||
Some(None) => {
|
Some(None) => {
|
||||||
|
log::debug!("User didn't provide a password, prompting it");
|
||||||
self.vault_info.password = Some(
|
self.vault_info.password = Some(
|
||||||
inquire::Password::new("Vault password:")
|
inquire::Password::new("Vault password:")
|
||||||
.without_confirmation()
|
.without_confirmation()
|
||||||
|
|
|
@ -29,6 +29,10 @@ pub struct Clean {}
|
||||||
|
|
||||||
impl LprsCommand for Clean {
|
impl LprsCommand for Clean {
|
||||||
fn run(self, vault_manager: Vaults<Plain>) -> LprsResult<()> {
|
fn run(self, vault_manager: Vaults<Plain>) -> LprsResult<()> {
|
||||||
|
log::info!(
|
||||||
|
"Cleaning the vaults file: {:?}",
|
||||||
|
vault_manager.vaults_file.display()
|
||||||
|
);
|
||||||
fs::write(vault_manager.vaults_file, "[]").map_err(LprsError::Io)
|
fs::write(vault_manager.vaults_file, "[]").map_err(LprsError::Io)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,7 @@ pub struct Edit {
|
||||||
impl LprsCommand for Edit {
|
impl LprsCommand for Edit {
|
||||||
fn run(self, mut vault_manager: Vaults<Plain>) -> LprsResult<()> {
|
fn run(self, mut vault_manager: Vaults<Plain>) -> LprsResult<()> {
|
||||||
let index = self.index.get() as usize;
|
let index = self.index.get() as usize;
|
||||||
|
log::debug!("Editing vault at index: {index}");
|
||||||
|
|
||||||
let Some(vault) = vault_manager.vaults.get_mut(index - 1) else {
|
let Some(vault) = vault_manager.vaults.get_mut(index - 1) else {
|
||||||
return Err(LprsError::InvalidVaultIndex(format!(
|
return Err(LprsError::InvalidVaultIndex(format!(
|
||||||
|
@ -71,6 +72,7 @@ impl LprsCommand for Edit {
|
||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
log::info!("Applying the new values to the vault");
|
||||||
*vault = Vault::<Plain>::new(
|
*vault = Vault::<Plain>::new(
|
||||||
self.name.as_ref().unwrap_or(&vault.name),
|
self.name.as_ref().unwrap_or(&vault.name),
|
||||||
self.username.as_ref().or(vault.username.as_ref()),
|
self.username.as_ref().or(vault.username.as_ref()),
|
||||||
|
|
|
@ -35,6 +35,12 @@ pub struct Export {
|
||||||
|
|
||||||
impl LprsCommand for Export {
|
impl LprsCommand for Export {
|
||||||
fn run(self, vault_manager: Vaults<Plain>) -> LprsResult<()> {
|
fn run(self, vault_manager: Vaults<Plain>) -> LprsResult<()> {
|
||||||
|
log::debug!(
|
||||||
|
"Exporting vault {} to: {} with format: {}",
|
||||||
|
vault_manager.vaults_file.display(),
|
||||||
|
self.path.display(),
|
||||||
|
self.format
|
||||||
|
);
|
||||||
let exported_data = match self.format {
|
let exported_data = match self.format {
|
||||||
Format::Lprs => {
|
Format::Lprs => {
|
||||||
serde_json::to_string::<Vec<Vault<Encrypted>>>(&vault_manager.encrypt_vaults()?)
|
serde_json::to_string::<Vec<Vault<Encrypted>>>(&vault_manager.encrypt_vaults()?)
|
||||||
|
|
|
@ -36,6 +36,13 @@ pub struct Import {
|
||||||
|
|
||||||
impl LprsCommand for Import {
|
impl LprsCommand for Import {
|
||||||
fn run(self, mut vault_manager: Vaults<Plain>) -> LprsResult<()> {
|
fn run(self, mut vault_manager: Vaults<Plain>) -> LprsResult<()> {
|
||||||
|
log::debug!(
|
||||||
|
"Importing vaults from: {} with format: {} to the vault: {}",
|
||||||
|
self.path.display(),
|
||||||
|
self.format,
|
||||||
|
vault_manager.vaults_file.display()
|
||||||
|
);
|
||||||
|
|
||||||
let imported_passwords_len = match self.format {
|
let imported_passwords_len = match self.format {
|
||||||
Format::Lprs => {
|
Format::Lprs => {
|
||||||
let vaults = Vaults::try_reload(self.path, vault_manager.master_password.to_vec())?;
|
let vaults = Vaults::try_reload(self.path, vault_manager.master_password.to_vec())?;
|
||||||
|
|
|
@ -46,6 +46,7 @@ impl LprsCommand for List {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
if let Some(user_vault_index) = self.get.map(|n| (n.get() - 1) as usize) {
|
if let Some(user_vault_index) = self.get.map(|n| (n.get() - 1) as usize) {
|
||||||
|
log::info!("Getting the vault at index: {user_vault_index}");
|
||||||
if user_vault_index >= vault_manager.vaults.len() {
|
if user_vault_index >= vault_manager.vaults.len() {
|
||||||
return Err(LprsError::Other(
|
return Err(LprsError::Other(
|
||||||
"The `--get` index is great then the vaults length".to_owned(),
|
"The `--get` index is great then the vaults length".to_owned(),
|
||||||
|
@ -67,6 +68,7 @@ impl LprsCommand for List {
|
||||||
regex::escape(self.filter.as_deref().unwrap_or(""))
|
regex::escape(self.filter.as_deref().unwrap_or(""))
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
log::debug!("Listing vaults filtered by: {pattern}");
|
||||||
|
|
||||||
let re = regex::Regex::new(&pattern)?;
|
let re = regex::Regex::new(&pattern)?;
|
||||||
|
|
||||||
|
@ -107,6 +109,8 @@ impl LprsCommand for List {
|
||||||
.parse::<usize>()
|
.parse::<usize>()
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
|
|
||||||
|
log::debug!("The user selected the vault at index: {vault_idx}");
|
||||||
|
|
||||||
println!(
|
println!(
|
||||||
"{}",
|
"{}",
|
||||||
vault_manager
|
vault_manager
|
||||||
|
|
|
@ -71,22 +71,26 @@ pub struct Cli {
|
||||||
impl Cli {
|
impl Cli {
|
||||||
/// Run the cli
|
/// Run the cli
|
||||||
pub fn run(self) -> LprsResult<()> {
|
pub fn run(self) -> LprsResult<()> {
|
||||||
let vaults_file = if let Some(ref path) = self.vaults_file {
|
let vaults_file = if let Some(path) = self.vaults_file {
|
||||||
path.clone()
|
log::info!("Using the given vaults file");
|
||||||
|
path
|
||||||
} else {
|
} else {
|
||||||
|
log::info!("Using the default vaults file");
|
||||||
crate::utils::vaults_file()?
|
crate::utils::vaults_file()?
|
||||||
};
|
};
|
||||||
log::debug!("Getting the vaults file: {}", vaults_file.to_string_lossy());
|
log::debug!("Vaults file: {}", vaults_file.display());
|
||||||
|
|
||||||
self.command.validate_args()?;
|
self.command.validate_args()?;
|
||||||
|
|
||||||
let vault_manager = if matches!(self.command, Commands::Clean(..) | Commands::Gen(..)) {
|
let vault_manager = if matches!(self.command, Commands::Clean(..) | Commands::Gen(..)) {
|
||||||
|
log::info!("Running command that don't need the vault manager");
|
||||||
// Returns empty vault manager for those commands don't need it
|
// Returns empty vault manager for those commands don't need it
|
||||||
Vaults {
|
Vaults {
|
||||||
vaults_file,
|
vaults_file,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
log::info!("Reloading the vaults file");
|
||||||
let master_password = utils::master_password_prompt(&vaults_file)?;
|
let master_password = utils::master_password_prompt(&vaults_file)?;
|
||||||
Vaults::try_reload(
|
Vaults::try_reload(
|
||||||
vaults_file,
|
vaults_file,
|
||||||
|
|
|
@ -37,11 +37,17 @@ pub struct Remove {
|
||||||
impl LprsCommand for Remove {
|
impl LprsCommand for Remove {
|
||||||
fn run(self, mut vault_manager: Vaults<Plain>) -> LprsResult<()> {
|
fn run(self, mut vault_manager: Vaults<Plain>) -> LprsResult<()> {
|
||||||
let index = (self.index.get() - 1) as usize;
|
let index = (self.index.get() - 1) as usize;
|
||||||
|
log::debug!("Removing vault at index: {index}");
|
||||||
|
|
||||||
if index > vault_manager.vaults.len() {
|
if index > vault_manager.vaults.len() {
|
||||||
if !self.force {
|
if !self.force {
|
||||||
return Err(LprsError::Other(
|
return Err(LprsError::Other(
|
||||||
"The index is greater than the passwords counts".to_owned(),
|
"The index is greater than the passwords counts".to_owned(),
|
||||||
));
|
));
|
||||||
|
} else {
|
||||||
|
log::error!(
|
||||||
|
"The index is greater than the passwords counts, but the force flag is enabled"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
vault_manager.vaults.remove(index);
|
vault_manager.vaults.remove(index);
|
||||||
|
|
|
@ -51,6 +51,7 @@ fn main() -> ExitCode {
|
||||||
|
|
||||||
#[cfg(feature = "update-notify")]
|
#[cfg(feature = "update-notify")]
|
||||||
{
|
{
|
||||||
|
log::info!("Checking for new version of lprs...");
|
||||||
match utils::lprs_version() {
|
match utils::lprs_version() {
|
||||||
Ok(Some(new_version)) if new_version != VERSION => {
|
Ok(Some(new_version)) if new_version != VERSION => {
|
||||||
println!(
|
println!(
|
||||||
|
@ -64,7 +65,9 @@ fn main() -> ExitCode {
|
||||||
eprintln!("{err}");
|
eprintln!("{err}");
|
||||||
return ExitCode::FAILURE;
|
return ExitCode::FAILURE;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {
|
||||||
|
log::info!("No new version found.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,9 @@ pub fn local_project_file(filename: &str) -> LprsResult<PathBuf> {
|
||||||
.ok_or_else(|| {
|
.ok_or_else(|| {
|
||||||
LprsError::ProjectDir("Can't extract the project_dir from this OS".to_owned())
|
LprsError::ProjectDir("Can't extract the project_dir from this OS".to_owned())
|
||||||
})?;
|
})?;
|
||||||
|
log::debug!("Local project dir: {:?}", local_dir.display());
|
||||||
if !local_dir.exists() {
|
if !local_dir.exists() {
|
||||||
|
log::info!("Creating the local project dir: {:?}", local_dir.display());
|
||||||
fs::create_dir_all(&local_dir)?;
|
fs::create_dir_all(&local_dir)?;
|
||||||
}
|
}
|
||||||
Ok(local_dir.join(filename))
|
Ok(local_dir.join(filename))
|
||||||
|
@ -40,6 +42,10 @@ pub fn local_project_file(filename: &str) -> LprsResult<PathBuf> {
|
||||||
pub fn vaults_file() -> LprsResult<PathBuf> {
|
pub fn vaults_file() -> LprsResult<PathBuf> {
|
||||||
let vaults_file = local_project_file(crate::DEFAULT_VAULTS_FILE)?;
|
let vaults_file = local_project_file(crate::DEFAULT_VAULTS_FILE)?;
|
||||||
if !vaults_file.exists() {
|
if !vaults_file.exists() {
|
||||||
|
log::info!(
|
||||||
|
"Vaults file not found, creating a new one: {:?}",
|
||||||
|
vaults_file.display()
|
||||||
|
);
|
||||||
fs::write(&vaults_file, "[]")?;
|
fs::write(&vaults_file, "[]")?;
|
||||||
}
|
}
|
||||||
Ok(vaults_file)
|
Ok(vaults_file)
|
||||||
|
|
|
@ -190,6 +190,10 @@ impl Vaults<Plain> {
|
||||||
|
|
||||||
/// Encrypt the vaults then export it to the file
|
/// Encrypt the vaults then export it to the file
|
||||||
pub fn try_export(self) -> LprsResult<()> {
|
pub fn try_export(self) -> LprsResult<()> {
|
||||||
|
log::debug!(
|
||||||
|
"Trying to export the vaults to the file: {}",
|
||||||
|
self.vaults_file.display()
|
||||||
|
);
|
||||||
fs::write(
|
fs::write(
|
||||||
&self.vaults_file,
|
&self.vaults_file,
|
||||||
serde_json::to_string(&self.encrypt_vaults()?)?,
|
serde_json::to_string(&self.encrypt_vaults()?)?,
|
||||||
|
|
Loading…
Reference in a new issue