diff --git a/.vscode/settings.json b/.vscode/settings.json index 9ef0932..433e19c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,7 +8,7 @@ "rust-analyzer.cargo.features": [ "chromium-crypto/tracing", "decrypt-cookies/Safari", - "decrypt-cookies/tracing", + "decrypt-cookies/linkme", "binary-cookies/serde", "binary-cookies/tokio", "binary-cookies/csv", diff --git a/Cargo.lock b/Cargo.lock index edc8b25..75d1d40 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -592,26 +592,6 @@ dependencies = [ "tiny-keccak", ] -[[package]] -name = "const_format" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - [[package]] name = "convert_case" version = "0.4.0" @@ -800,8 +780,9 @@ dependencies = [ "binary-cookies", "chromium-crypto", "chrono", - "const_format", "dirs", + "linkme", + "pastey", "rawcopy-rs-next", "rayon", "reqwest", @@ -1785,6 +1766,26 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "linkme" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1b1703c00b2a6a70738920544aa51652532cacddfec2e162d2e29eae01e665c" +dependencies = [ + "linkme-impl", +] + +[[package]] +name = "linkme-impl" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04d55ca5d5a14363da83bf3c33874b8feaa34653e760d5216d7ef9829c88001a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "linux-raw-sys" version = "0.9.4" @@ -3945,12 +3946,6 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "unindent" version = "0.2.4" diff --git a/Cargo.toml b/Cargo.toml index 95b14e7..96a9098 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,6 +22,7 @@ panic = "abort" [workspace.dependencies] +linkme = "0.3" napi = "3" napi-derive = "3" napi-build = "2" @@ -42,7 +43,6 @@ plist = "1" bstr = "1" oval = "2" winnow = "0.7.11" -annotate-snippets = "0.11" TinyUFO = "0.5" cfg-if = "1" @@ -53,7 +53,6 @@ reqwest = { version = "^0.12", default-features = false } sea-orm = { version = "^1", default-features = false, features = ["sqlx-sqlite", "runtime-tokio-rustls", "macros"] } dirs = { version = "^6" } -const_format = { version = "0.2" } tracing = { version = "^0.1" } tracing-subscriber = { version = "^0.3", default-features = true, features = ["env-filter"] } diff --git a/crates/binary-cookies/Cargo.toml b/crates/binary-cookies/Cargo.toml index 9c94d34..a5d5b47 100644 --- a/crates/binary-cookies/Cargo.toml +++ b/crates/binary-cookies/Cargo.toml @@ -14,8 +14,6 @@ categories = ["asynchronous", "authentication", "encoding"] include = ["Cargo.toml", "README.md", "src"] [dependencies] -# TODO: better error display? -# annotate-snippets = { workspace = true } bstr = { workspace = true } chrono = { workspace = true } oval = { workspace = true } diff --git a/crates/decrypt-cookies/Cargo.toml b/crates/decrypt-cookies/Cargo.toml index 2f979f4..339942b 100644 --- a/crates/decrypt-cookies/Cargo.toml +++ b/crates/decrypt-cookies/Cargo.toml @@ -17,6 +17,8 @@ binary-cookies = { workspace = true, features = ["tokio"], optional = true } chromium-crypto = { workspace = true } chrono = { workspace = true } dirs = { workspace = true } +linkme = { workspace = true, optional = true } +pastey = { workspace = true, optional = true } rayon = { workspace = true, optional = true } reqwest = { workspace = true, default-features = false, features = ["cookies"], optional = true } rust-ini = { workspace = true, optional = true } @@ -33,9 +35,6 @@ tokio = { workspace = true, features = ["macros", "rt-multi-thread"] } tracing = { workspace = true } tracing-subscriber = { workspace = true } -[target.'cfg(not(windows))'.dependencies] -const_format = { workspace = true } - [target.'cfg(windows)'.dependencies] anyhow = { workspace = true, optional = true } rawcopy-rs-next = { workspace = true, optional = true } @@ -46,6 +45,7 @@ chromium = ["anyhow", "rawcopy-rs-next", "rayon", "sea-orm"] default = ["chromium", "firefox", "reqwest", "serde", "tracing"] ffi = [] # Use for bindgen firefox = ["rayon", "rust-ini", "sea-orm"] +linkme = ["dep:linkme", "pastey"] # Generate a browser name array reqwest = ["dep:reqwest"] serde = ["chrono/serde", "dep:serde"] tracing = ["chromium-crypto/tracing", "dep:tracing"] diff --git a/crates/decrypt-cookies/examples/new_browser.rs b/crates/decrypt-cookies/examples/new_browser.rs index 3343c22..1384ca6 100644 --- a/crates/decrypt-cookies/examples/new_browser.rs +++ b/crates/decrypt-cookies/examples/new_browser.rs @@ -14,6 +14,9 @@ firefox!("windows", NewBrowserBasedFirefox, base: r"AppData\Roaming\Mozilla\NewB #[snafu::report] #[tokio::main] async fn main() -> Result<(), Whatever> { + assert!(BROWSERS.contains(&"NewBrowserBasedChromium")); + assert!(BROWSERS.contains(&"NewBrowserBasedFirefox")); + let chromium = ChromiumBuilder::::new() .build() .await diff --git a/crates/decrypt-cookies/src/browser/chromium.rs b/crates/decrypt-cookies/src/browser/chromium.rs index b9af432..791df56 100644 --- a/crates/decrypt-cookies/src/browser/chromium.rs +++ b/crates/decrypt-cookies/src/browser/chromium.rs @@ -82,6 +82,8 @@ pub trait ChromiumPath { /// Register a Chromium based browser info /// +/// When linkme feature is enabled, the macro requires the `linkme` crate. +/// /// It accept /// - `platform` /// - `browser`: Generate a struct @@ -128,6 +130,13 @@ macro_rules! chromium { $(, key: $key:literal)? $(, safe_name: $safe_name:literal)? ) => { + #[cfg(feature = "linkme")] + $crate::pastey::paste! { + #[cfg(target_os = $platform)] + #[linkme::distributed_slice($crate::browser::BROWSERS)] + static [<$browser:upper _NAME>]: &str = stringify!($browser); + } + #[cfg(target_os = $platform)] #[derive(Clone, Copy)] #[derive(Debug)] @@ -145,7 +154,7 @@ macro_rules! chromium { $(const LOGIN_DATA_FOR_ACCOUNT: &str = $login_data_fa;)? $(const KEY: &str = $key;)? $( - const SAFE_STORAGE: &str = const_format::concatcp!($safe_name, " Safe Storage"); + const SAFE_STORAGE: &str = concat!($safe_name, " Safe Storage"); #[cfg(target_os = "macos")] const SAFE_NAME: &str = $safe_name; )? diff --git a/crates/decrypt-cookies/src/browser/firefox.rs b/crates/decrypt-cookies/src/browser/firefox.rs index 9fa2571..0737c75 100644 --- a/crates/decrypt-cookies/src/browser/firefox.rs +++ b/crates/decrypt-cookies/src/browser/firefox.rs @@ -56,6 +56,8 @@ pub trait FirefoxPath { /// Register a Firefox based browser info /// +/// When linkme feature is enabled, the macro requires the `linkme` crate. +/// /// It accept /// - `platform` /// - `browser`: Generate a struct @@ -88,6 +90,13 @@ macro_rules! firefox { $(, login_data: $login_data:literal)? $(, key = $key:literal)? ) => { + #[cfg(feature = "linkme")] + $crate::pastey::paste! { + #[cfg(target_os = $platform)] + #[linkme::distributed_slice($crate::browser::BROWSERS)] + static [<$browser:upper _NAME>]: &str = stringify!($browser); + } + #[cfg(target_os = $platform)] #[derive(Clone, Copy)] #[derive(Debug)] diff --git a/crates/decrypt-cookies/src/browser/mod.rs b/crates/decrypt-cookies/src/browser/mod.rs index 2ae4859..a37b021 100644 --- a/crates/decrypt-cookies/src/browser/mod.rs +++ b/crates/decrypt-cookies/src/browser/mod.rs @@ -36,3 +36,23 @@ pub use firefox::*; #[cfg(any(feature = "chromium", feature = "firefox"))] const CACHE_PATH: &str = "decrypt-cookies"; + +#[cfg(feature = "linkme")] +#[linkme::distributed_slice] +/// All supported browser names +pub static BROWSERS: [&str]; + +#[cfg(feature = "linkme")] +#[test] +fn linkme_work() { + assert!(BROWSERS.contains(&"Firefox")); + assert!(BROWSERS.contains(&"Librewolf")); + + assert!(BROWSERS.contains(&"Edge")); + assert!(BROWSERS.contains(&"Chrome")); + + #[cfg(not(target_os = "linux"))] + assert!(BROWSERS.contains(&"CocCoc")); + #[cfg(not(target_os = "linux"))] + assert!(BROWSERS.contains(&"Arc")); +} diff --git a/crates/decrypt-cookies/src/lib.rs b/crates/decrypt-cookies/src/lib.rs index 68f66b1..c50605b 100644 --- a/crates/decrypt-cookies/src/lib.rs +++ b/crates/decrypt-cookies/src/lib.rs @@ -10,3 +10,6 @@ pub mod firefox; pub mod safari; pub(crate) mod utils; + +#[cfg(feature = "linkme")] +pub use pastey;