Commit Graph
774 Commits
Author SHA1 Message Date
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 62bed18fe8 Merge branch 'feat/org-features' into feat/org-teaminbox 2026-10-28 07:38:25 +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 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 f0a89fdb65 fix: forget delegate names on sign-out and when their account is removed 2026-10-28 06:27:28 +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 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 2ace501871 Merge branch 'feat/org-features' into feat/org-signatures 2026-10-28 04:51:22 +01:00
Linus Rath 73c12d03eb fix: ask about every external recipient but the identity's own Bcc, trust only the identity's From, and queue a second question 2026-10-28 04:15:12 +01:00
Linus Rath 65e83e4b0d fix: show the session warning above every overlay and count the server's sign-in time 2026-10-28 03:53:56 +01:00
Linus Rath 6e5d8faec6 feat: refuse to restore or renew sessions older than the admin-set maximum length 2026-10-28 02:30:32 +01:00
Linus Rath 65e3d0d2d4 feat: let admins set an organisation signature with user details per domain or group #908
Admins write an HTML and a plain-text signature with placeholders on
Organisation > Signatures, per scope. Users fill in the details it asks
for once, under Settings > Account. Without a lock it is the default for
addresses without a signature of their own; locked or hidden, it
replaces every signature.

- `lib/org-signature.ts` fills the templates: values escaped, lines whose
  placeholders are all empty dropped
- the composer applies it right before the plugin signature, so new mail,
  replies, forwards, re-opened drafts, plain text and identity swaps all
  take it the way they take an identity signature; quick reply too
- a send finaliser puts a locked signature back once when it was deleted
- the identity editor shows the filled-in signature read-only with "Set
  by your organisation" when locked, and no editor when hidden
- `signatureDetails` is a synced setting
2026-10-28 02:23:55 +01:00
Linus Rath 45cc6988e0 feat: sign out after an admin-set idle time or session length, with a warning first 2026-10-28 02:18:07 +01:00
Linus Rath 2855ca0010 feat: confirm before sending to recipients outside the organisation 2026-10-28 01:59:13 +01:00
Linus Rath 084cf3cf3a fix: fetch the policy again only for an account of a domain it doesn't cover 2026-10-28 01:08:56 +01:00
Linus Rath d19095fafe feat: fetch the policy again when an account from another domain is added 2026-10-28 00:35:00 +01:00
Linus Rath 4b69f1307f feat: let admins scope the user policy per domain or group 2026-10-28 00:29:02 +01:00
Linus Rath ec295ad59f Merge pull request #1384 from VasilisNtovolos/fix/bulk-delete-partial-results
fix: reconcile confirmed permanent bulk deletions
2026-10-27 23:14:11 +01:00
Linus Rath 73015c7d0e Merge pull request #1380 from HOLOEYE-JZ/fix/task-fetch-race
fix: keep one account's tasks out of another's task list
2026-10-27 23:14:05 +01:00
Linus Rath 011ff0e93a feat: warn before sending a message with unfilled placeholders 2026-10-27 22:30:33 +01:00
VasilisNtovolos fb52770b58 test: register source clients in cross-account deletion tests 2026-10-27 15:39:48 +02:00
VasilisNtovolos ac99c68ef3 fix: reconcile confirmed permanent bulk deletions 2026-10-27 14:51:38 +02:00
Jacob ZeitzandClaude Opus 5.5 1509e8c799 fix: keep one account's tasks out of another's task list
The task store was not cleared on an account switch, unlike the calendar,
contacts and the other account-scoped stores, so the next account showed
the previous one's tasks until its own arrived. And a fetch answered after
a later one had started still wrote its list: the outgoing account's
answer could put its tasks back after the switch, and an older answer
could replace a newer one.

