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 2992 - (hide annotations) (download) (as text)
Wed Aug 8 16:04:09 2007 UTC (16 years, 8 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 52238 byte(s)
安全な関数を使用するように変更した。

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

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