Re: [PATCH v3 1/6] cli: new crypto structure to store crypto contexts and parameters, and functions to support it

Subject: Re: [PATCH v3 1/6] cli: new crypto structure to store crypto contexts and parameters, and functions to support it

Date: Wed, 23 May 2012 08:59:59 +0300

To: Jameson Graef Rollins

Cc: Notmuch Mail

From: Jani Nikula


On May 23, 2012 4:44 AM, "Jameson Graef Rollins" <jrollins@finestructure.net>
wrote:
>
> 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         |   65
++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  notmuch-client.h |   15 +++++++++++++
>  3 files changed, 81 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..c346999
> --- /dev/null
> +++ b/crypto.c
> @@ -0,0 +1,65 @@
> +/* 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;

Isn't GMimeCryptoContext gmime 2.6 specific? It's #ifdeffed elsewhere at
least. Also affects the return type.

> +
> +    if ((strcmp (protocol, "application/pgp-signature") == 0)
> +       || (strcmp (protocol, "application/pgp-encrypted") == 0)) {

Is protocol guaranteed to be lower case?

> +       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 19b7f01..14d1e2f 100644
> --- a/notmuch-client.h
> +++ b/notmuch-client.h
> @@ -74,6 +74,15 @@ typedef struct notmuch_show_format {
>     const char *message_set_end;
>  } notmuch_show_format_t;
>
> +typedef struct notmuch_crypto {
> +#ifdef GMIME_ATLEAST_26
> +    GMimeCryptoContext* gpgctx;
> +#else
> +    GMimeCipherContext* gpgctx;
> +#endif
> +    notmuch_bool_t decrypt;
> +} notmuch_crypto_t;
> +
>  typedef struct notmuch_show_params {
>     notmuch_bool_t entire_thread;
>     notmuch_bool_t omit_excluded;
> @@ -113,6 +122,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
>
> _______________________________________________
> notmuch mailing list
> notmuch@notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch

Thread: