chore(DX): Improve the DX #27
15 changed files with 78 additions and 62 deletions
|
@ -19,7 +19,9 @@ use inquire::{Password, PasswordDisplayMode};
|
|||
|
||||
use crate::{
|
||||
vault::{Vault, Vaults},
|
||||
LprsCommand, LprsError, LprsResult,
|
||||
LprsCommand,
|
||||
LprsError,
|
||||
LprsResult,
|
||||
};
|
||||
|
||||
#[derive(Debug, Args)]
|
||||
|
|
|
@ -21,7 +21,9 @@ use inquire::{Password, PasswordDisplayMode};
|
|||
|
||||
use crate::{
|
||||
vault::{Vault, Vaults},
|
||||
LprsCommand, LprsError, LprsResult,
|
||||
LprsCommand,
|
||||
LprsError,
|
||||
LprsResult,
|
||||
};
|
||||
|
||||
#[derive(Debug, Args)]
|
||||
|
@ -66,13 +68,15 @@ impl LprsCommand for Edit {
|
|||
// Get the password from stdin or from its value if provided
|
||||
let password = match self.password {
|
||||
Some(Some(password)) => Some(password),
|
||||
Some(None) => Some(
|
||||
Some(None) => {
|
||||
Some(
|
||||
Password::new("New vault password:")
|
||||
.without_confirmation()
|
||||
.with_formatter(&|p| "*".repeat(p.chars().count()))
|
||||
.with_display_mode(PasswordDisplayMode::Masked)
|
||||
.prompt()?,
|
||||
),
|
||||
)
|
||||
}
|
||||
None => None,
|
||||
};
|
||||
|
||||
|
|
|
@ -20,13 +20,15 @@ use clap::Args;
|
|||
|
||||
use crate::{
|
||||
vault::{BitWardenPasswords, Format, Vaults},
|
||||
LprsCommand, LprsError, LprsResult,
|
||||
LprsCommand,
|
||||
LprsError,
|
||||
LprsResult,
|
||||
};
|
||||
|
||||
#[derive(Debug, Args)]
|
||||
#[command(author, version, about, long_about = None)]
|
||||
/// Export command, used to export the vaults in `lprs` format or `BitWarden` format.
|
||||
/// The exported file will be a json file.
|
||||
/// Export command, used to export the vaults in `lprs` format or `BitWarden`
|
||||
/// format. The exported file will be a json file.
|
||||
pub struct Export {
|
||||
/// The path to export to
|
||||
path: PathBuf,
|
||||
|
|
|
@ -25,12 +25,15 @@ use clap::Args;
|
|||
|
||||
use crate::{
|
||||
vault::{BitWardenPasswords, Format, Vault, Vaults},
|
||||
LprsCommand, LprsError, LprsResult,
|
||||
LprsCommand,
|
||||
LprsError,
|
||||
LprsResult,
|
||||
};
|
||||
|
||||
#[derive(Debug, Args)]
|
||||
#[command(author, version, about, long_about = None)]
|
||||
/// Import command, used to import vaults from the exported files, `lprs` or `BitWarden`
|
||||
/// Import command, used to import vaults from the exported files, `lprs` or
|
||||
/// `BitWarden`
|
||||
pub struct Import {
|
||||
/// The file path to import from
|
||||
path: PathBuf,
|
||||
|
|
|
@ -31,7 +31,8 @@ pub mod edit_command;
|
|||
pub mod export_command;
|
||||
/// Generate command, used to generate a password
|
||||
pub mod gen_command;
|
||||
/// Import command, used to import vaults from the exported files, `lprs` or `BitWarden`
|
||||
/// Import command, used to import vaults from the exported files, `lprs` or
|
||||
/// `BitWarden`
|
||||
pub mod import_command;
|
||||
/// List command, used to list the vaults and search
|
||||
pub mod list_command;
|
||||
|
|
|
@ -27,7 +27,8 @@ pub struct Remove {
|
|||
/// The password index
|
||||
index: NonZeroU64,
|
||||
|
||||
/// Force remove, will not return error if there is no password with this index
|
||||
/// Force remove, will not return error if there is no password with this
|
||||
/// index
|
||||
#[arg(short, long)]
|
||||
force: bool,
|
||||
}
|
||||
|
|
|
@ -24,7 +24,10 @@ pub type Result<T> = result::Result<T, Error>;
|
|||
pub enum Error {
|
||||
#[error("Encryption Error: {0}")]
|
||||
Encryption(String),
|
||||
#[error("Decryption Error: The given key cannot decrypt the given data. Either the data has been tampered with or the key is incorrect.")]
|
||||
#[error(
|
||||
"Decryption Error: The given key cannot decrypt the given data. Either the data has been \
|
||||
tampered with or the key is incorrect."
|
||||
)]
|
||||
Decryption,
|
||||
#[error("Wrong Master Password Error: Wrong decryption password")]
|
||||
WrongMasterPassword,
|
||||
|
|
|
@ -29,10 +29,7 @@
|
|||
/// #### Output
|
||||
/// ```rust
|
||||
/// impl crate::LprsCommand for TestCommands {
|
||||
/// fn run(
|
||||
/// &self,
|
||||
/// vault_manager: crate::vault::Vaults,
|
||||
/// ) -> crate::LprsResult<()> {
|
||||
/// fn run(&self, vault_manager: crate::vault::Vaults) -> crate::LprsResult<()> {
|
||||
/// match self {
|
||||
/// Self::Test(command) => command.run(vault_manager),
|
||||
/// Self::Some(command) => command.run(vault_manager),
|
||||
|
|
|
@ -15,11 +15,12 @@
|
|||
// along with this program. If not, see <https://www.gnu.org/licenses/gpl-3.0.html>.
|
||||
#![doc = include_str!("../README.md")]
|
||||
|
||||
use clap::Parser;
|
||||
use inquire::InquireError;
|
||||
use std::env;
|
||||
use std::process::ExitCode;
|
||||
|
||||
use clap::Parser;
|
||||
use inquire::InquireError;
|
||||
|
||||
/// The main module of the lprs crate, contains the cli and the commands.
|
||||
pub mod cli;
|
||||
/// The errors module, contains the errors and the result type.
|
||||
|
|
|
@ -18,10 +18,9 @@ use std::{fs, path::PathBuf};
|
|||
|
||||
use inquire::{validator::Validation, PasswordDisplayMode};
|
||||
use passwords::{analyzer, scorer};
|
||||
use sha2::Digest;
|
||||
|
||||
#[cfg(feature = "update-notify")]
|
||||
use reqwest::blocking::Client as BlockingClient;
|
||||
use sha2::Digest;
|
||||
|
||||
use crate::{LprsError, LprsResult};
|
||||
|
||||
|
@ -64,8 +63,8 @@ pub fn vaults_file() -> LprsResult<PathBuf> {
|
|||
/// - Its score must be greater than 80.0
|
||||
///
|
||||
/// ## Errors
|
||||
/// - There is no errors, just the return type of inquire validator
|
||||
/// must be Result<Validation, inquire::CustomUserError>
|
||||
/// - There is no errors, just the return type of inquire validator must be
|
||||
/// Result<Validation, inquire::CustomUserError>
|
||||
pub fn password_validator(password: &str) -> Result<Validation, inquire::CustomUserError> {
|
||||
let analyzed = analyzer::analyze(password);
|
||||
Ok(if analyzed.length() < 15 {
|
||||
|
|
|
@ -14,8 +14,8 @@
|
|||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/gpl-3.0.html>.
|
||||
|
||||
// This file is not important, it is just a struct that is used to serialize and deserialize the vaults
|
||||
// from and to the BitWarden format.
|
||||
// This file is not important, it is just a struct that is used to serialize and
|
||||
// deserialize the vaults from and to the BitWarden format.
|
||||
#![allow(missing_docs)]
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
|
|
@ -14,9 +14,10 @@
|
|||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/gpl-3.0.html>.
|
||||
|
||||
use std::time::{SystemTime, UNIX_EPOCH};
|
||||
|
||||
use aes::cipher::{block_padding::Pkcs7, BlockDecryptMut, BlockEncryptMut, KeyIvInit};
|
||||
use rand::{rngs::StdRng, Rng, SeedableRng};
|
||||
use std::time::{SystemTime, UNIX_EPOCH};
|
||||
|
||||
use crate::{LprsError, LprsResult};
|
||||
|
||||
|
|
|
@ -33,9 +33,11 @@ pub use bitwarden::*;
|
|||
/// The vaults format
|
||||
pub enum Format {
|
||||
/// The lprs format, which is the default format
|
||||
/// and is is the result of the serialization/deserialization of the Vaults struct
|
||||
/// and is is the result of the serialization/deserialization of the Vaults
|
||||
/// struct
|
||||
Lprs,
|
||||
/// The BitWarden format, which is the result of the serialization/deserialization of the BitWardenPasswords struct
|
||||
/// The BitWarden format, which is the result of the
|
||||
/// serialization/deserialization of the BitWardenPasswords struct
|
||||
BitWarden,
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue