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