TODO DONE
[gpgme.git] / TODO
1 Hey Emacs, this is -*- org -*- mode!
2
3 * Document all the new stuff.
4   :PROPERTIES:
5   :CUSTOM_ID: more-docs-is-better
6   :END:
7 ** TODO Fix this TODO list.
8    :PROPERTIES:
9    :CUSTOM_ID: fix-todo
10    :END:
11    Clean up the current TODO list.  Include properties as relevant (so
12    if someone does make a PDF or HTML version the TOC will work).
13
14    Also check ans see if some of these ancient things can be removed
15    (e.g. do we really need to fix things that were broken in GPG
16    1.3.x?  I'm thinking not so much).
17
18
19
20 * Fix the remaining UI Server problems:
21   :PROPERTIES:
22   :CUSTOM_ID: ui-server-fix
23   :END:
24 ** VERIFY --silent support.
25    :PROPERTIES:
26    :CUSTOM_ID: verify-silent
27    :END:
28 ** ENCRYPT/DECRYPT/VERIFY/SIGN reset the engine, shouldn't be done with UISERVER?
29    :PROPERTIES:
30    :CUSTOM_ID: reset-engine-not-ui
31    :END:
32
33
34 * IMPORTANT
35   :PROPERTIES:
36   :CUSTOM_ID: important-stuff-really
37   :END:
38 ** When using descriptor passing, we need to set the fd to blocking before
39    :PROPERTIES:
40    :CUSTOM_ID: set-fd-blocking
41    :END:
42    issueing simple commands, because we are mixing synchronous
43    commands into potentially asynchronous operations.
44 ** Might want to implement nonblock for w32 native backend!
45    :PROPERTIES:
46    :CUSTOM_ID: nonblock-win32
47    :END:
48    Right now we block reading the next line with assuan.
49
50 * Before release:
51   :PROPERTIES:
52   :CUSTOM_ID: pre-release
53   :END:
54 ** Some gpg tests fail with gpg 1.3.4-cvs (gpg/t-keylist-sig)
55    :PROPERTIES:
56    :CUSTOM_ID: gpg-1-3-4-really
57    :END:
58    The test is currently disabled there and in gpg/t-import.
59 ** When gpg supports it, write binary subpackets directly,
60    :PROPERTIES:
61    :CUSTOM_ID: binary-subpackets
62    :END:
63    and parse SUBPACKET status lines.
64
65 * ABI's to break:
66   :PROPERTIES:
67   :CUSTOM_ID: abi-breakage-apparently-on-purpose
68   :END:
69 ** Old opassuan interface.
70    :PROPERTIES:
71    :CUSTOM_ID: old-opassuan
72    :END:
73 ** Implementation: Remove support for old style error codes in
74    :PROPERTIES:
75    :CUSTOM_ID: remove-old-error-codes
76    :END:
77    conversion.c::_gpgme_map_gnupg_error.
78 ** gpgme_edit_cb_t: Add "processed" return argument
79    :PROPERTIES:
80    :CUSTOM_ID: add-processed-return
81    :END:
82    (see edit.c::command_handler).
83 ** I/O and User Data could be made extensible.  But this can be done
84    :PROPERTIES:
85    :CUSTOM_ID: add-io-user-data
86    :END:
87    without breaking the ABI hopefully.
88 ** All enums should be replaced by ints and simple macros for
89    :PROPERTIES:
90    :CUSTOM_ID: enums-should-be-ints
91    :END:
92    maximum compatibility.
93 ** Compatibility interfaces that can be removed in future versions:
94    :PROPERTIES:
95    :CUSTOM_ID: compat-interfaces-to-go
96    :END:
97 *** gpgme_data_new_from_filepart
98     :PROPERTIES:
99     :CUSTOM_ID: gpgme-data-new-from-filepart
100     :END:
101 *** gpgme_data_new_from_file
102     :PROPERTIES:
103     :CUSTOM_ID: gpgme-data-new-from-file
104     :END:
105 *** gpgme_data_new_with_read_cb
106     :PROPERTIES:
107     :CUSTOM_ID: gpgme-data-new-with-read-cb
108     :END:
109 *** gpgme_data_rewind
110     :PROPERTIES:
111     :CUSTOM_ID: gpgme-data-rewind
112     :END:
113 *** gpgme_op_import_ext
114     :PROPERTIES:
115     :CUSTOM_ID: gpgme-op-import-ext
116     :END:
117 *** gpgme_get_sig_key
118     :PROPERTIES:
119     :CUSTOM_ID: gpgme-get-sig-key
120     :END:
121 *** gpgme_get_sig_ulong_attr
122     :PROPERTIES:
123     :CUSTOM_ID: gpgme-get-sig-ulong-attr
124     :END:
125 *** gpgme_get_sig_string_attr
126     :PROPERTIES:
127     :CUSTOM_ID: gpgme-get-sig-string-attr
128     :END:
129 *** GPGME_SIG_STAT_*
130     :PROPERTIES:
131     :CUSTOM_ID: gpgme-sig-stat
132     :END:
133 *** gpgme_get_sig_status
134     :PROPERTIES:
135     :CUSTOM_ID: gpgme-get-sig-status
136     :END:
137 *** gpgme_trust_item_release
138     :PROPERTIES:
139     :CUSTOM_ID: gpgme-trust-item-release
140     :END:
141 *** gpgme_trust_item_get_string_attr
142     :PROPERTIES:
143     :CUSTOM_ID: gpgme-trust-item-get-string-attr
144     :END:
145 *** gpgme_trust_item_get_ulong_attr
146     :PROPERTIES:
147     :CUSTOM_ID: gpgme-trust-item-get-ulong-attr
148     :END:
149 *** gpgme_attr_t
150     :PROPERTIES:
151     :CUSTOM_ID: gpgme-attr-t
152     :END:
153 *** All Gpgme* typedefs.
154     :PROPERTIES:
155     :CUSTOM_ID: all-gpgme-typedefs
156     :END:
157
158
159 * Thread support:
160   :PROPERTIES:
161   :CUSTOM_ID: threads
162   :END:
163 ** When GNU Pth supports sendmsg/recvmsg, wrap them properly.
164    :PROPERTIES:
165    :CUSTOM_ID: wrap-oth
166    :END:
167 ** Without timegm (3) support our ISO time parser is not thread safe.
168    :PROPERTIES:
169    :CUSTOM_ID: time-threads
170    :END:
171    There is a configure time warning, though.
172
173 * New features:
174   :PROPERTIES:
175   :CUSTOM_ID: new-features
176   :END:
177 ** Flow control for data objects.
178    :PROPERTIES:
179    :CUSTOM_ID: flow-control-is-not-a-euphemism-for-an-s-bend
180    :END:
181    Currently, gpgme_data_t objects are assumed to be blocking.  To
182    break this assumption, we need either (A) a way for an user I/O
183    callback to store the current operation in a continuation that can
184    be resumed later.  While the continuation exists, file descriptors
185    associated with this operation must be removed from their
186    respective event loop.  or (B) a way for gpgme data objects to be
187    associated with a waitable object, that can be registered with the
188    user event loop.  Neither is particularly simple.
189 ** Extended notation support.  When gpg supports arbitrary binary
190    :PROPERTIES:
191    :CUSTOM_ID: extended-notation
192    :END:
193    notation data, provide a user interface for that.
194 ** notification system
195    :PROPERTIES:
196    :CUSTOM_ID: notification-system
197    :END:
198    We need a simple notification system, probably a simple callback
199    with a string and some optional arguments.  This is for example
200    required to notify an application of a changed smartcard, The
201    application can then do whatever is required.  There are other
202    usages too.  This notfication system should be independent of any
203    contextes of course.
204
205    Not sure whether this is still required.  GPGME_PROTOCOL_ASSUAN is
206    sufficient for this.
207
208 ** --learn-code support
209    :PROPERTIES:
210    :CUSTOM_ID: learn-code
211    :END:
212    This might be integrated with import. we still need to work out how
213    to learn a card when gpg and gpgsm have support for smartcards.  In
214    GPA we currently invoke gpg directly.
215
216 ** Might need a stat() for data objects and use it for length param to gpg.
217    :PROPERTIES:
218    :CUSTOM_ID: stat-data
219    :END:
220 ** Implement support for photo ids.
221    :PROPERTIES:
222    :CUSTOM_ID: photo-id
223    :END:
224 ** Allow selection of subkeys
225    :PROPERTIES:
226    :CUSTOM_ID: subkey-selection
227    :END:
228 ** Allow to return time stamps in ISO format
229    :PROPERTIES:
230    :CUSTOM_ID: iso-format-datetime
231    :END:
232   This allows us to handle years later than 2037 properly.  With the
233   time_t interface they are all mapped to 2037-12-31
234 ** New features requested by our dear users, but rejected or left for
235    :PROPERTIES:
236    :CUSTOM_ID: feature-requests
237    :END:
238    later consideration:
239 *** Allow to export secret keys.
240     :PROPERTIES:
241     :CUSTOM_ID: export-secret-keys
242     :END:
243     Rejected because this is conceptually flawed.  Secret keys on a
244     smart card can not be exported, for example.
245     May eventually e supproted with a keywrapping system.
246 *** Selecting the key ring, setting the version or comment in output.
247     :PROPERTIES:
248     :CUSTOM_ID: select-keyring-version
249     :END:
250     Rejected because the naive implementation is engine specific, the
251     configuration is part of the engine's configuration or readily
252     worked around in a different way
253 *** Selecting the symmetric cipher.
254     :PROPERTIES:
255     :CUSTOM_ID: symmetric-cipher-selection
256     :END:
257 *** Exchanging keys with key servers.
258     :PROPERTIES:
259     :CUSTOM_ID: key-server-exchange
260     :END:
261
262
263 * Documentation
264   :PROPERTIES:
265   :CUSTOM_ID: documentation
266   :END:
267 ** TODO Document validity and trust issues.
268    :PROPERTIES:
269    :CUSTOM_ID: valid-trust-issues
270    :END:
271 ** In gpgme.texi: Register callbacks under the right letter in the index.
272    :PROPERTIES:
273    :CUSTOM_ID: gpgme-texi
274    :END:
275 ** TODO Update TODO file
276    :PROPERTIES:
277    :CUSTOM_ID: todo-update
278    :END:
279
280 *** DONE fix TODO items
281     CLOSED: [2018-03-04 Sun 08:55]
282     :PROPERTIES:
283     :CUSTOM_ID: fix-todo-items
284     :END:
285
286     Adjust todo items so each can now be referenced by custom-id and
287     checked off as necessary.
288
289 * Engines
290   :PROPERTIES:
291   :CUSTOM_ID: engines
292   :END:
293 ** Do not create/destroy engines, but create engine and then reset it.
294    :PROPERTIES:
295    :CUSTOM_ID: reset-engine-is-not-quite-just-ignition
296    :END:
297    Internally the reset operation still spawns a new engine process,
298    but this can be replaced with a reset later.  Also, be very sure to
299    release everything properly at a reset and at an error.  Think hard
300    about where to guarantee what (ie, what happens if start fails, are
301    the fds unregistered immediately - i think so?)
302    Note that we need support in gpgsm to set include-certs to default
303    as RESET does not reset it, also for no_encrypt_to and probably
304    other options.
305 ** Optimize the case where a data object has an underlying fd we can pass
306    :PROPERTIES:
307    :CUSTOM_ID: optimus-data-cousin-of-optimus-prime
308    :END:
309    directly to the engine.  This will be automatic with socket I/O and
310    descriptor passing.
311 ** Move code common to all engines up from gpg to engine.
312    :PROPERTIES:
313    :CUSTOM_ID: move-code-common-to-engines-out-of-gpg
314    :END:
315 ** engine operations can return General Error on unknown protocol
316    :PROPERTIES:
317    :CUSTOM_ID: general-error-looking-to-be-court-martialled
318    :END:
319    (it's an internal error, as select_protocol checks already).
320 ** When server mode is implemented properly, more care has to be taken to
321    :PROPERTIES:
322    :CUSTOM_ID: server-mode
323    :END:
324    release all resources on error (for example to free assuan_cmd).
325 ** op_import_keys and op_export_keys have a limit in the number of keys.
326    :PROPERTIES:
327    :CUSTOM_ID: import-export-problems
328    :END:
329    This is because we pass them in gpg via the command line and gpgsm
330    via an assuan control line.  We should pipe them instead and maybe
331    change gpg/gpgsm to not put them in memory.
332
333
334 * GPG breakage:
335   :PROPERTIES:
336   :CUSTOM_ID: gpg-breakage
337   :END:
338 ** gpg 1.4.2 lacks error reporting if sign/encrypt with revoked key.
339    :PROPERTIES:
340    :CUSTOM_ID: gpg-classic-lacks-stuff
341    :END:
342 ** gpg 1.4.2 does crappy error reporting (namely none at all) when
343    :PROPERTIES:
344    :CUSTOM_ID: gpg-classic-problems-but-do-we-care
345    :END:
346    smart card is missing for sign operation:
347     [GNUPG:] CARDCTRL 4
348     gpg: selecting openpgp failed: ec=6.110
349     gpg: signing failed: general error
350     [GNUPG:] BEGIN_ENCRYPTION 2 10
351     gpg: test: sign+encrypt failed: general error
352 ** Without agent and with wrong passphrase, gpg 1.4.2 enters into an
353    :PROPERTIES:
354    :CUSTOM_ID: recursive-gpg-classic
355    :END:
356    infinite loop.
357 ** Use correct argv[0]
358    :PROPERTIES:
359    :CUSTOM_ID: correct-argv
360    :END:
361    In rungpg.c:build_argv we use
362       argv[argc] = strdup ("gpg"); /* argv[0] */
363    This should be changed to take the real file name used in account.
364
365
366 * Operations
367   :PROPERTIES:
368   :CUSTOM_ID: operations-are-not-surgical
369   :END:
370 ** Include cert values -2, -1, 0 and 1 should be defined as macros.
371    :PROPERTIES:
372    :CUSTOM_ID: certified-macros
373    :END:
374 ** If an operation failed, make sure that the result functions don't return
375    :PROPERTIES:
376    :CUSTOM_ID: operation-failure
377    :END:
378    corrupt partial information. !!!
379    NOTE: The EOF status handler is not called in this case !!!
380 ** Verify must not fail on NODATA premature if auto-key-retrieval failed.
381    :PROPERTIES:
382    :CUSTOM_ID: autobot-key-retrieval
383    :END:
384    It should not fail silently if it knows there is an error. !!!
385 ** All operations: Better error reporting. !!
386    :PROPERTIES:
387    :CUSTOM_ID: better-reporting-not-like-fox-news
388    :END:
389 ** Export status handler need much more work. !!!
390    :PROPERTIES:
391    :CUSTOM_ID: export-status-handler
392    :END:
393 ** Import should return a useful error when one happened.
394    :PROPERTIES:
395    :CUSTOM_ID: import-useful-stuff-even-wrong-stuff
396    :END:
397 *** Import does not take notice of NODATA status report.
398     :PROPERTIES:
399     :CUSTOM_ID: import-no-data
400     :END:
401 *** When GPGSM does issue IMPORT_OK status reports, make sure to check for
402     :PROPERTIES:
403     :CUSTOM_ID: gpgsm-import-ok
404     :END:
405     them in tests/gpgs m/t-import.c.
406 ** Verify can include info about version/algo/class, but currently
407    :PROPERTIES:
408    :CUSTOM_ID: verify-class
409    :END:
410    this is only available for gpg, not gpgsm.
411 ** Return ENC_TO output in verify result.  Again, this is not available
412    :PROPERTIES:
413    :CUSTOM_ID: return-to-enc
414    :END:
415    for gpgsm.
416 ** Genkey should return something more useful than General_Error.
417    :PROPERTIES:
418    :CUSTOM_ID: general-key-assumed-command-from-general-error
419    :END:
420 ** If possible, use --file-setsize to set the file size for proper progress
421    :PROPERTIES:
422    :CUSTOM_ID: file-setsize
423    :END:
424    callback handling.  Write data interface for file size.
425 ** Optimize the file descriptor list, so the number of open fds is
426    :PROPERTIES:
427    :CUSTOM_ID: optimus-descriptus-younger-brother-of-optimus-prime
428    :END:
429    always known easily.
430 ** Encryption: It should be verified that the behaviour for partially untrusted
431    :PROPERTIES:
432    :CUSTOM_ID: only-mostly-dead-means-partially-alive
433    :END:
434    recipients is correct.
435 ** When GPG issues INV_something for invalid signers, catch them.
436    :PROPERTIES:
437    :CUSTOM_ID: invalid-sig
438    :END:
439
440
441 * Error Values
442   :PROPERTIES:
443   :CUSTOM_ID: error-value
444   :END:
445 ** Map ASSUAN/GpgSM ERR error values in a better way than is done now. !!
446    :PROPERTIES:
447    :CUSTOM_ID: map-ass-error
448    :END:
449 ** Some error values should identify the source more correctly (mostly error
450    :PROPERTIES:
451    :CUSTOM_ID: source-errors
452    :END:
453    values derived from status messages).
454 ** In rungpg.c we need to check the version of the engine
455    :PROPERTIES:
456    :CUSTOM_ID: rungpg-c-engine-ver
457    :END:
458    This requires a way to get the cached version number from the
459    engine layer.
460
461
462 * Tests
463   :PROPERTIES:
464   :CUSTOM_ID: tests
465   :END:
466 ** TODO Write a fake gpg-agent so that we can supply known passphrases to
467    :PROPERTIES:
468    :CUSTOM_ID: test-fake-gpg-agent
469    :END:
470    gpgsm and setup the configuration files to use the agent.  Without
471    this we are testing a currently running gpg-agent which is not a
472    clever idea. !
473 ** t-data
474    :PROPERTIES:
475    :CUSTOM_ID: test-data
476    :END:
477 *** Test gpgme_data_release_and_get_mem.
478     :PROPERTIES:
479     :CUSTOM_ID: test-gpgme-data-release-mem
480     :END:
481 *** Test gpgme_data_seek for invalid types.
482     :PROPERTIES:
483     :CUSTOM_ID: test-gpgme-data-seek
484     :END:
485 ** t-keylist
486    :PROPERTIES:
487    :CUSTOM_ID: test-keylist
488    :END:
489    Write a test for ext_keylist.
490 ** Test reading key signatures.
491    :PROPERTIES:
492    :CUSTOM_ID: test-key-sig
493    :END:
494
495
496 * Debug
497   :PROPERTIES:
498   :CUSTOM_ID: 
499   :END:
500 ** Tracepoints should be added at: Every public interface enter/leave,
501    :PROPERTIES:
502    :CUSTOM_ID: tracepoint-pub-int
503    :END:
504    before and in every callback, at major decision points, at every
505    internal data point which might easily be observed by the outside
506    (system handles).  We also trace handles and I/O support threads in
507    the w32 implementation because that's fragile code.
508    Files left to do:
509    data-fd.c data-mem.c data-stream.c data-user.c debug.c rungpg.c
510    engine.c engine-gpgsm.c funopen.c w32-glib-io.c wait.c
511    wait-global.c wait-private.c wait-user.c op-support.c decrypt.c
512    decrypt-verify.c delete.c edit.c encrypt.c encrypt-sign.c export.c
513    genkey.c import.c key.c keylist.c passphrase.c progress.c signers.c
514    sig-notation.c trust-item.c trustlist.c verify.c
515 ** TODO Handle malloc and vasprintf errors.  But decide first if they should be
516    :PROPERTIES:
517    :CUSTOM_ID: malloc-vasprintf
518    :END:
519
520    ignored (and logged with 255?!), or really be assertions. !
521
522
523 * Build suite
524   :PROPERTIES:
525   :CUSTOM_ID: 
526   :END:
527 ** TODO Make sure everything is cleaned correctly (esp. test area).
528    :PROPERTIES:
529    :CUSTOM_ID: clean-tests
530    :END:
531 ** TODO Enable AC_CONFIG_MACRO_DIR and bump up autoconf version requirement.
532    :PROPERTIES:
533    :CUSTOM_ID: autoconf-macros
534    :END:
535    (To fix "./autogen.sh; ./configure --enable-maintainer-mode; touch
536    configure.ac; make").  Currently worked around with ACLOCAL_AMFLAGS???
537
538
539 * Error checking 
540   :PROPERTIES:
541   :CUSTOM_ID: error-checking
542   :END:
543 ** TODO engine-gpgsm, with-validation
544    :PROPERTIES:
545    :CUSTOM_ID: gpgsm-validation
546    :END:
547    Add error checking some time after releasing a new gpgsm.
548
549
550 * Language bindings and related components
551   :PROPERTIES:
552   :CUSTOM_ID: language-bindings-and-related-stuff
553   :END:
554
555 ** TODO Emacs and elisp binding
556    :PROPERTIES:
557    :CUSTOM_ID: emacs-and-elisp
558    :END:
559
560    Currently GNU Emacs uses EPA and EPG to provide GnuPG support.  EPG
561    does this by calling the GPG executable and wrapping the commands
562    with elisp functions.  A more preferable solution would be to
563    implement an epgme.el which integrated with GPGME, then if it could
564    not to attempt calling the gpgme-tool and only if those failed to
565    fall back to the current epg.el and calling the command line
566    binaries.
567
568 ** TODO API of an API
569    :PROPERTIES:
570    :CUSTOM_ID: api-squared
571    :END:
572
573    See the more detailed notes on this in the [[lang/python/docs/TODO.org][python TODO]].
574
575 ** TODO GPGME installation and package management guide
576    :PROPERTIES:
577    :CUSTOM_ID: package-management
578    :END:
579
580    Write a guide/best practices for maintainers of GPGME packages with
581    third party package management systems.
582
583 Copyright 2004, 2005, 2018 g10 Code GmbH
584
585 This file is free software; as a special exception the author gives
586 unlimited permission to copy and/or distribute it, with or without
587 modifications, as long as this notice is preserved.
588
589 This file is distributed in the hope that it will be useful, but
590 WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
591 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
592 PURPOSE.