Re: [PATCH v4 2/7] cli: new crypto structure to store crypto contexts and parameters, and functions to support it

Subject: Re: [PATCH v4 2/7] cli: new crypto structure to store crypto contexts and parameters, and functions to support it

Date: Fri, 25 May 2012 10:42:08 -0400

To: Jameson Graef Rollins

Cc: Notmuch Mail

From: Austin Clements


Quoth Jameson Graef Rollins on May 23 at  3:40 pm:
> 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 <jrollins@finestructure.net>
> + */
> +
> +#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);

Missing space.

> +	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[]);
>  

Thread: