Commit Graph
3229 Commits
Author SHA1 Message Date
Linus Rath 3a03bc363b Merge branch 'feat/org-templates' into feat/org-features 2026-10-28 09:01:42 +01:00
Linus Rath 9d9a50e407 test: cover migrating a browser's templates and hidden personal templates against the test servers 2026-10-28 08:33:05 +01:00
Linus Rath e82679c3dc fix: name the admin section for deleted mail Recover deleted items, as users see it 2026-10-28 08:30:11 +01:00
Linus Rath dfa37ee311 fix: take the browser's templates into the account as soon as its synced settings have loaded 2026-10-28 08:29:03 +01:00
Linus Rath 2ed87b2b7f docs: add the team inbox plugin and the new plugin APIs to the changelog 2026-10-28 08:28:38 +01:00
Linus Rath 08f25506d4 Merge branch 'feat/org-teaminbox' into feat/org-features 2026-10-28 08:26:48 +01:00
Linus Rath b6d49aac4f test: check that the team inbox badge names bob where the server shares names 2026-10-28 08:25:02 +01:00
Linus Rath 23f67a5e72 fix: keep plugin chips named by their filter, draw the team icons at once and pass attributes to icons still loading 2026-10-28 08:16:52 +01:00
Linus Rath c00c7080a1 fix: give plugins the directory only with their own permission, and only confirmed team mailboxes
- `directory:read` for api.user.findPeople, with at least 3 characters,
  at most 20 ids, 20 results and 10 lookups a minute, in the directory
  of the account the call names; one load in flight per client.
- Plugins hear `group` only for accounts the server confirmed are group
  principals; the policy's fallback stays for the admin's scopes.
- The email.* keyword methods refuse $draft, $junk, $notjunk and
  $phishing.
- A plugin keeps at most 4 KB in a mailbox and reads it 30 times a
  minute; the email:write consent text says others in a team mailbox
  can read it.
- email.updateKeywords also changes the rows of expanded conversations.
2026-10-28 08:16:52 +01:00
Linus Rath 9304557819 fix: look up another signed-in account for the external mail checks only when an admin turned them on 2026-10-28 08:07:55 +01:00
Linus Rath f1bcba6222 fix: start merging the browser's template list from the sync driver, not at import 2026-10-28 07:53:54 +01:00
Linus Rath 2a5f6fc6f0 test: cover expired tombstones and a lone queued deletion at sign-out 2026-10-28 07:48:49 +01:00
Linus Rath 62bed18fe8 Merge branch 'feat/org-features' into feat/org-teaminbox 2026-10-28 07:38:25 +01:00
Linus Rath 88f20e1ab0 fix: never lose personal templates to a deletion, a clock or a settings load elsewhere
The first version took a template missing from the account's Inbox
metadata as deleted, skipped the browser's own list once the account
held anything, wrote the marker before the settings blob had loaded,
and let a round overwrite edits made while it ran. Each of these could
drop templates, or bring deleted ones back.

Now the marker entry `org.bulwarkmail.templates` holds tombstones
(90 days, at most 8 KB, oldest dropped first) and only a tombstone
deletes; a missing entry is uploaded again. Every round merges the
browser's list in when it is this account's, each version once, minus
what a newer tombstone deleted. While settings sync hasn't loaded the
account's settings, the list isn't used and no marker is written; a
blob that loads later is merged into the account's copy. The settings
blob drops its templates only once the marker is on the server. Without
settings sync the list goes into the first account that answers only.
A round that saw changes while it ran plans again against the server as
it left it. An answer without the metadata property counts as
unsupported. Changes move `updatedAt` past the previous value, dateless
synced templates get a fixed early date, and ids that don't fit a
metadata key get a new id derived from the old one. Queued changes go
out before an account signs out; a full sign-out keeps unsent templates
and deletions.

Team templates are written only if the entry is still the version the
edit started from ("Changed by someone else"), never carry Bcc, and a
refusal is told apart by Stalwart's error type. The template manager's
lists are a real tab list with arrow keys and 44 px row buttons on
phones.
2026-10-28 07:34:25 +01:00
Linus Rath 4aa4606b84 fix: give plugins no personal templates when the admin hid them 2026-10-28 07:34:23 +01:00
Linus Rath 63d64bba13 fix: show who a template addresses before inserting it and suggest the account's own categories 2026-10-28 07:34:05 +01:00
Linus Rath 8d8bc26602 test: check that the team inbox names are kept in the team Inbox on Stalwart v1.0.0 2026-10-28 07:19:08 +01:00
Linus Rath 5efcca2315 test: cover the team inbox plugin's assignment, filters and phone menu against the test servers 2026-10-28 07:16:53 +01:00
Linus Rath b5e92ba176 Merge branch 'feat/org-features' into feat/org-templates
# Conflicts:
#	lib/admin/restriction-keys.ts
2026-10-28 07:10:25 +01:00
Linus Rath 9f7e875faf docs: add delegates to the changelog 2026-10-28 06:49:14 +01:00
Linus Rath 2944ead665 test: check that the 1.0 test build drops the metadata request and the app stays online 2026-10-28 06:45:12 +01:00
Linus Rath a69d7eee33 feat: let plugins work with team mailboxes: list filters, row badge icons, account info and message conditions
What the team inbox plugin needs, kept general for other plugins:

- `api.ui.setListFilters`: keyword filters drawn as chips in the list
  header of the folders they apply to (by account kind and folder
  role). A chip the user turns on is ANDed into the folder's query and
  comes off with one click; a keyword change a filter tests loads the
  list again (ui:message-list).
