Skip to content

Commit e69a18e

Browse files
committed
add Secret<T> to RegistryCredentialConfig
1 parent 9e732c6 commit e69a18e

File tree

3 files changed

+35
-24
lines changed

3 files changed

+35
-24
lines changed

src/cargo/ops/registry.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use crate::ops;
3030
use crate::ops::Packages;
3131
use crate::sources::{RegistrySource, SourceConfigMap, CRATES_IO_DOMAIN, CRATES_IO_REGISTRY};
3232
use crate::util::auth::{
33-
paserk_public_from_paserk_secret, {self, AuthorizationError},
33+
paserk_public_from_paserk_secret, Secret, {self, AuthorizationError},
3434
};
3535
use crate::util::config::{Config, SslVersionConfig, SslVersionConfigRange};
3636
use crate::util::errors::CargoResult;
@@ -45,11 +45,11 @@ use crate::{drop_print, drop_println, version};
4545
pub enum RegistryCredentialConfig {
4646
None,
4747
/// The authentication token.
48-
Token(String),
48+
Token(Secret<String>),
4949
/// Process used for fetching a token.
5050
Process((PathBuf, Vec<String>)),
5151
/// Secret Key and subject for Asymmetric tokens.
52-
AsymmetricKey((String, Option<String>)),
52+
AsymmetricKey((Secret<String>, Option<String>)),
5353
}
5454

