README: tweaks
[s-mailx.git] / TODO
blobd6230b08d15fa21258c8af4af027723ec78bbcc4
1 TODO reminder.
3 Release S-nail v20 on 2018-03-25, the 40th anniversary of Mail.
4 With a clean, conforming and efficient codebase, then.
6 - Recipients specified on the command line should be added to those
7   specified in the message when the -t option is set.
9 - At least optionally disallow silent discarding of invalid addresses,
10   i.e., cause sending to be aborted if not all recipient addresses pass the
11   validity test.
13 - Ditto if a resource file can't be found that has been explicitly set via
14   environment variables there should be some feedback.
16 - I.e., it is fine to be silent unless an error occurs, but then please
17   report errors and offer (in interactive mode) the possibility to act at
18   a glance.  (See error ring topic around here.)
20 - POSIX says that, when written to DEAD: "If the file exists, the message
21   shall be written to replace the contents of the file".  This is mentioned
22   for ASYNCHRONOUS EVENTS, but it's the only description of what should be
23   done in which way to DEAD.  savedeadletter() yet appends.  See ZOMBIE ,)
25 - It irritates me that a message with 5 visible lines but 115 header lines
26   goes through the pager, even if i have *crt=*.
28 - We should possibly get away of using command line utilities for
29   compression.  (At least optionally?)  Instead we should link against
30   zlib(3), bz2lib(3) and lzma(3), if found.  Or we may use dlopen(3)
31   instead, if found, to avoid linking (though those libraries don't need
32   much linker work unless actually used afaik, 'should look in detail).
33   We should also drop lzw.c, it is used for the IMAP cache.
35 - We should maybe turn -~ into the meaning "force interactive".
36   We should extend cc-test.sh, then, to test some interactive things.
38 - We need a "void" box that can be jumped to, i.e., a state in which no box
39   at all is active.
41 -- When a MBOX mailbox is removed while it is opened then changing the
42   folder is not possible.  This is an inherent problem of the Berkeley
43   Mail codebase, and we need to have a fully functional intermediate
44   VOID box mechanism plus an object-based mailbox implementation to
45   overcome it.
47 -- Also, when the folder was modified concurrently we should bail, or,
48    in an interactive session, prompt the user what to do.
50 - IDNA decoding.  Needs a complete design change.
52 - Mail-Followup-To:.
54 - mutt(1) quotes all text parts of a message, not only the first one!
55   This should at least be optionally available.
57 - If pipes fail for part viewers then at least the usual PART X.Y should be
58   shown, maybe even including some error message.
59   I had 'set pipe-text/html="lynx -dump -force_html /dev/stdin"' but NetBSD
60   does not have lynx(1), and i thought i've found a S-nail(1) bug.
62 - Offer the possibility to work with certificate fingerprints instead of
63   full certificates, in equal spirit to the current maintainers S-Postman
64   and Mercurial.  S-nail(1) could simply offer something in equal spirit to
65   the formers --fingerprint, so that no other tool is necessary for
66   certificate management (for at least secure transport).
68 - It would be nice if it would be possible to define a format string for
69   *quote*, like 'set quote="format=some formats"'.
70   In general the current approach is somewhat messy IMO.  I.e., it would
71   make more sense to act rather like mutt(1) and as written elsewhere in
72   this document, i.e., have some toggles that act on the display and use it
73   for multiple modes (show/reply/forward etc.)
74   Otherwise introduce commands which include all the headers plus, e.g.,
75   "hreply" or "freply", and then the ditto series, i.e., "hReply" ...
77 -- This would also mean that interactive message editing would work
78   accordingly.  PleasE!
80 - Command line editing should gain possibility of context sensitive tab
81   completion.
83 -- Note that the TTY is sick.  If ^C on input it simply jumps to next
84    input, instead of saying "Interrupted, one more to die hard" or
85    something (talking about ~@ charset selection prompts in particular).
87 - Maybe there should be an additional ZOMBIE directive that is served in
88   equal spirit to DEAD, but that could be a valid MBOX... ?
89   What i want is a *real* resend, best if possible from command line.
90   Meaning, also the possibility to postpone a message.  In general.
92 - POP3 doesn't support "newmail" for real.  If implemented, should it sync?
93   Look at POP3 impl. in general..
95 - Having a newsreader would be a really cool thing.  (RFC 977 and 2980)
97 - There should be a way to ignore the From_ line, as opposed to the From:
98   line, i.e., distinctively.
100 - There should be a variable that controls wether leading and trailing
101   empty lines of parts and/or messages as such should be printed or not.
103 - printhead()/hprf(): support %n newline format (%t tab?).
104   Make it possible to use the *datefield* algorithm for plain From_ derived
105   dates (needs a From_ parser, i.e., strptime()-alike).
106   Once we have that, rename *datefield-markout-older* to
107   *date-markout-older* ??
108   Note that NetBSD's mail(1) has some other nice things.
109   Note also that our code is quite unflexible.
111 -- NetBSD's mail(1) has nice *indentprefix* and *indentpostscript*
112    variables (though prefix and appendix or prefix and suffix, but..).
113    Note that our code is quite unflexible.
115 - The "top" command should honour ignoretab, or there should be a very
116   special "top" ignoretab.  It simply doesn't make sense to "top" 5 lines
117   when all that you get are Received: lines...
119 - In the very end it is not that hard to add (optional) MTA
120   functionality at a most simple level.
121   Use sqlite for aliases (and possibly cache), then.
123 - We should support IMAP compression over the wire.
125 Low-Level
126 ---------
128 - Improve name extraction rules.  And field parsing.  There
129   are structured and unstructured fields.  There are quoted pairs and
130   comments etc.  Rewrite the entire parsing mechanism to comply to RFC
131   5322, and try to merge all those many subparsers around in the codebase,
132   and accordingly.  So much duplicated work ...
133   Name parsing has been improved a bit for v13, but it's still broken.
134   yankword(), *extract(), etc.: RFC 5322 says that comments in address
135   fields SHOULD NOT be used (mutt(1) maps them to full name-addr forms if
136   approbiate, even if that actually changes content!!?), and that full
137   name-addr SHOULD be used.  Our functions are yet quite silly (i.e.,
138   leading comments remain, as in "(bier2) <a2@b2.de>", unless the address
139   doesn't come in angle brackets, trailing go away, as in "<a6@b6.de>
140   (bier6)", that becomes "<a6@b6.de>").
141   Something silly like
142     (co$mm1) abc@däf.de (cö,mm,2)   ('c'o"m"m.3)
143   Should eventually become
144     co$mm1 cö,mm,2 'c'o"m"m.3 <abc@xn--df-via.de>
145   on the display, or, with IDNA decoding (and thus rather unlikely)
146     co$mm1 cö,mm,2 'c'o"m"m.3 <abc@däf.de>
147   It should NOT become this mutt(1)ism:
148     "co$mm1 cö,mm,2 'c'omm.3" <abc@däf.de>
149   Or?
151 -- Think about a name bypass hashmap cache, and whenever we have to skin or
152    nalloc() or whatever, look in there.  Maybe even an additional link for
153    non GFULL(/GSKIN) and fully skinned struct name objects.
154    The amount of duplicated work in this codebase is frustrating, but the
155    real healing would make necessary a complete rewrite of the name handling!
156    Such a cache would work without touching the current code flow ... or
157    allow a smooth transition to a new one anyway.
159 ++  NOTE: 'alternates' tracking happens BEFORE we enter composing, this
160     means that an account switch during message composing will NOT cause
161     reevaluation of all that very very clumy
162     elide/delete_alternates/gexpand/is_myname etc. handling.
164 - The char classification stuff can be improved; currently each character
165   has exactly one classification bit set, even if multiple would apply
166   (e.g., HT=\t == CNTRL|SPACE|ASCII|BLANK).  This would allow better
167   testing using our own classification functions in quite some places.
169 - The quoted-printable Content-Transfer-Encoding: supports soft linebreaks;
170   it happens that a lot of mailers (Apple Mail?, Microsoft Word, Yahoo!
171   Webmail) create HTML parts which solely consist of a single line,
172   created via soft linebreaks.
173   To handle such mess we need to be able to break out of the input-line ==
174   output line relationship that is still fixated in the codebase.
175   I.e., it is not even sufficient to convert "rest" into an array, but best
176   would be if we would be able to sequentially work what we have, and
177   detect when it is safe to "dump that out".
178   This MUST be part of the send/mime layer rewrite in 15.0.
180 -- In v15.0, when we can address attachments of a message individually,
181    it would be nice to provide even more access, just like nmh(1) does
182    (Johan Commelin: Are s-nail and mh related?).
184 - I never used anything but the *datefield* option, and it would really be
185   nice if the date strings would be parsed off into some 16 byte or what
186   storage when about to producing the summary, so that it would be directly
187   available and there would be no need to reread the mail.  Moreover, or
188   even more than that - the m_date field exists and should possibly simply
189   be init, at least in these cases.  (P.S.: this doesn't contradict the
190   statement somewhere else in this file that the structure should be
191   slacked; simply use multiple thereof or so)
193 - All error messages should not go to stderr but instead we should add our
194   own n_warn() family and use that.  In the background we should have
195   a ring of error messages (oldest fall off), and a command that is capable
196   to display the ring.  The command loop should recognize whenever an error
197   happened during the last command, and print something like "XY errors
198   occurred", followed by a (truncated as necessary) error report.
199   It simply doesn't make any sense to print errors on stderr if normal
200   output goes to stdout and scrolls it off the screen.
201   Note that yet some errors messages still go to stdout.
203 - It would be very nice if it would be possible to have
204   account-specific macros that will be lost when a user switches off
205   an account.
207 -- It would also be very nice if we could define macros while defining
208    account, i.e., recursive definition of macros...
210 - At some later time extend the logic behind -# -- it should not have
211   a current folder, but start in VOID mode (...), and unless one is
212   explicitly chosen..  We need a reliable batch mode.
214 - (Support for mailcap files?  As of RFC 1524?  Unlikely.  Though the
215   % expansions would be very helpful, especially once we can address
216   individuals parts as of v15.0!)
218 - After I/O layer rework we should optionally be able to read RSS
219   (Atom?) feeds -- Expat should be available almost everywhere and
220   should be able to parse that?
221   Atom is harder because it may support html+.
222   I mean, yeah, it's stupid, but we could fill in header fields with
223   dummies and still use S-nail to look into the separated feeds as if
224   they were mail messages; anyway i would like to save me from using too
225   many tools -- three seems reasonable.
227 - Add TODO notes for those RFCs:
228   RFC 5322 - The basic format of email messages.
229   MIME (Multimeda) email extensions
230   RFC 2405 - The format of MIME message bodies.
231   RFC 2406 - Common multimedia types.
232   RFC 2017 - URL External-Body Access-Type
233   RFC 3676 - Updates to the text/plain MIME type and extensions for flowed
234     text (format=flowed).   (Martin Neitzel)
235   RFC 2407 - Encoding of non-ASCII text in message headers.
236   RFC 2183 - The Content-Disposition Header
237   RFC 2231 - Encoding of character set and language information in MIME
238     parameter values.
239   SMTP (Simple Mail Transfer Protocol)
240   RFC 5321 - Simple Mail Transfer Protocol.
241   RFC 6409 - Message Submission for Mail
242   RFC 4954 - SMTP Authentication
243   RFC 3207 - SMTP over TLS
244   RFC 6152 - SMTP Service Extension for 8-bit MIME Transport
245   Post Office Protocol (POP)
246   RFC 1939 - Post Office Protocol v3
247   RFC 2449 - POP3 Extensions (including SASL)
248   RFC 2595 - TLS for POP3 (among others)
249   Security
250   RFC 4422, 4505 - Simple Authentication and Security layer (SASL)
251             (Tarqi Kazan)
252   RFC 5246 - Transport Layer Security (TLS)
253   RFC 977 -> 3977 - Network News Transfer Protocol
254   RFC 1036 - Standard for USENET Messages
255   RFC 2980 - Common NNTP Extensions
256   RFC 2387 - multipart/related
257   RFC 2384,1738 - I.e., Much better URL support
258   RFC 5751 - Secure/Multipurpose Internet Mail Extensions (S/MIME)
259   RFC 6125 - Representation and Verification of Domain-Based Application
260     Service Identity within Internet Public Key Infrastructure Using
261     X.509 (PKIX) Certificates in the Context of Transport Layer Security
262     (TLS)
263  RFC 3461, 3464 -
264     Simple Mail Transfer Protocol (SMTP) Service Extension for Delivery
265       Status Notifications (DSNs),
266     An Extensible Message Format for Delivery Status Notifications
268 - This is how the codebase has to be reworked in respect to signals and
269   jumping:
271   1. We introduce some environment/carrier structs: struct eval_ctx,
272      struct cmd_ctx, (struct send_ctx).  All of these form lists.
273      eval_ctx gets a new instance every time evaluate() is entered; for
274      the interactive mode, commands() instantiates an outermost eval_ctx
275      that "cannot be left".
276      cmd_ctx knows about the eval_ctx in which it is was created; it is
277      created for each command that has an entry in cmd_tab and is passed
278      as the new argument of these kind of functions.
279      (send_ctx is the carrier for the MIME and send layer rewrite.)
280   2. We'll get a signal manager.  This is a global layer which is the
281      sole object-in-charge for signals.  We'll install a complete set of
282      handlers once -- those will only set has-occurred bits.
283      All interested parties have to peek at the signal manager when they
284      are in the position to deal with signals, via a series of
285      "ha(s|ve)_occurred", "needs_action", "would_raise" or whatever, as
286      well as "doact".
287   3. We need a sort of non-local return, everything else would require
288      a totally different way of programming.  Also, non-local returns
289      are not *that* bad, generally speaking.  We'll be easy and add the
290      possibility to define a jump target location in eval_ctx and
291      cmd_ctx, by peeking at the signal manager (for object design
292      reasons, though done by a macro, say), just like saying "i need to
293      have the chance to perform some actions shall a jump be necessary".
294   4. So, somewhere deep down the still recursive codebase, shall the
295      necessity to honour a jump request occur, we peek the signal
296      manager to "unroll" the current cmd_ctx/eval_ctx chain(s), which
297      will result in none-to-multiple jumps to locations which require
298      cleanup actions, ultimately ending in the non-leavable commands()
299      eval_ctx or whatever.
300   6. Hot: we save us from thousands of syscalls, and get rid of the
301      fucking sig* shit.  It rhymes, it rhymes :)
302      Should we even be able to go the non-blocking select(2) way in the
303      end -- that would be fantastic!
304  10. The line buffer used in evaluate() that is passed through to
305      commands (thus: in cmd_ctx, then) needs to become `const'.
306      (I tried to do so in the past, but some commands write into it,
307      thus i stopped and iirc even added some changes on my own which
308      take favour of reusing that buffer.)
309      + Macro execution then no longer needs to clone the macro content
310      lines before executing then.
311  11. Macro execution is potentially recursive.  Meaning that
312      `undefine', etc. can occur while macros are executing.
313      The simplemost approach would be to have some recursion counter for
314      each macro and a delete_later flag that gets honoured when the
315      recursion counter gets zero.  It would be already possible to
316      immediately remove the macro from the hashtable, so that deeper
317      levels wouldn't find it anymore.  To avoid leaks (which *are*) we
318      need to have a jump location for our upcoming signal handler
319      anyway.  (Also to get rid of the temporary_localopts_free() hack.
320      + The same is true for `account's.  Here things are complicated by
321      the global `account_name', i.e., the account could be the current
322      one.
323  12. It is annoying that you cannot `source' your MAILRC multiple times.
324      Defining a macro/account/xy should overwrite the current thing,
325      just as it does anyway for normal variables!
326      This is no different than 11. plus additional re-addition.
327      (Same exception: what if the currently active account is
328      overwritten?  Same answer, plus a message "new settings take effect
329      when account is switched to the next time".)
330  20. The attachment charset selection loop can then be rewritten to
331      check wether an ^C occurred and treat that as end-of-loop
332      condition.  In v14.6.3 this was introduced, but it should act
333      differently depending on wether the interrupt occurred during
334      character set selection or attachment filename input.
335      Also in respect wether the interrupt is "propagated" or not.
336      It's ugly, and documented accordingly.
337  30. Mail protocols and mail messages are accessed through a "VFS".
338      URL should then support file:// and maildir:// etc.  Update manual!
339  31. Flag updates of individual messages must find their way through to
340      the protocol.
341  32. Use deque (on partial views).
342  33. It must be possible to open individual boxes read-only, new command
343      `cfile' (and `cfolder') as a last resort.
344  34. We need a new abstraction: `vie[ws]'.  I.e, viewset, viewclear,
345      view(show|look)?  We will have (possibly readonly) boxes, a summary
346      cache file, which is created when a mailbox is read in, and all
347      that crap that we currently have (setptr(), setmsize(), etc.!) must
348      vanish.  Instead there is another, in-memory abstraction, the view.
349      Some views are builtin and are somehow selectable (the "all" view,
350      for example, and the "new" view).
351      It is possible to make a view persistent by giving it a name, e.g.,
352      'viewset NAME MSG-SPEC' -- 'viewset allnew :n' (and 'viewset XY `'
353      or something must be capable to tag the last a.k.a current).
354      Switching to a named view would thus look over the entire current
355      view (!) for all messages that comply to the message-spec of the
356      view, then create a sorted/threaded display of that subset and
357      create a new anonymous "result" view.  It must be possible to
358      specify that a view is to be applied to the entire mailbox instead
359      of the current view, via a simple easy understandable syntax.
360  50. Support SASL, unite all GSS-API etc. under an abstraction!
361      Maybe even drop direct GSS-API and support only through SASL.
362      That is, we can very well provide our own little SASL-client
363      abstraction with what we have already by simply defining some
364      "readline" abstraction plus struct ccred for use by the
365      authentication layer: the protocols must set it up by passing in
366      a line of authentication mechanisms and a callback mechanism.
367      Possibly the user should be able to permit or forbid automatic
368      selection of GSS-API (to avoid useless round-trips) etc. etc.
369  99. Now i'm dreaming some more: with the new object-based approach
370      multiple mailboxes could be in an open state.  And it should be
371      possible to do so for the user (`file' and `folder' are required to
372      quit the current mailbox [first -- this not yet]), which is why we
373      either need new trigger characters or new commands (then also in
374      a readonly version, again, it gets lengthy).
375      The absolute sensation would be joinable operations over multiple
376      open mailboxes, e.g., views over multiple such!
377 100. If i say `p 3 2 1' then i mean `3 2 1' not `1 2 3'.
379 TODO S-nail 14.7:
380 -----------------
382 - Deal with faulty message selection that may occur when selecting threads
383   via & (when at least mixed with other selectors).
385 -- Also (?same problem?) the thread sort doesn't get
387     [A is deleted]
388     B answers A
389       C answers B
390       D answers B
391     E is unrelated
392     F answers A
394   The current sort fails to recognize that F and the thread starting at
395   B are related, which results in a mess.
397 - Drop **use-starttls* in favour of something better: support 'auto',
398   'no' and 'yes' and act accordingly.  For the former be smart enough on
399   the protocol side.  (RFC 3207 describes man-in-the-middle attacks due
400   to 'auto' TLS, so explicit 'yes' should be favoured).
402 - NOTE: we do not really support IPv6 sofar in that we are not prepared to
403   deal with IPv6 addresses (as in '[ADDR]:PORT').  Pimp url_parse().
404   And socket I/O.
406 - mutt(1) dotlock ..., "mbox" command doesn'T work?
408 - ARGH!  Should `folders' auto-login if *folder* is an IMAP account that is
409   not active?  Why does _expand() use *mailname* to expand `@', not
410   getfold() (care: res may point into cbuf, savestr() or so!).
411   Why does demail() etc. treat *mailname* as a file (more or less), why do
412   we need *mailname* at all;  we should have Folder objects, multiple of
413   which concurrently, one the active; a Folder may not become *folder*
414   unless it has write (store) capabilities).  Maybe then `mbox' works fine
415   if connected to a POP3 server with a *MBOX* on an IMAP account that yet
416   never was connected and needs to read a password on the terminal before
417   the login works ... note the latter situation yet kills us since i think
418   INT is blocked during all that ;-((
420 - I had a connection collapse during a POP3 download, and neither was
421   there a chance to get access to the 22 yet downloaded mails (after
422   five minutes of waiting followed by CNTRL-C), nor did the layer
423   recognize this very well (got myriads of `POP3 connection already
424   closed.' messages, btw., the thirty-something messages which were not
425   yet downloaded caused (after CNTRL-C) this: ETC. ETC.
427 - Add a value-duplication command, i.e.,
428     clone _x header
429     unset header
430     ...
431     clone header _x
432     unset _x
434 - Add a boolify() function, so that things like `localopts' and yorn()
435   may be less strict on user input
437 - Ensure that `.' and EOF on a line works with all TTY modes (*ignoreeof*
438   relationship, too)!  EOF conditions in general!
440 -- NCL / current expand-on-tab: fexpand() should take additional size_t* to
441    store the number of the results OR should "return char** array", so that
442    individual results can be addressed.
443    Then we could simply print "\nALL-RESULTS\n" and NOT expand the current
444    line if the result is ambiguous, i.e., we have more than one possible
445    expansion.
446    However, we would then need something to print the results page-wise,
447    in case we have so many of them that they don't fit on the screen.
448    ...  Etc. ...
450 - IMAP: if i `d' a message then this is a local change (in the meanwhile);
451   yet, when i `u' it, that will go through the server, needlessly.
453 - I got an email in base64 that obviously used CRNL line endings, and once
454   i've replied the CR where quoted as *control* characters.
455   Get rid of those (kwcrtest.mbox; may be hard to do everywhere for some
456   time, due to how we deal with I/O and Send layer etc).
458 - edit.c doesn't do NEED_BODY (but IMAP won't work anyway).
460 - Stuff
461   .. s-nail </dev/null should work interactively when STDERR_FILENO is
462     a terminal!  (Builtin editor; how do editline and readline work?
463     should this be documented?  What does NetBSD Mail do?  Should we NOT
464     be interactive??  POSIX says for sh(1) (APPLICATION USAGE): 'sh
465     2>FILE' is not interactive, even though it accepts terminal input.)
466   . Automatically track message attachments when switching off the
467     folder.
468     NOTE: 'alternates' tracking happens BEFORE we enter composing, this
469     means that an account switch during message composing will NOT cause
470     reevaluation of all that very very clumy
471     elide/delete_alternates/gexpand/is_myname etc. handling.
472     We REALLY need an object based rework of all that.
473   . It would be cool if ghosts, shortcuts, alternates could
474     (optionally?) be tracked via localopts.
475     (Additional entry on xy-local xy somewhere above)
476   . The spam* series (spam.c:_spam_action()) should abort if the command
477     execution failed, instead of iterating the entire list.  Look into
478     that.
479   . DESTDIR= should not be taken into account when deciding wether
480     a rebuild is necessary (not wrong to give that to Gaetan Bisson).
481   . Just like the RFC 3676 link above, it would be nice if it would be
482     somehow possible to recognize links in a document; i don't know yet
483     how this could be achieved without loosing formatting information (i
484     mean, we could enable this and inject terminal colour sequences, but
485     one should be able to say 'follow link x', starting an action
486     handler, and the 'x' must come from somwhere - simply injecting
487     '[NUMBER]' references distorts visual).  Anyway, it's just a filter
488     that recognized the usual <SCHEME:/> stuff, and of course we can
489     simply have a buffer which records all such occurrences, so that
490     user can say '? xy NUMBER', but without the context it soon gets
491     hard.
492   . TTY layer: the tc*() family may fail with EINTR, which MUST be
493     handled; setting also generates SIGTTOU when we're not in foreground
494     pgrp, so we better deal with all that and ENSURE WE GET THROUGH when
495     resetting terminal attributes!
496   . Remove all occurrences of mbtowc() with mbrtowc(); temporarily add (some)
497     global mbstate_t objects until the send / MIME layer rewrite is done and
498     has the carrier.  Use flip states and add aux funs with only update the
499     state+toggle on success -- CURRENTLY MBTOWC FAILURES ARE PRACTICALLY NOT
500     HANDLED!!
501   . Ypnose (linuxien AT legtux DOT org) pointed out that for the IMAP
502     cache we have some kind of UID validity check -- couldn't that be
503     used to perform some kind of automatic reconnection when we get that
504     much-too-frequent connection breaks in IMAP mode??
505     Also, and also for POP3, don't let the ALARM based (ugh!  I'm
506     starting to dream wet from select(2), almost truly) timer blindly
507     tick, but restart it with a full interval when we did regular
508     conversation with a server.  Don't forget the SSL timeouts (300
509     seconds) and their interaction with normal (user) keepalives.
510     Add a global *keepalive*, add *keepalive-USER@HOST*.  (Add and use
511     a generic, single function to get the value for either protocol.)
512   . HAVE_HISTORY plus: for WANT_EDITLINE and WANT_READLINE the
513     mk-conf.sh yet always tests anything, i.e., we could fail due to
514     history related stuff even though the user doesn't WANT_HISTORY.
515   .. We should in fact convert our NCL history to a shared history
516      implementation, and only hook editline(3) and readline(3) so that
517      ^R and Cursor-(Up|Down) work as expected everywhere.
518      Like that we would have duplicate elimination for readline(3), too.
519   .. tty_addhist() should take a struct str.  Anyway, evaluate() should
520      enter a history entry if the caller allows so, and it should trim
521      also trailing whitespace; also, the expanded command should be
522      stored, not the abbreviation, so that 'sst' and 'sstats' will no
523      longer produce two separate entries.
524   . getprompt() could reserve for each dynamic entry at least one
525     visible offset, so that at least a `?' could be written if the room
526     is otherwise insufficient; in addition, if there were 3 such
527     dynamics, but all in all two visible offsets would be left, a single
528     entry with as much `?' as possible c/should be written, so as to
529     indicate the user anything visually.
530   . Make S/MIME an option separate of SSL/TLS
531   . pop3,mime_cte +++: \r,\n -> \015,\012, to avoid ANY problems..
532   . which_protocol(), *newmail* mechanism, displayname, mailname: all of
533     this <rude>SHIT</rude> must be rewritten completely and can be
534     overcome by an object-based mailbox implementation that carries all
535     the necessary state (user given path, expanded realpath(3),
536     abbreviated display path, box-protocol, etc.).  Once we have this,
537     we may as well also re-introduce automatic detection of compressed
538     file-based folders based upon .gz/.bz2/.xz extension.
540     If not mentioned somehwere else: struct message should be splitted
541     into a tree of objects, with a base class that has as few fields as
542     possible; the global *message should be a deque, only accessible via
543     iterator; it should store pointers to (the actually used subtype of)
544     message structures instead; i.e., for maildir boxes the path is yet
545     allocated separately, then it could be part of the message object,
546     etc.
547     It should contain a ui8_t that tracks the number of contained parts,
548     so that the "fits-onto-the-screen" tests are more useful than today;
549     i think 8-bit is sufficient, with 0xFF meaning more-than-fits-here.
550   . Given how many temporary files we use, it would make sense to
551     support a reusable single temporary file, as in singletmp_take() and
552     singletmp_release(), where singletmp_release() would close and thus
553     drop the file if it excesses a specific (configurable) size, and the
554     mainloop tick would close it (after X (configurable) ticks))
555     otherwise.  I guess this would improve performance for searching
556     etc. etc.
557   . Searching code *could* perform a prepass, joining stuff together,
558     dropping useless cases etc.
559     But anyway: if there are multiple search expressions, it shouldn't
560     be an error if at least one of them matches at least one message.
561   . catset(3) is plain shit, and ever was.  Remove IDs from all tr()s,
562     use GNU tools for extraction etc., and write a simple helper program
563     which converts these files to a serialized hashmap, just like we did
564     for the okeys (and *exactly* so); add a config check wether the ({})
565     extension is supported and finally use that for some ({static char
566     const *tr_res;}) injection optimization, then.  (Think SFSYS)
567   . Searching body/text yet includes headers from attachments and
568     attachment data.  This is shit.  :)
569   . Btw.: (with IMAP) when opening a folder the hook gets executed after
570     the flags but before the headers are loaded, but for `newmail' it is
571     *after* the headers have been loaded.
572   .      /* TODO *batch-exit-on-error*: sourcing and loading MUST BE FLAGS!
573           * TODO the current behaviour is suboptimal AT BEST! */
574   . There MUST be a way to specify that a single SPECIFIC box has to be
575     opened readonly.  only the global -R flag is NOT ENOUGH!
576   . The "nifty" unregister_file()->_compress() mechanism that even
577     shovels '-Sfolder=imaps://user1@localhost -Srecord="+Sent Items"'
578     *records* calls clearerr() on the descriptor before performing it's
579     action anyway.  when we really make it even to the I/O rewrite, it
580     should be possible to dis-/allow such -- it doesn't make sense to
581     add something faulty to whatever was not faulty before!
582   . The message from Andy Switala on nail-devel made me think about some
583     mechanism that invokes a macro after a message has been sent.
584     Unless macros can have args (or do we introduce $*/$@/$1..).
585     Even if the codebase will at some future time be stable and really
586     reliable, sending a message via multiple channels will never be
587     atomic, so that it would make sense for a user to be able to restore
588     *the complete message* in a save place if any of the sends failed,
589     but to remove it from our temporary place otherwise.  A simple
590     version of this would be a matter of five minutes, but since
591     mightrecord() may internally (via _compress()) instantiate
592     a complete IMAP session and try to send incomplete data etc.,
593     and all that may jump, i refrained from doing so.
594   . SMTPS never became a standard and :465 was already reassigned
595     (thanks, carriers), but if a user says SMTPS and doesn't specify
596     a port also then we could simply assume :465 because except NetBSD
597     noone has SMTPS in their /etc/services?
598     Or at least automatically restart a failed getaddrinfo() in the
599     SMPTS case (if EAI_SERVICE)?
600     (Ooops - i think this should go to Gianluca Ramunno!)
601   . `dp' prints EOF at the end of a thread even if unread messages
602     follow
603   . [-- #2 : 41/2761, text/plain, 0001-Israel-DST-transitio --]
604     If not fit, it should do `...'
605     It is not multibyte safe anyway, implement a generic function (or
606     two, one that takes an iconv_t) to trim a string into a buffer
607   . When doing `~w FILE' and FILE cannot be written to (was a directory)
608     then the composed mail is lost completely, it seems we jump to the
609     very main loop!
610   . `resend' doesn't smime-sign.
611   . Really do extend the test already today; test S/MIME
612     signing/encryption/decryption with two pairs of identities, instead
613     of of one.
614   . RFC 5751 describes a message multipart layout that also includes the
615     headers in the signature; it would be nice (for completeness sake)
616     to be able to support that.
617   . The capability to save a message under the name of a recipient is in
618     the standard etc., but i've never used it.
619     What would be cool, otoh, would be if there would be the possibility
620     to register a regular expression, and if just *any* recipient of
621     a message matches, store the message in the given folder instead.
622     I.e., if i send a message to s-nail-users@ then i most likely want
623     to get a copy to the corresponding box, regardless of whoever the
624     message was sent To: Cc: or Bcc: else..
625   . In my ~xother with *nohold* if at the begin i have many large
626     messages i ended up with a truncated *mbox*? what was that?
627   . Things like colalign(), makeprint(), colour*, as well as
628     possibly even cmd1.c:(__hprf|putindent)(), etc. belong into a cui.c,
629     display.c or the like, but not into auxlily.c etc. for sure.
630     Also writing a range of headers should be done through an
631     iterator-thing with setup/finalize init/destroy life cycle, which
632     would encapsulate the entire cmd1.c:_print_head() in the single
633     iterator setup function!
634   .. Unite
635       defined HAVE_SETLOCALE && defined HAVE_C90AMEND1 && defined HAVE_WCWIDTH
636      into HAVE_NATCH_CHAR, solely keep that
637   . Using -t should still optionally offer an option to enter editing.
638     Also we should support command line arguments on top.
639     Add a -T flag for that.  Drop -q, let -T mean the same if no header
640     fields are given (i.e., header fields are not mandatory as with -t).
641     ANYWAY: -t and -q are mutual, enforce that (yet done?)
642   . mutt list handling (`~') is very powerful
643   . Check what happens if an account switch or a network connection is
644     done while we are loading the resource files...
645   . urlxdec() doesn't know about invalid input strings, just deconverts
646   . We have some use of *at() functions, especially anything which
647     temporarily switches cwd.
648   . *newmail* is terrible.  At some later time we need to do somethings
649     with timeouts etc. (for MBOX and Maildir it's not that bad, but for
650     anything over the network, yet the mentioned may come in over NFS).
651     Remove it until we have something better?
652   . The :d modifier is extremely useless even though POSIX compliant (No
653     deleted message or deleted message header shall be displayed by any
654     mailx command other than undelete.)
655     If i say p:d or f:d it should work.
656   . The manual should clearly state which options are enabled by
657     default.
658   . The RFC 3798 *disposition-notification-send* mechanism is yet not
659     truly conforming (and works with *from*).  Also, this is only the
660     sender side, there should be support for creating the MDN response.
661     (Maybe ternary option: off (default),
662     create-when-unread-flag-goes-away, ditto-but-also-strip-header)
663   .. Also, there is DSN as a SMTP extension, see the RFCs 3461, 346 (as
664      above) and 6522 (Wikipedia).
665   . Add a env_blook()/env_vlook() series like that: add a FROM-ENV bit
666     to variables; use the normal var lookup, but even if found, when
667     FROM-ENV not set, use getenv(3); question yet open is wether that
668     value should then override what we have;  in fact i think we should
669     possibly during loading phase act like this automatically for *all*
670     variable settings, i.e., settings from the environment MUST override
671     settings from ressource files UNLESS command line arguments
672     explicitly override anything else.  That is pretty shitty, which
673     makes me think that we should possibly iterate over environ(3) and
674     explicitly overtake all values therein, or at least those which have
675     a meaning for S-nail; this needn't be as expensive as it sounds.
676   . The *sendmail** variables should have been replaced by *mta** in
677     v15.0!?!
678   . We should support more named colours, enabled via a, e.g.,
679     *colour-plus*, but provide downgrade colours for given colour names
680     if that isn't set. (Gavin Troy)
682 vim:set fenc=utf-8:s-ts-mode