use serde::{Deserialize, Serialize};
use serde_with::serde_as;
use time::{OffsetDateTime, serde::rfc3339};
#[cfg_attr(
feature = "borsh",
derive(borsh::BorshSerialize, borsh::BorshDeserialize)
)]
#[serde_as]
#[derive(Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UserSession {
#[cfg_attr(
feature = "borsh",
borsh(
serialize_with = "crate::util::borsh::time::ser",
deserialize_with = "crate::util::borsh::time::de"
)
)]
#[serde(rename = "created")]
#[serde(with = "rfc3339")]
pub creation_time: OffsetDateTime,
#[cfg_attr(
feature = "borsh",
borsh(
serialize_with = "crate::util::borsh::time::ser",
deserialize_with = "crate::util::borsh::time::de"
)
)]
#[serde(rename = "expire")]
#[serde(with = "rfc3339")]
pub expiration_time: OffsetDateTime,
pub is_machine_bound: bool,
#[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
#[serde(default)]
pub logout_url: String,
pub logout_url_client_side: bool,
pub original_login_type: UserSessionLoginType,
pub remember_me: bool,
#[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub secret_machine_id_hash: Option<String>,
#[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub secret_machine_id_salt: Option<String>,
pub session_login_counter: u64,
pub token: String,
#[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub uid_hash: Option<String>,
#[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub uid_salt: Option<String>,
pub user_id: crate::id::User,
}
impl std::fmt::Debug for UserSession {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("UserSession")
.field("user_id", &self.user_id)
.field("token", &"*****")
.field("creation_time", &self.creation_time)
.field("expiration_time", &self.expiration_time)
.field("secret_machine_id_hash", &"*****")
.field("secret_machine_id_salt", &"*****")
.field("uid_hash", &"*****")
.field("uid_salt", &"*****")
.field("remember_me", &self.remember_me)
.field("is_machine_bound", &self.is_machine_bound)
.field("logout_url", &"*****")
.field("logout_url_client_side", &"*****")
.field("original_login_type", &self.original_login_type)
.field("session_login_counter", &self.session_login_counter)
.finish()
}
}
impl UserSession {
#[must_use]
pub fn auth_header(&self) -> String {
"res ".to_owned() + self.user_id.as_ref() + ":" + &self.token
}
}
#[repr(u8)]
#[cfg_attr(
feature = "borsh",
derive(borsh::BorshSerialize, borsh::BorshDeserialize)
)]
#[cfg_attr(feature = "borsh", borsh(use_discriminant = true))]
#[derive(
Debug,
Clone,
PartialEq,
Eq,
Hash,
Serialize,
Deserialize,
PartialOrd,
Ord,
strum::FromRepr,
strum::Display,
strum::EnumString,
strum::AsRefStr,
strum::VariantNames,
)]
pub enum UserSessionLoginType {
Migration = 3,
Password = 1,
Saml2 = 2,
#[serde(rename = "UNKNOWN")]
Unknown = 0,
}
impl Default for UserSessionLoginType {
fn default() -> Self { Self::Unknown }
}
#[cfg_attr(
feature = "borsh",
derive(borsh::BorshSerialize, borsh::BorshDeserialize)
)]
#[derive(Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ConfigFileData {
pub content: String,
pub path: String,
}
impl std::fmt::Debug for ConfigFileData {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ConfigFileData")
.field("path", &self.path)
.field("content", &"*****")
.finish()
}
}
#[cfg_attr(
feature = "borsh",
derive(borsh::BorshSerialize, borsh::BorshDeserialize)
)]
#[serde_with::serde_as]
#[derive(Debug, PartialEq, Eq, Hash, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UserSessionResult {
#[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
#[serde(default)]
pub config_files: Vec<ConfigFileData>,
#[serde(rename = "entity")]
pub user_session: UserSession,
}
#[repr(u8)]
#[cfg_attr(
feature = "borsh",
derive(borsh::BorshSerialize, borsh::BorshDeserialize)
)]
#[cfg_attr(feature = "borsh", borsh(use_discriminant = true))]
#[derive(
Debug,
Clone,
PartialEq,
Eq,
Hash,
Serialize,
Deserialize,
PartialOrd,
Ord,
strum::FromRepr,
strum::Display,
strum::EnumString,
strum::AsRefStr,
strum::VariantNames,
)]
pub enum UserSessionType {
Bot = 4,
ChatClient = 3,
GraphicalClient = 1,
Headless = 2,
Unknown = 0,
}
impl Default for UserSessionType {
fn default() -> Self { Self::Unknown }
}