Skip to content

Commit e6b4de2

Browse files
committed
fix: use existing passphrase when reusing ci-release-device key in setup/rotate
1 parent 98673da commit e6b4de2

2 files changed

Lines changed: 31 additions & 16 deletions

File tree

crates/auths-cli/src/commands/ci/rotate.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use auths_core::config::EnvironmentConfig;
88
use auths_core::signing::PassphraseProvider;
99
use auths_core::storage::keychain::{KeyAlias, get_platform_keychain};
1010
use auths_crypto::did_key::ed25519_pubkey_to_did_key;
11-
use auths_sdk::domains::ci::bundle::{build_identity_bundle, generate_ci_passphrase};
11+
use auths_sdk::domains::ci::bundle::build_identity_bundle;
1212
use auths_sdk::domains::ci::forge::Forge;
1313
use auths_sdk::domains::ci::token::CiToken;
1414
use ring::signature::KeyPair;
@@ -41,7 +41,7 @@ const CI_DEVICE_ALIAS: &str = "ci-release-device";
4141
pub fn run_rotate(
4242
repo_override: Option<String>,
4343
max_age_secs: u64,
44-
auto_passphrase: bool,
44+
_auto_passphrase: bool,
4545
_passphrase_provider: Arc<dyn PassphraseProvider + Send + Sync>,
4646
_env_config: &EnvironmentConfig,
4747
repo_path: &Path,
@@ -73,20 +73,20 @@ pub fn run_rotate(
7373
.ok_or_else(|| anyhow!("No keys found in keychain"))?
7474
.to_string();
7575

76-
// Handle passphrase
77-
let ci_pass = if auto_passphrase {
78-
let pass = generate_ci_passphrase();
79-
println!("\x1b[2mAuto-generated new CI passphrase (64-char hex).\x1b[0m");
80-
Zeroizing::new(pass)
81-
} else {
82-
let pass = rpassword::prompt_password("New CI device passphrase: ")
83-
.context("Failed to read passphrase")?;
84-
let confirm = rpassword::prompt_password("Confirm passphrase: ")
85-
.context("Failed to read confirmation")?;
86-
if pass != confirm {
87-
return Err(anyhow!("Passphrases do not match"));
76+
// Handle passphrase — rotate always reuses the existing key,
77+
// so we need the ORIGINAL passphrase to decrypt it.
78+
let ci_pass = {
79+
#[allow(clippy::disallowed_methods)]
80+
let env_pass = std::env::var("AUTHS_PASSPHRASE").ok();
81+
if let Some(pass) = env_pass {
82+
println!("\x1b[2mUsing passphrase from AUTHS_PASSPHRASE env var.\x1b[0m");
83+
Zeroizing::new(pass)
84+
} else {
85+
let pass =
86+
rpassword::prompt_password("Passphrase for existing ci-release-device key: ")
87+
.context("Failed to read passphrase")?;
88+
Zeroizing::new(pass)
8889
}
89-
Zeroizing::new(pass)
9090
};
9191

9292
// Regenerate file keychain

crates/auths-cli/src/commands/ci/setup.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,22 @@ pub fn run_setup(
8787
}
8888

8989
// Step 4: Handle passphrase
90-
let ci_pass = if auto_passphrase {
90+
// When reusing an existing key, we need the ORIGINAL passphrase to decrypt it.
91+
// Auto-generate is only valid for new keys.
92+
let ci_pass = if reuse {
93+
// Existing key — need the original passphrase
94+
#[allow(clippy::disallowed_methods)]
95+
let env_pass = std::env::var("AUTHS_PASSPHRASE").ok();
96+
if let Some(pass) = env_pass {
97+
println!("\x1b[2mUsing passphrase from AUTHS_PASSPHRASE env var.\x1b[0m");
98+
Zeroizing::new(pass)
99+
} else {
100+
let pass =
101+
rpassword::prompt_password("Passphrase for existing ci-release-device key: ")
102+
.context("Failed to read passphrase")?;
103+
Zeroizing::new(pass)
104+
}
105+
} else if auto_passphrase {
91106
let pass = generate_ci_passphrase();
92107
println!("\x1b[2mAuto-generated CI passphrase (64-char hex).\x1b[0m");
93108
Zeroizing::new(pass)

0 commit comments

Comments
 (0)