aboutsummaryrefslogtreecommitdiffstats
path: root/src/access/rules.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
commita3e936154e07ba3b95157d26ffeae9364f3d5cef (patch)
tree771a46e192e9cee20833cc61c9e7e6dad239baba /src/access/rules.rs
parent02e06975d02bd8f02d811b4dd1d45ecad2374861 (diff)
access: logouts apart from users' entries
_continuum/logouts/<name> holds when a user's tokens were last revoked, written by the user itself or by one who may manage users, so users' entries can be signed by their managers alone. Auth plan M7.
Diffstat (limited to 'src/access/rules.rs')
-rw-r--r--src/access/rules.rs9
1 files changed, 2 insertions, 7 deletions
diff --git a/src/access/rules.rs b/src/access/rules.rs
index c061893..4df0ba8 100644
--- a/src/access/rules.rs
+++ b/src/access/rules.rs
@@ -125,12 +125,7 @@ pub(crate) fn judge(doc: &Document, epoch: Epoch, change: &Change<'_>) -> Result
// Written by a root only.
(Some(meta::EPOCHS | meta::SWARM), _) => false,
// Logging out: a user revokes its own tokens (`POST /auth/logout`).
- (Some(meta::USERS), Some(owner))
- if path.get(3).map(String::as_str) == Some("tokensNotBefore")
- && change.user == Some(owner) =>
- {
- true
- }
+ (Some(meta::LOGOUTS), Some(owner)) => change.user == Some(owner) || user_may(path),
(Some(meta::REMAKES), Some(id)) => match path.get(3).map(String::as_str) {
// Its coordinator's; or a record carried into a new epoch whole, by the
// node that coordinated it (`remake::switch`): its proposal written with it.
@@ -312,7 +307,7 @@ mod tests {
&["_continuum/neighbours"]
)));
// Logging out: its own tokens only.
- let tokens = "_continuum/users/bob/tokensNotBefore";
+ let tokens = "_continuum/logouts/bob";
assert!(judged(&doc, "a", Some("bob"), &[tokens]).is_ok());
assert!(refused(judged(&doc, "a", Some("alice"), &[tokens])));
}