This is in large part a duplicate of parts of crypto.c, but that code
is in the client (outside the library), and we don't want to entangle
the libgmime API with the libnotmuch API.

I welcome better proposals for how to share this code explicitly
between the library and the client.
---
 lib/database-private.h |  1 +
 lib/database.cc        | 42 ++++++++++++++++++++++++++++++++++++++++++
 lib/notmuch-private.h  |  8 ++++++++
 3 files changed, 51 insertions(+)

diff --git a/lib/database-private.h b/lib/database-private.h
index 3fb10f7..1bf76c5 100644
--- a/lib/database-private.h
+++ b/lib/database-private.h
@@ -171,6 +171,7 @@ struct _notmuch_database {
      * notmuch_database_new_revision. */
     unsigned long revision;
     const char *uuid;
+    GMimeCryptoContext *gpg_crypto_ctx;
 
     Xapian::QueryParser *query_parser;
     Xapian::TermGenerator *term_gen;
diff --git a/lib/database.cc b/lib/database.cc
index 3b342f1..13b0bad 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -995,6 +995,8 @@ notmuch_database_open_verbose (const char *path,
        notmuch->uuid = talloc_strdup (
            notmuch, notmuch->xapian_db->get_uuid ().c_str ());
 
+       notmuch->gpg_crypto_ctx = NULL;
+       
        notmuch->query_parser = new Xapian::QueryParser;
        notmuch->term_gen = new Xapian::TermGenerator;
        notmuch->term_gen->set_stemmer (Xapian::Stem ("english"));
@@ -1090,6 +1092,11 @@ notmuch_database_close (notmuch_database_t *notmuch)
     delete notmuch->last_mod_range_processor;
     notmuch->last_mod_range_processor = NULL;
 
+    if (notmuch->gpg_crypto_ctx) {
+       g_object_unref (notmuch->gpg_crypto_ctx);
+       notmuch->gpg_crypto_ctx = NULL;
+    }
+    
     return status;
 }
 
@@ -2386,6 +2393,41 @@ _notmuch_database_link_message (notmuch_database_t 
*notmuch,
     return status;
 }
 
+notmuch_private_status_t
+_notmuch_database_get_crypto_for_protocol (notmuch_database_t *notmuch,
+                                          const char *protocol,
+                                          GMimeCryptoContext **crypto_ctx)
+{
+    if (! protocol)
+       return NOTMUCH_PRIVATE_STATUS_MALFORMED_CRYPTO_PROTOCOL;
+    
+    /* As per RFC 1847 section 2.1: "the [protocol] value token is
+     * comprised of the type and sub-type tokens of the Content-Type".
+     * As per RFC 1521 section 2: "Content-Type values, subtypes, and
+     * parameter names as defined in this document are
+     * case-insensitive."  Thus, we use strcasecmp for the protocol.
+     */
+    if (strcasecmp (protocol, "application/pgp-signature") == 0 ||
+       strcasecmp (protocol, "application/pgp-encrypted") == 0) {
+       if (! notmuch->gpg_crypto_ctx) {
+           /* FIXME: how do we allow for configuring the gpg binary
+            * here? how would this config get into the library?  Is
+            * this an option we can set on the database object?  Or
+            * elsewhere?  */
+           notmuch->gpg_crypto_ctx = g_mime_gpg_context_new (NULL, "gpg");
+           if (! notmuch->gpg_crypto_ctx)
+               return NOTMUCH_PRIVATE_STATUS_FAILED_CRYPTO_CONTEXT_CREATION;
+
+           g_mime_gpg_context_set_use_agent ((GMimeGpgContext *) 
notmuch->gpg_crypto_ctx, TRUE);
+           g_mime_gpg_context_set_always_trust ((GMimeGpgContext *) 
notmuch->gpg_crypto_ctx, FALSE);
+       }
+       *crypto_ctx = notmuch->gpg_crypto_ctx;
+       return NOTMUCH_PRIVATE_STATUS_SUCCESS;
+    } else {
+       return NOTMUCH_PRIVATE_STATUS_UNKNOWN_CRYPTO_PROTOCOL;
+    }
+}
+
 notmuch_status_t
 notmuch_database_add_message (notmuch_database_t *notmuch,
                              const char *filename,
diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h
index 5dd4770..f6fd36a 100644
--- a/lib/notmuch-private.h
+++ b/lib/notmuch-private.h
@@ -141,6 +141,9 @@ typedef enum _notmuch_private_status {
     /* Then add our own private values. */
     NOTMUCH_PRIVATE_STATUS_TERM_TOO_LONG = NOTMUCH_STATUS_LAST_STATUS,
     NOTMUCH_PRIVATE_STATUS_NO_DOCUMENT_FOUND,
+    NOTMUCH_PRIVATE_STATUS_MALFORMED_CRYPTO_PROTOCOL,
+    NOTMUCH_PRIVATE_STATUS_FAILED_CRYPTO_CONTEXT_CREATION,
+    NOTMUCH_PRIVATE_STATUS_UNKNOWN_CRYPTO_PROTOCOL,
 
     NOTMUCH_PRIVATE_STATUS_LAST_STATUS
 } notmuch_private_status_t;
@@ -239,6 +242,11 @@ _notmuch_database_filename_to_direntry (void *ctx,
                                        notmuch_find_flags_t flags,
                                        char **direntry);
 
+notmuch_private_status_t
+_notmuch_database_get_crypto_for_protocol (notmuch_database_t *notmuch,
+                                          const char *protocol,
+                                          GMimeCryptoContext **crypto_ctx);
+
 /* directory.cc */
 
 notmuch_directory_t *
-- 
2.6.2

_______________________________________________
notmuch mailing list
notmuch@notmuchmail.org
https://notmuchmail.org/mailman/listinfo/notmuch

Reply via email to