mirror of
https://github.com/danbulant/Portfolio
synced 2026-09-20 06:43:48 +00:00
feat: add useful utilities
This commit is contained in:
parent
ee4d137a7d
commit
693426f041
3 changed files with 144 additions and 41 deletions
41
Cargo.lock
generated
41
Cargo.lock
generated
|
|
@ -409,7 +409,7 @@ dependencies = [
|
||||||
"atty",
|
"atty",
|
||||||
"bitflags",
|
"bitflags",
|
||||||
"clap_derive",
|
"clap_derive",
|
||||||
"clap_lex",
|
"clap_lex 0.2.4",
|
||||||
"indexmap",
|
"indexmap",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"strsim",
|
"strsim",
|
||||||
|
|
@ -417,6 +417,20 @@ dependencies = [
|
||||||
"textwrap",
|
"textwrap",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap"
|
||||||
|
version = "4.0.23"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0eb41c13df48950b20eb4cd0eefa618819469df1bffc49d11e8487c4ba0037e5"
|
||||||
|
dependencies = [
|
||||||
|
"atty",
|
||||||
|
"bitflags",
|
||||||
|
"clap_lex 0.3.0",
|
||||||
|
"once_cell",
|
||||||
|
"strsim",
|
||||||
|
"termcolor",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap_derive"
|
name = "clap_derive"
|
||||||
version = "3.2.18"
|
version = "3.2.18"
|
||||||
|
|
@ -439,6 +453,15 @@ dependencies = [
|
||||||
"os_str_bytes",
|
"os_str_bytes",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap_lex"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8"
|
||||||
|
dependencies = [
|
||||||
|
"os_str_bytes",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "codespan-reporting"
|
name = "codespan-reporting"
|
||||||
version = "0.11.1"
|
version = "0.11.1"
|
||||||
|
|
@ -1893,6 +1916,18 @@ dependencies = [
|
||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "portfolio-recovery"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"clap 4.0.23",
|
||||||
|
"portfolio-core",
|
||||||
|
"portfolio-entity",
|
||||||
|
"sea-orm",
|
||||||
|
"tokio",
|
||||||
|
"url",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ppv-lite86"
|
name = "ppv-lite86"
|
||||||
version = "0.2.17"
|
version = "0.2.17"
|
||||||
|
|
@ -2339,7 +2374,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "882af0d4cd3d6cc2f427d14a48e9f468b37c563b405ea486fd314ba18ca334d0"
|
checksum = "882af0d4cd3d6cc2f427d14a48e9f468b37c563b405ea486fd314ba18ca334d0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"clap",
|
"clap 3.2.23",
|
||||||
"dotenvy",
|
"dotenvy",
|
||||||
"regex",
|
"regex",
|
||||||
"sea-schema",
|
"sea-schema",
|
||||||
|
|
@ -2368,7 +2403,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "86fe6e594b078712e1e797b951b9b56e55d3cfa04aac8ea76eb4bed7c94c5910"
|
checksum = "86fe6e594b078712e1e797b951b9b56e55d3cfa04aac8ea76eb4bed7c94c5910"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"clap",
|
"clap 3.2.23",
|
||||||
"dotenvy",
|
"dotenvy",
|
||||||
"sea-orm",
|
"sea-orm",
|
||||||
"sea-orm-cli",
|
"sea-orm-cli",
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ url = "^2.3"
|
||||||
clap = { version = "^4.0", features = ["cargo"] }
|
clap = { version = "^4.0", features = ["cargo"] }
|
||||||
|
|
||||||
portfolio-entity = { path = "../entity" }
|
portfolio-entity = { path = "../entity" }
|
||||||
|
portfolio-core = { path = "../core" }
|
||||||
|
|
||||||
[dependencies.tokio]
|
[dependencies.tokio]
|
||||||
version = "^1.21"
|
version = "^1.21"
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,22 @@
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
use clap::{arg, command, value_parser};
|
use clap::{arg, command, value_parser, Command, ArgAction};
|
||||||
use sea_orm::{Database, DatabaseConnection};
|
use sea_orm::{Database, DatabaseConnection};
|
||||||
|
|
||||||
use sea_orm::*;
|
|
||||||
use ::entity::candidate::Entity as Candidate;
|
use ::entity::candidate::Entity as Candidate;
|
||||||
use ::entity::parent::Entity as Parent;
|
use ::entity::parent::Entity as Parent;
|
||||||
|
use sea_orm::*;
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let clap = command!()
|
let clap = command!()
|
||||||
|
.propagate_version(true)
|
||||||
|
.subcommand_required(true)
|
||||||
|
.arg_required_else_help(true)
|
||||||
|
.subcommand(
|
||||||
|
Command::new("portfolio")
|
||||||
|
.about("Database & Portfolio operations")
|
||||||
.arg(
|
.arg(
|
||||||
arg!(
|
arg!(
|
||||||
-d --database <URL> "URL to the database or sql file with postgres:// or sqlite://"
|
-d --database <URL> "URL to the database or sql file with postgres:// or sqlite://"
|
||||||
|
|
@ -32,9 +38,45 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
)
|
)
|
||||||
.required(true),
|
.required(true),
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
.subcommand(
|
||||||
|
Command::new("hash")
|
||||||
|
.about("Hash operations")
|
||||||
|
.arg(
|
||||||
|
arg!(
|
||||||
|
-i --input <INPUT> "Plaintext to hash"
|
||||||
|
)
|
||||||
|
.required(true)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.subcommand(
|
||||||
|
Command::new("encryption")
|
||||||
|
.about("Encryption operations")
|
||||||
|
.arg(
|
||||||
|
arg!(
|
||||||
|
-d --decrypt ... "Decrypt flag"
|
||||||
|
)
|
||||||
|
.action(ArgAction::SetFalse)
|
||||||
|
.required(false)
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
arg!(
|
||||||
|
-i --input <INPUT> "Plaintext to encrypt/decrypt"
|
||||||
|
)
|
||||||
|
.required(true)
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
arg!(
|
||||||
|
-k --key <KEY> "Key for encryption/decryption"
|
||||||
|
)
|
||||||
|
.required(true),
|
||||||
|
)
|
||||||
|
)
|
||||||
.get_matches();
|
.get_matches();
|
||||||
|
|
||||||
let sqlite_url = clap.get_one::<Url>("database").unwrap();
|
match clap.subcommand() {
|
||||||
|
Some(("portfolio", sub_matches)) => {
|
||||||
|
let sqlite_url = sub_matches.get_one::<Url>("database").unwrap();
|
||||||
|
|
||||||
println!("Connecting to {:?}", sqlite_url);
|
println!("Connecting to {:?}", sqlite_url);
|
||||||
|
|
||||||
|
|
@ -55,6 +97,31 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
.all(&db)
|
.all(&db)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
Ok(())
|
println!("Found {} entries", entries.len());
|
||||||
|
}
|
||||||
|
Some(("hash", sub_matches)) => {
|
||||||
|
let input = sub_matches.get_one::<String>("input").unwrap();
|
||||||
|
|
||||||
|
let hash = portfolio_core::crypto::hash_password(input.to_string()).await?;
|
||||||
|
|
||||||
|
println!("{}", hash);
|
||||||
|
}
|
||||||
|
Some(("encryption", sub_matches)) => {
|
||||||
|
let decrypt = sub_matches.get_one::<bool>("decrypt").unwrap();
|
||||||
|
let input = sub_matches.get_one::<String>("input").unwrap();
|
||||||
|
let key = sub_matches.get_one::<String>("key").unwrap();
|
||||||
|
|
||||||
|
|
||||||
|
let result = if !*decrypt {
|
||||||
|
portfolio_core::crypto::decrypt_password(input.to_string(), key.to_string()).await?
|
||||||
|
} else {
|
||||||
|
portfolio_core::crypto::encrypt_password(input.to_string(), key.to_string()).await?
|
||||||
|
};
|
||||||
|
|
||||||
|
println!("{}", result);
|
||||||
|
}
|
||||||
|
_ => unreachable!("Exhausted list of subcommands and subcommand_required prevents `None`"),
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue