[Winpt-commits] r133 - in trunk: . Gnupg Include Po Src icons

scm-commit at wald.intevation.org scm-commit at wald.intevation.org
Mon Jan 9 10:15:39 CET 2006


Author: twoaday
Date: 2006-01-09 10:15:29 +0100 (Mon, 09 Jan 2006)
New Revision: 133

Added:
   trunk/Include/wptGPGME.h
   trunk/Src/keypair.ico
   trunk/Src/pubkey.ico
   trunk/Src/wptGPGMEWrapper.cpp
Removed:
   trunk/Ico/
Modified:
   trunk/ChangeLog
   trunk/Gnupg/ChangeLog
   trunk/Gnupg/parse-packet.c
   trunk/Include/ChangeLog
   trunk/Include/Makefile.am
   trunk/Include/wptCommonCtl.h
   trunk/Include/wptErrors.h
   trunk/Include/wptGPG.h
   trunk/Include/wptKeyCache.h
   trunk/Include/wptKeylist.h
   trunk/Include/wptKeyserver.h
   trunk/Makefile.am
   trunk/NEWS
   trunk/Po/de.po
   trunk/Src/ChangeLog
   trunk/Src/Makefile.am
   trunk/Src/WinPT-en.rc
   trunk/Src/WinPT.cpp
   trunk/Src/resource.h
   trunk/Src/wptCardDlg.cpp
   trunk/Src/wptErrors.cpp
   trunk/Src/wptFirstRunDlg.cpp
   trunk/Src/wptGPG.cpp
   trunk/Src/wptGPGMEData.cpp
   trunk/Src/wptGPGUtil.cpp
   trunk/Src/wptKeyCache.cpp
   trunk/Src/wptKeyEditDlgs.cpp
   trunk/Src/wptKeyManager.cpp
   trunk/Src/wptKeyManagerDlg.cpp
   trunk/Src/wptKeyPropsDlg.cpp
   trunk/Src/wptKeylist.cpp
   trunk/Src/wptKeyserver.cpp
   trunk/Src/wptKeyserverDlg.cpp
   trunk/Src/wptListView.cpp
   trunk/Src/wptSigList.cpp
   trunk/THANKS
   trunk/TODO
   trunk/configure.ac
   trunk/icons/key_delete.ico
   trunk/icons/key_export.ico
   trunk/icons/key_import.ico
   trunk/icons/key_props.ico
Log:
A lot of minor bug fixes.
New icons.

For a complete history, see the ChangeLog entries.



Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/ChangeLog	2006-01-09 09:15:29 UTC (rev 133)
@@ -1,3 +1,7 @@
+2006-01-07  Timo Schulz  <ts at g10code.com>
+
+	* Icons: Deleted unused folder.
+	
 2006-01-05  Werner Koch  <wk at g10code.com>
 
 	* configure.ac: Hack to make sure that NLS support is included.

Modified: trunk/Gnupg/ChangeLog
===================================================================
--- trunk/Gnupg/ChangeLog	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Gnupg/ChangeLog	2006-01-09 09:15:29 UTC (rev 133)
@@ -1,3 +1,7 @@
+2006-01-07  Timo Schulz  <ts at g10code.com>
+
+	* parse-packet.c (cp_subpacketarea): Remove unused function.
+
 2005-11-22  Timo Schulz  <ts at g10code.com>
 
 	Store MSVC related files outside the repository.

Modified: trunk/Gnupg/parse-packet.c
===================================================================
--- trunk/Gnupg/parse-packet.c	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Gnupg/parse-packet.c	2006-01-09 09:15:29 UTC (rev 133)
@@ -352,22 +352,9 @@
     else if ( algo == 17 )    return 5;	
     else if ( is_RSA( algo ) )return 6;
     return 0;
-} /* cdk_pk_get_nskey */
+}
 
 
-static subpktarea_t *
-cp_subpktarea (subpktarea_t *s )
-{
-    subpktarea_t *d;
-    
-    if( !s )
-	return NULL;
-    d = malloc (sizeof (*d) + s->size - 1 );
-    d->size = s->size;
-    d->len = s->len;
-    memcpy (d->data, s->data, s->len);
-    return d;
-}
 
 /*
  * Return a copy of the preferences 

Modified: trunk/Include/ChangeLog
===================================================================
--- trunk/Include/ChangeLog	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Include/ChangeLog	2006-01-09 09:15:29 UTC (rev 133)
@@ -1,3 +1,11 @@
+2006-01-07  Timo Schulz  <ts at g10code.com>
+
+	* wptKeyserver.h (hkp_recv_key2): Removed.
+	
+2006-01-04  Timo Schulz  <ts at g10code.com>
+
+	* wptGPGME.h: New.
+	
 2005-12-27  Timo Schulz  <ts at g10code.com>
 
 	* wptCommonCtl.h (listview_del_column): New.

Modified: trunk/Include/Makefile.am
===================================================================
--- trunk/Include/Makefile.am	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Include/Makefile.am	2006-01-09 09:15:29 UTC (rev 133)
@@ -41,5 +41,7 @@
 	wptVersion.h \
 	wptCrypto.h \
         wptUtil.h \
-	wptW32API.h
+	wptW32API.h \
+	wptGPGME.h
+	
 

Modified: trunk/Include/wptCommonCtl.h
===================================================================
--- trunk/Include/wptCommonCtl.h	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Include/wptCommonCtl.h	2006-01-09 09:15:29 UTC (rev 133)
@@ -1,6 +1,6 @@
 /* wptCommonCtl.h - Win32 Imagelist headerfile
  *	Copyright (C) 2003 Andreas Jobs
- *	Copyright (C) 2004, 2005 Timo Schulz
+ *	Copyright (C) 2004, 2005, 2006 Timo Schulz
  *
  * This file is part of WinPT.
  *
@@ -56,6 +56,7 @@
     HWND ctrl;		/* the actual listview window. */
     int cols;		/* number of columns. */
     int items;		/* number of items. */
+    HIMAGELIST hil;	/* Imagelist context. */
 };
 typedef struct listview_ctrl_s * listview_ctrl_t;
 
@@ -87,6 +88,8 @@
 int listview_find (listview_ctrl_t ctx, const char * str);
 void listview_scroll (listview_ctrl_t ctx, int oldpos, int newpos);
 int listview_del_column (listview_ctrl_t ctx, int pos);
+int listview_add_item_image (listview_ctrl_t ctx, const char *text, int image);
+void listview_set_image_list (listview_ctrl_t ctx, HICON *ico, DWORD nicons);
 
 /*-- Image List --*/
 extern HIMAGELIST glob_imagelist;

Modified: trunk/Include/wptErrors.h
===================================================================
--- trunk/Include/wptErrors.h	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Include/wptErrors.h	2006-01-09 09:15:29 UTC (rev 133)
@@ -79,7 +79,8 @@
 void debug_box (const char * msg, const char * file, int line);
 void debug_f (const char * msg, const char * file, int line);
 void log_debug (const char * format, ...);
-int log_box (const char * title, int style, const char * format, ...);
+int printf_box (const char * title, int style, const char * format, ...);
+#define log_box printf_box
 
 /*-- wptW32API.cpp --*/
 int msg_box (HWND hwnd, const char * text, const char * title, int mode);

Modified: trunk/Include/wptGPG.h
===================================================================
--- trunk/Include/wptGPG.h	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Include/wptGPG.h	2006-01-09 09:15:29 UTC (rev 133)
@@ -236,7 +236,9 @@
 void          gpg_set_debug_mode (int val);
 gpgme_error_t gpg_export_seckey (const char *keyid, const char *outfile);
 gpgme_error_t gpg_manage_ownertrust (char **data, int do_export);
-
+gpgme_error_t gpg_get_photoid_data (const char *keyid, char **r_status_data,
+				    unsigned char **r_data, 
+				    unsigned long *ndata);
 char*  generate_revoke_input (int code, const char *cmt, const char *pass);
 gpgme_error_t gpg_revoke_cert (const char *inp_data, 
 			       const char *keyid,

Added: trunk/Include/wptGPGME.h
===================================================================
--- trunk/Include/wptGPGME.h	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Include/wptGPGME.h	2006-01-09 09:15:29 UTC (rev 133)
@@ -0,0 +1,42 @@
+/* wptGPGME.h - Object oriented wrapper for GPGME
+ *	Copyright (C) 2006 Timo Schulz
+ *
+ * This file is part of WinPT.
+ *
+ * WinPT 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 (at your option) any later version.
+ *  
+ * WinPT is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License 
+ * along with WinPT; if not, write to the Free Software Foundation, 
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
+ */
+
+#ifndef WPT_GPGME_H
+#define WPT_GPGME_H
+
+class GPGME {
+private:
+    gpgme_ctx_t ctx;
+    bool	chg_ver;
+
+public:
+    ~GPGME ();
+    GPGME ();
+
+    void setChangeVersion (bool val);
+    bool getArmor (void);
+    void setArmor (bool val);
+
+    gpgme_error_t exportToBuffer (const char *patt, char **outdata);
+    gpgme_error_t exportToFile (const char *patt, const char *outfile);
+    gpgme_error_t exportToClipboard (const char *patt);
+};
+
+#endif /*WPT_GPGME_H*/

Modified: trunk/Include/wptKeyCache.h
===================================================================
--- trunk/Include/wptKeyCache.h	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Include/wptKeyCache.h	2006-01-09 09:15:29 UTC (rev 133)
@@ -31,7 +31,7 @@
 	unsigned int has_desig_rev:1;	/* has desig. revokers. */
     } gloflags;
     struct {
-	unsigned int   used:1;
+	unsigned int   flags;
 	unsigned char *d;	    /* attribute (JPG) data. */
 	unsigned int   len;	    /* attribute data length. */
 	gpgme_validity_t validity;  /* attribute id validity. */

Modified: trunk/Include/wptKeylist.h
===================================================================
--- trunk/Include/wptKeylist.h	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Include/wptKeylist.h	2006-01-09 09:15:29 UTC (rev 133)
@@ -63,6 +63,12 @@
     KM_COL_CREAT    = 7
 };
 
+/* Icon for the key types. */
+enum key_image_t {
+    KEY_IMG_PUB = 0,
+    KEY_IMG_PAIR= 1
+};
+
 /* Signature verification context for a file. */
 struct file_sig_ctx_s {
     char		*file;      /* plaintext file name */

Modified: trunk/Include/wptKeyserver.h
===================================================================
--- trunk/Include/wptKeyserver.h	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Include/wptKeyserver.h	2006-01-09 09:15:29 UTC (rev 133)
@@ -132,8 +132,5 @@
 		  const char *pattern);
 int hkp_recv_key (HWND dlg, const char *kserver, unsigned short port, 
 		  const char *pattern, int proto, int flags);
-int hkp_recv_key2 (HWND dlg, const char *kserver, WORD port,
-		   const char *pattern, int proto, int flags,
-		   char **r_fpr);
 
 #endif /* WPT_KEYSERVER_H */

Modified: trunk/Makefile.am
===================================================================
--- trunk/Makefile.am	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Makefile.am	2006-01-09 09:15:29 UTC (rev 133)
@@ -20,7 +20,7 @@
 
 EXTRA_DIST = autogen.sh README.SVN keyserver.conf
 
-SUBDIRS = Po Gnupg PTD Src Include Ico icons m4
+SUBDIRS = Po Gnupg PTD Src Include icons m4
 
 dist-hook:
 	echo "$(VERSION)" > $(distdir)/VERSION

Modified: trunk/NEWS
===================================================================
--- trunk/NEWS	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/NEWS	2006-01-09 09:15:29 UTC (rev 133)
@@ -698,3 +698,16 @@
   was comitted.
 * A lot of cosmetical changes for the dialogs.
 * Add properly UTF8 handling for the dialogs.
+
+(0.11.5)
+* Fixed a seg fault which occurs when keys in the Key Manager
+  will be deleted without confirmation.
+* Images for the Key Manager key list.
+* LDAP keyserver code works again.
+* Do not allow to modify revoked keys (key edit).
+* Some GUI improvements for the Key Manager.
+* Show key server import status when a single key 
+  was refreshed.
+* The use of the MAPI system to send a public key
+  does not work correctly.
+* New icons for the Key Manager toolbar.

Modified: trunk/Po/de.po
===================================================================
--- trunk/Po/de.po	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Po/de.po	2006-01-09 09:15:29 UTC (rev 133)
@@ -14,7 +14,7 @@
 msgstr ""
 "Project-Id-Version: WinPT 0.11.4\n"
 "Report-Msgid-Bugs-To: winpt at freakmail.de\n"
-"POT-Creation-Date: 2006-01-05 20:24+0100\n"
+"POT-Creation-Date: 2006-01-07 21:24+0100\n"
 "PO-Revision-Date: 2005-12-28 16:10+0100\n"
 "Last-Translator: Timo Schulz <ts at g10code.de>\n"
 "Language-Team: DE <twoaday at freakmail.de>\n"
@@ -30,12 +30,12 @@
 "Konnte Dateisperrung nicht initialisieren.\n"
 "Native Language Support"
 
-#: Src/WinPT.cpp:109 Src/WinPT.cpp:143 Src/WinPT.cpp:173 Src/WinPT.cpp:223
-#: Src/WinPT.cpp:227 Src/WinPT.cpp:337 Src/WinPT.cpp:344 Src/WinPT.cpp:386
-#: Src/WinPT.cpp:414 Src/WinPT.cpp:423 Src/WinPT.cpp:427 Src/WinPT.cpp:444
-#: Src/WinPT.cpp:512 Src/WinPT.cpp:525 Src/WinPT.cpp:574 Src/WinPT.cpp:595
-#: Src/WinPT.cpp:612 Src/wptErrors.cpp:140 Src/wptGPG.cpp:889
-#: Src/wptGPG.cpp:900 Src/wptGPG.cpp:909 Src/wptGPG.cpp:919
+#: Src/WinPT.cpp:109 Src/WinPT.cpp:143 Src/WinPT.cpp:174 Src/WinPT.cpp:224
+#: Src/WinPT.cpp:228 Src/WinPT.cpp:360 Src/WinPT.cpp:367 Src/WinPT.cpp:409
+#: Src/WinPT.cpp:437 Src/WinPT.cpp:446 Src/WinPT.cpp:450 Src/WinPT.cpp:467
+#: Src/WinPT.cpp:537 Src/WinPT.cpp:550 Src/WinPT.cpp:596 Src/WinPT.cpp:617
+#: Src/WinPT.cpp:634 Src/wptErrors.cpp:140 Src/wptGPG.cpp:912
+#: Src/wptGPG.cpp:923 Src/wptGPG.cpp:932 Src/wptGPG.cpp:942
 #: Src/wptMainProc.cpp:343 Src/wptMainProc.cpp:527
 msgid "WinPT Error"
 msgstr "WinPT Fehler"
@@ -44,15 +44,15 @@
 msgid "Could not create GPG home directory"
 msgstr "Konnte GPG-Heimatverzeichnis nicht erstellen"
 
-#: Src/WinPT.cpp:172
+#: Src/WinPT.cpp:173
 msgid "No useable secret key found."
-msgstr "Kein benutzbarer geheimer Schlüssel gefunden"
+msgstr "Kein benutzbarer geheimer Schlüssel gefunden."
 
-#: Src/WinPT.cpp:222
+#: Src/WinPT.cpp:223
 msgid "Could not read GnuPG version."
 msgstr "Konnte GnuPG-Version nicht auslesen."
 
-#: Src/WinPT.cpp:228
+#: Src/WinPT.cpp:229
 #, c-format
 msgid ""
 "Sorry, you need a newer GPG version.\n"
@@ -61,27 +61,27 @@
 "Sorry, Sie benötigen eine neuere GPG-Version.\n"
 "Aktuelle GPG-Version %d.%d.%d benötigte benoetigte GPG version "
 
-#: Src/WinPT.cpp:260 Src/wptKeyManagerDlg.cpp:946 Src/wptKeyserverDlg.cpp:56
+#: Src/WinPT.cpp:261 Src/wptKeyManagerDlg.cpp:955 Src/wptKeyserverDlg.cpp:56
 #: Src/wptKeyserverDlg.cpp:186 Src/wptKeyserverDlg.cpp:194
-#: Src/wptKeyserverDlg.cpp:210 Src/wptKeyserverDlg.cpp:356
-#: Src/wptKeyserverDlg.cpp:361 Src/wptKeyserverDlg.cpp:491
-#: Src/wptKeyserverDlg.cpp:498 Src/wptKeyserverDlg.cpp:504
-#: Src/wptKeyserverDlg.cpp:520 Src/wptKeyserverDlg.cpp:533
+#: Src/wptKeyserverDlg.cpp:210 Src/wptKeyserverDlg.cpp:357
+#: Src/wptKeyserverDlg.cpp:362 Src/wptKeyserverDlg.cpp:492
+#: Src/wptKeyserverDlg.cpp:499 Src/wptKeyserverDlg.cpp:505
+#: Src/wptKeyserverDlg.cpp:521 Src/wptKeyserverDlg.cpp:534
 #: Src/wptKeyserverSearchDlg.cpp:127
 msgid "Keyserver"
 msgstr "Schlüsselserver"
 
 # c:\oss\winpt-gpgme\src\WinPT.cpp:245
-#: Src/WinPT.cpp:336
+#: Src/WinPT.cpp:359
 msgid "Cryptographic selftest failed."
 msgstr "Kryptographischer Selbsttest ist fehlgeschlagen."
 
 # c:\oss\winpt-gpgme\src\WinPT.cpp:252
-#: Src/WinPT.cpp:343
+#: Src/WinPT.cpp:366
 msgid "A newer GPGME version is needed; at least "
 msgstr "Eine neuere GPGME version wird benötigt"
 
-#: Src/WinPT.cpp:387
+#: Src/WinPT.cpp:410
 #, c-format
 msgid ""
 "GPG home directory is not set correctly.\n"
@@ -92,21 +92,21 @@
 "Bitte überprüfen Sie die GPG Registryseinträge:\n"
 "%s"
 
-#: Src/WinPT.cpp:391
+#: Src/WinPT.cpp:414
 msgid "Select GPG Public Keyring"
 msgstr "Öffentlichen GPG-Schlüsselbund auswählen."
 
 # c:\oss\winpt-gpgme\src\wptKeyCache.cpp:479
-#: Src/WinPT.cpp:392 Src/wptGPG.cpp:887 Src/wptGPG.cpp:907
+#: Src/WinPT.cpp:415 Src/wptGPG.cpp:910 Src/wptGPG.cpp:930
 msgid "GPG Keyrings (*.gpg)"
 msgstr "GPG Schlüsselbunde (*.gpg)"
 
 # c:\oss\winpt-gpgme\src\WinPT.cpp:313
-#: Src/WinPT.cpp:413
+#: Src/WinPT.cpp:436
 msgid "GPG home directory could not be determited."
 msgstr "GPG-Home-Dir konnte nicht bestimmt werden."
 
-#: Src/WinPT.cpp:421
+#: Src/WinPT.cpp:444
 msgid ""
 "Could not find the GPG binary (gpg.exe).\n"
 "Do you want to start the GPG preferences to correct  this problem?"
@@ -115,7 +115,7 @@
 "öffnen um das Problem zu beheben?"
 
 # c:\oss\winpt-gpgme\src\WinPT.cpp:339
-#: Src/WinPT.cpp:436
+#: Src/WinPT.cpp:459
 msgid ""
 "Could not access and/or find the public and secret keyring.\n"
 "If this is an accident, quit the program and fix it.\n"
@@ -130,20 +130,20 @@
 # c:\oss\winpt-gpgme\src\WinPT.cpp:376
 # c:\oss\winpt-gpgme\src\wptFileManagerDlg.cpp:426
 # c:\oss\winpt-gpgme\src\wptFileManagerDlg.cpp:711
-#: Src/WinPT.cpp:467 Src/wptFileManagerDlg.cpp:479
+#: Src/WinPT.cpp:492 Src/wptFileManagerDlg.cpp:479
 #: Src/wptFileManagerDlg.cpp:793
 msgid "Wipe Free Space"
-msgstr "Freispeicher Löschen"
+msgstr "Freien Speicher Löschen"
 
-#: Src/WinPT.cpp:511
+#: Src/WinPT.cpp:536
 msgid "Could not register window class"
 msgstr "Konnte keine Fensterklasse registrieren"
 
-#: Src/WinPT.cpp:525
+#: Src/WinPT.cpp:550
 msgid "Could not create window"
 msgstr "Konnte Fenster nicht erstellen"
 
-#: Src/WinPT.cpp:593
+#: Src/WinPT.cpp:615
 msgid ""
 "The keycache was not initialized or is empty.\n"
 "Please check your GPG config (keyrings, pathes...)"
@@ -151,7 +151,7 @@
 "Der Schlüsselspeicher wurde nicht initialisiert oder ist leer.\n"
 "Bitte checken Sie die GPG Konfiguration (Schlüsselbunde, Pfade)"
 
-#: Src/WinPT.cpp:596
+#: Src/WinPT.cpp:618
 msgid ""
 "It seems that GPG is not set properly.\n"
 "Do you want to start the GPG preferences dialog?"
@@ -159,7 +159,7 @@
 "GPG ist nicht richtig konfiguriert.\n"
 "Den GPG-Einstellungsdialog starten?"
 
-#: Src/WinPT.cpp:613
+#: Src/WinPT.cpp:635
 #, c-format
 msgid ""
 "Default key from the GPG options file could not be found.\n"
@@ -181,7 +181,7 @@
 msgid "About GnuPG"
 msgstr "Über GnuPG"
 
-#: Src/wptAboutDlgs.cpp:97 Src/wptKeyManagerDlg.cpp:1616
+#: Src/wptAboutDlgs.cpp:97 Src/wptKeyManagerDlg.cpp:1626
 #: Src/wptMainProc.cpp:569
 msgid "About WinPT"
 msgstr "Über WinPT"
@@ -231,8 +231,8 @@
 msgstr "Über &GPG"
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:700
-#: Src/wptAboutDlgs.cpp:116 Src/wptKeyEditDlgs.cpp:1805
-#: Src/wptKeyManagerDlg.cpp:952
+#: Src/wptAboutDlgs.cpp:116 Src/wptKeyEditDlgs.cpp:1808
+#: Src/wptKeyManagerDlg.cpp:961
 msgid "&Help"
 msgstr "&Hilfe"
 
@@ -254,12 +254,12 @@
 
 #: Src/wptCardDlg.cpp:346 Src/wptCardDlg.cpp:360 Src/wptCardDlg.cpp:365
 #: Src/wptCardDlg.cpp:371 Src/wptCardDlg.cpp:383 Src/wptCardDlg.cpp:397
-#: Src/wptCardDlg.cpp:526 Src/wptCardDlg.cpp:629 Src/wptCardDlg.cpp:634
-#: Src/wptCardDlg.cpp:640 Src/wptCardDlg.cpp:647 Src/wptCardDlg.cpp:652
-#: Src/wptCardDlg.cpp:660 Src/wptCardDlg.cpp:682 Src/wptCardDlg.cpp:709
-#: Src/wptCardDlg.cpp:714 Src/wptCardDlg.cpp:717 Src/wptCardDlg.cpp:742
-#: Src/wptCardDlg.cpp:744 Src/wptCardDlg.cpp:749 Src/wptCardDlg.cpp:754
-#: Src/wptCardDlg.cpp:816 Src/wptCardDlg.cpp:831 Src/wptCardDlg.cpp:834
+#: Src/wptCardDlg.cpp:526 Src/wptCardDlg.cpp:631 Src/wptCardDlg.cpp:636
+#: Src/wptCardDlg.cpp:642 Src/wptCardDlg.cpp:649 Src/wptCardDlg.cpp:654
+#: Src/wptCardDlg.cpp:662 Src/wptCardDlg.cpp:684 Src/wptCardDlg.cpp:711
+#: Src/wptCardDlg.cpp:716 Src/wptCardDlg.cpp:719 Src/wptCardDlg.cpp:744
+#: Src/wptCardDlg.cpp:746 Src/wptCardDlg.cpp:751 Src/wptCardDlg.cpp:756
+#: Src/wptCardDlg.cpp:820 Src/wptCardDlg.cpp:835 Src/wptCardDlg.cpp:838
 #: Src/wptMainProc.cpp:296
 msgid "Card Edit"
 msgstr "Karten-Editor"
@@ -341,41 +341,49 @@
 msgid "Email &address"
 msgstr "Mail-&Adresse"
 
-#: Src/wptCardDlg.cpp:606 Src/wptKeyManagerDlg.cpp:1506
+#: Src/wptCardDlg.cpp:606
+msgid "Overwrite old keys on the card"
+msgstr "Vorhandene Schlüssel auf der Karte übeerschreiben?"
+
+#: Src/wptCardDlg.cpp:607
+msgid "Make off-card backup of encryption key"
+msgstr ""
+
+#: Src/wptCardDlg.cpp:608 Src/wptKeyManagerDlg.cpp:1516
 msgid "Card Key Generation"
 msgstr "Karten-Schlüsselerzeugung"
 
-#: Src/wptCardDlg.cpp:629
+#: Src/wptCardDlg.cpp:631
 msgid "Please enter your name."
 msgstr "Bitte Namen eingeben"
 
-#: Src/wptCardDlg.cpp:633
+#: Src/wptCardDlg.cpp:635
 msgid "Name must be at least 5 characters long."
 msgstr "Der Name muss mindestens 5 Zeichen lang sein."
 
-#: Src/wptCardDlg.cpp:639
+#: Src/wptCardDlg.cpp:641
 msgid "Please enter your e-mail address."
 msgstr "Bitte E-Mail-Adresse eingeben."
 
-#: Src/wptCardDlg.cpp:646
+#: Src/wptCardDlg.cpp:648
 msgid "Please enter a valid e-mail address."
 msgstr "Bitte gültige E-Mail-Adresse eingeben."
 
-#: Src/wptCardDlg.cpp:652
+#: Src/wptCardDlg.cpp:654
 msgid "Please enter an off-card passphrase."
 msgstr "Bitte ein Passwort eingeben für \"off-card\"."
 
 # c:\oss\winpt-gpgme\src\wptCardDlg.cpp:649
-#: Src/wptCardDlg.cpp:659
+#: Src/wptCardDlg.cpp:661
 msgid "Please use plain ASCII charset for the fields."
 msgstr "Bitte nur den 7-bit ASCII Zeichensatz verwenden."
 
-#: Src/wptCardDlg.cpp:681 Src/wptKeyEditDlgs.cpp:1299
+#: Src/wptCardDlg.cpp:683 Src/wptKeyEditDlgs.cpp:1301
 msgid "The date you have chosen lies in the past."
 msgstr "Das gewählte Datum ist in der Vergangenheit."
 
 # c:\oss\winpt-gpgme\src\wptCardDlg.cpp:696
-#: Src/wptCardDlg.cpp:707
+#: Src/wptCardDlg.cpp:709
 msgid ""
 "Operation was canceled. It seems that there are existing\n"
 "keys on the cards. You need to mark the 'Overwrite' flag."
@@ -383,36 +391,36 @@
 "Operation wurde abgebrochen. Es scheinen noch Schlüssel\n"
 "auf der Karte zu existieren. Bitte 'Überschreiben' markieren."
 
