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

Diff of /trunk/Src/wptKeyserverDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2 by twoaday, Mon Jan 31 11:02:21 2005 UTC revision 165 by twoaday, Tue Jan 24 10:10:15 2006 UTC
# Line 1  Line 1 
1  /* wptKeyserverDlg.cpp - Keyserver dialog  /* wptKeyserverDlg.cpp - Keyserver dialog
2   *      Copyright (C) 2000-2005 Timo Schulz   *      Copyright (C) 2000-2005 Timo Schulz
3   *   *      Copyright (C) 2005 g10 Code GmbH
4   * This file is part of WinPT.   *
5   *   * This file is part of WinPT.
6   * WinPT is free software; you can redistribute it and/or modify   *
7   * it under the terms of the GNU General Public License as published by   * WinPT is free software; you can redistribute it and/or modify
8   * the Free Software Foundation; either version 2 of the License, or   * it under the terms of the GNU General Public License as published by
9   * (at your option) any later version.   * the Free Software Foundation; either version 2 of the License, or
10   *   * (at your option) any later version.
11   * WinPT is distributed in the hope that it will be useful,   *
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * WinPT is distributed in the hope that it will be useful,
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * GNU General Public License for more details.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   *   * GNU General Public License for more details.
16   * You should have received a copy of the GNU General Public License   *
17   * along with WinPT; if not, write to the Free Software Foundation,   * You should have received a copy of the GNU General Public License
18   * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA   * 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  #include <windows.h>  #ifdef HAVE_CONFIG_H
22  #include <commctrl.h>  #include <config.h>
23  #include <malloc.h>  #endif
24    
25  #include "../resource.h"  #include <windows.h>
26  #include "wptKeyserver.h"  #include <commctrl.h>
27  #include "wptErrors.h"  #include <malloc.h>
28  #include "wptTypes.h"  
29  #include "wptCommonCtl.h"  #include "resource.h"
30  #include "wptNLS.h"  #include "wptKeyserver.h"
31  #include "wptW32API.h"  #include "wptErrors.h"
32  #include "wptVersion.h"  #include "wptTypes.h"
33  #include "wptGPG.h"  #include "wptCommonCtl.h"
34  #include "wptKeyManager.h"  #include "wptNLS.h"
35  #include "wptContext.h" /* for passphrase_s */  #include "wptW32API.h"
36  #include "wptDlgs.h"  #include "wptVersion.h"
37    #include "wptGPG.h"
38    #include "wptKeyManager.h"
39  #define MAX_KEYSIZE 70000  #include "wptContext.h" /* for passphrase_s */
40    #include "wptDlgs.h"
41  char * get_reg_entry_keyserver (const char *);  #include "wptUTF8.h"
42  int set_reg_entry_keyserver (const char *, const char *);  
43    #define MAX_KEYSIZE 70000
44    
45  static void  char* get_reg_entry_keyserver (const char *);
46  hkp_err_box (HWND dlg, const char * host, u16 port, int rc)  int set_reg_entry_keyserver (const char *, const char *);
47  {  
48      const char *err = kserver_strerror();  enum { KS_COL_NAME = 0, KS_COL_PORT, KS_COL_DEFAULT };
49    
50      log_box( _("Keyserver"), MB_ERR, "%s:%d: %s", host, port, winpt_strerror (rc));  /* Callback context to modify (add, edit) keyserver items. */
51      if (err)  struct keyserver_rec_s {
52          msg_box (dlg, err, wsock_strerror (), MB_ERR);      char name[200];     /* hostname */
53  } /* hkp_err_box */      int  proto;         /* protocol */
54        int  port;          /* used port */
55        bool mode;          /* true = edit */
56  int      bool cancel;
57  hkp_send_key (HWND dlg, const char *kserver, u16 port, const char *pattern)  };
58  {  typedef struct keyserver_rec_s *keyserver_rec_t;
59      gpgme_ctx_t c;        
60      gpgme_recipients_t rset;  /* Print out keyserver error and a possible Winsock error. */
61      gpgme_data_t keydata;  static void
62      gpgme_error_t ec;  hkp_err_box (HWND dlg, const char *host, WORD port, int rc)
63      char *rawkey = NULL, msg[1024];  {
64      int rc;      const char *err = kserver_strerror ();
65        
66      ec = gpgme_recipients_new( &rset );      log_box (_("Keyserver"), MB_ERR, "%s:%d: %s",
67      if( ec )               host, port, winpt_strerror (rc));
68          BUG( NULL );      if (err)
69      gpgme_recipients_add_name( rset, pattern );          msg_box (dlg, err, wsock_strerror (), MB_ERR);
70      ec = gpgme_new( &c );  }
71      if( ec )  
72          BUG( NULL );  
73      gpgme_control( c, GPGME_CTRL_ARMOR, 1 );  /* Send the extracted key with keyid @pattern to the
74      ec = gpgme_data_new( &keydata );     keyserver @kserver (port @port).
75      if( ec )     Return value: 0 on success. */
76          BUG( NULL );  int
77      rc = (int) gpgme_op_export( c, rset, keydata );  hkp_send_key (HWND dlg, const char *kserver, WORD port, const char *pattern)
78      if( rc ) {  {
79          msg_box( dlg, gpgme_strerror( (gpgme_error_t)rc ), _("Export"), MB_ERR );      gpgme_ctx_t ctx;
80          goto leave;      gpgme_data_t keydata;
81      }      gpgme_error_t ec;
82      rawkey = gpgme_data_release_and_return_string (keydata);      char *rawkey = NULL;
83      rc = kserver_sendkey (kserver, port, rawkey, strlen (rawkey));      char msg[384];
84      if (rc) {      size_t n;
85          hkp_err_box (dlg, kserver, port, rc);      
86          goto leave;      ec = gpgme_new (&ctx);
87      }      if (ec)
88                BUG (NULL);
89      _snprintf (msg, sizeof (msg) -1, _("Key '%s' successfully sent"), pattern);      gpgme_set_armor (ctx, 1);
90      status_box (dlg, msg, _("GnuPG status"));      ec = gpgme_data_new (&keydata);
91            if (ec)
92  leave:          BUG (NULL);
93      gpgme_release (c);      ec = gpgme_op_export (ctx, pattern, 0, keydata);
94      gpgme_recipients_release (rset);      if (ec) {
95      safe_free (rawkey);          msg_box (dlg, gpgme_strerror (ec), _("Export"), MB_ERR);
96      return rc;          goto leave;
97  } /* hkp_send_key */      }
98        rawkey = gpgme_data_release_and_get_mem (keydata, &n);
99        ec = kserver_sendkey (kserver, port, rawkey, n);
100  int      if (ec) {
101  hkp_recv_key (HWND dlg, const char *kserver, u16 port, const char *pattern, int proto, int flags)          hkp_err_box (dlg, kserver, port, ec);
102  {          goto leave;
103      gpgme_ctx_t ctx;      }
104      gpgme_data_t keydata;      
105      gpgme_error_t ec;      _snprintf (msg, sizeof (msg) -1, _("Key '%s' successfully sent"), pattern);
106      int rc, import_res[14];      status_box (dlg, msg, _("GnuPG status"));
107      char * rawkey = NULL, msg[384];      
108        leave:
109      rawkey = new char[MAX_KEYSIZE];      gpgme_release (ctx);
110      if (!rawkey)      if (rawkey)
111          BUG (0);          gpgme_free (rawkey);
112      memset (rawkey, 0, MAX_KEYSIZE);      return ec? -1 : 0;
113      if( proto == KSPROTO_LDAP ) {  }
114          rc = ldap_recvkey( kserver, pattern, rawkey, MAX_KEYSIZE-1 );  
115          if( rc ) {  
116              msg_box( dlg, _("LDAP key import failed.\n"  
117                              "Please make sure you have an online connection"  /* Show all received keys from the keyserver. */
118                              " and gpgkeys_ldap.exe is installed"),  static void
119                              _("Keyserver"), MB_ERR );  show_imported_keys (gpgme_import_result_t res)
120              free_if_alloc( rawkey );  {
121              return rc;      gpgme_import_status_t t;
122          }      gpgme_key_t key;
123      }      gpgme_data_t msg;
124      else if (proto == KSPROTO_FINGER) {      gpgme_ctx_t ctx;
125          rc = finger_recvkey (kserver, pattern, rawkey, MAX_KEYSIZE-1);      gpgme_error_t err;
126          if (rc) {      const char *s;
127              log_box (_("Keyserver"), MB_ERR, _("Finger key import failed: %s\n"),      char *p, *uid;
128                       winpt_strerror (rc));      size_t n=0;
129              free_if_alloc( rawkey );  
130              return rc;      if (!res)
131          }          return;
132      }  
133      else if( ( rc = kserver_recvkey( kserver, port, kserver_check_keyid( pattern ),      err = gpgme_data_new (&msg);
134                                       rawkey, MAX_KEYSIZE-1 ) ) ) {      if (err)
135          hkp_err_box (dlg, kserver, port, rc);          BUG (NULL);
136          free_if_alloc (rawkey);      err = gpgme_new (&ctx);
137          return rc;      if (err)
138      }          BUG (NULL);
139      else {      if (res->considered > 1) {
140          if( !strstr( rawkey, "BEGIN PGP PUBLIC KEY BLOCK" ) ) {          s = _("WARNING: multiple keys matched request.\n\n");
141              msg_box( dlg, _("This is not a valid OpenPGP key."), _("Keyserver"), MB_ERR );          gpgme_data_write (msg, s, strlen (s));
142              goto leave;      }
143          }  
144          ec = gpgme_new( &ctx );      if (res->unchanged == res->considered)
145          if( ec )          s = _("Key(s) successfully received but nothing was changed.");
146              BUG( NULL );      else
147          gpgme_data_new_from_mem( &keydata, rawkey, strlen( rawkey ), 1 );          s = _("Key(s) sucessfully received and imported.");
148          rc = gpgme_op_import( ctx, NULL, keydata );      gpgme_data_write (msg, s, strlen (s));
149          if( rc ) {      gpgme_data_write (msg, "\n\n", 2);
150              msg_box( dlg, gpgme_strerror( (gpgme_error_t)rc ), _("Import"), MB_ERR );  
151              goto leave;      for (t=res->imports; t; t = t->next) {
152          }          if (!gpgme_get_key (ctx, t->fpr, &key, 0)) {
153          gpgme_get_import_status( ctx, import_res, NULL );              s = uid = utf8_to_wincp2 (key->uids->uid);
154      }              gpgme_data_write (msg, s, strlen (s));
155                    gpgme_data_write (msg, "\n", 1);
156      /* if we use the refresh mode, a lot of keys will be fetched and thus only              gpgme_key_release (key);
157         a summarize at the end is presented and not for each key. */              free (uid);
158      if( !(flags & KM_KS_REFRESH) ) {          }
159          if( import_res[GPGME_IMPSTAT_NPKEYS] == 0 ) {          }
160              _snprintf( msg, sizeof (msg) - 1,      gpgme_data_write (msg, "\0", 1);
161                         _("Key '%s' successfully received but nothing was changed."), pattern );      p = gpgme_data_release_and_get_mem (msg, &n);
162              status_box( dlg, msg, _("GnuPG Status") );      if (p != NULL) {
163              rc = WPTERR_GENERAL;          msg_box (NULL, p, _("Imported Keys"), MB_INFO);
164              goto leave;          gpgme_free (p);
165          }      }
166          _snprintf( msg, sizeof (msg) - 1, _("Key '%s' sucessfully received and imported."), pattern );      gpgme_release (ctx);
167          status_box( dlg, msg, _("GnuPG Status") );  }
168      }  
169        
170  leave:  /* Receive a key from the keyserver @kserver (port @port)
171      free_if_alloc (rawkey);     with the pattern @pattern.
172      gpgme_release (ctx);     Return value: 0 on success. */
173      gpgme_data_release (keydata);  static int
174    keyserver_recv_key (HWND dlg, const char *kserver, WORD port,
175      return rc;                      const char *pattern, int proto, int flags,
176  } /* hkp_recv_key */                      char **r_fpr)
177    {
178        gpgme_ctx_t ctx;
179  #define my_iskeychar(a) ( ( (a) >='0' && (a) <= '9' ) || ( (a) >= 'A' && (a) <= 'F' ) )      gpgme_data_t keydata;
180        gpgme_error_t ec;
181  static int      gpgme_import_result_t import_res = NULL;    
182  check_pattern( const char *pattern )      char *rawkey = NULL;
183  {      int rc;
184      int rc = 1;      
185            /* XXX: implement dynamic buffers. */
186      /* Whitespace are not allowed! */      rawkey = new char[MAX_KEYSIZE];
187      if( strchr( pattern, ' ') ) {      if (!rawkey)
188          rc = WPTERR_GENERAL;          BUG (0);
189          goto leave;      memset (rawkey, 0, MAX_KEYSIZE);
190      }      if (proto == KSPROTO_LDAP) {
191                rc = ldap_recvkey (kserver, pattern, rawkey, MAX_KEYSIZE-1);
192      if( (( strstr( pattern, "0x" ) ) && ( strlen( pattern ) == 10 ) )          if (rc) {
193           || (strstr(pattern, "0x")) && ( strlen( pattern )  == 18 ) ) {              msg_box (dlg, _("LDAP key import failed.\n"
194          rc = 0;                              "Please make sure you have an online connection"
195          goto leave;                              " and gpgkeys_ldap.exe is installed"),
196      }                              _("Keyserver"), MB_ERR);
197                    free_if_alloc (rawkey);
198      if( (( my_iskeychar( pattern[0] )) && ( strlen( pattern )  == 8 ) )              return rc;
199           || (my_iskeychar(pattern[0])) && ( strlen( pattern ) == 16) ) {          }
200          rc = 0;      }
201          goto leave;      else if (proto == KSPROTO_FINGER) {
202      }          rc = finger_recvkey (kserver, pattern, rawkey, MAX_KEYSIZE-1);
203                if (rc) {
204      if( ( strchr( pattern, '@' ) ) && ( strlen( pattern ) >= 3 ) ) {              log_box (_("Keyserver"), MB_ERR,
205          rc = 0;                       _("Finger key import failed: %s\n"), winpt_strerror (rc));
206          goto leave;              free_if_alloc (rawkey);
207      }              return rc;
208                }
209  leave:      }
210      return rc;      else if ((rc = kserver_recvkey (kserver, port,
211  } /* check_pattern */                                      kserver_check_keyid (pattern),
212                                        rawkey, MAX_KEYSIZE-1))) {
213            hkp_err_box (dlg, kserver, port, rc);
214  static void          free_if_alloc (rawkey);
215  set_proxy (HWND dlg)          return rc;
216  {      }
217      char proxy[384];      else {
218      int port = 0;          if (!strstr (rawkey, "BEGIN PGP PUBLIC KEY BLOCK")) {
219                    msg_box (dlg, _("This is not a valid OpenPGP key."),
220      strcpy (proxy, "HTTP proxy: ");                       _("Keyserver"), MB_ERR);
221      if (kserver_get_proxy (&port)) {              goto leave;
222          char t[256];          }
223          const char *http = kserver_get_proxy (&port);          ec = gpgme_new (&ctx);
224          _snprintf (t, sizeof (t) - 1, "\"%s:%d\"", http, port);          if (ec)
225          strcat (proxy, t);              BUG (NULL);
226      }          gpgme_data_new_from_mem (&keydata, rawkey, strlen (rawkey), 1);
227      else          rc = gpgme_op_import (ctx, keydata);
228          strcat( proxy, "none" );          if (rc) {
229      SetDlgItemText( dlg, IDC_KEYSERVER_PROXY, proxy );              msg_box (dlg, gpgme_strerror ((gpgme_error_t)rc), _("Import"), MB_ERR);
230  } /* set_proxy */              goto leave;
231            }
232            import_res = gpgme_op_import_result (ctx);
233  static int inline          if (import_res && r_fpr)
234  kserver_get_pos (listview_ctrl_t lv)              *r_fpr = m_strdup (import_res->imports->fpr);
235  {      }
236      if (listview_count_items (lv, 0) == 1)      
237          return 0;      /* if we use the refresh mode, a lot of keys will be fetched and thus only
238      return listview_get_curr_pos (lv);         a summarize at the end is presented and not for each key. */
239  }      if (!(flags & KM_KS_REFRESH)) {
240            show_imported_keys (import_res);
241            if (import_res && import_res->unchanged == import_res->considered) {
242  static u16 inline              rc = WPTERR_GENERAL; /* no keys updated. */
243  kserver_get_port (listview_ctrl_t lv)              goto leave;
244  {          }
245      char buf[16];      }
246    
247      listview_get_item_text (lv, kserver_get_pos (lv), 3, buf, 15);  leave:
248      return (u16)strtoul (buf, NULL, 10);      free_if_alloc (rawkey);
249  }      gpgme_release (ctx);
250        gpgme_data_release (keydata);
251  static void  
252  load_default_ks (listview_ctrl_t lv)      return rc;
253  {  }
254      char * p, buf[192];  
255      int i;  
256    /* Alias for keyserver_recv_key but without the ability to return
257      p = get_reg_entry_keyserver ("Default");     the fingerprint of the key. */
258      if (!p)  int
259          return;  hkp_recv_key (HWND dlg, const char *kserver, WORD port,
260      for( i = 0; i < listview_count_items( lv, 0 ); i++ ) {                const char *pattern, int proto, int flags)
261          listview_get_item_text( lv, i, 0, buf, sizeof (buf)-1 );  {
262          if( !strncmp( p, buf, strlen( p ) ) ) {      return keyserver_recv_key (dlg, kserver, port, pattern,
263              listview_add_sub_item( lv, i, 2, "x" );                                 proto, flags, NULL);
264              break;  }
265          }  
266      }  int
267      free_if_alloc (p);  hkp_recv_key2 (HWND dlg, const char *kserver, WORD port,
268  } /* load_default_ks */                 const char *pattern, int proto, char **r_fpr)
269    {
270        return keyserver_recv_key (dlg, kserver, port, pattern, proto, 0,
271  static int                                 r_fpr);
272  save_default_ks (listview_ctrl_t lv)  }
273  {  
274      char buf[192], port[32];  
275      int idx, i;    #define my_iskeychar(a) (((a) >='0' && (a) <= '9' ) || ((a) >= 'A' && (a) <= 'F'))
276    
277      idx = listview_get_curr_pos( lv );  static int
278      if( idx == -1 ) {  check_pattern (const char *pattern)
279          msg_box( NULL, _("Please select one of the servers."), _("Keyserver"), MB_ERR );  {
280          return -1;      int rc = 1;
281      }      
282      listview_get_item_text( lv, idx, 1, buf, sizeof (buf)-1 );      /* Whitespace are not allowed! */
283      if( *buf != 'H' ) {      if (strchr (pattern, ' ')) {
284          msg_box( NULL, _("Only HTTP keyserver can be used."), _("Keyserver"), MB_ERR );          rc = WPTERR_GENERAL;
285          return -1;          goto leave;
286      }      }
287      for (i = 0; i < listview_count_items( lv, 0 ); i++)      
288          listview_add_sub_item (lv, i, 2, "");      if (((strstr (pattern, "0x")) && (strlen (pattern) == 10)) ||
289      listview_add_sub_item (lv, idx, 2, "x");           (strstr(pattern, "0x")) && (strlen (pattern)  == 18)) {
290      listview_get_item_text (lv, idx, 0, buf, sizeof (buf)-1);          rc = 0; /* Either long or short keyid */
291      set_reg_entry_keyserver ("Default", buf);          goto leave;
292      i = kserver_get_port (lv);      }
293      sprintf (port, "%d", i);      
294      set_reg_entry_keyserver ("Default_Port", port);      if( (( my_iskeychar( pattern[0] )) && ( strlen( pattern )  == 8 ) )
295      keyserver_set_default (buf, (u16)i);           || (my_iskeychar(pattern[0])) && ( strlen( pattern ) == 16) ) {
296      return 0;          rc = 0;
297  } /* save_default_ks */          goto leave;
298        }
299        
300  int      if ((strchr (pattern, '@')) &&
301  keyserver_list_build (listview_ctrl_t *r_lv, HWND hwnd)          (strlen (pattern) >= 3)) {
302  {          rc = 0;
303      struct listview_column_s keyserver[] = {          goto leave;
304          {0, 160, (char *)_("DNS Name")},              }
305          {1,  52, (char *)_("Protocol")},      
306          {2,  46, (char *)_("Default")},  leave:
307          {3,  46, (char *)_("Port")},      return rc;
308          {0,   0, NULL}  } /* check_pattern */
309      };  
310      listview_ctrl_t lv;  
311      char buf[32];  static void
312      int j;  set_proxy (HWND dlg)
313    {
314      listview_new (&lv);          char proxy[256];
315      lv->ctrl = hwnd;            int port = 0;
316      for (j=0; keyserver[j].fieldname; j++)      
317          listview_add_column (lv, &keyserver[j]);              strcpy (proxy, "HTTP proxy: ");
318      for (j = 0; j<MAX_KEYSERVERS; j++) {      if (kserver_get_proxy (&port)) {
319          if (!server[j].used)          char t[128];
320              continue;          const char *http = kserver_get_proxy (&port);
321          listview_add_item (lv, " ");          _snprintf (t, sizeof (t) - 1, "\"%s:%d\"", http, port);
322          listview_add_sub_item (lv, 0, 0, server[j].name);          strcat (proxy, t);
323          switch (server[j].proto) {      }
324          case KSPROTO_HTTP:      else
325              listview_add_sub_item( lv, 0, 1, "H" ); break;          strcat (proxy, "none");
326          case KSPROTO_LDAP:      SetDlgItemText (dlg, IDC_KEYSERVER_PROXY, proxy);
327              listview_add_sub_item( lv, 0, 1, "L" ); break;  }
328          case KSPROTO_FINGER:  
329              listview_add_sub_item( lv, 0, 1, "F" ); break;  
330          }  static int inline
331          sprintf (buf, "%d", server[j].port);  kserver_get_pos (listview_ctrl_t lv)
332          listview_add_sub_item (lv, 0, 3, buf);  {
333      }      if (listview_count_items (lv, 0) == 1)
334      load_default_ks (lv);          return 0;
335      if (listview_count_items (lv, 0) == 0) {      return listview_get_curr_pos (lv);
336          listview_add_item (lv, "");  }
337          listview_add_sub_item (lv, 0, 0, DEF_HKP_KEYSERVER);  
338          listview_add_sub_item (lv, 0, 1, "H");  
339      }  static u16 inline
340      listview_set_ext_style (lv);  kserver_get_port (listview_ctrl_t lv)
341      *r_lv = lv;  {
342      return 0;      char buf[16];
343  }  
344        listview_get_item_text (lv, kserver_get_pos (lv), KS_COL_PORT, buf, 15);
345        return (u16)strtoul (buf, NULL, 10);
346  BOOL CALLBACK  }
347  keyserver_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  
348  {  
349      static listview_ctrl_t lv = NULL;  /* Load the default keyserver and mark it in @lv. */
350      static int lv_idx = 0;  static void
351      int rc, proto_nr = 0;  load_default_ks (listview_ctrl_t lv)
352      char kserver[128], pattern[128];  {
353      char proto[16];          char * p, buf[192];
354      keyserver_ctx ksc;      int i;
355        
356      switch ( msg ) {      p = get_reg_entry_keyserver ("Default");
357      case WM_INITDIALOG:      if (!p)
358  #ifndef LANG_DE          return;
359          SetWindowText( dlg, _("Keyserver Access") );      for (i = 0; i < listview_count_items( lv, 0); i++ ) {
360          SetDlgItemText( dlg, IDC_KEYSERVER_SEND,          listview_get_item_text (lv, i, KS_COL_NAME, buf, sizeof (buf)-1);
361                          _("Send key (default is receiving)") );          if (!strncmp (p, buf, strlen (p))) {
362          SetDlgItemText( dlg, IDC_KEYSERVER_INFO,              listview_add_sub_item (lv, i, KS_COL_DEFAULT, "x");
363                          _("Please enter the key ID or email address that belongs to the key"));                                      break;
364          SetDlgItemText( dlg, IDC_KEYSERVER_INDEX, _("&Search") );          }
365  #endif      }
366          set_proxy (dlg);      free_if_alloc (p);
367          keyserver_list_build (&lv, GetDlgItem (dlg, IDC_KEYSERVER_LIST));  }
368          center_window (dlg);  
369          SetForegroundWindow (dlg);  /* Save the selected keyserver from @lv as the default server. */
370          return TRUE;  static int
371            save_default_ks (listview_ctrl_t lv)
372      case WM_NOTIFY:  {
373          NMHDR *notify;      char buf[192], port[32];
374          notify = (NMHDR *)lparam;      int idx, i;  
375          if( notify && notify->code == NM_CLICK  
376              && notify->idFrom == IDC_KEYSERVER_LIST )      idx = listview_get_curr_pos (lv);
377              lv_idx = listview_get_curr_pos( lv );      if (idx == -1) {
378          return TRUE;          msg_box (NULL, _("Please select one of the servers."), _("Keyserver"), MB_ERR);
379                    return -1;
380      case WM_DESTROY:      }
381          if( lv ) {      listview_get_item_text (lv, idx, KS_COL_NAME, buf, sizeof (buf)-1);
382              listview_release( lv );      if (!strncmp (buf, "http", 4) && !strncmp (buf, "hkp", 3)) {
383              lv = NULL;          msg_box (NULL, _("Only HTTP keyserver can be used."),
384          }                   _("Keyserver"), MB_ERR);
385          lv_idx = 0;          return -1;
386          return FALSE;      }
387                for (i = 0; i < listview_count_items (lv, 0); i++)
388      case WM_SYSCOMMAND:          listview_add_sub_item (lv, i, KS_COL_DEFAULT, "");
389          if( LOWORD( wparam ) == SC_CLOSE )      listview_add_sub_item (lv, idx, KS_COL_DEFAULT, "x");
390              EndDialog( dlg, TRUE );      listview_get_item_text (lv, idx, KS_COL_NAME, buf, sizeof (buf)-1);
391          return FALSE;      set_reg_entry_keyserver ("Default", buf);
392                i = kserver_get_port (lv);
393      case WM_COMMAND:      sprintf (port, "%d", i);
394          switch( LOWORD( wparam ) ) {      set_reg_entry_keyserver ("Default_Port", port);
395          case IDC_KEYSERVER_PROXSETT:      keyserver_set_default (buf, (u16)i);
396              dialog_box_param( glob_hinst, (LPCTSTR)IDD_WINPT_KEYSERVER_PROXY, glob_hwnd,      return 0;
397                                keyserver_proxy_dlg_proc, NULL,  }
398                                _("Proxy Settings"), IDS_WINPT_KEYSERVER_PROXY );  
399              set_proxy( dlg );  
400              return TRUE;  int
401                keyserver_list_build (listview_ctrl_t *r_lv, HWND hwnd)
402          case IDC_KEYSERVER_INDEX:  {
403              if (!lv_idx) {      struct listview_column_s keyserver[] = {
404                  lv_idx = kserver_get_pos (lv);          {0, 160, (char *)_("DNS Name")},
405                  if (lv_idx == -1) {          {1,  46, (char *)_("Port")},
406                      msg_box (dlg, _("Please select one of the keyservers."), _("Keyserver"), MB_INFO);          {2,  60, (char *)_("Default")},
407                      return FALSE;          {0,   0, NULL}
408                  }      };
409              }      HICON ico[1];
410              listview_get_item_text (lv, lv_idx, 1, proto, sizeof (proto)-1);      listview_ctrl_t lv;
411              if (*proto == 'L') {      char buf[32];
412                  msg_box( dlg, _("This is not implemented yet!"), _("Keyserver"), MB_ERR );      int j;
413                  return FALSE;  
414              }      ico[0] = LoadIcon (glob_hinst, (LPCTSTR)IDI_COMPUTER);
415              listview_get_item_text (lv, lv_idx, 0, kserver, sizeof (kserver)-1);      listview_new (&lv);    
416              if (!GetDlgItemText (dlg, IDC_KEYSERVER_SEARCH, pattern, sizeof (pattern)-1)) {      lv->ctrl = hwnd;
417                  msg_box (dlg, _("Please enter the search pattern."), _("Keyserver"), MB_INFO);      for (j=0; keyserver[j].fieldname; j++)
418                  return FALSE;          listview_add_column (lv, &keyserver[j]);
419              }      listview_set_image_list (lv, ico, 1);
420              ksc.name = kserver;      for (j = 0; j<MAX_KEYSERVERS; j++) {
421              ksc.pattern = pattern;          if (!server[j].used)
422              ksc.port = kserver_get_port (lv);              continue;
423              DialogBoxParam( glob_hinst, (LPCSTR)IDD_WINPT_HKPSEARCH, dlg,          listview_add_item_image (lv, " ", 0);
424                              hkpsearch_dlg_proc, (LPARAM) &ksc );          listview_add_sub_item (lv, 0, KS_COL_NAME, server[j].name);
425              return TRUE;          sprintf (buf, "%d", server[j].port);
426                        listview_add_sub_item (lv, 0, KS_COL_PORT, buf);
427          case IDC_KEYSERVER_RECV:      }
428              memset (&kserver, 0, sizeof (kserver));      load_default_ks (lv);
429              if (!lv_idx) {      if (listview_count_items (lv, 0) == 0) {
430                  lv_idx = kserver_get_pos (lv);          listview_add_item (lv, "");
431                  if (lv_idx == -1) {          listview_add_sub_item (lv, 0, KS_COL_NAME, DEF_HKP_KEYSERVER);
432                      msg_box( dlg, _("Please select one of the keyservers."), _("Keyserver"), MB_INFO );      }
433                      return FALSE;      listview_set_ext_style (lv);
434                  }      *r_lv = lv;
435              }      return 0;
436              listview_get_item_text( lv, lv_idx, 1, proto, sizeof (proto)-1 );  }
437              proto_nr = KSPROTO_HTTP;  
438              if( *proto == 'L' )  
439                  proto_nr = KSPROTO_LDAP;  static void
440              else if( *proto == 'F' )  keyserver_remove (listview_ctrl_t lv)
441                  proto_nr = KSPROTO_FINGER;  {
442              listview_get_item_text( lv, lv_idx, 0, kserver, sizeof (kserver)-1 );      char name[100];
443              if( !GetDlgItemText( dlg, IDC_KEYSERVER_SEARCH, pattern, sizeof (pattern)-1 ) ) {      int pos = listview_get_curr_pos (lv);
444                  msg_box( dlg, _("Please enter the search pattern."), _("Keyserver"), MB_INFO );      int i;
445                  return FALSE;  
446              }      listview_get_item_text (lv, pos, KS_COL_NAME, name, sizeof (name)-1);
447              if( proto_nr == KSPROTO_LDAP && strchr( pattern, '@' ) ) {      for (i=0; i < MAX_KEYSERVERS; i++) {
448                  msg_box( dlg, _("Only keyids are allowed."), _("LDAP Keyserver"), MB_INFO );          if (server[i].name && strcmp (server[i].name, name) == 0)
449                  return FALSE;              server[i].used = 0;
450              }      }
451              else if( proto_nr == KSPROTO_FINGER &&      listview_del_item (lv, pos);
452                       ( strchr( pattern, '@' ) || strchr( pattern, ' ' ) ) ) {  }
453                  msg_box( dlg, _("Only enter the name of the user."), _("FINGER Keyserver"), MB_INFO );  
454                  return FALSE;  
455              }  static void
456              else if( check_pattern( pattern ) ) {  keyserver_edit (listview_ctrl_t lv, keyserver_rec_t ctx)
457                  msg_box( dlg, _("Only email addresses or keyids are allowed."), _("Keyserver"), MB_INFO );  {
458                  return FALSE;      char buf[16];
459              }      bool fnd = false;
460              rc = hkp_recv_key (dlg, kserver, kserver_get_port (lv), pattern, proto_nr, 0);      int i;
461              if (!rc)  
462                  keycache_set_reload (1);      for (i=0; i < MAX_KEYSERVERS; i++) {
463              return TRUE;          if (server[i].name && strcmp (server[i].name, ctx->name) == 0) {
464                fnd = true;
465          case IDC_KEYSERVER_DEFAULT:              break;
466              save_default_ks( lv );          }
467              break;      }
468                    if (!fnd)
469          case IDCANCEL:          return;
470              EndDialog( dlg, FALSE );      server[i].port = ctx->port;
471              return FALSE;  
472          }      i = listview_get_curr_pos (lv);
473          break;      sprintf (buf, "%d", ctx->port);
474      }      listview_add_sub_item (lv, i, KS_COL_NAME, ctx->name);
475            listview_add_sub_item (lv, i, KS_COL_PORT, buf);
476      return FALSE;  }
477  } /* keyserver_dlg_proc */  
478    static void
479    keyserver_add (listview_ctrl_t lv, keyserver_rec_t ctx)
480    {
481        char buf[16];
482        bool fnd = false;
483        int i;
484    
485        for (i=0; i < MAX_KEYSERVERS; i++) {
486            if (server[i].used == 0) {
487                fnd = true;
488                break;
489            }
490        }
491        if (!fnd) {
492            msg_box (NULL, _("No space for new keyserver entry"),
493                     _("Keyserver"), MB_ERR);
494            return;
495        }
496        free_if_alloc (server[i].name);
497        server[i].name = m_strdup (ctx->name);
498        server[i].port = ctx->port;
499        server[i].proto = ctx->proto;
500        server[i].used = 1;
501    
502        sprintf (buf, "%d", ctx->port);
503        listview_add_item (lv, " ");
504        listview_add_sub_item (lv, 0, KS_COL_NAME, ctx->name);
505        listview_add_sub_item (lv, 0, KS_COL_PORT, buf);
506    }
507    
508    
509    static void
510    fill_keyserv_types (HWND dlg)
511    {
512        HWND h = GetDlgItem (dlg, IDC_KSERVADD_TYPES);
513        combox_add_string (h, _("HKP Keyserver"));
514        combox_add_string (h, _("LDAP Keyserver"));
515        combox_add_string (h, _("Finger Keyserver"));
516        SendMessage (h, CB_SETCURSEL, 0, 0);
517    }
518    
519    
520    /* Dialog box procedure for modify keyservers. */
521    BOOL CALLBACK
522    keyserver_modify_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
523    {
524        static keyserver_rec_t ctx;
525        char tmp[128];
526    
527        switch (msg) {
528        case WM_INITDIALOG:
529            fill_keyserv_types (dlg);
530            ctx = (keyserver_rec_t)lparam;
531            if (ctx->mode) {
532                SendDlgItemMessage (dlg, IDC_KSERVADD_TYPES, CB_SETCURSEL, ctx->proto, 0);
533                SetDlgItemText (dlg, IDC_KSERVADD_HOST, ctx->name);
534                SetDlgItemInt (dlg, IDC_KSERVADD_PORT, ctx->port, FALSE);
535                EnableWindow (GetDlgItem (dlg, IDC_KSERVADD_HOST), FALSE);
536                EnableWindow (GetDlgItem (dlg, IDC_KSERVADD_TYPES), FALSE);
537            }
538            else
539                SetDlgItemInt (dlg, IDC_KSERVADD_PORT, 11371, FALSE);
540            SetWindowText (dlg, _("Edit Keyserver"));
541            SetDlgItemText (dlg, IDOK, _("&Add"));
542            SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
543            SetDlgItemText (dlg, IDC_KSERVADD_TYPEINF, _("Type:"));
544            SetDlgItemText (dlg, IDC_KSERVADD_PORTINF, _("Port:"));
545            SetDlgItemText (dlg, IDC_KSERVADD_HOSTINF, _("Host name:"));
546            SetForegroundWindow (dlg);
547            break;
548    
549        case WM_COMMAND:
550            switch (LOWORD (wparam)) {
551            case IDOK:
552                if (!GetDlgItemText (dlg, IDC_KSERVADD_HOST, tmp, sizeof (tmp)-1)) {
553                    msg_box (dlg, _("Please enter a host name"), _("Keyserver"), MB_ERR);
554                    return FALSE;
555                }      
556                ctx->port = GetDlgItemInt (dlg, IDC_KSERVADD_PORT, NULL, FALSE);
557                if (ctx->port > 65535) {
558                    msg_box (dlg, _("Invalid port, valid numbers are < 65535"), _("Keyserver"), MB_ERR);
559                    return FALSE;
560                }
561                ctx->proto = SendDlgItemMessage (dlg, IDC_KSERVADD_TYPES, CB_GETCURSEL, 0, 0);
562                ctx->cancel = false;
563                ctx->name[0] = '\0';
564                if (!strstr (tmp, "://")) {
565                    switch (ctx->proto) {
566                    case KSPROTO_HTTP: strcpy (ctx->name, "http://"); break;
567                    case KSPROTO_LDAP: strcpy (ctx->name, "ldap://"); break;
568                    case KSPROTO_FINGER:strcpy (ctx->name, "finger://"); break;
569                    }
570                }
571                strcat (ctx->name, tmp);
572                ctx->cancel = false;
573                EndDialog (dlg, TRUE);
574                break;
575    
576            case IDCANCEL:
577                ctx->cancel = true;
578                EndDialog (dlg, FALSE);
579                break;
580            }
581            break;
582        }
583    
584        return FALSE;
585    }
586    
587    /* Dialog box procedure to access keyservers. */
588    BOOL CALLBACK
589    keyserver_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
590    {
591        static listview_ctrl_t lv = NULL;
592        static int lv_idx = 0;
593        keyserver_ctx ksc;
594        struct keyserver_rec_s edit;
595        char kserver[128], pattern[128];
596        char proto[16], *fpr = NULL;
597        int rc, proto_nr = 0;
598        
599        switch (msg) {
600        case WM_INITDIALOG:
601            SetWindowText (dlg, _("Keyserver Access"));
602            SetDlgItemText (dlg, IDC_KEYSERVER_RECV, _("&Receive"));
603            SetDlgItemText (dlg, IDC_KEYSERVER_SEND,
604                            _("Send key (default is receiving)"));
605            SetDlgItemText (dlg, IDC_KEYSERVER_INFO,
606                            _("Please enter the key ID or email address you search for"));
607            SetDlgItemText (dlg, IDC_KEYSERVER_INDEX, _("&Search"));
608            SetDlgItemText (dlg, IDC_KEYSERVER_PROXSETT, _("C&hange"));
609            SetDlgItemText (dlg, IDC_KEYSERVER_DEFAULT, _("Set &default"));
610            SetDlgItemText (dlg, IDCANCEL, _("&Close"));
611    
612            set_proxy (dlg);
613            keyserver_list_build (&lv, GetDlgItem (dlg, IDC_KEYSERVER_LIST));
614            center_window (dlg, NULL);
615            SetForegroundWindow (dlg);
616            return TRUE;
617            
618        case WM_NOTIFY:
619            NMHDR *notify;
620            notify = (NMHDR *)lparam;
621            if (!notify)
622                break;
623            if (notify->code == NM_CLICK
624                && notify->idFrom == IDC_KEYSERVER_LIST)
625                lv_idx = listview_get_curr_pos (lv);
626            else if (notify->code == NM_RCLICK &&
627                     notify->idFrom == IDC_KEYSERVER_LIST) {
628                POINT p;
629                GetCursorPos (&p);
630                HMENU hm, pop;
631                hm = LoadMenu (glob_hinst, (LPCTSTR)IDR_WINPT_KEYSERVER_CTX);
632                pop = GetSubMenu (hm, 0);
633                set_menu_text (pop, ID_KSERVCTX_ADD, _("&Add"));
634                set_menu_text (pop, ID_KSERVCTX_DEL, _("&Remove"));
635                set_menu_text (pop, ID_KSERVCTX_EDIT, _("&Edit"));
636                TrackPopupMenu (pop, 0, p.x, p.y, 0, dlg, NULL);
637                DestroyMenu (hm);
638                DestroyMenu (pop);
639            }
640    
641            return TRUE;
642            
643        case WM_DESTROY:
644            if (lv) {
645                listview_release (lv);
646                lv = NULL;
647            }
648            lv_idx = 0;
649            return FALSE;
650            
651        case WM_SYSCOMMAND:
652            if (LOWORD (wparam) == SC_CLOSE)
653                EndDialog (dlg, TRUE);
654            return FALSE;
655            
656        case WM_COMMAND:
657            switch (LOWORD (wparam)) {
658            case IDC_KEYSERVER_PROXSETT:
659                dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYSERVER_PROXY,
660                                  dlg, keyserver_proxy_dlg_proc, NULL,
661                                  _("Proxy Settings"), IDS_WINPT_KEYSERVER_PROXY);
662                set_proxy (dlg);
663                return TRUE;
664                
665            case IDC_KEYSERVER_INDEX:
666                if (!lv_idx) {
667                    lv_idx = kserver_get_pos (lv);
668                    if (lv_idx == -1) {
669                        msg_box (dlg, _("Please select one of the keyservers."),
670                                 _("Keyserver"), MB_INFO);
671                        return FALSE;
672                    }
673                }
674                listview_get_item_text (lv, lv_idx, KS_COL_NAME,
675                                        proto, sizeof (proto)-1);
676                if (!strncmp (proto, "ldap", 4)) {
677                    msg_box (dlg, _("This is not implemented yet!"),
678                             _("Keyserver"), MB_ERR);
679                    return FALSE;
680                }
681                listview_get_item_text (lv, lv_idx, KS_COL_NAME,
682                                        kserver, sizeof (kserver)-1);
683                if (!GetDlgItemText (dlg, IDC_KEYSERVER_SEARCH, pattern, sizeof (pattern)-1)) {
684                    msg_box (dlg, _("Please enter the search pattern."),
685                             _("Keyserver"), MB_INFO);
686                    return FALSE;
687                }
688                ksc.name = kserver;
689                ksc.pattern = pattern;
690                ksc.port = kserver_get_port (lv);
691                DialogBoxParam (glob_hinst, (LPCSTR)IDD_WINPT_HKPSEARCH, dlg,
692                                hkpsearch_dlg_proc, (LPARAM) &ksc);
693                return TRUE;
694                
695            case IDC_KEYSERVER_RECV:
696                memset (&kserver, 0, sizeof (kserver));
697                if (!lv_idx) {
698                    lv_idx = kserver_get_pos (lv);
699                    if (lv_idx == -1) {
700                        msg_box (dlg, _("Please select one of the keyservers."),
701                                _("Keyserver"), MB_INFO);
702                        return FALSE;
703                    }
704                }
705                listview_get_item_text (lv, lv_idx, KS_COL_NAME,
706                                        proto, sizeof (proto)-1);
707                proto_nr = KSPROTO_HTTP;
708                if (!strncmp  (proto, "ldap", 4))
709                    proto_nr = KSPROTO_LDAP;
710                else if (!strncmp (proto, "finger", 6))
711                    proto_nr = KSPROTO_FINGER;
712                listview_get_item_text (lv, lv_idx, KS_COL_NAME,
713                                        kserver, sizeof (kserver)-1);
714                if (!GetDlgItemText(dlg, IDC_KEYSERVER_SEARCH,
715                                    pattern, sizeof (pattern)-1)) {
716                    msg_box (dlg, _("Please enter the search pattern."),
717                             _("Keyserver"), MB_INFO);
718                    return FALSE;
719                }
720                if (proto_nr == KSPROTO_LDAP && strchr (pattern, '@')) {
721                    msg_box (dlg, _("Only keyids are allowed."),
722                             _("Keyserver"), MB_INFO);
723                    return FALSE;
724                }
725                else if (proto_nr == KSPROTO_FINGER) {
726                    if (strchr (pattern, '@') || strchr (pattern, ' ')) {
727                        msg_box (dlg, _("Only enter the name of the user."),
728                                 _("Keyserver"), MB_INFO);
729                        return FALSE;
730                    }
731                }
732                else if (check_pattern (pattern)) {
733                    msg_box (dlg, _("Only email addresses or keyids are allowed."),
734                            _("Keyserver"), MB_INFO);
735                    return FALSE;
736                }
737                rc = keyserver_recv_key (dlg, kserver, kserver_get_port (lv),
738                                         pattern, proto_nr, 0,
739                                         &fpr);
740                if (!rc && fpr != NULL) {
741                    keycache_update (0, fpr);
742                    free_if_alloc (fpr);
743                }
744                return TRUE;
745    
746            case IDC_KEYSERVER_DEFAULT:
747                save_default_ks (lv);
748                break;
749    
750            case ID_KSERVCTX_ADD:
751                memset (&edit, 0, sizeof (edit));
752                edit.mode = false;
753                dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYSERVER_ADD, dlg,
754                                    keyserver_modify_dlg_proc,
755                                    (LPARAM)&edit, _("Edit Keyserver"), 0);
756                if (!edit.cancel)
757                    keyserver_add (lv, &edit);
758                return TRUE;
759    
760            case ID_KSERVCTX_EDIT:
761                memset (&edit, 0, sizeof (edit));
762                edit.mode = true;
763                listview_get_item_text (lv, lv_idx, KS_COL_NAME,
764                                        edit.name, sizeof (edit.name)-1);
765                listview_get_item_text (lv, lv_idx, KS_COL_PORT, pattern, 32);
766                edit.port = atoi (pattern);
767                if (!strncmp (edit.name, "hkp", 3) || !strncmp (edit.name, "http", 4))
768                    edit.proto = KSPROTO_HTTP;
769                else if (!strncmp (edit.name, "ldap", 4))
770                    edit.proto = KSPROTO_LDAP;
771                else
772                    edit.proto = KSPROTO_FINGER;
773                dialog_box_param (glob_hinst, (LPCTSTR)IDD_WINPT_KEYSERVER_ADD, dlg,
774                                    keyserver_modify_dlg_proc,
775                                    (LPARAM)&edit, _("Edit Keyserver"), 0);
776                if (!edit.cancel)
777                    keyserver_edit (lv, &edit);
778                break;
779    
780            case ID_KSERVCTX_DEL:
781                keyserver_remove (lv);
782                return TRUE;
783                
784            case IDCANCEL:
785                EndDialog (dlg, FALSE);
786                return FALSE;
787            }
788            break;
789        }
790        
791        return FALSE;
792    }

Legend:
Removed from v.2  
changed lines
  Added in v.165

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26