use winterbaume_core::default_account_id;
use crate::types::{AssumedRole, CallerIdentity};
#[derive(Debug, thiserror::Error)]
pub enum StsError {
#[error("Missing 'Action' parameter")]
MissingAction,
#[error("Could not find operation {action} for STS")]
InvalidAction { action: String },
#[error("{0}")]
InvalidParameterValue(String),
#[error("Missing '{0}'")]
MissingParameter(&'static str),
}
#[derive(Debug, Default)]
pub struct StsState {
pub assumed_roles: Vec<AssumedRole>,
}
impl StsState {
pub fn find_assumed_role_by_access_key(&self, access_key_id: &str) -> Option<&AssumedRole> {
self.assumed_roles
.iter()
.find(|r| r.access_key_id == access_key_id)
}
pub fn get_caller_identity(&self, _access_key_id: &str) -> CallerIdentity {
if let Some(role) = self.find_assumed_role_by_access_key(_access_key_id) {
return CallerIdentity {
user_id: role.user_id(),
account: role.account_id.clone(),
arn: role.arn(),
};
}
CallerIdentity {
user_id: "AKIAIOSFODNN7EXAMPLE".to_string(),
account: default_account_id().to_string(),
arn: format!(
"arn:aws:sts::{account_id}:user/moto",
account_id = default_account_id()
),
}
}
}