Commit Graph
972 Commits
Author SHA1 Message Date
Linus Rath 08f25506d4 Merge branch 'feat/org-teaminbox' into feat/org-features 2026-10-28 08:26:48 +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 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 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 795faceee7 Merge branch 'feat/org-thirdparty' into feat/org-features 2026-10-28 05:51:22 +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 9e809a31db Merge branch 'feat/org-features' into feat/org-thirdparty 2026-10-28 05:27:58 +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 1202a13720 fix: judge external mail by the message's own account and the sending account in several-account setups 2026-10-28 05:11:24 +01:00
Linus Rath bcf4f3a7a6 feat: give a delegate access to mail, calendars and contacts in one step 2026-10-28 05:11:23 +01:00
Linus Rath 60167f752f fix: label mail as External when any sender is outside or has no domain, and show the domain on a tap 2026-10-28 05:09:35 +01:00
Linus Rath 836dcba66e fix: don't count senders whose images the user allowed as contacts for the external recipient confirm 2026-10-28 05:09:03 +01:00
Linus Rath 2ace501871 Merge branch 'feat/org-features' into feat/org-signatures 2026-10-28 04:51:22 +01:00
Linus Rath 4bb596a9a0 test: cover the plugin API's own no-third-party locks #903 2026-10-28 04:30:43 +01:00
Linus Rath 010e9fb6d9 feat: fence a Lite build made with no third-party traffic to its own hosts #903 2026-10-28 04:30:42 +01:00
Linus Rath 1a747ac9dd feat: limit the page's CSP to the configured hosts with no third-party traffic #903 2026-10-28 04:30:41 +01:00
Linus Rath 381494fe34 fix: move push registrations to the organisation's relay when the relay changes #903 2026-10-28 04:30:33 +01:00
Linus Rath a9c89ae7a2 fix: fail closed while the third-party switch is unknown or set as a string #903 2026-10-28 04:30:32 +01:00
Linus Rath 031d94635c refactor: keep the outgoing host descriptions out of the browser bundle and scan every URL form #903 2026-10-28 04:30:23 +01:00
Linus Rath b945a789f9 fix: match internationalised domains in either form and name the domains an admin typed wrong 2026-10-28 04:05:46 +01:00
Linus Rath 1f1319d46e fix: hand the retired plugin's parts over one switch at a time and tell plugins about each switch 2026-10-28 03:54:47 +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 893ecb5b16 fix: drop empty signature lines inside span and font wrappers and keep logos on them 2026-10-28 03:48:28 +01:00
Linus Rath defe4e93f3 fix: bind the sign-in time to the refresh token and count unstamped sessions from a fixed time 2026-10-28 03:42:19 +01:00
Linus Rath 612abe1595 test: cover removing old push registrations in the no third-party traffic mode #903 2026-10-28 02:46:39 +01:00
Linus Rath c9f2115eb1 test: scan the built Lite bundle for outside hosts #903 2026-10-28 02:44:06 +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 92c9110f3c feat: show the third-party traffic switch and what stays reachable in Organisation > Security #903 2026-10-28 02:24:13 +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 794e0b439e test: fail when a new outgoing host appears #903 2026-10-28 02:21:45 +01:00
Linus Rath 553f1e9149 feat: add a switch that stops all third-party traffic #903 2026-10-28 02:19:06 +01:00
Linus Rath ab878ebf4f feat: tell plugins when Bulwark's own external mail warnings are on and skip the retired plugin's 2026-10-28 02:10:10 +01:00
Linus Rath 79c697a935 feat: let an automatic sign-out save open and minimised drafts first 2026-10-28 01:55:15 +01:00
Linus Rath b504e39b63 feat: label mail from outside the organisation 2026-10-28 01:53:39 +01:00
Linus Rath 7ea0a7d58d feat: read and write account metadata for shared Bulwark data 2026-10-28 01:14:30 +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 87817f545f fix: stop flagging invitations from users on your own domains as unverified #1374 2026-10-27 23:26:14 +01:00
Linus Rath b78968971c fix: send from the account's identity when the composer has no From address #1377 2026-10-27 23:23:49 +01:00
Linus Rath 0e026cab2e fix: list files on Stalwart 1.0 when the account holds more nodes than one get allows #1385 2026-10-27 23:20:07 +01:00
Linus Rath 85fb392ab3 fix: open the account security docs on bulwarkmail.org instead of the webmail's host #1387 2026-10-27 23:17:09 +01:00
Linus Rath be52744a5d Merge pull request #1379 from phumiphat2201/feat/i18n-thai-locale
feat(i18n): Add Enterprise Thai (th) localization catalog & integration
2026-10-27 23:14:18 +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 be5fc12622 feat: let each translation list its own placeholder fill-in words 2026-10-27 23:03:41 +01:00
Linus Rath 6f4a6fee77 feat: catch fill-ins like [Votre nom] or [您的姓名] in every app language 2026-10-27 22:52:23 +01:00
Linus Rath c355b0d552 feat: add a setting to turn off the placeholder warning 2026-10-27 22:32:38 +01:00