@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.
- package/.commitmsg +24 -26
- package/client/android-bootstrap.bundle.js +31 -1
- package/client/android-bootstrap.bundle.js.map +2 -2
- package/client/app.bundle.js +35 -1
- package/client/app.bundle.js.map +2 -2
- package/client/components/message-viewer.js +48 -1
- package/client/components/message-viewer.js.map +1 -1
- package/client/components/message-viewer.ts +47 -1
- package/client/compose/compose.bundle.js +5 -1
- package/client/compose/compose.bundle.js.map +2 -2
- package/client/lib/api-client.js +7 -1
- package/client/lib/api-client.js.map +1 -1
- package/client/lib/api-client.ts +9 -2
- package/client/lib/mailxapi.js +3 -0
- package/client/styles/components.css +25 -0
- package/npmchanges.md +34 -0
- package/package.json +5 -5
- package/packages/mailx-imap/package-lock.json +2 -2
- package/packages/mailx-imap/package.json +1 -1
- package/packages/mailx-service/index.d.ts +20 -0
- package/packages/mailx-service/index.d.ts.map +1 -1
- package/packages/mailx-service/index.js +37 -0
- package/packages/mailx-service/index.js.map +1 -1
- package/packages/mailx-service/index.ts +37 -1
- package/packages/mailx-service/jsonrpc.js +2 -0
- package/packages/mailx-service/jsonrpc.js.map +1 -1
- package/packages/mailx-service/jsonrpc.ts +2 -0
- package/packages/mailx-service/package.json +1 -1
- package/packages/mailx-store/package.json +1 -1
- package/packages/mailx-store/store.d.ts.map +1 -1
- package/packages/mailx-store/store.js +17 -2
- package/packages/mailx-store/store.js.map +1 -1
- package/packages/mailx-store/store.ts +17 -2
- package/packages/mailx-store-web/android-bootstrap.js +3 -0
- package/packages/mailx-store-web/android-bootstrap.js.map +1 -1
- package/packages/mailx-store-web/android-bootstrap.ts +3 -0
- package/packages/mailx-store-web/package.json +1 -1
- package/packages/mailx-store-web/web-jsonrpc.js +2 -0
- package/packages/mailx-store-web/web-jsonrpc.js.map +1 -1
- package/packages/mailx-store-web/web-jsonrpc.ts +2 -0
- package/packages/mailx-store-web/web-service.d.ts +9 -0
- package/packages/mailx-store-web/web-service.d.ts.map +1 -1
- package/packages/mailx-store-web/web-service.js +28 -0
- package/packages/mailx-store-web/web-service.js.map +1 -1
- package/packages/mailx-store-web/web-service.ts +23 -1
- /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
|
-
|
|
1
|
+
Trusting a sender must not turn on their tracking pixels
|
|
2
2
|
|
|
3
|
-
Bob 2026-08-28,
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
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
|
-
|
|
12
|
+
senders / domains load their images, and I trust them
|
|
13
|
+
trustedSenders / trustedDomains ONLY stop warning me about them
|
|
17
14
|
|
|
18
|
-
|
|
19
|
-
|
|
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
|
|
31
|
-
|
|
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
|
},
|