@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.
Files changed (97) hide show
  1. package/README.md +61 -16
  2. package/dist/bridge/certificate.d.ts +33 -1
  3. package/dist/bridge/certificate.js +82 -9
  4. package/dist/bridge/certificate.js.map +1 -1
  5. package/dist/bridge/connection.js +31 -6
  6. package/dist/bridge/connection.js.map +1 -1
  7. package/dist/bridge/errors.d.ts +8 -0
  8. package/dist/bridge/errors.js +28 -3
  9. package/dist/bridge/errors.js.map +1 -1
  10. package/dist/config.d.ts +6 -0
  11. package/dist/config.js +1 -0
  12. package/dist/config.js.map +1 -1
  13. package/dist/credentials/availability.d.ts +5 -0
  14. package/dist/credentials/availability.js +7 -0
  15. package/dist/credentials/availability.js.map +1 -1
  16. package/dist/credentials/encrypted-file.js +7 -2
  17. package/dist/credentials/encrypted-file.js.map +1 -1
  18. package/dist/credentials/keyring.d.ts +12 -2
  19. package/dist/credentials/keyring.js +44 -6
  20. package/dist/credentials/keyring.js.map +1 -1
  21. package/dist/credentials/plain-file.js +8 -2
  22. package/dist/credentials/plain-file.js.map +1 -1
  23. package/dist/credentials/session-bus.d.ts +38 -0
  24. package/dist/credentials/session-bus.js +68 -0
  25. package/dist/credentials/session-bus.js.map +1 -0
  26. package/dist/credentials/store.d.ts +5 -1
  27. package/dist/credentials/store.js.map +1 -1
  28. package/dist/mail/attachments.d.ts +12 -2
  29. package/dist/mail/attachments.js +19 -11
  30. package/dist/mail/attachments.js.map +1 -1
  31. package/dist/mail/compose.d.ts +65 -9
  32. package/dist/mail/compose.js +147 -11
  33. package/dist/mail/compose.js.map +1 -1
  34. package/dist/mail/drafts.d.ts +13 -2
  35. package/dist/mail/drafts.js +69 -18
  36. package/dist/mail/drafts.js.map +1 -1
  37. package/dist/mail/ids.js +6 -4
  38. package/dist/mail/ids.js.map +1 -1
  39. package/dist/mail/messages.d.ts +25 -2
  40. package/dist/mail/messages.js +37 -4
  41. package/dist/mail/messages.js.map +1 -1
  42. package/dist/mail/saved-attachments.d.ts +128 -0
  43. package/dist/mail/saved-attachments.js +448 -0
  44. package/dist/mail/saved-attachments.js.map +1 -0
  45. package/dist/mail/search.d.ts +67 -3
  46. package/dist/mail/search.js +134 -23
  47. package/dist/mail/search.js.map +1 -1
  48. package/dist/mail/send.js +24 -9
  49. package/dist/mail/send.js.map +1 -1
  50. package/dist/mail/uid-search.d.ts +17 -0
  51. package/dist/mail/uid-search.js +25 -0
  52. package/dist/mail/uid-search.js.map +1 -0
  53. package/dist/mime/filenames.d.ts +24 -0
  54. package/dist/mime/filenames.js +58 -0
  55. package/dist/mime/filenames.js.map +1 -0
  56. package/dist/mime/parts.d.ts +34 -0
  57. package/dist/mime/parts.js +92 -0
  58. package/dist/mime/parts.js.map +1 -0
  59. package/dist/server.js +39 -6
  60. package/dist/server.js.map +1 -1
  61. package/dist/session.d.ts +15 -3
  62. package/dist/session.js +35 -8
  63. package/dist/session.js.map +1 -1
  64. package/dist/tools/confirm.js +39 -11
  65. package/dist/tools/confirm.js.map +1 -1
  66. package/dist/tools/drafts.d.ts +3 -0
  67. package/dist/tools/drafts.js +18 -6
  68. package/dist/tools/drafts.js.map +1 -1
  69. package/dist/tools/filters.d.ts +40 -0
  70. package/dist/tools/filters.js +89 -0
  71. package/dist/tools/filters.js.map +1 -0
  72. package/dist/tools/format.d.ts +8 -0
  73. package/dist/tools/format.js +29 -6
  74. package/dist/tools/format.js.map +1 -1
  75. package/dist/tools/guidance.js +27 -3
  76. package/dist/tools/guidance.js.map +1 -1
  77. package/dist/tools/messages.js +7 -2
  78. package/dist/tools/messages.js.map +1 -1
  79. package/dist/tools/pending-view.d.ts +7 -0
  80. package/dist/tools/pending-view.js +4 -1
  81. package/dist/tools/pending-view.js.map +1 -1
  82. package/dist/tools/saved.d.ts +15 -0
  83. package/dist/tools/saved.js +107 -0
  84. package/dist/tools/saved.js.map +1 -0
  85. package/dist/tools/send.js +4 -1
  86. package/dist/tools/send.js.map +1 -1
  87. package/dist/web/layout.js +2 -0
  88. package/dist/web/layout.js.map +1 -1
  89. package/dist/web/pages.js +1 -0
  90. package/dist/web/pages.js.map +1 -1
  91. package/dist/web/pending.d.ts +4 -0
  92. package/dist/web/pending.js +32 -4
  93. package/dist/web/pending.js.map +1 -1
  94. package/dist/web/server.d.ts +16 -5
  95. package/dist/web/server.js +12 -8
  96. package/dist/web/server.js.map +1 -1
  97. package/package.json +16 -8
