From 8c39e598d12c66c029df5779b8f720e824f4e0ed Mon Sep 17 00:00:00 2001 From: Jameson Graef Rollins Date: Sun, 27 May 2012 11:45:41 +1700 Subject: [PATCH] [PATCH v5 2/7] cli: new crypto structure to store crypto contexts and parameters, and functions to support it --- 5f/475e586e4c0ab6f881846ea11affee9b046c96 | 195 ++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 5f/475e586e4c0ab6f881846ea11affee9b046c96 diff --git a/5f/475e586e4c0ab6f881846ea11affee9b046c96 b/5f/475e586e4c0ab6f881846ea11affee9b046c96 new file mode 100644 index 000000000..09a22dbc0 --- /dev/null +++ b/5f/475e586e4c0ab6f881846ea11affee9b046c96 @@ -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 1ECB1429E5D + for ; Sat, 26 May 2012 11:46:01 -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 Em0y8q7aTjOl for ; + Sat, 26 May 2012 11:45:58 -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 EA02E431FBC + for ; Sat, 26 May 2012 11:45:55 -0700 (PDT) +Received: from earth-doxen.imss.caltech.edu (localhost [127.0.0.1]) + by earth-doxen-postvirus (Postfix) with ESMTP id 78FAB66E00E4 + for ; Sat, 26 May 2012 11:45:54 -0700 (PDT) +X-Spam-Scanned: at Caltech-IMSS on earth-doxen by amavisd-new +Received: from finestructure.net (unknown [76.89.192.57]) + (Authenticated sender: jrollins) + by earth-doxen-submit (Postfix) with ESMTP id B916866E003A + for ; Sat, 26 May 2012 11:45:51 -0700 (PDT) +Received: by finestructure.net (Postfix, from userid 1000) + id 69DAEAE6; Sat, 26 May 2012 11:45:51 -0700 (PDT) +From: Jameson Graef Rollins +To: Notmuch Mail +Subject: [PATCH v5 2/7] cli: new crypto structure to store crypto contexts and parameters, and functions to support it +Date: Sat, 26 May 2012 11:45:41 -0700 +Message-Id: <1338057946-29209-3-git-send-email-jrollins@finestructure.net> +X-Mailer: git-send-email 1.7.10 +In-Reply-To: <1338057946-29209-2-git-send-email-jrollins@finestructure.net> +References: <1338057946-29209-1-git-send-email-jrollins@finestructure.net> + <1338057946-29209-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: Sat, 26 May 2012 18:46:01 -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..fbe5aeb +--- /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) */ ++notmuch_crypto_context_t * ++notmuch_crypto_get_context (notmuch_crypto_t *crypto, const char *protocol) ++{ ++ notmuch_crypto_context_t *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 d377b04..6664075 100644 +--- a/notmuch-client.h ++++ b/notmuch-client.h +@@ -77,6 +77,11 @@ typedef struct notmuch_show_format { + const char *message_set_end; + } notmuch_show_format_t; + ++typedef struct notmuch_crypto { ++ notmuch_crypto_context_t* gpgctx; ++ notmuch_bool_t decrypt; ++} notmuch_crypto_t; ++ + typedef struct notmuch_show_params { + notmuch_bool_t entire_thread; + notmuch_bool_t omit_excluded; +@@ -112,6 +117,12 @@ chomp_newline (char *str) + str[strlen(str)-1] = '\0'; + } + ++notmuch_crypto_context_t * ++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