Commit Graph
2173 Commits
Author SHA1 Message Date
Linus Rath 68d64f5018 fix: pair the policy with its own version and keep config reloads and saves from undoing each other #1066
Fixes from the review of the admin part:
- GET /api/admin/policy reads the policy and its version together; an
  identity check waiting on the store let another replica's change pair
  the old policy with the new ETag, and a save with it then won.
- A policy save answers with the stored policy and its ETag, and the
  policy, organisation, plugins and themes pages continue from that
  instead of reading it back from an instance that may not have it yet.
- A stored policy that doesn't parse keeps its version, so a save can
  replace it instead of answering 409 forever.
- A reload of another replica's change throws when this replica's writes
  kept landing while it read, so the change poller tries again; a write
  whose reload raced it reads the document again instead of applying its
  older result.
- Dropping a deleted plugin from the policy rereads policy.json first in
  local mode, as every other write does.
- New updateAdminConfig(key, change) builds a value on the stored one.

The policy route's test mocks gain getPolicyWithVersion.
2026-10-31 23:55:17 +01:00
Linus Rath d6e98e207a Merge branch 'feat/multi-instance' into feat/multi-instance-admin 2026-10-31 23:45:00 +01:00
Linus Rath 25408b2ac2 fix: refuse a policy save from a page opened before someone else saved #1066
The admin pages save the whole policy from the draft they loaded. A
save from a page opened before another tab's or another admin's save,
or before a deleted plugin was dropped from the policy, used to put the
older policy back. GET /api/admin/policy now sends the policy version as
an ETag; the policy, organisation, plugins and themes pages send it back
as If-Match, and a save based on an older version answers 409 and keeps
the draft on the page. A PUT without If-Match replaces the policy as
before. Deleting a plugin or theme changes only its id in the stored
policy, and a policy import compares against what it replaces.

Test mocks of the config manager gain getPolicyVersion and updatePolicy,
which the route and the extension cleanup now call.
2026-10-31 22:57:57 +01:00
Linus Rath fd4a319eae feat: show the storage and how many instances checked in on the admin overview #1066 2026-10-31 22:46:08 +01:00
Linus Rath 35508913ac feat: show marketplace screenshots above the versions and open them large on click 2026-10-31 18:55:05 +01:00
Linus Rath d23a2869d1 Merge remote-tracking branch 'origin/main' into fix/found-fix-server
# Conflicts:
#	Dockerfile
#	docker-compose.yml
2026-10-31 18:17:39 +01:00
Linus Rath 6a1da49f52 fix: let accessibility reset bring back the organisation's defaults and cover every option 2026-10-31 17:57:20 +01:00
Linus Rath 48c8d37e37 fix: hide subscribe to calendar in lite, which can't fetch feeds 2026-10-31 17:52:28 +01:00
Linus Rath f11ddf82dd fix: tell banner plugins when an admin opened the mailbox through impersonation 2026-10-31 17:48:29 +01:00
Linus Rath a9e93881b5 feat: match filter conditions against a regular expression #885 2026-10-31 17:45:26 +01:00
Linus Rath 73a7bb7bcd fix: send the headers plugins add to an outgoing message instead of dropping them 2026-10-31 17:40:20 +01:00
Linus Rath f8805b8d52 fix: keep remote content blocked for trusted senders when the organisation locks it to block 2026-10-31 17:32:24 +01:00
Linus Rath 9d529ca98f feat: reply from the address a message was delivered to when to, cc and bcc have no match #1353 2026-10-31 16:55:10 +01:00
Linus Rath e68036e7b0 fix: line up the select-all checkbox with the row checkboxes in mountain view #1473 2026-10-31 16:31:18 +01:00
Linus Rath e128515156 fix: show the real total of the unified inbox in mountain view instead of the loaded count #1471 2026-10-31 16:31:17 +01:00
Linus Rath 663a875972 fix: give the folders their own heading under the unified mailbox in mountain view #1470 2026-10-31 16:31:16 +01:00
Linus Rath b8223a4492 Merge pull request #1466 from HOLOEYE-JZ/feat/plugin-open-email
feat(plugins): api.ui.openEmail opens a message in the reader
2026-10-31 16:25:05 +01:00
Linus Rath c09be1cdd3 Merge pull request #1456 from HOLOEYE-JZ/feat/plugin-frame-activity
feat(plugins): input in a plugin frame counts as activity for the idle sign-out
2026-10-31 16:25:03 +01:00
Linus Rath e5ed50dc92 Merge pull request #1467 from HOLOEYE-JZ/feat/plugin-hooks-account-and-composer
feat(plugins): star and after-send hooks name the mail's account
2026-10-31 16:25:00 +01:00
Linus Rath 258dc5e54f Merge pull request #1454 from VasilisNtovolos/fix/save-draft-pending-attachments
fix: wait for attachment uploads before saving and closing drafts
2026-10-31 16:24:58 +01:00
Linus Rath 2ceeef3fb9 Merge pull request #1464 from VasilisNtovolos/fix/xhr-upload-inactivity-timeout
fix: time out stalled XHR uploads after inactivity
2026-10-31 16:24:56 +01:00
Linus Rath 608d23bc14 Merge pull request #1446 from robertdoneill/fix/command-palette-focus-outline
fix: keep the command palette field's focus outline inside the dialog
2026-10-31 16:24:50 +01:00
Linus Rath 341b84fe19 Merge pull request #1448 from vietnamvps/add-vietnamese
feat(i18n): add Vietnamese language support
2026-10-31 16:24:47 +01:00
Linus Rath bc6fee7556 feat: let timed events show as coloured text or a dot in the month view #1449 2026-10-31 16:23:00 +01:00
Linus Rath d3fecae85f feat: hide the contacts directory when the server refuses it, and let users or admins turn it off #1457 2026-10-31 16:22:24 +01:00
Linus Rath 6c5a727a59 fix: let an identity be saved without a display name #1462 2026-10-31 16:22:22 +01:00
Linus Rath d381144c99 feat: put reply and reply all at the top of the open message on the phone in mountain view #1475 2026-10-31 16:21:40 +01:00
Linus Rath 7c88fb8c5b fix: shrink the mail body to its content when it gets shorter after opening #1474 2026-10-31 16:21:35 +01:00
Linus Rath c13b87c0e8 fix: keep the undo toast off the header on phones #1472 2026-10-31 16:15:58 +01:00
Linus Rath a0da9eb6c2 fix: show the results when searching with a message open in mountain view #1468 2026-10-31 16:15:57 +01:00
Linus Rath 8a4d9e36c9 fix: hide the account dot in the unified view with only one account 2026-10-31 15:57:34 +01:00
Linus Rath 3bdbdb1364 docs: move the mobile hand-off contract to the website 2026-10-31 14:32:39 +01:00
VasilisNtovolos 2e8a73ffd2 fix: time out stalled XHR uploads after inactivity 2026-10-31 15:16:17 +02:00
Jacob Zeitz d5cd3c6e40 feat(plugins): star and after-send hooks name the mail's account
Message ids repeat across accounts, so a hook payload naming only an
emailId could not tell a plugin which mailbox the message lies in when
it is a shared or group account's.

