Files
attune/crates/api/src/dto/auth.rs
David Culbreth 4df621c5c8
Some checks failed
CI / Rustfmt (push) Failing after 21s
CI / Cargo Audit & Deny (push) Failing after 33s
CI / Web Blocking Checks (push) Successful in 50s
CI / Security Blocking Checks (push) Successful in 7s
CI / Web Advisory Checks (push) Successful in 33s
CI / Security Advisory Checks (push) Successful in 34s
Publish Images And Chart / Resolve Publish Metadata (push) Successful in 1s
Publish Images And Chart / Publish init-packs (push) Failing after 11s
Publish Images And Chart / Publish init-user (push) Failing after 10s
Publish Images And Chart / Publish migrations (push) Failing after 11s
Publish Images And Chart / Publish sensor (push) Failing after 10s
Publish Images And Chart / Publish web (push) Failing after 10s
Publish Images And Chart / Publish worker (push) Failing after 10s
Publish Images And Chart / Publish api (push) Failing after 7s
Publish Images And Chart / Publish executor (push) Failing after 9s
Publish Images And Chart / Publish notifier (push) Failing after 10s
Publish Images And Chart / Publish Helm Chart (push) Has been skipped
CI / Clippy (push) Successful in 18m52s
CI / Tests (push) Has been cancelled
adding some initial SSO providers, updating publish workflow
2026-03-20 12:37:24 -05:00

199 lines
5.5 KiB
Rust

//! Authentication DTOs
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
use validator::Validate;
/// Login request
#[derive(Debug, Clone, Serialize, Deserialize, Validate, ToSchema)]
pub struct LoginRequest {
/// Identity login (username)
#[validate(length(min = 1, max = 255))]
#[schema(example = "admin")]
pub login: String,
/// Password
#[validate(length(min = 1))]
#[schema(example = "changeme123")]
pub password: String,
}
/// Register request
#[derive(Debug, Clone, Serialize, Deserialize, Validate, ToSchema)]
pub struct RegisterRequest {
/// Identity login (username)
#[validate(length(min = 3, max = 255))]
#[schema(example = "newuser")]
pub login: String,
/// Password
#[validate(length(min = 8, max = 128))]
#[schema(example = "SecurePass123!")]
pub password: String,
/// Display name (optional)
#[validate(length(max = 255))]
#[schema(example = "New User")]
pub display_name: Option<String>,
}
/// Token response
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct TokenResponse {
/// Access token (JWT)
#[schema(example = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...")]
pub access_token: String,
/// Refresh token
#[schema(example = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...")]
pub refresh_token: String,
/// Token type (always "Bearer")
#[schema(example = "Bearer")]
pub token_type: String,
/// Access token expiration in seconds
#[schema(example = 3600)]
pub expires_in: i64,
/// User information
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<UserInfo>,
}
/// User information included in token response
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct UserInfo {
/// Identity ID
#[schema(example = 1)]
pub id: i64,
/// Identity login
#[schema(example = "admin")]
pub login: String,
/// Display name
#[schema(example = "Administrator")]
pub display_name: Option<String>,
}
impl TokenResponse {
pub fn new(access_token: String, refresh_token: String, expires_in: i64) -> Self {
Self {
access_token,
refresh_token,
token_type: "Bearer".to_string(),
expires_in,
user: None,
}
}
pub fn with_user(mut self, id: i64, login: String, display_name: Option<String>) -> Self {
self.user = Some(UserInfo {
id,
login,
display_name,
});
self
}
}
/// Refresh token request
#[derive(Debug, Clone, Serialize, Deserialize, Validate, ToSchema)]
pub struct RefreshTokenRequest {
/// Refresh token
#[validate(length(min = 1))]
#[schema(example = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...")]
pub refresh_token: String,
}
/// Change password request
#[derive(Debug, Clone, Serialize, Deserialize, Validate, ToSchema)]
pub struct ChangePasswordRequest {
/// Current password
#[validate(length(min = 1))]
#[schema(example = "OldPassword123!")]
pub current_password: String,
/// New password
#[validate(length(min = 8, max = 128))]
#[schema(example = "NewPassword456!")]
pub new_password: String,
}
/// Current user response
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct CurrentUserResponse {
/// Identity ID
#[schema(example = 1)]
pub id: i64,
/// Identity login
#[schema(example = "admin")]
pub login: String,
/// Display name
#[schema(example = "Administrator")]
pub display_name: Option<String>,
}
/// Public authentication settings for the login page.
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct AuthSettingsResponse {
/// Whether authentication is enabled for the server.
#[schema(example = true)]
pub authentication_enabled: bool,
/// Whether local username/password login is configured.
#[schema(example = true)]
pub local_password_enabled: bool,
/// Whether local username/password login should be shown by default.
#[schema(example = true)]
pub local_password_visible_by_default: bool,
/// Whether OIDC login is configured and enabled.
#[schema(example = false)]
pub oidc_enabled: bool,
/// Whether OIDC login should be shown by default.
#[schema(example = false)]
pub oidc_visible_by_default: bool,
/// Provider name for `?auth=<provider>`.
#[schema(example = "sso")]
pub oidc_provider_name: Option<String>,
/// User-facing provider label for the login button.
#[schema(example = "Example SSO")]
pub oidc_provider_label: Option<String>,
/// Optional icon URL shown beside the provider label.
#[schema(example = "https://auth.example.com/assets/logo.svg")]
pub oidc_provider_icon_url: Option<String>,
/// Whether LDAP login is configured and enabled.
#[schema(example = false)]
pub ldap_enabled: bool,
/// Whether LDAP login should be shown by default.
#[schema(example = false)]
pub ldap_visible_by_default: bool,
/// Provider name for `?auth=<provider>`.
#[schema(example = "ldap")]
pub ldap_provider_name: Option<String>,
/// User-facing provider label for the login button.
#[schema(example = "Company LDAP")]
pub ldap_provider_label: Option<String>,
/// Optional icon URL shown beside the provider label.
#[schema(example = "https://ldap.example.com/assets/logo.svg")]
pub ldap_provider_icon_url: Option<String>,
/// Whether unauthenticated self-service registration is allowed.
#[schema(example = false)]
pub self_registration_enabled: bool,
}