9362a10
ZhenYi
refactor: remove OAuth-related modules and update references for identity service integration
9362a10
use actix_web::http::header::{self, HeaderValue};
use actix_web::{HttpRequest, HttpResponse, web};
use crate::config::web::WebConfig;
use crate::server::AuthSvc;
pub fn cors(
svc: &AuthSvc,
web_cfg: &WebConfig,
req: &HttpRequest,
mut response: HttpResponse,
) -> HttpResponse {
let Some(origin) = request_origin(req) else {
return response;
};
let wildcard = web_cfg.allow_any_origin();
if !wildcard
&& !crate::envelope::cors::web_allows(web_cfg, &origin)
&& !socket_origin(svc, req, &origin)
{
return response;
}
let value = if wildcard { String::from("*") } else { origin };
let Ok(value) = HeaderValue::from_str(&value) else {
return response;
};
let headers = response.headers_mut();
headers.insert(header::ACCESS_CONTROL_ALLOW_ORIGIN, value);
if !wildcard {
headers.append(header::VARY, HeaderValue::from_static("origin"));
}
if web_cfg.cors_allow_credentials && !wildcard {
headers.insert(
header::ACCESS_CONTROL_ALLOW_CREDENTIALS,
HeaderValue::from_static("true"),
);
}
let expose = web_cfg.expose_headers();
if !expose.is_empty()
&& let Ok(value) = HeaderValue::from_str(&expose.join(", "))
{
headers.insert(header::ACCESS_CONTROL_EXPOSE_HEADERS, value);
}
response
}
fn request_origin(req: &HttpRequest) -> Option<String> {
req.headers()
.get(header::ORIGIN)
.and_then(|value| value.to_str().ok())
.map(str::trim)
.filter(|origin| !origin.is_empty())
.map(str::to_owned)
}
fn socket_origin(svc: &AuthSvc, req: &HttpRequest, origin: &str) -> bool {
req.path() == "/api/v1/oauth/socket-tickets"
&& svc
.auth()
.socket_origins
.iter()
.any(|value| value == origin)
}
pub async fn preflight(
svc: web::Data<AuthSvc>,
web_cfg: web::Data<WebConfig>,
req: HttpRequest,
) -> HttpResponse {
let web_cfg = web_cfg.get_ref().clone();
let response = HttpResponse::NoContent()
.insert_header((
header::ACCESS_CONTROL_ALLOW_METHODS.as_str(),
web_cfg.allow_methods().join(", "),
))
.insert_header((
header::ACCESS_CONTROL_ALLOW_HEADERS.as_str(),
web_cfg.allow_headers().join(", "),
))
.insert_header((
header::ACCESS_CONTROL_MAX_AGE.as_str(),
web_cfg.cors_max_age_secs.to_string(),
))
.finish();
cors(&svc, &web_cfg, &req, response)
}