@bobfrankston/rmfmail 1.2.313 → 1.2.314

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,22 +1,27 @@
1
- Trusted lists: the action beside the warning, and a way to undo it
1
+ Self-spoof: a DMARC-proved From is not a spoof, whatever else failed
2
2
 
3
- Bob 2026-09-09, after v1.2.312: "it would be nice to have an [approve
4
- this list] on the red warning banner" and "how would I undo an approval".
3
+ Bob 2026-09-09, the ISOC Internet Policy list post, red banner "This
4
+ message is not what it says it is claims to be from your own address,
5
+ internetpolicy@elists.isoc.org, but it did not come from your account.
6
+ DKIM authentication failed". The list rewrote From to itself and signed
7
+ it; iecc.com recorded dkim=pass d=elists.isoc.org and dmarc=pass
8
+ header.from=elists.isoc.org — and dkim=fail for the original author's
9
+ standardstrack.com signature the list had broken. Delivered-To was the
10
+ list address, so it counted as one of Bob's own, and selfSpoof read every
11
+ Authentication-Results and every signature and took the one failure as
12
+ "did not come from your account". One broken signature on a message whose
13
+ From domain passed DMARC aligned is not evidence about the From line; the
14
+ pass is. selfSpoof now returns before the failure scan when dmarcProof
15
+ passes for the actual From domain (a pass for some other domain still
16
+ proves nothing — tested).
5
17
 
6
- An unflagged list post has no banner the spam-score chip IS the warning
7
- so "Trust the ‹List-Id› list" now sits beside the chip as a button, the
8
- same write as the banner button and the From-menu item. The red (danger)
9
- banner still carries no list button on purpose: over the last 120 days
10
- every proved-list post that stayed red (123 of 1,386 flagged list posts)
11
- was a phishing or malware URL listing on a throwaway domain that signs
12
- its own mail, and trusting a list never clears those, so a button there
13
- would be one that does nothing.
18
+ Measured over the last 120 days: 977 messages whose From is their own
19
+ Delivered-To, 35 self-spoof findings before, 20 after; the 15 cleared are
20
+ all ISOC list posts, the 20 that remain are the sextortion/phish/NDA-scam
21
+ mail the check exists for.
14
22
 
15
- Undo: once a list is trusted the chip and banner are gone, so the From
16
- address's right-click item is now offered on every proved post and reads
17
- "Stop trusting the ‹List-Id› mailing list" when the list is trusted the
18
- toggle the write always was, finally reachable. The action checks that
19
- the answer went the way it asked and reports otherwise. docs/allowlist.md
20
- header reworded: the "do not edit" notice is about the .md itself;
21
- hand-editing allowlist.jsonc is fine and is how a sender or intermediary
22
- approval is undone until those get an undo of their own.
23
+ Also: a danger banner on a proved-list post now says which list delivered
24
+ it and that trusting the list (right-click the From address) would not
25
+ clear the finding a red banner with no way forward sends the reader
26
+ hunting (Bob: "right mouse on the From that's not obvious to the normal
27
+ user"). mailx-types 0.1.90.
@@ -46,4 +46,4 @@ tests/trust.test.ts, .commitmsg, TODO.md C165, root version 1.2.311. Then rebuil
46
46
  - [x] client (banner button, From-menu item, chip tooltip)
47
47
  - [x] tests pass (tests/trust.test.ts 40/40)
48
48
  - [x] docs/TODO/.commitmsg/versions (v1.2.312)
49
- - [x] rebuild.cmd — published v1.2.312 + APK built (exit 0). App must be restarted to pick up the new bundle.
49
+ - [x] rebuild.cmd — v1.2.312 (feature) + v1.2.313 (chip button + undo toggle) published, APKs built. Restart the app to pick up.
@@ -2483,6 +2483,8 @@ function selfSpoof(input) {
2483
2483
  const auth = headerAll(input.headerLines, "authentication-results").join(" ; ");
2484
2484
  if (!auth)
2485
2485
  return null;
2486
+ if (dmarcProof(input).pass)
2487
+ return null;
2486
2488
  const failed = [
2487
2489
  /\bspf=(fail|softfail)\b/i.test(auth) ? "SPF" : "",
2488
2490
  /\bdkim=(fail|permerror)\b/i.test(auth) ? "DKIM" : "",