@bobfrankston/rmfmail 1.2.306 → 1.2.308

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 (59) hide show
  1. package/.commitmsg +24 -12
  2. package/client/android-bootstrap.bundle.js +45 -7
  3. package/client/android-bootstrap.bundle.js.map +2 -2
  4. package/client/app.bundle.js +26 -1
  5. package/client/app.bundle.js.map +2 -2
  6. package/client/components/message-viewer.js +36 -0
  7. package/client/components/message-viewer.js.map +1 -1
  8. package/client/components/message-viewer.ts +35 -1
  9. package/client/compose/compose.bundle.js +1 -1
  10. package/client/compose/compose.bundle.js.map +2 -2
  11. package/client/lib/api-client.js +1 -1
  12. package/client/lib/api-client.js.map +1 -1
  13. package/client/lib/api-client.ts +3 -3
  14. package/client/package.json +1 -1
  15. package/docs/allowlist.md +19 -1
  16. package/npmchanges.md +39 -0
  17. package/package.json +8 -5
  18. package/packages/mailx-imap/index.d.ts.map +1 -1
  19. package/packages/mailx-imap/index.js +22 -15
  20. package/packages/mailx-imap/index.js.map +1 -1
  21. package/packages/mailx-imap/index.ts +23 -19
  22. package/packages/mailx-imap/package-lock.json +2 -2
  23. package/packages/mailx-imap/package.json +1 -1
  24. package/packages/mailx-service/index.d.ts +2 -1
  25. package/packages/mailx-service/index.d.ts.map +1 -1
  26. package/packages/mailx-service/index.js +4 -1
  27. package/packages/mailx-service/index.js.map +1 -1
  28. package/packages/mailx-service/index.ts +6 -3
  29. package/packages/mailx-service/package.json +1 -1
  30. package/packages/mailx-settings/docs/allowlist.md +19 -1
  31. package/packages/mailx-settings/docs/rules-design.md +43 -0
  32. package/packages/mailx-settings/index.d.ts +1 -0
  33. package/packages/mailx-settings/index.d.ts.map +1 -1
  34. package/packages/mailx-settings/index.js +4 -0
  35. package/packages/mailx-settings/index.js.map +1 -1
  36. package/packages/mailx-settings/index.ts +4 -0
  37. package/packages/mailx-settings/package.json +1 -1
  38. package/packages/mailx-store/db.d.ts +23 -0
  39. package/packages/mailx-store/db.d.ts.map +1 -1
  40. package/packages/mailx-store/db.js +47 -0
  41. package/packages/mailx-store/db.js.map +1 -1
  42. package/packages/mailx-store/db.ts +52 -0
  43. package/packages/mailx-store/package.json +1 -1
  44. package/packages/mailx-store/store.d.ts.map +1 -1
  45. package/packages/mailx-store/store.js +3 -0
  46. package/packages/mailx-store/store.js.map +1 -1
  47. package/packages/mailx-store/store.ts +3 -0
  48. package/packages/mailx-store-web/package.json +1 -1
  49. package/packages/mailx-store-web/web-service.d.ts +2 -1
  50. package/packages/mailx-store-web/web-service.d.ts.map +1 -1
  51. package/packages/mailx-store-web/web-service.js +3 -1
  52. package/packages/mailx-store-web/web-service.js.map +1 -1
  53. package/packages/mailx-store-web/web-service.ts +5 -3
  54. package/packages/mailx-types/package.json +1 -1
  55. package/packages/mailx-types/trust.d.ts +17 -0
  56. package/packages/mailx-types/trust.d.ts.map +1 -1
  57. package/packages/mailx-types/trust.js +63 -2
  58. package/packages/mailx-types/trust.js.map +1 -1
  59. package/packages/mailx-types/trust.ts +80 -2
@@ -1720,7 +1720,7 @@ export async function showMessage(accountId: string, uid: number, folderId?: num
1720
1720
  bodyEl.appendChild(chip);
1721
1721
  }
1722
1722
 
1723
- const trust = ((msg as any).trust || []) as { id: string; severity: string; text: string; detail: string }[];
1723
+ const trust = ((msg as any).trust || []) as { id: string; severity: string; text: string; detail: string; via?: string }[];
1724
1724
  if (trust.length) {
1725
1725
  // An `info` finding is not an accusation, so it gets neither the
1726
1726
  // headline nor the "do not open anything" footer — it renders as a
@@ -1796,6 +1796,40 @@ export async function showMessage(accountId: string, uid: number, folderId?: num
1796
1796
  }
1797
1797
  warn.appendChild(actions);
1798
1798
  }
1799
+ // "Trust ‹service› as an intermediary" (Bob 2026-09-08: "how do I
1800
+ // mark zoom and sites like that as trusted intermediaries?"). A
1801
+ // finding carries `via` only when a party PROVABLY handled the
1802
+ // message — the DKIM signer behind a google.com/url redirector,
1803
+ // the Sender: domain that signed a calendar invitation on the
1804
+ // organizer's behalf — so the button names a real party, and the
1805
+ // list entry it writes can only ever count on mail that party
1806
+ // signed. Nothing is offered on a danger banner: no list silences
1807
+ // "this message is not what it says it is".
1808
+ const vias = worst === "danger" ? [] : Array.from(new Set(trust.map(f => f.via).filter(Boolean)));
1809
+ if (vias.length) {
1810
+ const actions = document.createElement("div");
1811
+ actions.className = "mv-trust-actions";
1812
+ for (const via of vias) {
1813
+ const b = document.createElement("button");
1814
+ b.className = "mv-trust-action";
1815
+ b.textContent = `Trust ${via} as an intermediary`;
1816
+ b.addEventListener("click", async () => {
1817
+ b.disabled = true;
1818
+ try {
1819
+ const res = await trustSenderOrDomain("intermediary", via);
1820
+ if (!res?.trusted) throw new Error("the intermediary list did not save");
1821
+ warn.remove();
1822
+ document.querySelector(".mv-spamscore")?.remove();
1823
+ } catch (e: any) {
1824
+ // The reader pressed a button and must know whether it took.
1825
+ b.disabled = false;
1826
+ b.textContent = `Could not save: ${e?.message || e}`;
1827
+ }
1828
+ });
1829
+ actions.appendChild(b);
1830
+ }
1831
+ warn.appendChild(actions);
1832
+ }
1799
1833
  bodyEl.appendChild(warn);
1800
1834
  }
1801
1835
 
@@ -1353,7 +1353,7 @@ function trustSenderOrDomain(type, value) {
1353
1353
  return ipc().trustSenderOrDomain?.(type, value) ?? Promise.resolve({ trusted: false });
1354
1354
  }
1355
1355
  function getAllowlist() {
1356
- return ipc().getAllowlist?.() ?? Promise.resolve({ senders: [], domains: [], recipients: [], flaggedSenders: [], flaggedDomains: [], trustedSenders: [], trustedDomains: [] });
1356
+ return ipc().getAllowlist?.() ?? Promise.resolve({ senders: [], domains: [], recipients: [], flaggedSenders: [], flaggedDomains: [], trustedSenders: [], trustedDomains: [], trustedIntermediaries: [] });
1357
1357
  }
1358
1358
  function flagSenderOrDomain(type, value) {
1359
1359
  return ipc().flagSenderOrDomain?.(type, value) ?? Promise.resolve({ flagged: false });