-#: Src/wptCardDlg.cpp:716
+#: Src/wptCardDlg.cpp:718
 msgid "Keys successfully created."
 msgstr "Schlüssel erfolgreich erstellt."
 
-#: Src/wptCardDlg.cpp:742
+#: Src/wptCardDlg.cpp:744
 msgid "Please enter the old card PIN."
 msgstr "Bitte alte Karten-PIN eingeben."
 
-#: Src/wptCardDlg.cpp:744
+#: Src/wptCardDlg.cpp:746
 msgid "Please enter the new card PIN."
 msgstr "Bitte neue Karten-PIN eingeben."
 
-#: Src/wptCardDlg.cpp:749
+#: Src/wptCardDlg.cpp:751
 msgid "Admin PIN must be minimal 8 characters."
 msgstr "Die 'Admin PIN' muss mindestens 8 Zeichen lang sein."
 
-#: Src/wptCardDlg.cpp:754
+#: Src/wptCardDlg.cpp:756
 msgid "PIN must be minimal 6 characters."
 msgstr "Die 'Benutzer PIN' muss mindestens 6 Zeichen lang sein."
 
 # c:\oss\winpt-gpgme\src\wptCardDlg.cpp:766
-#: Src/wptCardDlg.cpp:777
+#: Src/wptCardDlg.cpp:779
 msgid "Change Card PIN"
 msgstr "Karten PIN Ändern"
 
-#: Src/wptCardDlg.cpp:815 Src/wptPassphraseDlg.cpp:167
+#: Src/wptCardDlg.cpp:819 Src/wptPassphraseDlg.cpp:167
 msgid "Passphrases do not match. Please try again."
 msgstr "Passwörter nicht identisch. Versuchen Sie es nochmal."
 
-#: Src/wptCardDlg.cpp:833
+#: Src/wptCardDlg.cpp:837
 msgid "PIN successfully changed."
 msgstr "PIN erfolgreich geändert."
 
@@ -458,7 +466,7 @@
 #: Src/wptClipDecryptDlg.cpp:138
 #, c-format
 msgid "Unsupported algorithm: %s"
-msgstr ""
+msgstr "Unbekannter Algorithmus: %s"
 
 # c:\oss\winpt-gpgme\src\wptClipDecryptDlg.cpp:137
 #: Src/wptClipDecryptDlg.cpp:145
@@ -468,8 +476,8 @@
 
 #: Src/wptClipDecryptDlg.cpp:164 Src/wptClipEncryptDlg.cpp:206
 #: Src/wptClipSignDlg.cpp:119 Src/wptClipSignDlg.cpp:229
-#: Src/wptClipSignEncDlg.cpp:197 Src/wptKeyManager.cpp:328
-#: Src/wptKeyManager.cpp:705 Src/wptKeyManager.cpp:896 Src/wptSymEnc.cpp:90
+#: Src/wptClipSignEncDlg.cpp:197 Src/wptKeyManager.cpp:329
+#: Src/wptKeyManager.cpp:693 Src/wptKeyManager.cpp:888 Src/wptSymEnc.cpp:90
 msgid "GnuPG Status: Finished"
 msgstr "GnuPG-Status: Abgeschlossen"
 
@@ -573,8 +581,8 @@
 msgid "Add quotes"
 msgstr "'>' hinzufügen"
 
-#: Src/wptClipEditDlg.cpp:202 Src/wptKeyEditDlgs.cpp:1804
-#: Src/wptKeyserverDlg.cpp:448 Src/wptMDSumDlg.cpp:104
+#: Src/wptClipEditDlg.cpp:202 Src/wptKeyEditDlgs.cpp:1807
+#: Src/wptKeyserverDlg.cpp:449 Src/wptMDSumDlg.cpp:104
 #: Src/wptOwnertrustDlg.cpp:103
 msgid "&Close"
 msgstr "&Schliessen"
@@ -598,7 +606,7 @@
 #: Src/wptClipEncryptDlg.cpp:142 Src/wptClipSignEncDlg.cpp:112
 #: Src/wptCommonDlg.cpp:66 Src/wptFileManagerDlg.cpp:84
 #: Src/wptFileManagerDlg.cpp:215 Src/wptFileManagerDlg.cpp:277
-#: Src/wptFileSaveDlg.cpp:58 Src/wptFirstRunDlg.cpp:50
+#: Src/wptFileSaveDlg.cpp:58 Src/wptFirstRunDlg.cpp:51
 #: Src/wptKeyEditDlgs.cpp:288 Src/wptKeyEditDlgs.cpp:388
 #: Src/wptKeyEditDlgs.cpp:463 Src/wptKeyEditDlgs.cpp:599
 #: Src/wptKeyEditOwnertrustDlg.cpp:67 Src/wptKeygenDlg.cpp:383
@@ -624,7 +632,7 @@
 msgstr "Schlüsselimport-Statistiken"
 
 #: Src/wptClipImportDlg.cpp:88 Src/wptFileManagerDlg.cpp:201
-#: Src/wptFileManagerDlg.cpp:214 Src/wptKeyManager.cpp:480
+#: Src/wptFileManagerDlg.cpp:214 Src/wptKeyManager.cpp:468
 msgid "Key Import"
 msgstr "Schlüsselimport"
 
@@ -649,7 +657,7 @@
 #: Src/wptFileManager.cpp:1664 Src/wptImportList.cpp:414
 #: Src/wptImportList.cpp:421 Src/wptImportList.cpp:430
 #: Src/wptImportList.cpp:438 Src/wptImportList.cpp:447
-#: Src/wptKeyManager.cpp:587 Src/wptKeyserverDlg.cpp:219
+#: Src/wptKeyManager.cpp:575 Src/wptKeyserverDlg.cpp:219
 msgid "Import"
 msgstr "Importieren"
 
@@ -704,7 +712,7 @@
 msgid "Signing key:"
 msgstr "Signierer Schlüssel:"
 
-#: Src/wptClipSignEncDlg.cpp:166 Src/wptKeylist.cpp:1170
+#: Src/wptClipSignEncDlg.cpp:166 Src/wptKeylist.cpp:1159
 msgid "No key was selected."
 msgstr "Kein Schlüssel ausgewählt."
 
@@ -771,26 +779,26 @@
 #: Src/wptKeyEditDlgs.cpp:779 Src/wptKeyEditDlgs.cpp:815
 #: Src/wptKeyEditDlgs.cpp:827 Src/wptKeyEditDlgs.cpp:896
 #: Src/wptKeyEditDlgs.cpp:903 Src/wptKeyEditDlgs.cpp:921
-#: Src/wptKeyEditDlgs.cpp:968 Src/wptKeyEditDlgs.cpp:973
-#: Src/wptKeyEditDlgs.cpp:1064 Src/wptKeyEditDlgs.cpp:1070
-#: Src/wptKeyEditDlgs.cpp:1222 Src/wptKeyEditDlgs.cpp:1226
-#: Src/wptKeyEditDlgs.cpp:1230 Src/wptKeyEditDlgs.cpp:1235
-#: Src/wptKeyEditDlgs.cpp:1271 Src/wptKeyEditDlgs.cpp:1275
-#: Src/wptKeyEditDlgs.cpp:1285 Src/wptKeyEditDlgs.cpp:1300
-#: Src/wptKeyEditDlgs.cpp:1304 Src/wptKeyEditDlgs.cpp:1344
-#: Src/wptKeyEditDlgs.cpp:1349 Src/wptKeyEditDlgs.cpp:1356
-#: Src/wptKeyEditDlgs.cpp:1362 Src/wptKeyEditDlgs.cpp:1367
-#: Src/wptKeyEditDlgs.cpp:1408 Src/wptKeyEditDlgs.cpp:1413
-#: Src/wptKeyEditDlgs.cpp:1419 Src/wptKeyEditDlgs.cpp:1426
-#: Src/wptKeyEditDlgs.cpp:1429 Src/wptKeyEditDlgs.cpp:1466
-#: Src/wptKeyEditDlgs.cpp:1474 Src/wptKeyEditDlgs.cpp:1508
-#: Src/wptKeyEditDlgs.cpp:1516 Src/wptKeyEditDlgs.cpp:1614
-#: Src/wptKeyEditDlgs.cpp:1647 Src/wptKeyEditDlgs.cpp:1672
-#: Src/wptKeyEditDlgs.cpp:1676 Src/wptKeyEditDlgs.cpp:1685
-#: Src/wptKeyEditDlgs.cpp:1785 Src/wptKeyEditDlgs.cpp:1795
-#: Src/wptKeyEditDlgs.cpp:1806 Src/wptKeyEditDlgs.cpp:1835
-#: Src/wptKeyEditDlgs.cpp:1841 Src/wptKeyManagerDlg.cpp:980
-#: Src/wptKeyManagerDlg.cpp:1650
+#: Src/wptKeyEditDlgs.cpp:968 Src/wptKeyEditDlgs.cpp:975
+#: Src/wptKeyEditDlgs.cpp:1066 Src/wptKeyEditDlgs.cpp:1072
+#: Src/wptKeyEditDlgs.cpp:1224 Src/wptKeyEditDlgs.cpp:1228
+#: Src/wptKeyEditDlgs.cpp:1232 Src/wptKeyEditDlgs.cpp:1237
+#: Src/wptKeyEditDlgs.cpp:1273 Src/wptKeyEditDlgs.cpp:1277
+#: Src/wptKeyEditDlgs.cpp:1287 Src/wptKeyEditDlgs.cpp:1302
+#: Src/wptKeyEditDlgs.cpp:1306 Src/wptKeyEditDlgs.cpp:1346
+#: Src/wptKeyEditDlgs.cpp:1351 Src/wptKeyEditDlgs.cpp:1358
+#: Src/wptKeyEditDlgs.cpp:1364 Src/wptKeyEditDlgs.cpp:1369
+#: Src/wptKeyEditDlgs.cpp:1410 Src/wptKeyEditDlgs.cpp:1415
+#: Src/wptKeyEditDlgs.cpp:1421 Src/wptKeyEditDlgs.cpp:1428
+#: Src/wptKeyEditDlgs.cpp:1431 Src/wptKeyEditDlgs.cpp:1468
+#: Src/wptKeyEditDlgs.cpp:1476 Src/wptKeyEditDlgs.cpp:1510
+#: Src/wptKeyEditDlgs.cpp:1518 Src/wptKeyEditDlgs.cpp:1616
+#: Src/wptKeyEditDlgs.cpp:1649 Src/wptKeyEditDlgs.cpp:1674
+#: Src/wptKeyEditDlgs.cpp:1678 Src/wptKeyEditDlgs.cpp:1687
+#: Src/wptKeyEditDlgs.cpp:1788 Src/wptKeyEditDlgs.cpp:1798
+#: Src/wptKeyEditDlgs.cpp:1809 Src/wptKeyEditDlgs.cpp:1838
+#: Src/wptKeyEditDlgs.cpp:1844 Src/wptKeyManagerDlg.cpp:989
+#: Src/wptKeyManagerDlg.cpp:1660
 msgid "Key Edit"
 msgstr "Schlüssel bearbeiten"
 
@@ -1109,7 +1117,7 @@
 msgid "Status"
 msgstr "Status"
 
-#: Src/wptFileManager.cpp:384 Src/wptKeyEditDlgs.cpp:1056
+#: Src/wptFileManager.cpp:384 Src/wptKeyEditDlgs.cpp:1058
 #: Src/wptKeyRevokersDlg.cpp:57 Src/wptMDSumDlg.cpp:73
 #: Src/wptVerifyList.cpp:97
 msgid "Name"
@@ -1237,7 +1245,7 @@
 msgid "Invalid file name. Exit"
 msgstr "Ungültiger Dateiname. Abbruch"
 
-#: Src/wptFileManager.cpp:1661 Src/wptKeyManager.cpp:584
+#: Src/wptFileManager.cpp:1661 Src/wptKeyManager.cpp:572
 msgid ""
 "Key without a self signature was dectected!\n"
 "(This key is NOT usable for encryption, etc)\n"
@@ -1249,8 +1257,8 @@
 "\n"
 "Kann diese(n) Schlüssel nicht importieren!"
 
-#: Src/wptFileManager.cpp:1687 Src/wptKeyManager.cpp:311
-#: Src/wptKeyManager.cpp:347 Src/wptKeyManager.cpp:383
+#: Src/wptFileManager.cpp:1687 Src/wptKeyManager.cpp:312
+#: Src/wptKeyManager.cpp:348 Src/wptKeyManager.cpp:383
 msgid "No key was selected for export."
 msgstr "Kein Schlüssel zum Exportieren ausgewählt."
 
@@ -1259,13 +1267,13 @@
 msgid "Export"
 msgstr "Exportieren"
 
-#: Src/wptFileManager.cpp:1695 Src/wptKeyManagerDlg.cpp:1574
-#: Src/wptKeyManagerDlg.cpp:1608
+#: Src/wptFileManager.cpp:1695 Src/wptKeyManagerDlg.cpp:1584
+#: Src/wptKeyManagerDlg.cpp:1618
 msgid "Choose Name for Key File"
 msgstr "Den Namen der Schlüsseldatei wählen"
 
 #: Src/wptFileManager.cpp:1714 Src/wptKeyEditDlgs.cpp:936
-#: Src/wptKeyEditDlgs.cpp:1252 Src/wptKeyEditDlgs.cpp:1323
+#: Src/wptKeyEditDlgs.cpp:1254 Src/wptKeyEditDlgs.cpp:1325
 #: Src/wptKeyserverDlg.cpp:96
 msgid "GnuPG status"
 msgstr "GnuPG Status"
@@ -1329,7 +1337,7 @@
 msgstr "Bitte wählen Sie wenigstens einen Empfänger"
 
 #: Src/wptFileManagerDlg.cpp:201 Src/wptFileStatDlg.cpp:266
-#: Src/wptKeyManager.cpp:458
+#: Src/wptKeyManager.cpp:446
 msgid "No valid OpenPGP data found."
 msgstr "Keine gültigen OpenPGP-Daten gefunden."
 
@@ -1358,17 +1366,17 @@
 msgid "Signature mode"
 msgstr "Signaturmodus"
 
-#: Src/wptFileManagerDlg.cpp:276 Src/wptKeyManagerDlg.cpp:944
+#: Src/wptFileManagerDlg.cpp:276 Src/wptKeyManagerDlg.cpp:953
 msgid "Options"
 msgstr "Optionen"
 
-#: Src/wptFileManagerDlg.cpp:322 Src/wptKeyEditDlgs.cpp:1226
-#: Src/wptKeyEditDlgs.cpp:1275 Src/wptKeyEditDlgs.cpp:1349
-#: Src/wptKeyManager.cpp:624 Src/wptKeyManager.cpp:724
-#: Src/wptKeyManager.cpp:761 Src/wptKeyManagerDlg.cpp:1342
-#: Src/wptKeyManagerDlg.cpp:1361 Src/wptKeyManagerDlg.cpp:1395
-#: Src/wptKeyManagerDlg.cpp:1414 Src/wptKeyManagerDlg.cpp:1431
-#: Src/wptKeyManagerDlg.cpp:1564 Src/wptKeyManagerDlg.cpp:1583
+#: Src/wptFileManagerDlg.cpp:322 Src/wptKeyEditDlgs.cpp:1228
+#: Src/wptKeyEditDlgs.cpp:1277 Src/wptKeyEditDlgs.cpp:1351
+#: Src/wptKeyManager.cpp:611 Src/wptKeyManager.cpp:712
+#: Src/wptKeyManager.cpp:749 Src/wptKeyManagerDlg.cpp:1352
+#: Src/wptKeyManagerDlg.cpp:1371 Src/wptKeyManagerDlg.cpp:1405
+#: Src/wptKeyManagerDlg.cpp:1424 Src/wptKeyManagerDlg.cpp:1441
+#: Src/wptKeyManagerDlg.cpp:1574 Src/wptKeyManagerDlg.cpp:1593
 #: Src/wptKeyserverSearchDlg.cpp:127
 msgid "Please select a key."
 msgstr "Bitte Schlüssel wählen."
@@ -1386,17 +1394,17 @@
 msgid "File Manager (use drag & drop to add files)"
 msgstr "Dateimanager (Drag & Drop möglich)"
 
-#: Src/wptFileManagerDlg.cpp:458 Src/wptKeyManagerDlg.cpp:917
+#: Src/wptFileManagerDlg.cpp:458 Src/wptKeyManagerDlg.cpp:926
 #: Src/wptOwnertrustDlg.cpp:98
 msgid "File"
 msgstr "Datei"
 
-#: Src/wptFileManagerDlg.cpp:459 Src/wptKeyManagerDlg.cpp:918
-#: Src/wptKeyManagerDlg.cpp:923 Src/wptKeyManagerDlg.cpp:934
+#: Src/wptFileManagerDlg.cpp:459 Src/wptKeyManagerDlg.cpp:927
+#: Src/wptKeyManagerDlg.cpp:932 Src/wptKeyManagerDlg.cpp:943
 msgid "Edit"
 msgstr "Bearbeiten"
 
-#: Src/wptFileManagerDlg.cpp:460 Src/wptKeyManagerDlg.cpp:919
+#: Src/wptFileManagerDlg.cpp:460 Src/wptKeyManagerDlg.cpp:928
 msgid "View"
 msgstr "Ansicht"
 
@@ -1416,8 +1424,8 @@
 msgid "&Decrypt"
 msgstr "&Entschlüsseln"
 
-#: Src/wptFileManagerDlg.cpp:465 Src/wptKeyManagerDlg.cpp:935
-#: Src/wptKeyManagerDlg.cpp:983
+#: Src/wptFileManagerDlg.cpp:465 Src/wptKeyManagerDlg.cpp:944
+#: Src/wptKeyManagerDlg.cpp:992
 msgid "&Sign"
 msgstr "&Signieren"
 
@@ -1561,21 +1569,21 @@
 msgstr "Wollen sie den Schlüssel herunterladen?"
 
 # c:\oss\winpt-gpgme\src\wptFirstRunDlg.cpp:42
-#: Src/wptFirstRunDlg.cpp:47
+#: Src/wptFirstRunDlg.cpp:48
 msgid "&Generate a GnuPG key pair"
 msgstr "GnuPG Schlüsselpaar &erzeugen"
 
 # c:\oss\winpt-gpgme\src\wptFirstRunDlg.cpp:43
-#: Src/wptFirstRunDlg.cpp:48
+#: Src/wptFirstRunDlg.cpp:50
 msgid "&Copy GnuPG keyrings from another location"
 msgstr "GPG Keyring aus anderem Verzeichnis &kopieren"
 
-#: Src/wptFirstRunDlg.cpp:49
-msgid "&Specify a new GnuPG home directory"
-msgstr "Bitte neues GnuPG-HOME-Verzeichnis &eingeben."
+#: Src/wptFirstRunDlg.cpp:52
+msgid "WinPT First Start"
+msgstr ""
 
 # c:\oss\winpt-gpgme\src\wptGPG.cpp:728
-#: Src/wptGPG.cpp:808
+#: Src/wptGPG.cpp:831
 msgid ""
 "The selected keyring has the read-only file\n"
 "attribute. In this state you do not have write\n"
@@ -1585,19 +1593,19 @@
 "In diesem Zustand kann nichts gespeichert werden\n"
 "Wollen Sie das Attribut zurücksetzen?"
 
-#: Src/wptGPG.cpp:811
+#: Src/wptGPG.cpp:834
 msgid "GPG Information"
 msgstr "GPG Information"
 
-#: Src/wptGPG.cpp:815
+#: Src/wptGPG.cpp:838
 msgid "Could not reset read-only state."
 msgstr "Konnte den Read-Only Zustand nicht zurücksetzen."
 
-#: Src/wptGPG.cpp:816 Src/wptGPG.cpp:1096 Src/wptGPG.cpp:1105
+#: Src/wptGPG.cpp:839 Src/wptGPG.cpp:1119 Src/wptGPG.cpp:1128
 msgid "GPG Error"
 msgstr "GPG Fehler"
 
-#: Src/wptGPG.cpp:828
+#: Src/wptGPG.cpp:851
 msgid ""
 "You do not have file access to modify the contents of\n"
 "one or both of the selected keyrings.\n"
@@ -1611,15 +1619,15 @@
 "Die Schlüsselbunde sind im Nur-Lesen-Modus, was meistens der Fall ist, \n"
 "wenn ein anderes Programm auf die Schlüsselbunde zugreift.\n"
 
-#: Src/wptGPG.cpp:833
+#: Src/wptGPG.cpp:856
 msgid "GPG Warning"
 msgstr "GPG Warnung"
 
-#: Src/wptGPG.cpp:857 Src/wptGPGPrefsDlg.cpp:177 Src/wptGPGPrefsDlg.cpp:183
+#: Src/wptGPG.cpp:880 Src/wptGPGPrefsDlg.cpp:177 Src/wptGPGPrefsDlg.cpp:183
 #: Src/wptGPGPrefsDlg.cpp:189 Src/wptGPGPrefsDlg.cpp:195
 #: Src/wptGPGPrefsDlg.cpp:200 Src/wptGPGPrefsDlg.cpp:205
 #: Src/wptGPGPrefsDlg.cpp:210 Src/wptGPGPrefsDlg.cpp:224
-#: Src/wptKeyEditDlgs.cpp:1621 Src/wptKeyManagerDlg.cpp:945
+#: Src/wptKeyEditDlgs.cpp:1623 Src/wptKeyManagerDlg.cpp:954
 #: Src/wptMainProc.cpp:430 Src/wptPreferencesDlg.cpp:209
 #: Src/wptPreferencesDlg.cpp:260 Src/wptPreferencesDlg.cpp:271
 #: Src/wptPreferencesDlg.cpp:283 Src/wptPreferencesDlg.cpp:296
@@ -1627,7 +1635,7 @@
 msgid "Preferences"
 msgstr "Einstellungen"
 
-#: Src/wptGPG.cpp:858
+#: Src/wptGPG.cpp:881
 #, c-format
 msgid ""
 "%s does not exit.\n"
@@ -1636,41 +1644,41 @@
 "%s existiert nicht.\n"
 "Möchten Sie dieses Verzeichnis erstellen?"
 
-#: Src/wptGPG.cpp:886
+#: Src/wptGPG.cpp:909
 msgid "Please choose your public keyring"
 msgstr "Bitte wählen Sie Ihren öffentlichen Schlüsselbund."
 
-#: Src/wptGPG.cpp:889 Src/wptGPG.cpp:909
+#: Src/wptGPG.cpp:912 Src/wptGPG.cpp:932
 msgid "No keyring was chosen. Exit."
 msgstr "Kein Schlüsselbund ausgewählt. Abbruch."
 
-#: Src/wptGPG.cpp:895
+#: Src/wptGPG.cpp:918
 msgid "Overwrite old public keyring?"
 msgstr "Alten öffentlichen Schlüsselbund überschreiben"
 
-#: Src/wptGPG.cpp:900 Src/wptGPG.cpp:919
+#: Src/wptGPG.cpp:923 Src/wptGPG.cpp:942
 msgid "Could not copy file."
 msgstr "Datei konnte nicht kopiert werden"
 
-#: Src/wptGPG.cpp:906
+#: Src/wptGPG.cpp:929
 msgid "Please choose your secret keyring"
 msgstr "Bitte wählen Sie Ihren geheimen Schlüsselbund."
 
-#: Src/wptGPG.cpp:914
+#: Src/wptGPG.cpp:937
 msgid "Overwrite old secret keyring?"
 msgstr "Alten geheimen Schlüsselbund überschreiben?"
 
-#: Src/wptGPG.cpp:964 Src/wptGPG.cpp:1054 Src/wptGPG.cpp:1067
+#: Src/wptGPG.cpp:987 Src/wptGPG.cpp:1077 Src/wptGPG.cpp:1090
 msgid "Backup"
 msgstr "Sicherung"
 
-#: Src/wptGPG.cpp:964
+#: Src/wptGPG.cpp:987
 #, c-format
 msgid "Backup keyring \"%s\" failed"
 msgstr "Schlüsselbundsicherung \"%s\" fehlgeschlagen"
 
 # c:\oss\winpt-gpgme\src\wptGPG.cpp:1021
-#: Src/wptGPG.cpp:1055
+#: Src/wptGPG.cpp:1078
 #, c-format
 msgid ""
 "The backup drive '%s' does not seems to accessable.\n"
@@ -1679,12 +1687,12 @@
 "Kann auf das Backup-Laufwerk '%s' nicht zugreifen.\n"
 "Bitte aktivieren/überprüfen sie das Laufwerk um Fortzufahren."
 
-#: Src/wptGPG.cpp:1067
+#: Src/wptGPG.cpp:1090
 #, c-format
 msgid "Invalid backup mode %d"
 msgstr "Ungültiger Sicherungsmethode %d"
 
-#: Src/wptGPG.cpp:1095
+#: Src/wptGPG.cpp:1118
 msgid "No GPG error description available."
 msgstr "Keine GPG-Fehlerbeschreibung verfügbar"
 
@@ -1758,7 +1766,7 @@
 "Aktuelle Daten gehen verloren\n"
 "Sind Sie sicher?"
 
-#: Src/wptGPGPrefsDlg.cpp:127 Src/wptKeyManagerDlg.cpp:1538
+#: Src/wptGPGPrefsDlg.cpp:127 Src/wptKeyManagerDlg.cpp:1548
 #: Src/wptMainProc.cpp:581
 msgid "GnuPG Preferences"
 msgstr "GnuPG-Einstellungen"
@@ -1879,52 +1887,51 @@
 msgid "Unknown Hotkey"
 msgstr "Unbekanntes Tastenkürzel"
 
-#: Src/wptImagelist.cpp:50 Src/wptKeyManager.cpp:177 Src/wptKeyManager.cpp:182
-#: Src/wptKeyManager.cpp:233 Src/wptKeyManager.cpp:312
-#: Src/wptKeyManager.cpp:319 Src/wptKeyManager.cpp:348
-#: Src/wptKeyManager.cpp:353 Src/wptKeyManager.cpp:360
-#: Src/wptKeyManager.cpp:362 Src/wptKeyManager.cpp:384
-#: Src/wptKeyManager.cpp:401 Src/wptKeyManager.cpp:405
-#: Src/wptKeyManager.cpp:411 Src/wptKeyManager.cpp:429
-#: Src/wptKeyManager.cpp:451 Src/wptKeyManager.cpp:456
-#: Src/wptKeyManager.cpp:459 Src/wptKeyManager.cpp:464
-#: Src/wptKeyManager.cpp:470 Src/wptKeyManager.cpp:475
-#: Src/wptKeyManager.cpp:561 Src/wptKeyManager.cpp:569
-#: Src/wptKeyManager.cpp:624 Src/wptKeyManager.cpp:651
-#: Src/wptKeyManager.cpp:661 Src/wptKeyManager.cpp:672
-#: Src/wptKeyManager.cpp:699 Src/wptKeyManager.cpp:724
-#: Src/wptKeyManager.cpp:731 Src/wptKeyManager.cpp:756
-#: Src/wptKeyManager.cpp:761 Src/wptKeyManager.cpp:788
-#: Src/wptKeyManager.cpp:826 Src/wptKeyManager.cpp:832
-#: Src/wptKeyManager.cpp:894 Src/wptKeyManager.cpp:924
-#: Src/wptKeyManagerDlg.cpp:1039 Src/wptKeyManagerDlg.cpp:1060
-#: Src/wptKeyManagerDlg.cpp:1315 Src/wptKeyManagerDlg.cpp:1343
-#: Src/wptKeyManagerDlg.cpp:1361 Src/wptKeyManagerDlg.cpp:1369
-#: Src/wptKeyManagerDlg.cpp:1379 Src/wptKeyManagerDlg.cpp:1395
-#: Src/wptKeyManagerDlg.cpp:1401 Src/wptKeyManagerDlg.cpp:1414
-#: Src/wptKeyManagerDlg.cpp:1431 Src/wptKeyManagerDlg.cpp:1463
-#: Src/wptKeyManagerDlg.cpp:1502 Src/wptKeyManagerDlg.cpp:1565
-#: Src/wptKeyManagerDlg.cpp:1583 Src/wptKeyManagerDlg.cpp:1588
-#: Src/wptKeyManagerDlg.cpp:1593 Src/wptKeyManagerDlg.cpp:1679
-#: Src/wptKeyManagerDlg.cpp:1855 Src/wptKeysigDlg.cpp:88
-#: Src/wptKeysigDlg.cpp:99 Src/wptKeysigDlg.cpp:321 Src/wptKeysigDlg.cpp:327
-#: Src/wptKeysigDlg.cpp:371 Src/wptKeysigDlg.cpp:433 Src/wptMainProc.cpp:398
-#: Src/wptMainProc.cpp:552
+#: Src/wptImagelist.cpp:50 Src/wptKeyManager.cpp:178 Src/wptKeyManager.cpp:183
+#: Src/wptKeyManager.cpp:234 Src/wptKeyManager.cpp:313
+#: Src/wptKeyManager.cpp:320 Src/wptKeyManager.cpp:349
+#: Src/wptKeyManager.cpp:354 Src/wptKeyManager.cpp:361
+#: Src/wptKeyManager.cpp:363 Src/wptKeyManager.cpp:384
+#: Src/wptKeyManager.cpp:393 Src/wptKeyManager.cpp:397
+#: Src/wptKeyManager.cpp:417 Src/wptKeyManager.cpp:439
+#: Src/wptKeyManager.cpp:444 Src/wptKeyManager.cpp:447
+#: Src/wptKeyManager.cpp:452 Src/wptKeyManager.cpp:458
+#: Src/wptKeyManager.cpp:463 Src/wptKeyManager.cpp:549
+#: Src/wptKeyManager.cpp:557 Src/wptKeyManager.cpp:611
+#: Src/wptKeyManager.cpp:640 Src/wptKeyManager.cpp:650
+#: Src/wptKeyManager.cpp:661 Src/wptKeyManager.cpp:687
+#: Src/wptKeyManager.cpp:712 Src/wptKeyManager.cpp:719
+#: Src/wptKeyManager.cpp:744 Src/wptKeyManager.cpp:749
+#: Src/wptKeyManager.cpp:777 Src/wptKeyManager.cpp:819
+#: Src/wptKeyManager.cpp:826 Src/wptKeyManager.cpp:886
+#: Src/wptKeyManager.cpp:916 Src/wptKeyManagerDlg.cpp:1048
+#: Src/wptKeyManagerDlg.cpp:1069 Src/wptKeyManagerDlg.cpp:1325
+#: Src/wptKeyManagerDlg.cpp:1353 Src/wptKeyManagerDlg.cpp:1371
+#: Src/wptKeyManagerDlg.cpp:1379 Src/wptKeyManagerDlg.cpp:1389
+#: Src/wptKeyManagerDlg.cpp:1405 Src/wptKeyManagerDlg.cpp:1411
+#: Src/wptKeyManagerDlg.cpp:1424 Src/wptKeyManagerDlg.cpp:1441
+#: Src/wptKeyManagerDlg.cpp:1473 Src/wptKeyManagerDlg.cpp:1512
+#: Src/wptKeyManagerDlg.cpp:1575 Src/wptKeyManagerDlg.cpp:1593
+#: Src/wptKeyManagerDlg.cpp:1598 Src/wptKeyManagerDlg.cpp:1603
+#: Src/wptKeyManagerDlg.cpp:1689 Src/wptKeyManagerDlg.cpp:1865
+#: Src/wptKeysigDlg.cpp:88 Src/wptKeysigDlg.cpp:99 Src/wptKeysigDlg.cpp:321
+#: Src/wptKeysigDlg.cpp:327 Src/wptKeysigDlg.cpp:371 Src/wptKeysigDlg.cpp:433
+#: Src/wptMainProc.cpp:398 Src/wptMainProc.cpp:552
 msgid "Key Manager"
 msgstr "Schlüsselverwaltung"
 
 #: Src/wptImportList.cpp:264 Src/wptKeyEditDlgs.cpp:205
-#: Src/wptKeyEditDlgs.cpp:1028 Src/wptKeyEditDlgs.cpp:1089
-#: Src/wptKeyEditDlgs.cpp:1361 Src/wptKeyEditDlgs.cpp:1381
-#: Src/wptKeyEditDlgs.cpp:1418 Src/wptKeyEditDlgs.cpp:1447
-#: Src/wptKeylist.cpp:379 Src/wptKeyPropsDlg.cpp:157 Src/wptKeysigDlg.cpp:136
+#: Src/wptKeyEditDlgs.cpp:1030 Src/wptKeyEditDlgs.cpp:1091
+#: Src/wptKeyEditDlgs.cpp:1363 Src/wptKeyEditDlgs.cpp:1383
+#: Src/wptKeyEditDlgs.cpp:1420 Src/wptKeyEditDlgs.cpp:1449
+#: Src/wptKeylist.cpp:392 Src/wptKeyPropsDlg.cpp:157 Src/wptKeysigDlg.cpp:136
 #: Src/wptKeysigDlg.cpp:201
 msgid "Revoked"
 msgstr "Widerrufen"
 
 #: Src/wptImportList.cpp:266 Src/wptKeyEditDlgs.cpp:206
-#: Src/wptKeyEditDlgs.cpp:1026 Src/wptKeyEditDlgs.cpp:1282
-#: Src/wptKeylist.cpp:381 Src/wptKeyPropsDlg.cpp:154 Src/wptKeysigDlg.cpp:135
+#: Src/wptKeyEditDlgs.cpp:1028 Src/wptKeyEditDlgs.cpp:1284
+#: Src/wptKeylist.cpp:394 Src/wptKeyPropsDlg.cpp:154 Src/wptKeysigDlg.cpp:135
 #: Src/wptKeysigDlg.cpp:202
 msgid "Expired"
 msgstr "Abgelaufen"
@@ -1937,39 +1944,39 @@
 msgid "public key"
 msgstr "öffentlicher Schlüssel"
 
-#: Src/wptImportList.cpp:303 Src/wptKeyEditDlgs.cpp:1106
+#: Src/wptImportList.cpp:303 Src/wptKeyEditDlgs.cpp:1108
 msgid "Invalid user ID"
 msgstr "Ungültige Benutzerkennung"
 
-#: Src/wptImportList.cpp:352 Src/wptKeylist.cpp:541 Src/wptKeylist.cpp:550
-#: Src/wptKeyManagerDlg.cpp:863 Src/wptKeyManagerDlg.cpp:931
+#: Src/wptImportList.cpp:352 Src/wptKeylist.cpp:537 Src/wptKeylist.cpp:545
+#: Src/wptKeyManagerDlg.cpp:872 Src/wptKeyManagerDlg.cpp:940
 #: Src/wptKeyserverSearchDlg.cpp:48 Src/wptSigList.cpp:51
 #: Src/wptVerifyList.cpp:101 Src/wptVerifyList.cpp:110
 msgid "User ID"
 msgstr "Benutzerkennung"
 
-#: Src/wptImportList.cpp:353 Src/wptKeylist.cpp:543 Src/wptKeylist.cpp:553
-#: Src/wptKeyManagerDlg.cpp:866 Src/wptKeyserverSearchDlg.cpp:45
+#: Src/wptImportList.cpp:353 Src/wptKeylist.cpp:539 Src/wptKeylist.cpp:548
+#: Src/wptKeyManagerDlg.cpp:875 Src/wptKeyserverSearchDlg.cpp:45
 msgid "Size"
 msgstr "Größe"
 
-#: Src/wptImportList.cpp:354 Src/wptKeyEditDlgs.cpp:952 Src/wptKeylist.cpp:542
-#: Src/wptKeylist.cpp:551 Src/wptKeyManagerDlg.cpp:864
-#: Src/wptKeyManagerDlg.cpp:954 Src/wptKeyRevokersDlg.cpp:58
+#: Src/wptImportList.cpp:354 Src/wptKeyEditDlgs.cpp:952 Src/wptKeylist.cpp:538
+#: Src/wptKeylist.cpp:546 Src/wptKeyManagerDlg.cpp:873
+#: Src/wptKeyManagerDlg.cpp:963 Src/wptKeyRevokersDlg.cpp:58
 #: Src/wptKeyserverSearchDlg.cpp:46 Src/wptSigList.cpp:55
 #: Src/wptVerifyList.cpp:109
 msgid "Key ID"
 msgstr "Schlüssel-ID"
 
 #: Src/wptImportList.cpp:355 Src/wptKeyEditDlgs.cpp:953
-#: Src/wptKeyEditDlgs.cpp:1058 Src/wptKeylist.cpp:557
-#: Src/wptKeyManagerDlg.cpp:870 Src/wptKeyManagerDlg.cpp:957
+#: Src/wptKeyEditDlgs.cpp:1060 Src/wptKeylist.cpp:552
+#: Src/wptKeyManagerDlg.cpp:879 Src/wptKeyManagerDlg.cpp:966
 #: Src/wptKeyserverSearchDlg.cpp:47 Src/wptSigList.cpp:54
 msgid "Creation"
 msgstr "Erstellung"
 
-#: Src/wptImportList.cpp:356 Src/wptKeylist.cpp:552
-#: Src/wptKeyManagerDlg.cpp:865 Src/wptKeyManagerDlg.cpp:956
+#: Src/wptImportList.cpp:356 Src/wptKeylist.cpp:547
+#: Src/wptKeyManagerDlg.cpp:874 Src/wptKeyManagerDlg.cpp:965
 msgid "Type"
 msgstr "Typ"
 
@@ -1983,7 +1990,7 @@
 "und deshalb ein CRC Fehler auftrat."
 
 # c:\oss\winpt-gpgme\src\wptKeyCache.cpp:479
-#: Src/wptKeyCache.cpp:488
+#: Src/wptKeyCache.cpp:613
 msgid "Load GPG Keyrings..."
 msgstr "Lade GPG Keyrings"
 
@@ -2003,12 +2010,12 @@
 msgid "Ultimate"
 msgstr "Absolut"
 
-#: Src/wptKeyEditDlgs.cpp:194 Src/wptKeyEditDlgs.cpp:1023
-#: Src/wptKeylist.cpp:227 Src/wptKeylist.cpp:341 Src/wptKeylist.cpp:943
+#: Src/wptKeyEditDlgs.cpp:194 Src/wptKeyEditDlgs.cpp:1025
+#: Src/wptKeylist.cpp:235 Src/wptKeylist.cpp:354
 msgid "Never"
 msgstr "Niemals"
 
-#: Src/wptKeyEditDlgs.cpp:207 Src/wptKeyEditDlgs.cpp:1030
+#: Src/wptKeyEditDlgs.cpp:207 Src/wptKeyEditDlgs.cpp:1032
 msgid "OK"
 msgstr "OK"
 
@@ -2095,8 +2102,8 @@
 
 #: Src/wptKeyEditDlgs.cpp:349 Src/wptKeyEditDlgs.cpp:428
 #: Src/wptKeyEditDlgs.cpp:510 Src/wptKeyEditDlgs.cpp:675
-#: Src/wptKeyEditDlgs.cpp:1383 Src/wptKeyEditDlgs.cpp:1449
-#: Src/wptKeyEditDlgs.cpp:1529 Src/wptKeyEditDlgs.cpp:1703
+#: Src/wptKeyEditDlgs.cpp:1385 Src/wptKeyEditDlgs.cpp:1451
+#: Src/wptKeyEditDlgs.cpp:1531 Src/wptKeyEditDlgs.cpp:1705
 #: Src/wptKeygenDlg.cpp:496 Src/wptKeygenDlg.cpp:610
 #: Src/wptKeyPropsDlg.cpp:349 Src/wptOwnertrustDlg.cpp:124
 #: Src/wptOwnertrustDlg.cpp:136
@@ -2120,9 +2127,9 @@
 msgid "Add Revoker"
 msgstr "\"Revoker\" hinzufügen"
 
-#: Src/wptKeyEditDlgs.cpp:405 Src/wptKeyEditDlgs.cpp:1413
-#: Src/wptKeyEditDlgs.cpp:1466 Src/wptKeyEditDlgs.cpp:1508
-#: Src/wptKeyEditDlgs.cpp:1647 Src/wptKeyEditDlgs.cpp:1676
+#: Src/wptKeyEditDlgs.cpp:405 Src/wptKeyEditDlgs.cpp:1415
+#: Src/wptKeyEditDlgs.cpp:1468 Src/wptKeyEditDlgs.cpp:1510
+#: Src/wptKeyEditDlgs.cpp:1649 Src/wptKeyEditDlgs.cpp:1678
 msgid "Please select a user ID."
 msgstr "Bitte eine Benutzerkennung wählen."
 
@@ -2210,9 +2217,9 @@
 
 #: Src/wptKeyEditDlgs.cpp:703 Src/wptKeyEditDlgs.cpp:775
 #: Src/wptKeyEditDlgs.cpp:842 Src/wptKeyEditDlgs.cpp:855
-#: Src/wptKeyEditDlgs.cpp:896 Src/wptKeyEditDlgs.cpp:1271
-#: Src/wptKeyEditDlgs.cpp:1344 Src/wptKeyEditDlgs.cpp:1403
-#: Src/wptKeyManagerDlg.cpp:1368
+#: Src/wptKeyEditDlgs.cpp:896 Src/wptKeyEditDlgs.cpp:1273
+#: Src/wptKeyEditDlgs.cpp:1346 Src/wptKeyEditDlgs.cpp:1405
+#: Src/wptKeyManagerDlg.cpp:1378
 msgid "There is no secret key available!"
 msgstr "Kein geheimer Schlüssel vorhanden!"
 
@@ -2264,28 +2271,28 @@
 msgid "Expires"
 msgstr "Verfällt"
 
-#: Src/wptKeyEditDlgs.cpp:968 Src/wptKeyEditDlgs.cpp:1064
+#: Src/wptKeyEditDlgs.cpp:968 Src/wptKeyEditDlgs.cpp:1066
 msgid "Could not find key."
 msgstr "Konnte Schlüssel nicht finden"
 
-#: Src/wptKeyEditDlgs.cpp:973
+#: Src/wptKeyEditDlgs.cpp:975
 msgid "No subkey(s) found."
 msgstr "Kein(e) Unterschlüssel gefunden."
 
-#: Src/wptKeyEditDlgs.cpp:1055 Src/wptKeylist.cpp:545 Src/wptKeylist.cpp:555
-#: Src/wptKeyManagerDlg.cpp:868
+#: Src/wptKeyEditDlgs.cpp:1057 Src/wptKeylist.cpp:541 Src/wptKeylist.cpp:550
+#: Src/wptKeyManagerDlg.cpp:877
 msgid "Validity"
 msgstr "Gültigkeit"
 
-#: Src/wptKeyEditDlgs.cpp:1057
+#: Src/wptKeyEditDlgs.cpp:1059
 msgid "Email"
 msgstr "Email"
 
-#: Src/wptKeyEditDlgs.cpp:1070
+#: Src/wptKeyEditDlgs.cpp:1072
 msgid "No user ID(s) found."
 msgstr "Keine Benutzerkennung(en) gefunden."
 
-#: Src/wptKeyEditDlgs.cpp:1185
+#: Src/wptKeyEditDlgs.cpp:1187
 msgid ""
 "ADDUID   \t\tadd a user ID\r\n"
 "ADDPHOTO  \t\tadd a photo ID\r\n"
@@ -2320,19 +2327,19 @@
 "ENABLE    \t\tSchlüssel aktivieren\r\n"
 "SHOWPHOTO \t\tFoto ID anzeigen\r\n"
 
-#: Src/wptKeyEditDlgs.cpp:1206
+#: Src/wptKeyEditDlgs.cpp:1208
 msgid "Key Edit Help"
 msgstr "Hilfe zum Schlüssel bearbeiten"
 
-#: Src/wptKeyEditDlgs.cpp:1222
+#: Src/wptKeyEditDlgs.cpp:1224
 msgid "Primary key can not be deleted!"
 msgstr "Primärer Schlüssel kann nicht gelöscht werden!"
 
-#: Src/wptKeyEditDlgs.cpp:1230
+#: Src/wptKeyEditDlgs.cpp:1232
 msgid "Primary subkey can not be deleted!"
 msgstr "Primärer Unterschlüssel kann nicht gelöscht werden!"
 
-#: Src/wptKeyEditDlgs.cpp:1236
+#: Src/wptKeyEditDlgs.cpp:1238
 #, c-format
 msgid ""
 "\"Subkey %s.\"\n"
@@ -2349,34 +2356,34 @@
 "\n"
 "Möchten Sie diesen Unterschlüssel wirklich löschen?"
 
-#: Src/wptKeyEditDlgs.cpp:1248
+#: Src/wptKeyEditDlgs.cpp:1250
 msgid "Delete Subkey"
 msgstr "Unterschlüssel löschen"
 
-#: Src/wptKeyEditDlgs.cpp:1252
+#: Src/wptKeyEditDlgs.cpp:1254
 msgid "Subkey successfully deleted."
 msgstr "Unterschlüssel erfolgreich gelöscht."
 
-#: Src/wptKeyEditDlgs.cpp:1283
+#: Src/wptKeyEditDlgs.cpp:1285
 msgid ""
 "Key already expired.\n"
 "\n"
 "Do you want to change the expiration date?"
 msgstr ""
 
-#: Src/wptKeyEditDlgs.cpp:1292 Src/wptKeyEditDlgs.cpp:1295
+#: Src/wptKeyEditDlgs.cpp:1294 Src/wptKeyEditDlgs.cpp:1297
 msgid "Key Expiration Date"
 msgstr "Ablaufdatum"
 
-#: Src/wptKeyEditDlgs.cpp:1316
+#: Src/wptKeyEditDlgs.cpp:1318
 msgid "Expire Subkey"
 msgstr "Untschlüssel Ablauf"
 
-#: Src/wptKeyEditDlgs.cpp:1322
+#: Src/wptKeyEditDlgs.cpp:1324
 msgid "Subkey expire date successfully set."
 msgstr "Unterschlüsselablaufdatum erfolgreich hinzugefügt."
 
-#: Src/wptKeyEditDlgs.cpp:1353
+#: Src/wptKeyEditDlgs.cpp:1355
 msgid ""
 "No subkeys were found, if you want to revoke the\n"
 "whole key, please use the Key Manager command directly.\n"
@@ -2388,31 +2395,31 @@
 "\n"
 "Diese Funktion ist nur für das Widerrufen einzelner Unterschlüssel gedacht."
 
-#: Src/wptKeyEditDlgs.cpp:1362
+#: Src/wptKeyEditDlgs.cpp:1364
 msgid "Key already revoked."
 msgstr "Der Schlüssel ist bereits widerrufen worden!"
 
-#: Src/wptKeyEditDlgs.cpp:1379
+#: Src/wptKeyEditDlgs.cpp:1381
 msgid "Revoke Subkey"
 msgstr "Unterschlüssel widerrufen"
 
-#: Src/wptKeyEditDlgs.cpp:1383
+#: Src/wptKeyEditDlgs.cpp:1385
 msgid "Subkey successfully revoked."
 msgstr "Unterschlüssel erfolgreich widerrufen."
 
-#: Src/wptKeyEditDlgs.cpp:1403
+#: Src/wptKeyEditDlgs.cpp:1405
 msgid "Revoke user ID"
 msgstr "Benutzerkennung widerrufen"
 
-#: Src/wptKeyEditDlgs.cpp:1408
+#: Src/wptKeyEditDlgs.cpp:1410
 msgid "Key has only one user ID."
 msgstr "Schlüssel hat nur eine Benutzerkennung."
 
-#: Src/wptKeyEditDlgs.cpp:1419
+#: Src/wptKeyEditDlgs.cpp:1421
 msgid "This user ID has been already revoked."
 msgstr "Diese Benutzerkennung wurde bereits widerrufen."
 
-#: Src/wptKeyEditDlgs.cpp:1424
+#: Src/wptKeyEditDlgs.cpp:1426
 #, c-format
 msgid ""
 "user ID \"%s\".\n"
@@ -2422,39 +2429,39 @@
 "Benutzerkennung %s.\r\n"
 "Diese Benutzerkennung wirklich löschen?"
 
-#: Src/wptKeyEditDlgs.cpp:1445
+#: Src/wptKeyEditDlgs.cpp:1447
 msgid "Revoke Signature"
 msgstr "Signatur widerrufen"
 
-#: Src/wptKeyEditDlgs.cpp:1449
+#: Src/wptKeyEditDlgs.cpp:1451
 msgid "User ID successfully revoked"
 msgstr "Benutzerkennung erfolgreich widerrufen"
 
-#: Src/wptKeyEditDlgs.cpp:1526
+#: Src/wptKeyEditDlgs.cpp:1528
 msgid "Primary"
 msgstr "Primär"
 
-#: Src/wptKeyEditDlgs.cpp:1529
+#: Src/wptKeyEditDlgs.cpp:1531
 msgid "User ID successfully flagged"
 msgstr "Benutzerkennung erfolgreich gekennzeichnet"
 
-#: Src/wptKeyEditDlgs.cpp:1614
+#: Src/wptKeyEditDlgs.cpp:1616
 msgid "No preferences available."
 msgstr "Keine Präferenzen verfübar."
 
-#: Src/wptKeyEditDlgs.cpp:1620
+#: Src/wptKeyEditDlgs.cpp:1622
 msgid "MDC feature"
 msgstr "Unterstützt MDC"
 
-#: Src/wptKeyEditDlgs.cpp:1622 Src/wptKeyeditSetPrefDlg.cpp:116
+#: Src/wptKeyEditDlgs.cpp:1624 Src/wptKeyeditSetPrefDlg.cpp:116
 msgid "Key Preferences"
 msgstr "Schlüsseleinstellungen"
 
-#: Src/wptKeyEditDlgs.cpp:1672
+#: Src/wptKeyEditDlgs.cpp:1674
 msgid "Primary user ID can not be deleted!"
 msgstr "Primäre Benutzerkennung kann nicht gelöscht werden!"
 
-#: Src/wptKeyEditDlgs.cpp:1682
+#: Src/wptKeyEditDlgs.cpp:1684
 #, c-format
 msgid ""
 "user ID \"%s\".\n"
@@ -2464,32 +2471,32 @@
 "Benutzerkennung %s.\r\n"
 "Diese Benutzerkennung wirklich löschen?"
 
-#: Src/wptKeyEditDlgs.cpp:1699
+#: Src/wptKeyEditDlgs.cpp:1701
 msgid "Delete user ID"
 msgstr "Benutzerkennung löschen"
 
-#: Src/wptKeyEditDlgs.cpp:1703
+#: Src/wptKeyEditDlgs.cpp:1705
 msgid "User ID successfully deleted"
 msgstr "Benutzerkennung erfolgreich gelöscht"
 
-#: Src/wptKeyEditDlgs.cpp:1785
+#: Src/wptKeyEditDlgs.cpp:1788
 msgid "Could not set subkey window procedure."
 msgstr "Konnte \"subkey window procedure\" nicht setzen."
 
-#: Src/wptKeyEditDlgs.cpp:1795
+#: Src/wptKeyEditDlgs.cpp:1798
 msgid "Could not set user ID window procedure."
 msgstr "Konnte \"userID window procedure\" nicht setzen."
 
 # c:\oss\winpt-gpgme\src\wptKeyEditDlgs.cpp:1739
-#: Src/wptKeyEditDlgs.cpp:1803
+#: Src/wptKeyEditDlgs.cpp:1806
 msgid "Command>"
 msgstr "Kommando>"
 
-#: Src/wptKeyEditDlgs.cpp:1835
+#: Src/wptKeyEditDlgs.cpp:1838
 msgid "Please select a command."
 msgstr "Bitte einen Befehl auswählen."
 
-#: Src/wptKeyEditDlgs.cpp:1840
+#: Src/wptKeyEditDlgs.cpp:1843
 msgid "This command cannot be used with PGP 2 (v3) keys.\n"
 msgstr "Dieser Befehl kann mit PGP2 (v3) Schlüsseln nicht verwendet werden.\n"
 
@@ -2532,8 +2539,8 @@
 msgstr "Bitte wählen Sie einen Eintrag."
 
 #: Src/wptKeyEditOwnertrustDlg.cpp:88 Src/wptKeyEditOwnertrustDlg.cpp:95
-#: Src/wptKeyEditOwnertrustDlg.cpp:104 Src/wptKeyManagerDlg.cpp:925
-#: Src/wptKeyManagerDlg.cpp:1632 Src/wptKeyPropsDlg.cpp:286
+#: Src/wptKeyEditOwnertrustDlg.cpp:104 Src/wptKeyManagerDlg.cpp:934
+#: Src/wptKeyManagerDlg.cpp:1642 Src/wptKeyPropsDlg.cpp:286
 #: Src/wptOwnertrustDlg.cpp:97 Src/wptOwnertrustDlg.cpp:121
 #: Src/wptOwnertrustDlg.cpp:133
 msgid "Ownertrust"
@@ -2556,7 +2563,7 @@
 #: Src/wptKeygenDlg.cpp:421 Src/wptKeygenDlg.cpp:426 Src/wptKeygenDlg.cpp:432
 #: Src/wptKeygenDlg.cpp:439 Src/wptKeygenDlg.cpp:451 Src/wptKeygenDlg.cpp:458
 #: Src/wptKeygenDlg.cpp:493 Src/wptKeygenDlg.cpp:584
-#: Src/wptKeyManagerDlg.cpp:1491 Src/wptPassphraseDlg.cpp:94
+#: Src/wptKeyManagerDlg.cpp:1501 Src/wptPassphraseDlg.cpp:94
 msgid "Key Generation"
 msgstr "Schlüsselerzeugung"
 
@@ -2710,7 +2717,7 @@
 
 #: Src/wptKeygenDlg.cpp:543 Src/wptKeygenDlg.cpp:565 Src/wptKeygenDlg.cpp:570
 #: Src/wptKeygenDlg.cpp:576 Src/wptKeygenDlg.cpp:581 Src/wptKeygenDlg.cpp:605
-#: Src/wptKeyManagerDlg.cpp:1517
+#: Src/wptKeyManagerDlg.cpp:1527
 msgid "Key Generation Wizard"
 msgstr "Schlüsselerzeugungs-Assistent"
 
@@ -2770,59 +2777,50 @@
 msgid "No keys updated."
 msgstr "Kein(e) Schlüssel aktualisiert."
 
-#: Src/wptKeylist.cpp:241
+#: Src/wptKeylist.cpp:252
 msgid "Key Pair"
 msgstr "Schlüsselpaar"
 
-#: Src/wptKeylist.cpp:243
+#: Src/wptKeylist.cpp:254
 msgid "Key Pair (Card)"
 msgstr "Schlüsselpaar (Karte)"
 
-#: Src/wptKeylist.cpp:244
+#: Src/wptKeylist.cpp:255
 msgid "Public Key"
 msgstr "Öffentlicher Schlüssel"
 
-#: Src/wptKeylist.cpp:339 Src/wptKeylist.cpp:944
+#: Src/wptKeylist.cpp:352
 msgid "None"
 msgstr "Keine"
 
-#: Src/wptKeylist.cpp:343
+#: Src/wptKeylist.cpp:356
 msgid "Marginal"
 msgstr "Marginal"
 
 # c:\oss\winpt-gpgme\src\wptKeylist.cpp:492
-#: Src/wptKeylist.cpp:346 Src/wptKeylist.cpp:505
+#: Src/wptKeylist.cpp:359 Src/wptKeylist.cpp:519
 msgid "Full"
 msgstr "Voll"
 
-#: Src/wptKeylist.cpp:383 Src/wptKeyPropsDlg.cpp:160
+#: Src/wptKeylist.cpp:396 Src/wptKeyPropsDlg.cpp:160
 msgid "Disabled"
 msgstr "Inaktiv"
 
-#: Src/wptKeylist.cpp:544 Src/wptKeylist.cpp:554 Src/wptKeyManagerDlg.cpp:867
-#: Src/wptKeyManagerDlg.cpp:955
+#: Src/wptKeylist.cpp:540 Src/wptKeylist.cpp:549 Src/wptKeyManagerDlg.cpp:876
+#: Src/wptKeyManagerDlg.cpp:964
 msgid "Cipher"
 msgstr "Cipher"
 
-#: Src/wptKeylist.cpp:556 Src/wptKeyManagerDlg.cpp:869
+#: Src/wptKeylist.cpp:551 Src/wptKeyManagerDlg.cpp:878
 #: Src/wptVerifyList.cpp:100 Src/wptVerifyList.cpp:108
 msgid "Trust"
 msgstr "Vertrauen"
 
-#: Src/wptKeylist.cpp:722 Src/wptPassphraseCB.cpp:110
+#: Src/wptKeylist.cpp:720 Src/wptPassphraseCB.cpp:110
 #: Src/wptVerifyList.cpp:191
 msgid "Invalid User ID"
 msgstr "Ungültige Benutzerkennung"
 
-#: Src/wptKeylist.cpp:941 Src/wptKeyPropsDlg.cpp:66 Src/wptVerifyList.cpp:169
-#: Src/wptVerifyList.cpp:245
-msgid "Unknown"
-msgstr "Unbekannt"
-
-#: Src/wptKeylist.cpp:942
-msgid "Undefined"
-msgstr ""
-
 #: Src/wptKeylist.cpp:985
 #, c-format
 msgid ""
@@ -2838,11 +2836,11 @@
 "\n"
 "\"%s\" benutzen?"
 
-#: Src/wptKeylist.cpp:993 Src/wptKeylist.cpp:1069
+#: Src/wptKeylist.cpp:993 Src/wptKeylist.cpp:1056
 msgid "Recipients"
 msgstr "Empfänger"
 
-#: Src/wptKeylist.cpp:1068
+#: Src/wptKeylist.cpp:1057
 #, c-format
 msgid ""
 "KeyID %s.\n"
@@ -2851,11 +2849,11 @@
 "Schlüssel ID %s.\n"
 "Wollen Sie wirklich einen widerrufenen Schlüssel exportieren?"
 
-#: Src/wptKeylist.cpp:1170
+#: Src/wptKeylist.cpp:1159
 msgid "Secret Key List"
 msgstr "Liste der geheimen Schlüssel"
 
-#: Src/wptKeyManager.cpp:176
+#: Src/wptKeyManager.cpp:177
 msgid ""
 "This key has expired!\n"
 "Key check failed."
@@ -2863,7 +2861,7 @@
 "Dieser Schlüssel ist abgelaufen!\n"
 "Schlüsselüberprüfung fehlgeschlagen."
 
-#: Src/wptKeyManager.cpp:181
+#: Src/wptKeyManager.cpp:182
 msgid ""
 "This key has been revoked by its owner!\n"
 "Key check failed."
@@ -2871,34 +2869,29 @@
 "Dieser Schlüssel wurde vom Besitzer widerrufen!Schlüsselüberprüfung "
 "fehlgeschlagen."
 
-#: Src/wptKeyManager.cpp:231
+#: Src/wptKeyManager.cpp:232
 msgid "Key status changed."
 msgstr "Schlüsselstatus geändert"
 
-#: Src/wptKeyManager.cpp:352
+#: Src/wptKeyManager.cpp:353
 msgid "Only one secret key can be exported."
 msgstr "Nur der geheime Schlüssel kann exportiert werden."
 
-#: Src/wptKeyManager.cpp:363
+#: Src/wptKeyManager.cpp:364
 #, c-format
 msgid "Secret key successfully saved in '%s'."
 msgstr "Geheimer Schlüssel gespeichert in '%s'."
 
-#: Src/wptKeyManager.cpp:406
+#: Src/wptKeyManager.cpp:398
 #, c-format
 msgid "Key(s) successfully saved in '%s'."
 msgstr "Schlüssel erfolgreich in '%s' gespeichert."
 
-#: Src/wptKeyManager.cpp:412
-#, c-format
-msgid "Could not save data to '%s'."
-msgstr "Konnte Daten nicht in '%s' speichern."
-
-#: Src/wptKeyManager.cpp:463
+#: Src/wptKeyManager.cpp:451
 msgid "No valid OpenPGP keys found."
 msgstr "Keine gültigen OpenPGP-Schlüssel gefunden."
 
-#: Src/wptKeyManager.cpp:468
+#: Src/wptKeyManager.cpp:456
 msgid ""
 "The key you want to import is dash escacped.\n"
 "Do you want to extract the key?"
@@ -2906,38 +2899,38 @@
 "Der Import-Schlüssel ist beschädigt.\n"
 "Möchten Sie den Schlüssel extrahieren?"
 
-#: Src/wptKeyManager.cpp:474
+#: Src/wptKeyManager.cpp:462
 msgid "Cannot import dash escaped OpenPGP keys."
 msgstr "Kann keine beschädigten OpenPGP-Schlüssel importieren."
 
-#: Src/wptKeyManager.cpp:498 Src/wptKeyManager.cpp:509
-#: Src/wptKeyManager.cpp:523
+#: Src/wptKeyManager.cpp:486 Src/wptKeyManager.cpp:497
+#: Src/wptKeyManager.cpp:511
 msgid "Key Import HTTP"
 msgstr "Schlüssel Import HTTP"
 
 # c:\oss\winpt-gpgme\src\wptKeyManager.cpp:448
-#: Src/wptKeyManager.cpp:498
+#: Src/wptKeyManager.cpp:486
 #, c-format
 msgid "Invalid HTTP URL: %s"
 msgstr "Ungültige HTTP URL: %s"
 
-#: Src/wptKeyManager.cpp:549
+#: Src/wptKeyManager.cpp:537
 msgid "File Import"
 msgstr "Dateiimport"
 
-#: Src/wptKeyManager.cpp:560
+#: Src/wptKeyManager.cpp:548
 msgid "Could not read key-data from file."
 msgstr "Konnte Schlüsseldaten nicht aus Datei lesen."
 
-#: Src/wptKeyManager.cpp:629
+#: Src/wptKeyManager.cpp:616
 msgid "Do you really want to confirm each key?"
 msgstr "Wollen Sie wirklich jeden Schlüssel bestätigen?"
 
-#: Src/wptKeyManager.cpp:630
+#: Src/wptKeyManager.cpp:617
 msgid "Delete Confirmation"
 msgstr "Löschen Bestätigen"
 
-#: Src/wptKeyManager.cpp:652
+#: Src/wptKeyManager.cpp:641
 #, c-format
 msgid ""
 "Do you really want to delete this key?\n"
@@ -2949,7 +2942,7 @@
 "%s"
 
 # c:\oss\winpt-gpgme\src\wptKeyManager.cpp:605
-#: Src/wptKeyManager.cpp:662
+#: Src/wptKeyManager.cpp:651
 #, c-format
 msgid ""
 "Do you really want to delete this KEY PAIR?\n"
@@ -2966,7 +2959,7 @@
 "\n"
 "%s"
 
-#: Src/wptKeyManager.cpp:669
+#: Src/wptKeyManager.cpp:658
 msgid ""
 "The actual secret key is stored on a smartcard.\n"
 "Only the public key and the secret key \n"
@@ -2976,39 +2969,39 @@
 "Nur der öffentliche Schlüssel und der Zeiger auf den geheimen\n"
 "Schlüssel werden gelöscht.\n"
 
-#: Src/wptKeyManager.cpp:732
+#: Src/wptKeyManager.cpp:720
 #, c-format
 msgid "Do you really want to send '%s' to keyserver %s?"
 msgstr "Wollen Sie '%s' wirklich zum Schlüsselserver %s senden?"
 
-#: Src/wptKeyManager.cpp:755
+#: Src/wptKeyManager.cpp:743
 msgid "Please only select one key."
 msgstr "Bitte nur einen Schlüssel auswählen."
 
-#: Src/wptKeyManager.cpp:825
+#: Src/wptKeyManager.cpp:818
 msgid "Could not connect to keyserver, abort procedure."
 msgstr ""
 "Verbindung zum Keyserver fehlgeschlagen; Die Prozedur wird abgebrochen."
 
-#: Src/wptKeyManager.cpp:831
+#: Src/wptKeyManager.cpp:825
 msgid "Do you really want to refresh all keys in the keyring?"
 msgstr "Wirklich alle Schlüssel im Schlüsselbund neu laden?"
 
-#: Src/wptKeyManager.cpp:908
+#: Src/wptKeyManager.cpp:900
 msgid "Search"
 msgstr "Suchen"
 
-#: Src/wptKeyManager.cpp:908
+#: Src/wptKeyManager.cpp:900
 msgid "Search for:"
 msgstr "Suche nach:"
 
 # c:\oss\winpt-gpgme\src\wptKeyManager.cpp:896
-#: Src/wptKeyManager.cpp:919
+#: Src/wptKeyManager.cpp:911
 #, c-format
 msgid "String pattern \"%s\" not found."
 msgstr "Zeichenkette \"%s\" nicht gefunden."
 
-#: Src/wptKeyManagerDlg.cpp:429 Src/wptKeyManagerDlg.cpp:975
+#: Src/wptKeyManagerDlg.cpp:429 Src/wptKeyManagerDlg.cpp:984
 msgid "Paste Key from Clipboard"
 msgstr "Schlüssel aus Ablage einfügen"
 
@@ -3033,257 +3026,257 @@
 msgid "%d keys"
 msgstr "%d Schlüssel"
 
-#: Src/wptKeyManagerDlg.cpp:920
+#: Src/wptKeyManagerDlg.cpp:929
 msgid "Key"
 msgstr "Schlüssel"
 
-#: Src/wptKeyManagerDlg.cpp:921 Src/wptKeyManagerDlg.cpp:1073
+#: Src/wptKeyManagerDlg.cpp:930 Src/wptKeyManagerDlg.cpp:1082
 msgid "Groups"
 msgstr "Gruppen"
 
 # c:\oss\winpt-gpgme\src\wptFileManagerDlg.cpp:478
-#: Src/wptKeyManagerDlg.cpp:924
+#: Src/wptKeyManagerDlg.cpp:933
 msgid "Send Mail..."
 msgstr "eMail versenden..."
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:685
-#: Src/wptKeyManagerDlg.cpp:926
+#: Src/wptKeyManagerDlg.cpp:935
 msgid "&Copy\tCtrl+C"
 msgstr "&Kopieren\tCtrl+C"
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:686
-#: Src/wptKeyManagerDlg.cpp:927
+#: Src/wptKeyManagerDlg.cpp:936
 msgid "&Paste\tCtrl+V"
 msgstr "&Einfügen\tCtrl+V"
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:687
-#: Src/wptKeyManagerDlg.cpp:928
+#: Src/wptKeyManagerDlg.cpp:937
 msgid "Search...\tCtrl+F"
 msgstr "Suchen...\tCtrl+F"
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:688
-#: Src/wptKeyManagerDlg.cpp:929
+#: Src/wptKeyManagerDlg.cpp:938
 msgid "Select All\tCtrl+A"
 msgstr "Alles markieren\tCtrl+A"
 
-#: Src/wptKeyManagerDlg.cpp:930
+#: Src/wptKeyManagerDlg.cpp:939
 msgid "&Quit"
 msgstr "&Beenden"
 
-#: Src/wptKeyManagerDlg.cpp:932
+#: Src/wptKeyManagerDlg.cpp:941
 msgid "&Expert"
 msgstr "&Experte"
 
-#: Src/wptKeyManagerDlg.cpp:933
+#: Src/wptKeyManagerDlg.cpp:942
 msgid "&Normal"
 msgstr "&Normal"
 
-#: Src/wptKeyManagerDlg.cpp:936 Src/wptKeyManagerDlg.cpp:937
-#: Src/wptKeyManagerDlg.cpp:981
+#: Src/wptKeyManagerDlg.cpp:945 Src/wptKeyManagerDlg.cpp:946
+#: Src/wptKeyManagerDlg.cpp:990
 msgid "&Delete"
 msgstr "&Löschen"
 
-#: Src/wptKeyManagerDlg.cpp:938 Src/wptKeyManagerDlg.cpp:982
+#: Src/wptKeyManagerDlg.cpp:947 Src/wptKeyManagerDlg.cpp:991
 msgid "&Revoke Cert"
 msgstr "Widerruf Zertifikat"
 
-#: Src/wptKeyManagerDlg.cpp:939 Src/wptKeyManagerDlg.cpp:978
+#: Src/wptKeyManagerDlg.cpp:948 Src/wptKeyManagerDlg.cpp:987
 msgid "&List Signatures"
 msgstr "Signaturen anzeigen"
 
-#: Src/wptKeyManagerDlg.cpp:940 Src/wptKeyManagerDlg.cpp:1409
+#: Src/wptKeyManagerDlg.cpp:949 Src/wptKeyManagerDlg.cpp:1419
 #: Src/wptKeyTrustPathDlg.cpp:130
 msgid "List Trust Path"
 msgstr "Zeige Vertrauenspfad"
 
-#: Src/wptKeyManagerDlg.cpp:941
+#: Src/wptKeyManagerDlg.cpp:950
 msgid "&Export..."
 msgstr "&Exportieren..."
 
-#: Src/wptKeyManagerDlg.cpp:942
+#: Src/wptKeyManagerDlg.cpp:951
 msgid "&Import..."
 msgstr "&Importieren..."
 
-#: Src/wptKeyManagerDlg.cpp:943 Src/wptKeyManagerDlg.cpp:979
+#: Src/wptKeyManagerDlg.cpp:952 Src/wptKeyManagerDlg.cpp:988
 #: Src/wptKeysigDlg.cpp:356
 msgid "&Properties"
 msgstr "&Eigenschaften"
 
-#: Src/wptKeyManagerDlg.cpp:947
+#: Src/wptKeyManagerDlg.cpp:956
 msgid "E&xport Secret Key"
 msgstr "E&xportiere geheimen Schlüssel"
 
-#: Src/wptKeyManagerDlg.cpp:948
+#: Src/wptKeyManagerDlg.cpp:957
 msgid "Re&load Key Cache"
 msgstr "Erneuere Sch&lüsselcache"
 
-#: Src/wptKeyManagerDlg.cpp:949
+#: Src/wptKeyManagerDlg.cpp:958
 msgid "R&everify Signatures"
 msgstr "Signaturen erneut prüfen"
 
-#: Src/wptKeyManagerDlg.cpp:950
+#: Src/wptKeyManagerDlg.cpp:959
 msgid "Refresh &Keys (Keyserver)"
 msgstr "Vom Schlüsselserver aktualisieren"
 
-#: Src/wptKeyManagerDlg.cpp:951 Src/wptTextInputDlg.cpp:49
+#: Src/wptKeyManagerDlg.cpp:960 Src/wptTextInputDlg.cpp:49
 msgid "Info"
 msgstr "Über"
 
-#: Src/wptKeyManagerDlg.cpp:970
+#: Src/wptKeyManagerDlg.cpp:979
 msgid "Copy User ID to Clipboard"
 msgstr "Kopiere Benutzerkennung in Ablage"
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:886
-#: Src/wptKeyManagerDlg.cpp:971
+#: Src/wptKeyManagerDlg.cpp:980
 msgid "Copy Key ID to Clipboard"
 msgstr "Kopiere Schlüssel ID in Ablage"
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:887
-#: Src/wptKeyManagerDlg.cpp:972
+#: Src/wptKeyManagerDlg.cpp:981
 msgid "Copy Fingerprint to Clipboard"
 msgstr "Kopiere Fingerprint in Ablage"
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:888
-#: Src/wptKeyManagerDlg.cpp:973
+#: Src/wptKeyManagerDlg.cpp:982
 msgid "Copy Key Info to Clipboard"
 msgstr "Kopiere Schlüssel Info in Ablage"
 
-#: Src/wptKeyManagerDlg.cpp:974
+#: Src/wptKeyManagerDlg.cpp:983
 msgid "Copy Key to Clipboard"
 msgstr "Kopiere Schlüssel in Ablage"
 
-#: Src/wptKeyManagerDlg.cpp:976
+#: Src/wptKeyManagerDlg.cpp:985
 msgid "Refresh from Keyserver"
 msgstr "Vom Schlüsselserver aktualisieren"
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:884
-#: Src/wptKeyManagerDlg.cpp:977
+#: Src/wptKeyManagerDlg.cpp:986
 msgid "Set Implicit &Trust"
 msgstr "Setze impliziertes Vertrauen"
 
-#: Src/wptKeyManagerDlg.cpp:984
+#: Src/wptKeyManagerDlg.cpp:993
 msgid "&Enable"
 msgstr "&Aktivieren"
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:892
-#: Src/wptKeyManagerDlg.cpp:985
+#: Src/wptKeyManagerDlg.cpp:994
 msgid "&Disable"
 msgstr "&Deaktivieren"
 
-#: Src/wptKeyManagerDlg.cpp:986
+#: Src/wptKeyManagerDlg.cpp:995
 msgid "Re&fresh from Keyserver"
 msgstr "Vom Schlüsselserver aktualisieren"
 
-#: Src/wptKeyManagerDlg.cpp:987
+#: Src/wptKeyManagerDlg.cpp:996
 msgid "Set preferred Keyserver URL"
 msgstr "Setze bevorzugte Keyserver URL"
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:900
-#: Src/wptKeyManagerDlg.cpp:988
+#: Src/wptKeyManagerDlg.cpp:997
 msgid "Send Key to Mail Recipient"
 msgstr "Sende Schlüssel an Mailempfänger"
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:904
-#: Src/wptKeyManagerDlg.cpp:989
+#: Src/wptKeyManagerDlg.cpp:998
 msgid "Set as Default Key"
 msgstr "Setze als Default Key"
 
-#: Src/wptKeyManagerDlg.cpp:991
+#: Src/wptKeyManagerDlg.cpp:1000
 msgid "Key..."
 msgstr "Schlüssel..."
 
-#: Src/wptKeyManagerDlg.cpp:992
+#: Src/wptKeyManagerDlg.cpp:1001
 msgid "User ID..."
 msgstr "Benutzerkennung..."
 
-#: Src/wptKeyManagerDlg.cpp:993
+#: Src/wptKeyManagerDlg.cpp:1002
 msgid "Photo ID..."
 msgstr "Photo ID..."
 
-#: Src/wptKeyManagerDlg.cpp:994
+#: Src/wptKeyManagerDlg.cpp:1003
 msgid "Revoker..."
 msgstr "Revoker..."
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:706
-#: Src/wptKeyManagerDlg.cpp:997
+#: Src/wptKeyManagerDlg.cpp:1006
 msgid "Key Attributes"
 msgstr "Schlüsselattribute"
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:707
-#: Src/wptKeyManagerDlg.cpp:998
+#: Src/wptKeyManagerDlg.cpp:1007
 msgid "Add"
 msgstr "Hinzufügen"
 
-#: Src/wptKeyManagerDlg.cpp:999
+#: Src/wptKeyManagerDlg.cpp:1008
 msgid "Send to Keyserver"
 msgstr "Sende an Keyserver"
 
-#: Src/wptKeyManagerDlg.cpp:1059 Src/wptKeysigDlg.cpp:370
+#: Src/wptKeyManagerDlg.cpp:1068 Src/wptKeysigDlg.cpp:370
 msgid "Could not set keylist window procedure."
 msgstr "Konnte \"keylist window procedure\" nicht setzen."
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:842
-#: Src/wptKeyManagerDlg.cpp:1172
+#: Src/wptKeyManagerDlg.cpp:1181
 msgid "Delete key from keyring"
 msgstr "Schlüssel aus Keyring löschen"
 
-#: Src/wptKeyManagerDlg.cpp:1176
+#: Src/wptKeyManagerDlg.cpp:1185
 msgid "Show key properties"
 msgstr "Schlüsseleigenschaften anzeigen"
 
-#: Src/wptKeyManagerDlg.cpp:1180
+#: Src/wptKeyManagerDlg.cpp:1189
 msgid "Sign key"
 msgstr "Signiere Schlüssel"
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:854
-#: Src/wptKeyManagerDlg.cpp:1184
+#: Src/wptKeyManagerDlg.cpp:1193
 msgid "Import key to keyring"
 msgstr "In Schlüsselbund importieren"
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:858
-#: Src/wptKeyManagerDlg.cpp:1188
+#: Src/wptKeyManagerDlg.cpp:1197
 msgid "Export key to a file"
 msgstr "Schlüssel in Datei exportieren"
 
 # c:\oss\winpt-gpgme\src\wptKeyManagerDlg.cpp:499
-#: Src/wptKeyManagerDlg.cpp:1307
+#: Src/wptKeyManagerDlg.cpp:1317
 msgid "New"
 msgstr "Neu"
 
-#: Src/wptKeyManagerDlg.cpp:1314
+#: Src/wptKeyManagerDlg.cpp:1324
 msgid "Could not access public keyring"
 msgstr "Konnte nicht auf öffentlichen Schlüsselbund zugreifen"
 
-#: Src/wptKeyManagerDlg.cpp:1354 Src/wptKeysignDlg.cpp:230
+#: Src/wptKeyManagerDlg.cpp:1364 Src/wptKeysignDlg.cpp:230
 #: Src/wptKeysignDlg.cpp:249 Src/wptKeysignDlg.cpp:326
 #: Src/wptKeysignDlg.cpp:343 Src/wptKeysignDlg.cpp:348
 msgid "Key Signing"
 msgstr "Schlüsselsignierung"
 
-#: Src/wptKeyManagerDlg.cpp:1378
+#: Src/wptKeyManagerDlg.cpp:1388
 msgid "Key already revoked!"
 msgstr "Schlüssel ist bereits widerrufen!"
 
-#: Src/wptKeyManagerDlg.cpp:1390 Src/wptKeyRevokeDlg.cpp:72
+#: Src/wptKeyManagerDlg.cpp:1400 Src/wptKeyRevokeDlg.cpp:72
 #: Src/wptKeyRevokeDlg.cpp:100 Src/wptKeyRevokeDlg.cpp:138
 #: Src/wptKeyRevokeDlg.cpp:143 Src/wptKeyRevokeDlg.cpp:151
 #: Src/wptKeyRevokeDlg.cpp:167 Src/wptKeyRevokeDlg.cpp:173
 msgid "Key Revocation Cert"
 msgstr "Schlüsselwiderruf Zertifikat"
 
-#: Src/wptKeyManagerDlg.cpp:1400
+#: Src/wptKeyManagerDlg.cpp:1410
 msgid "It does not make any sense with a key pair!"
 msgstr "Diese Aktion macht keinen Sinn mit einem Schlüsselpaar!"
 
-#: Src/wptKeyManagerDlg.cpp:1426
+#: Src/wptKeyManagerDlg.cpp:1436
 msgid "Key Signature List"
 msgstr "Schlüssel-Signatur-Liste"
 
-#: Src/wptKeyManagerDlg.cpp:1445 Src/wptKeyPropsDlg.cpp:282
+#: Src/wptKeyManagerDlg.cpp:1455 Src/wptKeyPropsDlg.cpp:282
 msgid "Key Properties"
 msgstr "Schlüsseleigenschaften"
 
-#: Src/wptKeyManagerDlg.cpp:1460
+#: Src/wptKeyManagerDlg.cpp:1470
 msgid ""
 "This is only useful when the keyring has been modified (sign a key...).\n"
 "Do you really want to reload the keycache?"
@@ -3292,31 +3285,31 @@
 "Signierung etc.)\n"
 "Möchten Sie den Zwischenspeicher reinitialisieren?"
 
-#: Src/wptKeyManagerDlg.cpp:1501
+#: Src/wptKeyManagerDlg.cpp:1511
 msgid "Smart Card support is not available."
 msgstr "SmartCard-Unterstützung ist nicht verfügbar."
 
-#: Src/wptKeyManagerDlg.cpp:1528 Src/wptKeyserverDlg.cpp:439
+#: Src/wptKeyManagerDlg.cpp:1538 Src/wptKeyserverDlg.cpp:440
 msgid "Keyserver Access"
 msgstr "Schlüsselserver-Zugriff"
 
-#: Src/wptKeyManagerDlg.cpp:1544
+#: Src/wptKeyManagerDlg.cpp:1554
 msgid "GnuPG Options"
 msgstr "GnuPG Optionen"
 
-#: Src/wptKeyManagerDlg.cpp:1549
+#: Src/wptKeyManagerDlg.cpp:1559
 msgid "Choose Name of the Key File"
 msgstr "Den Namen der Schlüsseldatei wählen"
 
-#: Src/wptKeyManagerDlg.cpp:1587
+#: Src/wptKeyManagerDlg.cpp:1597
 msgid "There is no corresponding secret key for this key."
 msgstr "Für diesen Schlüssel ist kein geheimer Schlüssel vorhanden."
 
-#: Src/wptKeyManagerDlg.cpp:1592
+#: Src/wptKeyManagerDlg.cpp:1602
 msgid "You can only export one secret key."
 msgstr "Sie können nur einen geheimen Schlüssel exportieren."
 
-#: Src/wptKeyManagerDlg.cpp:1597
+#: Src/wptKeyManagerDlg.cpp:1607
 msgid ""
 "This operation will export your *SECRET* key!\n"
 "\n"
@@ -3334,14 +3327,19 @@
 "\n"
 "Wirklich den Schlüssel exportieren?"
 
-#: Src/wptKeyManagerDlg.cpp:1602
+#: Src/wptKeyManagerDlg.cpp:1612
 msgid "WARNING"
 msgstr "WARNUNG"
 
-#: Src/wptKeyManagerDlg.cpp:1678
+#: Src/wptKeyManagerDlg.cpp:1688
 msgid "No key was selected, select all by default."
 msgstr "Kein Schlüssel ausgewählt, es wurden alle ausgewählt."
 
+#: Src/wptKeyPropsDlg.cpp:66 Src/wptVerifyList.cpp:169
+#: Src/wptVerifyList.cpp:245
+msgid "Unknown"
+msgstr "Unbekannt"
+
 #: Src/wptKeyPropsDlg.cpp:207
 #, c-format
 msgid "Card-Type: %s\r\n"
@@ -3589,94 +3587,94 @@
 msgid "This is not a valid OpenPGP key."
 msgstr "Dies ist kein gültiger OpenPGP Schlüssel."
 
-#: Src/wptKeyserverDlg.cpp:356
+#: Src/wptKeyserverDlg.cpp:357
 msgid "Please select one of the servers."
 msgstr "Bitte einen der Server auswählen."
 
-#: Src/wptKeyserverDlg.cpp:361
+#: Src/wptKeyserverDlg.cpp:362
 msgid "Only HTTP keyserver can be used."
 msgstr "Nur HTTP-Schlüsselserver können benutzt werden."
 
-#: Src/wptKeyserverDlg.cpp:381
+#: Src/wptKeyserverDlg.cpp:382
 msgid "DNS Name"
 msgstr "DNS Name"
 
-#: Src/wptKeyserverDlg.cpp:382
+#: Src/wptKeyserverDlg.cpp:383
 msgid "Protocol"
 msgstr "Protokoll"
 
-#: Src/wptKeyserverDlg.cpp:383
+#: Src/wptKeyserverDlg.cpp:384
 msgid "Default"
 msgstr "Standard"
 
-#: Src/wptKeyserverDlg.cpp:384
+#: Src/wptKeyserverDlg.cpp:385
 msgid "Port"
 msgstr "Port"
 
-#: Src/wptKeyserverDlg.cpp:440 Src/wptKeyserverSearchDlg.cpp:62
+#: Src/wptKeyserverDlg.cpp:441 Src/wptKeyserverSearchDlg.cpp:62
 msgid "&Receive"
 msgstr "&Empfangen"
 
-#: Src/wptKeyserverDlg.cpp:442
+#: Src/wptKeyserverDlg.cpp:443
 msgid "Send key (default is receiving)"
 msgstr "Schlüssel senden (sonst empfangen)"
 
-#: Src/wptKeyserverDlg.cpp:444
+#: Src/wptKeyserverDlg.cpp:445
 msgid "Please enter the key ID or email address you search for"
 msgstr "Bitte die key ID oder Email Adresse angeben die gesucht wird"
 
-#: Src/wptKeyserverDlg.cpp:445
+#: Src/wptKeyserverDlg.cpp:446
 msgid "&Search"
 msgstr "&Suchen"
 
-#: Src/wptKeyserverDlg.cpp:446
+#: Src/wptKeyserverDlg.cpp:447
 msgid "C&hange"
 msgstr "Ä&ndern"
 
-#: Src/wptKeyserverDlg.cpp:447
+#: Src/wptKeyserverDlg.cpp:448
 msgid "Set &default"
 msgstr "Als &Standard"
 
-#: Src/wptKeyserverDlg.cpp:482 Src/wptProxySettingsDlg.cpp:66
+#: Src/wptKeyserverDlg.cpp:483 Src/wptProxySettingsDlg.cpp:66
 #: Src/wptProxySettingsDlg.cpp:75 Src/wptProxySettingsDlg.cpp:82
 #: Src/wptProxySettingsDlg.cpp:87 Src/wptProxySettingsDlg.cpp:92
 #: Src/wptProxySettingsDlg.cpp:138 Src/wptProxySettingsDlg.cpp:169
 msgid "Proxy Settings"
 msgstr "Proxy Einstellungen"
 
-#: Src/wptKeyserverDlg.cpp:490 Src/wptKeyserverDlg.cpp:519
+#: Src/wptKeyserverDlg.cpp:491 Src/wptKeyserverDlg.cpp:520
 msgid "Please select one of the keyservers."
 msgstr "Bitte einen Keyserver auswählen."
 
-#: Src/wptKeyserverDlg.cpp:497
+#: Src/wptKeyserverDlg.cpp:498
 msgid "This is not implemented yet!"
 msgstr "Das ist (leider) noch nicht implementiert!"
 
-#: Src/wptKeyserverDlg.cpp:503 Src/wptKeyserverDlg.cpp:532
+#: Src/wptKeyserverDlg.cpp:504 Src/wptKeyserverDlg.cpp:533
 msgid "Please enter the search pattern."
 msgstr "Bitte Suchmuster eingeben."
 
-#: Src/wptKeyserverDlg.cpp:537
+#: Src/wptKeyserverDlg.cpp:538
 msgid "Only keyids are allowed."
 msgstr "Nur Schlüssel-IDs zulässig"
 
-#: Src/wptKeyserverDlg.cpp:537
+#: Src/wptKeyserverDlg.cpp:538
 msgid "LDAP Keyserver"
 msgstr "LDAP-Schlüsselserver"
 
-#: Src/wptKeyserverDlg.cpp:542
+#: Src/wptKeyserverDlg.cpp:543
 msgid "Only enter the name of the user."
 msgstr "Nur den Namen des Benutzers eingeben."
 
-#: Src/wptKeyserverDlg.cpp:543
+#: Src/wptKeyserverDlg.cpp:544
 msgid "FINGER Keyserver"
 msgstr "FINGER Schlüsselserver"
 
-#: Src/wptKeyserverDlg.cpp:548
+#: Src/wptKeyserverDlg.cpp:549
 msgid "Only email addresses or keyids are allowed."
 msgstr "Es sind nur E-Mail-Adressen oder Schlüssel-IDs zulässig"
 
-#: Src/wptKeyserverDlg.cpp:549
+#: Src/wptKeyserverDlg.cpp:550
 msgid "HKP Keyserver"
 msgstr "HKP Schlüsselserver"
 
@@ -4025,9 +4023,9 @@
 msgstr "Datei auswählen zum Speichern der Prüfsummen"
 
 #: Src/wptMDSumDlg.cpp:149
-#, fuzzy, c-format
+#, c-format
 msgid "Checksums successfully saved in '%s'"
-msgstr "Schlüssel erfolgreich in '%s' gespeichert."
+msgstr "Checksummen erfolgreich in '%s' gespeichert."
 
 #: Src/wptOwnertrustDlg.cpp:100
 msgid ""
@@ -4375,7 +4373,7 @@
 msgid "Expiration"
 msgstr "Ablauf"
 
-#: Src/wptSigList.cpp:137
+#: Src/wptSigList.cpp:139
 msgid "  user ID not found"
 msgstr "  Benutzerkennung nicht gefunden"
 
@@ -4399,6 +4397,12 @@
 msgid "Signed"
 msgstr "Signiert"
 
+#~ msgid "&Specify a new GnuPG home directory"
+#~ msgstr "Bitte neues GnuPG-HOME-Verzeichnis &eingeben."
+
+#~ msgid "Could not save data to '%s'."
+#~ msgstr "Konnte Daten nicht in '%s' speichern."
+
 #~ msgid "&Repeat passphrase"
 #~ msgstr "Passwort (&nochmal)"
 

Modified: trunk/Src/ChangeLog
===================================================================
--- trunk/Src/ChangeLog	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/ChangeLog	2006-01-09 09:15:29 UTC (rev 133)
@@ -1,3 +1,57 @@
+2006-01-07  Timo Schulz  <ts at g10code.com>
+
+	* wptKeyManager.cpp (km_refresh_from_keyserver): Summarize
+	import status if just one key was selected.
+
+2006-01-04  Timo Schulz  <ts at g10code.com>
+
+	* wptGPGMEWrapper.c (setChangeVersion): New.
+	(exportToBuffer, exportToFile, exportToClipboard): New.
+	(setArmor, getArmor): New.
+	* wptKeylist.cpp (get_key_expire_date): Return locale specific
+	date.
+	(keylist_get_recipients): Do not fetch the key again.
+	(keylist_enum_recipients): Likewise.
+	* wptGPG.cpp (create_empty_keyring): New.
+	(get_gnupg_keyring): Fixed 'strict' logic.
+	* wptKeyManagerDlg.cpp (update_ui_items): Disable some buttons
+	when no secret keys are available.
+	* wptKeyManager.cpp (km_send_to_mail_recipient): Release key data
+	before the MAPI call is made.
+	* WinPT.cpp (check_for_empty_keyrings): New.
+	
+2006-01-03  Timo Schulz  <ts at g10code.com>
+
+	* pubkey.ico, keypair.ico: New.
+	* wptListview.cpp (listview_add_item_image): New.
+	(listview_set_image_list): New.
+	* wptSigList.cpp (siglist_add_key): Correct order of the sigs.
+	* wptKeyProps.cpp (keyprops_load_photo): Adjusted for new
+	JPEG data.
+	* wptKeyManagerDlg.cpp (keymanager_dlg_proc): Do not allow to
+	add items to revoked keys.
+	* wptKeyManager.cpp (km_delete_keys): Do not use uninitialized
+	keyid buffer. This fixes a segv.
+	* wptKeyserver.cpp (spawn_application): New.
+	(ldap_recv_key): Support recent protocols and several cleanups.
+	* wptKeylist.cpp (do_addkey): Set image which depends on the
+	key type.
+	(keylist_enum_recipients): Cleanups.
+	(keylist_get_keyflags): Rewritten.
+	* wptKeyCache.cpp (free_attr_list): New.
+	(parse_attr_list): New.
+	(parse_attr_data): New.
+	(keycache_update_photo): New.
+	(keycache_update_photos): New.
+	(gpg_keycache_update_key): Automatically reload photos if needed.
+	* wptGPGUtil.cpp (create_process): New param @err. Change all
+	callers.
+	(map_tmpfile): New param @nread. Change all callers.
+	(gpg_get_photoid_data): New.
+	* wptKeyEditDlgs.cpp (keyedit_main_dlg_proc): Do not allow to
+	add items to revoked keys.
+	(subkey_init_list): Store gpgme key object.
+	
 2005-12-29  Timo Schulz  <ts at g10code.com>
  
         * wptKeygenDlg.cpp (keygen_dlg_proc): Request passphrase dynamically.

Modified: trunk/Src/Makefile.am
===================================================================
--- trunk/Src/Makefile.am	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/Makefile.am	2006-01-09 09:15:29 UTC (rev 133)
@@ -27,7 +27,9 @@
 	Sign.ico \
 	WinPT-en.rc \
 	winpt2.ico \
-	winpt_km.bmp
+	winpt_km.bmp \
+	pubkey.ico \
+	keypair.ico
 
 dialog_files = \
 	wptAboutDlgs.cpp \
@@ -115,7 +117,8 @@
         wptUtil.cpp \
 	wptClipboard.cpp \
 	wptGPGMEData.cpp \
-	wptGroupManager.cpp
+	wptGroupManager.cpp \
+	wptGPGMEWrapper.cpp
 
 
 WinPT_SOURCES = $(resource_files) $(dialog_files) $(code_files)

Modified: trunk/Src/WinPT-en.rc
===================================================================
--- trunk/Src/WinPT-en.rc	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/WinPT-en.rc	2006-01-09 09:15:29 UTC (rev 133)
@@ -272,6 +272,8 @@
 // Icon with lowest ID value placed first to ensure application icon
 // remains consistent on all systems.
 IDI_WINPT               ICON    DISCARDABLE     "winpt2.ico"
+IDI_PUBKEY              ICON    DISCARDABLE     "pubkey.ico"
+IDI_KEYPAIR             ICON    DISCARDABLE     "keypair.ico"
 
 /////////////////////////////////////////////////////////////////////////////
 //
@@ -290,7 +292,7 @@
     LTEXT           "Windows Privacy Tray",IDC_STATIC,45,11,72,8
     LTEXT           "Version 0.1.1 (2001-01-29)",IDC_WINPT_VERSION,45,22,129,
                     8
-    LTEXT           "Copyright (C) 2005 Timo Schulz <twoaday at freakmail.de>",
+    LTEXT           "Copyright (C) 2006 Timo Schulz <twoaday at freakmail.de>",
                     IDC_STATIC,8,42,182,8
     LTEXT           "WinPT 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 (at your option) any later version.",
                     IDC_ABOUT_GPL1,10,141,223,36
@@ -488,22 +490,22 @@
 CAPTION "Key Signing"
 FONT 8, "MS Sans Serif"
 BEGIN
-    LTEXT           "Infos",IDC_KEYSIGN_INFOS,5,7,268,70
+    LTEXT           "Infos",IDC_KEYSIGN_INFOS,5,7,268,66
     CONTROL         "Sign &local only (non exportable signature)",
                     IDC_KEYSIGN_LOCAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
-                    5,82,170,10
+                    5,83,170,10
     CONTROL         "Signature &expires on",IDC_KEYSIGN_EXPSIG,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,5,95,83,10
+                    BS_AUTOCHECKBOX | WS_TABSTOP,5,96,83,10
     CONTROL         "DateTimePicker1",IDC_KEYSIGN_EXPIRES,"SysDateTimePick32",
                     DTS_RIGHTALIGN | WS_TABSTOP,89,94,69,14
     CONTROL         "&Ask for certification level",IDC_KEYSIGN_ASKLEVEL,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,108,112,10
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,109,112,10
     CONTROL         "Sign &non-revocably",IDC_KEYSIGN_NREV,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,5,121,100,10
-    COMBOBOX        IDC_KEYSIGN_KEYLIST,5,135,192,49,CBS_DROPDOWNLIST | 
+                    BS_AUTOCHECKBOX | WS_TABSTOP,5,122,100,10
+    COMBOBOX        IDC_KEYSIGN_KEYLIST,5,137,192,49,CBS_DROPDOWNLIST | 
                     WS_VSCROLL | WS_TABSTOP
-    LTEXT           "Passphrase",IDC_KEYSIGN_PWDINF,5,153,44,8
-    EDITTEXT        IDC_KEYSIGN_PASSPHRASE,53,151,144,13,ES_PASSWORD | 
+    LTEXT           "Passphrase",IDC_KEYSIGN_PWDINF,5,155,44,8
+    EDITTEXT        IDC_KEYSIGN_PASSPHRASE,53,153,144,13,ES_PASSWORD | 
                     ES_AUTOHSCROLL
     PUSHBUTTON      "&Show photo",IDC_KEYSIGN_SHOWIMG,2,175,67,14,
                     WS_DISABLED
@@ -986,9 +988,9 @@
     GROUPBOX        "",IDC_STATIC,8,81,138,38
 END
 
-IDD_WINPT_FIRST DIALOG DISCARDABLE  0, 0, 195, 63
+IDD_WINPT_FIRST DIALOG DISCARDABLE  0, 0, 195, 77
 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
-CAPTION "WinPT - First start"
+CAPTION "WinPT First Start"
 FONT 8, "MS Sans Serif"
 BEGIN
     GROUPBOX        "",IDC_STATIC,6,2,185,34
@@ -996,8 +998,8 @@
                     BS_AUTORADIOBUTTON,8,9,149,10
     CONTROL         "&Copy GnuPG keyrings from another location",
                     IDC_FIRST_IMPORT,"Button",BS_AUTORADIOBUTTON,8,22,176,10
-    DEFPUSHBUTTON   "&OK",IDOK,90,43,50,14
-    PUSHBUTTON      "&Cancel",IDCANCEL,142,43,50,14
+    DEFPUSHBUTTON   "&OK",IDOK,90,57,50,14
+    PUSHBUTTON      "&Cancel",IDCANCEL,142,57,50,14
 END
 
 IDD_WINPT_SIGCLASS DIALOG DISCARDABLE  0, 0, 238, 98
@@ -1270,7 +1272,7 @@
     EDITTEXT        IDC_CKEYGEN_EMAIL,73,50,110,13,ES_AUTOHSCROLL
     LTEXT           "&Expire date",IDC_CKEYGEN_EXPDATEINF,7,69,47,8
     CONTROL         "&Never",IDC_CKEYGEN_NEVER,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,73,68,35,10
+                    WS_TABSTOP,73,68,45,10
     CONTROL         "DateTimePicker1",IDC_CKEYGEN_VALID,"SysDateTimePick32",
                     DTS_RIGHTALIGN | WS_TABSTOP,119,67,63,12
     LTEXT           "Off-card passphrase",IDC_CKEYGEN_PWDINF,7,83,64,8
@@ -1278,10 +1280,10 @@
                     ES_AUTOHSCROLL
     GROUPBOX        "",IDC_STATIC,5,98,178,32
     CONTROL         "Overwrite old keys on the card",IDC_CKEYGEN_REPLACE,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,106,112,10
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,106,160,10
     CONTROL         "Make off-card backup of encryption key",
                     IDC_CKEYGEN_BACKUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
-                    9,118,142,10
+                    9,118,165,10
     DEFPUSHBUTTON   "&Start",IDOK,78,141,50,14
     PUSHBUTTON      "&Cancel",IDCANCEL,131,141,50,14
 END
@@ -1732,7 +1734,7 @@
         LEFTMARGIN, 2
         RIGHTMARGIN, 192
         TOPMARGIN, 2
-        BOTTOMMARGIN, 58
+        BOTTOMMARGIN, 72
     END
 
     IDD_WINPT_SIGCLASS, DIALOG
@@ -1929,8 +1931,8 @@
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,11,4,0
- PRODUCTVERSION 0,11,4,0
+ FILEVERSION 0,11,5,0
+ PRODUCTVERSION 0,11,5,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -1948,14 +1950,14 @@
             VALUE "Comments", "This is free software under the terms of the GNU GPL v2\0"
             VALUE "CompanyName", "\0"
             VALUE "FileDescription", "Windows Privacy Tray (WinPT)\0"
-            VALUE "FileVersion", "0.11.4\0"
+            VALUE "FileVersion", "0.11.5\0"
             VALUE "InternalName", "WinPT\0"
             VALUE "LegalCopyright", " Copyright (C) 2005 Timo Schulz\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "WinPT.exe\0"
             VALUE "PrivateBuild", "\0"
             VALUE "ProductName", "Windows Privacy Tray\0"
-            VALUE "ProductVersion", "0.11.4\0"
+            VALUE "ProductVersion", "0.11.5\0"
             VALUE "SpecialBuild", "\0"
         END
     END

Modified: trunk/Src/WinPT.cpp
===================================================================
--- trunk/Src/WinPT.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/WinPT.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -1,5 +1,5 @@
 /* WinPT.cpp - Windows Privacy Tray (WinPT)
- *	Copyright (C) 2000-2005 Timo Schulz
+ *	Copyright (C) 2000-2006 Timo Schulz
  *
  * This file is part of WinPT.
  *
@@ -156,6 +156,7 @@
     return 0;
 }
 
+
 /* check if the default key from the gpg.conf file is available in the
    keyring. if not, bail out because encryption won't work properly then. */
 static int
@@ -262,6 +263,28 @@
 }
 
 
+/* Check if both keyrings are empty. This indicates that
+   WinPT should offer to generate a key pair. */
+static bool
+check_for_empty_keyrings (bool pub_only)
+{
+    char *p;
+    int n = 0;
+
+    p = get_gnupg_keyring (1, 0);
+    if (file_exist_check (p) == 0 && get_file_size (p) == 0)
+	n++;
+    free_if_alloc (p);
+    if (pub_only)
+	return n == 1? true : false;
+    p = get_gnupg_keyring (0, 0);
+    if (file_exist_check (p) == 0 && get_file_size (p) == 0)
+	n++;
+    free_if_alloc (p);
+    return n==2? true : false;
+}
+
+
 /* Enable the mobility mode. */
 static void
 enable_mobile_mode (void)
@@ -445,6 +468,8 @@
 	    return 0;
 	}
     }
+    if (check_for_empty_keyrings (false))
+	first_start = 1;
 
     if (!first_start) {
 	rc = gpg_check_permissions (1);
@@ -539,13 +564,10 @@
     }
     
     if (start_gpgprefs) {
-	char *ring;
 	DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_GPGPREFS, hwnd,
 			gpgprefs_dlg_proc, 0);
-	ring = get_gnupg_keyring (0, !NO_STRICT);
-	if (gnupg_access_keyring (0) == -1 && get_file_size (ring) == 0)
-	    first_start = 1; /* The keyring is empty! */
-	free_if_alloc (ring);
+	if (check_for_empty_keyrings (true))
+	    first_start = 1; /* The public keyring is empty! */
     }
 
     if (first_start) {
@@ -576,7 +598,7 @@
 	    }
 	    break;
 
-	case -1:
+	case -1: /* Cancel/Abort. */
 	    DestroyWindow (hwnd);
 	    free_gnupg_table ();
 	    return 0;

Added: trunk/Src/keypair.ico
===================================================================
(Binary files differ)


Property changes on: trunk/Src/keypair.ico
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/Src/pubkey.ico
===================================================================
(Binary files differ)


Property changes on: trunk/Src/pubkey.ico
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: trunk/Src/resource.h
===================================================================
--- trunk/Src/resource.h	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/resource.h	2006-01-09 09:15:29 UTC (rev 133)
@@ -151,6 +151,8 @@
 #define IDR_WINPT_CLIPEDIT              226
 #define IDD_FILE_PREFS                  227
 #define IDD_WINPT_KEYEDIT_SHOWPREF      228
+#define IDI_PUBKEY                      230
+#define IDI_KEYPAIR                     231
 #define IDC_CLIPEDIT_SEND               1000
 #define IDC_CLIPEDIT_CLEAR              1001
 #define IDC_CLIPEDIT_CLIPTEXT           1002
@@ -786,7 +788,7 @@
 // 
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        230
+#define _APS_NEXT_RESOURCE_VALUE        232
 #define _APS_NEXT_COMMAND_VALUE         40182
 #define _APS_NEXT_CONTROL_VALUE         1502
 #define _APS_NEXT_SYMED_VALUE           101

Modified: trunk/Src/wptCardDlg.cpp
===================================================================
--- trunk/Src/wptCardDlg.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptCardDlg.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -440,7 +440,7 @@
     else
 	s = _("Please enter the PIN");
     cb->which = which;
-    free_if_alloc (cb->info_text);
+    free_if_alloc( cb->info_text );
     if( card ) {
 	fmt = _("%s\nName: %s %s\nSerial-No: %s\n");
 	n1 = card->givenname;
@@ -583,7 +583,7 @@
     char pass[128];
     int card_flags = GPG_CARDFLAG_NONE;
     int expires=0, valid=0;
-    size_t n;
+    DWORD n;
 
     switch (msg) {
     case WM_INITDIALOG:
@@ -603,6 +603,8 @@
 	SetDlgItemText (dlg, IDC_CKEYGEN_PWDINF, _("Off-card passphrase"));
 	SetDlgItemText (dlg, IDC_CKEYGEN_NEVER, _("&Never"));
 	SetDlgItemText (dlg, IDC_CKEYGEN_MAILINF, _("Email &address"));
+	SetDlgItemText (dlg, IDC_CKEYGEN_REPLACE, _("Overwrite old keys on the card"));
+	SetDlgItemText (dlg, IDC_CKEYGEN_BACKUP, _("Make off-card backup of encryption key"));
 	SetWindowText (dlg, _("Card Key Generation"));
 	return FALSE;
 
@@ -765,8 +767,8 @@
     gpgme_error_t err;
     GpgCardEdit *ce;    
     char pold[128], pnew[128], pnew2[128];
-    int which=0;
-    size_t n;
+    int which = 0;
+    DWORD n;
 
     switch( msg ) {
     case WM_INITDIALOG:
@@ -792,7 +794,7 @@
 	    SendMessage (hwnd, EM_SETPASSWORDCHAR, hide? '*' : 0, 0);
 	    SetFocus (hwnd);
 	}
-	switch( LOWORD( wparam ) ) {
+	switch (LOWORD (wparam)) {
 	case IDOK:
 	    if (IsDlgButtonChecked (dlg, IDC_CHPIN_ISADMIN))
 		which = CARD_ADMIN_PIN;
@@ -812,6 +814,8 @@
 	    GetDlgItemText (dlg, IDC_CHPIN_NEWPIN, pnew, sizeof (pnew)-1);
 	    GetDlgItemText (dlg, IDC_CHPIN_NEWPIN2, pnew2, sizeof (pnew2)-1);
 	    if (strcmp (pnew, pnew2)) {
+		wipememory (pnew2, sizeof (pnew2));
+		wipememory (pnew, sizeof (pnew));
 		msg_box (dlg, _("Passphrases do not match. Please try again."), 
 			 _("Card Edit"), MB_ERR);
 		return TRUE;

Modified: trunk/Src/wptErrors.cpp
===================================================================
--- trunk/Src/wptErrors.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptErrors.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -234,7 +234,7 @@
 
 
 int
-log_box (const char *title, int style, const char *format, ...)
+printf_box (const char *title, int style, const char *format, ...)
 {
     va_list arg_ptr;
     char log[8192];

Modified: trunk/Src/wptFirstRunDlg.cpp
===================================================================
--- trunk/Src/wptFirstRunDlg.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptFirstRunDlg.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -1,5 +1,5 @@
 /* wptFirstRunDlg.cpp - Welcome dialog
- *	Copyright (C) 2002-2005 Timo Schulz
+ *	Copyright (C) 2002-2006 Timo Schulz
  *
  * This file is part of WinPT.
  *
@@ -44,10 +44,12 @@
 	if (!ctx)
 	    BUG (0);
 	CheckDlgButton( dlg, IDC_FIRST_KEYGEN, BST_CHECKED );
-	SetDlgItemText (dlg, IDC_FIRST_KEYGEN, _("&Generate a GnuPG key pair"));
-	SetDlgItemText (dlg, IDC_FIRST_IMPORT, _("&Copy GnuPG keyrings from another location"));
-	SetDlgItemText (dlg, IDC_FIRST_SETUP, _("&Specify a new GnuPG home directory"));
+	SetDlgItemText (dlg, IDC_FIRST_KEYGEN, 
+			_("&Generate a GnuPG key pair"));
+	SetDlgItemText (dlg, IDC_FIRST_IMPORT, 
+			_("&Copy GnuPG keyrings from another location"));
 	SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
+	SetWindowText (dlg, _("WinPT First Start"));
 	SetForegroundWindow (dlg);
 	center_window (dlg, NULL);
 	return TRUE;
@@ -74,4 +76,3 @@
 
     return FALSE;
 }
-

Modified: trunk/Src/wptGPG.cpp
===================================================================
--- trunk/Src/wptGPG.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptGPG.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -156,10 +156,14 @@
     if (!path)
 	return NULL;
     keyring = make_filename (path, pub? "pubring" : "secring", "gpg");
-    if (!strict && !file_exist_check (keyring)) {
+    if (strict && !file_exist_check (keyring)) {
 	free_if_alloc (path);
 	return keyring;
     }
+    else if (!strict) {
+	free_if_alloc (path);
+	return keyring;
+    }
     if (file_exist_check (keyring) || pub && get_file_size (keyring) == 0) {
 	free_if_alloc (keyring);
 	optfile = make_filename (path, GPG_CONF, NULL);
@@ -419,9 +423,26 @@
 } /* check_gnupg_cfgfile */
 
 
-/*
- * Check if both keyrings are located in the gnupg home directory.
- */
+/* Usually GPG creates the pubring.gpg, secring.gpg on
+   the first start, but to make sure they always exist
+   create them empty if needed. */
+static void
+create_empty_keyring (int _pub)
+{
+    char *name;
+    FILE *f;
+
+    name = get_gnupg_keyring (_pub, 0);
+    if (file_exist_check (name) != 0) {
+	f = fopen (name, "ab");
+	if (f != NULL)
+	    fclose (f);
+    }
+    free_if_alloc (name);
+}
+
+
+/* Check if both keyrings are located in the gnupg home directory. */
 int
 gnupg_access_files (void)
 {
@@ -430,11 +451,13 @@
     int secrings = 0, pubrings = 0;
     char *optfile;
 
+    create_empty_keyring (1);
     if (gnupg_access_keyring (1))
 	rc = WPTERR_GPG_KEYRINGS;
     else
 	pubring_ok = 1;
 
+    create_empty_keyring (0);
     if (gnupg_access_keyring (0))
 	rc = WPTERR_GPG_KEYRINGS;
     else
@@ -463,7 +486,7 @@
 	rc = WPTERR_GPG_KEYRINGS;
     }
     return rc;
-} /* gnupg_access_files */
+}
 
 
 static int
@@ -476,17 +499,17 @@
     if( s == NULL )
 	return WPTERR_FILE_CREAT;
     optfile = make_filename (s, GPG_CONF, NULL);
-    fp = fopen( optfile, "wb" );
-    if( fp == NULL ) {	
+    fp = fopen (optfile, "wb");
+    if (fp == NULL) {	
 	return WPTERR_FILE_CREAT;
 	goto fail;
     }
-    fwrite( options_skel, 1, strlen( options_skel ), fp );
-    fclose( fp );
+    fwrite (options_skel, 1, strlen (options_skel), fp);
+    fclose (fp);
 
 fail:
-    free_if_alloc( s );
-    free_if_alloc( optfile );
+    free_if_alloc (s);
+    free_if_alloc (optfile);
     return 0;
 } /* create_gpg_options */
 

Modified: trunk/Src/wptGPGMEData.cpp
===================================================================
--- trunk/Src/wptGPGMEData.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptGPGMEData.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -1,3 +1,26 @@
+/* wptGPGMEData.cpp - WinPT specifc data extensions
+ *	Copyright (C) 2001-2005 Timo Schulz
+ *
+ * This file is part of WinPT.
+ *
+ * WinPT 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 (at your option) any later version.
+ *  
+ * WinPT is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License 
+ * along with WinPT; if not, write to the Free Software Foundation, 
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
+ */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <windows.h>
 #include <malloc.h>
 #include <string.h>

Added: trunk/Src/wptGPGMEWrapper.cpp
===================================================================
--- trunk/Src/wptGPGMEWrapper.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptGPGMEWrapper.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -0,0 +1,134 @@
+/* wptGPGMEWrapper.cpp - Object oriented wrapper for GPGME
+ *	Copyright (C) 2006 Timo Schulz
+ *
+ * This file is part of WinPT.
+ *
+ * WinPT 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 (at your option) any later version.
+ *  
+ * WinPT is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License 
+ * along with WinPT; if not, write to the Free Software Foundation, 
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <windows.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "gpgme.h"
+#include "wptGPG.h"
+#include "wptGPGME.h"
+
+
+/* Constructor to build gpgme context. */
+GPGME::GPGME ()
+{
+    gpgme_new (&ctx);
+}
+
+/* Destructor to release gpgme context. */
+GPGME::~GPGME ()
+{
+    if (ctx != NULL)
+	gpgme_release (ctx);
+}
+
+void
+GPGME::setChangeVersion (bool val)
+{
+    chg_ver = val;
+}
+
+/* Enable or disable armor. */
+void 
+GPGME::setArmor (bool val)
+{
+    gpgme_set_armor (ctx, val? 1 : 0);
+}
+
+bool
+GPGME::getArmor (void)
+{
+    return gpgme_get_armor (ctx)? true: false;
+}
+
+/* Export key pattern @patt to file @outfile.
+   Return value: 0 on success. */
+gpgme_error_t
+GPGME::exportToFile (const char *patt, const char *outfile)
+{
+    gpgme_data_t dat;
+    gpgme_error_t err;
+
+    err = gpgme_data_new (&dat);
+    if (err)
+	return err;
+    err = gpgme_op_export (ctx, patt, 0, dat);
+    if (err) {
+	gpgme_data_release (dat);
+	return err;
+    }
+    err = gpg_data_release_and_set_file (dat, outfile);
+    return err;
+}
+
+
+/* Export key pattern @patt to the clipboard.
+   Return value: 0 on success. */
+gpgme_error_t
+GPGME::exportToClipboard (const char *patt)
+{
+    gpgme_data_t dat;
+    gpgme_error_t err;
+
+    err = gpgme_data_new (&dat);
+    if (err)
+	return err;
+    err = gpgme_op_export (ctx, patt, 0, dat);
+    if (err) {
+	gpgme_data_release (dat);
+	return err;
+    }
+    gpg_data_release_and_set_clipboard (dat, chg_ver? 1 : 0);
+    return err;
+}
+
+
+/* Export key pattern @patt to the buffer @outdata. 
+   Return value: 0 on success. */
+gpgme_error_t
+GPGME::exportToBuffer (const char *patt, char **outdata)
+{
+    gpgme_error_t err;
+    gpgme_data_t dat;
+    size_t n;
+    char *p;
+
+    err = gpgme_data_new (&dat);
+    if (err)
+	return err;
+    err = gpgme_op_export (ctx, patt, 0, dat);
+    if (err) {
+	gpgme_data_release (dat);
+	return err;
+    }
+    p = gpgme_data_release_and_get_mem (dat, &n);
+
+    *outdata = new char[n+1];
+    memcpy (*outdata, p, n);
+    (*outdata)[n] = 0;
+    gpgme_free (p);
+
+    return err;
+}

Modified: trunk/Src/wptGPGUtil.cpp
===================================================================
--- trunk/Src/wptGPGUtil.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptGPGUtil.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -1,6 +1,6 @@
 /* wptGPGUtil.cpp - GPG util functions
+ *	Copyright (C) 2005, 2006 Timo Schulz
  *	Copyright (C) 2005 g10 Code GmbH
- *	Copyright (C) 2005 Timo Schulz
  *
  * This file is part of WinPT.
  *
@@ -199,7 +199,14 @@
     return result;
 }
 
+static char*
+read_gpg_program (void)
+{
+    return read_w32_registry (HKEY_CURRENT_USER, 
+			      "Software\\GNU\\GnuPG", "gpgProgram");
+}
 
+
 /* Create a temp file based on the name of @name.
    Return value: handle to the file in case of success. */
 static HANDLE
@@ -256,7 +263,7 @@
 /* Map the contents of the file handle @out to
    a buffer and return it. */
 static char*
-map_tmpfile (HANDLE out)
+map_tmpfile (HANDLE out, DWORD *nread)
 {
     DWORD n;
     char *p;
@@ -269,6 +276,8 @@
 	BUG (NULL);
     ReadFile (out, p, n, &n, NULL);
     p[n] = 0;
+    if (nread)
+	*nread = n;
     return p;
 }
 
@@ -279,19 +288,21 @@
    will be read from @in.
    Return value: 0 on success. */
 static int
-create_process (const char *cmd, HANDLE in, HANDLE out)
+create_process (const char *cmd, HANDLE in, HANDLE out, HANDLE err)
 {
     STARTUPINFO si;
     PROCESS_INFORMATION pi;
 
     memset (&si, 0, sizeof (si));
     si.cb = sizeof si;
-    if (in || out)
+    if (in || out || err)
 	si.dwFlags = STARTF_USESTDHANDLES;
     if (out)
 	si.hStdOutput = out;
     if (in)
 	si.hStdInput = in;
+    if (err)
+	si.hStdError = err;
     si.dwFlags |= STARTF_USESHOWWINDOW;
     si.wShowWindow = SW_HIDE;
     if (!CreateProcess (NULL, (char*)cmd, NULL, NULL, TRUE, 0, 
@@ -316,8 +327,7 @@
     char *p;
     char *cmd;
 
-    p = read_w32_registry (HKEY_CURRENT_USER, 
-			   "Software\\GNU\\GnuPG", "gpgProgram");
+    p = read_gpg_program ();
     if (!p)
 	return gpg_error (GPG_ERR_INV_ARG);
     cmd = (char*)calloc (1, strlen (p) + strlen (keyid) 
@@ -326,7 +336,7 @@
 	BUG (NULL);
     sprintf (cmd, "%s --yes --output \"%s\" --export-secret-key %s", 
 	     p, outfile, keyid);
-    if (create_process (cmd, NULL, NULL))
+    if (create_process (cmd, NULL, NULL, NULL))
 	err = gpg_error (GPG_ERR_INTERNAL);
 
     if (stat (outfile, &st) == -1 || st.st_size == 0)
@@ -349,8 +359,7 @@
     char *p;
     char *cmd;
 
-    p = read_w32_registry (HKEY_CURRENT_USER, 
-			   "Software\\GNU\\GnuPG", "gpgProgram");
+    p = read_gpg_program ();
     if (!p)
 	return gpg_error (GPG_ERR_INV_ARG);
 
@@ -369,7 +378,7 @@
 	FlushFileBuffers (in);
 	/* XXX: need a rewind? */
     }
-    if (create_process (cmd, in, out))
+    if (create_process (cmd, in, out, NULL))
 	err = gpg_error (GPG_ERR_INTERNAL);
 
     free (p);
@@ -378,7 +387,7 @@
     if (in)
 	CloseHandle (in);
     if (out) {
-	*data = map_tmpfile (out);
+	*data = map_tmpfile (out, NULL);
 	CloseHandle (out);
     }
 
@@ -395,8 +404,7 @@
     char *p;
     char *cmd;
 
-    p = read_w32_registry (HKEY_CURRENT_USER, 
-			   "Software\\GNU\\GnuPG", "gpgProgram");
+    p = read_gpg_program ();
     if (!p)
 	return gpg_error (GPG_ERR_INV_ARG);
     cmd = (char*)calloc (1, strlen (p) + 64);
@@ -407,11 +415,11 @@
     if (r_inf)
 	out = create_tmpfile ("gpg_rebuild_cache");
 
-    if (create_process (cmd, NULL, out))
+    if (create_process (cmd, NULL, out, NULL))
 	err = gpg_error (GPG_ERR_INTERNAL);
 
     if (r_inf)
-	*r_inf = map_tmpfile (out);
+	*r_inf = map_tmpfile (out, NULL);
     if (out)
 	CloseHandle (out);
     free (p);
@@ -428,8 +436,7 @@
     HANDLE out;    
     char *p, *cmd;
 
-    p =read_w32_registry (HKEY_CURRENT_USER, 
-			  "Software\\GNU\\GnuPG", "gpgProgram");
+    p = read_gpg_program ();
     if (!p)
 	return gpg_error (GPG_ERR_INV_ARG);
     cmd = (char*)calloc (1, strlen (p) + 32);
@@ -438,13 +445,13 @@
     sprintf (cmd, "%s --version", p);
 
     out = create_tmpfile ("gpg_out");
-    if (create_process (cmd, NULL, out))
+    if (create_process (cmd, NULL, out, NULL))
 	err = gpg_error (GPG_ERR_INTERNAL);
 
     free (p);
     free (cmd);
 
-    *r_inf = map_tmpfile (out);
+    *r_inf = map_tmpfile (out, NULL);
     CloseHandle (out);    
     return err;
 }
@@ -459,8 +466,7 @@
     char *cmd, *p;
     HANDLE out;
 
-    p = read_w32_registry (HKEY_CURRENT_USER, 
-			   "Software\\GNU\\GnuPG", "gpgProgram");
+    p = read_gpg_program ();
     if (!p)
 	return gpg_error (GPG_ERR_INV_ARG);
 
@@ -470,13 +476,13 @@
     sprintf (cmd, "%s --fixed-list-mode --with-colons \"%s\"", p, fname);
 
     out = create_tmpfile ("gpg_keys");
-    if (create_process (cmd, NULL, out))
+    if (create_process (cmd, NULL, out, NULL))
 	err = gpg_error (GPG_ERR_INTERNAL);
 
     free (p);
     free (cmd);
 
-    *r_out = map_tmpfile (out);
+    *r_out = map_tmpfile (out, NULL);
     CloseHandle (out);
     return err;
 }
@@ -521,8 +527,7 @@
     char *cmd, *p;
     HANDLE in, out;
     
-    p = read_w32_registry (HKEY_CURRENT_USER, 
-			   "Software\\GNU\\GnuPG", "gpgProgram");
+    p = read_gpg_program ();
     if (!p)
 	return gpg_error (GPG_ERR_INV_ARG);
 
@@ -534,12 +539,12 @@
 
     in = create_in_pipe (inp_data);
     out = create_tmpfile ("gpg_revcert");
-    if (create_process (cmd, in, out)) {
+    if (create_process (cmd, in, out, NULL)) {
 	*r_revcert = NULL;
 	err = gpg_error (GPG_ERR_INTERNAL);
     }
     else {
-	rcrt = map_tmpfile (out);
+	rcrt = map_tmpfile (out, NULL);
 	*r_revcert = rcrt;
 	if (rcrt && strlen (rcrt) == 0)
 	    err = gpg_error (GPG_ERR_BAD_PASSPHRASE);
@@ -554,6 +559,49 @@
 }
 
 
+/* Return the raw photo-id data combined with the status-fd
+   entry in @r_data. If @keyid is set, only the data for this 
+   key will be returned.
+   Return value: 0 on success. */
+gpgme_error_t
+gpg_get_photoid_data (const char *keyid, char **r_status_data,
+		      unsigned char **r_data, unsigned long *ndata)
+{
+    gpgme_error_t err = gpg_error (GPG_ERR_NO_ERROR);
+    HANDLE herr, hdat;
+    char *p, *cmd;
+    DWORD n;
+
+    p = read_gpg_program ();
+    if (!p)
+	return gpg_error (GPG_ERR_INV_ARG);
+    n = strlen (p) + 128;
+    if (keyid)
+	n += strlen (keyid) + 1;
+    cmd = (char*)calloc (1, n+1);
+    if (!cmd)
+	BUG (NULL);
+    hdat = create_tmpfile ("gpg_uat_data");
+    herr = create_tmpfile ("gpg_uat_status");
+    /* XXX: add --list-options show-unsuable-uid to display
+	    revoked attribute IDs */
+    sprintf (cmd, "%s --attribute-fd=%d --status-fd=2 --list-keys %s",
+	     p, (int)hdat, keyid? keyid : "");
+    if (create_process (cmd, NULL, NULL, herr))
+	err = gpg_error (GPG_ERR_INTERNAL);
+
+    free (p);
+    free (cmd);
+
+    *r_data = (BYTE*)map_tmpfile (hdat, ndata);
+    *r_status_data = map_tmpfile (herr, NULL);
+    CloseHandle (hdat);
+    CloseHandle (herr);
+
+    return err;
+}
+
+
 /* Return the validity of the user attribute, informerly known 
    as photo-ID. If no uat was found, return 0 for unknown. */
 gpgme_error_t
@@ -565,8 +613,7 @@
     char *uat;
 
     *r_valid = GPGME_VALIDITY_UNKNOWN;
-    p = read_w32_registry (HKEY_CURRENT_USER, 
-			   "Software\\GNU\\GnuPG", "gpgProgram");
+    p = read_gpg_program ();
     if (!p)
 	return gpg_error (GPG_ERR_INV_ARG);
 
@@ -577,13 +624,13 @@
 	     p, keyid);
 
     out = create_tmpfile ("gpg_keys");
-    if (create_process (cmd, NULL, out))
+    if (create_process (cmd, NULL, out, NULL))
 	err = gpg_error (GPG_ERR_INTERNAL);
 
     free (p);
     free (cmd);
     
-    p = map_tmpfile (out);
+    p = map_tmpfile (out, NULL);
     if ((uat = strstr (p, "uat:"))) {
 	switch (*(uat+4)) {
 	case 'm': *r_valid = GPGME_VALIDITY_MARGINAL; break;

Modified: trunk/Src/wptKeyCache.cpp
===================================================================
--- trunk/Src/wptKeyCache.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptKeyCache.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -1,5 +1,5 @@
 /* wptKeyCache.cpp- Caching for the pub- and the secring
- *	Copyright (C) 2001-2005 Timo Schulz
+ *	Copyright (C) 2001-2006 Timo Schulz
  *
  * This file is part of MyGPGME.
  *
@@ -35,24 +35,121 @@
 #include "wptNLS.h"
 #include "wptErrors.h"
 #include "wptW32API.h"
+#include "wptGPG.h"
 
 
-#if 0
-/* convert a binary buffer into its hex representation. */
-static void
-buffer_to_string (char *dst, size_t dlen, const byte *buf, size_t nbytes)
+/* Attribute list which holds the image data. */
+struct attr_list_s {
+    struct attr_list_s *next;
+    char *fpr;                   /* fingerprint of the key */
+    unsigned char *d;            /* actual JPEG data. */
+    unsigned long octets;        /* length of the data. */
+    unsigned int flags;          /* status of the attribute. */
+};
+typedef struct attr_list_s *attr_list_t;
+
+
+void
+free_attr_list (attr_list_t ctx)
 {
-    char dig[3];
-    size_t i;
+    attr_list_t n;
+    while (ctx) {
+	n = ctx->next;
+	free (ctx->fpr);
+	free (ctx->d);
+	ctx = n;
+    }
+}
+	
+/* Parse the attribute list in @fp and store it into @ctx.
+   Return value: number of parsed items. */
+int
+parse_attr_list (FILE *fp, const BYTE *data, DWORD datlen, attr_list_t *ctx)
+{
+    attr_list_t c, t;
+    char buf[512], *p, *buffer;
+    int pos, n=0;
+    
+    *ctx = NULL;
+    while (fgets (buf, 511, fp)) {
+	if (strstr (buf, "\r\n"))
+	    buf[strlen (buf)-2]=0;
+	if (strstr (buf, "\n"))
+	    buf[strlen (buf)-1]=0;
+	if (strlen (buf) < 2 || !strstr (buf, "ATTRIBUTE"))
+	    continue;
+	buffer = buf+9+10;
+	pos = 0;
+	c = (attr_list_t)calloc (1, sizeof *c);
+	p = strtok (buffer, " ");
+	while (p != NULL) {
+	    switch (pos) {
+	    case 0: 
+		c->fpr = strdup (p);
+		break;
+		
+	    case 1:
+		c->octets = strtoul (p, NULL, 10);
+		break;
+		
+	    case 7:
+		c->flags = strtoul (p, NULL, 10);
+		break;
+		
+	    default: 
+		break;
+	    }
+	    pos++;
+	    p = strtok (NULL, " ");
+	}
+	/*printf ("id=%s octets=%d flags=%d\n", c->fpr, c->octets, c->flags);*/
+	if (!*ctx)
+	    *ctx = c;
+	else {
+	    for (t = *ctx; t->next; t=t->next)
+		;
+	    t->next = c;
+	}
+	c->d = (unsigned char*)malloc (c->octets);
+	memcpy (c->d, data, c->octets);
+	data += c->octets;
+	datlen -= c->octets;
+	n++;
+    }
+    /*assert (datlen == 0); */
+    return n;
+}
 
-    memset (dst, 0, dlen);
-    for (i = 0; i < nbytes && dlen > 0; i++) {
-	sprintf (dig, "%02X", buf[i]);
-	strcat (dst, dig);
-	dlen -= 2;
+
+static int 
+parse_attr_data (const char *keyid, attr_list_t *list)
+{
+    gpgme_error_t err;
+    FILE *tmp;
+    char *status;
+    BYTE *data;
+    DWORD ndata;
+
+    err = gpg_get_photoid_data (keyid, &status, &data, &ndata);
+    if (err)
+	return err;
+
+    if (ndata > 0) {
+	tmp = tmpfile ();
+	fwrite (status, 1, strlen (status), tmp);
+	fflush (tmp);
+	rewind (tmp);
+
+	ndata = parse_attr_list (tmp, data, ndata, list);
+	fclose (tmp);
     }
+    else
+	*list = NULL;
+
+    safe_free (status);
+    safe_free (data);
+    return ndata;
 }
-#endif
 
 
 /* Parse the secret keyring and retrieve some additional information
@@ -60,7 +157,7 @@
 static void
 parse_secring (gpg_keycache_t cache, const char *kid, const char *secring)
 {    
-    PACKET *pkt = (PACKET*)calloc (1, sizeof *pkt);
+    PACKET *pkt;
     PKT_secret_key *sk;
     gpg_iobuf_t inp;
     gpgme_error_t err;
@@ -69,11 +166,11 @@
     char keyid[16+1]; 
 
     inp = gpg_iobuf_open (secring);
-    if (!inp) {
-	safe_free (pkt);
+    if (!inp)
 	return;
-    }
+
     gpg_iobuf_ioctl (inp, 3, 1, NULL);
+    pkt = (PACKET*)calloc (1, sizeof *pkt);
     gpg_init_packet (pkt);
     while (gpg_parse_packet (inp, pkt) != -1) {
 	if (pkt->pkttype == PKT_SECRET_KEY) {
@@ -102,6 +199,46 @@
 }
 
 
+/* Update the photo image of a single key with the fingerprint
+   @fpr. The @dat struct contains the new item data. */
+static gpgme_error_t
+keycache_update_photo (gpg_keycache_t ctx, const char *fpr, attr_list_t dat)
+{
+    struct keycache_s *fnd = NULL;
+    gpgme_key_t key;
+    
+    gpg_keycache_find_key2 (ctx, fpr, 0, &key, &fnd);
+    if (!fnd)
+	return gpg_error (GPG_ERR_NOT_FOUND);
+    safe_free (fnd->attrib.d);
+    fnd->attrib.flags = dat->flags;
+    fnd->attrib.len = dat->octets;
+    fnd->attrib.d = (unsigned char*)malloc (dat->octets);
+    memcpy (fnd->attrib.d, dat->d, dat->octets);
+    return 0;
+}
+
+
+/* Update all photo images in the cache. */
+static gpgme_error_t
+keycache_update_photos (gpg_keycache_t ctx)
+{
+    attr_list_t list=NULL, n;
+    DWORD ndata;
+
+    ndata = parse_attr_data (NULL, &list);
+    if (ndata < 1) {
+	free_attr_list (list);
+	return 0;
+    }
+
+    for (n=list; n; n=n->next)
+	keycache_update_photo (ctx, n->fpr, n);
+    free_attr_list (list);
+    return 0;
+}
+
+
 /* Merge the information from the keyrings into the key cache structure. */
 gpgme_error_t
 keycache_prepare2 (gpg_keycache_t ctx, const char *kid,
@@ -110,27 +247,24 @@
     gpgme_error_t err = gpg_error (GPG_ERR_NO_ERROR);
     gpgme_key_t key = NULL;
     gpg_iobuf_t inp;
-    PACKET *pkt = (PACKET*)calloc (1, sizeof * pkt);
+    PACKET *pkt;
     struct keycache_s *c;
     const byte *sym_prefs;
-    char keyid[16+1], *id = NULL;
+    char keyid[16+1];
     int key_seen = 0;
     size_t nsym =0;
 
     if (secring) {
 	parse_secring (ctx, kid, secring);
-	if (!pubring) {
-	    safe_free (pkt);
+	if (!pubring)
 	    return 0;
-	}
     }
     inp = gpg_iobuf_open (pubring);
-    if (!inp) {
-	safe_free (pkt);
+    if (!inp)
 	return gpg_error (GPG_ERR_KEYRING_OPEN);
-    }
     gpg_iobuf_ioctl (inp, 3, 1, NULL); /* disable cache */
 
+    pkt = (PACKET*)calloc (1, sizeof * pkt);
     gpg_init_packet (pkt);
     while (gpg_parse_packet (inp, pkt) != -1) {
 	if (pkt->pkttype == PKT_PUBLIC_KEY) {
@@ -138,10 +272,12 @@
 	    key_seen = 1;
 	}
 
-	if (pkt->pkttype == PKT_SIGNATURE && pkt->pkt.signature->sig_class == 0x1F) {
+	if (pkt->pkttype == PKT_SIGNATURE && 
+	    pkt->pkt.signature->sig_class == 0x1F) {
 	    if (pkt->pkt.signature->numrevkeys == 0)
 		goto next;
-	    _snprintf (keyid, sizeof keyid -1, "%08X", pkt->pkt.signature->keyid[1]);
+	    _snprintf (keyid, sizeof (keyid) -1, "%08X", 
+			pkt->pkt.signature->keyid[1]);
 	    if (kid && strcmp (kid, keyid) != 0)
 		goto next;
 	    err = gpg_keycache_find_key2 (ctx, keyid, 0, &key, &c);
@@ -150,11 +286,12 @@
 	    c->gloflags.has_desig_rev = 1;
 	}
 	if (pkt->pkttype == PKT_SIGNATURE && key_seen == 1 ) {
-	    sym_prefs=gpg_parse_sig_subpkt (pkt->pkt.signature->hashed,
-				            SIGSUBPKT_PREF_SYM, &nsym);
-	    if (sym_prefs == NULL)
+	    sym_prefs = gpg_parse_sig_subpkt (pkt->pkt.signature->hashed,
+				              SIGSUBPKT_PREF_SYM, &nsym);
+	    if (!sym_prefs)
 		goto next;
-	    _snprintf (keyid, sizeof keyid - 1, "%08X", pkt->pkt.signature->keyid[1]);
+	    _snprintf (keyid, sizeof (keyid) - 1, "%08X",
+			pkt->pkt.signature->keyid[1]);
 	    if (kid && strcmp (kid, keyid) != 0)
 		goto next;
 	    err = gpg_keycache_find_key2 (ctx, keyid, 0, &key, &c);
@@ -167,36 +304,11 @@
 		memcpy (c->sym_prefs, sym_prefs, nsym);
 	    }
 	}
-	if (pkt->pkttype == PKT_USER_ID) {
-	    if (id)
-		free (id);
-	    id = strdup (pkt->pkt.user_id->name);
-	    if (!id) {
-		err = gpg_error (GPG_ERR_ENOMEM);
-		goto fail;
-	    }
-	}
-	if ((pkt->pkttype == PKT_USER_ID || pkt->pkttype == PKT_ATTRIBUTE)
-	    && pkt->pkt.user_id->attrib_data && key) {
-	    PKT_user_id *uid = pkt->pkt.user_id;
-	    c->attrib.used = 1;
-	    c->attrib.len = uid->attrib_len;
-	    c->attrib.d = (unsigned char*)calloc (1, uid->attrib_len + 1);
-	    if (!c->attrib.d) {
-		err = gpg_error (GPG_ERR_ENOMEM);
-		goto fail;
-	    }
-	    memcpy (c->attrib.d, uid->attrib_data, uid->attrib_len);
-	    key = NULL;
-	    c = NULL;
-	}
 next:
 	gpg_free_packet (pkt);
 	gpg_init_packet(pkt);
     }
 
-fail:
-    safe_free (id);
     safe_free (pkt);
     gpg_iobuf_close (inp);
     return err;
@@ -251,18 +363,12 @@
         c2 = c->next;
 	gpgme_key_release (c->key);
 	c->key = NULL;
-	if (c->sym_prefs)
-	    free (c->sym_prefs);
-	c->sym_prefs = NULL;
-	if (c->attrib.d)
-	    free (c->attrib.d);
-	c->attrib.d = NULL;
-	if (c->card_type)
-	    free (c->card_type);
+	safe_free (c->sym_prefs);
+	safe_free (c->attrib.d);
+	safe_free (c->card_type);
 	free (c);
     }
-    if (ctx)
-	free (ctx);
+    safe_free (ctx);
 }
 
 
@@ -367,7 +473,7 @@
     }
     *r_key = NULL;
     return gpg_error (GPG_ERR_INTERNAL);
-} /* keycache_find_key */
+}
 
 
 gpgme_error_t
@@ -378,6 +484,23 @@
 }
 
 
+/* Reload a photo image of a single key with the keyid @keyid.
+   Return value: 0 on success. */
+static gpgme_error_t
+keycache_reload_photo (gpg_keycache_t ctx, const char *keyid)
+{
+    attr_list_t list;
+
+    if (parse_attr_data (keyid, &list) < 1) {
+	free_attr_list (list);
+	return 0;
+    }
+    keycache_update_photo (ctx, list->fpr, list);
+    free_attr_list (list);
+    return 0;
+}
+
+
 gpgme_error_t
 gpg_keycache_update_key (gpg_keycache_t ctx, int is_sec, 
 			 void *opaque, const char *keyid)
@@ -406,6 +529,8 @@
 	    log_debug ("keycache update: set public part %p\r\n", fndkey);
 	    c->pubpart->key = fndkey;
 	}
+	/* XXX: this is also called for keys without a photo-id. */
+	keycache_reload_photo (ctx, keyid);
     }
     else {
 	log_debug ("keycache add: sync public part\r\n");
@@ -490,6 +615,7 @@
     }
     if (gpgme_err_code (err) == GPG_ERR_EOF)
 	err = gpg_error (GPG_ERR_NO_ERROR);
+    keycache_update_photos (ctx);
     /* XXX: make sure the progress dialog is closed. */
     gpgme_op_keylist_end (c);
     gpgme_release (c);

Modified: trunk/Src/wptKeyEditDlgs.cpp
===================================================================
--- trunk/Src/wptKeyEditDlgs.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptKeyEditDlgs.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -1,5 +1,5 @@
 /* wptKeyEditDlgs.cpp - GPG key edit dialogs
- *	Copyright (C) 2002-2005 Timo Schulz
+ *	Copyright (C) 2002-2006 Timo Schulz
  *
  * This file is part of WinPT.
  *
@@ -968,6 +968,8 @@
 	msg_box( dlg, _("Could not find key."), _("Key Edit"), MB_ERR );
 	return NULL;
     }
+    if (!k->ctx)
+	k->ctx = key;
     nkeys = count_subkeys (key);
     if( !nkeys ) {
         msg_box( dlg, _("No subkey(s) found."), _("Key Edit"), MB_ERR );
@@ -1756,6 +1758,7 @@
 } /* uid_subclass_proc */
 
 
+/* Dialog box procedure for the edit key dialog. */
 BOOL CALLBACK
 keyedit_main_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
 {
@@ -1796,7 +1799,7 @@
 		BUG( NULL );
 	    }
 	}
