The only non-trivial change to use the new format is in notmuch-crypto-instert-sigstatus-button. --- emacs/notmuch-crypto.el | 9 +++++---- emacs/notmuch-query.el | 2 +- notmuch-client.h | 2 +- notmuch-show.c | 52 +++++++++++++++++++++++++++++++++++++++++++------ test/T350-crypto.sh | 22 ++++++++++----------- test/T355-smime.sh | 4 ++-- test/T450-emacs-show.sh | 2 +- 7 files changed, 66 insertions(+), 27 deletions(-) diff --git a/emacs/notmuch-crypto.el b/emacs/notmuch-crypto.el index 0af727ef..66ad39ba 100644 --- a/emacs/notmuch-crypto.el +++ b/emacs/notmuch-crypto.el @@ -90,13 +90,14 @@ mode." :supertype 'notmuch-button-type) (defun notmuch-crypto-insert-sigstatus-button (sigstatus from) - (let* ((status (plist-get sigstatus :status)) + (let* ((flags (plist-get sigstatus :flags)) + (status (plist-get sigstatus :status)) (help-msg nil) (label "Signature not processed") (face 'notmuch-crypto-signature-unknown) (button-action (lambda (button) (message (button-get button 'help-echo))))) (cond - ((string= status "good") + ((plist-get flags :good) (let ((fingerprint (concat "0x" (plist-get sigstatus :fingerprint)))) ;; if userid present, userid has full or greater validity (if (plist-member sigstatus :userid) @@ -108,12 +109,12 @@ mode." (setq face 'notmuch-crypto-signature-good-key))) (setq button-action 'notmuch-crypto-sigstatus-good-callback) (setq help-msg (concat "Click to list key ID 0x" fingerprint ".")))) - ((string= status "error") + ((plist-get flags :error) (let ((keyid (concat "0x" (plist-get sigstatus :keyid)))) (setq label (concat "Unknown key ID " keyid " or unsupported algorithm")) (setq button-action 'notmuch-crypto-sigstatus-error-callback) (setq help-msg (concat "Click to retrieve key ID " keyid " from keyserver and redisplay.")))) - ((string= status "bad") + ((plist-get flags :bad) (let ((keyid (concat "0x" (plist-get sigstatus :keyid)))) (setq label (concat "Bad signature (claimed key ID " keyid ")")) (setq face 'notmuch-crypto-signature-bad))) diff --git a/emacs/notmuch-query.el b/emacs/notmuch-query.el index 48acb551..592fd8f1 100644 --- a/emacs/notmuch-query.el +++ b/emacs/notmuch-query.el @@ -30,7 +30,7 @@ A thread is a forest or list of trees. A tree is a two element list where the first element is a message, and the second element is a possibly empty forest of replies. " - (let ((args '("show" "--format=sexp" "--format-version=3"))) + (let ((args '("show" "--format=sexp" "--format-version=4"))) (if notmuch-show-process-crypto (setq args (append args '("--decrypt")))) (setq args (append args search-terms)) diff --git a/notmuch-client.h b/notmuch-client.h index 62d4bcec..77b34184 100644 --- a/notmuch-client.h +++ b/notmuch-client.h @@ -145,7 +145,7 @@ chomp_newline (char *str) * this. New (required) map fields can be added without increasing * this. */ -#define NOTMUCH_FORMAT_CUR 3 +#define NOTMUCH_FORMAT_CUR 4 /* The minimum supported structured output format version. Requests * for format versions below this will return an error. */ #define NOTMUCH_FORMAT_MIN 1 diff --git a/notmuch-show.c b/notmuch-show.c index accea48a..f9fd9c14 100644 --- a/notmuch-show.c +++ b/notmuch-show.c @@ -340,6 +340,40 @@ signature_status_to_string (GMimeSignatureStatus x) return "unknown"; } + +/* Print signature flags */ +static void +format_signature_flags (sprinter_t *sp, GMimeSignature *signature) +{ + GMimeSignatureError errors = g_mime_signature_get_errors (signature); + + struct { + GMimeSignatureError bit; + const char * string; + } key_map[] = { + { GMIME_SIGNATURE_ERROR_EXPSIG, "sig-expired" }, + { GMIME_SIGNATURE_ERROR_NO_PUBKEY, "key-missing"}, + { GMIME_SIGNATURE_ERROR_EXPKEYSIG, "key-expired"}, + { GMIME_SIGNATURE_ERROR_REVKEYSIG, "key-revoked"}, + { GMIME_SIGNATURE_ERROR_UNSUPP_ALGO, "alg-unsupported"}, + }; + + sp->map_key (sp, "flags"); + sp->begin_map (sp); + + sp->map_key (sp, signature_status_to_string (g_mime_signature_get_status (signature))); + sp->boolean (sp, TRUE); + + for (unsigned int i = 0; i < ARRAY_SIZE (key_map); i++) { + if (errors & key_map[i].bit) { + sp->map_key (sp, key_map[i].string); + sp->boolean (sp, TRUE); + } + } + + sp->end (sp); +} + /* Signature status sprinter (GMime 2.6) */ static void format_part_sigstatus_sprinter (sprinter_t *sp, mime_node_t *node) @@ -364,8 +398,10 @@ format_part_sigstatus_sprinter (sprinter_t *sp, mime_node_t *node) /* status */ GMimeSignatureStatus status = g_mime_signature_get_status (signature); - sp->map_key (sp, "status"); - sp->string (sp, signature_status_to_string (status)); + if (notmuch_format_version <= 3) { + sp->map_key (sp, "status"); + sp->string (sp, signature_status_to_string (status)); + } GMimeCertificate *certificate = g_mime_signature_get_certificate (signature); if (status == GMIME_SIGNATURE_STATUS_GOOD) { @@ -404,10 +440,14 @@ format_part_sigstatus_sprinter (sprinter_t *sp, mime_node_t *node) } } - GMimeSignatureError errors = g_mime_signature_get_errors (signature); - if (errors != GMIME_SIGNATURE_ERROR_NONE) { - sp->map_key (sp, "errors"); - sp->integer (sp, errors); + if (notmuch_format_version <= 3) { + GMimeSignatureError errors = g_mime_signature_get_errors (signature); + if (errors != GMIME_SIGNATURE_ERROR_NONE) { + sp->map_key (sp, "errors"); + sp->integer (sp, errors); + } + } else { + format_signature_flags (sp, signature); } sp->end (sp); diff --git a/test/T350-crypto.sh b/test/T350-crypto.sh index d21cad14..dcad2f60 100755 --- a/test/T350-crypto.sh +++ b/test/T350-crypto.sh @@ -53,8 +53,8 @@ expected='[[[{"id": "XXXXX", "To": "test_suite@notmuchmail.org", "Date": "Sat, 01 Jan 2000 12:00:00 +0000"}, "body": [{"id": 1, - "sigstatus": [{"status": "good", - "fingerprint": "'$FINGERPRINT'", + "sigstatus": [{"fingerprint": "'$FINGERPRINT'", + "flags": {"good" : true}, "created": 946728000}], "content-type": "multipart/signed", "content": [{"id": 2, @@ -87,8 +87,8 @@ expected='[[[{"id": "XXXXX", "To": "test_suite@notmuchmail.org", "Date": "Sat, 01 Jan 2000 12:00:00 +0000"}, "body": [{"id": 1, - "sigstatus": [{"status": "good", - "fingerprint": "'$FINGERPRINT'", + "sigstatus": [{"fingerprint": "'$FINGERPRINT'", + "flags": {"good" : true}, "created": 946728000, "userid": " Notmuch Test Suite <test_suite@notmuchmail.org> (INSECURE!)"}], "content-type": "multipart/signed", @@ -121,9 +121,8 @@ expected='[[[{"id": "XXXXX", "To": "test_suite@notmuchmail.org", "Date": "Sat, 01 Jan 2000 12:00:00 +0000"}, "body": [{"id": 1, - "sigstatus": [{"status": "error", - "keyid": "'$(echo $FINGERPRINT | cut -c 25-)'", - "errors": 2}], + "sigstatus": [{"keyid": "'$(echo $FINGERPRINT | cut -c 25-)'", + "flags": {"error" : true, "key-missing": true}}], "content-type": "multipart/signed", "content": [{"id": 2, "content-type": "text/plain", @@ -292,8 +291,8 @@ expected='[[[{"id": "XXXXX", "Date": "Sat, 01 Jan 2000 12:00:00 +0000"}, "body": [{"id": 1, "encstatus": [{"status": "good"}], - "sigstatus": [{"status": "good", - "fingerprint": "'$FINGERPRINT'", + "sigstatus": [{"fingerprint": "'$FINGERPRINT'", + "flags" : {"good" : true}, "created": 946728000, "userid": " Notmuch Test Suite <test_suite@notmuchmail.org> (INSECURE!)"}], "content-type": "multipart/encrypted", @@ -365,9 +364,8 @@ expected='[[[{"id": "XXXXX", "To": "test_suite@notmuchmail.org", "Date": "Sat, 01 Jan 2000 12:00:00 +0000"}, "body": [{"id": 1, - "sigstatus": [{"status": "error", - "keyid": "6D92612D94E46381", - "errors": 8}], + "sigstatus": [{"keyid": "6D92612D94E46381", + "flags": {"error" : true, "key-revoked" : true}}], "content-type": "multipart/signed", "content": [{"id": 2, "content-type": "text/plain", diff --git a/test/T355-smime.sh b/test/T355-smime.sh index 0f39bc69..c5ab0b6a 100755 --- a/test/T355-smime.sh +++ b/test/T355-smime.sh @@ -64,8 +64,8 @@ expected='[[[{"id": "XXXXX", "To": "test_suite@notmuchmail.org", "Date": "Sat, 01 Jan 2000 12:00:00 +0000"}, "body": [{"id": 1, - "sigstatus": [{"status": "good", - "fingerprint": "'$FINGERPRINT'", + "sigstatus": [{"fingerprint": "'$FINGERPRINT'", + "flags": {"good" : true}, "expires": 424242424, "created": 946728000}], "content-type": "multipart/signed", diff --git a/test/T450-emacs-show.sh b/test/T450-emacs-show.sh index d302efb6..c4bc5ce0 100755 --- a/test/T450-emacs-show.sh +++ b/test/T450-emacs-show.sh @@ -191,7 +191,7 @@ This is an error (see *Notmuch errors* for more details) === ERROR === [XXX] This is an error -command: YYY/notmuch_fail show --format\\=sexp --format-version\\=3 --exclude\\=false \\' \\* \\' +command: YYY/notmuch_fail show --format\\=sexp --format-version\\=4 --exclude\\=false \\' \\* \\' exit status: 1 stderr: This is an error -- 2.11.0