- Actions get `accounts`, `hasKeyword` and `notKeyword`, so a button
  shows only on messages of group accounts, or of a keyword state; the
  click of message-row-actions and reader-actions carries the message's
  `accountId`.
- `api.email.updateKeywords`: several keywords in one change, through
  the list for a listed message (email:write).
- `api.user.getSelf`, `getMailAccounts` and `findPeople`: the user's own
  account id (Stalwart's principal id), which accounts are group
  accounts, and people from the directory (account:read).
- `api.accountData`: a plugin's own entry in a mail account's shared
  Inbox metadata on Stalwart 1.0 (email:read / email:write).
- Row badges take an `icon`.
2026-10-28 06:39:57 +01:00
Linus Rath e3479c1a19 test: cover shared templates against the test servers 2026-10-28 06:38:40 +01:00
Linus Rath 82918fc7d7 Merge branch 'feat/org-features' into feat/org-delegates
# Conflicts:
#	lib/admin/restriction-keys.ts
2026-10-28 06:30:09 +01:00
Linus Rath 49c9ec6a45 fix: start a delegate's Change from what they have and keep what fits no choice as it is
Change used to pre-fill the closest choice and then replace everything
of that type, so a folder added after "all", a single non-Inbox folder,
a non-default calendar, free/busy only or manager rights were narrowed
or widened on Save. Now a type gets a choice only when the grants match
it exactly; anything else starts at "Keep as it is", which leaves that
type out of the patch. Mixed levels keep each type's rights.

Also in the Delegates page:
- Change and Remove wait, with Try again, while a type couldn't be read
- an answer from the account before an account switch is dropped
- calendars, contacts and files follow their feature gates
- Remove says it covers what was shared from the user's own account
- typing your own address says "That's you"
- groups named only by the session get the group badge
- on Stalwart 1.0 the read hint says read delegates can flag mail
- the person list is plain buttons, not a listbox without arrow keys
- the rights follow sharingRights
2026-10-28 06:28:02 +01:00
Linus Rath f0539a33f6 feat: let admins limit every share dialog to read access with sharingRights 2026-10-28 06:27:49 +01:00
Linus Rath f0a89fdb65 fix: forget delegate names on sign-out and when their account is removed 2026-10-28 06:27:28 +01:00
Linus Rath 5ce0f96f26 fix: read delegate sharing only for the apps that are on, with the file tree alongside 2026-10-28 06:27:07 +01:00
Linus Rath 87e41f0403 feat: share team templates in a group mailbox 2026-10-28 06:24:46 +01:00
Linus Rath 47c47b4f08 feat: keep personal templates in the account on Stalwart 1.0 2026-10-28 06:13:47 +01:00
Linus Rath 57065d7ef2 feat: show an organisation template library from the admin 2026-10-28 05:53:50 +01:00
Linus Rath daa1cccdb2 docs: add the no third-party traffic switch to the changelog #903 2026-10-28 05:53:25 +01:00
Linus Rath 795faceee7 Merge branch 'feat/org-thirdparty' into feat/org-features 2026-10-28 05:51:22 +01:00
Linus Rath 9a99fa617e docs: add external mail warnings to the changelog 2026-10-28 05:50:36 +01:00
Linus Rath 00ea203f4f refactor: describe the sending identity and account once for every send check 2026-10-28 05:50:17 +01:00
Linus Rath 687cd89346 Merge branch 'feat/org-external' into feat/org-features
# Conflicts:
#	lib/outgoing/quick-reply.ts
#	lib/outgoing/send-pipeline.ts
2026-10-28 05:46:11 +01:00
Linus Rath b680a676c0 test: check that remote pictures say the organisation blocks them with no third-party traffic #903 2026-10-28 05:42:43 +01:00
Linus Rath 638e7c2670 fix: start the delegate dialog in the search field 2026-10-28 05:42:04 +01:00
Linus Rath 9bae704c03 test: cover delegates through the real UI on the test servers 2026-10-28 05:38:44 +01:00
Linus Rath 0bd63fca08 fix: name a delegate from the accounts they share with you when the directory won't 2026-10-28 05:38:44 +01:00
Linus Rath b0eb9fcfe1 fix: say the organisation blocks remote content instead of offering to load it with no third-party traffic #903 2026-10-28 05:38:39 +01:00
Linus Rath 9e809a31db Merge branch 'feat/org-features' into feat/org-thirdparty 2026-10-28 05:27:58 +01:00
Linus Rath 9f230ca8fc fix: keep a quick reply as a draft when an automatic sign-out comes while the external recipient question is open 2026-10-28 05:23:25 +01:00
Linus Rath 36ec531fb8 fix: account for the pdf.js namespaces in the Lite bundle host scan #903 2026-10-28 05:22:37 +01:00
Linus Rath 6c3ec30a7e docs: add organisation signatures and disclaimers to the changelog 2026-10-28 05:20:29 +01:00
Linus Rath 823da8c810 Merge branch 'feat/org-features' into feat/org-external
# Conflicts:
#	components/email/email-viewer.tsx
#	components/mail/mail-app.tsx
2026-10-28 05:19:21 +01:00
Linus Rath c31cb76a47 test: check that a running Gravatar plugin reaches nothing with no third-party traffic #903 2026-10-28 05:19:08 +01:00
Linus Rath 1a92eba702 test: check that a refused address lookup shows the directory note on its own 2026-10-28 05:18:49 +01:00
Linus Rath 2a90437fbc test: give the domain list test time under load 2026-10-28 05:15:40 +01:00
Linus Rath 3be3ad5ddf test: cover quick reply Back, the domain on a tap and the plugin hand-over per switch against the test servers 2026-10-28 05:14:00 +01:00