#include <lib-lib/lib-lib.h>
-#ifdef CRYPT_BACKEND_GPGME
-
#ifdef HAVE_LOCALE_H
# include <locale.h>
#endif
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);
}
int err = 0;
gpgme_data_t data;
- fptmp = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+ fptmp = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
if (!fptmp) {
mutt_perror (_("Can't create temporary file"));
return NULL;
FILE *fp;
ssize_t nread = 0;
- fp = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+ fp = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
if (!fp) {
mutt_perror (_("Can't create temporary file"));
return NULL;
is_pgp = (key->protocol == GPGME_PROTOCOL_OpenPGP);
bufsize = m_strlen(prefix) + m_strlen(s) * 4 + 2;
- buf = xmalloc(bufsize);
+ buf = p_new(char, bufsize);
m_strcpy(buf, bufsize, prefix);
p = buf + m_strlen(buf);
if (is_pgp && m_strlen(s) == 40) { /* PGP v4 style formatted. */
p_clear(&s, 1);
s.fpin = fpin;
- *fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+ *fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
if (!*fpout) {
mutt_perror (_("Can't create temporary file"));
return -1;
p_clear(&s, 1);
s.fpin = fpin;
fseeko (s.fpin, b->offset, 0);
- tmpfp = m_tempfile (tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+ tmpfp = m_tempfile (tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
if (!tmpfp) {
mutt_perror (_("Can't create temporary file"));
return -1;
p_clear(&s, 1);
s.fpin = tmpfp;
s.fpout = 0;
- *fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+ *fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
if (!*fpout) {
mutt_perror (_("Can't create temporary file"));
return -1;
p_clear(&s, 1);
s.fpin = *fpout;
fseeko (s.fpin, bb->offset, 0);
- tmpfp = m_tempfile (tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+ tmpfp = m_tempfile (tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
if (!tmpfp) {
mutt_perror (_("Can't create temporary file"));
return -1;
p_clear(&s, 1);
s.fpin = tmpfp;
s.fpout = 0;
- *fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+ *fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
if (!*fpout) {
mutt_perror (_("Can't create temporary file"));
return -1;
char tempfile[_POSIX_PATH_MAX];
char buf[HUGE_STRING];
FILE *tfp;
+ int tempfd;
short sgn = 0;
short enc = 0;
if (tagged_only && !b->tagged)
return 0;
- mutt_mktemp (tempfile);
- if (mutt_decode_save_attachment (fp, b, tempfile, 0, 0) != 0) {
+ tempfd = m_tempfd(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
+ if (mutt_decode_save_attachment (fp, b, tempfd, 0) != 0) {
unlink (tempfile);
return 0;
}
- if ((tfp = fopen (tempfile, "r")) == NULL) {
+ if ((tfp = fopen(tempfile, "r")) == NULL) {
unlink (tempfile);
return 0;
}
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;
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)
/* Move forward to the application/pgp-encrypted body. */
a = a->next;
- fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+ fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
if (!fpout) {
if (s->flags & M_DISPLAY)
state_attach_puts (_("[-- Error: could not create temporary file! "
int rc = 0;
a->warnsig = 0;
- fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+ fpout = m_tempfile(tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
if (!fpout) {
if (s->flags & M_DISPLAY)
state_attach_puts (_("[-- Error: could not create temporary file! "
static const char *
crypt_entry_fmt (char *dest, ssize_t destlen, char op,
const char *src, const char *prefix,
- const char *ifstring, const char *elsestring,
- unsigned long data, format_flag flags)
+ const char *ifstr, const char *elstr,
+ anytype data, format_flag flags)
{
char fmt[16];
crypt_entry_t *entry;
const char *s = NULL;
unsigned long val;
- entry = (crypt_entry_t *) data;
+ entry = data.ptr;
key = entry->key;
/* if (isupper ((unsigned char) op)) */
*dest = '\0';
}
- if (optional)
- m_strformat (dest, destlen, ifstring, mutt_attach_fmt, data, 0);
- else if (flags & M_FORMAT_OPTIONAL)
- m_strformat (dest, destlen, elsestring, mutt_attach_fmt, data, 0);
- return (src);
+ if (flags & M_FORMAT_OPTIONAL)
+ m_strformat(dest, destlen, 0, optional ? ifstr: elstr,
+ mutt_attach_fmt, data, 0);
+ return src;
}
/* Used by the display fucntion to format a line. */
entry.key = key_table[num];
entry.num = num + 1;
- m_strformat(s, l, NONULL (PgpEntryFormat), crypt_entry_fmt,
- (unsigned long) &entry,
+ m_strformat(s, l, COLS - SW, PgpEntryFormat, crypt_entry_fmt, &entry,
option(OPTARROWCURSOR) ? M_FORMAT_ARROWCURSOR : 0);
}
if (!n || (n & 1))
return NULL; /* empty or odd number of digits */
n /= 2;
- p = xmalloc(n + 1);
+ p = p_new(unsigned char, n + 1);
array->value = (char *) p;
for (s1 = string; n; s1 += 2, n--)
*p++ = xtoi_2 (s1);
n++;
}
- p = xmalloc(n + 1);
+ p = p_new(unsigned char, n + 1);
array->value = (char *) p;
for (s = string; n; s++, n--) {
if (*s == '\\') {
gpgme_key_t k = NULL;
int maxdepth = 100;
- fp = m_tempfile (tempfile, sizeof(tempfile), NONULL(Tempdir), NULL);
+ fp = m_tempfile (tempfile, sizeof(tempfile), NONULL(MCore.tmpdir), NULL);
if (!fp) {
mutt_perror (_("Can't create temporary file"));
return;
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);
+}
+