Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
3add514
docs: PR1 GDPR deletion-controls design spec
JohnMcLear Apr 18, 2026
d5bc57b
docs: PR1 GDPR deletion-controls implementation plan
JohnMcLear Apr 18, 2026
ff8d3c3
feat(gdpr): scaffolding for pad deletion tokens
JohnMcLear Apr 18, 2026
8385b26
fix+test(gdpr): lazy DB access in PadDeletionManager + unit tests
JohnMcLear Apr 18, 2026
2890258
feat(gdpr): three-way auth for socket PAD_DELETE
JohnMcLear Apr 18, 2026
d4e181c
feat(gdpr): optional deletionToken on programmatic deletePad
JohnMcLear Apr 18, 2026
1c42d70
feat(gdpr): advertise optional deletionToken on REST deletePad
JohnMcLear Apr 18, 2026
9ae8211
test(gdpr): cover deletePad authorisation matrix via REST
JohnMcLear Apr 18, 2026
729ca7e
feat(gdpr): surface padDeletionToken in clientVars for creators only
JohnMcLear Apr 18, 2026
953c637
i18n(gdpr): strings for deletion-token modal and delete-with-token flow
JohnMcLear Apr 18, 2026
f26dc14
feat(gdpr): token modal + delete-with-token disclosure markup
JohnMcLear Apr 18, 2026
5cb2a26
feat(gdpr): show deletion token once, allow delete via recovery token
JohnMcLear Apr 18, 2026
d015a4a
style(gdpr): modal + delete-with-token layout
JohnMcLear Apr 18, 2026
1845bc2
test(gdpr): Playwright coverage for deletion-token modal + delete-wit…
JohnMcLear Apr 18, 2026
e3020d2
fix(test): auto-dismiss deletion-token modal in goToNewPad helper
JohnMcLear Apr 18, 2026
9e6d553
fix(test): dismiss deletion-token modal without focus transfer
JohnMcLear Apr 18, 2026
f64ba91
fix(gdpr): PadDeletionManager race + document createPad/deletePad
JohnMcLear Apr 19, 2026
baa11b5
fix(gdpr): always render delete-with-token in settings popup
JohnMcLear Apr 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 21 additions & 3 deletions doc/api/http_api.md
Original file line number Diff line number Diff line change
Expand Up @@ -519,12 +519,20 @@ Group pads are normal pads, but with the name schema GROUPID$PADNAME. A security
#### createPad(padID, [text], [authorId])
* API >= 1
* `authorId` in API >= 1.3.0
* returns `deletionToken` once, since the same release that added `allowPadDeletionByAllUsers`

creates a new (non-group) pad. Note that if you need to create a group Pad, you should call **createGroupPad**.
You get an error message if you use one of the following characters in the padID: "/", "?", "&" or "#".

`data.deletionToken` is a one-shot recovery token tied to this pad. It is
returned in plaintext on the first call for a given padID and is `null` on
subsequent calls (the token itself is stored on the server as a sha256 hash).
Pass it to **deletePad** (or the socket `PAD_DELETE` message) to delete the
pad without the creator's author cookie.

*Example returns:*
* `{code: 0, message:"ok", data: null}`
* `{code: 0, message:"ok", data: {deletionToken: "…32-char random string…"}}`
* `{code: 0, message:"ok", data: {deletionToken: null}}` — pad already existed
* `{code: 1, message:"padID does already exist", data: null}`
* `{code: 1, message:"malformed padID: Remove special characters", data: null}`

Expand Down Expand Up @@ -581,14 +589,24 @@ returns the list of users that are currently editing this pad
* `{code: 0, message:"ok", data: {padUsers: [{colorId:"#c1a9d9","name":"username1","timestamp":1345228793126,"id":"a.n4gEeMLsvg12452n"},{"colorId":"#d9a9cd","name":"Hmmm","timestamp":1345228796042,"id":"a.n4gEeMLsvg12452n"}]}}`
* `{code: 0, message:"ok", data: {padUsers: []}}`

#### deletePad(padID)
#### deletePad(padID, [deletionToken])
* API >= 1
* `deletionToken` in the same release as `allowPadDeletionByAllUsers`

deletes a pad.

deletes a pad
`deletionToken` is the one-shot recovery token returned by `createPad` /
`createGroupPad`. An apikey-authenticated caller can pass any (or no) token
and the call still succeeds — trusted admins bypass the check. An
unauthenticated caller (or a caller that explicitly passes a wrong token)
is rejected with `invalid deletionToken` unless the operator has set
`allowPadDeletionByAllUsers: true` in `settings.json`, in which case the
token is ignored.

*Example returns:*
* `{code: 0, message:"ok", data: null}`
* `{code: 1, message:"padID does not exist", data: null}`
* `{code: 1, message:"invalid deletionToken", data: null}`

#### copyPad(sourceID, destinationID[, force=false])
* API >= 1.2.8
Expand Down
Loading
Loading