Viewer role enforcement (server refuses unsigned writes) #62
Labels
No labels
area:docs
area:identity
area:ops
area:plugin
area:server
channel:community
channel:direct
channel:owned
channel:press
channel:social
e2ee-constrained
gate:at-ga
gate:pre-ga
marketing
parity
relay:absent
relay:planned
relay:requested
relay:supported
risk:additive
risk:contract
risk:none
usability
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Nectenda/nectenda#62
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Part of #37. Depends on #39 (signing-key enrolment) reaching high coverage.
What Relay does
Not shipped. "Advanced permissions — granular read/write controls at folder
level" is Active on their roadmap; their issue #26 has been open since 2025;
enableReaderRoledefaults tofalseand their docs say read-only isunsupported. Shipping this would put us ahead of them on their own roadmap
item.
The trap that must not be missed
ws-server.tschecks onlycanAccesson three paths:Push(:661),PutSnapshot(:713) andDeleteDoc(:737). AndputSnapshot(
doc-store.ts:190) runsDELETE FROM doc_updates WHERE doc_name = ? AND seq <= ?.So a viewer role that gates only writes would let a viewer destroy history.
Gate all three, or do not ship it.
The honest caveat to ship alongside
A viewer still holds the folder content key, so they can read forever and fork
locally. What the signature buys is that the relay refuses their writes, so
their edits never reach anyone else. That is a real boundary and it is
defensible — and
docs/sync-limitations.md:555already says any server-enforcedrole is a convenience rather than a cryptographic guarantee. Keep saying it.
The reason the role was removed originally — Obsidian offers no cancellable
file-operation hook — no longer applies: the deletion happens locally, the
server refuses to record it, and nobody else sees it.
Rollout
Per folder, once every member has enrolled a signing key. Not a global switch.
Risk
risk:contract.Verification
A viewer attempts each of the three paths and is refused on all three. Invert and
confirm each test fails. Then assert the caveat: a viewer can still read.
Moved to the Vikunja board as NEC-39: https://projectron.nerchure.com/tasks/39