#include <gpgme.h>
#include <lib-mime/mime.h>
-#include <lib-ui/curses.h>
-#include <lib-ui/enter.h>
+#include <lib-ui/lib-ui.h>
#include <lib-ui/menu.h>
#include <lib-mx/mx.h>
if (err) {
mutt_error(_("error creating gpgme context: %s\n"),
gpgme_strerror(err));
- sleep(2);
+ mutt_sleep(2);
mutt_exit(1);
}
if (!for_smime)
err = gpgme_set_protocol(ctx, GPGME_PROTOCOL_CMS);
if (err) {
mutt_error(_("error enabling CMS protocol: %s\n"), gpgme_strerror(err));
- sleep(2);
+ mutt_sleep(2);
mutt_exit(1);
}
return ctx;
if (err) {
mutt_error(_("error creating gpgme data object: %s\n"),
gpgme_strerror(err));
- sleep(2);
+ mutt_sleep(2);
mutt_exit(1);
}
return data;
static char *data_object_to_tempfile(gpgme_data_t data, FILE **ret_fp)
{
int err;
- char tempfile[_POSIX_PATH_MAX];
+ char tempfile[_POSIX_PATH_MAX], buf[BUFSIZ];
FILE *fp;
ssize_t nread = 0;
err = ((gpgme_data_seek (data, 0, SEEK_SET) == -1)
? gpgme_error_from_errno (errno) : 0);
- if (!err) {
- char buf[4096];
+ if (err) {
+ mutt_perror(_("Can't create temporary file"));
+ goto error;
+ }
- while ((nread = gpgme_data_read(data, buf, sizeof(buf)))) {
- if (fwrite (buf, nread, 1, fp) != 1) {
- mutt_perror (_("Can't create temporary file"));
- m_fclose(&fp);
- unlink (tempfile);
- return NULL;
- }
+ while ((nread = gpgme_data_read(data, buf, sizeof(buf)))) {
+ if (fwrite (buf, nread, 1, fp) != 1) {
+ mutt_perror (_("Can't create temporary file"));
+ goto error;
}
}
if (nread == -1) {
mutt_error (_("error reading data object: %s\n"), gpgme_strerror (err));
- unlink (tempfile);
- m_fclose(&fp);
- return NULL;
+ goto error;
}
if (ret_fp) {
rewind(fp);
m_fclose(&fp);
}
return m_strdup(tempfile);
+
+ error:
+ m_fclose(&fp);
+ unlink (tempfile);
+ return NULL;
}
if (needpass == -1) {
state_attach_puts (_("[-- Error: could not find beginning"
" of PGP message! --]\n\n"), s);
- return (-1);
+ return -1;
}
- return (err);
+ return err;
}
/* MIME handler for pgp/mime encrypted messages. */
if (s->flags & M_DISPLAY)
state_attach_puts (_("[-- Error: malformed PGP/MIME message! --]\n\n"),
s);
- return (-1);
+ return -1;
}
/* Move forward to the application/pgp-encrypted body. */
if (s->flags & M_DISPLAY)
state_attach_puts (_("[-- Error: could not create temporary file! "
"--]\n"), s);
- return (-1);
+ return -1;
}
tattach = decrypt_part (a, s, fpout, 0, &is_signed);
m_fclose(&fpout);
mutt_unlink (tempfile);
- return (rc);
+ return rc;
}
/* Support for application/smime */
if (s->flags & M_DISPLAY)
state_attach_puts (_("[-- Error: could not create temporary file! "
"--]\n"), s);
- return (-1);
+ return -1;
}
tattach = decrypt_part (a, s, fpout, 1, &is_signed);
m_fclose(&fpout);
mutt_unlink (tempfile);
- return (rc);
+ return rc;
}
entry.key = cryptkey_table[num];
entry.num = num + 1;
- m_strformat(s, l, COLS - SW, mod_crypt.pgp_entry_format, crypt_entry_fmt,
- &entry, 0);
+ m_strformat(s, l, getmaxx(main_w), mod_crypt.pgp_entry_format,
+ crypt_entry_fmt, &entry, 0);
}
/* Compare two addresses and the keyid to be used for sorting. */
static int crypt_compare_address (const void *a, const void *b)
{
- return ((PgpSortKeys & SORT_REVERSE) ? !_crypt_compare_address (a, b)
- : _crypt_compare_address (a, b));
+ return !(PgpSortKeys & SORT_REVERSE) == _crypt_compare_address(a, b);
}
static int crypt_compare_keyid (const void *a, const void *b)
{
- return ((PgpSortKeys & SORT_REVERSE) ? !_crypt_compare_keyid (a, b)
- : _crypt_compare_keyid (a, b));
+ return !(PgpSortKeys & SORT_REVERSE) == _crypt_compare_keyid(a, b);
}
/* Compare 2 creation dates and the addresses. For sorting. */
static int crypt_compare_date (const void *a, const void *b)
{
- return ((PgpSortKeys & SORT_REVERSE) ? !_crypt_compare_date (a, b)
- : _crypt_compare_date (a, b));
+ return !(PgpSortKeys & SORT_REVERSE) == _crypt_compare_date(a, b);
}
/* Compare two trust values, the key length, the creation dates. the
if ((r = m_strcasecmp((*s)->uid, (*t)->uid)))
return r > 0;
- return (m_strcasecmp(crypt_keyid ((*s)), crypt_keyid ((*t)))) > 0;
+ return m_strcasecmp(crypt_keyid(*s), crypt_keyid(*t)) > 0;
}
static int crypt_compare_trust (const void *a, const void *b)
{
- return ((PgpSortKeys & SORT_REVERSE) ? !_crypt_compare_trust (a, b)
- : _crypt_compare_trust (a, b));
+ return !(PgpSortKeys & SORT_REVERSE) == _crypt_compare_trust(a, b);
}
/* Print the X.500 Distinguished Name part KEY from the array of parts
}
}
+static char *crypt_hook(address_t *adr)
+{
+ char *res = NULL;
+ lua_State *L = luaM_getruntime();
+ lua_getglobal(L, "mod_core"); /* push mod_core 1 */
+ lua_getfield(L, -1, "crypt_hook"); /* push folder_hook() 2 */
+ if (lua_isfunction(L, -1)) {
+ lua_pushstring(L, adr->mailbox);
+ if (!lua_pcall(L, 1, 1, 0)) {
+ res = m_strdup(lua_tostring(L, -1));
+ }
+ lua_pop(L, 1);
+ }
+ lua_pop(L, 2);
+ return res;
+}
+
/* This routine attempts to find the keyids of the recipients of a
message. It returns NULL if any of the keys can not be found. */
static char *find_keys(ENVELOPE *env, unsigned int app)
while ((addr = address_list_pop(&lst))) {
char buf[STRING];
int forced_valid = 0;
- const char *keyID;
+ char *keyID;
cryptkey_t *key = NULL;
- if ((keyID = mutt_crypt_hook(addr))) {
+ if ((keyID = crypt_hook(addr))) {
int r;
snprintf(buf, sizeof(buf), _("Use keyID = \"%s\" for %s?"), keyID,
address_list_wipe(&lst);
address_list_wipe(&addr);
buffer_delete(&keylist);
+ p_delete(&keyID);
return NULL;
}
}
}
}
+ p_delete(&keyID);
if (!key) {
key = crypt_getkeybyaddr(addr, KEYFLAG_CANENCRYPT, app, &forced_valid);
}
}
-void crypt_invoke_message (int type)
-{
- if (type & APPLICATION_PGP) {
- mutt_message _("Invoking PGP...");
- }
- else if (type & APPLICATION_SMIME) {
- mutt_message _("Invoking S/MIME...");
- }
-}
-
int mutt_protect (HEADER * msg, char *keylist)
{
BODY *pbody = NULL, *tmp_pbody = NULL;
if (!(tmp_pbody = crypt_smime_build_smime_entity (tmp_smime_pbody,
keylist))) {
/* signed ? free it! */
- return (-1);
+ return -1;
}
/* free tmp_body if messages was signed AND encrypted ... */
if (tmp_smime_pbody != msg->content && tmp_smime_pbody != tmp_pbody) {
body_list_wipe(&tmp_pgp_pbody->next);
}
- return (-1);
+ return -1;
}
/* destroy temporary signature envelope when doing retainable
if (s->flags & M_DISPLAY && sigcnt)
state_attach_puts (_("\n[-- End of signed data --]\n"), s);
- return (rc);
+ return rc;
}
static int _mutt_check_traditional_pgp (HEADER * h, int *redraw)