@bobfrankston/rmfmail 1.2.291 → 1.2.292

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/.commitmsg +24 -26
  2. package/client/android-bootstrap.bundle.js +31 -1
  3. package/client/android-bootstrap.bundle.js.map +2 -2
  4. package/client/app.bundle.js +35 -1
  5. package/client/app.bundle.js.map +2 -2
  6. package/client/components/message-viewer.js +48 -1
  7. package/client/components/message-viewer.js.map +1 -1
  8. package/client/components/message-viewer.ts +47 -1
  9. package/client/compose/compose.bundle.js +5 -1
  10. package/client/compose/compose.bundle.js.map +2 -2
  11. package/client/lib/api-client.js +7 -1
  12. package/client/lib/api-client.js.map +1 -1
  13. package/client/lib/api-client.ts +9 -2
  14. package/client/lib/mailxapi.js +3 -0
  15. package/client/styles/components.css +25 -0
  16. package/npmchanges.md +34 -0
  17. package/package.json +5 -5
  18. package/packages/mailx-imap/package-lock.json +2 -2
  19. package/packages/mailx-imap/package.json +1 -1
  20. package/packages/mailx-service/index.d.ts +20 -0
  21. package/packages/mailx-service/index.d.ts.map +1 -1
  22. package/packages/mailx-service/index.js +37 -0
  23. package/packages/mailx-service/index.js.map +1 -1
  24. package/packages/mailx-service/index.ts +37 -1
  25. package/packages/mailx-service/jsonrpc.js +2 -0
  26. package/packages/mailx-service/jsonrpc.js.map +1 -1
  27. package/packages/mailx-service/jsonrpc.ts +2 -0
  28. package/packages/mailx-service/package.json +1 -1
  29. package/packages/mailx-store/package.json +1 -1
  30. package/packages/mailx-store/store.d.ts.map +1 -1
  31. package/packages/mailx-store/store.js +17 -2
  32. package/packages/mailx-store/store.js.map +1 -1
  33. package/packages/mailx-store/store.ts +17 -2
  34. package/packages/mailx-store-web/android-bootstrap.js +3 -0
  35. package/packages/mailx-store-web/android-bootstrap.js.map +1 -1
  36. package/packages/mailx-store-web/android-bootstrap.ts +3 -0
  37. package/packages/mailx-store-web/package.json +1 -1
  38. package/packages/mailx-store-web/web-jsonrpc.js +2 -0
  39. package/packages/mailx-store-web/web-jsonrpc.js.map +1 -1
  40. package/packages/mailx-store-web/web-jsonrpc.ts +2 -0
  41. package/packages/mailx-store-web/web-service.d.ts +9 -0
  42. package/packages/mailx-store-web/web-service.d.ts.map +1 -1
  43. package/packages/mailx-store-web/web-service.js +28 -0
  44. package/packages/mailx-store-web/web-service.js.map +1 -1
  45. package/packages/mailx-store-web/web-service.ts +23 -1
  46. /package/packages/mailx-imap/{node_modules.npmglobalize-stash-27960 → node_modules.npmglobalize-stash-50524}/.package-lock.json +0 -0
package/.commitmsg CHANGED
@@ -1,31 +1,29 @@
1
- An approved sender, proved, says nothing at all
1
+ Trusting a sender must not turn on their tracking pixels
2
2
 
3
- Bob 2026-08-28, having just clicked "Always: *@icecer.com" on a conference call
4
- for papers that still showed a bulk-mail note: "I accepted the server so
5
- shouldn't this be considered safe?" Yes and this is the half of C165 that was
6
- still open. `allowlist.jsonc` has been the approved-sender store all along, and
7
- nothing consulted it when computing trust.
3
+ Bob 2026-08-28, on a newsletter he subscribed to: "I don't need the spam
4
+ reminder but I don't want to say show remote content in order to prevent
5
+ tracking." He was right, and the shape of the bug is that the allowlist was
6
+ answering two different questions with one list. The only gesture in the whole
7
+ app that said "this correspondent is fine" was the remote-content banner's
8
+ "Always: …", which buys a tracking pixel with every vote of confidence.
8
9
 
9
- `assessMessageTrust` and `spamScoreOf` now take `senderTrusted`, and store.ts
10
- fills it from the sender and domain lists the reader maintains. When the sender
11
- is approved AND proved AND nothing accuses it of forgery, the server-spam
12
- finding is not rendered at all and the score chip goes with it: the score
13
- answers "is this bulk", the reader has already answered "is it wanted", and
14
- repeating the first after the second is how a banner becomes furniture.
10
+ Two lists now, both in allowlist.jsonc:
15
11
 
16
- Three boundaries, deliberate:
12
+ senders / domains load their images, and I trust them
13
+ trustedSenders / trustedDomains ONLY stop warning me about them
17
14
 
