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

Annotation of /trunk/Src/wptPassphraseDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 181 - (hide annotations)
Tue Mar 14 11:01:22 2006 UTC (18 years, 11 months ago) by twoaday
File size: 5977 byte(s)
2006-03-12  Timo Schulz  <ts@g10code.de>
 
        * wptGPG.cpp (gnupg_load_config): Search for 'ask-cert-expire'.
        * wptKeyPropsDlg.cpp (display_key_info): Automatically update
        sym algorithm preferences if needed.
        * wptKeysignDlg.cpp (date_is_today): New.
        (keysign_dlg_proc): Only allow to set cert expire date if
        the option was found.
        * wptGPGPrefsDlg.cpp (gpgprefs_dlg_proc): Allow to set
        'ask-cert-expire'.
         


1 werner 36 /* wptPassphraseDlg.cpp - Dialog to get the passphrase
2     * Copyright (C) 2001-2005 Timo Schulz
3     *
4     * This file is part of WinPT.
5     *
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
8     * the Free Software Foundation; either version 2 of the License, or
9     * (at your option) any later version.
10     *
11     * WinPT is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
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,
18     * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19     */
20     #ifdef HAVE_CONFIG_H
21     #include <config.h>
22     #endif
23    
24     #include <windows.h>
25    
26 werner 47 #include "resource.h"
27 werner 36 #include "wptGPG.h"
28     #include "wptCommonCtl.h"
29     #include "wptContext.h"
30     #include "wptDlgs.h"
31     #include "wptNLS.h"
32     #include "wptW32API.h"
33     #include "wptUTF8.h"
34     #include "wptVersion.h"
35     #include "wptTypes.h"
36    
37    
38     struct passphrase_s {
39     char *title; /* title of the dialog. */
40     char pwd[256]; /* the actual passphrase. */
41     int strict; /* do a simple check how good the passphrase is. */
42     int repeat; /* Indicate last try was wrong. */
43     int cancel; /* 1 if user cancelled operation. */
44 twoaday 181 int not_empty;
45 werner 36 };
46    
47    
48     /* Dialog procedure to request a passphrase from the user. */
49     static BOOL CALLBACK
50     passwd_dlg_proc (HWND dlg, UINT msg, WPARAM wparam, LPARAM lparam)
51     {
52 twoaday 181 static passphrase_s *pwd;
53 werner 36 int nbytes;
54    
55     switch (msg) {
56     case WM_INITDIALOG:
57     pwd = (passphrase_s *)lparam;
58     if (pwd == NULL)
59     dlg_fatal_error (dlg, "Could not get dialog param!");
60     SetWindowText (dlg, _("Passphrase Dialog"));
61     CheckDlgButton (dlg, IDC_PASSWD_HIDE, BST_CHECKED);
62     if (pwd->title)
63     SetWindowText (dlg, pwd->title);
64     if (pwd->repeat)
65     SetDlgItemText (dlg, IDC_PASSWD_INFO, _("Repeat Passphrase"));
66     else
67     SetDlgItemText (dlg, IDC_PASSWD_INFO, _("Enter Passphrase"));
68 twoaday 78 SetDlgItemText (dlg, IDC_PASSWD_HIDE, _("&Hide Typing"));
69 twoaday 101 SetDlgItemText (dlg, IDCANCEL, _("&Cancel"));
70 werner 36 SetFocus (GetDlgItem (dlg, IDC_PASSWD_PWD ));
71     center_window2 (dlg, NULL, HWND_TOPMOST);
72     center_window (dlg, NULL);
73     SetForegroundWindow (dlg);
74     return FALSE;
75 twoaday 181
76     case WM_ACTIVATE:
77     safe_edit_control_init (dlg, IDC_PASSWD_PWD);
78     break;
79    
80     case WM_DESTROY:
81     safe_edit_control_free (dlg, IDC_PASSWD_PWD);
82     break;
83 werner 36
84     case WM_COMMAND:
85     if (HIWORD (wparam) == BN_CLICKED &&
86     LOWORD (wparam) == IDC_PASSWD_HIDE) {
87     HWND hwnd = GetDlgItem (dlg, IDC_PASSWD_PWD);
88     int hide = IsDlgButtonChecked (dlg, IDC_PASSWD_HIDE);
89     SendMessage (hwnd, EM_SETPASSWORDCHAR, hide? '*' : 0, 0);
90     SetFocus (hwnd);
91     }
92    
93     switch (LOWORD (wparam)) {
94     case IDOK:
95     pwd->cancel = 0;
96 twoaday 181 nbytes = SafeGetDlgItemText (dlg, IDC_PASSWD_PWD,
97     pwd->pwd, DIM (pwd->pwd)-1);
98     if (!nbytes && pwd->not_empty) {
99     msg_box (dlg, _("Please enter a passphrase."), _("Passphrase Dialog"), MB_ERR);
100     return TRUE;
101     }
102    
103 werner 36 if (!nbytes)
104     strcpy (pwd->pwd, "");
105     else if (pwd->strict && check_passwd_quality (pwd->pwd, 0)) {
106     int id = msg_box (dlg, _("Your passphrase should be at least 8 characters"
107     " long\nand should contain non-alphabetic characters."
108     "\n\nStill proceed?"),
109     _("Key Generation"), MB_ICONWARNING|MB_YESNO);
110     if (id == IDNO)
111     return TRUE;
112     }
113     SetDlgItemText (dlg, IDC_PASSWD_PWD, "");
114     EndDialog (dlg, TRUE);
115     return TRUE;
116    
117     case IDCANCEL:
118     pwd->cancel = 1;
119     EndDialog (dlg, FALSE);
120     return TRUE;
121     }
122     break;
123     }
124    
125     return FALSE;
126     }
127    
128    
129     /* Request a passphrase from the user. @title is the title of the
130     dialog and @ret_cancel is true if user cancelled the operation.
131     Return value: the passphrase or NUL for an error. */
132     char*
133     request_passphrase (const char *title, int flags, int *ret_cancel)
134     {
135     passphrase_s pass;
136     char *p;
137    
138 twoaday 170 *ret_cancel = 0; /* reset */
139 werner 36 memset (&pass, 0, sizeof (pass));
140     if (title && *title) {
141     pass.title = m_strdup (title);
142     if (!pass.title)
143     BUG (0);
144     }
145     pass.repeat = flags & PASSDLG_INIT? 0 : 1;
146     pass.strict = flags & PASSDLG_STRICT? 1 : 0;
147 twoaday 181 pass.not_empty = flags & PASSDLG_NOTEMPTY? 1: 0;
148 werner 36 DialogBoxParam (glob_hinst, (LPCTSTR)IDD_WINPT_PASSWD, glob_hwnd,
149     passwd_dlg_proc, (LPARAM)&pass);
150     if (pass.cancel == 1) {
151     *ret_cancel = 1;
152     return NULL;
153     }
154     p = m_strdup (pass.pwd);
155     if (!p)
156     BUG (0);
157     free_if_alloc (pass.title);
158     memset (&pass, 0, sizeof (pass));
159     return p;
160     }
161    
162    
163     /* Request a passphrase from the user but also confirm the passphrase
164     to make sure there is no typo. Arguments same as in the normal version
165     of the function. */
166     char*
167     request_passphrase2 (const char *title, int flags, int *ret_cancel)
168     {
169     char *pass1, *pass2;
170     int equal = 0, cancel = 0;
171    
172     *ret_cancel = 1;
173     while (!equal) {
174     pass1 = request_passphrase (title, PASSDLG_INIT|flags, &cancel);
175     if (cancel)
176     return NULL;
177     pass2 = request_passphrase (title, PASSDLG_REPEAT, &cancel);
178     if (cancel) {
179     sfree_if_alloc (pass1);
180     return NULL;
181     }
182    
183     if (strcmp (pass1, pass2)) {
184     msg_box (NULL, _("Passphrases do not match. Please try again."),
185     title, MB_INFO);
186     sfree_if_alloc (pass1);
187     sfree_if_alloc (pass2);
188     }
189     else {
190     if (is_8bit_string (pass1)) {
191     msg_box (NULL, _("The passphrase contains 8-bit characters.\n"
192     "It is not suggested to use charset specific characters."),
193     title, MB_ERR);
194     equal = 0;
195     sfree_if_alloc (pass1);
196     sfree_if_alloc (pass2);
197     }
198     else
199     equal = 1;
200     }
201     }
202     sfree_if_alloc (pass2);
203     *ret_cancel = 0;
204     return pass1;
205     }

Properties

Name Value
svn:eol-style native

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26