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 ** 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
276
277 * Engines
278   :PROPERTIES:
279   :CUSTOM_ID: engines
280   :END:
281 ** Do not create/destroy engines, but create engine and then reset it.
282    :PROPERTIES:
283    :CUSTOM_ID: reset-engine-is-not-quite-just-ignition
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: optimus-data-cousin-of-optimus-prime
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: move-code-common-to-engines-out-of-gpg
302    :END:
303 ** engine operations can return General Error on unknown protocol
304    :PROPERTIES:
305    :CUSTOM_ID: general-error-looking-to-be-court-martialled
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: server-mode
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 in the number of keys.
314    :PROPERTIES:
315    :CUSTOM_ID: import-export-problems
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: gpg-breakage
325   :END:
326 ** gpg 1.4.2 lacks error reporting if sign/encrypt with revoked key.
327    :PROPERTIES:
328    :CUSTOM_ID: gpg-classic-lacks-stuff
329    :END:
330 ** gpg 1.4.2 does crappy error reporting (namely none at all) when
331    :PROPERTIES:
332    :CUSTOM_ID: gpg-classic-problems-but-do-we-care
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: recursive-gpg-classic
343    :END:
344    infinite loop.
345 ** Use correct argv[0]
346    :PROPERTIES:
347    :CUSTOM_ID: correct-argv
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: operations-are-not-surgical
357   :END:
358 ** Include cert values -2, -1, 0 and 1 should be defined as macros.
359    :PROPERTIES:
360    :CUSTOM_ID: certified-macros
361    :END:
362 ** If an operation failed, make sure that the result functions don't return
363    :PROPERTIES:
364    :CUSTOM_ID: operation-failure
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: autobot-key-retrieval
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: better-reporting-not-like-fox-news
376    :END:
377 ** Export status handler need much more work. !!!
378    :PROPERTIES:
379    :CUSTOM_ID: export-status-handler
380    :END:
381 ** Import should return a useful error when one happened.
382    :PROPERTIES:
383    :CUSTOM_ID: import-useful-stuff-even-wrong-stuff
384    :END:
385 *** Import does not take notice of NODATA status report.
386     :PROPERTIES:
387     :CUSTOM_ID: import-no-data
388     :END:
389 *** When GPGSM does issue IMPORT_OK status reports, make sure to check for
390     :PROPERTIES:
391     :CUSTOM_ID: gpgsm-import-ok
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: verify-class
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: return-to-enc
402    :END:
403    for gpgsm.
404 ** Genkey should return something more useful than General_Error.
405    :PROPERTIES:
406    :CUSTOM_ID: general-key-assumed-command-from-general-error
407    :END:
408 ** If possible, use --file-setsize to set the file size for proper progress
409    :PROPERTIES:
410    :CUSTOM_ID: file-setsize
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: optimus-descriptus-younger-brother-of-optimus-prime
416    :END:
417    always known easily.
418 ** Encryption: It should be verified that the behaviour for partially untrusted
419    :PROPERTIES:
420    :CUSTOM_ID: only-mostly-dead-means-partially-alive
421    :END:
422    recipients is correct.
423 ** When GPG issues INV_something for invalid signers, catch them.
424    :PROPERTIES:
425    :CUSTOM_ID: invalid-sig
426    :END:
427
428
429 * Error Values
430   :PROPERTIES:
431   :CUSTOM_ID: error-value
432   :END:
433 ** Map ASSUAN/GpgSM ERR error values in a better way than is done now. !!
434    :PROPERTIES:
435    :CUSTOM_ID: map-ass-error
436    :END:
437 ** Some error values should identify the source more correctly (mostly error
438    :PROPERTIES:
439    :CUSTOM_ID: source-errors
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: rungpg-c-engine-ver
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: tests
453   :END:
454 ** TODO Write a fake gpg-agent so that we can supply known passphrases to
455    :PROPERTIES:
456    :CUSTOM_ID: test-fake-gpg-agent
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: test-data
464    :END:
465 *** Test gpgme_data_release_and_get_mem.
466     :PROPERTIES:
467     :CUSTOM_ID: test-gpgme-data-release-mem
468     :END:
469 *** Test gpgme_data_seek for invalid types.
470     :PROPERTIES:
471     :CUSTOM_ID: test-gpgme-data-seek
472     :END:
473 ** t-keylist
474    :PROPERTIES:
475    :CUSTOM_ID: test-keylist
476    :END:
477    Write a test for ext_keylist.
478 ** Test reading key signatures.
479    :PROPERTIES:
480    :CUSTOM_ID: test-key-sig
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: tracepoint-pub-int
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 ** TODO Handle malloc and vasprintf errors.  But decide first if they should be
504    :PROPERTIES:
505    :CUSTOM_ID: malloc-vasprintf
506    :END:
507
508    ignored (and logged with 255?!), or really be assertions. !
509
510
511 * Build suite
512   :PROPERTIES:
513   :CUSTOM_ID: 
514   :END:
515 ** TODO Make sure everything is cleaned correctly (esp. test area).
516    :PROPERTIES:
517    :CUSTOM_ID: clean-tests
518    :END:
519 ** TODO Enable AC_CONFIG_MACRO_DIR and bump up autoconf version requirement.
520    :PROPERTIES:
521    :CUSTOM_ID: autoconf-macros
522    :END:
523    (To fix "./autogen.sh; ./configure --enable-maintainer-mode; touch
524    configure.ac; make").  Currently worked around with ACLOCAL_AMFLAGS???
525
526
527 * Error checking 
528   :PROPERTIES:
529   :CUSTOM_ID: error-checking
530   :END:
531 ** TODO engine-gpgsm, with-validation
532    :PROPERTIES:
533    :CUSTOM_ID: gpgsm-validation
534    :END:
535    Add error checking some time after releasing a new gpgsm.
536
537
538 * Language bindings and related components
539   :PROPERTIES:
540   :CUSTOM_ID: language-bindings-and-related-stuff
541   :END:
542
543 ** TODO Emacs and elisp binding
544    :PROPERTIES:
545    :CUSTOM_ID: emacs-and-elisp
546    :END:
547
548    Currently GNU Emacs uses EPA and EPG to provide GnuPG support.  EPG
549    does this by calling the GPG executable and wrapping the commands
550    with elisp functions.  A more preferable solution would be to
551    implement an epgme.el which integrated with GPGME, then if it could
552    not to attempt calling the gpgme-tool and only if those failed to
553    fall back to the current epg.el and calling the command line
554    binaries.
555
556 ** TODO API of an API
557    :PROPERTIES:
558    :CUSTOM_ID: api-squared
559    :END:
560
561    See the more detailed notes on this in the [[lang/python/docs/TODO.org][python TODO]].
562
563 ** TODO GPGME installation and package management guide
564    :PROPERTIES:
565    :CUSTOM_ID: package-management
566    :END:
567
568    Write a guide/best practices for maintainers of GPGME packages with
569    third party package management systems.
570
571 Copyright 2004, 2005, 2018 g10 Code GmbH
572
573 This file is free software; as a special exception the author gives
574 unlimited permission to copy and/or distribute it, with or without
575 modifications, as long as this notice is preserved.
576
577 This file is distributed in the hope that it will be useful, but
578 WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
579 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
580 PURPOSE.