<p><br>
On May 23, 2012 4:44 AM, "Jameson Graef Rollins" <<a href="mailto:jrollins@finestructure.net">jrollins@finestructure.net</a>> wrote:<br>
><br>
> This new structure, notmuch_crypto_t, keeps all relevant crypto<br>
> contexts and parameters together, and will make it easier to pass the<br>
> stuff around and clean it up.  The name of the crypto context inside<br>
> this new struct will change, to reflect that it is actually a GPG<br>
> context, which is a sub type of Crypto context.  There are other types<br>
> of Crypto contexts (Pkcs7 in particular, which we hope to support) so<br>
> we want to be clear.<br>
><br>
> The new crypto.c contains functions to return the proper context from<br>
> the struct for a given protocol (and initialize it if needed), and to<br>
> cleanup a struct by releasing the crypto contexts.<br>
> ---<br>
>  Makefile.local   |    1 +<br>
>  crypto.c         |   65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
>  notmuch-client.h |   15 +++++++++++++<br>
>  3 files changed, 81 insertions(+)<br>
>  create mode 100644 crypto.c<br>
><br>
> diff --git a/Makefile.local b/Makefile.local<br>
> index 53b4a0d..a890df2 100644<br>
> --- a/Makefile.local<br>
> +++ b/Makefile.local<br>
> @@ -292,6 +292,7 @@ notmuch_client_srcs =               \<br>
>        notmuch-time.c          \<br>
>        query-string.c          \<br>
>        mime-node.c             \<br>
> +       crypto.c                \<br>
>        json.c<br>
><br>
>  notmuch_client_modules = $(notmuch_client_srcs:.c=.o)<br>
> diff --git a/crypto.c b/crypto.c<br>
> new file mode 100644<br>
> index 0000000..c346999<br>
> --- /dev/null<br>
> +++ b/crypto.c<br>
> @@ -0,0 +1,65 @@<br>
> +/* notmuch - Not much of an email program, (just index and search)<br>
> + *<br>
> + * Copyright © 2012 Jameson Rollins<br>
> + *<br>
> + * This program is free software: you can redistribute it and/or modify<br>
> + * it under the terms of the GNU General Public License as published by<br>
> + * the Free Software Foundation, either version 3 of the License, or<br>
> + * (at your option) any later version.<br>
> + *<br>
> + * This program is distributed in the hope that it will be useful,<br>
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br>
> + * GNU General Public License for more details.<br>
> + *<br>
> + * You should have received a copy of the GNU General Public License<br>
> + * along with this program.  If not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a> .<br>
> + *<br>
> + * Authors: Jameson Rollins <<a href="mailto:jrollins@finestructure.net">jrollins@finestructure.net</a>><br>
> + */<br>
> +<br>
> +#include "notmuch-client.h"<br>
> +<br>
> +/* for the specified protocol return the context pointer (initializing<br>
> + * if needed) */<br>
> +GMimeCryptoContext *<br>
> +notmuch_crypto_get_context (notmuch_crypto_t *crypto, const char *protocol)<br>
> +{<br>
> +    GMimeCryptoContext *cryptoctx = NULL;</p>
<p>Isn't GMimeCryptoContext gmime 2.6 specific? It's #ifdeffed elsewhere at least. Also affects the return type.</p>
<p>> +<br>
> +    if ((strcmp (protocol, "application/pgp-signature") == 0)<br>
> +       || (strcmp (protocol, "application/pgp-encrypted") == 0)) {</p>
<p>Is protocol guaranteed to be lower case?<br></p>
<p>> +       if (!crypto->gpgctx) {<br>
> +#ifdef GMIME_ATLEAST_26<br>
> +           /* TODO: GMimePasswordRequestFunc */<br>
> +           crypto->gpgctx = g_mime_gpg_context_new (NULL, "gpg");<br>
> +#else<br>
> +           GMimeSession* session = g_object_new (g_mime_session_get_type(), NULL);<br>
> +           crypto->gpgctx = g_mime_gpg_context_new (session, "gpg");<br>
> +           g_object_unref (session);<br>
> +#endif<br>
> +           if (crypto->gpgctx) {<br>
> +               g_mime_gpg_context_set_always_trust ((GMimeGpgContext*) crypto->gpgctx, FALSE);<br>
> +           } else {<br>
> +               fprintf (stderr, "Failed to construct gpg context.\n");<br>
> +           }<br>
> +       }<br>
> +       cryptoctx = crypto->gpgctx;<br>
> +<br>
> +    } else {<br>
> +       fprintf (stderr, "Unknown or unsupported cryptographic protocol.\n");<br>
> +    }<br>
> +<br>
> +    return cryptoctx;<br>
> +}<br>
> +<br>
> +int<br>
> +notmuch_crypto_cleanup (notmuch_crypto_t *crypto)<br>
> +{<br>
> +    if (crypto->gpgctx) {<br>
> +       g_object_unref(crypto->gpgctx);<br>
> +       crypto->gpgctx = NULL;<br>
> +    }<br>
> +<br>
> +    return 0;<br>
> +}<br>
> diff --git a/notmuch-client.h b/notmuch-client.h<br>
> index 19b7f01..14d1e2f 100644<br>
> --- a/notmuch-client.h<br>
> +++ b/notmuch-client.h<br>
> @@ -74,6 +74,15 @@ typedef struct notmuch_show_format {<br>
>     const char *message_set_end;<br>
>  } notmuch_show_format_t;<br>
><br>
> +typedef struct notmuch_crypto {<br>
> +#ifdef GMIME_ATLEAST_26<br>
> +    GMimeCryptoContext* gpgctx;<br>
> +#else<br>
> +    GMimeCipherContext* gpgctx;<br>
> +#endif<br>
> +    notmuch_bool_t decrypt;<br>
> +} notmuch_crypto_t;<br>
> +<br>
>  typedef struct notmuch_show_params {<br>
>     notmuch_bool_t entire_thread;<br>
>     notmuch_bool_t omit_excluded;<br>
> @@ -113,6 +122,12 @@ chomp_newline (char *str)<br>
>        str[strlen(str)-1] = '\0';<br>
>  }<br>
><br>
> +GMimeCryptoContext *<br>
> +notmuch_crypto_get_context (notmuch_crypto_t *crypto, const char *protocol);<br>
> +<br>
> +int<br>
> +notmuch_crypto_cleanup (notmuch_crypto_t *crypto);<br>
> +<br>
>  int<br>
>  notmuch_count_command (void *ctx, int argc, char *argv[]);<br>
><br>
> --<br>
> 1.7.10<br>
><br>
> _______________________________________________<br>
> notmuch mailing list<br>
> <a href="mailto:notmuch@notmuchmail.org">notmuch@notmuchmail.org</a><br>
> <a href="http://notmuchmail.org/mailman/listinfo/notmuch">http://notmuchmail.org/mailman/listinfo/notmuch</a><br>
</p>