[PATCH v4 2/7] cli: new crypto structure to store crypto contexts and parameters, and functions to support it
Austin Clements
amdragon at MIT.EDU
Fri May 25 07:42:08 PDT 2012
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 at 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[]);
>
More information about the notmuch
mailing list