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

Diff of /trunk/Src/wptPassphraseCB.cpp

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

revision 27 by twoaday, Tue Oct 18 07:57:13 2005 UTC revision 34 by twoaday, Wed Oct 26 11:20:09 2005 UTC
# Line 50  const char* get_symkey_algo (int algo); Line 50  const char* get_symkey_algo (int algo);
50  static void  static void
51  burn_passphrase (char **pwd)  burn_passphrase (char **pwd)
52  {  {
53      char *pass = *pwd;        char *pass = *pwd;
54      memset (pass, 0, strlen (pass));      wipememory (pass, strlen (pass));
55      delete []pass;      delete []pass;
56      *pwd = NULL;      *pwd = NULL;
57  }  }
# Line 65  passphrase_callback_proc (HWND dlg, UINT Line 65  passphrase_callback_proc (HWND dlg, UINT
65      gpgme_decrypt_result_t res;      gpgme_decrypt_result_t res;
66      gpgme_sign_result_t res_sig;      gpgme_sign_result_t res_sig;
67      gpgme_key_t key;      gpgme_key_t key;
68        gpgme_recipient_t recip, r;
69      void *ctx = NULL, *item;      void *ctx = NULL, *item;
70      const char *id;      const char *id;
71      char *info;      char *info;
72      int n;      int n;
73    
     /* XXX: we need a timer to update the 'enc_to' entries. */  
