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}