@rndmjoker/proton-mcp 0.4.11 → 0.4.13
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/README.md +61 -16
- package/dist/bridge/certificate.d.ts +33 -1
- package/dist/bridge/certificate.js +82 -9
- package/dist/bridge/certificate.js.map +1 -1
- package/dist/bridge/connection.js +31 -6
- package/dist/bridge/connection.js.map +1 -1
- package/dist/bridge/errors.d.ts +8 -0
- package/dist/bridge/errors.js +28 -3
- package/dist/bridge/errors.js.map +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/credentials/availability.d.ts +5 -0
- package/dist/credentials/availability.js +7 -0
- package/dist/credentials/availability.js.map +1 -1
- package/dist/credentials/encrypted-file.js +7 -2
- package/dist/credentials/encrypted-file.js.map +1 -1
- package/dist/credentials/keyring.d.ts +12 -2
- package/dist/credentials/keyring.js +44 -6
- package/dist/credentials/keyring.js.map +1 -1
- package/dist/credentials/plain-file.js +8 -2
- package/dist/credentials/plain-file.js.map +1 -1
- package/dist/credentials/session-bus.d.ts +38 -0
- package/dist/credentials/session-bus.js +68 -0
- package/dist/credentials/session-bus.js.map +1 -0
- package/dist/credentials/store.d.ts +5 -1
- package/dist/credentials/store.js.map +1 -1
- package/dist/mail/attachments.d.ts +12 -2
- package/dist/mail/attachments.js +19 -11
- package/dist/mail/attachments.js.map +1 -1
- package/dist/mail/compose.d.ts +65 -9
- package/dist/mail/compose.js +147 -11
- package/dist/mail/compose.js.map +1 -1
- package/dist/mail/drafts.d.ts +13 -2
- package/dist/mail/drafts.js +69 -18
- package/dist/mail/drafts.js.map +1 -1
- package/dist/mail/ids.js +6 -4
- package/dist/mail/ids.js.map +1 -1
- package/dist/mail/messages.d.ts +25 -2
- package/dist/mail/messages.js +37 -4
- package/dist/mail/messages.js.map +1 -1
- package/dist/mail/saved-attachments.d.ts +128 -0
- package/dist/mail/saved-attachments.js +448 -0
- package/dist/mail/saved-attachments.js.map +1 -0
- package/dist/mail/search.d.ts +67 -3
- package/dist/mail/search.js +134 -23
- package/dist/mail/search.js.map +1 -1
- package/dist/mail/send.js +24 -9
- package/dist/mail/send.js.map +1 -1
- package/dist/mail/uid-search.d.ts +17 -0
- package/dist/mail/uid-search.js +25 -0
- package/dist/mail/uid-search.js.map +1 -0
- package/dist/mime/filenames.d.ts +24 -0
- package/dist/mime/filenames.js +58 -0
- package/dist/mime/filenames.js.map +1 -0
- package/dist/mime/parts.d.ts +34 -0
- package/dist/mime/parts.js +92 -0
- package/dist/mime/parts.js.map +1 -0
- package/dist/server.js +39 -6
- package/dist/server.js.map +1 -1
- package/dist/session.d.ts +15 -3
- package/dist/session.js +35 -8
- package/dist/session.js.map +1 -1
- package/dist/tools/confirm.js +39 -11
- package/dist/tools/confirm.js.map +1 -1
- package/dist/tools/drafts.d.ts +3 -0
- package/dist/tools/drafts.js +18 -6
- package/dist/tools/drafts.js.map +1 -1
- package/dist/tools/filters.d.ts +40 -0
- package/dist/tools/filters.js +89 -0
- package/dist/tools/filters.js.map +1 -0
- package/dist/tools/format.d.ts +8 -0
- package/dist/tools/format.js +29 -6
- package/dist/tools/format.js.map +1 -1
- package/dist/tools/guidance.js +27 -3
- package/dist/tools/guidance.js.map +1 -1
- package/dist/tools/messages.js +7 -2
- package/dist/tools/messages.js.map +1 -1
- package/dist/tools/pending-view.d.ts +7 -0
- package/dist/tools/pending-view.js +4 -1
- package/dist/tools/pending-view.js.map +1 -1
- package/dist/tools/saved.d.ts +15 -0
- package/dist/tools/saved.js +107 -0
- package/dist/tools/saved.js.map +1 -0
- package/dist/tools/send.js +4 -1
- package/dist/tools/send.js.map +1 -1
- package/dist/web/layout.js +2 -0
- package/dist/web/layout.js.map +1 -1
- package/dist/web/pages.js +1 -0
- package/dist/web/pages.js.map +1 -1
- package/dist/web/pending.d.ts +4 -0
- package/dist/web/pending.js +32 -4
- package/dist/web/pending.js.map +1 -1
- package/dist/web/server.d.ts +16 -5
- package/dist/web/server.js +12 -8
- package/dist/web/server.js.map +1 -1
- package/package.json +16 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/bridge/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmBH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,GAAG,aAAa,CAAA;IACpB,MAAM,CAAc;IAE7B,YAAY,OAAe,EAAE,MAAM,GAAiB,MAAM,EAAE,OAAsB;QAChF,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/bridge/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -30,6 +30,12 @@ export interface Config {
|
|
|
30
30
|
readOnly: boolean;
|
|
31
31
|
/** Port for the local web interface. Fixed for the life of the process. */
|
|
32
32
|
webPort: number;
|
|
33
|
+
/**
|
|
34
|
+
* Where save_attachment may write, from PROTON_MCP_ATTACHMENT_DIR. Absent
|
|
35
|
+
* means saving is off. Only from the environment, never from the web
|
|
36
|
+
* interface, whose address an assistant receives; see saved-attachments.ts.
|
|
37
|
+
*/
|
|
38
|
+
attachmentDir: string | undefined;
|
|
33
39
|
}
|
|
34
40
|
/** Credentials, whether they come from the environment or from a store. */
|
|
35
41
|
export interface BridgeCredentials {
|
package/dist/config.js
CHANGED
|
@@ -111,6 +111,7 @@ export function loadConfig(env = process.env) {
|
|
|
111
111
|
smtpPort: port(env.BRIDGE_SMTP_PORT, 1025, 'BRIDGE_SMTP_PORT'),
|
|
112
112
|
readOnly: env.PROTON_MCP_READ_ONLY === 'true',
|
|
113
113
|
webPort: port(env.PROTON_MCP_WEB_PORT, 7345, 'PROTON_MCP_WEB_PORT'),
|
|
114
|
+
attachmentDir: env.PROTON_MCP_ATTACHMENT_DIR?.trim() || undefined,
|
|
114
115
|
};
|
|
115
116
|
}
|
|
116
117
|
/**
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,10 +13,13 @@
|
|
|
13
13
|
* process can be killed.
|
|
14
14
|
*/
|
|
15
15
|
import { type StoreKind, type StoreDescription } from './store.js';
|
|
16
|
+
import { type KeyringBackend } from './session-bus.js';
|
|
16
17
|
export interface StoreAvailability extends StoreDescription {
|
|
17
18
|
available: boolean;
|
|
18
19
|
/** Why it cannot be used. Only set when available is false. */
|
|
19
20
|
reason?: string;
|
|
21
|
+
/** What the option means on this machine, when that differs from its description. */
|
|
22
|
+
note?: string;
|
|
20
23
|
/** How long the probe took, for diagnostics. Only for the keyring. */
|
|
21
24
|
probeMs?: number;
|
|
22
25
|
}
|
|
@@ -48,6 +51,8 @@ export declare function probeKeyring(timeoutMs?: number): Promise<ProbeResult>;
|
|
|
48
51
|
export declare function listStores(options?: {
|
|
49
52
|
probe?: (timeoutMs?: number) => Promise<ProbeResult>;
|
|
50
53
|
os?: string;
|
|
54
|
+
/** Which store the keyring library uses. Replaced in tests. */
|
|
55
|
+
backend?: () => KeyringBackend;
|
|
51
56
|
}): Promise<StoreAvailability[]>;
|
|
52
57
|
/**
|
|
53
58
|
* The option to preselect.
|
|
@@ -17,6 +17,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
17
17
|
import { dirname, join } from 'node:path';
|
|
18
18
|
import { platform } from 'node:os';
|
|
19
19
|
import { STORE_DESCRIPTIONS, PRESENTATION_ORDER, } from './store.js';
|
|
20
|
+
import { KERNEL_KEYRING_NOTE, prepareSessionBus } from './session-bus.js';
|
|
20
21
|
/** How long the keyring probe may take before it counts as unusable. */
|
|
21
22
|
export const PROBE_TIMEOUT_MS = 5000;
|
|
22
23
|
/**
|
|
@@ -68,6 +69,8 @@ export function probeKeyring(timeoutMs = PROBE_TIMEOUT_MS) {
|
|
|
68
69
|
*/
|
|
69
70
|
export async function listStores(options = {}) {
|
|
70
71
|
const probe = options.probe ?? probeKeyring;
|
|
72
|
+
// Before the probe, so that the child it forks inherits the same address.
|
|
73
|
+
const backend = (options.backend ?? prepareSessionBus)();
|
|
71
74
|
const started = Date.now();
|
|
72
75
|
const keyring = await probe();
|
|
73
76
|
const probeMs = Date.now() - started;
|
|
@@ -78,6 +81,10 @@ export async function listStores(options = {}) {
|
|
|
78
81
|
entry.probeMs = probeMs;
|
|
79
82
|
if (!keyring.ok)
|
|
80
83
|
entry.reason = keyring.reason;
|
|
84
|
+
// The probe succeeds in the kernel's keyring too, so a working keyring
|
|
85
|
+
// alone does not say which one it is.
|
|
86
|
+
else if (backend === 'kernel')
|
|
87
|
+
entry.note = KERNEL_KEYRING_NOTE;
|
|
81
88
|
}
|
|
82
89
|
return entry;
|
|
83
90
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"availability.js","sourceRoot":"","sources":["../../src/credentials/availability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GAGnB,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"availability.js","sourceRoot":"","sources":["../../src/credentials/availability.ts"],"names":[],"mappings":"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"}
|
|
@@ -148,8 +148,13 @@ export class EncryptedFileStore {
|
|
|
148
148
|
try {
|
|
149
149
|
await unlink(this.path);
|
|
150
150
|
}
|
|
151
|
-
catch {
|
|
152
|
-
// Already gone is the outcome we wanted.
|
|
151
|
+
catch (error) {
|
|
152
|
+
// Already gone is the outcome we wanted. Anything else leaves the file
|
|
153
|
+
// where the next start offers to unlock it again (#52).
|
|
154
|
+
if (error.code === 'ENOENT')
|
|
155
|
+
return;
|
|
156
|
+
throw new BridgeError(`The encrypted file ${this.path} could not be deleted: ${error.message}. Delete it ` +
|
|
157
|
+
'by hand.');
|
|
153
158
|
}
|
|
154
159
|
}
|
|
155
160
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encrypted-file.js","sourceRoot":"","sources":["../../src/credentials/encrypted-file.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"encrypted-file.js","sourceRoot":"","sources":["../../src/credentials/encrypted-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,IAAI,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACrG,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACxF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD;;;;GAIG;AACH,SAAS,MAAM,CACb,QAAgB,EAChB,IAAY,EACZ,SAAiB,EACjB,OAA4C;IAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YACpE,IAAI,KAAK;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAA;;gBACnB,OAAO,CAAC,OAAO,CAAC,CAAA;QACvB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAA;AACvD,MAAM,UAAU,GAAG,EAAE,CAAA;AACrB,MAAM,QAAQ,GAAG,EAAE,CAAA;AAanB,MAAM,UAAU,iBAAiB,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;IACpE,IAAI,GAAG,CAAC,qBAAqB;QAAE,OAAO,GAAG,CAAC,qBAAqB,CAAA;IAC/D,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAA;AACpE,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,cAAsB,EAAE,IAAY;IAC3D,OAAO,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE;QACpD,CAAC,EAAE,MAAM,CAAC,CAAC;QACX,CAAC,EAAE,MAAM,CAAC,CAAC;QACX,CAAC,EAAE,MAAM,CAAC,CAAC;KACZ,CAAC,CAAA;AACJ,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,WAAwB,EAAE,cAAsB;IACzE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,WAAW,CAAC,2DAA2D,CAAC,CAAA;IACpF,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,CAAA;IACpC,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAA;IAChC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;IAEjD,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAA;IACpF,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IAEpF,OAAO;QACL,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,aAAa;QACxB,GAAG,EAAE,QAAQ;QACb,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC7B,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACzB,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC/C,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;KAC1C,CAAA;AACH,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,QAAkB,EAAE,cAAsB;IACrE,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC,IAAI,QAAQ,CAAC,SAAS,KAAK,aAAa,EAAE,CAAC;QACnE,MAAM,IAAI,WAAW,CACnB,wDAAwD,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,SAAS,KAAK;YAClG,2DAA2D,CAC9D,CAAA;IACH,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IACjF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAA;IACzF,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;IAE5D,IAAI,SAAiB,CAAA;IACrB,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;YACxB,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC3D,QAAQ,CAAC,KAAK,EAAE;SACjB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,sDAAsD;QACtD,MAAM,IAAI,WAAW,CACnB,2FAA2F;YACzF,4CAA4C,CAC/C,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAgB,CAAA;IACnD,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,IAAI,WAAW,CAAC,0EAA0E,CAAC,CAAA;IACnG,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;AACjD,CAAC;AAED,MAAM,OAAO,kBAAkB;IAKV,cAAc;IACd,IAAI;IALd,IAAI,GAAG,gBAAyB,CAAA;IAEzC;IACE,mEAAmE;IAClD,cAAqC,EACrC,IAAI,GAAW,iBAAiB,EAAE;8BADlC,cAAc;oBACd,IAAI;IACpB,CAAC;IAEJ;;;;;;OAMG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;YACvC,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,GAAW,CAAA;QACf,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,IAAI,QAAkB,CAAA;QACtB,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAA;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,WAAW,CACnB,GAAG,IAAI,CAAC,IAAI,sEAAsE,CACnF,CAAA;QACH,CAAC;QAED,OAAO,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAA;IACtD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAwB;QACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAA;QACrE,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QACjE,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACvF,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uEAAuE;YACvE,wDAAwD;YACxD,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAM;YAC9D,MAAM,IAAI,WAAW,CACnB,sBAAsB,IAAI,CAAC,IAAI,0BAA2B,KAAe,CAAC,OAAO,cAAc;gBAC7F,UAAU,CACb,CAAA;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @napi-rs/keyring is an optional dependency. On a platform without a prebuilt
|
|
5
5
|
* binary the install does not fail, this store simply becomes unavailable and
|
|
6
|
-
* the others remain. So
|
|
7
|
-
*
|
|
6
|
+
* the others remain. So it is loaded at runtime, and its absence has to be an
|
|
7
|
+
* ordinary outcome rather than a crash.
|
|
8
8
|
*
|
|
9
9
|
* Every call here can block: a locked keyring opens a dialog, and the underlying
|
|
10
10
|
* calls are synchronous. Callers must treat this store as potentially
|
|
@@ -31,6 +31,8 @@ interface KeyringModule {
|
|
|
31
31
|
* dependency does not appear halfway through a session.
|
|
32
32
|
*/
|
|
33
33
|
export declare function loadKeyringModule(): Promise<KeyringModule | undefined>;
|
|
34
|
+
/** For tests: replaces how the library is loaded. */
|
|
35
|
+
export declare function _setKeyringLoader(load: () => KeyringModule): void;
|
|
34
36
|
/** For tests, which must not depend on what is installed here. */
|
|
35
37
|
export declare function _setKeyringModule(module: KeyringModule | undefined): void;
|
|
36
38
|
/** Resets the cache. For tests. */
|
|
@@ -43,6 +45,14 @@ export declare class KeyringStore implements CredentialStore {
|
|
|
43
45
|
constructor(service?: string, account?: string);
|
|
44
46
|
load(): Promise<Credentials | undefined>;
|
|
45
47
|
save(credentials: Credentials): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Removes the entry, and succeeds only once it is gone.
|
|
50
|
+
*
|
|
51
|
+
* Read before and after, because deletePassword() answers false both when
|
|
52
|
+
* there is nothing and when the entry is in a store it cannot see. Until
|
|
53
|
+
* 2026-11-02 its answer and every error were dropped here, and a sign-out
|
|
54
|
+
* reported success while the password stayed (#52).
|
|
55
|
+
*/
|
|
46
56
|
clear(): Promise<void>;
|
|
47
57
|
}
|
|
48
58
|
export {};
|
|
@@ -3,19 +3,31 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @napi-rs/keyring is an optional dependency. On a platform without a prebuilt
|
|
5
5
|
* binary the install does not fail, this store simply becomes unavailable and
|
|
6
|
-
* the others remain. So
|
|
7
|
-
*
|
|
6
|
+
* the others remain. So it is loaded at runtime, and its absence has to be an
|
|
7
|
+
* ordinary outcome rather than a crash.
|
|
8
8
|
*
|
|
9
9
|
* Every call here can block: a locked keyring opens a dialog, and the underlying
|
|
10
10
|
* calls are synchronous. Callers must treat this store as potentially
|
|
11
11
|
* unresponsive, see probeKeyring in availability.ts.
|
|
12
12
|
*/
|
|
13
|
+
import { createRequire } from 'node:module';
|
|
13
14
|
import { BridgeError } from '../bridge/errors.js';
|
|
15
|
+
import { prepareSessionBus } from './session-bus.js';
|
|
16
|
+
const require = createRequire(import.meta.url);
|
|
14
17
|
/** Identifies our entries in the keyring. */
|
|
15
18
|
export const SERVICE_NAME = 'proton-mcp';
|
|
16
19
|
/** The account under which the Bridge credentials are stored. */
|
|
17
20
|
export const ACCOUNT_NAME = 'bridge';
|
|
18
21
|
let cached = undefined;
|
|
22
|
+
/**
|
|
23
|
+
* How the library is loaded: require rather than import(). The package is
|
|
24
|
+
* CommonJS, and on 2026-11-02 import() of it handed back an empty module once
|
|
25
|
+
* prepareSessionBus had looked at the D-Bus socket, in an installation that
|
|
26
|
+
* reaches the package through a symbolic link, the way pnpm and npm link lay
|
|
27
|
+
* packages out. Why is not known. require does not take that path, measured
|
|
28
|
+
* the same day in that very layout. Replaced in tests.
|
|
29
|
+
*/
|
|
30
|
+
let loadLibrary = () => require('@napi-rs/keyring');
|
|
19
31
|
/**
|
|
20
32
|
* Loads the keyring module, or reports that it is not there.
|
|
21
33
|
*
|
|
@@ -25,8 +37,11 @@ let cached = undefined;
|
|
|
25
37
|
export async function loadKeyringModule() {
|
|
26
38
|
if (cached !== undefined)
|
|
27
39
|
return cached ?? undefined;
|
|
40
|
+
// Before the library: it decides by the environment which store it uses,
|
|
41
|
+
// see session-bus.ts.
|
|
42
|
+
prepareSessionBus();
|
|
28
43
|
try {
|
|
29
|
-
const module = (
|
|
44
|
+
const module = loadLibrary();
|
|
30
45
|
cached = module;
|
|
31
46
|
return module;
|
|
32
47
|
}
|
|
@@ -35,6 +50,10 @@ export async function loadKeyringModule() {
|
|
|
35
50
|
return undefined;
|
|
36
51
|
}
|
|
37
52
|
}
|
|
53
|
+
/** For tests: replaces how the library is loaded. */
|
|
54
|
+
export function _setKeyringLoader(load) {
|
|
55
|
+
loadLibrary = load;
|
|
56
|
+
}
|
|
38
57
|
/** For tests, which must not depend on what is installed here. */
|
|
39
58
|
export function _setKeyringModule(module) {
|
|
40
59
|
cached = module ?? null;
|
|
@@ -84,13 +103,32 @@ export class KeyringStore {
|
|
|
84
103
|
// state possible.
|
|
85
104
|
entry.setPassword(JSON.stringify({ user: credentials.user, pass: credentials.pass }));
|
|
86
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Removes the entry, and succeeds only once it is gone.
|
|
108
|
+
*
|
|
109
|
+
* Read before and after, because deletePassword() answers false both when
|
|
110
|
+
* there is nothing and when the entry is in a store it cannot see. Until
|
|
111
|
+
* 2026-11-02 its answer and every error were dropped here, and a sign-out
|
|
112
|
+
* reported success while the password stayed (#52).
|
|
113
|
+
*/
|
|
87
114
|
async clear() {
|
|
88
|
-
const
|
|
115
|
+
const module = await loadKeyringModule();
|
|
116
|
+
// Without the module, this installation cannot have stored anything here.
|
|
117
|
+
if (!module)
|
|
118
|
+
return;
|
|
119
|
+
const entry = new module.Entry(this.service, this.account);
|
|
89
120
|
try {
|
|
121
|
+
if (!entry.getPassword())
|
|
122
|
+
return;
|
|
90
123
|
entry.deletePassword();
|
|
124
|
+
if (entry.getPassword())
|
|
125
|
+
throw new Error('the entry was still there after deleting it');
|
|
91
126
|
}
|
|
92
|
-
catch {
|
|
93
|
-
|
|
127
|
+
catch (error) {
|
|
128
|
+
const reason = error instanceof Error ? error.message.split('\n')[0] : String(error);
|
|
129
|
+
throw new BridgeError(`The Bridge password could not be removed from the system keyring: ${reason}. Remove the ` +
|
|
130
|
+
`entry "${this.service}" for "${this.account}" by hand, in the program that manages this ` +
|
|
131
|
+
'keyring: Seahorse, KWalletManager, Keychain Access or the Credential Manager.');
|
|
94
132
|
}
|
|
95
133
|
}
|
|
96
134
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyring.js","sourceRoot":"","sources":["../../src/credentials/keyring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"keyring.js","sourceRoot":"","sources":["../../src/credentials/keyring.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ import { readFile, writeFile, unlink, mkdir, stat, chmod } from 'node:fs/promise
|
|
|
13
13
|
import { dirname } from 'node:path';
|
|
14
14
|
import { platform } from 'node:os';
|
|
15
15
|
import { credentialsPath, parseEnvFile, permissionWarning } from '../config.js';
|
|
16
|
+
import { BridgeError } from '../bridge/errors.js';
|
|
16
17
|
export class PlainFileStore {
|
|
17
18
|
path;
|
|
18
19
|
notify;
|
|
@@ -70,8 +71,13 @@ export class PlainFileStore {
|
|
|
70
71
|
try {
|
|
71
72
|
await unlink(this.path);
|
|
72
73
|
}
|
|
73
|
-
catch {
|
|
74
|
-
// Already gone is the outcome we wanted.
|
|
74
|
+
catch (error) {
|
|
75
|
+
// Already gone is the outcome we wanted. Anything else leaves the
|
|
76
|
+
// password where the next start reads it again (#52).
|
|
77
|
+
if (error.code === 'ENOENT')
|
|
78
|
+
return;
|
|
79
|
+
throw new BridgeError(`The plain file ${this.path} could not be deleted: ${error.message}. It holds the ` +
|
|
80
|
+
'Bridge password in plain text, so delete it by hand.');
|
|
75
81
|
}
|
|
76
82
|
}
|
|
77
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plain-file.js","sourceRoot":"","sources":["../../src/credentials/plain-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAClF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"plain-file.js","sourceRoot":"","sources":["../../src/credentials/plain-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which store "System keyring" means on Linux, and making it the desktop's.
|
|
3
|
+
*
|
|
4
|
+
* @napi-rs/keyring picks its store from one variable. Measured on 2026-11-02
|
|
5
|
+
* with version 1.3.0 under KDE Plasma: with DBUS_SESSION_BUS_ADDRESS set, an
|
|
6
|
+
* entry goes to the Secret Service, which is GNOME Keyring or KWallet. Without
|
|
7
|
+
* it, or with an address that leads nowhere, the entry goes to the kernel's
|
|
8
|
+
* keyrings instead. Those live in memory: gone after a restart, and the
|
|
9
|
+
* persistent one expires after days without use. Each process sees only its
|
|
10
|
+
* own store, so a server started with the variable cannot remove what one
|
|
11
|
+
* started without it stored, and the other way round.
|
|
12
|
+
*
|
|
13
|
+
* MCP clients leave the variable out unless told otherwise: the SDK passes on
|
|
14
|
+
* HOME, LOGNAME, PATH, SHELL, TERM and USER and nothing else. So what "System
|
|
15
|
+
* keyring" meant depended on how the client started this server. The address
|
|
16
|
+
* is therefore supplied here when it is missing and the session has a bus in
|
|
17
|
+
* the usual place, the way every desktop program finds it.
|
|
18
|
+
*/
|
|
19
|
+
/** Where an entry ends up. "platform" is Keychain or Credential Manager. */
|
|
20
|
+
export type KeyringBackend = 'secret-service' | 'kernel' | 'platform';
|
|
21
|
+
export interface SessionBusOptions {
|
|
22
|
+
env?: NodeJS.ProcessEnv;
|
|
23
|
+
platform?: NodeJS.Platform;
|
|
24
|
+
uid?: number;
|
|
25
|
+
/** Whether a path is a socket. Replaced in tests. */
|
|
26
|
+
isSocket?: (path: string) => boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Supplies DBUS_SESSION_BUS_ADDRESS when it is missing and a session bus is
|
|
30
|
+
* there, and says which store the keyring library will use.
|
|
31
|
+
*
|
|
32
|
+
* Has to run before the library is loaded, and in every process that loads it:
|
|
33
|
+
* the probe of the sign-in page runs in a child, which inherits what is set
|
|
34
|
+
* here.
|
|
35
|
+
*/
|
|
36
|
+
export declare function prepareSessionBus(options?: SessionBusOptions): KeyringBackend;
|
|
37
|
+
/** What the sign-in page says when the keyring is the kernel's. */
|
|
38
|
+
export declare const KERNEL_KEYRING_NOTE: string;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which store "System keyring" means on Linux, and making it the desktop's.
|
|
3
|
+
*
|
|
4
|
+
* @napi-rs/keyring picks its store from one variable. Measured on 2026-11-02
|
|
5
|
+
* with version 1.3.0 under KDE Plasma: with DBUS_SESSION_BUS_ADDRESS set, an
|
|
6
|
+
* entry goes to the Secret Service, which is GNOME Keyring or KWallet. Without
|
|
7
|
+
* it, or with an address that leads nowhere, the entry goes to the kernel's
|
|
8
|
+
* keyrings instead. Those live in memory: gone after a restart, and the
|
|
9
|
+
* persistent one expires after days without use. Each process sees only its
|
|
10
|
+
* own store, so a server started with the variable cannot remove what one
|
|
11
|
+
* started without it stored, and the other way round.
|
|
12
|
+
*
|
|
13
|
+
* MCP clients leave the variable out unless told otherwise: the SDK passes on
|
|
14
|
+
* HOME, LOGNAME, PATH, SHELL, TERM and USER and nothing else. So what "System
|
|
15
|
+
* keyring" meant depended on how the client started this server. The address
|
|
16
|
+
* is therefore supplied here when it is missing and the session has a bus in
|
|
17
|
+
* the usual place, the way every desktop program finds it.
|
|
18
|
+
*/
|
|
19
|
+
import { statSync } from 'node:fs';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
function socketAt(path) {
|
|
22
|
+
try {
|
|
23
|
+
return statSync(path).isSocket();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** The path of a unix:path= address, if the address has one. */
|
|
30
|
+
function socketPath(address) {
|
|
31
|
+
return /(?:^|;)unix:(?:[^;]*,)?path=([^,;]+)/.exec(address)?.[1];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Supplies DBUS_SESSION_BUS_ADDRESS when it is missing and a session bus is
|
|
35
|
+
* there, and says which store the keyring library will use.
|
|
36
|
+
*
|
|
37
|
+
* Has to run before the library is loaded, and in every process that loads it:
|
|
38
|
+
* the probe of the sign-in page runs in a child, which inherits what is set
|
|
39
|
+
* here.
|
|
40
|
+
*/
|
|
41
|
+
export function prepareSessionBus(options = {}) {
|
|
42
|
+
const env = options.env ?? process.env;
|
|
43
|
+
if ((options.platform ?? process.platform) !== 'linux')
|
|
44
|
+
return 'platform';
|
|
45
|
+
const isSocket = options.isSocket ?? socketAt;
|
|
46
|
+
const given = env.DBUS_SESSION_BUS_ADDRESS;
|
|
47
|
+
if (given) {
|
|
48
|
+
// An abstract or TCP address cannot be checked from here and is taken as
|
|
49
|
+
// given. A path that is not there leads to the kernel, as measured.
|
|
50
|
+
const path = socketPath(given);
|
|
51
|
+
return path === undefined || isSocket(path) ? 'secret-service' : 'kernel';
|
|
52
|
+
}
|
|
53
|
+
const uid = options.uid ?? process.getuid?.();
|
|
54
|
+
const candidates = [
|
|
55
|
+
...(env.XDG_RUNTIME_DIR ? [join(env.XDG_RUNTIME_DIR, 'bus')] : []),
|
|
56
|
+
...(uid !== undefined ? [`/run/user/${uid}/bus`] : []),
|
|
57
|
+
];
|
|
58
|
+
const found = candidates.find((path) => isSocket(path));
|
|
59
|
+
if (found === undefined)
|
|
60
|
+
return 'kernel';
|
|
61
|
+
env.DBUS_SESSION_BUS_ADDRESS = `unix:path=${found}`;
|
|
62
|
+
return 'secret-service';
|
|
63
|
+
}
|
|
64
|
+
/** What the sign-in page says when the keyring is the kernel's. */
|
|
65
|
+
export const KERNEL_KEYRING_NOTE = 'No desktop session was found, so the password would go to the kernel\'s keyring rather than to ' +
|
|
66
|
+
'GNOME Keyring or KWallet. That keyring lives in memory only: the password is gone after a ' +
|
|
67
|
+
'restart, and after a few days without use, three by default.';
|
|
68
|
+
//# sourceMappingURL=session-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-bus.js","sourceRoot":"","sources":["../../src/credentials/session-bus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAahC,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAA;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,gEAAgE;AAChE,SAAS,UAAU,CAAC,OAAe;IACjC,OAAO,sCAAsC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AAClE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAO,GAAsB,EAAE;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;IACtC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,OAAO;QAAE,OAAO,UAAU,CAAA;IACzE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAA;IAE7C,MAAM,KAAK,GAAG,GAAG,CAAC,wBAAwB,CAAA;IAC1C,IAAI,KAAK,EAAE,CAAC;QACV,yEAAyE;QACzE,oEAAoE;QACpE,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;QAC9B,OAAO,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAA;IAC3E,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAA;IAC7C,MAAM,UAAU,GAAG;QACjB,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACvD,CAAA;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IACvD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAA;IACxC,GAAG,CAAC,wBAAwB,GAAG,aAAa,KAAK,EAAE,CAAA;IACnD,OAAO,gBAAgB,CAAA;AACzB,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,MAAM,mBAAmB,GAC9B,iGAAiG;IACjG,4FAA4F;IAC5F,8DAA8D,CAAA"}
|
|
@@ -26,7 +26,11 @@ export interface CredentialStore {
|
|
|
26
26
|
/** Returns the credentials, or undefined when none are stored. */
|
|
27
27
|
load(): Promise<Credentials | undefined>;
|
|
28
28
|
save(credentials: Credentials): Promise<void>;
|
|
29
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* Removes what is stored. Succeeds when nothing is left, also when nothing
|
|
31
|
+
* was there, and otherwise throws an explanation that says how to remove it
|
|
32
|
+
* by hand. Until 2026-11-02 every store swallowed its failures here (#52).
|
|
33
|
+
*/
|
|
30
34
|
clear(): Promise<void>;
|
|
31
35
|
/**
|
|
32
36
|
* Whether something is stored, without unlocking it.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/credentials/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/credentials/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAgEH,MAAM,CAAC,MAAM,eAAe,GAAiC;IAC3D,IAAI,EAAE,iBAAiB;IACvB,SAAS,EAAE,mBAAmB;IAC9B,cAAc,EAAE,4CAA4C;IAC5D,SAAS,EAAE,qBAAqB;CACjC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAwC;IACrE,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,gBAAgB;QACvB,OAAO,EACL,8FAA8F;YAC9F,mEAAmE;QACrE,OAAO,EACL,+FAA+F;YAC/F,+FAA+F;YAC/F,+DAA+D;QACjE,IAAI,EACF,gGAAgG;YAChG,8FAA8F;YAC9F,6FAA6F;YAC7F,SAAS;QACX,OAAO,EAAE,gEAAgE;QACzE,QAAQ,EAAE,cAAc;QACxB,OAAO,EAAE,cAAc;KACxB;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,gBAAgB;QACvB,OAAO,EACL,+FAA+F;YAC/F,YAAY;QACd,OAAO,EACL,6FAA6F;YAC7F,6FAA6F;YAC7F,+BAA+B;QACjC,IAAI,EACF,+FAA+F;YAC/F,yFAAyF;YACzF,gFAAgF;QAClF,OAAO,EACL,0FAA0F;YAC1F,6BAA6B;QAC/B,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,uBAAuB;KACjC;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,mBAAmB;QAC1B,OAAO,EAAE,wFAAwF;QACjG,OAAO,EACL,8FAA8F;YAC9F,gEAAgE;QAClE,IAAI,EACF,uFAAuF;YACvF,+EAA+E;QACjF,OAAO,EACL,4FAA4F;YAC5F,sBAAsB;QACxB,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,uBAAuB;KACjC;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,YAAY;QACnB,OAAO,EACL,wFAAwF;YACxF,UAAU;QACZ,OAAO,EACL,8FAA8F;YAC9F,2FAA2F;QAC7F,IAAI,EACF,yFAAyF;YACzF,oFAAoF;YACpF,+CAA+C;QACjD,OAAO,EACL,4FAA4F;YAC5F,8BAA8B;QAChC,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,OAAO;KACjB;CACF,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAA"}
|
|
@@ -27,12 +27,22 @@ export interface AttachmentContent {
|
|
|
27
27
|
/** Set when the content cannot be handed over as text. */
|
|
28
28
|
unsupportedReason?: string;
|
|
29
29
|
}
|
|
30
|
+
/** One attachment of a message, picked by index, with its bytes. */
|
|
31
|
+
export interface PickedAttachment {
|
|
32
|
+
filename: string;
|
|
33
|
+
contentType: string;
|
|
34
|
+
size: number;
|
|
35
|
+
content: Buffer;
|
|
36
|
+
}
|
|
30
37
|
/**
|
|
31
|
-
*
|
|
38
|
+
* Picks one attachment of a message by index.
|
|
32
39
|
*
|
|
33
40
|
* The index refers to the list from get_message, which already excludes
|
|
34
|
-
* Proton's own public key. The same filter runs here so both stay aligned
|
|
41
|
+
* Proton's own public key. The same filter runs here so both stay aligned, and
|
|
42
|
+
* reading an attachment as text and saving it as a file pick the same one.
|
|
35
43
|
*/
|
|
44
|
+
export declare function pickAttachment(connection: Connection, messageId: string, index: number, hint?: string): Promise<PickedAttachment>;
|
|
45
|
+
/** Reads one attachment of a message by index, as text where it is text. */
|
|
36
46
|
export declare function getAttachment(connection: Connection, messageId: string, index: number, options?: {
|
|
37
47
|
hint?: string;
|
|
38
48
|
offset?: number;
|
package/dist/mail/attachments.js
CHANGED
|
@@ -30,16 +30,17 @@ export function isTextual(contentType) {
|
|
|
30
30
|
return TEXTUAL.some((p) => p.test(contentType));
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
|
-
*
|
|
33
|
+
* Picks one attachment of a message by index.
|
|
34
34
|
*
|
|
35
35
|
* The index refers to the list from get_message, which already excludes
|
|
36
|
-
* Proton's own public key. The same filter runs here so both stay aligned
|
|
36
|
+
* Proton's own public key. The same filter runs here so both stay aligned, and
|
|
37
|
+
* reading an attachment as text and saving it as a file pick the same one.
|
|
37
38
|
*/
|
|
38
|
-
export async function
|
|
39
|
+
export async function pickAttachment(connection, messageId, index, hint) {
|
|
39
40
|
if (!Number.isInteger(index) || index < 0) {
|
|
40
41
|
throw new BridgeError(`"${index}" is not a valid attachment index. Expected 0 or higher.`);
|
|
41
42
|
}
|
|
42
|
-
const resolved = await resolveMessageId(connection, messageId,
|
|
43
|
+
const resolved = await resolveMessageId(connection, messageId, hint);
|
|
43
44
|
const source = await connection.withMailbox(resolved.path, async (client) => {
|
|
44
45
|
const message = await client.fetchOne(String(resolved.uid), { source: true }, { uid: true });
|
|
45
46
|
return message && message.source ? message.source : undefined;
|
|
@@ -56,20 +57,27 @@ export async function getAttachment(connection, messageId, index, options = {})
|
|
|
56
57
|
? `The message ${resolved.messageId} has no attachments.`
|
|
57
58
|
: `Attachment index ${index} does not exist. The message has ${available}, so valid indices are 0 to ${available - 1}.`);
|
|
58
59
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
return {
|
|
61
|
+
contentType: wanted.contentType ?? 'application/octet-stream',
|
|
62
|
+
filename: wanted.filename ?? `attachment-${index}`,
|
|
63
|
+
size: wanted.size ?? wanted.content?.length ?? 0,
|
|
64
|
+
content: wanted.content ?? Buffer.alloc(0),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/** Reads one attachment of a message by index, as text where it is text. */
|
|
68
|
+
export async function getAttachment(connection, messageId, index, options = {}) {
|
|
69
|
+
const { filename, contentType, size, content } = await pickAttachment(connection, messageId, index, options.hint);
|
|
62
70
|
if (!isTextual(contentType)) {
|
|
63
71
|
return {
|
|
64
72
|
filename,
|
|
65
73
|
contentType,
|
|
66
74
|
size,
|
|
67
|
-
unsupportedReason: `This attachment is ${contentType} and cannot be returned as text
|
|
68
|
-
'
|
|
69
|
-
'
|
|
75
|
+
unsupportedReason: `This attachment is ${contentType} and cannot be returned as text, because that would mean ` +
|
|
76
|
+
'base64 in the context. save_attachment saves it as a file on this machine where the user ' +
|
|
77
|
+
'has set that up; otherwise open the message in a mail client.',
|
|
70
78
|
};
|
|
71
79
|
}
|
|
72
|
-
const raw =
|
|
80
|
+
const raw = content.toString('utf8');
|
|
73
81
|
const excerpt = truncate(raw, MAX_ATTACHMENT_CHARS, options.offset ?? 0);
|
|
74
82
|
const result = {
|
|
75
83
|
filename,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/mail/attachments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE9D,6DAA6D;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAA;AAE1C,+CAA+C;AAC/C,MAAM,OAAO,GAAG;IACd,UAAU;IACV,sBAAsB;IACtB,qBAAqB;IACrB,wBAAwB;IACxB,4BAA4B;IAC5B,SAAS;IACT,UAAU;CACX,CAAA;AAED,MAAM,UAAU,SAAS,CAAC,WAAmB;IAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;AACjD,CAAC;
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/mail/attachments.ts"],"names":[],"mappings":"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"}
|