From 7c47044719591e8f697bc509401d3356cbdfddcc Mon Sep 17 00:00:00 2001 From: Jameson Graef Rollins Date: Thu, 24 May 2012 15:40:38 +1700 Subject: [PATCH] [PATCH v4 2/7] cli: new crypto structure to store crypto contexts and parameters, and functions to support it --- af/3fa117f420b366807167e4acb844d7f2ccd95c | 195 ++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 af/3fa117f420b366807167e4acb844d7f2ccd95c diff --git a/af/3fa117f420b366807167e4acb844d7f2ccd95c b/af/3fa117f420b366807167e4acb844d7f2ccd95c new file mode 100644 index 000000000..0e0cc24e7 --- /dev/null +++ b/af/3fa117f420b366807167e4acb844d7f2ccd95c @@ -0,0 +1,195 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id AAAD5431FB6 + for ; Wed, 23 May 2012 15:40:54 -0700 (PDT) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: -2.3 +X-Spam-Level: +X-Spam-Status: No, score=-2.3 tagged_above=-999 required=5 + tests=[RCVD_IN_DNSWL_MED=-2.3] autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id 0aV0+jFu-QwN for ; + Wed, 23 May 2012 15:40:53 -0700 (PDT) +Received: from outgoing-mail.its.caltech.edu (outgoing-mail.its.caltech.edu + [131.215.239.19]) + by olra.theworths.org (Postfix) with ESMTP id 77223431FC2 + for ; Wed, 23 May 2012 15:40:50 -0700 (PDT) +Received: from fire-doxen.imss.caltech.edu (localhost [127.0.0.1]) + by fire-doxen-postvirus (Postfix) with ESMTP id 9C0ED32807F + for ; Wed, 23 May 2012 15:40:49 -0700 (PDT) +X-Spam-Scanned: at Caltech-IMSS on fire-doxen by amavisd-new +Received: from finestructure.net (unknown [137.151.175.56]) + (Authenticated sender: jrollins) + by fire-doxen-submit (Postfix) with ESMTP id 4CD91328080 + for ; Wed, 23 May 2012 15:40:46 -0700 (PDT) +Received: by finestructure.net (Postfix, from userid 1000) + id F2C471E7; Wed, 23 May 2012 15:40:45 -0700 (PDT) +From: Jameson Graef Rollins +To: Notmuch Mail +Subject: [PATCH v4 2/7] cli: new crypto structure to store crypto contexts and parameters, and functions to support it +Date: Wed, 23 May 2012 15:40:38 -0700 +Message-Id: <1337812843-14986-3-git-send-email-jrollins@finestructure.net> +X-Mailer: git-send-email 1.7.10 +In-Reply-To: <1337812843-14986-2-git-send-email-jrollins@finestructure.net> +References: <1337812843-14986-1-git-send-email-jrollins@finestructure.net> + <1337812843-14986-2-git-send-email-jrollins@finestructure.net> +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Wed, 23 May 2012 22:40:55 -0000 + +This new structure, notmuch_crypto_t, keeps all relevant crypto +contexts and parameters together, and will make it easier to pass the +stuff around and clean it up. The name of the crypto context inside +this new struct will change, to reflect that it is actually a GPG +context, which is a sub type of Crypto context. There are other types +of Crypto contexts (Pkcs7 in particular, which we hope to support) so +we want to be clear. + +The new crypto.c contains functions to return the proper context from +the struct for a given protocol (and initialize it if needed), and to +cleanup a struct by releasing the crypto contexts. +--- + Makefile.local | 1 + + crypto.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + notmuch-client.h | 11 +++++++++ + 3 files changed, 83 insertions(+) + create mode 100644 crypto.c + +diff --git a/Makefile.local b/Makefile.local +index 53b4a0d..a890df2 100644 +--- a/Makefile.local ++++ b/Makefile.local +@@ -292,6 +292,7 @@ notmuch_client_srcs = \ + notmuch-time.c \ + query-string.c \ + mime-node.c \ ++ crypto.c \ + json.c + + notmuch_client_modules = $(notmuch_client_srcs:.c=.o) +diff --git a/crypto.c b/crypto.c +new file mode 100644 +index 0000000..25c2d10 +--- /dev/null ++++ b/crypto.c +@@ -0,0 +1,71 @@ ++/* notmuch - Not much of an email program, (just index and search) ++ * ++ * Copyright © 2012 Jameson Rollins ++ * ++ * This program 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. ++ * ++ * This program 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 http://www.gnu.org/licenses/ . ++ * ++ * Authors: Jameson Rollins ++ */ ++ ++#include "notmuch-client.h" ++ ++/* for the specified protocol return the context pointer (initializing ++ * if needed) */ ++GMimeCryptoContext * ++notmuch_crypto_get_context (notmuch_crypto_t *crypto, const char *protocol) ++{ ++ GMimeCryptoContext *cryptoctx = NULL; ++ ++ /* 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 (!crypto->gpgctx) { ++#ifdef GMIME_ATLEAST_26 ++ /* TODO: GMimePasswordRequestFunc */ ++ crypto->gpgctx = g_mime_gpg_context_new (NULL, "gpg"); ++#else ++ GMimeSession* session = g_object_new (g_mime_session_get_type(), NULL); ++ crypto->gpgctx = g_mime_gpg_context_new (session, "gpg"); ++ g_object_unref (session); ++#endif ++ if (crypto->gpgctx) { ++ g_mime_gpg_context_set_always_trust ((GMimeGpgContext*) crypto->gpgctx, FALSE); ++ } else { ++ fprintf (stderr, "Failed to construct gpg context.\n"); ++ } ++ } ++ cryptoctx = crypto->gpgctx; ++ ++ } else { ++ fprintf (stderr, "Unknown or unsupported cryptographic protocol.\n"); ++ } ++ ++ return cryptoctx; ++} ++ ++int ++notmuch_crypto_cleanup (notmuch_crypto_t *crypto) ++{ ++ if (crypto->gpgctx) { ++ g_object_unref(crypto->gpgctx); ++ crypto->gpgctx = NULL; ++ } ++ ++ return 0; ++} +diff --git a/notmuch-client.h b/notmuch-client.h +index 337409f..a8b00ab 100644 +--- a/notmuch-client.h ++++ b/notmuch-client.h +@@ -76,6 +76,11 @@ typedef struct notmuch_show_format { + const char *message_set_end; + } notmuch_show_format_t; + ++typedef struct notmuch_crypto { ++ GMimeCryptoContext* gpgctx; ++ notmuch_bool_t decrypt; ++} notmuch_crypto_t; ++ + typedef struct notmuch_show_params { + notmuch_bool_t entire_thread; + notmuch_bool_t omit_excluded; +@@ -111,6 +116,12 @@ chomp_newline (char *str) + str[strlen(str)-1] = '\0'; + } + ++GMimeCryptoContext * ++notmuch_crypto_get_context (notmuch_crypto_t *crypto, const char *protocol); ++ ++int ++notmuch_crypto_cleanup (notmuch_crypto_t *crypto); ++ + int + notmuch_count_command (void *ctx, int argc, char *argv[]); + +-- +1.7.10 + -- 2.26.2