From 22d3e8148d30887041a030b93b3e6de3f749a6cd Mon Sep 17 00:00:00 2001 From: tv Date: Sat, 7 Nov 2026 22:35:21 +0100 Subject: access: bans _continuum/banned/: every node refuses the banned node's changes from then on (judged as the ban stood) and leaves its handshakes unanswered. Auth plan M6. --- src/access/bans.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/access/bans.rs (limited to 'src/access/bans.rs') diff --git a/src/access/bans.rs b/src/access/bans.rs new file mode 100644 index 0000000..339f6cf --- /dev/null +++ b/src/access/bans.rs @@ -0,0 +1,18 @@ +//! Banned nodes (`_continuum/banned/`, `{"by", "at", "reason"}`), written by a +//! user who may write there, as any protocol data: a node refuses a banned node's +//! handshake, so it neither syncs with it nor counts it a member (`swarm::peer`), and +//! with the swarm's policy every node refuses the changes a banned node commits +//! (`access::rules`, judged as the ban stood when they were made). Deleting the entry +//! lifts the ban. + +use crate::document::{ReadDoc, meta, store}; + +/// Where `node`'s ban is. +pub(crate) fn path(node: &str) -> Vec { + meta::path(&[meta::BANNED, node]) +} + +/// Whether `doc` bans `node`. +pub(crate) fn banned(doc: &impl ReadDoc, node: &str) -> bool { + store::read_path(doc, &path(node)).ok().flatten().is_some() +} -- cgit v1.3.1