From dc2c4b02cb592b9523d48f2b7513c7ce1811f0c6 Mon Sep 17 00:00:00 2001 From: michael Date: Mon, 27 Apr 2026 06:22:54 -0700 Subject: [PATCH] refactor(common): move Policy types from types.rs into policy.rs --- common/src/lib.rs | 4 +++ common/src/policy.rs | 76 +++++++++++++++++++++++++++++++++++++++++++- common/src/types.rs | 66 -------------------------------------- daemon/src/dbus.rs | 8 ++--- daemon/src/state.rs | 3 +- 5 files changed, 85 insertions(+), 72 deletions(-) diff --git a/common/src/lib.rs b/common/src/lib.rs index 505cbef..bcf6fa8 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -1,2 +1,6 @@ pub mod policy; pub mod types; + +// Convenience re-exports — Phase 1 clients imported these from `types`. Keep +// the path stable to avoid churn in daemon/cli. +pub use policy::{Firstrun, Policy, StackPolicy, Storage, StorageBackend}; diff --git a/common/src/policy.rs b/common/src/policy.rs index 8768f20..0b4baa5 100644 --- a/common/src/policy.rs +++ b/common/src/policy.rs @@ -1 +1,75 @@ -// Policy parsing implemented in Phase 2. +//! Policy types and (Phase 2) parsing/merging logic. Wire-typed for D-Bus. + +use crate::types::{Method, Mode}; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, zvariant::Type, Default)] +#[serde(rename_all = "kebab-case")] +#[zvariant(signature = "s")] +pub enum StorageBackend { + #[default] + PerUser, + Central, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, zvariant::Type)] +pub struct StackPolicy { + pub mode: Mode, + pub methods: Vec, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, zvariant::Type, Default)] +pub struct Storage { + #[serde(default)] + pub backend: StorageBackend, + #[serde(default)] + pub central_path: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, zvariant::Type, Default)] +pub struct Firstrun { + #[serde(default)] + pub default_required_methods: Vec, + #[serde(default)] + pub deadline_hours: u32, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, zvariant::Type, Default)] +pub struct Policy { + #[serde(default)] + pub stacks: BTreeMap, + #[serde(default)] + pub storage: Storage, + #[serde(default)] + pub firstrun: Firstrun, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn policy_default_is_all_disabled() { + let p = Policy::default(); + assert!(p.stacks.is_empty()); + assert_eq!(p.storage.backend, StorageBackend::PerUser); + assert!(p.firstrun.default_required_methods.is_empty()); + assert_eq!(p.firstrun.deadline_hours, 0); + } + + #[test] + fn policy_serde_via_json() { + let mut p = Policy::default(); + p.stacks.insert( + "sudo".to_string(), + StackPolicy { + mode: Mode::Required, + methods: vec![Method::Fido2], + }, + ); + let json = serde_json::to_string(&p).unwrap(); + let back: Policy = serde_json::from_str(&json).unwrap(); + assert_eq!(p, back); + } +} diff --git a/common/src/types.rs b/common/src/types.rs index c19215e..2563fa4 100644 --- a/common/src/types.rs +++ b/common/src/types.rs @@ -1,5 +1,4 @@ use serde::{Deserialize, Serialize}; -use std::collections::BTreeMap; #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, zvariant::Type)] #[serde(rename_all = "lowercase")] @@ -37,47 +36,6 @@ pub struct Credential { pub created_unix: u64, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, zvariant::Type, Default)] -#[serde(rename_all = "kebab-case")] -#[zvariant(signature = "s")] -pub enum StorageBackend { - #[default] - PerUser, - Central, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, zvariant::Type)] -pub struct StackPolicy { - pub mode: Mode, - pub methods: Vec, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, zvariant::Type, Default)] -pub struct Storage { - #[serde(default)] - pub backend: StorageBackend, - #[serde(default)] - pub central_path: String, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, zvariant::Type, Default)] -pub struct Firstrun { - #[serde(default)] - pub default_required_methods: Vec, - #[serde(default)] - pub deadline_hours: u32, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, zvariant::Type, Default)] -pub struct Policy { - #[serde(default)] - pub stacks: BTreeMap, - #[serde(default)] - pub storage: Storage, - #[serde(default)] - pub firstrun: Firstrun, -} - #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, zvariant::Type)] pub struct PendingFlag { pub required_methods: Vec, @@ -119,30 +77,6 @@ mod tests { assert_eq!(s, "\"fido2\""); } - #[test] - fn policy_default_is_all_disabled() { - let p = Policy::default(); - assert!(p.stacks.is_empty()); - assert_eq!(p.storage.backend, StorageBackend::PerUser); - assert!(p.firstrun.default_required_methods.is_empty()); - assert_eq!(p.firstrun.deadline_hours, 0); - } - - #[test] - fn policy_serde_via_json() { - let mut p = Policy::default(); - p.stacks.insert( - "sudo".to_string(), - StackPolicy { - mode: Mode::Required, - methods: vec![Method::Fido2], - }, - ); - let json = serde_json::to_string(&p).unwrap(); - let back: Policy = serde_json::from_str(&json).unwrap(); - assert_eq!(p, back); - } - #[test] fn pending_flag_serde() { let f = PendingFlag { diff --git a/daemon/src/dbus.rs b/daemon/src/dbus.rs index b08deb5..766248e 100644 --- a/daemon/src/dbus.rs +++ b/daemon/src/dbus.rs @@ -1,8 +1,7 @@ use crate::polkit::Polkit; use crate::state::AppState; -use authforge_common::types::{ - Credential, Method, PendingFlag, Policy, PolicyApplyResult, Transport, -}; +use authforge_common::policy::Policy; +use authforge_common::types::{Credential, Method, PendingFlag, PolicyApplyResult, Transport}; use std::sync::Arc; pub struct AuthForge { @@ -121,7 +120,8 @@ impl AuthForge { #[cfg(test)] mod tests { use super::*; - use authforge_common::types::{Method, StackPolicy}; + use authforge_common::policy::StackPolicy; + use authforge_common::types::Method; use std::collections::BTreeMap; use zbus::connection::Builder; use zbus::Connection; diff --git a/daemon/src/state.rs b/daemon/src/state.rs index f86cb61..74c8902 100644 --- a/daemon/src/state.rs +++ b/daemon/src/state.rs @@ -1,4 +1,5 @@ -use authforge_common::types::{Credential, Method, PendingFlag, Policy, Transport}; +use authforge_common::policy::Policy; +use authforge_common::types::{Credential, Method, PendingFlag, Transport}; use std::collections::HashMap; use tokio::sync::RwLock;