From 75147b39ee208b0e6257bc483d96b20b1f5a7995 Mon Sep 17 00:00:00 2001 From: Pierre Habouzit Date: Tue, 3 Apr 2007 00:10:06 +0200 Subject: [PATCH] add support for import key from gpgme as well ! remove tedious pile of crap Signed-off-by: Pierre Habouzit --- lib-crypt/crypt-gpgme.c | 67 ++++++++++++++++++ lib-crypt/crypt-gpgme.h | 2 + lib-crypt/crypt-mod-pgp-gpgme.c | 119 +++++++++----------------------- lib-crypt/pgp.c | 6 +- 4 files changed, 105 insertions(+), 89 deletions(-) diff --git a/lib-crypt/crypt-gpgme.c b/lib-crypt/crypt-gpgme.c index fdf0576..70d0713 100644 --- a/lib-crypt/crypt-gpgme.c +++ b/lib-crypt/crypt-gpgme.c @@ -3884,3 +3884,70 @@ int smime_gpgme_verify_sender (HEADER * h) { return verify_sender (h, GPGME_PROTOCOL_CMS); } + +void pgp_gpgme_invoke_import(const char *fname) +{ + gpgme_ctx_t ctx = create_gpgme_context(0); + gpgme_data_t data; + gpgme_error_t err; + + err = gpgme_data_new_from_file(&data, fname, 1); + if (err) { + mutt_error (_("error allocating data object: %s\n"), gpgme_strerror (err)); + gpgme_release(ctx); + return; + } + + err = gpgme_op_import(ctx, data); + if (err) { + mutt_error(_("error importing gpg data: %s\n"), gpgme_strerror(err)); + gpgme_data_release(data); + gpgme_release(ctx); + return; + } + + gpgme_data_release(data); + gpgme_release(ctx); + return; +} + +static void pgp_extract_keys_from_attachment (FILE * fp, BODY * top) +{ + STATE s; + FILE *tempfp; + char tempfname[_POSIX_PATH_MAX]; + + tempfp = m_tempfile(tempfname, sizeof(tempfname), NONULL(MCore.tmpdir), NULL); + if (tempfp == NULL) { + mutt_perror (_("Can't create temporary file")); + return; + } + + p_clear(&s, 1); + + s.fpin = fp; + s.fpout = tempfp; + + mutt_body_handler (top, &s); + + m_fclose(&tempfp); + pgp_gpgme_invoke_import(tempfname); + mutt_unlink (tempfname); +} + +void pgp_gpgme_from_attachment_list (FILE * fp, int tag, BODY * top) +{ + mutt_endwin (NULL); + set_option (OPTDONTHANDLEPGPKEYS); + + for (; top; top = top->next) { + if (!tag || top->tagged) + pgp_extract_keys_from_attachment (fp, top); + + if (!tag) + break; + } + + unset_option (OPTDONTHANDLEPGPKEYS); +} + diff --git a/lib-crypt/crypt-gpgme.h b/lib-crypt/crypt-gpgme.h index 74e5a38..45f9145 100644 --- a/lib-crypt/crypt-gpgme.h +++ b/lib-crypt/crypt-gpgme.h @@ -44,5 +44,7 @@ int smime_gpgme_verify_sender (HEADER* h); int pgp_gpgme_send_menu (HEADER * msg, int *redraw); int smime_gpgme_send_menu (HEADER * msg, int *redraw); +void pgp_gpgme_invoke_import(const char *fname); +void pgp_gpgme_from_attachment_list (FILE * fp, int tag, BODY * top); #endif diff --git a/lib-crypt/crypt-mod-pgp-gpgme.c b/lib-crypt/crypt-mod-pgp-gpgme.c index ef3223b..d0e4851 100644 --- a/lib-crypt/crypt-mod-pgp-gpgme.c +++ b/lib-crypt/crypt-mod-pgp-gpgme.c @@ -7,106 +7,51 @@ * please see the file GPL in the top level source directory. */ -/* - This is a crytpo module wrapping the gpgme based pgp code. - */ +/* This is a crytpo module wrapping the gpgme based pgp code. */ #include #include #include "crypt-gpgme.h" -static void crypt_mod_pgp_init (void) -{ - pgp_gpgme_init (); -} - static void crypt_mod_pgp_void_passphrase (void) { - /* Handled by gpg-agent. */ + /* Handled by gpg-agent. */ } static int crypt_mod_pgp_valid_passphrase (void) { - /* Handled by gpg-agent. */ - return 1; -} - -static int crypt_mod_pgp_decrypt_mime (FILE * a, FILE ** b, BODY * c, - BODY ** d) -{ - return pgp_gpgme_decrypt_mime (a, b, c, d); -} - -static int crypt_mod_pgp_application_handler (BODY * m, STATE * s) -{ - return pgp_gpgme_application_handler (m, s); -} - -static int crypt_mod_pgp_encrypted_handler (BODY * m, STATE * s) -{ - return pgp_gpgme_encrypted_handler (m, s); -} - -static int crypt_mod_pgp_check_traditional (FILE * fp, BODY * b, - int tagged_only) -{ - return pgp_gpgme_check_traditional (fp, b, tagged_only); -} - -static char *crypt_mod_pgp_findkeys (address_t * to, address_t * cc, - address_t * bcc) -{ - return pgp_gpgme_findkeys (to, cc, bcc); -} - -static BODY *crypt_mod_pgp_sign_message (BODY * a) -{ - return pgp_gpgme_sign_message (a); -} - -static int crypt_mod_pgp_verify_one (BODY * sigbdy, STATE * s, - const char *tempf) -{ - return pgp_gpgme_verify_one (sigbdy, s, tempf); -} - -static int crypt_mod_pgp_send_menu (HEADER * msg, int *redraw) -{ - return pgp_gpgme_send_menu (msg, redraw); -} - -static BODY *crypt_mod_pgp_encrypt_message (BODY * a, char *keylist, int sign) -{ - return pgp_gpgme_encrypt_message (a, keylist, sign); + /* Handled by gpg-agent. */ + return 1; } struct crypt_module_specs crypt_mod_pgp_gpgme = { APPLICATION_PGP, - { - /* Common. */ - crypt_mod_pgp_init, - crypt_mod_pgp_void_passphrase, - crypt_mod_pgp_valid_passphrase, - crypt_mod_pgp_decrypt_mime, - crypt_mod_pgp_application_handler, - crypt_mod_pgp_encrypted_handler, - crypt_mod_pgp_findkeys, - crypt_mod_pgp_sign_message, - crypt_mod_pgp_verify_one, - crypt_mod_pgp_send_menu, - - /* PGP specific. */ - crypt_mod_pgp_encrypt_message, - NULL, /* pgp_make_key_attachment, */ - crypt_mod_pgp_check_traditional, - NULL, /* pgp_traditional_encryptsign */ - NULL, /* pgp_invoke_getkeys */ - NULL, /* pgp_invoke_import */ - NULL, /* pgp_extract_keys_from_attachment_list */ - - NULL, /* smime_getkeys */ - NULL, /* smime_verify_sender */ - NULL, /* smime_build_smime_entity */ - NULL, /* smime_invoke_import */ - } + { + /* Common. */ + pgp_gpgme_init, + crypt_mod_pgp_void_passphrase, + crypt_mod_pgp_valid_passphrase, + pgp_gpgme_decrypt_mime, + pgp_gpgme_application_handler, + pgp_gpgme_encrypted_handler, + pgp_gpgme_findkeys, + pgp_gpgme_sign_message, + pgp_gpgme_verify_one, + pgp_gpgme_send_menu, + + /* PGP specific. */ + pgp_gpgme_encrypt_message, + NULL, /* pgp_make_key_attachment, */ + pgp_gpgme_check_traditional, + NULL, /* pgp_traditional_encryptsign */ + NULL, /* pgp_invoke_getkeys */ + pgp_gpgme_invoke_import, /* pgp_invoke_import */ + pgp_gpgme_from_attachment_list, + /* pgp_extract_keys_from_attachment_list */ + + NULL, /* smime_getkeys */ + NULL, /* smime_verify_sender */ + NULL, /* smime_build_smime_entity */ + NULL, /* smime_invoke_import */ + } }; diff --git a/lib-crypt/pgp.c b/lib-crypt/pgp.c index abab102..8db2a5d 100644 --- a/lib-crypt/pgp.c +++ b/lib-crypt/pgp.c @@ -609,8 +609,10 @@ static void pgp_extract_keys_from_attachment (FILE * fp, BODY * top) m_fclose(&tempfp); - pgp_invoke_import (tempfname); - mutt_any_key_to_continue (NULL); + if (CRYPT_MOD_CALL_CHECK (PGP, pgp_invoke_import)) { + (CRYPT_MOD_CALL (PGP, pgp_invoke_import)) (fname); + mutt_any_key_to_continue (NULL); + } mutt_unlink (tempfname); } -- 2.20.1