Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3023 - (show annotations) (download) (as text)
Wed Oct 3 16:19:17 2007 UTC (16 years, 6 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 45055 byte(s)
認証リストの取得前にユーザ名の長さもチェックするようにした。

1 /*
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 #include "ssh.h"
32
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 static HFONT DlgAuthFont;
46 static HFONT DlgTisFont;
47 static HFONT DlgAuthSetupFont;
48
49 void destroy_malloced_string(char FAR * FAR * str)
50 {
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 WPARAM wParam, LPARAM lParam)
65 {
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 (LPARAM) (char FAR *) chars);
73 return 0;
74 }
75 }
76
77 return CallWindowProc((WNDPROC) GetWindowLong(control, GWL_USERDATA),
78 control, msg, wParam, lParam);
79 }
80
81 static void init_password_control(HWND dlg)
82 {
83 HWND passwordControl = GetDlgItem(dlg, IDC_SSHPASSWORD);
84
85 SetWindowLong(passwordControl, GWL_USERDATA,
86 SetWindowLong(passwordControl, GWL_WNDPROC,
87 (LONG) password_wnd_proc));
88
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 char buf[1024], buf2[1024];
116
117 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, buf2, sizeof(buf2));
118 _snprintf_s(buf, sizeof(buf), _TRUNCATE, buf2, SSH_get_host_name(pvar));
119 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 control++) {
135 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 && (supported_methods & (1 << method)) != 0) {
143 enabled = TRUE;
144 }
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 char uimsg[MAX_UIMSG];
177
178 GetWindowText(dlg, uimsg, sizeof(uimsg));
179 UTIL_get_lang_msg("DLG_AUTH_TITLE", pvar, uimsg);
180 SetWindowText(dlg, pvar->ts->UIMsg);
181 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
182 UTIL_get_lang_msg("DLG_AUTH_BANNER", pvar, uimsg);
183 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
184 GetDlgItemText(dlg, IDC_SSHAUTHBANNER2, uimsg, sizeof(uimsg));
185 UTIL_get_lang_msg("DLG_AUTH_BANNER2", pvar, uimsg);
186 SetDlgItemText(dlg, IDC_SSHAUTHBANNER2, pvar->ts->UIMsg);
187 GetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, uimsg, sizeof(uimsg));
188 UTIL_get_lang_msg("DLG_AUTH_USERNAME", pvar, uimsg);
189 SetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, pvar->ts->UIMsg);
190 GetDlgItemText(dlg, IDC_SSHPASSWORDCAPTION, uimsg, sizeof(uimsg));
191 UTIL_get_lang_msg("DLG_AUTH_PASSWORD", pvar, uimsg);
192 SetDlgItemText(dlg, IDC_SSHPASSWORDCAPTION, pvar->ts->UIMsg);
193 GetDlgItemText(dlg, IDC_REMEMBER_PASSWORD, uimsg, sizeof(uimsg));
194 UTIL_get_lang_msg("DLG_AUTH_REMEMBER_PASSWORD", pvar, uimsg);
195 SetDlgItemText(dlg, IDC_REMEMBER_PASSWORD, pvar->ts->UIMsg);
196 GetDlgItemText(dlg, IDC_SSHUSEPASSWORD, uimsg, sizeof(uimsg));
197 UTIL_get_lang_msg("DLG_AUTH_METHOD_PASSWORD", pvar, uimsg);
198 SetDlgItemText(dlg, IDC_SSHUSEPASSWORD, pvar->ts->UIMsg);
199 GetDlgItemText(dlg, IDC_SSHUSERSA, uimsg, sizeof(uimsg));
200 UTIL_get_lang_msg("DLG_AUTH_METHOD_RSA", pvar, uimsg);
201 SetDlgItemText(dlg, IDC_SSHUSERSA, pvar->ts->UIMsg);
202 GetDlgItemText(dlg, IDC_SSHUSERHOSTS, uimsg, sizeof(uimsg));
203 UTIL_get_lang_msg("DLG_AUTH_METHOD_RHOST", pvar, uimsg);
204 SetDlgItemText(dlg, IDC_SSHUSERHOSTS, pvar->ts->UIMsg);
205 GetDlgItemText(dlg, IDC_CHOOSERSAFILE, uimsg, sizeof(uimsg));
206 UTIL_get_lang_msg("DLG_AUTH_PRIVATEKEY", pvar, uimsg);
207 SetDlgItemText(dlg, IDC_CHOOSERSAFILE, pvar->ts->UIMsg);
208 GetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, uimsg, sizeof(uimsg));
209 UTIL_get_lang_msg("DLG_AUTH_LOCALUSER", pvar, uimsg);
210 SetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, pvar->ts->UIMsg);
211 GetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, uimsg, sizeof(uimsg));
212 UTIL_get_lang_msg("DLG_AUTH_HOST_PRIVATEKEY", pvar, uimsg);
213 SetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, pvar->ts->UIMsg);
214 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
215 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
216 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
217 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
218 UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
219 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
220
221 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 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 SetWindowText(dlg, pvar->ts->UIMsg);
230 default_method = pvar->auth_state.failed_method;
231 }
232
233 set_auth_options_status(dlg,
234 auth_types_to_control_IDs[default_method]);
235
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 pvar->session_settings.DefaultUserName);
248 } else {
249 SetFocus(GetDlgItem(dlg, IDC_SSHUSERNAME));
250 }
251
252 SetDlgItemText(dlg, IDC_RSAFILENAME,
253 pvar->session_settings.DefaultRSAPrivateKeyFile);
254 SetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
255 pvar->session_settings.DefaultRhostsHostPrivateKeyFile);
256 SetDlgItemText(dlg, IDC_LOCALUSERNAME,
257 pvar->session_settings.DefaultRhostsLocalUserName);
258
259 update_server_supported_types(pvar, dlg);
260
261 // SSH2 autologin
262 // ���[�U�A�p�X���[�h�A�F�����\�b�h���������������A������������OK�{�^�������������B
263 //
264 // (2004.12.1 yutaka)
265 // (2005.1.26 yutaka) ���J���F���T�|�[�g
266 // �������O�C���������������A�������������������X���\ (2006.9.18 maya)
267 #if 0
268 if (pvar->ssh2_autologin == 1) {
269 #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
278 SetDlgItemText(dlg, IDC_SSHPASSWORD, pvar->ssh2_password);
279 if (pvar->ssh2_autologin == 1) {
280 EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORD), FALSE);
281 EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORDCAPTION), FALSE);
282 }
283
284 // '/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 if (pvar->ssh2_authmethod == SSH_AUTH_PASSWORD) {
292 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, IDC_SSHUSEPASSWORD);
293
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 if (pvar->ssh2_autologin == 1) {
299 EnableWindow(GetDlgItem(dlg, IDC_CHOOSERSAFILE), FALSE);
300 EnableWindow(GetDlgItem(dlg, IDC_RSAFILENAME), FALSE);
301 }
302
303 } else {
304 // TODO
305
306 }
307
308 if (pvar->ask4passwd == 1) {
309 SetFocus(GetDlgItem(dlg, IDC_SSHPASSWORD));
310 }
311 #if 0
312 }
313 #endif
314
315 #if 1
316 if (pvar->settings.ssh_protocol_version == 1) {
317 UTIL_get_lang_msg("DLG_AUTH_METHOD_CHALLENGE1", pvar,
318 "Use challenge/response to log in(&TIS)");
319 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
320 } else {
321 UTIL_get_lang_msg("DLG_AUTH_METHOD_CHALLENGE2", pvar,
322 "Use &challenge/response to log in(keyboard-interactive)");
323 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
324 }
325 #endif
326
327 // �p�X���[�h���o���������`�F�b�N�{�b�N�X�����f�t�H���g���L�������� (2006.8.3 yutaka)
328 if (pvar->ts_SSH->remember_password) {
329 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 }
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 static int get_key_file_name(HWND parent, char FAR * buf, int bufsize, PTInstVar pvar)
350 {
351 OPENFILENAME params;
352 char fullname_buf[2048] = "identity";
353 char filter[MAX_UIMSG];
354
355 ZeroMemory(&params, sizeof(params));
356 params.lStructSize = sizeof(OPENFILENAME);
357 params.hwndOwner = parent;
358 // �t�B���^������ (2004.12.19 yutaka)
359 // 3�t�@�C���t�B���^������ (2005.4.26 yutaka)
360 UTIL_get_lang_msg("FILEDLG_OPEN_PRIVATEKEY_FILTER", pvar,
361 "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 memcpy(filter, pvar->ts->UIMsg, sizeof(filter));
363 params.lpstrFilter = filter;
364 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 UTIL_get_lang_msg("FILEDLG_OPEN_PRIVATEKEY_TITLE", pvar,
372 "Choose a file with the RSA/DSA private key");
373 params.lpstrTitle = pvar->ts->UIMsg;
374 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 static void choose_RSA_key_file(HWND dlg, PTInstVar pvar)
387 {
388 char buf[1024];
389
390 if (get_key_file_name(dlg, buf, sizeof(buf), pvar)) {
391 SetDlgItemText(dlg, IDC_RSAFILENAME, buf);
392 }
393 }
394
395 static void choose_host_RSA_key_file(HWND dlg, PTInstVar pvar)
396 {
397 char buf[1024];
398
399 if (get_key_file_name(dlg, buf, sizeof(buf), pvar)) {
400 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 UTIL_get_lang_msg("MSG_KEYSPECIFY_ERROR", pvar,
432 "You must specify a file containing the RSA/DSA private key.");
433 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
434 SetFocus(GetDlgItem(dlg, file_ctl_ID));
435 destroy_malloced_string(&password);
436 return FALSE;
437 }
438
439 if (SSHv1(pvar)) {
440 BOOL invalid_passphrase = FALSE;
441
442 key_pair = KEYFILES_read_private_key(pvar, buf, password,
443 &invalid_passphrase,
444 FALSE);
445
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
459 } else { // SSH2(yutaka)
460 BOOL invalid_passphrase = FALSE;
461 char errmsg[256];
462
463 memset(errmsg, 0, sizeof(errmsg));
464 //GetCurrentDirectory(sizeof(errmsg), errmsg);
465
466 key_pair = read_SSH2_private_key(pvar, buf, password,
467 &invalid_passphrase,
468 FALSE,
469 errmsg,
470 sizeof(errmsg)
471 );
472
473 if (key_pair == NULL) { // read error
474 char buf[1024];
475 UTIL_get_lang_msg("MSG_READKEY_ERROR", pvar,
476 "read error SSH2 private key file\r\n%s");
477 _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, errmsg);
478 notify_nonfatal_error(pvar, buf);
479 // �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 destroy_malloced_string(&password);
489 return FALSE;
490 }
491
492 }
493
494 }
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
506 // �p�X���[�h���������������������������� (2006.8.3 yutaka)
507 if (SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_GETCHECK, 0,0) == BST_CHECKED) {
508 pvar->settings.remember_password = 1; // �o��������
509 pvar->ts_SSH->remember_password = 1;
510 } else {
511 pvar->settings.remember_password = 0; // ���������������Y����
512 pvar->ts_SSH->remember_password = 0;
513 }
514
515 // ���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 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 UTIL_get_lang_msg("MSG_RHOSTS_NOTDEFAULT_ERROR", pvar,
525 "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 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
532 }
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 pvar->session_settings.DefaultRSAPrivateKeyFile,
541 sizeof(pvar->session_settings.
542 DefaultRSAPrivateKeyFile));
543 GetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
544 pvar->session_settings.DefaultRhostsHostPrivateKeyFile,
545 sizeof(pvar->session_settings.
546 DefaultRhostsHostPrivateKeyFile));
547 GetDlgItemText(dlg, IDC_LOCALUSERNAME,
548 pvar->session_settings.DefaultRhostsLocalUserName,
549 sizeof(pvar->session_settings.
550 DefaultRhostsLocalUserName));
551
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 if (DlgAuthFont != NULL) {
562 DeleteObject(DlgAuthFont);
563 }
564
565 return TRUE;
566 }
567
568 static BOOL CALLBACK auth_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
569 LPARAM lParam)
570 {
571 const int IDC_TIMER1 = 300;
572 const int IDC_TIMER2 = 301;
573 const int autologin_timeout = 10; // �~���b
574 PTInstVar pvar;
575 LOGFONT logfont;
576 HFONT font;
577
578 switch (msg) {
579 case WM_INITDIALOG:
580 pvar = (PTInstVar) lParam;
581 pvar->auth_state.auth_dialog = dlg;
582 SetWindowLong(dlg, DWL_USER, lParam);
583
584 init_auth_dlg(pvar, dlg);
585
586 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
587 GetObject(font, sizeof(LOGFONT), &logfont);
588 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthFont, pvar)) {
589 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
590 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
591 SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
592 SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
593 SendDlgItemMessage(dlg, IDC_SSHPASSWORDCAPTION, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
594 SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
595 SendDlgItemMessage(dlg, IDC_REMEMBER_PASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
596 SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
597 SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
598 SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
599 SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
600 SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
601 SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
602 SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
603 SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
604 SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
605 SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
606 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
607 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
608 }
609 else {
610 DlgAuthFont = NULL;
611 }
612
613 // SSH2 autologin���L�����������A�^�C�}���d�|�����B (2004.12.1 yutaka)
614 if (pvar->ssh2_autologin == 1) {
615 SetTimer(dlg, IDC_TIMER1, autologin_timeout, 0);
616 }
617 else {
618 // �T�|�[�g�������������\�b�h���`�F�b�N�����B(2007.9.24 maya)
619 // �������L�����A�����������s�����������A���[�U�����m����������
620 if (pvar->session_settings.CheckAuthListFirst &&
621 !pvar->tryed_ssh2_authlist) {
622 // �_�C�A���O�����[�U�������f
623 if (pvar->auth_state.user == NULL) {
624 pvar->auth_state.user =
625 alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
626 }
627 if (strlen(pvar->auth_state.user) > 0) {
628 SetTimer(dlg, IDC_TIMER2, autologin_timeout, 0);
629 }
630 else {
631 // ���[�U���� KILLFOCUS �����`�F�b�N��������
632 pvar->auth_state.user = NULL;
633 }
634 }
635 }
636 return FALSE; /* because we set the focus */
637
638 case WM_TIMER:
639 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
640 // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2004.12.16 yutaka)
641 if (wParam == IDC_TIMER1) {
642 // �������O�C��������
643 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
644 (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
645 KillTimer(dlg, IDC_TIMER1);
646 SendMessage(dlg, WM_COMMAND, IDOK, 0);
647 }
648 }
649 else if (wParam == IDC_TIMER2) {
650 // authlist ����������
651 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
652 (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
653 // WM_INITDIALOG ���_�����v���g�R���o�[�W����������������
654 if (SSHv2(pvar)) {
655 KillTimer(dlg, IDC_TIMER2);
656
657 // ���[�U�������X��������
658 EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
659
660 // none ������
661 do_SSH2_userauth(pvar);
662 }
663 else {
664 // SSH2 ������������ none ����������
665 KillTimer(dlg, IDC_TIMER2);
666 }
667 }
668 }
669 return FALSE;
670
671 case WM_COMMAND:
672 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
673
674 switch (LOWORD(wParam)) {
675 case IDOK:
676 // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2001.1.25 yutaka)
677 if (pvar->userauth_retry_count == 0 &&
678 ((pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) ||
679 !(pvar->ssh_state.status_flags & STATUS_HOST_OK))) {
680 return FALSE;
681 }
682
683 return end_auth_dlg(pvar, dlg);
684
685 case IDCANCEL: /* kill the connection */
686 pvar->auth_state.auth_dialog = NULL;
687 notify_closed_connection(pvar);
688 EndDialog(dlg, 0);
689
690 if (DlgAuthFont != NULL) {
691 DeleteObject(DlgAuthFont);
692 }
693
694 return TRUE;
695
696 case IDC_SSHUSERNAME:
697 // ���[�U�����t�H�[�J�X������������ (2007.9.29 maya)
698 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
699 (pvar->ssh_state.status_flags & STATUS_HOST_OK) &&
700 HIWORD(wParam) == EN_KILLFOCUS) {
701 // �������L���������������s��������������
702 if (SSHv2(pvar) &&
703 pvar->session_settings.CheckAuthListFirst &&
704 !pvar->tryed_ssh2_authlist) {
705 // �_�C�A���O�����[�U�������f
706 if (pvar->auth_state.user == NULL) {
707 pvar->auth_state.user =
708 alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
709 }
710
711 // ���[�U���������������������`�F�b�N����
712 if (strlen(pvar->auth_state.user) == 0) {
713 return FALSE;
714 }
715
716 // ���[�U�������X��������
717 EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
718
719 // none ������
720 do_SSH2_userauth(pvar);
721 return TRUE;
722 }
723 }
724
725 return FALSE;
726
727 case IDC_SSHUSEPASSWORD:
728 case IDC_SSHUSERSA:
729 case IDC_SSHUSERHOSTS:
730 case IDC_SSHUSETIS:
731 set_auth_options_status(dlg, LOWORD(wParam));
732 return TRUE;
733
734 case IDC_CHOOSERSAFILE:
735 choose_RSA_key_file(dlg, pvar);
736 return TRUE;
737
738 case IDC_CHOOSEHOSTRSAFILE:
739 choose_host_RSA_key_file(dlg, pvar);
740 return TRUE;
741
742 default:
743 return FALSE;
744 }
745
746 default:
747 return FALSE;
748 }
749 }
750
751 char FAR *AUTH_get_user_name(PTInstVar pvar)
752 {
753 return pvar->auth_state.user;
754 }
755
756 int AUTH_set_supported_auth_types(PTInstVar pvar, int types)
757 {
758 char buf[1024];
759
760 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
761 "Server reports supported authentication method mask = %d",
762 types);
763 buf[sizeof(buf) - 1] = 0;
764 notify_verbose_message(pvar, buf, LOG_LEVEL_VERBOSE);
765
766 if (SSHv1(pvar)) {
767 types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
768 | (1 << SSH_AUTH_RHOSTS_RSA) | (1 << SSH_AUTH_RHOSTS)
769 | (1 << SSH_AUTH_TIS);
770 } else {
771 // for SSH2(yutaka)
772 // types &= (1 << SSH_AUTH_PASSWORD);
773 // ���J���F�����L�������� (2004.12.18 yutaka)
774 // TIS�������BSSH2����keyboard-interactive�����������B(2005.3.12 yutaka)
775 types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
776 | (1 << SSH_AUTH_DSA)
777 | (1 << SSH_AUTH_TIS);
778 }
779 pvar->auth_state.supported_types = types;
780
781 if (types == 0) {
782 UTIL_get_lang_msg("MSG_NOAUTHMETHOD_ERROR", pvar,
783 "Server does not support any of the authentication options\n"
784 "provided by TTSSH. This connection will now close.");
785 notify_fatal_error(pvar, pvar->ts->UIMsg);
786 return 0;
787 } else {
788 if (pvar->auth_state.auth_dialog != NULL) {
789 update_server_supported_types(pvar,
790 pvar->auth_state.auth_dialog);
791 }
792
793 return 1;
794 }
795 }
796
797 static void start_user_auth(PTInstVar pvar)
798 {
799 // �F���_�C�A���O���\�������� (2004.12.1 yutaka)
800 PostMessage(pvar->NotificationWindow, WM_COMMAND, (WPARAM) ID_SSHAUTH,
801 (LPARAM) NULL);
802 pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
803 }
804
805 static void try_default_auth(PTInstVar pvar)
806 {
807 if (pvar->session_settings.TryDefaultAuth) {
808 switch (pvar->session_settings.DefaultAuthMethod) {
809 case SSH_AUTH_RSA:{
810 BOOL invalid_passphrase;
811 char password[] = "";
812
813 pvar->auth_state.cur_cred.key_pair
814 =
815 KEYFILES_read_private_key(pvar,
816 pvar->session_settings.
817 DefaultRSAPrivateKeyFile,
818 password,
819 &invalid_passphrase, TRUE);
820 if (pvar->auth_state.cur_cred.key_pair == NULL) {
821 return;
822 } else {
823 pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
824 }
825 break;
826 }
827
828 case SSH_AUTH_RHOSTS:
829 if (pvar->session_settings.
830 DefaultRhostsHostPrivateKeyFile[0] != 0) {
831 BOOL invalid_passphrase;
832 char password[] = "";
833
834 pvar->auth_state.cur_cred.key_pair
835 =
836 KEYFILES_read_private_key(pvar,
837 pvar->session_settings.
838 DefaultRhostsHostPrivateKeyFile,
839 password,
840 &invalid_passphrase, TRUE);
841 if (pvar->auth_state.cur_cred.key_pair == NULL) {
842 return;
843 } else {
844 pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS_RSA;
845 }
846 } else {
847 pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS;
848 }
849
850 pvar->auth_state.cur_cred.rhosts_client_user =
851 _strdup(pvar->session_settings.DefaultRhostsLocalUserName);
852 break;
853
854 case SSH_AUTH_PASSWORD:
855 pvar->auth_state.cur_cred.password = _strdup("");
856 pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
857 break;
858
859 case SSH_AUTH_TIS:
860 default:
861 return;
862 }
863
864 pvar->auth_state.user =
865 _strdup(pvar->session_settings.DefaultUserName);
866 }
867 }
868
869 void AUTH_notify_end_error(PTInstVar pvar)
870 {
871 if ((pvar->auth_state.flags & AUTH_START_USER_AUTH_ON_ERROR_END) != 0) {
872 start_user_auth(pvar);
873 pvar->auth_state.flags &= ~AUTH_START_USER_AUTH_ON_ERROR_END;
874 }
875 }
876
877 void AUTH_advance_to_next_cred(PTInstVar pvar)
878 {
879 pvar->auth_state.failed_method = pvar->auth_state.cur_cred.method;
880
881 if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
882 try_default_auth(pvar);
883
884 if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
885 if (pvar->err_msg != NULL) {
886 pvar->auth_state.flags |=
887 AUTH_START_USER_AUTH_ON_ERROR_END;
888 } else {
889 // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
890 // �R�}���h���C���w������������
891 start_user_auth(pvar);
892 }
893 }
894 } else {
895 // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
896 // �R�}���h���C���w������(/auth=xxxx)������
897 start_user_auth(pvar);
898 }
899 }
900
901 static void init_TIS_dlg(PTInstVar pvar, HWND dlg)
902 {
903 char uimsg[MAX_UIMSG];
904
905 GetWindowText(dlg, uimsg, sizeof(uimsg));
906 UTIL_get_lang_msg("DLG_TIS_TITLE", pvar, uimsg);
907 SetWindowText(dlg, pvar->ts->UIMsg);
908 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
909 UTIL_get_lang_msg("DLG_TIS_BANNER", pvar, uimsg);
910 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
911 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
912 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
913 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
914 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
915 UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
916 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
917
918 init_auth_machine_banner(pvar, dlg);
919 init_password_control(dlg);
920
921 if (pvar->auth_state.TIS_prompt != NULL) {
922 if (strlen(pvar->auth_state.TIS_prompt) > 10000) {
923 pvar->auth_state.TIS_prompt[10000] = 0;
924 }
925 SetDlgItemText(dlg, IDC_SSHAUTHBANNER2,
926 pvar->auth_state.TIS_prompt);
927 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
928 }
929 }
930
931 static BOOL end_TIS_dlg(PTInstVar pvar, HWND dlg)
932 {
933 char FAR *password =
934 alloc_control_text(GetDlgItem(dlg, IDC_SSHPASSWORD));
935
936 pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
937 pvar->auth_state.cur_cred.password = password;
938 pvar->auth_state.auth_dialog = NULL;
939
940 // add
941 if (SSHv2(pvar)) {
942 pvar->keyboard_interactive_password_input = 1;
943 handle_SSH2_userauth_inforeq(pvar);
944 }
945
946 SSH_notify_cred(pvar);
947
948 EndDialog(dlg, 1);
949 return TRUE;
950 }
951
952 static BOOL CALLBACK TIS_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
953 LPARAM lParam)
954 {
955 PTInstVar pvar;
956 LOGFONT logfont;
957 HFONT font;
958
959 switch (msg) {
960 case WM_INITDIALOG:
961 pvar = (PTInstVar) lParam;
962 pvar->auth_state.auth_dialog = dlg;
963 SetWindowLong(dlg, DWL_USER, lParam);
964
965 init_TIS_dlg(pvar, dlg);
966
967 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
968 GetObject(font, sizeof(LOGFONT), &logfont);
969 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgTisFont, pvar)) {
970 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
971 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
972 SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
973 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
974 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
975 }
976 else {
977 DlgTisFont = NULL;
978 }
979
980 return FALSE; /* because we set the focus */
981
982 case WM_COMMAND:
983 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
984
985 switch (LOWORD(wParam)) {
986 case IDOK:
987 if (DlgTisFont != NULL) {
988 DeleteObject(DlgTisFont);
989 }
990
991 return end_TIS_dlg(pvar, dlg);
992
993 case IDCANCEL: /* kill the connection */
994 pvar->auth_state.auth_dialog = NULL;
995 notify_closed_connection(pvar);
996 EndDialog(dlg, 0);
997
998 if (DlgTisFont != NULL) {
999 DeleteObject(DlgTisFont);
1000 }
1001
1002 return TRUE;
1003
1004 default:
1005 return FALSE;
1006 }
1007
1008 default:
1009 return FALSE;
1010 }
1011 }
1012
1013 void AUTH_do_cred_dialog(PTInstVar pvar)
1014 {
1015 if (pvar->auth_state.auth_dialog == NULL) {
1016 HWND cur_active = GetActiveWindow();
1017 DLGPROC dlg_proc;
1018 LPCTSTR dialog_template;
1019
1020 switch (pvar->auth_state.mode) {
1021 case TIS_AUTH_MODE:
1022 dialog_template = MAKEINTRESOURCE(IDD_SSHTISAUTH);
1023 dlg_proc = TIS_dlg_proc;
1024 break;
1025 case GENERIC_AUTH_MODE:
1026 default:
1027 dialog_template = MAKEINTRESOURCE(IDD_SSHAUTH);
1028 dlg_proc = auth_dlg_proc;
1029 }
1030
1031 if (!DialogBoxParam(hInst, dialog_template,
1032 cur_active !=
1033 NULL ? cur_active : pvar->NotificationWindow,
1034 dlg_proc, (LPARAM) pvar) == -1) {
1035 UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTH_ERROR", pvar,
1036 "Unable to display authentication dialog box.\n"
1037 "Connection terminated.");
1038 notify_fatal_error(pvar, pvar->ts->UIMsg);
1039 }
1040 }
1041 }
1042
1043 static void init_default_auth_dlg(PTInstVar pvar, HWND dlg)
1044 {
1045 char uimsg[MAX_UIMSG];
1046
1047 GetWindowText(dlg, uimsg, sizeof(uimsg));
1048 UTIL_get_lang_msg("DLG_AUTHSETUP_TITLE", pvar, uimsg);
1049 SetWindowText(dlg, pvar->ts->UIMsg);
1050 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
1051 UTIL_get_lang_msg("DLG_AUTHSETUP_BANNER", pvar, uimsg);
1052 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
1053 GetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, uimsg, sizeof(uimsg));
1054 UTIL_get_lang_msg("DLG_AUTHSETUP_USERNAME", pvar, uimsg);
1055 SetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, pvar->ts->UIMsg);
1056 GetDlgItemText(dlg, IDC_SSHUSEPASSWORD, uimsg, sizeof(uimsg));
1057 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PASSWORD", pvar, uimsg);
1058 SetDlgItemText(dlg, IDC_SSHUSEPASSWORD, pvar->ts->UIMsg);
1059 GetDlgItemText(dlg, IDC_SSHUSERSA, uimsg, sizeof(uimsg));
1060 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RSA", pvar, uimsg);
1061 SetDlgItemText(dlg, IDC_SSHUSERSA, pvar->ts->UIMsg);
1062 GetDlgItemText(dlg, IDC_SSHUSERHOSTS, uimsg, sizeof(uimsg));
1063 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RHOST", pvar, uimsg);
1064 SetDlgItemText(dlg, IDC_SSHUSERHOSTS, pvar->ts->UIMsg);
1065 GetDlgItemText(dlg, IDC_SSHUSETIS, uimsg, sizeof(uimsg));
1066 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_CHALLENGE", pvar, uimsg);
1067 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
1068 GetDlgItemText(dlg, IDC_CHOOSERSAFILE, uimsg, sizeof(uimsg));
1069 UTIL_get_lang_msg("DLG_AUTH_PRIVATEKEY", pvar, uimsg);
1070 SetDlgItemText(dlg, IDC_CHOOSERSAFILE, pvar->ts->UIMsg);
1071 GetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, uimsg, sizeof(uimsg));
1072 UTIL_get_lang_msg("DLG_AUTH_LOCALUSER", pvar, uimsg);
1073 SetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, pvar->ts->UIMsg);
1074 GetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, uimsg, sizeof(uimsg));
1075 UTIL_get_lang_msg("DLG_AUTH_HOST_PRIVATEKEY", pvar, uimsg);
1076 SetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, pvar->ts->UIMsg);
1077 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1078 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1079 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1080 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1081 UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
1082 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1083
1084 switch (pvar->settings.DefaultAuthMethod) {
1085 case SSH_AUTH_RSA:
1086 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1087 IDC_SSHUSERSA);
1088 break;
1089 case SSH_AUTH_RHOSTS:
1090 case SSH_AUTH_RHOSTS_RSA:
1091 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1092 IDC_SSHUSERHOSTS);
1093 break;
1094 case SSH_AUTH_TIS:
1095 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1096 IDC_SSHUSETIS);
1097 break;
1098 case SSH_AUTH_PASSWORD:
1099 default:
1100 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1101 IDC_SSHUSEPASSWORD);
1102 }
1103
1104 SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName);
1105 SetDlgItemText(dlg, IDC_RSAFILENAME,
1106 pvar->settings.DefaultRSAPrivateKeyFile);
1107 SetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1108 pvar->settings.DefaultRhostsHostPrivateKeyFile);
1109 SetDlgItemText(dlg, IDC_LOCALUSERNAME,
1110 pvar->settings.DefaultRhostsLocalUserName);
1111 }
1112
1113 static BOOL end_default_auth_dlg(PTInstVar pvar, HWND dlg)
1114 {
1115 if (IsDlgButtonChecked(dlg, IDC_SSHUSERSA)) {
1116 pvar->settings.DefaultAuthMethod = SSH_AUTH_RSA;
1117 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSERHOSTS)) {
1118 if (GetWindowTextLength(GetDlgItem(dlg, IDC_HOSTRSAFILENAME)) > 0) {
1119 pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS_RSA;
1120 } else {
1121 pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS;
1122 }
1123 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSETIS)) {
1124 pvar->settings.DefaultAuthMethod = SSH_AUTH_TIS;
1125 } else {
1126 pvar->settings.DefaultAuthMethod = SSH_AUTH_PASSWORD;
1127 }
1128
1129 GetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName,
1130 sizeof(pvar->settings.DefaultUserName));
1131 GetDlgItemText(dlg, IDC_RSAFILENAME,
1132 pvar->settings.DefaultRSAPrivateKeyFile,
1133 sizeof(pvar->settings.DefaultRSAPrivateKeyFile));
1134 GetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1135 pvar->settings.DefaultRhostsHostPrivateKeyFile,
1136 sizeof(pvar->settings.DefaultRhostsHostPrivateKeyFile));
1137 GetDlgItemText(dlg, IDC_LOCALUSERNAME,
1138 pvar->settings.DefaultRhostsLocalUserName,
1139 sizeof(pvar->settings.DefaultRhostsLocalUserName));
1140
1141 EndDialog(dlg, 1);
1142 return TRUE;
1143 }
1144
1145 static BOOL CALLBACK default_auth_dlg_proc(HWND dlg, UINT msg,
1146 WPARAM wParam, LPARAM lParam)
1147 {
1148 PTInstVar pvar;
1149 LOGFONT logfont;
1150 HFONT font;
1151
1152 switch (msg) {
1153 case WM_INITDIALOG:
1154 pvar = (PTInstVar) lParam;
1155 SetWindowLong(dlg, DWL_USER, lParam);
1156
1157 init_default_auth_dlg(pvar, dlg);
1158
1159 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1160 GetObject(font, sizeof(LOGFONT), &logfont);
1161 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthSetupFont, pvar)) {
1162 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1163 SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1164 SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1165 SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1166 SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1167 SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1168 SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1169 SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1170 SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1171 SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1172 SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1173 SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1174 SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1175 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1176 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1177 }
1178 else {
1179 DlgAuthSetupFont = NULL;
1180 }
1181
1182 return TRUE; /* because we do not set the focus */
1183
1184 case WM_COMMAND:
1185 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1186
1187 switch (LOWORD(wParam)) {
1188 case IDOK:
1189
1190 if (DlgAuthSetupFont != NULL) {
1191 DeleteObject(DlgAuthSetupFont);
1192 }
1193
1194 return end_default_auth_dlg(pvar, dlg);
1195
1196 case IDCANCEL:
1197 EndDialog(dlg, 0);
1198
1199 if (DlgAuthSetupFont != NULL) {
1200 DeleteObject(DlgAuthSetupFont);
1201 }
1202
1203 return TRUE;
1204
1205 case IDC_CHOOSERSAFILE:
1206 choose_RSA_key_file(dlg, pvar);
1207 return TRUE;
1208
1209 case IDC_CHOOSEHOSTRSAFILE:
1210 choose_host_RSA_key_file(dlg, pvar);
1211 return TRUE;
1212
1213 default:
1214 return FALSE;
1215 }
1216
1217 default:
1218 return FALSE;
1219 }
1220 }
1221
1222 void AUTH_init(PTInstVar pvar)
1223 {
1224 pvar->auth_state.failed_method = SSH_AUTH_NONE;
1225 pvar->auth_state.auth_dialog = NULL;
1226 pvar->auth_state.user = NULL;
1227 pvar->auth_state.flags = 0;
1228 pvar->auth_state.TIS_prompt = NULL;
1229 pvar->auth_state.supported_types = 0;
1230 pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
1231 pvar->auth_state.cur_cred.password = NULL;
1232 pvar->auth_state.cur_cred.rhosts_client_user = NULL;
1233 pvar->auth_state.cur_cred.key_pair = NULL;
1234 AUTH_set_generic_mode(pvar);
1235 }
1236
1237 void AUTH_set_generic_mode(PTInstVar pvar)
1238 {
1239 pvar->auth_state.mode = GENERIC_AUTH_MODE;
1240 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1241 }
1242
1243 void AUTH_set_TIS_mode(PTInstVar pvar, char FAR * prompt, int len)
1244 {
1245 if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1246 pvar->auth_state.mode = TIS_AUTH_MODE;
1247
1248 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1249 pvar->auth_state.TIS_prompt = malloc(len + 1);
1250 memcpy(pvar->auth_state.TIS_prompt, prompt, len);
1251 pvar->auth_state.TIS_prompt[len] = 0;
1252 } else {
1253 AUTH_set_generic_mode(pvar);
1254 }
1255 }
1256
1257 void AUTH_do_default_cred_dialog(PTInstVar pvar)
1258 {
1259 HWND cur_active = GetActiveWindow();
1260
1261 if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHAUTHSETUP),
1262 cur_active != NULL ? cur_active
1263 : pvar->NotificationWindow,
1264 default_auth_dlg_proc, (LPARAM) pvar) == -1) {
1265 UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTHSETUP_ERROR", pvar,
1266 "Unable to display authentication setup dialog box.");
1267 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1268 }
1269 }
1270
1271 void AUTH_destroy_cur_cred(PTInstVar pvar)
1272 {
1273 destroy_malloced_string(&pvar->auth_state.cur_cred.password);
1274 destroy_malloced_string(&pvar->auth_state.cur_cred.rhosts_client_user);
1275 if (pvar->auth_state.cur_cred.key_pair != NULL) {
1276 CRYPT_free_key_pair(pvar->auth_state.cur_cred.key_pair);
1277 pvar->auth_state.cur_cred.key_pair = NULL;
1278 }
1279 }
1280
1281 static char FAR *get_auth_method_name(SSHAuthMethod auth)
1282 {
1283 switch (auth) {
1284 case SSH_AUTH_PASSWORD:
1285 return "password";
1286 case SSH_AUTH_RSA:
1287 return "RSA";
1288 case SSH_AUTH_RHOSTS:
1289 return "rhosts";
1290 case SSH_AUTH_RHOSTS_RSA:
1291 return "rhosts with RSA";
1292 case SSH_AUTH_TIS:
1293 return "challenge/response (TIS)";
1294 default:
1295 return "unknown method";
1296 }
1297 }
1298
1299 void AUTH_get_auth_info(PTInstVar pvar, char FAR * dest, int len)
1300 {
1301 char *method = "unknown";
1302
1303 if (pvar->auth_state.user == NULL) {
1304 strncpy_s(dest, len, "None", _TRUNCATE);
1305 } else if (pvar->auth_state.cur_cred.method != SSH_AUTH_NONE) {
1306 if (SSHv1(pvar)) {
1307 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1308 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1309 get_auth_method_name(pvar->auth_state.cur_cred.method));
1310
1311 } else {
1312 // SSH2:�F�����\�b�h������ (2004.12.23 yutaka)
1313 // keyboard-interactive���\�b�h������ (2005.3.12 yutaka)
1314 if (pvar->auth_state.cur_cred.method == SSH_AUTH_PASSWORD ||
1315 pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1316 // keyboard-interactive���\�b�h������ (2005.1.24 yutaka)
1317 if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1318 method = "keyboard-interactive";
1319 } else {
1320 method = get_auth_method_name(pvar->auth_state.cur_cred.method);
1321 }
1322 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1323 _snprintf_s(dest, len, _TRUNCATE,
1324 pvar->ts->UIMsg, pvar->auth_state.user, method);
1325
1326 } else {
1327 if (pvar->auth_state.cur_cred.key_pair->RSA_key != NULL) {
1328 method = "RSA";
1329 } else if (pvar->auth_state.cur_cred.key_pair->DSA_key != NULL) {
1330 method = "DSA";
1331 }
1332 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1333 _snprintf_s(dest, len, _TRUNCATE,
1334 pvar->ts->UIMsg, pvar->auth_state.user, method);
1335 }
1336
1337 }
1338
1339 } else {
1340 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1341 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1342 get_auth_method_name(pvar->auth_state.failed_method));
1343 }
1344
1345 dest[len - 1] = 0;
1346 }
1347
1348 void AUTH_notify_disconnecting(PTInstVar pvar)
1349 {
1350 if (pvar->auth_state.auth_dialog != NULL) {
1351 PostMessage(pvar->auth_state.auth_dialog, WM_COMMAND, IDCANCEL, 0);
1352 /* the main window might not go away if it's not enabled. (see vtwin.cpp) */
1353 EnableWindow(pvar->NotificationWindow, TRUE);
1354 }
1355 }
1356
1357 void AUTH_end(PTInstVar pvar)
1358 {
1359 destroy_malloced_string(&pvar->auth_state.user);
1360 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1361
1362 AUTH_destroy_cur_cred(pvar);
1363 }

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