File: TODO

package info (click to toggle)
s-nail 14.9.25-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 4,836 kB
  • sloc: ansic: 75,681; sh: 14,364; cpp: 4,287; perl: 562; makefile: 144; php: 5
file content (569 lines) | stat: -rw-r--r-- 27,746 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
TODO reminder.

Rename S-nail to S-mailx in v15.0, change things i have messed with
a single, massively backward incompatible change.

In general the code is in a pretty bad shape due to the signal handling.
I should have sat back in 2012/13 and consider what i am doing.
My fault.  If i would, we would have a blocked signal mask anywhere in
this software except in a few cases where it is necessary and/or
possible to deal with signals, and possibly we would not even have to
consider to switch the entire codebase to (the much superior, and the
only sane approach) SysV signal handling, without SA_RESTART.

But a few things are already pretty good, except for normal iterations
and a review once we have a better signal handling, and can be taken
with us.

- We should have generic ENOMEM conditions, now that we have $!.
  I.e., test overflow (e.g., nam-a-grp.c, whether an alias _can_ be
  created / extended), like n_ENOMEM_CHECK(INTTYPE, SIZE1, SIZE2, NIL
  or message), which returns m_bool (now bool_t).
  Callers need to be aware of NIL returns and pass through errors,
  then.

- We need a "void" box that can be jumped to, i.e., a state in which no box
  at all is active.

-- When a MBOX mailbox is removed while it is opened then changing the
  folder is not possible.  This is an inherent problem of the Berkeley
  Mail codebase, and we need to have a fully functional intermediate
  VOID box mechanism plus an object-based mailbox implementation to
  overcome it.

-- Also, when the folder was modified concurrently we should bail, or,
   in an interactive session, prompt the user what to do.

- IDNA decoding.  Needs a complete design change.
  (Unless wants to brute force decode anything before display, of course.)

- Line editing should gain possibility of context sensitive tab completion.
-- Offer a(n optional, and on/off switchable) Damerau-Levenshtein
   mode for command completion;

- Maybe there should be an additional ZOMBIE directive that is served in
  equal spirit to DEAD, but that could be a valid MBOX... ?
  What i want is a *real* resend, best if possible from command line.
  Meaning, also the possibility to postpone a message.  In general.

- Having a newsreader would be a really cool thing.  (RFC 977 and 2980)

- printhead()/hprf(): support %n newline format (%t tab?).
  Make it possible to use the *datefield* algorithm for plain From_ derived
  dates (needs a From_ parser, i.e., strptime()-alike).
  Once we have that, rename *datefield-markout-older* to
  *date-markout-older* ??
  Note that NetBSD's mail(1) has some other nice things.
  Note also that our code is quite unflexible.

- headerpick: add resend-retain/ignore!  (Ralph Corderoy, Norman Shapiro)
	(Delivered-To thread on nmh.  Will be hard to do because of
	codepaths!)

- -r should be the Sender:, which should automatically propagate to
  From: if possible and/or necessary.  It should be possible to suppress
  -r stuff from From: and Sender:, but fallback to special -r arg as
  appropriate.

Low-Level
---------

- Improve name extraction rules.  And field parsing.  There
  are structured and unstructured fields.  There are quoted pairs and
  comments etc.  Rewrite the entire parsing mechanism to comply to RFC
  5322, and try to merge all those many subparsers around in the codebase,
  and accordingly.  So much duplicated work ...
  Name parsing improved a bit for v13 and v14.9, but it's still broken.
  yankword(), *extract(), etc.: RFC 5322 says that comments in address
  fields SHOULD NOT be used (mutt(1) maps them to full name-addr forms if
  approbiate, even if that actually changes content!!?), and that full
  name-addr SHOULD be used.

- After I/O layer rework we should optionally be able to read RSS
  (Atom?) feeds -- Expat should be available almost everywhere and
  should be able to parse that?
  Atom is harder because it may support html+.
  I mean, yeah, it's stupid, but we could fill in header fields with
  dummies and still use S-nail to look into the separated feeds as if
  they were mail messages; anyway i would like to save me from using too
  many tools -- three seems reasonable.

- `sync'hronize commando -- robin@stjerndorff.org (Robin Stjerndorff):
    Wondering how to update back to my Maildir, moving new read mails
    in ~/Maildir from new to cur, without exiting the application.
    Automation available?  [And simply re-`[Ff]i' involves a lot of
    unnecessary work]

