@bobfrankston/rmfmail 1.2.286 → 1.2.288
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 +23 -37
- package/client/android-bootstrap.bundle.js +21 -5
- package/client/android-bootstrap.bundle.js.map +2 -2
- package/client/app.bundle.js.map +1 -1
- package/client/compose/compose.bundle.js +169 -39
- package/client/compose/compose.bundle.js.map +3 -3
- package/client/compose/harper-lint.js +125 -42
- package/client/compose/harper-lint.js.map +1 -1
- package/client/compose/harper-lint.ts +120 -40
- package/client/lib/rmf-tiny.js +85 -0
- package/npmchanges.md +82 -0
- package/package.json +8 -8
- package/packages/mailx-imap/package-lock.json +2 -2
- package/packages/mailx-imap/package.json +1 -1
- package/packages/mailx-service/index.d.ts.map +1 -1
- package/packages/mailx-service/index.js +20 -3
- package/packages/mailx-service/index.js.map +1 -1
- package/packages/mailx-settings/package.json +1 -1
- package/packages/mailx-store/package.json +1 -1
- package/packages/mailx-store-web/package.json +1 -1
- package/packages/mailx-types/package.json +1 -1
- package/packages/mailx-types/trust.d.ts.map +1 -1
- package/packages/mailx-types/trust.js +43 -4
- package/packages/mailx-types/trust.js.map +1 -1
- package/packages/mailx-types/trust.ts +50 -5
- /package/packages/mailx-imap/{node_modules.npmglobalize-stash-50896 → node_modules.npmglobalize-stash-39836}/.package-lock.json +0 -0
package/.commitmsg
CHANGED
|
@@ -1,43 +1,29 @@
|
|
|
1
|
-
|
|
1
|
+
Trust: a message that never crossed a trust boundary proves itself
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
6.0 URIBL_SBL is the Spamhaus listing of the IP of the nameserver of a linked
|
|
11
|
-
domain, fourth-order guilt by association, more than the whole 4.5 threshold
|
|
12
|
-
on its own.
|
|
3
|
+
Bob 2026-08-27, on his own reply to John Levine about spam handling: "why is
|
|
4
|
+
my own mail spam". It carried no Authentication-Results at all — his own
|
|
5
|
+
authenticated submission never left his systems, so nothing added one — and
|
|
6
|
+
`proved` therefore came back false, dropping it to a caution banner that told
|
|
7
|
+
him not to open the links in prose he had just written. What flagged it was
|
|
8
|
+
`URIBL_DBL_SPAM` 8.0 on blueorchestra.org: the domain he was QUOTING, in a
|
|
9
|
+
discussion about spam. Guilt by association at its purest.
|
|
13
10
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
association, bulk mail, or unclassified — and reads the topmost
|
|
17
|
-
Authentication-Results for a DMARC-aligned pass. Severity follows the rules,
|
|
18
|
-
never the number:
|
|
11
|
+
SpamAssassin states two proofs in its own rule list that such mail carries
|
|
12
|
+
instead of an AR header:
|
|
19
13
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
identity evidence, so a lookalike domain with its own valid DKIM cannot
|
|
23
|
-
buy silence.
|
|
24
|
-
- sender DMARC-proved and every rule that scored is one this file can name,
|
|
25
|
-
or the whole score is bulk rules -> info: a new neutral severity with no
|
|
26
|
-
headline and no "do not open anything" footer.
|
|
27
|
-
- anything else -> caution, including a proved sender whose score came from
|
|
28
|
-
rules with no class. Unknown is never a reason to go quiet.
|
|
14
|
+
ALL_TRUSTED Passed through trusted hosts only via SMTP
|
|
15
|
+
DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain
|
|
29
16
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
17
|
+
DKIM_VALID_AU is the same evidence DMARC alignment rests on — the author
|
|
18
|
+
domain signed it and the signature verified — so it proves the From line on
|
|
19
|
+
its own. ALL_TRUSTED says nothing untrusted handled the message in transit.
|
|
20
|
+
`proved` now comes from any of the three, and `provedBy` names which, so the
|
|
21
|
+
banner says WHICH proof rather than asserting DMARC that isn't there. His
|
|
22
|
+
message is now a grey note: "…but bob.ma proved it sent this. Valid signature
|
|
23
|
+
from bob.ma, the sending domain itself (DKIM_VALID_AU)."
|
|
36
24
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
notes. Tests cover all four sample messages verbatim, plus the two ways the
|
|
40
|
-
proof could be gamed (a forged Authentication-Results below the server's own,
|
|
41
|
-
and one naming a different From).
|
|
25
|
+
Forgery still outranks proof — across the store the danger count is unchanged
|
|
26
|
+
at 294 of 1,131 flagged; caution 599, quiet 238.
|
|
42
27
|
|
|
43
|
-
|
|
28
|
+
Also: the Insert menu gains Blockquote and Quoted text (paste) — rmf-tiny
|
|
29
|
+
0.1.53, see its .commitmsg.
|
|
@@ -2309,6 +2309,9 @@ function analyzeServerSpam(input) {
|
|
|
2309
2309
|
const scored = (r) => !(r.score <= 0);
|
|
2310
2310
|
const present = (cls) => rules.some((r) => r.cls === cls && scored(r));
|
|
2311
2311
|
const kind = dmarc.authFailures.length || present("forgery") ? "forgery" : present("association") ? "association" : present("other") ? "unclassified" : rules.length ? "bulk" : "unclassified";
|
|
2312
|
+
const has = (name) => rules.some((r) => r.name === name);
|
|
2313
|
+
const provedBy = dmarc.pass ? "dmarc" : has("DKIM_VALID_AU") ? "dkim" : has("ALL_TRUSTED") ? "trusted" : "";
|
|
2314
|
+
const fromDomain = (bare(input.fromAddress).split("@")[1] || "").toLowerCase();
|
|
2312
2315
|
const reasons = rules.filter((r) => r.cls !== "neutral" && scored(r)).sort((a, b) => (b.score || 0) - (a.score || 0)).slice(0, 3).map((r) => {
|
|
2313
2316
|
const num = Number.isFinite(r.score) ? `${r.score.toFixed(1)} ` : "";
|
|
2314
2317
|
return r.description ? `${num}${r.name} (${r.description})` : `${num}${r.name}`;
|
|
@@ -2319,14 +2322,27 @@ function analyzeServerSpam(input) {
|
|
|
2319
2322
|
flagged,
|
|
2320
2323
|
rules,
|
|
2321
2324
|
kind,
|
|
2322
|
-
proved:
|
|
2323
|
-
|
|
2325
|
+
proved: !!provedBy,
|
|
2326
|
+
provedBy,
|
|
2327
|
+
provedDomain: dmarc.domain || fromDomain,
|
|
2324
2328
|
provedPolicy: dmarc.policy,
|
|
2325
2329
|
bayesHam: rules.some((r) => r.name === "BAYES_00" || r.name === "BAYES_01"),
|
|
2326
2330
|
authFailures: dmarc.authFailures,
|
|
2327
2331
|
reasons
|
|
2328
2332
|
};
|
|
2329
2333
|
}
|
|
2334
|
+
function provedNote(a) {
|
|
2335
|
+
switch (a.provedBy) {
|
|
2336
|
+
case "dmarc":
|
|
2337
|
+
return `DMARC pass, aligned${a.provedPolicy ? `, policy ${a.provedPolicy}` : ""}.`;
|
|
2338
|
+
case "dkim":
|
|
2339
|
+
return `Valid signature from ${a.provedDomain}, the sending domain itself (DKIM_VALID_AU).`;
|
|
2340
|
+
case "trusted":
|
|
2341
|
+
return "It passed through trusted hosts only (ALL_TRUSTED) \u2014 nothing untrusted handled it.";
|
|
2342
|
+
default:
|
|
2343
|
+
return "";
|
|
2344
|
+
}
|
|
2345
|
+
}
|
|
2330
2346
|
function serverSpamVerdict(input) {
|
|
2331
2347
|
const a = analyzeServerSpam(input);
|
|
2332
2348
|
if (!a || !a.flagged)
|
|
@@ -2345,8 +2361,8 @@ function serverSpamVerdict(input) {
|
|
|
2345
2361
|
return {
|
|
2346
2362
|
id: "server-spam-verdict",
|
|
2347
2363
|
severity: "info",
|
|
2348
|
-
text: `Your mail server scored this as spam, but ${a.provedDomain} proved it sent this.`,
|
|
2349
|
-
detail:
|
|
2364
|
+
text: a.provedBy === "trusted" ? "Your mail server scored this as spam, but it reached you without leaving your own systems." : `Your mail server scored this as spam, but ${a.provedDomain} proved it sent this.`,
|
|
2365
|
+
detail: `${provedNote(a)} ${numbers}${why}${bayes}`
|
|
2350
2366
|
};
|
|
2351
2367
|
if (a.kind === "bulk")
|
|
2352
2368
|
return {
|
|
@@ -2355,7 +2371,7 @@ function serverSpamVerdict(input) {
|
|
|
2355
2371
|
text: "Your mail server rates this bulk mail \u2014 nothing that scored tests who sent it.",
|
|
2356
2372
|
detail: `${numbers}${why}${bayes}`
|
|
2357
2373
|
};
|
|
2358
|
-
const proof = a.proved ? `${a
|
|
2374
|
+
const proof = a.proved ? `${provedNote(a)} ` : "";
|
|
2359
2375
|
return {
|
|
2360
2376
|
id: "server-spam-verdict",
|
|
2361
2377
|
severity: "caution",
|