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

Contents of /trunk/Src/wptKeyManager.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 121 - (show annotations)
Mon Dec 12 11:19:56 2005 UTC (19 years, 2 months ago) by twoaday
File size: 23457 byte(s)
2005-12-11  Timo Schulz  <ts@g10code.com>
 
        * wptW32API.cpp (get_file_version): New.
        * wptGPGUtil.cpp (create_process): Always hide window.
        * wptClipEditDlg.cpp (clipedit_dlg_proc): Use 'Close'
        instead of 'Exit'.
        * wptKeyManager.cpp (km_http_import): New filename
        generation code.
        (km_send_to_mail_recipient): Cleanups.
        * wptKeyEditDlg.cpp (showpref_dlg_proc): Localize dialog.
        * wptKeyManagerDlg.cpp (update_ui_items): Handle the case
        when multiple keys are selected.
        (popup_multiple): New.
        * WinPT.cpp (WinMain): Check that the PTD.dll and WinPT.exe
        file versions are equal. Rewrote --keymanager code.
         
Removed temporary w32gpgme dirctory, all code is now in Src.
Changed configure files.


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

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26