18
- - **Trust never silences forgery evidence.** SPF_FAIL, a DMARC failure, a
19
- FORGED_* rule, self-spoof, relay-auth mismatch all still render, at full
20
- severity, on a trusted sender.
21
- - **Trust counts only where the sender is PROVED** (DMARC, DKIM_VALID_AU, or
22
- ALL_TRUSTED). Otherwise the approved-sender list would be a switch a forger
23
- flips by typing a trusted address into From. A trusted address that cannot be
24
- proved now gets a SHARPER warning than an untrusted one: "This claims to be a
25
- sender you trust, but nothing proves it is."
26
- - **senderTrusted is narrower than allowRemote.** The recipient-alias list says
27
- mail reached an address of the reader's, which permits images; it is not a
28
- statement about who sent it, and the trust banner asks about the sender.
15
+ Both feed `senderTrusted` in the store; only the first feeds `allowRemote`, and
16
+ that line carries a comment saying why it must never be widened to the second.
29
17
 
30
- The measurement is unchanged spamScoreOf still reports the score, kind and
31
- reasons, with `trusted: true` alongside. Only the display goes.
18
+ The trust note gains the action it was missing: **"Stop warning about
19
+ ‹address›"** and **"Stop warning about *@‹domain›"**, naming the sender rather
20
+ than saying "this one" so the choice is checkable afterwards. New IPC
21
+ `trustSenderOrDomain` (toggle, like flagSenderOrDomain) wired through all six
22
+ places — service, jsonrpc, web-service, web-jsonrpc, android-bootstrap,
23
+ api-client + mailxapi.js; the bridge-contract guard passes at 110 client calls.
24
+
25
+ The buttons appear only where the server's own verdict is the WHOLE finding and
26
+ the sender is proved. A forgery banner gets no such button: no list should be
27
+ able to silence "this message is not what it says it is", and there is nothing
28
+ to trust when identity is the thing in doubt. A failed write reports itself on
29
+ the button rather than looking like it worked.
@@ -7013,6 +7013,31 @@ var WebMailxService = class _WebMailxService {
7013
7013
  });
7014
7014
  return { flagged };
7015
7015
  }
7016
+ /** Trust (or untrust) a sender / domain for the spam banner ONLY — no
7017
+ * remote content. Mirrors MailxService.trustSenderOrDomain; the desktop
7018
+ * and Android halves must answer "is this sender trusted" the same way or
7019
+ * the same message reads differently on the phone. */
7020
+ async trustSenderOrDomain(type, value) {
7021
+ const v = (value || "").trim().toLowerCase();
7022
+ if (!v)
7023
+ return { trusted: false };
7024
+ let trusted = false;
7025
+ await updateAllowlist((list) => {
7026
+ const key = type === "sender" ? "trustedSenders" : "trustedDomains";
7027
+ const arr = Array.isArray(list[key]) ? list[key] : [];
7028
+ const idx = arr.findIndex((x) => (x || "").toLowerCase() === v);
7029
+ if (idx >= 0) {
7030
+ arr.splice(idx, 1);
7031
+ trusted = false;
7032
+ } else {
7033
+ arr.push(v);
7034
+ trusted = true;
7035
+ }
7036
+ list[key] = arr;
7037
+ return list;
7038
+ });
7039
+ return { trusted };
7040
+ }
7016
7041
  async updateFlags(accountId, uid, flags) {
7017
7042
  const envelope = this.db.getMessageByUid(accountId, uid);
7018
7043
  await this.syncManager.updateFlagsLocal(accountId, uid, envelope?.folderId || 0, flags);
@@ -7029,7 +7054,9 @@ var WebMailxService = class _WebMailxService {
7029
7054
  domains: list.domains || [],
7030
7055
  recipients: list.recipients || [],
7031
7056
  flaggedSenders: list.flaggedSenders || [],
7032
- flaggedDomains: list.flaggedDomains || []
7057
+ flaggedDomains: list.flaggedDomains || [],
7058
+ trustedSenders: list.trustedSenders || [],
7059
+ trustedDomains: list.trustedDomains || []
7033
7060
  };
7034
7061
  }
7035
7062
  async allowRemoteContent(type, value) {
@@ -12498,6 +12525,9 @@ function installBridge() {
12498
12525
  return { ok: true };
12499
12526
  },
12500
12527
  getAllowlist: () => service.getAllowlist(),
12528
+ trustSenderOrDomain: async (type, value) => {
12529
+ return await service.trustSenderOrDomain(type, value);
12530
+ },
12501
12531
  flagSenderOrDomain: async (type, value) => {
12502
12532
  return await service.flagSenderOrDomain(type, value);
12503
12533
  },