@bobfrankston/rmfmail 1.2.323 → 1.2.324

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.
package/.commitmsg CHANGED
@@ -1,17 +1,24 @@
1
- New event: the calendar picker is always there, and lists every calendar you can write to
1
+ A proved, trusted sender vouches for its own links; the trust button appears whenever trust would clear the banner
2
2
 
3
- Bob 2026-09-11: "the add appointment box should give me a choice of
4
- calendars." v1.2.318 hid the picker whenever Google reported fewer than
5
- two writable calendars — and his four are one owned calendar plus two
6
- holiday feeds and a shared one, so the row never appeared and read as a
7
- missing feature.
3
+ Bob 2026-09-11, a Toast receipt: "Another message to flag as safe because
4
+ I trust toasttakeout.com. There should be a trust button."
8
5
 
9
- The row is now always shown. With one writable calendar the dropdown is
10
- disabled and its tooltip says that this is the only calendar Google lets
11
- you add events to, that the others are read-only, and where to change
12
- that (Google Calendar, then Refresh). getCalendars returns EVERY
13
- calendar with `selected` as a flag instead of a filter: the sidebar
14
- still lists the selected ones, but a calendar the reader owns and has
15
- unticked in Google is still one a new event can go to. The daemon logs
16
- each calendar's role and selection at enumeration so "why only one" can
17
- be answered from the log. mailx-types 0.1.98, mailx-service 0.1.39.
6
+ The mail is dmarc=pass toasttab.com, toasttab.com is on his list, so the
7
+ server's 19.9 spam verdict was already silent what remained was the
8
+ redirector warning: every link runs through toasttakeout.page.link
9
+ (Firebase's per-app redirector) to toasttakeout.com. Two organisations by
10
+ hostname, nobody signed for page.link, the sender is neither, so rules 1
11
+ to 4 all missed, and the finding's own text said "only the sender could
12
+ vouch for the link". Rule 5: when the proved sender is one the reader
13
+ trusts, it has. Proof stays mandatory trust without the server's pass
14
+ clears nothing (tested), so a forger typing a trusted domain into From
15
+ gets no vouching.
16
+
17
+ The banner's "Stop warning about" buttons used to appear only when the
18
+ server's verdict was the single finding. They now appear whenever every
19
+ finding is one trust clears (the verdict, the redirector warning) and the
20
+ sender is proved — the Toast receipt carried both and so had no button
21
+ on the one message that needed it. A proved-but-untrusted sender's
22
+ redirector warning now names the action; an unproved one says plainly
23
+ that nothing proves who the sender is. mailx-types 0.1.99. Verified on
24
+ the live receipt: two cautions before, nothing after.
@@ -69,3 +69,4 @@ tests/trust.test.ts, .commitmsg, TODO.md C165, root version 1.2.311. Then rebuil
69
69
  - Bob confirmed 2026-09-10: 'quill worked' (v1.2.320 placeCaretAfterLink).
70
70
  - v1.2.322: trustedSendersVia ('sender via relay' pairs) — Ground News via amazonses.com. Banner offers 'Trust ‹sender› via ‹relay›' on the trusted-but-unproved caution; counts only when the relay DKIM-signed. 45/45 trust tests.
71
71
  - v1.2.323: New event picker always shown (disabled + explanatory tooltip when only one writable calendar); getCalendars returns all calendars with selected flag; daemon logs roles.
72
+ - v1.2.324: redirector rule 5 — proved + trusted sender vouches for its own links (Toast via toasttakeout.page.link). Banner 'Stop warning about' now offered when every finding is verdict/redirector and sender proved. 48/48.
@@ -2589,6 +2589,8 @@ function provedSenderDomain(input) {
2589
2589
  function redirectorLink(input) {
2590
2590
  const bodyHtml = input.bodyHtml || "";
2591
2591
  const senderDomain = provedSenderDomain(input);
2592
+ if (senderDomain && input.senderTrusted)
2593
+ return null;
2592
2594
  const intermediary = provedIntermediary(input);
2593
2595
  const signers = dkimSigners(input);
2594
2596
  for (const m of bodyHtml.matchAll(/href\s*=\s*["']([^"']+)["']/gi)) {
@@ -2618,13 +2620,14 @@ function redirectorLink(input) {
2618
2620
  if (senderDomain && sameOrg(target.hostname, senderDomain))
2619
2621
  continue;
2620
2622
  const signer = signers.find((s) => sameOrg(s, url.hostname));
2621
- const how = signer ? ` ${signer} signed this message; "Trust ${signer} as an intermediary" stops this warning for links through ${signer} in mail it signs.` : ` Nobody signed this message for ${url.hostname}, so there is no intermediary to trust; only the sender could vouch for the link.`;
2623
+ const how = signer ? ` ${signer} signed this message; "Trust ${signer} as an intermediary" stops this warning for links through ${signer} in mail it signs.` : senderDomain ? ` Nobody signed this message for ${url.hostname}, so there is no intermediary to trust; ${senderDomain} proved it sent this, and "Stop warning about *@${senderDomain}" lets it vouch for its own links.` : ` Nobody signed this message for ${url.hostname}, so there is no intermediary to trust; only the sender could vouch for the link, and nothing proves who the sender is.`;
2622
2624
  return {
2623
2625
  id: "redirector-link",
2624
2626
  severity: "caution",
2625
2627
  text: `A link hides where it goes: it passes through ${url.hostname} and ends at ${target.hostname}.`,
2626
2628
  detail: `${url.hostname} -> ${target.hostname}.${how}`,
2627
- ...signer ? { via: signer } : {}
2629
+ ...signer ? { via: signer } : {},
2630
+ ...senderDomain && !signer ? { sender: senderDomain } : {}
2628
2631
  };
2629
2632
  }
2630
2633
  }