--- crypto.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/crypto.c b/crypto.c index 7cd7b69d1221..8e58dcca4ee5 100644 --- a/crypto.c +++ b/crypto.c @@ -74,16 +74,30 @@ create_gpg_context (notmuch_crypto_t *crypto) #endif /* GMIME_ATLEAST_26 */ +static struct { + const char *protocol; + notmuch_crypto_context_t *(*get_context) (notmuch_crypto_t *crypto); +} protocols[] = { + { + .protocol = "application/pgp-signature", + .get_context = create_gpg_context, + }, + { + .protocol = "application/pgp-encrypted", + .get_context = create_gpg_context, + }, +}; + /* 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; + size_t i; if (! protocol) { fprintf (stderr, "Cryptographic protocol is empty.\n"); - return cryptoctx; + return NULL; } /* As per RFC 1847 section 2.1: "the [protocol] value token is @@ -92,14 +106,14 @@ notmuch_crypto_get_context (notmuch_crypto_t *crypto, const char *protocol) * 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) { - cryptoctx = create_gpg_context (crypto); - } else { - fprintf (stderr, "Unknown or unsupported cryptographic protocol.\n"); + for (i = 0; i < ARRAY_SIZE (protocols); i++) { + if (strcasecmp (protocol, protocols[i].protocol) == 0) + return protocols[i].get_context (crypto); } - return cryptoctx; + fprintf (stderr, "Unknown or unsupported cryptographic protocol.\n"); + + return NULL; } int -- 2.1.4