/[winpt]/trunk/Src/wptKeyManager.cpp
ViewVC logotype

Annotation of /trunk/Src/wptKeyManager.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 130 - (hide annotations)
Fri Dec 30 14:06:39 2005 UTC (19 years, 2 months ago) by twoaday
File size: 23705 byte(s)
2005-12-29  Timo Schulz  <ts@g10code.com>
  
        * wptKeygenDlg.cpp (keygen_dlg_proc): Request passphrase dynamically.
        (gpg_genkey_params): Simplified.
        * wptPreferencesDlg.cpp (prefs_dlg_proc): Fix problem with mutal
        exclusion of the dialog items.
        * wptAboutDlgs.cpp (about_winpt_dlg_proc): Allow to use ESC to
        quit the dialog.
        * wptKeyManagerDlg.cpp (keymanager_dlg_proc): Likewise.
        * wptMDSumDlg.cpp (mdsum_dlg_proc): Handle WM_SYSCOMMAND.
        (id2algo): New.

Prepare 0.11.4 release.


1 werner 36 /* wptKeyManager.cpp - Handy functions for the Key Manager dialog
2     * Copyright (C) 2001-2005 Timo Schulz
3     * Copyright (C) 2005 g10 Code GmbH
4     *
5     * This file is part of WinPT.
6     *
7     * WinPT is free software; you can redistribute it and/or
8     * modify it under the terms of the GNU General Public License
9     * as published by the Free Software Foundation; either version 2
10     * of the License, or (at your option) any later version.
11     *
12     * WinPT is distributed in the hope that it will be useful,
13     * but WITHOUT ANY WARRANTY; without even the implied warranty of
14     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15     * General Public License for more details.
16     *
17     * You should have received a copy of the GNU General Public License
18     * along with WinPT; if not, write to the Free Software Foundation,
19     * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20     */
21 twoaday 121
22 werner 36 #ifdef HAVE_CONFIG_H
23     #include <config.h>
24     #endif
25    
26     #include <windows.h>
27     #include <commctrl.h>
28     #include <stdio.h>
29    
30     #include "gpgme.h"
31 werner 47 #include "resource.h"
32 werner 36 #include "wptTypes.h"
33     #include "wptW32API.h"
34     #include "wptVersion.h"
35     #include "wptCommonCtl.h"
36     #include "wptNLS.h"
37     #include "wptErrors.h"
38     #include "wptContext.h"
39     #include "wptGPG.h"
40     #include "wptKeylist.h"
41     #include "wptFileManager.h"
42     #include "wptDlgs.h"
43     #include "wptKeyserver.h"
44     #include "wptKeyManager.h"
45     #include "wptKeylist.h"
46     #include "wptHTTP.h"
47     #include "wptKeyEdit.h"
48     #include "wptImport.h"
49 werner 48 #include "wptCrypto.h"
50 twoaday 129 #include "wptUTF8.h"
51 werner 36
52    
53 twoaday 130 /* Macros to change the cursor */
54     #define op_begin() SetCursor (LoadCursor (NULL, IDC_WAIT))
55     #define op_end() SetCursor (LoadCursor (NULL, IDC_ARROW))
56    
57    
58 werner 36 /* Return a user friendly key representation in @buf of
59     the key given by @keyid. */
60     static void
61     key_get_clip_info (const char *keyid, char *buf, size_t buflen)
62     {
63     gpgme_key_t pk;
64 twoaday 129 char *uid;
65 werner 36
66     if (get_pubkey (keyid, &pk))
67     BUG (NULL);
68 twoaday 129 uid = utf8_to_wincp2 (pk->uids->uid);
69 werner 36 _snprintf (buf, buflen-1,
70     "pub %04d%s/%s %s %s\r\n"
71     " Primary key fingerprint: %s\r\n",
72     pk->subkeys->length,
73 twoaday 128 get_key_pubalgo2 (pk->subkeys->pubkey_algo),
74 werner 36 pk->subkeys->keyid+8,
75     get_key_created (pk->subkeys->timestamp),
76 twoaday 129 uid,
77 werner 36 get_key_fpr (pk));
78 twoaday 129 safe_free (uid);
79 werner 36 }
80    
81    
82 twoaday 128 /* Return a general description of the key @key. */
83     static char*
84     key_get_info (gpgme_key_t pk, int is_sec)
85     {
86     const char *fmt = "%s %04d%s/0x%s %s\n \"%s\"";
87 twoaday 129 char *p, *uid;
88 twoaday 128 int n;
89    
90     n = strlen (fmt) + 8 + 2 + 16 + 12 + strlen (pk->uids->uid) + 32;
91     p = new char[n+1];
92     if (!p)
93     BUG (NULL);
94 twoaday 129 uid = utf8_to_wincp2 (pk->uids->uid);
95 twoaday 128 _snprintf (p, n, fmt, is_sec? "sec" : "pub",
96     pk->subkeys->length,
97     get_key_pubalgo2 (pk->subkeys->pubkey_algo),
98     pk->subkeys->keyid+8, get_key_created (pk->subkeys->timestamp),
99 twoaday 129 uid);
100     safe_free (uid);
101 twoaday 128 return p;
102     }
103    
104    
105 werner 36 #if 0
106     /* Quoted the user-id given by @uid. If @uid is already
107     quoted @uid is returned without any modifications.
108     Return value: quoted @uid. */
109     char*
110     km_quote_uid (const char *uid)
111     {
112     char *q;
113    
114     if (*uid == '"' && uid[strlen (uid)-1] == '"')
115     return m_strdup (uid);
116     q = new char[strlen (uid) + 4];
117     if (!q)
118     BUG (NULL);
119     _snprintf (q, strlen (uid) + 3, "\"%s\"", uid);
120     return q;
121     }
122     #endif
123    
124    
125     /* Check if list view @lv contains a secret key at position @pos.
126     If utrust is valid, set it to 1 if the key is valid -1 otherwise.
127     Return value: 1 normal key, 2 smart card key. */
128     int
129     km_check_for_seckey (listview_ctrl_t lv, int pos, int *utrust)
130     {
131 twoaday 128 gpgme_key_t key;
132     winpt_key_s sk;
133 werner 36 int type = 0;
134    
135 twoaday 128 key = (gpgme_key_t)listview_get_item2 (lv, pos);
136     if (!key)
137     BUG (NULL);
138 werner 36 if (utrust)
139     *utrust = 0;
140 twoaday 128 memset (&sk, 0, sizeof (sk));
141     if (!winpt_get_seckey (key->subkeys->keyid+8, &sk))
142 werner 36 type = 1;
143 twoaday 128 if (sk.ext && sk.ext->gloflags.divert_to_card)
144 werner 36 type = 2;
145 twoaday 128 if (utrust && (key->expired || key->revoked))
146 werner 36 *utrust = -1;
147 twoaday 128 else if (utrust && key->owner_trust == GPGME_VALIDITY_ULTIMATE)
148 werner 36 *utrust = 1;
149     return type;
150     }
151    
152    
153     /* Check if the key at position @pos is protected with a passwd. */
154     int
155     km_check_if_protected (listview_ctrl_t lv, int pos)
156     {
157     gpgme_key_t key;
158     winpt_key_s k;
159    
160     key = (gpgme_key_t)listview_get_item2 (lv, pos);
161     if (!key)
162     return 1; /* assume yes */
163     winpt_get_pubkey (key->subkeys->keyid, &k);
164     return k.is_protected;
165     }
166    
167    
168 twoaday 121 /* Check if the key has a good status.
169     Return value: 0 on success. */
170 werner 36 int
171     km_check_key_status (listview_ctrl_t lv, int pos)
172     {
173     int flags = km_get_key_status (lv, pos);
174    
175     if (flags & KM_FLAG_EXPIRED) {
176     msg_box (lv->ctrl, _("This key has expired!\n"
177     "Key check failed."), _("Key Manager"), MB_ERR);
178     return -1;
179     }
180     else if (flags & KM_FLAG_REVOKED) {
181     msg_box (lv->ctrl, _("This key has been revoked by its owner!\n"
182     "Key check failed."), _("Key Manager"), MB_ERR);
183     return -1;
184     }
185    
186     return 0;
187 twoaday 121 }
188 werner 36
189    
190 twoaday 121 /* Return all key flags ORed. */
191 werner 36 int
192     km_get_key_status (listview_ctrl_t lv, int pos)
193     {
194     gpgme_key_t key;
195     int flags = 0;
196    
197     if (pos == -1)
198     return 0;
199     key = (gpgme_key_t)listview_get_item2 (lv, pos);
200     if (key == NULL)
201     return 0;
202    
203     if (key->expired)
204     flags |= KM_FLAG_EXPIRED;
205     if (key->revoked)
206     flags |= KM_FLAG_REVOKED;
207     if (key->disabled)
208     flags |= KM_FLAG_DISABLED;
209     return flags;
210 twoaday 121 }
211 werner 36
212    
213     /* Interface to enable or disable a key (@enable = 1 then enable).
214     The key is retrieved from a list control @lv at the pos @pos. */
215     int
216     km_enable_disable_key (listview_ctrl_t lv, HWND dlg, int pos, int enable)
217     {
218 twoaday 128 gpgme_error_t err;
219     gpgme_key_t key;
220 werner 36 GpgKeyEdit *ke;
221    
222 twoaday 128 key = (gpgme_key_t)listview_get_item2 (lv, pos);
223     if (!key)
224     BUG (NULL);
225     ke = new GpgKeyEdit (key->subkeys->keyid);
226 werner 36 if (!ke)
227     BUG (NULL);
228    
229     err = enable? ke->enable () : ke->disable ();
230 twoaday 121 if (!err)
231 werner 36 show_msg (dlg, 1500, _("Key status changed."));
232     else
233     msg_box (dlg, gpgme_strerror (err), _("Key Manager"), MB_ERR);
234     delete ke;
235     return err? WPTERR_GENERAL : 0;
236     }
237    
238    
239    
240     /* Create a string that contain all keyids from
241     the key list @rset separated by a space. */
242     char*
243     gpg_keylist_to_pattern (gpgme_key_t *rset, int n)
244     {
245     char *p;
246     int i;
247    
248     if (!n)
249     return NULL;
250     p = (char *)calloc (1, n*(16+1)+n+2);
251     if (!p)
252     BUG (NULL);
253     for (i=0; i < n; i++) {
254     strcat (p, rset[i]->subkeys->keyid);
255     strcat (p, " ");
256     }
257     return p;
258     }
259    
260    
261     /* Export the keys given in @rset to the clipboard.
262     Return value: 0 on success. */
263     static gpgme_error_t
264     gpg_clip_export (gpgme_key_t *rset, int n)
265     {
266     gpgme_error_t err = 0;
267     gpgme_ctx_t ctx = NULL;
268     gpgme_data_t keydata = NULL;
269     char *patt=NULL;
270    
271     err = gpgme_new (&ctx);
272     if (err)
273     return err;
274     gpgme_set_armor (ctx, 1);
275     err = gpgme_data_new (&keydata);
276     if (err)
277     goto leave;
278    
279     patt = gpg_keylist_to_pattern (rset, n);
280     if (!patt) {
281     err = gpg_error (GPG_ERR_ENOMEM);
282     goto leave;
283     }
284    
285     err = gpgme_op_export (ctx, patt, 0, keydata);
286     if (err)
287     goto leave;
288    
289     gpg_data_release_and_set_clipboard (keydata, 1);
290    
291     leave:
292     if (patt)
293     free (patt);
294     gpgme_release (ctx);
295     return err;
296     }
297    
298    
299     /* Export the selected keys in @lv to the clipboard. */
300     int
301     km_clip_export (HWND dlg, listview_ctrl_t lv)
302     {
303     gpgme_error_t err;
304     gpgme_key_t *rset;
305     char buf[256];
306     int n=0;
307     int rc=0;
308    
309     rset = keylist_enum_recipients (lv, KEYLIST_LIST, &n);
310     if (!n) {
311 twoaday 121 msg_box (dlg, _("No key was selected for export."),
312     _("Key Manager"), MB_ERR);
313     rc = WPTERR_GENERAL;
314 werner 36 goto leave;
315     }
316    
317     err = gpg_clip_export (rset, n);
318     if (err) {
319     msg_box( dlg, gpgme_strerror (err), _("Key Manager"), MB_ERR);
320     rc = WPTERR_GENERAL;
321     goto leave;
322     }
323     if (n == 1) {
324     key_get_clip_info (rset[0]->subkeys->keyid, buf, sizeof (buf)-1);
325     set_clip_text2 (NULL, buf, strlen (buf), 0);
326     }
327    
328     show_msg (dlg, 1500, _("GnuPG Status: Finished"));
329    
330     leave:
331     free (rset);
332     return rc;
333 twoaday 121 }
334 werner 36
335    
336     /* Export the selected secret key from @lv into @fname.
337     It is only allowed to export a single secret key. */
338     int
339     km_privkey_export (HWND dlg, listview_ctrl_t lv, const char *fname)
340     {
341     gpgme_key_t *rset;
342     gpgme_error_t err;
343     int n = 0;
344    
345     rset = keylist_enum_recipients (lv, KEYLIST_LIST, &n);
346     if (!n) {
347     msg_box (dlg, _("No key was selected for export."),
348     _("Key Manager"), MB_ERR);
349     return WPTERR_GENERAL;
350     }
351     if (n > 1) {
352     msg_box (dlg, _("Only one secret key can be exported."),
353     _("Key Manager"), MB_ERR);
354     free (rset);
355     return 0; /* we checked this before, so we just quit */
356     }
357    
358     err = gpg_export_seckey (rset[0]->subkeys->keyid, fname);
359     if (err)
360     msg_box (dlg, gpgme_strerror (err), _("Key Manager"), MB_ERR);
361     else
362     log_box (_("Key Manager"), MB_OK,
363     _("Secret key successfully saved in '%s'."), fname);
364    
365     free (rset);
366     return err? WPTERR_GENERAL : 0;
367     }
368    
369    
370 twoaday 129 /* Export the selected recipients from @lv into the file @fname. */
371 werner 36 int
372 twoaday 129 km_file_export (HWND dlg, listview_ctrl_t lv, const char *fname)
373 werner 36 {
374     gpgme_key_t *rset;
375     gpgme_data_t keydata;
376     gpgme_error_t err;
377     gpgme_ctx_t ctx;
378     char *patt;
379     int n;
380    
381     rset = keylist_enum_recipients (lv, KEYLIST_LIST, &n);
382     if (!n) {
383     msg_box (dlg, _("No key was selected for export."),
384     _("Key Manager"), MB_ERR);
385     return WPTERR_GENERAL;
386     }
387    
388     err = gpgme_data_new (&keydata);
389     if (err)
390     BUG (NULL);
391     err = gpgme_new (&ctx);
392     if (err)
393     BUG (NULL);
394     gpgme_set_armor (ctx, 1);
395    
396     /*gpgme_set_comment (ctx, "Generated by WinPT "PGM_VERSION);*/
397     patt = gpg_keylist_to_pattern (rset, n);
398    
399 twoaday 121 err = gpgme_op_export (ctx, patt, 0, keydata);
400 werner 36 if( err ) {
401 twoaday 121 msg_box (dlg, gpgme_strerror (err), _("Key Manager"), MB_ERR);
402 werner 36 goto leave;
403     }
404 twoaday 121
405     log_box (_("Key Manager"), MB_OK,
406     _("Key(s) successfully saved in '%s'."), fname);
407 werner 36
408     leave:
409 twoaday 121 err = gpg_data_release_and_set_file (keydata, fname);
410 werner 36 if (err)
411     log_box (_("Key Manager"), MB_OK,
412     _("Could not save data to '%s'."), fname);
413     gpgme_release (ctx);
414     free (patt);
415     return (int)err;
416 twoaday 121 }
417 werner 36
418    
419 twoaday 121 /* Read a dash escaped key from the clipboard
420     unescape it and write it back. */
421 werner 36 static int
422     extract_dash_escaped_key (void)
423     {
424     gpgme_data_t inp, plain;
425     gpgme_error_t err;
426    
427     err = gpg_data_new_from_clipboard (&inp, 0);
428     if (err) {
429 twoaday 121 msg_box (NULL, gpgme_strerror (err), _("Key Manager"), MB_ERR);
430 werner 36 return -1;
431     }
432     gpg_data_extract_plaintext (inp, &plain);
433     gpg_data_release_and_set_clipboard (plain, 0);
434     gpgme_data_release (inp);
435    
436     return 0;
437 twoaday 121 }
438 werner 36
439    
440     /* Import keys from the clipboard. */
441     int
442     km_clip_import (HWND dlg)
443     {
444     gpgme_error_t err;
445     int pgptype;
446     int id;
447     int has_data = 0;
448    
449     if (!gpg_clip_istext_avail (&has_data) && !has_data) {
450 twoaday 121 msg_box (dlg, winpt_strerror (WPTERR_CLIP_ISEMPTY),
451     _("Key Manager"), MB_ERR);
452 werner 36 return WPTERR_CLIP_ISEMPTY;
453     }
454     err = gpg_clip_is_secured (&pgptype, &has_data);
455     if (err)
456     msg_box (dlg, gpgme_strerror (err), _("Key Manager"), MB_ERR);
457     if (!has_data) {
458 twoaday 121 msg_box (dlg, _("No valid OpenPGP data found."),
459     _("Key Manager"), MB_ERR);
460 werner 36 return WPTERR_GENERAL;
461     }
462     if (!(pgptype & PGP_PUBKEY) && !(pgptype & PGP_SECKEY)) {
463 twoaday 121 msg_box (dlg, _("No valid OpenPGP keys found."),
464     _("Key Manager"), MB_ERR);
465 werner 36 return WPTERR_GENERAL;
466     }
467     if (pgptype & PGP_DASH_ESCAPED) {
468     id = msg_box (dlg, _("The key you want to import is dash escacped.\n"
469     "Do you want to extract the key?"),
470     _("Key Manager"), MB_YESNO);
471     if (id == IDYES)
472     extract_dash_escaped_key ();
473     else
474     msg_box (dlg, _("Cannot import dash escaped OpenPGP keys."),
475     _("Key Manager"), MB_INFO);
476     }
477    
478     dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_IMPORT, dlg,
479 twoaday 77 clip_import_dlg_proc, 0,
480 werner 36 _("Key Import"), IDS_WINPT_IMPORT);
481    
482     return 0;
483     }
484    
485    
486     /* Import a key from the http URL @url. */
487     int
488     km_http_import (HWND dlg, const char *url)
489     {
490     http_hd_t hd;
491     FILE *fp;
492     char *p;
493     char tmpfile[500];
494     int statcode;
495     int rc = 0;
496    
497     if (strncmp (url, "http://", 7)) {
498     log_box (_("Key Import HTTP"), MB_ERR, _("Invalid HTTP URL: %s"), url);
499     return WPTERR_GENERAL;
500     }
501    
502     GetTempPath (sizeof (tmpfile)-128, tmpfile);
503     p = make_filename (tmpfile, "winpt_file_http", "tmp");
504     if (!p)
505     BUG (0);
506     fp = fopen (p, "wb");
507     if (!fp) {
508     free_if_alloc (p);
509 twoaday 121 log_box (_("Key Import HTTP"), MB_ERR, "%s: %s", p,
510     winpt_strerror (WPTERR_FILE_CREAT));
511 werner 36 return WPTERR_FILE_CREAT;
512     }
513    
514     /* parse URL */
515     rc = http_send_request2 (url, &hd);
516     if (!rc)
517     rc = http_parse_response (hd, &statcode);
518     if (!rc)
519     rc = http_parse_data (hd, fp);
520     http_hd_free (hd);
521     fclose (fp);
522     if (rc) {
523     msg_box (dlg, winpt_strerror (rc), _("Key Import HTTP"), MB_ERR);
524     rc = WPTERR_GENERAL;
525     }
526     km_file_import (dlg, p);
527 werner 48 remove (p);
528 werner 36 free_if_alloc (p);
529     return rc;
530     }
531    
532    
533     /* Import a key from the given file @fname.
534     On success an import statistics dialog is shown. */
535     int
536     km_file_import (HWND dlg, const char *fname)
537     {
538     gpgme_data_t keydata = NULL;
539     gpgme_ctx_t ctx;
540     gpgme_error_t err;
541     fm_state_s fm_stat;
542     gpgme_import_result_t res;
543    
544     memset (&fm_stat, 0, sizeof (fm_stat));
545     fm_stat.opaque = m_strdup (fname);
546    
547     dialog_box_param (glob_hinst, (LPCSTR)IDD_WINPT_IMPORT, dlg,
548     file_import_dlg_proc, (LPARAM)&fm_stat,
549     _("File Import"), IDS_WINPT_IMPORT);
550     if (fm_stat.cancel == 1) {
551     free_if_alloc (fm_stat.opaque);
552     return WPTERR_GENERAL;
553     }
554    
555     err = gpgme_new (&ctx);
556     if (err)
557     BUG (NULL);
558     err = gpgme_data_new_from_file (&keydata, fname, 1);
559     if (err) {
560     msg_box (dlg, _("Could not read key-data from file."),
561     _("Key Manager"), MB_ERR);
562     goto leave;
563     }
564    
565 twoaday 130 op_begin ();
566 werner 36 err = gpgme_op_import (ctx, keydata);
567 twoaday 130 op_end ();
568 werner 36 if (err) {
569     msg_box (dlg, gpgme_strerror (err), _("Key Manager"), MB_ERR);
570     goto leave;
571     }
572    
573     res = gpgme_op_import_result (ctx);
574     if (res->new_revocations == 0 && fm_stat.import.revcert == 1)
575     res->new_revocations = 1;
576     if (res->secret_imported == 0 && fm_stat.import.has_seckey == 1)
577     res->secret_imported = 1;
578    
579 twoaday 123 /* XXX: if we import a key pair but the secret key comes first,
580     no_{valid}_user_id is 1 even so the public key, which comes
581     later is valid and self-signed. */
582 werner 36 print_import_status (res);
583     if (res->no_user_id > 0) {
584     msg_box (dlg, _("Key without a self signature was dectected!\n"
585     "(This key is NOT usable for encryption, etc)\n"
586     "\n"
587     "Cannot import these key(s)!"), _("Import"), MB_INFO);
588     }
589    
590     leave:
591     gpgme_data_release (keydata);
592     gpgme_release (ctx);
593     free_if_alloc (fm_stat.opaque);
594     return (int)err;
595     }
596    
597    
598     /* Mark the keys in @rset as deleted in the keycache. */
599     static void
600     delete_keys_from_cache (gpgme_key_t *rset, size_t n)
601     {
602     gpg_keycache_t pub = keycache_get_ctx (1);
603     int i=0;
604    
605     while (n-- > 0)
606     gpg_keycache_delete_key (pub, rset[i++]->subkeys->keyid);
607     }
608    
609    
610     /* Delete all selected keys from the list view @lv. */
611     int
612     km_delete_keys (listview_ctrl_t lv, HWND dlg)
613     {
614     gpgme_error_t err;
615     gpgme_ctx_t ctx;
616 twoaday 128 gpgme_key_t *rset;
617     gpgme_key_t key;
618     char keyid[32];
619     char *p;
620 werner 36 int with_seckey=0, seckey_type=0, confirm=0;
621     int i, rc, n, k_pos=0;
622    
623     if (listview_get_curr_pos (lv) == -1) {
624     msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
625 twoaday 121 return -1;
626 werner 36 }
627    
628     if (listview_count_items (lv, 1) > 8) {
629     i = msg_box (NULL, _("Do you really want to confirm each key?"),
630     _("Delete Confirmation"), MB_YESNOCANCEL|MB_ICONQUESTION);
631     if (i == IDCANCEL)
632     return 0;
633     if (i != IDNO)
634     confirm = 1;
635     }
636     else
637     confirm = 1;
638    
639     n = listview_count_items (lv, 0);
640     rset = (gpgme_key_t *)calloc (n+1, sizeof (gpgme_key_t));
641     if (!rset)
642     BUG (NULL);
643 twoaday 121 for (i = 0; i < n; i++) {
644 twoaday 128 if (listview_get_item_state(lv, i)) {
645     key = (gpgme_key_t)listview_get_item2 (lv, i);
646     if (!key)
647     BUG (NULL);
648 werner 36 seckey_type = km_check_for_seckey (lv, i, NULL);
649     if (confirm && !seckey_type) {
650 twoaday 128 p = key_get_info (key, 0);
651 werner 36 rc = log_box( _("Key Manager"), MB_YESNO|MB_ICONWARNING,
652     _("Do you really want to delete this key?\n\n"
653 twoaday 128 "%s"), p);
654     if (rc == IDYES)
655     rset[k_pos++] = key;
656 werner 36 with_seckey = 0;
657 twoaday 128 free_if_alloc (p);
658 werner 36 }
659     else if (confirm) {
660 twoaday 128 p = key_get_info (key, 1);
661 twoaday 121 rc = log_box (_("Key Manager"), MB_YESNO|MB_ICONWARNING,
662 werner 36 _("Do you really want to delete this KEY PAIR?\n\n"
663     "Please remember that you are not able to decrypt\n"
664     "messages you stored with this key any longer.\n"
665     "\n"
666 twoaday 128 "%s"), p);
667 werner 36 if( rc == IDYES ) {
668     if (seckey_type == 2)
669 twoaday 121 msg_box (dlg, _("The actual secret key is stored on a smartcard.\n"
670 werner 36 "Only the public key and the secret key \n"
671 twoaday 121 "placeholder will be deleted.\n"),
672     _("Key Manager"), MB_OK);
673 twoaday 128 rset[k_pos++] = key;
674 werner 36 }
675     with_seckey = 1;
676 twoaday 128 free_if_alloc (p);
677 werner 36 }
678     else {
679     with_seckey = 1;
680 twoaday 128 get_pubkey (keyid, &key);
681     rset[k_pos++] = key;
682 werner 36 }
683     }
684     }
685    
686     if (k_pos == 0) {
687     free (rset);
688     return 0;
689     }
690    
691     err = gpgme_new (&ctx);
692     if (err)
693     BUG (NULL);
694 twoaday 128 n = k_pos;
695 twoaday 130 op_begin ();
696 werner 36 for (i=0; i < k_pos; i++) {
697     err = gpgme_op_delete (ctx, rset[i], with_seckey);
698     if (err)
699     msg_box (dlg, gpgme_strerror (err), _("Key Manager"), MB_ERR);
700     else
701     n--;
702     }
703 twoaday 130 op_end ();
704 werner 36 if (n == 0)
705 twoaday 121 show_msg (dlg, 1500, _("GnuPG Status: Finished"));
706 werner 36 gpgme_release (ctx);
707     listview_del_items (lv);
708     delete_keys_from_cache (rset, k_pos);
709     free (rset);
710    
711     return (int)err;
712     }
713    
714    
715 twoaday 121 /* Send the select key in @lv to the keyserver @host:@port. */
716 werner 36 int
717 twoaday 121 km_send_to_keyserver (listview_ctrl_t lv, HWND dlg, const char *host, u16 port)
718 werner 36 {
719 twoaday 128 gpgme_key_t key;
720 werner 36 int id;
721    
722 twoaday 121 id = listview_get_curr_pos (lv);
723     if (id == -1) {
724 werner 36 msg_box( dlg, _("Please select a key."), _("Key Manager"), MB_ERR );
725     return WPTERR_GENERAL;
726     }
727    
728 twoaday 128 key = (gpgme_key_t)listview_get_item2 (lv, id);
729     if (!key)
730     BUG (NULL);
731 werner 36 id = log_box (_("Key Manager"), MB_YESNO,
732     _("Do you really want to send '%s' to keyserver %s?"),
733 twoaday 128 key->subkeys->keyid+8, host);
734     if (id == IDYES)
735     hkp_send_key (dlg, host, port, key->subkeys->keyid+8);
736 werner 36
737     return 0;
738 twoaday 121 }
739 werner 36
740    
741 twoaday 77 /* Send the selected key in @lv via MAPI to a mail recipient. */
742 werner 36 int
743 twoaday 77 km_send_to_mail_recipient (listview_ctrl_t lv, HWND dlg)
744 werner 36 {
745     gpgme_key_t key;
746     gpgme_ctx_t ctx=NULL;
747 twoaday 77 gpgme_data_t out;
748 werner 36 gpgme_error_t rc;
749 twoaday 128 char tmp[128];
750 twoaday 121 char *fname;
751 twoaday 129 char *name;
752 werner 36 int pos;
753    
754 twoaday 121 if (listview_count_items (lv, 1) > 1) {
755 twoaday 77 msg_box (dlg, _("Please only select one key."),
756     _("Key Manager"), MB_INFO|MB_OK);
757 werner 36 return WPTERR_GENERAL;
758     }
759 twoaday 77 pos = listview_get_curr_pos (lv);
760     if (pos == -1) {
761     msg_box (dlg, _("Please select a key."), _("Key Manager"), MB_ERR);
762 werner 36 return WPTERR_GENERAL;
763     }
764 twoaday 128 key = (gpgme_key_t)listview_get_item2 (lv, pos);
765     if (!key)
766 twoaday 77 BUG (NULL);
767 werner 36
768 twoaday 121 GetTempPath (sizeof (tmp)-1, tmp);
769     if (tmp[strlen (tmp)-1] == '\\')
770     tmp[strlen (tmp)-1] = 0;
771 twoaday 129 name = utf8_to_wincp2 (key->uids->name);
772     fname = make_filename (tmp, name, "asc");
773 twoaday 121 for (pos=0; pos < (int)strlen (fname); pos++) {
774     if (fname[pos] == ' ')
775     fname[pos] = '_';
776     }
777    
778 twoaday 77 rc = gpgme_new (&ctx);
779 werner 36 if (rc)
780 twoaday 77 BUG (NULL);
781     rc = gpgme_data_new (&out);
782     if (rc)
783     BUG (NULL);
784    
785     gpgme_set_armor (ctx, 1);
786     rc = gpgme_op_export (ctx, key->subkeys->keyid, 0, out);
787     if (rc)
788 werner 36 msg_box (dlg, gpgme_strerror (rc), _("Key Manager"), MB_ERR);
789     else
790 twoaday 128 mapi_send_pubkey (key->subkeys->keyid+8, fname);
791 werner 36
792 twoaday 121 gpg_data_release_and_set_file (out, fname);
793 werner 36 gpgme_release (ctx);
794 twoaday 129 safe_free (name);
795 twoaday 121 free_if_alloc (fname);
796 werner 36 return rc;
797     }
798    
799    
800     static void
801     km_refresh_one_key (listview_ctrl_t lv, HWND dlg, int pos)
802     {
803 twoaday 128 gpgme_key_t key;
804 werner 36 int idx;
805    
806     if (pos != 0)
807     idx = pos;
808     else
809     idx = listview_get_curr_pos (lv);
810 twoaday 121 if (idx != -1) {
811 twoaday 128 key = (gpgme_key_t)listview_get_item2 (lv, idx);
812 twoaday 121 hkp_recv_key (dlg, default_keyserver, default_keyserver_port,
813 twoaday 128 key->subkeys->keyid+8, 0, KM_KS_REFRESH);
814 werner 36 }
815     }
816    
817    
818 twoaday 121 /* Refresh all keys from the default keyserver. */
819 werner 36 void
820     km_refresh_from_keyserver (listview_ctrl_t lv, HWND dlg)
821     {
822     int idx, id, i;
823    
824 twoaday 128 if (kserver_check_inet_connection ()) {
825 werner 36 msg_box (dlg, _("Could not connect to keyserver, abort procedure."),
826     _("Key Manager"), MB_ERR);
827     return;
828     }
829     idx = listview_count_items (lv, 0);
830     if (listview_count_items (lv, 1) == idx) {
831 twoaday 121 id = msg_box (dlg, _("Do you really want to refresh all keys in the keyring?"),
832     _("Key Manager"), MB_YESNO);
833 werner 36 if (id == IDNO)
834     return;
835     for (i = 0; i < idx; i++)
836     km_refresh_one_key (lv, dlg, i);
837     }
838     else if (idx == 1)
839     km_refresh_one_key (lv, dlg, 0);
840     else {
841     for (i=0; i < listview_count_items (lv, 0); i++) {
842     if (listview_get_item_state (lv, i))
843     km_refresh_one_key (lv, dlg, i);
844     }
845     }
846 twoaday 121 }
847 werner 36
848    
849     void
850     km_set_clip_info (const char *uid)
851     {
852     char buf[256];
853    
854 twoaday 129 key_get_clip_info (uid, buf, sizeof (buf)-1);
855 werner 36 set_clip_text (NULL, buf, strlen (buf));
856 twoaday 121 }
857 werner 36
858    
859    
860     /* Return TRUE if the key in the list @lv at pos @pos is an
861     old version 3 key. */
862     int
863     km_key_is_v3 (listview_ctrl_t lv, int pos)
864     {
865     gpgme_key_t pk;
866    
867 twoaday 128 pk = (gpgme_key_t)listview_get_item2 (lv, pos);
868     if (!pk)
869 werner 36 BUG (NULL);
870     if (strlen (pk->subkeys->fpr) == 32 &&
871     pk->subkeys->pubkey_algo == GPGME_PK_RSA)
872     return -1;
873     return 0;
874     }
875    
876    
877     /* Set trust of selected key in @lv (at @pos) to ultimate. */
878     int
879     km_set_implicit_trust (HWND dlg, listview_ctrl_t lv, int pos)
880     {
881 twoaday 128 gpgme_error_t err;
882     gpgme_key_t key;
883 werner 36 GpgKeyEdit *ke;
884    
885 twoaday 128 key = (gpgme_key_t)listview_get_item2 (lv, pos);
886     if (!key)
887     BUG (NULL);
888     ke = new GpgKeyEdit (key->subkeys->keyid);
889 werner 36 if (!ke)
890     BUG (0);
891    
892     err = ke->setTrust (GPGME_VALIDITY_ULTIMATE);
893     if (err)
894     msg_box (dlg, gpgme_strerror (err), _("Key Manager"), MB_ERR);
895     else
896     show_msg (dlg, 1500, _("GnuPG Status: Finished"));
897    
898     delete ke;
899     return (int)err;
900     }
901    
902    
903     void
904     km_find_key (HWND dlg, listview_ctrl_t lv)
905     {
906     int oldpos = listview_get_curr_pos (lv);
907     int n;
908     char *name = get_input_dialog (dlg, _("Search"), _("Search for:"));
909     if (name == NULL)
910     return;
911     if (oldpos < 0)
912     oldpos = 0;
913     n = listview_find (lv, name);
914     if (n != -1) {
915     listview_select_one (lv, n);
916     listview_scroll (lv, oldpos, n);
917     }
918     else {
919     const char *s = _("String pattern \"%s\" not found.");
920     char *p = new char[strlen (s) + strlen (name) + 2];
921     if (!p)
922     BUG (0);
923     sprintf (p, s, name);
924     msg_box (dlg, p, _("Key Manager"), MB_INFO);
925     free_if_alloc (p);
926     }
927     free_if_alloc (name);
928     }
929 twoaday 129
930    
931     /* Return a user-friendly name for a key derrived from
932     name. If @is_secret is 1, a secret key name will be generated. */
933     char*
934     km_gen_export_filename (const char *keyid, int is_secret)
935     {
936     gpgme_key_t key;
937     char *p, *uid;
938    
939     if (get_pubkey (keyid, &key))
940     return m_strdup (keyid);
941     uid = utf8_to_wincp2 (key->uids->name);
942     if (!uid)
943     return m_strdup (keyid);
944     p = new char[strlen (uid) + 8 + 16];
945     if (!p)
946     BUG (0);
947     sprintf (p, "%s%s.asc", uid, is_secret? "_sec" : "");
948     for (size_t i=0; i < strlen (p); i++) {
949     if (p[i] == ' ' || p[i] == ':' || p[i] == '?' || p[i] == '|')
950     p[i] = '_';
951     }
952     safe_free (uid);
953     return p;
954     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26