use crate::{
connection_manager::ConnectionManager,
errors::{DanubeError, Result},
};
use std::sync::Arc;
use tonic::{metadata::MetadataValue, transport::Uri, Request};
const INTERNAL_BROKER_HEADER: &str = "x-danube-internal-broker";
#[derive(Debug, Clone)]
pub struct AuthService {
cnx_manager: Arc<ConnectionManager>,
}
impl AuthService {
pub fn new(cnx_manager: Arc<ConnectionManager>) -> Self {
AuthService { cnx_manager }
}
pub async fn insert_token_if_needed<T>(
&self,
token: Option<String>,
request: &mut Request<T>,
_addr: &Uri,
) -> Result<()> {
if let Some(token) = token {
let bearer = MetadataValue::try_from(format!("Bearer {}", token))
.map_err(|_| DanubeError::InvalidToken)?;
request.metadata_mut().insert("authorization", bearer);
}
if let Some(internal_broker) = self.cnx_manager.connection_options.internal_broker.as_deref()
{
let internal_broker_metadata = MetadataValue::try_from(internal_broker)
.map_err(|_| DanubeError::InvalidToken)?;
request
.metadata_mut()
.insert(INTERNAL_BROKER_HEADER, internal_broker_metadata);
}
Ok(())
}
}