style: use const generic for token length instead of multiple functions
All checks were successful
ci/woodpecker/push/build-and-publish Pipeline was successful
ci/woodpecker/push/publish-docs Pipeline was successful

Simplifies codebase a bit and avoids having to add another function in future if we need another length of token
This commit is contained in:
Radical 2025-06-25 13:25:39 +02:00
parent f752cddd73
commit 407460d2aa
6 changed files with 16 additions and 22 deletions

View file

@ -11,7 +11,7 @@ use crate::{
error::Error, error::Error,
schema::*, schema::*,
utils::{ utils::{
PASSWORD_REGEX, generate_access_token, generate_refresh_token, new_refresh_token_cookie, PASSWORD_REGEX, generate_token, new_refresh_token_cookie,
user_uuid_from_identifier, user_uuid_from_identifier,
}, },
}; };
@ -59,8 +59,8 @@ pub async fn response(
)); ));
} }
let refresh_token = generate_refresh_token()?; let refresh_token = generate_token::<32>()?;
let access_token = generate_access_token()?; let access_token = generate_token::<16>()?;
let current_time = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs() as i64; let current_time = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs() as i64;

View file

@ -11,7 +11,7 @@ use crate::{
access_tokens::{self, dsl}, access_tokens::{self, dsl},
refresh_tokens::{self, dsl as rdsl}, refresh_tokens::{self, dsl as rdsl},
}, },
utils::{generate_access_token, generate_refresh_token, new_refresh_token_cookie}, utils::{generate_token, new_refresh_token_cookie},
}; };
use super::Response; use super::Response;
@ -55,7 +55,7 @@ pub async fn res(req: HttpRequest, data: web::Data<Data>) -> Result<HttpResponse
let current_time = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs() as i64; let current_time = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs() as i64;
if lifetime > 1987200 { if lifetime > 1987200 {
let new_refresh_token = generate_refresh_token()?; let new_refresh_token = generate_token::<32>()?;
match update(refresh_tokens::table) match update(refresh_tokens::table)
.filter(rdsl::token.eq(&refresh_token)) .filter(rdsl::token.eq(&refresh_token))
@ -75,7 +75,7 @@ pub async fn res(req: HttpRequest, data: web::Data<Data>) -> Result<HttpResponse
} }
} }
let access_token = generate_access_token()?; let access_token = generate_token::<16>()?;
update(access_tokens::table) update(access_tokens::table)
.filter(dsl::refresh_token.eq(&refresh_token)) .filter(dsl::refresh_token.eq(&refresh_token))

View file

@ -20,7 +20,7 @@ use crate::{
users::{self, dsl as udsl}, users::{self, dsl as udsl},
}, },
utils::{ utils::{
EMAIL_REGEX, PASSWORD_REGEX, USERNAME_REGEX, generate_access_token, generate_refresh_token, EMAIL_REGEX, PASSWORD_REGEX, USERNAME_REGEX, generate_token,
new_refresh_token_cookie, new_refresh_token_cookie,
}, },
}; };
@ -120,8 +120,8 @@ pub async fn res(
.execute(&mut conn) .execute(&mut conn)
.await?; .await?;
let refresh_token = generate_refresh_token()?; let refresh_token = generate_token::<32>()?;
let access_token = generate_access_token()?; let access_token = generate_token::<16>()?;
let current_time = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs() as i64; let current_time = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs() as i64;

View file

@ -3,7 +3,7 @@ use lettre::message::MultiPart;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use uuid::Uuid; use uuid::Uuid;
use crate::{Data, error::Error, utils::generate_refresh_token}; use crate::{Data, error::Error, utils::generate_token};
use super::Me; use super::Me;
@ -23,7 +23,7 @@ impl EmailToken {
#[allow(clippy::new_ret_no_self)] #[allow(clippy::new_ret_no_self)]
pub async fn new(data: &Data, me: Me) -> Result<(), Error> { pub async fn new(data: &Data, me: Me) -> Result<(), Error> {
let token = generate_refresh_token()?; let token = generate_token::<32>()?;
let email_token = EmailToken { let email_token = EmailToken {
user_uuid: me.uuid, user_uuid: me.uuid,

View file

@ -12,10 +12,10 @@ use serde::{Deserialize, Serialize};
use uuid::Uuid; use uuid::Uuid;
use crate::{ use crate::{
Data,
error::Error, error::Error,
schema::users, schema::users,
utils::{PASSWORD_REGEX, generate_refresh_token, global_checks, user_uuid_from_identifier}, utils::{generate_token, global_checks, user_uuid_from_identifier, PASSWORD_REGEX},
Data
}; };
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
@ -48,7 +48,7 @@ impl PasswordResetToken {
#[allow(clippy::new_ret_no_self)] #[allow(clippy::new_ret_no_self)]
pub async fn new(data: &Data, identifier: String) -> Result<(), Error> { pub async fn new(data: &Data, identifier: String) -> Result<(), Error> {
let token = generate_refresh_token()?; let token = generate_token::<32>()?;
let mut conn = data.pool.get().await?; let mut conn = data.pool.get().await?;

View file

@ -115,14 +115,8 @@ pub fn new_refresh_token_cookie(config: &Config, refresh_token: String) -> Cooki
.finish() .finish()
} }
pub fn generate_access_token() -> Result<String, getrandom::Error> { pub fn generate_token<const N: usize>() -> Result<String, getrandom::Error> {
let mut buf = [0u8; 16]; let mut buf = [0u8; N];
fill(&mut buf)?;
Ok(encode(buf))
}
pub fn generate_refresh_token() -> Result<String, getrandom::Error> {
let mut buf = [0u8; 32];
fill(&mut buf)?; fill(&mut buf)?;
Ok(encode(buf)) Ok(encode(buf))
} }