@@ -5,13 +5,14 @@
5
5
  * same thing and must not drift: the recipients a confirmation shows have to
6
6
  * be the recipients that are written or sent, or the confirmation is theatre.
7
7
  *
8
- * No attachment can be read from disk here, and that is deliberate rather than
9
- * unfinished. An attachment taken from a path would mean the model names a
10
- * file, the server reads it, and the next confirmation the user waves through
11
- * carries it outside. Which paths may be reached is its own decision, not a
12
- * side effect of being able to write a draft.
8
+ * No attachment can be read from disk here, and that is deliberate. An
9
+ * attachment taken from a path would mean the model names a file, the server
10
+ * reads it, and the next confirmation the user waves through carries it
11
+ * outside. Which paths may be reached is its own decision, made in #17 rather
12
+ * than as a side effect of being able to write a draft.
13
13
  */
14
14
  import { type MarkupUrl, type MarkupLevel, type StyleNote } from './markup.js';
15
+ import type { CarriedFile } from '../mime/parts.js';
15
16
  /** An address, optionally with a display name. */
16
17
  export interface Recipient {
17
18
  name?: string;
@@ -43,10 +44,16 @@ export interface Draft {
43
44
  * replayed for the unwarned one.
44
45
  */
45
46
  markupLevel?: MarkupLevel;
46
- /** A whole message carried along, used when forwarding. */
47
+ /**
48
+ * A whole message carried along, used when forwarding.
49
+ *
50
+ * `carries` names the attachments travelling inside it. Only for telling the
51
+ * assistant what the original held; the bytes are in `raw`.
52
+ */
47
53
  attachedMessage?: {
48
54
  filename: string;
49
55
  raw: Buffer;
56
+ carries?: string[];
50
57
  };
51
58
  /**
52
59
  * The message as markup, when it has any.
@@ -76,6 +83,21 @@ export interface Draft {
76
83
  quotedHtml?: string;
77
84
  /** Files referenced from the markup by content id. */
78
85
  inlineParts?: InlinePart[];
86
+ /**
87
+ * The markup body of a stored draft, read back to be sent or kept, and kept
88
+ * apart from `html` on purpose.
89
+ *
90
+ * It is not held to the permitted set again. It was held to it when it was
91
+ * written through this server, or a person wrote it in Proton. Once stored,
92
+ * the composed part and a quote can no longer be told apart, and the level
93
+ * it was written at is recorded nowhere, so a second check refused every
94
+ * formatted reply on the <style> of its quote. It is read the way a quote
95
+ * is instead: the confirmation counts and the preview names everything in
96
+ * it, and anything beyond `standard` carries the same warning as `extended`.
97
+ */
98
+ storedHtml?: string;
99
+ /** Files read back from a stored draft, carried along as they were stored. */
100
+ carriedFiles?: CarriedFile[];
79
101
  }
80
102
  /** A file carried inside the message and referenced from the markup. */
81
103
  export interface InlinePart {
@@ -85,14 +107,25 @@ export interface InlinePart {
85
107
  contentType: string;
86
108
  content: Buffer;
87
109
  }
110
+ /**
111
+ * Refuses a recipient that reads one way in the confirmation and goes somewhere
112
+ * else, or nowhere, once the message is sent.
113
+ *
114
+ * Applied to every recipient a message can carry, whether a caller typed it or
115
+ * it was read back from a stored draft. The confirmation is only worth
116
+ * something if what it shows is what the envelope carries.
117
+ */
118
+ export declare function assertDeliverable(recipient: Recipient): void;
88
119
  /**
89
120
  * Checks an address well enough to catch the mistakes that matter.
90
121
  *
91
122
  * Not a full RFC 5322 parser, and not trying to be: the point is to refuse a
92
123
  * string that would end up somewhere unintended, not to adjudicate exotic but
93
- * legal forms. A newline is the one that has to be caught, because a header
94
- * injected through an address field would let the sender of a mail the model
95
- * just read add a recipient the confirmation never showed.
124
+ * legal forms. A newline is the one that has to be caught first, because a
125
+ * header injected through an address field would let the sender of a mail the
126
+ * model just read add a recipient the confirmation never showed. Everything
127
+ * else that would make the confirmation and the envelope disagree is
128
+ * assertDeliverable's.
96
129
  */
97
130
  export declare function parseRecipient(input: string): Recipient;
98
131
  export declare function parseRecipients(list: string[] | undefined): Recipient[];
@@ -263,6 +296,20 @@ export interface QuoteSummary {
263
296
  * is visible as the recipient will see it.
264
297
  */
265
298
  export declare function summariseQuote(draft: Draft): QuoteSummary | undefined;
299
+ /** The line this server writes above every forwarded message, in text and in markup. */
300
+ export declare const FORWARD_HEADER = "---------- Forwarded message ----------";
301
+ /**
302
+ * Whether the message carries a quoted one, for the count line of the
303
+ * confirmation.
304
+ *
305
+ * summariseQuote only sees a quote that is still held apart from the body,
306
+ * which is the case while a reply or a forward is composed with markup. Once a
307
+ * draft is stored, and in a plain text reply, the quote is part of the body,
308
+ * and up to 0.4.11 the confirmation said nothing about it. It is recognised
309
+ * there by what quotes it: the forward header this server writes, the "wrote:"
310
+ * line followed by quoted lines, or a blockquote, which is how Proton quotes.
311
+ */
312
+ export declare function carriesQuote(draft: Draft): boolean;
266
313
  /**
267
314
  * Everything the message points at or carries, for the confirmation.
268
315
  *
@@ -287,3 +334,12 @@ export declare function fingerprintPart(content: Buffer): string;
287
334
  * "what did it use" is a list rather than a promise.
288
335
  */
289
336
  export declare function styleNotesOf(draft: Draft): StyleNote[];
337
+ /**
338
+ * What a stored body carries that no composed message may: style blocks,
339
+ * scripts, event handlers, data: addresses, comments.
340
+ *
341
+ * Empty for anything that is not a stored draft, because composed markup with
342
+ * such a thing never gets this far. For a stored draft it is part of what the
343
+ * confirmation warns about, since it was not checked again on the way out.
344
+ */
345
+ export declare function storedBeyondOf(draft: Draft): string[];
@@ -5,26 +5,82 @@
5
5
  * same thing and must not drift: the recipients a confirmation shows have to
6
6
  * be the recipients that are written or sent, or the confirmation is theatre.
7
7
  *
8
- * No attachment can be read from disk here, and that is deliberate rather than
9
- * unfinished. An attachment taken from a path would mean the model names a
10
- * file, the server reads it, and the next confirmation the user waves through
11
- * carries it outside. Which paths may be reached is its own decision, not a
12
- * side effect of being able to write a draft.
8
+ * No attachment can be read from disk here, and that is deliberate. An
9
+ * attachment taken from a path would mean the model names a file, the server
10
+ * reads it, and the next confirmation the user waves through carries it
11
+ * outside. Which paths may be reached is its own decision, made in #17 rather
12
+ * than as a side effect of being able to write a draft.
13
13
  */
14
14
  import MailComposer from 'nodemailer/lib/mail-composer/index.js';
15
+ import MimeNode from 'nodemailer/lib/mime-node';
15
16
  import { createHash, randomUUID } from 'node:crypto';
16
17
  import { BridgeError } from '../bridge/errors.js';
17
18
  import { assertSendableMarkup, readMarkup, } from './markup.js';
18
19
  import { prepareQuotedMarkup } from './quote.js';
19
20
  import { htmlToText } from '../mime/parse.js';
21
+ /**
22
+ * Control characters, and the formatting ones that reorder text or take up no
23
+ * space. In a display name they change how a recipient reads in the
24
+ * confirmation without changing where the message goes: U+202E reverses
25
+ * everything after it.
26
+ */
27
+ const INVISIBLE = /[\p{Cc}\p{Cf}]/u;
28
+ /** Names each invisible character by its code point, so a refusal can show it. */
29
+ function showInvisible(value) {
30
+ return value.replace(/[\p{Cc}\p{Cf}]/gu, (c) => `U+${c.codePointAt(0).toString(16).toUpperCase().padStart(4, '0')}`);
31
+ }
32
+ /**
33
+ * Refuses a recipient that reads one way in the confirmation and goes somewhere
34
+ * else, or nowhere, once the message is sent.
35
+ *
36
+ * Applied to every recipient a message can carry, whether a caller typed it or
37
+ * it was read back from a stored draft. The confirmation is only worth
38
+ * something if what it shows is what the envelope carries.
39
+ */
40
+ export function assertDeliverable(recipient) {
41
+ const { name, address } = recipient;
42
+ if (name !== undefined && INVISIBLE.test(name)) {
43
+ throw new BridgeError(`The display name "${showInvisible(name)}" contains a control or formatting character. Such ` +
44
+ 'a character can change how a recipient reads in the confirmation, for example by reversing ' +
45
+ 'the text after it, so it is refused rather than removed.');
46
+ }
47
+ // Letters from another script can spell a familiar domain, and the envelope
48
+ // then carries its punycode form, which is a different domain anyone can
49
+ // register. Measured with nodemailer 10.1.7: ceo@\u0430\u0440\u0440\u04cf\u0435.com, all Cyrillic,
50
+ // reads as apple.com and goes to ceo@xn--80ak6aa92e.com.
51
+ if (/[^\x21-\x7e]/.test(address)) {
52
+ throw new BridgeError(`"${showInvisible(address)}" contains a character outside ASCII. Letters from another script ` +
53
+ 'can spell a familiar domain while the message goes to a different one, so such an address ' +
54
+ 'is refused. A domain that really is written with such letters can be given in its ASCII ' +
55
+ 'form, which starts with xn--, and that is then exactly what the confirmation shows.');
56
+ }
57
+ // nodemailer reads the address again, with its own parser, when it builds the
58
+ // envelope, and the two readings disagree. Measured with 10.1.7:
59
+ // "x@example.com:y" leaves the envelope empty, "a:b@example.com" goes to
60
+ // b@example.com. So the address has to come back out of the very code that
61
+ // builds the envelope as itself. Only the domain may change, to lower case.
62
+ const at = address.lastIndexOf('@');
63
+ const expected = address.slice(0, at) + address.slice(at).toLowerCase();
64
+ const envelope = new MimeNode()
65
+ .setEnvelope({ from: 'check@example.invalid', to: [address] })
66
+ .getEnvelope().to;
67
+ if (envelope.length !== 1 || envelope[0] !== expected) {
68
+ const outcome = envelope.length === 0 ? 'names no recipient at all' : `goes to ${envelope.join(', ')}`;
69
+ throw new BridgeError(`"${showInvisible(address)}" would not reach that address: read the way the message is sent, ` +
70
+ `it ${outcome}. Give the address on its own, without a comment in parentheses, a group ` +
71
+ 'name or a colon.');
72
+ }
73
+ }
20
74
  /**
21
75
  * Checks an address well enough to catch the mistakes that matter.
22
76
  *
23
77
  * Not a full RFC 5322 parser, and not trying to be: the point is to refuse a
24
78
  * string that would end up somewhere unintended, not to adjudicate exotic but
25
- * legal forms. A newline is the one that has to be caught, because a header
26
- * injected through an address field would let the sender of a mail the model
27
- * just read add a recipient the confirmation never showed.
79
+ * legal forms. A newline is the one that has to be caught first, because a
80
+ * header injected through an address field would let the sender of a mail the
81
+ * model just read add a recipient the confirmation never showed. Everything
82
+ * else that would make the confirmation and the envelope disagree is
83
+ * assertDeliverable's.
28
84
  */
29
85
  export function parseRecipient(input) {
30
86
  const raw = input.trim();
@@ -42,7 +98,9 @@ export function parseRecipient(input) {
42
98
  throw new BridgeError(`"${address}" is not a usable email address. Expected something of the form name@example.com, ` +
43
99
  'optionally as "Display Name <name@example.com>".');
44
100
  }
45
- return name ? { name, address } : { address };
101
+ const recipient = name ? { name, address } : { address };
102
+ assertDeliverable(recipient);
103
+ return recipient;
46
104
  }
47
105
  export function parseRecipients(list) {
48
106
  return (list ?? []).map(parseRecipient);
@@ -93,7 +151,26 @@ export async function buildMessage(draft, options = {}) {
93
151
  messageId: draft.messageId,
94
152
  date: new Date(),
95
153
  };
96
- if (draft.html === undefined) {
154
+ if (draft.html !== undefined && draft.storedHtml !== undefined) {
155
+ // One body or the other. Both would mean the composed part had been checked
156
+ // and the stored part would go out beside it unread.
157
+ throw new BridgeError('A message cannot carry composed markup and a stored body at once.');
158
+ }
159
+ if (draft.storedHtml !== undefined) {
160
+ // Not checked against the permitted set, see Draft.storedHtml. What is
161
+ // still checked is that every picture it shows arrived with it.
162
+ const provided = new Set([
163
+ ...(draft.inlineParts ?? []).map((part) => part.contentId),
164
+ ...(draft.carriedFiles ?? []).flatMap((file) => (file.contentId ? [file.contentId] : [])),
165
+ ]);
166
+ const missing = readMarkup(draft.storedHtml, 'extended').contentIds.filter((id) => !provided.has(id));
167
+ if (missing.length) {
168
+ throw new BridgeError(`The stored draft refers to ${missing.map((id) => `"cid:${id}"`).join(', ')}, but no such ` +
169
+ 'file is stored with it. Open the draft in Proton and attach the picture again.');
170
+ }
171
+ fields.html = draft.storedHtml;
172
+ }
173
+ else if (draft.html === undefined) {
97
174
  fields.text = draft.text;
98
175
  }
99
176
  else {
@@ -103,7 +180,10 @@ export async function buildMessage(draft, options = {}) {
103
180
  // Every content id the markup points at has to have arrived with it. A
104
181
  // reference to a part that is not there shows the recipient a broken image
105
182
  // where the sender saw a picture, and neither of them finds out why.
106
- const provided = new Set((draft.inlineParts ?? []).map((part) => part.contentId));
183
+ const provided = new Set([
184
+ ...(draft.inlineParts ?? []).map((part) => part.contentId),
185
+ ...(draft.carriedFiles ?? []).flatMap((file) => (file.contentId ? [file.contentId] : [])),
186
+ ]);
107
187
  const missing = reading.contentIds.filter((id) => !provided.has(id));
108
188
  if (missing.length) {
109
189
  throw new BridgeError(`The markup refers to ${missing.map((id) => `"cid:${id}"`).join(', ')}, but no such file ` +
@@ -137,6 +217,14 @@ export async function buildMessage(draft, options = {}) {
137
217
  cid: part.contentId,
138
218
  });
139
219
  }
220
+ for (const file of draft.carriedFiles ?? []) {
221
+ attachments.push({
222
+ filename: file.filename,
223
+ content: file.content,
224
+ contentType: file.contentType,
225
+ ...(file.contentId ? { cid: file.contentId } : {}),
226
+ });
227
+ }
140
228
  if (attachments.length)
141
229
  fields.attachments = attachments;
142
230
  // keepBcc is not an option MailComposer understands. It lives on the MimeNode
@@ -335,6 +423,8 @@ export const PLAIN_TEXT_NOTE = 'The body is plain text and markup is not interpr
335
423
  * to, and that is exactly the difference a person confirming a send has to see.
336
424
  */
337
425
  export function readableBody(draft) {
426
+ if (draft.storedHtml !== undefined)
427
+ return htmlToText(draft.storedHtml);
338
428
  return draft.html === undefined
339
429
  ? draft.text
340
430
  : htmlToText(draft.html + (draft.quotedHtml ?? ''));
@@ -348,6 +438,8 @@ export function readableBody(draft) {
348
438
  * before their own words appear.
349
439
  */
350
440
  export function composedBody(draft) {
441
+ if (draft.storedHtml !== undefined)
442
+ return htmlToText(draft.storedHtml);
351
443
  return draft.html === undefined ? draft.text : htmlToText(draft.html);
352
444
  }
353
445
  /**
@@ -376,6 +468,27 @@ export function summariseQuote(draft) {
376
468
  hiddenText: reading.hiddenText,
377
469
  };
378
470
  }
471
+ /** The line this server writes above every forwarded message, in text and in markup. */
472
+ export const FORWARD_HEADER = '---------- Forwarded message ----------';
473
+ /**
474
+ * Whether the message carries a quoted one, for the count line of the
475
+ * confirmation.
476
+ *
477
+ * summariseQuote only sees a quote that is still held apart from the body,
478
+ * which is the case while a reply or a forward is composed with markup. Once a
479
+ * draft is stored, and in a plain text reply, the quote is part of the body,
480
+ * and up to 0.4.11 the confirmation said nothing about it. It is recognised
481
+ * there by what quotes it: the forward header this server writes, the "wrote:"
482
+ * line followed by quoted lines, or a blockquote, which is how Proton quotes.
483
+ */
484
+ export function carriesQuote(draft) {
485
+ if (draft.quotedHtml)
486
+ return true;
487
+ if (draft.storedHtml !== undefined) {
488
+ return /<blockquote\b/i.test(draft.storedHtml) || draft.storedHtml.includes(FORWARD_HEADER);
489
+ }
490
+ return draft.text.includes(FORWARD_HEADER) || /^On .+ wrote:\n>/m.test(draft.text);
491
+ }
379
492
  /**
380
493
  * Everything the message points at or carries, for the confirmation.
381
494
  *
@@ -392,16 +505,24 @@ export function describeAttachments(draft) {
392
505
  for (const part of draft.inlineParts ?? []) {
393
506
  lines.push(`${part.filename} (${part.contentType}, ${part.content.length} bytes, in the message body)`);
394
507
  }
508
+ for (const file of draft.carriedFiles ?? []) {
509
+ const where = file.contentId ? ', in the message body' : '';
510
+ lines.push(`${file.filename} (${file.contentType}, ${file.content.length} bytes, stored with the draft${where})`);
511
+ }
395
512
  return lines;
396
513
  }
397
514
  /** The addresses in a message's markup, with the text they are shown as. */
398
515
  export function describeUrls(draft) {
516
+ if (draft.storedHtml !== undefined)
517
+ return readMarkup(draft.storedHtml, 'extended').urls;
399
518
  return draft.html === undefined
400
519
  ? []
401
520
  : assertSendableMarkup(draft.html, draft.markupLevel ?? 'standard').urls;
402
521
  }
403
522
  /** Text a recipient can read that the readable body leaves out. */
404
523
  export function hiddenTextOf(draft) {
524
+ if (draft.storedHtml !== undefined)
525
+ return readMarkup(draft.storedHtml, 'extended').hiddenText;
405
526
  return draft.html === undefined
406
527
  ? []
407
528
  : assertSendableMarkup(draft.html, draft.markupLevel ?? 'standard').hiddenText;
@@ -419,8 +540,23 @@ export function fingerprintPart(content) {
419
540
  * "what did it use" is a list rather than a promise.
420
541
  */
421
542
  export function styleNotesOf(draft) {
543
+ if (draft.storedHtml !== undefined)
544
+ return readMarkup(draft.storedHtml, 'extended').styleNotes;
422
545
  if (draft.html === undefined)
423
546
  return [];
424
547
  return assertSendableMarkup(draft.html, draft.markupLevel ?? 'standard').styleNotes;
425
548
  }
549
+ /**
550
+ * What a stored body carries that no composed message may: style blocks,
551
+ * scripts, event handlers, data: addresses, comments.
552
+ *
553
+ * Empty for anything that is not a stored draft, because composed markup with
554
+ * such a thing never gets this far. For a stored draft it is part of what the
555
+ * confirmation warns about, since it was not checked again on the way out.
556
+ */
557
+ export function storedBeyondOf(draft) {
558
+ if (draft.storedHtml === undefined)
559
+ return [];
560
+ return readMarkup(draft.storedHtml, 'extended').problems.map((problem) => problem.found);
561
+ }
426
562
  //# sourceMappingURL=compose.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/mail/compose.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/mail/compose.ts"],"names":[],"mappings":"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"}
@@ -77,8 +77,19 @@ export interface DraftResult {
77
77
  bcc: Recipient[];
78
78
  /** Its uid in "Drafts". Valid until the draft is replaced. */
79
79
  uid: number;
80
- /** Set when a whole message was carried along, as with a forward. */
81
- carriedAttachments?: string[];
80
+ /**
81
+ * Set when a whole message was carried along, as with a forward.
82
+ *
83
+ * Two things, kept apart because they were confused up to 0.4.11: the one
84
+ * file this server attached, and the attachments travelling inside it. The
85
+ * answer used to name the first as if it were the second.
86
+ */
87
+ attachedOriginal?: {
88
+ filename: string;
89
+ carries: string[];
90
+ };
91
+ /** Files that were stored with the draft and stay with it. */
92
+ keptFiles?: string[];
82
93
  }
83
94
  /** Creates a draft from scratch. */
84
95
  export declare function createDraft(connection: Connection, readOnly: boolean, fromAddress: string, input: DraftInput): Promise<DraftResult>;
@@ -41,8 +41,10 @@
41
41
  import { BridgeError } from '../bridge/errors.js';
42
42
  import { normaliseMessageId, findByMessageId } from './ids.js';
43
43
  import { getMessage, listMessages } from './messages.js';
44
- import { htmlToText } from '../mime/parse.js';
45
- import { buildMessage, mintMessageId, parseRecipient, parseRecipients, escapeHtml, prefixSubject, quote, quoteAsHtml, quoteBody, } from './compose.js';
44
+ import { htmlToText, parseMessage } from '../mime/parse.js';
45
+ import { readParts } from '../mime/parts.js';
46
+ import { forwardedFileName } from '../mime/filenames.js';
47
+ import { allRecipients, assertDeliverable, buildMessage, FORWARD_HEADER, mintMessageId, parseRecipient, parseRecipients, escapeHtml, prefixSubject, quote, quoteAsHtml, quoteBody, } from './compose.js';
46
48
  /** The one mailbox this module writes to. */
47
49
  export const DRAFTS = 'Drafts';
48
50
  /**
@@ -104,6 +106,24 @@ async function findDraft(connection, messageId) {
104
106
  return { uid, flags: message && message.flags ? message.flags : new Set() };
105
107
  });
106
108
  }
109
+ /**
110
+ * A stored draft as it lies in Drafts.
111
+ *
112
+ * The headers are read as everywhere else. Body and files come from readParts
113
+ * rather than from mailparser, which writes a forwarded original into the body
114
+ * and rewrites every cid: picture, so that what came back was not what had
115
+ * been stored. See src/mime/parts.ts.
116
+ */
117
+ async function readStored(connection, uid) {
118
+ const source = await connection.withMailbox(DRAFTS, async (client) => {
119
+ const message = await client.fetchOne(String(uid), { source: true }, { uid: true });
120
+ return message && message.source ? message.source : undefined;
121
+ });
122
+ if (!source) {
123
+ throw new BridgeError(`The draft could not be read from "${DRAFTS}". It may have been sent or moved in the meantime.`);
124
+ }
125
+ return { message: await parseMessage(source), parts: await readParts(source) };
126
+ }
107
127
  /** Writes a built message into Drafts and describes what was stored. */
108
128
  async function store(connection, draft) {
109
129
  const raw = await buildMessage(draft, { keepBcc: true });
@@ -173,7 +193,7 @@ export async function updateDraft(connection, readOnly, fromAddress, messageId,
173
193
  throw new BridgeError(`The message ${id} is in "${DRAFTS}" but does not carry the draft flag, so it is not treated ` +
174
194
  'as a draft. Refusing to replace it, because replacing means deleting the old version.');
175
195
  }
176
- const current = await getMessage(connection, id, { hint: DRAFTS });
196
+ const { message: current, parts } = await readStored(connection, existing.uid);
177
197
  const from = parseRecipient(fromAddress);
178
198
  const draft = {
179
199
  from,
@@ -184,9 +204,15 @@ export async function updateDraft(connection, readOnly, fromAddress, messageId,
184
204
  // only ever true for a draft this server wrote.
185
205
  bcc: changes.bcc === undefined ? current.bcc : parseRecipients(changes.bcc),
186
206
  subject: changes.subject === undefined ? current.subject : changes.subject,
187
- ...markupOf(changes, current),
207
+ ...bodyOf(changes, parts),
188
208
  messageId: id,
209
+ // Kept whatever happens to the body. No tool removes a file from a draft,
210
+ // so none may disappear as a side effect of changing the text.
211
+ ...(parts.files.length ? { carriedFiles: parts.files } : {}),
189
212
  };
213
+ // The recipients carried over were read back from the stored draft rather
214
+ // than typed, and have not been through parseRecipient.
215
+ allRecipients(draft).forEach(assertDeliverable);
190
216
  const raw = await buildMessage(draft, { keepBcc: true });
191
217
  const uid = await appendDraft(connection, raw);
192
218
  await connection.withMailbox(DRAFTS, async (client, status) => {
@@ -202,6 +228,7 @@ export async function updateDraft(connection, readOnly, fromAddress, messageId,
202
228
  cc: draft.cc,
203
229
  bcc: draft.bcc,
204
230
  uid,
231
+ ...(parts.files.length ? { keptFiles: parts.files.map((file) => file.filename) } : {}),
205
232
  };
206
233
  }
207
234
  /**
@@ -221,15 +248,18 @@ export async function updateDraft(connection, readOnly, fromAddress, messageId,
221
248
  * `standard`. A level carried over onto markup nobody re-stated would be a
222
249
  * permission granted by an earlier call.
223
250
  */
224
- function markupOf(changes, current) {
225
- const level = changes.markupLevel !== undefined ? { markupLevel: changes.markupLevel } : {};
226
- if (changes.html !== undefined)
251
+ function bodyOf(changes, stored) {
252
+ if (changes.html !== undefined) {
253
+ const level = changes.markupLevel !== undefined ? { markupLevel: changes.markupLevel } : {};
227
254
  return { text: htmlToText(changes.html), html: changes.html, ...level };
255
+ }
228
256
  if (changes.text !== undefined)
229
257
  return { text: changes.text };
230
- return current.html !== undefined
231
- ? { text: current.text, html: current.html, ...level }
232
- : { text: current.text };
258
+ // Nothing restated: the stored body stays as it was, quote and all, and is
259
+ // not checked again. See Draft.storedHtml for why it cannot be.
260
+ return stored.html !== undefined
261
+ ? { text: htmlToText(stored.html), storedHtml: stored.html }
262
+ : { text: (stored.text ?? '').trim() };
233
263
  }
234
264
  /**
235
265
  * The body of a reply, with the original quoted below it.
@@ -359,11 +389,14 @@ export async function buildForwardDraft(connection, fromAddress, messageId, to,
359
389
  }
360
390
  const header = [
361
391
  '',
362
- '---------- Forwarded message ----------',
392
+ FORWARD_HEADER,
363
393
  `From: ${original.from.map((f) => (f.name ? `${f.name} <${f.address}>` : f.address)).join(', ')}`,
364
394
  `Date: ${original.date ? original.date.toISOString().slice(0, 16).replace('T', ' ') : 'unknown'}`,
365
395
  `Subject: ${original.subject || '(no subject)'}`,
366
396
  `To: ${original.to.map((t) => t.address).join(', ') || '(none)'}`,
397
+ // Two, so that a blank line parts the head from the original's first line.
398
+ // With one the two ran together, seen on 2026-11-02.
399
+ '',
367
400
  '',
368
401
  ].join('\n');
369
402
  const draft = {
@@ -375,7 +408,7 @@ export async function buildForwardDraft(connection, fromAddress, messageId, to,
375
408
  ...(options.html === undefined
376
409
  ? { text: `${text}\n${header}${original.text}` }
377
410
  : (() => {
378
- const head = `<p>---------- Forwarded message ----------<br>` +
411
+ const head = `<p>${FORWARD_HEADER}<br>` +
379
412
  `From: ${escapeHtml(original.from.map((f) => (f.name ? `${f.name} <${f.address}>` : f.address)).join(', '))}<br>` +
380
413
  `Date: ${escapeHtml(original.date ? original.date.toISOString().slice(0, 16).replace('T', ' ') : 'unknown')}<br>` +
381
414
  `Subject: ${escapeHtml(original.subject || '(no subject)')}<br>` +
@@ -401,8 +434,9 @@ export async function buildForwardDraft(connection, fromAddress, messageId, to,
401
434
  });
402
435
  if (source) {
403
436
  draft.attachedMessage = {
404
- filename: `${(original.subject || 'message').replace(/[^\w. -]/g, '_').slice(0, 60)}.eml`,
437
+ filename: forwardedFileName(original.subject),
405
438
  raw: source,
439
+ carries: original.attachments.map((attachment) => attachment.filename),
406
440
  };
407
441
  }
408
442
  }
@@ -414,7 +448,13 @@ export async function forwardDraft(connection, readOnly, fromAddress, messageId,
414
448
  const draft = await buildForwardDraft(connection, fromAddress, messageId, to, text, options);
415
449
  const stored = await store(connection, draft);
416
450
  return draft.attachedMessage
417
- ? { ...stored, carriedAttachments: [draft.attachedMessage.filename] }
451
+ ? {
452
+ ...stored,
453
+ attachedOriginal: {
454
+ filename: draft.attachedMessage.filename,
455
+ carries: draft.attachedMessage.carries ?? [],
456
+ },
457
+ }
418
458
  : stored;
419
459
  }
420
460
  /** The drafts that are there. Reading only. */
@@ -447,22 +487,33 @@ export async function readDraftForSending(connection, fromAddress, messageId) {
447
487
  throw new BridgeError(`The message ${id} is in "${DRAFTS}" but does not carry the draft flag, so it is not a ` +
448
488
  'draft. Refusing to send it.');
449
489
  }
450
- const stored = await getMessage(connection, id, { hint: DRAFTS });
490
+ const { message: stored, parts } = await readStored(connection, existing.uid);
451
491
  if (stored.to.length === 0 && stored.cc.length === 0 && stored.bcc.length === 0) {
452
492
  throw new BridgeError(`The draft ${id} has no recipient, so there is nobody to send it to. Add one with ` +
453
493
  'update_draft first.');
454
494
  }
495
+ // A stored draft may have been written anywhere, in Proton itself included,
496
+ // so its recipients are held to the same rule as typed ones before the
497
+ // confirmation shows them.
498
+ for (const recipient of [...stored.to, ...stored.cc, ...stored.bcc])
499
+ assertDeliverable(recipient);
455
500
  return {
456
501
  from: parseRecipient(fromAddress),
457
502
  to: stored.to,
458
503
  cc: stored.cc,
459
504
  bcc: stored.bcc,
460
505
  subject: stored.subject,
461
- text: stored.text,
506
+ text: parts.html !== undefined ? htmlToText(parts.html) : (parts.text ?? '').trim(),
462
507
  messageId: id,
463
508
  // A draft written as markup is sent as the markup it was. Converting it to
464
- // text and back would deliver something its author never wrote.
465
- ...(stored.html !== undefined ? { html: stored.html } : {}),
509
+ // text and back would deliver something its author never wrote. It goes
510
+ // out as it was stored, without the check composed markup goes through,
511
+ // which is what Draft.storedHtml explains.
512
+ ...(parts.html !== undefined ? { storedHtml: parts.html } : {}),
513
+ // Its files too, the forwarded original among them. Up to 0.4.11 they were
514
+ // dropped here, and a forward sent from a draft went out without the
515
+ // message it forwarded.
516
+ ...(parts.files.length ? { carriedFiles: parts.files } : {}),
466
517
  };
467
518
  }
468
519
  //# sourceMappingURL=drafts.js.map