-- Provide sync'ing options -- Jacob Gelbman <gelbman@gmail.com>:
    If I open two instances of mailx, I then delete a message and then
    quit in one. Then in the other one I read a message and quit, mailx
    saves the status of the read message and the fact that a message was
    deleted, even though it was opened before the other instance deleted
    it. How is it doing that?  [Of course he was using Maildir]

- Add TODO notes for those RFCs:
  RFC 977 -> 3977 - Network News Transfer Protocol
  RFC 1036 - Standard for USENET Messages
  RFC 1939 - Post Office Protocol v3
  RFC 2017 - URL External-Body Access-Type
  RFC 2183 - The Content-Disposition Header
  RFC 2369 - The Use of URLs as Meta-Syntax for Core Mail List Commands
             and their Transport through Message Header Fields
             (RFC 6068 - The 'mailto' URL scheme)
  RFC 2384,1738 - I.e., Much better URL support
  RFC 2387 - multipart/related  -- yet handled like /alternative
  RFC 2392 - Content-ID and Message-ID Uniform Resource Locators
  RFC 2405 - The format of MIME message bodies.
  RFC 2406 - Common multimedia types.
  RFC 2407 - Encoding of non-ASCII text in message headers.
  RFC 2449 - POP3 Extensions (including SASL)
  RFC 2595 - TLS for POP3 (among others)
  RFC 2980 - Common NNTP Extensions
  RFC 3156 - MIME Security with OpenPGP
  RFC 3207 - SMTP over TLS
  RFC 3461, 3464 -
    Simple Mail Transfer Protocol (SMTP) Service Extension for Delivery
      Status Notifications (DSNs),
    An Extensible Message Format for Delivery Status Notifications
  RFC 3676 - Updates to the text/plain MIME type and extensions for flowed
    text (format=flowed).   (Martin Neitzel)
  rfc4315.txt Internet Message Access Protocol (IMAP) - UIDPLUS extension
  RFC 4422, 4505 - Simple Authentication and Security layer (SASL)
            (Tarqi Kazan)
  RFC 4551          IMAP Extension for Conditional STORE
  RFC 4880 - OpenPGP Message Format
  RFC 4954 - SMTP Authentication
  rfc4959.txt IMAP Extension for Simple Authentication and Security
    Layer (SASL) Initial Client Response
  rfc4978.txt The IMAP COMPRESS Extension
  rfc5161.txt The IMAP ENABLE Extension
  rfc5198.txt Unicode Format for Network Interchange
  RFC 5246 - Transport Layer Security (TLS)
  RFC 5321 - Simple Mail Transfer Protocol.
  RFC 5322 - The basic format of email messages.
  RFC 5598 - Internet Mail Architecture
  RFC 5751 - Secure/Multipurpose Internet Mail Extensions (S/MIME)
    TODO NOTE that our S/MIME support is extremely weak regarding
    TODO understanding, we should not rely on OpenSSL but instead
    TODO handle it ourselfs; the RFC says:
    S/MIME is used to secure MIME entities.  A MIME entity can be a sub-
       part, sub-parts of a message, or the whole message with all its sub-
       parts.  A MIME entity that is the whole message includes only the
       MIME message headers and MIME body, and does not include the RFC-822
       header.  Note that S/MIME can also be used to secure MIME entities
       used in applications other than Internet mail.  If protection of the
       RFC-822 header is required, the use of the message/rfc822 media type
       is explained later in this section.
  RFC 6125 - Representation and Verification of Domain-Based Application
    Service Identity within Internet Public Key Infrastructure Using
    X.509 (PKIX) Certificates in the Context of Transport Layer Security
    (TLS)
  RFC 6152 - SMTP Service Extension for 8-bit MIME Transport
  RFC 6409 - Message Submission for Mail
  rfc6530.txt Overview and Framework for Internationalized Email
  rfc6531.txt SMTP Extension for Internationalized Email
  rfc6532.txt Internationalized Email Headers
  rfc6854.txt Update to Internet Message Format to Allow Group Syntax in
    the "From:" and "Sender:" Header Fields
  rfc6855.txt IMAP Support for UTF-8
  rfc6856.txt Post Office Protocol Version 3 (POP3) Support for UTF-8
  rfc6857.txt Post-Delivery Message Downgrading for Internationalized
    Email Messages
  rfc6858.txt Simplified POP and IMAP Downgrading for Internationalized Email
  RFC 7162                IMAP CONDSTORE & QRESYNC
  RFC 8058 Signaling One-Click Functionality for List Email Headers
  RFC 8460 on SMTP TLS Reporting
  RFC 8461 on SMTP MTA Strict Transport Security (MTA-STS)
  RFC 8474 IMAP Extension for Object Identifiers
  RFC 8484 on DNS Queries over HTTPS (DoH)
  RFC 8550 Secure/Multipurpose Internet Mail Extensions (S/MIME)
                      Version 4.0 Certificate Handling
  RFC 8551 Secure/Multipurpose Internet Mail Extensions (S/MIME) Version
              4.0 Message Specification
  RFC 8601 Message Header Field for Indicating Message Authentication Status
  RFC 8616 Email Authentication for Internationalized Mail
  RFC 8621 The JSON Meta Application Protocol (JMAP) for Mail
  RFC 8689 SMTP Require TLS Option

  draft-ietf-uta-email-tls-certs-01.txt
     SMTP security via opportunistic DANE TLS draft-ietf-dane-smtp-with-dane-15
  draft-melnikov-smime-header-signing
     Considerations for protecting Email header with S/MIME

  Read https://tools.ietf.org/html/draft-ietf-uta-tls-bcp-07.
    Can we implement OCSP (see RFC 6066; -> RFC 6960)????

