diff --git a/common/src/types.rs b/common/src/types.rs index ad091d2..a57cc3a 100644 --- a/common/src/types.rs +++ b/common/src/types.rs @@ -1,20 +1,47 @@ use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, zvariant::Type, +)] #[serde(rename_all = "lowercase")] +#[zvariant(signature = "s")] pub enum Mode { Disabled, Optional, Required, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, zvariant::Type, +)] #[serde(rename_all = "lowercase")] +#[zvariant(signature = "s")] pub enum Method { Fido2, Totp, } +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, zvariant::Type, +)] +#[serde(rename_all = "lowercase")] +#[zvariant(signature = "s")] +pub enum Transport { + Usb, + Nfc, + Internal, + Unknown, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, zvariant::Type)] +pub struct Credential { + pub id: String, + pub nickname: String, + pub method: Method, + pub transport: Transport, + pub created_unix: u64, +} + #[cfg(test)] mod tests { use super::*; @@ -32,4 +59,18 @@ mod tests { let s = serde_json::to_string(&m).unwrap(); assert_eq!(s, "\"fido2\""); } + + #[test] + fn credential_roundtrips_via_serde() { + let c = Credential { + id: "abc123".to_string(), + nickname: "Yellow Yubikey".to_string(), + method: Method::Fido2, + transport: Transport::Usb, + created_unix: 1_700_000_000, + }; + let json = serde_json::to_string(&c).unwrap(); + let back: Credential = serde_json::from_str(&json).unwrap(); + assert_eq!(c, back); + } }