diff --git a/cove/src/main.rs b/cove/src/main.rs index e9dc920..cc5ae63 100644 --- a/cove/src/main.rs +++ b/cove/src/main.rs @@ -26,7 +26,6 @@ mod vault; use std::path::PathBuf; use clap::Parser; -use cookie::CookieJar; use cove_config::doc::Document; use cove_config::Config; use directories::{BaseDirs, ProjectDirs}; @@ -47,7 +46,11 @@ enum Command { /// Compact and clean up vault. Gc, /// Clear euphoria session cookies. - ClearCookies, + ClearCookies { + /// Clear cookies for a specific domain only. + #[arg(long, short)] + domain: Option, + }, /// Print config documentation as markdown. HelpConfig, } @@ -154,7 +157,7 @@ async fn main() -> anyhow::Result<()> { Command::Run => run(logger, logger_rx, config, &dirs).await?, Command::Export(args) => export(config, &dirs, args).await?, Command::Gc => gc(config, &dirs).await?, - Command::ClearCookies => clear_cookies(config, &dirs).await?, + Command::ClearCookies { domain } => clear_cookies(config, &dirs, domain).await?, Command::HelpConfig => help_config(), } @@ -214,11 +217,15 @@ async fn gc(config: &'static Config, dirs: &ProjectDirs) -> anyhow::Result<()> { Ok(()) } -async fn clear_cookies(config: &'static Config, dirs: &ProjectDirs) -> anyhow::Result<()> { +async fn clear_cookies( + config: &'static Config, + dirs: &ProjectDirs, + domain: Option, +) -> anyhow::Result<()> { let vault = open_vault(config, dirs)?; eprintln!("Clearing cookies"); - vault.euph().set_cookies(CookieJar::new()).await?; + vault.euph().clear_cookies(domain).await?; vault.close().await; Ok(()) diff --git a/cove/src/vault/euph.rs b/cove/src/vault/euph.rs index 6f23261..7a5ec3f 100644 --- a/cove/src/vault/euph.rs +++ b/cove/src/vault/euph.rs @@ -113,6 +113,7 @@ macro_rules! euph_vault_actions { euph_vault_actions! { GetCookies : cookies(domain: String) -> CookieJar; SetCookies : set_cookies(domain: String, cookies: CookieJar) -> (); + ClearCookies : clear_cookies(domain: Option) -> (); GetRooms : rooms() -> Vec; } @@ -166,7 +167,7 @@ impl Action for SetCookies { ", )?; for cookie in self.cookies.iter() { - insert_cookie.execute([self.domain, format!("{cookie}")])?; + insert_cookie.execute(params![self.domain, format!("{cookie}")])?; } drop(insert_cookie); @@ -175,6 +176,21 @@ impl Action for SetCookies { } } +impl Action for ClearCookies { + type Output = (); + type Error = rusqlite::Error; + + fn run(self, conn: &mut Connection) -> Result { + if let Some(domain) = self.domain { + conn.execute("DELETE FROM euph_cookies WHERE domain = ?", [domain])?; + } else { + conn.execute_batch("DELETE FROM euph_cookies")?; + } + + Ok(()) + } +} + impl Action for GetRooms { type Output = Vec; type Error = rusqlite::Error;