- This is how the codebase has to be reworked in respect to signals and
  jumping:

  1. We introduce some environment/carrier structs: struct eval_ctx,
     struct cmd_ctx, (struct send_ctx).  All of these form lists.
     eval_ctx gets a new instance every time evaluate() is entered; for
     the interactive mode, commands() instantiates an outermost eval_ctx
     that "cannot be left".

     cmd_ctx knows about the eval_ctx in which it is was created; it is
     created for each command that has an entry in cmd_tab and is passed
     as the new argument of these kind of functions.
     (send_ctx is the carrier for the MIME and send layer rewrite.)
     They can decide whether an entry shall enter the history list
     etc. by themselves, context-based, for example.

  2. If i say `p 3 2 1' then i mean `3 2 1' not `1 2 3'.
     However, sometimes it is ok to have the order created by iterating
     the way we do now.  This should thus be a cmd-specific flag.

  3. [cmd_tab handling] The argument parser becomes more intelligent: it
     should be able to perform argument checks of subcommands, e.g.,
     should learn about subcommands, and their very own argument types
     / number / etc.

  X. Offer a central "`[un]onevent' EVENT MACRO [conditions]" register.
     Change all hooks to use that one, optimize the case where a single
     macro is registered for a single event but with different
     preconditions.

     E.g., "on_interactive_mode_enter" could then be hooked to call
     `bind' and set `colour's, for example.  In conjunction with 2.
     above those commands could simply be (silent, successful) no-ops
     before we reach that state (and again after
     on_interactive_mode_leave is processed).

  8. The line buffer used in evaluate() that is passed through to
     commands (thus: in cmd_ctx, then) needs to become `const'.
     (I tried to do so in the past, but some commands write into it,
     thus i stopped and iirc even added some changes on my own which
     take favour of reusing that buffer.)
     + Macro execution then no longer needs to clone the macro content
     lines before executing then.

 10. We MUST switch the entire codebase to use SysV signal handling, don't
     do the BSDish SA_RESTART, which is why we still suffer the way we
     do and need jumps.  I can't dig BSD signal handling, and never ever
     did so myself until i got here.

 20. The attachment charset selection loop can then be rewritten to
     check whether an ^C occurred and treat that as end-of-loop
     condition.  In v14.6.3 this was introduced, but it should act
     differently depending on whether the interrupt occurred during
     character set selection or attachment filename input.
     Also in respect whether the interrupt is "propagated" or not.
     It's ugly, and documented accordingly.

 31. Flag updates of individual messages must find their way through to
     the protocol.
 32. Use deque (on partial views).
 34. We need a new abstraction: `vie[ws]'.  I.e, viewset, viewclear,
     view(show|look)?  We will have (possibly readonly) boxes, a summary
     cache file, which is created when a mailbox is read in, and all
     that crap that we currently have (setptr(), setmsize(), etc.!) must
     vanish.  Instead there is another, in-memory abstraction, the view.
     Some views are built-in and are somehow selectable (the "all" view,
     for example, and the "new" view).
     It is possible to make a view persistent by giving it a name, e.g.,
     'viewset NAME MSG-SPEC' -- 'viewset allnew :n' (and 'viewset XY `'
     or something must be capable to tag the last a.k.a current).
     Switching to a named view would thus look over the entire current
     view (!) for all messages that comply to the message-spec of the
     view, then create a sorted/threaded display of that subset and
     create a new anonymous "result" view.  It must be possible to
     specify that a view is to be applied to the entire mailbox instead
     of the current view, via a simple easy understandable syntax.

     Or name it "msgset".
     We won't extend macros that much because it would require much too
     much logic for no purpose, instead we'll (hopefully) add some
     scriptable abstraction, with an optional built-in Lua binding.

 50. Support SASL.  (I do not like it.)

 80. The MIME rewrite: mime_parser <-> mime "DOM" analyzer <->
     selectively create filter chains per part and do XY.

     This also affects sending, and it will allow us to dig MIME
     (multipart) mail for -t/-m _correctly_.  Also in sofar as we can
     hook a content-decoder before diving into the MIME structure, and
     with a DOM, we can re-encode such things properly as we (re)send
     such mails.  All this is wrong at the time of this writing!
     We still need to special treat things like, e.g., RFC 2046, 5.2.1.
     But on top of we-can, as opposed to the opposite.

     (Brezn Stangl, brezn DOT stangl AT yandex DOT com; Martin T)

 99. Now i'm dreaming some more: with the new object-based approach
     multiple mailboxes could be in an open state.  And it should be
     possible to do so for the user (`file' and `folder' are required to
     quit the current mailbox [first -- this not yet]), which is why we
     either need new trigger characters or new commands.
     The absolute sensation would be joinable operations over multiple
     open mailboxes, e.g., views over multiple such!

