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 3015 - (show annotations) (download) (as text)
Sun Sep 30 14:03:02 2007 UTC (16 years, 6 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 44696 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 KillTimer(dlg, IDC_TIMER1);
645 SendMessage(dlg, WM_COMMAND, IDOK, 0);
646 }
647 }
648 else if (wParam == IDC_TIMER2) {
649 // authlist ����������
650 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME)) {
651 // WM_INITDIALOG ���_�����v���g�R���o�[�W����������������
652 if (SSHv2(pvar)) {
653 KillTimer(dlg, IDC_TIMER2);
654
655 // ���[�U�������X��������
656 EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
657
658 // none ������
659 do_SSH2_userauth(pvar);
660 }
661 else {
662 // SSH2 ������������ none ����������
663 KillTimer(dlg, IDC_TIMER2);
664 }
665 }
666 }
667 return FALSE;
668
669 case WM_COMMAND:
670 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
671
672 switch (LOWORD(wParam)) {
673 case IDOK:
674 // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2001.1.25 yutaka)
675 if (pvar->userauth_retry_count == 0 && (pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME)) {
676 return FALSE;
677 }
678
679 return end_auth_dlg(pvar, dlg);
680
681 case IDCANCEL: /* kill the connection */
682 pvar->auth_state.auth_dialog = NULL;
683 notify_closed_connection(pvar);
684 EndDialog(dlg, 0);
685
686 if (DlgAuthFont != NULL) {
687 DeleteObject(DlgAuthFont);
688 }
689
690 return TRUE;
691
692 case IDC_SSHUSERNAME:
693 // ���[�U�����t�H�[�J�X������������ (2007.9.29 maya)
694 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
695 HIWORD(wParam) == EN_KILLFOCUS) {
696 // �������L���������������s��������������
697 if (SSHv2(pvar) &&
698 pvar->session_settings.CheckAuthListFirst &&
699 !pvar->tryed_ssh2_authlist) {
700 // �_�C�A���O�����[�U�������f
701 if (pvar->auth_state.user == NULL) {
702 pvar->auth_state.user =
703 alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
704 }
705
706 // ���[�U�������X��������
707 EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
708
709 // none ������
710 do_SSH2_userauth(pvar);
711 return TRUE;
712 }
713 }
714
715 return FALSE;
716
717 case IDC_SSHUSEPASSWORD:
718 case IDC_SSHUSERSA:
719 case IDC_SSHUSERHOSTS:
720 case IDC_SSHUSETIS:
721 set_auth_options_status(dlg, LOWORD(wParam));
722 return TRUE;
723
724 case IDC_CHOOSERSAFILE:
725 choose_RSA_key_file(dlg, pvar);
726 return TRUE;
727
728 case IDC_CHOOSEHOSTRSAFILE:
729 choose_host_RSA_key_file(dlg, pvar);
730 return TRUE;
731
732 default:
733 return FALSE;
734 }
735
736 default:
737 return FALSE;
738 }
739 }
740
741 char FAR *AUTH_get_user_name(PTInstVar pvar)
742 {
743 return pvar->auth_state.user;
744 }
745
746 int AUTH_set_supported_auth_types(PTInstVar pvar, int types)
747 {
748 char buf[1024];
749
750 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
751 "Server reports supported authentication method mask = %d",
752 types);
753 buf[sizeof(buf) - 1] = 0;
754 notify_verbose_message(pvar, buf, LOG_LEVEL_VERBOSE);
755
756 if (SSHv1(pvar)) {
757 types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
758 | (1 << SSH_AUTH_RHOSTS_RSA) | (1 << SSH_AUTH_RHOSTS)
759 | (1 << SSH_AUTH_TIS);
760 } else {
761 // for SSH2(yutaka)
762 // types &= (1 << SSH_AUTH_PASSWORD);
763 // ���J���F�����L�������� (2004.12.18 yutaka)
764 // TIS�������BSSH2����keyboard-interactive�����������B(2005.3.12 yutaka)
765 types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
766 | (1 << SSH_AUTH_DSA)
767 | (1 << SSH_AUTH_TIS);
768 }
769 pvar->auth_state.supported_types = types;
770
771 if (types == 0) {
772 UTIL_get_lang_msg("MSG_NOAUTHMETHOD_ERROR", pvar,
773 "Server does not support any of the authentication options\n"
774 "provided by TTSSH. This connection will now close.");
775 notify_fatal_error(pvar, pvar->ts->UIMsg);
776 return 0;
777 } else {
778 if (pvar->auth_state.auth_dialog != NULL) {
779 update_server_supported_types(pvar,
780 pvar->auth_state.auth_dialog);
781 }
782
783 return 1;
784 }
785 }
786
787 static void start_user_auth(PTInstVar pvar)
788 {
789 // �F���_�C�A���O���\�������� (2004.12.1 yutaka)
790 PostMessage(pvar->NotificationWindow, WM_COMMAND, (WPARAM) ID_SSHAUTH,
791 (LPARAM) NULL);
792 pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
793 }
794
795 static void try_default_auth(PTInstVar pvar)
796 {
797 if (pvar->session_settings.TryDefaultAuth) {
798 switch (pvar->session_settings.DefaultAuthMethod) {
799 case SSH_AUTH_RSA:{
800 BOOL invalid_passphrase;
801 char password[] = "";
802
803 pvar->auth_state.cur_cred.key_pair
804 =
805 KEYFILES_read_private_key(pvar,
806 pvar->session_settings.
807 DefaultRSAPrivateKeyFile,
808 password,
809 &invalid_passphrase, TRUE);
810 if (pvar->auth_state.cur_cred.key_pair == NULL) {
811 return;
812 } else {
813 pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
814 }
815 break;
816 }
817
818 case SSH_AUTH_RHOSTS:
819 if (pvar->session_settings.
820 DefaultRhostsHostPrivateKeyFile[0] != 0) {
821 BOOL invalid_passphrase;
822 char password[] = "";
823
824 pvar->auth_state.cur_cred.key_pair
825 =
826 KEYFILES_read_private_key(pvar,
827 pvar->session_settings.
828 DefaultRhostsHostPrivateKeyFile,
829 password,
830 &invalid_passphrase, TRUE);
831 if (pvar->auth_state.cur_cred.key_pair == NULL) {
832 return;
833 } else {
834 pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS_RSA;
835 }
836 } else {
837 pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS;
838 }
839
840 pvar->auth_state.cur_cred.rhosts_client_user =
841 _strdup(pvar->session_settings.DefaultRhostsLocalUserName);
842 break;
843
844 case SSH_AUTH_PASSWORD:
845 pvar->auth_state.cur_cred.password = _strdup("");
846 pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
847 break;
848
849 case SSH_AUTH_TIS:
850 default:
851 return;
852 }
853
854 pvar->auth_state.user =
855 _strdup(pvar->session_settings.DefaultUserName);
856 }
857 }
858
859 void AUTH_notify_end_error(PTInstVar pvar)
860 {
861 if ((pvar->auth_state.flags & AUTH_START_USER_AUTH_ON_ERROR_END) != 0) {
862 start_user_auth(pvar);
863 pvar->auth_state.flags &= ~AUTH_START_USER_AUTH_ON_ERROR_END;
864 }
865 }
866
867 void AUTH_advance_to_next_cred(PTInstVar pvar)
868 {
869 pvar->auth_state.failed_method = pvar->auth_state.cur_cred.method;
870
871 if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
872 try_default_auth(pvar);
873
874 if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
875 if (pvar->err_msg != NULL) {
876 pvar->auth_state.flags |=
877 AUTH_START_USER_AUTH_ON_ERROR_END;
878 } else {
879 // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
880 // �R�}���h���C���w������������
881 start_user_auth(pvar);
882 }
883 }
884 } else {
885 // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
886 // �R�}���h���C���w������(/auth=xxxx)������
887 start_user_auth(pvar);
888 }
889 }
890
891 static void init_TIS_dlg(PTInstVar pvar, HWND dlg)
892 {
893 char uimsg[MAX_UIMSG];
894
895 GetWindowText(dlg, uimsg, sizeof(uimsg));
896 UTIL_get_lang_msg("DLG_TIS_TITLE", pvar, uimsg);
897 SetWindowText(dlg, pvar->ts->UIMsg);
898 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
899 UTIL_get_lang_msg("DLG_TIS_BANNER", pvar, uimsg);
900 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
901 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
902 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
903 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
904 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
905 UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
906 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
907
908 init_auth_machine_banner(pvar, dlg);
909 init_password_control(dlg);
910
911 if (pvar->auth_state.TIS_prompt != NULL) {
912 if (strlen(pvar->auth_state.TIS_prompt) > 10000) {
913 pvar->auth_state.TIS_prompt[10000] = 0;
914 }
915 SetDlgItemText(dlg, IDC_SSHAUTHBANNER2,
916 pvar->auth_state.TIS_prompt);
917 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
918 }
919 }
920
921 static BOOL end_TIS_dlg(PTInstVar pvar, HWND dlg)
922 {
923 char FAR *password =
924 alloc_control_text(GetDlgItem(dlg, IDC_SSHPASSWORD));
925
926 pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
927 pvar->auth_state.cur_cred.password = password;
928 pvar->auth_state.auth_dialog = NULL;
929
930 // add
931 if (SSHv2(pvar)) {
932 pvar->keyboard_interactive_password_input = 1;
933 handle_SSH2_userauth_inforeq(pvar);
934 }
935
936 SSH_notify_cred(pvar);
937
938 EndDialog(dlg, 1);
939 return TRUE;
940 }
941
942 static BOOL CALLBACK TIS_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
943 LPARAM lParam)
944 {
945 PTInstVar pvar;
946 LOGFONT logfont;
947 HFONT font;
948
949 switch (msg) {
950 case WM_INITDIALOG:
951 pvar = (PTInstVar) lParam;
952 pvar->auth_state.auth_dialog = dlg;
953 SetWindowLong(dlg, DWL_USER, lParam);
954
955 init_TIS_dlg(pvar, dlg);
956
957 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
958 GetObject(font, sizeof(LOGFONT), &logfont);
959 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgTisFont, pvar)) {
960 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
961 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
962 SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
963 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
964 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
965 }
966 else {
967 DlgTisFont = NULL;
968 }
969
970 return FALSE; /* because we set the focus */
971
972 case WM_COMMAND:
973 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
974
975 switch (LOWORD(wParam)) {
976 case IDOK:
977 if (DlgTisFont != NULL) {
978 DeleteObject(DlgTisFont);
979 }
980
981 return end_TIS_dlg(pvar, dlg);
982
983 case IDCANCEL: /* kill the connection */
984 pvar->auth_state.auth_dialog = NULL;
985 notify_closed_connection(pvar);
986 EndDialog(dlg, 0);
987
988 if (DlgTisFont != NULL) {
989 DeleteObject(DlgTisFont);
990 }
991
992 return TRUE;
993
994 default:
995 return FALSE;
996 }
997
998 default:
999 return FALSE;
1000 }
1001 }
1002
1003 void AUTH_do_cred_dialog(PTInstVar pvar)
1004 {
1005 if (pvar->auth_state.auth_dialog == NULL) {
1006 HWND cur_active = GetActiveWindow();
1007 DLGPROC dlg_proc;
1008 LPCTSTR dialog_template;
1009
1010 switch (pvar->auth_state.mode) {
1011 case TIS_AUTH_MODE:
1012 dialog_template = MAKEINTRESOURCE(IDD_SSHTISAUTH);
1013 dlg_proc = TIS_dlg_proc;
1014 break;
1015 case GENERIC_AUTH_MODE:
1016 default:
1017 dialog_template = MAKEINTRESOURCE(IDD_SSHAUTH);
1018 dlg_proc = auth_dlg_proc;
1019 }
1020
1021 if (!DialogBoxParam(hInst, dialog_template,
1022 cur_active !=
1023 NULL ? cur_active : pvar->NotificationWindow,
1024 dlg_proc, (LPARAM) pvar) == -1) {
1025 UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTH_ERROR", pvar,
1026 "Unable to display authentication dialog box.\n"
1027 "Connection terminated.");
1028 notify_fatal_error(pvar, pvar->ts->UIMsg);
1029 }
1030 }
1031 }
1032
1033 static void init_default_auth_dlg(PTInstVar pvar, HWND dlg)
1034 {
1035 char uimsg[MAX_UIMSG];
1036
1037 GetWindowText(dlg, uimsg, sizeof(uimsg));
1038 UTIL_get_lang_msg("DLG_AUTHSETUP_TITLE", pvar, uimsg);
1039 SetWindowText(dlg, pvar->ts->UIMsg);
1040 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
1041 UTIL_get_lang_msg("DLG_AUTHSETUP_BANNER", pvar, uimsg);
1042 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
1043 GetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, uimsg, sizeof(uimsg));
1044 UTIL_get_lang_msg("DLG_AUTHSETUP_USERNAME", pvar, uimsg);
1045 SetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, pvar->ts->UIMsg);
1046 GetDlgItemText(dlg, IDC_SSHUSEPASSWORD, uimsg, sizeof(uimsg));
1047 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PASSWORD", pvar, uimsg);
1048 SetDlgItemText(dlg, IDC_SSHUSEPASSWORD, pvar->ts->UIMsg);
1049 GetDlgItemText(dlg, IDC_SSHUSERSA, uimsg, sizeof(uimsg));
1050 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RSA", pvar, uimsg);
1051 SetDlgItemText(dlg, IDC_SSHUSERSA, pvar->ts->UIMsg);
1052 GetDlgItemText(dlg, IDC_SSHUSERHOSTS, uimsg, sizeof(uimsg));
1053 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RHOST", pvar, uimsg);
1054 SetDlgItemText(dlg, IDC_SSHUSERHOSTS, pvar->ts->UIMsg);
1055 GetDlgItemText(dlg, IDC_SSHUSETIS, uimsg, sizeof(uimsg));
1056 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_CHALLENGE", pvar, uimsg);
1057 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
1058 GetDlgItemText(dlg, IDC_CHOOSERSAFILE, uimsg, sizeof(uimsg));
1059 UTIL_get_lang_msg("DLG_AUTH_PRIVATEKEY", pvar, uimsg);
1060 SetDlgItemText(dlg, IDC_CHOOSERSAFILE, pvar->ts->UIMsg);
1061 GetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, uimsg, sizeof(uimsg));
1062 UTIL_get_lang_msg("DLG_AUTH_LOCALUSER", pvar, uimsg);
1063 SetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, pvar->ts->UIMsg);
1064 GetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, uimsg, sizeof(uimsg));
1065 UTIL_get_lang_msg("DLG_AUTH_HOST_PRIVATEKEY", pvar, uimsg);
1066 SetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, pvar->ts->UIMsg);
1067 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1068 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1069 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1070 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1071 UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
1072 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1073
1074 switch (pvar->settings.DefaultAuthMethod) {
1075 case SSH_AUTH_RSA:
1076 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1077 IDC_SSHUSERSA);
1078 break;
1079 case SSH_AUTH_RHOSTS:
1080 case SSH_AUTH_RHOSTS_RSA:
1081 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1082 IDC_SSHUSERHOSTS);
1083 break;
1084 case SSH_AUTH_TIS:
1085 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1086 IDC_SSHUSETIS);
1087 break;
1088 case SSH_AUTH_PASSWORD:
1089 default:
1090 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1091 IDC_SSHUSEPASSWORD);
1092 }
1093
1094 SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName);
1095 SetDlgItemText(dlg, IDC_RSAFILENAME,
1096 pvar->settings.DefaultRSAPrivateKeyFile);
1097 SetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1098 pvar->settings.DefaultRhostsHostPrivateKeyFile);
1099 SetDlgItemText(dlg, IDC_LOCALUSERNAME,
1100 pvar->settings.DefaultRhostsLocalUserName);
1101 }
1102
1103 static BOOL end_default_auth_dlg(PTInstVar pvar, HWND dlg)
1104 {
1105 if (IsDlgButtonChecked(dlg, IDC_SSHUSERSA)) {
1106 pvar->settings.DefaultAuthMethod = SSH_AUTH_RSA;
1107 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSERHOSTS)) {
1108 if (GetWindowTextLength(GetDlgItem(dlg, IDC_HOSTRSAFILENAME)) > 0) {
1109 pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS_RSA;
1110 } else {
1111 pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS;
1112 }
1113 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSETIS)) {
1114 pvar->settings.DefaultAuthMethod = SSH_AUTH_TIS;
1115 } else {
1116 pvar->settings.DefaultAuthMethod = SSH_AUTH_PASSWORD;
1117 }
1118
1119 GetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName,
1120 sizeof(pvar->settings.DefaultUserName));
1121 GetDlgItemText(dlg, IDC_RSAFILENAME,
1122 pvar->settings.DefaultRSAPrivateKeyFile,
1123 sizeof(pvar->settings.DefaultRSAPrivateKeyFile));
1124 GetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1125 pvar->settings.DefaultRhostsHostPrivateKeyFile,
1126 sizeof(pvar->settings.DefaultRhostsHostPrivateKeyFile));
1127 GetDlgItemText(dlg, IDC_LOCALUSERNAME,
1128 pvar->settings.DefaultRhostsLocalUserName,
1129 sizeof(pvar->settings.DefaultRhostsLocalUserName));
1130
1131 EndDialog(dlg, 1);
1132 return TRUE;
1133 }
1134
1135 static BOOL CALLBACK default_auth_dlg_proc(HWND dlg, UINT msg,
1136 WPARAM wParam, LPARAM lParam)
1137 {
1138 PTInstVar pvar;
1139 LOGFONT logfont;
1140 HFONT font;
1141
1142 switch (msg) {
1143 case WM_INITDIALOG:
1144 pvar = (PTInstVar) lParam;
1145 SetWindowLong(dlg, DWL_USER, lParam);
1146
1147 init_default_auth_dlg(pvar, dlg);
1148
1149 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1150 GetObject(font, sizeof(LOGFONT), &logfont);
1151 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthSetupFont, pvar)) {
1152 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1153 SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1154 SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1155 SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1156 SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1157 SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1158 SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1159 SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1160 SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1161 SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1162 SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1163 SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1164 SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1165 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1166 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1167 }
1168 else {
1169 DlgAuthSetupFont = NULL;
1170 }
1171
1172 return TRUE; /* because we do not set the focus */
1173
1174 case WM_COMMAND:
1175 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1176
1177 switch (LOWORD(wParam)) {
1178 case IDOK:
1179
1180 if (DlgAuthSetupFont != NULL) {
1181 DeleteObject(DlgAuthSetupFont);
1182 }
1183
1184 return end_default_auth_dlg(pvar, dlg);
1185
1186 case IDCANCEL:
1187 EndDialog(dlg, 0);
1188
1189 if (DlgAuthSetupFont != NULL) {
1190 DeleteObject(DlgAuthSetupFont);
1191 }
1192
1193 return TRUE;
1194
1195 case IDC_CHOOSERSAFILE:
1196 choose_RSA_key_file(dlg, pvar);
1197 return TRUE;
1198
1199 case IDC_CHOOSEHOSTRSAFILE:
1200 choose_host_RSA_key_file(dlg, pvar);
1201 return TRUE;
1202
1203 default:
1204 return FALSE;
1205 }
1206
1207 default:
1208 return FALSE;
1209 }
1210 }
1211
1212 void AUTH_init(PTInstVar pvar)
1213 {
1214 pvar->auth_state.failed_method = SSH_AUTH_NONE;
1215 pvar->auth_state.auth_dialog = NULL;
1216 pvar->auth_state.user = NULL;
1217 pvar->auth_state.flags = 0;
1218 pvar->auth_state.TIS_prompt = NULL;
1219 pvar->auth_state.supported_types = 0;
1220 pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
1221 pvar->auth_state.cur_cred.password = NULL;
1222 pvar->auth_state.cur_cred.rhosts_client_user = NULL;
1223 pvar->auth_state.cur_cred.key_pair = NULL;
1224 AUTH_set_generic_mode(pvar);
1225 }
1226
1227 void AUTH_set_generic_mode(PTInstVar pvar)
1228 {
1229 pvar->auth_state.mode = GENERIC_AUTH_MODE;
1230 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1231 }
1232
1233 void AUTH_set_TIS_mode(PTInstVar pvar, char FAR * prompt, int len)
1234 {
1235 if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1236 pvar->auth_state.mode = TIS_AUTH_MODE;
1237
1238 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1239 pvar->auth_state.TIS_prompt = malloc(len + 1);
1240 memcpy(pvar->auth_state.TIS_prompt, prompt, len);
1241 pvar->auth_state.TIS_prompt[len] = 0;
1242 } else {
1243 AUTH_set_generic_mode(pvar);
1244 }
1245 }
1246
1247 void AUTH_do_default_cred_dialog(PTInstVar pvar)
1248 {
1249 HWND cur_active = GetActiveWindow();
1250
1251 if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHAUTHSETUP),
1252 cur_active != NULL ? cur_active
1253 : pvar->NotificationWindow,
1254 default_auth_dlg_proc, (LPARAM) pvar) == -1) {
1255 UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTHSETUP_ERROR", pvar,
1256 "Unable to display authentication setup dialog box.");
1257 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1258 }
1259 }
1260
1261 void AUTH_destroy_cur_cred(PTInstVar pvar)
1262 {
1263 destroy_malloced_string(&pvar->auth_state.cur_cred.password);
1264 destroy_malloced_string(&pvar->auth_state.cur_cred.rhosts_client_user);
1265 if (pvar->auth_state.cur_cred.key_pair != NULL) {
1266 CRYPT_free_key_pair(pvar->auth_state.cur_cred.key_pair);
1267 pvar->auth_state.cur_cred.key_pair = NULL;
1268 }
1269 }
1270
1271 static char FAR *get_auth_method_name(SSHAuthMethod auth)
1272 {
1273 switch (auth) {
1274 case SSH_AUTH_PASSWORD:
1275 return "password";
1276 case SSH_AUTH_RSA:
1277 return "RSA";
1278 case SSH_AUTH_RHOSTS:
1279 return "rhosts";
1280 case SSH_AUTH_RHOSTS_RSA:
1281 return "rhosts with RSA";
1282 case SSH_AUTH_TIS:
1283 return "challenge/response (TIS)";
1284 default:
1285 return "unknown method";
1286 }
1287 }
1288
1289 void AUTH_get_auth_info(PTInstVar pvar, char FAR * dest, int len)
1290 {
1291 char *method = "unknown";
1292
1293 if (pvar->auth_state.user == NULL) {
1294 strncpy_s(dest, len, "None", _TRUNCATE);
1295 } else if (pvar->auth_state.cur_cred.method != SSH_AUTH_NONE) {
1296 if (SSHv1(pvar)) {
1297 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1298 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1299 get_auth_method_name(pvar->auth_state.cur_cred.method));
1300
1301 } else {
1302 // SSH2:�F�����\�b�h������ (2004.12.23 yutaka)
1303 // keyboard-interactive���\�b�h������ (2005.3.12 yutaka)
1304 if (pvar->auth_state.cur_cred.method == SSH_AUTH_PASSWORD ||
1305 pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1306 // keyboard-interactive���\�b�h������ (2005.1.24 yutaka)
1307 if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1308 method = "keyboard-interactive";
1309 } else {
1310 method = get_auth_method_name(pvar->auth_state.cur_cred.method);
1311 }
1312 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1313 _snprintf_s(dest, len, _TRUNCATE,
1314 pvar->ts->UIMsg, pvar->auth_state.user, method);
1315
1316 } else {
1317 if (pvar->auth_state.cur_cred.key_pair->RSA_key != NULL) {
1318 method = "RSA";
1319 } else if (pvar->auth_state.cur_cred.key_pair->DSA_key != NULL) {
1320 method = "DSA";
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
1327 }
1328
1329 } else {
1330 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1331 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1332 get_auth_method_name(pvar->auth_state.failed_method));
1333 }
1334
1335 dest[len - 1] = 0;
1336 }
1337
1338 void AUTH_notify_disconnecting(PTInstVar pvar)
1339 {
1340 if (pvar->auth_state.auth_dialog != NULL) {
1341 PostMessage(pvar->auth_state.auth_dialog, WM_COMMAND, IDCANCEL, 0);
1342 /* the main window might not go away if it's not enabled. (see vtwin.cpp) */
1343 EnableWindow(pvar->NotificationWindow, TRUE);
1344 }
1345 }
1346
1347 void AUTH_end(PTInstVar pvar)
1348 {
1349 destroy_malloced_string(&pvar->auth_state.user);
1350 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1351
1352 AUTH_destroy_cur_cred(pvar);
1353 }

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