diff --git a/src/database.rs b/src/database.rs index 4e225c8..268c75c 100644 --- a/src/database.rs +++ b/src/database.rs @@ -16,9 +16,11 @@ pub struct DatabaseOps { } impl DatabaseOps { - pub fn open(path: &Path, key: String) -> anyhow::Result { + pub fn open(path: &Path, key: Option) -> anyhow::Result { let mut db = rusqlite::Connection::open(path).context("open")?; - set_cipher_key(&db, key)?; + if let Some(key) = key { + set_cipher_key(&db, key)?; + } migrate_database(&mut db)?; Ok(DatabaseOps { db }) } diff --git a/src/main.rs b/src/main.rs index 50cfe7e..fba8b4c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -83,7 +83,7 @@ enum Commands { } #[derive(Debug, clap::Args)] -#[group(required = true, multiple = false)] +#[group(multiple = false)] struct KeyGroup { #[arg(long, help = "Decryption key")] key: Option, @@ -93,21 +93,21 @@ struct KeyGroup { } impl KeyGroup { - fn read_key(self) -> anyhow::Result { + fn read_key(self) -> anyhow::Result> { let key = if let Some(key) = self.key { key } else if let Some(key_file) = self.key_file { let raw_key = fs::read_to_string(key_file)?; raw_key.trim_end().to_owned() } else { - bail!("One of --key or --key-file is required"); + return Ok(None); }; if key.is_empty() { bail!("Key cannot be empty"); } - Ok(key) + Ok(Some(key)) } } @@ -126,7 +126,8 @@ fn main() -> anyhow::Result<()> { compression, key_group, } => { - let db = DatabaseOps::open(&database_path, key_group.read_key()?).context("open db")?; + let key = key_group.read_key()?; + let db = DatabaseOps::open(&database_path, key).context("open db")?; let driver = FuseDriver::new(db, compression.unwrap_or_default(), &mount_path)?; let mount = fuser::spawn_mount2(driver, &mount_path, &[]).context("unable to create mount")?; @@ -150,7 +151,8 @@ fn main() -> anyhow::Result<()> { cmd, args, } => { - let db = DatabaseOps::open(&database_path, key_group.read_key()?).context("open db")?; + let key = key_group.read_key()?; + let db = DatabaseOps::open(&database_path, key).context("open db")?; let driver = FuseDriver::new(db, compression.unwrap_or_default(), &mount_path)?; let mount = fuser::spawn_mount2(driver, &mount_path, &[]).context("unable to create mount")?; defer! { @@ -182,7 +184,8 @@ fn main() -> anyhow::Result<()> { database_path, key_group, } => { - let mut db = DatabaseOps::open(&database_path, key_group.read_key()?).context("open db")?; + let key = key_group.read_key()?; + let mut db = DatabaseOps::open(&database_path, key).context("open db")?; println!("Running VACUUM on database, this may take a few seconds..."); db.vacuum()?; println!("Done!");