200. Split program: when entering interactive mode, the main machine
     should fork and the UI should run in the forked one, taking the
     terminal (have done setsid, TIOCSTTY, tcsetpgrp, dance).
     - Communication via sendmsg()/recvmsg(), it was in BSD as soon as
       1982 says CSRG (date and time created 82/12/04 16:22:24 by
       mckusick); ok, a bit different by then, but on 1990-04-04 at
       latest in today's form (Mike Karels: [.]define cmsghdr structure
       for ancillary data, with new format; move access rights into
       ancillary data; add MSG_WAITALL).
     - Maybe furtherly diversify: network (with loop), main machine
       (with loop), credential helper, i do not know.
       Provide security sandboxing if possible, i.e., capsicum,
       pledge/unveil, prctl/seccomp.

- The thread sort doesn't get

    [A is deleted]
    B answers A
      C answers B
      D answers B
    E is unrelated
    F answers A

  The current sort fails to recognize that F and the thread starting at
  B are related, which results in a mess.
  Tests: 41.bad-thread, 58.bad-thread ..

-- Being able to sort the outermost level of threads was a suggestion
   of Rudolf Sykora, especially being able to sort the outermost level
   according to the date of the newest message in a thread.

- NOTE: we do not really support IPv6 sofar in that we are not prepared to
  deal with IPv6 addresses (as in '[ADDR]:PORT').  Pimp url_parse().
  And socket I/O.

