Commit Graph
4960 Commits
Author SHA1 Message Date
Linus Rath 69ec26fe33 fix: remove a recipient whole on the second Backspace instead of turning it into text
The mention test's Backspace check now expects the chip to be selected, not put back into the field as text.
2026-11-04 08:43:29 +01:00
Linus Rath 1fdfffad45 fix: read the send hook count safely in the composer's Options menu 2026-11-04 08:42:39 +01:00
Linus Rath 472ee53d88 fix: insert pasted and dropped images without a dialog, with an optional Add description chip
The image description tests now open the dialog from the chip on the image, since a drop no longer opens it by itself.
2026-11-04 08:36:25 +01:00
Linus Rath ad0b238e3d feat: open a reply under the message it answers, which stays readable above it 2026-11-04 08:32:05 +01:00
Linus Rath 7517b024ec fix: make Discard on the Continue draft bar delete the draft, with Undo, and reach it by keyboard 2026-11-04 08:23:01 +01:00
Linus Rath d98132b8e1 fix: close every composer the same way, keeping the draft with Draft saved and Discard
X, Escape, clicking another message and Escape in a pop-out window
now all save the draft and close, with a "Draft saved" toast that has
Discard (with Undo). The Save or discard question shows only when that
save fails. A Reply or Forward closed before the user changed anything
leaves no draft. Undo send being on by default no longer asks "Send
without a delay?" on servers without delayed sending; only a delay the
user picked does.

Changed test assertions: the close-guard, priority, account-switch,
threading, sign-out, mention, draft-attachments, discard-uploads and
save-pending-attachments tests reached saving or discarding through the
Save or discard dialog on close, which now only appears after a failed
save. They now close directly, or use the Discard button, or check the
failed-save question. The send-delay test marks its delay as chosen.
2026-11-04 08:22:56 +01:00
Linus Rath 8570f678e2 Merge branch 'feat/do-ux-compose-windows' into feat/do-ux-compose-fixes
# Conflicts:
#	components/email/email-composer.tsx
2026-11-04 07:42:11 +01:00
Linus Rath 17bf3c4e6f Merge branch 'feat/do-ux-compose-send' into feat/do-ux-compose-fixes 2026-11-04 07:41:26 +01:00
Linus Rath ad7ff4fc6b fix: label the Attach from Files dialog's X as Close 2026-11-04 07:37:26 +01:00
Linus Rath 48df0db1af feat: list To and Cc in the header of a forwarded message 2026-11-04 07:34:29 +01:00
Linus Rath e6f8c7a241 fix: show who a quick reply goes to and offer the full editor by name
The quick reply tests find the box by its new placeholder key, which
names the recipients instead of "Write a quick reply...".
2026-11-04 07:25:05 +01:00
Linus Rath 242d0bacfc fix: keep toasts at the bottom instead of over the composer's close button 2026-11-04 07:16:24 +01:00
Linus Rath 165c949960 feat: save a message as a template with just a name, and show each template's name once 2026-11-04 07:13:05 +01:00
Linus Rath 1b13b4ce88 feat: show Offline in the composer and keep the message when Send can't go out 2026-11-04 07:12:24 +01:00
Linus Rath 43c9ef9ad1 fix: name the TLS-only delivery option plainly and point to encryption add-ons 2026-11-04 07:11:03 +01:00
Linus Rath 0ced5482d5 feat: list your contacts in the composer's recipient picker, with the directory on its own tab 2026-11-04 07:03:15 +01:00
Linus Rath 0c5ba654c6 fix: show the name only on recipient chips, with the address on hover
The autocomplete, chip-drag and paste tests found chips by their old
"Name (address)" text; they now find them by the "Name <address>"
tooltip, which is where the address went.
2026-11-04 06:56:08 +01:00
Linus Rath 7d2859e064 feat: keep undo send in the pop-out or quick compose window until the time is over 2026-11-04 06:44:56 +01:00
Linus Rath 317f3b40dd fix: suggest recipients whose name starts with what you type first 2026-11-04 06:42:47 +01:00
Linus Rath 781013cc44 feat: close the composer as soon as Send is pressed and show Sending, then Sent with View 2026-11-04 06:41:51 +01:00
Linus Rath 4ec1c128f6 fix: warn about template fill-ins like [Name] before sending
A lone capitalised word in brackets now counts as a fill-in, so two
cases of ordinary text changed: the cross-language case uses lowercase
"[votre] [ваше]", and the broken word-list case uses "[Your name]", so
both still test what they were written for.
2026-11-04 06:36:09 +01:00
Linus Rath 80321e21a2 fix: explain replying from the received address in plain words
The admin-locks test finds the row by its label key, which moved to the
compose_words namespace with the new description.
2026-11-04 06:26:28 +01:00
Linus Rath c0300bcb7f feat: keep the formatting toolbar in one row, with the rest behind More formatting 2026-11-04 06:24:28 +01:00
Linus Rath 08dcff789f feat: add a full screen button to the composer, Escape brings it back 2026-11-04 06:24:27 +01:00
Linus Rath 461a7daf4f feat: let a composer move to its own window from a browser tab, as in Gmail 2026-11-04 06:24:26 +01:00
Linus Rath 007b007302 feat: open the schedule dialog from Send's arrow and say when a scheduled message goes 2026-11-04 06:22:53 +01:00
Linus Rath b425f4b211 feat: turn undo send on by default with 5 seconds
The policy-defaults test now expects the new build default of 5 seconds
for an invalid admin value, and the settings-search tests look for the
row under its new label "Undo send".
2026-11-04 06:18:29 +01:00
Linus Rath 8720ab6e1a feat: ask about everything before sending in one dialog, and allow sending without text
Tests changed: the "asked once" tests reached the second check through
a second dialog, which no longer exists, so they now stop the send at
"Send this message?" instead. The empty-body test asserted the error
under the editor; an empty body now asks instead of blocking Send.
2026-11-04 06:12:23 +01:00
Linus Rath 94bb55765d fix: give pop-out and quick compose windows the main composer's layout, with Send bottom right and Discard as a bin 2026-11-04 06:04:28 +01:00
Linus Rath 5a020cf2f9 Merge branch 'feat/do-key-fixes' into feat/desktop-offline 2026-11-04 05:33:37 +01:00
Linus Rath 0f3d534246 test: give the app lock's tests time for two PBKDF2 runs on a busy machine 2026-11-04 05:24:11 +01:00
Linus Rath 0aa0f21955 Merge branch 'feat/desktop-offline' into feat/do-key-fixes
# Conflicts:
#	lib/desktop/types.ts
2026-11-04 04:53:26 +01:00
Linus Rath ce3e3b9db2 fix: let a remote wipe and a wipe from settings reach what only the desktop app's main process can delete 2026-11-04 04:47:38 +01:00
Linus Rath 0e400dbcf4 Merge branch 'feat/do-proxy-fixes' into feat/desktop-offline 2026-11-04 04:20:49 +01:00
Linus Rath f9503570ca Merge branch 'feat/desktop-offline' into feat/do-key-fixes
# Conflicts:
#	components/settings/app-lock-settings.tsx
#	stores/auth-store.ts
2026-11-04 04:16:14 +01:00
Linus Rath 88d64b7f95 fix: protect the keys to the mail on this device for real
The review found the store key readable from a copy of the disk. The
desktop app only added its OS layer with the lock on, the record from
before a lock stayed in LevelDB and opened the mail with no PIN, any
frame could unwrap the PIN record and guess at it, a lock left the key
in the renderer's memory, and a store waiting after a refused login went
to whoever signed in next under the same username@host.

