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

Diff of /trunk/Src/wptKeysignDlg.cpp

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

revision 278 by twoaday, Mon Jan 15 22:02:04 2007 UTC revision 328 by twoaday, Fri Sep 25 16:07:38 2009 UTC
# Line 1  Line 1 
1  /* wptKeysignDlg.cpp - Key signing dialog  /* wptKeysignDlg.cpp - Key signing dialog
2   *      Copyright (C) 2001-2006 Timo Schulz   *      Copyright (C) 2001-2006, 2008-2009 Timo Schulz
3   *   *
4   * This file is part of WinPT.   * This file is part of WinPT.
5   *   *
# Line 39  Line 39 
39  #include "StringBuffer.h"  #include "StringBuffer.h"
40    
41    
42  void key_unload_photo (HWND dlg);  int key_load_photo (winpt_key_t key,
43  int  key_load_photo (HWND dlg, gpgme_key_t key, gpgme_validity_t *r_valid);                      char *photo_file, size_t photo_file_size,
44  const char* get_photo_tmpname (HWND dlg);                      gpgme_validity_t *r_valid);
45    int get_photo_tmpname (gpgme_key_t key, char *buf, size_t buflen);
46    
47  /* Return a beautified printable fingerprint of @fpr. */  /* Return a beautified printable fingerprint of @fpr. */
48  static const char*  static const char*
49  get_printable_fpr (const char *fpr)  get_printable_fpr (const char *fpr)
50  {  {
51      static char pfpr[64];      static char pfpr[128];
52      int pos = 0;      int pos = 0;
53      size_t i;      size_t i;
54    
55        memset (pfpr, 0, sizeof (pfpr));
56      for (i = 0; i < strlen (fpr); i += 4) {      for (i = 0; i < strlen (fpr); i += 4) {
57          pfpr[pos++] = fpr[i];          pfpr[pos++] = fpr[i];
58          pfpr[pos++] = fpr[i+1];          pfpr[pos++] = fpr[i+1];
# Line 77  get_keyinfo (gpgme_key_t key) Line 79  get_keyinfo (gpgme_key_t key)
79                 get_key_pubalgo (key->subkeys->pubkey_algo),                 get_key_pubalgo (key->subkeys->pubkey_algo),
80                 key->subkeys->keyid+8);                 key->subkeys->keyid+8);
81      if (k.ext->gloflags.divert_to_card)      if (k.ext->gloflags.divert_to_card)
82          strcat (buf, " (Card)");          strcat (buf, _(" (Card)"));
83      return buf;      return buf;
84  }  }
85    
# Line 147  do_check_protection (HWND dlg) Line 149  do_check_protection (HWND dlg)
149      idx = SendDlgItemMessage (dlg, IDC_KEYSIGN_KEYLIST, CB_GETCURSEL, 0, 0);      idx = SendDlgItemMessage (dlg, IDC_KEYSIGN_KEYLIST, CB_GETCURSEL, 0, 0);
150      key = (gpgme_key_t)SendDlgItemMessage (dlg, IDC_KEYSIGN_KEYLIST,      key = (gpgme_key_t)SendDlgItemMessage (dlg, IDC_KEYSIGN_KEYLIST,
151                                             CB_GETITEMDATA, (WPARAM)idx, 0);                                             CB_GETITEMDATA, (WPARAM)idx, 0);
152      if (key) {      if (!key)
153          if (winpt_get_seckey (key->subkeys->keyid, &k))          return;
154              BUG (0);      if (winpt_get_seckey (key->subkeys->keyid, &k))
155          protec = k.is_protected;          BUG (0);
156          if (!protec)      protec = k.is_protected;
157              protec = k.ext->gloflags.divert_to_card;      if (!protec)
158          EnableWindow (GetDlgItem (dlg, IDC_KEYSIGN_PASSPHRASE), protec? TRUE : FALSE);          protec = k.ext->gloflags.divert_to_card;
159      }      EnableWindow (GetDlgItem (dlg, IDC_KEYSIGN_PASSPHRASE),
160  }                          protec? TRUE : FALSE);
   
   
 /* Show the photographic ID of the key in a separate dialog window. */  
 BOOL CALLBACK  
 showphoto_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  
 {  
     static winpt_key_t key;  
     char buf[200];  
   
     switch (msg) {  
     case WM_INITDIALOG:  
         key = (winpt_key_t)lparam;  
         if (!key)  
             BUG (0);  
         key_load_photo (dlg, key->ctx, NULL);  
         _snprintf (buf, DIM (buf)-1, _("Photo of %s"), key->uid);  
         SetWindowText (dlg, buf);  
         SetForegroundWindow (dlg);  
         break;  
   
     case WM_PAINT:  
         if (key->ext && key->ext->attrib.len > 0) {  
             POINT p;  
             p.x = p.y = 0;  
             PTD_jpg_show (GetDlgItem (dlg, IDC_SHOWPHOTO_IMG),  
                             &p, get_photo_tmpname (dlg));  
         }  
         break;  
   
     case WM_DESTROY:  
         key_unload_photo (dlg);  
         break;  
   
     case WM_COMMAND:  
         switch (LOWORD (wparam)) {  
         case IDCANCEL:  
         case IDOK:  
             EndDialog (dlg, TRUE);  
             break;  
         }  
         break;  
     }  
   
     return FALSE;  
161  }  }
162    
163    
# Line 208  BOOL CALLBACK Line 166  BOOL CALLBACK
166  sig_class_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  sig_class_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
167  {  {
168      HWND parent;      HWND parent;
169      int sig_class = 0;      
   
170      switch (msg) {      switch (msg) {
171      case WM_INITDIALOG:      case WM_INITDIALOG:
172          parent = (HWND)lparam;          parent = (HWND)lparam;
# Line 227  sig_class_dlg_proc (HWND dlg, UINT msg, Line 184  sig_class_dlg_proc (HWND dlg, UINT msg,
184          CheckDlgButton (dlg, IDC_SIGCLASS_CLASS0, BST_CHECKED);          CheckDlgButton (dlg, IDC_SIGCLASS_CLASS0, BST_CHECKED);
185          SetForegroundWindow (dlg);          SetForegroundWindow (dlg);
186          center_window (dlg, parent? parent : NULL);          center_window (dlg, parent? parent : NULL);
187          return TRUE;          return TRUE;    
188    
189      case WM_COMMAND:      case WM_COMMAND:
190          switch (LOWORD (wparam)) {          switch (LOWORD (wparam)) {
191          case IDOK:          case IDOK:
192                int sig_class;
193    
194              if (IsDlgButtonChecked (dlg, IDC_SIGCLASS_CLASS0))              if (IsDlgButtonChecked (dlg, IDC_SIGCLASS_CLASS0))
195                  sig_class = 0;                  sig_class = 0;
196              else if (IsDlgButtonChecked (dlg, IDC_SIGCLASS_CLASS1))              else if (IsDlgButtonChecked (dlg, IDC_SIGCLASS_CLASS1))
# Line 243  sig_class_dlg_proc (HWND dlg, UINT msg, Line 202  sig_class_dlg_proc (HWND dlg, UINT msg,
202              else              else
203                  sig_class = 0;                  sig_class = 0;
204              EndDialog (dlg, sig_class);              EndDialog (dlg, sig_class);
205              return TRUE;              break;
206    
207          case IDCANCEL:          case IDCANCEL:
208              EndDialog (dlg, 0);              EndDialog (dlg, 0);
209              return TRUE;              break;
210          }          }
211          break;          break;
212      }      }
# Line 291  display_keyinfo (HWND dlg, winpt_key_t k Line 250  display_keyinfo (HWND dlg, winpt_key_t k
250      StringBuffer kinf;      StringBuffer kinf;
251      struct native_uid_s *u;      struct native_uid_s *u;
252      char tmp[256];      char tmp[256];
253      int len=0;      int len;
254        
255      _snprintf (tmp, DIM (tmp) -1,      _snprintf (tmp, DIM (tmp) -1,
256                     _("pub %d/0x%s   created: %s    expires: %s\n\n"                     _("pub %d/0x%s   created: %s    expires: %s\n\n"
257                       "Primary key fingerprint: %s\n\n"),                       "Key fingerprint:\n%s\n\n"),
258                     key->ctx->subkeys->length,                     key->ctx->subkeys->length,
259                     key->ctx->subkeys->keyid+8,                     key->ctx->subkeys->keyid+8,
260                     get_key_created (key->ctx->subkeys->timestamp),                     get_key_created (key->ctx->subkeys->timestamp),
# Line 306  display_keyinfo (HWND dlg, winpt_key_t k Line 265  display_keyinfo (HWND dlg, winpt_key_t k
265          if (u->revoked)          if (u->revoked)
266              continue;              continue;
267          if (len++ > 2)          if (len++ > 2)
268              break;              break;      
269          kinf = kinf + "\t\"" + u->uid + "\"\n";          kinf = kinf + "   \"";
270            if (strlen (u->uid) > 128) {
271                kinf.add (u->uid, 128);
272                kinf += "...";
273                // FIXME: make sure at least the e-mail address will be shown!
274            }
275            else
276                kinf += u->uid;
277            kinf += "\"\n";
278      }      }
     kinf = kinf + _("\n\nAre you really sure that you want to sign this key with YOUR key?\n");  
279      SetDlgItemText (dlg, IDC_KEYSIGN_INFOS, kinf.getBuffer ());      SetDlgItemText (dlg, IDC_KEYSIGN_INFOS, kinf.getBuffer ());
280  }  }
281    
282    
283    void set_gpg_auto_passphrase_cb (passphrase_cb_s *cb, const char *title);
284    gpgme_error_t passphrase_cb (void *hook, const char *uid_hint,
285                   const char *passphrase_info,
286                   int prev_was_bad, int fd);
287    
288  /* Perform the actual procedure to sign the key. */  /* Perform the actual procedure to sign the key. */
289  static BOOL  static BOOL
290  on_click_ok (HWND dlg, winpt_key_t key)  on_click_ok (HWND dlg, winpt_key_t key)
# Line 323  on_click_ok (HWND dlg, winpt_key_t key) Line 294  on_click_ok (HWND dlg, winpt_key_t key)
294      SYSTEMTIME st;      SYSTEMTIME st;
295      GpgKeyEdit ke;      GpgKeyEdit ke;
296      int sig_class = 0;      int sig_class = 0;
297      char keymsg[64], *pwd;      char keymsg[64];
298      int type, expires=0, idx;      int type, expires=0, idx;
299    
300      if (IsDlgButtonChecked (dlg, IDC_KEYSIGN_ASKLEVEL))      if (IsDlgButtonChecked (dlg, IDC_KEYSIGN_ASKLEVEL))
# Line 337  on_click_ok (HWND dlg, winpt_key_t key) Line 308  on_click_ok (HWND dlg, winpt_key_t key)
308          type = GPG_EDITKEY_LSIGN;          type = GPG_EDITKEY_LSIGN;
309      else      else
310          type = GPG_EDITKEY_SIGN;          type = GPG_EDITKEY_SIGN;
311        
               