clearAllStores now clears the tasks, and each fetch gets a number: only
the latest one's answer or error is kept, and clearing drops the fetches
still under way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 10:31:54 +01:00
Linus Rath aa860e5a85 fix: sign in to Bulwark Lite with password and TOTP on Stalwart 1.0 2026-10-26 20:27:16 +01:00
Linus Rath e5f9099658 fix: show new mail of a group or shared account in the unified inbox without a click #1350 2026-10-26 20:01:11 +01:00
Linus Rath 9de2efb722 fix: open a shared or group account's message from its link instead of the own message with the same id #1351 2026-10-26 20:01:11 +01:00
Linus Rath 613451dfef fix: keep loading older mail when a saved or refreshed list has no total from the server #1364 2026-10-26 20:01:09 +01:00
Linus Rath 87d0bbeb01 fix: show a calendar that appears after the first load instead of leaving it unticked #1372 2026-10-26 20:01:08 +01:00
Linus Rath 2f8b4863ff Merge pull request #1338 from HOLOEYE-JZ/feat/plugin-search-results 2026-10-26 19:32:56 +01:00
Linus Rath e99cce05fe Merge pull request #1370 from maxhaomh/feat/disable-quick-reply 2026-10-26 19:24:49 +01:00
Max Hao 7216089629 feat: add quick reply feature with toggle in settings and tests 2026-10-26 11:40:47 -04:00
Linus Rath 89be5f1e5b fix: keep every calendar hidden after reload when the user hid them all 2026-10-26 16:13:52 +01:00
Linus Rath 0b917d6262 fix: mark the replied, forwarded or receipted message as answered in its own account, not another account's message with the same id 2026-10-26 16:11:52 +01:00
Linus Rath ea6d414e5b fix: show the scheduled badge and its buttons only on the scheduled message, not on another account's message with the same id 2026-10-26 16:11:51 +01:00
Linus Rath acac3128bc fix: archive and delete a message from its own account's folders in tag and unified views 2026-10-26 16:11:51 +01:00
Linus Rath d72bff95f9 fix: stop acting on a message of a signed-out account through the active account 2026-10-26 16:11:51 +01:00
Linus Rath 87701c8c20 fix: keep the calendars shown or hidden in the Pro interface as the user set them 2026-10-26 15:15:58 +01:00
Linus Rath 2e9bb56071 fix: apply a subscribed calendar feed's changes to events it still carries 2026-10-26 15:15:58 +01:00
Linus Rath f829d4a2e8 fix: ask the next user again before running plugins installed by someone who signed out 2026-10-26 15:15:58 +01:00
Linus Rath abef4224b5 fix: switch to the remaining account on sign-out instead of signing out of all when it was signed in before the page loaded 2026-10-26 14:58:31 +01:00
Linus RathandAlmost-Senseless-Coder b88397dfd2 fix: renew a background OAuth account with its own token instead of the active account's #989
Co-authored-by: Almost-Senseless-Coder <109462027+Almost-Senseless-Coder@users.noreply.github.com>
2026-10-26 14:58:31 +01:00
Linus Rath e314e56661 fix: keep the own and a group's scheduled mail apart when their ids are the same 2026-10-26 12:26:58 +01:00
Linus Rath 292ccce9ee fix: delete, move and change groups of another signed-in account's contacts in that account 2026-10-26 12:25:31 +01:00
Linus Rath 4cfdc877d1 fix: keep a contact created in a shared address book from being mistaken for an own contact with the same id 2026-10-26 12:25:31 +01:00
Linus Rath cd2bcc0520 fix: load the calendar range once, not twice, after creating a recurring event 2026-10-26 12:25:31 +01:00
Linus Rath 33c5ca8125 test: check bulk moves against the per-login routing 2026-10-26 12:25:09 +01:00
Linus Rath 72e5af2c52 fix: take a shared folder's Trash from the viewed folder list when bulk deleting 2026-10-26 12:25:09 +01:00
Linus Rath 88b960d605 fix: stop deleting the active account's mail after removing the account whose folder is open 2026-10-26 12:25:08 +01:00
Linus Rath eeb6ccc4db fix: create each account's Archive when bulk archiving in the unified inbox 2026-10-26 12:25:08 +01:00
Linus Rath f9ccc6adf1 fix: clear the refresh token of an OAuth account that could not be restored 2026-10-26 11:33:37 +01:00