refactor(common): move Policy types from types.rs into policy.rs
This commit is contained in:
@@ -1,2 +1,6 @@
|
|||||||
pub mod policy;
|
pub mod policy;
|
||||||
pub mod types;
|
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};
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::collections::BTreeMap;
|
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, zvariant::Type)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, zvariant::Type)]
|
||||||
#[serde(rename_all = "lowercase")]
|
#[serde(rename_all = "lowercase")]
|
||||||
@@ -37,47 +36,6 @@ pub struct Credential {
|
|||||||
pub created_unix: u64,
|
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)]
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, zvariant::Type)]
|
||||||
pub struct PendingFlag {
|
pub struct PendingFlag {
|
||||||
pub required_methods: Vec<Method>,
|
pub required_methods: Vec<Method>,
|
||||||
@@ -119,30 +77,6 @@ mod tests {
|
|||||||
assert_eq!(s, "\"fido2\"");
|
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]
|
#[test]
|
||||||
fn pending_flag_serde() {
|
fn pending_flag_serde() {
|
||||||
let f = PendingFlag {
|
let f = PendingFlag {
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
use crate::polkit::Polkit;
|
use crate::polkit::Polkit;
|
||||||
use crate::state::AppState;
|
use crate::state::AppState;
|
||||||
use authforge_common::types::{
|
use authforge_common::policy::Policy;
|
||||||
Credential, Method, PendingFlag, Policy, PolicyApplyResult, Transport,
|
use authforge_common::types::{Credential, Method, PendingFlag, PolicyApplyResult, Transport};
|
||||||
};
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
pub struct AuthForge {
|
pub struct AuthForge {
|
||||||
@@ -121,7 +120,8 @@ impl AuthForge {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use authforge_common::types::{Method, StackPolicy};
|
use authforge_common::policy::StackPolicy;
|
||||||
|
use authforge_common::types::Method;
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use zbus::connection::Builder;
|
use zbus::connection::Builder;
|
||||||
use zbus::Connection;
|
use zbus::Connection;
|
||||||
|
|||||||
@@ -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 std::collections::HashMap;
|
||||||
use tokio::sync::RwLock;
|
use tokio::sync::RwLock;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user