mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-03 22:56:33 +02:00
Preparing 2.0.7
This commit is contained in:
parent
7f033b2a88
commit
782e1bc00b
35 changed files with 172 additions and 132 deletions
|
@ -1,5 +1,5 @@
|
|||
/* gpgparsemail.c - Standalone crypto mail parser
|
||||
* Copyright (C) 2004 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2004, 2007 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
|
@ -64,7 +64,9 @@ struct parse_info_s {
|
|||
|
||||
int is_pkcs7; /* Old style S/MIME message. */
|
||||
|
||||
int gpgsm_mime; /* gpgsm shall be used from S/MIME. */
|
||||
int moss_state; /* State of PGP/MIME or S/MIME parsing. */
|
||||
int is_smime; /* This is S/MIME and not PGP/MIME. */
|
||||
|
||||
char *signing_protocol;
|
||||
int hashing_level; /* The nesting level we are hashing. */
|
||||
int hashing;
|
||||
|
@ -167,7 +169,6 @@ run_gnupg (int smime, int sig_fd, int data_fd, int *close_list)
|
|||
int i, c, is_status;
|
||||
unsigned int pos;
|
||||
char status_buf[10];
|
||||
const char *cmd = smime? "gpgsm":"gpg";
|
||||
FILE *fp;
|
||||
|
||||
if (pipe (rp) == -1)
|
||||
|
@ -218,15 +219,25 @@ run_gnupg (int smime, int sig_fd, int data_fd, int *close_list)
|
|||
close (fd);
|
||||
errno = 0;
|
||||
|
||||
execlp (cmd, cmd,
|
||||
"--enable-special-filenames",
|
||||
"--status-fd", "2",
|
||||
"--assume-base64",
|
||||
"--verify",
|
||||
"--",
|
||||
"-", data_fd == -1? NULL : data_fd_buf,
|
||||
NULL);
|
||||
|
||||
if (smime)
|
||||
execlp ("gpgsm", "gpgsm",
|
||||
"--enable-special-filenames",
|
||||
"--status-fd", "2",
|
||||
"--assume-base64",
|
||||
"--verify",
|
||||
"--",
|
||||
"-", data_fd == -1? NULL : data_fd_buf,
|
||||
NULL);
|
||||
else
|
||||
execlp ("gpg", "gpg",
|
||||
"--enable-special-filenames",
|
||||
"--status-fd", "2",
|
||||
"--verify",
|
||||
"--debug=512",
|
||||
"--",
|
||||
"-", data_fd == -1? NULL : data_fd_buf,
|
||||
NULL);
|
||||
|
||||
die ("failed to exec the crypto command: %s", strerror (errno));
|
||||
}
|
||||
|
||||
|
@ -323,7 +334,7 @@ verify_signature (struct parse_info_s *info)
|
|||
/* rewind (info->sig_file); */
|
||||
|
||||
close_list[0] = -1;
|
||||
run_gnupg (1, fileno (info->sig_file),
|
||||
run_gnupg (info->is_smime, fileno (info->sig_file),
|
||||
info->hash_file ? fileno (info->hash_file) : -1, close_list);
|
||||
}
|
||||
|
||||
|
@ -342,14 +353,27 @@ mime_signed_begin (struct parse_info_s *info, rfc822parse_t msg,
|
|||
if (s)
|
||||
{
|
||||
printf ("h signed.protocol: %s\n", s);
|
||||
if (!strcmp (s, "application/pkcs7-signature")
|
||||
|| !strcmp (s, "application/x-pkcs7-signature"))
|
||||
if (!strcmp (s, "application/pgp-signature"))
|
||||
{
|
||||
if (info->gpgsm_mime)
|
||||
err ("note: ignoring nested pkcs7-signature");
|
||||
if (info->moss_state)
|
||||
err ("note: ignoring nested PGP/MIME or S/MIME signature");
|
||||
else
|
||||
{
|
||||
info->gpgsm_mime = 1;
|
||||
info->moss_state = 1;
|
||||
info->is_smime = 0;
|
||||
free (info->signing_protocol);
|
||||
info->signing_protocol = xstrdup (s);
|
||||
}
|
||||
}
|
||||
else if (!strcmp (s, "application/pkcs7-signature")
|
||||
|| !strcmp (s, "application/x-pkcs7-signature"))
|
||||
{
|
||||
if (info->moss_state)
|
||||
err ("note: ignoring nested PGP/MIME or S/MIME signature");
|
||||
else
|
||||
{
|
||||
info->moss_state = 1;
|
||||
info->is_smime = 1;
|
||||
free (info->signing_protocol);
|
||||
info->signing_protocol = xstrdup (s);
|
||||
}
|
||||
|
@ -435,6 +459,30 @@ message_cb (void *opaque, rfc822parse_event_t event, rfc822parse_t msg)
|
|||
|
||||
if (debug)
|
||||
show_event (event);
|
||||
|
||||
if (event == RFC822PARSE_BEGIN_HEADER || event == RFC822PARSE_T2BODY)
|
||||
{
|
||||
/* We need to check here whether to start collecting signed data
|
||||
because attachments might come without header lines and thus
|
||||
we won't see the BEGIN_HEADER event. */
|
||||
if (info->moss_state == 1)
|
||||
{
|
||||
printf ("c begin_hash\n");
|
||||
info->hashing = 1;
|
||||
info->hashing_level = info->nesting_level;
|
||||
info->moss_state++;
|
||||
|
||||
if (opt_crypto)
|
||||
{
|
||||
assert (!info->hash_file);
|
||||
info->hash_file = tmpfile ();
|
||||
if (!info->hash_file)
|
||||
die ("failed to create temporary file: %s", strerror (errno));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (event == RFC822PARSE_OPEN)
|
||||
{
|
||||
/* Initialize for a new message. */
|
||||
|
@ -453,18 +501,19 @@ message_cb (void *opaque, rfc822parse_event_t event, rfc822parse_t msg)
|
|||
{
|
||||
printf ("h media: %*s%s %s\n",
|
||||
info->nesting_level*2, "", s1, s2);
|
||||
if (info->gpgsm_mime == 3)
|
||||
if (info->moss_state == 3)
|
||||
{
|
||||
char *buf = xmalloc (strlen (s1) + strlen (s2) + 2);
|
||||
strcpy (stpcpy (stpcpy (buf, s1), "/"), s2);
|
||||
assert (info->signing_protocol);
|
||||
if (strcmp (buf, info->signing_protocol))
|
||||
err ("invalid S/MIME structure; expected `%s', found `%s'",
|
||||
err ("invalid %s structure; expected `%s', found `%s'",
|
||||
info->is_smime? "S/MIME":"PGP/MIME",
|
||||
info->signing_protocol, buf);
|
||||
else
|
||||
{
|
||||
printf ("c begin_signature\n");
|
||||
info->gpgsm_mime++;
|
||||
info->moss_state++;
|
||||
if (opt_crypto)
|
||||
{
|
||||
assert (!info->sig_file);
|
||||
|
@ -490,12 +539,14 @@ message_cb (void *opaque, rfc822parse_event_t event, rfc822parse_t msg)
|
|||
}
|
||||
else
|
||||
printf ("h media: %*s none\n", info->nesting_level*2, "");
|
||||
|
||||
|
||||
rfc822parse_release_field (ctx);
|
||||
}
|
||||
else
|
||||
printf ("h media: %*stext plain [assumed]\n",
|
||||
info->nesting_level*2, "");
|
||||
|
||||
|
||||
info->show_header = 0;
|
||||
info->show_data = 1;
|
||||
info->skip_show = 1;
|
||||
|
@ -528,36 +579,18 @@ message_cb (void *opaque, rfc822parse_event_t event, rfc822parse_t msg)
|
|||
else
|
||||
printf ("b last\n");
|
||||
|
||||
if (info->gpgsm_mime == 2 && info->nesting_level == info->hashing_level)
|
||||
if (info->moss_state == 2 && info->nesting_level == info->hashing_level)
|
||||
{
|
||||
printf ("c end_hash\n");
|
||||
info->gpgsm_mime++;
|
||||
info->moss_state++;
|
||||
info->hashing = 0;
|
||||
}
|
||||
else if (info->gpgsm_mime == 4)
|
||||
else if (info->moss_state == 4)
|
||||
{
|
||||
printf ("c end_signature\n");
|
||||
info->verify_now = 1;
|
||||
}
|
||||
}
|
||||
else if (event == RFC822PARSE_BEGIN_HEADER)
|
||||
{
|
||||
if (info->gpgsm_mime == 1)
|
||||
{
|
||||
printf ("c begin_hash\n");
|
||||
info->hashing = 1;
|
||||
info->hashing_level = info->nesting_level;
|
||||
info->gpgsm_mime++;
|
||||
|
||||
if (opt_crypto)
|
||||
{
|
||||
assert (!info->hash_file);
|
||||
info->hash_file = tmpfile ();
|
||||
if (!info->hash_file)
|
||||
die ("failed to create temporary file: %s", strerror (errno));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -634,7 +667,8 @@ parse_message (FILE *fp)
|
|||
info.hash_file = NULL;
|
||||
fclose (info.sig_file);
|
||||
info.sig_file = NULL;
|
||||
info.gpgsm_mime = 0;
|
||||
info.moss_state = 0;
|
||||
info.is_smime = 0;
|
||||
info.is_pkcs7 = 0;
|
||||
}
|
||||
else
|
||||
|
@ -760,6 +794,6 @@ main (int argc, char **argv)
|
|||
|
||||
/*
|
||||
Local Variables:
|
||||
compile-command: "gcc -Wall -g -o gpgparsemail rfc822parse.c gpgparsemail.c"
|
||||
compile-command: "gcc -Wall -Wno-pointer-sign -g -o gpgparsemail rfc822parse.c gpgparsemail.c"
|
||||
End:
|
||||
*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue