]> git.llucax.com Git - software/mutt-debian.git/blobdiff - pgpkey.c
Merge branch '1.5.20-1+fix533459'
[software/mutt-debian.git] / pgpkey.c
index 90e7c6e5c6741fadb7885cb407162e7993bd2011..d837013c0620ab7e7822eb6bd3b3caeeec1c74fb 100644 (file)
--- a/pgpkey.c
+++ b/pgpkey.c
@@ -1,6 +1,6 @@
 /*
 /*
- * Copyright (C) 1996,1997 Michael R. Elkins <me@mutt.org>
- * Copyright (c) 1998,1999 Thomas Roessler <roessler@does-not-exist.org>
+ * Copyright (C) 1996-7,2007 Michael R. Elkins <me@mutt.org>
+ * Copyright (c) 1998-2003 Thomas Roessler <roessler@does-not-exist.org>
  * 
  *     This program is free software; you can redistribute it
  *     and/or modify it under the terms of the GNU General Public
  * 
  *     This program is free software; you can redistribute it
  *     and/or modify it under the terms of the GNU General Public
@@ -147,7 +147,7 @@ static const char *pgp_entry_fmt (char *dest,
 
   kflags = key->flags | (pkey->flags & KEYFLAG_RESTRICTIONS)
     | uid->flags;
 
   kflags = key->flags | (pkey->flags & KEYFLAG_RESTRICTIONS)
     | uid->flags;
-  
+
   switch (ascii_tolower (op))
   {
     case '[':
   switch (ascii_tolower (op))
   {
     case '[':
@@ -283,12 +283,12 @@ static const char *pgp_entry_fmt (char *dest,
     mutt_FormatString (dest, destlen, col, elsestring, mutt_attach_fmt, data, 0);
   return (src);
 }
     mutt_FormatString (dest, destlen, col, elsestring, mutt_attach_fmt, data, 0);
   return (src);
 }
-      
+
 static void pgp_entry (char *s, size_t l, MUTTMENU * menu, int num)
 {
   pgp_uid_t **KeyTable = (pgp_uid_t **) menu->data;
   pgp_entry_t entry;
 static void pgp_entry (char *s, size_t l, MUTTMENU * menu, int num)
 {
   pgp_uid_t **KeyTable = (pgp_uid_t **) menu->data;
   pgp_entry_t entry;
-  
+
   entry.uid = KeyTable[num];
   entry.num = num + 1;
 
   entry.uid = KeyTable[num];
   entry.num = num + 1;
 
@@ -390,7 +390,7 @@ static int pgp_key_is_valid (pgp_key_t k)
     return 0;
   if (pk->flags & KEYFLAG_CANTUSE)
     return 0;
     return 0;
   if (pk->flags & KEYFLAG_CANTUSE)
     return 0;
-  
+
   return 1;
 }
 
   return 1;
 }
 
@@ -422,21 +422,21 @@ static int pgp_id_is_valid (pgp_uid_t *uid)
 static int pgp_id_matches_addr (ADDRESS *addr, ADDRESS *u_addr, pgp_uid_t *uid)
 {
   int rv = 0;
 static int pgp_id_matches_addr (ADDRESS *addr, ADDRESS *u_addr, pgp_uid_t *uid)
 {
   int rv = 0;
-  
+
   if (pgp_id_is_valid (uid))
     rv |= PGP_KV_VALID;
 
   if (pgp_id_is_strong (uid))
     rv |= PGP_KV_STRONGID;
   if (pgp_id_is_valid (uid))
     rv |= PGP_KV_VALID;
 
   if (pgp_id_is_strong (uid))
     rv |= PGP_KV_STRONGID;
-  
+
   if (addr->mailbox && u_addr->mailbox
       && mutt_strcasecmp (addr->mailbox, u_addr->mailbox) == 0)
     rv |= PGP_KV_ADDR;
   if (addr->mailbox && u_addr->mailbox
       && mutt_strcasecmp (addr->mailbox, u_addr->mailbox) == 0)
     rv |= PGP_KV_ADDR;
-    
+
   if (addr->personal && u_addr->personal
       && mutt_strcasecmp (addr->personal, u_addr->personal) == 0)
     rv |= PGP_KV_STRING;
   if (addr->personal && u_addr->personal
       && mutt_strcasecmp (addr->personal, u_addr->personal) == 0)
     rv |= PGP_KV_STRING;
-  
+
   return rv;
 }
 
   return rv;
 }
 
@@ -475,13 +475,13 @@ static pgp_key_t pgp_select_key (pgp_key_t keys,
        unusable = 1;
        continue;
       }
        unusable = 1;
        continue;
       }
-      
+
       if (i == keymax)
       {
        keymax += 5;
        safe_realloc (&KeyTable, sizeof (pgp_uid_t *) * keymax);
       }
       if (i == keymax)
       {
        keymax += 5;
        safe_realloc (&KeyTable, sizeof (pgp_uid_t *) * keymax);
       }
-      
+
       KeyTable[i++] = a;
     }
   }
       KeyTable[i++] = a;
     }
   }
@@ -522,10 +522,9 @@ static pgp_key_t pgp_select_key (pgp_key_t keys,
   mutt_make_help (buf, sizeof (buf), _("Help"), MENU_PGP, OP_HELP);
   strcat (helpstr, buf);       /* __STRCAT_CHECKED__ */
 
   mutt_make_help (buf, sizeof (buf), _("Help"), MENU_PGP, OP_HELP);
   strcat (helpstr, buf);       /* __STRCAT_CHECKED__ */
 
