From cvs at cvs.gnupg.org Sun Jan 1 00:10:55 2017 From: cvs at cvs.gnupg.org (by Ben Kibbey) Date: Sun, 01 Jan 2017 00:10:55 +0100 Subject: [git] GPGME - branch, master, updated. gpgme-1.8.0-17-ga4b9f1a Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, master has been updated via a4b9f1a2b404fd8627d5ac567617510abd55d980 (commit) from d83b8f0dc84d6cf7fe2e091bd1b103ceedfa3d6c (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit a4b9f1a2b404fd8627d5ac567617510abd55d980 Author: Ben Kibbey Date: Sat Dec 31 18:09:49 2016 -0500 Fix gpg_addkey() to work with GPGME_CREATE_NOPASSWD as well. * src/engine-gpg.c (gpg_addkey): Pass --batch to gpg when GPGME_CREATE_NOPASSWD is set to fix pinentry without loopback mode. -- Signed-off-by: Ben Kibbey diff --git a/src/engine-gpg.c b/src/engine-gpg.c index 1b0e4c9..75ba4bd 100644 --- a/src/engine-gpg.c +++ b/src/engine-gpg.c @@ -2176,6 +2176,8 @@ gpg_addkey (engine_gpg_t gpg, err = add_arg (gpg, "--passphrase"); if (!err) err = add_arg (gpg, ""); + if (!err) + err = add_arg (gpg, "--batch"); } if (!err) err = add_arg (gpg, "--"); ----------------------------------------------------------------------- Summary of changes: src/engine-gpg.c | 2 ++ 1 file changed, 2 insertions(+) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Mon Jan 2 10:05:49 2017 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Mon, 02 Jan 2017 10:05:49 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-19-gb200e63 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via b200e636ab20d2aa93d9f71f3789db5a04af0a56 (commit) from 337690441fcb19343fe56b139f5649bed7d25c83 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit b200e636ab20d2aa93d9f71f3789db5a04af0a56 Author: Werner Koch Date: Mon Jan 2 10:00:33 2017 +0100 dirmngr: Strip root zone suffix from libdns cname results. * dirmngr/dns-stuff.c (resolve_name_libdns): Strip trailing dot. (get_dns_cname_libdns): Ditto. -- Signed-off-by: Werner Koch diff --git a/dirmngr/dns-stuff.c b/dirmngr/dns-stuff.c index a31b073..f2e1df9 100644 --- a/dirmngr/dns-stuff.c +++ b/dirmngr/dns-stuff.c @@ -732,6 +732,10 @@ resolve_name_libdns (const char *name, unsigned short port, err = gpg_error_from_syserror (); goto leave; } + /* Libdns appends the root zone part which is problematic + * for most other functions - strip it. */ + if (**r_canonname && (*r_canonname)[strlen (*r_canonname)-1] == '.') + (*r_canonname)[strlen (*r_canonname)-1] = 0; } dai = xtrymalloc (sizeof *dai + ent->ai_addrlen -1); @@ -1899,6 +1903,13 @@ get_dns_cname_libdns (const char *name, char **r_cname) *r_cname = xtrystrdup (cname.host); if (!*r_cname) err = gpg_error_from_syserror (); + else + { + /* Libdns appends the root zone part which is problematic + * for most other functions - strip it. */ + if (**r_cname && (*r_cname)[strlen (*r_cname)-1] == '.') + (*r_cname)[strlen (*r_cname)-1] = 0; + } leave: dns_free (ans); ----------------------------------------------------------------------- Summary of changes: dirmngr/dns-stuff.c | 11 +++++++++++ 1 file changed, 11 insertions(+) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Mon Jan 2 10:43:20 2017 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Mon, 02 Jan 2017 10:43:20 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-20-g5a4a109 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 5a4a109354d53cf3673d0636731c67021d3f367a (commit) from b200e636ab20d2aa93d9f71f3789db5a04af0a56 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 5a4a109354d53cf3673d0636731c67021d3f367a Author: Werner Koch Date: Mon Jan 2 10:39:59 2017 +0100 doc: Remove warning that DNS is not routed via Tor -- Signed-off-by: Werner Koch diff --git a/doc/dirmngr.texi b/doc/dirmngr.texi index 5b4e68b..e136dff 100644 --- a/doc/dirmngr.texi +++ b/doc/dirmngr.texi @@ -239,10 +239,8 @@ useful for debugging. @item --use-tor @opindex use-tor This option switches Dirmngr and thus GnuPG into ``Tor mode'' to route -all network access via Tor (an anonymity network). WARNING: As of now -this still leaks the DNS queries; e.g. to lookup the hosts in a -keyserver pool. Certain other features are disabled if this mode is -active. +all network access via Tor (an anonymity network). Certain other +features are disabled if this mode is active. @item --standard-resolver @opindex standard-resolver ----------------------------------------------------------------------- Summary of changes: doc/dirmngr.texi | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Mon Jan 2 12:53:37 2017 From: cvs at cvs.gnupg.org (by Justus Winter) Date: Mon, 02 Jan 2017 12:53:37 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-23-gb0e14bd Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via b0e14bd6ff8401b12b2b39f75aef94d3ad28017f (commit) via b79274a3b7e58f88e9a8c1dc1fb24dd3e983543c (commit) via e8b843508dac96e9d0a3140954dd5a3618669cec (commit) from 5a4a109354d53cf3673d0636731c67021d3f367a (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit b0e14bd6ff8401b12b2b39f75aef94d3ad28017f Author: Justus Winter Date: Thu Dec 22 15:48:07 2016 +0100 gpgscm: Fail if too many arguments are given. * tests/gpgscm/scheme.c (opexe_0): Enable check. * tests/gpgscm/tests.scm (test::report): Remove superfluous argument. Signed-off-by: Justus Winter diff --git a/tests/gpgscm/scheme.c b/tests/gpgscm/scheme.c index 7cd5217..c4725db 100644 --- a/tests/gpgscm/scheme.c +++ b/tests/gpgscm/scheme.c @@ -3364,11 +3364,9 @@ static pointer opexe_0(scheme *sc, enum scheme_opcodes op) { } } if (x == sc->NIL) { - /*-- - * if (y != sc->NIL) { - * Error_0(sc,"too many arguments"); - * } - */ + if (y != sc->NIL) { + Error_0(sc, "too many arguments"); + } } else if (is_symbol(x)) new_slot_in_env(sc, x, y); else { diff --git a/tests/gpgscm/tests.scm b/tests/gpgscm/tests.scm index 5954704..e5858d9 100644 --- a/tests/gpgscm/tests.scm +++ b/tests/gpgscm/tests.scm @@ -610,7 +610,7 @@ (seek logfd 0 SEEK_SET) (splice logfd STDERR_FILENO) (close logfd)) - (echo (string-append (status retcode) ":") name)))))) + (echo (string-append (status) ":") name)))))) ;; Run the setup target to create an environment, then run all given ;; tests in parallel. commit b79274a3b7e58f88e9a8c1dc1fb24dd3e983543c Author: Justus Winter Date: Thu Dec 22 14:42:50 2016 +0100 gpgscm: Add 'finally', rework all macros. * tests/gpgscm/init.scm (finally): New macro. * tests/gpgscm/tests.scm (letfd): Rewrite. (with-working-directory): Likewise. (with-temporary-working-directory): Likewise. (lettmp): Likewise. -- Rewrite all our macros using 'define-macro'. Use the new control flow mechanism 'finally', or 'dynamic-wind' where appropriate. Make sure the macros are hygienic. Reduce code duplication. Signed-off-by: Justus Winter diff --git a/tests/gpgscm/init.scm b/tests/gpgscm/init.scm index 106afd5..83261b0 100644 --- a/tests/gpgscm/init.scm +++ b/tests/gpgscm/init.scm @@ -569,6 +569,16 @@ ; the thrown exception is bound to *error*. Errors can be rethrown ; using (rethrow *error*). ; +; Finalization can be expressed using "finally": +; +; (finally (finalize-something called-purely-for side-effects) +; (whether-or-not something goes-wrong) +; (with-these calls)) +; +; The final expression is executed purely for its side-effects, +; both when the function exits successfully, and when an exception +; is thrown. +; ; Exceptions are thrown with: ; ; (throw "message") @@ -622,6 +632,13 @@ (pop-handler) ,label))))) +(define-macro (finally final-expression . expressions) + (let ((result (gensym))) + `(let ((,result (catch (begin ,final-expression (rethrow *error*)) + , at expressions))) + ,final-expression + ,result))) + ;; Make the vm use throw'. (define *error-hook* throw') diff --git a/tests/gpgscm/tests.scm b/tests/gpgscm/tests.scm index f127a93..5954704 100644 --- a/tests/gpgscm/tests.scm +++ b/tests/gpgscm/tests.scm @@ -244,27 +244,26 @@ ;; ;; Bind all variables given in and initialize each of them ;; to the given initial value, and close them after evaluting . -(macro (letfd form) - (let ((result-sym (gensym))) - `((lambda (,(caaadr form)) - (let ((,result-sym - ,(if (= 1 (length (cadr form))) - `(catch (begin (close ,(caaadr form)) - (rethrow *error*)) - ,@(cddr form)) - `(letfd ,(cdadr form) ,@(cddr form))))) - (close ,(caaadr form)) - ,result-sym)) ,@(cdaadr form)))) - -(macro (with-working-directory form) - (let ((result-sym (gensym)) (cwd-sym (gensym))) - `(let* ((,cwd-sym (getcwd)) - (_ (if ,(cadr form) (chdir ,(cadr form)))) - (,result-sym (catch (begin (chdir ,cwd-sym) - (rethrow *error*)) - ,@(cddr form)))) - (chdir ,cwd-sym) - ,result-sym))) +(define-macro (letfd bindings . body) + (let bind ((bindings' bindings)) + (if (null? bindings') + `(begin , at body) + (let* ((binding (car bindings')) + (name (car binding)) + (initializer (cadr binding))) + `(let ((,name ,initializer)) + (finally (close ,name) + ,(bind (cdr bindings')))))))) + +(define-macro (with-working-directory new-directory . expressions) + (let ((new-dir (gensym)) + (old-dir (gensym))) + `(let* ((,new-dir ,new-directory) + (,old-dir (getcwd))) + (dynamic-wind + (lambda () (if ,new-dir (chdir ,new-dir))) + (lambda () , at expressions) + (lambda () (chdir ,old-dir)))))) ;; Make a temporary directory. If arguments are given, they are ;; joined using path-join, and must end in a component ending in @@ -278,18 +277,12 @@ "-XXXXXX")) (apply path-join components)))) -(macro (with-temporary-working-directory form) - (let ((result-sym (gensym)) (cwd-sym (gensym)) (tmp-sym (gensym))) - `(let* ((,cwd-sym (getcwd)) - (,tmp-sym (mkdtemp)) - (_ (chdir ,tmp-sym)) - (,result-sym (catch (begin (chdir ,cwd-sym) - (unlink-recursively ,tmp-sym) - (rethrow *error*)) - ,@(cdr form)))) - (chdir ,cwd-sym) - (unlink-recursively ,tmp-sym) - ,result-sym))) +(define-macro (with-temporary-working-directory . expressions) + (let ((tmp-sym (gensym))) + `(let* ((,tmp-sym (mkdtemp))) + (finally (unlink-recursively ,tmp-sym) + (with-working-directory ,tmp-sym + , at expressions))))) (define (make-temporary-file . args) (canonical-path (path-join @@ -310,17 +303,15 @@ ;; Bind all variables given in , initialize each of them to ;; a string representing an unique path in the filesystem, and delete ;; them after evaluting . -(macro (lettmp form) - (let ((result-sym (gensym))) - `((lambda (,(caadr form)) - (let ((,result-sym - ,(if (= 1 (length (cadr form))) - `(catch (begin (remove-temporary-file ,(caadr form)) - (rethrow *error*)) - ,@(cddr form)) - `(lettmp ,(cdadr form) ,@(cddr form))))) - (remove-temporary-file ,(caadr form)) - ,result-sym)) (make-temporary-file ,(symbol->string (caadr form)))))) +(define-macro (lettmp bindings . body) + (let bind ((bindings' bindings)) + (if (null? bindings') + `(begin , at body) + (let ((name (car bindings')) + (rest (cdr bindings'))) + `(let ((,name (make-temporary-file ,(symbol->string name)))) + (finally (remove-temporary-file ,name) + ,(bind rest))))))) (define (check-execution source transformer) (lettmp (sink) commit e8b843508dac96e9d0a3140954dd5a3618669cec Author: Justus Winter Date: Thu Dec 22 10:36:56 2016 +0100 gpgscm: Use boxed values for source locations. * tests/gpgscm/scheme-private.h (struct port): Use boxed values for filename and current line. This allows us to use the same Scheme object for labeling all expressions in a file. * tests/gpgscm/scheme.c (file_push): Use boxed type for filename. (mark): Mark location objects of port objects. (gc): Mark location objects in the load stack. (port_clear_location): New function. (port_reset_current_line): Likewise. (port_increment_current_line): Likewise. (file_pop): Adapt accordingly. (port_rep_from_filename): Likewise. (port_rep_from_file): Likewise. (port_close): Likewise. (skipspace): Likewise. (token): Likewise. (_Error_1): Likewise. (opexe_0): Likewise. (opexe_5): Likewise. (scheme_deinit): Likewise. (scheme_load_file): Likewise. (scheme_load_named_file): Likewise. Signed-off-by: Justus Winter diff --git a/tests/gpgscm/scheme-private.h b/tests/gpgscm/scheme-private.h index 7f19a6e..aba2319 100644 --- a/tests/gpgscm/scheme-private.h +++ b/tests/gpgscm/scheme-private.h @@ -28,8 +28,8 @@ typedef struct port { FILE *file; int closeit; #if SHOW_ERROR_LINE - int curr_line; - char *filename; + pointer curr_line; + pointer filename; #endif } stdio; struct { diff --git a/tests/gpgscm/scheme.c b/tests/gpgscm/scheme.c index 2844545..7cd5217 100644 --- a/tests/gpgscm/scheme.c +++ b/tests/gpgscm/scheme.c @@ -377,7 +377,7 @@ static int is_ascii_name(const char *name, int *pc) { #endif -static int file_push(scheme *sc, const char *fname); +static int file_push(scheme *sc, pointer fname); static void file_pop(scheme *sc); static int file_interactive(scheme *sc); static INLINE int is_one_of(char *s, int c); @@ -1552,6 +1552,15 @@ E2: setmark(p); mark(p+1+i); } } +#if SHOW_ERROR_LINE + else if (is_port(p)) { + port *pt = p->_object._port; + if (pt->kind & port_file) { + mark(pt->rep.stdio.curr_line); + mark(pt->rep.stdio.filename); + } + } +#endif /* Mark tag if p has one. */ if (has_tag(p)) mark(p + 1); @@ -1617,6 +1626,13 @@ static void gc(scheme *sc, pointer a, pointer b) { mark(sc->save_inport); mark(sc->outport); mark(sc->loadport); + for (i = 0; i <= sc->file_i; i++) { + if (! (sc->load_stack[i].kind & port_file)) + continue; + + mark(sc->load_stack[i].rep.stdio.filename); + mark(sc->load_stack[i].rep.stdio.curr_line); + } /* Mark recent objects the interpreter doesn't know about yet. */ mark(car(sc->sink)); @@ -1678,14 +1694,39 @@ static void finalize_cell(scheme *sc, pointer a) { } } +#if SHOW_ERROR_LINE +static void +port_clear_location (scheme *sc, port *p) +{ + assert(p->kind & port_file); + p->rep.stdio.curr_line = sc->NIL; + p->rep.stdio.filename = sc->NIL; +} + +static void +port_reset_current_line (scheme *sc, port *p) +{ + assert(p->kind & port_file); + p->rep.stdio.curr_line = mk_integer(sc, 0); +} + +static void +port_increment_current_line (scheme *sc, port *p, long delta) +{ + assert(p->kind & port_file); + p->rep.stdio.curr_line = + mk_integer(sc, ivalue_unchecked(p->rep.stdio.curr_line) + delta); +} +#endif + /* ========== Routines for Reading ========== */ -static int file_push(scheme *sc, const char *fname) { +static int file_push(scheme *sc, pointer fname) { FILE *fin = NULL; if (sc->file_i == MAXFIL-1) return 0; - fin=fopen(fname,"r"); + fin = fopen(string_value(fname), "r"); if(fin!=0) { sc->file_i++; sc->load_stack[sc->file_i].kind=port_file|port_input; @@ -1695,9 +1736,8 @@ static int file_push(scheme *sc, const char *fname) { sc->loadport->_object._port=sc->load_stack+sc->file_i; #if SHOW_ERROR_LINE - sc->load_stack[sc->file_i].rep.stdio.curr_line = 0; - if(fname) - sc->load_stack[sc->file_i].rep.stdio.filename = store_string(sc, strlen(fname), fname, 0); + port_reset_current_line(sc, &sc->load_stack[sc->file_i]); + sc->load_stack[sc->file_i].rep.stdio.filename = fname; #endif } return fin!=0; @@ -1707,6 +1747,10 @@ static void file_pop(scheme *sc) { if(sc->file_i != 0) { sc->nesting=sc->nesting_stack[sc->file_i]; port_close(sc,sc->loadport,port_input); +#if SHOW_ERROR_LINE + if (sc->load_stack[sc->file_i].kind & port_file) + port_clear_location(sc, &sc->load_stack[sc->file_i]); +#endif sc->file_i--; sc->loadport->_object._port=sc->load_stack+sc->file_i; } @@ -1736,10 +1780,12 @@ static port *port_rep_from_filename(scheme *sc, const char *fn, int prop) { pt->rep.stdio.closeit=1; #if SHOW_ERROR_LINE - if(fn) - pt->rep.stdio.filename = store_string(sc, strlen(fn), fn, 0); + if (fn) + pt->rep.stdio.filename = mk_string(sc, fn); + else + pt->rep.stdio.filename = mk_string(sc, ""); - pt->rep.stdio.curr_line = 0; + port_reset_current_line(sc, pt); #endif return pt; } @@ -1764,6 +1810,10 @@ static port *port_rep_from_file(scheme *sc, FILE *f, int prop) pt->kind = port_file | prop; pt->rep.stdio.file = f; pt->rep.stdio.closeit = 0; +#if SHOW_ERROR_LINE + pt->rep.stdio.filename = mk_string(sc, ""); + port_reset_current_line(sc, pt); +#endif return pt; } @@ -1837,10 +1887,7 @@ static void port_close(scheme *sc, pointer p, int flag) { #if SHOW_ERROR_LINE /* Cleanup is here so (close-*-port) functions could work too */ - pt->rep.stdio.curr_line = 0; - - if(pt->rep.stdio.filename) - sc->free(pt->rep.stdio.filename); + port_clear_location(sc, pt); #endif fclose(pt->rep.stdio.file); @@ -2119,8 +2166,11 @@ static INLINE int skipspace(scheme *sc) { /* record it */ #if SHOW_ERROR_LINE - if (sc->load_stack[sc->file_i].kind & port_file) - sc->load_stack[sc->file_i].rep.stdio.curr_line += curr_line; + { + port *p = &sc->load_stack[sc->file_i]; + if (p->kind & port_file) + port_increment_current_line(sc, p, curr_line); + } #endif if(c!=EOF) { @@ -2160,7 +2210,7 @@ static int token(scheme *sc) { #if SHOW_ERROR_LINE if(c == '\n' && sc->load_stack[sc->file_i].kind & port_file) - sc->load_stack[sc->file_i].rep.stdio.curr_line++; + port_increment_current_line(sc, &sc->load_stack[sc->file_i], 1); #endif if(c == EOF) @@ -2188,7 +2238,7 @@ static int token(scheme *sc) { #if SHOW_ERROR_LINE if(c == '\n' && sc->load_stack[sc->file_i].kind & port_file) - sc->load_stack[sc->file_i].rep.stdio.curr_line++; + port_increment_current_line(sc, &sc->load_stack[sc->file_i], 1); #endif if(c == EOF) @@ -2691,8 +2741,8 @@ static pointer _Error_1(scheme *sc, const char *s, pointer a) { fname = string_value(car(tag)); ln = ivalue_unchecked(cdr(tag)); } else { - fname = sc->load_stack[sc->file_i].rep.stdio.filename; - ln = sc->load_stack[sc->file_i].rep.stdio.curr_line; + fname = string_value(sc->load_stack[sc->file_i].rep.stdio.filename); + ln = ivalue_unchecked(sc->load_stack[sc->file_i].rep.stdio.curr_line); } /* should never happen */ @@ -3105,7 +3155,7 @@ static pointer opexe_0(scheme *sc, enum scheme_opcodes op) { fprintf(sc->outport->_object._port->rep.stdio.file, "Loading %s\n", strvalue(car(sc->args))); } - if (!file_push(sc,strvalue(car(sc->args)))) { + if (!file_push(sc, car(sc->args))) { Error_1(sc,"unable to open", car(sc->args)); } else @@ -4839,14 +4889,13 @@ static pointer opexe_5(scheme *sc, enum scheme_opcodes op) { sc->nesting_stack[sc->file_i]++; #if USE_TAGS && SHOW_ERROR_LINE if (sc->load_stack[sc->file_i].kind & port_file) { - const char *filename = + pointer filename = sc->load_stack[sc->file_i].rep.stdio.filename; - int lineno = + pointer lineno = sc->load_stack[sc->file_i].rep.stdio.curr_line; s_save(sc, OP_TAG_VALUE, - cons(sc, mk_string(sc, filename), - cons(sc, mk_integer(sc, lineno), sc->NIL)), + cons(sc, filename, cons(sc, lineno, sc->NIL)), sc->NIL); } #endif @@ -4917,7 +4966,8 @@ static pointer opexe_5(scheme *sc, enum scheme_opcodes op) { backchar(sc,c); #if SHOW_ERROR_LINE else if (sc->load_stack[sc->file_i].kind & port_file) - sc->load_stack[sc->file_i].rep.stdio.curr_line++; + port_increment_current_line(sc, + &sc->load_stack[sc->file_i], 1); #endif sc->nesting_stack[sc->file_i]--; s_return(sc,reverse_in_place(sc, sc->NIL, sc->args)); @@ -5583,10 +5633,6 @@ void scheme_set_external_data(scheme *sc, void *p) { void scheme_deinit(scheme *sc) { int i; -#if SHOW_ERROR_LINE - char *fname; -#endif - sc->oblist=sc->NIL; sc->global_env=sc->NIL; dump_stack_free(sc); @@ -5608,6 +5654,14 @@ void scheme_deinit(scheme *sc) { typeflag(sc->loadport) = T_ATOM; } sc->loadport=sc->NIL; + +#if SHOW_ERROR_LINE + for(i=0; i<=sc->file_i; i++) { + if (sc->load_stack[i].kind & port_file) + port_clear_location(sc, &sc->load_stack[i]); + } +#endif + sc->gc_verbose=0; gc(sc,sc->NIL,sc->NIL); @@ -5619,16 +5673,6 @@ void scheme_deinit(scheme *sc) { sc->free(sc->alloc_seg[i]); } sc->free(sc->strbuff); - -#if SHOW_ERROR_LINE - for(i=0; i<=sc->file_i; i++) { - if (sc->load_stack[i].kind & port_file) { - fname = sc->load_stack[i].rep.stdio.filename; - if(fname) - sc->free(fname); - } - } -#endif } void scheme_load_file(scheme *sc, FILE *fin) @@ -5647,11 +5691,11 @@ void scheme_load_named_file(scheme *sc, FILE *fin, const char *filename) { } #if SHOW_ERROR_LINE - sc->load_stack[0].rep.stdio.curr_line = 0; + port_reset_current_line(sc, &sc->load_stack[0]); if(fin!=stdin && filename) - sc->load_stack[0].rep.stdio.filename = store_string(sc, strlen(filename), filename, 0); + sc->load_stack[0].rep.stdio.filename = mk_string(sc, filename); else - sc->load_stack[0].rep.stdio.filename = NULL; + sc->load_stack[0].rep.stdio.filename = mk_string(sc, ""); #endif sc->inport=sc->loadport; @@ -5663,8 +5707,7 @@ void scheme_load_named_file(scheme *sc, FILE *fin, const char *filename) { } #if SHOW_ERROR_LINE - sc->free(sc->load_stack[0].rep.stdio.filename); - sc->load_stack[0].rep.stdio.filename = NULL; + port_clear_location(sc, &sc->load_stack[0]); #endif } ----------------------------------------------------------------------- Summary of changes: tests/gpgscm/init.scm | 17 ++++++ tests/gpgscm/scheme-private.h | 4 +- tests/gpgscm/scheme.c | 139 +++++++++++++++++++++++++++--------------- tests/gpgscm/tests.scm | 81 +++++++++++------------- 4 files changed, 145 insertions(+), 96 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Mon Jan 2 13:34:06 2017 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Mon, 02 Jan 2017 13:34:06 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-26-g5b6ebfb Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 5b6ebfb9244602d9de31d61c7eceb0c45ac8aa49 (commit) via 6b84ecbf312d98ac8cce9fe5facdc815bc742fa1 (commit) via c52930d11fcc52515fcc09a1085bf118411566a8 (commit) from b0e14bd6ff8401b12b2b39f75aef94d3ad28017f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 5b6ebfb9244602d9de31d61c7eceb0c45ac8aa49 Author: Werner Koch Date: Mon Jan 2 13:30:37 2017 +0100 g13: Improve printing of debug infos. * g13/g13tuple.c (all_printable): Make it work. Signed-off-by: Werner Koch diff --git a/g13/g13tuple.c b/g13/g13tuple.c index f79c82d..b10ebbc 100644 --- a/g13/g13tuple.c +++ b/g13/g13tuple.c @@ -282,7 +282,7 @@ all_printable (const void *buf, size_t buflen) const unsigned char *s; for (s=buf ; buflen; s++, buflen--) - if (*s < 32 && *s > 126) + if (*s < 32 || *s > 126) return 0; return 1; } commit 6b84ecbf312d98ac8cce9fe5facdc815bc742fa1 Author: Werner Koch Date: Mon Jan 2 13:29:18 2017 +0100 Replace use of variable-length-arrays. * common/t-iobuf.c (main): Replace variable-length-array. * g10/gpgcompose.c (mksubpkt_callback): Ditto. (encrypted): Ditto. * g10/t-stutter.c (log_hexdump): Ditto. (oracle_test): Ditto. * g10/tofu.c (get_policy): Ditto. Use "%zu" for size_t. * scd/app-openpgp.c (ecc_writekey): Replace variable-length-array. Check for zero length OID_LEN. Signed-off-by: Werner Koch diff --git a/common/t-iobuf.c b/common/t-iobuf.c index 0e6f508..bdeab99 100644 --- a/common/t-iobuf.c +++ b/common/t-iobuf.c @@ -362,10 +362,12 @@ main (int argc, char *argv[]) { iobuf_t iobuf; int rc; - char *content = "0123456789"; + char content[] = "0123456789"; int n; int c; - char buffer[strlen (content)]; + char buffer[10]; + + assert (sizeof buffer == sizeof content - 1); iobuf = iobuf_temp_with_content (content, strlen (content)); assert (iobuf); diff --git a/g10/gpgcompose.c b/g10/gpgcompose.c index 512cb45..fafbfd2 100644 --- a/g10/gpgcompose.c +++ b/g10/gpgcompose.c @@ -1654,13 +1654,17 @@ mksubpkt_callback (PKT_signature *sig, void *cookie) if (si->reason_for_revocation) { - int l = 1 + strlen (si->reason_for_revocation); - char buf[l]; + int len = 1 + strlen (si->reason_for_revocation); + char *buf; + + buf = xmalloc (len); buf[0] = si->reason_for_revocation_code; - memcpy (&buf[1], si->reason_for_revocation, l - 1); + memcpy (&buf[1], si->reason_for_revocation, len - 1); + + build_sig_subpkt (sig, SIGSUBPKT_REVOC_REASON, buf, len); - build_sig_subpkt (sig, SIGSUBPKT_REVOC_REASON, buf, l); + xfree (buf); } if (si->features) @@ -2540,10 +2544,13 @@ encrypted (const char *option, int argc, char *argv[], void *cookie) if (do_debug) { - char buf[2 * session_key.keylen + 1]; + char *buf; + + buf = xmalloc (2 * session_key.keylen + 1); debug ("session key: algo: %d; keylen: %d; key: %s\n", session_key.algo, session_key.keylen, bin2hex (session_key.key, session_key.keylen, buf)); + xfree (buf); } if (strcmp (option, "--encrypted-mdc") == 0) diff --git a/g10/t-stutter.c b/g10/t-stutter.c index a2e9666..359cdf6 100644 --- a/g10/t-stutter.c +++ b/g10/t-stutter.c @@ -68,8 +68,8 @@ log_hexdump (byte *buffer, int length) { int have = length > 16 ? 16 : length; int i; - char formatted[2 * have + 1]; - char text[have + 1]; + char formatted[2 * 16 + 1]; + char text[16 + 1]; fprintf (stderr, "%-8d ", written); bin2hex (buffer, have, formatted); @@ -87,10 +87,12 @@ log_hexdump (byte *buffer, int length) } for (i = 0; i < have; i ++) - if (isprint (buffer[i])) - text[i] = buffer[i]; - else - text[i] = '.'; + { + if (isprint (buffer[i])) + text[i] = buffer[i]; + else + text[i] = '.'; + } text[i] = 0; fprintf (stderr, " "); @@ -347,8 +349,9 @@ oracle (int debug, byte *ciphertext, int len, byte **plaintextp, byte **cfbp) static int oracle_test (unsigned int d, int b, int debug) { - byte probe[blocksize + 2]; + byte probe[32 + 2]; + log_assert (blocksize + 2 <= sizeof probe); log_assert (d < 256 * 256); if (b == 1) diff --git a/g10/tofu.c b/g10/tofu.c index 2bded9e..8d535fa 100644 --- a/g10/tofu.c +++ b/g10/tofu.c @@ -2457,16 +2457,16 @@ get_policy (tofu_dbs_t dbs, PKT_public_key *pk, /* See if the key is signed by an ultimately trusted key. */ { int fingerprint_raw_len = strlen (fingerprint) / 2; - char fingerprint_raw[fingerprint_raw_len]; + char fingerprint_raw[20]; int len = 0; - if (fingerprint_raw_len != 20 + if (fingerprint_raw_len != sizeof fingerprint_raw || ((len = hex2bin (fingerprint, fingerprint_raw, fingerprint_raw_len)) != strlen (fingerprint))) { if (DBG_TRUST) - log_debug ("TOFU: Bad fingerprint: %s (len: %zd, parsed: %d)\n", + log_debug ("TOFU: Bad fingerprint: %s (len: %zu, parsed: %d)\n", fingerprint, strlen (fingerprint), len); } else diff --git a/scd/app-openpgp.c b/scd/app-openpgp.c index 5fa4fd2..4d8b1bc 100644 --- a/scd/app-openpgp.c +++ b/scd/app-openpgp.c @@ -3580,11 +3580,23 @@ ecc_writekey (app_t app, gpg_error_t (*pincb)(void*, const char *, char **), { if (app->app_local->extcap.algo_attr_change) { - unsigned char keyattr[oid_len]; + unsigned char *keyattr; + if (!oid_len) + { + err = gpg_error (GPG_ERR_INTERNAL); + goto leave; + } + keyattr = xtrymalloc (oid_len); + if (!keyattr) + { + err = gpg_error_from_syserror (); + goto leave; + } keyattr[0] = algo; memcpy (keyattr+1, oidbuf+1, oid_len-1); err = change_keyattr (app, keyno, keyattr, oid_len, pincb, pincb_arg); + xfree (keyattr); if (err) goto leave; } commit c52930d11fcc52515fcc09a1085bf118411566a8 Author: Werner Koch Date: Mon Jan 2 12:59:10 2017 +0100 build: Enable gcc warnings to detect non-portable code. -- Signed-off-by: Werner Koch diff --git a/configure.ac b/configure.ac index 80d977c..fa206c9 100644 --- a/configure.ac +++ b/configure.ac @@ -1574,6 +1574,15 @@ if test "$GCC" = yes; then if test x"$_gcc_wopt" = xyes ; then mycflags="$mycflags -Wdeclaration-after-statement" fi + + AC_MSG_CHECKING([if gcc supports -Wlogical-op and -Wvla]) + CFLAGS="-Wlogical-op -Wvla" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],_gcc_wopt=yes,_gcc_wopt=no) + AC_MSG_RESULT($_gcc_wopt) + if test x"$_gcc_wopt" = xyes ; then + mycflags="$mycflags -Wlogical-op -Wvla" + fi + else mycflags="$mycflags -Wall" fi ----------------------------------------------------------------------- Summary of changes: common/t-iobuf.c | 6 ++++-- configure.ac | 9 +++++++++ g10/gpgcompose.c | 17 ++++++++++++----- g10/t-stutter.c | 17 ++++++++++------- g10/tofu.c | 6 +++--- g13/g13tuple.c | 2 +- scd/app-openpgp.c | 14 +++++++++++++- 7 files changed, 52 insertions(+), 19 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Mon Jan 2 14:06:33 2017 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Mon, 02 Jan 2017 14:06:33 +0100 Subject: [git] GPGME - branch, master, updated. gpgme-1.8.0-19-gececfd5 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, master has been updated via ececfd5de81f1851943be7b284b672d5b02aceb4 (commit) via 7103315829847163f1c6f52cad25d1ddb33358f0 (commit) from a4b9f1a2b404fd8627d5ac567617510abd55d980 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit ececfd5de81f1851943be7b284b672d5b02aceb4 Author: Andre Heinecke Date: Mon Jan 2 14:03:08 2017 +0100 qt: Update config sync doc / comment * lang/qt/src/cryptoconfig.h (CryptoConfig::sync): Document that runtime option is always set. * lang/qt/Src/qgpgmenewcryptoconfig.cpp (QGpgMENewCryptoConfigComponent::sync): Remove outdated comment and warn on error. diff --git a/lang/qt/src/cryptoconfig.h b/lang/qt/src/cryptoconfig.h index c3f0c7e..452bfbb 100644 --- a/lang/qt/src/cryptoconfig.h +++ b/lang/qt/src/cryptoconfig.h @@ -379,9 +379,8 @@ public: /** * Write back changes * - * @param runtime If this option is set, the changes will take effect at run-time, as - * far as this is possible. Otherwise, they will take effect at the next - * start of the respective backend programs. + * @param runtime this parameter is ignored. Changes will always + * be made with --runtime set. */ virtual void sync(bool runtime) = 0; diff --git a/lang/qt/src/qgpgmenewcryptoconfig.cpp b/lang/qt/src/qgpgmenewcryptoconfig.cpp index eb3af56..49b27ca 100644 --- a/lang/qt/src/qgpgmenewcryptoconfig.cpp +++ b/lang/qt/src/qgpgmenewcryptoconfig.cpp @@ -216,17 +216,12 @@ QGpgMENewCryptoConfigGroup *QGpgMENewCryptoConfigComponent::group(const QString void QGpgMENewCryptoConfigComponent::sync(bool runtime) { - Q_UNUSED(runtime) - // ### how to pass --runtime to gpgconf? -> marcus: not yet supported (2010-11-20) + Q_UNUSED(runtime) // runtime is always set by engine_gpgconf if (const Error err = m_component.save()) { -#if 0 - TODO port - const QString wmsg = i18n("Error from gpgconf while saving configuration: %1", QString::fromLocal8Bit(err.asString())); - qCWarning(GPGPME_BACKEND_LOG) << ":" << wmsg; - KMessageBox::error(0, wmsg); -#endif + qCWarning(GPGPME_BACKEND_LOG) << ":" + << "Error from gpgconf while saving configuration: %1" + << QString::fromLocal8Bit(err.asString()); } - // ### unset dirty state again } //// commit 7103315829847163f1c6f52cad25d1ddb33358f0 Author: Andre Heinecke Date: Mon Jan 2 13:11:10 2017 +0100 core: Always use runtime for gpgconf changes * src/engine-gpgconf.c (gpgconf_write): Add --runtime. * src/gpgme.h.in (gpgme_conf_opt_change): Document this behavior. -- If a tool uses GPGME for changing configuration values it needs a way to ensure that these changes take effect. Otherwise users may change and see config values and do not understand why they are not working. diff --git a/src/engine-gpgconf.c b/src/engine-gpgconf.c index 2ea8673..01a60eb 100644 --- a/src/engine-gpgconf.c +++ b/src/engine-gpgconf.c @@ -708,7 +708,7 @@ gpgconf_write (void *engine, const char *arg1, char *arg2, gpgme_data_t conf) #define BUFLEN 1024 char buf[BUFLEN]; int buflen = 0; - char *argv[6]; + char *argv[7]; int argc = 0; int rp[2]; struct spawn_fd_item_s cfd[] = { {-1, 0 /* STDIN_FILENO */}, {-1, -1} }; @@ -724,6 +724,7 @@ gpgconf_write (void *engine, const char *arg1, char *arg2, gpgme_data_t conf) argv[argc++] = gpgconf->home_dir; } + argv[argc++] = (char*)"--runtime"; argv[argc++] = (char*)arg1; argv[argc++] = arg2; argv[argc] = NULL; diff --git a/src/gpgme.h.in b/src/gpgme.h.in index 7cfe8f6..4fc119f 100644 --- a/src/gpgme.h.in +++ b/src/gpgme.h.in @@ -2410,7 +2410,8 @@ void gpgme_conf_arg_release (gpgme_conf_arg_t arg, gpgme_conf_type_t type); /* Register a change for the value of OPT to ARG. If RESET is 1 (do not use any values but 0 or 1), ARG is ignored and the option is not changed (reverting a previous change). Otherwise, if ARG is - NULL, the option is cleared or reset to its default. */ + NULL, the option is cleared or reset to its default. The change + is done with gpgconf's --runtime option to immediately take effect. */ gpgme_error_t gpgme_conf_opt_change (gpgme_conf_opt_t opt, int reset, gpgme_conf_arg_t arg); ----------------------------------------------------------------------- Summary of changes: lang/qt/src/cryptoconfig.h | 5 ++--- lang/qt/src/qgpgmenewcryptoconfig.cpp | 13 ++++--------- src/engine-gpgconf.c | 3 ++- src/gpgme.h.in | 3 ++- 4 files changed, 10 insertions(+), 14 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Mon Jan 2 18:24:40 2017 From: cvs at cvs.gnupg.org (by Justus Winter) Date: Mon, 02 Jan 2017 18:24:40 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-28-ga1e0d4a Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via a1e0d4a1e75fc6e6c3392a4e1d1d27005b38d6cc (commit) via 6d065198337b5242889723481bfa9ce81aa108bb (commit) from 5b6ebfb9244602d9de31d61c7eceb0c45ac8aa49 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit a1e0d4a1e75fc6e6c3392a4e1d1d27005b38d6cc Author: Justus Winter Date: Mon Jan 2 16:30:45 2017 +0100 common: Turn assertions into expressions. * common/logging.h (log_assert): Turn this into an expression so it can be used in expressions. Signed-off-by: Justus Winter diff --git a/common/logging.h b/common/logging.h index 64b999d..fc9e846 100644 --- a/common/logging.h +++ b/common/logging.h @@ -56,18 +56,18 @@ estream_t log_get_stream (void); void _log_assert (const char *expr, const char *file, int line, const char *func) GPGRT_ATTR_NORETURN; # define BUG() bug_at( __FILE__ , __LINE__, __FUNCTION__) -# define log_assert(expr) do { \ - if (!(expr)) \ - _log_assert (#expr, __FILE__, __LINE__, __FUNCTION__); \ - } while (0) +# define log_assert(expr) \ + ((expr) \ + ? (void) 0 \ + : _log_assert (#expr, __FILE__, __LINE__, __FUNCTION__)) #else /*!GPGRT_HAVE_MACRO_FUNCTION*/ void bug_at (const char *file, int line); void _log_assert (const char *expr, const char *file, int line; # define BUG() bug_at( __FILE__ , __LINE__ ) -# define log_assert(expr) do { \ - if (!(expr)) \ - _log_assert (#expr, __FILE__, __LINE__); \ - } while (0) +# define log_assert(expr) \ + ((expr) \ + ? (void) 0 \ + : _log_assert (#expr, __FILE__, __LINE__)) #endif /*!GPGRT_HAVE_MACRO_FUNCTION*/ /* Flag values for log_set_prefix. */ commit 6d065198337b5242889723481bfa9ce81aa108bb Author: Justus Winter Date: Mon Jan 2 16:37:02 2017 +0100 tests: Fix faked time in the TOFU test. * tests/openpgp/tofu.scm (GPG): Fix time delta. Signed-off-by: Justus Winter diff --git a/tests/openpgp/tofu.scm b/tests/openpgp/tofu.scm index 20c130a..cfcd5c8 100755 --- a/tests/openpgp/tofu.scm +++ b/tests/openpgp/tofu.scm @@ -29,7 +29,7 @@ (define (days->seconds days) (* days 24 60 60)) ;; Redefine GPG without --always-trust and a fixed time. -(define GPG `(,(tool 'gpg) --no-permission-warning ,(faketime GPGTIME))) +(define GPG `(,(tool 'gpg) --no-permission-warning ,(faketime 0))) (define GNUPGHOME (getenv "GNUPGHOME")) (if (string=? "" GNUPGHOME) (fail "GNUPGHOME not set")) ----------------------------------------------------------------------- Summary of changes: common/logging.h | 16 ++++++++-------- tests/openpgp/tofu.scm | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Mon Jan 2 18:25:40 2017 From: cvs at cvs.gnupg.org (by Justus Winter) Date: Mon, 02 Jan 2017 18:25:40 +0100 Subject: [git] GnuPG - branch, justus/issue2826-0, created. gnupg-2.1.17-31-g0140684 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, justus/issue2826-0 has been created at 01406840c199e0e13774fdea6dd82ed15fbb1a41 (commit) - Log ----------------------------------------------------------------- commit 01406840c199e0e13774fdea6dd82ed15fbb1a41 Author: Justus Winter Date: Mon Jan 2 18:16:47 2017 +0100 g10: Avoid accessing invalid expiration dates. * g10/sig-check.c (check_signature_metadata_validity): Avoid accessing invalid expiration dates. Signed-off-by: Justus Winter diff --git a/g10/sig-check.c b/g10/sig-check.c index a735500..3a378e1 100644 --- a/g10/sig-check.c +++ b/g10/sig-check.c @@ -324,7 +324,14 @@ check_signature_metadata_validity (PKT_public_key *pk, PKT_signature *sig, flag which is set after a full evaluation of the key (getkey.c) as well as a simple compare to the current time in case the merge has for whatever reasons not been done. */ - if( pk->has_expired || (kb_pk_expiredate (pk) && kb_pk_expiredate (pk) < cur_time)) { + if( pk->has_expired || (/* Computing EXPIREDATE requires calling + this function. To break this circular + dependency, we only check the + expiration if this information is + already known (i.e. valid): */ + kb_pk_valid_expiredate (pk) + && kb_pk_expiredate (pk) + && kb_pk_expiredate (pk) < cur_time)) { char buf[11]; if (opt.verbose) log_info(_("Note: signature key %s expired %s\n"), commit 65c8002b705b30b5eefdaf2586559d8112b2a063 Author: Justus Winter Date: Mon Jan 2 16:55:41 2017 +0100 g10: Use accessors for expiration dates of public keys. * g10/Makefile.am (common_source): Add new file. * g10/packet-functions.h: New file. * g10/packet.h (PKT_public_key): New flag 'valid_expiredate'. * g10/call-dirmngr.c: Apply the following semantic patch. * g10/free-packet.c: Likewise. * g10/getkey.c: Likewise. * g10/keyedit.c: Likewise. * g10/keygen.c: Likewise. Here with small manual fixups. * g10/keyid.c: Likewise. * g10/keylist.c: Likewise. * g10/mainproc.c: Likewise. * g10/parse-packet.c: Likewise. * g10/pubkey-enc.c: Likewise. * g10/sig-check.c: Likewise. * g10/trustdb.c: Likewise. -- @@ PKT_public_key *E; expression X; @@ -E->expiredate = X +kb_pk_set_expiredate (E, X) @@ PKT_public_key *E; @@ -E->expiredate +kb_pk_expiredate (E) Signed-off-by: Justus Winter diff --git a/g10/Makefile.am b/g10/Makefile.am index 604be93..7a14173 100644 --- a/g10/Makefile.am +++ b/g10/Makefile.am @@ -112,6 +112,7 @@ common_source = \ openfile.c \ keyid.c \ packet.h \ + packet-functions.h \ parse-packet.c \ cpr.c \ plaintext.c \ diff --git a/g10/call-dirmngr.c b/g10/call-dirmngr.c index 12838b5..94018be 100644 --- a/g10/call-dirmngr.c +++ b/g10/call-dirmngr.c @@ -948,7 +948,7 @@ ks_put_inq_cb (void *opaque, const char *line) record_output (fp, node->pkt->pkttype, validity, nbits_from_pk (pk), pk->pubkey_algo, - pk->keyid, pk->timestamp, pk->expiredate, + pk->keyid, pk->timestamp, kb_pk_expiredate (pk), NULL); } break; diff --git a/g10/free-packet.c b/g10/free-packet.c index 6038d26..63349c6 100644 --- a/g10/free-packet.c +++ b/g10/free-packet.c @@ -455,7 +455,7 @@ cmp_public_keys( PKT_public_key *a, PKT_public_key *b ) if( a->timestamp != b->timestamp ) return -1; - if( a->version < 4 && a->expiredate != b->expiredate ) + if( a->version < 4 && kb_pk_expiredate (a) != kb_pk_expiredate (b)) return -1; if( a->pubkey_algo != b->pubkey_algo ) return -1; diff --git a/g10/getkey.c b/g10/getkey.c index ed0bf0e..e133b97 100644 --- a/g10/getkey.c +++ b/g10/getkey.c @@ -2899,7 +2899,7 @@ merge_selfsigs_main (KBNODE keyblock, int *r_revoked, key_expire = pk->max_expiredate; pk->has_expired = key_expire >= curtime ? 0 : key_expire; - pk->expiredate = key_expire; + kb_pk_set_expiredate (pk, key_expire); /* Fixme: we should see how to get rid of the expiretime fields but * this needs changes at other places too. */ @@ -3037,7 +3037,7 @@ buf_to_sig (const byte * buf, size_t len) flags.backsig pubkey_usage has_expired - expired_date + expiredate On this subkey's most revent valid self-signed packet, the following field is set: @@ -3146,7 +3146,7 @@ merge_selfsigs_subkey (KBNODE keyblock, KBNODE subnode) else key_expire = 0; subpk->has_expired = key_expire >= curtime ? 0 : key_expire; - subpk->expiredate = key_expire; + kb_pk_set_expiredate (subpk, key_expire); /* Algo doesn't exist. */ if (openpgp_pk_test_algo (subpk->pubkey_algo)) diff --git a/g10/keyedit.c b/g10/keyedit.c index 88e2f4f..c565ee0 100644 --- a/g10/keyedit.c +++ b/g10/keyedit.c @@ -1394,7 +1394,7 @@ sign_uids (ctrl_t ctrl, estream_t fp, show_key_with_all_names (ctrl, fp, keyblock, 1, 0, 1, 0, 0, 0); tty_fprintf (fp, "\n"); - if (primary_pk->expiredate && !selfsig) + if (kb_pk_expiredate (primary_pk) && !selfsig) { /* Static analyzer note: A claim that PRIMARY_PK might be NULL is not correct because it set from the public key @@ -1406,7 +1406,7 @@ sign_uids (ctrl_t ctrl, estream_t fp, u32 now = make_timestamp (); - if (primary_pk->expiredate <= now) + if (kb_pk_expiredate (primary_pk) <= now) { tty_fprintf (fp, _("This key has expired!")); @@ -1443,7 +1443,7 @@ sign_uids (ctrl_t ctrl, estream_t fp, to answer the questions, enter the passphrase, etc). */ timestamp = now; - duration = primary_pk->expiredate - now; + duration = kb_pk_expiredate (primary_pk) - now; } cpr_kill_prompt (); @@ -3676,7 +3676,7 @@ show_key_with_all_names_colon (ctrl_t ctrl, estream_t fp, kbnode_t keyblock) nbits_from_pk (pk), pk->pubkey_algo, (ulong) keyid[0], (ulong) keyid[1], - (ulong) pk->timestamp, (ulong) pk->expiredate); + (ulong) pk->timestamp, (ulong) kb_pk_expiredate (pk)); if (node->pkt->pkttype == PKT_PUBLIC_KEY && !(opt.fast_list_mode || opt.no_expensive_trust_checks)) es_putc (get_ownertrust_info (pk), fp); @@ -4309,7 +4309,7 @@ subkey_expire_warning (kbnode_t keyblock) if (pk->timestamp > latest_date || (!pk->timestamp && !latest_date)) { latest_date = pk->timestamp; - subexpire = pk->expiredate; + subexpire = kb_pk_expiredate (pk); } } @@ -4872,14 +4872,14 @@ menu_expire (kbnode_t pub_keyblock, int force_mainkey, u32 newexpiration) { main_pk = node->pkt->pkt.public_key; keyid_from_pk (main_pk, keyid); - main_pk->expiredate = expiredate; + kb_pk_set_expiredate (main_pk, expiredate); } else if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY) { if ((node->flag & NODFLG_SELKEY) && !force_mainkey) { sub_pk = node->pkt->pkt.public_key; - sub_pk->expiredate = expiredate; + kb_pk_set_expiredate (sub_pk, expiredate); } else sub_pk = NULL; diff --git a/g10/keygen.c b/g10/keygen.c index b4fddba..f54bfa8 100644 --- a/g10/keygen.c +++ b/g10/keygen.c @@ -259,10 +259,10 @@ keygen_add_key_expire (PKT_signature *sig, void *opaque) byte buf[8]; u32 u; - if (pk->expiredate) + if (kb_pk_expiredate (pk)) { - if (pk->expiredate > pk->timestamp) - u = pk->expiredate - pk->timestamp; + if (kb_pk_expiredate (pk) > pk->timestamp) + u = kb_pk_expiredate (pk) - pk->timestamp; else u = 1; @@ -1290,8 +1290,7 @@ do_create_from_keygrip (ctrl_t ctrl, int algo, const char *hexkeygrip, pk->timestamp = timestamp; pk->version = 4; - if (expireval) - pk->expiredate = pk->timestamp + expireval; + kb_pk_set_expiredate (pk, expireval ? pk->timestamp + expireval : 0); pk->pubkey_algo = algo; if (algo == PUBKEY_ALGO_ECDSA @@ -1357,8 +1356,7 @@ common_gen (const char *keyparms, int algo, const char *algoelem, pk->timestamp = timestamp; pk->version = 4; - if (expireval) - pk->expiredate = pk->timestamp + expireval; + kb_pk_set_expiredate (pk, expireval ? pk->timestamp + expireval : 0); pk->pubkey_algo = algo; if (algo == PUBKEY_ALGO_ECDSA @@ -5276,8 +5274,7 @@ gen_card_key (int keyno, int algo, int is_primary, kbnode_t pub_root, pk->timestamp = *timestamp; pk->version = 4; - if (expireval) - pk->expiredate = pk->timestamp + expireval; + kb_pk_set_expiredate (pk, expireval ? pk->timestamp + expireval : 0); pk->pubkey_algo = algo; pkt->pkttype = is_primary ? PKT_PUBLIC_KEY : PKT_PUBLIC_SUBKEY; diff --git a/g10/keyid.c b/g10/keyid.c index dd098fd..a2e5412 100644 --- a/g10/keyid.c +++ b/g10/keyid.c @@ -660,9 +660,9 @@ expirestr_from_pk (PKT_public_key *pk) static char buffer[11+5]; time_t atime; - if (!pk->expiredate) + if (!kb_pk_expiredate (pk)) return _("never "); - atime = pk->expiredate; + atime = kb_pk_expiredate (pk); return mk_datestr (buffer, atime); } diff --git a/g10/keylist.c b/g10/keylist.c index fe4ce22..0394020 100644 --- a/g10/keylist.c +++ b/g10/keylist.c @@ -1245,7 +1245,7 @@ list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock, nbits_from_pk (pk), pk->pubkey_algo, (ulong) keyid[0], (ulong) keyid[1], - colon_datestr_from_pk (pk), colon_strtime (pk->expiredate)); + colon_datestr_from_pk (pk), colon_strtime (kb_pk_expiredate (pk))); if (ownertrust_print) es_putc (ownertrust_print, es_stdout); @@ -1383,7 +1383,7 @@ list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock, nbits_from_pk (pk2), pk2->pubkey_algo, (ulong) keyid2[0], (ulong) keyid2[1], - colon_datestr_from_pk (pk2), colon_strtime (pk2->expiredate) + colon_datestr_from_pk (pk2), colon_strtime (kb_pk_expiredate (pk2)) /* fixme: add LID and ownertrust here */ ); print_capabilities (pk2, NULL); @@ -1857,7 +1857,7 @@ print_key_line (estream_t fp, PKT_public_key *pk, int secret) tty_fprintf (fp, _("expired: %s"), expirestr_from_pk (pk)); tty_fprintf (fp, "]"); } - else if (pk->expiredate) + else if (kb_pk_expiredate (pk)) { tty_fprintf (fp, " ["); tty_fprintf (fp, _("expires: %s"), expirestr_from_pk (pk)); diff --git a/g10/mainproc.c b/g10/mainproc.c index 8e3974d..2245879 100644 --- a/g10/mainproc.c +++ b/g10/mainproc.c @@ -1030,7 +1030,7 @@ list_node (CTX c, kbnode_t node) pk->pubkey_algo, (ulong)keyid[0],(ulong)keyid[1], colon_datestr_from_pk( pk ), - colon_strtime (pk->expiredate) ); + colon_strtime (kb_pk_expiredate (pk)) ); if (pk->flags.primary && !opt.fast_list_mode) es_putc (get_ownertrust_info (pk), es_stdout); es_putc (':', es_stdout); diff --git a/g10/packet-functions.h b/g10/packet-functions.h new file mode 100644 index 0000000..0372f4e --- /dev/null +++ b/g10/packet-functions.h @@ -0,0 +1,49 @@ +/* packet-functions.h - Accessor functions for in-core representations. + * Copyright (C) 2017 g10 Code GmbH + * + * This file is part of GnuPG. + * + * GnuPG is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * GnuPG is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#ifndef G10_PACKET_FUNCTIONS_H +#define G10_PACKET_FUNCTIONS_H + +#include "../common/logging.h" + +static inline u32 +kb_pk_set_expiredate (PKT_public_key *pk, u32 value) +{ + pk->expiredate = value; + pk->flags.valid_expiredate = 1; + return value; +} + +static inline void +kb_pk_invalidate_expiredate (PKT_public_key *pk) +{ + pk->expiredate = 0; + pk->flags.valid_expiredate = 0; +} + +static inline int +kb_pk_valid_expiredate (PKT_public_key *pk) +{ + return pk->flags.valid_expiredate; +} + +#define kb_pk_expiredate(PK) \ + (log_assert ((PK)->flags.valid_expiredate), (PK)->expiredate) + +#endif /*G10_PACKET_FUNCTIONS_H*/ diff --git a/g10/packet.h b/g10/packet.h index 71079c3..aa1a221 100644 --- a/g10/packet.h +++ b/g10/packet.h @@ -396,6 +396,10 @@ typedef struct unsigned int backsig:2; /* 0=none, 1=bad, 2=good. */ unsigned int serialno_valid:1;/* SERIALNO below is valid. */ unsigned int exact:1; /* Found via exact (!) search. */ + + /* The following flags track the validity of fields. Should not + be accessed directly. */ + unsigned int valid_expiredate:1; } flags; PKT_user_id *user_id; /* If != NULL: found by that uid. */ struct revocation_key *revkey; @@ -852,4 +856,6 @@ gpg_error_t update_keysig_packet (PKT_signature **ret_sig, /*-- keygen.c --*/ PKT_user_id *generate_user_id (kbnode_t keyblock, const char *uidstr); +#include "packet-functions.h" + #endif /*G10_PACKET_H*/ diff --git a/g10/parse-packet.c b/g10/parse-packet.c index 7f44ce5..f4427f0 100644 --- a/g10/parse-packet.c +++ b/g10/parse-packet.c @@ -2205,7 +2205,7 @@ parse_key (IOBUF inp, int pkttype, unsigned long pktlen, version, algorithm, timestamp, expiredate); pk->timestamp = timestamp; - pk->expiredate = expiredate; + kb_pk_invalidate_expiredate (pk); pk->max_expiredate = max_expiredate; pk->hdrbytes = hdrlen; pk->version = version; diff --git a/g10/pubkey-enc.c b/g10/pubkey-enc.c index bd257dc..1adea5f 100644 --- a/g10/pubkey-enc.c +++ b/g10/pubkey-enc.c @@ -372,10 +372,10 @@ get_it (PKT_pubkey_enc *enc, DEK *dek, PKT_public_key *sk, u32 *keyid) } if (!pk) BUG (); - if (pk->expiredate && pk->expiredate <= make_timestamp ()) + if (kb_pk_expiredate (pk) && kb_pk_expiredate (pk) <= make_timestamp ()) { log_info (_("Note: secret key %s expired at %s\n"), - keystr (keyid), asctimestamp (pk->expiredate)); + keystr (keyid), asctimestamp (kb_pk_expiredate (pk))); } } diff --git a/g10/sig-check.c b/g10/sig-check.c index 4df29af..a735500 100644 --- a/g10/sig-check.c +++ b/g10/sig-check.c @@ -132,7 +132,7 @@ check_signature2 (PKT_signature *sig, gcry_md_hd_t digest, u32 *r_expiredate, else { if(r_expiredate) - *r_expiredate = pk->expiredate; + *r_expiredate = kb_pk_expiredate (pk); rc = check_signature_end (pk, sig, digest, r_expired, r_revoked, NULL); @@ -324,12 +324,12 @@ check_signature_metadata_validity (PKT_public_key *pk, PKT_signature *sig, flag which is set after a full evaluation of the key (getkey.c) as well as a simple compare to the current time in case the merge has for whatever reasons not been done. */ - if( pk->has_expired || (pk->expiredate && pk->expiredate < cur_time)) { + if( pk->has_expired || (kb_pk_expiredate (pk) && kb_pk_expiredate (pk) < cur_time)) { char buf[11]; if (opt.verbose) log_info(_("Note: signature key %s expired %s\n"), - keystr_from_pk(pk), asctimestamp( pk->expiredate ) ); - sprintf(buf,"%lu",(ulong)pk->expiredate); + keystr_from_pk(pk), asctimestamp(kb_pk_expiredate (pk)) ); + sprintf(buf,"%lu",(ulong)kb_pk_expiredate (pk)); write_status_text(STATUS_KEYEXPIRED,buf); if(r_expired) *r_expired = 1; diff --git a/g10/trustdb.c b/g10/trustdb.c index 3dfff9e..304d280 100644 --- a/g10/trustdb.c +++ b/g10/trustdb.c @@ -1829,9 +1829,9 @@ validate_key_list (KEYDB_HANDLE hd, KeyHashTable full_trust, { KBNODE node; - if (pk->expiredate && pk->expiredate >= curtime - && pk->expiredate < *next_expire) - *next_expire = pk->expiredate; + if (kb_pk_expiredate (pk) && kb_pk_expiredate (pk) >= curtime + && kb_pk_expiredate (pk) < *next_expire) + *next_expire = kb_pk_expiredate (pk); if (nkeys == maxkeys) { maxkeys += 1000; @@ -2007,9 +2007,9 @@ validate_keys (ctrl_t ctrl, int interactive) if (node->pkt->pkttype == PKT_USER_ID) update_validity (pk, node->pkt->pkt.user_id, 0, TRUST_ULTIMATE); } - if ( pk->expiredate && pk->expiredate >= start_time - && pk->expiredate < next_expire) - next_expire = pk->expiredate; + if (kb_pk_expiredate (pk) && kb_pk_expiredate (pk) >= start_time + && kb_pk_expiredate (pk) < next_expire) + next_expire = kb_pk_expiredate (pk); release_kbnode (keyblock); do_sync (); commit a1a64820c30a978a415021281dff4f8b9eb0afd2 Author: Justus Winter Date: Mon Jan 2 13:11:42 2017 +0100 g10: Use bitfield for flags of user ids. * g10/packet.h (is_{primary,revoked,expired}): Move to the flags bitfield. * g10/call-dirmngr.c: Update all uses using the following semantic patch. * g10/export.c: Likewise. * g10/getkey.c: Likewise. * g10/import.c: Likewise. * g10/kbnode.c: Likewise. * g10/keyedit.c: Likewise. * g10/keylist.c: Likewise. * g10/keyserver.c: Likewise. * g10/mainproc.c: Likewise. * g10/pkclist.c: Likewise. * g10/pubkey-enc.c: Likewise. * g10/tofu.c: Likewise. * g10/trust.c: Likewise. * g10/trustdb.c: Likewise. -- I used Coccinelle and the following semantic patch to update the code: @@ expression E; @@ -E->is_expired +E->flags.expired @@ expression E; @@ -E->is_primary +E->flags.primary @@ expression E; @@ -E->is_revoked +E->flags.revoked Signed-off-by: Justus Winter diff --git a/g10/call-dirmngr.c b/g10/call-dirmngr.c index 4be9da1..12838b5 100644 --- a/g10/call-dirmngr.c +++ b/g10/call-dirmngr.c @@ -963,9 +963,9 @@ ks_put_inq_cb (void *opaque, const char *line) int i; i = 0; - if (uid->is_revoked) + if (uid->flags.revoked) validity[i ++] = 'r'; - if (uid->is_expired) + if (uid->flags.expired) validity[i ++] = 'e'; validity[i] = '\0'; diff --git a/g10/export.c b/g10/export.c index ad42b41..cae4b1f 100644 --- a/g10/export.c +++ b/g10/export.c @@ -1417,7 +1417,7 @@ print_pka_or_dane_records (iobuf_t out, kbnode_t keyblock, PKT_public_key *pk, continue; uid = node->pkt->pkt.user_id; - if (uid->is_expired || uid->is_revoked) + if (uid->flags.expired || uid->flags.revoked) continue; xfree (mbox); diff --git a/g10/getkey.c b/g10/getkey.c index e39de28..ed0bf0e 100644 --- a/g10/getkey.c +++ b/g10/getkey.c @@ -274,7 +274,7 @@ get_primary_uid (KBNODE keyblock, size_t * uidlen) { if (k->pkt->pkttype == PKT_USER_ID && !k->pkt->pkt.user_id->attrib_data - && k->pkt->pkt.user_id->is_primary) + && k->pkt->pkt.user_id->flags.primary) { *uidlen = k->pkt->pkt.user_id->len; return k->pkt->pkt.user_id->name; @@ -970,7 +970,7 @@ skip_unusable (void *dummy, u32 * keyid, int uid_no) if (uids_seen != uid_no) continue; - if (user_id->is_revoked || user_id->is_expired) + if (user_id->flags.revoked || user_id->flags.expired) unusable = 1; break; @@ -1494,7 +1494,7 @@ key_is_ok (const PKT_public_key *key) static int uid_is_ok (const PKT_public_key *key, const PKT_user_id *uid) { - return key_is_ok (key) && ! uid->is_revoked; + return key_is_ok (key) && ! uid->flags.revoked; } @@ -2342,26 +2342,26 @@ fixup_uidnode (KBNODE uidnode, KBNODE signode, u32 keycreated) uid->created = 0; /* Not created == invalid. */ if (IS_UID_REV (sig)) { - uid->is_revoked = 1; + uid->flags.revoked = 1; return; /* Has been revoked. */ } else - uid->is_revoked = 0; + uid->flags.revoked = 0; uid->expiredate = sig->expiredate; if (sig->flags.expired) { - uid->is_expired = 1; + uid->flags.expired = 1; return; /* Has expired. */ } else - uid->is_expired = 0; + uid->flags.expired = 0; uid->created = sig->timestamp; /* This one is okay. */ uid->selfsigversion = sig->version; /* If we got this far, it's not expired :) */ - uid->is_expired = 0; + uid->flags.expired = 0; /* Store the key flags in the helper variable for later processing. */ uid->help_key_usage = parse_key_usage (sig); @@ -2375,10 +2375,10 @@ fixup_uidnode (KBNODE uidnode, KBNODE signode, u32 keycreated) /* Set the primary user ID flag - we will later wipe out some * of them to only have one in our keyblock. */ - uid->is_primary = 0; + uid->flags.primary = 0; p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_PRIMARY_UID, NULL); if (p && *p) - uid->is_primary = 2; + uid->flags.primary = 2; /* We could also query this from the unhashed area if it is not in * the hased area and then later try to decide which is the better @@ -2912,7 +2912,7 @@ merge_selfsigs_main (KBNODE keyblock, int *r_revoked, if (k->pkt->pkttype == PKT_USER_ID && !k->pkt->pkt.user_id->attrib_data) { PKT_user_id *uid = k->pkt->pkt.user_id; - if (uid->is_primary) + if (uid->flags.primary) { if (uid->created > uiddate) { @@ -2956,7 +2956,7 @@ merge_selfsigs_main (KBNODE keyblock, int *r_revoked, { PKT_user_id *uid = k->pkt->pkt.user_id; if (k != uidnode) - uid->is_primary = 0; + uid->flags.primary = 0; } } } @@ -2964,7 +2964,7 @@ merge_selfsigs_main (KBNODE keyblock, int *r_revoked, { /* None is flagged primary - use the latest user ID we have, and disambiguate with the arbitrary packet comparison. */ - uidnode2->pkt->pkt.user_id->is_primary = 1; + uidnode2->pkt->pkt.user_id->flags.primary = 1; } else { @@ -2983,7 +2983,7 @@ merge_selfsigs_main (KBNODE keyblock, int *r_revoked, if (!uidnode) { uidnode = k; - uidnode->pkt->pkt.user_id->is_primary = 1; + uidnode->pkt->pkt.user_id->flags.primary = 1; continue; } else @@ -2991,12 +2991,12 @@ merge_selfsigs_main (KBNODE keyblock, int *r_revoked, if (cmp_user_ids (k->pkt->pkt.user_id, uidnode->pkt->pkt.user_id) > 0) { - uidnode->pkt->pkt.user_id->is_primary = 0; + uidnode->pkt->pkt.user_id->flags.primary = 0; uidnode = k; - uidnode->pkt->pkt.user_id->is_primary = 1; + uidnode->pkt->pkt.user_id->flags.primary = 1; } else - k->pkt->pkt.user_id->is_primary = 0; /* just to be + k->pkt->pkt.user_id->flags.primary = 0; /* just to be safe */ } } @@ -3310,7 +3310,7 @@ merge_selfsigs (KBNODE keyblock) { if (k->pkt->pkttype == PKT_USER_ID && !k->pkt->pkt.user_id->attrib_data - && k->pkt->pkt.user_id->is_primary) + && k->pkt->pkt.user_id->flags.primary) { prefs = k->pkt->pkt.user_id->prefs; mdc_feature = k->pkt->pkt.user_id->flags.mdc; diff --git a/g10/import.c b/g10/import.c index 1ed11bf..09d0867 100644 --- a/g10/import.c +++ b/g10/import.c @@ -1170,7 +1170,7 @@ impex_filter_getval (void *cookie, const char *propname) result = node->pkt->pkt.user_id->mbox; } else if (!strcmp (propname, "primary")) - result = node->pkt->pkt.user_id->is_primary? "1":"0"; + result = node->pkt->pkt.user_id->flags.primary? "1":"0"; else result = NULL; } diff --git a/g10/kbnode.c b/g10/kbnode.c index 6700dc0..ab038ba 100644 --- a/g10/kbnode.c +++ b/g10/kbnode.c @@ -392,10 +392,10 @@ dump_kbnode (KBNODE node) es_write_sanitized (log_get_stream (), uid->name, uid->len, NULL, NULL); log_printf ("\" %c%c%c%c\n", - uid->is_expired? 'e':'.', - uid->is_revoked? 'r':'.', + uid->flags.expired? 'e':'.', + uid->flags.revoked? 'r':'.', uid->created? 'v':'.', - uid->is_primary? 'p':'.' ); + uid->flags.primary? 'p':'.' ); } else if (node->pkt->pkttype == PKT_SIGNATURE) { diff --git a/g10/keyedit.c b/g10/keyedit.c index dadf586..88e2f4f 100644 --- a/g10/keyedit.c +++ b/g10/keyedit.c @@ -1164,7 +1164,7 @@ sign_uids (ctrl_t ctrl, estream_t fp, uidnode->flag &= ~NODFLG_MARK_A; uidnode = NULL; } - else if (uidnode->pkt->pkt.user_id->is_revoked) + else if (uidnode->pkt->pkt.user_id->flags.revoked) { tty_fprintf (fp, _("User ID \"%s\" is revoked."), user); @@ -1192,7 +1192,7 @@ sign_uids (ctrl_t ctrl, estream_t fp, tty_fprintf (fp, _(" Unable to sign.\n")); } } - else if (uidnode->pkt->pkt.user_id->is_expired) + else if (uidnode->pkt->pkt.user_id->flags.expired) { tty_fprintf (fp, _("User ID \"%s\" is expired."), user); @@ -3714,9 +3714,9 @@ show_key_with_all_names_colon (ctrl_t ctrl, estream_t fp, kbnode_t keyblock) else es_fputs ("uid:", fp); - if (uid->is_revoked) + if (uid->flags.revoked) es_fputs ("r::::::::", fp); - else if (uid->is_expired) + else if (uid->flags.expired) es_fputs ("e::::::::", fp); else if (opt.fast_list_mode || opt.no_expensive_trust_checks) es_fputs ("::::::::", fp); @@ -3764,11 +3764,11 @@ show_key_with_all_names_colon (ctrl_t ctrl, estream_t fp, kbnode_t keyblock) es_putc (':', fp); /* flags */ es_fprintf (fp, "%d,", i); - if (uid->is_primary) + if (uid->flags.primary) es_putc ('p', fp); - if (uid->is_revoked) + if (uid->flags.revoked) es_putc ('r', fp); - if (uid->is_expired) + if (uid->flags.expired) es_putc ('e', fp); if ((node->flag & NODFLG_SELUID)) es_putc ('s', fp); @@ -3814,7 +3814,7 @@ show_names (ctrl_t ctrl, estream_t fp, tty_fprintf (fp, " "); else if (node->flag & NODFLG_SELUID) tty_fprintf (fp, "(%d)* ", i); - else if (uid->is_primary) + else if (uid->flags.primary) tty_fprintf (fp, "(%d). ", i); else tty_fprintf (fp, "(%d) ", i); @@ -4146,9 +4146,9 @@ show_basic_key_info (KBNODE keyblock) ++i; tty_printf (" "); - if (uid->is_revoked) + if (uid->flags.revoked) tty_printf ("[%s] ", _("revoked")); - else if (uid->is_expired) + else if (uid->flags.expired) tty_printf ("[%s] ", _("expired")); tty_print_utf8_string (uid->name, uid->len); tty_printf ("\n"); @@ -4256,7 +4256,7 @@ no_primary_warning (KBNODE keyblock) { uid_count++; - if (node->pkt->pkt.user_id->is_primary == 2) + if (node->pkt->pkt.user_id->flags.primary == 2) { have_primary = 1; break; @@ -4457,7 +4457,7 @@ menu_deluid (KBNODE pub_keyblock) { /* Only cause a trust update if we delete a non-revoked user id */ - if (!node->pkt->pkt.user_id->is_revoked) + if (!node->pkt->pkt.user_id->flags.revoked) update_trust = 1; delete_kbnode (node); } @@ -4577,9 +4577,9 @@ menu_clean (KBNODE keyblock, int self_only) { const char *reason; - if (uidnode->pkt->pkt.user_id->is_revoked) + if (uidnode->pkt->pkt.user_id->flags.revoked) reason = _("revoked"); - else if (uidnode->pkt->pkt.user_id->is_expired) + else if (uidnode->pkt->pkt.user_id->flags.expired) reason = _("expired"); else reason = _("invalid"); @@ -6314,7 +6314,7 @@ reloop: /* (must use this, because we are modifing the list) */ /* Are we revoking our own uid? */ if (primary_pk->keyid[0] == sig->keyid[0] && primary_pk->keyid[1] == sig->keyid[1]) - unode->pkt->pkt.user_id->is_revoked = 1; + unode->pkt->pkt.user_id->flags.revoked = 1; pkt = xmalloc_clear (sizeof *pkt); pkt->pkttype = PKT_SIGNATURE; pkt->pkt.signature = sig; @@ -6348,7 +6348,7 @@ core_revuid (ctrl_t ctrl, kbnode_t keyblock, KBNODE node, { PKT_user_id *uid = node->pkt->pkt.user_id; - if (uid->is_revoked) + if (uid->flags.revoked) { char *user = utf8_to_native (uid->name, uid->len, 0); log_info (_("user ID \"%s\" is already revoked\n"), user); @@ -6408,7 +6408,7 @@ core_revuid (ctrl_t ctrl, kbnode_t keyblock, KBNODE node, update_trust = 1; #endif /*!NO_TRUST_MODELS*/ - node->pkt->pkt.user_id->is_revoked = 1; + node->pkt->pkt.user_id->flags.revoked = 1; if (modified) *modified = 1; } diff --git a/g10/keylist.c b/g10/keylist.c index a5fdc06..fe4ce22 100644 --- a/g10/keylist.c +++ b/g10/keylist.c @@ -852,9 +852,8 @@ dump_attribs (const PKT_user_id *uid, PKT_public_key *pk) (ulong) uid->attribs[i].len, uid->attribs[i].type, i + 1, uid->numattribs, (ulong) uid->created, (ulong) uid->expiredate, - ((uid->is_primary ? 0x01 : 0) | (uid-> - is_revoked ? 0x02 : 0) | - (uid->is_expired ? 0x04 : 0))); + ((uid->flags.primary ? 0x01 : 0) | (uid->flags.revoked ? 0x02 : 0) | + (uid->flags.expired ? 0x04 : 0))); write_status_text (STATUS_ATTRIBUTE, buf); } @@ -929,7 +928,7 @@ list_keyblock_print (ctrl_t ctrl, kbnode_t keyblock, int secret, int fpr, int indent; int kl = opt.keyid_format == KF_NONE? 10 : keystrlen (); - if ((uid->is_expired || uid->is_revoked) + if ((uid->flags.expired || uid->flags.revoked) && !(opt.list_options & LIST_SHOW_UNUSABLE_UIDS)) { skip_sigs = 1; @@ -941,7 +940,7 @@ list_keyblock_print (ctrl_t ctrl, kbnode_t keyblock, int secret, int fpr, if (attrib_fp && uid->attrib_data != NULL) dump_attribs (uid, pk); - if ((uid->is_revoked || uid->is_expired) + if ((uid->flags.revoked || uid->flags.expired) || ((opt.list_options & LIST_SHOW_UID_VALIDITY) && !listctx->no_validity)) { @@ -1300,9 +1299,9 @@ list_keyblock_colon (ctrl_t ctrl, kbnode_t keyblock, if (attrib_fp && uid->attrib_data != NULL) dump_attribs (uid, pk); - if (uid->is_revoked) + if (uid->flags.revoked) uid_validity = 'r'; - else if (uid->is_expired) + else if (uid->flags.expired) uid_validity = 'e'; else if (opt.no_expensive_trust_checks) uid_validity = 0; @@ -1559,7 +1558,7 @@ do_reorder_keyblock (KBNODE keyblock, int attr) if (node->pkt->pkttype == PKT_USER_ID && ((attr && node->pkt->pkt.user_id->attrib_data) || (!attr && !node->pkt->pkt.user_id->attrib_data)) && - node->pkt->pkt.user_id->is_primary) + node->pkt->pkt.user_id->flags.primary) { primary = primary2 = node; for (node = node->next; node; primary2 = node, node = node->next) diff --git a/g10/keyserver.c b/g10/keyserver.c index c7363c9..6c12643 100644 --- a/g10/keyserver.c +++ b/g10/keyserver.c @@ -1323,7 +1323,7 @@ keyidlist(strlist_t users,KEYDB_SEARCH_DESC **klist,int *count,int fakev3) for(node=node->next;node;node=node->next) { if(node->pkt->pkttype==PKT_USER_ID - && node->pkt->pkt.user_id->is_primary) + && node->pkt->pkt.user_id->flags.primary) uid=node->pkt->pkt.user_id; else if(node->pkt->pkttype==PKT_SIGNATURE && node->pkt->pkt.signature-> diff --git a/g10/mainproc.c b/g10/mainproc.c index ac2ab03..8e3974d 100644 --- a/g10/mainproc.c +++ b/g10/mainproc.c @@ -1960,11 +1960,11 @@ check_sig_and_print (CTX c, kbnode_t node) continue; if (!un->pkt->pkt.user_id->created) continue; - if (un->pkt->pkt.user_id->is_revoked) + if (un->pkt->pkt.user_id->flags.revoked) continue; - if (un->pkt->pkt.user_id->is_expired) + if (un->pkt->pkt.user_id->flags.expired) continue; - if (!un->pkt->pkt.user_id->is_primary) + if (!un->pkt->pkt.user_id->flags.primary) continue; /* We want the textual primary user ID here */ if (un->pkt->pkt.user_id->attrib_data) @@ -2041,12 +2041,12 @@ check_sig_and_print (CTX c, kbnode_t node) { if (un->pkt->pkttype != PKT_USER_ID) continue; - if ((un->pkt->pkt.user_id->is_revoked - || un->pkt->pkt.user_id->is_expired) + if ((un->pkt->pkt.user_id->flags.revoked + || un->pkt->pkt.user_id->flags.expired) && !(opt.verify_options & VERIFY_SHOW_UNUSABLE_UIDS)) continue; /* Skip textual primary user ids which we printed above. */ - if (un->pkt->pkt.user_id->is_primary + if (un->pkt->pkt.user_id->flags.primary && !un->pkt->pkt.user_id->attrib_data ) continue; @@ -2071,9 +2071,9 @@ check_sig_and_print (CTX c, kbnode_t node) { const char *valid; - if (un->pkt->pkt.user_id->is_revoked) + if (un->pkt->pkt.user_id->flags.revoked) valid = _("revoked"); - else if (un->pkt->pkt.user_id->is_expired) + else if (un->pkt->pkt.user_id->flags.expired) valid = _("expired"); else /* Since this is just informational, don't diff --git a/g10/packet.h b/g10/packet.h index 9780d93..71079c3 100644 --- a/g10/packet.h +++ b/g10/packet.h @@ -280,19 +280,19 @@ typedef struct u32 help_key_expire; int help_full_count; int help_marginal_count; - int is_primary; /* 2 if set via the primary flag, 1 if calculated */ - int is_revoked; - int is_expired; u32 expiredate; /* expires at this date or 0 if not at all */ prefitem_t *prefs; /* list of preferences (may be NULL)*/ u32 created; /* according to the self-signature */ byte selfsigversion; struct { - /* TODO: Move more flags here */ unsigned int mdc:1; unsigned int ks_modify:1; unsigned int compacted:1; + unsigned int primary:2; /* 2 if set via the primary flag, 1 if + * calculated */ + unsigned int revoked:1; + unsigned int expired:1; } flags; char *mbox; /* NULL or the result of mailbox_from_userid. */ /* The text contained in the user id packet, which is normally the diff --git a/g10/pkclist.c b/g10/pkclist.c index 288affc..4eb3628 100644 --- a/g10/pkclist.c +++ b/g10/pkclist.c @@ -235,12 +235,12 @@ do_edit_ownertrust (ctrl_t ctrl, PKT_public_key *pk, int mode, { if (un->pkt->pkttype != PKT_USER_ID ) continue; - if (un->pkt->pkt.user_id->is_revoked ) + if (un->pkt->pkt.user_id->flags.revoked) continue; - if (un->pkt->pkt.user_id->is_expired ) + if (un->pkt->pkt.user_id->flags.expired) continue; /* Only skip textual primaries */ - if (un->pkt->pkt.user_id->is_primary + if (un->pkt->pkt.user_id->flags.primary && !un->pkt->pkt.user_id->attrib_data ) continue; diff --git a/g10/pubkey-enc.c b/g10/pubkey-enc.c index 117744f..bd257dc 100644 --- a/g10/pubkey-enc.c +++ b/g10/pubkey-enc.c @@ -54,7 +54,7 @@ is_algo_in_prefs (kbnode_t keyblock, preftype_t type, int algo) PKT_user_id *uid = k->pkt->pkt.user_id; prefitem_t *prefs = uid->prefs; - if (uid->created && prefs && !uid->is_revoked && !uid->is_expired) + if (uid->created && prefs && !uid->flags.revoked && !uid->flags.expired) { for (; prefs->type; prefs++) if (prefs->type == type && prefs->value == algo) diff --git a/g10/tofu.c b/g10/tofu.c index 8d535fa..7934b9e 100644 --- a/g10/tofu.c +++ b/g10/tofu.c @@ -2209,9 +2209,9 @@ build_conflict_set (tofu_dbs_t dbs, { found_user_id = 1; - if (user_id2->is_revoked) + if (user_id2->flags.revoked) iter->flags |= BINDING_REVOKED; - if (user_id2->is_expired) + if (user_id2->flags.expired) iter->flags |= BINDING_EXPIRED; } @@ -3470,7 +3470,7 @@ tofu_register_encryption (ctrl_t ctrl, { PKT_user_id *uid = n->pkt->pkt.user_id; - if (uid->is_revoked) + if (uid->flags.revoked) continue; add_to_strlist (&user_id_list, uid->name); @@ -3805,7 +3805,7 @@ tofu_set_policy (ctrl_t ctrl, kbnode_t kb, enum tofu_policy policy) continue; user_id = kb->pkt->pkt.user_id; - if (user_id->is_revoked) + if (user_id->flags.revoked) /* Skip revoked user ids. (Don't skip expired user ids, the expiry can be changed.) */ continue; diff --git a/g10/trust.c b/g10/trust.c index 080926a..a6092a9 100644 --- a/g10/trust.c +++ b/g10/trust.c @@ -145,9 +145,9 @@ uid_trust_string_fixed (ctrl_t ctrl, PKT_public_key *key, PKT_user_id *uid) uid are both NULL, or neither are NULL. */ return _("10 translator see trust.c:uid_trust_string_fixed"); } - else if(uid->is_revoked || (key && key->flags.revoked)) + else if(uid->flags.revoked || (key && key->flags.revoked)) return _("[ revoked]"); - else if(uid->is_expired) + else if(uid->flags.expired) return _("[ expired]"); else if(key) { @@ -688,7 +688,7 @@ clean_uid_from_key (kbnode_t keyblock, kbnode_t uidnode, int noisy) IDs if --allow-non-selfsigned-uid is set. */ if (uid->created || uid->flags.compacted - || (!uid->is_expired && !uid->is_revoked && opt.allow_non_selfsigned_uid)) + || (!uid->flags.expired && !uid->flags.revoked && opt.allow_non_selfsigned_uid)) return 0; for (node=uidnode->next; @@ -708,9 +708,9 @@ clean_uid_from_key (kbnode_t keyblock, kbnode_t uidnode, int noisy) const char *reason; char *user = utf8_to_native (uid->name, uid->len, 0); - if (uid->is_revoked) + if (uid->flags.revoked) reason = _("revoked"); - else if (uid->is_expired) + else if (uid->flags.expired) reason = _("expired"); else reason = _("invalid"); diff --git a/g10/trustdb.c b/g10/trustdb.c index d402cb2..3dfff9e 100644 --- a/g10/trustdb.c +++ b/g10/trustdb.c @@ -1099,14 +1099,14 @@ tdb_get_validity_core (ctrl_t ctrl, } /* If the user id is revoked or expired, then skip it. */ - if (user_id->is_revoked || user_id->is_expired) + if (user_id->flags.revoked || user_id->flags.expired) { if (DBG_TRUST) { char *s; - if (user_id->is_revoked && user_id->is_expired) + if (user_id->flags.revoked && user_id->flags.expired) s = "revoked and expired"; - else if (user_id->is_revoked) + else if (user_id->flags.revoked) s = "revoked"; else s = "expire"; @@ -1115,7 +1115,7 @@ tdb_get_validity_core (ctrl_t ctrl, s, user_id->name); } - if (user_id->is_revoked) + if (user_id->flags.revoked) continue; expired = 1; @@ -1604,8 +1604,8 @@ validate_one_keyblock (KBNODE kb, struct key_item *klist, resigned. -dshaw */ if (node->pkt->pkttype == PKT_USER_ID - && !node->pkt->pkt.user_id->is_revoked - && !node->pkt->pkt.user_id->is_expired) + && !node->pkt->pkt.user_id->flags.revoked + && !node->pkt->pkt.user_id->flags.expired) { if (uidnode && issigned) { ----------------------------------------------------------------------- hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 3 12:48:41 2017 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Tue, 03 Jan 2017 12:48:41 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-30-g9695124 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 969512401603639e4467ede7d892f1b02582c2c9 (commit) via 0004d52ba2f1245c84f95a151342ad99fd72ca3d (commit) from a1e0d4a1e75fc6e6c3392a4e1d1d27005b38d6cc (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 969512401603639e4467ede7d892f1b02582c2c9 Author: Werner Koch Date: Tue Jan 3 12:03:28 2017 +0100 dirmngr: Make sure Tor mode is also set for DNS on SIGHUP. * dirmngr/dns-stuff.c (enable_dns_tormode): Always succeed. (reload_dns_stuff): Reset tor port. * dirmngr/dirmngr.c (set_tor_mode): Also enable Tor mode for DNS. (main): Remove warning that Tor mode may not fully work. * dirmngr/server.c (cmd_dns_cert): Remove explicit Tor for DNS initialization. * dirmngr/t-dns-stuff.c (main): Remove option --new-circuit and error checking for enable_dns_tormode. -- This patch also resets the port on SIGHUP so that after starting Tor SIGHUP is sufficient to use Tor. Without the SIGHUP and when not using the Tor browser Dirmngr would keep on trying the Tor browser port. Signed-off-by: Werner Koch diff --git a/dirmngr/dirmngr.c b/dirmngr/dirmngr.c index 5ee589e..f50e935 100644 --- a/dirmngr/dirmngr.c +++ b/dirmngr/dirmngr.c @@ -481,6 +481,9 @@ set_tor_mode (void) { if (opt.use_tor) { + /* Enable Tor mode and when called again force a new curcuit + * (e.g. on SIGHUP). */ + enable_dns_tormode (1); if (assuan_sock_set_flag (ASSUAN_INVALID_FD, "tor-mode", 1)) { log_error ("error enabling Tor mode: %s\n", strerror (errno)); @@ -919,13 +922,6 @@ main (int argc, char **argv) log_info ("NOTE: this is a development version!\n"); #endif - if (opt.use_tor) - { - log_info ("WARNING: ***************************************\n"); - log_info ("WARNING: Tor mode (--use-tor) MAY NOT FULLY WORK!\n"); - log_info ("WARNING: ***************************************\n"); - } - /* Print a warning if an argument looks like an option. */ if (!opt.quiet && !(pargs.flags & ARGPARSE_FLAG_STOP_SEEN)) { diff --git a/dirmngr/dns-stuff.c b/dirmngr/dns-stuff.c index cf8cefb..e32e1e3 100644 --- a/dirmngr/dns-stuff.c +++ b/dirmngr/dns-stuff.c @@ -199,9 +199,9 @@ recursive_resolver_p (void) } -/* Sets the module in Tor mode. Returns 0 is this is possible or an - error code. */ -gpg_error_t +/* Puts this module eternally into Tor mode. When called agained with + * NEW_CIRCUIT request a new TOR circuit for the next DNS query. */ +void enable_dns_tormode (int new_circuit) { if (!*tor_socks_user || new_circuit) @@ -215,7 +215,6 @@ enable_dns_tormode (int new_circuit) counter++; } tor_mode = 1; - return 0; } @@ -548,7 +547,10 @@ reload_dns_stuff (int force) libdns_reinit_pending = 0; } else - libdns_reinit_pending = 1; + { + libdns_reinit_pending = 1; + libdns_tor_port = 0; /* Start again with the default port. */ + } #else (void)force; #endif diff --git a/dirmngr/dns-stuff.h b/dirmngr/dns-stuff.h index 0a4a4de..eb7fe72 100644 --- a/dirmngr/dns-stuff.h +++ b/dirmngr/dns-stuff.h @@ -113,9 +113,9 @@ void enable_recursive_resolver (int yes); /* Return true iff the recursive resolver is used. */ int recursive_resolver_p (void); -/* Calling this function switches the DNS code into Tor mode if - possibe. Return 0 on success. */ -gpg_error_t enable_dns_tormode (int new_circuit); +/* Put this module eternally into Tor mode. When called agained with + * NEW_CIRCUIT request a new TOR circuit for the next DNS query. */ +void enable_dns_tormode (int new_circuit); /* Change the default IP address of the nameserver to IPADDR. The address needs to be a numerical IP address and will be used for the diff --git a/dirmngr/server.c b/dirmngr/server.c index a785238..28c2cd4 100644 --- a/dirmngr/server.c +++ b/dirmngr/server.c @@ -709,13 +709,6 @@ cmd_dns_cert (assuan_context_t ctx, char *line) } } - if (opt.use_tor && (err = enable_dns_tormode (0))) - { - /* Tor mode is requested but the DNS code can't enable it. */ - assuan_set_error (ctx, err, "error enabling Tor mode"); - goto leave; - } - if (pka_mode || dane_mode) { char *domain; /* Points to mbox. */ diff --git a/dirmngr/t-dns-stuff.c b/dirmngr/t-dns-stuff.c index b087b5e..bc4ca9a 100644 --- a/dirmngr/t-dns-stuff.c +++ b/dirmngr/t-dns-stuff.c @@ -51,7 +51,6 @@ main (int argc, char **argv) gpg_error_t err; int any_options = 0; int opt_tor = 0; - int opt_new_circuit = 0; int opt_cert = 0; int opt_srv = 0; int opt_bracket = 0; @@ -103,11 +102,6 @@ main (int argc, char **argv) opt_tor = 1; argc--; argv++; } - else if (!strcmp (*argv, "--new-circuit")) - { - opt_new_circuit = 1; - argc--; argv++; - } else if (!strcmp (*argv, "--standard-resolver")) { enable_standard_resolver (1); @@ -171,15 +165,7 @@ main (int argc, char **argv) init_sockets (); if (opt_tor) - { - err = enable_dns_tormode (opt_new_circuit); - if (err) - { - fprintf (stderr, "error switching into Tor mode: %s\n", - gpg_strerror (err)); - exit (1); - } - } + enable_dns_tormode (0); if (opt_cert) { commit 0004d52ba2f1245c84f95a151342ad99fd72ca3d Author: Werner Koch Date: Mon Jan 2 15:47:24 2017 +0100 dirmngr: New debug message on correctly initialized libdns. * dirmngr/dns-stuff.c (libdns_init): Add debug level diagnostic on success. -- This output may help to avoid questions when evaluating an Assuan log. Signed-off-by: Werner Koch diff --git a/dirmngr/dns-stuff.c b/dirmngr/dns-stuff.c index f2e1df9..cf8cefb 100644 --- a/dirmngr/dns-stuff.c +++ b/dirmngr/dns-stuff.c @@ -507,6 +507,9 @@ libdns_init (void) /* All fine. Make the data global. */ libdns = ld; + if (opt_debug) + log_debug ("dns: libdns initialized%s\n", tor_mode?" (tor mode)":""); + leave: xfree (cfgstr); return err; @@ -595,7 +598,7 @@ libdns_res_open (struct dns_resolver **r_res) #ifdef USE_LIBDNS -/* Helper to test whether we need totry again after having swicthed +/* Helper to test whether we need to try again after having switched * the Tor port. */ static int libdns_switch_port_p (gpg_error_t err) ----------------------------------------------------------------------- Summary of changes: dirmngr/dirmngr.c | 10 +++------- dirmngr/dns-stuff.c | 17 +++++++++++------ dirmngr/dns-stuff.h | 6 +++--- dirmngr/server.c | 7 ------- dirmngr/t-dns-stuff.c | 16 +--------------- 5 files changed, 18 insertions(+), 38 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 3 13:14:40 2017 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Tue, 03 Jan 2017 13:14:40 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-31-g293a55b Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 293a55bacdacec4501af3a396b14fd32e404e39e (commit) from 969512401603639e4467ede7d892f1b02582c2c9 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 293a55bacdacec4501af3a396b14fd32e404e39e Author: Werner Koch Date: Tue Jan 3 13:12:25 2017 +0100 doc: Extend dirmngr's --allow-version-check description -- diff --git a/doc/dirmngr.texi b/doc/dirmngr.texi index e136dff..fc617d8 100644 --- a/doc/dirmngr.texi +++ b/doc/dirmngr.texi @@ -264,7 +264,13 @@ the list of current software versions. If this option is enabled, or if @option{use-tor} is active, the list is retrieved when the local copy does not exist or is older than 5 to 7 days. See the option @option{--query-swdb} of the command @command{gpgconf} for more -details. +details. Note, that regardless of this option a version check can +always be triggered using this command: + + at example + gpg-connect-agent --dirmngr 'loadswdb --force' /bye + at end example + @item --keyserver @var{name} @opindex keyserver ----------------------------------------------------------------------- Summary of changes: doc/dirmngr.texi | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 3 15:34:54 2017 From: cvs at cvs.gnupg.org (by Justus Winter) Date: Tue, 03 Jan 2017 15:34:54 +0100 Subject: [git] GPGME - branch, master, updated. gpgme-1.8.0-21-gb14419f Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, master has been updated via b14419f68b3aaa90025e0e97151de7c3da7806fb (commit) via d0e91d28f63b74e53673902e675be8a54b6b90d3 (commit) from ececfd5de81f1851943be7b284b672d5b02aceb4 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit b14419f68b3aaa90025e0e97151de7c3da7806fb Author: Justus Winter Date: Tue Jan 3 15:27:49 2017 +0100 python: Improve compatibility with Scheme tests. * lang/python/tests/run-tests.py: Add stub --parallel option. Signed-off-by: Justus Winter diff --git a/lang/python/tests/run-tests.py b/lang/python/tests/run-tests.py index 3f9ece3..46c6d8c 100644 --- a/lang/python/tests/run-tests.py +++ b/lang/python/tests/run-tests.py @@ -51,6 +51,8 @@ parser.add_argument('--srcdir', type=str, parser.add_argument('--builddir', type=str, default=os.environ.get("abs_builddir", ""), help='Location of the tests.') +parser.add_argument('--parallel', action="store_true", default=False, + help='Ignored. For compatibility with run-tests.scm.') args = parser.parse_args() if not args.interpreters: commit d0e91d28f63b74e53673902e675be8a54b6b90d3 Author: Justus Winter Date: Wed Nov 30 10:39:25 2016 +0100 python: Add a switch '--quiet' to the test runner. * lang/python/tests/run-tests.py: Add and honor a switch '--quiet'. This way we can use this script to run Python tests one by one without the noise, and the script will setup the necessary environment for us. Signed-off-by: Justus Winter diff --git a/lang/python/tests/run-tests.py b/lang/python/tests/run-tests.py index 55d3f11..3f9ece3 100644 --- a/lang/python/tests/run-tests.py +++ b/lang/python/tests/run-tests.py @@ -39,6 +39,8 @@ parser.add_argument('tests', metavar='TEST', type=str, nargs='+', help='A test to run') parser.add_argument('-v', '--verbose', action="store_true", default=False, help='Be verbose.') +parser.add_argument('-q', '--quiet', action="store_true", default=False, + help='Be quiet.') parser.add_argument('--interpreters', metavar='PYTHON', type=str, default=[], action=SplitAndAccumulate, help='Use these interpreters to run the tests, ' + @@ -72,12 +74,15 @@ for interpreter in args.interpreters: env = dict(os.environ) env["PYTHONPATH"] = builddirs[0] - print("Running tests using {0} ({1})...".format(interpreter, version)) + if not args.quiet: + print("Running tests using {0} ({1})...".format(interpreter, version)) + for test in args.tests: status = subprocess.call( [interpreter, os.path.join(args.srcdir, test)], env=env, stdout=out, stderr=err) - print("{0}: {1}".format(status_to_str(status), test)) + if not args.quiet: + print("{0}: {1}".format(status_to_str(status), test)) results.append(status) def count(status): @@ -85,6 +90,8 @@ def count(status): def failed(): return len(list(filter(lambda x: x not in (0, 77, 99), results))) -print("{0} tests run, {1} succeeded, {2} failed, {3} skipped.".format( - len(results), count(0), failed(), count(77))) -sys.exit(len(results) - count(0)) +if not args.quiet: + print("{0} tests run, {1} succeeded, {2} failed, {3} skipped.".format( + len(results), count(0), failed(), count(77))) + sys.exit(len(results) - count(0)) +sys.exit(results[0]) ----------------------------------------------------------------------- Summary of changes: lang/python/tests/run-tests.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 3 15:59:46 2017 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Tue, 03 Jan 2017 15:59:46 +0100 Subject: [git] GpgOL - branch, master, updated. gpgol-1.4.0-233-g0dc7cc2 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG extension for MS Outlook". The branch, master has been updated via 0dc7cc2ebf78a61a739b2aca76e9fd7b6e0a5a3a (commit) from 3029cf63dcb05d57b8c77c759cbb7f4469bef567 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 0dc7cc2ebf78a61a739b2aca76e9fd7b6e0a5a3a Author: Andre Heinecke Date: Tue Jan 3 15:59:21 2017 +0100 Fix encrypt icon name in EXTRA_DIST * src/icons/Makefile.am (EXTRA_DIST): Fix encrypt name. diff --git a/src/icons/Makefile.am b/src/icons/Makefile.am index 914742a..a727d0e 100644 --- a/src/icons/Makefile.am +++ b/src/icons/Makefile.am @@ -23,7 +23,7 @@ EXTRA_DIST= \ encrypt-sign-file-48.png \ sign-48.png verify-48.png \ README.icons\ - sign.svg sign-enc.svg enc.svg \ + sign.svg sign-enc.svg encrypt.svg \ sign-enc-40.png sign-20.png encrypt-20.png \ level-0.svg level-0-enc.svg level-0.png level-0-enc.png \ level-1.svg level-1-enc.svg level-1.png level-1-enc.png \ ----------------------------------------------------------------------- Summary of changes: src/icons/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- GnuPG extension for MS Outlook http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 3 16:38:11 2017 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Tue, 03 Jan 2017 16:38:11 +0100 Subject: [git] GPG-ERROR - branch, master, updated. libgpg-error-1.26-5-g704c319 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Error codes used by GnuPG et al.". The branch, master has been updated via 704c31992e8716bbe61e6d5751e125a64badeef0 (commit) via 80ec003f328ee8180a63585d196a8d40e6045b39 (commit) from 8d844f6c23f6ca2192248f8d7eb7bf52b645b25b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 704c31992e8716bbe61e6d5751e125a64badeef0 Author: Werner Koch Date: Tue Jan 3 16:12:16 2017 +0100 Fix macro GPGRT_GCC_VERSION * src/gpg-error.h.in (GPGRT_GCC_VERSION): Fix. -- Fixes-commit: 4e790613f66efcfc62d73722d5f1730a37cb8324 Signed-off-by: Werner Koch diff --git a/NEWS b/NEWS index b19fd11..572385f 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,8 @@ Noteworthy changes in version 1.27 (unreleased) [C2_/A2_/R_] ----------------------------------------------- + * Fixed macro GPGRT_GCC_VERSION. + Noteworthy changes in version 1.26 (2016-12-21) [C21/A21/R0] ----------------------------------------------- diff --git a/src/gpg-error.h.in b/src/gpg-error.h.in index 06c2f9c..c603314 100644 --- a/src/gpg-error.h.in +++ b/src/gpg-error.h.in @@ -155,7 +155,7 @@ typedef unsigned int gpg_error_t; # define _GPG_ERR_CONSTRUCTOR #endif -#define GPGRT_GCC_VERSION _GCC_ERR_GCC_VERSION +#define GPGRT_GCC_VERSION _GPG_ERR_GCC_VERSION #if _GPG_ERR_GCC_VERSION >= 29200 # define _GPGRT__RESTRICT __restrict__ commit 80ec003f328ee8180a63585d196a8d40e6045b39 Author: Werner Koch Date: Tue Jan 3 16:32:12 2017 +0100 Fix last merge. -- diff --git a/NEWS b/NEWS index 21637bc..b19fd11 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,8 @@ -Noteworthy changes in version 1.26 (unreleased) [C20/A20/R_] +Noteworthy changes in version 1.27 (unreleased) [C2_/A2_/R_] +----------------------------------------------- + + +Noteworthy changes in version 1.26 (2016-12-21) [C21/A21/R0] ----------------------------------------------- * New option --desc for gpg-error. diff --git a/configure.ac b/configure.ac index e3ca56e..6d4f173 100644 --- a/configure.ac +++ b/configure.ac @@ -27,7 +27,7 @@ min_automake_version="1.14" # another commit, and a push so that the git magic is able to work. # See below for the LT versions. m4_define([mym4_version_major], [1]) -m4_define([mym4_version_minor], [26]) +m4_define([mym4_version_minor], [27]) # Below is m4 magic to extract and compute the revision number, the # decimalized short revision number, a beta version string, and a flag ----------------------------------------------------------------------- Summary of changes: NEWS | 8 +++++++- configure.ac | 2 +- src/gpg-error.h.in | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) hooks/post-receive -- Error codes used by GnuPG et al. http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 3 16:39:05 2017 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Tue, 03 Jan 2017 16:39:05 +0100 Subject: [git] GCRYPT - branch, master, updated. libgcrypt-1.7.3-49-g98b4969 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU crypto library". The branch, master has been updated via 98b49695b1ffe3c406ae39a45051b8594f903b9d (commit) via 3582641469f1c74078f0d758c4d5458cc0ee5649 (commit) from 0996d5f1c34a3d3012facd098a139d8abbde085f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 98b49695b1ffe3c406ae39a45051b8594f903b9d Author: Werner Koch Date: Tue Jan 3 16:30:54 2017 +0100 Extend GCRYCTL_PRINT_CONFIG to print compiler version. * src/global.c (print_config): Print version of libgpg-error and used compiler. Signed-off-by: Werner Koch diff --git a/NEWS b/NEWS index ef882b7..179b18d 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,11 @@ Noteworthy changes in version 1.8.0 (unreleased) [C21/A1/R_] - GCRYCTL_REINIT_SYSCALL_CLAMP allows to init nPth after Libgcrypt. + * Extended interfaces: + + - GCRYCTL_PRINT_CONFIG does now also print build information for + libgpg-error and the used compiler version. + * Internal changes: - Libgpg-error 1.25 is now required. This avoids stalling of nPth diff --git a/src/global.c b/src/global.c index cfb7618..25815dd 100644 --- a/src/global.c +++ b/src/global.c @@ -279,7 +279,25 @@ print_config ( int (*fnc)(FILE *fp, const char *format, ...), FILE *fp) int i; const char *s; - fnc (fp, "version:%s:\n", VERSION); + fnc (fp, "version:%s:%x:%s:%x:\n", + VERSION, GCRYPT_VERSION_NUMBER, + GPGRT_VERSION, GPGRT_VERSION_NUMBER); + fnc (fp, "cc:%d:%s:\n", +#if GPGRT_VERSION_NUMBER >= 0x011b00 /* 1.27 */ + GPGRT_GCC_VERSION +#else + _GPG_ERR_GCC_VERSION /* Due to a bug in gpg-error.h. */ +#endif + , +#ifdef __clang__ + "clang:" __VERSION__ +#elif __GNUC__ + "gcc:" __VERSION__ +#else + ":" +#endif + ); + fnc (fp, "ciphers:%s:\n", LIBGCRYPT_CIPHERS); fnc (fp, "pubkeys:%s:\n", LIBGCRYPT_PUBKEY_CIPHERS); fnc (fp, "digests:%s:\n", LIBGCRYPT_DIGESTS); commit 3582641469f1c74078f0d758c4d5458cc0ee5649 Author: Werner Koch Date: Tue Jan 3 15:34:33 2017 +0100 tests: Add option --disable-hwf to the version utility. * src/hwfeatures.c (_gcry_disable_hw_feature): Rewrite to allow passing a colon delimited feature set. (parse_hwf_deny_file): Remove unused var I. * tests/version.c (main): Add options --verbose and --disable-hwf. Signed-off-by: Werner Koch diff --git a/doc/gcrypt.texi b/doc/gcrypt.texi index cb539da..47ac19e 100644 --- a/doc/gcrypt.texi +++ b/doc/gcrypt.texi @@ -906,10 +906,14 @@ success or an error code on failure. Libgcrypt detects certain features of the CPU at startup time. For performance tests it is sometimes required not to use such a feature. This option may be used to disable a certain feature; i.e. Libgcrypt -behaves as if this feature has not been detected. Note that the -detection code might be run if the feature has been disabled. This -command must be used at initialization time; i.e. before calling - at code{gcry_check_version}. +behaves as if this feature has not been detected. This call can be +used several times to disable a set of features, or features may be +given as a colon or comma delimited string. The special feature +"all" can be used to disable all available features. + +Note that the detection code might be run if the feature has been +disabled. This command must be used at initialization time; +i.e. before calling @code{gcry_check_version}. @item GCRYCTL_REINIT_SYSCALL_CLAMP; Arguments: none diff --git a/src/hwfeatures.c b/src/hwfeatures.c index 99aba34..82f8bf2 100644 --- a/src/hwfeatures.c +++ b/src/hwfeatures.c @@ -82,20 +82,34 @@ gpg_err_code_t _gcry_disable_hw_feature (const char *name) { int i; + size_t n1, n2; - if (!strcmp(name, "all")) + while (name && *name) { - disabled_hw_features = ~0; - return 0; + n1 = strcspn (name, ":,"); + if (!n1) + ; + else if (n1 == 3 && !strncmp (name, "all", 3)) + disabled_hw_features = ~0; + else + { + for (i=0; i < DIM (hwflist); i++) + { + n2 = strlen (hwflist[i].desc); + if (n1 == n2 && !strncmp (hwflist[i].desc, name, n2)) + { + disabled_hw_features |= hwflist[i].flag; + break; + } + } + if (!(i < DIM (hwflist))) + return GPG_ERR_INV_NAME; + } + name += n1; + if (*name) + name++; /* Skip delimiter ':' or ','. */ } - - for (i=0; i < DIM (hwflist); i++) - if (!strcmp (hwflist[i].desc, name)) - { - disabled_hw_features |= hwflist[i].flag; - return 0; - } - return GPG_ERR_INV_NAME; + return 0; } @@ -131,7 +145,7 @@ parse_hwf_deny_file (void) FILE *fp; char buffer[256]; char *p, *pend; - int i, lnr = 0; + int lnr = 0; fp = fopen (fname, "r"); if (!fp) diff --git a/tests/version.c b/tests/version.c index f22c305..baf984e 100644 --- a/tests/version.c +++ b/tests/version.c @@ -42,8 +42,47 @@ int main (int argc, char **argv) { - (void)argc; - (void)argv; + int last_argc = -1; + + if (argc) + { argc--; argv++; } + + while (argc && last_argc != argc ) + { + last_argc = argc; + if (!strcmp (*argv, "--")) + { + argc--; argv++; + break; + } + else if (!strcmp (*argv, "--verbose")) + { + verbose++; + argc--; argv++; + } + else if (!strcmp (*argv, "--debug")) + { + /* Dummy option */ + argc--; argv++; + } + else if (!strcmp (*argv, "--disable-hwf")) + { + argc--; + argv++; + if (argc) + { + if (gcry_control (GCRYCTL_DISABLE_HWF, *argv, NULL)) + fprintf (stderr, + PGM + ": unknown hardware feature '%s' - option ignored\n", + *argv); + argc--; + argv++; + } + } + } + + xgcry_control (GCRYCTL_SET_VERBOSITY, (int)verbose); xgcry_control (GCRYCTL_DISABLE_SECMEM, 0); if (strcmp (GCRYPT_VERSION, gcry_check_version (NULL))) ----------------------------------------------------------------------- Summary of changes: NEWS | 5 +++++ doc/gcrypt.texi | 12 ++++++++---- src/global.c | 20 +++++++++++++++++++- src/hwfeatures.c | 38 ++++++++++++++++++++++++++------------ tests/version.c | 43 +++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 99 insertions(+), 19 deletions(-) hooks/post-receive -- The GNU crypto library http://git.gnupg.org From cvs at cvs.gnupg.org Wed Jan 4 11:20:22 2017 From: cvs at cvs.gnupg.org (by Jussi Kivilinna) Date: Wed, 04 Jan 2017 11:20:22 +0100 Subject: [git] GCRYPT - branch, master, updated. libgcrypt-1.7.3-50-gaada604 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU crypto library". The branch, master has been updated via aada604594fd42224d366d3cb98f67fd3b989cd6 (commit) from 98b49695b1ffe3c406ae39a45051b8594f903b9d (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit aada604594fd42224d366d3cb98f67fd3b989cd6 Author: Jussi Kivilinna Date: Wed Jan 4 12:02:36 2017 +0200 rijndael-ssse3: fix counter operand from read-only to read/write * cipher/rijndael-ssse3-amd64.c (_gcry_aes_ssse3_ctr_enc): Change 'ctrlow' operand from read-only to read-write. -- With read-only operand, compiler is allowed to pass temporary register to assembly block and throw away any calculation that have been done on that register. On the other hand, compiler is also allowed to keep operand value permanently in one register as value is treated as read-only, and effectly operates as expected. Selection between these two depends on compiler version and used flags. Signed-off-by: Jussi Kivilinna diff --git a/cipher/rijndael-ssse3-amd64.c b/cipher/rijndael-ssse3-amd64.c index a8e89d4..2adb73f 100644 --- a/cipher/rijndael-ssse3-amd64.c +++ b/cipher/rijndael-ssse3-amd64.c @@ -387,8 +387,8 @@ _gcry_aes_ssse3_ctr_enc (RIJNDAEL_context *ctx, unsigned char *outbuf, ".Lno_carry%=:\n\t" "pshufb %%xmm6, %%xmm7\n\t" - : - : [ctr] "r" (ctr), [ctrlow] "r" (ctrlow) + : [ctrlow] "+r" (ctrlow) + : [ctr] "r" (ctr) : "cc", "memory"); do_vpaes_ssse3_enc (ctx, nrounds, aes_const_ptr); ----------------------------------------------------------------------- Summary of changes: cipher/rijndael-ssse3-amd64.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) hooks/post-receive -- The GNU crypto library http://git.gnupg.org From cvs at cvs.gnupg.org Wed Jan 4 17:20:03 2017 From: cvs at cvs.gnupg.org (by Justus Winter) Date: Wed, 04 Jan 2017 17:20:03 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-32-g28e1496 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 28e149609da44fab600f6a11b385d1c8ca8e7eb9 (commit) from 293a55bacdacec4501af3a396b14fd32e404e39e (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 28e149609da44fab600f6a11b385d1c8ca8e7eb9 Author: Justus Winter Date: Wed Jan 4 16:54:41 2017 +0100 tests,w32: Fix locating the components. * tests/openpgp/defs.scm (percent-decode): New function. (bin-prefix): New variable. (installed?): Likewise. (tool-hardcoded): Use the new variables. (gpg-conf): Use the new function to decode the values. (gpg-components): Do not use '--build-prefix' when 'installed?'. Signed-off-by: Justus Winter diff --git a/tests/openpgp/defs.scm b/tests/openpgp/defs.scm index 3280d7c..863d128 100644 --- a/tests/openpgp/defs.scm +++ b/tests/openpgp/defs.scm @@ -81,6 +81,21 @@ default value))) +(define (percent-decode s) + (define (decode c) + (if (and (> (length c) 2) (char=? #\% (car c))) + (integer->char (string->number (string #\# #\x (cadr c) (caddr c)))) + #f)) + (let loop ((i 0) (c (string->list s)) (r (make-string (string-length s)))) + (if (null? c) + (substring r 0 i) + (let ((decoded (decode c))) + (string-set! r i (if decoded decoded (car c))) + (loop (+ 1 i) (if decoded (cdddr c) (cdr c)) r))))) +(assert (equal? (percent-decode "") "")) +(assert (equal? (percent-decode "%61") "a")) +(assert (equal? (percent-decode "foob%61r") "foobar")) + (define tools '((gpgv "GPGV" "g10/gpgv") (gpg-connect-agent "GPG_CONNECT_AGENT" "tools/gpg-connect-agent") @@ -91,25 +106,30 @@ (gpg-zip "GPGZIP" "tools/gpg-zip") (pinentry "PINENTRY" "tests/openpgp/fake-pinentry"))) +(define bin-prefix (getenv "BIN_PREFIX")) +(define installed? (not (string=? "" bin-prefix))) + (define (tool-hardcoded which) - (let ((t (assoc which tools)) - (prefix (getenv "BIN_PREFIX"))) + (let ((t (assoc which tools))) (getenv' (cadr t) - (qualify (if (string=? prefix "") - (string-append (getenv "objdir") "/" (caddr t)) - (string-append prefix "/" (basename (caddr t)))))))) + (qualify (if installed? + (string-append bin-prefix "/" (basename (caddr t))) + (string-append (getenv "objdir") "/" (caddr t))))))) (define (gpg-conf . args) (let ((s (call-popen `(,(tool-hardcoded 'gpgconf) , at args) ""))) - (map (lambda (line) (string-split line #\:)) + (map (lambda (line) (map percent-decode (string-split line #\:))) (string-split-newlines s)))) (define :gc:c:name car) (define :gc:c:description cadr) (define :gc:c:pgmname caddr) -(setenv "GNUPG_BUILDDIR" (getenv "objdir") #t) -(define gpg-components (gpg-conf '--build-prefix (getenv "objdir") - '--list-components)) +(unless installed? + (setenv "GNUPG_BUILDDIR" (getenv "objdir") #t)) +(define gpg-components (apply gpg-conf + `(,@(if installed? '() + (list '--build-prefix (getenv "objdir"))) + --list-components))) (define (tool which) (case which ----------------------------------------------------------------------- Summary of changes: tests/openpgp/defs.scm | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed Jan 4 18:40:34 2017 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 04 Jan 2017 18:40:34 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-33-g588121c Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 588121c158384b05099388097053d8d1e8bdf143 (commit) from 28e149609da44fab600f6a11b385d1c8ca8e7eb9 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 588121c158384b05099388097053d8d1e8bdf143 Author: Werner Koch Date: Wed Jan 4 18:37:36 2017 +0100 doc: Add release announcement pointers to NEWS entries. -- These are used by the website buider to link to the announcement mails. Signed-off-by: Werner Koch diff --git a/NEWS b/NEWS index 79bbbbc..da0f0f7 100644 --- a/NEWS +++ b/NEWS @@ -37,6 +37,8 @@ Noteworthy changes in version 2.1.17 (2016-12-20) * Major improvements to the test suite. For example it is possible to run the external test suite of GPGME. + See-also: gnupg-announce/2016q4/000400.html + Noteworthy changes in version 2.1.16 (2016-11-18) ------------------------------------------------- @@ -109,6 +111,8 @@ Noteworthy changes in version 2.1.16 (2016-11-18) * Many changes and improvements for the test suite. + See-also: gnupg-announce/2016q4/000398.html + Noteworthy changes in version 2.1.15 (2016-08-18) ------------------------------------------------- @@ -160,6 +164,8 @@ Noteworthy changes in version 2.1.15 (2016-08-18) * Spelling and grammar fixes. + See-also: gnupg-announce/2016q3/000396.html + Noteworthy changes in version 2.1.14 (2016-07-14) ------------------------------------------------- @@ -218,6 +224,8 @@ Noteworthy changes in version 2.1.14 (2016-07-14) * The rendering of the man pages has been improved. + See-also: gnupg-announce/2016q3/000393.html + Noteworthy changes in version 2.1.13 (2016-06-16) ------------------------------------------------- @@ -268,6 +276,8 @@ Noteworthy changes in version 2.1.13 (2016-06-16) * Speedup fd closing after a fork. + See-also: gnupg-announce/2016q2/000390.html + Noteworthy changes in version 2.1.12 (2016-05-04) ------------------------------------------------- @@ -321,6 +331,8 @@ Noteworthy changes in version 2.1.12 (2016-05-04) * Lots of internal cleanups and bug fixes. + See-also: gnupg-announce/2016q2/000387.html + Noteworthy changes in version 2.1.11 (2016-01-26) ------------------------------------------------- @@ -372,6 +384,8 @@ Noteworthy changes in version 2.1.11 (2016-01-26) * Print a warning if a GnuPG component is using an older version of gpg-agent, dirmngr, or scdaemon. + See-also: gnupg-announce/2016q1/000383.html + Noteworthy changes in version 2.1.10 (2015-12-04) ------------------------------------------------- @@ -430,6 +444,8 @@ Noteworthy changes in version 2.1.10 (2015-12-04) * Many other cleanups and bug fixes. + See-also: gnupg-announce/2015q4/000381.html + Noteworthy changes in version 2.1.9 (2015-10-09) ------------------------------------------------ @@ -460,6 +476,8 @@ Noteworthy changes in version 2.1.9 (2015-10-09) * dirmngr: Add option --keyserver. Deprecate that option for gpg. Install a dirmngr.conf file from a skeleton for new installations. + See-also: gnupg-announce/2015q4/000380.html + Noteworthy changes in version 2.1.8 (2015-09-10) ------------------------------------------------ @@ -487,6 +505,8 @@ Noteworthy changes in version 2.1.8 (2015-09-10) * Various minor bug fixes. + See-also: gnupg-announce/2015q3/000379.html + Noteworthy changes in version 2.1.7 (2015-08-11) ------------------------------------------------ @@ -512,6 +532,8 @@ Noteworthy changes in version 2.1.7 (2015-08-11) * Various other bug fixes. + See-also: gnupg-announce/2015q3/000371.html + Noteworthy changes in version 2.1.6 (2015-07-01) ------------------------------------------------ @@ -542,6 +564,8 @@ Noteworthy changes in version 2.1.6 (2015-07-01) * Various other bug fixes. + See-also: gnupg-announce/2015q3/000370.html + Noteworthy changes in version 2.1.5 (2015-06-11) ------------------------------------------------ @@ -556,6 +580,8 @@ Noteworthy changes in version 2.1.5 (2015-06-11) * Code cleanups and minor bug fixes. + See-also: gnupg-announce/2015q2/000369.html + Noteworthy changes in version 2.1.4 (2015-05-12) ------------------------------------------------ @@ -581,6 +607,8 @@ Noteworthy changes in version 2.1.4 (2015-05-12) * Fixed lots of smaller bugs. + See-also: gnupg-announce/2015q2/000366.html + Noteworthy changes in version 2.1.3 (2015-04-11) ------------------------------------------------ @@ -618,6 +646,8 @@ Noteworthy changes in version 2.1.3 (2015-04-11) * Fixed possible problems due to compiler optimization, two minor regressions, and other bugs. + See-also: gnupg-announce/2015q2/000365.html + Noteworthy changes in version 2.1.2 (2015-02-11) ------------------------------------------------ @@ -652,6 +682,8 @@ Noteworthy changes in version 2.1.2 (2015-02-11) * Fixed several bugs related to bogus keyrings and improved some other code. + See-also: gnupg-announce/2015q1/000361.html + Noteworthy changes in version 2.1.1 (2014-12-16) ------------------------------------------------ @@ -704,6 +736,8 @@ Noteworthy changes in version 2.1.1 (2014-12-16) * Improved portability and the usual bunch of bug fixes. + See-also: gnupg-announce/2014q4/000360.html + Noteworthy changes in version 2.1.0 (2014-11-06) ------------------------------------------------ @@ -1021,6 +1055,8 @@ Noteworthy changes in version 2.1.0 (2014-11-06) * Numerical values may now be used as an alternative to the debug-level keywords. + See-also: gnupg-announce/2014q4/000358.html + Version 2.0.28 (2015-06-02) Version 2.0.27 (2015-02-18) @@ -1064,6 +1100,8 @@ Noteworthy changes in version 2.0.13 (2009-09-04) * Minor bug fixes. + See-also: gnupg-announce/2009q3/000294.html + Noteworthy changes in version 2.0.12 (2009-06-17) ------------------------------------------------- @@ -1091,6 +1129,8 @@ Noteworthy changes in version 2.0.12 (2009-06-17) * Changed code to avoid a possible Mac OS X system freeze. + See-also: gnupg-announce/2009q2/000288.html + Noteworthy changes in version 2.0.11 (2009-03-03) ------------------------------------------------- @@ -1107,6 +1147,8 @@ Noteworthy changes in version 2.0.11 (2009-03-03) due to interoperability problems with Outlook 2003 which still can't cope with AES. + See-also: gnupg-announce/2009q1/000287.html + Noteworthy changes in version 2.0.10 (2009-01-12) ------------------------------------------------- @@ -1162,6 +1204,8 @@ Noteworthy changes in version 2.0.10 (2009-01-12) * Libgcrypt 1.4 is now required. + See-also: gnupg-announce/2009q1/000284.html + Noteworthy changes in version 2.0.9 (2008-03-26) ------------------------------------------------ @@ -1185,6 +1229,7 @@ Noteworthy changes in version 2.0.9 (2008-03-26) * Minor bug fixes. + Noteworthy changes in version 2.0.8 (2007-12-20) ------------------------------------------------ @@ -1218,6 +1263,8 @@ Noteworthy changes in version 2.0.8 (2007-12-20) taken into account. This required a change of our socket emulation code and changed the IPC protocol under Windows. + See-also: gnupg-announce/2007q4/000267.html + Noteworthy changes in version 2.0.7 (2007-09-10) ------------------------------------------------ @@ -1236,6 +1283,8 @@ Noteworthy changes in version 2.0.7 (2007-09-10) installed versions of the programs and does not anymore search via PATH for them. + See-also: gnupg-announce/2007q3/000259.html + Noteworthy changes in version 2.0.6 (2007-08-16) ------------------------------------------------ @@ -1251,6 +1300,8 @@ Noteworthy changes in version 2.0.6 (2007-08-16) * Improved Windows support. + See-also: gnupg-announce/2007q3/000258.html + Noteworthy changes in version 2.0.5 (2007-07-05) ------------------------------------------------ @@ -1268,6 +1319,8 @@ Noteworthy changes in version 2.0.5 (2007-07-05) * Changed key generation to reveal less information about the machine. Bug fixes for gpg2's card key generation. + See-also: gnupg-announce/2007q3/000255.html + Noteworthy changes in version 2.0.4 (2007-05-09) ------------------------------------------------ @@ -1280,6 +1333,8 @@ Noteworthy changes in version 2.0.4 (2007-05-09) * Improved the libgcrypt logging support in all modules. + See-also: gnupg-announce/2007q2/000254.html + Noteworthy changes in version 2.0.3 (2007-03-08) ------------------------------------------------ @@ -1300,6 +1355,8 @@ Noteworthy changes in version 2.0.3 (2007-03-08) * The PIN pad of the Cherry XX44 keyboard is now supported. The DINSIG and the NKS applications are now also aware of PIN pads. + See-also: gnupg-announce/2007q1/000252.html + Noteworthy changes in version 2.0.2 (2007-01-31) ------------------------------------------------ @@ -1318,6 +1375,8 @@ Noteworthy changes in version 2.0.2 (2007-01-31) * The status code BEGIN_SIGNING now shows the used hash algorithms. + See-also: gnupg-announce/2007q1/000249.html + Noteworthy changes in version 2.0.1 (2006-11-28) ------------------------------------------------ @@ -1331,12 +1390,16 @@ Noteworthy changes in version 2.0.1 (2006-11-28) * Fixed a buffer overflow in gpg2. [bug#728,CVE-2006-6169] + See-also: gnupg-announce/2006q4/000242.html + Noteworthy changes in version 2.0.0 (2006-11-11) ------------------------------------------------ * First stable version of a GnuPG integrating OpenPGP and S/MIME. + See-also: gnupg-announce/2006q4/000239.html + Noteworthy changes in version 1.9.95 (2006-11-06) ------------------------------------------------- @@ -1377,6 +1440,8 @@ Noteworthy changes in version 1.9.92 (2006-10-11) * Bug fixes. + See-also: gnupg-announce/2006q4/000236.html + Noteworthy changes in version 1.9.91 (2006-10-04) ------------------------------------------------- @@ -1878,6 +1943,8 @@ Noteworthy changes in version 1.3.2 (2003-05-27) of GnuPG and other OpenPGP programs, please do not use this algorithm. + See-also: gnupg-announce/2003q2/000153.html + Noteworthy changes in version 1.3.1 (2002-11-12) ------------------------------------------------ @@ -2204,6 +2271,8 @@ Noteworthy changes in version 1.0.7 (2002-04-29) * Read only keyrings are now handled as expected. + See-also: gnupg-announce/2002q2/000135.html + Noteworthy changes in version 1.0.6 (2001-05-29) ------------------------------------------------ @@ -2222,6 +2291,8 @@ Noteworthy changes in version 1.0.6 (2001-05-29) * non-writable keyrings are now correctly handled. + See-also: gnupg-announce/2001q2/000123.html + Noteworthy changes in version 1.0.5 (2001-04-29) ------------------------------------------------ @@ -2280,6 +2351,8 @@ Noteworthy changes in version 1.0.5 (2001-04-29) * New translations: Estonian, Turkish. + See-also: gnupg-announce/2001q2/000122.html + Noteworthy changes in version 1.0.4 (2000-10-17) ------------------------------------------------ @@ -2295,6 +2368,9 @@ Noteworthy changes in version 1.0.4 (2000-10-17) * --with-colons now works with --print-md[s]. + See-also: gnupg-announce/2000q4/000082.html + + Noteworthy changes in version 1.0.3 (2000-09-18) ------------------------------------------------ @@ -2326,6 +2402,8 @@ Noteworthy changes in version 1.0.3 (2000-09-18) this. Older versions of GnuPG don't support it, so they should be upgraded to at least 1.0.2 + See-also: gnupg-announce/2000q3/000075.html + Noteworthy changes in version 1.0.2 (2000-07-12) ---------------------------------------------- @@ -2384,6 +2462,9 @@ Noteworthy changes in version 1.0.2 (2000-07-12) * Danish translation + See-also: gnupg-announce/2000q3/000069.html + + Noteworthy changes in version 1.0.1 (1999-12-16) ----------------------------------- @@ -2415,6 +2496,8 @@ Noteworthy changes in version 1.0.1 (1999-12-16) * Removed the GNU Privacy Handbook from the distribution as it will go into a separate one. + See-also: gnupg-announce/1999q4/000050.html + Noteworthy changes in version 1.0.0 (1999-09-07) ----------------------------------- @@ -2424,6 +2507,8 @@ Noteworthy changes in version 1.0.0 (1999-09-07) * Changed the version number to GnuPG 2001 ;-) + See-also: gnupg-announce/1999q3/000037.html + Noteworthy changes in version 0.9.11 (1999-09-03) ------------------------------------ @@ -2435,6 +2520,8 @@ Noteworthy changes in version 0.9.11 (1999-09-03) * Fixed a problem when importing new subkeys (duplicated signatures). + See-also: gnupg-announce/1999q3/000036.html + Noteworthy changes in version 0.9.10 (1999-07-23) ------------------------------------ @@ -2443,6 +2530,8 @@ Noteworthy changes in version 0.9.10 (1999-07-23) * Cleaned up the dox a bit. + See-also: gnupg-announce/1999q3/000034.html + Noteworthy changes in version 0.9.9 ----------------------------------- @@ -2470,6 +2559,8 @@ Noteworthy changes in version 0.9.9 * New option --allow-non-selfsigned-uid to work around a problem with the German IN way of separating signing and encryption keys. + See-also: gnupg-announce/1999q3/000028.html + Noteworthy changes in version 0.9.8 (1999-06-26) ----------------------------------- @@ -2491,6 +2582,8 @@ Noteworthy changes in version 0.9.8 (1999-06-26) * Better support for HPUX. + See-also: gnupg-announce/1999q2/000016.html + Noteworthy changes in version 0.9.7 (1999-05-23) ----------------------------------- @@ -2500,6 +2593,8 @@ Noteworthy changes in version 0.9.7 (1999-05-23) * Enhanced some status outputs. + See-also: gnupg-announce/1999q2/000000.html + Noteworthy changes in version 0.9.6 (1999-05-06) ----------------------------------- @@ -2816,7 +2911,7 @@ Noteworthy changes in version 0.3.3 (1998-08-08) a copy of the old program. 2. Disable the network, make sure that you are the only user, be sure that there are no Trojan horses etc .... - 3. Use your old gpg (version 0.3.[12]) and set the + 3. Use your old gpg (version 0.3.1 or 0.3.2) and set the passphrases of ALL your secret keys to empty! (gpg --change-passphrase your-user-id). 4. Save your ownertrusts (see the next point) @@ -2829,7 +2924,7 @@ Noteworthy changes in version 0.3.3 (1998-08-08) * The format of the trust database has changed; you must delete the old one, so gnupg can create a new one. - IMPORTANT: Use version 0.3.[12] to save your assigned ownertrusts + IMPORTANT: Use version 0.3.1 or .2 to save your assigned ownertrusts ("gpgm --list-ownertrust >saved-trust"); then build this new version and restore the ownertrust with this new version ("gpgm --import-ownertrust saved-trust"). Please note that ----------------------------------------------------------------------- Summary of changes: NEWS | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 97 insertions(+), 2 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed Jan 4 19:18:51 2017 From: cvs at cvs.gnupg.org (by Daniel Kahn Gillmor) Date: Wed, 04 Jan 2017 19:18:51 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-34-g38671cf Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 38671cfe5a2a40bb991619f4cb992c42b5f1e8cd (commit) from 588121c158384b05099388097053d8d1e8bdf143 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 38671cfe5a2a40bb991619f4cb992c42b5f1e8cd Author: Daniel Kahn Gillmor Date: Wed Jan 4 08:31:06 2017 -0500 g10: avoid warning when --disable-tofu If configured with --disable-tofu, we see compiler warnings about an unused variable. This should remove those warnings. diff --git a/g10/trustdb.c b/g10/trustdb.c index d402cb2..c113b7e 100644 --- a/g10/trustdb.c +++ b/g10/trustdb.c @@ -1002,9 +1002,9 @@ tdb_get_validity_core (ctrl_t ctrl, ulong recno; #ifdef USE_TOFU unsigned int tofu_validity = TRUST_UNKNOWN; + int free_kb = 0; #endif unsigned int validity = TRUST_UNKNOWN; - int free_kb = 0; if (kb && pk) log_assert (keyid_cmp (pk_main_keyid (pk), ----------------------------------------------------------------------- Summary of changes: g10/trustdb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Thu Jan 5 09:31:33 2017 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Thu, 05 Jan 2017 09:31:33 +0100 Subject: [git] gnupg-doc - branch, master, updated. f505be91d601062afeb7f7f6ebdb68562931f8d2 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GnuPG website and other docs". The branch, master has been updated via f505be91d601062afeb7f7f6ebdb68562931f8d2 (commit) from 81d5fd92c46fb1e42a4cf5718985f55b9ec3644e (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit f505be91d601062afeb7f7f6ebdb68562931f8d2 Author: Werner Koch Date: Thu Jan 5 09:29:23 2017 +0100 web: Use level-2 headers for the release notes diff --git a/tools/news-file-to-org.awk b/tools/news-file-to-org.awk index 062b6fa..4384ce5 100644 --- a/tools/news-file-to-org.awk +++ b/tools/news-file-to-org.awk @@ -36,10 +36,10 @@ BEGIN { ml_base_url = "https://lists.gnupg.org/pipermail/" header_text["en"] = "" \ - "** GnuPG\n" ; + "* GnuPG\n" ; header_text["de"] = "" \ - "** GnuPG\n" ; + "* GnuPG\n" ; release_text["en"] = "released "; release_text["de"] = "ver?ffentlicht "; @@ -55,16 +55,16 @@ BEGIN { function flush() { if (in_section) { - printf "*** GnuPG " + printf "** GnuPG " if (seealso) printf "[[%s%s][%s]]", ml_base_url, seealso, hdr_version else printf "%s", hdr_version printf " %s (%s)\n", release_text[lang], hdr_reldate; printf "" \ - " :PROPERTIES:\n" \ - " :CUSTOM_ID: gnupg-%s\n" \ - " :END:\n\n", + " :PROPERTIES:\n" \ + " :CUSTOM_ID: gnupg-%s\n" \ + " :END:\n\n", hdr_version; print lines; } @@ -95,9 +95,9 @@ in_section && $0 ~ /^(Noteworthy|Version| Copyright)/ { sub (/^.*\(/, ""); sub (/\).*$/, ""); reldate = $0; - print "*** GnuPG " version " " release_text[lang] " (" reldate ")"; - printf " :PROPERTIES:\n :CUSTOM_ID: gnupg-%s\n", version; - print " :END:\n" + print "** GnuPG " version " " release_text[lang] " (" reldate ")"; + printf " :PROPERTIES:\n :CUSTOM_ID: gnupg-%s\n", version; + print " :END:\n" } next; } diff --git a/web/download/release_notes.org b/web/download/release_notes.org index 258f0b9..3a9efb4 100644 --- a/web/download/release_notes.org +++ b/web/download/release_notes.org @@ -5,16 +5,17 @@ #+GPGWEB-NEED-SWDB #+macro: announce [[https://lists.gnupg.org/pipermail/gnupg-announce/$1.html][Announcement]] -* Release Notes +* Release Notes for GnuPG - Please read the NEWS file for a more complete list. {{{gnupg_ver}}} + Please read the NEWS file for a more complete list. {{{gnupg21_ver}}} is the stable and modern version of GnuPG. (Version {{{gnupg1_ver}}} is from the old GnuPG-1 series, which is useful to decrypt PGP-2 encrypted data.) -** GnuPG-2 + Note that this page will soon be restructed. The URLs pointing to + specific releases will thus also change. -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2016q4/000400.html][2.1.17]] released (2016-12-20) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2016q4/000400.html][2.1.17]] released (2016-12-20) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.17 :END: @@ -54,7 +55,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2016q4/000398.html][2.1.16]] released (2016-11-18) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2016q4/000398.html][2.1.16]] released (2016-11-18) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.16 :END: @@ -130,7 +131,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2016q3/000396.html][2.1.15]] released (2016-08-18) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2016q3/000396.html][2.1.15]] released (2016-08-18) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.15 :END: @@ -185,7 +186,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2016q3/000393.html][2.1.14]] released (2016-07-14) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2016q3/000393.html][2.1.14]] released (2016-07-14) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.14 :END: @@ -247,7 +248,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2016q2/000390.html][2.1.13]] released (2016-06-16) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2016q2/000390.html][2.1.13]] released (2016-06-16) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.13 :END: @@ -301,7 +302,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2016q2/000387.html][2.1.12]] released (2016-05-04) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2016q2/000387.html][2.1.12]] released (2016-05-04) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.12 :END: @@ -358,7 +359,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2016q1/000383.html][2.1.11]] released (2016-01-26) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2016q1/000383.html][2.1.11]] released (2016-01-26) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.11 :END: @@ -413,7 +414,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q4/000381.html][2.1.10]] released (2015-12-04) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q4/000381.html][2.1.10]] released (2015-12-04) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.10 :END: @@ -475,7 +476,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q4/000380.html][2.1.9]] released (2015-10-09) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q4/000380.html][2.1.9]] released (2015-10-09) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.9 :END: @@ -509,7 +510,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q3/000379.html][2.1.8]] released (2015-09-10) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q3/000379.html][2.1.8]] released (2015-09-10) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.8 :END: @@ -540,7 +541,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q3/000371.html][2.1.7]] released (2015-08-11) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q3/000371.html][2.1.7]] released (2015-08-11) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.7 :END: @@ -569,7 +570,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q3/000370.html][2.1.6]] released (2015-07-01) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q3/000370.html][2.1.6]] released (2015-07-01) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.6 :END: @@ -603,7 +604,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q2/000369.html][2.1.5]] released (2015-06-11) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q2/000369.html][2.1.5]] released (2015-06-11) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.5 :END: @@ -621,7 +622,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q2/000366.html][2.1.4]] released (2015-05-12) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q2/000366.html][2.1.4]] released (2015-05-12) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.4 :END: @@ -650,7 +651,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q2/000365.html][2.1.3]] released (2015-04-11) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q2/000365.html][2.1.3]] released (2015-04-11) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.3 :END: @@ -691,7 +692,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q1/000361.html][2.1.2]] released (2015-02-11) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2015q1/000361.html][2.1.2]] released (2015-02-11) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.2 :END: @@ -729,7 +730,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2014q4/000360.html][2.1.1]] released (2014-12-16) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2014q4/000360.html][2.1.1]] released (2014-12-16) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.1 :END: @@ -785,7 +786,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2014q4/000358.html][2.1.0]] released (2014-11-06) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2014q4/000358.html][2.1.0]] released (2014-11-06) :PROPERTIES: :CUSTOM_ID: gnupg-2.1.0 :END: @@ -1098,82 +1099,82 @@ -*** GnuPG 2.0.28 released (2015-06-02) +** GnuPG 2.0.28 released (2015-06-02) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.28 :END: -*** GnuPG 2.0.27 released (2015-02-18) +** GnuPG 2.0.27 released (2015-02-18) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.27 :END: -*** GnuPG 2.0.26 released (2014-08-12) +** GnuPG 2.0.26 released (2014-08-12) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.26 :END: -*** GnuPG 2.0.25 released (2014-06-30) +** GnuPG 2.0.25 released (2014-06-30) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.25 :END: -*** GnuPG 2.0.24 released (2014-06-24) +** GnuPG 2.0.24 released (2014-06-24) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.24 :END: -*** GnuPG 2.0.23 released (2014-06-03) +** GnuPG 2.0.23 released (2014-06-03) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.23 :END: -*** GnuPG 2.0.22 released (2013-10-04) +** GnuPG 2.0.22 released (2013-10-04) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.22 :END: -*** GnuPG 2.0.21 released (2013-08-19) +** GnuPG 2.0.21 released (2013-08-19) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.21 :END: -*** GnuPG 2.0.20 released (2013-05-10) +** GnuPG 2.0.20 released (2013-05-10) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.20 :END: -*** GnuPG 2.0.19 released (2012-03-27) +** GnuPG 2.0.19 released (2012-03-27) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.19 :END: -*** GnuPG 2.0.18 released (2011-08-04) +** GnuPG 2.0.18 released (2011-08-04) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.18 :END: -*** GnuPG 2.0.17 released (2011-01-13) +** GnuPG 2.0.17 released (2011-01-13) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.17 :END: -*** GnuPG 2.0.16 released (2010-07-19) +** GnuPG 2.0.16 released (2010-07-19) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.16 :END: -*** GnuPG 2.0.15 released (2010-03-09) +** GnuPG 2.0.15 released (2010-03-09) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.15 :END: -*** GnuPG 2.0.14 released (2009-12-21) +** GnuPG 2.0.14 released (2009-12-21) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.14 :END: -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2009q3/000294.html][2.0.13]] released (2009-09-04) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2009q3/000294.html][2.0.13]] released (2009-09-04) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.13 :END: @@ -1203,7 +1204,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2009q2/000288.html][2.0.12]] released (2009-06-17) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2009q2/000288.html][2.0.12]] released (2009-06-17) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.12 :END: @@ -1234,7 +1235,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2009q1/000287.html][2.0.11]] released (2009-03-03) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2009q1/000287.html][2.0.11]] released (2009-03-03) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.11 :END: @@ -1254,7 +1255,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2009q1/000284.html][2.0.10]] released (2009-01-12) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2009q1/000284.html][2.0.10]] released (2009-01-12) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.10 :END: @@ -1313,7 +1314,7 @@ -*** GnuPG 2.0.9 released (2008-03-26) +** GnuPG 2.0.9 released (2008-03-26) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.9 :END: @@ -1339,7 +1340,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2007q4/000267.html][2.0.8]] released (2007-12-20) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2007q4/000267.html][2.0.8]] released (2007-12-20) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.8 :END: @@ -1377,7 +1378,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2007q3/000259.html][2.0.7]] released (2007-09-10) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2007q3/000259.html][2.0.7]] released (2007-09-10) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.7 :END: @@ -1399,7 +1400,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2007q3/000258.html][2.0.6]] released (2007-08-16) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2007q3/000258.html][2.0.6]] released (2007-08-16) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.6 :END: @@ -1418,7 +1419,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2007q3/000255.html][2.0.5]] released (2007-07-05) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2007q3/000255.html][2.0.5]] released (2007-07-05) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.5 :END: @@ -1439,7 +1440,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2007q2/000254.html][2.0.4]] released (2007-05-09) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2007q2/000254.html][2.0.4]] released (2007-05-09) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.4 :END: @@ -1455,7 +1456,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2007q1/000252.html][2.0.3]] released (2007-03-08) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2007q1/000252.html][2.0.3]] released (2007-03-08) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.3 :END: @@ -1479,7 +1480,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2007q1/000249.html][2.0.2]] released (2007-01-31) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2007q1/000249.html][2.0.2]] released (2007-01-31) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.2 :END: @@ -1501,7 +1502,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2006q4/000242.html][2.0.1]] released (2006-11-28) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2006q4/000242.html][2.0.1]] released (2006-11-28) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.1 :END: @@ -1518,7 +1519,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2006q4/000239.html][2.0.0]] released (2006-11-11) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2006q4/000239.html][2.0.0]] released (2006-11-11) :PROPERTIES: :CUSTOM_ID: gnupg-2.0.0 :END: @@ -1528,7 +1529,7 @@ -*** GnuPG 1.9.95 released (2006-11-06) +** GnuPG 1.9.95 released (2006-11-06) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.95 :END: @@ -1537,7 +1538,7 @@ -*** GnuPG 1.9.94 released (2006-10-24) +** GnuPG 1.9.94 released (2006-10-24) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.94 :END: @@ -1552,7 +1553,7 @@ -*** GnuPG 1.9.93 released (2006-10-18) +** GnuPG 1.9.93 released (2006-10-18) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.93 :END: @@ -1571,7 +1572,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2006q4/000236.html][1.9.92]] released (2006-10-11) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2006q4/000236.html][1.9.92]] released (2006-10-11) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.92 :END: @@ -1581,7 +1582,7 @@ -*** GnuPG 1.9.91 released (2006-10-04) +** GnuPG 1.9.91 released (2006-10-04) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.91 :END: @@ -1596,7 +1597,7 @@ -*** GnuPG 1.9.90 released (2006-09-25) +** GnuPG 1.9.90 released (2006-09-25) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.90 :END: @@ -1609,7 +1610,7 @@ -*** GnuPG 1.9.23 released (2006-09-18) +** GnuPG 1.9.23 released (2006-09-18) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.23 :END: @@ -1647,7 +1648,7 @@ -*** GnuPG 1.9.22 released (2006-07-27) +** GnuPG 1.9.22 released (2006-07-27) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.22 :END: @@ -1661,7 +1662,7 @@ -*** GnuPG 1.9.21 released (2006-06-20) +** GnuPG 1.9.21 released (2006-06-20) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.21 :END: @@ -1685,7 +1686,7 @@ -*** GnuPG 1.9.20 released (2005-12-20) +** GnuPG 1.9.20 released (2005-12-20) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.20 :END: @@ -1699,7 +1700,7 @@ -*** GnuPG 1.9.19 released (2005-09-12) +** GnuPG 1.9.19 released (2005-09-12) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.19 :END: @@ -1712,7 +1713,7 @@ -*** GnuPG 1.9.18 released (2005-08-01) +** GnuPG 1.9.18 released (2005-08-01) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.18 :END: @@ -1725,7 +1726,7 @@ -*** GnuPG 1.9.17 released (2005-06-20) +** GnuPG 1.9.17 released (2005-06-20) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.17 :END: @@ -1750,7 +1751,7 @@ -*** GnuPG 1.9.16 released (2005-04-21) +** GnuPG 1.9.16 released (2005-04-21) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.16 :END: @@ -1767,7 +1768,7 @@ -*** GnuPG 1.9.15 released (2005-01-13) +** GnuPG 1.9.15 released (2005-01-13) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.15 :END: @@ -1779,7 +1780,7 @@ -*** GnuPG 1.9.14 released (2004-12-22) +** GnuPG 1.9.14 released (2004-12-22) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.14 :END: @@ -1794,7 +1795,7 @@ -*** GnuPG 1.9.13 released (2004-12-03) +** GnuPG 1.9.13 released (2004-12-03) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.13 :END: @@ -1805,7 +1806,7 @@ -*** GnuPG 1.9.12 released (2004-10-22) +** GnuPG 1.9.12 released (2004-10-22) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.12 :END: @@ -1819,7 +1820,7 @@ -*** GnuPG 1.9.11 released (2004-10-01) +** GnuPG 1.9.11 released (2004-10-01) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.11 :END: @@ -1837,7 +1838,7 @@ -*** GnuPG 1.9.10 released (2004-07-22) +** GnuPG 1.9.10 released (2004-07-22) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.10 :END: @@ -1851,7 +1852,7 @@ -*** GnuPG 1.9.9 released (2004-06-08) +** GnuPG 1.9.9 released (2004-06-08) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.9 :END: @@ -1864,7 +1865,7 @@ -*** GnuPG 1.9.8 released (2004-04-29) +** GnuPG 1.9.8 released (2004-04-29) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.8 :END: @@ -1885,7 +1886,7 @@ -*** GnuPG 1.9.7 released (2004-04-06) +** GnuPG 1.9.7 released (2004-04-06) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.7 :END: @@ -1901,7 +1902,7 @@ -*** GnuPG 1.9.6 released (2004-03-06) +** GnuPG 1.9.6 released (2004-03-06) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.6 :END: @@ -1910,7 +1911,7 @@ -*** GnuPG 1.9.5 released (2004-02-21) +** GnuPG 1.9.5 released (2004-02-21) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.5 :END: @@ -1935,7 +1936,7 @@ -*** GnuPG 1.9.4 released (2004-01-30) +** GnuPG 1.9.4 released (2004-01-30) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.4 :END: @@ -1950,7 +1951,7 @@ -*** GnuPG 1.9.3 released (2003-12-23) +** GnuPG 1.9.3 released (2003-12-23) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.3 :END: @@ -1971,7 +1972,7 @@ -*** GnuPG 1.9.2 released (2003-11-17) +** GnuPG 1.9.2 released (2003-11-17) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.2 :END: @@ -1986,7 +1987,7 @@ -*** GnuPG 1.9.1 released (2003-09-06) +** GnuPG 1.9.1 released (2003-09-06) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.1 :END: @@ -2002,7 +2003,7 @@ -*** GnuPG 1.9.0 released (2003-08-05) +** GnuPG 1.9.0 released (2003-08-05) :PROPERTIES: :CUSTOM_ID: gnupg-1.9.0 :END: @@ -2037,107 +2038,107 @@ -*** GnuPG 1.4.19 released (2015-02-27) +** GnuPG 1.4.19 released (2015-02-27) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.19 :END: -*** GnuPG 1.4.18 released (2014-06-30) +** GnuPG 1.4.18 released (2014-06-30) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.18 :END: -*** GnuPG 1.4.17 released (2014-06-23) +** GnuPG 1.4.17 released (2014-06-23) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.17 :END: -*** GnuPG 1.4.16 released (2013-12-18) +** GnuPG 1.4.16 released (2013-12-18) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.16 :END: -*** GnuPG 1.4.15 released (2013-10-04) +** GnuPG 1.4.15 released (2013-10-04) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.15 :END: -*** GnuPG 1.4.14 released (2013-07-25) +** GnuPG 1.4.14 released (2013-07-25) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.14 :END: -*** GnuPG 1.4.13 released (2012-12-20) +** GnuPG 1.4.13 released (2012-12-20) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.13 :END: -*** GnuPG 1.4.12 released (2012-01-30) +** GnuPG 1.4.12 released (2012-01-30) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.12 :END: -*** GnuPG 1.4.11 released (2010-10-18) +** GnuPG 1.4.11 released (2010-10-18) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.11 :END: -*** GnuPG 1.4.10 released (2009-09-02) +** GnuPG 1.4.10 released (2009-09-02) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.10 :END: -*** GnuPG 1.4.9 released (2008-03-26) +** GnuPG 1.4.9 released (2008-03-26) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.9 :END: -*** GnuPG 1.4.8 released (2007-12-20) +** GnuPG 1.4.8 released (2007-12-20) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.8 :END: -*** GnuPG 1.4.7 released (2007-03-05) +** GnuPG 1.4.7 released (2007-03-05) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.7 :END: -*** GnuPG 1.4.6 released (2006-12-06) +** GnuPG 1.4.6 released (2006-12-06) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.6 :END: -*** GnuPG 1.4.5 released (2006-08-01) +** GnuPG 1.4.5 released (2006-08-01) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.5 :END: -*** GnuPG 1.4.4 released (2006-06-25) +** GnuPG 1.4.4 released (2006-06-25) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.4 :END: -*** GnuPG 1.4.3 released (2006-04-03) +** GnuPG 1.4.3 released (2006-04-03) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.3 :END: -*** GnuPG 1.4.2 released (2005-07-26) +** GnuPG 1.4.2 released (2005-07-26) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.2 :END: -*** GnuPG 1.4.1 released (2005-03-15) +** GnuPG 1.4.1 released (2005-03-15) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.1 :END: -*** GnuPG 1.4.0 released (2004-12-16) +** GnuPG 1.4.0 released (2004-12-16) :PROPERTIES: :CUSTOM_ID: gnupg-1.4.0 :END: -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2003q2/000153.html][1.3.2]] released (2003-05-27) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2003q2/000153.html][1.3.2]] released (2003-05-27) :PROPERTIES: :CUSTOM_ID: gnupg-1.3.2 :END: @@ -2240,7 +2241,7 @@ -*** GnuPG 1.3.1 released (2002-11-12) +** GnuPG 1.3.1 released (2002-11-12) :PROPERTIES: :CUSTOM_ID: gnupg-1.3.1 :END: @@ -2268,7 +2269,7 @@ -*** GnuPG 1.3.0 released (2002-10-18) +** GnuPG 1.3.0 released (2002-10-18) :PROPERTIES: :CUSTOM_ID: gnupg-1.3.0 :END: @@ -2310,52 +2311,52 @@ -*** GnuPG 1.2.8 released (2006-12-07) +** GnuPG 1.2.8 released (2006-12-07) :PROPERTIES: :CUSTOM_ID: gnupg-1.2.8 :END: -*** GnuPG 1.2.7 released (2004-12-27) +** GnuPG 1.2.7 released (2004-12-27) :PROPERTIES: :CUSTOM_ID: gnupg-1.2.7 :END: -*** GnuPG 1.2.6 released (2004-08-25) +** GnuPG 1.2.6 released (2004-08-25) :PROPERTIES: :CUSTOM_ID: gnupg-1.2.6 :END: -*** GnuPG 1.2.5 released (2004-07-26) +** GnuPG 1.2.5 released (2004-07-26) :PROPERTIES: :CUSTOM_ID: gnupg-1.2.5 :END: -*** GnuPG 1.2.4 released (2003-12-23) +** GnuPG 1.2.4 released (2003-12-23) :PROPERTIES: :CUSTOM_ID: gnupg-1.2.4 :END: -*** GnuPG 1.2.3 released (2003-08-21) +** GnuPG 1.2.3 released (2003-08-21) :PROPERTIES: :CUSTOM_ID: gnupg-1.2.3 :END: -*** GnuPG 1.2.2 released (2003-05-01) +** GnuPG 1.2.2 released (2003-05-01) :PROPERTIES: :CUSTOM_ID: gnupg-1.2.2 :END: -*** GnuPG 1.2.1 released (2002-10-25) +** GnuPG 1.2.1 released (2002-10-25) :PROPERTIES: :CUSTOM_ID: gnupg-1.2.1 :END: -*** GnuPG 1.2.0 released (2002-09-21) +** GnuPG 1.2.0 released (2002-09-21) :PROPERTIES: :CUSTOM_ID: gnupg-1.2.0 :END: -*** GnuPG 1.1.92 released (2002-09-11) +** GnuPG 1.1.92 released (2002-09-11) :PROPERTIES: :CUSTOM_ID: gnupg-1.1.92 :END: @@ -2405,7 +2406,7 @@ -*** GnuPG 1.1.91 released (2002-08-04) +** GnuPG 1.1.91 released (2002-08-04) :PROPERTIES: :CUSTOM_ID: gnupg-1.1.91 :END: @@ -2449,7 +2450,7 @@ -*** GnuPG 1.1.90 released (2002-07-01) +** GnuPG 1.1.90 released (2002-07-01) :PROPERTIES: :CUSTOM_ID: gnupg-1.1.90 :END: @@ -2504,7 +2505,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2002q2/000135.html][1.0.7]] released (2002-04-29) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2002q2/000135.html][1.0.7]] released (2002-04-29) :PROPERTIES: :CUSTOM_ID: gnupg-1.0.7 :END: @@ -2619,7 +2620,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2001q2/000123.html][1.0.6]] released (2001-05-29) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2001q2/000123.html][1.0.6]] released (2001-05-29) :PROPERTIES: :CUSTOM_ID: gnupg-1.0.6 :END: @@ -2641,7 +2642,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2001q2/000122.html][1.0.5]] released (2001-04-29) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2001q2/000122.html][1.0.5]] released (2001-04-29) :PROPERTIES: :CUSTOM_ID: gnupg-1.0.5 :END: @@ -2703,7 +2704,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2000q4/000082.html][1.0.4]] released (2000-10-17) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2000q4/000082.html][1.0.4]] released (2000-10-17) :PROPERTIES: :CUSTOM_ID: gnupg-1.0.4 :END: @@ -2722,7 +2723,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2000q3/000075.html][1.0.3]] released (2000-09-18) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2000q3/000075.html][1.0.3]] released (2000-09-18) :PROPERTIES: :CUSTOM_ID: gnupg-1.0.3 :END: @@ -2758,7 +2759,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2000q3/000069.html][1.0.2]] released (2000-07-12) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/2000q3/000069.html][1.0.2]] released (2000-07-12) :PROPERTIES: :CUSTOM_ID: gnupg-1.0.2 :END: @@ -2820,7 +2821,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/1999q4/000050.html][1.0.1]] released (1999-12-16) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/1999q4/000050.html][1.0.1]] released (1999-12-16) :PROPERTIES: :CUSTOM_ID: gnupg-1.0.1 :END: @@ -2856,7 +2857,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/1999q3/000037.html][1.0.0]] released (1999-09-07) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/1999q3/000037.html][1.0.0]] released (1999-09-07) :PROPERTIES: :CUSTOM_ID: gnupg-1.0.0 :END: @@ -2869,7 +2870,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/1999q3/000036.html][0.9.11]] released (1999-09-03) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/1999q3/000036.html][0.9.11]] released (1999-09-03) :PROPERTIES: :CUSTOM_ID: gnupg-0.9.11 :END: @@ -2884,7 +2885,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/1999q3/000034.html][0.9.10]] released (1999-07-23) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/1999q3/000034.html][0.9.10]] released (1999-07-23) :PROPERTIES: :CUSTOM_ID: gnupg-0.9.10 :END: @@ -2896,7 +2897,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/1999q2/000016.html][0.9.8]] released (1999-06-26) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/1999q2/000016.html][0.9.8]] released (1999-06-26) :PROPERTIES: :CUSTOM_ID: gnupg-0.9.8 :END: @@ -2921,7 +2922,7 @@ -*** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/1999q2/000000.html][0.9.7]] released (1999-05-23) +** GnuPG [[https://lists.gnupg.org/pipermail/gnupg-announce/1999q2/000000.html][0.9.7]] released (1999-05-23) :PROPERTIES: :CUSTOM_ID: gnupg-0.9.7 :END: @@ -2934,7 +2935,7 @@ -*** GnuPG 0.9.6 released (1999-05-06) +** GnuPG 0.9.6 released (1999-05-06) :PROPERTIES: :CUSTOM_ID: gnupg-0.9.6 :END: @@ -2952,7 +2953,7 @@ -*** GnuPG 0.9.5 released (1999-03-20) +** GnuPG 0.9.5 released (1999-03-20) :PROPERTIES: :CUSTOM_ID: gnupg-0.9.5 :END: @@ -2968,7 +2969,7 @@ -*** GnuPG 0.9.4 released (1999-03-08) +** GnuPG 0.9.4 released (1999-03-08) :PROPERTIES: :CUSTOM_ID: gnupg-0.9.4 :END: @@ -2982,7 +2983,7 @@ -*** GnuPG 0.9.3 released (1999-02-19) +** GnuPG 0.9.3 released (1999-02-19) :PROPERTIES: :CUSTOM_ID: gnupg-0.9.3 :END: @@ -3005,7 +3006,7 @@ -*** GnuPG 0.9.2 released (1999-01-01) +** GnuPG 0.9.2 released (1999-01-01) :PROPERTIES: :CUSTOM_ID: gnupg-0.9.2 :END: @@ -3020,7 +3021,7 @@ -*** GnuPG 0.9.1 released (1999-01-01) +** GnuPG 0.9.1 released (1999-01-01) :PROPERTIES: :CUSTOM_ID: gnupg-0.9.1 :END: @@ -3045,7 +3046,7 @@ -*** GnuPG 0.9.0 released (1998-12-23) +** GnuPG 0.9.0 released (1998-12-23) :PROPERTIES: :CUSTOM_ID: gnupg-0.9.0 :END: @@ -3069,7 +3070,7 @@ -*** GnuPG 0.4.5 released (1998-12-08) +** GnuPG 0.4.5 released (1998-12-08) :PROPERTIES: :CUSTOM_ID: gnupg-0.4.5 :END: @@ -3090,7 +3091,7 @@ -*** GnuPG 0.4.4 released (1998-11-20) +** GnuPG 0.4.4 released (1998-11-20) :PROPERTIES: :CUSTOM_ID: gnupg-0.4.4 :END: @@ -3125,7 +3126,7 @@ -*** GnuPG 0.4.3 released (1998-11-08) +** GnuPG 0.4.3 released (1998-11-08) :PROPERTIES: :CUSTOM_ID: gnupg-0.4.3 :END: @@ -3154,7 +3155,7 @@ -*** GnuPG 0.4.2 released (1998-10-18) +** GnuPG 0.4.2 released (1998-10-18) :PROPERTIES: :CUSTOM_ID: gnupg-0.4.2 :END: @@ -3198,7 +3199,7 @@ -*** GnuPG 0.4.1 released (1998-10-07) +** GnuPG 0.4.1 released (1998-10-07) :PROPERTIES: :CUSTOM_ID: gnupg-0.4.1 :END: @@ -3225,7 +3226,7 @@ -*** GnuPG 0.4.0 released (1998-09-18) +** GnuPG 0.4.0 released (1998-09-18) :PROPERTIES: :CUSTOM_ID: gnupg-0.4.0 :END: @@ -3244,7 +3245,7 @@ -*** GnuPG 0.3.5 released (1998-09-14) +** GnuPG 0.3.5 released (1998-09-14) :PROPERTIES: :CUSTOM_ID: gnupg-0.3.5 :END: @@ -3270,7 +3271,7 @@ -*** GnuPG 0.3.4 released (1998-08-11) +** GnuPG 0.3.4 released (1998-08-11) :PROPERTIES: :CUSTOM_ID: gnupg-0.3.4 :END: @@ -3283,7 +3284,7 @@ -*** GnuPG 0.3.3 released (1998-08-08) +** GnuPG 0.3.3 released (1998-08-08) :PROPERTIES: :CUSTOM_ID: gnupg-0.3.3 :END: @@ -3360,7 +3361,7 @@ -*** GnuPG 0.3.2 released (1998-07-09) +** GnuPG 0.3.2 released (1998-07-09) :PROPERTIES: :CUSTOM_ID: gnupg-0.3.2 :END: @@ -3377,7 +3378,7 @@ -*** GnuPG 0.3.1 released (1998-07-06) +** GnuPG 0.3.1 released (1998-07-06) :PROPERTIES: :CUSTOM_ID: gnupg-0.3.1 :END: @@ -3397,7 +3398,7 @@ -*** GnuPG 0.3.0 released (1998-06-25) +** GnuPG 0.3.0 released (1998-06-25) :PROPERTIES: :CUSTOM_ID: gnupg-0.3.0 :END: @@ -3427,7 +3428,7 @@ -*** GnuPG 0.2.19 released (1998-05-29) +** GnuPG 0.2.19 released (1998-05-29) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.19 :END: @@ -3452,7 +3453,7 @@ -*** GnuPG 0.2.18 released (1998-05-15) +** GnuPG 0.2.18 released (1998-05-15) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.18 :END: @@ -3481,7 +3482,7 @@ -*** GnuPG 0.2.17 released (1998-05-04) +** GnuPG 0.2.17 released (1998-05-04) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.17 :END: @@ -3500,7 +3501,7 @@ -*** GnuPG 0.2.16 released (1998-04-28) +** GnuPG 0.2.16 released (1998-04-28) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.16 :END: @@ -3517,7 +3518,7 @@ -*** GnuPG 0.2.15 released (1998-04-09) +** GnuPG 0.2.15 released (1998-04-09) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.15 :END: @@ -3535,7 +3536,7 @@ - Some new test cases -*** GnuPG 0.2.14 released (1998-04-02) +** GnuPG 0.2.14 released (1998-04-02) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.14 :END: @@ -3554,7 +3555,7 @@ -*** GnuPG 0.2.13 released (1998-03-10) +** GnuPG 0.2.13 released (1998-03-10) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.13 :END: @@ -3565,7 +3566,7 @@ -*** GnuPG 0.2.12 released (1998-03-07) +** GnuPG 0.2.12 released (1998-03-07) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.12 :END: @@ -3582,7 +3583,7 @@ - New option "--with-colons" to make parsing of key lists easier. -*** GnuPG 0.2.11 released (1998-03-02) +** GnuPG 0.2.11 released (1998-03-02) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.11 :END: @@ -3597,7 +3598,7 @@ and auto-regenerate the public key, next time the secret key is used? -*** GnuPG 0.2.10 released (1998-02-27) +** GnuPG 0.2.10 released (1998-02-27) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.10 :END: @@ -3622,7 +3623,7 @@ -*** GnuPG 0.2.9 released (1998-02-26) +** GnuPG 0.2.9 released (1998-02-26) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.9 :END: @@ -3634,7 +3635,7 @@ - Switched to automake1.2f and a newer gettext. -*** GnuPG 0.2.8 released (1998-02-24) +** GnuPG 0.2.8 released (1998-02-24) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.8 :END: @@ -3648,7 +3649,7 @@ -*** GnuPG 0.2.7 released (1998-02-18) +** GnuPG 0.2.7 released (1998-02-18) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.7 :END: @@ -3672,7 +3673,7 @@ - "make check" works. -*** GnuPG 0.2.6 released (1998-02-13) +** GnuPG 0.2.6 released (1998-02-13) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.6 :END: @@ -3681,7 +3682,7 @@ -*** GnuPG 0.2.5 released (1998-02-12) +** GnuPG 0.2.5 released (1998-02-12) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.5 :END: @@ -3696,7 +3697,7 @@ -*** GnuPG 0.2.4 released (1998-02-11) +** GnuPG 0.2.4 released (1998-02-11) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.4 :END: @@ -3711,7 +3712,7 @@ -*** GnuPG 0.2.3 released (1998-02-09) +** GnuPG 0.2.3 released (1998-02-09) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.3 :END: @@ -3766,228 +3767,228 @@ -*** GnuPG 0.2.2 released (1998-02-09) +** GnuPG 0.2.2 released (1998-02-09) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.2 :END: -*** GnuPG 0.2.1 released (1998-01-28) +** GnuPG 0.2.1 released (1998-01-28) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.1 :END: -*** GnuPG 0.2.0 released (1998-01-25) +** GnuPG 0.2.0 released (1998-01-25) :PROPERTIES: :CUSTOM_ID: gnupg-0.2.0 :END: -*** GnuPG 0.1.3 released (1998-01-12) +** GnuPG 0.1.3 released (1998-01-12) :PROPERTIES: :CUSTOM_ID: gnupg-0.1.3 :END: -*** GnuPG 0.1.2 released (1998-01-07) +** GnuPG 0.1.2 released (1998-01-07) :PROPERTIES: :CUSTOM_ID: gnupg-0.1.2 :END: -*** GnuPG 0.1.1 released (1998-01-07) +** GnuPG 0.1.1 released (1998-01-07) :PROPERTIES: :CUSTOM_ID: gnupg-0.1.1 :END: -*** GnuPG 0.1.0 released (1998-01-05) +** GnuPG 0.1.0 released (1998-01-05) :PROPERTIES: :CUSTOM_ID: gnupg-0.1.0 :END: -*** GnuPG 0.0.0 released (1997-12-20) +** GnuPG 0.0.0 released (1997-12-20) :PROPERTIES: :CUSTOM_ID: gnupg-0.0.0 :END: -** GnuPG-1 +* Release notes for the old 1.x versions -*** GnuPG 1.4.14 (2013-07-25) :important: +** GnuPG 1.4.14 (2013-07-25) :important: {{{announce(2013q3/000329)}}} -*** GnuPG 1.4.13 (2012-12-20) +** GnuPG 1.4.13 (2012-12-20) {{{announce(2012q4/000319)}}} -*** GnuPG 1.4.12 (2012-01-30) +** GnuPG 1.4.12 (2012-01-30) {{{announce(2012q1/000313)}}} -*** GnuPG 1.4.11 (2010-10-18) +** GnuPG 1.4.11 (2010-10-18) {{{announce(2010q4/000303)}}} -*** GnuPG 1.4.10 (2009-09-02) +** GnuPG 1.4.10 (2009-09-02) {{{announce(2009q3/000291)}}} -*** GnuPG 1.4.8 (2007-12-20) +** GnuPG 1.4.8 (2007-12-20) {{{announce(2007q4/000266)}}} -*** GnuPG 1.4.5 (2006-08-01) +** GnuPG 1.4.5 (2006-08-01) {{{announce(2006q3/000229)}}} -*** GnuPG 1.4.4 (2006-06-25) +** GnuPG 1.4.4 (2006-06-25) {{{announce(2006q2/000226)}}} -*** GnuPG 1.4.3 (2006-04-03) +** GnuPG 1.4.3 (2006-04-03) {{{announce(2006q2/000222)}}} -*** GnuPG 1.4.2 (2005-07-27) +** GnuPG 1.4.2 (2005-07-27) {{{announce(2005q3/000200)}}} -*** GnuPG 1.2.7 (2004-12-28) +** GnuPG 1.2.7 (2004-12-28) This is an update of the old stable branch.. {{{announce(2004q4/000188)}}} -*** GnuPG stable 1.4.0 (2004-12-16) +** GnuPG stable 1.4.0 (2004-12-16) This is the first relese of the new stable branch of GnuPG. {{{announce(2004q4/000186)}}} -*** GnuPG 1.3.93 (2004-12-14) +** GnuPG 1.3.93 (2004-12-14) The latest and hopefully last release candidate for GnuPG 1.4 is ready for public consumption. {{{announce(2004q4/000185)}}} -*** GnuPG 1.3.92 (2004-10-28) +** GnuPG 1.3.92 (2004-10-28) This is from the development branch. {{{announce(2004q4/000183)}}} -*** GnuPG 1.3.91 (2004-10-16) +** GnuPG 1.3.91 (2004-10-16) This is from the development branch. {{{announce(2004q4/000180)}}} -*** GnuPG 1.3.90 (2004-10-02) +** GnuPG 1.3.90 (2004-10-02) This is from the development branch. -*** GnuPG 1.2.6 (2004-08-26) +** GnuPG 1.2.6 (2004-08-26) {{{announce(2004q3/000176)}}} -*** GnuPG 1.2.5 (2004-07-27) +** GnuPG 1.2.5 (2004-07-27) {{{announce(2004q3/000171)}}} -*** GnuPG 1.3.6 (2004-05-22) +** GnuPG 1.3.6 (2004-05-22) This is from the development branch. {{{announce(2004q2/000168)}}} -*** GnuPG 1.3.5 (2004-02-26) +** GnuPG 1.3.5 (2004-02-26) This is from the development branch. {{{announce(2004q1/000165)}}} -*** GnuPG 1.2.4 (2003-12-24) +** GnuPG 1.2.4 (2003-12-24) {{{announce(2003q4)}}} -*** GnuPG 1.3.4 (2003-11-27) +** GnuPG 1.3.4 (2003-11-27) This is from the development branch. {{{announce(2003q4)}}} -*** GnuPG 1.3.3 (2003-10-10) +** GnuPG 1.3.3 (2003-10-10) This is from the development branch. {{{announce(2003q4/)}}} -*** GnuPG 1.2.3 (2003-08-22) +** GnuPG 1.2.3 (2003-08-22) {{{announce(2003q3/][[more]]] -*** GnuPG 1.3.2 (2003-05-27) +** GnuPG 1.3.2 (2003-05-27) This is from the development branch. {{{announce(2003q2/)}}} -*** GnuPG 1.2.2 (2003-05-03) +** GnuPG 1.2.2 (2003-05-03) {{{announce(2003q2/)}}} -*** GnuPG 1.3.1 (2002-11-12) +** GnuPG 1.3.1 (2002-11-12) This is from the development branch. -*** GnuPG 1.2.1 for Windows (2002-10-26) +** GnuPG 1.2.1 for Windows (2002-10-26) This is an update of Windows binary release {{{announce(2002q4/)}}} -*** GnuPG 1.2.1 (2002-10-25) +** GnuPG 1.2.1 (2002-10-25) -*** GnuPG 1.3.0 (2002-10-18) +** GnuPG 1.3.0 (2002-10-18) This is the first release of a new development branch. {{{announce(2002q4/)}}} -*** GnuPG 1.2.0 (2002-09-21) +** GnuPG 1.2.0 (2002-09-21) This is a new stable branch. {{{announce(2002q3/000252)}}} -*** GnuPG 1.0.7 (2002-04-29) +** GnuPG 1.0.7 (2002-04-29) {{{announce(2002q2/000251)}}} -*** GnuPG 1.0.6 (2001-05-29) +** GnuPG 1.0.6 (2001-05-29) -*** GnuPG 1.0.5 for Windows (2001-05-02) +** GnuPG 1.0.5 for Windows (2001-05-02) This is a binary release for Windows. -*** GnuPG 1.0.5 (2001-04-29) +** GnuPG 1.0.5 (2001-04-29) - The semantics of --verify have changed. - Corrected hash calculation for input data larger than 512M. @@ -3998,140 +3999,140 @@ - Estonian and Turkish translation. - The usual fixes and other enhancements. -*** Patch for GnuPG 1.0.4 (2000-11-30) +** Patch for GnuPG 1.0.4 (2000-11-30) Fixed a serious bug which could lead to false positives when checking detached signatures. -*** GnuPG 1.0.4 for Windows (2000-10-23) +** GnuPG 1.0.4 for Windows (2000-10-23) -*** GnuPG 1.0.3 (2000-09-20) +** GnuPG 1.0.3 (2000-09-20) - RSA support. - Supports the new MDC encryption packet. - Default options changed for better compatibility with PGP 7. - The usual fixes and other enhancements. -*** GnuPG 1.0.2 (2000-07-12) +** GnuPG 1.0.2 (2000-07-12) A lot of fixes and enhancements. -*** GnuPG 1.0.1 (1999-12-16) +** GnuPG 1.0.1 (1999-12-16) Bug fixes and small enhancements. -*** GnuPG 1.0.0 (1999-09-07) +** GnuPG 1.0.0 (1999-09-07) Released the first production version. -*** GnuPG 0.9.11 (1999-09-03) +** GnuPG 0.9.11 (1999-09-03) Some more fixes and cleanups. -*** GnuPG 0.9.10 (1999-08-04) +** GnuPG 0.9.10 (1999-08-04) Minor bug fixes. -*** GnuPG 0.9.9 (1999-07-23) +** GnuPG 0.9.9 (1999-07-23) - Yet another chunk of options. - More bug fixes. -*** GnuPG 0.9.8 (1999-06-26) +** GnuPG 0.9.8 (1999-06-26) - A couple of new options. - Yet another workaround for PGP2. - Other bug fixes. -*** GnuPG 0.9.7 (1999-05-23) +** GnuPG 0.9.7 (1999-05-23) - Workarounds for a couple of PGP2 bugs. - Other bug fixes. -*** GnuPG 0.9.6 (1999-05-06) +** GnuPG 0.9.6 (1999-05-06) - Bug fixes. - Subkey and signature revocations. -*** GnuPG 0.9.5 (1999-03-20) +** GnuPG 0.9.5 (1999-03-20) - Bug fixes. - --recv-keys command -*** GnuPG 0.9.4 (1999-03-08) +** GnuPG 0.9.4 (1999-03-08) Bug fixes. -*** GnuPG 0.9.3 (1999-02-19) +** GnuPG 0.9.3 (1999-02-19) - Bug fixes. - Some new options. -*** GnuPG 0.9.2 (1999-01-20) +** GnuPG 0.9.2 (1999-01-20) - Bug fixes. - HKP keyserver support. -*** GnuPG 0.9.1 (1999-01-01) +** GnuPG 0.9.1 (1999-01-01) - Fixed some serious bugs. - Some internal redesign. - Polish language support. - Setup a anonymous rsync server. -*** GnuPG 0.9.0 (1998-12-23) +** GnuPG 0.9.0 (1998-12-23) - Option to dash-escape "From" in clear text messages. - Better support for unices without /dev/random. - Fixed some bugs. -*** GnuPG 0.4.5 (1998-12-08) +** GnuPG 0.4.5 (1998-12-08) - Brazilian translation. - Improved key import. - Loadable random gathering stuff. - Files are now locked during updates. -*** GnuPG 0.4.4 (1998-11-20) +** GnuPG 0.4.4 (1998-11-20) - Spanish translation. - Fixed the way expiration dates are stored. - Key validation is now much faster and some more bugs fixed. - New feature to support signed patch files. -*** GnuPG 0.4.3 (1998-11-08) +** GnuPG 0.4.3 (1998-11-08) - Russian translation. - Now lists all matching names. - Experimental support for keyrings store in GDBM files. - Many bug fixes. -*** GnuPG 0.4.1 (1998-10-07) +** GnuPG 0.4.1 (1998-10-07) - Fixed a couple of bugs and add some more features. - Checked OpenPGP compliance. - PGP 5 passphrase are now working. -*** GnuPG 0.4.0 (1998-09-18) +** GnuPG 0.4.0 (1998-09-18) - Fixed a serious Bug in 0.3.5. - Added 3DES. -*** GnuPG 0.3.5 (1998-09-14) +** GnuPG 0.3.5 (1998-09-14) - Do not use this version! - Anonymous enciphered messages. - Building in another directory now work better. - Blowfish weak key detection mechanism. -*** GnuPG 0.3.4 (1998-08-11) +** GnuPG 0.3.4 (1998-08-11) Relased revision 0.3.4. -*** GnuPG 0.3.3 (1998-08-08) +** GnuPG 0.3.3 (1998-08-08) - Alternate user IDs. - A menu to sign, add, remove user ids and other tasks. @@ -4139,16 +4140,16 @@ experimental cipher algorithm. - Ability to run as a coprocess; this is nice for frontends. -*** GnuPG 0.3.2 (1998-07-09) +** GnuPG 0.3.2 (1998-07-09) Bug fixes. -*** GnuPG 0.3.1 (1998-07-06) +** GnuPG 0.3.1 (1998-07-06) - Bug fixes. - More in compliance with OpenPGP. -*** GnuPG 0.3.0 (1998-06-25) +** GnuPG 0.3.0 (1998-06-25) - Major enhancements. - More complete v4 key support: Preferences and expiration time is set @@ -4157,7 +4158,7 @@ interoperable with pgp5. - Support for dynamic loading of new algorithms. -*** GnuPG 0.2.19 (1998-05-29) +** GnuPG 0.2.19 (1998-05-29) - Tiger has now the OpenPGP assigned number 6. Because the OID has changed, old signatures using this algorithm can't be verified. @@ -4168,14 +4169,14 @@ valid OpenPGP keys. - Some new features for better integration into MUAs. -*** GnuPG 0.2.18 (1998-05-15) +** GnuPG 0.2.18 (1998-05-15) - Add key generation for DSA and v4 signatures. - Fixed a small bug in the key generation. - New option =--compress-algo 1= to allow the creation of compressed messages which are readable by PGP. -*** GnuPG 0.2.17 (1998-05-04) +** GnuPG 0.2.17 (1998-05-04) - More stuff for OpenPGP: Blowfish is now type 20, comment packets moved to a private type, packet type 3 now prepends conventional @@ -4183,28 +4184,28 @@ - Fixed a passphrase bug and some others. -*** GnuPG 0.2.16 (1998-04-28) +** GnuPG 0.2.16 (1998-04-28) - Experimental support for TIGER/192. - Standard cipher is now Blowfish with 128 bit key in OpenPGP's CFB mode. -*** GnuPG 0.2.15 (1998-04-09) +** GnuPG 0.2.15 (1998-04-09) - Fixed a bug with the old checksum calculation for secret keys. - CAST5 works (using PGP's strange CFB mode). -*** GnuPG 0.0.0 (1997-12-20) +** GnuPG 0.0.0 (1997-12-20) First release. -** Related Software +* Related Software -*** GnuPG Explorer Extension (GPGee) 1.2.1 (2005-09-08) +** GnuPG Explorer Extension (GPGee) 1.2.1 (2005-09-08) {{{announce(2005q3/000203)}}} -*** GnuPG Explorer Extension (GPGee) 1.2.0 (2005-09-06) +** GnuPG Explorer Extension (GPGee) 1.2.0 (2005-09-06) {{{announce(2005q3/000202)}}} ----------------------------------------------------------------------- Summary of changes: tools/news-file-to-org.awk | 18 +- web/download/release_notes.org | 491 +++++++++++++++++++++-------------------- 2 files changed, 255 insertions(+), 254 deletions(-) hooks/post-receive -- The GnuPG website and other docs http://git.gnupg.org From cvs at cvs.gnupg.org Thu Jan 5 14:18:02 2017 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Thu, 05 Jan 2017 14:18:02 +0100 Subject: [git] GpgOL - branch, master, updated. gpgol-1.4.0-234-g5e4374f Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG extension for MS Outlook". The branch, master has been updated via 5e4374f2f617bc322c2e13b54a588ac2d2092d2a (commit) from 0dc7cc2ebf78a61a739b2aca76e9fd7b6e0a5a3a (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 5e4374f2f617bc322c2e13b54a588ac2d2092d2a Author: Andre Heinecke Date: Thu Jan 5 14:17:17 2017 +0100 Fix crash when sending plain text mails * src/mimemaker.cpp (add_body): Fix boundary handling. diff --git a/src/mimemaker.cpp b/src/mimemaker.cpp index dbed524..58bb0d4 100644 --- a/src/mimemaker.cpp +++ b/src/mimemaker.cpp @@ -1300,7 +1300,7 @@ add_body (Mail *mail, const char *boundary, sink_t sink, if (plain_body) { rc = write_part (sink, plain_body, strlen (plain_body), - *boundary? boundary : NULL, NULL, 1); + boundary, NULL, 1); } /* Just the plain body or no body. We are done. */ return rc; ----------------------------------------------------------------------- Summary of changes: src/mimemaker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- GnuPG extension for MS Outlook http://git.gnupg.org From cvs at cvs.gnupg.org Thu Jan 5 17:10:58 2017 From: cvs at cvs.gnupg.org (by Justus Winter) Date: Thu, 05 Jan 2017 17:10:58 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-36-g168c8c9 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 168c8c9d79a817c1f08a9ef976dab377f8c4c69e (commit) via 4ded213698123a425393b89a800fda2a4ec5229d (commit) from 38671cfe5a2a40bb991619f4cb992c42b5f1e8cd (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 168c8c9d79a817c1f08a9ef976dab377f8c4c69e Author: Justus Winter Date: Thu Jan 5 17:05:59 2017 +0100 tests: New test for --{show,override}-session-key. * tests/openpgp/Makefile.am (XTESTS): Add new test. * tests/openpgp/decrypt-session-key.scm: New file. Signed-off-by: Justus Winter diff --git a/tests/openpgp/Makefile.am b/tests/openpgp/Makefile.am index c7ef5e6..c93857f 100644 --- a/tests/openpgp/Makefile.am +++ b/tests/openpgp/Makefile.am @@ -50,6 +50,7 @@ XTESTS = \ decrypt.scm \ decrypt-multifile.scm \ decrypt-dsa.scm \ + decrypt-session-key.scm \ sigs.scm \ sigs-dsa.scm \ encrypt.scm \ diff --git a/tests/openpgp/decrypt-session-key.scm b/tests/openpgp/decrypt-session-key.scm new file mode 100755 index 0000000..771b53d --- /dev/null +++ b/tests/openpgp/decrypt-session-key.scm @@ -0,0 +1,45 @@ +#!/usr/bin/env gpgscm + +;; Copyright (C) 2017 g10 Code GmbH +;; +;; This file is part of GnuPG. +;; +;; GnuPG is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3 of the License, or +;; (at your option) any later version. +;; +;; GnuPG is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see . + +(load (with-path "defs.scm")) +(setup-legacy-environment) + +(define (get-session-key filename) + (lettmp (sink) + (let* ((status' (call-popen `(, at gpg --status-fd=1 --decrypt + --show-session-key + --output ,sink ,filename) "")) + (status (map (lambda (l) + (assert (string-prefix? l "[GNUPG:] ")) + (string-splitp (substring l 9 (string-length l)) + char-whitespace? -1)) + (string-split-newlines status')))) + (cadr (assoc "SESSION_KEY" status))))) + +(for-each-p + "Checking decryption of supplied files using the session key." + (lambda (name) + (let* ((source (in-srcdir (string-append name ".asc"))) + (key (get-session-key source))) + (with-ephemeral-home-directory + (tr:do + (tr:open source) + (tr:gpg "" `(--yes --decrypt --override-session-key ,key)) + (tr:assert-identity name))))) + plain-files) commit 4ded213698123a425393b89a800fda2a4ec5229d Author: Justus Winter Date: Thu Jan 5 17:00:36 2017 +0100 tests: Fix macro. * tests/openpgp/defs.scm (with-ephemeral-home-directory): Make hygienic, use define-macro, do not change to the ephemeral home directory. * tests/gpgsm/setup.scm: Change to the ephemeral home directory. * tests/openpgp/setup.scm: Likewise. Signed-off-by: Justus Winter diff --git a/tests/gpgsm/setup.scm b/tests/gpgsm/setup.scm index fdf277d..91821a0 100644 --- a/tests/gpgsm/setup.scm +++ b/tests/gpgsm/setup.scm @@ -24,6 +24,7 @@ (error "Usage: setup.scm --create-tarball ...")) (with-ephemeral-home-directory + (chdir (getenv "GNUPGHOME")) (create-gpgsmhome) (stop-agent) (call-check `(,(tool 'gpgtar) --create --output ,(car tarball) "."))) diff --git a/tests/openpgp/defs.scm b/tests/openpgp/defs.scm index 863d128..837e096 100644 --- a/tests/openpgp/defs.scm +++ b/tests/openpgp/defs.scm @@ -222,14 +222,16 @@ ;; Evaluate a sequence of expressions with an ephemeral home ;; directory. -(macro (with-ephemeral-home-directory form) - `(let ((original-home-directory (getenv "GNUPGHOME"))) - (with-temporary-working-directory - (define ephemeral-home-directory (getcwd)) - (dynamic-wind - (lambda () (setenv "GNUPGHOME" ephemeral-home-directory #t)) - (lambda () ,@(cdr form)) - (lambda () (setenv "GNUPGHOME" original-home-directory #t)))))) +(define-macro (with-ephemeral-home-directory . expressions) + (let ((original-home-directory (gensym)) + (ephemeral-home-directory (gensym))) + `(let ((,original-home-directory (getenv "GNUPGHOME")) + (,ephemeral-home-directory (mkdtemp))) + (finally (unlink-recursively ,ephemeral-home-directory) + (dynamic-wind + (lambda () (setenv "GNUPGHOME" ,ephemeral-home-directory #t)) + (lambda () , at expressions) + (lambda () (setenv "GNUPGHOME" ,original-home-directory #t))))))) ;; Call GPG to obtain the hash sums. Either specify an input file in ;; ARGS, or an string in INPUT. Returns a list of ( diff --git a/tests/openpgp/setup.scm b/tests/openpgp/setup.scm index abe1157..d13799d 100755 --- a/tests/openpgp/setup.scm +++ b/tests/openpgp/setup.scm @@ -23,6 +23,7 @@ (fail "Usage: setup.scm --create-tarball ")) (with-ephemeral-home-directory + (chdir (getenv "GNUPGHOME")) (create-gpghome) (create-legacy-gpghome) (stop-agent) ----------------------------------------------------------------------- Summary of changes: tests/gpgsm/setup.scm | 1 + tests/openpgp/Makefile.am | 1 + ...onventional-mdc.scm => decrypt-session-key.scm} | 45 ++++++++++------------ tests/openpgp/defs.scm | 18 +++++---- tests/openpgp/setup.scm | 1 + 5 files changed, 33 insertions(+), 33 deletions(-) copy tests/openpgp/{conventional-mdc.scm => decrypt-session-key.scm} (50%) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Thu Jan 5 17:29:22 2017 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Thu, 05 Jan 2017 17:29:22 +0100 Subject: [git] GpgOL - branch, master, updated. gpgol-1.4.0-235-g1e42345 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG extension for MS Outlook". The branch, master has been updated via 1e42345f8fed6c9d9ec10c87b4b23d79dc7fb9de (commit) from 5e4374f2f617bc322c2e13b54a588ac2d2092d2a (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 1e42345f8fed6c9d9ec10c87b4b23d79dc7fb9de Author: Andre Heinecke Date: Thu Jan 5 17:25:44 2017 +0100 Allow different UUIDs for the same mail * src/oomhelp.cpp (get_unique_id): Always create one if called with create parameter. -- Outlook can have multiple Event Handler for the Same Mail. E.g. If you attach a mail to another mail it becomes so decoupled that it has it's own event handler. We must handle that case to avoid messing up or event handling / internal state. It is now: One UUID for One mailitem-events handler. diff --git a/src/oomhelp.cpp b/src/oomhelp.cpp index 9570eaf..87665d2 100644 --- a/src/oomhelp.cpp +++ b/src/oomhelp.cpp @@ -1621,22 +1621,21 @@ get_unique_id (LPDISPATCH mail, int create, const char *uuid) } /* Get the User Properties. */ - char *uid = get_pa_string (mail, GPGOL_UID_DASL); - if (!uid) + if (!create) { - log_debug ("%s:%s: No uuid found in oom for '%p'", - SRCNAME, __func__, mail); - - if (!create) + char *uid = get_pa_string (mail, GPGOL_UID_DASL); + if (!uid) { + log_debug ("%s:%s: No uuid found in oom for '%p'", + SRCNAME, __func__, mail); return NULL; } - } - else - { - log_debug ("%s:%s: Found uid '%s' for '%p'", - SRCNAME, __func__, uid, mail); - return uid; + else + { + log_debug ("%s:%s: Found uid '%s' for '%p'", + SRCNAME, __func__, uid, mail); + return uid; + } } char *newuid; if (!uuid) ----------------------------------------------------------------------- Summary of changes: src/oomhelp.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) hooks/post-receive -- GnuPG extension for MS Outlook http://git.gnupg.org From cvs at cvs.gnupg.org Thu Jan 5 17:54:06 2017 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Thu, 05 Jan 2017 17:54:06 +0100 Subject: [git] GpgOL - branch, master, updated. gpgol-1.4.0-236-g474f02a Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG extension for MS Outlook". The branch, master has been updated via 474f02a9278b8755bd99ba79fa018212be08baf1 (commit) from 1e42345f8fed6c9d9ec10c87b4b23d79dc7fb9de (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 474f02a9278b8755bd99ba79fa018212be08baf1 Author: Andre Heinecke Date: Thu Jan 5 17:42:50 2017 +0100 Hide WKD Option for now -- Does not work yet because of missing HTTPS support and we would also need to change the gpg.conf setting. Let's hope we can revert this soon. diff --git a/src/addin-options.cpp b/src/addin-options.cpp index d08b71a..083d89e 100644 --- a/src/addin-options.cpp +++ b/src/addin-options.cpp @@ -44,7 +44,7 @@ set_labels (HWND dlg) { IDC_SIGN_DEFAULT, N_("&Sign new messages by default")}, { IDC_INLINE_PGP, N_("&Send OpenPGP mails without " "attachments as inline-pgp")}, - { IDC_AUTORRESOLVE, N_("&Search for OpenPGP keys automatically when encrypting")}, +// { IDC_AUTORRESOLVE, N_("&Search for OpenPGP keys automatically when encrypting")}, { IDC_GPG_OPTIONS, N_("Debug...")}, @@ -94,8 +94,8 @@ options_window_proc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) #endif SendDlgItemMessage (hDlg, IDC_INLINE_PGP, BM_SETCHECK, !!opt.inline_pgp, 0L); - SendDlgItemMessage (hDlg, IDC_AUTORRESOLVE, BM_SETCHECK, - !!opt.autoresolve, 0L); +// SendDlgItemMessage (hDlg, IDC_AUTORRESOLVE, BM_SETCHECK, +// !!opt.autoresolve, 0L); enable_disable_opts (hDlg); set_labels (hDlg); ShowWindow (GetDlgItem (hDlg, IDC_GPG_OPTIONS), @@ -133,8 +133,8 @@ options_window_proc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) opt.inline_pgp = !!SendDlgItemMessage (hDlg, IDC_INLINE_PGP, BM_GETCHECK, 0, 0L); - opt.autoresolve = !!SendDlgItemMessage - (hDlg, IDC_AUTORRESOLVE, BM_GETCHECK, 0, 0L); +// opt.autoresolve = !!SendDlgItemMessage +//// (hDlg, IDC_AUTORRESOLVE, BM_GETCHECK, 0, 0L); write_options (); EndDialog (hDlg, TRUE); diff --git a/src/dialogs.rc b/src/dialogs.rc index a3ee628..ba8cb8c 100644 --- a/src/dialogs.rc +++ b/src/dialogs.rc @@ -329,7 +329,7 @@ BEGIN /* Send options box. */ GROUPBOX "send-options", IDC_G_SEND, - 9, 50, 250, 60 + 9, 50, 250, 50 CONTROL "encrypt-by-default", IDC_ENCRYPT_DEFAULT, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, @@ -343,9 +343,9 @@ BEGIN "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 24, 82, 215, 10 - CONTROL "autoresolve", IDC_AUTORRESOLVE, - "Button", BS_AUTOCHECKBOX | WS_TABSTOP, - 24, 93, 215, 10 +// CONTROL "autoresolve", IDC_AUTORRESOLVE, +// "Button", BS_AUTOCHECKBOX | WS_TABSTOP, +// 24, 93, 215, 10 /* Stuff at the lower left corner. */ LTEXT "GpgOL by Gpg4win", IDC_GPG4WIN_STRING, ----------------------------------------------------------------------- Summary of changes: src/addin-options.cpp | 10 +++++----- src/dialogs.rc | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) hooks/post-receive -- GnuPG extension for MS Outlook http://git.gnupg.org From cvs at cvs.gnupg.org Thu Jan 5 20:45:54 2017 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Thu, 05 Jan 2017 20:45:54 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-38-g6170eb8 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 6170eb809033c9d144abf3b1f31f8b936878cdd4 (commit) via 353f6ff37646ad4c24d309a495e6c6f41e5235e3 (commit) from 168c8c9d79a817c1f08a9ef976dab377f8c4c69e (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 6170eb809033c9d144abf3b1f31f8b936878cdd4 Author: Werner Koch Date: Thu Jan 5 20:42:55 2017 +0100 Silence two -Wlogical-op warnings. * common/tlv.c (parse_ber_header): Avoid compiler warning about a duplicate condition. * tools/gpgtar-create.c (pattern_valid_p): Likewise. Signed-off-by: Werner Koch diff --git a/common/tlv.c b/common/tlv.c index 6813c58..0058b67 100644 --- a/common/tlv.c +++ b/common/tlv.c @@ -214,9 +214,9 @@ parse_ber_header (unsigned char const **buffer, size_t *size, else { unsigned long len = 0; - int count = c & 0x7f; + int count = (c & 0x7f); - if (count > sizeof (len) || count > sizeof (size_t)) + if (count > (sizeof(len)= 'a' && *pattern <= 'z') commit 353f6ff37646ad4c24d309a495e6c6f41e5235e3 Author: Werner Koch Date: Thu Jan 5 20:25:16 2017 +0100 doc: Mention gpgv in the description of gpg --verify. -- Signed-off-by: Werner Koch diff --git a/doc/gpg.texi b/doc/gpg.texi index 469e548..4ea2cd2 100644 --- a/doc/gpg.texi +++ b/doc/gpg.texi @@ -255,6 +255,13 @@ out the actual signed data, but there are other pitfalls with this format as well. It is suggested to avoid cleartext signatures in favor of detached signatures. +Note: Sometimes the use of the @command{gpgv} tool is easier than +using the full-fledged @command{gpg} with this option. @command{gpgv} +is designed to compare signed data against a list of trusted keys and +returns with success only for a good signature. It has its own manual +page. + + @item --multifile @opindex multifile This modifies certain other commands to accept multiple files for ----------------------------------------------------------------------- Summary of changes: common/tlv.c | 4 ++-- doc/gpg.texi | 7 +++++++ tools/gpgtar-create.c | 6 +++++- 3 files changed, 14 insertions(+), 3 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 6 01:49:37 2017 From: cvs at cvs.gnupg.org (by NIIBE Yutaka) Date: Fri, 06 Jan 2017 01:49:37 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-39-g8a41e73 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 8a41e73c31adb86d4a7dca4da695e5ad1347811f (commit) from 6170eb809033c9d144abf3b1f31f8b936878cdd4 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 8a41e73c31adb86d4a7dca4da695e5ad1347811f Author: NIIBE Yutaka Date: Fri Jan 6 09:14:13 2017 +0900 scd: Support multiple readers by CCID driver. * scd/apdu.c (new_reader_slot): Lock is now in apdu_dev_list_start. (close_pcsc_reader_direct, close_ccid_reader): RDRNAME is handled... (apdu_close_reader): ... by this function now. (apdu_prepare_exit): Likewise. (open_ccid_reader): Open with dev_list. (apdu_dev_list_start, apdu_dev_list_finish): New. (apdu_open_one_reader): New. (apdu_open_reader): Support multiple readers. * scd/app.c (select_application): With SCAN, opening all readers available, and register as new APP. (app_write_learn_status): app->ref_count == 0 is valid for APP which is not yet used. (app_list_start, app_list_finish): New. * scd/ccid-driver.c (struct ccid_driver_s): Remove RID and BCD_DEVICE. Add BAI. (parse_ccid_descriptor): BCD_DEVICE is now on the arguments. (ccid_dev_scan, ccid_dev_scan_finish): New. (ccid_get_BAI, ccid_compare_BAI, ccid_open_usb_reader): New. (ccid_open_reader): Support multiple readers. (ccid_set_progress_cb, ccid_close_reader): No RID any more. -- With this change, multiple readers/tokens are supported by the internal CCID driver of GnuPG. Until the changes of upper layers (scdaemon, gpg-agent, and gpg front end), only a single reader is used, though. Signed-off-by: NIIBE Yutaka diff --git a/scd/apdu.c b/scd/apdu.c index d0b75c8..50363ce 100644 --- a/scd/apdu.c +++ b/scd/apdu.c @@ -66,6 +66,13 @@ #define CCID_DRIVER_INCLUDE_USB_IDS 1 #include "ccid-driver.h" +struct dev_list { + struct ccid_dev_table *ccid_table; + const char *portstr; + int idx; + int idx_max; +}; + /* Due to conflicting use of threading libraries we usually can't link against libpcsclite if we are using Pth. Instead we use a wrapper program. Note that with nPth there is no need for a wrapper. */ @@ -428,7 +435,6 @@ new_reader_slot (void) { int i, reader = -1; - npth_mutex_lock (&reader_table_lock); for (i=0; i < MAX_READER; i++) if (!reader_table[i].used) { @@ -436,7 +442,6 @@ new_reader_slot (void) reader_table[reader].used = 1; break; } - npth_mutex_unlock (&reader_table_lock); if (reader == -1) { @@ -1428,8 +1433,6 @@ static int close_pcsc_reader_direct (int slot) { pcsc_release_context (reader_table[slot].pcsc.context); - xfree (reader_table[slot].rdrname); - reader_table[slot].rdrname = NULL; return 0; } #endif /*!NEED_PCSC_WRAPPER*/ @@ -2432,7 +2435,6 @@ static int close_ccid_reader (int slot) { ccid_close_reader (reader_table[slot].ccid.handle); - reader_table[slot].rdrname = NULL; return 0; } @@ -2566,7 +2568,7 @@ ccid_pinpad_operation (int slot, int class, int ins, int p0, int p1, /* Open the reader and try to read an ATR. */ static int -open_ccid_reader (const char *portstr) +open_ccid_reader (struct dev_list *dl) { int err; int slot; @@ -2577,8 +2579,8 @@ open_ccid_reader (const char *portstr) return -1; slotp = reader_table + slot; - err = ccid_open_reader (&slotp->ccid.handle, portstr, - (const char **)&slotp->rdrname); + err = ccid_open_reader (dl->portstr, dl->idx, dl->ccid_table, + &slotp->ccid.handle, &slotp->rdrname); if (err) { slotp->used = 0; @@ -2611,12 +2613,7 @@ open_ccid_reader (const char *portstr) unlock_slot (slot); return slot; } - - - #endif /* HAVE_LIBUSB */ - - #ifdef USE_G10CODE_RAPDU /* @@ -2919,63 +2916,80 @@ open_rapdu_reader (int portno, /* Driver Access */ +gpg_error_t +apdu_dev_list_start (const char *portstr, struct dev_list **l_p) +{ + gpg_error_t err; + struct dev_list *dl = xtrymalloc (sizeof (struct dev_list)); + *l_p = NULL; + if (!dl) + return gpg_error_from_syserror (); -/* Open the reader and return an internal slot number or -1 on - error. If PORTSTR is NULL we default to a suitable port (for ctAPI: - the first USB reader. For PC/SC the first listed reader). */ -int -apdu_open_reader (const char *portstr) -{ - static int pcsc_api_loaded, ct_api_loaded; - int slot; + dl->portstr = portstr; + dl->idx = 0; - if (DBG_READER) - log_debug ("enter: apdu_open_reader: portstr=%s\n", portstr); + npth_mutex_lock (&reader_table_lock); #ifdef HAVE_LIBUSB - if (!opt.disable_ccid) + if (opt.disable_ccid) { - static int once_available; - int i; - const char *s; - - slot = open_ccid_reader (portstr); - if (slot != -1) - { - once_available = 1; - if (DBG_READER) - log_debug ("leave: apdu_open_reader => slot=%d [ccid]\n", slot); - return slot; /* got one */ - } + dl->ccid_table = NULL; + dl->idx_max = 1; + } + else + { + err = ccid_dev_scan (&dl->idx_max, &dl->ccid_table); + if (err) + return err; - /* If we ever loaded successfully loaded a CCID reader we never - want to fallback to another driver. This solves a problem - where ccid was used, the card unplugged and then scdaemon - tries to find a new reader and will eventually try PC/SC over - and over again. To reset this flag "gpgconf --kill scdaemon" - can be used. */ - if (once_available) + if (dl->idx_max == 0) { - if (DBG_READER) - log_debug ("leave: apdu_open_reader => slot=-1 (once_avail)\n"); - return -1; - } - - /* If a CCID reader specification has been given, the user does - not want a fallback to other drivers. */ - if (portstr) - for (s=portstr, i=0; *s; s++) - if (*s == ':' && (++i == 3)) + /* If a CCID reader specification has been given, the user does + not want a fallback to other drivers. */ + if (portstr && strlen (portstr) > 5 && portstr[4] == ':') { if (DBG_READER) log_debug ("leave: apdu_open_reader => slot=-1 (no ccid)\n"); - return -1; + + xfree (dl); + npth_mutex_unlock (&reader_table_lock); + return gpg_error (GPG_ERR_ENODEV); } + else + dl->idx_max = 1; + } } - +#else + dl->ccid_table = NULL; + dl->idx_max = 1; #endif /* HAVE_LIBUSB */ + *l_p = dl; + return 0; +} + +void +apdu_dev_list_finish (struct dev_list *dl) +{ + ccid_dev_scan_finish (dl->ccid_table, dl->idx_max); + xfree (dl); + npth_mutex_unlock (&reader_table_lock); +} + + +/* Open the reader and return an internal slot number or -1 on + error. If PORTSTR is NULL we default to a suitable port (for ctAPI: + the first USB reader. For PC/SC the first listed reader). */ +static int +apdu_open_one_reader (const char *portstr) +{ + static int pcsc_api_loaded, ct_api_loaded; + int slot; + + if (DBG_READER) + log_debug ("enter: apdu_open_reader: portstr=%s\n", portstr); + if (opt.ctapi_driver && *opt.ctapi_driver) { int port = portstr? atoi (portstr) : 32768; @@ -3005,7 +3019,6 @@ apdu_open_reader (const char *portstr) return open_ct_reader (port); } - /* No ctAPI configured, so lets try the PC/SC API */ if (!pcsc_api_loaded) { @@ -3099,6 +3112,96 @@ apdu_open_reader (const char *portstr) return slot; } +int +apdu_open_reader (struct dev_list *dl) +{ + int slot; + + if (dl->ccid_table) + { /* CCID readers. */ + int readerno; + + /* See whether we want to use the reader ID string or a reader + number. A readerno of -1 indicates that the reader ID string is + to be used. */ + if (dl->portstr && strchr (dl->portstr, ':')) + readerno = -1; /* We want to use the readerid. */ + else if (dl->portstr) + { + readerno = atoi (dl->portstr); + if (readerno < 0) + { + return -1; + } + } + else + readerno = 0; /* Default. */ + + if (readerno > 0) + { /* Use single, the specific reader. */ + if (readerno >= dl->idx_max) + return -1; + + dl->idx = readerno; + dl->portstr = NULL; + slot = open_ccid_reader (dl); + dl->idx = dl->idx_max; + if (slot >= 0) + return slot; + else + return -1; + } + + while (dl->idx < dl->idx_max) + { + unsigned int bai = ccid_get_BAI (dl->idx, dl->ccid_table); + + if (DBG_READER) + log_debug ("apdu_open_reader: BAI=%x\n", bai); + + /* Check identity by BAI against already opened HANDLEs. */ + for (slot = 0; slot < MAX_READER; slot++) + if (reader_table[slot].used + && ccid_compare_BAI (reader_table[slot].ccid.handle, bai)) + break; + + if (slot == MAX_READER) + { /* Found a new device. */ + if (DBG_READER) + log_debug ("apdu_open_reader: new device=%x\n", bai); + + slot = open_ccid_reader (dl); + + dl->idx++; + if (slot >= 0) + return slot; + else + { + /* Skip this reader. */ + log_error ("ccid open error: skip\n"); + continue; + } + } + else + dl->idx++; + } + + slot = -1; + } + else + { /* PC/SC readers. */ + if (dl->idx++ == 0) + slot = apdu_open_one_reader (dl->portstr); + else + slot = -1; + } + + if (DBG_READER) + log_debug ("leave: apdu_open_reader => slot=%d [ccid]\n", slot); + + return slot; +} + /* Open an remote reader and return an internal slot number or -1 on error. This function is an alternative to apdu_open_reader and used @@ -3177,6 +3280,8 @@ apdu_close_reader (int slot) log_debug ("leave: apdu_close_reader => 0x%x (close_reader)\n", sw); return sw; } + xfree (reader_table[slot].rdrname); + reader_table[slot].rdrname = NULL; reader_table[slot].used = 0; if (DBG_READER) log_debug ("leave: apdu_close_reader => SW_HOST_NOT_SUPPORTED\n"); @@ -3204,6 +3309,8 @@ apdu_prepare_exit (void) apdu_disconnect (slot); if (reader_table[slot].close_reader) reader_table[slot].close_reader (slot); + xfree (reader_table[slot].rdrname); + reader_table[slot].rdrname = NULL; reader_table[slot].used = 0; } npth_mutex_unlock (&reader_table_lock); diff --git a/scd/apdu.h b/scd/apdu.h index 3021cf7..473def5 100644 --- a/scd/apdu.h +++ b/scd/apdu.h @@ -74,6 +74,7 @@ enum { SW_HOST_ALREADY_CONNECTED = 0x1000f }; +struct dev_list; #define SW_EXACT_LENGTH_P(a) (((a)&~0xff) == SW_EXACT_LENGTH) @@ -86,8 +87,11 @@ enum { gpg_error_t apdu_init (void); +gpg_error_t apdu_dev_list_start (const char *portstr, struct dev_list **l_p); +void apdu_dev_list_finish (struct dev_list *l); + /* Note, that apdu_open_reader returns no status word but -1 on error. */ -int apdu_open_reader (const char *portstr); +int apdu_open_reader (struct dev_list *l); int apdu_open_remote_reader (const char *portstr, const unsigned char *cookie, size_t length, int (*readfnc) (void *opaque, @@ -117,9 +121,9 @@ int apdu_reset (int slot); int apdu_get_status (int slot, int hang, unsigned int *status); int apdu_check_pinpad (int slot, int command, pininfo_t *pininfo); int apdu_pinpad_verify (int slot, int class, int ins, int p0, int p1, - pininfo_t *pininfo); + pininfo_t *pininfo); int apdu_pinpad_modify (int slot, int class, int ins, int p0, int p1, - pininfo_t *pininfo); + pininfo_t *pininfo); int apdu_send_simple (int slot, int extended_mode, int class, int ins, int p0, int p1, int lc, const char *data); diff --git a/scd/app-common.h b/scd/app-common.h index 781bf46..2371818 100644 --- a/scd/app-common.h +++ b/scd/app-common.h @@ -121,6 +121,9 @@ size_t app_help_read_length_of_cert (int slot, int fid, size_t *r_certoff); /*-- app.c --*/ +app_t app_list_start (void); +void app_list_finish (void); + void app_dump_state (void); void application_notify_card_reset (int slot); gpg_error_t check_application_conflict (const char *name, app_t app); diff --git a/scd/app.c b/scd/app.c index a499724..6db9e27 100644 --- a/scd/app.c +++ b/scd/app.c @@ -319,22 +319,30 @@ app_new_register (int slot, ctrl_t ctrl, const char *name) gpg_error_t select_application (ctrl_t ctrl, const char *name, app_t *r_app, int scan) { - gpg_error_t err; + gpg_error_t err = 0; app_t app; - int slot; *r_app = NULL; - if ((scan && !app_top) - /* FIXME: Here, we can change code to support multiple readers. - For now, we only open a single reader. - */ - || !app_top) + if (scan || !app_top) { - slot = apdu_open_reader (opt.reader_port); - if (slot >= 0) + struct dev_list *l; + + err = apdu_dev_list_start (opt.reader_port, &l); + if (err) + return err; + + while (1) { - int sw = apdu_connect (slot); + int slot; + int sw; + + slot = apdu_open_reader (l); + if (slot < 0) + break; + + err = 0; + sw = apdu_connect (slot); if (sw == SW_HOST_CARD_INACTIVE) { @@ -346,23 +354,17 @@ select_application (ctrl_t ctrl, const char *name, app_t *r_app, int scan) err = 0; else err = gpg_error (GPG_ERR_ENODEV); + + if (!err) + err = app_new_register (slot, ctrl, name); + else + apdu_close_reader (slot); } - else - err = gpg_error (GPG_ERR_ENODEV); - if (!err) - err = app_new_register (slot, ctrl, name); - else - apdu_close_reader (slot); + apdu_dev_list_finish (l); } - else - err = 0; - - if (!err) - app = app_top; - else - app = NULL; + app = app_top; if (app) { lock_app (app, ctrl); @@ -552,8 +554,6 @@ app_write_learn_status (app_t app, ctrl_t ctrl, unsigned int flags) if (!app) return gpg_error (GPG_ERR_INV_VALUE); - if (!app->ref_count) - return gpg_error (GPG_ERR_CARD_NOT_INITIALIZED); if (!app->fnc.learn_status) return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); @@ -1071,3 +1071,16 @@ initialize_module_command (void) return apdu_init (); } + +app_t +app_list_start (void) +{ + npth_mutex_lock (&app_list_lock); + return app_top; +} + +void +app_list_finish (void) +{ + npth_mutex_unlock (&app_list_lock); +} diff --git a/scd/ccid-driver.c b/scd/ccid-driver.c index 6d81122..5e02628 100644 --- a/scd/ccid-driver.c +++ b/scd/ccid-driver.c @@ -239,12 +239,11 @@ static struct struct ccid_driver_s { libusb_device_handle *idev; - char *rid; int dev_fd; /* -1 for USB transport or file descriptor of the transport device. */ + unsigned int bai; unsigned short id_vendor; unsigned short id_product; - unsigned short bcd_device; int ifc_no; int ep_bulk_out; int ep_bulk_in; @@ -744,14 +743,13 @@ prepare_special_transport (ccid_driver_t handle) Note, that this code is based on the one in lsusb.c of the usb-utils package, I wrote on 2003-09-01. -wk. */ static int -parse_ccid_descriptor (ccid_driver_t handle, +parse_ccid_descriptor (ccid_driver_t handle, unsigned short bcd_device, const unsigned char *buf, size_t buflen) { unsigned int i; unsigned int us; int have_t1 = 0, have_tpdu=0; - handle->nonnull_nad = 0; handle->auto_ifsd = 0; handle->max_ifsd = 32; @@ -761,7 +759,7 @@ parse_ccid_descriptor (ccid_driver_t handle, handle->auto_param = 0; handle->auto_pps = 0; DEBUGOUT_3 ("idVendor: %04X idProduct: %04X bcdDevice: %04X\n", - handle->id_vendor, handle->id_product, handle->bcd_device); + handle->id_vendor, handle->id_product, bcd_device); if (buflen < 54 || buf[0] < 54) { DEBUGOUT ("CCID device descriptor is too short\n"); @@ -964,11 +962,11 @@ parse_ccid_descriptor (ccid_driver_t handle, */ if (handle->id_vendor == VENDOR_SCM && handle->max_ifsd > 48 - && ( (handle->id_product == SCM_SCR331 && handle->bcd_device < 0x0516) - ||(handle->id_product == SCM_SCR331DI && handle->bcd_device < 0x0620) - ||(handle->id_product == SCM_SCR335 && handle->bcd_device < 0x0514) - ||(handle->id_product == SCM_SPR532 && handle->bcd_device < 0x0504) - ||(handle->id_product == SCM_SCR3320 && handle->bcd_device < 0x0522) + && ( (handle->id_product == SCM_SCR331 && bcd_device < 0x0516) + ||(handle->id_product == SCM_SCR331DI && bcd_device < 0x0620) + ||(handle->id_product == SCM_SCR335 && bcd_device < 0x0514) + ||(handle->id_product == SCM_SPR532 && bcd_device < 0x0504) + ||(handle->id_product == SCM_SCR3320 && bcd_device < 0x0522) )) { DEBUGOUT ("enabling workaround for buggy SCM readers\n"); @@ -1534,23 +1532,33 @@ ccid_vendor_specific_init (ccid_driver_t handle) } -/* Open the reader with the internal number READERNO and return a - pointer to be used as handle in HANDLE. Returns 0 on success. */ -int -ccid_open_reader (ccid_driver_t *handle, const char *readerid, - const char **rdrname_p) -{ - int rc = 0; - libusb_device_handle *idev = NULL; - int dev_fd = -1; - char *rid = NULL; - unsigned char *ifcdesc_extra = NULL; +#define MAX_DEVICE 4 /* See MAX_READER in apdu.c. */ + +struct ccid_dev_table { + int n; /* Index to ccid_usb_dev_list */ + int transport; + int interface_number; + int setting_number; + unsigned char *ifcdesc_extra; + int ep_bulk_out; + int ep_bulk_in; + int ep_intr; size_t ifcdesc_extra_len; - int readerno; - int ifc_no, set_no, ep_bulk_out, ep_bulk_in, ep_intr; - struct libusb_device_descriptor desc; +}; - *handle = NULL; +static libusb_device **ccid_usb_dev_list; +static struct ccid_dev_table ccid_dev_table[MAX_DEVICE]; + +gpg_error_t +ccid_dev_scan (int *idx_max_p, struct ccid_dev_table **t_p) +{ + ssize_t n; + libusb_device *dev; + int i; + int ifc_no; + int set_no; + int idx = 0; + int err = 0; if (!initialized_usb) { @@ -1558,122 +1566,379 @@ ccid_open_reader (ccid_driver_t *handle, const char *readerid, initialized_usb = 1; } - /* See whether we want to use the reader ID string or a reader - number. A readerno of -1 indicates that the reader ID string is - to be used. */ - if (readerid && strchr (readerid, ':')) - readerno = -1; /* We want to use the readerid. */ - else if (readerid) + n = libusb_get_device_list (NULL, &ccid_usb_dev_list); + for (i = 0; i < n; i++) + { + struct libusb_config_descriptor *config; + struct libusb_device_descriptor desc; + + dev = ccid_usb_dev_list[i]; + + if (libusb_get_device_descriptor (dev, &desc)) + continue; + + if (libusb_get_active_config_descriptor (dev, &config)) + continue; + + for (ifc_no=0; ifc_no < config->bNumInterfaces; ifc_no++) + for (set_no=0; set_no < config->interface[ifc_no].num_altsetting; + set_no++) + { + const struct libusb_interface_descriptor *ifcdesc; + + ifcdesc = &config->interface[ifc_no].altsetting[set_no]; + /* The second condition is for older SCM SPR 532 who did + not know about the assigned CCID class. The third + condition does the same for a Cherry SmartTerminal + ST-2000. Instead of trying to interpret the strings + we simply check the product ID. */ + if (ifcdesc && ifcdesc->extra + && ((ifcdesc->bInterfaceClass == 11 + && ifcdesc->bInterfaceSubClass == 0 + && ifcdesc->bInterfaceProtocol == 0) + || (ifcdesc->bInterfaceClass == 255 + && desc.idVendor == VENDOR_SCM + && desc.idProduct == SCM_SPR532) + || (ifcdesc->bInterfaceClass == 255 + && desc.idVendor == VENDOR_CHERRY + && desc.idProduct == CHERRY_ST2000))) + { + /* Found a reader. */ + unsigned char *ifcdesc_extra; + + ifcdesc_extra = malloc (ifcdesc->extra_length); + if (!ifcdesc_extra) + { + err = gpg_error_from_syserror (); + libusb_free_config_descriptor (config); + goto scan_finish; + } + memcpy (ifcdesc_extra, ifcdesc->extra, ifcdesc->extra_length); + + ccid_dev_table[idx].transport = TRANSPORT_USB; + ccid_dev_table[idx].n = i; + ccid_dev_table[idx].interface_number = ifc_no; + ccid_dev_table[idx].setting_number = set_no; + ccid_dev_table[idx].ifcdesc_extra = ifcdesc_extra; + ccid_dev_table[idx].ifcdesc_extra_len = ifcdesc->extra_length; + ccid_dev_table[idx].ep_bulk_out = find_endpoint (ifcdesc, 0); + ccid_dev_table[idx].ep_bulk_in = find_endpoint (ifcdesc, 1); + ccid_dev_table[idx].ep_intr = find_endpoint (ifcdesc, 2); + + idx++; + if (idx >= MAX_DEVICE) + { + libusb_free_config_descriptor (config); + err = 0; + goto scan_finish; + } + } + } + + libusb_free_config_descriptor (config); + } + + /* Now check whether there are any devices with special transport types. */ + for (i=0; transports[i].name; i++) { - readerno = atoi (readerid); - if (readerno < 0) + if (access (transports[i].name, (R_OK|W_OK)) == 0) { - DEBUGOUT ("no CCID readers found\n"); - rc = CCID_DRIVER_ERR_NO_READER; - goto leave; + /* Found a device. */ + DEBUGOUT_1 ("Found CCID reader %d\n", idx); + + ccid_dev_table[idx].transport = TRANSPORT_CM4040; + ccid_dev_table[idx].n = i; + ccid_dev_table[idx].interface_number = 0; + ccid_dev_table[idx].setting_number = 0; + ccid_dev_table[idx].ifcdesc_extra = NULL; + ccid_dev_table[idx].ifcdesc_extra_len = 0; + ccid_dev_table[idx].ep_bulk_out = 0; + ccid_dev_table[idx].ep_bulk_in = 0; + ccid_dev_table[idx].ep_intr = 0; + + idx++; + if (idx >= MAX_DEVICE) + goto scan_finish; } } - else - readerno = 0; /* Default. */ - if (scan_or_find_devices (readerno, readerid, &rid, &desc, &ifcdesc_extra, - &ifcdesc_extra_len, &ifc_no, &set_no, &ep_bulk_out, - &ep_bulk_in, &ep_intr, &idev, &dev_fd)) + scan_finish: + + if (err) + { + *idx_max_p = 0; + *t_p = NULL; + for (i = 0; i < idx; i++) + { + free (ccid_dev_table[idx].ifcdesc_extra); + ccid_dev_table[idx].transport = 0; + ccid_dev_table[idx].n = 0; + ccid_dev_table[idx].interface_number = 0; + ccid_dev_table[idx].setting_number = 0; + ccid_dev_table[idx].ifcdesc_extra = NULL; + ccid_dev_table[idx].ifcdesc_extra_len = 0; + ccid_dev_table[idx].ep_bulk_out = 0; + ccid_dev_table[idx].ep_bulk_in = 0; + ccid_dev_table[idx].ep_intr = 0; + } + libusb_free_device_list (ccid_usb_dev_list, 1); + ccid_usb_dev_list = NULL; + } + else { - if (readerno == -1) - DEBUGOUT_1 ("no CCID reader with ID %s\n", readerid ); + *idx_max_p = idx; + if (idx) + *t_p = ccid_dev_table; else - DEBUGOUT_1 ("no CCID reader with number %d\n", readerno ); - rc = CCID_DRIVER_ERR_NO_READER; - goto leave; + *t_p = NULL; } - /* Okay, this is a CCID reader. */ - *handle = calloc (1, sizeof **handle); - if (!*handle) + return err; +} + +void +ccid_dev_scan_finish (struct ccid_dev_table *tbl, int max) +{ + int i; + + for (i = 0; i < max; i++) { - DEBUGOUT ("out of memory\n"); - rc = CCID_DRIVER_ERR_OUT_OF_CORE; - goto leave; + free (tbl[i].ifcdesc_extra); + tbl[i].transport = 0; + tbl[i].n = 0; + tbl[i].interface_number = 0; + tbl[i].setting_number = 0; + tbl[i].ifcdesc_extra = NULL; + tbl[i].ifcdesc_extra_len = 0; + tbl[i].ep_bulk_out = 0; + tbl[i].ep_bulk_in = 0; + tbl[i].ep_intr = 0; } - (*handle)->rid = rid; - if (idev) /* Regular USB transport. */ + libusb_free_device_list (ccid_usb_dev_list, 1); + ccid_usb_dev_list = NULL; +} + +unsigned int +ccid_get_BAI (int idx, struct ccid_dev_table *tbl) +{ + int n; + int bus, addr, intf; + unsigned int bai; + + if (tbl[idx].transport == TRANSPORT_USB) { - (*handle)->idev = idev; - (*handle)->dev_fd = -1; - (*handle)->id_vendor = desc.idVendor; - (*handle)->id_product = desc.idProduct; - (*handle)->bcd_device = desc.bcdDevice; - (*handle)->ifc_no = ifc_no; - (*handle)->ep_bulk_out = ep_bulk_out; - (*handle)->ep_bulk_in = ep_bulk_in; - (*handle)->ep_intr = ep_intr; + libusb_device *dev; + + n = tbl[idx].n; + dev = ccid_usb_dev_list[n]; + + bus = libusb_get_bus_number (dev); + addr = libusb_get_device_address (dev); + intf = tbl[idx].interface_number; + bai = (bus << 16) | (addr << 8) | intf; } - else if (dev_fd != -1) /* Device transport. */ + else { - (*handle)->idev = NULL; - (*handle)->dev_fd = dev_fd; - (*handle)->id_vendor = 0; /* Magic vendor for special transport. */ - (*handle)->id_product = ifc_no; /* Transport type */ - prepare_special_transport (*handle); + n = tbl[idx].n; + bai = 0xFFFF0000 | n; } - else + + return bai; +} + +int +ccid_compare_BAI (ccid_driver_t handle, unsigned int bai) +{ + return handle->bai == bai; +} + +static int +ccid_open_usb_reader (const char *spec_reader_name, + int idx, struct ccid_dev_table *ccid_table, + ccid_driver_t *handle, char **rdrname_p) +{ + libusb_device *dev; + libusb_device_handle *idev = NULL; + char *rid; + int rc = 0; + int ifc_no, set_no; + struct libusb_device_descriptor desc; + int n; + int bus, addr; + unsigned int bai; + + n = ccid_table[idx].n; + ifc_no = ccid_table[idx].interface_number; + set_no = ccid_table[idx].setting_number; + + dev = ccid_usb_dev_list[n]; + bus = libusb_get_bus_number (dev); + addr = libusb_get_device_address (dev); + bai = (bus << 16) | (addr << 8) | ifc_no; + + rc = libusb_open (dev, &idev); + if (rc) { - assert (!"no transport"); /* Bug. */ + DEBUGOUT_1 ("usb_open failed: %s\n", libusb_error_name (rc)); + free (*handle); + *handle = NULL; + return rc; } - DEBUGOUT_2 ("using CCID reader %d (ID=%s)\n", readerno, rid ); + rc = libusb_get_device_descriptor (dev, &desc); + if (rc) + { + libusb_close (idev); + free (*handle); + *handle = NULL; + return rc; + } - if (idev) + rid = make_reader_id (idev, desc.idVendor, desc.idProduct, + desc.iSerialNumber); + + /* Check to see if reader name matches the spec. */ + if (spec_reader_name + && strncmp (rid, spec_reader_name, strlen (spec_reader_name))) { - if (parse_ccid_descriptor (*handle, ifcdesc_extra, ifcdesc_extra_len)) - { - DEBUGOUT ("device not supported\n"); - rc = CCID_DRIVER_ERR_NO_READER; - goto leave; - } + DEBUGOUT ("device not matched\n"); + rc = CCID_DRIVER_ERR_NO_READER; + goto leave; + } - rc = libusb_claim_interface (idev, ifc_no); + (*handle)->id_vendor = desc.idVendor; + (*handle)->id_product = desc.idProduct; + (*handle)->idev = idev; + (*handle)->dev_fd = -1; + (*handle)->bai = bai; + (*handle)->ifc_no = ifc_no; + (*handle)->ep_bulk_out = ccid_table[idx].ep_bulk_out; + (*handle)->ep_bulk_in = ccid_table[idx].ep_bulk_in; + (*handle)->ep_intr = ccid_table[idx].ep_intr; + + DEBUGOUT_2 ("using CCID reader %d (ID=%s)\n", idx, rid); + + if (parse_ccid_descriptor (*handle, desc.bcdDevice, + ccid_table[idx].ifcdesc_extra, + ccid_table[idx].ifcdesc_extra_len)) + { + DEBUGOUT ("device not supported\n"); + rc = CCID_DRIVER_ERR_NO_READER; + goto leave; + } + + rc = libusb_claim_interface (idev, ifc_no); + if (rc) + { + DEBUGOUT_1 ("usb_claim_interface failed: %d\n", rc); + rc = CCID_DRIVER_ERR_CARD_IO_ERROR; + goto leave; + } + + if (set_no != 0) + { + rc = libusb_set_interface_alt_setting (idev, ifc_no, set_no); if (rc) { - DEBUGOUT_1 ("usb_claim_interface failed: %d\n", rc); + DEBUGOUT_1 ("usb_set_interface_alt_setting failed: %d\n", rc); rc = CCID_DRIVER_ERR_CARD_IO_ERROR; goto leave; } - - if (set_no != 0) - { - rc = libusb_set_interface_alt_setting (idev, ifc_no, set_no); - if (rc) - { - DEBUGOUT_1 ("usb_set_interface_alt_setting failed: %d\n", rc); - rc = CCID_DRIVER_ERR_CARD_IO_ERROR; - goto leave; - } - } } rc = ccid_vendor_specific_init (*handle); leave: - free (ifcdesc_extra); if (rc) { free (rid); - if (idev) - libusb_close (idev); - if (dev_fd != -1) - close (dev_fd); + libusb_close (idev); free (*handle); *handle = NULL; } else - if (rdrname_p) - *rdrname_p = (*handle)->rid; + { + if (rdrname_p) + *rdrname_p = rid; + else + free (rid); + } return rc; } +/* Open the reader with the internal number READERNO and return a + pointer to be used as handle in HANDLE. Returns 0 on success. */ +int +ccid_open_reader (const char *spec_reader_name, + int idx, struct ccid_dev_table *ccid_table, + ccid_driver_t *handle, char **rdrname_p) +{ + int n; + int fd; + char *rid; + + *handle = calloc (1, sizeof **handle); + if (!*handle) + { + DEBUGOUT ("out of memory\n"); + return CCID_DRIVER_ERR_OUT_OF_CORE; + } + + if (ccid_table[idx].transport == TRANSPORT_USB) + return ccid_open_usb_reader (spec_reader_name, idx, ccid_table, + handle, rdrname_p); + + /* Special transport support. */ + + n = ccid_table[idx].n; + fd = open (transports[n].name, O_RDWR); + if (fd < 0) + { + DEBUGOUT_2 ("failed to open '%s': %s\n", + transports[n].name, strerror (errno)); + free (*handle); + *handle = NULL; + return -1; + } + + rid = malloc (strlen (transports[n].name) + 30 + 10); + if (!rid) + { + close (fd); + free (*handle); + *handle = NULL; + return -1; /* Error. */ + } + + sprintf (rid, "0000:%04X:%s:0", transports[n].type, transports[n].name); + + /* Check to see if reader name matches the spec. */ + if (spec_reader_name + && strncmp (rid, spec_reader_name, strlen (spec_reader_name))) + { + DEBUGOUT ("device not matched\n"); + free (rid); + close (fd); + free (*handle); + *handle = NULL; + return -1; + } + + (*handle)->id_vendor = 0; + (*handle)->id_product = transports[n].type; + (*handle)->idev = NULL; + (*handle)->dev_fd = fd; + (*handle)->bai = 0xFFFF0000 | n; + prepare_special_transport (*handle); + if (rdrname_p) + *rdrname_p = rid; + else + free (rid); + + return 0; +} + static void do_close_reader (ccid_driver_t handle) @@ -1719,7 +1984,7 @@ ccid_set_progress_cb (ccid_driver_t handle, void (*cb)(void *, const char *, int, int, int), void *cb_arg) { - if (!handle || !handle->rid) + if (!handle) return CCID_DRIVER_ERR_INV_VALUE; handle->progress_cb = cb; @@ -1736,7 +2001,6 @@ ccid_close_reader (ccid_driver_t handle) return 0; do_close_reader (handle); - free (handle->rid); free (handle); return 0; } diff --git a/scd/ccid-driver.h b/scd/ccid-driver.h index e3aed9f..9e71f5e 100644 --- a/scd/ccid-driver.h +++ b/scd/ccid-driver.h @@ -1,5 +1,5 @@ -/* ccid-driver.c - USB ChipCardInterfaceDevices driver - * Copyright (C) 2003 Free Software Foundation, Inc. +/* ccid-driver.h - USB ChipCardInterfaceDevices driver + * Copyright (C) 2003 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -109,10 +109,18 @@ enum { struct ccid_driver_s; typedef struct ccid_driver_s *ccid_driver_t; +struct ccid_dev_table; + int ccid_set_debug_level (int level); char *ccid_get_reader_list (void); -int ccid_open_reader (ccid_driver_t *handle, const char *readerid, - const char **rdrname_p); + +gpg_error_t ccid_dev_scan (int *idx_max, struct ccid_dev_table **t_p); +void ccid_dev_scan_finish (struct ccid_dev_table *tbl, int max); +unsigned int ccid_get_BAI (int, struct ccid_dev_table *tbl); +int ccid_compare_BAI (ccid_driver_t handle, unsigned int); +int ccid_open_reader (const char *spec_reader_name, + int idx, struct ccid_dev_table *ccid_table, + ccid_driver_t *handle, char **rdrname_p); int ccid_set_progress_cb (ccid_driver_t handle, void (*cb)(void *, const char *, int, int, int), void *cb_arg); @@ -126,7 +134,7 @@ int ccid_transceive (ccid_driver_t handle, unsigned char *resp, size_t maxresplen, size_t *nresp); int ccid_transceive_secure (ccid_driver_t handle, const unsigned char *apdu, size_t apdulen, - pininfo_t *pininfo, + pininfo_t *pininfo, unsigned char *resp, size_t maxresplen, size_t *nresp); int ccid_transceive_escape (ccid_driver_t handle, const unsigned char *data, size_t datalen, ----------------------------------------------------------------------- Summary of changes: scd/apdu.c | 219 ++++++++++++++++++------- scd/apdu.h | 10 +- scd/app-common.h | 3 + scd/app.c | 63 +++++--- scd/ccid-driver.c | 466 ++++++++++++++++++++++++++++++++++++++++++------------ scd/ccid-driver.h | 18 ++- 6 files changed, 589 insertions(+), 190 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 6 02:11:10 2017 From: cvs at cvs.gnupg.org (by NIIBE Yutaka) Date: Fri, 06 Jan 2017 02:11:10 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-40-g62268a2 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 62268a2732dddca7a05ca4cf45d0e4338c7dc3c4 (commit) from 8a41e73c31adb86d4a7dca4da695e5ad1347811f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 62268a2732dddca7a05ca4cf45d0e4338c7dc3c4 Author: NIIBE Yutaka Date: Fri Jan 6 10:07:40 2017 +0900 scd: Fix for --disable-ccid-driver. * scd/apdu.c [HAVE_LIBUSB] (apdu_dev_list_start): Conditionalize. [HAVE_LIBUSB] (apdu_dev_list_finish, apdu_open_reader): Likewise. Signed-off-by: NIIBE Yutaka diff --git a/scd/apdu.c b/scd/apdu.c index 50363ce..db46c4d 100644 --- a/scd/apdu.c +++ b/scd/apdu.c @@ -2919,7 +2919,6 @@ open_rapdu_reader (int portno, gpg_error_t apdu_dev_list_start (const char *portstr, struct dev_list **l_p) { - gpg_error_t err; struct dev_list *dl = xtrymalloc (sizeof (struct dev_list)); *l_p = NULL; @@ -2939,6 +2938,8 @@ apdu_dev_list_start (const char *portstr, struct dev_list **l_p) } else { + gpg_error_t err; + err = ccid_dev_scan (&dl->idx_max, &dl->ccid_table); if (err) return err; @@ -2972,7 +2973,9 @@ apdu_dev_list_start (const char *portstr, struct dev_list **l_p) void apdu_dev_list_finish (struct dev_list *dl) { +#ifdef HAVE_LIBUSB ccid_dev_scan_finish (dl->ccid_table, dl->idx_max); +#endif xfree (dl); npth_mutex_unlock (&reader_table_lock); } @@ -3117,6 +3120,7 @@ apdu_open_reader (struct dev_list *dl) { int slot; +#ifdef HAVE_LIBUSB if (dl->ccid_table) { /* CCID readers. */ int readerno; @@ -3189,6 +3193,7 @@ apdu_open_reader (struct dev_list *dl) slot = -1; } else +#endif { /* PC/SC readers. */ if (dl->idx++ == 0) slot = apdu_open_one_reader (dl->portstr); ----------------------------------------------------------------------- Summary of changes: scd/apdu.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 6 02:38:31 2017 From: cvs at cvs.gnupg.org (by NIIBE Yutaka) Date: Fri, 06 Jan 2017 02:38:31 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-41-g858e14c Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 858e14cd794e2a6125d51e652a754bbe26def997 (commit) from 62268a2732dddca7a05ca4cf45d0e4338c7dc3c4 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 858e14cd794e2a6125d51e652a754bbe26def997 Author: NIIBE Yutaka Date: Fri Jan 6 10:35:46 2017 +0900 scd: Fix for --disable-ccid for scdaemon. * scd/apdu.c (apdu_dev_list_finish): Don't call ccid_dev_scan_finish with no table. (apdu_open_reader): Only increment when it's zero. Signed-off-by: NIIBE Yutaka diff --git a/scd/apdu.c b/scd/apdu.c index db46c4d..38ebd2b 100644 --- a/scd/apdu.c +++ b/scd/apdu.c @@ -2974,7 +2974,8 @@ void apdu_dev_list_finish (struct dev_list *dl) { #ifdef HAVE_LIBUSB - ccid_dev_scan_finish (dl->ccid_table, dl->idx_max); + if (dl->ccid_table) + ccid_dev_scan_finish (dl->ccid_table, dl->idx_max); #endif xfree (dl); npth_mutex_unlock (&reader_table_lock); @@ -3195,15 +3196,15 @@ apdu_open_reader (struct dev_list *dl) else #endif { /* PC/SC readers. */ - if (dl->idx++ == 0) - slot = apdu_open_one_reader (dl->portstr); + if (dl->idx == 0) + { + dl->idx++; + slot = apdu_open_one_reader (dl->portstr); + } else slot = -1; } - if (DBG_READER) - log_debug ("leave: apdu_open_reader => slot=%d [ccid]\n", slot); - return slot; } ----------------------------------------------------------------------- Summary of changes: scd/apdu.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 6 12:46:09 2017 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Fri, 06 Jan 2017 12:46:09 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-42-ge1f6833 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via e1f68337b979fe4b7c3bd095a83ea832e14efb74 (commit) from 858e14cd794e2a6125d51e652a754bbe26def997 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit e1f68337b979fe4b7c3bd095a83ea832e14efb74 Author: Andre Heinecke Date: Fri Jan 6 12:26:01 2017 +0100 doc: Document summary values of TOFU_STATS -- Signed-off-by: Andre Heinecke diff --git a/doc/DETAILS b/doc/DETAILS index 568500e..ac599fc 100644 --- a/doc/DETAILS +++ b/doc/DETAILS @@ -761,6 +761,19 @@ pkd:0:1024:B665B1435F4C2 .... FF26ABB: takes on value 0. Instead, if there is a conflict, VALIDITY still reflects the key's validity (values: 1-4). + SUMMARY values use the euclidean distance (m = sqrt(a? + b?)) rather + then the sum of the magnitudes (m = a + b) to ensure a balance between + verified signatures and encrypted messages. + + Values are calculated based on the number of days where a key was used + for verifying a signature or to encrypt to it. + The ranges for the values are: + + - 1 :: signature_days + encryption_days == 0 + - 2 :: 1 <= sqrt(signature_days? + encryption_days?) < 8 + - 3 :: 8 <= sqrt(signature_days? + encryption_days?) < 42 + - 4 :: sqrt(signature_days? + encryption_days?) >= 42 + SIGN-COUNT and ENCRYPTION-COUNT are the number of messages that we have seen that have been signed by this key / encryption to this key. ----------------------------------------------------------------------- Summary of changes: doc/DETAILS | 13 +++++++++++++ 1 file changed, 13 insertions(+) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 6 13:35:50 2017 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Fri, 06 Jan 2017 13:35:50 +0100 Subject: [git] GpgOL - branch, master, updated. gpgol-1.4.0-237-g3cfdd11 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG extension for MS Outlook". The branch, master has been updated via 3cfdd110a195ed02059d533d43fdb66da56d1852 (commit) from 474f02a9278b8755bd99ba79fa018212be08baf1 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 3cfdd110a195ed02059d533d43fdb66da56d1852 Author: Andre Heinecke Date: Fri Jan 6 13:32:21 2017 +0100 Update crypto summary and lvl2 icon * src/dialogs.rc: Use the same icon for lvl2 and 3 * src/mail.cpp (Mail::get_crypto_summary): Change wording. (Mail::get_crypto_summary): Fix comment. (Mail::get_crypto_one_line): New. Move one liner also into mail class. (Mail::get_crypto_details): Minor wording change. * src/mail.h: Update accordingly. * src/ribbon-callbacks.cpp (get_sig_ttip): Use one liner funct. -- The difference between trusted / certified highly trusted is more confusing then just using "Level" imo. Different security levels are a real world concept and are hopefully understandable. diff --git a/src/dialogs.rc b/src/dialogs.rc index ba8cb8c..a99eee3 100644 --- a/src/dialogs.rc +++ b/src/dialogs.rc @@ -54,12 +54,14 @@ IDI_ENCSIGN_FILE_48_PNG RCDATA "icons/encrypt-sign-file-48.png" IDI_LEVEL_0_ENC RCDATA "icons/level-0-enc.png" IDI_LEVEL_1_ENC RCDATA "icons/level-1-enc.png" -IDI_LEVEL_2_ENC RCDATA "icons/level-2-enc.png" + +/* We use the same icon for level 2 and 3 */ +IDI_LEVEL_2_ENC RCDATA "icons/level-3-enc.png" IDI_LEVEL_3_ENC RCDATA "icons/level-3-enc.png" IDI_LEVEL_4_ENC RCDATA "icons/level-4-enc.png" IDI_LEVEL_0 RCDATA "icons/level-0.png" IDI_LEVEL_1 RCDATA "icons/level-1.png" -IDI_LEVEL_2 RCDATA "icons/level-2.png" +IDI_LEVEL_2 RCDATA "icons/level-3.png" IDI_LEVEL_3 RCDATA "icons/level-3.png" IDI_LEVEL_4 RCDATA "icons/level-4.png" diff --git a/src/mail.cpp b/src/mail.cpp index 71eec62..95df6fd 100644 --- a/src/mail.cpp +++ b/src/mail.cpp @@ -1474,21 +1474,29 @@ Mail::get_crypto_summary () const int level = get_signature_level (); bool enc = is_encrypted (); - if (level > 3 && enc) + if (level == 4 && enc) { - return _("Highly Secure"); + return _("Security Level 4"); } - if (level > 3) + if (level == 4) + { + return _("Trust Level 4"); + } + if (level == 3 && enc) + { + return _("Security Level 3"); + } + if (level == 3) { - return _("Highly Trusted"); + return _("Trust Level 3"); } - if (level >= 2 && enc) + if (level == 2 && enc) { - return _("Secure"); + return _("Security Level 2"); } - if (level >= 2) + if (level == 2) { - return _("Trusted"); + return _("Trust Level 2"); } if (enc) { @@ -1499,13 +1507,37 @@ Mail::get_crypto_summary () /* Even if it is signed, if it is not validly signed it's still completly insecure as anyone could have signed this. So we avoid the label - "signed" here as this already leaves */ + "signed" here as this word already implies some + security. */ return _("Insecure"); } return _("Insecure"); } std::string +Mail::get_crypto_one_line() +{ + bool sig = is_signed (); + bool enc = is_encrypted (); + if (sig || enc) + { + if (sig && enc) + { + return _("Signed and encrypted message"); + } + else if (sig) + { + return _("Signed message"); + } + else if (enc) + { + return _("Encrypted message"); + } + } + return _("Insecure message"); +} + +std::string Mail::get_crypto_details() { /* Handle encrypt only */ @@ -1586,7 +1618,7 @@ Mail::get_crypto_details() char *time = format_date_from_gpgme (first_contact); /* i18n note signcount is always pulral because with signcount 1 we * would not be in this branch. */ - gpgrt_asprintf (&buf, _("The senders address is trustworthy, because " + gpgrt_asprintf (&buf, _("The senders address is trusted, because " "you have established a communication history " "with this address starting on %s.\n" "You encrypted %i and verified %i messages since."), diff --git a/src/mail.h b/src/mail.h index 0767df4..bba161a 100644 --- a/src/mail.h +++ b/src/mail.h @@ -260,6 +260,10 @@ public: crypto state of this mail. */ std::string get_crypto_details (); + /** Returns a localized string describing a one line + summary of the crypto state. */ + std::string get_crypto_one_line (); + /** Get the icon id of the appropiate icon for this mail */ int get_crypto_icon_id () const; diff --git a/src/ribbon-callbacks.cpp b/src/ribbon-callbacks.cpp index 3817184..503c773 100644 --- a/src/ribbon-callbacks.cpp +++ b/src/ribbon-callbacks.cpp @@ -1552,20 +1552,9 @@ HRESULT get_sig_ttip (LPDISPATCH ctrl, VARIANT *result) result->vt = VT_BSTR; wchar_t *w_result; - if (mail && (mail->is_signed () || mail->is_encrypted ())) + if (mail) { - if (mail->is_signed () && mail->is_encrypted ()) - { - w_result = utf8_to_wchar (_("Signed and encrypted message")); - } - else if (mail->is_signed ()) - { - w_result = utf8_to_wchar (_("Signed message")); - } - else if (mail->is_encrypted ()) - { - w_result = utf8_to_wchar (_("Encrypted message")); - } + w_result = utf8_to_wchar (mail->get_crypto_one_line().c_str()); } else { ----------------------------------------------------------------------- Summary of changes: src/dialogs.rc | 6 ++++-- src/mail.cpp | 52 ++++++++++++++++++++++++++++++++++++++---------- src/mail.h | 4 ++++ src/ribbon-callbacks.cpp | 15 ++------------ 4 files changed, 52 insertions(+), 25 deletions(-) hooks/post-receive -- GnuPG extension for MS Outlook http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 6 15:12:00 2017 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Fri, 06 Jan 2017 15:12:00 +0100 Subject: [git] GpgOL - branch, master, updated. gpgol-1.4.0-238-gabaca16 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG extension for MS Outlook". The branch, master has been updated via abaca16b9019781359c105944ea22adf3f6fa4c8 (commit) from 3cfdd110a195ed02059d533d43fdb66da56d1852 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit abaca16b9019781359c105944ea22adf3f6fa4c8 Author: Andre Heinecke Date: Fri Jan 6 15:09:07 2017 +0100 Warn if partial crypto with attachments is found * src/mail.cpp (Mail::check_attachments): Check if all attachments are hidden and warn otherwise. (Mail::parsing_done): Call check_attachments. * src/mail.h: Update accordingly. * src/oomhelp.p: Add new DASL. -- This is important for inline Crypto mails where Attachments may not have been signed or encrypted. For MIME Mails we don't have the problem as we only handle Crypto MIME Mails if the top level mime part is a crypto part and so everything is crypto or not. diff --git a/src/mail.cpp b/src/mail.cpp index 95df6fd..5fed0f6 100644 --- a/src/mail.cpp +++ b/src/mail.cpp @@ -258,6 +258,89 @@ get_attachment (LPDISPATCH mailitem, int pos) return attachment; } +/** Helper to check that all attachments are hidden, to be + called before crypto. */ +int +Mail::check_attachments () const +{ + LPDISPATCH attachments = get_oom_object (m_mailitem, "Attachments"); + if (!attachments) + { + log_debug ("%s:%s: Failed to get attachments.", + SRCNAME, __func__); + return 1; + } + int count = get_oom_int (attachments, "Count"); + if (!count) + { + gpgol_release (attachments); + return 0; + } + + std::string message; + + if (is_encrypted () && is_signed ()) + { + message += _("Not all attachments were encrypted or signed.\n" + "The unsigned / unencrypted attachments are:\n\n"); + } + else if (is_signed ()) + { + message += _("Not all attachments were signed.\n" + "The unsigned attachments are:\n\n"); + } + else if (is_encrypted ()) + { + message += _("Not all attachments were encrypted.\n" + "The unencrypted attachments are:\n\n"); + } + else + { + gpgol_release (attachments); + return 0; + } + + bool foundOne = false; + + for (int i = 1; i <= count; i++) + { + std::string item_str; + item_str = std::string("Item(") + std::to_string (i) + ")"; + LPDISPATCH oom_attach = get_oom_object (attachments, item_str.c_str ()); + if (!oom_attach) + { + log_error ("%s:%s: Failed to get attachment.", + SRCNAME, __func__); + continue; + } + VARIANT var; + VariantInit (&var); + if (get_pa_variant (oom_attach, PR_ATTACHMENT_HIDDEN_DASL, &var) || + (var.vt == VT_BOOL && var.boolVal == VARIANT_FALSE)) + { + foundOne = true; + message += get_oom_string (oom_attach, "DisplayName"); + message += "\n"; + } + VariantClear (&var); + gpgol_release (oom_attach); + } + if (foundOne) + { + message += "\n"; + message += _("Note: The attachments may be encrypted or signed " + "on a file level but the GpgOL status does not apply to them."); + wchar_t *wmsg = utf8_to_wchar (message.c_str ()); + wchar_t *wtitle = utf8_to_wchar (_("GpgOL Warning")); + MessageBoxW (get_active_hwnd (), wmsg, wtitle, + MB_ICONWARNING|MB_OK); + xfree (wmsg); + xfree (wtitle); + } + gpgol_release (attachments); + return 0; +} + /** Get the cipherstream of the mailitem. */ static LPSTREAM get_attachment_stream (LPDISPATCH mailitem, int pos) @@ -730,6 +813,9 @@ Mail::parsing_done() update_body(); TRACEPOINT; + /* Check that there are no unsigned / unencrypted messages. */ + check_attachments (); + /* Update attachments */ if (add_attachments (m_mailitem, m_parser->get_attachments())) { diff --git a/src/mail.h b/src/mail.h index bba161a..b61569c 100644 --- a/src/mail.h +++ b/src/mail.h @@ -320,6 +320,10 @@ public: https://wiki.gnupg.org/EasyGpg2016/AutomatedEncryption for a definition of the levels. */ int get_signature_level () const; + + /** Check if all attachments are hidden and show a warning + message appropiate to the crypto state if necessary. */ + int check_attachments () const; private: void update_categories (); void update_body (); diff --git a/src/oomhelp.h b/src/oomhelp.h index 3914f5e..3c94c3b 100644 --- a/src/oomhelp.h +++ b/src/oomhelp.h @@ -84,6 +84,11 @@ DEFINE_OLEGUID(IID_IOleWindow, 0x00000114, 0, 0); "http://schemas.microsoft.com/mapi/proptag/0x39FE001E" #endif +#ifndef PR_ATTACHMENT_HIDDEN_DASL +#define PR_ATTACHMENT_HIDDEN_DASL \ + "http://schemas.microsoft.com/mapi/proptag/0x7FFE000B" +#endif + #define PR_MESSAGE_CLASS_W_DASL \ "http://schemas.microsoft.com/mapi/proptag/0x001A001F" #define GPGOL_ATTACHTYPE_DASL \ ----------------------------------------------------------------------- Summary of changes: src/mail.cpp | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/mail.h | 4 +++ src/oomhelp.h | 5 ++++ 3 files changed, 95 insertions(+) hooks/post-receive -- GnuPG extension for MS Outlook http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 6 18:50:50 2017 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Fri, 06 Jan 2017 18:50:50 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-43-g8d77490 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 8d774904c8066d8c0f19cfffe2d568979bb8c470 (commit) from e1f68337b979fe4b7c3bd095a83ea832e14efb74 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 8d774904c8066d8c0f19cfffe2d568979bb8c470 Author: Werner Koch Date: Fri Jan 6 18:45:14 2017 +0100 agent,w32: Fix annoying output to DebugView. * agent/gpg-agent.c (startup_fd_list): Do not define for W32. (main) [W32]: Do not call get_all_open_fds. -- GnuPG-bug-id: 2267 Signed-off-by: Werner Koch diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index f4ed6c5..724b55a 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -303,8 +303,10 @@ static int putty_support; #endif /*HAVE_W32_SYSTEM*/ /* The list of open file descriptors at startup. Note that this list - has been allocated using the standard malloc. */ + * has been allocated using the standard malloc. */ +#ifndef HAVE_W32_SYSTEM static int *startup_fd_list; +#endif /* The signal mask at startup and a flag telling whether it is valid. */ #ifdef HAVE_SIGPROCMASK @@ -949,8 +951,10 @@ main (int argc, char **argv ) /* Before we do anything else we save the list of currently open file descriptors and the signal mask. This info is required to - do the exec call properly. */ + do the exec call properly. We don't need it on Windows. */ +#ifndef HAVE_W32_SYSTEM startup_fd_list = get_all_open_fds (); +#endif /*!HAVE_W32_SYSTEM*/ #ifdef HAVE_SIGPROCMASK if (!sigprocmask (SIG_UNBLOCK, NULL, &startup_signal_mask)) startup_signal_mask_valid = 1; diff --git a/common/exechelp-w32.c b/common/exechelp-w32.c index a7a6db3..e79ee5b 100644 --- a/common/exechelp-w32.c +++ b/common/exechelp-w32.c @@ -128,11 +128,14 @@ close_all_fds (int first, int *except) /* Returns an array with all currently open file descriptors. The end - of the array is marked by -1. The caller needs to release this - array using the *standard free* and not with xfree. This allow the - use of this function right at startup even before libgcrypt has - been initialized. Returns NULL on error and sets ERRNO - accordingly. */ + * of the array is marked by -1. The caller needs to release this + * array using the *standard free* and not with xfree. This allow the + * use of this function right at startup even before libgcrypt has + * been initialized. Returns NULL on error and sets ERRNO + * accordingly. Note that fstat prints a warning to DebugView for all + * invalid fds which is a bit annoying. We actually do not need this + * function in real code (close_all_fds is a dummy anyway) but we keep + * it for use by t-exechelp.c. */ int * get_all_open_fds (void) { ----------------------------------------------------------------------- Summary of changes: agent/gpg-agent.c | 8 ++++++-- common/exechelp-w32.c | 13 ++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 6 19:33:24 2017 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Fri, 06 Jan 2017 19:33:24 +0100 Subject: [git] gnupg-doc - branch, master, updated. 537908a28758e0816ed956182a6a84981764401e Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GnuPG website and other docs". The branch, master has been updated via 537908a28758e0816ed956182a6a84981764401e (commit) from f505be91d601062afeb7f7f6ebdb68562931f8d2 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 537908a28758e0816ed956182a6a84981764401e Author: Werner Koch Date: Fri Jan 6 19:31:13 2017 +0100 bugs.gnupg.org: Updated topics list diff --git a/misc/bugs.gnupg.org/index.html b/misc/bugs.gnupg.org/index.html index 47cf93f..d68d9ad 100644 --- a/misc/bugs.gnupg.org/index.html +++ b/misc/bugs.gnupg.org/index.html @@ -149,7 +149,7 @@ You should follow these steps to enter a new bug (issue):
Contact information available at the g10 Code main pages. +href="https://www.g10code.com">g10 Code main pages.

Copyright (C) 2006 g10 Code GmbH, Erkrath-Hochdahl.
Verbatim copying and distribution of this entire article is diff --git a/misc/bugs.gnupg.org/roundup-topics.html b/misc/bugs.gnupg.org/roundup-topics.html index 208707d..d78cf28 100644 --- a/misc/bugs.gnupg.org/roundup-topics.html +++ b/misc/bugs.gnupg.org/roundup-topics.html @@ -60,7 +60,7 @@ clear. This list shall help to make sensible use of the keywords. asm Problem with low-level assembler code cross Bug pertaining to cross-compiling - osx Mac OS/X specific problem + macos MacOS specific problem w32 MS Windows specific problem w64 MS Windows 64 bit specific problem @@ -74,6 +74,8 @@ clear. This list shall help to make sensible use of the keywords. faq This should be made an entry into the FAQ or is already answered there. + gpg22 To be fixed for GnuPG 2.2. + gpg23 Will be addressed in GnuPG 2.2. patch Patch included noinfo Not enough information given notdup Problem duplicating the bug @@ -84,6 +86,8 @@ clear. This list shall help to make sensible use of the keywords. Note that there is also a category of the same name. + rc Release critical report + sillyUB Silly interpretation of undefined behaviour by a compiler. Needs fix so that gcc et al do not break the @@ -101,7 +105,7 @@ clear. This list shall help to make sensible use of the keywords.


Contact information available at the g10 Code main pages. +href="https://www.g10code.com">g10 Code main pages.

Copyright (C) 2006 g10 Code GmbH, Erkrath-Hochdahl.
Verbatim copying and distribution of this entire article is ----------------------------------------------------------------------- Summary of changes: misc/bugs.gnupg.org/index.html | 2 +- misc/bugs.gnupg.org/roundup-topics.html | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) hooks/post-receive -- The GnuPG website and other docs http://git.gnupg.org From cvs at cvs.gnupg.org Sun Jan 8 18:45:54 2017 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Sun, 08 Jan 2017 18:45:54 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-47-g88dc3af Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 88dc3af3d4ae1afe1d5e136bc4c38bc4e7d4cd10 (commit) via 714faea4fa7f30d42e9986358214a99aa8fa57b3 (commit) via 16078f3deea5b82ea26e2f01dbd3ef3a5ce25410 (commit) via 9fa94aa10778bbd680315e93b23175423e338c40 (commit) from 8d774904c8066d8c0f19cfffe2d568979bb8c470 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 88dc3af3d4ae1afe1d5e136bc4c38bc4e7d4cd10 Author: Werner Koch Date: Sun Jan 8 18:42:50 2017 +0100 dirmngr: Implement experimental SRV record lookup for WKD. * dirmngr/server.c (cmd_wkd_get): Support SRV records. -- This patch changes the way a WKD query is done. Now we first look for a SRV record for service "openpgpkey" and port "tcp" under the to-be-queried domain. If such a record was found and the target host matches the to-be-queried domain or is a suffix to that domain, that target host is used instead of the domain name. The SRV record also allows to change the port and obviously can be used for load-balancing. For example a query for the submission address of example.org with the SRV record specification _openpgpkey._tcp IN SRV 0 0 0 wkd.foo.org. IN SRV 0 0 0 wkd.example.net. IN SRV 0 0 4711 wkd.example.org. (queried using the name "_openpgpkey._tcp.example.org") would fetch from this URL: https://wkd.example.org:4711/.well-known/openpgpkey/submission-address Note that the first two SRV records won't be used because foo.org and example.net do not match example.org. We require that the target host is identical to the domain or be a subdomain of it. This is so that an attacker modifying the SRV records needs to setup a server in a sub-domain of the actual domain and can't use an arbitrary domain. Whether this is a sufficient requirement is not clear and needs further discussion. Signed-off-by: Werner Koch diff --git a/dirmngr/server.c b/dirmngr/server.c index 28c2cd4..c9c4ad4 100644 --- a/dirmngr/server.c +++ b/dirmngr/server.c @@ -826,13 +826,15 @@ cmd_wkd_get (assuan_context_t ctx, char *line) ctrl_t ctrl = assuan_get_pointer (ctx); gpg_error_t err = 0; char *mbox = NULL; - char *domain; /* Points to mbox. */ + char *domainbuf = NULL; + char *domain; /* Points to mbox or domainbuf. */ char sha1buf[20]; char *uri = NULL; char *encodedhash = NULL; int opt_submission_addr; int opt_policy_flags; int no_log = 0; + char portstr[20] = { 0 }; opt_submission_addr = has_option (line, "--submission-address"); opt_policy_flags = has_option (line, "--policy-flags"); @@ -846,6 +848,50 @@ cmd_wkd_get (assuan_context_t ctx, char *line) } *domain++ = 0; + /* Check for SRV records. */ + if (1) + { + struct srventry *srvs; + unsigned int srvscount; + size_t domainlen, targetlen; + int i; + + err = get_dns_srv (domain, "openpgpkey", NULL, &srvs, &srvscount); + if (err) + goto leave; + + /* Find the first target which also ends in DOMAIN or is equal + * to DOMAIN. */ + domainlen = strlen (domain); + for (i = 0; i < srvscount; i++) + { + log_debug ("srv: trying '%s:%hu'\n", srvs[i].target, srvs[i].port); + targetlen = strlen (srvs[i].target); + if ((targetlen > domainlen + 1 + && srvs[i].target[targetlen - domainlen - 1] == '.' + && !ascii_strcasecmp (srvs[i].target + targetlen - domainlen, + domain)) + || (targetlen == domainlen + && !ascii_strcasecmp (srvs[i].target, domain))) + { + /* found. */ + domainbuf = xtrystrdup (srvs[i].target); + if (!domainbuf) + { + err = gpg_error_from_syserror (); + xfree (srvs); + goto leave; + } + domain = domainbuf; + if (srvs[i].port) + snprintf (portstr, sizeof portstr, ":%hu", srvs[i].port); + break; + } + } + xfree (srvs); + log_debug ("srv: got '%s%s'\n", domain, portstr); + } + gcry_md_hash_buffer (GCRY_MD_SHA1, sha1buf, mbox, strlen (mbox)); encodedhash = zb32_encode (sha1buf, 8*20); if (!encodedhash) @@ -858,6 +904,7 @@ cmd_wkd_get (assuan_context_t ctx, char *line) { uri = strconcat ("https://", domain, + portstr, "/.well-known/openpgpkey/submission-address", NULL); } @@ -865,6 +912,7 @@ cmd_wkd_get (assuan_context_t ctx, char *line) { uri = strconcat ("https://", domain, + portstr, "/.well-known/openpgpkey/policy", NULL); } @@ -872,6 +920,7 @@ cmd_wkd_get (assuan_context_t ctx, char *line) { uri = strconcat ("https://", domain, + portstr, "/.well-known/openpgpkey/hu/", encodedhash, NULL); @@ -907,6 +956,7 @@ cmd_wkd_get (assuan_context_t ctx, char *line) xfree (uri); xfree (encodedhash); xfree (mbox); + xfree (domainbuf); return leave_cmd (ctx, err); } commit 714faea4fa7f30d42e9986358214a99aa8fa57b3 Author: Werner Koch Date: Sun Jan 8 18:07:18 2017 +0100 dirmngr: Improve debug output for TLS. * dirmngr/misc.c (dump_cert): Also print SubjectAltNames. Signed-off-by: Werner Koch diff --git a/dirmngr/misc.c b/dirmngr/misc.c index ac3856e..2ee6d82 100644 --- a/dirmngr/misc.c +++ b/dirmngr/misc.c @@ -296,6 +296,7 @@ dump_cert (const char *text, ksba_cert_t cert) ksba_sexp_t sexp; char *p; ksba_isotime_t t; + int idx; log_debug ("BEGIN Certificate '%s':\n", text? text:""); if (cert) @@ -326,6 +327,13 @@ dump_cert (const char *text, ksba_cert_t cert) dump_string (p); ksba_free (p); log_printf ("\n"); + for (idx=1; (p = ksba_cert_get_subject (cert, idx)); idx++) + { + log_debug (" aka: "); + dump_string (p); + ksba_free (p); + log_printf ("\n"); + } log_debug (" hash algo: %s\n", ksba_cert_get_digest_algo (cert)); commit 16078f3deea5b82ea26e2f01dbd3ef3a5ce25410 Author: Werner Koch Date: Sun Jan 8 18:04:59 2017 +0100 dirmngr: Change internal SRV lookup API. * dirmngr/dns-stuff.c (get_dns_srv): Add args SERVICE and PROTO. * dirmngr/http.c (connect_server): Simplify SRV lookup. * dirmngr/ks-engine-hkp.c (map_host): Ditto. * dirmngr/t-dns-stuff.c (main): Adjust for changed get_dns_srv. -- This new API is more convenient because it includes commonly used code. Note that right now http.c's SRV record code is not used. Signed-off-by: Werner Koch diff --git a/dirmngr/dns-stuff.c b/dirmngr/dns-stuff.c index 028b065..a8713eb 100644 --- a/dirmngr/dns-stuff.c +++ b/dirmngr/dns-stuff.c @@ -1740,17 +1740,37 @@ getsrv_standard (const char *name, } -/* Note that we do not return NONAME but simply store 0 at R_COUNT. */ +/* Query a SRV record for SERVICE and PROTO for NAME. If SERVICE is + * NULL, NAME is expected to contain the full query name. Note that + * we do not return NONAME but simply store 0 at R_COUNT. On error an + * error code is returned and 0 stored at R_COUNT. */ gpg_error_t -get_dns_srv (const char *name, struct srventry **list, unsigned int *r_count) +get_dns_srv (const char *name, const char *service, const char *proto, + struct srventry **list, unsigned int *r_count) { gpg_error_t err; + char *namebuffer = NULL; unsigned int srvcount; int i; *list = NULL; *r_count = 0; srvcount = 0; + + /* If SERVICE is given construct the query from it and PROTO. */ + if (service) + { + namebuffer = xtryasprintf ("_%s._%s.%s", + service, proto? proto:"tcp", name); + if (!namebuffer) + { + err = gpg_error_from_syserror (); + goto leave; + } + name = namebuffer; + } + + #ifdef USE_LIBDNS if (!standard_resolver) { @@ -1852,6 +1872,7 @@ get_dns_srv (const char *name, struct srventry **list, unsigned int *r_count) } if (!err) *r_count = srvcount; + xfree (namebuffer); return err; } diff --git a/dirmngr/dns-stuff.h b/dirmngr/dns-stuff.h index eb7fe72..d68dd17 100644 --- a/dirmngr/dns-stuff.h +++ b/dirmngr/dns-stuff.h @@ -153,6 +153,7 @@ gpg_error_t get_dns_cert (const char *name, int want_certtype, /* Return an array of SRV records. */ gpg_error_t get_dns_srv (const char *name, + const char *service, const char *proto, struct srventry **list, unsigned int *r_count); diff --git a/dirmngr/http.c b/dirmngr/http.c index 14d60df..7a02804 100644 --- a/dirmngr/http.c +++ b/dirmngr/http.c @@ -2362,29 +2362,11 @@ connect_server (const char *server, unsigned short port, /* Do the SRV thing */ if (srvtag) { - /* We're using SRV, so append the tags. */ - if (1 + strlen (srvtag) + 6 + strlen (server) + 1 - <= DIMof (struct srventry, target)) - { - char *srvname = xtrymalloc (DIMof (struct srventry, target)); - - if (!srvname) /* Out of core */ - { - serverlist = NULL; - srvcount = 0; - } - else - { - stpcpy (stpcpy (stpcpy (stpcpy (srvname,"_"), srvtag), - "._tcp."), server); - err = get_dns_srv (srvname, &serverlist, &srvcount); - if (err) - log_info ("getting SRV '%s' failed: %s\n", - srvname, gpg_strerror (err)); - xfree (srvname); - /* Note that on error SRVCOUNT is zero. */ - } - } + err = get_dns_srv (server, srvtag, NULL, &serverlist, &srvcount); + if (err) + log_info ("getting '%s' SRV for '%s' failed: %s\n", + srvtag, server, gpg_strerror (err)); + /* Note that on error SRVCOUNT is zero. */ } if (!serverlist) diff --git a/dirmngr/ks-engine-hkp.c b/dirmngr/ks-engine-hkp.c index a6c22f8..283e805 100644 --- a/dirmngr/ks-engine-hkp.c +++ b/dirmngr/ks-engine-hkp.c @@ -426,7 +426,6 @@ map_host (ctrl_t ctrl, const char *name, int force_reselect, int refidx; int is_pool = 0; char *cname; - char *srvrecord; struct srventry *srvs; unsigned int srvscount; @@ -448,16 +447,7 @@ map_host (ctrl_t ctrl, const char *name, int force_reselect, if (!is_ip_address (name)) { /* Check for SRV records. */ - srvrecord = xtryasprintf ("_hkp._tcp.%s", name); - if (srvrecord == NULL) - { - err = gpg_error_from_syserror (); - xfree (reftbl); - return err; - } - - err = get_dns_srv (srvrecord, &srvs, &srvscount); - xfree (srvrecord); + err = get_dns_srv (name, "hkp", NULL, &srvs, &srvscount); if (err) { xfree (reftbl); diff --git a/dirmngr/t-dns-stuff.c b/dirmngr/t-dns-stuff.c index bc4ca9a..23c0c6a 100644 --- a/dirmngr/t-dns-stuff.c +++ b/dirmngr/t-dns-stuff.c @@ -235,7 +235,7 @@ main (int argc, char **argv) int i; err = get_dns_srv (name? name : "_hkp._tcp.wwwkeys.pgp.net", - &srv, &count); + NULL, NULL, &srv, &count); if (err) printf ("get_dns_srv failed: %s <%s>\n", gpg_strerror (err), gpg_strsource (err)); commit 9fa94aa10778bbd680315e93b23175423e338c40 Author: Werner Koch Date: Sun Jan 8 18:00:38 2017 +0100 dirmngr: Strip root zone suffix from libdns SRV results. * dirmngr/dns-stuff.c (getsrv_libdns): Strip trailing dot from the target. -- See-also: b200e636ab20d2aa93d9f71f3789db5a04af0a56 Signed-off-by: Werner Koch diff --git a/dirmngr/dns-stuff.c b/dirmngr/dns-stuff.c index e32e1e3..028b065 100644 --- a/dirmngr/dns-stuff.c +++ b/dirmngr/dns-stuff.c @@ -1591,6 +1591,10 @@ getsrv_libdns (const char *name, struct srventry **list, unsigned int *r_count) srv->weight = dsrv.weight; srv->port = dsrv.port; mem2str (srv->target, dsrv.target, sizeof srv->target); + /* Libdns appends the root zone part which is problematic for + * most other functions - strip it. */ + if (*srv->target && (srv->target)[strlen (srv->target)-1] == '.') + (srv->target)[strlen (srv->target)-1] = 0; } *r_count = srvcount; ----------------------------------------------------------------------- Summary of changes: dirmngr/dns-stuff.c | 29 +++++++++++++++++++++++++-- dirmngr/dns-stuff.h | 1 + dirmngr/http.c | 28 +++++--------------------- dirmngr/ks-engine-hkp.c | 12 +----------- dirmngr/misc.c | 8 ++++++++ dirmngr/server.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++- dirmngr/t-dns-stuff.c | 2 +- 7 files changed, 94 insertions(+), 38 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Mon Jan 9 08:57:05 2017 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Mon, 09 Jan 2017 08:57:05 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-48-g2baba11 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 2baba11fad6dd680a992260d161dffa1eeae0e42 (commit) from 88dc3af3d4ae1afe1d5e136bc4c38bc4e7d4cd10 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 2baba11fad6dd680a992260d161dffa1eeae0e42 Author: Werner Koch Date: Mon Jan 9 08:54:45 2017 +0100 doc: Update man page for watchgnupg -- Signed-off-by: Werner Koch diff --git a/doc/tools.texi b/doc/tools.texi index d321b69..f0e6fe7 100644 --- a/doc/tools.texi +++ b/doc/tools.texi @@ -54,13 +54,14 @@ other utilities. This tool is not available for Windows. @command{watchgnupg} is commonly invoked as @example -watchgnupg --force ~/.gnupg/S.log +watchgnupg --force $(gpgconf --list-dirs socketdir)/S.log @end example @manpause @noindent -This starts it on the current terminal for listening on the socket - at file{~/.gnupg/S.log}. +This starts it on the current terminal for listening on the standard +logging socket (which is either @file{~/.gnupg/S.log} or + at file{/var/run/user/UID/gnupg/S.log}). @mansect options @noindent @@ -77,6 +78,10 @@ Delete an already existing socket file. Instead of reading from a local socket, listen for connects on TCP port @var{n}. + at item --time-only + at opindex time-only +Do not print the date part of the timestamp. + @item --verbose @opindex verbose Enable extra informational output. @@ -96,21 +101,22 @@ Display a brief help page and exit. @chapheading Examples @example -$ watchgnupg --force /home/foo/.gnupg/S.log +$ watchgnupg --force --time-only $(gpgconf --list-dirs socketdir)/S.log @end example This waits for connections on the local socket - at file{/home/foo/.gnupg/S.log} and shows all log entries. To make this -work the option @option{log-file} needs to be used with all modules -which logs are to be shown. The value for that option must be given -with a special prefix (e.g. in the conf files): +(e.g. @file{/home/foo/.gnupg/S.log}) and shows all log entries. To +make this work the option @option{log-file} needs to be used with all +modules which logs are to be shown. The suggested entry for the +configuration files is: @example -log-file socket:///home/foo/.gnupg/S.log +log-file socket:// @end example -If only @code{socket://} is used a default socket file named - at file{S.log} in the standard socket directory is used. +If the default socket as given above and returned by "echo $(gpgconf +--list-dirs socketdir)/S.log" is not desired an arbitrary socket name +can be specified, for example @file{socket:///home/foo/bar/mysocket}. For debugging purposes it is also possible to do remote logging. Take care if you use this feature because the information is send in the clear over the network. Use this syntax in the conf files: @@ -119,13 +125,14 @@ clear over the network. Use this syntax in the conf files: log-file tcp://192.168.1.1:4711 @end example -You may use any port and not just 4711 as shown above; only IP addresses -are supported (v4 and v6) and no host names. You need to start - at command{watchgnupg} with the @option{tcp} option. Note that under -Windows the registry entry @var{HKCU\Software\GNU\GnuPG:DefaultLogFile} -can be used to change the default log output from @code{stderr} to -whatever is given by that entry. However the only useful entry is a TCP -name for remote debugging. +You may use any port and not just 4711 as shown above; only IP +addresses are supported (v4 and v6) and no host names. You need to +start @command{watchgnupg} with the @option{tcp} option. Note that +under Windows the registry entry + at var{HKCU\Software\GNU\GnuPG:DefaultLogFile} can be used to change the +default log output from @code{stderr} to whatever is given by that +entry. However the only useful entry is a TCP name for remote +debugging. @mansect see also ----------------------------------------------------------------------- Summary of changes: doc/tools.texi | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Mon Jan 9 10:54:46 2017 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Mon, 09 Jan 2017 10:54:46 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.17-50-g0cc975d Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 0cc975d8a1cd54115938202432e43263b8893ea4 (commit) via c2cbe2f87c480c62239dc4c2cbb352acd98cd267 (commit) from 2baba11fad6dd680a992260d161dffa1eeae0e42 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 0cc975d8a1cd54115938202432e43263b8893ea4 Author: Werner Koch Date: Mon Jan 9 10:42:30 2017 +0100 dirmngr: Use "pgpkey-hkps" and "pgpkey-hkp" for SRV record lookups. * dirmngr/ks-engine-hkp.c (map_host): Chnage arg NO_SRV to SRVTAG. (make_host_part): Rewrite. -- This fixes a regression from 2.0 and 1.4 where these tags have been in used since 2009. For whatever reason this was not ported to 2.1 and "hkp" was always used. GnuPG-bug-id: 2451 Signed-off-by: Werner Koch diff --git a/dirmngr/ks-engine-hkp.c b/dirmngr/ks-engine-hkp.c index 9b757a3..5f6e5f4 100644 --- a/dirmngr/ks-engine-hkp.c +++ b/dirmngr/ks-engine-hkp.c @@ -378,16 +378,17 @@ add_host (const char *name, int is_pool, * to choose one of the hosts. For example we skip those hosts which * failed for some time and we stick to one host for a time * independent of DNS retry times. If FORCE_RESELECT is true a new - * host is always selected. If NO_SRV is set no service record lookup - * will be done. The selected host is stored as a malloced string at - * R_HOST; on error NULL is stored. If we know the port used by the - * selected host from a service record, a string representation is - * written to R_PORTSTR, otherwise it is left untouched. If - * R_HTTPFLAGS is not NULL it will receive flags which are to be - * passed to http_open. If R_POOLNAME is not NULL a malloced name of - * the pool is stored or NULL if it is not a pool. */ + * host is always selected. If SRVTAG is NULL no service record + * lookup will be done, if it is set that service name is used. The + * selected host is stored as a malloced string at R_HOST; on error + * NULL is stored. If we know the port used by the selected host from + * a service record, a string representation is written to R_PORTSTR, + * otherwise it is left untouched. If R_HTTPFLAGS is not NULL it will + * receive flags which are to be passed to http_open. If R_POOLNAME + * is not NULL a malloced name of the pool is stored or NULL if it is + * not a pool. */ static gpg_error_t -map_host (ctrl_t ctrl, const char *name, int force_reselect, int no_srv, +map_host (ctrl_t ctrl, const char *name, const char *srvtag, int force_reselect, char **r_host, char *r_portstr, unsigned int *r_httpflags, char **r_poolname) { @@ -445,10 +446,10 @@ map_host (ctrl_t ctrl, const char *name, int force_reselect, int no_srv, } hi = hosttable[idx]; - if (!no_srv && !is_ip_address (name)) + if (srvtag && !is_ip_address (name)) { /* Check for SRV records. */ - err = get_dns_srv (name, "hkp", NULL, &srvs, &srvscount); + err = get_dns_srv (name, srvtag, NULL, &srvs, &srvscount); if (err) { xfree (reftbl); @@ -859,38 +860,42 @@ make_host_part (ctrl_t ctrl, char **r_hostport, unsigned int *r_httpflags, char **r_poolname) { gpg_error_t err; + const char *srvtag; char portstr[10]; char *hostname; *r_hostport = NULL; - portstr[0] = 0; - err = map_host (ctrl, host, force_reselect, no_srv, - &hostname, portstr, r_httpflags, r_poolname); - if (err) - return err; - - /* If map_host did not return a port (from a SRV record) but a port - * has been specified (implicitly or explicitly) then use that port. - * Only in the case that a port was not specified (which might be a - * bug in https.c) we will later make sure that it has been set. */ - if (!*portstr && port) - snprintf (portstr, sizeof portstr, "%hu", port); - - /* Map scheme and port. */ if (!strcmp (scheme, "hkps") || !strcmp (scheme,"https")) { scheme = "https"; - if (! *portstr) - strcpy (portstr, "443"); + srvtag = no_srv? NULL : "pgpkey-https"; } else /* HKP or HTTP. */ { scheme = "http"; - if (! *portstr) - strcpy (portstr, "11371"); + srvtag = no_srv? NULL : "pgpkey-http"; } + portstr[0] = 0; + err = map_host (ctrl, host, srvtag, force_reselect, + &hostname, portstr, r_httpflags, r_poolname); + if (err) + return err; + + /* If map_host did not return a port (from a SRV record) but a port + * has been specified (implicitly or explicitly) then use that port. + * In the case that a port was not specified (which is probably a + * bug in https.c) we will set up defaults. */ + if (*portstr) + ; + else if (!*portstr && port) + snprintf (portstr, sizeof portstr, "%hu", port); + else if (!strcmp (scheme,"https")) + strcpy (portstr, "443"); + else + strcpy (portstr, "11371"); + *r_hostport = strconcat (scheme, "://", hostname, ":", portstr, NULL); xfree (hostname); if (!*r_hostport) commit c2cbe2f87c480c62239dc4c2cbb352acd98cd267 Author: Werner Koch Date: Mon Jan 9 10:11:20 2017 +0100 dirmngr: Do not use a SRV record for HKP if a port was specified. * dirmngr/http.h (parsed_uri_s): Add field EXPLICIT_PORT. * dirmngr/http.c (do_parse_uri): That it. * dirmngr/ks-engine-hkp.c (map_host): Add arg NO_SRV. (make_host_part): Ditto. (ks_hkp_resolve): Set NO_SRV from EXPLICIT_PORT. (ks_hkp_search): Ditto. (ks_hkp_get): Ditto. (ks_hkp_put): Ditto. -- This implements the behaviour of the keyserver helpers from 1.4 and 2.0. Signed-off-by: Werner Koch diff --git a/dirmngr/http.c b/dirmngr/http.c index 7a02804..0a47d9f 100644 --- a/dirmngr/http.c +++ b/dirmngr/http.c @@ -1169,6 +1169,7 @@ do_parse_uri (parsed_uri_t uri, int only_local_part, uri->opaque = 0; uri->v6lit = 0; uri->onion = 0; + uri->explicit_port = 0; /* A quick validity check. */ if (strspn (p, VALID_URI_CHARS) != n) @@ -1241,6 +1242,7 @@ do_parse_uri (parsed_uri_t uri, int only_local_part, { *p3++ = '\0'; uri->port = atoi (p3); + uri->explicit_port = 1; } if ((n = remove_escapes (uri->host)) < 0) diff --git a/dirmngr/http.h b/dirmngr/http.h index 2a36fda..32556a4 100644 --- a/dirmngr/http.h +++ b/dirmngr/http.h @@ -53,6 +53,7 @@ struct parsed_uri_s unsigned int opaque:1;/* Unknown scheme; PATH has the rest. */ unsigned int v6lit:1; /* Host was given as a literal v6 address. */ unsigned int onion:1; /* .onion address given. */ + unsigned int explicit_port :1; /* The port was explicitly specified. */ char *auth; /* username/password for basic auth. */ char *host; /* Host (converted to lowercase). */ unsigned short port; /* Port (always set if the host is set). */ diff --git a/dirmngr/ks-engine-hkp.c b/dirmngr/ks-engine-hkp.c index 283e805..9b757a3 100644 --- a/dirmngr/ks-engine-hkp.c +++ b/dirmngr/ks-engine-hkp.c @@ -374,19 +374,20 @@ add_host (const char *name, int is_pool, /* Map the host name NAME to the actual to be used host name. This - allows us to manage round robin DNS names. We use our own strategy - to choose one of the hosts. For example we skip those hosts which - failed for some time and we stick to one host for a time - independent of DNS retry times. If FORCE_RESELECT is true a new - host is always selected. The selected host is stored as a malloced - string at R_HOST; on error NULL is stored. If we know the port - used by the selected host, a string representation is written to - R_PORTSTR, otherwise it is left untouched. If R_HTTPFLAGS is not - NULL it will receive flags which are to be passed to http_open. If - R_POOLNAME is not NULL a malloced name of the pool is stored or - NULL if it is not a pool. */ + * allows us to manage round robin DNS names. We use our own strategy + * to choose one of the hosts. For example we skip those hosts which + * failed for some time and we stick to one host for a time + * independent of DNS retry times. If FORCE_RESELECT is true a new + * host is always selected. If NO_SRV is set no service record lookup + * will be done. The selected host is stored as a malloced string at + * R_HOST; on error NULL is stored. If we know the port used by the + * selected host from a service record, a string representation is + * written to R_PORTSTR, otherwise it is left untouched. If + * R_HTTPFLAGS is not NULL it will receive flags which are to be + * passed to http_open. If R_POOLNAME is not NULL a malloced name of + * the pool is stored or NULL if it is not a pool. */ static gpg_error_t -map_host (ctrl_t ctrl, const char *name, int force_reselect, +map_host (ctrl_t ctrl, const char *name, int force_reselect, int no_srv, char **r_host, char *r_portstr, unsigned int *r_httpflags, char **r_poolname) { @@ -444,7 +445,7 @@ map_host (ctrl_t ctrl, const char *name, int force_reselect, } hi = hosttable[idx]; - if (!is_ip_address (name)) + if (!no_srv && !is_ip_address (name)) { /* Check for SRV records. */ err = get_dns_srv (name, "hkp", NULL, &srvs, &srvscount); @@ -848,13 +849,13 @@ ks_hkp_help (ctrl_t ctrl, parsed_uri_t uri) /* Build the remote part of the URL from SCHEME, HOST and an optional - PORT. Returns an allocated string at R_HOSTPORT or NULL on failure - If R_POOLNAME is not NULL it receives a malloced string with the - poolname. */ + * PORT. If NO_SRV is set no SRV record lookup will be done. Returns + * an allocated string at R_HOSTPORT or NULL on failure If R_POOLNAME + * is not NULL it receives a malloced string with the poolname. */ static gpg_error_t make_host_part (ctrl_t ctrl, const char *scheme, const char *host, unsigned short port, - int force_reselect, + int force_reselect, int no_srv, char **r_hostport, unsigned int *r_httpflags, char **r_poolname) { gpg_error_t err; @@ -864,11 +865,18 @@ make_host_part (ctrl_t ctrl, *r_hostport = NULL; portstr[0] = 0; - err = map_host (ctrl, host, force_reselect, + err = map_host (ctrl, host, force_reselect, no_srv, &hostname, portstr, r_httpflags, r_poolname); if (err) return err; + /* If map_host did not return a port (from a SRV record) but a port + * has been specified (implicitly or explicitly) then use that port. + * Only in the case that a port was not specified (which might be a + * bug in https.c) we will later make sure that it has been set. */ + if (!*portstr && port) + snprintf (portstr, sizeof portstr, "%hu", port); + /* Map scheme and port. */ if (!strcmp (scheme, "hkps") || !strcmp (scheme,"https")) { @@ -882,12 +890,6 @@ make_host_part (ctrl_t ctrl, if (! *portstr) strcpy (portstr, "11371"); } - if (port) - snprintf (portstr, sizeof portstr, "%hu", port); - else - { - /*fixme_do_srv_lookup ()*/ - } *r_hostport = strconcat (scheme, "://", hostname, ":", portstr, NULL); xfree (hostname); @@ -913,7 +915,11 @@ ks_hkp_resolve (ctrl_t ctrl, parsed_uri_t uri) gpg_error_t err; char *hostport = NULL; - err = make_host_part (ctrl, uri->scheme, uri->host, uri->port, 1, + /* NB: With an explicitly given port we do not want to consult a + * service record because that might be in conflict with the port + * from such a service record. */ + err = make_host_part (ctrl, uri->scheme, uri->host, uri->port, + 1, uri->explicit_port, &hostport, NULL, NULL); if (err) { @@ -1219,7 +1225,8 @@ ks_hkp_search (ctrl_t ctrl, parsed_uri_t uri, const char *pattern, xfree (hostport); hostport = NULL; xfree (httphost); httphost = NULL; - err = make_host_part (ctrl, uri->scheme, uri->host, uri->port, reselect, + err = make_host_part (ctrl, uri->scheme, uri->host, uri->port, + reselect, uri->explicit_port, &hostport, &httpflags, &httphost); if (err) goto leave; @@ -1360,7 +1367,8 @@ ks_hkp_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec, estream_t *r_fp) /* Build the request string. */ xfree (hostport); hostport = NULL; xfree (httphost); httphost = NULL; - err = make_host_part (ctrl, uri->scheme, uri->host, uri->port, reselect, + err = make_host_part (ctrl, uri->scheme, uri->host, uri->port, + reselect, uri->explicit_port, &hostport, &httpflags, &httphost); if (err) goto leave; @@ -1472,7 +1480,8 @@ ks_hkp_put (ctrl_t ctrl, parsed_uri_t uri, const void *data, size_t datalen) again: xfree (hostport); hostport = NULL; xfree (httphost); httphost = NULL; - err = make_host_part (ctrl, uri->scheme, uri->host, uri->port, reselect, + err = make_host_part (ctrl, uri->scheme, uri->host, uri->port, + reselect, uri->explicit_port, &hostport, &httpflags, &httphost); if (err) goto leave; ----------------------------------------------------------------------- Summary of changes: dirmngr/http.c | 2 ++ dirmngr/http.h | 1 + dirmngr/ks-engine-hkp.c | 88 ++++++++++++++++++++++++++++--------------------- 3 files changed, 54 insertions(+), 37 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Mon Jan 9 13:15:08 2017 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Mon, 09 Jan 2017 13:15:08 +0100 Subject: [git] GpgOL - branch, master, updated. gpgol-1.4.0-244-g54c973f Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG extension for MS Outlook". The branch, master has been updated via 54c973fd2e45ee71664a89c500b00d5088107081 (commit) via 24832b5f163822e471e468234972bc2f2a2e68b6 (commit) via 03ae7589f175b6f4d4ecf1b7f4605e78a1932814 (commit) via 352c06b528804aa4754a91a653a8546607592512 (commit) via b9ef5502c572eae0db0dc4ed10013d888edaf9a8 (commit) via cce2a22442aefb9e65b5cc10fed0db4e5d9e11b8 (commit) from abaca16b9019781359c105944ea22adf3f6fa4c8 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 54c973fd2e45ee71664a89c500b00d5088107081 Author: Andre Heinecke Date: Mon Jan 9 13:13:43 2017 +0100 Treat marginal in WoT as lvel 2 * src/mail.cpp (Mail::update_sigstate): Set marginal trust as level 2. -- This is what we did before and also what kleopatra did. Marginal trust is shown as trusted certificate and "green". Only with tofu trust model we do marginal later because it can be automatically reached and any seen key is marginal in tofu. diff --git a/src/mail.cpp b/src/mail.cpp index 2604a86..dd6562c 100644 --- a/src/mail.cpp +++ b/src/mail.cpp @@ -1334,12 +1334,12 @@ Mail::update_sigstate () if (sig.validity() == Signature::Validity::Marginal) { const auto tofu = m_uid.tofuInfo(); - if (tofu.isNull() || + if (!tofu.isNull() && (tofu.validity() != TofuInfo::Validity::BasicHistory && tofu.validity() != TofuInfo::Validity::LargeHistory)) { - /* Marginal is not good enough without tofu. - We also wait for basic trust. */ + /* Marginal is only good enough without tofu. + Otherwise we wait for basic trust. */ log_debug ("%s:%s: Discarding marginal signature." "With too little history.", SRCNAME, __func__); @@ -1692,16 +1692,14 @@ Mail::get_crypto_details() message = buf; xfree (buf); } + else if (level == 2 && m_uid.tofuInfo ().isNull ()) + { + /* Marginal trust through pgp only */ + message = _("Some trusted people " + "have certified the senders identity."); + } else if (level == 2) { - /* Only reachable through TOFU Trust. */ - if (m_uid.tofuInfo ().isNull ()) - { - log_error ("%s:%s:%i BUG: Invalid sigstate.", - SRCNAME, __func__, __LINE__); - return message; - } - unsigned long first_contact = std::max (m_uid.tofuInfo().signFirst(), m_uid.tofuInfo().encrFirst()); char *time = format_date_from_gpgme (first_contact); @@ -1739,12 +1737,6 @@ Mail::get_crypto_details() message = buf; xfree (buf); } - else - { - /* Marginal trust through pgp */ - message = _("Not enough trusted people or yourself " - "have certified the senders identity."); - } } else { commit 24832b5f163822e471e468234972bc2f2a2e68b6 Author: Andre Heinecke Date: Mon Jan 9 13:12:42 2017 +0100 Release attachments object earlier * src/mail.cpp (Mail::check_attachments): Release attachments object earlier. diff --git a/src/mail.cpp b/src/mail.cpp index 6b6a5ca..2604a86 100644 --- a/src/mail.cpp +++ b/src/mail.cpp @@ -325,6 +325,7 @@ Mail::check_attachments () const VariantClear (&var); gpgol_release (oom_attach); } + gpgol_release (attachments); if (foundOne) { message += "\n"; @@ -337,7 +338,6 @@ Mail::check_attachments () const xfree (wmsg); xfree (wtitle); } - gpgol_release (attachments); return 0; } commit 03ae7589f175b6f4d4ecf1b7f4605e78a1932814 Author: Andre Heinecke Date: Mon Jan 9 13:11:45 2017 +0100 Deactive Outlook Window during encryption * src/mail.cpp (encrypt_sign): Deactivate Outlook Window. -- Not optimal but this at least allows to move the outlook window during encryption. Kleopatra must do some work to really become modal. diff --git a/src/mail.cpp b/src/mail.cpp index 5fed0f6..6b6a5ca 100644 --- a/src/mail.cpp +++ b/src/mail.cpp @@ -848,6 +848,8 @@ Mail::encrypt_sign () return err; } flags = get_gpgol_draft_info_flags (message); + + EnableWindow (get_active_hwnd(), FALSE); if (flags == 3) { log_debug ("%s:%s: Sign / Encrypting message", @@ -872,6 +874,7 @@ Mail::encrypt_sign () } log_debug ("%s:%s: Status: %i", SRCNAME, __func__, err); + EnableWindow (get_active_hwnd(), TRUE); gpgol_release (message); m_crypt_successful = !err; return err; commit 352c06b528804aa4754a91a653a8546607592512 Author: Andre Heinecke Date: Mon Jan 9 13:09:27 2017 +0100 Disable button and fix msgs if no mail selected * src/gpgoladdin.cpp (GpgolRibbonExtender::GetIDsOfNames) (GpgolRibbonExtender::Invoke, GetCustomUI_MIME): Update for get_is_details_enabled. * src/ribbon-callbacks.cpp (get_is_details_enabled): New. (get_mail_from_control): Extend with selection state. diff --git a/src/gpgoladdin.cpp b/src/gpgoladdin.cpp index 15ba34d..9eda8c2 100644 --- a/src/gpgoladdin.cpp +++ b/src/gpgoladdin.cpp @@ -646,7 +646,7 @@ GpgolRibbonExtender::GetIDsOfNames (REFIID riid, LPOLESTR *rgszNames, ID_MAPPER (L"getSigSTip", ID_GET_SIG_STIP) ID_MAPPER (L"getSigTip", ID_GET_SIG_TTIP) ID_MAPPER (L"launchDetails", ID_LAUNCH_CERT_DETAILS) - ID_MAPPER (L"getIsCrypto", ID_GET_IS_CRYPTO) + ID_MAPPER (L"getIsDetailsEnabled", ID_GET_IS_DETAILS_ENABLED) } if (cNames > 1) @@ -741,8 +741,8 @@ GpgolRibbonExtender::Invoke (DISPID dispid, REFIID riid, LCID lcid, return get_sig_label (parms->rgvarg[0].pdispVal, result); case ID_LAUNCH_CERT_DETAILS: return launch_cert_details (parms->rgvarg[0].pdispVal); - case ID_GET_IS_CRYPTO: - return get_is_crypto (parms->rgvarg[0].pdispVal, result); + case ID_GET_IS_DETAILS_ENABLED: + return get_is_details_enabled (parms->rgvarg[0].pdispVal, result); case ID_ON_LOAD: { @@ -925,8 +925,8 @@ GetCustomUI_MIME (BSTR RibbonID, BSTR * RibbonXml) " getLabel=\"getSigLabel\"" " getScreentip=\"getSigTip\"" " getSupertip=\"getSigSTip\"" - " onAction=\"launchDetails\"/>" - /* " getEnabled=\"getIsCrypto\"/>" */ + " onAction=\"launchDetails\"" + " getEnabled=\"getIsDetailsEnabled\"/>" " " "