Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /branches/ssh_chacha20poly1305/ttssh2/ttxssh/auth.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3183 - (hide annotations) (download) (as text)
Wed Dec 3 16:13:27 2008 UTC (15 years, 4 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 51605 byte(s)
SSH Authentication ダイアログにエージェント転送のチェックボックスを追加した

1 yutakakn 2728 /*
2     Copyright (c) 1998-2001, Robert O'Callahan
3     All rights reserved.
4    
5     Redistribution and use in source and binary forms, with or without modification,
6     are permitted provided that the following conditions are met:
7    
8     Redistributions of source code must retain the above copyright notice, this list of
9     conditions and the following disclaimer.
10    
11     Redistributions in binary form must reproduce the above copyright notice, this list
12     of conditions and the following disclaimer in the documentation and/or other materials
13     provided with the distribution.
14    
15     The name of Robert O'Callahan may not be used to endorse or promote products derived from
16     this software without specific prior written permission.
17    
18     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
19     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20     OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21     THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22     EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26     SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27     */
28    
29     #include "ttxssh.h"
30     #include "util.h"
31 yutakakn 2800 #include "ssh.h"
32 yutakakn 2728
33     #include <io.h>
34     #include <fcntl.h>
35     #include <stdlib.h>
36     #include <errno.h>
37    
38     #include "resource.h"
39     #include "keyfiles.h"
40 maya 3108 #include "libputty.h"
41 yutakakn 2728
42     #define AUTH_START_USER_AUTH_ON_ERROR_END 1
43    
44 maya 3108 #define MAX_AUTH_CONTROL IDC_SSHUSEPAGEANT
45 yutakakn 2728
46 maya 2943 static HFONT DlgAuthFont;
47     static HFONT DlgTisFont;
48     static HFONT DlgAuthSetupFont;
49    
50 yutakakn 2890 void destroy_malloced_string(char FAR * FAR * str)
51 yutakakn 2728 {
52     if (*str != NULL) {
53     memset(*str, 0, strlen(*str));
54     free(*str);
55     *str = NULL;
56     }
57     }
58    
59     static int auth_types_to_control_IDs[] = {
60     -1, IDC_SSHUSERHOSTS, IDC_SSHUSERSA, IDC_SSHUSEPASSWORD,
61 maya 3108 IDC_SSHUSERHOSTS, IDC_SSHUSETIS, -1,
62     -1, -1, -1, -1, -1, -1, -1, -1, -1, IDC_SSHUSEPAGEANT, -1
63 yutakakn 2728 };
64    
65     static LRESULT CALLBACK password_wnd_proc(HWND control, UINT msg,
66 maya 3003 WPARAM wParam, LPARAM lParam)
67 yutakakn 2728 {
68     switch (msg) {
69     case WM_CHAR:
70     if ((GetKeyState(VK_CONTROL) & 0x8000) != 0) {
71     char chars[] = { (char) wParam, 0 };
72    
73     SendMessage(control, EM_REPLACESEL, (WPARAM) TRUE,
74 maya 3003 (LPARAM) (char FAR *) chars);
75 yutakakn 2728 return 0;
76     }
77     }
78    
79     return CallWindowProc((WNDPROC) GetWindowLong(control, GWL_USERDATA),
80 maya 3003 control, msg, wParam, lParam);
81 yutakakn 2728 }
82    
83     static void init_password_control(HWND dlg)
84     {
85     HWND passwordControl = GetDlgItem(dlg, IDC_SSHPASSWORD);
86    
87     SetWindowLong(passwordControl, GWL_USERDATA,
88 maya 3003 SetWindowLong(passwordControl, GWL_WNDPROC,
89     (LONG) password_wnd_proc));
90 yutakakn 2728
91     SetFocus(passwordControl);
92     }
93    
94     static void set_auth_options_status(HWND dlg, int controlID)
95     {
96     BOOL RSA_enabled = controlID == IDC_SSHUSERSA;
97     BOOL rhosts_enabled = controlID == IDC_SSHUSERHOSTS;
98     BOOL TIS_enabled = controlID == IDC_SSHUSETIS;
99 maya 3108 BOOL PAGEANT_enabled = controlID == IDC_SSHUSEPAGEANT;
100 yutakakn 2728 int i;
101    
102     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, controlID);
103    
104 maya 3108 EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORDCAPTION), (!TIS_enabled && !PAGEANT_enabled));
105     EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORD), (!TIS_enabled && !PAGEANT_enabled));
106 yutakakn 2728
107     for (i = IDC_CHOOSERSAFILE; i <= IDC_RSAFILENAME; i++) {
108     EnableWindow(GetDlgItem(dlg, i), RSA_enabled);
109     }
110    
111     for (i = IDC_LOCALUSERNAMELABEL; i <= IDC_HOSTRSAFILENAME; i++) {
112     EnableWindow(GetDlgItem(dlg, i), rhosts_enabled);
113     }
114     }
115    
116     static void init_auth_machine_banner(PTInstVar pvar, HWND dlg)
117     {
118 maya 2994 char buf[1024], buf2[1024];
119    
120 maya 2937 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, buf2, sizeof(buf2));
121 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE, buf2, SSH_get_host_name(pvar));
122 yutakakn 2728 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, buf);
123     }
124    
125     static void update_server_supported_types(PTInstVar pvar, HWND dlg)
126     {
127     int supported_methods = pvar->auth_state.supported_types;
128     int cur_control = -1;
129     int control;
130     HWND focus = GetFocus();
131    
132     if (supported_methods == 0) {
133     return;
134     }
135    
136     for (control = IDC_SSHUSEPASSWORD; control <= MAX_AUTH_CONTROL;
137 maya 3003 control++) {
138 yutakakn 2728 BOOL enabled = FALSE;
139     int method;
140     HWND item = GetDlgItem(dlg, control);
141    
142     if (item != NULL) {
143     for (method = 0; method <= SSH_AUTH_MAX; method++) {
144     if (auth_types_to_control_IDs[method] == control
145 maya 3003 && (supported_methods & (1 << method)) != 0) {
146     enabled = TRUE;
147 yutakakn 2728 }
148     }
149    
150     EnableWindow(item, enabled);
151    
152     if (IsDlgButtonChecked(dlg, control)) {
153     cur_control = control;
154     }
155     }
156     }
157    
158     if (cur_control >= 0) {
159     if (!IsWindowEnabled(GetDlgItem(dlg, cur_control))) {
160     do {
161     cur_control++;
162     if (cur_control > MAX_AUTH_CONTROL) {
163     cur_control = IDC_SSHUSEPASSWORD;
164     }
165     } while (!IsWindowEnabled(GetDlgItem(dlg, cur_control)));
166    
167     set_auth_options_status(dlg, cur_control);
168    
169     if (focus != NULL && !IsWindowEnabled(focus)) {
170     SetFocus(GetDlgItem(dlg, cur_control));
171     }
172     }
173     }
174     }
175    
176     static void init_auth_dlg(PTInstVar pvar, HWND dlg)
177     {
178     int default_method = pvar->session_settings.DefaultAuthMethod;
179 maya 2994 char uimsg[MAX_UIMSG];
180 yutakakn 2728
181 maya 2994 GetWindowText(dlg, uimsg, sizeof(uimsg));
182     UTIL_get_lang_msg("DLG_AUTH_TITLE", pvar, uimsg);
183 maya 2937 SetWindowText(dlg, pvar->ts->UIMsg);
184 maya 2994 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
185     UTIL_get_lang_msg("DLG_AUTH_BANNER", pvar, uimsg);
186 maya 2937 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
187 maya 2994 GetDlgItemText(dlg, IDC_SSHAUTHBANNER2, uimsg, sizeof(uimsg));
188     UTIL_get_lang_msg("DLG_AUTH_BANNER2", pvar, uimsg);
189 maya 2937 SetDlgItemText(dlg, IDC_SSHAUTHBANNER2, pvar->ts->UIMsg);
190 maya 2994 GetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, uimsg, sizeof(uimsg));
191     UTIL_get_lang_msg("DLG_AUTH_USERNAME", pvar, uimsg);
192 maya 2937 SetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, pvar->ts->UIMsg);
193 maya 2994 GetDlgItemText(dlg, IDC_SSHPASSWORDCAPTION, uimsg, sizeof(uimsg));
194     UTIL_get_lang_msg("DLG_AUTH_PASSWORD", pvar, uimsg);
195 maya 2937 SetDlgItemText(dlg, IDC_SSHPASSWORDCAPTION, pvar->ts->UIMsg);
196 maya 2994 GetDlgItemText(dlg, IDC_REMEMBER_PASSWORD, uimsg, sizeof(uimsg));
197     UTIL_get_lang_msg("DLG_AUTH_REMEMBER_PASSWORD", pvar, uimsg);
198 maya 2937 SetDlgItemText(dlg, IDC_REMEMBER_PASSWORD, pvar->ts->UIMsg);
199 maya 3183 GetDlgItemText(dlg, IDC_FORWARD_AGENT, uimsg, sizeof(uimsg));
200     UTIL_get_lang_msg("DLG_AUTH_FWDAGENT", pvar, uimsg);
201     SetDlgItemText(dlg, IDC_FORWARD_AGENT, pvar->ts->UIMsg);
202 maya 2994 GetDlgItemText(dlg, IDC_SSHUSEPASSWORD, uimsg, sizeof(uimsg));
203     UTIL_get_lang_msg("DLG_AUTH_METHOD_PASSWORD", pvar, uimsg);
204 maya 2937 SetDlgItemText(dlg, IDC_SSHUSEPASSWORD, pvar->ts->UIMsg);
205 maya 2994 GetDlgItemText(dlg, IDC_SSHUSERSA, uimsg, sizeof(uimsg));
206     UTIL_get_lang_msg("DLG_AUTH_METHOD_RSA", pvar, uimsg);
207 maya 2937 SetDlgItemText(dlg, IDC_SSHUSERSA, pvar->ts->UIMsg);
208 maya 2994 GetDlgItemText(dlg, IDC_SSHUSERHOSTS, uimsg, sizeof(uimsg));
209     UTIL_get_lang_msg("DLG_AUTH_METHOD_RHOST", pvar, uimsg);
210 maya 2937 SetDlgItemText(dlg, IDC_SSHUSERHOSTS, pvar->ts->UIMsg);
211 maya 3128 GetDlgItemText(dlg, IDC_SSHUSEPAGEANT, uimsg, sizeof(uimsg));
212     UTIL_get_lang_msg("DLG_AUTH_METHOD_PAGEANT", pvar, uimsg);
213     SetDlgItemText(dlg, IDC_SSHUSEPAGEANT, pvar->ts->UIMsg);
214 maya 2994 GetDlgItemText(dlg, IDC_CHOOSERSAFILE, uimsg, sizeof(uimsg));
215     UTIL_get_lang_msg("DLG_AUTH_PRIVATEKEY", pvar, uimsg);
216 maya 2937 SetDlgItemText(dlg, IDC_CHOOSERSAFILE, pvar->ts->UIMsg);
217 maya 2994 GetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, uimsg, sizeof(uimsg));
218     UTIL_get_lang_msg("DLG_AUTH_LOCALUSER", pvar, uimsg);
219 maya 2937 SetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, pvar->ts->UIMsg);
220 maya 2994 GetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, uimsg, sizeof(uimsg));
221     UTIL_get_lang_msg("DLG_AUTH_HOST_PRIVATEKEY", pvar, uimsg);
222 maya 2937 SetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, pvar->ts->UIMsg);
223 maya 2994 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
224     UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
225 maya 2937 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
226 maya 2994 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
227     UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
228 maya 2937 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
229    
230 yutakakn 2728 init_auth_machine_banner(pvar, dlg);
231     init_password_control(dlg);
232    
233     if (pvar->auth_state.failed_method != SSH_AUTH_NONE) {
234     /* must be retrying a failed attempt */
235 maya 2994 UTIL_get_lang_msg("DLG_AUTH_BANNER2_FAILED", pvar, "Authentication failed. Please retry.");
236     SetDlgItemText(dlg, IDC_SSHAUTHBANNER2, pvar->ts->UIMsg);
237     UTIL_get_lang_msg("DLG_AUTH_TITLE_FAILED", pvar, "Retrying SSH Authentication");
238 maya 2937 SetWindowText(dlg, pvar->ts->UIMsg);
239 yutakakn 2728 default_method = pvar->auth_state.failed_method;
240     }
241    
242     set_auth_options_status(dlg,
243 maya 3003 auth_types_to_control_IDs[default_method]);
244 yutakakn 2728
245     if (default_method == SSH_AUTH_TIS) {
246     /* we disabled the password control, so fix the focus */
247     SetFocus(GetDlgItem(dlg, IDC_SSHUSETIS));
248     }
249 maya 3113 else if (default_method == SSH_AUTH_PAGEANT) {
250     SetFocus(GetDlgItem(dlg, IDC_SSHUSEPAGEANT));
251     }
252 yutakakn 2728
253     if (pvar->auth_state.user != NULL) {
254     SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->auth_state.user);
255     EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
256     EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAMELABEL), FALSE);
257     } else if (pvar->session_settings.DefaultUserName[0] != 0) {
258     SetDlgItemText(dlg, IDC_SSHUSERNAME,
259 maya 3003 pvar->session_settings.DefaultUserName);
260 yutakakn 2728 }
261    
262     SetDlgItemText(dlg, IDC_RSAFILENAME,
263 maya 3003 pvar->session_settings.DefaultRSAPrivateKeyFile);
264 yutakakn 2728 SetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
265 maya 3003 pvar->session_settings.DefaultRhostsHostPrivateKeyFile);
266 yutakakn 2728 SetDlgItemText(dlg, IDC_LOCALUSERNAME,
267 maya 3003 pvar->session_settings.DefaultRhostsLocalUserName);
268 yutakakn 2728
269     update_server_supported_types(pvar, dlg);
270 yutakakn 2739
271 yutakakn 2784 // SSH2 autologin
272 yutakakn 2739 // ���[�U�A�p�X���[�h�A�F�����\�b�h���������������A������������OK�{�^�������������B
273 yutakakn 2784 //
274     // (2004.12.1 yutaka)
275     // (2005.1.26 yutaka) ���J���F���T�|�[�g
276 maya 2908 // �������O�C���������������A�������������������X���\ (2006.9.18 maya)
277     #if 0
278 yutakakn 2739 if (pvar->ssh2_autologin == 1) {
279 maya 2908 #endif
280     if (strlen(pvar->ssh2_username) > 0) {
281     SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->ssh2_username);
282     }
283     if (pvar->ssh2_autologin == 1) {
284     EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
285     EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAMELABEL), FALSE);
286     }
287 yutakakn 2739
288     SetDlgItemText(dlg, IDC_SSHPASSWORD, pvar->ssh2_password);
289 maya 2908 if (pvar->ssh2_autologin == 1) {
290     EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORD), FALSE);
291     EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORDCAPTION), FALSE);
292     }
293 yutakakn 2739
294 yutakakn 2844 // '/I' �w�������������������������� (2005.9.5 yutaka)
295     if (pvar->ts->Minimize) {
296     //20050822���� start T.Takahashi
297     ShowWindow(dlg,SW_MINIMIZE);
298     //20050822���� end T.Takahashi
299     }
300    
301 yutakakn 2784 if (pvar->ssh2_authmethod == SSH_AUTH_PASSWORD) {
302 yutakakn 2739 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, IDC_SSHUSEPASSWORD);
303 yutakakn 2784
304     } else if (pvar->ssh2_authmethod == SSH_AUTH_RSA) {
305     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, IDC_SSHUSERSA);
306    
307     SetDlgItemText(dlg, IDC_RSAFILENAME, pvar->ssh2_keyfile);
308 maya 2908 if (pvar->ssh2_autologin == 1) {
309     EnableWindow(GetDlgItem(dlg, IDC_CHOOSERSAFILE), FALSE);
310     EnableWindow(GetDlgItem(dlg, IDC_RSAFILENAME), FALSE);
311     }
312 yutakakn 2784
313 maya 3028 // /auth=challenge ������ (2007.10.5 maya)
314 maya 3025 } else if (pvar->ssh2_authmethod == SSH_AUTH_TIS) {
315     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, IDC_SSHUSETIS);
316     EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORD), FALSE);
317     SetDlgItemText(dlg, IDC_SSHPASSWORD, "");
318    
319 maya 3108 // /auth=pageant ������
320     } else if (pvar->ssh2_authmethod == SSH_AUTH_PAGEANT) {
321     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, IDC_SSHUSEPAGEANT);
322     EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORD), FALSE);
323     SetDlgItemText(dlg, IDC_SSHPASSWORD, "");
324    
325 yutakakn 2739 } else {
326     // TODO
327    
328     }
329 maya 3025
330 maya 3073 GetDlgItemText(dlg, IDC_SSHUSERNAME, uimsg, sizeof(uimsg));
331     if (uimsg[0] == 0) {
332     SetFocus(GetDlgItem(dlg, IDC_SSHUSERNAME));
333     }
334     else if (pvar->ask4passwd == 1) {
335 yasuhide 2963 SetFocus(GetDlgItem(dlg, IDC_SSHPASSWORD));
336     }
337 maya 2908 #if 0
338 yutakakn 2739 }
339 maya 2908 #endif
340 yutakakn 2739
341 yutakakn 2800 #if 1
342     if (pvar->settings.ssh_protocol_version == 1) {
343 maya 2994 UTIL_get_lang_msg("DLG_AUTH_METHOD_CHALLENGE1", pvar,
344 maya 3003 "Use challenge/response to log in(&TIS)");
345 maya 2937 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
346 yutakakn 2800 } else {
347 maya 2994 UTIL_get_lang_msg("DLG_AUTH_METHOD_CHALLENGE2", pvar,
348 maya 3003 "Use &challenge/response to log in(keyboard-interactive)");
349 maya 2937 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
350 yutakakn 2800 }
351     #endif
352    
353 yutakakn 2890 // �p�X���[�h���o���������`�F�b�N�{�b�N�X�����f�t�H���g���L�������� (2006.8.3 yutaka)
354 yutakakn 2891 if (pvar->ts_SSH->remember_password) {
355 yutakakn 2890 SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_SETCHECK, BST_CHECKED, 0);
356     } else {
357     SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_SETCHECK, BST_UNCHECKED, 0);
358     }
359    
360 maya 3183 // settings �������������������������� (2008.12.4 maya)
361     CheckDlgButton(dlg, IDC_FORWARD_AGENT, pvar->settings.ForwardAgent);
362 yutakakn 2728 }
363    
364     static char FAR *alloc_control_text(HWND ctl)
365     {
366     int len = GetWindowTextLength(ctl);
367     char FAR *result = malloc(len + 1);
368    
369     if (result != NULL) {
370     GetWindowText(ctl, result, len + 1);
371     result[len] = 0;
372     }
373    
374     return result;
375     }
376    
377 maya 2937 static int get_key_file_name(HWND parent, char FAR * buf, int bufsize, PTInstVar pvar)
378 yutakakn 2728 {
379     OPENFILENAME params;
380     char fullname_buf[2048] = "identity";
381 maya 2937 char filter[MAX_UIMSG];
382 yutakakn 2728
383 yutakakn 2762 ZeroMemory(&params, sizeof(params));
384 yutakakn 2728 params.lStructSize = sizeof(OPENFILENAME);
385     params.hwndOwner = parent;
386 yutakakn 2762 // �t�B���^������ (2004.12.19 yutaka)
387 yutakakn 2818 // 3�t�@�C���t�B���^������ (2005.4.26 yutaka)
388 maya 2994 UTIL_get_lang_msg("FILEDLG_OPEN_PRIVATEKEY_FILTER", pvar,
389 maya 3003 "identity files\\0identity;id_rsa;id_dsa\\0identity(RSA1)\\0identity\\0id_rsa(SSH2)\\0id_rsa\\0id_dsa(SSH2)\\0id_dsa\\0all(*.*)\\0*.*\\0\\0");
390 maya 2937 memcpy(filter, pvar->ts->UIMsg, sizeof(filter));
391     params.lpstrFilter = filter;
392 yutakakn 2728 params.lpstrCustomFilter = NULL;
393     params.nFilterIndex = 0;
394     buf[0] = 0;
395     params.lpstrFile = fullname_buf;
396     params.nMaxFile = sizeof(fullname_buf);
397     params.lpstrFileTitle = NULL;
398     params.lpstrInitialDir = NULL;
399 maya 2994 UTIL_get_lang_msg("FILEDLG_OPEN_PRIVATEKEY_TITLE", pvar,
400 maya 3003 "Choose a file with the RSA/DSA private key");
401 maya 2937 params.lpstrTitle = pvar->ts->UIMsg;
402 yutakakn 2728 params.Flags =
403     OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;
404     params.lpstrDefExt = NULL;
405    
406     if (GetOpenFileName(&params) != 0) {
407     copy_teraterm_dir_relative_path(buf, bufsize, fullname_buf);
408     return 1;
409     } else {
410     return 0;
411     }
412     }
413    
414 maya 2937 static void choose_RSA_key_file(HWND dlg, PTInstVar pvar)
415 yutakakn 2728 {
416     char buf[1024];
417    
418 maya 2937 if (get_key_file_name(dlg, buf, sizeof(buf), pvar)) {
419 yutakakn 2728 SetDlgItemText(dlg, IDC_RSAFILENAME, buf);
420     }
421     }
422    
423 maya 2937 static void choose_host_RSA_key_file(HWND dlg, PTInstVar pvar)
424 yutakakn 2728 {
425     char buf[1024];
426    
427 maya 2937 if (get_key_file_name(dlg, buf, sizeof(buf), pvar)) {
428 yutakakn 2728 SetDlgItemText(dlg, IDC_HOSTRSAFILENAME, buf);
429     }
430     }
431    
432     static BOOL end_auth_dlg(PTInstVar pvar, HWND dlg)
433     {
434     int method = SSH_AUTH_PASSWORD;
435     char FAR *password =
436     alloc_control_text(GetDlgItem(dlg, IDC_SSHPASSWORD));
437     CRYPTKeyPair FAR *key_pair = NULL;
438    
439     if (IsDlgButtonChecked(dlg, IDC_SSHUSERSA)) {
440     method = SSH_AUTH_RSA;
441     } else if (IsDlgButtonChecked(dlg, IDC_SSHUSERHOSTS)) {
442     if (GetWindowTextLength(GetDlgItem(dlg, IDC_HOSTRSAFILENAME)) > 0) {
443     method = SSH_AUTH_RHOSTS_RSA;
444     } else {
445     method = SSH_AUTH_RHOSTS;
446     }
447     } else if (IsDlgButtonChecked(dlg, IDC_SSHUSETIS)) {
448     method = SSH_AUTH_TIS;
449 maya 3108 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSEPAGEANT)) {
450     method = SSH_AUTH_PAGEANT;
451 yutakakn 2728 }
452    
453     if (method == SSH_AUTH_RSA || method == SSH_AUTH_RHOSTS_RSA) {
454     char buf[2048];
455     int file_ctl_ID =
456     method == SSH_AUTH_RSA ? IDC_RSAFILENAME : IDC_HOSTRSAFILENAME;
457    
458     buf[0] = 0;
459     GetDlgItemText(dlg, file_ctl_ID, buf, sizeof(buf));
460     if (buf[0] == 0) {
461 maya 2994 UTIL_get_lang_msg("MSG_KEYSPECIFY_ERROR", pvar,
462 maya 3003 "You must specify a file containing the RSA/DSA private key.");
463 maya 2937 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
464 yutakakn 2728 SetFocus(GetDlgItem(dlg, file_ctl_ID));
465     destroy_malloced_string(&password);
466     return FALSE;
467 yutakakn 2762 }
468    
469     if (SSHv1(pvar)) {
470 yutakakn 2728 BOOL invalid_passphrase = FALSE;
471    
472     key_pair = KEYFILES_read_private_key(pvar, buf, password,
473 maya 3003 &invalid_passphrase,
474     FALSE);
475 yutakakn 2728
476     if (key_pair == NULL) {
477     if (invalid_passphrase) {
478     HWND passwordCtl = GetDlgItem(dlg, IDC_SSHPASSWORD);
479    
480     SetFocus(passwordCtl);
481     SendMessage(passwordCtl, EM_SETSEL, 0, -1);
482     } else {
483     SetFocus(GetDlgItem(dlg, file_ctl_ID));
484     }
485     destroy_malloced_string(&password);
486     return FALSE;
487     }
488 yutakakn 2762
489     } else { // SSH2(yutaka)
490     BOOL invalid_passphrase = FALSE;
491 yutakakn 2769 char errmsg[256];
492 yutakakn 2762
493 yutakakn 2769 memset(errmsg, 0, sizeof(errmsg));
494 yutakakn 2784 //GetCurrentDirectory(sizeof(errmsg), errmsg);
495 yutakakn 2769
496 yutakakn 2762 key_pair = read_SSH2_private_key(pvar, buf, password,
497 maya 3003 &invalid_passphrase,
498     FALSE,
499     errmsg,
500     sizeof(errmsg)
501     );
502 yutakakn 2762
503     if (key_pair == NULL) { // read error
504 yutakakn 2769 char buf[1024];
505 maya 2994 UTIL_get_lang_msg("MSG_READKEY_ERROR", pvar,
506 maya 3003 "read error SSH2 private key file\r\n%s");
507 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, errmsg);
508 yutakakn 2769 notify_nonfatal_error(pvar, buf);
509 yasuhide 2962 // �p�X�t���[�Y���������v����������������IDC_SSHPASSWORD���t�H�[�J�X������ (2006.10.29 yasuhide)
510     if (invalid_passphrase) {
511     HWND passwordCtl = GetDlgItem(dlg, IDC_SSHPASSWORD);
512    
513     SetFocus(passwordCtl);
514     SendMessage(passwordCtl, EM_SETSEL, 0, -1);
515     } else {
516     SetFocus(GetDlgItem(dlg, file_ctl_ID));
517     }
518 yutakakn 2762 destroy_malloced_string(&password);
519     return FALSE;
520     }
521    
522 yutakakn 2728 }
523 yutakakn 2762
524 yutakakn 2728 }
525 maya 3108 else if (method == SSH_AUTH_PAGEANT) {
526     pvar->pageant_key = NULL;
527     pvar->pageant_curkey = NULL;
528     pvar->pageant_keylistlen = 0;
529     pvar->pageant_keycount = 0;
530     pvar->pageant_keycurrent = 0;
531     pvar->pageant_keyfinal=FALSE;
532 yutakakn 2728
533 maya 3108 // Pageant �����M
534     if (SSHv1(pvar)) {
535     pvar->pageant_keylistlen = putty_get_ssh1_keylist(&pvar->pageant_key);
536     }
537     else {
538     pvar->pageant_keylistlen = putty_get_ssh2_keylist(&pvar->pageant_key);
539     }
540     if (pvar->pageant_keylistlen == 0) {
541     UTIL_get_lang_msg("MSG_PAGEANT_NOTFOUND", pvar,
542     "Can't find Pageant.");
543     notify_nonfatal_error(pvar, pvar->ts->UIMsg);
544    
545     return FALSE;
546     }
547     pvar->pageant_curkey = pvar->pageant_key;
548    
549     // ������
550     pvar->pageant_keycount = get_uint32_MSBfirst(pvar->pageant_curkey);
551     if (pvar->pageant_keycount == 0) {
552     UTIL_get_lang_msg("MSG_PAGEANT_NOKEY", pvar,
553     "Pageant has no valid key.");
554     notify_nonfatal_error(pvar, pvar->ts->UIMsg);
555    
556     return FALSE;
557     }
558     pvar->pageant_curkey += 4;
559     }
560    
561 yutakakn 2728 /* from here on, we cannot fail, so just munge cur_cred in place */
562     pvar->auth_state.cur_cred.method = method;
563     pvar->auth_state.cur_cred.key_pair = key_pair;
564     /* we can't change the user name once it's set. It may already have
565     been sent to the server, and it can only be sent once. */
566     if (pvar->auth_state.user == NULL) {
567     pvar->auth_state.user =
568     alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
569     }
570 yutakakn 2811
571 yutakakn 2890 // �p�X���[�h���������������������������� (2006.8.3 yutaka)
572     if (SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_GETCHECK, 0,0) == BST_CHECKED) {
573 yutakakn 2891 pvar->settings.remember_password = 1; // �o��������
574     pvar->ts_SSH->remember_password = 1;
575 yutakakn 2890 } else {
576 yutakakn 2891 pvar->settings.remember_password = 0; // ���������������Y����
577     pvar->ts_SSH->remember_password = 0;
578 yutakakn 2890 }
579    
580 yutakakn 2811 // ���J���F���������A�Z�b�V�������������p�X���[�h���g�����������������������������������B
581     // (2005.4.8 yutaka)
582     if (method == SSH_AUTH_PASSWORD || method == SSH_AUTH_RSA) {
583 yutakakn 2728 pvar->auth_state.cur_cred.password = password;
584     } else {
585     destroy_malloced_string(&password);
586     }
587     if (method == SSH_AUTH_RHOSTS || method == SSH_AUTH_RHOSTS_RSA) {
588     if (pvar->session_settings.DefaultAuthMethod != SSH_AUTH_RHOSTS) {
589 maya 2994 UTIL_get_lang_msg("MSG_RHOSTS_NOTDEFAULT_ERROR", pvar,
590 maya 3003 "Rhosts authentication will probably fail because it was not "
591     "the default authentication method.\n"
592     "To use Rhosts authentication "
593     "in TTSSH, you need to set it to be the default by restarting\n"
594     "TTSSH and selecting \"SSH Authentication...\" from the Setup menu"
595     "before connecting.");
596 maya 2937 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
597 yutakakn 2728 }
598    
599     pvar->auth_state.cur_cred.rhosts_client_user =
600     alloc_control_text(GetDlgItem(dlg, IDC_LOCALUSERNAME));
601     }
602     pvar->auth_state.auth_dialog = NULL;
603    
604     GetDlgItemText(dlg, IDC_RSAFILENAME,
605 maya 3003 pvar->session_settings.DefaultRSAPrivateKeyFile,
606     sizeof(pvar->session_settings.
607     DefaultRSAPrivateKeyFile));
608 yutakakn 2728 GetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
609 maya 3003 pvar->session_settings.DefaultRhostsHostPrivateKeyFile,
610     sizeof(pvar->session_settings.
611     DefaultRhostsHostPrivateKeyFile));
612 yutakakn 2728 GetDlgItemText(dlg, IDC_LOCALUSERNAME,
613 maya 3003 pvar->session_settings.DefaultRhostsLocalUserName,
614     sizeof(pvar->session_settings.
615     DefaultRhostsLocalUserName));
616 yutakakn 2728
617     if (SSHv1(pvar)) {
618     SSH_notify_user_name(pvar);
619     SSH_notify_cred(pvar);
620     } else {
621     // for SSH2(yutaka)
622     do_SSH2_userauth(pvar);
623     }
624    
625     EndDialog(dlg, 1);
626 maya 3003 if (DlgAuthFont != NULL) {
627     DeleteObject(DlgAuthFont);
628     }
629 maya 2949
630 yutakakn 2728 return TRUE;
631     }
632    
633 maya 3154 BOOL autologin_sent_none;
634 yutakakn 2728 static BOOL CALLBACK auth_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
635 maya 3003 LPARAM lParam)
636 yutakakn 2728 {
637 maya 3152 const int IDC_TIMER1 = 300; // �������O�C��
638     const int IDC_TIMER2 = 301; // �T�|�[�g�������������\�b�h���`�F�b�N
639     const int IDC_TIMER3 = 302; // �`�������W���X�|���X
640 maya 3029 const int autologin_timeout = 10; // �~���b
641 yutakakn 2728 PTInstVar pvar;
642 maya 2943 LOGFONT logfont;
643     HFONT font;
644 yutakakn 2728
645     switch (msg) {
646     case WM_INITDIALOG:
647     pvar = (PTInstVar) lParam;
648     pvar->auth_state.auth_dialog = dlg;
649     SetWindowLong(dlg, DWL_USER, lParam);
650    
651     init_auth_dlg(pvar, dlg);
652 yutakakn 2739
653 maya 2943 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
654     GetObject(font, sizeof(LOGFONT), &logfont);
655 maya 2946 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthFont, pvar)) {
656 maya 2943 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
657     SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
658     SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
659 maya 2946 SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
660 maya 2943 SendDlgItemMessage(dlg, IDC_SSHPASSWORDCAPTION, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
661 maya 2946 SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
662 maya 2943 SendDlgItemMessage(dlg, IDC_REMEMBER_PASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
663 maya 3183 SendDlgItemMessage(dlg, IDC_FORWARD_AGENT, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
664 maya 2943 SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
665     SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
666     SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
667 maya 2946 SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
668 maya 2943 SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
669     SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
670 maya 2946 SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
671 maya 2943 SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
672 maya 2946 SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
673 maya 2943 SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
674 maya 3138 SendDlgItemMessage(dlg, IDC_SSHUSEPAGEANT, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
675 maya 2943 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
676     SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
677     }
678     else {
679     DlgAuthFont = NULL;
680     }
681    
682 yutakakn 2739 // SSH2 autologin���L�����������A�^�C�}���d�|�����B (2004.12.1 yutaka)
683     if (pvar->ssh2_autologin == 1) {
684 maya 3154 autologin_sent_none = FALSE;
685 yutakakn 2739 SetTimer(dlg, IDC_TIMER1, autologin_timeout, 0);
686     }
687 maya 3015 else {
688     // �T�|�[�g�������������\�b�h���`�F�b�N�����B(2007.9.24 maya)
689     // �������L�����A�����������s�����������A���[�U�����m����������
690     if (pvar->session_settings.CheckAuthListFirst &&
691 maya 3029 !pvar->tryed_ssh2_authlist &&
692     GetWindowTextLength(GetDlgItem(dlg, IDC_SSHUSERNAME)) > 0) {
693     SetTimer(dlg, IDC_TIMER2, autologin_timeout, 0);
694 maya 3015 }
695 maya 3073 // /auth=challenge ���w���������������[�U�����m������������
696     // �������������������v�����������AOK �{�^����������
697     // TIS auth �_�C�A���O���o��
698 maya 3029 else {
699     SetTimer(dlg, IDC_TIMER3, autologin_timeout, 0);
700     }
701 maya 3015 }
702 yutakakn 2728 return FALSE; /* because we set the focus */
703    
704 yutakakn 2739 case WM_TIMER:
705 yutakakn 2752 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
706     // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2004.12.16 yutaka)
707 maya 3015 if (wParam == IDC_TIMER1) {
708     // �������O�C��������
709 maya 3016 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
710     (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
711 maya 3154 if (SSHv2(pvar) &&
712     pvar->session_settings.CheckAuthListFirst &&
713     !pvar->tryed_ssh2_authlist) {
714     if (!autologin_sent_none) {
715     // AuthList ���A���������������� IDOK ����������
716     // �i�����������Anone ������ (2008.10.12 maya)
717     do_SSH2_userauth(pvar);
718     autologin_sent_none = TRUE;
719     }
720     //else {
721     // none �������������A����������������
722     //}
723     }
724     else {
725     KillTimer(dlg, IDC_TIMER1);
726     SendMessage(dlg, WM_COMMAND, IDOK, 0);
727     }
728 maya 3015 }
729 yutakakn 2752 }
730 maya 3015 else if (wParam == IDC_TIMER2) {
731     // authlist ����������
732 maya 3029 if (SSHv2(pvar)) {
733     if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
734     (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
735 maya 3015 KillTimer(dlg, IDC_TIMER2);
736 yutakakn 2739
737 maya 3029 // �_�C�A���O�����[�U������������
738     if (pvar->auth_state.user == NULL) {
739     pvar->auth_state.user =
740     alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
741     }
742    
743 maya 3015 // ���[�U�������X��������
744     EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
745    
746     // none ������
747     do_SSH2_userauth(pvar);
748 maya 3029
749     // TIS �p�� OK �������^�C�}�[���d�|��������
750     // �F�������s������������������
751     // Unexpected SSH2 message �������B
752 maya 3015 }
753 maya 3029 }
754     else if (SSHv1(pvar)) {
755     KillTimer(dlg, IDC_TIMER2);
756     // TIS �p�� OK �������^�C�}�[���d�|����
757     if (pvar->ssh2_authmethod == SSH_AUTH_TIS) {
758     SendMessage(dlg, WM_COMMAND, IDOK, 0);
759 maya 3015 }
760 maya 3029 // SSH1 ���� none ����������
761 maya 3015 }
762 maya 3029 // �v���g�R���o�[�W�����m���O������������
763 maya 3015 }
764 maya 3029 else if (wParam == IDC_TIMER3) {
765     if (SSHv2(pvar) || SSHv1(pvar)) {
766     // TIS �p�� OK �������^�C�}�[���d�|����
767     if (pvar->ssh2_authmethod == SSH_AUTH_TIS) {
768 maya 3073 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
769     (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
770     KillTimer(dlg, IDC_TIMER3);
771     SendMessage(dlg, WM_COMMAND, IDOK, 0);
772     }
773 maya 3029 }
774     }
775     // �v���g�R���o�[�W�����m���O������������
776     }
777 maya 3015 return FALSE;
778    
779 yutakakn 2728 case WM_COMMAND:
780     pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
781    
782     switch (LOWORD(wParam)) {
783     case IDOK:
784 yutakakn 2783 // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2001.1.25 yutaka)
785 maya 3016 if (pvar->userauth_retry_count == 0 &&
786     ((pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) ||
787     !(pvar->ssh_state.status_flags & STATUS_HOST_OK))) {
788 yutakakn 2783 return FALSE;
789     }
790 maya 3154 else if (SSHv2(pvar) &&
791     pvar->session_settings.CheckAuthListFirst &&
792 maya 3152 !pvar->tryed_ssh2_authlist) {
793     // CheckAuthListFirst ���L�����F������������������������
794     // OK �������������������� (2008.10.4 maya)
795     return FALSE;
796     }
797 maya 2943
798 yutakakn 2728 return end_auth_dlg(pvar, dlg);
799    
800     case IDCANCEL: /* kill the connection */
801     pvar->auth_state.auth_dialog = NULL;
802     notify_closed_connection(pvar);
803     EndDialog(dlg, 0);
804 maya 2943
805     if (DlgAuthFont != NULL) {
806     DeleteObject(DlgAuthFont);
807     }
808    
809 yutakakn 2728 return TRUE;
810    
811 maya 3015 case IDC_SSHUSERNAME:
812     // ���[�U�����t�H�[�J�X������������ (2007.9.29 maya)
813     if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
814 maya 3016 (pvar->ssh_state.status_flags & STATUS_HOST_OK) &&
815 maya 3015 HIWORD(wParam) == EN_KILLFOCUS) {
816     // �������L���������������s��������������
817     if (SSHv2(pvar) &&
818     pvar->session_settings.CheckAuthListFirst &&
819     !pvar->tryed_ssh2_authlist) {
820     // �_�C�A���O�����[�U�������f
821     if (pvar->auth_state.user == NULL) {
822     pvar->auth_state.user =
823     alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
824     }
825    
826 maya 3023 // ���[�U���������������������`�F�b�N����
827     if (strlen(pvar->auth_state.user) == 0) {
828     return FALSE;
829     }
830    
831 maya 3015 // ���[�U�������X��������
832     EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
833    
834     // none ������
835     do_SSH2_userauth(pvar);
836     return TRUE;
837     }
838     }
839    
840     return FALSE;
841    
842 yutakakn 2728 case IDC_SSHUSEPASSWORD:
843     case IDC_SSHUSERSA:
844     case IDC_SSHUSERHOSTS:
845     case IDC_SSHUSETIS:
846 maya 3108 case IDC_SSHUSEPAGEANT:
847 yutakakn 2728 set_auth_options_status(dlg, LOWORD(wParam));
848     return TRUE;
849    
850     case IDC_CHOOSERSAFILE:
851 maya 2937 choose_RSA_key_file(dlg, pvar);
852 yutakakn 2728 return TRUE;
853    
854     case IDC_CHOOSEHOSTRSAFILE:
855 maya 2937 choose_host_RSA_key_file(dlg, pvar);
856 yutakakn 2728 return TRUE;
857    
858 maya 3183 case IDC_FORWARD_AGENT:
859     // �����Z�b�V�������������f������ (2008.12.4 maya)
860     pvar->session_settings.ForwardAgent = IsDlgButtonChecked(dlg, IDC_FORWARD_AGENT);
861     return TRUE;
862    
863 yutakakn 2728 default:
864     return FALSE;
865     }
866    
867     default:
868     return FALSE;
869     }
870     }
871    
872     char FAR *AUTH_get_user_name(PTInstVar pvar)
873     {
874     return pvar->auth_state.user;
875     }
876    
877     int AUTH_set_supported_auth_types(PTInstVar pvar, int types)
878     {
879     char buf[1024];
880    
881 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
882 maya 3003 "Server reports supported authentication method mask = %d",
883     types);
884 yutakakn 2728 buf[sizeof(buf) - 1] = 0;
885     notify_verbose_message(pvar, buf, LOG_LEVEL_VERBOSE);
886    
887     if (SSHv1(pvar)) {
888     types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
889 maya 3003 | (1 << SSH_AUTH_RHOSTS_RSA) | (1 << SSH_AUTH_RHOSTS)
890 maya 3108 | (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);
891 yutakakn 2728 } else {
892     // for SSH2(yutaka)
893 yutakakn 2762 // types &= (1 << SSH_AUTH_PASSWORD);
894     // ���J���F�����L�������� (2004.12.18 yutaka)
895 yutakakn 2800 // TIS�������BSSH2����keyboard-interactive�����������B(2005.3.12 yutaka)
896 yutakakn 2762 types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
897 maya 3108 | (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);
898 yutakakn 2728 }
899     pvar->auth_state.supported_types = types;
900    
901     if (types == 0) {
902 maya 2994 UTIL_get_lang_msg("MSG_NOAUTHMETHOD_ERROR", pvar,
903 maya 3003 "Server does not support any of the authentication options\n"
904     "provided by TTSSH. This connection will now close.");
905 maya 2937 notify_fatal_error(pvar, pvar->ts->UIMsg);
906 yutakakn 2728 return 0;
907     } else {
908     if (pvar->auth_state.auth_dialog != NULL) {
909     update_server_supported_types(pvar,
910 maya 3003 pvar->auth_state.auth_dialog);
911 yutakakn 2728 }
912    
913     return 1;
914     }
915     }
916    
917     static void start_user_auth(PTInstVar pvar)
918     {
919 yutakakn 2739 // �F���_�C�A���O���\�������� (2004.12.1 yutaka)
920 yutakakn 2728 PostMessage(pvar->NotificationWindow, WM_COMMAND, (WPARAM) ID_SSHAUTH,
921     (LPARAM) NULL);
922     pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
923     }
924    
925     static void try_default_auth(PTInstVar pvar)
926     {
927     if (pvar->session_settings.TryDefaultAuth) {
928     switch (pvar->session_settings.DefaultAuthMethod) {
929     case SSH_AUTH_RSA:{
930     BOOL invalid_passphrase;
931     char password[] = "";
932    
933     pvar->auth_state.cur_cred.key_pair
934     =
935     KEYFILES_read_private_key(pvar,
936 maya 3003 pvar->session_settings.
937     DefaultRSAPrivateKeyFile,
938     password,
939     &invalid_passphrase, TRUE);
940 yutakakn 2728 if (pvar->auth_state.cur_cred.key_pair == NULL) {
941     return;
942     } else {
943     pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
944     }
945     break;
946     }
947    
948     case SSH_AUTH_RHOSTS:
949     if (pvar->session_settings.
950     DefaultRhostsHostPrivateKeyFile[0] != 0) {
951     BOOL invalid_passphrase;
952     char password[] = "";
953    
954     pvar->auth_state.cur_cred.key_pair
955     =
956     KEYFILES_read_private_key(pvar,
957 maya 3003 pvar->session_settings.
958     DefaultRhostsHostPrivateKeyFile,
959     password,
960     &invalid_passphrase, TRUE);
961 yutakakn 2728 if (pvar->auth_state.cur_cred.key_pair == NULL) {
962     return;
963     } else {
964     pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS_RSA;
965     }
966     } else {
967     pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS;
968     }
969    
970     pvar->auth_state.cur_cred.rhosts_client_user =
971     _strdup(pvar->session_settings.DefaultRhostsLocalUserName);
972     break;
973    
974 maya 3108 case SSH_AUTH_PAGEANT:
975     pvar->auth_state.cur_cred.method = SSH_AUTH_PAGEANT;
976     break;
977    
978 yutakakn 2728 case SSH_AUTH_PASSWORD:
979     pvar->auth_state.cur_cred.password = _strdup("");
980     pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
981     break;
982    
983     case SSH_AUTH_TIS:
984     default:
985     return;
986     }
987    
988     pvar->auth_state.user =
989     _strdup(pvar->session_settings.DefaultUserName);
990     }
991     }
992    
993     void AUTH_notify_end_error(PTInstVar pvar)
994     {
995     if ((pvar->auth_state.flags & AUTH_START_USER_AUTH_ON_ERROR_END) != 0) {
996     start_user_auth(pvar);
997     pvar->auth_state.flags &= ~AUTH_START_USER_AUTH_ON_ERROR_END;
998     }
999     }
1000    
1001     void AUTH_advance_to_next_cred(PTInstVar pvar)
1002     {
1003     pvar->auth_state.failed_method = pvar->auth_state.cur_cred.method;
1004    
1005     if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
1006     try_default_auth(pvar);
1007    
1008     if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
1009     if (pvar->err_msg != NULL) {
1010     pvar->auth_state.flags |=
1011     AUTH_START_USER_AUTH_ON_ERROR_END;
1012     } else {
1013 yutakakn 2739 // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
1014     // �R�}���h���C���w������������
1015 yutakakn 2728 start_user_auth(pvar);
1016     }
1017     }
1018     } else {
1019 yutakakn 2739 // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
1020     // �R�}���h���C���w������(/auth=xxxx)������
1021 yutakakn 2728 start_user_auth(pvar);
1022     }
1023     }
1024    
1025     static void init_TIS_dlg(PTInstVar pvar, HWND dlg)
1026     {
1027 maya 2994 char uimsg[MAX_UIMSG];
1028    
1029     GetWindowText(dlg, uimsg, sizeof(uimsg));
1030     UTIL_get_lang_msg("DLG_TIS_TITLE", pvar, uimsg);
1031 maya 2937 SetWindowText(dlg, pvar->ts->UIMsg);
1032 maya 2994 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
1033     UTIL_get_lang_msg("DLG_TIS_BANNER", pvar, uimsg);
1034 maya 2937 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
1035 maya 2994 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1036     UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1037 maya 2961 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1038 maya 2994 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1039     UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
1040 maya 2961 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1041 maya 2937
1042 yutakakn 2728 init_auth_machine_banner(pvar, dlg);
1043     init_password_control(dlg);
1044    
1045     if (pvar->auth_state.TIS_prompt != NULL) {
1046     if (strlen(pvar->auth_state.TIS_prompt) > 10000) {
1047     pvar->auth_state.TIS_prompt[10000] = 0;
1048     }
1049     SetDlgItemText(dlg, IDC_SSHAUTHBANNER2,
1050     pvar->auth_state.TIS_prompt);
1051     destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1052     }
1053     }
1054    
1055     static BOOL end_TIS_dlg(PTInstVar pvar, HWND dlg)
1056     {
1057     char FAR *password =
1058     alloc_control_text(GetDlgItem(dlg, IDC_SSHPASSWORD));
1059    
1060     pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
1061     pvar->auth_state.cur_cred.password = password;
1062     pvar->auth_state.auth_dialog = NULL;
1063    
1064 yutakakn 2800 // add
1065     if (SSHv2(pvar)) {
1066     pvar->keyboard_interactive_password_input = 1;
1067     handle_SSH2_userauth_inforeq(pvar);
1068     }
1069    
1070 yutakakn 2728 SSH_notify_cred(pvar);
1071    
1072     EndDialog(dlg, 1);
1073     return TRUE;
1074     }
1075    
1076     static BOOL CALLBACK TIS_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
1077 maya 3003 LPARAM lParam)
1078 yutakakn 2728 {
1079     PTInstVar pvar;
1080 maya 2943 LOGFONT logfont;
1081     HFONT font;
1082 yutakakn 2728
1083     switch (msg) {
1084     case WM_INITDIALOG:
1085     pvar = (PTInstVar) lParam;
1086     pvar->auth_state.auth_dialog = dlg;
1087     SetWindowLong(dlg, DWL_USER, lParam);
1088    
1089     init_TIS_dlg(pvar, dlg);
1090 maya 2943
1091     font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1092     GetObject(font, sizeof(LOGFONT), &logfont);
1093 maya 2946 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgTisFont, pvar)) {
1094 maya 2943 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1095     SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1096 maya 2946 SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1097 maya 2943 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1098     SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1099     }
1100     else {
1101     DlgTisFont = NULL;
1102     }
1103    
1104 maya 3028 // /auth=challenge ������ (2007.10.5 maya)
1105 maya 3025 if (pvar->ssh2_autologin == 1) {
1106     SetDlgItemText(dlg, IDC_SSHPASSWORD, pvar->ssh2_password);
1107     SendMessage(dlg, WM_COMMAND, IDOK, 0);
1108     }
1109    
1110 yutakakn 2728 return FALSE; /* because we set the focus */
1111    
1112     case WM_COMMAND:
1113     pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1114    
1115     switch (LOWORD(wParam)) {
1116     case IDOK:
1117 maya 2943 if (DlgTisFont != NULL) {
1118     DeleteObject(DlgTisFont);
1119     }
1120    
1121 yutakakn 2728 return end_TIS_dlg(pvar, dlg);
1122    
1123     case IDCANCEL: /* kill the connection */
1124     pvar->auth_state.auth_dialog = NULL;
1125     notify_closed_connection(pvar);
1126     EndDialog(dlg, 0);
1127 maya 2943
1128     if (DlgTisFont != NULL) {
1129     DeleteObject(DlgTisFont);
1130     }
1131    
1132 yutakakn 2728 return TRUE;
1133    
1134     default:
1135     return FALSE;
1136     }
1137    
1138     default:
1139     return FALSE;
1140     }
1141     }
1142    
1143     void AUTH_do_cred_dialog(PTInstVar pvar)
1144     {
1145     if (pvar->auth_state.auth_dialog == NULL) {
1146     HWND cur_active = GetActiveWindow();
1147     DLGPROC dlg_proc;
1148     LPCTSTR dialog_template;
1149    
1150     switch (pvar->auth_state.mode) {
1151     case TIS_AUTH_MODE:
1152     dialog_template = MAKEINTRESOURCE(IDD_SSHTISAUTH);
1153     dlg_proc = TIS_dlg_proc;
1154     break;
1155     case GENERIC_AUTH_MODE:
1156     default:
1157     dialog_template = MAKEINTRESOURCE(IDD_SSHAUTH);
1158     dlg_proc = auth_dlg_proc;
1159     }
1160    
1161     if (!DialogBoxParam(hInst, dialog_template,
1162 maya 3003 cur_active !=
1163     NULL ? cur_active : pvar->NotificationWindow,
1164     dlg_proc, (LPARAM) pvar) == -1) {
1165 maya 2994 UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTH_ERROR", pvar,
1166 maya 3003 "Unable to display authentication dialog box.\n"
1167     "Connection terminated.");
1168 maya 2937 notify_fatal_error(pvar, pvar->ts->UIMsg);
1169 yutakakn 2728 }
1170     }
1171     }
1172    
1173     static void init_default_auth_dlg(PTInstVar pvar, HWND dlg)
1174     {
1175 maya 2994 char uimsg[MAX_UIMSG];
1176    
1177     GetWindowText(dlg, uimsg, sizeof(uimsg));
1178     UTIL_get_lang_msg("DLG_AUTHSETUP_TITLE", pvar, uimsg);
1179 maya 2937 SetWindowText(dlg, pvar->ts->UIMsg);
1180 maya 2994 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
1181     UTIL_get_lang_msg("DLG_AUTHSETUP_BANNER", pvar, uimsg);
1182 maya 2937 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
1183 maya 2994 GetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, uimsg, sizeof(uimsg));
1184     UTIL_get_lang_msg("DLG_AUTHSETUP_USERNAME", pvar, uimsg);
1185 maya 2937 SetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, pvar->ts->UIMsg);
1186 maya 2994 GetDlgItemText(dlg, IDC_SSHUSEPASSWORD, uimsg, sizeof(uimsg));
1187     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PASSWORD", pvar, uimsg);
1188 maya 2937 SetDlgItemText(dlg, IDC_SSHUSEPASSWORD, pvar->ts->UIMsg);
1189 maya 2994 GetDlgItemText(dlg, IDC_SSHUSERSA, uimsg, sizeof(uimsg));
1190     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RSA", pvar, uimsg);
1191 maya 2937 SetDlgItemText(dlg, IDC_SSHUSERSA, pvar->ts->UIMsg);
1192 maya 2994 GetDlgItemText(dlg, IDC_SSHUSERHOSTS, uimsg, sizeof(uimsg));
1193     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RHOST", pvar, uimsg);
1194 maya 2937 SetDlgItemText(dlg, IDC_SSHUSERHOSTS, pvar->ts->UIMsg);
1195 maya 2994 GetDlgItemText(dlg, IDC_SSHUSETIS, uimsg, sizeof(uimsg));
1196     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_CHALLENGE", pvar, uimsg);
1197 maya 2937 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
1198 maya 3128 GetDlgItemText(dlg, IDC_SSHUSEPAGEANT, uimsg, sizeof(uimsg));
1199     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PAGEANT", pvar, uimsg);
1200     SetDlgItemText(dlg, IDC_SSHUSEPAGEANT, pvar->ts->UIMsg);
1201 maya 2994 GetDlgItemText(dlg, IDC_CHOOSERSAFILE, uimsg, sizeof(uimsg));
1202     UTIL_get_lang_msg("DLG_AUTH_PRIVATEKEY", pvar, uimsg);
1203 maya 2937 SetDlgItemText(dlg, IDC_CHOOSERSAFILE, pvar->ts->UIMsg);
1204 maya 2994 GetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, uimsg, sizeof(uimsg));
1205     UTIL_get_lang_msg("DLG_AUTH_LOCALUSER", pvar, uimsg);
1206 maya 2937 SetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, pvar->ts->UIMsg);
1207 maya 2994 GetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, uimsg, sizeof(uimsg));
1208     UTIL_get_lang_msg("DLG_AUTH_HOST_PRIVATEKEY", pvar, uimsg);
1209 maya 2937 SetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, pvar->ts->UIMsg);
1210 maya 3063 GetDlgItemText(dlg, IDC_CHECKAUTH, uimsg, sizeof(uimsg));
1211     UTIL_get_lang_msg("DLG_AUTHSETUP_CHECKAUTH", pvar, uimsg);
1212     SetDlgItemText(dlg, IDC_CHECKAUTH, pvar->ts->UIMsg);
1213 maya 2994 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1214     UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1215 maya 2937 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1216 maya 2994 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1217     UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
1218 maya 2937 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1219    
1220 yutakakn 2728 switch (pvar->settings.DefaultAuthMethod) {
1221     case SSH_AUTH_RSA:
1222     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1223 maya 3003 IDC_SSHUSERSA);
1224 yutakakn 2728 break;
1225     case SSH_AUTH_RHOSTS:
1226     case SSH_AUTH_RHOSTS_RSA:
1227     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1228 maya 3003 IDC_SSHUSERHOSTS);
1229 yutakakn 2728 break;
1230     case SSH_AUTH_TIS:
1231     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1232 maya 3003 IDC_SSHUSETIS);
1233 yutakakn 2728 break;
1234 maya 3108 case SSH_AUTH_PAGEANT:
1235     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1236     IDC_SSHUSEPAGEANT);
1237     break;
1238 yutakakn 2728 case SSH_AUTH_PASSWORD:
1239     default:
1240     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1241 maya 3003 IDC_SSHUSEPASSWORD);
1242 yutakakn 2728 }
1243    
1244     SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName);
1245     SetDlgItemText(dlg, IDC_RSAFILENAME,
1246 maya 3003 pvar->settings.DefaultRSAPrivateKeyFile);
1247 yutakakn 2728 SetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1248 maya 3003 pvar->settings.DefaultRhostsHostPrivateKeyFile);
1249 yutakakn 2728 SetDlgItemText(dlg, IDC_LOCALUSERNAME,
1250 maya 3003 pvar->settings.DefaultRhostsLocalUserName);
1251 maya 3063
1252     if (pvar->settings.CheckAuthListFirst) {
1253     CheckDlgButton(dlg, IDC_CHECKAUTH, TRUE);
1254     }
1255 yutakakn 2728 }
1256    
1257     static BOOL end_default_auth_dlg(PTInstVar pvar, HWND dlg)
1258     {
1259     if (IsDlgButtonChecked(dlg, IDC_SSHUSERSA)) {
1260     pvar->settings.DefaultAuthMethod = SSH_AUTH_RSA;
1261     } else if (IsDlgButtonChecked(dlg, IDC_SSHUSERHOSTS)) {
1262     if (GetWindowTextLength(GetDlgItem(dlg, IDC_HOSTRSAFILENAME)) > 0) {
1263     pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS_RSA;
1264     } else {
1265     pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS;
1266     }
1267     } else if (IsDlgButtonChecked(dlg, IDC_SSHUSETIS)) {
1268     pvar->settings.DefaultAuthMethod = SSH_AUTH_TIS;
1269 maya 3108 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSEPAGEANT)) {
1270     pvar->settings.DefaultAuthMethod = SSH_AUTH_PAGEANT;
1271 yutakakn 2728 } else {
1272     pvar->settings.DefaultAuthMethod = SSH_AUTH_PASSWORD;
1273     }
1274    
1275     GetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName,
1276 maya 3003 sizeof(pvar->settings.DefaultUserName));
1277 yutakakn 2728 GetDlgItemText(dlg, IDC_RSAFILENAME,
1278 maya 3003 pvar->settings.DefaultRSAPrivateKeyFile,
1279     sizeof(pvar->settings.DefaultRSAPrivateKeyFile));
1280 yutakakn 2728 GetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1281 maya 3003 pvar->settings.DefaultRhostsHostPrivateKeyFile,
1282     sizeof(pvar->settings.DefaultRhostsHostPrivateKeyFile));
1283 yutakakn 2728 GetDlgItemText(dlg, IDC_LOCALUSERNAME,
1284 maya 3003 pvar->settings.DefaultRhostsLocalUserName,
1285     sizeof(pvar->settings.DefaultRhostsLocalUserName));
1286 yutakakn 2728
1287 maya 3063 if (IsDlgButtonChecked(dlg, IDC_CHECKAUTH)) {
1288     pvar->settings.CheckAuthListFirst = TRUE;
1289     }
1290     else {
1291     pvar->settings.CheckAuthListFirst = FALSE;
1292     }
1293    
1294 yutakakn 2728 EndDialog(dlg, 1);
1295     return TRUE;
1296     }
1297    
1298     static BOOL CALLBACK default_auth_dlg_proc(HWND dlg, UINT msg,
1299     WPARAM wParam, LPARAM lParam)
1300     {
1301     PTInstVar pvar;
1302 maya 2943 LOGFONT logfont;
1303     HFONT font;
1304 yutakakn 2728
1305     switch (msg) {
1306     case WM_INITDIALOG:
1307     pvar = (PTInstVar) lParam;
1308     SetWindowLong(dlg, DWL_USER, lParam);
1309    
1310     init_default_auth_dlg(pvar, dlg);
1311 maya 2943
1312     font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1313     GetObject(font, sizeof(LOGFONT), &logfont);
1314 maya 2946 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthSetupFont, pvar)) {
1315 maya 2943 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1316     SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1317 maya 2946 SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1318 maya 2943 SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1319     SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1320     SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1321 maya 2946 SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1322 maya 2943 SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1323     SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1324 maya 2946 SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1325 maya 2943 SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1326 maya 2946 SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1327 maya 2943 SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1328 maya 3138 SendDlgItemMessage(dlg, IDC_SSHUSEPAGEANT, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1329 maya 3063 SendDlgItemMessage(dlg, IDC_CHECKAUTH, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1330 maya 2943 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1331     SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1332     }
1333     else {
1334     DlgAuthSetupFont = NULL;
1335     }
1336    
1337 yutakakn 2728 return TRUE; /* because we do not set the focus */
1338    
1339     case WM_COMMAND:
1340     pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1341    
1342     switch (LOWORD(wParam)) {
1343     case IDOK:
1344 maya 2943
1345     if (DlgAuthSetupFont != NULL) {
1346     DeleteObject(DlgAuthSetupFont);
1347     }
1348    
1349 yutakakn 2728 return end_default_auth_dlg(pvar, dlg);
1350    
1351     case IDCANCEL:
1352     EndDialog(dlg, 0);
1353 maya 2943
1354     if (DlgAuthSetupFont != NULL) {
1355     DeleteObject(DlgAuthSetupFont);
1356     }
1357    
1358 yutakakn 2728 return TRUE;
1359    
1360     case IDC_CHOOSERSAFILE:
1361 maya 2937 choose_RSA_key_file(dlg, pvar);
1362 yutakakn 2728 return TRUE;
1363    
1364     case IDC_CHOOSEHOSTRSAFILE:
1365 maya 2937 choose_host_RSA_key_file(dlg, pvar);
1366 yutakakn 2728 return TRUE;
1367    
1368     default:
1369     return FALSE;
1370     }
1371    
1372     default:
1373     return FALSE;
1374     }
1375     }
1376    
1377     void AUTH_init(PTInstVar pvar)
1378     {
1379     pvar->auth_state.failed_method = SSH_AUTH_NONE;
1380     pvar->auth_state.auth_dialog = NULL;
1381     pvar->auth_state.user = NULL;
1382     pvar->auth_state.flags = 0;
1383     pvar->auth_state.TIS_prompt = NULL;
1384     pvar->auth_state.supported_types = 0;
1385     pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
1386     pvar->auth_state.cur_cred.password = NULL;
1387     pvar->auth_state.cur_cred.rhosts_client_user = NULL;
1388     pvar->auth_state.cur_cred.key_pair = NULL;
1389     AUTH_set_generic_mode(pvar);
1390     }
1391    
1392     void AUTH_set_generic_mode(PTInstVar pvar)
1393     {
1394     pvar->auth_state.mode = GENERIC_AUTH_MODE;
1395     destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1396     }
1397    
1398     void AUTH_set_TIS_mode(PTInstVar pvar, char FAR * prompt, int len)
1399     {
1400     if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1401     pvar->auth_state.mode = TIS_AUTH_MODE;
1402    
1403     destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1404     pvar->auth_state.TIS_prompt = malloc(len + 1);
1405     memcpy(pvar->auth_state.TIS_prompt, prompt, len);
1406     pvar->auth_state.TIS_prompt[len] = 0;
1407     } else {
1408     AUTH_set_generic_mode(pvar);
1409     }
1410     }
1411    
1412     void AUTH_do_default_cred_dialog(PTInstVar pvar)
1413     {
1414     HWND cur_active = GetActiveWindow();
1415    
1416     if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHAUTHSETUP),
1417 maya 3003 cur_active != NULL ? cur_active
1418     : pvar->NotificationWindow,
1419     default_auth_dlg_proc, (LPARAM) pvar) == -1) {
1420 maya 2994 UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTHSETUP_ERROR", pvar,
1421 maya 3003 "Unable to display authentication setup dialog box.");
1422 maya 2937 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1423 yutakakn 2728 }
1424     }
1425    
1426     void AUTH_destroy_cur_cred(PTInstVar pvar)
1427     {
1428     destroy_malloced_string(&pvar->auth_state.cur_cred.password);
1429     destroy_malloced_string(&pvar->auth_state.cur_cred.rhosts_client_user);
1430     if (pvar->auth_state.cur_cred.key_pair != NULL) {
1431     CRYPT_free_key_pair(pvar->auth_state.cur_cred.key_pair);
1432     pvar->auth_state.cur_cred.key_pair = NULL;
1433     }
1434     }
1435    
1436     static char FAR *get_auth_method_name(SSHAuthMethod auth)
1437     {
1438     switch (auth) {
1439     case SSH_AUTH_PASSWORD:
1440     return "password";
1441     case SSH_AUTH_RSA:
1442     return "RSA";
1443 maya 3108 case SSH_AUTH_PAGEANT:
1444     return "RSA (with Pageant)";
1445 yutakakn 2728 case SSH_AUTH_RHOSTS:
1446     return "rhosts";
1447     case SSH_AUTH_RHOSTS_RSA:
1448     return "rhosts with RSA";
1449     case SSH_AUTH_TIS:
1450     return "challenge/response (TIS)";
1451     default:
1452     return "unknown method";
1453     }
1454     }
1455    
1456     void AUTH_get_auth_info(PTInstVar pvar, char FAR * dest, int len)
1457     {
1458 yutakakn 2782 char *method = "unknown";
1459    
1460 yutakakn 2728 if (pvar->auth_state.user == NULL) {
1461 maya 2992 strncpy_s(dest, len, "None", _TRUNCATE);
1462 yutakakn 2728 } else if (pvar->auth_state.cur_cred.method != SSH_AUTH_NONE) {
1463 yutakakn 2762 if (SSHv1(pvar)) {
1464 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1465 maya 2992 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1466 maya 3003 get_auth_method_name(pvar->auth_state.cur_cred.method));
1467 yutakakn 2762
1468 yutakakn 2800 } else {
1469     // SSH2:�F�����\�b�h������ (2004.12.23 yutaka)
1470     // keyboard-interactive���\�b�h������ (2005.3.12 yutaka)
1471     if (pvar->auth_state.cur_cred.method == SSH_AUTH_PASSWORD ||
1472     pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1473 yutakakn 2782 // keyboard-interactive���\�b�h������ (2005.1.24 yutaka)
1474 maya 3011 if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1475 yutakakn 2782 method = "keyboard-interactive";
1476     } else {
1477     method = get_auth_method_name(pvar->auth_state.cur_cred.method);
1478     }
1479 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1480 maya 2992 _snprintf_s(dest, len, _TRUNCATE,
1481 maya 3003 pvar->ts->UIMsg, pvar->auth_state.user, method);
1482 yutakakn 2782
1483 yutakakn 2762 } else {
1484 maya 3108 if (pvar->auth_state.cur_cred.method == SSH_AUTH_RSA) {
1485     if (pvar->auth_state.cur_cred.key_pair->RSA_key != NULL) {
1486     method = "RSA";
1487     } else if (pvar->auth_state.cur_cred.key_pair->DSA_key != NULL) {
1488     method = "DSA";
1489     }
1490 yutakakn 2762 }
1491 maya 3108 else if (pvar->auth_state.cur_cred.method == SSH_AUTH_PAGEANT) {
1492     int len = get_uint32_MSBfirst(pvar->pageant_curkey + 4);
1493     char *s = (char *)malloc(len+1);
1494     enum hostkey_type keytype;
1495    
1496     memcpy(s, pvar->pageant_curkey+4+4, len);
1497     s[len] = '\0';
1498     keytype = get_keytype_from_name(s);
1499     if (keytype == KEY_RSA) {
1500     method = "RSA with Pageant";
1501     } else if (keytype == KEY_DSA) {
1502     method = "DSA with Pageant";
1503     }
1504     free(s);
1505     }
1506 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1507 maya 2992 _snprintf_s(dest, len, _TRUNCATE,
1508 maya 3003 pvar->ts->UIMsg, pvar->auth_state.user, method);
1509 yutakakn 2762 }
1510    
1511     }
1512    
1513 yutakakn 2728 } else {
1514 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1515 maya 2992 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1516 maya 3003 get_auth_method_name(pvar->auth_state.failed_method));
1517 yutakakn 2728 }
1518    
1519     dest[len - 1] = 0;
1520     }
1521    
1522     void AUTH_notify_disconnecting(PTInstVar pvar)
1523     {
1524     if (pvar->auth_state.auth_dialog != NULL) {
1525     PostMessage(pvar->auth_state.auth_dialog, WM_COMMAND, IDCANCEL, 0);
1526     /* the main window might not go away if it's not enabled. (see vtwin.cpp) */
1527     EnableWindow(pvar->NotificationWindow, TRUE);
1528     }
1529     }
1530    
1531     void AUTH_end(PTInstVar pvar)
1532     {
1533     destroy_malloced_string(&pvar->auth_state.user);
1534     destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1535    
1536     AUTH_destroy_cur_cred(pvar);
1537     }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26