59 lines
1.9 KiB
Rust
59 lines
1.9 KiB
Rust
// 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 <https://www.gnu.org/licenses/>.
|
|
|
|
use crate::{limited::FixedLenString, player::Username};
|
|
use chrono::{DateTime, Utc};
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
pub const TOKEN_LEN: usize = 0x20;
|
|
|
|
pub type TokenString = FixedLenString<TOKEN_LEN>;
|
|
|
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
|
pub struct Token {
|
|
pub token: TokenString,
|
|
pub username: Username,
|
|
pub display_name: Option<String>,
|
|
pub pronouns: Option<String>,
|
|
pub created_at: DateTime<Utc>,
|
|
pub expires_at: DateTime<Utc>,
|
|
}
|
|
|
|
impl Token {
|
|
pub fn login_token(&self) -> TokenLogin {
|
|
TokenLogin(self.token.clone())
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
|
pub struct TokenLogin(pub FixedLenString<TOKEN_LEN>);
|
|
|
|
#[cfg(feature = "ssr")]
|
|
impl axum_extra::headers::authorization::Credentials for TokenLogin {
|
|
const SCHEME: &'static str = "Bearer";
|
|
|
|
fn decode(value: &axum::http::HeaderValue) -> Option<Self> {
|
|
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")
|
|
}
|
|
}
|