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

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

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