{
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);
+}
+
* 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 <lib-lib/lib-lib.h>
#include <lib-crypt/crypt-mod.h>
#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 */
+ }
};