New stuff
[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: 
162   :END:
163 ** When GNU Pth supports sendmsg/recvmsg, wrap them properly.
164    :PROPERTIES:
165    :CUSTOM_ID: 
166    :END:
167 ** Without timegm (3) support our ISO time parser is not thread safe.
168    :PROPERTIES:
169    :CUSTOM_ID: 
170    :END:
171    There is a configure time warning, though.
172
173 * New features:
174   :PROPERTIES:
175   :CUSTOM_ID: 
176   :END:
177 ** Flow control for data objects.
178    :PROPERTIES:
179    :CUSTOM_ID: 
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: 
192    :END:
193    notation data, provide a user interface for that.
194 ** notification system
195    :PROPERTIES:
196    :CUSTOM_ID: 
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: 
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: 
219    :END:
220 ** Implement support for photo ids.
221    :PROPERTIES:
222    :CUSTOM_ID: 
223    :END:
224 ** Allow selection of subkeys
225    :PROPERTIES:
226    :CUSTOM_ID: 
227    :END:
228 ** Allow to return time stamps in ISO format
229    :PROPERTIES:
230    :CUSTOM_ID: 
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: 
237    :END:
238    later consideration:
239 *** Allow to export secret keys.
240     :PROPERTIES:
241     :CUSTOM_ID: 
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: 
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: 
256     :END:
257 *** Exchanging keys with key servers.
258     :PROPERTIES:
259     :CUSTOM_ID: 
260     :END:
261
262
263 * Documentation
264   :PROPERTIES:
265   :CUSTOM_ID: 
266   :END:
267 ** Document validity and trust issues.
268    :PROPERTIES:
269    :CUSTOM_ID: 
270    :END:
271 ** In gpgme.texi: Register callbacks under the right letter in the index.
272    :PROPERTIES:
273    :CUSTOM_ID: 
274    :END:
275
276
277 * Engines
278   :PROPERTIES:
279   :CUSTOM_ID: 
280   :END:
281 ** Do not create/destroy engines, but create engine and then reset it.
282    :PROPERTIES:
283    :CUSTOM_ID: 
284    :END:
285    Internally the reset operation still spawns a new engine process,
286    but this can be replaced with a reset later.  Also, be very sure to
287    release everything properly at a reset and at an error.  Think hard
288    about where to guarantee what (ie, what happens if start fails, are
289    the fds unregistered immediately - i think so?)
290    Note that we need support in gpgsm to set include-certs to default
291    as RESET does not reset it, also for no_encrypt_to and probably
292    other options.
293 ** Optimize the case where a data object has an underlying fd we can pass
294    :PROPERTIES:
295    :CUSTOM_ID: 
296    :END:
297    directly to the engine.  This will be automatic with socket I/O and
298    descriptor passing.
299 ** Move code common to all engines up from gpg to engine.
300    :PROPERTIES:
301    :CUSTOM_ID: 
302    :END:
303 ** engine operations can return General Error on unknown protocol
304    :PROPERTIES:
305    :CUSTOM_ID: 
306    :END:
307    (it's an internal error, as select_protocol checks already).
308 ** When server mode is implemented properly, more care has to be taken to
309    :PROPERTIES:
310    :CUSTOM_ID: 
311    :END:
312    release all resources on error (for example to free assuan_cmd).
313 ** op_import_keys and op_export_keys have a limit ion the number of keys.
314    :PROPERTIES:
315    :CUSTOM_ID: 
316    :END:
317    This is because we pass them in gpg via the command line and gpgsm
318    via an assuan control line.  We should pipe them instead and maybe
319    change gpg/gpgsm to not put them in memory.
320
321
322 * GPG breakage:
323   :PROPERTIES:
324   :CUSTOM_ID: 
325   :END:
326 ** gpg 1.4.2 lacks error reporting if sign/encrypt with revoked key.
327    :PROPERTIES:
328    :CUSTOM_ID: 
329    :END:
330 ** gpg 1.4.2 does crappy error reporting (namely none at all) when
331    :PROPERTIES:
332    :CUSTOM_ID: 
333    :END:
334    smart card is missing for sign operation:
335     [GNUPG:] CARDCTRL 4
336     gpg: selecting openpgp failed: ec=6.110
337     gpg: signing failed: general error
338     [GNUPG:] BEGIN_ENCRYPTION 2 10
339     gpg: test: sign+encrypt failed: general error
340 ** Without agent and with wrong passphrase, gpg 1.4.2 enters into an
341    :PROPERTIES:
342    :CUSTOM_ID: 
343    :END:
344    infinite loop.
345 ** Use correct argv[0]
346    :PROPERTIES:
347    :CUSTOM_ID: 
348    :END:
349    In rungpg.c:build_argv we use
350       argv[argc] = strdup ("gpg"); /* argv[0] */
351    This should be changed to take the real file name used in account.
352
353
354 * Operations
355   :PROPERTIES:
356   :CUSTOM_ID: 
357   :END:
358 ** Include cert values -2, -1, 0 and 1 should be defined as macros.
359    :PROPERTIES:
360    :CUSTOM_ID: 
361    :END:
362 ** If an operation failed, make sure that the result functions don't return
363    :PROPERTIES:
364    :CUSTOM_ID: 
365    :END:
366    corrupt partial information. !!!
367    NOTE: The EOF status handler is not called in this case !!!
368 ** Verify must not fail on NODATA premature if auto-key-retrieval failed.
369    :PROPERTIES:
370    :CUSTOM_ID: 
371    :END:
372    It should not fail silently if it knows there is an error. !!!
373 ** All operations: Better error reporting. !!
374    :PROPERTIES:
375    :CUSTOM_ID: 
376    :END:
377 ** Export status handler need much more work. !!!
378    :PROPERTIES:
379    :CUSTOM_ID: 
380    :END:
381 ** Import should return a useful error when one happened.
382    :PROPERTIES:
383    :CUSTOM_ID: 
384    :END:
385 *** Import does not take notice of NODATA status report.
386     :PROPERTIES:
387     :CUSTOM_ID: 
388     :END:
389 *** When GPGSM does issue IMPORT_OK status reports, make sure to check for
390     :PROPERTIES:
391     :CUSTOM_ID: 
392     :END:
393     them in tests/gpgs m/t-import.c.
394 ** Verify can include info about version/algo/class, but currently
395    :PROPERTIES:
396    :CUSTOM_ID: 
397    :END:
398    this is only available for gpg, not gpgsm.
399 ** Return ENC_TO output in verify result.  Again, this is not available
400    :PROPERTIES:
401    :CUSTOM_ID: 
402    :END:
403    for gpgsm.
404 ** Genkey should return something more useful than General_Error.
405    :PROPERTIES:
406    :CUSTOM_ID: 
407    :END:
408 ** If possible, use --file-setsize to set the file size for proper progress
409    :PROPERTIES:
410    :CUSTOM_ID: 
411    :END:
412    callback handling.  Write data interface for file size.
413 ** Optimize the file descriptor list, so the number of open fds is
414    :PROPERTIES:
415    :CUSTOM_ID: 
416    :END:
417    always known easily.
418 ** Encryption: It should be verified that the behaviour for partially untrusted
419    :PROPERTIES:
420    :CUSTOM_ID: 
421    :END:
422    recipients is correct.
423 ** When GPG issues INV_something for invalid signers, catch them.
424    :PROPERTIES:
425    :CUSTOM_ID: 
426    :END:
427
428
429 * Error Values
430   :PROPERTIES:
431   :CUSTOM_ID: 
432   :END:
433 ** Map ASSUAN/GpgSM ERR error values in a better way than is done now. !!
434    :PROPERTIES:
435    :CUSTOM_ID: 
436    :END:
437 ** Some error values should identify the source more correctly (mostly error
438    :PROPERTIES:
439    :CUSTOM_ID: 
440    :END:
441    values derived from status messages).
442 ** In rungpg.c we need to check the version of the engine
443    :PROPERTIES:
444    :CUSTOM_ID: 
445    :END:
446    This requires a way to get the cached version number from the
447    engine layer.
448
449
450 * Tests
451   :PROPERTIES:
452   :CUSTOM_ID: 
453   :END:
454 ** Write a fake gpg-agent so that we can supply known passphrases to
455    :PROPERTIES:
456    :CUSTOM_ID: 
457    :END:
458    gpgsm and setup the configuration files to use the agent.  Without
459    this we are testing a currently running gpg-agent which is not a
460    clever idea. !
461 ** t-data
462    :PROPERTIES:
463    :CUSTOM_ID: 
464    :END:
465 *** Test gpgme_data_release_and_get_mem.
466     :PROPERTIES:
467     :CUSTOM_ID: 
468     :END:
469 *** Test gpgme_data_seek for invalid types.
470     :PROPERTIES:
471     :CUSTOM_ID: 
472     :END:
473 ** t-keylist
474    :PROPERTIES:
475    :CUSTOM_ID: 
476    :END:
477    Write a test for ext_keylist.
478 ** Test reading key signatures.
479    :PROPERTIES:
480    :CUSTOM_ID: 
481    :END:
482
483
484 * Debug
485   :PROPERTIES:
486   :CUSTOM_ID: 
487   :END:
488 ** Tracepoints should be added at: Every public interface enter/leave,
489    :PROPERTIES:
490    :CUSTOM_ID: 
491    :END:
492    before and in every callback, at major decision points, at every
493    internal data point which might easily be observed by the outside
494    (system handles).  We also trace handles and I/O support threads in
495    the w32 implementation because that's fragile code.
496    Files left to do:
497    data-fd.c data-mem.c data-stream.c data-user.c debug.c rungpg.c
498    engine.c engine-gpgsm.c funopen.c w32-glib-io.c wait.c
499    wait-global.c wait-private.c wait-user.c op-support.c decrypt.c
500    decrypt-verify.c delete.c edit.c encrypt.c encrypt-sign.c export.c
501    genkey.c import.c key.c keylist.c passphrase.c progress.c signers.c
502    sig-notation.c trust-item.c trustlist.c verify.c
503 ** Handle malloc and vasprintf errors.  But decide first if they should be
504    :PROPERTIES:
505    :CUSTOM_ID: 
506    :END:
507    ignored (and logged with 255?!), or really be assertions. !
508
509
510 * Build suite
511   :PROPERTIES:
512   :CUSTOM_ID: 
513   :END:
514 ** Make sure everything is cleaned correctly (esp. test area).
515    :PROPERTIES:
516    :CUSTOM_ID: 
517    :END:
518 ** Enable AC_CONFIG_MACRO_DIR and bump up autoconf version requirement.
519    :PROPERTIES:
520    :CUSTOM_ID: 
521    :END:
522    (To fix "./autogen.sh; ./configure --enable-maintainer-mode; touch
523    configure.ac; make").  Currently worked around with ACLOCAL_AMFLAGS???
524
525
526 * Error checking 
527   :PROPERTIES:
528   :CUSTOM_ID: 
529   :END:
530 ** engine-gpgsm, with-validation
531    :PROPERTIES:
532    :CUSTOM_ID: 
533    :END:
534    Add error checking some time after releasing a new gpgsm.
535
536
537 * Language bindings and related components
538   :PROPERTIES:
539   :CUSTOM_ID: language-bindings-and-related-stuff
540   :END:
541
542 ** TODO Emacs and elisp binding
543    :PROPERTIES:
544    :CUSTOM_ID: emacs-and-elisp
545    :END:
546
547    Currently GNU Emacs uses EPA and EPG to provide GnuPG support.  EPG
548    does this by calling the GPG executable and wrapping the commands
549    with elisp functions.  A more preferable solution would be to
550    implement an epgme.el which integrated with GPGME, then if it could
551    not to attempt calling the gpgme-tool and only if those failed to
552    fall back to the current epg.el and calling the command line
553    binaries.
554
555 ** TODO API of an API
556    :PROPERTIES:
557    :CUSTOM_ID: api-squared
558    :END:
559
560    See the more detailed notes on this in the [[lang/python/docs/TODO.org][python TODO]].
561
562
563 Copyright 2004, 2005, 2018 g10 Code GmbH
564
565 This file is free software; as a special exception the author gives
566 unlimited permission to copy and/or distribute it, with or without
567 modifications, as long as this notice is preserved.
568
569 This file is distributed in the hope that it will be useful, but
570 WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
571 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
572 PURPOSE.