From 44cb53c83b48e415a4113fb401316af9a483f757 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 11:05:25 +0000 Subject: [PATCH 1/2] Bump keepass from 0.8.16 to 0.10.1 Bumps [keepass](https://github.com/sseemayer/keepass-rs) from 0.8.16 to 0.10.1. - [Commits](https://github.com/sseemayer/keepass-rs/compare/v0.8.16...v0.10.1) --- updated-dependencies: - dependency-name: keepass dependency-version: 0.10.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Cargo.lock | 233 ++++++++++++++++++++++++++++++++++++++++++++++++----- Cargo.toml | 2 +- 2 files changed, 213 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2aa8efd..73d9d9f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -585,6 +585,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -697,12 +703,25 @@ name = "getrandom" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", "wasip2", + "wasip3", "wasm-bindgen", ] @@ -746,6 +765,15 @@ dependencies = [ "tracing", ] +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + [[package]] name = "hashbrown" version = "0.16.0" @@ -1036,6 +1064,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "idna" version = "1.1.0" @@ -1064,7 +1098,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.16.0", + "serde", + "serde_core", ] [[package]] @@ -1141,9 +1177,9 @@ dependencies = [ [[package]] name = "keepass" -version = "0.8.16" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d40cdb5c00770fddffcfc2ab4c1be0acd6cdd6e2a34da549fbbeaaf307134fe" +checksum = "62e02f3417e2e81f7d158cafdb6ac85ff39844b3f1fcbae1ec399aa13b53d2c2" dependencies = [ "aes", "base64", @@ -1154,19 +1190,20 @@ dependencies = [ "chrono", "cipher", "flate2", - "getrandom 0.3.4", + "getrandom 0.4.1", "hex", "hex-literal", "hmac", "js-sys", + "quick-xml", "rust-argon2", "salsa20", - "secstr", + "secrecy", + "serde", "sha2", "thiserror", "twofish", "uuid", - "xml-rs", "zeroize", ] @@ -1214,6 +1251,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libc" version = "0.2.175" @@ -1529,6 +1572,16 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + [[package]] name = "primeorder" version = "0.13.6" @@ -1547,6 +1600,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "quick-xml" +version = "0.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "quote" version = "1.0.40" @@ -1821,12 +1884,12 @@ dependencies = [ ] [[package]] -name = "secstr" -version = "0.5.1" +name = "secrecy" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04f657244f605c4cf38f6de5993e8bd050c8a303f86aeabff142d5c7c113e12" +checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" dependencies = [ - "libc", + "zeroize", ] [[package]] @@ -1852,6 +1915,12 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + [[package]] name = "serde" version = "1.0.228" @@ -2359,6 +2428,12 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "universal-hash" version = "0.5.1" @@ -2450,7 +2525,16 @@ version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.46.0", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", ] [[package]] @@ -2524,6 +2608,40 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + [[package]] name = "web-sys" version = "0.3.77" @@ -2886,26 +3004,99 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] -name = "writeable" -version = "0.6.1" +name = "wit-bindgen" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] [[package]] -name = "xml" -version = "1.0.0" +name = "wit-bindgen-core" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e6e0a83ae73d886ab66fc2f82b598fbbb8f373357d5f2f9f783e50e4d06435" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] [[package]] -name = "xml-rs" -version = "1.0.0" +name = "wit-bindgen-rust" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a56132a0d6ecbe77352edc10232f788fc4ceefefff4cab784a98e0e16b6b51" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ - "xml", + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", ] +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + [[package]] name = "yoke" version = "0.8.0" diff --git a/Cargo.toml b/Cargo.toml index bbde485..e1f51de 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ base64 = "0.22.1" clap = { version = "4.5.60", features=["derive"] } clap-verbosity-flag = "3.0.4" env_logger = "0.11.9" -keepass = "0.8.16" +keepass = "0.10.1" keeper-secrets-manager-core = "17.1.0" log = "0.4.29" serde = { version = "1.0.228", features = ["derive"] } From 97bc6efb4bd1e9e25ee33309024be978b189102f Mon Sep 17 00:00:00 2001 From: Jack Harper Date: Tue, 24 Mar 2026 07:48:18 +0000 Subject: [PATCH 2/2] use new api without noderef --- src/keepass.rs | 60 +++++++++++++++++++------------------------------- 1 file changed, 23 insertions(+), 37 deletions(-) diff --git a/src/keepass.rs b/src/keepass.rs index 3c69359..81c9a74 100644 --- a/src/keepass.rs +++ b/src/keepass.rs @@ -1,9 +1,6 @@ use crate::credentials::Credential; -use anyhow::{anyhow, bail}; -use keepass::{ - Database, DatabaseKey, - db::NodeRef::{self, Entry, Group}, -}; +use anyhow::anyhow; +use keepass::{Database, DatabaseKey, db::Entry}; use log::trace; use std::fs::File; @@ -15,21 +12,16 @@ fn get_keepass_group_name(admin: bool) -> &'static str { if admin { "Admin" } else { "User" } } -fn node_to_credential(node: NodeRef, machine: String) -> anyhow::Result { - match node { - Group { .. } => bail!("Expected entry, not group"), - Entry(fields, ..) => Ok(Credential::new( - machine, - fields - .get(USERNAME_KEY) - .ok_or(anyhow!("Username field not found"))? - .to_owned(), - fields - .get(PASSWORD_KEY) - .ok_or(anyhow!("Password field not found"))? - .to_owned(), - )), - } +fn node_to_credential(node: &Entry, machine: String) -> anyhow::Result { + Ok(Credential::new( + machine, + node.get(USERNAME_KEY) + .ok_or(anyhow!("Username field not found"))? + .to_owned(), + node.get(PASSWORD_KEY) + .ok_or(anyhow!("Password field not found"))? + .to_owned(), + )) } /// Get credentials for the specified machines from keepass. @@ -56,10 +48,14 @@ pub fn get_credentials_keepass>( .iter() .map(AsRef::as_ref) .map(|machine| { - let node = db.root.get(&[group_name, machine]).ok_or(anyhow!( + let group = db + .root + .group_by_name(group_name) + .ok_or(anyhow!("unable to find group {group_name} in {source}",))?; + let entry = group.entry_by_name(machine).ok_or(anyhow!( "unable to find credential {group_name}/{machine} in {source}", ))?; - node_to_credential(node, machine.to_owned()) + node_to_credential(entry, machine.to_owned()) .map_err(|e| anyhow!("Failed to read credential at {group_name}/{machine}: {e}")) }) .collect() @@ -68,7 +64,7 @@ pub fn get_credentials_keepass>( #[cfg(test)] mod tests { use super::*; - use keepass::db::{Entry, Group, Value}; + use keepass::db::{Entry, Value}; #[test] fn test_get_keepass_group_name() { @@ -76,18 +72,10 @@ mod tests { assert_eq!(get_keepass_group_name(true), "Admin"); } - #[test] - fn test_node_to_credential_with_group() { - let node_ref = NodeRef::Group(&Group::default()); - let result = node_to_credential(node_ref, "".to_owned()); - assert!(result.is_err_and(|e| e.to_string().contains("Expected entry, not group"))) - } - #[test] fn test_node_to_credential_with_entry_with_missing_username() { - let entry = Entry::default(); - let node_ref = NodeRef::Entry(&entry); - let result = node_to_credential(node_ref, "".to_owned()); + let node_ref = Entry::default(); + let result = node_to_credential(&node_ref, "".to_owned()); assert!(result.is_err_and(|e| e.to_string().contains("Username field not found"))) } @@ -98,8 +86,7 @@ mod tests { USERNAME_KEY.to_owned(), Value::Unprotected("some_username".to_owned()), ); - let node_ref = NodeRef::Entry(&entry); - let result = node_to_credential(node_ref, "".to_owned()); + let result = node_to_credential(&entry, "".to_owned()); assert!(result.is_err_and(|e| e.to_string().contains("Password field not found"))) } @@ -114,8 +101,7 @@ mod tests { PASSWORD_KEY.to_owned(), Value::Unprotected("some_password".to_owned()), ); - let node_ref = NodeRef::Entry(&entry); - let result = node_to_credential(node_ref, "some_machine".to_owned()); + let result = node_to_credential(&entry, "some_machine".to_owned()); assert!(result.is_ok_and(|v| v == Credential::new( "some_machine".to_owned(),