1
0
mirror of https://github.com/Llewellynvdm/starship.git synced 2024-11-28 07:46:28 +00:00

fix(aws): enable when using .aws/credentials (#4604)

This commit is contained in:
Chris Rose 2022-11-27 06:06:05 -08:00 committed by GitHub
parent 6e15c00238
commit c8ac8777a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -63,7 +63,7 @@ fn get_creds<'a>(context: &Context, config: &'a OnceCell<Option<Ini>>) -> Option
// Get the section for a given profile name in the config file. // Get the section for a given profile name in the config file.
fn get_profile_config<'a>( fn get_profile_config<'a>(
config: &'a Ini, config: &'a Ini,
profile: &Option<Profile>, profile: Option<&Profile>,
) -> Option<&'a ini::Properties> { ) -> Option<&'a ini::Properties> {
match profile { match profile {
Some(profile) => config.section(Some(format!("profile {profile}"))), Some(profile) => config.section(Some(format!("profile {profile}"))),
@ -74,11 +74,11 @@ fn get_profile_config<'a>(
// Get the section for a given profile name in the credentials file. // Get the section for a given profile name in the credentials file.
fn get_profile_creds<'a>( fn get_profile_creds<'a>(
config: &'a Ini, config: &'a Ini,
profile: &Option<Profile>, profile: Option<&Profile>,
) -> Option<&'a ini::Properties> { ) -> Option<&'a ini::Properties> {
match profile { match profile {
None => config.section(Some("default")), None => config.section(Some("default")),
_ => config.section(profile.as_ref()), _ => config.section(profile),
} }
} }
@ -88,7 +88,7 @@ fn get_aws_region_from_config(
aws_config: &AwsConfigFile, aws_config: &AwsConfigFile,
) -> Option<Region> { ) -> Option<Region> {
let config = get_config(context, aws_config)?; let config = get_config(context, aws_config)?;
let section = get_profile_config(config, aws_profile)?; let section = get_profile_config(config, aws_profile.as_ref())?;
section.get("region").map(std::borrow::ToOwned::to_owned) section.get("region").map(std::borrow::ToOwned::to_owned)
} }
@ -118,7 +118,7 @@ fn get_aws_profile_and_region(
fn get_credentials_duration( fn get_credentials_duration(
context: &Context, context: &Context,
aws_profile: &Option<String>, aws_profile: Option<&Profile>,
aws_creds: &AwsCredsFile, aws_creds: &AwsCredsFile,
) -> Option<i64> { ) -> Option<i64> {
let expiration_env_vars = ["AWS_SESSION_EXPIRATION", "AWSUME_EXPIRATION"]; let expiration_env_vars = ["AWS_SESSION_EXPIRATION", "AWSUME_EXPIRATION"];
@ -150,18 +150,35 @@ fn alias_name(name: Option<String>, aliases: &HashMap<String, &str>) -> Option<S
fn has_credential_process_or_sso( fn has_credential_process_or_sso(
context: &Context, context: &Context,
aws_profile: &Option<Profile>, aws_profile: Option<&Profile>,
aws_config: &AwsConfigFile, aws_config: &AwsConfigFile,
aws_creds: &AwsCredsFile,
) -> Option<bool> { ) -> Option<bool> {
let config = get_config(context, aws_config)?; let config = get_config(context, aws_config)?;
let credentials = get_creds(context, aws_creds);
let section = get_profile_config(config, aws_profile)?; let empty_section = ini::Properties::new();
Some(section.contains_key("credential_process") || section.contains_key("sso_start_url")) // We use the aws_profile here because `get_profile_config()` treats None
// as "special" and falls back to the "[default]"; otherwise this tries
// to look up "[profile default]" which doesn't exist
let config_section = get_profile_config(config, aws_profile).or(Some(&empty_section))?;
let credential_section = match credentials {
Some(credentials) => get_profile_creds(credentials, aws_profile),
None => None,
};
Some(
config_section.contains_key("credential_process")
|| config_section.contains_key("sso_start_url")
|| credential_section?.contains_key("credential_process")
|| credential_section?.contains_key("sso_start_url"),
)
} }
fn has_defined_credentials( fn has_defined_credentials(
context: &Context, context: &Context,
aws_profile: &Option<Profile>, aws_profile: Option<&Profile>,
aws_creds: &AwsCredsFile, aws_creds: &AwsCredsFile,
) -> Option<bool> { ) -> Option<bool> {
let valid_env_vars = [ let valid_env_vars = [
@ -197,14 +214,15 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
// only display if credential_process is defined or has valid credentials // only display if credential_process is defined or has valid credentials
if !config.force_display if !config.force_display
&& !has_credential_process_or_sso(context, &aws_profile, &aws_config).unwrap_or(false) && !has_credential_process_or_sso(context, aws_profile.as_ref(), &aws_config, &aws_creds)
&& !has_defined_credentials(context, &aws_profile, &aws_creds).unwrap_or(false) .unwrap_or(false)
&& !has_defined_credentials(context, aws_profile.as_ref(), &aws_creds).unwrap_or(false)
{ {
return None; return None;
} }
let duration = { let duration = {
get_credentials_duration(context, &aws_profile, &aws_creds).map(|duration| { get_credentials_duration(context, aws_profile.as_ref(), &aws_creds).map(|duration| {
if duration > 0 { if duration > 0 {
render_time((duration * 1000) as u128, false) render_time((duration * 1000) as u128, false)
} else { } else {
@ -899,6 +917,44 @@ credential_process = /opt/bin/awscreds-retriever
dir.close() dir.close()
} }
#[test]
fn credential_process_set_in_credentials() -> io::Result<()> {
let dir = tempfile::tempdir()?;
let config_path = dir.path().join("config");
let credential_path = dir.path().join("credentials");
let mut file = File::create(&config_path)?;
file.write_all(
"[default]
region = ap-northeast-2
"
.as_bytes(),
)?;
let mut file = File::create(&credential_path)?;
file.write_all(
"[default]
credential_process = /opt/bin/awscreds-for-tests
"
.as_bytes(),
)?;
let actual = ModuleRenderer::new("aws")
.env("AWS_CONFIG_FILE", config_path.to_string_lossy().as_ref())
.env(
"AWS_CREDENTIALS_FILE",
credential_path.to_string_lossy().as_ref(),
)
.collect();
let expected = Some(format!(
"on {}",
Color::Yellow.bold().paint("☁️ (ap-northeast-2) ")
));
assert_eq!(expected, actual);
dir.close()
}
#[test] #[test]
fn sso_set() -> io::Result<()> { fn sso_set() -> io::Result<()> {
let dir = tempfile::tempdir()?; let dir = tempfile::tempdir()?;