Commit Graph
2196 Commits
Author SHA1 Message Date
Linus Rath cbd23db2fe fix: give mail import and export their own settings section and name the upload limit as the server does
- Settings > Backup & reset gets a Mail files section for Import mail
  and Export all mail, instead of sitting under settings backup.
- The pause message names Stalwart's 50000000-byte quota as 50 MB, not
  48 MB, and the dialog and settings texts mention .ost files.
- The old import's leftovers go: expandImportableEmails and
  EML_IMPORT_ACCEPT in lib/eml-import.ts, and the strings
  email_viewer.import_email, mailbox_context_menu.import_email and
  notifications.import_email_success/_error in all 30 locales.

lib/__tests__/eml-import.test.ts loses the tests of the removed
functions; its #891 checks that an .eml and an .eml in a ZIP keep their
Date header now run against the import's own sources.
2026-11-01 07:05:02 +01:00
Linus Rath 75aa66e0d9 feat: say when an import or export running in the background ends, and keep the focus in its dialog 2026-11-01 07:01:28 +01:00
Linus Rath 9d4d3261da fix: clear exported mail from the browser's storage and say plainly where an export goes
- The private file an export writes in Firefox and Safari is deleted
  when the app starts and when someone signs in, not only at the next
  export, and at once on sign-out. Close keeps it until its download
  had time to finish. Each tab holds its own files under a Web Lock, so
  one tab's sweep no longer deletes another tab's running export.
- A browser whose private file system can't write files (Safari before
  26) is told the export stays in memory instead of being promised a
  download.
- The export's live region announces only the phase and pauses; the
  count next to it no longer floods screen readers, and the format
  group is named once.
2026-11-01 06:50:13 +01:00
Linus Rath 7102a6f0cb fix: read Outlook files more safely and put their special folders in the right place
- A message whose attachments are bigger than the server takes is
  skipped before anything is read (a 1 GB attachment took several GB in
  the worker and could crash it), and a worker that stops answering
  ends the import with a message instead of a wait that never ends.
- The items after a broken one in a PST folder are counted as
  unreadable in the summary instead of disappearing.
- Sent Items and Deleted Items are known from the PST's own entry IDs,
  and the Inbox and the others by their names in more languages, so a
  PST imported at the top level fills the user's own folders whatever
  its language. The hint about that shows only for the top level.
- Message-ID, In-Reply-To and Content-ID from the PST can't carry line
  breaks into the rebuilt headers.
2026-11-01 06:45:33 +01:00
Linus Rath 8d48f98261 fix: keep failed messages for the next import run and stop an import that can't go on
A message that failed for a passing reason (a dropped connection, a
server error, an expired token) used to count as done, so continuing
the import skipped it for good, and a slow upload followed by a cancel
imported the messages after it twice.

- The checkpoint keeps every message that is done, also past a gap,
  and the next run of the same import tries only the rest again.
- Ten failures in a row, a full mailbox (overQuota) or a refusal
  (forbidden) stop the import with a message instead of going through
  the whole file.
- An upload without an answer pauses the import instead of failing the
  message: 30 seconds, then until the upload window ends.
- Email/import, the export's Blob/get and folder listing pass the
  client's own 429 pause by, and a 429 on them doesn't pause the rest
  of the app.
- Signing out stops the job of that account only, writes no checkpoint
  and imports nothing more afterwards; another account's sign-out
  leaves the job alone.
- One tab imports a file at a time (Web Locks), and Import waits until
  the dialog knows whether an earlier run can be continued.

The import dialog tests now wait for the Import button to be enabled
before clicking it, since it stays off during that lookup.
2026-11-01 06:37:08 +01:00
Linus Rath 75fbd18bb9 fix: space the icon on the import dialog's Choose files button 2026-11-01 05:53:08 +01:00
Linus Rath d8f6be7b1e fix: delete a finished export's file from the browser when its account signs out 2026-11-01 05:42:00 +01:00
Linus Rath 58f66c4fdc fix: list the folders in the import dialog when it opens from Settings 2026-11-01 05:42:00 +01:00
Linus Rath 15f0bd198c feat: export a folder or the whole account as mbox or ZIP 2026-11-01 05:28:58 +01:00
Linus Rath a06281f23f feat: import Outlook PST files into their folders 2026-11-01 05:13:02 +01:00
Linus Rath d714957f98 feat: import mbox, EML and ZIP mail with progress, pause and resume 2026-11-01 04:58:55 +01:00
Linus Rath 123018f322 feat: add the policy sections and admin pages for the enterprise features 2026-11-01 04:20:02 +01:00
Linus Rath 84de2395f0 fix: keep trusted senders from loading remote content anywhere while the organisation blocks it 2026-11-01 03:27:49 +01:00
Linus Rath d781e8762e Merge branch 'feat/multi-instance' 2026-11-01 01:43:15 +01:00
Linus Rath 391f22cf7d test: open attachments through the bar's tile button in the blob routing tests 2026-11-01 00:51:10 +01:00
Linus Rath f25b9ea34b fix: keep hidden buttons on attachment cards from catching taps 2026-11-01 00:48:41 +01:00
Linus Rath 905d841be4 chore: drop the outdated Stalwart/RocksDB warning from files 2026-11-01 00:41:41 +01:00
Linus Rath 4842e08cde fix: show shared mailboxes under each account when several are signed in #1486 2026-11-01 00:24:57 +01:00
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 eb2e3b2baa feat: make the attachment bar the default and retire attachments beside the sender 2026-10-31 23:35:54 +01:00
Linus Rath 417f512765 feat: add preview cards under the message as an attachment position 2026-10-31 23:28:20 +01:00
Linus Rath 77c23a9e56 feat: show attachments as a bar of equal tiles under the message header 2026-10-31 23:20:53 +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 3e79c6e718 fix: keep tags, scheduled order and the subfolder action right on compact shared mailboxes #1342 2026-10-31 22:23:21 +01:00
Jacob Zeitz fca08981a1 feat: compact shared mailboxes in the sidebar #1342
Closes #1483
2026-10-31 22:17:39 +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