-	if (!k->key_pair) {
+	if (!k->key_pair || k->ctx->revoked) {
 	    EnableWindow (GetDlgItem (dlg, IDC_KEYEDIT_CMD), FALSE);
 	    EnableWindow (GetDlgItem (dlg, IDOK), FALSE);
 	}
@@ -1871,4 +1874,5 @@
 	break;
     }
     return FALSE;
-} /* keyedit_main_dlg_proc */
+}
+

Modified: trunk/Src/wptKeyManager.cpp
===================================================================
--- trunk/Src/wptKeyManager.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptKeyManager.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -1,5 +1,5 @@
 /* wptKeyManager.cpp - Handy functions for the Key Manager dialog
- *	Copyright (C) 2001-2005 Timo Schulz
+ *	Copyright (C) 2001-2006 Timo Schulz
  *	Copyright (C) 2005 g10 Code GmbH
  *
  * This file is part of WinPT.
@@ -48,6 +48,7 @@
 #include "wptImport.h"
 #include "wptCrypto.h"
 #include "wptUTF8.h"
+#include "wptGPGME.h"
 
 
 /* Macros to change the cursor */
@@ -371,10 +372,9 @@
 int
 km_file_export (HWND dlg, listview_ctrl_t lv, const char *fname)
 {
+    GPGME *ctx;
     gpgme_key_t *rset;
-    gpgme_data_t keydata;	
     gpgme_error_t err;
-    gpgme_ctx_t ctx;
     char *patt;
     int n;
 
@@ -384,34 +384,22 @@
 	         _("Key Manager"), MB_ERR);
         return WPTERR_GENERAL;
     }
-    
-    err = gpgme_data_new (&keydata);
-    if (err)
-	BUG (NULL);
-    err = gpgme_new (&ctx);
-    if (err)
-	BUG (NULL);
-    gpgme_set_armor (ctx, 1);
-
-    /*gpgme_set_comment (ctx, "Generated by WinPT "PGM_VERSION);*/
     patt = gpg_keylist_to_pattern (rset, n);
-    
-    err = gpgme_op_export (ctx, patt, 0, keydata);
-    if( err ) {
+
+    ctx = new GPGME ();
+    ctx->setArmor (true);
+    err = ctx->exportToFile (patt, fname);
+    if (err) {
         msg_box (dlg, gpgme_strerror (err), _("Key Manager"), MB_ERR);
         goto leave;
     }
-
-    log_box (_("Key Manager"), MB_OK, 
-	     _("Key(s) successfully saved in '%s'."), fname);
+    else
+	log_box (_("Key Manager"), MB_OK, 
+		 _("Key(s) successfully saved in '%s'."), fname);
     
 leave:
-    err = gpg_data_release_and_set_file (keydata, fname);
-    if (err)
-	log_box (_("Key Manager"), MB_OK,
-		 _("Could not save data to '%s'."), fname);
-    gpgme_release (ctx);
-    free (patt);
+    delete ctx;
+    safe_free (patt);
     return (int)err;
 }
 
@@ -615,7 +603,6 @@
     gpgme_ctx_t ctx;
     gpgme_key_t *rset;
     gpgme_key_t key;
-    char keyid[32];
     char *p;
     int with_seckey=0, seckey_type=0, confirm=0;
     int i, rc, n, k_pos=0;
@@ -636,8 +623,10 @@
     else
 	confirm = 1;
 
+    /* n = total amount of keys, i is the selected amount. */
     n = listview_count_items (lv, 0);
-    rset = (gpgme_key_t *)calloc (n+1, sizeof (gpgme_key_t));
+    i = listview_count_items (lv, 1);
+    rset = (gpgme_key_t *)calloc (i+1, sizeof (gpgme_key_t));
     if (!rset)
 	BUG (NULL);
     for (i = 0; i < n; i++) {
@@ -648,7 +637,7 @@
 	    seckey_type = km_check_for_seckey (lv, i, NULL);
             if (confirm && !seckey_type) {
 		p = key_get_info (key, 0);
-		rc = log_box( _("Key Manager"), MB_YESNO|MB_ICONWARNING,
+		rc = log_box (_("Key Manager"), MB_YESNO|MB_ICONWARNING,
                               _("Do you really want to delete this key?\n\n"
 			        "%s"), p);
                 if (rc == IDYES)
@@ -664,7 +653,7 @@
 				"messages you stored with this key any longer.\n"
 				"\n"
 				"%s"), p);
-                if( rc == IDYES ) {
+                if (rc == IDYES) {
 		    if (seckey_type == 2)
 			msg_box (dlg, _("The actual secret key is stored on a smartcard.\n"
 					"Only the public key and the secret key \n"
@@ -677,7 +666,6 @@
             }
 	    else {
 		with_seckey = 1;
-		get_pubkey (keyid, &key);
 		rset[k_pos++] = key;
 	    }
         }
@@ -784,12 +772,15 @@
 
     gpgme_set_armor (ctx, 1);
     rc = gpgme_op_export (ctx, key->subkeys->keyid, 0, out);
-    if (rc)
+    if (rc) {
+	gpgme_data_release (out);
 	msg_box (dlg, gpgme_strerror (rc), _("Key Manager"), MB_ERR);
-    else
+    }
+    else {
+	gpg_data_release_and_set_file (out, fname);
 	mapi_send_pubkey (key->subkeys->keyid+8, fname);
+    }
 
-    gpg_data_release_and_set_file (out, fname);
     gpgme_release (ctx);
     safe_free (name);
     free_if_alloc (fname);
@@ -798,7 +789,7 @@
 
 
 static void
-km_refresh_one_key (listview_ctrl_t lv, HWND dlg, int pos)
+km_refresh_one_key (listview_ctrl_t lv, HWND dlg, int pos, int flags)
 {
     gpgme_key_t key;
     int idx;
@@ -809,38 +800,39 @@
 	idx = listview_get_curr_pos (lv);
     if (idx != -1) {
 	key = (gpgme_key_t)listview_get_item2 (lv, idx);
+	if (!key)
+	    BUG (0);
 	hkp_recv_key (dlg, default_keyserver, default_keyserver_port, 
-		      key->subkeys->keyid+8, 0, KM_KS_REFRESH);
+		      key->subkeys->keyid+8, 0, flags);
     }
 }
 
 
-/* Refresh all keys from the default keyserver. */
+/* Refresh the selected keys from the default keyserver. */
 void
 km_refresh_from_keyserver (listview_ctrl_t lv, HWND dlg)
 {
-    int idx, id, i;
+    int cnt, id, i;
     
     if (kserver_check_inet_connection ()) {
 	msg_box (dlg, _("Could not connect to keyserver, abort procedure."),
 		 _("Key Manager"), MB_ERR);
 	return;
     }
-    idx = listview_count_items (lv, 0);
-    if (listview_count_items (lv, 1) == idx) {
-        id = msg_box (dlg, _("Do you really want to refresh all keys in the keyring?"), 
+
+    cnt = listview_count_items (lv, 0);
+    if (listview_count_items (lv, 1) == cnt) {
+        id = msg_box (dlg, _("Do you really want to refresh all keys in the keyring?"),
 		      _("Key Manager"), MB_YESNO);
         if (id == IDNO)
             return;
-        for (i = 0; i < idx; i++)
-	    km_refresh_one_key (lv, dlg, i);
     }
-    else if (idx == 1)
-	km_refresh_one_key (lv, dlg, 0);
+    if (listview_count_items (lv, 1) == 1)
+	km_refresh_one_key (lv, dlg, listview_get_curr_pos (lv), 0);
     else {
-	for (i=0; i < listview_count_items (lv, 0); i++) {
+	for (i=0; i < cnt; i++) {
 	    if (listview_get_item_state (lv, i))
-		km_refresh_one_key (lv, dlg, i);
+		km_refresh_one_key (lv, dlg, i, KM_KS_REFRESH);	
 	}
     }
 }

Modified: trunk/Src/wptKeyManagerDlg.cpp
===================================================================
--- trunk/Src/wptKeyManagerDlg.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptKeyManagerDlg.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -626,8 +626,8 @@
 }
 
 
-#define enable_button(hwnd, cid) \
-    SendMessage ((hwnd), TB_ENABLEBUTTON, (cid), MAKELONG (key_selected, 0))
+#define enable_button(hwnd, cid, item_selected) \
+    SendMessage ((hwnd), TB_ENABLEBUTTON, (cid), MAKELONG ((item_selected), 0))
 
 
 /* Interactive modification of the dialog item which depend if an item
@@ -636,15 +636,15 @@
 void
 update_ui_items (HWND hwnd, listview_ctrl_t lv)
 {
-    HWND hwnd_child;
+    HWND tb_hwnd;
     HMENU hmenu;
+    int mult_resids[] = {ID_KEYMISC_PROPS, ID_KEYMISC_SIGN, ID_KEYMISC_EDITKEY,
+			 ID_KEYMISC_CHECKSIGS, ID_KEYMISC_REVCERT, 0};
     int key_selected = 0;
     int key_has_sec = 0;
     int key_inv = 0;
-    int mult_resids[] = {ID_KEYMISC_PROPS, ID_KEYMISC_SIGN, ID_KEYMISC_EDITKEY,
-			 ID_KEYMISC_CHECKSIGS, ID_KEYMISC_REVCERT, 0};
     int i, state=0;
-    
+
     /* Get some states */
     key_selected = SendMessage (GetDlgItem (hwnd, IDC_KEYMISC_KEYLIST), 
 					   LVM_GETSELECTEDCOUNT, 0, 0) 
@@ -658,11 +658,11 @@
     }
 
     /* Enable / disable toolbar buttons */
-    hwnd_child = GetDlgItem (hwnd, IDR_WINPT_KMTB);
-    enable_button (hwnd_child, ID_KEYMISC_DELETE);
-    enable_button (hwnd_child, ID_KEYMISC_PROPS);
-    enable_button (hwnd_child, ID_KEYMISC_SIGN);
-    enable_button (hwnd_child, ID_KEYMISC_EXPORT);
+    tb_hwnd = GetDlgItem (hwnd, IDR_WINPT_KMTB);
+    enable_button (tb_hwnd, ID_KEYMISC_DELETE, key_selected);
+    enable_button (tb_hwnd, ID_KEYMISC_PROPS, key_selected);
+    enable_button (tb_hwnd, ID_KEYMISC_SIGN, key_selected && !key_inv);
+    enable_button (tb_hwnd, ID_KEYMISC_EXPORT, key_selected);
 
     /* Enable / disable menu items */
     state = key_selected? MF_ENABLED : MF_DISABLED|MF_GRAYED;
@@ -684,6 +684,15 @@
 	for (i=0; mult_resids[i] != 0; i++)
 	    set_menu_state (hmenu, mult_resids[i], MF_GRAYED);
     }
+
+    /* Disable all secret-key functions when no secret key is available. */
+    {
+	gpg_keycache_t sec = keycache_get_ctx (0);
+	if (gpg_keycache_get_size (sec) == 0) {
+	    enable_button (tb_hwnd, ID_KEYMISC_SIGN, FALSE);
+	    set_menu_state (hmenu, ID_KEYMISC_SIGN, MF_GRAYED);
+	}
+    }
 }
 
 
@@ -1213,7 +1222,8 @@
 		    set_menu_state (popup, ID_KEYCTX_SETDEFKEY, MF_ENABLED);
 		if (i == 0)
 		    set_menu_state (popup, ID_KEYCTX_MAXTRUST, MF_ENABLED);
-		if (!km_check_for_seckey (kmi->lv, l_idx, NULL)) {
+		if (!km_check_for_seckey (kmi->lv, l_idx, NULL) ||
+		    (km_get_key_status (kmi->lv, l_idx) & KM_FLAG_REVOKED)) {
 		    set_menu_state (popup, ID_KEYCTX_REV, MF_DISABLED|MF_GRAYED);
 		    set_menu_state (popup, ID_KEYCTX_ADDKEY, MF_DISABLED|MF_GRAYED);
 		    set_menu_state (popup, ID_KEYCTX_ADDUID, MF_DISABLED|MF_GRAYED);

Modified: trunk/Src/wptKeyPropsDlg.cpp
===================================================================
--- trunk/Src/wptKeyPropsDlg.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptKeyPropsDlg.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -112,13 +112,13 @@
 	draw_nophoto_img (dlg);
 	return -1;
     }
+
     f = fopen (get_photo_tmpname (dlg), "wb");
     if (f) {
-	for (pos = 0; img[pos] != 0x10; pos++)
-		;
+	//for (pos = 0; img[pos] != 0x10; pos++)
+	//	;
 	pos += 16;
 	fwrite (img + pos, 1, imglen - pos, f);
-	fwrite (img, 1, imglen, f);
 	fclose (f);
     }
     return 0;

Modified: trunk/Src/wptKeylist.cpp
===================================================================
--- trunk/Src/wptKeylist.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptKeylist.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -1,5 +1,5 @@
 /* wptKeylist.cpp - Keylist element
- *	Copyright (C) 2001-2005 Timo Schulz
+ *	Copyright (C) 2001-2006 Timo Schulz
  *	Copyright (C) 2004 Andreas Jobs
  *
  * This file is part of WinPT.
@@ -38,8 +38,9 @@
 #include "wptUTF8.h"
 #include "wptRegistry.h"
 #include "wptContext.h"
+#include "wptVersion.h"
+#include "resource.h"
 
-
 #define key_is_useable(key) (!(key)->revoked && !(key)->expired && !(key)->disabled)
 
 struct key_array_s {
@@ -51,42 +52,42 @@
 
 
 static key_array_s*
-key_array_new( size_t items )
+key_array_new (int items)
 {
     key_array_s *ka;
-    size_t j;
+    int j;
     
-    if( items == 0 )
+    if (items == 0)
 	return NULL;
     ka = new key_array_s[items + 1];
-    if( ka == NULL )
-	return NULL;	
-    for ( j = 0; j < items; j++ )
+    if (!ka)
+	BUG (NULL);
+    for (j = 0; j < items; j++)
 	ka[j].checked = 0;
     return ka;
-} /* key_array_new */
+}
 
 
 static void
-key_array_release( key_array_s *ka )
+key_array_release (key_array_s *ka)
 {
-    free_if_alloc( ka );
-} /* key_array_release */
+    free_if_alloc (ka);
+}
 
 
+/* Check if the keyid @keyid is in the key array @ka.
+   Return value: 1 if it exists, 0 otherwise. */
 static int
-key_array_search( key_array_s *ka, size_t items, const char *keyid )
+key_array_search (key_array_s *ka, int items, const char *keyid)
 {
-    size_t j;
+    int j;
     
-    /* fixme: we need a faster search method */
-    for( j = 0; j < items; j++ ) {
-	if( !strcmp( keyid, ka[j].keyid ) )
+    for (j = 0; j < items; j++) {
+	if (!strcmp (keyid, ka[j].keyid ))
 	    return 1;	
     }
-    
     return 0;
-} /* key_array_search */
+}
 
 
 gpgme_user_id_t
@@ -151,14 +152,20 @@
 }
 
 
+/* Return the self signature of the key @keyid.
+   If first is set, the first self sig will be returned. */
 gpgme_key_sig_t
 get_selfsig (gpgme_user_id_t uid, const char *keyid, int first)
 {
     gpgme_key_sig_t s, self_sig=NULL;
     long timestamp=0;
+    int off = 0;
 
+    if (strlen (keyid) == 8)
+	off = 8;
+
     for (s = uid->signatures; s; s = s->next) {
-	if (!strcmp (s->keyid+8, keyid) && s->timestamp > timestamp) {
+	if (!strcmp (s->keyid+off, keyid) && s->timestamp > timestamp) {
 	    self_sig = s;
 	    timestamp = s->timestamp;
 	    if (first)
@@ -182,7 +189,7 @@
     if (keyidx > 0) {
 	k = get_nth_key (key, keyidx-1);
 	subalg =  get_key_pubalgo (k->pubkey_algo);
-	_snprintf( algo_id, DIM (algo_id)-1, "%s", subalg);
+	_snprintf (algo_id, DIM (algo_id)-1, "%s", subalg);
 	return algo_id;
     }
     strcpy (alg, get_key_pubalgo (key->subkeys->pubkey_algo));
@@ -194,17 +201,17 @@
 	return algo_id;
     }
     return get_key_pubalgo (key->subkeys->pubkey_algo);
-} /* get_key_algo */
+}
 
 
 const char*
 get_key_created (long timestamp)
 {
     static char timebuf[128];
-    const char *dat;
     struct tm *warp;
+    const char *dat;
 
-    if (timestamp == 0 || timestamp == -1)
+    if (timestamp < 1)
 	return "????" "-??" "-??";
     dat = get_locale_date (timestamp, timebuf, sizeof (timebuf)-1);
     if (dat)
@@ -222,10 +229,14 @@
 {
     static char timebuf[64];
     struct tm *warp;
+    const char *dat;
 
-    if( !timestamp )
+    if (timestamp == 0)
 	return _("Never");
-    warp = localtime( &timestamp );
+    dat = get_locale_date (timestamp, timebuf, sizeof (timebuf)-1);
+    if (dat)
+	return dat;
+    warp = localtime (&timestamp);
     _snprintf (timebuf, sizeof timebuf -1, "%04d-%02d-%02d",
 	       warp->tm_year + 1900, warp->tm_mon + 1, warp->tm_mday);
     return timebuf;
@@ -263,7 +274,8 @@
     if (n > 1) {
 	k = get_nth_key (key, n-1);
 	size_sub = k->length;
-	_snprintf( size_id, sizeof (size_id) - 1, "%d/%d", size_main, size_sub );
+	_snprintf (size_id, sizeof (size_id) - 1, "%d/%d", 
+		    size_main, size_sub);
 	return size_id;	
     }
     _snprintf( size_id, sizeof (size_id) - 1, "%d", size_main );
@@ -283,6 +295,7 @@
     return "?";
 }
 
+
 const char*
 get_key_pubalgo (gpgme_pubkey_algo_t alg)
 {
@@ -296,7 +309,7 @@
     return "???";
 }
 
-const char *
+const char*
 get_key_fpr (gpgme_key_t key)
 {
     static char fpr_md[64];
@@ -328,7 +341,7 @@
 }
 
 
-const char *
+const char*
 get_key_trust2 (gpgme_key_t key, int val, int uididx, int listmode)
 {
     if (key)
@@ -384,7 +397,7 @@
 	else
 	    s = "";
 	/* if the key has a special status, we don't continue to figure out
-	   what any user-id validities. */
+	   the user-id validities. */
 	if (*s)
 	    return m_strdup (s);
     }
@@ -483,6 +496,7 @@
 }
 
 
+#if 0
 /* Return the validity of the group @grp. */
 static const char*
 calc_validity (gpg_group_t grp)
@@ -504,32 +518,14 @@
     }
     return _("Full");
 }
+#endif
 
 
 int
-keylist_add_groups( listview_ctrl_t lv )
+keylist_add_groups (listview_ctrl_t lv)
 {
-#if 0
-    gpg_optfile_t gh;
-    gpg_group_t grp;
-    const char *valid;
-
-    gh = km_groupdb_open( );    
-    if( !gh )	
-	return WPTERR_FILE_OPEN;
-
-    for( grp = gh->grp; grp; grp = grp->next ) {
-	valid = calc_validity( grp );
-	listview_add_item( lv, " " );	
-	listview_add_sub_item( lv, 0, 0, grp->name );	
-	listview_add_sub_item( lv, 0, 1, "gpg_group_t" );	
-	listview_add_sub_item( lv, 0, 2, "" );	
-	listview_add_sub_item( lv, 0, 3, "Unknown" );
-	listview_add_sub_item( lv, 0, 4, valid?valid : "Unknown" );
-    }
-#endif
     return 0;
-} /* keylist_add_groups */
+}
 
 
 /* Create a listview for listing keys. Use the mode given in @mode
@@ -545,7 +541,6 @@
     {5, 70, (char *)_("Validity")},
     {0, 0, NULL}
     };
-
     struct listview_column_s klist[] = {
     {0, 240, (char *)_("User ID")},
     {1, 78, (char *)_("Key ID")},
@@ -557,7 +552,7 @@
     {7, 72, (char *)_("Creation")},
     {0, 0, NULL}
     };
-
+    HICON ico[2];
     listview_ctrl_t lv;
     listview_column_t col;
     int j, n = 0;
@@ -581,11 +576,14 @@
 	n = (DIM(klist) - 1);
     }
     
-    for( j = 0; j < n; j++ )	
-	listview_add_column( lv, &col[j] );    
-    listview_set_ext_style( lv );
+    for (j = 0; j < n; j++)
+	listview_add_column (lv, &col[j]);
+    listview_set_ext_style (lv);
+    ico[0] = LoadIcon (glob_hinst, (LPCTSTR)IDI_PUBKEY);
+    ico[1] = LoadIcon (glob_hinst, (LPCTSTR)IDI_KEYPAIR);
+    listview_set_image_list (lv, ico, 2);
+
     *r_lv = lv;
-    
     return 0;
 }
 
@@ -694,15 +692,15 @@
 		   key->uids->name, key->subkeys->keyid);
 	return 0;
     }
-
         
     if (listview_add_item2 (lv, " ", (void *)key))
 	return WPTERR_GENERAL;
 
     attr = key->uids->uid;
     memset (&lvi, 0, sizeof lvi);
-    lvi.mask = LVIF_TEXT | LVIF_PARAM;
+    lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
     lvi.pszText = (char *)attr;
+    lvi.iImage = find_secret_key (key)? 1 : 0;
     lvi.lParam = (LPARAM )key;
     if (ListView_SetItem (lv->ctrl, &lvi) == FALSE)
 	return WPTERR_GENERAL;
@@ -714,11 +712,11 @@
     else {
 	u = get_nth_userid (key, uididx);
 	if (!u || u->revoked || uididx < 0)
-	    uididx = 0; /* fixme: this happen sometimes but it's illegal! (<0) */
+	    uididx = 0;
 	u = get_nth_userid (key, uididx);
 	attr = u->uid;
     }
-    if (attr == NULL || strlen (attr) < 5) { /* normal userids are >= 5 chars */
+    if (attr == NULL || strlen (attr) < 5) { /* normal userids are > 5 chars */
 	attr = _("Invalid User ID");
 	listview_add_sub_item (lv, 0, idx++, attr);
     }	
@@ -814,6 +812,7 @@
     }
 }
 
+
 /* Update the listview item at position @pos with the data from
    the key @key. */
 void
@@ -924,7 +923,7 @@
     }
 
     return rc;	
-} /* keylist_add_key */
+}
 
 
 int
@@ -936,14 +935,16 @@
 
 /* Check that the validity @validity is at least >= marginal. */
 static int
