From 97a69e09021244e994602ac5038b4bd7bc16ba78 Mon Sep 17 00:00:00 2001 From: tv Date: Mon, 9 Nov 2026 04:44:36 +0000 Subject: access: `*` for any one key in a capability's path A capability's path covered by prefix only, so what is the same at every key of a map (each node's log filter, say, at `_continuum/local//log` from the next patch on) took a capability per key. Now a `*` segment stands for any one key, as it already does in signed paths and sealed places (`envelope`, `sealed`, which now share one `agree`): * covering (`Capability::covers`): the pattern no longer than the path, and agreeing with it segment by segment; * listings (`reaches`): pattern and path agreeing on the segments both have, so every key on the way shows, nothing past where the pattern differs; * narrowing (`Capability::holds`, for a token's limit narrowed again and a refresh's): at or below, a `*` only under a `*`: a limit naming one key never widens to all. A `*` first is outside protocol data, so it never covers `_continuum`, as `[]` doesn't. A key that is `*` itself can't be named alone. Every node judges changes by capabilities, so all must read them alike: they run the same version. --- src/access/sealed.rs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) (limited to 'src/access/sealed.rs') diff --git a/src/access/sealed.rs b/src/access/sealed.rs index ed5024c..7e48e34 100644 --- a/src/access/sealed.rs +++ b/src/access/sealed.rs @@ -24,7 +24,7 @@ use base64::{ use serde_json::Value as JsonValue; use sha2::{Digest, Sha256}; -use super::{envelope, registry, sshsig}; +use super::{agree, envelope, registry, sshsig}; use crate::document::{ReadDoc, meta, store}; /// What every sealed value starts with. @@ -90,13 +90,6 @@ fn reaches(declared: &[Declared], path: &[String]) -> bool { declared.iter().any(|declared| agree(&declared.path, path)) } -fn agree(pattern: &[String], path: &[String]) -> bool { - pattern - .iter() - .zip(path) - .all(|(segment, key)| segment == "*" || segment == key) -} - /// How an age file names `key` as a recipient: the first four bytes of the SHA-256 of /// its SSH encoding, base64, unpadded. pub(crate) fn tag(key: &sshsig::PublicKey) -> String { -- cgit v1.3.1