add support for import key from gpgme as well !
[apps/madmutt.git] / lib-crypt / crypt-gpgme.c
index c0d4b7f..70d0713 100644 (file)
@@ -14,8 +14,6 @@
 
 #include <lib-lib/lib-lib.h>
 
-#ifdef CRYPT_BACKEND_GPGME
-
 #ifdef HAVE_LOCALE_H
 #  include <locale.h>
 #endif
@@ -116,7 +114,7 @@ static void print_utf8 (FILE * fp, const char *buf, ssize_t len)
   char *tstr;
 
   tstr = p_dupstr(buf, len);
-  mutt_convert_string (&tstr, "utf-8", Charset, M_ICONV_HOOK_FROM);
+  mutt_convert_string (&tstr, "utf-8", MCharset.charset, M_ICONV_HOOK_FROM);
   fputs (tstr, fp);
   p_delete(&tstr);
 }
@@ -1707,7 +1705,7 @@ static void copy_clearsigned (gpgme_data_t data, STATE * s, char *charset)
   unlink (fname);
   p_delete(&fname);
 
-  fc = fgetconv_open (fp, charset, Charset, M_ICONV_HOOK_FROM);
+  fc = fgetconv_open (fp, charset, MCharset.charset, M_ICONV_HOOK_FROM);
 
   for (complete = 1, armor_header = 1;
        fgetconvs (buf, sizeof (buf), fc) != NULL;
@@ -1925,7 +1923,7 @@ int pgp_gpgme_application_handler (BODY * m, STATE * s)
         int c;
 
         rewind (pgpout);
-        fc = fgetconv_open (pgpout, "utf-8", Charset, 0);
+        fc = fgetconv_open (pgpout, "utf-8", MCharset.charset, 0);
         while ((c = fgetconv (fc)) != EOF) {
           state_putc (c, s);
           if (c == '\n' && s->prefix)
@@ -3887,4 +3885,69 @@ int smime_gpgme_verify_sender (HEADER * h)
   return verify_sender (h, GPGME_PROTOCOL_CMS);
 }
 
-#endif
+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);
+}
+