-key_check_validity (const char *validity) 
-{    
-    if (strstr (validity, _("Unknown")) ||
-	strstr (validity, _("Undefined")) ||
-	strstr (validity, _("Never")) ||
-	strstr (validity, _("None")))
-	return 0;  
-    return 1;
+key_check_validity (gpgme_key_t key)
+{
+    gpgme_user_id_t u;
+
+    for (u=key->uids; u; u =u->next) {
+	if (u->validity >= GPGME_VALIDITY_MARGINAL)
+	    return -1;
+    }
+
+    return 0;
 }
 
 
@@ -954,16 +955,15 @@
 gpgme_key_t*
 keylist_get_recipients (listview_ctrl_t lv, int *r_force_trust, int *r_count)
 {
+    key_array_s *ka = NULL;
+    gpgme_key_t *keybuf, key;
     int count = 0, force_trust = 0;
     int n, j, ka_pos = 0, rc = 0;
     int k_pos=0;
-    char keyid[32], valid[32], id[100];
-    key_array_s *ka = NULL;
-    gpgme_key_t *keybuf;
 
-    n = listview_count_items( lv, 0 );
+    n = listview_count_items (lv, 0);
     
-    ka = key_array_new( n );
+    ka = key_array_new (n);
     if (!ka)
 	BUG (NULL);
 
@@ -971,14 +971,14 @@
     if (!keybuf)
 	BUG (NULL);
 	
-    for( j = 0; j < n; j++ ) {
-	if( listview_get_item_state (lv, j) || n == 1) {
-	    listview_get_item_text (lv, j, 0, id, sizeof id-1);
-	    listview_get_item_text (lv, j, 1, keyid, sizeof keyid - 1);			
-	    listview_get_item_text (lv, j, 4, valid, sizeof valid -1);
-	    if( !key_check_validity (valid) 
-		 && !key_array_search( ka, ka_pos, keyid )) {
-		char *warn = new char[512+strlen (id) + 1];
+    for (j = 0; j < n; j++) {
+	if (listview_get_item_state (lv, j) || n == 1) {
+	    key = (gpgme_key_t)listview_get_item2 (lv, j);
+	    if (!key)
+		BUG (0);
+	    if (!key_check_validity (key) &&
+		!key_array_search (ka, ka_pos, key->subkeys->keyid)) {
+		char *warn = new char[512+strlen (key->uids->uid) + 1];
 		if (!warn)
 		    BUG (0);
 		sprintf (warn,
@@ -986,27 +986,22 @@
 		      "named in the user ID.  If you *really* know what you are\n"
 		      "doing, you may answer the next question with yes\n"
 		      "\n"
-		      "Use \"%s\" anyway?"), id);
+		      "Use \"%s\" anyway?"), key->uids->uid);
 		if (reg_prefs.always_trust)
 		    rc = IDYES;
 		else
 		    rc = msg_box (NULL, warn, _("Recipients"), MB_ERR_ASK);
 		if (rc == IDYES) {
-		    gpgme_key_t k;
-		    get_pubkey (keyid, &k);
-		    keybuf[k_pos++] = k;
+		    keybuf[k_pos++] = key;
 		    force_trust++;
 		    ka[ka_pos].checked = 1;
-		    strcpy (ka[ka_pos++].keyid, keyid);
+		    strcpy (ka[ka_pos++].keyid, key->subkeys->keyid);
 		    count++;
 		}
 		free_if_alloc (warn);
 	    }
 	    else {
-		gpgme_key_t k;
-		listview_get_item_text( lv, j, 1, keyid, sizeof keyid -1 );
-		get_pubkey (keyid, &k);
-		keybuf[k_pos++] = k;
+		keybuf[k_pos++] = key;
 		count++;	
 	    }
 	}
@@ -1021,34 +1016,27 @@
 
 
 static int
-keylist_get_keyflags (const char *buf, size_t buflen)
+keylist_get_keyflags (gpgme_key_t key)
 {
-    int c = 0, flags = 0;
+    int flags = KEYFLAG_NONE;
 
-    if( *buf != '[' )
-	return KEYFLAG_NONE;
-    while (buf && c != ']') 
-    {
-	c = *buf++;
-	if (c == 'R')
-	    flags |= KEYFLAG_REVOKED;
-	if (c == 'E')
-	    flags |= KEYFLAG_EXPIRED;
-	if (c == 'D')
-	    flags |= KEYFLAG_DISABLED;
-    }
+    if (key->revoked)
+	flags |= KEYFLAG_REVOKED;
+    if (key->expired)
+	flags |= KEYFLAG_EXPIRED;
+    if (key->disabled)
+	flags |= KEYFLAG_DISABLED;
 
     return flags;
-} /* keylist_get_keyflags */
+}
 
 
 gpgme_key_t*
 keylist_enum_recipients (listview_ctrl_t lv,  int listype, int *r_count)
 {
-    gpgme_key_t* rset;
-    gpgme_key_t k;
+    gpgme_key_t *rset;
+    gpgme_key_t key;
     int i, n, id, k_pos=0;
-    char keyid[32], t[128], t2[128];
 
     n = listview_count_items (lv, 0);
     if (!n)
@@ -1056,33 +1044,33 @@
     rset = (gpgme_key_t*)calloc (n, sizeof (gpgme_key_t));
     if (!rset)
 	BUG (NULL);
-    for( i = 0; i < n; i++ ) {
-	if( !listview_get_item_state( lv, i ) )
+    for (i = 0; i < n; i++) {
+	if (!listview_get_item_state (lv, i))
 	    continue;
-	listview_get_item_text( lv, i, 1, keyid, sizeof keyid - 1 );
-	switch( listype ) {
+	key = (gpgme_key_t)listview_get_item2 (lv, i);
+	if (!key)
+	    BUG (0);
+	switch (listype) {
 	case KEYLIST_LIST:
-	    listview_get_item_text( lv, i, 5, t, sizeof t - 1 );
-	    if( keylist_get_keyflags( t, strlen( t ) ) & KEYFLAG_REVOKED ) {
-		_snprintf( t2, sizeof t2 -1, 
-			    _("KeyID %s.\nDo you really want to export a revoked key?"), keyid );
-		id = msg_box( lv->ctrl, t2, _("Recipients"), MB_INFO|MB_YESNO );
-		if( id == IDNO )
-		    continue;		
+	    if (keylist_get_keyflags (key) & KEYFLAG_REVOKED) {
+		id = printf_box (_("Recipients"), MB_INFO|MB_YESNO,
+		_("KeyID %s.\nDo you really want to export a revoked key?"),
+				 key->uids->uid);
+		if (id == IDNO)
+		    continue;
 	    }
 	    break;
 	}
-	get_pubkey (keyid, &k);
-	rset[k_pos++] = k;
+	rset[k_pos++] = key;
     }
     if (r_count)
 	*r_count = k_pos;
     return rset;
-} /* keylist_enum_recipients */
+}
 
 
 void
-seclist_destroy (keylist_t * list)
+seclist_destroy (keylist_t *list)
 {
     keylist_t l2;
     while (*list) {
@@ -1091,7 +1079,7 @@
 	*list = l2;	
     }
     list = NULL;
-} /* seclist_destroy */
+}
 
 
 void
@@ -1129,11 +1117,11 @@
 	    continue;
 
 	uid = utf8_to_wincp (id, strlen (id));
-	size = strlen( uid ) + strlen( keyid ) + 32;
+	size = strlen (uid) + strlen (keyid) + 32;
 	inf = new char[size+1];
-	if( !inf )
-	    BUG( NULL );
-	_snprintf (inf, size, "%s (%s/0x%s)", uid, 
+	if (!inf)
+	    BUG (NULL);
+	_snprintf (inf, size, "%s (%s/0x%s)", uid,
 		   get_key_pubalgo (key->subkeys->pubkey_algo), keyid + 8);
 	combox_add_string (kb, inf);
 	free_if_alloc (inf);
@@ -1150,9 +1138,10 @@
 	    l2->next = l;
 	}
     }
-    for( pos = 0, l2=list; pos < SendMessage( kb, CB_GETCOUNT, 0, 0 ); pos++, l2=l2->next )
-	SendMessage( kb, CB_SETITEMDATA, pos, (LPARAM)(DWORD)l2->key );
-    SendMessage( kb, CB_SETCURSEL, 0, 0 );
+    for (pos = 0, l2=list; pos < SendMessage (kb, CB_GETCOUNT, 0, 0); 
+	 pos++, l2=l2->next)
+	SendMessage (kb, CB_SETITEMDATA, pos, (LPARAM)(DWORD)l2->key);
+    SendMessage (kb, CB_SETCURSEL, 0, 0);
     *ret_list = list;
 }
         

Modified: trunk/Src/wptKeyserver.cpp
===================================================================
--- trunk/Src/wptKeyserver.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptKeyserver.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -1122,69 +1122,93 @@
 }
 
 
+/* Spawn a process given by @cmdl. */
+static int
+spawn_application (char *cmdl)
+{
+    STARTUPINFO si;
+    PROCESS_INFORMATION pi;
+    int rc = 0;
+
+    memset (&si, 0, sizeof (si));
+    si.cb = sizeof (si);
+    si.dwFlags = STARTF_USESHOWWINDOW;
+    si.wShowWindow = SW_HIDE;
+    memset (&pi, 0, sizeof (pi));
+
+    if (!CreateProcess (NULL, cmdl, NULL, NULL, FALSE, 0, 
+			NULL, NULL, &si, &pi)) {
+	log_box ("Keyserver Plugin", MB_ERR, "Could not spawn helper process");
+	rc = -1;
+    }
+
+    CloseHandle (pi.hThread);
+    WaitForSingleObject (pi.hProcess, INFINITE);
+    CloseHandle (pi.hProcess);
+    return rc;
+}
+
+
 /* Receive an key via LDAP from host @host with the keyid @keyid.
    @key contains the key on success. */
 int 
 ldap_recvkey (const char *host, const char *keyid, char *key, int maxkeylen)
-{
+{    
+    FILE *inp;
+    DWORD n;
     const char *s;
-    char *ksprg = NULL, *p = NULL;
+    char *ksprg = NULL, *p = NULL, *sep;
     char temp[512], outf[512];
-    FILE * inp;
-    int rc, start_key = 0;
-    STARTUPINFO si;
-    PROCESS_INFORMATION pi;
+    int start_key = 0, failed = 0;
+    int rc = 0;
 
-    p = get_gnupg_path ();
-    ksprg = new char[strlen (p) + 1 + 128];
+    p = get_gnupg_prog ();
+    n = strlen (p) + 1 + 128;
+    ksprg = new char[n+1];
     if (!ksprg)
 	BUG (0);
-    strcpy (ksprg, p);
-    strcat (ksprg, "\\");
-    strcat (ksprg, "gpgkeys_ldap.exe");
+    sep = strrchr (p, '\\');
+    if (sep != NULL)
+	p[(sep-p)] = 0;
+
+    _snprintf (ksprg, n, "%s\\gpgkeys_ldap.exe", p);
     free_if_alloc (p);
     if (file_exist_check (ksprg)) {
-	log_box ( "LDAP Keyserver Plugin", MB_ERR, "Could not find LDAP keyserver module!");
-	rc = -1; 
+	log_box ("LDAP Keyserver Plugin", MB_ERR, 
+		 "%s: could not find LDAP keyserver module!", ksprg);
+	rc = -1;
 	goto leave;
-    }
+    }    
     GetTempPath (sizeof (temp)-1, temp);
-    strcpy (outf, temp);
-    strcat (outf, keyid);
-    strcat (outf, ".out");
+    _snprintf (outf, sizeof (outf)-1, "%s%s.out", temp, keyid);
     strcat (temp, keyid);
     inp = fopen (temp, "w+b");
-    if( !inp ) {
+    if (!inp) {
 	log_box ("LDAP Keyserver Plugin", MB_ERR, "%s: %s", temp,
 		 winpt_strerror (WPTERR_FILE_OPEN));
 	rc = -1;
 	goto leave;
     }
     fprintf (inp, 
-	"VERSION 0\n"
+	"VERSION 1\n"
+	"PROGRAM 1.4.3-cvs\n"
+	"SCHEME ldap\n"
 	"HOST %s\n"
-	"OPTION verbose\n"
 	"COMMAND GET\n"
 	"\n"
-	"%s\n", host? skip_type_prefix (host): "64.94.85.200", keyid);
+	"%s\n",
+	host? skip_type_prefix (host): "64.94.85.200", keyid);
     fclose (inp);
 
-    memset (&si, 0, sizeof (si));
-    si.cb = sizeof (si);
-    si.dwFlags = STARTF_USESHOWWINDOW;
-    si.wShowWindow = SW_HIDE;
-    memset (&pi, 0, sizeof (pi));
     p = new char[strlen (ksprg) + strlen (temp) + strlen (outf) + 32];
+    if (!p)
+	BUG (NULL);
     sprintf (p, "%s -o %s %s", ksprg, outf, temp);
-    rc = CreateProcess (NULL, p, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
-    if (!rc) {
-	log_box ("LDAP Keyserver Plugin", MB_ERR, "Could not spawn process");
+    if (spawn_application (p)) {
 	rc = -1;
 	goto leave;
     }
-    CloseHandle (pi.hThread);
-    WaitForSingleObject (pi.hProcess, INFINITE);
-    CloseHandle (pi.hProcess);
+    DeleteFile (temp);
 
     inp = fopen (outf, "rb");
     if (!inp) {
@@ -1194,28 +1218,33 @@
 	goto leave;
     }
     memset (key, 0, maxkeylen);
-    while( !feof( inp ) ) {
-	s = fgets( temp, sizeof (temp)-1, inp );
-	if( !s )
+    while (!feof (inp)) {
+	s = fgets (temp, sizeof (temp)-1, inp);
+	if (!s)
 	    break;
-	if( !start_key && strstr( s, "KEY" ) && strstr( s, "BEGIN" ) ) {
+	if (strstr (s, "KEY") && strstr (s, "FAILED")) {
+	    failed = 1;
+	    break;
+	}
+	if (!start_key && strstr (s, "KEY") && strstr (s, "BEGIN")) {
 	    start_key = 1;
 	    continue;
 	}	
-	if( !start_key )
+	if (!start_key)
 	    continue;
-	strcat( key, temp );
-	maxkeylen -= strlen( temp );
-	if( maxkeylen < 0 || (strstr( s, "KEY" ) && strstr( s, "END" )) )	    
+	strcat (key, temp);
+	maxkeylen -= strlen (temp);
+	if (maxkeylen < 0 || (strstr (s, "KEY") && strstr (s, "END")))
 	    break;
     }
-    fclose( inp );    
+    fclose (inp);
 
 leave:
-    if( !strlen( key ) )
+    if (failed || !strlen (key))
 	rc = WPTERR_WINSOCK_RECVKEY;
-    free_if_alloc( p );
-    free_if_alloc( ksprg );
+    DeleteFile (outf);
+    free_if_alloc (p);
+    free_if_alloc (ksprg);
     return rc;
 }
 

Modified: trunk/Src/wptKeyserverDlg.cpp
===================================================================
--- trunk/Src/wptKeyserverDlg.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptKeyserverDlg.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -160,10 +160,10 @@
 /* Receive a key from the keyserver @kserver (port @port)
    with the pattern @pattern.
    Return value: 0 on success. */
-int
-hkp_recv_key2 (HWND dlg, const char *kserver, WORD port,
-	       const char *pattern, int proto, int flags,
-	       char **r_fpr)
+static int
+keyserver_recv_key (HWND dlg, const char *kserver, WORD port,
+		    const char *pattern, int proto, int flags,
+		    char **r_fpr)
 {
     gpgme_ctx_t ctx;
     gpgme_data_t keydata;
@@ -243,13 +243,14 @@
 }
 
 
-/* Alias for hkp_recv_key2 but without the ability to return 
+/* Alias for keyserver_recv_key but without the ability to return 
    the fingerprint of the key. */
 int
 hkp_recv_key (HWND dlg, const char *kserver, WORD port,
 	      const char *pattern, int proto, int flags)
 {
-    return hkp_recv_key2 (dlg, kserver, port, pattern, proto, flags, NULL);
+    return keyserver_recv_key (dlg, kserver, port, pattern, 
+			       proto, flags, NULL);
 }
 
 
@@ -549,8 +550,9 @@
 			_("HKP Keyserver"), MB_INFO);
                 return FALSE;
             }
-	    rc = hkp_recv_key2 (dlg, kserver, kserver_get_port (lv),
-				pattern, proto_nr, 0, key? &key->fpr : NULL);
+	    rc = keyserver_recv_key (dlg, kserver, kserver_get_port (lv),
+				     pattern, proto_nr, 0,
+				      key? &key->fpr : NULL);
 	    if (!rc && key->fpr != NULL) {
 		keycache_update (0, key->fpr);
 		get_pubkey (key->fpr, &key->newkey);

Modified: trunk/Src/wptListView.cpp
===================================================================
--- trunk/Src/wptListView.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptListView.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -1,5 +1,5 @@
 /* wptListView.cpp - Dynamic list view control
- *	Copyright (C) 2000-2005 Timo Schulz
+ *	Copyright (C) 2000-2006 Timo Schulz
  *	Copyright (C) 2004 Andreas Jobs
  *
  * This file is part of WinPT.
@@ -38,31 +38,34 @@
 
 
 int
-listview_new( listview_ctrl_t *ctx )
+listview_new (listview_ctrl_t *ctx)
 {
     struct listview_ctrl_s *c;
 
     c = new struct listview_ctrl_s;
-    if( !c )
-	BUG( NULL );
+    if (!c)
+	BUG (NULL);
     c->cols = 0;
     c->items = 0;
-    c->ctrl = NULL;	
+    c->ctrl = NULL;
+    c->hil = NULL;
     *ctx = c;
     return 0;
 } /* listview_new */
 
 
 void
-listview_release( listview_ctrl_t ctx )
+listview_release (listview_ctrl_t ctx)
 {
-    if( ctx ) {
-	ctx->cols = 0;
-	ctx->ctrl = NULL;
-	ctx->items = 0;	
-	delete ctx; 
-	ctx = NULL;
-    }
+    if (!ctx)
+	return;
+
+    ctx->cols = 0;
+    ctx->ctrl = NULL;
+    ctx->items = 0;
+    if (ctx->hil)
+	ImageList_Destroy (ctx->hil);
+    delete ctx;
 } /* listview_release */
 
 
@@ -93,9 +96,8 @@
 
     memset (&lvi, 0, sizeof lvi);
     lvi.iItem = pos;
-    rc = ListView_InsertItem (ctx->ctrl, &lvi);
-    if (rc == -1)
-	rc = 1;	
+    if (ListView_InsertItem (ctx->ctrl, &lvi) != pos)
+	rc = -1;
     ctx->items++;
     return rc;
 }
@@ -119,6 +121,24 @@
 
 
 int
+listview_add_item_image (listview_ctrl_t ctx, const char *text, int image)
+{
+    int rc = 0;
+    LV_ITEM lvi;
+
+    memset( &lvi, 0, sizeof lvi );
+    lvi.mask = LVIF_TEXT | LVIF_IMAGE;
+    lvi.pszText = (char *)text;
+    lvi.iImage = image;
+    rc = ListView_InsertItem (ctx->ctrl, &lvi);
+    if (rc == -1)
+	rc = 1;	
+    ctx->items++;
+    return rc;
+}
+
+
+int
 listview_add_item2 (listview_ctrl_t ctx, const char *text, void *magic)
 {
     int rc = 0;
@@ -368,3 +388,17 @@
     if ((style & LVS_TYPEMASK) != view)
 	SetWindowLong (ctx->ctrl, GWL_STYLE, (style & ~LVS_TYPEMASK) | view);
 }
+
+
+void
+listview_set_image_list (listview_ctrl_t ctx, HICON *ico, DWORD nicons)
+{
+    HIMAGELIST hil;
+    DWORD i;
+
+    hil = ImageList_Create (16, 16, ILC_COLOR16, nicons, 1);
+    for (i=0; i < nicons; i++)
+	ImageList_AddIcon (hil, ico[i]);
+    ListView_SetImageList (ctx->ctrl, hil, LVSIL_SMALL);
+}
+    

Modified: trunk/Src/wptSigList.cpp
===================================================================
--- trunk/Src/wptSigList.cpp	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/Src/wptSigList.cpp	2006-01-09 09:15:29 UTC (rev 133)
@@ -1,6 +1,6 @@
 /* wptSigList.cpp - Listview for key signatures
- *	Copyright (C) 2001-2005 Timo Schulz
- *	Copyright (C) 2005 g10 Code GmbH
+ *	Copyright (C) 2001-2006 Timo Schulz
+ *	Copyright (C) 2005, 2006 g10 Code GmbH
  *
  * This file is part of WinPT.
  *
@@ -63,9 +63,9 @@
     if (rc)
 	return rc;
     c->ctrl = ctrl;
-    for ( j=0; implist[j].fieldname != NULL; j++ )
-	listview_add_column( c, &implist[j] );
-    listview_set_ext_style( c );
+    for  (j=0; implist[j].fieldname != NULL; j++)
+	listview_add_column (c, &implist[j]);
+    listview_set_ext_style (c);
     *lv = c;
     return 0;
 }
@@ -103,18 +103,20 @@
    control @lv.
    Return value: 0 on success. */
 static int
-siglist_add_key (listview_ctrl_t lv, gpgme_user_id_t uid, gpgme_key_sig_t ks)
+siglist_add_key (listview_ctrl_t lv, gpgme_user_id_t uid, 
+		 gpgme_key_sig_t ks, int pos)
 {
     gpgme_key_t key=NULL;
     char t[128];
     const char *attr;
     const char *s;
-    int rc = 0, key_attr;
+    int key_attr;
+    int rc = 0;
 
     if (ks && !IS_UID_CERT (ks->sig_class))
 	return 0;
-
-    rc = listview_add_item (lv, " ");
+    
+    rc = listview_add_item_pos (lv, pos);
     if (rc)
 	return rc;
 
@@ -129,12 +131,12 @@
     if (attr && strlen (attr)) {
 	char *uid_utf8 = utf8_to_wincp (attr, strlen (attr));
 	char *p = uid? m_strdup (uid_utf8) : indent_string (uid_utf8, 2);
-	listview_add_sub_item (lv, 0, 0, p);
+	listview_add_sub_item (lv, pos, 0, p);
 	free (uid_utf8);
 	free_if_alloc (p);
     }
     else
-	listview_add_sub_item (lv, 0, 0, _("  user ID not found"));
+	listview_add_sub_item (lv, pos, 0, _("  user ID not found"));
 
     if (uid)
 	return 0;
@@ -145,7 +147,7 @@
     case GPG_ERR_BAD_SIGNATURE:s = "NO";    break;
     default:                   s = "ERROR"; break;
     }
-    listview_add_sub_item( lv, 0, 1, s );
+    listview_add_sub_item (lv, pos, 1, s);
 
     switch (ks->sig_class) {
     case 0x10: strcpy (t, " "); break;
@@ -159,30 +161,30 @@
 	strcat (t, "L");
     /*if (key_attr & GPGME_SIGF_NREV)
 	strcat (t, "R");*/
-    listview_add_sub_item (lv, 0, 2, t);
+    listview_add_sub_item (lv, pos, 2, t);
 
     key_attr = ks->timestamp;
     if( key_attr ) {
-	s = get_key_created( key_attr );
-	listview_add_sub_item( lv, 0, 3, s );
+	s = get_key_created (key_attr);
+	listview_add_sub_item (lv, pos, 3, s);
     }
     
     attr = ks->keyid;
-    if( attr && strlen( attr ) == 16 ) {
-	_snprintf (t, sizeof t -1, "0x%s", attr + 8);
-	listview_add_sub_item( lv, 0, 4, t );
+    if (attr && strlen (attr) == 16) {
+	_snprintf (t, sizeof (t) -1, "0x%s", attr + 8);
+	listview_add_sub_item (lv, pos, 4, t);
     }
 
     key_attr = ks->expires;
     if (key_attr) {
 	s = get_key_created (key_attr);
-	listview_add_sub_item (lv, 0, 5, s);
+	listview_add_sub_item (lv, pos, 5, s);
     }
 
     attr = get_key_pubalgo (ks->pubkey_algo);
-    if( attr )
-	listview_add_sub_item( lv, 0, 6, (char *)attr );
-    
+    if (attr)
+	listview_add_sub_item (lv, pos, 6, (char *)attr);
+
     return 0;
 }
 
@@ -197,6 +199,7 @@
     gpgme_user_id_t u;
     gpgme_key_sig_t s;
     listview_ctrl_t lv;
+    int pos = 0;
     int rc;
 
     if (siglist_build (&lv, ctrl))
@@ -205,11 +208,12 @@
     if (rc)
 	BUG (NULL);
 
-    /* XXX: the root item is at the end but should come first. */
     for (u=key->uids; u; u = u->next) {
-	siglist_add_key (lv, u, NULL);
+	siglist_add_key (lv, u, NULL, pos++);
 	for (s = u->signatures; s; s = s->next) {
-	    rc = siglist_add_key (lv, NULL, s);
+	    if (!IS_UID_CERT (s->sig_class))
+		continue;
+	    rc = siglist_add_key (lv, NULL, s, pos++);
 	    if (rc)
 		break;
 	}

Modified: trunk/THANKS
===================================================================
--- trunk/THANKS	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/THANKS	2006-01-09 09:15:29 UTC (rev 133)
@@ -66,4 +66,4 @@
 Ulf Jaenicke-Rößler ujr at arcor.de
 Werner Koch         wk at gnupg.org
 Vasyl Kondrashov    vasyl at male.ru
-                    vedaal at lok.com
+Vedaal Nistar       vedaal at hush.com

Modified: trunk/TODO
===================================================================
--- trunk/TODO	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/TODO	2006-01-09 09:15:29 UTC (rev 133)
@@ -1,6 +1,9 @@
 Feel free if you think there is missing something to mail me.
 
 -0.11.x-
+    * Keyserver searching does not work (might segv) when the
+      key has no (valid) email address.
+      
     * winpt --keymanager aborts when the keyring is empty on the
       first start.
  
@@ -14,9 +17,6 @@
       it possible to convert old groupdb.gpg files into native GPG format.
       (I work on it)
 
-    * Find a way to make the import preview dialog much faster.
-      --output does not work and thus we need another solution.
-
     * check the file register code
       WinPT will not associate the files correctly. This is due to the lack
       of quotes surrounding the executable path. (I know, Timo must be mad
@@ -31,7 +31,6 @@
         - sign/decrypt
         - factor out some common code into wptCardManager.cpp
     * Implement --armor in the FM for --symmetric.
-    * Implement --interactive for --import.
     * Winpt should take care for a multi user environment.
     * Move the both managers (key/file) to separate applications
       and use ActiveX control elemens for the treelist element.
@@ -43,7 +42,5 @@
     * Sometimes the sign & encrypt dialog causes a crash when the wrong
       passphrase was entered (not reproducable on my machine!)
     * Implement the non-swapable memory for passphrase handling.
-    * Encrypt only environment (No secret key support).
-    * DDE. This feature has a very low priority.
 
 And much more...

Modified: trunk/configure.ac
===================================================================
--- trunk/configure.ac	2006-01-06 19:45:59 UTC (rev 132)
+++ trunk/configure.ac	2006-01-09 09:15:29 UTC (rev 133)
@@ -16,7 +16,6 @@
 # Version number: Remember to change it immediately *after* a release.
 #                 Add a "-cvs" prefix for non-released code.
 AC_INIT(WinPT, 0.11.5-cvs, http://www.winpt.org)
-
 NEED_GPGME_API=1
 NEED_GPGME_VERSION=1.1.1
 NEED_GPG_ERROR_VERSION=1.2
@@ -249,7 +248,6 @@
 Src/Makefile
 Src/versioninfo.rc        
 Include/Makefile
-Ico/Makefile
 icons/Makefile
 m4/Makefile
 Gnupg/Makefile

Modified: trunk/icons/key_delete.ico
===================================================================
(Binary files differ)

Modified: trunk/icons/key_export.ico
===================================================================
(Binary files differ)

Modified: trunk/icons/key_import.ico
===================================================================
(Binary files differ)

Modified: trunk/icons/key_props.ico
===================================================================
(Binary files differ)



More information about the Winpt-commits mailing list