Skip to main content

supercode_interchange/world/
access.rs

1//! Allowlists, admins and pairing (ยง2.4; Hermes gateway "Security & Access").
2
3use std::collections::BTreeMap;
4
5use schemars::JsonSchema;
6use serde::{Deserialize, Serialize};
7
8/// Per-platform policy.
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Default)]
10#[serde(rename_all = "snake_case")]
11pub enum AccessPolicy {
12    /// Only allowlisted (or paired) senders.
13    #[default]
14    Allowlist,
15    /// Anyone.
16    Open,
17}
18
19/// A pairing code waiting for an admin.
20#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
21pub struct PendingPairing {
22    /// The platform the sender wrote on.
23    pub platform: String,
24    /// The sender.
25    pub user_id: String,
26    /// RFC3339 issue instant; expires after `pairing_ttl_minutes`.
27    pub issued_at: String,
28}
29
30/// The access record (`access.yaml`).
31#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
32pub struct Access {
33    /// Allowed senders per platform.
34    #[serde(default)]
35    pub allowlist: BTreeMap<String, Vec<String>>,
36    /// Admins per platform.
37    #[serde(default)]
38    pub admins: BTreeMap<String, Vec<String>>,
39    /// Outstanding pairing codes.
40    #[serde(default)]
41    pub pending_pairings: BTreeMap<String, PendingPairing>,
42    /// Policy per platform; `allowlist` when absent.
43    #[serde(default)]
44    pub policy: BTreeMap<String, AccessPolicy>,
45    /// Minutes a pairing code lives; `None` = the reducer's default (15).
46    #[serde(default)]
47    pub pairing_ttl_minutes: Option<u32>,
48}