onBeforeEmailStarToggle and onEmailStarToggle now carry accountId when
the starred message is not in the user's own account, as the
message-row-actions click context does. Every star (the row's button,
the reader's star, the key, the menu) goes through toggleStar, one
message at a time, so one accountId names it; the account is resolved
before the plugins are asked. An own message's payload is unchanged.

onAfterEmailSend now carries accountId, the JMAP account the sent
message lies in (a mail sent from a shared or group identity lies in
that account), so api.email.get finds it. sendEmail returns that account
as emailAccountId, the S/MIME send too. The hook also carries
composerId, the id the sending composer's slots and actions gave
plugins, so a plugin can act on what the user chose in that composer.
2026-10-31 14:15:06 +01:00
Jacob Zeitz 54ad6390b3 feat(plugins): api.ui.openEmail opens a message in the reader
A plugin opens a message as a click on a list row or on a search result
entry naming one does, also a message of a shared or group account,
reached through the login that reads it. On the mail page it opens in
place, in the Pro shell in an email tab as a message link does there;
elsewhere the tab loads the message's link, at most five times a minute.
A message no login reads, or one its account does not have, is refused
with an error the plugin sees, as is one the mail page could not open.
Needs email:read.
2026-10-31 14:14:48 +01:00
Linus Rath fb3ba0275a feat: hand the mobile app a one-time code instead of the sign-in in its link 2026-10-31 14:06:44 +01:00
Linus Rath 4887ed457c fix: stop list toolbar timers from firing after the toolbar is gone 2026-10-31 02:28:55 +01:00
Linus Rath b11139887d fix: stop the hearing preset card from looking selected 2026-10-31 02:06:19 +01:00
Linus Rath fe65ab528b fix: keep a one-digit unread folder count next to its total 2026-10-31 02:01:16 +01:00
Linus Rath 5340499520 fix: give quick reply the composer's placeholder, attachment and send confirmation checks 2026-10-31 02:00:51 +01:00
Linus Rath 8a09ba5734 fix: leave a bounce's delivery report out of list chips and forwards 2026-10-31 01:50:03 +01:00
Linus Rath d4682890ab fix: hide the quick actions on the open message once the pointer leaves it 2026-10-31 01:47:00 +01:00
Linus Rath c166651d14 fix: leave the preview line out of the density sample while show preview is off 2026-10-31 01:41:35 +01:00
Linus Rath 5f1d03f19c fix: stop the message list from jumping back while scrolling 2026-10-31 01:38:17 +01:00
Linus Rath b9d795b2cc fix: show demo mode as a plain sidebar row instead of a tinted box 2026-10-31 01:37:42 +01:00
Linus Rath 3bb9f7df84 fix: lead with the address when two accounts share a name in the account switcher 2026-10-31 01:37:06 +01:00
Linus Rath 7ecde89fc6 fix: keep the sidebar header gear and plus buttons from running into the folder row below 2026-10-31 01:36:08 +01:00
Linus Rath 99aff47d6e fix: label the search filter panel's button search instead of done 2026-10-31 01:31:04 +01:00
Linus Rath 8b29254a61 fix: hide reply on drafts and scheduled messages in mountain view conversations #1404 2026-10-31 01:26:58 +01:00
Pasquale 3b4b6b9e77 feat: add reply all to expanded mountain view message headers #1404 2026-10-31 01:23:22 +01:00