312      if (reg_prefs.expert && IsDlgButtonChecked (dlg, IDC_KEYSIGN_NREV)) {      if (reg_prefs.expert && IsDlgButtonChecked (dlg, IDC_KEYSIGN_NREV)) {
313          type = GPG_EDITKEY_NRSIGN;          type = GPG_EDITKEY_NRSIGN;
314          if (type == GPG_EDITKEY_LSIGN)          if (type == GPG_EDITKEY_LSIGN)
# Line 348  on_click_ok (HWND dlg, winpt_key_t key) Line 318  on_click_ok (HWND dlg, winpt_key_t key)
318      if (IsDlgButtonChecked (dlg, IDC_KEYSIGN_EXPSIG)) {      if (IsDlgButtonChecked (dlg, IDC_KEYSIGN_EXPSIG)) {
319          DateTime_GetSystemtime (GetDlgItem (dlg, IDC_KEYSIGN_EXPIRES), &st);          DateTime_GetSystemtime (GetDlgItem (dlg, IDC_KEYSIGN_EXPIRES), &st);
320          if (date_is_today (&st)) {          if (date_is_today (&st)) {
321              msg_box (dlg, _("You cannot select today as the expiration date."),              show_balloon_msg (GetDlgItem (dlg, IDC_KEYSIGN_EXPIRES),
322                       _("Key Signing"), MB_INFO);                                _("You cannot select today as the expiration date."),
323                                  IDI_WARNING);
324              return TRUE;              return TRUE;
325          }          }
326          else          else
# Line 358  on_click_ok (HWND dlg, winpt_key_t key) Line 329  on_click_ok (HWND dlg, winpt_key_t key)
329                      st.wYear, st.wMonth, st.wDay);                      st.wYear, st.wMonth, st.wDay);
330      }      }
331    
     /* XXX: check for --ask-cert-level and --ask-cert-expire in the gpg.conf  
             if an advanced button is checked and offer to add it to the config  
             file. */      
     GetDlgItemText_utf8 (dlg, IDC_KEYSIGN_PASSPHRASE, &pwd);  
       
332      assert (key->ctx->subkeys->keyid != NULL); /* should be always true. */      assert (key->ctx->subkeys->keyid != NULL); /* should be always true. */
333      ke.setKeyID (key->ctx->subkeys->keyid);      ke.setKeyID (key->ctx->subkeys->keyid);
334      ke.setPassphrase (pwd);  
335      idx = SendDlgItemMessage (dlg, IDC_KEYSIGN_KEYLIST, CB_GETCURSEL, 0, 0);      // XXX: callback hangs after bad passphrase
336        passphrase_cb_s cb;
337        set_gpg_auto_passphrase_cb (&cb, _("Key Edit"));    
338        ke.setPassphraseCallback (passphrase_cb, (void*)&cb);
339    
340        HWND klist = GetDlgItem (dlg, IDC_KEYSIGN_KEYLIST);
341        idx = SendMessage (klist, CB_GETCURSEL, 0, 0);
342      k = (gpgme_key_t)SendDlgItemMessage (dlg, IDC_KEYSIGN_KEYLIST,      k = (gpgme_key_t)SendDlgItemMessage (dlg, IDC_KEYSIGN_KEYLIST,
343                                                   CB_GETITEMDATA, (WPARAM)idx, 0);                                                   CB_GETITEMDATA, (WPARAM)idx, 0);
344      if (k != NULL)      if (k != NULL)
345          ke.setLocalUser (k);          ke.setLocalUser (k);
346    
347      err = ke.signKey (type, sig_class, expires? keymsg : "0");      err = ke.signKey (type, sig_class, expires? keymsg : "0");    
348      sfree_if_alloc (pwd);      release_gpg_passphrase_cb (&cb);
349      if (err) {      if (err) {
350          msg_box (dlg, gpgme_strerror (err), _("Key Signing"), MB_ERR);          msg_box (dlg, gpgme_strerror (err), _("Key Signing"), MB_ERR);
351          return TRUE;              return TRUE;    
352      }      }
353      else if (ke.getResult () != 0)      else if (ke.getResult () != 0) {
354          msg_box (dlg, _("This key is already signed by your key"),          show_balloon_msg (klist, _("This key is already signed by your key"),
355                      _("Key Signing"), MB_INFO);                              IDI_INFORMATION);
356            return TRUE;
357        }
358      else {      else {
359          status_box (dlg, _("Key successfully signed."), _("Key Signing"));          status_box (dlg, _("Key successfully signed."), _("Key Signing"));
360          key->update = 1;                  key->update = 1;        
# Line 395  BOOL CALLBACK Line 369  BOOL CALLBACK
369  keysign_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)  keysign_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
370  {  {
371      static winpt_key_t key;      static winpt_key_t key;
372        char buf[MAX_PATH+128+1];
373      const char *s;      const char *s;
374            
375      switch (msg)  {      switch (msg)  {
# Line 404  keysign_dlg_proc (HWND dlg, UINT msg, WP Line 379  keysign_dlg_proc (HWND dlg, UINT msg, WP
379              BUG (0);                      BUG (0);        
380          s = key->ctx->subkeys->keyid;          s = key->ctx->subkeys->keyid;
381          if (do_fill_seckeylist (dlg, s)) {          if (do_fill_seckeylist (dlg, s)) {
382              msg_box (dlg, _("No valid secret key found."), _("Key Signing"), MB_ERR);              msg_box (dlg, _("No valid secret key found."),
383                         _("Key Signing"), MB_ERR);
384              EndDialog (dlg, FALSE);              EndDialog (dlg, FALSE);
385              return TRUE;              return TRUE;
386          }          }      
         do_check_protection (dlg);  
387          display_keyinfo (dlg, key);          display_keyinfo (dlg, key);
388          SetDlgItemText (dlg, IDC_KEYSIGN_LOCAL, _("Sign local only (non exportable signature)"));          SetDlgItemText (dlg, IDC_KEYSIGN_LOCAL, _("Sign local only (non exportable signature)"));
389          SetDlgItemText (dlg, IDC_KEYSIGN_EXPSIG, _("Signature expires on"));          SetDlgItemText (dlg, IDC_KEYSIGN_EXPSIG, _("Signature expires on"));
390          SetDlgItemText (dlg, IDC_KEYSIGN_NREV, _("Sign non-revocably"));          SetDlgItemText (dlg, IDC_KEYSIGN_NREV, _("Sign non-revocably"));
391          SetDlgItemText (dlg, IDC_KEYSIGN_ASKLEVEL, _("&Ask for certification level"));          SetDlgItemText (dlg, IDC_KEYSIGN_ASKLEVEL, _("&Ask for certification level"));
392          SetDlgItemText (dlg, IDC_KEYSIGN_PWDINF, _("Passphrase"));          SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));  
393          SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));          SetDlgItemText (dlg, IDC_KEYSIGN_CONFIRMSIGN, _("Are you really sure that you want to sign this key with YOUR key?"));
         SetDlgItemText (dlg, IDC_KEYSIGN_SHOWIMG, _("&Show photo"));  
         SetDlgItemText (dlg, IDC_KEYSIGN_HIDE, _("&Hide Typing"));  
394          SetWindowText (dlg, _("Key Signing"));          SetWindowText (dlg, _("Key Signing"));
395          CheckDlgButton (dlg, IDC_KEYSIGN_LOCAL, BST_CHECKED);          CheckDlgButton (dlg, IDC_KEYSIGN_LOCAL, BST_CHECKED);
396          CheckDlgButton (dlg, IDC_KEYSIGN_EXPSIG, BST_UNCHECKED);          CheckDlgButton (dlg, IDC_KEYSIGN_EXPSIG, BST_UNCHECKED);
# Line 425  keysign_dlg_proc (HWND dlg, UINT msg, WP Line 398  keysign_dlg_proc (HWND dlg, UINT msg, WP
398          EnableWindow (GetDlgItem (dlg, IDC_KEYSIGN_EXPIRES), FALSE);          EnableWindow (GetDlgItem (dlg, IDC_KEYSIGN_EXPIRES), FALSE);
399          if (reg_prefs.expert == 0)          if (reg_prefs.expert == 0)
400              ShowWindow (GetDlgItem (dlg, IDC_KEYSIGN_NREV), SW_HIDE);              ShowWindow (GetDlgItem (dlg, IDC_KEYSIGN_NREV), SW_HIDE);
         if (key->ext && key->ext->attrib.len == 0)  
             ShowWindow (GetDlgItem (dlg, IDC_KEYSIGN_SHOWIMG), SW_HIDE);  
401          if (!reg_prefs.gpg.ask_cert_level)          if (!reg_prefs.gpg.ask_cert_level)
402              EnableWindow (GetDlgItem (dlg, IDC_KEYSIGN_ASKLEVEL), FALSE);              EnableWindow (GetDlgItem (dlg, IDC_KEYSIGN_ASKLEVEL), FALSE);
403          if (!reg_prefs.gpg.ask_cert_expire)          if (!reg_prefs.gpg.ask_cert_expire)
404              EnableWindow (GetDlgItem (dlg, IDC_KEYSIGN_EXPSIG), FALSE);              EnableWindow (GetDlgItem (dlg, IDC_KEYSIGN_EXPSIG), FALSE);
405            if (key->ext && key->ext->attrib.len > 0)
406                key_load_photo (key, buf, DIM(buf)-1, NULL);
407          CheckDlgButton (dlg, IDC_KEYSIGN_HIDE, BST_CHECKED);          CheckDlgButton (dlg, IDC_KEYSIGN_HIDE, BST_CHECKED);
408          SetForegroundWindow (dlg);          SetForegroundWindow (dlg);
409          SetFocus (GetDlgItem (dlg, IDC_KEYSIGN_PASSPHRASE));          SetFocus (GetDlgItem (dlg, IDOK));
410          return FALSE;          return FALSE;
411                    
412      case WM_COMMAND:      case WM_DESTROY:
413          if (HIWORD (wparam) == CBN_SELCHANGE) {          balloon_msg_disable ();
414              do_check_protection (dlg);          if (key->ext && key->ext->attrib.len > 0) {
415              break;              get_photo_tmpname (key->ctx, buf, DIM(buf)-1);
416                DeleteFile (buf);
417          }          }
418          if (HIWORD (wparam) == BN_CLICKED &&          break;
             LOWORD (wparam) == IDC_KEYSIGN_EXPSIG) {  
             int enable = IsDlgButtonChecked (dlg, IDC_KEYSIGN_EXPSIG);  
419    
420              EnableWindow (GetDlgItem (dlg, IDC_KEYSIGN_EXPIRES), enable? TRUE : FALSE);      case WM_PAINT:
421            if (key->ext != NULL && key->ext->attrib.len > 0) {
422                POINT p;
423                p.x = p.y = 0;
424                get_photo_tmpname (key->ctx, buf, DIM (buf)-1);
425                if (jpg_show (GetDlgItem (dlg, IDC_SHOWPHOTO_IMG), &p, buf))
426                    EndDialog (dlg, TRUE);
427          }          }
428            break;
429            
430        case WM_COMMAND:
431          if (HIWORD (wparam) == BN_CLICKED &&          if (HIWORD (wparam) == BN_CLICKED &&
432              LOWORD (wparam) == IDC_KEYSIGN_HIDE) {              LOWORD (wparam) == IDC_KEYSIGN_EXPSIG) {
433              HWND hwnd = GetDlgItem (dlg, IDC_KEYSIGN_PASSPHRASE);              int enable = IsDlgButtonChecked (dlg, IDC_KEYSIGN_EXPSIG);
434              int hide = IsDlgButtonChecked (dlg, IDC_KEYSIGN_HIDE);              EnableWindow (GetDlgItem (dlg, IDC_KEYSIGN_EXPIRES),
435                              enable? TRUE : FALSE);
             SendMessage (hwnd, EM_SETPASSWORDCHAR, hide? '*' : 0, 0);  
             SetFocus (hwnd);  
436          }          }
437    
438          switch (LOWORD (wparam)) {          switch (LOWORD (wparam)) {
439          case IDOK:          case IDOK:
440                balloon_msg_disable ();
441              return on_click_ok (dlg, key);              return on_click_ok (dlg, key);
442                            
443          case IDCANCEL:          case IDCANCEL:
444              EndDialog (dlg, FALSE);              EndDialog (dlg, FALSE);
445              return TRUE;              return TRUE;
   
         case IDC_KEYSIGN_SHOWIMG:  
             DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_SHOWPHOTO,  
                             dlg, showphoto_dlg_proc, (LPARAM)key);  
             return TRUE;  
446          }          }
447          break;          break;
448      }      }

Legend:
Removed from v.278  
changed lines
  Added in v.328

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26