nail.1: last fixes
[s-mailx.git] / TODO
blobf7d0229eb59c43f270cb3fc6cc5dc23f2ae3d49d
1 TODO reminder.
3 Rename S-nail to S-mailx in v15.0, change things i've messed with
4 a single, massively backward incompatible change.
6 Release S-mailx v20 on 2020-03-25, the 42nd anniversary of BSD Mail.
7 With a clean, conforming and efficient codebase, then.
9 In general the code is in a pretty bad shape due to the signal handling.
10 I should have sat back in 2012/13 and consider what i am doing.
11 My fault.  If i would, we would have a blocked signal mask anywhere in
12 this software except in a few cases where it is necessary and/or
13 possible to deal with signals, and possibly we would not even have to
14 consider to switch the entire codebase to (the much superior, and the
15 only sane approach) SysV signal handling, without SA_RESTART.
17 But some things are already pretty good, except for normal iterations
18 and a review once we have a better signal handling, and can be taken
19 with us.  For example termcap.c, most of tty.c, shexp.c, memory.c, for
20 example.
22 - We should have generic ENOMEM conditions, now that we have $!.
23   I.e., test overflow (e.g., nam-a-grp.c, whether an alias _can_ be
24   created / extended), like n_ENOMEM_CHECK(INTTYPE, SIZE1, SIZE2, NULL
25   or message), which returns m_bool (now bool_t).
26   Callers need to be aware of NULL returns and pass through errors,
27   then.
29 - We need a "void" box that can be jumped to, i.e., a state in which no box
30   at all is active.
32 -- When a MBOX mailbox is removed while it is opened then changing the
33   folder is not possible.  This is an inherent problem of the Berkeley
34   Mail codebase, and we need to have a fully functional intermediate
35   VOID box mechanism plus an object-based mailbox implementation to
36   overcome it.
38 -- Also, when the folder was modified concurrently we should bail, or,
39    in an interactive session, prompt the user what to do.
41 - IDNA decoding.  Needs a complete design change.
42   (Unless wants to brute force decode anything before display, of course.)
44 - If pipes fail for part viewers then at least the usual PART X.Y should be
45   shown, maybe even including some error message.
46   I had 'set pipe-text/html="lynx -dump -force_html /dev/stdin"' but NetBSD
47   does not have lynx(1), and i thought i've found a S-nail(1) bug.
49 - It would be nice if it would be possible to define a format string for
50   *quote*, like 'set quote="format=some formats"'.
52 - Line editing should gain possibility of context sensitive tab completion.
54 - Maybe there should be an additional ZOMBIE directive that is served in
55   equal spirit to DEAD, but that could be a valid MBOX... ?
56   What i want is a *real* resend, best if possible from command line.
57   Meaning, also the possibility to postpone a message.  In general.
59 - Having a newsreader would be a really cool thing.  (RFC 977 and 2980)
61 - There should be a variable that controls whether leading and trailing
62   empty lines of parts and/or messages as such should be printed or not.
64 - printhead()/hprf(): support %n newline format (%t tab?).
65   Make it possible to use the *datefield* algorithm for plain From_ derived
66   dates (needs a From_ parser, i.e., strptime()-alike).
67   Once we have that, rename *datefield-markout-older* to
68   *date-markout-older* ??
69   Note that NetBSD's mail(1) has some other nice things.
70   Note also that our code is quite unflexible.
72 -- NetBSD's mail(1) has nice *indentprefix* and *indentpostscript*
73    variables (though prefix and appendix or prefix and suffix, but..).
74    Note that our code is quite unflexible.
76 - headerpick: add resend-retain/ignore!  (Ralph Corderoy, Norman Shapiro)
77         (Delivered-To thread on nmh.  Will be hard to do because of
78         codepaths!)
80 Low-Level
81 ---------
83 - Improve name extraction rules.  And field parsing.  There
84   are structured and unstructured fields.  There are quoted pairs and
85   comments etc.  Rewrite the entire parsing mechanism to comply to RFC
86   5322, and try to merge all those many subparsers around in the codebase,
87   and accordingly.  So much duplicated work ...
88   Name parsing has been improved a bit for v13, but it's still broken.
89   yankword(), *extract(), etc.: RFC 5322 says that comments in address
90   fields SHOULD NOT be used (mutt(1) maps them to full name-addr forms if
91   approbiate, even if that actually changes content!!?), and that full
92   name-addr SHOULD be used.  Our functions are yet quite silly (i.e.,
93   leading comments remain, as in "(bier2) <a2@b2.de>", unless the address
94   doesn't come in angle brackets, trailing go away, as in "<a6@b6.de>
95   (bier6)", that becomes "<a6@b6.de>").
96   Something silly like
97     (co$mm1) abc@däf.de (cö,mm,2)   ('c'o"m"m.3)
98   Should eventually become
99     co$mm1 cö,mm,2 'c'o"m"m.3 <abc@xn--df-via.de>
100   on the display, or, with IDNA decoding (and thus rather unlikely)
101     co$mm1 cö,mm,2 'c'o"m"m.3 <abc@däf.de>
102   It should NOT become this mutt(1)ism:
103     "co$mm1 cö,mm,2 'c'omm.3" <abc@däf.de>
104   Or?
106 - many uses of whitechar() should be spacechar(), and spacechar() should
107   be blankspacechar(), and blankspacechar() should be dropped.  then
108   drop onlywhitechar() again, too.  maybe reduce char_class bits then.
110 - In v15.0, when we can address attachments of a message individually,
111   it would be nice to provide even more access, just like nmh(1) does
112   (Johan Commelin: Are s-nail and mh related?).
114 - I never used anything but the *datefield* option, and it would really be
115   nice if the date strings would be parsed off into some 16 byte or what
116   storage when about to producing the summary, so that it would be directly
117   available and there would be no need to reread the mail.  Moreover, or
118   even more than that - the m_date field exists and should possibly simply
119   be init, at least in these cases.  (P.S.: this doesn't contradict the
120   statement somewhere else in this file that the structure should be
121   slacked; simply use multiple thereof or so)
123 - After I/O layer rework we should optionally be able to read RSS
124   (Atom?) feeds -- Expat should be available almost everywhere and
125   should be able to parse that?
126   Atom is harder because it may support html+.
127   I mean, yeah, it's stupid, but we could fill in header fields with
128   dummies and still use S-nail to look into the separated feeds as if
129   they were mail messages; anyway i would like to save me from using too
130   many tools -- three seems reasonable.
132 -- `sync'hronize commando -- robin@stjerndorff.org (Robin Stjerndorff):
133     Wondering how to update back to my Maildir, moving new read mails
134     in ~/Maildir from new to cur, without exiting the application.
135     Automation available?  [And simply re-`[Ff]i' involves a lot of
136     unnecessary work]
138 -- Provide sync'ing options -- Jacob Gelbman <gelbman@gmail.com>:
139     If I open two instances of mailx, I then delete a message and then
140     quit in one. Then in the other one I read a message and quit, mailx
141     saves the status of the read message and the fact that a message was
142     deleted, even though it was opened before the other instance deleted
143     it. How is it doing that?  [Of course he was using Maildir]
145 - Add TODO notes for those RFCs:
146   RFC 977 -> 3977 - Network News Transfer Protocol
147   RFC 1036 - Standard for USENET Messages
148   RFC 1524 - True support for mailcap files?
149     TODO YES!  We really need to replace the pipe-TYPE/SUBTYPE mechanism
150     with something real.  When we can work on the parsed MAIL DOM.
151   RFC 1939 - Post Office Protocol v3
152   RFC 2017 - URL External-Body Access-Type
153   RFC 2183 - The Content-Disposition Header
154   RFC 2369 - The Use of URLs as Meta-Syntax for Core Mail List Commands
155              and their Transport through Message Header Fields
156              (RFC 6068 - The 'mailto' URL scheme)
157   RFC 2384,1738 - I.e., Much better URL support
158   RFC 2387 - multipart/related  -- yet handled like /alternative
159   RFC 2392 - Content-ID and Message-ID Uniform Resource Locators
160   RFC 2405 - The format of MIME message bodies.
161   RFC 2406 - Common multimedia types.
162   RFC 2407 - Encoding of non-ASCII text in message headers.
163   RFC 2449 - POP3 Extensions (including SASL)
164   RFC 2595 - TLS for POP3 (among others)
165   RFC 2980 - Common NNTP Extensions
166   RFC 3156 - MIME Security with OpenPGP
167   RFC 3207 - SMTP over TLS
168   RFC 3461, 3464 -
169     Simple Mail Transfer Protocol (SMTP) Service Extension for Delivery
170       Status Notifications (DSNs),
171     An Extensible Message Format for Delivery Status Notifications
172   RFC 3676 - Updates to the text/plain MIME type and extensions for flowed
173     text (format=flowed).   (Martin Neitzel)
174   RFC 4422, 4505 - Simple Authentication and Security layer (SASL)
175             (Tarqi Kazan)
176   RFC 4880 - OpenPGP Message Format
177   RFC 4954 - SMTP Authentication
178   rfc5198.txt Unicode Format for Network Interchange
179   RFC 5246 - Transport Layer Security (TLS)
180   RFC 5321 - Simple Mail Transfer Protocol.
181   RFC 5322 - The basic format of email messages.
182   RFC 5598 - Internet Mail Architecture
183   RFC 5751 - Secure/Multipurpose Internet Mail Extensions (S/MIME)
184     TODO NOTE that our S/MIME support is extremely weak regarding
185     TODO understanding, we should not rely on OpenSSL but instead
186     TODO handle it ourselfs; the RFC says:
187     S/MIME is used to secure MIME entities.  A MIME entity can be a sub-
188        part, sub-parts of a message, or the whole message with all its sub-
189        parts.  A MIME entity that is the whole message includes only the
190        MIME message headers and MIME body, and does not include the RFC-822
191        header.  Note that S/MIME can also be used to secure MIME entities
192        used in applications other than Internet mail.  If protection of the
193        RFC-822 header is required, the use of the message/rfc822 media type
194        is explained later in this section.
195   RFC 6125 - Representation and Verification of Domain-Based Application
196     Service Identity within Internet Public Key Infrastructure Using
197     X.509 (PKIX) Certificates in the Context of Transport Layer Security
198     (TLS)
199   RFC 6152 - SMTP Service Extension for 8-bit MIME Transport
200   RFC 6409 - Message Submission for Mail
201   rfc6530.txt Overview and Framework for Internationalized Email
202   rfc6531.txt SMTP Extension for Internationalized Email
203   rfc6532.txt Internationalized Email Headers
204   rfc6854.txt Update to Internet Message Format to Allow Group Syntax in
205     the "From:" and "Sender:" Header Fields
206   rfc6855.txt IMAP Support for UTF-8
207   rfc6856.txt Post Office Protocol Version 3 (POP3) Support for UTF-8
208   rfc6857.txt Post-Delivery Message Downgrading for Internationalized
209     Email Messages
210   rfc6858.txt Simplified POP and IMAP Downgrading for Internationalized Email
211   RFC 8058 Signaling One-Click Functionality for List Email Headers
213   draft-ietf-uta-email-tls-certs-01.txt
214    SMTP security via opportunistic DANE TLS draft-ietf-dane-smtp-with-dane-15
215   draft-melnikov-smime-header-signing
216    Considerations for protecting Email header with S/MIME
217   Read https://tools.ietf.org/html/draft-ietf-uta-tls-bcp-07.
218     Can we implement OCSP (see RFC 6066; -> RFC 6960)????
220 - This is how the codebase has to be reworked in respect to signals and
221   jumping:
223   1. We introduce some environment/carrier structs: struct eval_ctx,
224      struct cmd_ctx, (struct send_ctx).  All of these form lists.
225      eval_ctx gets a new instance every time evaluate() is entered; for
226      the interactive mode, commands() instantiates an outermost eval_ctx
227      that "cannot be left".
229      cmd_ctx knows about the eval_ctx in which it is was created; it is
230      created for each command that has an entry in cmd_tab and is passed
231      as the new argument of these kind of functions.
232      (send_ctx is the carrier for the MIME and send layer rewrite.)
233   2. cmd_tab handling becomes more intelligent: add bit fields so that
234      for some arguments (i.e., the first two or three) automatic
235      normalization can be specified, like whitespace trimming, like
236      automatic expansion of variables etc.  For getrawlist.
238       - and: commands that work only in interactive mode, and are
239         _silently_ ignored otherwise (no error).
240         I.e., commands which work on only with true user interaction
241         should not need to take care no more, but simply assume that
242         there will be true user interaction.  And like that.
244      E.g., customhdr header field is always to be WS trimmed, just the
245      same as the body.  shortcut at least should have trimmed name, etc.
246      To do that right, properly parse from left to right, take care
247      about backslash escaping, and (optionally) expand shell variables
248      and backtick substituations.
250      The cmd_ctx needs to carry around the cmd_tab structure so that the
251      commands can themselves print the synopsis in case of errors --
252      alternatively we need a return bit which should cause the command
253      callee to emit the synopsis as an error message, whatever is best.
254      Some (hopefully) duplicate occurrances of such strings can vanish.
255   2.1 We have some commands which offer "show" subcommands.
256       Those should only work in interactive mode OR SO.
257       This could be done with a flag, too.
258   X. Offer a central "`[un]onevent' EVENT MACRO [conditions]" register.
259      Change all hooks to use that one, optimize the case where a single
260      macro is registered for a single event but with different
261      preconditions.
263      E.g., "on_interactive_mode_enter" could then be hooked to call
264      `bind' and set `colour's, for example.  In conjunction with 2.
265      above those commands could simply be (silent, successful) no-ops
266      before we reach that state (and again after
267      on_interactive_mode_leave is processed).
269   X.x We should make the message accessible at least a bit on macro level.
270       I.e., so that message specification checks can be applied on the
271       macro level, as in
272         if `message match-spec '@~t@bank.com'`
273           set smime-sign customhdr='X-BlahBlahBlah:Banks are monsters'
274         endif
275       where `message' (or so) would refer to the currently active
276       message (in compose mode) or the "dot" (otherwise).
277       `message' would gain some keywords.  Something like that.
278   8. The line buffer used in evaluate() that is passed through to
279      commands (thus: in cmd_ctx, then) needs to become `const'.
280      (I tried to do so in the past, but some commands write into it,
281      thus i stopped and iirc even added some changes on my own which
282      take favour of reusing that buffer.)
283      + Macro execution then no longer needs to clone the macro content
284      lines before executing then.
285      + The command context also takes preparsed command array if so
286      specified in cmd_tab, and entries are cleaned up (see 2.)
287   9. We should unite all the un*() commands with their non-un*
288      versions, if they have one.  They may take a different argument
289      list etc., but only one entry in the command table for such.
290      - The POSIX standard command abbreviations must remain, so maybe
291        outsource those in a hashtable or whatever that is checked first,
292        but detach command table order from that anyway.
293      - Offer a(n optional, and on/off switchable) Damerau-Levenshtein
294        mode for command completion;
295  10. We MUST switch the entire codebase to use SysV signal handling, don't
296      do the BSDish SA_RESTART, which is why we still suffer the way we
297      do and need jumps.  I can't dig BSD signal handling, and never ever
298      did so myself until i got here.
299  11. Macro execution is potentially recursive.  Meaning that
300      `undefine', etc. can occur while macros are executing.
301      The simplemost approach would be to have some recursion counter for
302      each macro and a delete_later flag that gets honoured when the
303      recursion counter gets zero.  It would be already possible to
304      immediately remove the macro from the hashtable, so that deeper
305      levels wouldn't find it anymore.  To avoid leaks (which *are*) we
306      need to have a jump location for our upcoming signal handler
307      anyway.  (Also to get rid of the temporary_localopts_free() hack.
308      + The same is true for `account's.  Here things are complicated by
309      the global `account_name', i.e., the account could be the current
310      one.
311      + That also is: redefinition of names that have yet-pending
312      deletion requests are possible.
313  12. It is annoying that you cannot `source' your MAILRC multiple times.
314      Defining a macro/account/xy should overwrite the current thing,
315      just as it does anyway for normal variables!
316      This is no different than 11. plus additional re-addition.
317      (Same exception: what if the currently active account is
318      overwritten?  Same answer, plus a message "new settings take effect
319      when account is switched to the next time".)
320  20. The attachment charset selection loop can then be rewritten to
321      check whether an ^C occurred and treat that as end-of-loop
322      condition.  In v14.6.3 this was introduced, but it should act
323      differently depending on whether the interrupt occurred during
324      character set selection or attachment filename input.
325      Also in respect whether the interrupt is "propagated" or not.
326      It's ugly, and documented accordingly.
327  30. Mail protocols and mail messages are accessed through a "VFS".
328      URL should then support file:// and maildir:// etc.  Update manual!
330      . It should be considered to drop many variables in favour of
331        ?SEARCH usage for keys, or key=value pairs, e.g.
332         smtp://exam.ple?starttls=yes;smtp-hostname=;
333        etc.   USER@HOST is neat, but that is possibly preferable?
334        We could then also extend *mta* and drop *smtp* as such, e.g.,
335        mta=smtp://dSDAS, mta=builtin://XZ, mta=bltin://XZ.
336        Question: what is with smtp-hostname and such??
337  31. Flag updates of individual messages must find their way through to
338      the protocol.
339  32. Use deque (on partial views).
340  34. We need a new abstraction: `vie[ws]'.  I.e, viewset, viewclear,
341      view(show|look)?  We will have (possibly readonly) boxes, a summary
342      cache file, which is created when a mailbox is read in, and all
343      that crap that we currently have (setptr(), setmsize(), etc.!) must
344      vanish.  Instead there is another, in-memory abstraction, the view.
345      Some views are built-in and are somehow selectable (the "all" view,
346      for example, and the "new" view).
347      It is possible to make a view persistent by giving it a name, e.g.,
348      'viewset NAME MSG-SPEC' -- 'viewset allnew :n' (and 'viewset XY `'
349      or something must be capable to tag the last a.k.a current).
350      Switching to a named view would thus look over the entire current
351      view (!) for all messages that comply to the message-spec of the
352      view, then create a sorted/threaded display of that subset and
353      create a new anonymous "result" view.  It must be possible to
354      specify that a view is to be applied to the entire mailbox instead
355      of the current view, via a simple easy understandable syntax.
357      Or name it "msgset".
358      We won't extend macros that much because it would require much too
359      much logic for no purpose, instead we'll (hopefully) add some
360      scriptable abstraction, with an optional built-in Lua binding.
361      E.g., it would be too complicated to create a language to access
362      individual message parts (headers etc.), add error handling etc.
363      Better to make it all directly accessible via language binding, and
364      offer commands which relinquish execution to such a binding, maybe
365      even with some arguments, as in "? lua ARG" - it should be possible
366      that ARG is a msgset, then.
367      On the other hand, ~^ text-protocol stuff isn't that bad, and if
368      a text-protocol command mode could be added, that would be cool.
369      Even things like 'create temporary file', write data until EOT in
370      descriptor / temporary file / etc. and such!
372      But what macros should be able to do is iterating over such
373      a msgset / view, as in
374         msgset create NAME :SPEC:
375         msgset add NAME :SPEC:
376       and then either
377         for[-each] NAME
378           normal-cmd SOMEHOW-REFER-TO-ITER
379           if SOMEHOW-ACCESS-LAST-STATUS
380           endif
381         endfor
382       as well as
383         msgset cmd NAME normal-cmd
384       and even
385         normal-cmd NAME
386       in which case NAME should simply be treated as a SPEC, likely that
387       this requires a new trigger, though, e.g. {NAME}, [NAME] or !NAME...
388       I.e., the new namelist (likely a deque) should contain MsgRef
389       objects which point to a Message and a Mailbox (for cross-mailbox
390       msgset's and without the need for a Message to store a pointer to
391       the owning mailbox?  Or make MsgRef a superclass that may have
392       a subclass which offers such cross-refs).
394  50. Support SASL, unite all GSS-API etc. under an abstraction!
395      Maybe even drop direct GSS-API and support only through SASL.
396      That is, we can very well provide our own little SASL-client
397      abstraction with what we have already by simply defining some
398      "readline" abstraction plus struct ccred for use by the
399      authentication layer: the protocols must set it up by passing in
400      a line of authentication mechanisms and a callback mechanism.
401      Possibly the user should be able to permit or forbid automatic
402      selection of GSS-API (to avoid useless round-trips) etc. etc.
403  80. The MIME rewrite: mime_parser <-> mime "DOM" analyzer <->
404      selectively create filter chains per part and do XY.
406      This also affects sending, and it will allow us to dig MIME
407      (multipart) mail for -t/-m _correctly_.  Also in sofar as we can
408      hook a content-decoder before diving into the MIME structure, and
409      with a DOM, we can re-encode such things properly as we (re)send
410      such mails.  All this is wrong at the time of this writing!
411      We still need to special treat things like, e.g., RFC 2046, 5.2.1.
412      But on top of we-can, as opposed to the opposite.
413  99. Now i'm dreaming some more: with the new object-based approach
414      multiple mailboxes could be in an open state.  And it should be
415      possible to do so for the user (`file' and `folder' are required to
416      quit the current mailbox [first -- this not yet]), which is why we
417      either need new trigger characters or new commands.
418      The absolute sensation would be joinable operations over multiple
419      open mailboxes, e.g., views over multiple such!
420 100. If i say `p 3 2 1' then i mean `3 2 1' not `1 2 3'.
422 - The thread sort doesn't get
424     [A is deleted]
425     B answers A
426       C answers B
427       D answers B
428     E is unrelated
429     F answers A
431   The current sort fails to recognize that F and the thread starting at
432   B are related, which results in a mess.
434 -- Being able to sort the outermost level of threads was a suggestion
435    of Rudolf Sykora, especially being able to sort the outermost level
436    according to the date of the newest message in a thread.
438 - Drop **use-starttls* in favour of something better: support 'auto',
439   'no' and 'yes' and act accordingly.  For the former be smart enough on
440   the protocol side.  (RFC 3207 describes man-in-the-middle attacks due
441   to 'auto' TLS, so explicit 'yes' should be favoured).
443 - NOTE: we do not really support IPv6 sofar in that we are not prepared to
444   deal with IPv6 addresses (as in '[ADDR]:PORT').  Pimp url_parse().
445   And socket I/O.
447 - I had a connection collapse during a POP3 download, and neither was
448   there a chance to get access to the 22 yet downloaded mails (after
449   five minutes of waiting followed by CNTRL-C), nor did the layer
450   recognize this very well (got myriads of `POP3 connection already
451   closed.' messages, btw., the thirty-something messages which were not
452   yet downloaded caused (after CNTRL-C) this: ETC. ETC.
454 - I got an email in base64 that obviously used CRNL line endings, and once
455   i've replied the CR where quoted as *control* characters.
456   Get rid of those (kwcrtest.mbox; may be hard to do everywhere for some
457   time, due to how we deal with I/O and Send layer etc).
459 - edit.c doesn't do NEED_BODY (but IMAP won't work anyway).
461 - Stuff
462   .. s-nail </dev/null should work interactively when STDERR_FILENO is
463     a terminal!  (Built-in editor; how do editline and readline work?
464     should this be documented?  What does NetBSD Mail do?  Should we NOT
465     be interactive??  POSIX says for sh(1) (APPLICATION USAGE): 'sh
466     2>FILE' is not interactive, even though it accepts terminal input.)
467   . It would be cool if ghosts, shortcuts, alternates could
468     (optionally?) be tracked via localopts.  And macros.  And inner macros.
469     (Additional entry on xy-local xy somewhere above)
470     And / or local to a macro/account if defined in one.
471     Should be per-carrier copy-on-write environments.
472     Just like TeX with def / gdef ...
473   . Just like the RFC 3676 link above, it would be nice if it would be
474     somehow possible to recognize links in a document; i don't know yet
475     how this could be achieved without loosing formatting information (i
476     mean, we could enable this and inject terminal colour sequences, but
477     one should be able to say 'follow link x', starting an action
478     handler, and the 'x' must come from somwhere - simply injecting
479     '[NUMBER]' references distorts visual).  Anyway, it's just a filter
480     that recognized the usual <SCHEME:/> stuff, and of course we can
481     simply have a buffer which records all such occurrences, so that
482     user can say '? xy NUMBER', but without the context it soon gets
483     hard.
484   . TTY layer: the tc*() family may fail with EINTR, which MUST be
485     handled; setting also generates SIGTTOU when we're not in foreground
486     pgrp, so we better deal with all that and ENSURE WE GET THROUGH when
487     resetting terminal attributes!
488   .. TTY "I guess it would be much better to create our own session via
489      setpgid(2) and then tcsetpgrp(3) any processes we run synchronously,
490      and properly deal with SIGTTOU, but it always has been like that and
491      i won't do that before other things have been changed.
492   .. NOTE: TTY: place (at least n_child_run()) childs which go over
493      terminal into own group.
494      Introduce global "terminal state" manager which tracks who
495      currently owns the terminal, so that we can gracefully switch it
496      on/off, check in main loop whether restore is necessary.
497      It that can deal with multiple "windows" then we could have open
498      multiple of those, i.e., multiple PAGER instances, and non-PAGER
499      instances (fflush() if there is FILE before switch off).
501      TTY thus: "needsterminal" could be driven gracefully EVEN IF
502      a PAGER is open because the current user action is "print*", since
503      we KNOW that there is a PAGER and can temporarily lay it down to
504      sleep, fflush()ing/adjusting as necessary, and wake it up again
505      afterwards (or, with some work, gracefully shut it down if ^C ^C).
506      This is of course also true for user questions ("really display
507      part XY?", "need decryption password:", etc.!!!)!!
508   . Remove all occurrences of mbtowc() with mbrtowc(); temporarily add (some)
509     global mbstate_t objects until the send / MIME layer rewrite is done and
510     has the carrier.  Use flip states and add aux funs with only update the
511     state+toggle on success -- CURRENTLY MBTOWC FAILURES ARE PRACTICALLY NOT
512     HANDLED!!
513   . pop3,mime_cte +++: \r,\n -> \015,\012, to avoid ANY problems..
514     Maybe our passed carrier should pass desired output newline (as
515     opposed to data-embedded newlines)
516   . which_protocol(), *newmail* mechanism, displayname, mailname: all of
517     this <rude>SHIT</rude> must vanish and be replaced by a URL, and
518     a nice "VFS" mailbox object that carries all necessary state so that
519     one can work with it.
521     If not mentioned somewhere else: struct message should be splitted
522     into a tree of objects, with a base class that has as few fields as
523     possible; the global *message should be a deque, only accessible via
524     iterator; it should store pointers to (the actually used subtype of)
525     message structures instead; i.e., for maildir boxes the path is yet
526     allocated separately, then it could be part of the message object,
527     etc.
528     It should contain a ui8_t that tracks the number of contained parts,
529     so that the "fits-onto-the-screen" tests are more useful than today;
530     i think 8-bit is sufficient, with 0xFF meaning more-than-fits-here.
531   . Given how many temporary files we use, it would make sense to
532     support a reusable single temporary file, as in singletmp_take() and
533     singletmp_release(), where singletmp_release() would close and thus
534     drop the file if it excesses a specific (configurable) size, and the
535     mainloop tick would close it (after X (configurable) unused ticks))
536     otherwise.  I guess this would improve performance for searching
537     etc. etc.
538   . _(), N_(), V_():
539     use GNU tools for extraction etc., and write a simple helper program
540     which converts these files to a serialized hashmap, just like we did
541     for the okeys (and *exactly* so); add a config check whether the ({})
542     extension is supported and finally use that for some ({static char
543     const *tr_res;}) injection optimization, then.  (Think SFSYS)
544   . Searching body/text yet includes headers from attachments and
545     attachment data.  This is shit.  :)
546   . The "nifty" unregister_file()->_compress() mechanism that even
547     shovels '-Sfolder=imaps://user1@localhost -Srecord="+Sent Items"'
548     *records* calls clearerr() on the descriptor before performing it's
549     action anyway.  when we really make it even to the I/O rewrite, it
550     should be possible to dis-/allow such -- it doesn't make sense to
551     add something faulty to whatever was not faulty before!
552   . `dp' prints EOF at the end of a thread even if unread messages
553     follow
554   . `resend' doesn't smime-sign.
555   . Really do extend the test already today; test S/MIME
556     signing/encryption/decryption with two pairs of identities, instead
557     of of one.
558   . RFC 5751 describes a message multipart layout that also includes the
559     headers in the signature; it would be nice (for completeness sake)
560     to be able to support that.  Note shutup@ietf.org.
561   . The capability to save a message under the name of a recipient is in
562     the standard etc., but i've never used it.
563     What would be cool, otoh, would be if there would be the possibility
564     to register a regular expression, and if just *any* recipient of
565     a message matches, store the message in the given folder instead.
566     I.e., if i send a message to s-nail-users@ then i most likely want
567     to get a copy to the corresponding box, regardless of whoever the
568     message was sent To: Cc: or Bcc: else..
569   . why not simply sucking in complete MIME messages via -t?  In a way
570     that parses it as a MIME message, that is!
571     (Brezn Stangl, brezn DOT stangl AT yandex DOT com)
572   . mutt list handling (`~') is very powerful
573   . We have some use of *at() functions, especially anything which
574     temporarily switches cwd.
575   . *newmail* is terrible.  At some later time we need to do somethings
576     with timeouts etc. (for MBOX and Maildir it's not that bad, but for
577     anything over the network, yet the mentioned may come in over NFS).
578     Remove it until we have something better?
579   . The RFC 3798 *disposition-notification-send* mechanism is yet not
580     truly conforming (and works with *from*).  Also, this is only the
581     sender side, there should be support for creating the MDN response.
582     (Maybe ternary option: off (default),
583     create-when-unread-flag-goes-away, ditto-but-also-strip-header)
584   .. Also, there is DSN as a SMTP extension, see the RFCs 3461, 346 (as
585      above) and 6522 (Wikipedia).
586   . The var_* series should return "const char*" not "char*".
587     This should already work today because otherwise we would get SEGV
588     all through the way.
589   .. While here: rename enum okeys to enum internal_variables, and the
590      ok_*() series to iv_().  And see below for env_*() series.
591   . fexpand() the 2nd: it should return structure because we need to
592      check for FEDIT_SYSBOX, which currently only checks whether the first
593      character of a file name is '%', not whether it is '%', '%:FILEPATH'
594      or '%VALIDUSER', because that is impossible to do!
595   . On the long run in-memory password storage should be zeroed after
596     use, possibly even encoded *during* use.  After v15.
597   . We need a `spamcheck' command that is like `spamrate' but updates
598     the mail in-place, i.e., with the headers that the spam engine adds.
599   . __narrow_suffix() is wrong (for stateful encodings that we
600     don't support yet) and should inject a reset sequence if it shortens
601     the string.
602   .. THAT IS TO SAY: the entire codebase doesn't really support stateful
603     encodings, including the bidi_ things that i've done (but the MLE
604     does iirc?  what is this??).  We should have a global string that
605     has the multibyte reset sequence plus length available for easy
606     access.
607   . When a user edits a specific header, it should no longer be
608     modified.  (Do not loose knowledge that collect() edited it.)
609   . Regular expression list resorting is no good; the user should be
610     able to specify a match order weight, as in:
611       mlist 10 a@b.org 8 c@d.org .*@else@org 0 almost@never.com
612     So: optional digit 0-10, where 0-4 are never relinked and always
613     placed at the tail, 6-10 are never relinked and always placed at
614     head (all in decreasing order, head to tail), and 5 is the implicit
615     value, placed in between and automatically resorted just as is the
616     sole algorithm we currently have.
617   .. And maybe we should have an event mechanism with one-shot etc..
618      Then install a resorter function when we actually have lookups and
619      one-shot sort the entire thing once (when the loop ticks).
620      Instead of busy resorting, that is.
621   . We need more hooks: on-leave, on-connect.. whatever
622   . The new internal ~/$ expansion mechanism should possibly get support
623      for POSIX parameter expansions ${[:]-} and ${[:]+} (and ${[:]?}).
624      There is no real way to get the functionality otherwise...
625   . Make S/MIME an option separate of SSL/TLS, i.e., optional.
626   . With very long input Heirloom mailx(1) / S-nail(1) can produce
627     encoded-words (RFC 2047) with incomplete multibyte sequences (i.e.,
628     non self-contained encoded-words).
629   . Group addresses, especially the undisclosed recipients but also
630     "Bla": addresses; are missing.
631   . It is terrible that -S sets variables twice, at once and after the
632     resource files have been loaded.  Instead we should set a bit
633   . Cleanup:  n_ is anything public / external,
634     _n_ is public/e but not really, FILENAME/ABBREV_symbol are statics,
635     FILENAME/ABBREV__symbol are helpers of a single other static
636     (function group) (-> colour.c, lex_input.c: done).
637   . Per-folder (S/MIME) en- and decryption key (Tarqi Kazan): if a xy
638     variable is set (that points to a key) add a transparent en- and
639     decryption layer on top of any per-message operation (for boxes for
640     which the variable is set).
641   . For v15.0: remember private thread with Tarqi Kazan (2015-05) and
642     try to improve situation with *record*, so that only messages enter
643     it which have really been sent.  If we support postponing and have
644     a multi-process layout and add an intermediate *record-queue* we
645     may be able to improve the situation.
646   . [Dd]ecrypt should transport decryption errors, not silently be like
647     copy and copy undecrypted content, because this is what it's for?
648     ..We need atomic operations with rollback support in order to make
649       this happen, but i think maybe file truncation (decryption always
650       appends?) is enough provided that files are locked?
651       WE NEED ATOMIC OPERATION SUPPORT for quite some operations.
652       Man, are we far from that.
653   . `pipe' is total shit regarding MIME.  We need some defined and
654      documented method to configure which parts are displayed and/or how
655      they are visually separated.
656   . The new n_err() facility is nice, but we need n_msg() too, maybe
657     more.  Maybe à la Log:: and macro wrappers with priority unrolled,
658     then add user-settable treshold, too.  Btw. C99 adds vararg macros.
659     .. We must handle embedded newlines properly
660     .. In PARTICULAR we MUST NOT use stdout when in batch mode:
661          ssh X "echo 'move * |cat' | s-nail -#f %" >> download
662        should do the right thing, but can't like that due to unwanted
663        noise in the stdout output!  Best would be if it would be
664        possible to explicitly define a file/dev to be used, but falling
665        back to stderr in batch mode otherwise. (think S-Web42)
666   . Exit status handling is sick.
667   . Especially in interactive mode MIME classification should count
668     (non-NUL) control characters and the number of different thereof,
669     giving users an option to treat something as text nonetheless.
670     E.g., roff files often use controls as separators in conditionals,
671     some shell scripts use controls for $IFS field separation, and that
672     will end up with charset=binary.
673   .. *mime-allow-text-controls* is a no-brainer: instead we should
674      introduce something that allows us to switch and detect UTF-16 once
675      we run into the problematic situation, then start all over in an
676      Unicode mode?  I.e.: continue to force the user to set such
677      a switch, but do it in a sensible fashion, because the UTF-16 data
678      stream may nonetheless contain control characters??
681   . We can "steal" features from msmtp(1) that make sense: SOCKS support
682     (primitive) and /etc/aliases ($mta_alias_file).  At least postfix(1)
683     supports file and pipe addressees in the latter...  It also
684     supports include files via :include:/filename but which i think
685     should be supported in a second step.  Ditto caching (timestamp
686     check and a mechanism to support/disable caching.)
690 . smime_verify(): only dump the multipart that is signed into the file for
691   verification purposes.  DOCUMENT that only the FIRST such part is verified.
692   Ditto, we don't decrypt but on toplevel.  Sic.
694 . convert iconv so that it always "places the reset sequence" i.e.
695  finalizes the string properly.  we don't do this at all right now!
697 . wysh: support a -- terminator, also in getmsglist();
698         then: `pipe' etc.: add support for wysh prefix, which uses the new
699         syntax: like this we can obsolete the ridiculous lastring() hack of nail
700         in v15!  (Stanley Lieber, Gavin Troy)
702 . -:, *mimetypes-load-control*, ?, should honour the given load order; as
703   appropriate, add a "b" for built-in!
704   It happened to me that i searched for at least 30 minutes for a bug
705   that resulted in text/plain not text/x-diff only to find out that this
706   was because of ArchLinux's /etc/mime.types!
708 . getapproval() should support a TRUM1 return, meaning "cancel",
709   to be understood as appropriate.
711 . `mbox' _can_ be made usable anywhere with yet another PS_MBOX global
712   bypass!  ditto touch,save,Save
714 . with *mime-alternative-favour-rich* it is possibly time to support GMAIL
715   style quotes, as well as class="quote" and such.
717 . can we introduce a BUILD_DIR thing?  or OBJ_DIR OBJDIR (what was the BSD
718   name for this again?)  I really would like to be able to have separate
719   build directories!  (PREFIXDEV, however, won't work out for a while.)
721 . We should be much smarter regarding when we allow a PAGER
722   etc. to be used, which is supposed to be a possibly useful thing in
723      $ s-nail -Scrt=0 >LOG 2>&1
725 . when doing Lreply we may ask for Reply-To:, but strip out the address
726   actively even if user said yes to the question.  That should not
727   happen?  It somehow matches the documentation however.  unsure.
729 . if -t is used and the file includes Mail-Followup-To:, then we should
730   NOT add to it, OR we need to offer a way to get there!
732 . stale dotlock files should be removed - postfix has
733   a stale_lock_time=500s variable to configure that
735 # s-ts-mode