74      switch (msg) {      switch (msg) {
75      case WM_INITDIALOG:      case WM_INITDIALOG:
76          c = (passphrase_cb_s *)lparam;          c = (passphrase_cb_s *)lparam;
# Line 78  passphrase_callback_proc (HWND dlg, UINT Line 78  passphrase_callback_proc (HWND dlg, UINT
78              BUG (0);              BUG (0);
79          SetWindowText (dlg, c->title);          SetWindowText (dlg, c->title);
80          if (c->gpg_cmd == GPG_CMD_DECRYPT) {          if (c->gpg_cmd == GPG_CMD_DECRYPT) {
81              SetDlgItemText( dlg, IDC_DECRYPT_LISTINF,              SetDlgItemText (dlg, IDC_DECRYPT_LISTINF,
82                  _("Encrypted with the following public key(s)") );                              _("Encrypted with the following public key(s)"));
83              CheckDlgButton( dlg, IDC_DECRYPT_HIDE, BST_CHECKED );              CheckDlgButton (dlg, IDC_DECRYPT_HIDE, BST_CHECKED);
84          }          }
85          else if (c->gpg_cmd == GPG_CMD_SIGN)          else if (c->gpg_cmd == GPG_CMD_SIGN)
86              CheckDlgButton (dlg, IDC_DECRYPT_SIGN_HIDE, BST_CHECKED);              CheckDlgButton (dlg, IDC_DECRYPT_SIGN_HIDE, BST_CHECKED);
87          res = gpgme_op_decrypt_result (c->gpg);          if (c->recipients)
88          if (res != NULL && c->gpg_cmd == GPG_CMD_DECRYPT) {              recip = c->recipients; /* recipients were already extracted. */
89              gpgme_recipient_t r;          else {
   
90              /* XXX: not all ENCRYPT_TO entries are listed here. */              /* XXX: not all ENCRYPT_TO entries are listed here. */
91                res = gpgme_op_decrypt_result (c->gpg);
92                if (res && res->recipients)
93                    recip = res->recipients;
94            }
95            if (recip != NULL && c->gpg_cmd == GPG_CMD_DECRYPT) {
96              for (r = res->recipients; r; r = r->next) {              for (r = res->recipients; r; r = r->next) {
97                  get_pubkey (r->keyid, &key);                  get_pubkey (r->keyid, &key);
98                  if (key) {                  if (key) {
# Line 150  passphrase_callback_proc (HWND dlg, UINT Line 154  passphrase_callback_proc (HWND dlg, UINT
154    
155          case WM_SYSCOMMAND:          case WM_SYSCOMMAND:
156              if (LOWORD (wparam) == SC_CLOSE) {              if (LOWORD (wparam) == SC_CLOSE) {
157                  SetDlgItemText (dlg, item_ctrl_id( c->gpg_cmd ), "");                  SetDlgItemText (dlg, item_ctrl_id (c->gpg_cmd), "");
158                  c->cancel = 1;                  c->cancel = 1;
159                  EndDialog (dlg, TRUE);                  EndDialog (dlg, TRUE);
160              }              }
161              break;              break;
162    
163          case WM_COMMAND:          case WM_COMMAND:
164              switch( HIWORD( wparam ) ) {              switch (HIWORD (wparam)) {
165              case BN_CLICKED:              case BN_CLICKED:
166                  if ( LOWORD( wparam ) == IDC_DECRYPT_HIDE                  if  (LOWORD (wparam) == IDC_DECRYPT_HIDE
167                      || LOWORD( wparam ) == IDC_DECRYPT_SIGN_HIDE ) {                      || LOWORD (wparam) == IDC_DECRYPT_SIGN_HIDE) {
168                      HWND hwnd;                      HWND hwnd;
169                      int hide = IsDlgButtonChecked (dlg, item_ctrl_id2 (c->gpg_cmd));                      int hide = IsDlgButtonChecked (dlg, item_ctrl_id2 (c->gpg_cmd));
170                      hwnd = GetDlgItem (dlg, item_ctrl_id (c->gpg_cmd));                      hwnd = GetDlgItem (dlg, item_ctrl_id (c->gpg_cmd));
# Line 171  passphrase_callback_proc (HWND dlg, UINT Line 175  passphrase_callback_proc (HWND dlg, UINT
175    
176              switch (LOWORD (wparam)) {              switch (LOWORD (wparam)) {
177              case IDOK:                case IDOK:  
178                  /* fixme: the item is even cached when the passphrase is not                  /* XXX: the item is even cached when the passphrase is not
179                            correct, which means that the user needs to delete all                          correct, which means that the user needs to delete all
180                            cached entries to continue. */                          cached entries to continue. */
181                  if (c->pwd)                  if (c->pwd)
182                      burn_passphrase (&c->pwd);                      burn_passphrase (&c->pwd);
183                  n = item_get_text_length (dlg, item_ctrl_id (c->gpg_cmd));                  n = item_get_text_length (dlg, item_ctrl_id (c->gpg_cmd));
# Line 199  passphrase_callback_proc (HWND dlg, UINT Line 203  passphrase_callback_proc (HWND dlg, UINT
203                      else                      else
204                          agent_put_cache (c->keyid, c->pwd, reg_prefs.cache_time);                          agent_put_cache (c->keyid, c->pwd, reg_prefs.cache_time);
205                  }                  }
206                    c->cancel = 0;
207                  EndDialog (dlg, TRUE);                  EndDialog (dlg, TRUE);
208                  return TRUE;                  return TRUE;
209                                    
210              case IDCANCEL:              case IDCANCEL:
211                  SetDlgItemText (dlg, item_ctrl_id (c->gpg_cmd), "" );                  SetDlgItemText (dlg, item_ctrl_id (c->gpg_cmd), "");
212                  c->cancel = 1;                  c->cancel = 1;
213                  EndDialog (dlg, FALSE);                  EndDialog (dlg, FALSE);
214                  return FALSE;                  return FALSE;
# Line 241  parse_gpg_description (const char *uid_h Line 246  parse_gpg_description (const char *uid_h
246                         char *desc, int size)                         char *desc, int size)
247  {  {
248      gpgme_pubkey_algo_t algo;      gpgme_pubkey_algo_t algo;
249      char usedkey[16+1], mainkey[16+1];      char usedkey[16+1];
250        char mainkey[16+1];
251      char *uid, *p;      char *uid, *p;
252      int n=0;      int n=0;
253    
254        /* Each uid_hint contains a long key-ID so it is at least 16 bytes. */
255      if (strlen (uid_hint) < 17) {      if (strlen (uid_hint) < 17) {
256          *desc = 0;          *desc = 0;
257          return -1;          return -1;
# Line 279  parse_gpg_description (const char *uid_h Line 286  parse_gpg_description (const char *uid_h
286  }  }
287    
288    
289  /*  /* Extract the serial number from the card ID @id and return it. */
290  static int inline  const char*
291  is_hexstring (const char * p)  extract_serial_no (const char *id)
292  {  {
293      size_t i;      static char buf[8];
294        char *p;
295    
296      for (i=0; i < strlen (p); i++) {      p = strchr (id, '/');
297          if (!isxdigit (p[i]))      if (!p)
298              return -1;          return NULL;
299      }      strncpy (buf, id+(p-id)-6, 6);
300      return 0;      return buf;
301  }  }
302  */  
303    
304  /* Passphrase callback with the ability to support caching. */  /* Passphrase callback with the ability to support caching. */
305  gpgme_error_t  gpgme_error_t
# Line 318  passphrase_cb (void *hook, const char *u Line 326  passphrase_cb (void *hook, const char *u
326    
327      if (passphrase_info) {      if (passphrase_info) {
328          if (strlen (passphrase_info) < 16 &&          if (strlen (passphrase_info) < 16 &&
329              !strstr (passphrase_info, "OPENPGP")) {/* assume symetric encryption. */              !strstr (passphrase_info, "OPENPGP")) {
330                /* assume symetric encryption. */
331              int n=2;              int n=2;
332              c->sym.sym_algo = atoi (passphrase_info);              c->sym.sym_algo = atoi (passphrase_info);
333              if (c->sym.sym_algo > 9)              if (c->sym.sym_algo > 9)
# Line 348  passphrase_cb (void *hook, const char *u Line 357  passphrase_cb (void *hook, const char *u
357          /* if @passphrase_info contains 'OPENPGP' we assume a smart card          /* if @passphrase_info contains 'OPENPGP' we assume a smart card
358              has been used. */              has been used. */
359          if (strstr (passphrase_info, "OPENPGP")) {          if (strstr (passphrase_info, "OPENPGP")) {
360              char buf[16];              const char *s=passphrase_info;
361              memset (buf, 0, sizeof buf);              while (s && *s && *s != 'D')
362              strncpy (buf, "??", 2); /* XXX: fixme we need the serial no. */                  s++;
363              _snprintf (c->info, sizeof c->info-1,              _snprintf (c->info, sizeof c->info-1,
364                         _("Please enter the PIN to unlock your secret card key\n"                         _("Please enter the PIN to unlock your secret card key\n"
365                           "Card: %s"), buf);                           "Card: %s"), extract_serial_no (s));
366              c->is_card = 1;              c->is_card = 1;
367          }          }
368          else if (uid_hint)          else if (uid_hint)
# Line 370  passphrase_cb (void *hook, const char *u Line 379  passphrase_cb (void *hook, const char *u
379                                   (LPARAM)c);                                   (LPARAM)c);
380          }          }
381          if (rc == -1) {          if (rc == -1) {
382              WriteFile (hd, "\n", 1, &n, NULL);              if (!WriteFile (hd, "\n", 1, &n, NULL))
383                    log_debug ("passphrase_cb: WriteFile() failed ec=%d\n", w32_errno);
384              return 0;              return 0;
385          }          }
386          c->pwd_init = 0;          c->pwd_init = 0;
387      }      }
388      if (c->cancel) {      if (c->cancel) {
389          WriteFile (hd, "\n", 1, &n, NULL);          if (!WriteFile (hd, "\n", 1, &n, NULL))
390                log_debug ("passphrase_cb: WriteFile() failed ec=%d\n", w32_errno);
391          return 0;          return 0;
392      }      }
393    
# Line 413  set_gpg_passphrase_cb (passphrase_cb_s * Line 424  set_gpg_passphrase_cb (passphrase_cb_s *
424  void  void
425  release_gpg_passphrase_cb (passphrase_cb_s *ctx)  release_gpg_passphrase_cb (passphrase_cb_s *ctx)
426  {  {
427        gpgme_recipient_t r, n;
428    
429      if (!ctx)      if (!ctx)
430          return;          return;
431      sfree_if_alloc (ctx->pwd);      sfree_if_alloc (ctx->pwd);
432      free_if_alloc (ctx->title);      free_if_alloc (ctx->title);
433        r = ctx->recipients;
434        while (r) {
435            n = r->next;
436            safe_free (r->keyid);
437            safe_free (r);
438            r = n;
439        }
440  }  }
441    
442    
# Line 432  check_passwd_quality (const char *pass, Line 452  check_passwd_quality (const char *pass,
452          return -1;          return -1;
453    
454      for (i=0; i < n; i++) {      for (i=0; i < n; i++) {
455          if (isdigit (pass[i])) nd++;          if (isdigit (pass[i]))
456          if (isalpha (pass[i])) nc++;              nd++;
457            if (isalpha (pass[i]))
458                nc++;
459      }      }
460    
461        /* check that the passphrase contains letters and numbers. */
462      if (nd == n || nc == n)      if (nd == n || nc == n)
463          return -1;          return -1;
464    

Legend:
Removed from v.27  
changed lines
  Added in v.34

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26