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

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