use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use ts_keys::{NetworkLockPublicKey, NodePublicKey};
use url::Url;
use crate::{
host_info::HostInfo,
user::{Login, User},
};
#[derive(Clone, Debug, PartialEq, Eq, Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct RegisterAuth<'a> {
pub auth_key: &'a str,
}
impl<'a> From<&'a str> for RegisterAuth<'a> {
fn from(value: &'a str) -> Self {
Self { auth_key: value }
}
}
#[repr(isize)]
#[derive(Clone, Debug, Default, PartialEq, serde_repr::Serialize_repr)]
pub enum SignatureType {
#[default]
None = 0,
Unknown = 1,
V1 = 2,
V2 = 3,
}
#[serde_with::apply(
bool => #[serde(skip_serializing_if = "crate::util::is_default")],
&str => #[serde(borrow)] #[serde(skip_serializing_if = "str::is_empty")],
Option => #[serde(skip_serializing_if = "Option::is_none")],
Vec => #[serde(skip_serializing_if = "Vec::is_empty")],
_ => #[serde(default)],
)]
#[derive(Clone, Debug, Default, Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct RegisterRequest<'a> {
pub version: ts_capabilityversion::CapabilityVersion,
pub node_key: NodePublicKey,
pub old_node_key: Option<NodePublicKey>,
#[serde(rename = "NLKey")]
pub nl_key: Option<NetworkLockPublicKey>,
#[serde(borrow)]
pub auth: Option<RegisterAuth<'a>>,
pub expiry: Option<DateTime<Utc>>,
pub followup: Option<Url>,
#[serde(borrow)]
pub hostinfo: HostInfo<'a>,
pub ephemeral: bool,
#[serde(skip_serializing_if = "crate::util::is_default")]
pub signature_type: SignatureType,
pub timestamp: Option<DateTime<Utc>>,
#[serde(borrow)]
pub device_cert: Option<&'a [u8]>,
#[serde(borrow)]
pub signature: Option<&'a [u8]>,
#[serde(borrow)]
pub node_key_signature: Option<&'a str>,
#[serde(borrow)]
pub tailnet: Option<&'a str>,
}
#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct RegisterResponse<'a> {
#[serde(borrow)]
pub user: User<'a>,
#[serde(borrow)]
pub login: Login<'a>,
pub node_key_expired: bool,
pub machine_authorized: bool,
#[serde(rename = "AuthURL", borrow)]
pub auth_url: &'a str,
pub node_key_signature: Option<&'a str>,
#[serde(borrow)]
pub error: &'a str,
}