Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .ci/cargo-ci/src/tasks/coverage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ pub fn coverage() -> anyhow::Result<()> {
let files = fs::read_dir(&out_dir)?
.filter_map(|entry| {
entry
.inspect_err(|cause| warn!("Ignoring coverage file which could not be read: {cause}"))
.inspect_err(|source| warn!("Ignoring coverage file which could not be read: {source}"))
.ok()
})
.filter(|entry| entry.path().is_file());
Expand Down
2 changes: 1 addition & 1 deletion .ci/deploy/opendut-theo/src/commands/vagrant.rs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ impl VagrantCli {
pub fn running_in_opendut_vm() -> bool {
let hostname = Command::new("hostname")
.output()
.unwrap_or_else(|cause| panic!("Failed to execute hostname. {cause}"));
.unwrap_or_else(|source| panic!("Failed to execute hostname. {source}"));
let hostname = String::from_utf8(hostname.stdout).expect("Could not determine hostname!");
hostname.trim().contains(OPENDUT_VM_NAME)
}
2 changes: 1 addition & 1 deletion .ci/deploy/opendut-theo/src/core/docker/command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ impl DockerCommand {
let command_status = self
.command
.status()
.map_err(|cause| TheoError::DockerCommandFailed(format!("{error_message}. Cause: {cause}")))?;
.map_err(|source| TheoError::DockerCommandFailed(format!("{error_message}. Cause: {source}")))?;

if command_status.success() {
Ok(command_status.code().unwrap_or(1))
Expand Down
24 changes: 12 additions & 12 deletions opendut-auth/src/confidential/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,13 +77,13 @@ pub type ConfidentialClientRef = Arc<ConfidentialClient>;
impl ConfidentialClient {
pub async fn from_settings(settings: &Config) -> Result<Option<ConfidentialClientRef>, ConfidentialClientError> {
let config_enabled = OidcConfigEnabled::from_settings(settings)
.map_err(|cause| ConfidentialClientError::Configuration { message: String::from("Failed to load OIDC configuration"), cause: cause.into() })?;
.map_err(|source| ConfidentialClientError::Configuration { message: String::from("Failed to load OIDC configuration"), source: source.into() })?;

match config_enabled {
OidcConfigEnabled::Yes(config) => {
trace!("OIDC configuration loaded: client_id='{}', issuer_url='{}'", config.get_client_id().as_str(), config.get_issuer().value().as_str());
let reqwest_client = reqwest_client::oidc::create_from_config(settings)
.map_err(|cause| ConfidentialClientError::Configuration { message: String::from("Failed to create reqwest client."), cause: cause.into() })?;
.map_err(|source| ConfidentialClientError::Configuration { message: String::from("Failed to create reqwest client."), source: source.into() })?;

let client = ConfidentialClient::from_client_config(*config.clone(), reqwest_client)?;
match client.check_connection().await {
Expand Down Expand Up @@ -116,7 +116,7 @@ impl ConfidentialClient {
async fn check_connection(&self) -> Result<(), ConfidentialClientError> {

let token_endpoint = self.issuer_url.value().join("protocol/openid-connect/token")
.map_err(|error| ConfidentialClientError::UrlParse { message: String::from("Failed to derive token url from issuer url: "), cause: error })?;
.map_err(|error| ConfidentialClientError::UrlParse { message: String::from("Failed to derive token url from issuer url: "), source: error })?;

let operation = move || {
let client = self.reqwest_client.clone();
Expand Down Expand Up @@ -148,7 +148,7 @@ impl ConfidentialClient {
match backoff_result {
Ok(_) => Ok(()),
Err(error) => {
Err(ConfidentialClientError::KeycloakConnection { message: String::from("Could not connect to Keycloak"), cause: error })
Err(ConfidentialClientError::KeycloakConnection { message: String::from("Could not connect to Keycloak"), source: error })
}
}
}
Expand Down Expand Up @@ -277,18 +277,18 @@ pub async fn async_http_client(
request_builder = request_builder.header(name.as_str(), value.as_bytes());
}
let request = request_builder.build()
.map_err(|cause| {
OidcClientError::AuthReqwest { message: cause.to_string(), status: cause.status().unwrap_or_default().to_string(), inner: cause }
.map_err(|source| {
OidcClientError::AuthReqwest { message: source.to_string(), status: source.status().unwrap_or_default().to_string(), inner: source }
})?;
let response = client.execute(request).await
.map_err(|cause: reqwest::Error| {
OidcClientError::AuthReqwest { message: cause.to_string(), status: cause.status().unwrap_or_default().to_string(), inner: cause }
.map_err(|source: reqwest::Error| {
OidcClientError::AuthReqwest { message: source.to_string(), status: source.status().unwrap_or_default().to_string(), inner: source }
})?;
let status_code = response.status();
let headers = response.headers().to_owned();
let data = response.bytes().await
.map_err(|cause| {
OidcClientError::AuthReqwest { message: cause.to_string(), status: cause.status().unwrap_or_default().to_string(), inner: cause }
.map_err(|source| {
OidcClientError::AuthReqwest { message: source.to_string(), status: source.status().unwrap_or_default().to_string(), inner: source }
})?;

let returned_response = {
Expand All @@ -299,8 +299,8 @@ pub async fn async_http_client(
}
returned_response
.body(data.to_vec())
.map_err(|cause| {
OidcClientError::Other(format!("Failed to build response body: {cause}"))
.map_err(|source| {
OidcClientError::Other(format!("Failed to build response body: {source}"))
})?
};

Expand Down
16 changes: 8 additions & 8 deletions opendut-auth/src/confidential/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ pub enum OidcConfigEnabled {
impl OidcConfigEnabled {
pub fn from_settings(settings: &Config) -> Result<Self, ConfidentialClientError> {
let oidc_enabled = settings.get_bool(CONFIG_KEY_OIDC_ENABLED)
.map_err(|cause| ConfidentialClientError::Configuration { message: format!("No configuration found for {CONFIG_KEY_OIDC_ENABLED}."), cause: cause.into() })?;
.map_err(|source| ConfidentialClientError::Configuration { message: format!("No configuration found for {CONFIG_KEY_OIDC_ENABLED}."), source: source.into() })?;
if oidc_enabled {
Ok(Self::Yes(Box::new(OidcClientConfig::Confidential(OidcConfidentialClientConfig::from_settings(settings)?))))
} else {
Expand Down Expand Up @@ -143,9 +143,9 @@ impl OidcConfidentialClientConfig {

pub fn get_client(&self) -> Result<ConfiguredClient, ConfidentialClientError> {
let auth_endpoint = self.issuer_url.value().join("protocol/openid-connect/auth")
.map_err(|cause| ConfidentialClientError::Configuration { message: String::from("Failed to derive authorization url from issuer url."), cause: cause.into() })?;
.map_err(|source| ConfidentialClientError::Configuration { message: String::from("Failed to derive authorization url from issuer url."), source: source.into() })?;
let token_endpoint = self.issuer_url.value().join("protocol/openid-connect/token")
.map_err(|cause| ConfidentialClientError::Configuration { message: String::from("Failed to derive token url from issuer url."), cause: cause.into() })?;
.map_err(|source| ConfidentialClientError::Configuration { message: String::from("Failed to derive token url from issuer url."), source: source.into() })?;

let client = BasicClient::new(self.client_id.clone())
.set_client_secret(self.client_secret.clone())
Expand All @@ -159,16 +159,16 @@ impl OidcConfidentialClientConfig {
impl OidcConfidentialClientConfig {
pub fn from_settings(settings: &Config) -> Result<Self, ConfidentialClientError> {
let client_id = settings.get_string(OidcConfidentialClientConfig::CLIENT_ID)
.map_err(|error| ConfidentialClientError::Configuration { message: format!("Failed to find configuration for `{}`.", OidcConfidentialClientConfig::CLIENT_ID), cause: error.into() })?;
.map_err(|error| ConfidentialClientError::Configuration { message: format!("Failed to find configuration for `{}`.", OidcConfidentialClientConfig::CLIENT_ID), source: error.into() })?;
let client_secret = settings.get_string(OidcConfidentialClientConfig::CLIENT_SECRET)
.map_err(|error| ConfidentialClientError::Configuration { message: format!("Failed to find configuration for `{}`.", OidcConfidentialClientConfig::CLIENT_SECRET), cause: error.into() })?;
.map_err(|error| ConfidentialClientError::Configuration { message: format!("Failed to find configuration for `{}`.", OidcConfidentialClientConfig::CLIENT_SECRET), source: error.into() })?;
let issuer = settings.get_string(OidcConfidentialClientConfig::ISSUER_URL)
.map_err(|error| ConfidentialClientError::Configuration { message: format!("Failed to find configuration for `{}`.", OidcConfidentialClientConfig::ISSUER_URL), cause: error.into() })?;
.map_err(|error| ConfidentialClientError::Configuration { message: format!("Failed to find configuration for `{}`.", OidcConfidentialClientConfig::ISSUER_URL), source: error.into() })?;

let issuer_url = IssuerUrl::try_from(&issuer)
.map_err(|error| ConfidentialClientError::Configuration { message: format!("Failed to parse issuer URL: `{issuer}`."), cause: error.into() })?;
.map_err(|error| ConfidentialClientError::Configuration { message: format!("Failed to parse issuer URL: `{issuer}`."), source: error.into() })?;
let raw_scopes = settings.get_string(OidcConfidentialClientConfig::SCOPES)
.map_err(|error| ConfidentialClientError::Configuration { message: format!("Failed to find configuration for `{}`.", OidcConfidentialClientConfig::SCOPES), cause: error.into() })?;
.map_err(|error| ConfidentialClientError::Configuration { message: format!("Failed to find configuration for `{}`.", OidcConfidentialClientConfig::SCOPES), source: error.into() })?;
let scopes = OidcConfidentialClientConfig::parse_scopes(&client_id, raw_scopes);

Ok(Self {
Expand Down
12 changes: 6 additions & 6 deletions opendut-auth/src/confidential/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ pub enum OidcClientError {

#[derive(thiserror::Error, Debug)]
pub enum ConfidentialClientError {
#[error("Failed to load OIDC configuration: '{message}'. Cause: '{cause}'")]
Configuration { message: String, cause: Box<dyn std::error::Error + Send + Sync> },
#[error("{message}\n {cause}")]
KeycloakConnection { message: String, cause: reqwest::Error },
#[error("{message}\n {cause}")]
UrlParse { message: String, cause: url::ParseError },
#[error("Failed to load OIDC configuration: '{message}'. Cause: '{source}'")]
Configuration { message: String, source: Box<dyn std::error::Error + Send + Sync> },
#[error("{message}\n {source}")]
KeycloakConnection { message: String, source: reqwest::Error },
#[error("{message}\n {source}")]
UrlParse { message: String, source: url::ParseError },
#[error("OIDC configuration error: '{message}'.")]
Other { message: String },
}
Expand Down
32 changes: 16 additions & 16 deletions opendut-auth/src/registration/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,16 @@ pub enum RegistrationClientError {
#[error("Failed request: {error}")]
RequestError {
error: String,
#[source] cause: Box<dyn std::error::Error + Send + Sync>,
source: Box<dyn std::error::Error + Send + Sync>,
},
#[error("Failed to register new client: {message}")]
ClientParameter {
message: String,
#[source] cause: Box<dyn std::error::Error + Send + Sync>,
source: Box<dyn std::error::Error + Send + Sync>,
},
#[error("Failed to register new client")]
Registration {
#[source] cause: WrappedClientRegistrationError,
source: WrappedClientRegistrationError,
},
#[error("Client could not be found")]
ClientNotFound,
Expand Down Expand Up @@ -88,7 +88,7 @@ impl RegistrationClient {
}
None => {
let access_token = self.inner.get_token().await
.map_err(|error| RegistrationClientError::RequestError { error: error.to_string(), cause: Box::new(error) })?;
.map_err(|error| RegistrationClientError::RequestError { error: error.to_string(), source: Box::new(error) })?;
let additional_metadata = EmptyAdditionalClientMetadata {};
let redirect_uris = vec![self.config.device_redirect_url.clone()];
let grant_types = vec![CoreGrantType::ClientCredentials];
Expand All @@ -104,12 +104,12 @@ impl RegistrationClient {
let resource_uri = self.config.client_home_base_url.resource_url(resource_id, user_id)
.map_err(|error| RegistrationClientError::ClientParameter {
message: format!("Failed to create resource url for client: {error:?}"),
cause: Box::new(error),
source: Box::new(error),
})?;
let client_home_uri = ClientUrl::new(String::from(resource_uri))
.map_err(|error| RegistrationClientError::ClientParameter {
message: format!("Failed to create client home url: {error:?}"),
cause: Box::new(error),
source: Box::new(error),
})?;
let response = ExplicitSendFutureWrapper::from(
request
Expand Down Expand Up @@ -140,7 +140,7 @@ impl RegistrationClient {
})
}
Err(error) => {
Err(RegistrationClientError::Registration { cause: WrappedClientRegistrationError(error) })
Err(RegistrationClientError::Registration { source: WrappedClientRegistrationError(error) })
}
}
}
Expand All @@ -149,21 +149,21 @@ impl RegistrationClient {

pub async fn list_clients(&self) -> Result<Clients, RegistrationClientError> {
let enumerate_clients_uri = self.config.issuer_admin_url.value().join("clients/")
.map_err(|cause| RegistrationClientError::InvalidConfiguration { error: format!("Invalid admin api endpoint for issuer. {cause}") })?;
.map_err(|source| RegistrationClientError::InvalidConfiguration { error: format!("Invalid admin api endpoint for issuer. {source}") })?;
let request = self.create_http_request_with_auth_token(&enumerate_clients_uri, http::Method::GET).await?;

let response = async_http_client(&self.inner.reqwest_client, request).await;
match response {
Ok(response) => {
let clients: Clients = serde_json::from_slice(response.body())
.map_err(|cause| {
error!("Could not deserialize client list from keycloak: {:?}\nBody:\n{}", cause, String::from_utf8_lossy(response.body()));
RegistrationClientError::InvalidConfiguration { error: format!("Could not deserialize response body. {cause}") }
.map_err(|source| {
error!("Could not deserialize client list from keycloak: {:?}\nBody:\n{}", source, String::from_utf8_lossy(response.body()));
RegistrationClientError::InvalidConfiguration { error: format!("Could not deserialize response body. {source}") }
})?;
Ok(clients)
}
Err(error) => {
Err(RegistrationClientError::RequestError { error: "OIDC client list request failed!".to_string(), cause: Box::new(error) })
Err(RegistrationClientError::RequestError { error: "OIDC client list request failed!".to_string(), source: Box::new(error) })
}
}
}
Expand Down Expand Up @@ -195,17 +195,17 @@ impl RegistrationClient {
pub async fn delete_client(&self, client_id: &String) -> Result<HttpResponse, RegistrationClientError> {
let client_uri = format!("clients/{client_id}");
let delete_client_url = self.config.issuer_admin_url.value().join(&client_uri)
.map_err(|cause| RegistrationClientError::InvalidConfiguration { error: format!("Invalid admin api endpoint for issuer. {cause}") })?;
.map_err(|source| RegistrationClientError::InvalidConfiguration { error: format!("Invalid admin api endpoint for issuer. {source}") })?;

let request = self.create_http_request_with_auth_token(&delete_client_url, http::Method::DELETE).await?;

async_http_client(&self.inner.reqwest_client, request).await
.map_err(|error| RegistrationClientError::RequestError { error: error.to_string(), cause: error.into() })
.map_err(|error| RegistrationClientError::RequestError { error: error.to_string(), source: error.into() })
}

async fn create_http_request_with_auth_token(&self, issuer_remote_url: &Url, http_method: http::Method) -> Result<HttpRequest, RegistrationClientError> {
let access_token = self.inner.get_token().await
.map_err(|error| RegistrationClientError::RequestError { error: error.to_string(), cause: error.into() })?;
.map_err(|error| RegistrationClientError::RequestError { error: error.to_string(), source: error.into() })?;
let bearer_header = format!("Bearer {access_token}");
let access_token_value = HeaderValue::from_str(&bearer_header)
.map_err(|error| RegistrationClientError::InvalidConfiguration { error: error.to_string() })?;
Expand All @@ -218,7 +218,7 @@ impl RegistrationClient {
.uri(issuer_remote_url)
.header(http::header::AUTHORIZATION, access_token_value)
.body(vec![])
.map_err(|error| RegistrationClientError::RequestError { error: error.to_string(), cause: error.into() })?;
.map_err(|error| RegistrationClientError::RequestError { error: error.to_string(), source: error.into() })?;

Ok(request)
}
Expand Down
4 changes: 2 additions & 2 deletions opendut-carl/opendut-carl-api/src/carl/broker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -141,13 +141,13 @@ mod client {
self.inner.open(request)
)
.await
.map_err(|cause| error::OpenStream { message: format!("Error while opening stream: {cause}") })?
.map_err(|source| error::OpenStream { message: format!("Error while opening stream: {source}") })?
};

let inbound = response.into_inner()
.map(|result| result.and_then(|message| {
DownstreamMessage::try_from(message)
.map_err(|cause| tonic::Status::invalid_argument(format!("Error while converting stream message in open_stream: {cause}")))
.map_err(|source| tonic::Status::invalid_argument(format!("Error while converting stream message in open_stream: {source}")))
}));

Ok((GrpcDownstream::from(inbound), GrpcUpstream::from(tx)))
Expand Down
Loading
Loading