Changed to GPLv3.
[gnupg.git] / g10 / mainproc.c
index 2a5db6e..1d5c03f 100644 (file)
@@ -1,12 +1,12 @@
 /* mainproc.c - handle packets
- * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
- *               2005, 2006 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ *               2007 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
  * GnuPG is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * GnuPG is distributed in the hope that it will be useful,
@@ -15,9 +15,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
@@ -98,10 +96,15 @@ struct mainproc_context
 
 
 static int do_proc_packets( CTX c, IOBUF a );
-
 static void list_node( CTX c, KBNODE node );
 static void proc_tree( CTX c, KBNODE node );
+static int literals_seen;
 
+void
+reset_literals_seen(void)
+{
+  literals_seen=0;
+}
 
 static void
 release_list( CTX c )
@@ -273,7 +276,7 @@ proc_symkey_enc( CTX c, PACKET *pkt )
         int algo = enc->cipher_algo;
        const char *s = gcry_cipher_algo_name (algo);
 
-       if(s)
+       if (!gcry_cipher_test_algo (algo))
          {
            if(!opt.quiet)
              {
@@ -596,6 +599,8 @@ proc_plaintext( CTX c, PACKET *pkt )
     int any, clearsig, only_md5, rc;
     KBNODE n;
 
+    literals_seen++;
+
     if( pt->namelen == 8 && !memcmp( pt->name, "_CONSOLE", 8 ) )
        log_info(_("NOTE: sender requested \"for-your-eyes-only\"\n"));
     else if( opt.verbose )
@@ -683,12 +688,29 @@ proc_plaintext( CTX c, PACKET *pkt )
            gcry_md_start_debug ( c->mfx.md2, "verify2" );
     }
 
-    rc = handle_plaintext( pt, &c->mfx, c->sigs_only, clearsig );
-    if ( gpg_err_code (rc) == GPG_ERR_EACCES && !c->sigs_only ) 
+    rc=0;
+
+    if (literals_seen>1)
+      {
+       log_info (_("WARNING: multiple plaintexts seen\n"));
+
+       if (!opt.flags.allow_multiple_messages)
+         {
+            write_status_text (STATUS_ERROR, "proc_pkt.plaintext 89_BAD_DATA");
+           log_inc_errorcount ();
+           rc = gpg_error (GPG_ERR_UNEXPECTED); 
+         }
+      }
+    
+    if(!rc)
       {
-        /* Can't write output but we hash it anyway to check the
-           signature. */
-        rc = handle_plaintext( pt, &c->mfx, 1, clearsig );
+        rc = handle_plaintext( pt, &c->mfx, c->sigs_only, clearsig );
+        if ( gpg_err_code (rc) == GPG_ERR_EACCES && !c->sigs_only ) 
+          {
+            /* Can't write output but we hash it anyway to check the
+               signature. */
+            rc = handle_plaintext( pt, &c->mfx, 1, clearsig );
+          }
       }
 
     if( rc )
@@ -1512,8 +1534,17 @@ check_sig_and_print( CTX c, KBNODE node )
           n_sig++;
         if (!n_sig)
           goto ambiguous;
-        if (n && !opt.allow_multisig_verification)
-          goto ambiguous;
+
+       /* If we wanted to disallow multiple sig verification, we'd do
+          something like this:
+
+          if (n && !opt.allow_multisig_verification)
+             goto ambiguous;
+
+          However, now that we have --allow-multiple-messages, this
+          can stay allowable as we can't get here unless multiple
+          messages (i.e. multiple literals) are allowed. */
+
         if (n_onepass != n_sig)
           {
             log_info ("number of one-pass packets does not match "
@@ -1768,7 +1799,8 @@ check_sig_and_print( CTX c, KBNODE node )
 
         /* If we have a good signature and already printed 
          * the primary user ID, print all the other user IDs */
-        if ( count && !rc ) {
+        if ( count && !rc
+             && !(opt.verify_options&VERIFY_SHOW_PRIMARY_UID_ONLY)) {
            char *p;
             for( un=keyblock; un; un = un->next ) {
                 if( un->pkt->pkttype != PKT_USER_ID )