redfish_core/
auth.rs

1use axum::{
2    http::{request::Parts, StatusCode},
3    response::{AppendHeaders, IntoResponse, Response},
4    Json,
5};
6use redfish_codegen::{models::redfish, registries::base::v1_16_0::Base};
7
8use crate::error;
9use crate::privilege::Role;
10
11#[derive(Clone)]
12pub struct AuthenticatedUser {
13    pub username: String,
14    pub role: Role,
15}
16
17pub fn unauthorized_with_error(error: redfish::Error, challenge: &[&str]) -> Response {
18    (
19        StatusCode::UNAUTHORIZED,
20        AppendHeaders([("WWW-Authenticate", challenge.join(", "))]),
21        Json(error),
22    )
23        .into_response()
24}
25
26pub fn unauthorized(challenge: &[&str]) -> Response {
27    unauthorized_with_error(
28        error::one_message(Base::InsufficientPrivilege.into()),
29        challenge,
30    )
31}
32
33pub fn insufficient_privilege() -> redfish::Error {
34    error::one_message(Base::InsufficientPrivilege.into())
35}
36
37pub trait AuthenticateRequest {
38    fn authenticate_request(
39        &self,
40        parts: &mut Parts,
41    ) -> Result<Option<AuthenticatedUser>, Response>;
42    fn challenge(&self) -> Vec<&'static str>;
43}