refactor(common): move Policy types from types.rs into policy.rs

This commit is contained in:
michael
2026-04-27 06:22:54 -07:00
parent 57c97b492c
commit dc2c4b02cb
5 changed files with 85 additions and 72 deletions

View File

@@ -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};

View File

@@ -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<Method>,
}
#[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<Method>,
#[serde(default)]
pub deadline_hours: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, zvariant::Type, Default)]
pub struct Policy {
#[serde(default)]
pub stacks: BTreeMap<String, StackPolicy>,
#[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);
}
}

View File

@@ -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<Method>,
}
#[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<Method>,
#[serde(default)]
pub deadline_hours: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, zvariant::Type, Default)]
pub struct Policy {
#[serde(default)]
pub stacks: BTreeMap<String, StackPolicy>,
#[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<Method>,
@@ -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 {

View File

@@ -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;

View File

@@ -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;