Updated estream.
[gnupg.git] / agent / protect-tool.c
index d3bcc00..b12b380 100644 (file)
@@ -5,7 +5,7 @@
  *
  * 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,
@@ -14,9 +14,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>
@@ -160,6 +158,8 @@ my_strusage (int level)
 }
 
 
+/* Include the implementation of map_spwq_error.  */
+MAP_SPWQ_ERROR_IMPL
 
 /*  static void */
 /*  print_mpi (const char *text, gcry_mpi_t a) */
@@ -638,7 +638,7 @@ import_p12_file (const char *fname)
 {
   char *buf;
   unsigned char *result;
-  size_t buflen, resultlen;
+  size_t buflen, resultlen, buf_off;
   int i;
   int rc;
   gcry_mpi_t *kparms;
@@ -654,7 +654,22 @@ import_p12_file (const char *fname)
   if (!buf)
     return;
 
-  kparms = p12_parse ((unsigned char*)buf, buflen, (pw=get_passphrase (2, 0)),
+  /* GnuPG 2.0.4 accidently created binary P12 files with the string
+     "The passphrase is %s encoded.\n\n" prepended to the ASN.1 data.
+     We fix that here.  */
+  if (buflen > 29 && !memcmp (buf, "The passphrase is ", 18))
+    {
+      for (buf_off=18; buf_off < buflen && buf[buf_off] != '\n'; buf_off++)
+        ;
+      buf_off++;
+      if (buf_off < buflen && buf[buf_off] == '\n')
+        buf_off++;
+    }
+  else
+    buf_off = 0;
+
+  kparms = p12_parse ((unsigned char*)buf+buf_off, buflen-buf_off,
+                      (pw=get_passphrase (2, 0)),
                       import_p12_cert_cb, NULL);
   release_passphrase (pw);
   xfree (buf);
@@ -1033,8 +1048,8 @@ main (int argc, char **argv )
   gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
   log_set_prefix ("gpg-protect-tool", 1); 
 
-  /* Try to auto set the character set.  */
-  set_native_charset (NULL); 
+  /* Make sure that our subsystems are ready.  */
+  init_common_subsystems ();
 
   i18n_init ();
 
@@ -1092,6 +1107,13 @@ main (int argc, char **argv )
   else if (argc > 1)
     usage (1);
 
+  /* Tell simple-pwquery about the the standard socket name.  */
+  {
+    char *tmp = make_filename (opt_homedir, "S.gpg-agent", NULL);
+    simple_pw_set_socket (tmp);
+    xfree (tmp);
+  }
+
   if (opt_prompt)
     opt_prompt = percent_plus_unescape_string (xstrdup (opt_prompt));
 
@@ -1194,6 +1216,7 @@ get_passphrase (int promptno, int opt_check)
   pw = simple_pwquery (NULL,
                        error_msgno == 1? _("does not match - try again"):NULL,
                        _("Passphrase:"), desc, opt_check, &err);
+  err = map_spwq_error (err);
 
 #ifdef ENABLE_NLS
   if (orig_codeset)