Commit Graph
1603 Commits
Author SHA1 Message Date
Linus Rath 2b24b4503f fix: load shared accounts' folders in batched, parallel requests #1409 2026-10-28 19:15:51 +01:00
Linus Rath 8108249a35 Merge pull request #1406 from HOLOEYE-JZ/feat/plugin-ui-navigate
# Conflicts:
#	app/(main)/[locale]/layout.tsx
2026-10-28 17:02:42 +01:00
Linus Rath 935f48c450 Merge pull request #1399 from lucamzanon/perf/tag-counts-keyword-get 2026-10-28 17:02:23 +01:00
Linus Rath fba04d2251 Merge pull request #1401 from lucamzanon/perf/keepalive-while-push-healthy 2026-10-28 17:02:23 +01:00
Linus Rath 3f71bbedee test: allow JMAP Metadata only in the Bulwark metadata adapter, now that Stalwart v1.0.0 implements it 2026-10-28 15:14:49 +01:00
Linus Rath 96797597c5 Merge branch 'main' into feat/org-features 2026-10-28 15:14:34 +01:00
Jacob Zeitz ba45d0f8b9 feat(plugins): api.ui.openPage moves the tab to one of the plugin's own pages 2026-10-28 13:50:12 +01:00
Linus Rath fdd00ac639 Merge branch 'ux/final-ccs' 2026-10-28 13:24:08 +01:00
Linus Rath 0c5ed0c606 fix: show the lite 404 page in the language of its address, right to left for arabic, hebrew and persian 2026-10-28 13:09:30 +01:00
Linus Rath a2877173a1 fix: drop the admin save bar when a field is put back to its saved value, empty included 2026-10-28 12:52:23 +01:00
Linus Rath 382b26f128 fix: ask before the rail or the mountain view top bar leaves an event or task with unsaved changes 2026-10-28 12:50:59 +01:00
Linus Rath 2bb63f648b fix: keep the phone conversation's reply buttons readable and count its messages with each language's plural forms 2026-10-28 12:46:18 +01:00
Linus Rath 8fb4e51dc5 fix: end mail menu items in an ellipsis only where they open a dialog, drop the key hint and say Report spam on the reader button in every language 2026-10-28 12:42:22 +01:00
Linus Rath 106d16e9f5 fix: keep the mail search placeholder short enough to show in full in every language 2026-10-28 12:37:26 +01:00
Linus Rath 8597858865 fix: bring mail back to its list after the tour on phones instead of an empty reading pane 2026-10-28 12:34:27 +01:00
Linus Rath e654eadd37 Merge branch 'main' into ux/mail3 2026-10-28 11:10:56 +01:00
Linus Rath 0eb68f1743 Merge branch 'ux/settings-admin2' 2026-10-28 11:06:39 +01:00
Linus Rath 9014dda3cb Merge branch 'ux/contacts-files2' 2026-10-28 11:04:04 +01:00
Linus Rath 94029e5aa2 fix: ask before the nav rail or the phone tab bar leaves a contact or group form with changes 2026-10-28 10:43:55 +01:00
Linus Rath f8a2d7821a fix: say when a rescheduled message goes out now after Reschedule 2026-10-28 10:35:53 +01:00
Linus Rath feac899133 fix: say "new calendar", "new app password", "new API key", "add public key", "sub-addressing" and "back to mail" in settings and the admin 2026-10-28 10:33:03 +01:00
Linus Rath 53c49143ec fix: drop the scheduled badge from a demo message once its send is cancelled 2026-10-28 10:29:26 +01:00
Linus Rath 039ed0598b fix: make Forward as attachment, Export as .eml and View source work in the demo 2026-10-28 10:23:20 +01:00
Linus Rath 715c3f03a3 fix: let Enter on the skip link move focus to the message list instead of opening a message 2026-10-28 10:22:00 +01:00
Linus Rath a9468929fd fix: say that address books and contact categories can be deleted in settings, not only renamed 2026-10-28 10:21:35 +01:00
Linus Rath 945fd219a7 fix: point the mail client hint to the app passwords section below it 2026-10-28 10:20:41 +01:00
Linus Rath 55fb5acef5 fix: keep a file's Modified time on move, Undo and restore in the demo 2026-10-28 10:19:46 +01:00
Linus Rath 9c2952c437 fix: take the tour to the screen of each step on a phone and count only the steps it shows 2026-10-28 10:19:13 +01:00
Linus Rath 62ab48aee4 fix: ask "discard changes?" with keep editing and discard in settings editors and the admin pages, as in calendar and contacts 2026-10-28 10:19:10 +01:00
Linus Rath cc46573524 fix: say "filters saved", "identity created" and "templates exported" without "successfully" 2026-10-28 10:13:14 +01:00
Linus Rath ce092ac1ab fix: stop adding blank lines to the external rules block on every filter save 2026-10-28 09:55:39 +01:00
Linus Rath 1322f6c3f0 fix: switch between demo accounts without the app crashing 2026-10-28 09:48:49 +01:00
Linus Rath 5d90a850bd Merge branch 'feat/org-recovery' into feat/org-features
# Conflicts:
#	components/email/email-list.tsx
2026-10-28 09:17:56 +01:00
lucamzanon 825f47caa1 perf: skip the keep-alive echo while the push stream is live
Every connected client sent a Core/echo every 30 seconds for as long as
the page was open, background tabs included: 120 requests an hour per
login, which on an otherwise idle night made up nearly all the traffic
a server saw. A client with an SSE stream already hears from the server
every 30 seconds, since the stream is opened with ping=30.

