gioser
⎇ d6b8f18b43c9bd9bf7268e48b61392a2d62bb229 crates/ente-zero/src/graph/capabilities.rs Rust · 33 líneas · 1.1 KB Historia Quién tocó qué crudo

Pausa: 11 crates del fractal Ente #0 con cerebro completo d6b8f18b4 · Sergio ·

1//! Mediación de capabilities: emisión y revocación de tokens.
2//!
3//! El Init no fuerza políticas — sólo verifica que el proveedor existe y
4//! emite tokens. Las políticas reales (quién puede pedir qué, rate limits,
5//! audit) se aplican en capas superiores.
6
7use super::{EnteGraph, GrantedCapability};
8use crate::events::CapabilityGrant;
9use ente_card::Capability;
10use tokio::sync::oneshot;
11use ulid::Ulid;
12
13impl EnteGraph {
14    pub async fn mediate_capability(
15        &mut self,
16        from: Ulid,
17        cap: Capability,
18        reply: oneshot::Sender<CapabilityGrant>,
19    ) {
20        let grant = match self.providers.get(&cap).and_then(|s| s.iter().next().copied()) {
21            None => CapabilityGrant::NoProvider,
22            Some(provider) => {
23                let token = self.next_token;
24                self.next_token += 1;
25                self.grants.insert(token, GrantedCapability {
26                    cap: cap.clone(), provider, holder: from,
27                });
28                CapabilityGrant::Granted { token }
29            }
30        };
31        let _ = reply.send(grant);
32    }
33}