5555
impl RegistryCredentialConfig {
@@ -71,9 +71,9 @@ impl RegistryCredentialConfig {
7171
pub fn is_asymmetric_key(&self) -> bool {
7272
matches!(self, Self::AsymmetricKey(..))
7373
}
74-
pub fn as_token(&self) -> Option<&str> {
74+
pub fn as_token(&self) -> Option<Secret<&str>> {
7575
if let Self::Token(v) = self {
76-
Some(&*v)
76+
Some(v.as_deref())
7777
} else {
7878
None
7979
}
@@ -85,7 +85,7 @@ impl RegistryCredentialConfig {
8585
None
8686
}
8787
}
88-
pub fn as_asymmetric_key(&self) -> Option<&(String, Option<String>)> {
88+
pub fn as_asymmetric_key(&self) -> Option<&(Secret<String>, Option<String>)> {
8989
if let Self::AsymmetricKey(v) = self {
9090
Some(v)
9191
} else {
@@ -830,13 +830,13 @@ pub fn registry_login(
830830
}
831831
_ => (None, None),
832832
};
833-
let secret_key: String;
833+
let secret_key: Secret<String>;
834834
if generate_keypair {
835835
assert!(!secret_key_required);
836836
let kp = AsymmetricKeyPair::<pasetors::version3::V3>::generate().unwrap();
837837
let mut key = String::new();
838838
FormatAsPaserk::fmt(&kp.secret, &mut key).unwrap();
839-
secret_key = key;
839+
secret_key = Secret::from(key);
840840
} else if secret_key_required {
841841
assert!(!generate_keypair);
842842
drop_println!(config, "please paste the API secret key below");
@@ -846,13 +846,13 @@ pub fn registry_login(
846846
.lock()
847847
.read_line(&mut line)
848848
.with_context(|| "failed to read stdin")?;
849-
secret_key = line.trim().to_string();
849+
secret_key = Secret::from(line.trim().to_string());
850850
} else {
851851
secret_key = old_secret_key
852852
.cloned()
853853
.ok_or_else(|| anyhow!("need a secret_key to set a key_subject"))?;
854854
}
855-
if let Some(p) = paserk_public_from_paserk_secret(&secret_key) {
855+
if let Some(p) = paserk_public_from_paserk_secret(secret_key.as_deref()) {
856856
drop_println!(config, "{}", &p);
857857
} else {
858858
bail!("not a validly formated PASERK secret key");
@@ -866,7 +866,7 @@ pub fn registry_login(
866866
));
867867
} else {
868868
new_token = RegistryCredentialConfig::Token(match token {
869-
Some(token) => token.to_string(),
869+
Some(token) => Secret::from(token.to_string()),
870870
None => {
871871
if let Some(login_url) = login_url {
872872
drop_println!(
@@ -890,7 +890,7 @@ pub fn registry_login(
890890
.with_context(|| "failed to read stdin")?;
891891
// Automatically remove `cargo login` from an inputted token to
892892
// allow direct pastes from `registry.host()`/me.
893-
line.replace("cargo login", "").trim().to_string()
893+
Secret::from(line.replace("cargo login", "").trim().to_string())
894894
}
895895
});
896896

src/cargo/util/auth.rs

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -281,13 +281,13 @@ fn registry_credential_config_inner(
281281
registry
282282
));
283283
}
284-
(Some(token), _, _, _) => RegistryCredentialConfig::Token(token),
284+
(Some(token), _, _, _) => RegistryCredentialConfig::Token(Secret::from(token)),
285285
(_, Some(process), _, _) => RegistryCredentialConfig::Process((
286286
process.path.resolve_program(config),
287287
process.args,
288288
)),
289289
(None, None, Some(key), subject) => {
290-
RegistryCredentialConfig::AsymmetricKey((key, subject))
290+
RegistryCredentialConfig::AsymmetricKey((Secret::from(key), subject))
291291
}
292292
(None, None, None, _) => {
293293
if !is_crates_io {
@@ -432,15 +432,19 @@ fn auth_token_optional(
432432
let credential = registry_credential_config(config, sid)?;
433433
let (independent_of_endpoint, token) = match credential {
434434
RegistryCredentialConfig::None => return Ok(None),
435-
RegistryCredentialConfig::Token(config_token) => (true, config_token.to_string()),
435+
RegistryCredentialConfig::Token(config_token) => (true, config_token.expose()),
436436
RegistryCredentialConfig::Process(process) => {
437437
// todo: PASETO with process
438438
run_command(config, &process, sid, Action::Get)?.unwrap()
439439
}
440440
RegistryCredentialConfig::AsymmetricKey((secret_key, secret_key_subject)) => {
441-
let secret: AsymmetricSecretKey<pasetors::version3::V3> =
442-
secret_key.as_str().try_into()?;
443-
let public: AsymmetricPublicKey<pasetors::version3::V3> = (&secret).try_into()?;
441+
let secret: Secret<AsymmetricSecretKey<pasetors::version3::V3>> =
442+
secret_key.map(|key| key.as_str().try_into()).transpose()?;
443+
let public: AsymmetricPublicKey<pasetors::version3::V3> = secret
444+
.as_ref()
445+
.map(|key| key.try_into())
446+
.transpose()?
447+
.expose();
444448
let kip: pasetors::paserk::Id = (&public).try_into()?;
445449
let iat = OffsetDateTime::now_utc();
446450

@@ -493,7 +497,7 @@ fn auth_token_optional(
493497
(
494498
false,
495499
pasetors::version3::PublicToken::sign(
496-
&secret,
500+
&secret.expose(),
497501
serde_json::to_string(&message)
498502
.expect("cannot serialize")
499503
.as_bytes(),
@@ -598,6 +602,7 @@ pub fn login(config: &Config, sid: &SourceId, token: RegistryCredentialConfig) -
598602
let token = token
599603
.as_token()
600604
.expect("credential_process cannot use login with a secret_key")
605+
.expose()
601606
.to_owned();
602607
run_command(config, &process, sid, Action::Store(token))?;
603608
}
@@ -609,9 +614,15 @@ pub fn login(config: &Config, sid: &SourceId, token: RegistryCredentialConfig) -
609614
}
610615

611616
/// Checks that a secret key is valid, and returns the associated public key in Paserk format.
612-
pub(crate) fn paserk_public_from_paserk_secret(secret_key: &str) -> Option<String> {
613-
let secret: AsymmetricSecretKey<pasetors::version3::V3> = secret_key.try_into().ok()?;
614-
let public: AsymmetricPublicKey<pasetors::version3::V3> = (&secret).try_into().ok()?;
617+
pub(crate) fn paserk_public_from_paserk_secret(secret_key: Secret<&str>) -> Option<String> {
618+
let secret: Secret<AsymmetricSecretKey<pasetors::version3::V3>> =
619+
secret_key.map(|key| key.try_into()).transpose().ok()?;
620+
let public: AsymmetricPublicKey<pasetors::version3::V3> = secret
621+
.as_ref()
622+
.map(|key| key.try_into())
623+
.transpose()
624+
.ok()?
625+
.expose();
615626
let mut paserk_pub_key = String::new();
616627
FormatAsPaserk::fmt(&public, &mut paserk_pub_key).unwrap();
617628
Some(paserk_pub_key)

src/cargo/util/config/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2179,7 +2179,7 @@ pub fn save_credentials(
21792179
// login with token
21802180

21812181
let key = "token".to_string();
2182-
let value = ConfigValue::String(token, path_def.clone());
2182+
let value = ConfigValue::String(token.expose(), path_def.clone());
21832183
let map = HashMap::from([(key, value)]);
21842184
let table = CV::Table(map, path_def.clone());
21852185

@@ -2194,7 +2194,7 @@ pub fn save_credentials(
21942194
// login with key
21952195

21962196
let key = "secret-key".to_string();
2197-
let value = ConfigValue::String(secret_key, path_def.clone());
2197+
let value = ConfigValue::String(secret_key.expose(), path_def.clone());
21982198
let mut map = HashMap::from([(key, value)]);
21992199
if let Some(key_subject) = key_subject {
22002200
let key = "secret-key-subject".to_string();

0 commit comments

Comments
 (0)