- The desktop app wraps the store key with safeStorage, lock or no lock.
  A record without the layer gets it at its next open. A refusal is said
  out loud, and only a computer with no key store goes without, which
  settings say. So do they for a browser, which has no such layer.
- A record that gained layers, and every record after a changed PIN, asks
  for a new key: `sqlite3_backup` into a new file under a new key while
  the store keeps working, one write to the record, then the old file
  goes. A changed PIN makes a new lock key, since the old PIN's record
  stays on disk too. The passkey and OS unlock go with the old key.
- `wrap` and `unwrap` come through `claim()`, and the key under the PIN
  takes a secret from main, one counted trip per guess.
- A lock on the desktop ends the renderer rather than reload in it.
- A sign-in compares the waiting store's JMAP account and server first,
  and wipes on a mismatch. The account id keeps its form: every store,
  setting and server record of an account is keyed by it.
- The 30 days also run in an app that stays open.

Changes an existing assertion: turning the lock off now keeps the
safeStorage layer, by decision, so that test expects it to stay.
2026-11-04 04:15:31 +01:00
Linus Rath c49c68ffbd Merge branch 'feat/desktop-offline' into feat/do-proxy-fixes 2026-11-04 04:12:23 +01:00
Linus Rath e101b0db27 Merge branch 'feat/do-keystore-fixes' into feat/desktop-offline 2026-11-04 03:59:11 +01:00
Linus Rath 8cd9d72558 Merge branch 'feat/desktop-offline' into feat/do-proxy-fixes 2026-11-04 03:55:52 +01:00
Linus Rath bce0c0b744 Merge branch 'feat/desktop-offline' into feat/do-keystore-fixes 2026-11-04 03:52:09 +01:00
Linus Rath 7443654459 Merge branch 'feat/do-package-fixes' into feat/desktop-offline 2026-11-04 03:43:04 +01:00
Linus Rath 92e6ee1bfa Merge branch 'feat/do-trust-fixes' into feat/desktop-offline 2026-11-04 03:43:04 +01:00
Linus Rath be8aba2ae7 Merge remote-tracking branch 'origin/main' into feat/desktop-offline
# Conflicts:
#	stores/auth-store.ts
2026-11-04 03:42:18 +01:00
Linus Rath d3308e7729 Merge branch 'feat/desktop-offline' into feat/do-keystore-fixes
# Conflicts:
#	lib/desktop/__tests__/policy-schema.test.ts
2026-11-04 03:31:22 +01:00
Linus Rath 66c6b61853 fix: keep downloaded mail out of the browser's HTTP cache 2026-11-04 03:31:16 +01:00
Linus Rath 2f846bb2da fix: list the browser sign-in budget as shared server state 2026-11-04 03:30:48 +01:00
Linus Rath 35a4b034b1 fix: show optional permissions in the marketplace, and ask before an update adds a permission 2026-11-04 03:23:46 +01:00
Linus Rath 9b61b79d5c fix: sign only CMS signed attributes through api.keystore, and ask a user about a managed plugin's keystore
The shell now takes a message's signed attributes where it took a digest,
so a page can't get a login or TLS digest signed. A quiet option lets a
plugin answer from what's allowed, for anything the user didn't ask for.

An admin's install no longer covers the certificates on someone's own
computer: a managed plugin gets `keystore` when that person says yes, also
when an update adds it, and it's forgotten once everyone has signed out.

Changed test assertions: the fixture plugin needs a grant now, as managed
alone is no longer enough, and the bridge gets an options argument.
2026-11-04 03:23:45 +01:00
Linus Rath f0e874103d fix: take back certificate grants when a session ends without a sign-out 2026-11-04 03:23:45 +01:00
Linus Rath b1f26a93bf feat: let an organisation turn the system certificate store off by policy 2026-11-04 03:23:44 +01:00