use std::sync::Arc;
use super::AuthContextExt;
use backbone_auth::middleware::AuthContext;
use backbone_auth::{AuthMiddleware};
use axum::{
extract::{Request, State},
http::StatusCode,
middleware::Next,
response::Response,
};
pub mod file_access_logs {
pub const LIST: &str = "file_access_log:list";
pub const READ: &str = "file_access_log:read";
pub const CREATE: &str = "file_access_log:create";
pub const UPDATE: &str = "file_access_log:update";
pub const DELETE: &str = "file_access_log:delete";
pub const BULK_CREATE: &str = "file_access_log:bulk_create";
pub const UPSERT: &str = "file_access_log:upsert";
pub fn all() -> Vec<&'static str> {
vec![
LIST,
READ,
CREATE,
UPDATE,
DELETE,
BULK_CREATE,
UPSERT,
]
}
}
pub fn has_permission(auth: &AuthContext, permission: &str) -> bool {
auth.permissions.iter().any(|p| p == permission)
}
pub fn has_role(auth: &AuthContext, roles: &[&str]) -> bool {
auth.roles.iter().any(|r| roles.contains(&r.as_str()))
}
pub fn has_all_permissions(auth: &AuthContext, permissions: &[&str]) -> bool {
permissions.iter().all(|p| has_permission(auth, p))
}
pub fn has_any_permission(auth: &AuthContext, permissions: &[&str]) -> bool {
permissions.iter().any(|p| has_permission(auth, p))
}
pub fn require_permission(permission: &'static str) -> impl Fn(
axum::extract::Extension<AuthContext>,
Request,
Next,
) -> impl std::future::Future<Output = Result<Response, StatusCode>> + Send + Clone {
move |auth, request, next| async move {
if has_permission(&auth, permission) {
Ok(next.run(request).await)
} else {
Err(StatusCode::FORBIDDEN)
}
}
}
pub fn require_role(roles: &'static [&'static str]) -> impl Fn(
axum::extract::Extension<AuthContext>,
Request,
Next,
) -> impl std::future::Future<Output = Result<Response, StatusCode>> + Send + Clone {
move |auth, request, next| async move {
if has_role(&auth, roles) {
Ok(next.run(request).await)
} else {
Err(StatusCode::FORBIDDEN)
}
}
}
pub async fn require_list_file_access_log(
auth: axum::extract::Extension<AuthContext>,
request: Request,
next: Next,
) -> Result<Response, StatusCode> {
if has_permission(&auth, file_access_logs::LIST) {
Ok(next.run(request).await)
} else {
Err(StatusCode::FORBIDDEN)
}
}
pub async fn require_read_file_access_log(
auth: axum::extract::Extension<AuthContext>,
request: Request,
next: Next,
) -> Result<Response, StatusCode> {
if has_permission(&auth, file_access_logs::READ) {
Ok(next.run(request).await)
} else {
Err(StatusCode::FORBIDDEN)
}
}
pub async fn require_create_file_access_log(
auth: axum::extract::Extension<AuthContext>,
request: Request,
next: Next,
) -> Result<Response, StatusCode> {
if has_permission(&auth, file_access_logs::CREATE) {
Ok(next.run(request).await)
} else {
Err(StatusCode::FORBIDDEN)
}
}
pub async fn require_update_file_access_log(
auth: axum::extract::Extension<AuthContext>,
request: Request,
next: Next,
) -> Result<Response, StatusCode> {
if has_permission(&auth, file_access_logs::UPDATE) {
Ok(next.run(request).await)
} else {
Err(StatusCode::FORBIDDEN)
}
}
pub async fn require_delete_file_access_log(
auth: axum::extract::Extension<AuthContext>,
request: Request,
next: Next,
) -> Result<Response, StatusCode> {
if has_permission(&auth, file_access_logs::DELETE) {
Ok(next.run(request).await)
} else {
Err(StatusCode::FORBIDDEN)
}
}