Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package himmelblau for openSUSE:Factory checked in at 2026-06-11 17:27:30 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/himmelblau (Old) and /work/SRC/openSUSE:Factory/.himmelblau.new.1981 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "himmelblau" Thu Jun 11 17:27:30 2026 rev:49 rq:1358616 version:3.1.6+git0.102ee045 Changes: -------- --- /work/SRC/openSUSE:Factory/himmelblau/himmelblau.changes 2026-05-13 17:21:56.817782363 +0200 +++ /work/SRC/openSUSE:Factory/.himmelblau.new.1981/himmelblau.changes 2026-06-11 17:29:15.567106808 +0200 @@ -1,0 +2,20 @@ +Wed Jun 10 20:29:37 UTC 2026 - David Mulder <[email protected]> + +- Update to version 3.1.6+git0.102ee045: + * Fix cargo-fuzz install in fuzz CI + * cargo vet + * Update ldap3_proto to 0.6.2 + * Update `openssl` from 0.10.79 to 0.10.80 + * Version 3.1.6 + * Update cargo vet audits for backport + * Work around resume lockout on network down + * Reset Hello TOTP when passwd changes Hello key + * Clear Hello TOTP keys during full cache clear + * Add automatic fallback when requested MFA method is unavailable + * Fix SSHd configuration load order on Fedora/RHEL systems + * himmelblau-init-hsm-pin: don't bind the hsm-pin to PCR7 + * qr-greeter: support GNOME Shell 50 + * Update libhimmelblau to latest version + * deps(rust): bump the all-cargo-updates group across 1 directory with 2 updates + +------------------------------------------------------------------- Old: ---- himmelblau-3.1.5+git0.445569d9.tar.bz2 New: ---- himmelblau-3.1.6+git0.102ee045.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ himmelblau.spec ++++++ --- /var/tmp/diff_new_pack.cKbjb8/_old 2026-06-11 17:29:19.343265161 +0200 +++ /var/tmp/diff_new_pack.cKbjb8/_new 2026-06-11 17:29:19.343265161 +0200 @@ -30,7 +30,7 @@ %endif Name: himmelblau -Version: 3.1.5+git0.445569d9 +Version: 3.1.6+git0.102ee045 Release: 0 Summary: Interoperability suite for Microsoft Azure Entra Id License: GPL-3.0-or-later ++++++ _service ++++++ --- /var/tmp/diff_new_pack.cKbjb8/_old 2026-06-11 17:29:19.395267341 +0200 +++ /var/tmp/diff_new_pack.cKbjb8/_new 2026-06-11 17:29:19.399267509 +0200 @@ -2,7 +2,7 @@ <service name="tar_scm" mode="manual"> <param name="url">https://github.com/himmelblau-idm/himmelblau.git</param> <param name="scm">git</param> - <param name="revision">3.1.5</param> + <param name="revision">stable-3.x</param> <param name="versionformat">@PARENT_TAG@+git@TAG_OFFSET@.%h</param> <param name="versionrewrite-pattern">himmelblau-(.*)</param> <param name="versionrewrite-replacement">\1</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.cKbjb8/_old 2026-06-11 17:29:19.423268515 +0200 +++ /var/tmp/diff_new_pack.cKbjb8/_new 2026-06-11 17:29:19.427268683 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/himmelblau-idm/himmelblau.git</param> - <param name="changesrevision">445569d9eae49a6b573365d2740233937d269e39</param></service></servicedata> + <param name="changesrevision">102ee045d192c2317af90461ea76f188e3728f0a</param></service></servicedata> (No newline at EOF) ++++++ himmelblau-3.1.5+git0.445569d9.tar.bz2 -> himmelblau-3.1.6+git0.102ee045.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/Cargo.lock new/himmelblau-3.1.6+git0.102ee045/Cargo.lock --- old/himmelblau-3.1.5+git0.445569d9/Cargo.lock 2026-05-07 19:57:55.000000000 +0200 +++ new/himmelblau-3.1.6+git0.102ee045/Cargo.lock 2026-05-28 23:36:26.000000000 +0200 @@ -4,7 +4,7 @@ [[package]] name = "aad-tool" -version = "3.1.5" +version = "3.1.6" dependencies = [ "anyhow", "broker-client", @@ -611,7 +611,7 @@ [[package]] name = "broker" -version = "3.1.5" +version = "3.1.6" dependencies = [ "dbus", "himmelblau_unix_common", @@ -622,7 +622,7 @@ [[package]] name = "broker-client" -version = "3.1.5" +version = "3.1.6" dependencies = [ "serde_json", "zbus", @@ -2050,7 +2050,7 @@ [[package]] name = "himmelblau-fuzz" -version = "3.1.5" +version = "3.1.6" dependencies = [ "arbitrary", "himmelblau_unix_common", @@ -2062,7 +2062,7 @@ [[package]] name = "himmelblau_policies" -version = "3.1.5" +version = "3.1.6" dependencies = [ "anyhow", "async-trait", @@ -2084,7 +2084,7 @@ [[package]] name = "himmelblau_unix_common" -version = "3.1.5" +version = "3.1.6" dependencies = [ "anyhow", "async-trait", @@ -2133,7 +2133,7 @@ [[package]] name = "himmelblaud" -version = "3.1.5" +version = "3.1.6" dependencies = [ "async-trait", "base64 0.22.1", @@ -2522,7 +2522,7 @@ [[package]] name = "idmap" -version = "3.1.5" +version = "3.1.6" dependencies = [ "bindgen", "cc", @@ -2827,15 +2827,22 @@ [[package]] name = "ldap3_proto" version = "0.6.2" +dependencies = [ + "ldap3_proto 0.7.1", +] + +[[package]] +name = "ldap3_proto" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b52f9ddd849c72b3f3147d91b1220a47709fdaacfe55aaaf88912c2ee3d5357b" +checksum = "61954eefd3ff2b74d2d5bfa899c235b4c77536b4d17627607ff55430d05e0c61" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bytes", "lber", "nom", "peg", - "thiserror 1.0.69", + "thiserror 2.0.16", "tokio-util", "tracing", "uuid", @@ -2874,21 +2881,23 @@ [[package]] name = "libhimmelblau" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4331d6c174da030b21bb2bf7dde3ea49d9cea3a08cd99007a008f65a64059ae8" +checksum = "c0aced2dc4e76ba0a04043e9b9eb87569fc7e9f9bebe89ce734986cf3ac0df49" dependencies = [ "base64 0.22.1", "cbindgen", "chrono", "compact_jwt", "crypto-glue", + "der 0.7.10", "hostname", "kanidm-hsm-crypto", "libkrimes", "openssl", "os-release", "paste", + "pem-rfc7468", "percent-encoding", "picky-asn1", "picky-asn1-der", @@ -2907,6 +2916,7 @@ "tracing-subscriber", "urlencoding", "uuid", + "x509-cert", "zeroize", ] @@ -2931,7 +2941,7 @@ "hmac 0.12.1", "keyutils", "keyutils-raw", - "ldap3_proto", + "ldap3_proto 0.6.2", "libc", "md5", "num_enum", @@ -3264,7 +3274,7 @@ [[package]] name = "nss_himmelblau" -version = "3.1.5" +version = "3.1.6" dependencies = [ "himmelblau_unix_common", "lazy_static", @@ -3370,7 +3380,7 @@ [[package]] name = "o365" -version = "3.1.5" +version = "3.1.6" dependencies = [ "anyhow", "reqwest 0.12.24", @@ -3456,9 +3466,9 @@ [[package]] name = "openssl" -version = "0.10.79" +version = "0.10.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf0b434746ee2832f4f0baf10137e1cabb18cbe6912c69e2e33263c45250f542" +checksum = "a45fa2aa886c42762255da344f0a0d313e254066c46aad76f300c3d3da62d967" dependencies = [ "bitflags 2.9.1", "cfg-if", @@ -3493,9 +3503,9 @@ [[package]] name = "openssl-sys" -version = "0.9.115" +version = "0.9.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "158fe5b292746440aa6e7a7e690e55aeb72d41505e2804c23c6973ad0e9c9781" +checksum = "f28a22dc7140cda5f096e5e7724a6962ca81a7f8bfd2979f9b18c11af56318c4" dependencies = [ "cc", "libc", @@ -3657,7 +3667,7 @@ [[package]] name = "pam_himmelblau" -version = "3.1.5" +version = "3.1.6" dependencies = [ "himmelblau_unix_common", "libc", @@ -4106,7 +4116,7 @@ [[package]] name = "qr-greeter" -version = "3.1.5" +version = "3.1.6" [[package]] name = "qrcodegen" @@ -4809,7 +4819,7 @@ [[package]] name = "selinux" -version = "3.1.5" +version = "3.1.6" [[package]] name = "semver" @@ -5170,7 +5180,7 @@ [[package]] name = "sshd-config" -version = "3.1.5" +version = "3.1.6" [[package]] name = "sshkey-attest" @@ -5181,7 +5191,7 @@ [[package]] name = "sso" -version = "3.1.5" +version = "3.1.6" dependencies = [ "broker-client", "clap", @@ -5193,7 +5203,7 @@ [[package]] name = "sso-policies" -version = "3.1.5" +version = "3.1.6" [[package]] name = "stable_deref_trait" @@ -5312,7 +5322,7 @@ checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.1", + "getrandom 0.3.3", "once_cell", "rustix 1.1.4", "windows-sys 0.61.2", @@ -5587,9 +5597,9 @@ [[package]] name = "tonic" -version = "0.14.5" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec" +checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef" dependencies = [ "async-trait", "axum", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/Cargo.toml new/himmelblau-3.1.6+git0.102ee045/Cargo.toml --- old/himmelblau-3.1.5+git0.445569d9/Cargo.toml 2026-05-07 19:57:55.000000000 +0200 +++ new/himmelblau-3.1.6+git0.102ee045/Cargo.toml 2026-05-28 23:36:26.000000000 +0200 @@ -32,9 +32,10 @@ sshkey-attest = { path = "src/sshkey-attest" } kanidm_build_profiles = { path = "src/kanidm_build_profiles" } picky-krb = { path = "src/picky-krb" } +ldap3_proto = { path = "src/overrides/ldap3_proto/0.6.2" } [workspace.package] -version = "3.1.5" +version = "3.1.6" authors = [ "David Mulder <[email protected]>" ] @@ -54,7 +55,7 @@ tracing-subscriber = "^0.3.23" tracing = "^0.1.37" himmelblau_unix_common = { path = "src/common" } -libhimmelblau = { version = "0.8.18", features = ["broker", "changepassword", "on_behalf_of", "mfa_method_selection", "optional_mfa", "intune_portal_vers_selection", "set_timeout"] } +libhimmelblau = { version = "0.8.20", features = ["broker", "changepassword", "on_behalf_of", "mfa_method_selection", "optional_mfa", "intune_portal_vers_selection", "set_timeout"] } clap = { version = "^4.6", features = ["derive", "env"] } clap_complete = "^4.6.3" reqwest = { version = "^0.12.24", features = ["json"] } @@ -92,7 +93,7 @@ kanidm_proto = "1.8.1" openssl-sys = "^0.9" openssl = "^0.10.79" -rand = "^0.9.4" +rand = "^0.10.1" tss-esapi = "^7.2.0" sketching = "1.10.0" tracing-forest = "^0.1.6" @@ -119,7 +120,7 @@ opentelemetry-semantic-conventions = "0.27.0" tracing-opentelemetry = "0.28.0" tracing-core = "0.1.34" -tonic = "0.14.5" +tonic = "0.14.6" compact_jwt = { version = "0.5.3-dev", features = ["msextensions"] } kanidm-hsm-crypto = { version = "^0.3.6" } whoami = "1.6.1" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/platform/common/NetworkManager/dispatcher.d/99-himmelblau-restart-on-down new/himmelblau-3.1.6+git0.102ee045/platform/common/NetworkManager/dispatcher.d/99-himmelblau-restart-on-down --- old/himmelblau-3.1.5+git0.445569d9/platform/common/NetworkManager/dispatcher.d/99-himmelblau-restart-on-down 1970-01-01 01:00:00.000000000 +0100 +++ new/himmelblau-3.1.6+git0.102ee045/platform/common/NetworkManager/dispatcher.d/99-himmelblau-restart-on-down 2026-05-28 23:36:26.000000000 +0200 @@ -0,0 +1,38 @@ +#!/bin/sh +# Temporary workaround for himmelblau-idm/himmelblau#1206. + +IFACE="${1:-}" +ACTION="${2:-}" +TAG="himmelblau-nm-dispatcher" + +case "$IFACE" in + ""|lo|docker*|virbr*|br-*|veth*|vnet*|tun*|tap*|wg*|ppp*) + exit 0 + ;; +esac + +case "$ACTION" in + pre-down|down) + ;; + *) + exit 0 + ;; +esac + +if [ ! -d /run/systemd/system ] || ! command -v systemctl >/dev/null 2>&1; then + exit 0 +fi + +state="$(systemctl is-active himmelblaud.service 2>/dev/null || true)" +case "$state" in + active|failed) + ;; + *) + exit 0 + ;; +esac + +logger -t "$TAG" "Network $IFACE going $ACTION - restarting himmelblaud.service" +systemctl restart --no-block himmelblaud.service 2>&1 | logger -t "$TAG" + +exit 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/scripts/gen_servicefiles.py new/himmelblau-3.1.6+git0.102ee045/scripts/gen_servicefiles.py --- old/himmelblau-3.1.5+git0.445569d9/scripts/gen_servicefiles.py 2026-05-07 19:57:55.000000000 +0200 +++ new/himmelblau-3.1.6+git0.102ee045/scripts/gen_servicefiles.py 2026-05-28 23:36:26.000000000 +0200 @@ -232,7 +232,7 @@ {os.linesep.join(dirs_block)} {type_line} -{'LoadCredentialEncrypted=hsm-pin:/var/lib/himmelblaud/hsm-pin.enc' if supported('LoadCredentialEncrypted') else ''} +{'LoadCredentialEncrypted=hsm-pin:/var/lib/himmelblaud/hsm-pin-nopcr.enc' if supported('LoadCredentialEncrypted') else ''} {'Environment=HIMMELBLAU_HSM_PIN_PATH=%d/hsm-pin' if supported('LoadCredentialEncrypted') else ''} ExecStart=/usr/sbin/himmelblaud Restart=on-failure @@ -312,7 +312,7 @@ # Wants= (not Requires=) so we degrade gracefully on TPM-less systems. After=local-fs.target systemd-tpm2-setup.service Wants=systemd-tpm2-setup.service -ConditionPathExists=!/var/lib/private/himmelblaud/hsm-pin.enc +ConditionPathExists=!/var/lib/private/himmelblaud/hsm-pin-nopcr.enc [Service] Type=oneshot diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/src/common/src/constants.rs new/himmelblau-3.1.6+git0.102ee045/src/common/src/constants.rs --- old/himmelblau-3.1.5+git0.445569d9/src/common/src/constants.rs 2026-05-07 19:57:55.000000000 +0200 +++ new/himmelblau-3.1.6+git0.102ee045/src/common/src/constants.rs 2026-05-28 23:36:26.000000000 +0200 @@ -45,7 +45,7 @@ pub const DEFAULT_CACHE_TIMEOUT: u64 = 300; pub const DEFAULT_SELINUX: bool = true; pub const DEFAULT_HSM_PIN_PATH: &str = "/var/lib/himmelblaud/hsm-pin"; -pub const DEFAULT_HSM_PIN_PATH_ENC: &str = "/var/lib/himmelblaud/hsm-pin.enc"; +pub const DEFAULT_HSM_PIN_PATH_ENC: &str = "/var/lib/himmelblaud/hsm-pin-nopcr.enc"; pub const DEFAULT_HELLO_ENABLED: bool = true; pub const DEFAULT_ALLOW_REMOTE_HELLO: bool = false; pub const DEFAULT_SFA_FALLBACK_ENABLED: bool = false; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/src/common/src/db.rs new/himmelblau-3.1.6+git0.102ee045/src/common/src/db.rs --- old/himmelblau-3.1.5+git0.445569d9/src/common/src/db.rs 2026-05-07 19:57:55.000000000 +0200 +++ new/himmelblau-3.1.6+git0.102ee045/src/common/src/db.rs 2026-05-28 23:36:26.000000000 +0200 @@ -552,7 +552,9 @@ "DELETE FROM hsm_data_t WHERE key LIKE '%/hello' OR key LIKE '%/hello_decoupled' - OR key LIKE '%/hello_prt'", + OR key LIKE '%/hello_prt' + OR key LIKE '%/hello_refresh_token' + OR key LIKE '%/hello_totp'", [], ) .map_err(|e| self.sqlite_error("delete hello keys", &e))?; @@ -1088,7 +1090,7 @@ #[cfg(test)] mod tests { - use super::{Cache, CacheTxn, Db}; + use super::{Cache, CacheTxn, Db, KeyStoreTxn}; use crate::idprovider::interface::{GroupToken, Id, UserToken}; use kanidm_hsm_crypto::{provider::BoxedDynTpm, provider::Tpm, AuthValue}; @@ -1108,6 +1110,41 @@ } #[tokio::test] + async fn test_clear_hello_keys() { + sketching::test_init(); + let db = Db::new("").expect("failed to create."); + let mut dbtxn = db.write().await; + assert!(dbtxn.migrate().is_ok()); + + let hello_keys = [ + "[email protected]/hello", + "[email protected]/hello_decoupled", + "[email protected]/hello_prt", + "[email protected]/hello_refresh_token", + "[email protected]/hello_totp", + ]; + let unrelated_key = "[email protected]/not_hello"; + let value = "test value".to_string(); + + for key in hello_keys { + dbtxn.insert_tagged_hsm_key(key, &value).unwrap(); + } + dbtxn.insert_tagged_hsm_key(unrelated_key, &value).unwrap(); + + assert!(dbtxn.clear_hello_keys().is_ok()); + + for key in hello_keys { + let stored: Option<String> = dbtxn.get_tagged_hsm_key(key).unwrap(); + assert!(stored.is_none()); + } + + let stored: Option<String> = dbtxn.get_tagged_hsm_key(unrelated_key).unwrap(); + assert_eq!(stored, Some(value)); + + assert!(dbtxn.commit().is_ok()); + } + + #[tokio::test] async fn test_cache_db_account_basic() { sketching::test_init(); let db = Db::new("").expect("failed to create."); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/src/common/src/idprovider/common.rs new/himmelblau-3.1.6+git0.102ee045/src/common/src/idprovider/common.rs --- old/himmelblau-3.1.5+git0.445569d9/src/common/src/idprovider/common.rs 2026-05-07 19:57:55.000000000 +0200 +++ new/himmelblau-3.1.6+git0.102ee045/src/common/src/idprovider/common.rs 2026-05-28 23:36:26.000000000 +0200 @@ -942,6 +942,31 @@ error!("Failed to provision hello key: {:?}", e); IdpError::Tpm })?; + + let hello_prt_tag = $self.fetch_hello_prt_key_tag($account_id); + $keystore + .delete_tagged_hsm_key(&hello_prt_tag) + .map_err(|e| { + error!("Failed to delete hello PRT: {:?}", e); + IdpError::Tpm + })?; + + let hello_refresh_token_tag = $self.fetch_hello_refresh_token_key_tag($account_id); + $keystore + .delete_tagged_hsm_key(&hello_refresh_token_tag) + .map_err(|e| { + error!("Failed to delete hello refresh token: {:?}", e); + IdpError::Tpm + })?; + + let hello_totp_tag = $self.fetch_hello_totp_key_tag($account_id); + $keystore + .delete_tagged_hsm_key(&hello_totp_tag) + .map_err(|e| { + error!("Failed to delete hello TOTP: {:?}", e); + IdpError::Tpm + })?; + Ok(true) }}; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/src/common/src/idprovider/himmelblau.rs new/himmelblau-3.1.6+git0.102ee045/src/common/src/idprovider/himmelblau.rs --- old/himmelblau-3.1.5+git0.445569d9/src/common/src/idprovider/himmelblau.rs 2026-05-07 19:57:55.000000000 +0200 +++ new/himmelblau-3.1.6+git0.102ee045/src/common/src/idprovider/himmelblau.rs 2026-05-28 23:36:26.000000000 +0200 @@ -91,6 +91,12 @@ // AADSTS50125: PasswordResetRegistrationRequiredInterrupt const PASSWORD_RESET_REGISTRATION_REQUIRED: u32 = 50125; +fn is_unavailable_mfa_method_error(msg: &str, requested_method: &str) -> bool { + let expected_prefix = + format!("Requested MFA method '{requested_method}' not available. Available methods: "); + msg.starts_with(&expected_prefix) +} + /// Convert an MsalError to a short, user-friendly message for PAM display. /// This intentionally ignores the internal string contents of error variants /// to avoid leaking verbose or sensitive information to the user. @@ -820,6 +826,56 @@ bad_pin_counter: BadPinCounter::new(), }) } + + /// Initiate MFA flow with automatic fallback if the requested method is unavailable. + /// If a specific MFA method is requested but not available, this will automatically + /// retry with no method specified (allowing Azure to choose the default). + async fn initiate_mfa_flow_with_fallback( + &self, + account_id: &str, + password: Option<&str>, + auth_options: &[AuthOption], + auth_init: Option<himmelblau::auth::AuthInit>, + mfa_method: Option<String>, + ) -> Result<himmelblau::auth::MFAAuthContinue, MsalError> { + let result = self + .client + .lock() + .await + .initiate_acquire_token_by_mfa_flow_for_device_enrollment( + account_id, + password, + auth_options, + auth_init.clone(), + mfa_method.as_deref(), + ) + .await; + + match result { + Ok(flow) => Ok(flow), + Err(MsalError::GeneralFailure(ref msg)) + if mfa_method + .as_deref() + .map(|method| is_unavailable_mfa_method_error(msg, method)) + .unwrap_or(false) => + { + // Requested MFA method not available, fall back to default + warn!("{} Retrying with default MFA method.", msg); + self.client + .lock() + .await + .initiate_acquire_token_by_mfa_flow_for_device_enrollment( + account_id, + password, + auth_options, + auth_init, + None, // Retry without specifying MFA method + ) + .await + } + Err(e) => Err(e), + } + } } enum TokenOrObj { @@ -1721,16 +1777,14 @@ } Ok((AuthRequest::Password, AuthCredHandler::None)) } else { + let mfa_method = self.config.lock().await.get_mfa_method(); let flow = net_down_check!( - self.client - .lock() - .await - .initiate_acquire_token_by_mfa_flow_for_device_enrollment( + self.initiate_mfa_flow_with_fallback( account_id, None, &auth_options, Some(auth_init), - self.config.lock().await.get_mfa_method().as_deref() + mfa_method ) .await, Err(MsalError::PasswordRequired) => { @@ -2132,15 +2186,12 @@ } let flow = match self - .client - .lock() - .await - .initiate_acquire_token_by_mfa_flow_for_device_enrollment( + .initiate_mfa_flow_with_fallback( account_id, None, // No password — we only have the PIN &auth_options, None, // No auth_init — user already exists - mfa_method.as_deref(), + mfa_method ) .await { @@ -3391,16 +3442,14 @@ // from check_user_exists() was fetched without ForceMFA, so reusing // it would bypass the amr_values=ngcmfa parameter in the // /oauth2/authorize request. + let mfa_method = self.config.lock().await.get_mfa_method(); let flow = net_down_check!( - self.client - .lock() - .await - .initiate_acquire_token_by_mfa_flow_for_device_enrollment( + self.initiate_mfa_flow_with_fallback( account_id, Some(&cred), auth_options, None, - self.config.lock().await.get_mfa_method().as_deref() + mfa_method.clone() ) .await, Ok(flow) => flow, @@ -3411,15 +3460,12 @@ auth_options.push(AuthOption::ForceMFA); } net_down_check!( - self.client - .lock() - .await - .initiate_acquire_token_by_mfa_flow_for_device_enrollment( + self.initiate_mfa_flow_with_fallback( account_id, Some(&cred), auth_options, None, - self.config.lock().await.get_mfa_method().as_deref() + mfa_method ) .await, Ok(flow) => flow, @@ -3520,16 +3566,14 @@ } // Call the appropriate method based on whether mfa_method is configured + let mfa_method = self.config.lock().await.get_mfa_method(); let mresp = self - .client - .lock() - .await - .initiate_acquire_token_by_mfa_flow_for_device_enrollment( + .initiate_mfa_flow_with_fallback( account_id, Some(&cred), &opts, None, - self.config.lock().await.get_mfa_method().as_deref(), + mfa_method, ) .await; @@ -5094,3 +5138,25 @@ true } } + +#[cfg(test)] +mod tests { + use super::is_unavailable_mfa_method_error; + + #[test] + fn unavailable_mfa_method_error_requires_exact_requested_method() { + assert!(is_unavailable_mfa_method_error( + "Requested MFA method 'FidoKey' not available. Available methods: PhoneAppOTP", + "FidoKey" + )); + + assert!(!is_unavailable_mfa_method_error( + "Requested MFA method 'PhoneAppOTP' not available. Available methods: FidoKey", + "FidoKey" + )); + assert!(!is_unavailable_mfa_method_error( + "Stored MFA method 'FidoKey' is not available. Available methods: PhoneAppOTP", + "FidoKey" + )); + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/src/common/src/resolver.rs new/himmelblau-3.1.6+git0.102ee045/src/common/src/resolver.rs --- old/himmelblau-3.1.5+git0.445569d9/src/common/src/resolver.rs 2026-05-07 19:57:55.000000000 +0200 +++ new/himmelblau-3.1.6+git0.102ee045/src/common/src/resolver.rs 2026-05-28 23:36:26.000000000 +0200 @@ -774,11 +774,17 @@ .await; drop(hsm_lock); - dbtxn.commit().map_err(|_| ())?; - res.map_err(|e| { - trace!("change_auth_token error -> {:?}", e); - }) + match res { + Ok(res) => { + dbtxn.commit().map_err(|_| ())?; + Ok(res) + } + Err(e) => { + trace!("change_auth_token error -> {:?}", e); + Err(()) + } + } } pub async fn offline_break_glass(&self, ttl: Option<u64>) -> Result<(), ()> { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/src/daemon/Cargo.toml new/himmelblau-3.1.6+git0.102ee045/src/daemon/Cargo.toml --- old/himmelblau-3.1.5+git0.445569d9/src/daemon/Cargo.toml 2026-05-07 19:57:55.000000000 +0200 +++ new/himmelblau-3.1.6+git0.102ee045/src/daemon/Cargo.toml 2026-05-28 23:36:26.000000000 +0200 @@ -66,6 +66,7 @@ ["../../platform/debian/himmelblaud-tasks.service", "usr/lib/systemd/system/", "644"], ["../../platform/debian/himmelblaud.service", "usr/lib/systemd/system/", "644"], ["../../platform/debian/himmelblau-hsm-pin-init.service", "usr/lib/systemd/system/", "644"], + ["../../platform/common/NetworkManager/dispatcher.d/99-himmelblau-restart-on-down", "usr/lib/NetworkManager/dispatcher.d/", "755"], ["scripts/himmelblau-init-hsm-pin", "usr/libexec/", "755"], ["target/release/himmelblaud", "usr/sbin/", "755"], ["target/release/himmelblaud_tasks", "usr/sbin/", "755"], @@ -90,6 +91,7 @@ { source = "../../platform/opensuse/himmelblaud-tasks.service", dest = "/usr/lib/systemd/system/", mode = "644" }, { source = "../../platform/opensuse/himmelblaud.service", dest = "/usr/lib/systemd/system/", mode = "644" }, { source = "../../platform/opensuse/himmelblau-hsm-pin-init.service", dest = "/usr/lib/systemd/system/", mode = "644" }, + { source = "../../platform/common/NetworkManager/dispatcher.d/99-himmelblau-restart-on-down", dest = "/usr/lib/NetworkManager/dispatcher.d/", mode = "755" }, { source = "scripts/himmelblau-init-hsm-pin", dest = "/usr/libexec/", mode = "755" }, { source = "target/release/himmelblaud", dest = "/usr/sbin/", mode = "755" }, { source = "target/release/himmelblaud_tasks", dest = "/usr/sbin/", mode = "755" }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/src/daemon/scripts/himmelblau-init-hsm-pin new/himmelblau-3.1.6+git0.102ee045/src/daemon/scripts/himmelblau-init-hsm-pin --- old/himmelblau-3.1.5+git0.445569d9/src/daemon/scripts/himmelblau-init-hsm-pin 2026-05-07 19:57:55.000000000 +0200 +++ new/himmelblau-3.1.6+git0.102ee045/src/daemon/scripts/himmelblau-init-hsm-pin 2026-05-28 23:36:26.000000000 +0200 @@ -6,7 +6,8 @@ set -e LEGACY=/var/lib/private/himmelblaud/hsm-pin -CRED=/var/lib/private/himmelblaud/hsm-pin.enc +LEGACY1=/var/lib/private/himmelblaud/hsm-pin.enc +CRED=/var/lib/private/himmelblaud/hsm-pin-nopcr.enc SRK_HANDLE=0x81000001 gen_pin_hex() { @@ -163,6 +164,9 @@ if [ -f "$LEGACY" ]; then echo "Migrating existing HSM-PIN to encrypted credential" HSM_PIN=$(cat "$LEGACY") +elif [ -f "$LEGACY1" ]; then + echo "Migrating existing HSM-PIN to no PCR lock" + HSM_PIN=$(systemd-creds decrypt --name=hsm-pin "$LEGACY1") else echo "Generating new HSM-PIN" HSM_PIN=$(gen_pin_hex) @@ -173,13 +177,13 @@ # auto — systemd picks the best available (may silently omit TPM if SRK absent) if [ -e /dev/tpmrm0 ] || [ -e /dev/tpm0 ]; then if srk_is_provisioned; then - KEY_ARG="--with-key=host+tpm2" + KEY_ARG="--with-key=host+tpm2 --tpm2-pcrs=" else echo "WARNING: TPM present but SRK provisioning failed. HSM PIN will use host key only." - KEY_ARG="--with-key=auto" + KEY_ARG="--with-key=auto --tpm2-pcrs=" fi else - KEY_ARG="--with-key=auto" + KEY_ARG="--with-key=auto --tpm2-pcrs=" fi # Encrypt the PIN @@ -187,6 +191,7 @@ --tpm2-device=auto - "$CRED"; then echo "HSM PIN credential created successfully" rm -f "$LEGACY" 2>/dev/null || true + rm -f "$LEGACY1" 2>/dev/null || true exit 0 else echo "ERROR: Failed to create HSM PIN credential" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/src/overrides/ldap3_proto/0.6.2/Cargo.toml new/himmelblau-3.1.6+git0.102ee045/src/overrides/ldap3_proto/0.6.2/Cargo.toml --- old/himmelblau-3.1.5+git0.445569d9/src/overrides/ldap3_proto/0.6.2/Cargo.toml 1970-01-01 01:00:00.000000000 +0100 +++ new/himmelblau-3.1.6+git0.102ee045/src/overrides/ldap3_proto/0.6.2/Cargo.toml 2026-05-28 23:36:26.000000000 +0200 @@ -0,0 +1,12 @@ +[package] +name = "ldap3_proto" +version = "0.6.2" +authors.workspace = true +rust-version.workspace = true +edition.workspace = true +license.workspace = true +homepage.workspace = true +repository.workspace = true + +[dependencies] +ldap3_proto = { version = "^0.7" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/src/overrides/ldap3_proto/0.6.2/src/lib.rs new/himmelblau-3.1.6+git0.102ee045/src/overrides/ldap3_proto/0.6.2/src/lib.rs --- old/himmelblau-3.1.5+git0.445569d9/src/overrides/ldap3_proto/0.6.2/src/lib.rs 1970-01-01 01:00:00.000000000 +0100 +++ new/himmelblau-3.1.6+git0.102ee045/src/overrides/ldap3_proto/0.6.2/src/lib.rs 2026-05-28 23:36:26.000000000 +0200 @@ -0,0 +1 @@ +pub use ldap3_proto::*; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/src/qr-greeter/src/[email protected]/metadata.json new/himmelblau-3.1.6+git0.102ee045/src/qr-greeter/src/[email protected]/metadata.json --- old/himmelblau-3.1.5+git0.445569d9/src/qr-greeter/src/[email protected]/metadata.json 2026-05-07 19:57:55.000000000 +0200 +++ new/himmelblau-3.1.6+git0.102ee045/src/qr-greeter/src/[email protected]/metadata.json 2026-05-28 23:36:26.000000000 +0200 @@ -3,7 +3,7 @@ "name": "Himmelblau QR Greeter", "description": "Adds a QR code to authentication prompts when a URL is detected.", "version": 1, - "shell-version": ["45", "46", "47", "48", "49"], + "shell-version": ["45", "46", "47", "48", "49", "50"], "session-modes": ["gdm", "unlock-dialog"], "donations": { "opencollective" : "himmelblau" } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/src/sshd-config/Cargo.toml new/himmelblau-3.1.6+git0.102ee045/src/sshd-config/Cargo.toml --- old/himmelblau-3.1.5+git0.445569d9/src/sshd-config/Cargo.toml 2026-05-07 19:57:55.000000000 +0200 +++ new/himmelblau-3.1.6+git0.102ee045/src/sshd-config/Cargo.toml 2026-05-28 23:36:26.000000000 +0200 @@ -16,14 +16,14 @@ name = "himmelblau-sshd-config" depends = ["openssh-server"] assets = [ - ["../../platform/debian/sshd_config", "etc/ssh/sshd_config.d/himmelblau.conf", "644"], + ["../../platform/debian/sshd_config", "etc/ssh/sshd_config.d/30-himmelblau.conf", "644"], ] maintainer-scripts = "scripts" [package.metadata.generate-rpm] name = "himmelblau-sshd-config" assets = [ - { source = "../../platform/el/sshd_config", dest = "/etc/ssh/sshd_config.d/himmelblau.conf", mode = "644" }, + { source = "../../platform/el/sshd_config", dest = "/etc/ssh/sshd_config.d/30-himmelblau.conf", mode = "644" }, ] post_install_script = "scripts/postinst" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/supply-chain/audits.toml new/himmelblau-3.1.6+git0.102ee045/supply-chain/audits.toml --- old/himmelblau-3.1.5+git0.445569d9/supply-chain/audits.toml 2026-05-07 19:57:55.000000000 +0200 +++ new/himmelblau-3.1.6+git0.102ee045/supply-chain/audits.toml 2026-05-28 23:36:26.000000000 +0200 @@ -674,6 +674,11 @@ criteria = "safe-to-deploy" delta = "0.14.3 -> 0.14.5" +[[audits.tonic]] +who = "David Mulder <[email protected]>" +criteria = "safe-to-deploy" +delta = "0.14.5 -> 0.14.6" + [[audits.tonic-prost]] who = "David Mulder <[email protected]>" criteria = "safe-to-deploy" @@ -1279,7 +1284,7 @@ [[trusted.group]] criteria = "safe-to-deploy" -user-id = 1244 # ebfull +user-id = 1244 # Sean Bowe (ebfull) start = "2019-10-08" end = "2026-09-11" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/supply-chain/config.toml new/himmelblau-3.1.6+git0.102ee045/supply-chain/config.toml --- old/himmelblau-3.1.5+git0.445569d9/supply-chain/config.toml 2026-05-07 19:57:55.000000000 +0200 +++ new/himmelblau-3.1.6+git0.102ee045/supply-chain/config.toml 2026-05-28 23:36:26.000000000 +0200 @@ -34,6 +34,9 @@ [policy.kanidm_build_profiles] audit-as-crates-io = true +[policy."ldap3_proto:0.6.2"] +audit-as-crates-io = true + [policy.paste] audit-as-crates-io = true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/himmelblau-3.1.5+git0.445569d9/supply-chain/imports.lock new/himmelblau-3.1.6+git0.102ee045/supply-chain/imports.lock --- old/himmelblau-3.1.5+git0.445569d9/supply-chain/imports.lock 2026-05-07 19:57:55.000000000 +0200 +++ new/himmelblau-3.1.6+git0.102ee045/supply-chain/imports.lock 2026-05-28 23:36:26.000000000 +0200 @@ -343,6 +343,7 @@ when = "2022-05-04" user-id = 1244 user-login = "ebfull" +user-name = "Sean Bowe" [[publisher.h2]] version = "0.4.10" @@ -481,6 +482,13 @@ user-login = "Firstyear" user-name = "Firstyear" +[[publisher.ldap3_proto]] +version = "0.7.1" +when = "2026-04-30" +user-id = 31100 +user-login = "Firstyear" +user-name = "Firstyear" + [[publisher.libc]] version = "0.2.186" when = "2026-04-23" @@ -495,8 +503,8 @@ user-name = "Nick Fitzgerald" [[publisher.libhimmelblau]] -version = "0.8.19" -when = "2026-05-06" +version = "0.8.20" +when = "2026-05-28" user-id = 247655 user-login = "dmulder" user-name = "David Mulder" @@ -3146,6 +3154,11 @@ criteria = "safe-to-deploy" delta = "0.10.77 -> 0.10.79" +[[audits.himmelblau.audits.openssl]] +who = "David Mulder <[email protected]>" +criteria = "safe-to-deploy" +delta = "0.10.79 -> 0.10.80" + [[audits.himmelblau.audits.openssl-sys]] who = "David Mulder <[email protected]>" criteria = "safe-to-deploy" @@ -3161,6 +3174,11 @@ criteria = "safe-to-deploy" delta = "0.9.113 -> 0.9.115" +[[audits.himmelblau.audits.openssl-sys]] +who = "David Mulder <[email protected]>" +criteria = "safe-to-deploy" +delta = "0.9.115 -> 0.9.116" + [[audits.himmelblau.audits.opentelemetry-otlp]] who = "David Mulder <[email protected]>" criteria = "safe-to-deploy" @@ -3563,7 +3581,7 @@ criteria = "safe-to-deploy" user-id = 1139 # Manish Goregaokar (Manishearth) start = "2019-07-25" -end = "2026-02-01" +end = "2027-04-23" notes = "All code written or reviewed by Manish" aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" ++++++ vendor.tar.zst ++++++ /work/SRC/openSUSE:Factory/himmelblau/vendor.tar.zst /work/SRC/openSUSE:Factory/.himmelblau.new.1981/vendor.tar.zst differ: char 7, line 1
