// Copyright (C) 2026 Emilis Bliūdžius // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . use crate::{limited::FixedLenString, player::Username}; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; pub const TOKEN_LEN: usize = 0x20; pub type TokenString = FixedLenString; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct Token { pub token: TokenString, pub username: Username, pub display_name: Option, pub pronouns: Option, pub created_at: DateTime, pub expires_at: DateTime, } impl Token { pub fn login_token(&self) -> TokenLogin { TokenLogin(self.token.clone()) } } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct TokenLogin(pub FixedLenString); #[cfg(feature = "ssr")] impl axum_extra::headers::authorization::Credentials for TokenLogin { const SCHEME: &'static str = "Bearer"; fn decode(value: &axum::http::HeaderValue) -> Option { value .to_str() .ok() .and_then(|v| FixedLenString::new(v.strip_prefix("Bearer ").unwrap_or(v).to_string())) .map(Self) } fn encode(&self) -> axum::http::HeaderValue { axum::http::HeaderValue::from_str(self.0.as_str()).expect("bearer token encode") } }