#endif
#include <lib-lib/mem.h>
+#include <lib-lib/str.h>
#include <lib-lib/macros.h>
+#include <lib-lib/file.h>
+
+#include <lib-mime/mime.h>
#include "mutt.h"
#include "enter.h"
#include "handler.h"
#include "mutt_curses.h"
#include "mutt_menu.h"
-#include "smime.h"
-#include "mime.h"
#include "copy.h"
-#include "lib/str.h"
#include "lib/debug.h"
#include <sys/wait.h>
/*
- * Queries and passphrase handling.
+ * Create a format string to be used with scanf.
+ * To use it, write, for instance, MUTT_FORMAT(HUGE_STRING).
+ *
+ * See K&R 2nd ed, p. 231 for an explanation.
*/
+#define _MUTT_FORMAT_2(a,b) "%" a b
+#define _MUTT_FORMAT_1(a, b) _MUTT_FORMAT_2(#a, b)
+#define MUTT_FORMAT(a) _MUTT_FORMAT_1(a, "s")
+/*
+ * Queries and passphrase handling.
+ */
/* these are copies from pgp.c */
void smime_void_passphrase (void)
{
- memset (SmimePass, 0, sizeof (SmimePass));
+ p_clear(SmimePass, sizeof(SmimePass));
SmimeExptime = 0;
}
char buf1[LONG_STRING], buf2[LONG_STRING];
struct stat sb;
- strfcpy (path, NONULL (SmimeCALocation), sizeof (path));
+ m_strcpy(path, sizeof(path), NONULL(SmimeCALocation));
mutt_expand_path (path, sizeof (path));
mutt_quote_filename (buf1, sizeof (buf1), path);
struct smime_command_context cctx;
char cmd[HUGE_STRING];
- memset (&cctx, 0, sizeof (cctx));
+ p_clear(&cctx, 1);
if (!format || !*format)
return (pid_t) - 1;
}
fclose (index);
- FOREVER {
+ for (;;) {
*qry = 0;
if (mutt_get_field (prompt, qry, sizeof (qry), 0))
return NULL;
Table[cur].hash = hash;
Table[cur].suffix = hash_suffix;
- strncpy (Table[cur].email, fields[0], sizeof (Table[cur].email));
- strncpy (Table[cur].nick, fields[2], sizeof (Table[cur].nick));
+ m_strcpy(Table[cur].email, sizeof(Table[cur].email), fields[0]);
+ m_strcpy(Table[cur].nick, sizeof(Table[cur].nick), fields[2]);
Table[cur].trust = *fields[4];
Table[cur].public = public;
if (!mailbox && !query)
return (NULL);
- addr_len = mailbox ? str_len (mailbox) : 0;
- query_len = query ? str_len (query) : 0;
+ addr_len = mailbox ? m_strlen(mailbox) : 0;
+ query_len = query ? m_strlen(query) : 0;
*key = '\0';
}
while (fgets (buf, sizeof (buf) - 1, fp) != NULL)
- if (mailbox && !(str_ncasecmp (mailbox, buf, addr_len))) {
+ if (mailbox && !(m_strncasecmp(mailbox, buf, addr_len))) {
numFields = sscanf (buf,
MUTT_FORMAT (STRING) " " MUTT_FORMAT (STRING) " "
MUTT_FORMAT (STRING) " " MUTT_FORMAT (STRING) " "
continue;
}
else if (choice == M_YES) {
- strfcpy (key, fields[1], sizeof (key));
+ m_strcpy(key, sizeof(key), fields[1]);
ask = 0;
break;
}
else {
if (public)
key_trust_level = *fields[4];
- strfcpy (key, fields[1], sizeof (key));
+ m_strcpy(key, sizeof(key), fields[1]);
}
found = 1;
}
/* query = label: return certificate. */
if (numFields >= 3 &&
- !(str_ncasecmp (query, fields[2], query_len))) {
+ !(m_strncasecmp(query, fields[2], query_len))) {
ask = 0;
- strfcpy (key, fields[1], sizeof (key));
+ m_strcpy(key, sizeof(key), fields[1]);
}
/* query = certificate: return intermediate certificate. */
else if (numFields >= 4 &&
- !(str_ncasecmp (query, fields[1], query_len))) {
+ !(m_strncasecmp(query, fields[1], query_len))) {
ask = 0;
- strfcpy (key, fields[3], sizeof (key));
+ m_strcpy(key, sizeof(key), fields[3]);
}
}
}
- /* Note: str_dup ("") returns NULL. */
- return str_dup (key);
+ /* Note: m_strdup("") returns NULL. */
+ return m_strdup(key);
}
if (k) {
/* the key used last time. */
if (*SmimeKeyToUse &&
- !str_casecmp (k, SmimeKeyToUse + str_len (SmimeKeys) + 1)) {
+ !m_strcasecmp(k, SmimeKeyToUse + m_strlen(SmimeKeys) + 1)) {
p_delete(&k);
return;
}
snprintf (SmimeCertToUse, sizeof (SmimeCertToUse), "%s/%s",
NONULL (SmimeCertificates), k);
- if (str_casecmp (k, SmimeDefaultKey))
+ if (m_strcasecmp(k, SmimeDefaultKey))
smime_void_passphrase ();
p_delete(&k);
}
if (*SmimeKeyToUse) {
- if (!str_casecmp (SmimeDefaultKey,
- SmimeKeyToUse + str_len (SmimeKeys) + 1))
+ if (!m_strcasecmp(SmimeDefaultKey,
+ SmimeKeyToUse + m_strlen(SmimeKeys) + 1))
return;
smime_void_passphrase ();
void smime_getkeys (ENVELOPE * env)
{
- ADDRESS *t;
+ address_t *t;
int found = 0;
if (option (OPTSDEFAULTDECRYPTKEY) && SmimeDefaultKey && *SmimeDefaultKey) {
}
if (!found && (t = mutt_default_from ())) {
_smime_getkeys (t->mailbox);
- rfc822_free_address (&t);
+ address_delete (&t);
}
}
* It returns NULL if any of the keys can not be found.
*/
-char *smime_findKeys (ADDRESS * to, ADDRESS * cc, ADDRESS * bcc)
+char *smime_findKeys (address_t * to, address_t * cc, address_t * bcc)
{
char *keyID, *keylist = NULL;
size_t keylist_size = 0;
size_t keylist_used = 0;
- ADDRESS *tmp = NULL, *addr = NULL;
- ADDRESS **last = &tmp;
- ADDRESS *p, *q;
+ address_t *tmp = NULL, *addr = NULL;
+ address_t **last = &tmp;
+ address_t *p, *q;
int i;
const char *fqdn = mutt_fqdn (1);
abort ();
}
- *last = rfc822_cpy_adr (p);
+ *last = address_list_dup (p);
while (*last)
last = &((*last)->next);
}
if (!keyID) {
mutt_message (_("No (valid) certificate found for %s."), q->mailbox);
p_delete(&keylist);
- rfc822_free_address (&tmp);
- rfc822_free_address (&addr);
+ address_delete (&tmp);
+ address_delete (&addr);
return NULL;
}
- keylist_size += str_len (keyID) + 2;
+ keylist_size += m_strlen(keyID) + 2;
p_realloc(&keylist, keylist_size);
sprintf (keylist + keylist_used, "%s\n", keyID); /* __SPRINTF_CHECKED__ */
- keylist_used = str_len (keylist);
+ keylist_used = m_strlen(keylist);
- rfc822_free_address (&addr);
+ address_delete (&addr);
}
- rfc822_free_address (&tmp);
+ address_delete (&tmp);
return (keylist);
}
while ((fgets (email, sizeof (email), fpout))) {
- *(email + str_len (email) - 1) = '\0';
- if (str_ncasecmp (email, mailbox, str_len (mailbox)) == 0)
+ *(email + m_strlen(email) - 1) = '\0';
+ if (m_strncasecmp(email, mailbox, m_strlen(mailbox)) == 0)
ret = 1;
ret = ret < 0 ? 0 : ret;
rewind (fpout);
while ((fgets (email, sizeof (email), fpout))) {
- *(email + str_len (email) - 1) = '\0';
- (*buffer)[count] = p_dupstr(email, str_len(email));
+ *(email + m_strlen(email) - 1) = '\0';
+ (*buffer)[count] = p_dupstr(email, m_strlen(email));
count++;
}
}
fclose (fpout);
fclose (fperr);
- return str_dup (certfile);
+ return m_strdup(certfile);
}
static char *smime_extract_signer_certificate (char *infile)
fclose (fpout);
fclose (fperr);
- return str_dup (certfile);
+ return m_strdup(certfile);
}
*certfile = '\0';
while (1) {
- int off = str_len (certfile);
+ int off = m_strlen(certfile);
while (*++cert_end && *cert_end != '\n');
if (!*cert_end)
t = mutt_new_body ();
t->type = TYPEAPPLICATION;
- t->subtype = str_dup ("x-pkcs7-mime");
+ t->subtype = m_strdup("x-pkcs7-mime");
mutt_set_parameter ("name", "smime.p7m", &t->parameter);
mutt_set_parameter ("smime-type", "enveloped-data", &t->parameter);
t->encoding = ENCBASE64; /* The output of OpenSSL SHOULD be binary */
t->use_disp = 1;
t->disposition = DISPATTACH;
- t->d_filename = str_dup ("smime.p7m");
- t->filename = str_dup (tempfile);
+ t->d_filename = m_strdup("smime.p7m");
+ t->filename = m_strdup(tempfile);
t->unlink = 1; /*delete after sending the message */
t->parts = 0;
t->next = 0;
t = mutt_new_body ();
t->type = TYPEMULTIPART;
- t->subtype = str_dup ("signed");
+ t->subtype = m_strdup("signed");
t->encoding = ENC7BIT;
t->use_disp = 0;
t->disposition = DISPINLINE;
t->parts->next = mutt_new_body ();
t = t->parts->next;
t->type = TYPEAPPLICATION;
- t->subtype = str_dup ("x-pkcs7-signature");
- t->filename = str_dup (signedfile);
- t->d_filename = str_dup ("smime.p7s");
+ t->subtype = m_strdup("x-pkcs7-signature");
+ t->filename = m_strdup(signedfile);
+ t->d_filename = m_strdup("smime.p7s");
t->use_disp = 1;
t->disposition = DISPATTACH;
t->encoding = ENCBASE64;
rewind (smimeerr);
line = mutt_read_line (line, &linelen, smimeerr, &lineno);
- if (linelen && !str_casecmp (line, "verification successful"))
+ if (linelen && !m_strcasecmp(line, "verification successful"))
badsig = 0;
p_delete(&line);
}
}
while (fgets (buf, sizeof (buf) - 1, smimeout) != NULL) {
- len = str_len (buf);
+ len = m_strlen(buf);
if (len > 1 && buf[len - 2] == '\r') {
buf[len - 2] = '\n';
buf[len - 1] = '\0';
rewind (smimeerr);
line = mutt_read_line (line, &linelen, smimeerr, &lineno);
- if (linelen && !str_casecmp (line, "verification successful"))
+ if (linelen && !m_strcasecmp(line, "verification successful"))
m->goodsig = 1;
p_delete(&line);
}
if (b->parts)
return -1;
- memset (&s, 0, sizeof (s));
+ p_clear(&s, 1);
s.fpin = fpin;
fseeko (s.fpin, b->offset, 0);
switch (choice = mutt_multi_choice (_("1: DES, 2: Triple-DES "),
_("dt"))) {
case 1:
- str_replace (&SmimeCryptAlg, "des");
+ m_strreplace(&SmimeCryptAlg, "des");
break;
case 2:
- str_replace (&SmimeCryptAlg, "des3");
+ m_strreplace(&SmimeCryptAlg, "des3");
break;
}
break;
switch (choice = mutt_multi_choice (_("1: RC2-40, 2: RC2-64, 3: RC2-128 "),
_("468"))) {
case 1:
- str_replace (&SmimeCryptAlg, "rc2-40");
+ m_strreplace(&SmimeCryptAlg, "rc2-40");
break;
case 2:
- str_replace (&SmimeCryptAlg, "rc2-64");
+ m_strreplace(&SmimeCryptAlg, "rc2-64");
break;
case 3:
- str_replace (&SmimeCryptAlg, "rc2-128");
+ m_strreplace(&SmimeCryptAlg, "rc2-128");
break;
}
break;
switch (choice = mutt_multi_choice (_("1: AES128, 2: AES192, 3: AES256 "),
_("895"))) {
case 1:
- str_replace (&SmimeCryptAlg, "aes128");
+ m_strreplace(&SmimeCryptAlg, "aes128");
break;
case 2:
- str_replace (&SmimeCryptAlg, "aes192");
+ m_strreplace(&SmimeCryptAlg, "aes192");
break;
case 3:
- str_replace (&SmimeCryptAlg, "aes256");
+ m_strreplace(&SmimeCryptAlg, "aes256");
break;
}
break;
case 4: /* sign (a)s */
if ((p = smime_ask_for_key (_("Sign as: "), NULL, 0))) {
- str_replace (&SmimeDefaultKey, p);
+ m_strreplace(&SmimeDefaultKey, p);
msg->security |= SIGN;