-  menu = mutt_new_menu ();
+  menu = mutt_new_menu (MENU_PGP);
   menu->max = i;
   menu->make_entry = pgp_entry;
   menu->max = i;
   menu->make_entry = pgp_entry;
-  menu->menu = MENU_PGP;
   menu->help = helpstr;
   menu->data = KeyTable;
 
   menu->help = helpstr;
   menu->data = KeyTable;
 
@@ -533,14 +532,14 @@ static pgp_key_t pgp_select_key (pgp_key_t keys,
     snprintf (buf, sizeof (buf), _("PGP keys matching <%s>."), p->mailbox);
   else
     snprintf (buf, sizeof (buf), _("PGP keys matching \"%s\"."), s);
     snprintf (buf, sizeof (buf), _("PGP keys matching <%s>."), p->mailbox);
   else
     snprintf (buf, sizeof (buf), _("PGP keys matching \"%s\"."), s);
-    
-  
+
+
   menu->title = buf;
 
   kp = NULL;
 
   mutt_clear_error ();
   menu->title = buf;
 
   kp = NULL;
 
   mutt_clear_error ();
-  
+
   while (!done)
   {
     switch (mutt_menuLoop (menu))
   while (!done)
   {
     switch (mutt_menuLoop (menu))
@@ -556,7 +555,7 @@ static pgp_key_t pgp_select_key (pgp_key_t keys,
       }
       if ((fp = safe_fopen (tempfile, "w")) == NULL)
       {
       }
       if ((fp = safe_fopen (tempfile, "w")) == NULL)
       {
-       fclose (devnull);
+       safe_fclose (&devnull);
        mutt_perror _("Can't create temporary file");
        break;
       }
        mutt_perror _("Can't create temporary file");
        break;
       }
@@ -570,13 +569,13 @@ static pgp_key_t pgp_select_key (pgp_key_t keys,
       {
        mutt_perror _("Can't create filter");
        unlink (tempfile);
       {
        mutt_perror _("Can't create filter");
        unlink (tempfile);
-       fclose (fp);
-       fclose (devnull);
+       safe_fclose (&fp);
+       safe_fclose (&devnull);
       }
 
       mutt_wait_filter (thepid);
       }
 
       mutt_wait_filter (thepid);
-      fclose (fp);
-      fclose (devnull);
+      safe_fclose (&fp);
+      safe_fclose (&devnull);
       mutt_clear_error ();
       snprintf (cmd, sizeof (cmd), _("Key ID: 0x%s"), 
                pgp_keyid (pgp_principal_key (KeyTable[menu->current]->parent)));
       mutt_clear_error ();
       snprintf (cmd, sizeof (cmd), _("Key ID: 0x%s"), 
                pgp_keyid (pgp_principal_key (KeyTable[menu->current]->parent)));
@@ -594,14 +593,14 @@ static pgp_key_t pgp_select_key (pgp_key_t keys,
 
 
       /* XXX make error reporting more verbose */
 
 
       /* XXX make error reporting more verbose */
-      
+
       if (option (OPTPGPCHECKTRUST))
        if (!pgp_key_is_valid (KeyTable[menu->current]->parent))
        {
          mutt_error _("This key can't be used: expired/disabled/revoked.");
          break;
        }
       if (option (OPTPGPCHECKTRUST))
        if (!pgp_key_is_valid (KeyTable[menu->current]->parent))
        {
          mutt_error _("This key can't be used: expired/disabled/revoked.");
          break;
        }
-      
+
       if (option (OPTPGPCHECKTRUST) &&
          (!pgp_id_is_valid (KeyTable[menu->current])
           || !pgp_id_is_strong (KeyTable[menu->current])))
       if (option (OPTPGPCHECKTRUST) &&
          (!pgp_id_is_valid (KeyTable[menu->current])
           || !pgp_id_is_strong (KeyTable[menu->current])))
@@ -654,7 +653,7 @@ static pgp_key_t pgp_select_key (pgp_key_t keys,
   FREE (&KeyTable);
 
   set_option (OPTNEEDREDRAW);
   FREE (&KeyTable);
 
   set_option (OPTNEEDREDRAW);
-  
+
   return (kp);
 }
 
   return (kp);
 }
 
@@ -666,7 +665,7 @@ pgp_key_t pgp_ask_for_key (char *tag, char *whatfor,
   struct pgp_cache *l = NULL;
 
   mutt_clear_error ();
   struct pgp_cache *l = NULL;
 
   mutt_clear_error ();
-  
+
   resp[0] = 0;
   if (whatfor)
   {
   resp[0] = 0;
   if (whatfor)
   {
@@ -728,7 +727,7 @@ BODY *pgp_make_key_attachment (char *tempf)
 
   snprintf (tmp, sizeof (tmp), "0x%s", pgp_keyid (pgp_principal_key (key)));
   pgp_free_key (&key);
 
   snprintf (tmp, sizeof (tmp), "0x%s", pgp_keyid (pgp_principal_key (key)));
   pgp_free_key (&key);
-  
+
   if (!tempf)
   {
     mutt_mktemp (tempfb);
   if (!tempf)
   {
     mutt_mktemp (tempfb);
@@ -744,7 +743,7 @@ BODY *pgp_make_key_attachment (char *tempf)
   if ((devnull = fopen ("/dev/null", "w")) == NULL)    /* __FOPEN_CHECKED__ */
   {
     mutt_perror _("Can't open /dev/null");
   if ((devnull = fopen ("/dev/null", "w")) == NULL)    /* __FOPEN_CHECKED__ */
   {
     mutt_perror _("Can't open /dev/null");
-    fclose (tempfp);
+    safe_fclose (&tempfp);
     if (tempf == tempfb)
       unlink (tempf);
     return NULL;
     if (tempf == tempfb)
       unlink (tempf);
     return NULL;
@@ -752,22 +751,22 @@ BODY *pgp_make_key_attachment (char *tempf)
 
   mutt_message _("Invoking PGP...");
 
 
   mutt_message _("Invoking PGP...");
 
-  
+
   if ((thepid = 
        pgp_invoke_export (NULL, NULL, NULL, -1,
                           fileno (tempfp), fileno (devnull), tmp)) == -1)
   {
     mutt_perror _("Can't create filter");
     unlink (tempf);
   if ((thepid = 
        pgp_invoke_export (NULL, NULL, NULL, -1,
                           fileno (tempfp), fileno (devnull), tmp)) == -1)
   {
     mutt_perror _("Can't create filter");
     unlink (tempf);
-    fclose (tempfp);
-    fclose (devnull);
+    safe_fclose (&tempfp);
+    safe_fclose (&devnull);
     return NULL;
   }
 
   mutt_wait_filter (thepid);
 
     return NULL;
   }
 
   mutt_wait_filter (thepid);
 
-  fclose (tempfp);
-  fclose (devnull);
+  safe_fclose (&tempfp);
+  safe_fclose (&devnull);
 
   att = mutt_new_body ();
   att->filename = safe_strdup (tempf);
 
   att = mutt_new_body ();
   att->filename = safe_strdup (tempf);
@@ -818,12 +817,7 @@ pgp_key_t pgp_getkeybyaddr (ADDRESS * a, short abilities, pgp_ring_t keyring)
   ADDRESS *r, *p;
   LIST *hints = NULL;
 
   ADDRESS *r, *p;
   LIST *hints = NULL;
 
-  int weak    = 0;
-  int invalid = 0;
   int multi   = 0;
   int multi   = 0;
-  int this_key_has_strong;
-  int this_key_has_weak;
-  int this_key_has_invalid;
   int match;
 
   pgp_key_t keys, k, kn;
   int match;
 
   pgp_key_t keys, k, kn;
@@ -831,7 +825,7 @@ pgp_key_t pgp_getkeybyaddr (ADDRESS * a, short abilities, pgp_ring_t keyring)
   pgp_key_t matches = NULL;
   pgp_key_t *last = &matches;
   pgp_uid_t *q;
   pgp_key_t matches = NULL;
   pgp_key_t *last = &matches;
   pgp_uid_t *q;
-  
+
   if (a && a->mailbox)
     hints = pgp_add_string_to_hints (hints, a->mailbox);
   if (a && a->personal)
   if (a && a->mailbox)
     hints = pgp_add_string_to_hints (hints, a->mailbox);
   if (a && a->personal)
@@ -841,10 +835,10 @@ pgp_key_t pgp_getkeybyaddr (ADDRESS * a, short abilities, pgp_ring_t keyring)
   keys = pgp_get_candidates (keyring, hints);
 
   mutt_free_list (&hints);
   keys = pgp_get_candidates (keyring, hints);
 
   mutt_free_list (&hints);
-  
+
   if (!keys)
     return NULL;
   if (!keys)
     return NULL;
-  
+
   dprint (5, (debugfile, "pgp_getkeybyaddr: looking for %s <%s>.",
              a->personal, a->mailbox));
 
   dprint (5, (debugfile, "pgp_getkeybyaddr: looking for %s <%s>.",
              a->personal, a->mailbox));
 
@@ -863,9 +857,6 @@ pgp_key_t pgp_getkeybyaddr (ADDRESS * a, short abilities, pgp_ring_t keyring)
       continue;
     }
 
       continue;
     }
 
-    this_key_has_weak    = 0;  /* weak but valid match   */
-    this_key_has_invalid = 0;   /* invalid match          */
-    this_key_has_strong  = 0;  /* strong and valid match */
     match                = 0;   /* any match             */
 
     for (q = k->address; q; q = q->next)
     match                = 0;   /* any match             */
 
     for (q = k->address; q; q = q->next)
@@ -886,23 +877,12 @@ pgp_key_t pgp_getkeybyaddr (ADDRESS * a, short abilities, pgp_ring_t keyring)
          if (the_valid_key && the_valid_key != k)
            multi             = 1;
          the_valid_key       = k;
          if (the_valid_key && the_valid_key != k)
            multi             = 1;
          the_valid_key       = k;
-         this_key_has_strong = 1;
        }
        }
-       else if ((validity & PGP_KV_MATCH) && !(validity & PGP_KV_VALID))
-         this_key_has_invalid = 1;
-       else if ((validity & PGP_KV_MATCH) 
-                && (!(validity & PGP_KV_STRONGID) || !(validity & PGP_KV_ADDR)))
-         this_key_has_weak    = 1;
       }
 
       rfc822_free_address (&r);
     }
 
       }
 
       rfc822_free_address (&r);
     }
 
-    if (match && !this_key_has_strong && this_key_has_invalid)
-      invalid = 1;
-    if (match && !this_key_has_strong && this_key_has_weak)
-      weak = 1;
-    
     if (match)
     {
       *last  = pgp_principal_key (k);
     if (match)
     {
       *last  = pgp_principal_key (k);
@@ -912,11 +892,10 @@ pgp_key_t pgp_getkeybyaddr (ADDRESS * a, short abilities, pgp_ring_t keyring)
   }
 
   pgp_free_key (&keys);
   }
 
   pgp_free_key (&keys);
-  
+
   if (matches)
   {
   if (matches)
   {
-    if (the_valid_key && !multi /* && !weak 
-       && !(invalid && option (OPTPGPSHOWUNUSABLE)) */)
+    if (the_valid_key && !multi)
     {
       /*
        * There was precisely one strong match on a valid ID.
     {
       /*
        * There was precisely one strong match on a valid ID.
@@ -952,17 +931,20 @@ pgp_key_t pgp_getkeybystr (char *p, short abilities, pgp_ring_t keyring)
   pgp_key_t k, kn;
   pgp_uid_t *a;
   short match;
   pgp_key_t k, kn;
   pgp_uid_t *a;
   short match;
+  size_t l;
+
+  if ((l = mutt_strlen (p)) && p[l-1] == '!')
+    p[l-1] = 0;
 
   mutt_message (_("Looking for keys matching \"%s\"..."), p);
 
   mutt_message (_("Looking for keys matching \"%s\"..."), p);
-  
+
   hints = pgp_add_string_to_hints (hints, p);
   keys = pgp_get_candidates (keyring, hints);
   mutt_free_list (&hints);
 
   if (!keys)
   hints = pgp_add_string_to_hints (hints, p);
   keys = pgp_get_candidates (keyring, hints);
   mutt_free_list (&hints);
 
   if (!keys)
-    return NULL;
-  
-  
+    goto out;
+
   for (k = keys; k; k = kn)
   {
     kn = k->next;
   for (k = keys; k; k = kn)
   {
     kn = k->next;
@@ -970,7 +952,7 @@ pgp_key_t pgp_getkeybystr (char *p, short abilities, pgp_ring_t keyring)
       continue;
 
     match = 0;
       continue;
 
     match = 0;
-    
+
     for (a = k->address; a; a = a->next)
     {
       dprint (5, (debugfile, "pgp_getkeybystr: matching \"%s\" against key %s, \"%s\": ",
     for (a = k->address; a; a = a->next)
     {
       dprint (5, (debugfile, "pgp_getkeybystr: matching \"%s\" against key %s, \"%s\": ",
@@ -986,7 +968,7 @@ pgp_key_t pgp_getkeybystr (char *p, short abilities, pgp_ring_t keyring)
        break;
       }
     }
        break;
       }
     }
-    
+
     if (match)
     {
       *last = pgp_principal_key (k);
     if (match)
     {
       *last = pgp_principal_key (k);
@@ -1001,14 +983,17 @@ pgp_key_t pgp_getkeybystr (char *p, short abilities, pgp_ring_t keyring)
   {
     if ((k = pgp_select_key (matches, NULL, p)))
       pgp_remove_key (&matches, k);
   {
     if ((k = pgp_select_key (matches, NULL, p)))
       pgp_remove_key (&matches, k);
-    
+
     pgp_free_key (&matches);
     pgp_free_key (&matches);
+    if (!p[l-1])
+      p[l-1] = '!';
     return k;
   }
 
     return k;
   }
 
+out:
+  if (!p[l-1])
+    p[l-1] = '!';
   return NULL;
 }
 
   return NULL;
 }
 
-
-
 #endif /* CRYPT_BACKEND_CLASSIC_PGP */
 #endif /* CRYPT_BACKEND_CLASSIC_PGP */