| use codex_client::Request; |
| use codex_client::TransportError; |
| use http::HeaderMap; |
| use std::future::Future; |
| use std::pin::Pin; |
| use std::sync::Arc; |
|
|
| |
| #[derive(Debug, thiserror::Error)] |
| pub enum AuthError { |
| #[error("request auth build error: {0}")] |
| Build(String), |
| #[error("transient auth error: {0}")] |
| Transient(String), |
| } |
|
|
| impl From<AuthError> for TransportError { |
| fn from(error: AuthError) -> Self { |
| match error { |
| AuthError::Build(message) => TransportError::Build(message), |
| AuthError::Transient(message) => TransportError::Network(message), |
| } |
| } |
| } |
|
|
| |
| |
| |
| |
| pub trait AuthProvider: Send + Sync { |
| |
| |
| |
| |
| fn add_auth_headers(&self, headers: &mut HeaderMap); |
|
|
| |
| fn to_auth_headers(&self) -> HeaderMap { |
| let mut headers = HeaderMap::new(); |
| self.add_auth_headers(&mut headers); |
| headers |
| } |
|
|
| |
| |
| |
| |
| |
| fn resolve_auth_headers(&self) -> AuthHeadersFuture<'_> { |
| Box::pin(async { Ok(self.to_auth_headers()) }) |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| fn apply_auth(&self, request: Request) -> AuthProviderFuture<'_> { |
| Box::pin(async move { |
| let mut request = request; |
| request.headers.extend(self.resolve_auth_headers().await?); |
| Ok(request) |
| }) |
| } |
| } |
|
|
| pub type AuthProviderFuture<'a> = |
| Pin<Box<dyn Future<Output = Result<Request, AuthError>> + Send + 'a>>; |
|
|
| pub type AuthHeadersFuture<'a> = |
| Pin<Box<dyn Future<Output = Result<HeaderMap, AuthError>> + Send + 'a>>; |
|
|
| |
| pub type SharedAuthProvider = Arc<dyn AuthProvider>; |
|
|
| #[derive(Clone, Debug, PartialEq, Eq)] |
| pub struct AgentIdentityTelemetry { |
| pub agent_id: String, |
| pub task_id: String, |
| } |
|
|
| #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] |
| pub struct AuthHeaderTelemetry { |
| pub attached: bool, |
| pub name: Option<&'static str>, |
| } |
|
|
| pub fn auth_header_telemetry(auth: &dyn AuthProvider) -> AuthHeaderTelemetry { |
| let mut headers = HeaderMap::new(); |
| auth.add_auth_headers(&mut headers); |
| let name = headers |
| .contains_key(http::header::AUTHORIZATION) |
| .then_some("authorization"); |
| AuthHeaderTelemetry { |
| attached: name.is_some(), |
| name, |
| } |
| } |
|
|