1 |
/* wptKeyserverDlg.cpp - Keyserver dialog |
/* wptKeyserverDlg.cpp - Keyserver dialog |
2 |
* Copyright (C) 2000-2006 Timo Schulz |
* Copyright (C) 2000-2006 Timo Schulz |
3 |
* Copyright (C) 2005 g10 Code GmbH |
* Copyright (C) 2005, 2006 g10 Code GmbH |
4 |
* |
* |
5 |
* This file is part of WinPT. |
* This file is part of WinPT. |
6 |
* |
* |
24 |
|
|
25 |
#include <windows.h> |
#include <windows.h> |
26 |
#include <commctrl.h> |
#include <commctrl.h> |
27 |
#include <malloc.h> |
#include <ctype.h> |
28 |
|
|
29 |
#include "resource.h" |
#include "resource.h" |
30 |
#include "wptKeyserver.h" |
#include "wptKeyserver.h" |
45 |
char* get_reg_entry_keyserver (const char *); |
char* get_reg_entry_keyserver (const char *); |
46 |
int set_reg_entry_keyserver (const char *, const char *); |
int set_reg_entry_keyserver (const char *, const char *); |
47 |
|
|
48 |
|
/* Symbolic column IDs */ |
49 |
enum { KS_COL_NAME = 0, KS_COL_PORT }; |
enum { KS_COL_NAME = 0, KS_COL_PORT }; |
50 |
|
|
51 |
/* Callback context to modify (add, edit) keyserver items. */ |
/* Callback context to modify (add, edit) keyserver items. */ |
58 |
}; |
}; |
59 |
typedef struct keyserver_rec_s *keyserver_rec_t; |
typedef struct keyserver_rec_s *keyserver_rec_t; |
60 |
|
|
61 |
|
|
62 |
/* Print out keyserver error and a possible Winsock error. */ |
/* Print out keyserver error and a possible Winsock error. */ |
63 |
static void |
static void |
64 |
hkp_err_box (HWND dlg, const char *host, WORD port, int rc) |
hkp_err_box (HWND dlg, const char *host, WORD port, int rc) |
83 |
GPGME *gpg; |
GPGME *gpg; |
84 |
gpgme_error_t ec; |
gpgme_error_t ec; |
85 |
char *rawkey = NULL; |
char *rawkey = NULL; |
86 |
char msg[384]; |
char msg[256]; |
87 |
|
|
88 |
gpg = new GPGME (); |
gpg = new GPGME (); |
89 |
gpg->setArmor (true); |
gpg->setArmor (true); |
172 |
const char *pattern, int proto, int flags, |
const char *pattern, int proto, int flags, |
173 |
char **r_fpr) |
char **r_fpr) |
174 |
{ |
{ |
175 |
gpgme_ctx_t ctx; |
gpgme_ctx_t ctx = NULL; |
176 |
gpgme_data_t keydata; |
gpgme_data_t keydata = NULL; |
177 |
gpgme_import_result_t import_res = NULL; |
gpgme_import_result_t import_res = NULL; |
178 |
gpgme_error_t err; |
gpgme_error_t err; |
179 |
char *rawkey = NULL; |
char *rawkey = NULL; |
237 |
|
|
238 |
leave: |
leave: |
239 |
free_if_alloc (rawkey); |
free_if_alloc (rawkey); |
240 |
gpgme_release (ctx); |
if (ctx != NULL) |
241 |
gpgme_data_release (keydata); |
gpgme_release (ctx); |
242 |
|
if (keydata != NULL) |
243 |
|
gpgme_data_release (keydata); |
244 |
return rc; |
return rc; |
245 |
} |
} |
246 |
|
|
259 |
hkp_recv_key2 (HWND dlg, const char *kserver, WORD port, |
hkp_recv_key2 (HWND dlg, const char *kserver, WORD port, |
260 |
const char *pattern, int proto, char **r_fpr) |
const char *pattern, int proto, char **r_fpr) |
261 |
{ |
{ |
262 |
return keyserver_recv_key (dlg, kserver, port, pattern, proto, 0, |
return keyserver_recv_key (dlg, kserver, port, pattern, |
263 |
r_fpr); |
proto, 0, r_fpr); |
264 |
} |
} |
265 |
|
|
266 |
|
|
267 |
#define my_iskeychar(a) (((a) >='0' && (a) <= '9' ) || ((a) >= 'A' && (a) <= 'F')) |
/* Check if the given pattern are either a valid |
268 |
|
email address, a {long, short} keyid or a fingerprint. |
269 |
|
Return 0 on success. */ |
270 |
static int |
static int |
271 |
check_pattern (const char *pattern) |
check_pattern (const char *pattern) |
272 |
{ |
{ |
273 |
int rc = WPTERR_GENERAL; |
size_t i; |
274 |
|
|
|
/* do not allow white spaces. */ |
|
275 |
if (strchr (pattern, ' ')) |
if (strchr (pattern, ' ')) |
276 |
return rc; |
return WPTERR_GENERAL; /* do not allow white spaces. */ |
277 |
|
|
278 |
|
if (strchr (pattern, '@') && strlen (pattern) >= 3 && |
279 |
|
!check_email_address (pattern)) |
280 |
|
return 0; |
281 |
|
|
282 |
if (strstr (pattern, "0x")) |
if (strstr (pattern, "0x")) |
283 |
pattern += 2; |
pattern += 2; |
284 |
|
if (strlen (pattern) != 8 && |
285 |
if (((my_iskeychar (pattern[0])) && (strlen (pattern) == 8)) || |
strlen (pattern) != 16 && |
286 |
(my_iskeychar (pattern[0])) && (strlen (pattern) == 16)) |
strlen (pattern) != 40) |
287 |
rc = 0; /* assume long or short key ID. */ |
return WPTERR_GENERAL; |
288 |
else if (strchr (pattern, '@') && strlen (pattern) >= 3) |
|
289 |
rc = 0; /* assume email address. */ |
for (i=0; i < strlen (pattern); i++) { |
290 |
|
if (!isxdigit (pattern[i])) |
291 |
return rc; |
return WPTERR_GENERAL; |
292 |
|
} |
293 |
|
return 0; |
294 |
} |
} |
295 |
|
|
296 |
|
|
303 |
switch (proto) { |
switch (proto) { |
304 |
case PROXY_PROTO_NONE: s = ""; break; |
case PROXY_PROTO_NONE: s = ""; break; |
305 |
case PROXY_PROTO_HTTP: s = "HTTP"; break; |
case PROXY_PROTO_HTTP: s = "HTTP"; break; |
306 |
case PROXY_PROTO_SOCKS5: s = "SOCKS5"; break; |
case PROXY_PROTO_SOCKS5: s = "SOCKS5"; break; |
307 |
default: s= "HTTP"; break; |
default: s = "HTTP"; break; |
308 |
} |
} |
309 |
return s; |
return s; |
310 |
} |
} |
340 |
return; |
return; |
341 |
for (i=0; i < listview_count_items (lv, 0); i++) { |
for (i=0; i < listview_count_items (lv, 0); i++) { |
342 |
listview_get_item_text (lv, i, KS_COL_NAME, buf, sizeof (buf)-1); |
listview_get_item_text (lv, i, KS_COL_NAME, buf, sizeof (buf)-1); |
343 |
if (!strcmp (buf, p)) { |
if (!stricmp (buf, p)) { |
344 |
listview_select_one (lv, i); |
listview_select_one (lv, i); |
345 |
break; |
break; |
346 |
} |
} |
362 |
return -1; |
return -1; |
363 |
} |
} |
364 |
listview_get_item_text (lv, idx, KS_COL_NAME, buf, sizeof (buf)-1); |
listview_get_item_text (lv, idx, KS_COL_NAME, buf, sizeof (buf)-1); |
365 |
if (strncmp (buf, "http", 4) && strncmp (buf, "hkp", 3)) { |
if (strnicmp (buf, "http", 4) && strnicmp (buf, "hkp", 3)) { |
366 |
msg_box (NULL, _("Only HTTP keyserver can be used."), |
msg_box (NULL, _("Only HTTP keyserver can be used."), |
367 |
_("Keyserver"), MB_ERR); |
_("Keyserver"), MB_ERR); |
368 |
return -1; |
return -1; |
421 |
|
|
422 |
listview_get_item_text (lv, pos, KS_COL_NAME, name, sizeof (name)-1); |
listview_get_item_text (lv, pos, KS_COL_NAME, name, sizeof (name)-1); |
423 |
for (i=0; i < MAX_KEYSERVERS; i++) { |
for (i=0; i < MAX_KEYSERVERS; i++) { |
424 |
if (server[i].name && strcmp (server[i].name, name) == 0) |
if (server[i].name && stricmp (server[i].name, name) == 0) |
425 |
server[i].used = 0; |
server[i].used = 0; |
426 |
} |
} |
427 |
listview_del_item (lv, pos); |
listview_del_item (lv, pos); |
436 |
int i; |
int i; |
437 |
|
|
438 |
for (i=0; i < MAX_KEYSERVERS; i++) { |
for (i=0; i < MAX_KEYSERVERS; i++) { |
439 |
if (server[i].name && strcmp (server[i].name, ctx->name) == 0) { |
if (server[i].name && stricmp (server[i].name, ctx->name) == 0) { |
440 |
fnd = true; |
fnd = true; |
441 |
break; |
break; |
442 |
} |
} |
579 |
SetDlgItemText (dlg, IDC_KEYSERVER_SEND, |
SetDlgItemText (dlg, IDC_KEYSERVER_SEND, |
580 |
_("Send key (default is receiving)")); |
_("Send key (default is receiving)")); |
581 |
SetDlgItemText (dlg, IDC_KEYSERVER_INFO, |
SetDlgItemText (dlg, IDC_KEYSERVER_INFO, |
582 |
_("Please enter the key ID or email address you search for")); |
_("Key ID or email address you want to search for")); |
583 |
SetDlgItemText (dlg, IDC_KEYSERVER_INDEX, _("&Search")); |
SetDlgItemText (dlg, IDC_KEYSERVER_INDEX, _("&Search")); |
584 |
SetDlgItemText (dlg, IDC_KEYSERVER_PROXSETT, _("C&hange proxy")); |
SetDlgItemText (dlg, IDC_KEYSERVER_PROXSETT, _("C&hange proxy")); |
585 |
SetDlgItemText (dlg, IDC_KEYSERVER_DEFAULT, _("Set &default")); |
SetDlgItemText (dlg, IDC_KEYSERVER_DEFAULT, _("Set &default")); |
615 |
} |
} |
616 |
else if (notify->code == LVN_ITEMCHANGED && |
else if (notify->code == LVN_ITEMCHANGED && |
617 |
((LPNMLISTVIEW)lparam)->uNewState) { |
((LPNMLISTVIEW)lparam)->uNewState) { |
618 |
/* XXX: disable search for ldap servers. */ |
listview_get_item_text (lv, listview_get_curr_pos (lv), |
619 |
|
KS_COL_NAME, kserver, sizeof (kserver)-1); |
620 |
|
if (!strnicmp (kserver, "ldap://", 7)) |
621 |
|
EnableWindow (GetDlgItem (dlg, IDC_KEYSERVER_INDEX), FALSE); |
622 |
|
else |
623 |
|
EnableWindow (GetDlgItem (dlg, IDC_KEYSERVER_INDEX), TRUE); |
624 |
} |
} |
625 |
return TRUE; |
return TRUE; |
626 |
|
|
646 |
return TRUE; |
return TRUE; |
647 |
|
|
648 |
case IDC_KEYSERVER_INDEX: |
case IDC_KEYSERVER_INDEX: |
649 |
if (!lv_idx) { |
if (!lv_idx) |
650 |
lv_idx = kserver_get_pos (lv); |
lv_idx = kserver_get_pos (lv); |
651 |
if (lv_idx == -1) { |
|
|
msg_box (dlg, _("Please select one of the keyservers."), |
|
|
_("Keyserver"), MB_INFO); |
|
|
return FALSE; |
|
|
} |
|
|
} |
|
|
listview_get_item_text (lv, lv_idx, KS_COL_NAME, |
|
|
proto, sizeof (proto)-1); |
|
|
if (!strncmp (proto, "ldap", 4)) { |
|
|
msg_box (dlg, _("This is not implemented yet!"), |
|
|
_("Keyserver"), MB_ERR); |
|
|
return FALSE; |
|
|
} |
|
|
listview_get_item_text (lv, lv_idx, KS_COL_NAME, |
|
|
kserver, sizeof (kserver)-1); |
|
652 |
if (!GetDlgItemText (dlg, IDC_KEYSERVER_SEARCH, pattern, sizeof (pattern)-1)) { |
if (!GetDlgItemText (dlg, IDC_KEYSERVER_SEARCH, pattern, sizeof (pattern)-1)) { |
653 |
msg_box (dlg, _("Please enter the search pattern."), |
msg_box (dlg, _("Please enter the search pattern."), |
654 |
_("Keyserver"), MB_INFO); |
_("Keyserver"), MB_INFO); |
655 |
return FALSE; |
return FALSE; |
656 |
} |
} |
657 |
ksc.name = kserver; |
|
658 |
|
if (lv_idx != -1) { |
659 |
|
listview_get_item_text (lv, lv_idx, KS_COL_NAME, |
660 |
|
kserver, sizeof (kserver)-1); |
661 |
|
ksc.name = kserver; |
662 |
|
ksc.port = kserver_get_port (lv); |
663 |
|
} |
664 |
|
else { |
665 |
|
ksc.name = DEF_HKP_KEYSERVER; |
666 |
|
ksc.port = HKP_PORT; |
667 |
|
} |
668 |
ksc.pattern = pattern; |
ksc.pattern = pattern; |
|
ksc.port = kserver_get_port (lv); |
|
669 |
DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_HKPSEARCH, dlg, |
DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_HKPSEARCH, dlg, |
670 |
hkpsearch_dlg_proc, (LPARAM) &ksc); |
hkpsearch_dlg_proc, (LPARAM) &ksc); |
671 |
return TRUE; |
return TRUE; |
683 |
listview_get_item_text (lv, lv_idx, KS_COL_NAME, |
listview_get_item_text (lv, lv_idx, KS_COL_NAME, |
684 |
proto, sizeof (proto)-1); |
proto, sizeof (proto)-1); |
685 |
proto_nr = KSPROTO_HTTP; |
proto_nr = KSPROTO_HTTP; |
686 |
if (!strncmp (proto, "ldap", 4)) |
if (!strnicmp (proto, "ldap", 4)) |
687 |
proto_nr = KSPROTO_LDAP; |
proto_nr = KSPROTO_LDAP; |
688 |
else if (!strncmp (proto, "finger", 6)) |
else if (!strnicmp (proto, "finger", 6)) |
689 |
proto_nr = KSPROTO_FINGER; |
proto_nr = KSPROTO_FINGER; |
690 |
listview_get_item_text (lv, lv_idx, KS_COL_NAME, |
listview_get_item_text (lv, lv_idx, KS_COL_NAME, |
691 |
kserver, sizeof (kserver)-1); |
kserver, sizeof (kserver)-1); |
742 |
edit.name, sizeof (edit.name)-1); |
edit.name, sizeof (edit.name)-1); |
743 |
listview_get_item_text (lv, lv_idx, KS_COL_PORT, pattern, 32); |
listview_get_item_text (lv, lv_idx, KS_COL_PORT, pattern, 32); |
744 |
edit.port = atoi (pattern); |
edit.port = atoi (pattern); |
745 |
if (!strncmp (edit.name, "hkp", 3) || !strncmp (edit.name, "http", 4)) |
if (!strnicmp (edit.name, "hkp", 3) || !strnicmp (edit.name, "http", 4)) |
746 |
edit.proto = KSPROTO_HTTP; |
edit.proto = KSPROTO_HTTP; |
747 |
else if (!strncmp (edit.name, "ldap", 4)) |
else if (!strnicmp (edit.name, "ldap", 4)) |
748 |
edit.proto = KSPROTO_LDAP; |
edit.proto = KSPROTO_LDAP; |
749 |
else |
else |
750 |
edit.proto = KSPROTO_FINGER; |
edit.proto = KSPROTO_FINGER; |