From 85facf7dc65e4bb9b8304e27e0e3a099294385d4 Mon Sep 17 00:00:00 2001
From: Philippe Loctaux
Date: Fri, 5 May 2023 23:41:37 +0200
Subject: [PATCH] jwt guard: option to allow or not first admin
---
crates/ezidam/src/guards/access_token.rs | 2 +-
crates/ezidam/src/guards/jwt.rs | 73 ++++++++++++++++---
crates/ezidam/src/guards/jwt/admin.rs | 2 +-
.../src/guards/jwt/admin_not_current.rs | 12 ++-
crates/ezidam/src/guards/jwt/user.rs | 2 +-
5 files changed, 75 insertions(+), 16 deletions(-)
diff --git a/crates/ezidam/src/guards/access_token.rs b/crates/ezidam/src/guards/access_token.rs
index 9d3b86c..476d2d2 100644
--- a/crates/ezidam/src/guards/access_token.rs
+++ b/crates/ezidam/src/guards/access_token.rs
@@ -28,7 +28,7 @@ impl AccessToken {
let (_, access_token) = raw.split_once(' ').ok_or(BearerAuthError::Empty)?;
// Validate
- match validate_jwt::(access_token.to_string(), request, None).await {
+ match validate_jwt::(access_token.to_string(), request, None, None).await {
Ok(jwt_claims) => match jwt_claims {
Some(jwt_claims) => Ok(Some(Self(jwt_claims))),
None => Ok(None),
diff --git a/crates/ezidam/src/guards/jwt.rs b/crates/ezidam/src/guards/jwt.rs
index 2850ba7..9e4192d 100644
--- a/crates/ezidam/src/guards/jwt.rs
+++ b/crates/ezidam/src/guards/jwt.rs
@@ -3,13 +3,19 @@ use crate::guards::refresh_token::get_refresh_token_from_cookie;
use crate::tokens::{
JWT_COOKIE_NAME, JWT_DURATION_MINUTES, REFRESH_TOKEN_COOKIE_NAME, REFRESH_TOKEN_DURATION_DAYS,
};
-use id::KeyID;
+use hash::SecretString;
+use id::{KeyID, UserID};
use jwt::database::Key;
use jwt::{JwtClaims, PrivateKey};
+use refresh_tokens::RefreshToken;
use rocket::http::Status;
+use rocket::http::{Cookie, CookieJar, SameSite};
use rocket::request::Outcome;
+use rocket::time::Duration;
use rocket::tokio::task;
use rocket::Request;
+use settings::Settings;
+use users::User;
mod admin;
mod admin_not_current;
@@ -30,6 +36,7 @@ pub enum Error {
RevokeRefreshTokens(refresh_tokens::Error),
MarkRefreshTokenUsed(refresh_tokens::Error),
GetSettings(settings::Error),
+ FirstAdminNotSet,
ServerUrlNotSet,
UnknownIp,
SaveRefreshToken(refresh_tokens::Error),
@@ -48,6 +55,11 @@ pub enum Error {
BlockingTask(String),
}
+pub struct SpecificUser<'a> {
+ allow_first_admin: bool,
+ requested_user: &'a UserID,
+}
+
pub(super) fn get_access_token_from_cookie(request: &Request) -> Option {
request
.cookies()
@@ -59,6 +71,7 @@ pub async fn validate_jwt(
jwt: String,
request: &Request<'_>,
get_admin: Option,
+ specific_user: Option>,
) -> Result