⎇ d6b8f18b43c9bd9bf7268e48b61392a2d62bb229
crates/ente-zero/src/graph/capabilities.rs
Historia
Quién tocó qué
crudo
Pausa: 11 crates del fractal Ente #0 con cerebro completo
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}