From 046b738c74f62469f7a080415690e2dacd85e1e6 Mon Sep 17 00:00:00 2001 From: tv Date: Sat, 7 Nov 2026 22:35:21 +0100 Subject: remake: forgetting and releasing name their user Forget records and released quarantines name the user who made them, so they are judged by its capabilities. Auth plan M6. --- src/remake/mod.rs | 13 +++++++++++++ src/remake/quarantine.rs | 11 +++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) (limited to 'src/remake') diff --git a/src/remake/mod.rs b/src/remake/mod.rs index 67fa77b..342eab3 100644 --- a/src/remake/mod.rs +++ b/src/remake/mod.rs @@ -297,6 +297,19 @@ pub(crate) trait Host: Clone + Send + Sync + 'static { T: Send + 'static, E: From + Send + 'static; + /// [`commit_doc`](Self::commit_doc) for `user`, who asked through the API: the + /// change names them (`replica::Writer`), as rules by path judge it + /// (`access::rules`). + fn commit_doc_for( + &self, + user: Option, + f: F, + ) -> impl Future> + Send + where + F: FnOnce(&mut Transaction<'_>) -> Result + Send + 'static, + T: Send + 'static, + E: From + Send + 'static; + /// What a replay does with writes a newer one superseded (`--superseded-writes`). fn superseded(&self) -> Superseded; diff --git a/src/remake/quarantine.rs b/src/remake/quarantine.rs index bb34d73..e7214d6 100644 --- a/src/remake/quarantine.rs +++ b/src/remake/quarantine.rs @@ -159,7 +159,13 @@ pub(crate) async fn document(State(host): State, Path(id): Path(State(host): State, Path(id): Path) -> Response { +/// `POST /admin/quarantine/{id}/replay`: the entry's paths written as they were, +/// by the user who asked (`access::rules` judges the change by them). +pub(crate) async fn replay( + State(host): State, + user: Option>, + Path(id): Path, +) -> Response { if !host.is_node_ready().await { return error_response(StatusCode::SERVICE_UNAVAILABLE, "node is not ready", None); } @@ -170,7 +176,8 @@ pub(crate) async fn replay(State(host): State, Path(id): Path(delta::replay_paths( &entry.document, -- cgit v1.3.1