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 3011 - (hide annotations) (download) (as text)
Sat Sep 22 16:10:45 2007 UTC (16 years, 6 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 42777 byte(s)
password 認証で keyboard-interactive を使用するのをやめた。
明示的に challange/response を選択する必要がある。

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

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