aboutsummaryrefslogtreecommitdiffstats
path: root/src/api/peers.rs
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-11-07 22:35:21 +0100
committertv <tv@krebsco.de>2026-11-07 22:35:21 +0100
commit046b738c74f62469f7a080415690e2dacd85e1e6 (patch)
treed38a6903535d5fcc4f88e697cada351a25a3cf72 /src/api/peers.rs
parentd7a6bc3ed201ff2ca953f74f62154e5e17728f22 (diff)
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.
Diffstat (limited to 'src/api/peers.rs')
-rw-r--r--src/api/peers.rs15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/api/peers.rs b/src/api/peers.rs
index b00593f..cd9381f 100644
--- a/src/api/peers.rs
+++ b/src/api/peers.rs
@@ -252,6 +252,7 @@ pub(crate) async fn peer_list(state: &AppState) -> PeerListResponse {
/// `DELETE /peers/{pk}`: forgets a peer swarm-wide.
pub(crate) async fn delete_peer(
State(state): State<AppState>,
+ user: Option<axum::Extension<crate::api::auth::AuthenticatedUser>>,
Path(peer): Path<String>,
Query(query): Query<DeletePeerQuery>,
) -> Result<StatusCode, StatusCode> {
@@ -279,11 +280,17 @@ pub(crate) async fn delete_peer(
serde_json::json!({ "at": state.clock.now_millis().as_u64(), "by": state.local_id() });
let peer_clone = peer.clone();
+ // Named as who asked: rules by path judge the change by them (`access::rules`).
+ let user = user.map(|axum::Extension(user)| user.0);
state
- .mutate_doc(move |doc| {
- store::write_path(doc, &forgotten_path(&peer_clone), &record)?;
- crate::swarm::members::unregister(doc, &peer_clone)
- })
+ .mutate_doc_for(
+ user,
+ crate::document::signatures::Sign::Protocol,
+ move |doc| {
+ store::write_path(doc, &forgotten_path(&peer_clone), &record)?;
+ crate::swarm::members::unregister(doc, &peer_clone)
+ },
+ )
.await
.map_err(|e| store_status(e, "Failed to write forget record").status())?;