- I had a connection collapse during a POP3 download, and neither was
  there a chance to get access to the 22 yet downloaded mails (after
  five minutes of waiting followed by CNTRL-C), nor did the layer
  recognize this very well (got myriads of `POP3 connection already
  closed.' messages, btw., the thirty-something messages which were not
  yet downloaded caused (after CNTRL-C) this: ETC. ETC.

- I got an email in base64 that obviously used CRNL line endings, and once
  i've replied the CR where quoted as *control* characters.
  Get rid of those (kwcrtest.mbox; may be hard to do everywhere for some
  time, due to how we deal with I/O and Send layer etc).

- edit.c doesn't do NEED_BODY (but IMAP won't work anyway).

- Stuff
  . s-nail </dev/null should work interactively when STDERR_FILENO is
    a terminal!  (Built-in editor; how do editline and readline work?
    should this be documented?  POSIX says for sh(1) (APPLICATION USAGE):
    'sh 2>FILE' is not interactive, even though it accepts terminal input.)

  .. We should be much smarter regarding when we allow a PAGER etc. to be
     used, which is supposed to be a possibly useful thing in
      $ s-nail -Scrt=0 >LOG 2>&1

  . Just like the RFC 3676 link above, it would be nice if it would be
    somehow possible to recognize links in a document; i don't know yet
    how this could be achieved without losing formatting information (i
    mean, we could enable this and inject terminal colour sequences, but
    one should be able to say 'follow link x', starting an action
    handler, and the 'x' must come from somwhere - simply injecting
    '[NUMBER]' references distorts visual).  Anyway, it's just a filter
    that recognized the usual <SCHEME:/> stuff, and of course we can
    simply have a buffer which records all such occurrences, so that
    user can say '? xy NUMBER', but without the context it soon gets
    hard.

  . Remove all occurrences of mbtowc() with mbrtowc(); temporarily add (some)
    global mbstate_t objects until the send / MIME layer rewrite is done and
    has the carrier.  Use flip states and add aux funs with only update the
    state+toggle on success -- CURRENTLY MBTOWC FAILURES ARE PRACTICALLY NOT
    HANDLED!!
    P.S.: the standards do not allow that well at all.
    Since we work so much with *ttycharset* we would need
    a setlocale_from_charset(), but which does not exist (except
    implicitly for UTF-8 locales).  But we need char classification!
    This task up to S-CText.

  . which_protocol(), *newmail* mechanism, displayname, mailname: all of
    this <rude>SHIT</rude> must vanish and be replaced by a URL, and
    a nice "VFS" mailbox object that carries all necessary state so that
    one can work with it.

    If not mentioned somewhere else: struct message should be splitted
    into a tree of objects, with a base class that has as few fields as
    possible; the global *message should be a deque, only accessible via
    iterator; it should store pointers to (the actually used subtype of)
    message structures instead; i.e., for maildir boxes the path is yet
    allocated separately, then it could be part of the message object,
    etc.
    It should track the number of contained parts, so that the
    "fits-onto-the-screen" tests are more useful than today.

  . Given how many temporary files we use, it would make sense to
    support a reusable single temporary file, as in singletmp_take() and
    singletmp_release(), where singletmp_release() would close and thus
    drop the file if it excesses a specific (configurable) size, and the
    mainloop tick would close it (after X (configurable) unused ticks))
    otherwise.  I guess this would improve performance for searching
    etc. etc.

  . Searching body/text yet includes headers from attachments and
    attachment data.  This is shit.  :)

  . The "nifty" unregister_file()->_compress() mechanism that even
    shovels '-Sfolder=imaps://user1@localhost -Srecord="+Sent Items"'
    *records* calls clearerr() on the descriptor before performing it's
    action anyway.  when we really make it even to the I/O rewrite, it
    should be possible to dis-/allow such -- it doesn't make sense to
    add something faulty to whatever was not faulty before!

  . `dp' prints EOF at the end of a thread even if unread messages
    follow

  . `resend' doesn't smime-sign.

  . RFC 5751 describes a message multipart layout that also includes the
    headers in the signature; it would be nice (for completeness sake)
    to be able to support that.  Note shutup@ietf.org.

  . The capability to save a message under the name of a recipient is in
    the standard etc., but i've never used it.
    What would be cool, otoh, would be if there would be the possibility
    to register a regular expression, and if just *any* recipient of
    a message matches, store the message in the given folder instead.
    I.e., if i send a message to s-nail-users@ then i most likely want
    to get a copy to the corresponding box, regardless of whoever the
    message was sent To: Cc: or Bcc: else..

  . mutt list handling (`~') is very powerful

  . We have some use of *at() functions, especially anything which
    temporarily switches cwd.

  . *newmail* is terrible.  At some later time we need to do somethings
    with timeouts etc. (for MBOX and Maildir it's not that bad, but for
    anything over the network, yet the mentioned may come in over NFS).
    Remove it until we have something better?

  . The RFC 8098 *disposition-notification-send* mechanism is yet not
    truly conforming (and works with *from*).  Also, this is only the
    sender side, there should be support for creating the MDN response.
    (Maybe ternary option: off (default),
    create-when-unread-flag-goes-away, ditto-but-also-strip-header)

  .. Also, there is DSN as a SMTP extension, see the RFCs 3461, 346 (as
     above) and 6522 (Wikipedia).

  . The var_* series should return "const char*" not "char*".
    This should already work today because otherwise we would get SEGV
    all through the way.
  .. While here: rename enum okeys to enum internal_variables, and the
     ok_*() series to iv_().  And see below for env_*() series.

  . fexpand() the 2nd: it should return structure because we need to
     check for FEDIT_SYSBOX, which currently only checks whether the first
     character of a file name is '%', not whether it is '%', '%:FILEPATH'
     or '%VALIDUSER', because that is impossible to do!

  . On the long run in-memory password storage should be zeroed after
    use, possibly even encoded *during* use.  After v15.

  . We need a `spamcheck' command that is like `spamrate' but updates
    the mail in-place, i.e., with the headers that the spam engine adds.

  . __narrow_suffix() is wrong (for stateful encodings that we
    don't support yet) and should inject a reset sequence if it shortens
    the string.

  . When a user edits a specific header, it should no longer be
    modified.  (Do not loose knowledge that collect() edited it.)

  . The new internal ~/$ expansion mechanism should get support
     for POSIX parameter expansions ${[:]-} and ${[:]+} (and ${[:]?}).
     There is no real way to get the functionality otherwise...

  . Make S/MIME an option separate of SSL/TLS, i.e., optional.

  . With very long input Heirloom mailx(1) / S-nail(1) can produce
    encoded-words (RFC 2047) with incomplete multibyte sequences (i.e.,
    non self-contained encoded-words).

  . Group addresses, especially the undisclosed recipients but also
    "Bla": addresses; are missing.

  . Per-folder (S/MIME) en- and decryption key (Tarqi Kazan): if a xy
    variable is set (that points to a key) add a transparent en- and
    decryption layer on top of any per-message operation (for boxes for
    which the variable is set).

  . For v15.0: remember private thread with Tarqi Kazan (2015-05) and
    try to improve situation with *record*, so that only messages enter
    it which have really been sent.  If we support postponing and have
    a multi-process layout and add an intermediate *record-queue* we
    may be able to improve the situation.

  . [Dd]ecrypt should transport decryption errors, not silently be like
    copy and copy undecrypted content, because this is what it's for?
    ..We need atomic operations with rollback support in order to make
      this happen, but i think maybe file truncation (decryption always
      appends?) is enough provided that files are locked?
      WE NEED ATOMIC OPERATION SUPPORT for quite some operations.
      Man, are we far from that.

  . `pipe' is total shit regarding MIME.  We need some defined and
     documented method to configure which parts are displayed and/or how
     they are visually separated.

  . Exit status handling is sick.

  . *mime-allow-text-controls* is a no-brainer: instead we should
     introduce something that allows us to switch and detect UTF-16 once
     we run into the problematic situation, then start all over in an
     Unicode mode?  I.e.: continue to force the user to set such
     a switch, but do it in a sensible fashion, because the UTF-16 data
     stream may nonetheless contain control characters??
--

. smime_verify(): only dump the multipart that is signed into the file for
  verification purposes.  DOCUMENT that only the FIRST such part is verified.
  Ditto, we don't decrypt but on toplevel.  Sic.

. convert iconv so that it always "places the reset sequence" i.e.
 finalizes the string properly.  we don't do this at all right now!

. -:, *mimetypes-load-control*, ?, should honour the given load order; as
  appropriate, add a "b" for built-in!
  It happened to me that i searched for at least 30 minutes for a bug
  that resulted in text/plain not text/x-diff only to find out that this
  was because of ArchLinux's /etc/mime.types!

. getapproval() should support a TRUM1 return, meaning "cancel",
  to be understood as appropriate.

. `mbox' _can_ be made usable anywhere with yet another PS_MBOX global
  bypass!  ditto touch,save,Save

. when doing Lreply we may ask for Reply-To:, but strip out the address
  actively even if user said yes to the question.  That should not
  happen?  It somehow matches the documentation however.  unsure.

. if -t is used and the file includes Mail-Followup-To:, then we should
  NOT add to it, OR we need to offer a way to get there!

. `mimetype': more type markers: i want to be able to send
  application/mbox as text if it is 7bit clean; ditto application/x-sh.
  Ditto xml etc.  And: if highbits, try conversion, but fall back to
  base64 instead of failing to send the message.
     ?ui=t,wire=7bit,8bit-or-base64
  Something like that.

- negation
  In fact the message selection should be an object with lifetime.
  Like this we can not only provide "type SPEC" in match order, but also
  support for example colour or the header summary with message spec
  preconditions, a la

    colour 256 sum-header ft=reverse @BLABLA :n

  (Keep "older" and "dot" forever, even though that is "." and a colon
  modifier that we yet do not have.)

- redirections

# s-ts-mode