[PATCH 09/11] Add decryption of PGP/MIME-encrypted parts with --decrypt.

2011-05-25 Thread Jameson Graef Rollins
This adds support for decrypting PGP/MIME-encrypted parts to
notmuch-show and notmuch-reply.  The --decrypt option implies
--verify.  Once decryption (and possibly signature verification) is
done, a new part_encstatus formatter is emitted, the part_sigstatus
formatter is emitted, and the entire multipart/encrypted part is
replaced by the contents of the encrypted part.

At the moment only a json part_encstatus formatting function is
available, even though decryption is done for all formats.  Emacs
support to follow.
---
 notmuch-client.h |2 ++
 notmuch-reply.c  |   36 
 notmuch-show.c   |   25 -
 notmuch.1|   11 +++
 notmuch.c|8 
 show-message.c   |   29 -
 6 files changed, 101 insertions(+), 10 deletions(-)

diff --git a/notmuch-client.h b/notmuch-client.h
index dc4ed7a..8a27260 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -67,6 +67,7 @@ typedef struct notmuch_show_format {
 const char *body_start;
 void (*part_start) (GMimeObject *part,
int *part_count);
+void (*part_encstatus) (int status);
 void (*part_sigstatus) (const GMimeSignatureValidity* validity);
 void (*part_content) (GMimeObject *part);
 void (*part_end) (GMimeObject *part);
@@ -82,6 +83,7 @@ typedef struct notmuch_show_params {
 int raw;
 int part;
 GMimeCipherContext* cryptoctx;
+int decrypt;
 } notmuch_show_params_t;

 /* There's no point in continuing when we've detected that we've done
diff --git a/notmuch-reply.c b/notmuch-reply.c
index 99bb15f..5265af6 100644
--- a/notmuch-reply.c
+++ b/notmuch-reply.c
@@ -34,6 +34,7 @@ static const notmuch_show_format_t format_reply = {
"",
NULL,
NULL,
+   NULL,
reply_part_content,
NULL,
"",
@@ -438,7 +439,10 @@ guess_from_received_header (notmuch_config_t *config, 
notmuch_message_t *message
 }

 static int
-notmuch_reply_format_default(void *ctx, notmuch_config_t *config, 
notmuch_query_t *query)
+notmuch_reply_format_default(void *ctx,
+notmuch_config_t *config,
+notmuch_query_t *query,
+notmuch_show_params_t *params)
 {
 GMimeMessage *reply;
 notmuch_messages_t *messages;
@@ -446,9 +450,6 @@ notmuch_reply_format_default(void *ctx, notmuch_config_t 
*config, notmuch_query_
 const char *subject, *from_addr = NULL;
 const char *in_reply_to, *orig_references, *references;
 const notmuch_show_format_t *format = _reply;
-notmuch_show_params_t params;
-params.part = -1;
-params.cryptoctx = NULL;

 for (messages = notmuch_query_search_messages (query);
 notmuch_messages_valid (messages);
@@ -508,7 +509,7 @@ notmuch_reply_format_default(void *ctx, notmuch_config_t 
*config, notmuch_query_
notmuch_message_get_header (message, "from"));

show_message_body (notmuch_message_get_filename (message),
-  format, );
+  format, params);

notmuch_message_destroy (message);
 }
@@ -517,7 +518,10 @@ notmuch_reply_format_default(void *ctx, notmuch_config_t 
*config, notmuch_query_

 /* This format is currently tuned for a git send-email --notmuch hook */
 static int
-notmuch_reply_format_headers_only(void *ctx, notmuch_config_t *config, 
notmuch_query_t *query)
+notmuch_reply_format_headers_only(void *ctx,
+ notmuch_config_t *config,
+ notmuch_query_t *query,
+ unused (notmuch_show_params_t *params))
 {
 GMimeMessage *reply;
 notmuch_messages_t *messages;
@@ -579,9 +583,12 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
 notmuch_query_t *query;
 char *opt, *query_string;
 int i, ret = 0;
-int (*reply_format_func)(void *ctx, notmuch_config_t *config, 
notmuch_query_t *query);
+int (*reply_format_func)(void *ctx, notmuch_config_t *config, 
notmuch_query_t *query, notmuch_show_params_t *params);
+notmuch_show_params_t params;

 reply_format_func = notmuch_reply_format_default;
+params.part = -1;
+params.cryptoctx = NULL;

 for (i = 0; i < argc && argv[i][0] == '-'; i++) {
if (strcmp (argv[i], "--") == 0) {
@@ -598,6 +605,16 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
fprintf (stderr, "Invalid value for --format: %s\n", opt);
return 1;
}
+   } else if ((STRNCMP_LITERAL (argv[i], "--decrypt") == 0)) {
+   if (params.cryptoctx == NULL) {
+   GMimeSession* session = 
g_object_new(notmuch_gmime_session_get_type(), NULL);
+   if (NULL == (params.cryptoctx = g_mime_gpg_context_new(session, 
"gpg")))
+   fprintf (stderr, "Failed to construct gpg 

[PATCH 09/11] Add decryption of PGP/MIME-encrypted parts with --decrypt.

2011-05-25 Thread Jameson Graef Rollins
This adds support for decrypting PGP/MIME-encrypted parts to
notmuch-show and notmuch-reply.  The --decrypt option implies
--verify.  Once decryption (and possibly signature verification) is
done, a new part_encstatus formatter is emitted, the part_sigstatus
formatter is emitted, and the entire multipart/encrypted part is
replaced by the contents of the encrypted part.

At the moment only a json part_encstatus formatting function is
available, even though decryption is done for all formats.  Emacs
support to follow.
---
 notmuch-client.h |2 ++
 notmuch-reply.c  |   36 
 notmuch-show.c   |   25 -
 notmuch.1|   11 +++
 notmuch.c|8 
 show-message.c   |   29 -
 6 files changed, 101 insertions(+), 10 deletions(-)

diff --git a/notmuch-client.h b/notmuch-client.h
index dc4ed7a..8a27260 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -67,6 +67,7 @@ typedef struct notmuch_show_format {
 const char *body_start;
 void (*part_start) (GMimeObject *part,
int *part_count);
+void (*part_encstatus) (int status);
 void (*part_sigstatus) (const GMimeSignatureValidity* validity);
 void (*part_content) (GMimeObject *part);
 void (*part_end) (GMimeObject *part);
@@ -82,6 +83,7 @@ typedef struct notmuch_show_params {
 int raw;
 int part;
 GMimeCipherContext* cryptoctx;
+int decrypt;
 } notmuch_show_params_t;
 
 /* There's no point in continuing when we've detected that we've done
diff --git a/notmuch-reply.c b/notmuch-reply.c
index 99bb15f..5265af6 100644
--- a/notmuch-reply.c
+++ b/notmuch-reply.c
@@ -34,6 +34,7 @@ static const notmuch_show_format_t format_reply = {
,
NULL,
NULL,
+   NULL,
reply_part_content,
NULL,
,
@@ -438,7 +439,10 @@ guess_from_received_header (notmuch_config_t *config, 
notmuch_message_t *message
 }
 
 static int
-notmuch_reply_format_default(void *ctx, notmuch_config_t *config, 
notmuch_query_t *query)
+notmuch_reply_format_default(void *ctx,
+notmuch_config_t *config,
+notmuch_query_t *query,
+notmuch_show_params_t *params)
 {
 GMimeMessage *reply;
 notmuch_messages_t *messages;
@@ -446,9 +450,6 @@ notmuch_reply_format_default(void *ctx, notmuch_config_t 
*config, notmuch_query_
 const char *subject, *from_addr = NULL;
 const char *in_reply_to, *orig_references, *references;
 const notmuch_show_format_t *format = format_reply;
-notmuch_show_params_t params;
-params.part = -1;
-params.cryptoctx = NULL;
 
 for (messages = notmuch_query_search_messages (query);
 notmuch_messages_valid (messages);
@@ -508,7 +509,7 @@ notmuch_reply_format_default(void *ctx, notmuch_config_t 
*config, notmuch_query_
notmuch_message_get_header (message, from));
 
show_message_body (notmuch_message_get_filename (message),
-  format, params);
+  format, params);
 
notmuch_message_destroy (message);
 }
@@ -517,7 +518,10 @@ notmuch_reply_format_default(void *ctx, notmuch_config_t 
*config, notmuch_query_
 
 /* This format is currently tuned for a git send-email --notmuch hook */
 static int
-notmuch_reply_format_headers_only(void *ctx, notmuch_config_t *config, 
notmuch_query_t *query)
+notmuch_reply_format_headers_only(void *ctx,
+ notmuch_config_t *config,
+ notmuch_query_t *query,
+ unused (notmuch_show_params_t *params))
 {
 GMimeMessage *reply;
 notmuch_messages_t *messages;
@@ -579,9 +583,12 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
 notmuch_query_t *query;
 char *opt, *query_string;
 int i, ret = 0;
-int (*reply_format_func)(void *ctx, notmuch_config_t *config, 
notmuch_query_t *query);
+int (*reply_format_func)(void *ctx, notmuch_config_t *config, 
notmuch_query_t *query, notmuch_show_params_t *params);
+notmuch_show_params_t params;
 
 reply_format_func = notmuch_reply_format_default;
+params.part = -1;
+params.cryptoctx = NULL;
 
 for (i = 0; i  argc  argv[i][0] == '-'; i++) {
if (strcmp (argv[i], --) == 0) {
@@ -598,6 +605,16 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
fprintf (stderr, Invalid value for --format: %s\n, opt);
return 1;
}
+   } else if ((STRNCMP_LITERAL (argv[i], --decrypt) == 0)) {
+   if (params.cryptoctx == NULL) {
+   GMimeSession* session = 
g_object_new(notmuch_gmime_session_get_type(), NULL);
+   if (NULL == (params.cryptoctx = g_mime_gpg_context_new(session, 
gpg)))
+   fprintf (stderr, Failed to construct gpg