The keep-alive tick now skips the echo when the stream delivered an
event or a ping within the last 45 seconds and the previous echo did not
fail. A stream that goes quiet or drops lets the echo through again on
the next tick, so a lost connection is still reported and reconnected
as before, at most one tick later. Clients without a stream (no
eventSourceUrl, or over the per-tab stream budget) keep pinging every
30 seconds.
2026-10-28 09:15:36 +01:00
Linus Rath 272083399c Merge branch 'feat/org-tags' into feat/org-features
# Conflicts:
#	lib/admin/restriction-keys.ts
#	lib/jmap/client.ts
2026-10-28 09:15:17 +01:00
lucamzanon 15ec489178 perf: count tags with one Keyword/get on servers that count keywords
getTagCounts sends two Email/query per tag: 240 method calls for 120
tags, and the sidebar re-runs it after every push. A server that
advertises the keywords capability with supportsCounts already reports
each keyword's total and unread in Keyword/get, so the counts now come
from one call there, and from the queries as before everywhere else or
when that call fails.

Trash and Junk (#1156) are not subtracted on this path. Keyword/get has
no filter, and taking them out would need the two per-tag queries this
avoids. The counts are the server's own for the keyword; a gateway that
maps tags to provider labels reports what the provider shows for the
label.
2026-10-28 09:09:14 +01:00
Linus Rath f1a666777b Merge branch 'feat/org-features' into feat/org-recovery 2026-10-28 09:08:49 +01:00
Linus Rath 4d846cfc91 fix: read the whole deleted items archive newest first and only for the account shown #1319
Stalwart's x:ArchivedItem/query without calculateTotal scans ids
ascending, stops at 5000 and only then reverses them, so the newest
items of a large archive never showed, and admin accounts got every
account's items. The review of the branch also found gaps around
account switches, restores and focus.

- Read the archive in pages of 500 with calculateTotal, newest first,
  stop at a whole page older than the days limit, and offer
  "Show older" after 2000 items; detection asks for one item.
- Send the accountId filter and fall back without it on
  unsupportedFilter; keep only items of the account, never one without
  an account id.
- Ask nothing until config and policy are loaded and the policy is the
  current account's; the later check after a refusal is forced.
- Show the Trash link only when the archive holds a message inside the
  days limit; the Settings page shows whenever the server has the
  feature and says that archiving must be on in Stalwart.
- Restore: notFound leaves the list with a note, forbidden hides the
  page, results for another account are dropped, the button keeps focus.
- Forget what servers said at a full sign-out.
2026-10-28 09:08:44 +01:00
Linus Rath 3a03bc363b Merge branch 'feat/org-templates' into feat/org-features 2026-10-28 09:01:42 +01:00
Linus Rath 33ca8efb0f fix: keep shared tags safe when members edit at once or the server fails
The first version wrote the whole tag list on every change, guessed a
group when the server wouldn't say, and treated a failed read like a
server without metadata. Now:

- Definitions are a map by tag id under `tags`, and each change patches
  one tag (`metadata/org.bulwarkmail.tags/tags/<id>`), so two members
  adding tags at once both keep theirs. Fields and colors this version
  doesn't know survive. The `{ list }` and bare-array shapes are still
  read and converted by the first save.
- Shared tags appear only for confirmed group principals. A failed
  principal lookup keeps the user's own tags and asks again later.
- "No metadata advertised" (0.16) and "the read failed" are separate.
  A failed read keeps the last good tags; a failed save keeps the change,
  says so, and sends it with the next good read after the client's
  pause.
- Push reloads wait for 5 s of quiet and skip the echo of our own save;
  a returning tab reloads definitions only, and the scan for unnamed tags
  runs once per sign-in and then at most every 30 minutes.
- The editor names its buttons after the tag, shows the delete warning
  and 44 px buttons on phones, returns focus to the edit button, and
  asks for Inbox rights only for confirmed groups.
2026-10-28 08:58:11 +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 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 0cd28097e6 Merge branch 'main' into ux/mail2 2026-10-28 08:16:51 +01:00
Linus Rath 42b694fb2c feat: save attachments of shared and group mailboxes to Files by copying the blob on the server 2026-10-28 08:16:47 +01:00
Linus Rath 7f06ed7637 Merge branch 'feat/org-features' into feat/org-tags
# Conflicts:
#	lib/admin/restriction-keys.ts
2026-10-28 08:14:39 +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 ed9fa2de45 feat: offer Undo after a move to another account and in lists that mix accounts, moving the messages back into their folders 2026-10-28 08:06:45 +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