Skip to main content

qualia_core_db/identity/
access_modality.rs

1//! Access modality and substrate-tier gate logic (from `0.0.19-g1-access-tier`).
2//!
3//! Gates data by tier, fail-closed:
4//! - non-permissive (open commons) is served to all;
5//! - permissive (`wf:` / credential-gated / protected) is served only to a *verified*
6//!   HumanCentric system, never to the traditional web.
7//!
8//! Pairs with [`super::credentials`] — the credential a request carries is what verifies a
9//! HumanCentric system for the permissive tier.
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub enum AccessModality {
13    HumanCentric,
14    TraditionalWeb,
15}
16
17#[derive(Debug, Clone, Copy, PartialEq, Eq)]
18pub enum DataTier {
19    /// Open commons, served to all.
20    NonPermissive,
21    /// `wf:` / credential-gated / protected, served only to verified HumanCentric systems.
22    Permissive,
23}
24
25#[derive(Debug, Clone, Copy, PartialEq, Eq)]
26pub enum AccessError {
27    /// The HumanCentric system is unverified; access fails closed.
28    UnverifiedHumanCentric,
29    /// The access modality (e.g. TraditionalWeb) lacks clearance for this tier.
30    InsufficientTier,
31}
32
33impl AccessModality {
34    /// Whether this modality may access `tier`. Fails closed when requirements aren't met.
35    pub fn can_access(&self, tier: DataTier, is_verified: bool) -> Result<(), AccessError> {
36        match (self, tier) {
37            // Open commons: served to all.
38            (_, DataTier::NonPermissive) => Ok(()),
39            // Permissive is never served to the traditional web.
40            (AccessModality::TraditionalWeb, DataTier::Permissive) => {
41                Err(AccessError::InsufficientTier)
42            }
43            // Permissive is served to HumanCentric only when verified.
44            (AccessModality::HumanCentric, DataTier::Permissive) => {
45                if is_verified {
46                    Ok(())
47                } else {
48                    Err(AccessError::UnverifiedHumanCentric)
49                }
50            }
51        }
52    }
53}
54
55#[cfg(test)]
56mod tests {
57    use super::*;
58
59    #[test]
60    fn traditional_web_access() {
61        let m = AccessModality::TraditionalWeb;
62        assert_eq!(m.can_access(DataTier::NonPermissive, false), Ok(()));
63        assert_eq!(m.can_access(DataTier::NonPermissive, true), Ok(()));
64        // Permissive is failed closed for the traditional web, verified or not.
65        assert_eq!(
66            m.can_access(DataTier::Permissive, false),
67            Err(AccessError::InsufficientTier)
68        );
69        assert_eq!(
70            m.can_access(DataTier::Permissive, true),
71            Err(AccessError::InsufficientTier)
72        );
73    }
74
75    #[test]
76    fn human_centric_access() {
77        let m = AccessModality::HumanCentric;
78        assert_eq!(m.can_access(DataTier::NonPermissive, false), Ok(()));
79        // Permissive requires verification; fails closed when unverified.
80        assert_eq!(m.can_access(DataTier::Permissive, true), Ok(()));
81        assert_eq!(
82            m.can_access(DataTier::Permissive, false),
83            Err(AccessError::UnverifiedHumanCentric)
84        );
85    }
86}