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 3003 - (show annotations) (download) (as text)
Mon Aug 20 14:21:57 2007 UTC (16 years, 7 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 44047 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 // �p�X���[�h�F���������O���Akeyboard-interactive���\�b�h�������������A���x������
317 // ���X�����B(2005.3.12 yutaka)
318 if (pvar->settings.ssh2_keyboard_interactive == 1) {
319 UTIL_get_lang_msg("DLG_AUTH_METHOD_PASSWORD_KBDINT", pvar,
320 "Use p&lain password to log in (with keyboard-interactive)");
321 SetDlgItemText(dlg, IDC_SSHUSEPASSWORD, pvar->ts->UIMsg);
322 }
323
324 if (pvar->settings.ssh_protocol_version == 1) {
325 UTIL_get_lang_msg("DLG_AUTH_METHOD_CHALLENGE1", pvar,
326 "Use challenge/response to log in(&TIS)");
327 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
328 } else {
329 UTIL_get_lang_msg("DLG_AUTH_METHOD_CHALLENGE2", pvar,
330 "Use &challenge/response to log in(keyboard-interactive)");
331 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
332 }
333 #endif
334
335 // �p�X���[�h���o���������`�F�b�N�{�b�N�X�����f�t�H���g���L�������� (2006.8.3 yutaka)
336 if (pvar->ts_SSH->remember_password) {
337 SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_SETCHECK, BST_CHECKED, 0);
338 } else {
339 SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_SETCHECK, BST_UNCHECKED, 0);
340 }
341
342 }
343
344 static char FAR *alloc_control_text(HWND ctl)
345 {
346 int len = GetWindowTextLength(ctl);
347 char FAR *result = malloc(len + 1);
348
349 if (result != NULL) {
350 GetWindowText(ctl, result, len + 1);
351 result[len] = 0;
352 }
353
354 return result;
355 }
356
357 static int get_key_file_name(HWND parent, char FAR * buf, int bufsize, PTInstVar pvar)
358 {
359 OPENFILENAME params;
360 char fullname_buf[2048] = "identity";
361 char filter[MAX_UIMSG];
362
363 ZeroMemory(&params, sizeof(params));
364 params.lStructSize = sizeof(OPENFILENAME);
365 params.hwndOwner = parent;
366 // �t�B���^������ (2004.12.19 yutaka)
367 // 3�t�@�C���t�B���^������ (2005.4.26 yutaka)
368 UTIL_get_lang_msg("FILEDLG_OPEN_PRIVATEKEY_FILTER", pvar,
369 "identity files\\0identity;id_rsa;id_dsa\\0identity(RSA1)\\0identity\\0id_rsa(SSH2)\\0id_rsa\\0id_dsa(SSH2)\\0id_dsa\\0all(*.*)\\0*.*\\0\\0");
370 memcpy(filter, pvar->ts->UIMsg, sizeof(filter));
371 params.lpstrFilter = filter;
372 params.lpstrCustomFilter = NULL;
373 params.nFilterIndex = 0;
374 buf[0] = 0;
375 params.lpstrFile = fullname_buf;
376 params.nMaxFile = sizeof(fullname_buf);
377 params.lpstrFileTitle = NULL;
378 params.lpstrInitialDir = NULL;
379 UTIL_get_lang_msg("FILEDLG_OPEN_PRIVATEKEY_TITLE", pvar,
380 "Choose a file with the RSA/DSA private key");
381 params.lpstrTitle = pvar->ts->UIMsg;
382 params.Flags =
383 OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;
384 params.lpstrDefExt = NULL;
385
386 if (GetOpenFileName(&params) != 0) {
387 copy_teraterm_dir_relative_path(buf, bufsize, fullname_buf);
388 return 1;
389 } else {
390 return 0;
391 }
392 }
393
394 static void choose_RSA_key_file(HWND dlg, PTInstVar pvar)
395 {
396 char buf[1024];
397
398 if (get_key_file_name(dlg, buf, sizeof(buf), pvar)) {
399 SetDlgItemText(dlg, IDC_RSAFILENAME, buf);
400 }
401 }
402
403 static void choose_host_RSA_key_file(HWND dlg, PTInstVar pvar)
404 {
405 char buf[1024];
406
407 if (get_key_file_name(dlg, buf, sizeof(buf), pvar)) {
408 SetDlgItemText(dlg, IDC_HOSTRSAFILENAME, buf);
409 }
410 }
411
412 static BOOL end_auth_dlg(PTInstVar pvar, HWND dlg)
413 {
414 int method = SSH_AUTH_PASSWORD;
415 char FAR *password =
416 alloc_control_text(GetDlgItem(dlg, IDC_SSHPASSWORD));
417 CRYPTKeyPair FAR *key_pair = NULL;
418
419 if (IsDlgButtonChecked(dlg, IDC_SSHUSERSA)) {
420 method = SSH_AUTH_RSA;
421 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSERHOSTS)) {
422 if (GetWindowTextLength(GetDlgItem(dlg, IDC_HOSTRSAFILENAME)) > 0) {
423 method = SSH_AUTH_RHOSTS_RSA;
424 } else {
425 method = SSH_AUTH_RHOSTS;
426 }
427 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSETIS)) {
428 method = SSH_AUTH_TIS;
429 }
430
431 if (method == SSH_AUTH_RSA || method == SSH_AUTH_RHOSTS_RSA) {
432 char buf[2048];
433 int file_ctl_ID =
434 method == SSH_AUTH_RSA ? IDC_RSAFILENAME : IDC_HOSTRSAFILENAME;
435
436 buf[0] = 0;
437 GetDlgItemText(dlg, file_ctl_ID, buf, sizeof(buf));
438 if (buf[0] == 0) {
439 UTIL_get_lang_msg("MSG_KEYSPECIFY_ERROR", pvar,
440 "You must specify a file containing the RSA/DSA private key.");
441 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
442 SetFocus(GetDlgItem(dlg, file_ctl_ID));
443 destroy_malloced_string(&password);
444 return FALSE;
445 }
446
447 if (SSHv1(pvar)) {
448 BOOL invalid_passphrase = FALSE;
449
450 key_pair = KEYFILES_read_private_key(pvar, buf, password,
451 &invalid_passphrase,
452 FALSE);
453
454 if (key_pair == NULL) {
455 if (invalid_passphrase) {
456 HWND passwordCtl = GetDlgItem(dlg, IDC_SSHPASSWORD);
457
458 SetFocus(passwordCtl);
459 SendMessage(passwordCtl, EM_SETSEL, 0, -1);
460 } else {
461 SetFocus(GetDlgItem(dlg, file_ctl_ID));
462 }
463 destroy_malloced_string(&password);
464 return FALSE;
465 }
466
467 } else { // SSH2(yutaka)
468 BOOL invalid_passphrase = FALSE;
469 char errmsg[256];
470
471 memset(errmsg, 0, sizeof(errmsg));
472 //GetCurrentDirectory(sizeof(errmsg), errmsg);
473
474 key_pair = read_SSH2_private_key(pvar, buf, password,
475 &invalid_passphrase,
476 FALSE,
477 errmsg,
478 sizeof(errmsg)
479 );
480
481 if (key_pair == NULL) { // read error
482 char buf[1024];
483 UTIL_get_lang_msg("MSG_READKEY_ERROR", pvar,
484 "read error SSH2 private key file\r\n%s");
485 _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, errmsg);
486 notify_nonfatal_error(pvar, buf);
487 // �p�X�t���[�Y���������v����������������IDC_SSHPASSWORD���t�H�[�J�X������ (2006.10.29 yasuhide)
488 if (invalid_passphrase) {
489 HWND passwordCtl = GetDlgItem(dlg, IDC_SSHPASSWORD);
490
491 SetFocus(passwordCtl);
492 SendMessage(passwordCtl, EM_SETSEL, 0, -1);
493 } else {
494 SetFocus(GetDlgItem(dlg, file_ctl_ID));
495 }
496 destroy_malloced_string(&password);
497 return FALSE;
498 }
499
500 }
501
502 }
503
504 /* from here on, we cannot fail, so just munge cur_cred in place */
505 pvar->auth_state.cur_cred.method = method;
506 pvar->auth_state.cur_cred.key_pair = key_pair;
507 /* we can't change the user name once it's set. It may already have
508 been sent to the server, and it can only be sent once. */
509 if (pvar->auth_state.user == NULL) {
510 pvar->auth_state.user =
511 alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
512 }
513
514 // �p�X���[�h���������������������������� (2006.8.3 yutaka)
515 if (SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_GETCHECK, 0,0) == BST_CHECKED) {
516 pvar->settings.remember_password = 1; // �o��������
517 pvar->ts_SSH->remember_password = 1;
518 } else {
519 pvar->settings.remember_password = 0; // ���������������Y����
520 pvar->ts_SSH->remember_password = 0;
521 }
522
523 // ���J���F���������A�Z�b�V�������������p�X���[�h���g�����������������������������������B
524 // (2005.4.8 yutaka)
525 if (method == SSH_AUTH_PASSWORD || method == SSH_AUTH_RSA) {
526 pvar->auth_state.cur_cred.password = password;
527 } else {
528 destroy_malloced_string(&password);
529 }
530 if (method == SSH_AUTH_RHOSTS || method == SSH_AUTH_RHOSTS_RSA) {
531 if (pvar->session_settings.DefaultAuthMethod != SSH_AUTH_RHOSTS) {
532 UTIL_get_lang_msg("MSG_RHOSTS_NOTDEFAULT_ERROR", pvar,
533 "Rhosts authentication will probably fail because it was not "
534 "the default authentication method.\n"
535 "To use Rhosts authentication "
536 "in TTSSH, you need to set it to be the default by restarting\n"
537 "TTSSH and selecting \"SSH Authentication...\" from the Setup menu"
538 "before connecting.");
539 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
540 }
541
542 pvar->auth_state.cur_cred.rhosts_client_user =
543 alloc_control_text(GetDlgItem(dlg, IDC_LOCALUSERNAME));
544 }
545 pvar->auth_state.auth_dialog = NULL;
546
547 GetDlgItemText(dlg, IDC_RSAFILENAME,
548 pvar->session_settings.DefaultRSAPrivateKeyFile,
549 sizeof(pvar->session_settings.
550 DefaultRSAPrivateKeyFile));
551 GetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
552 pvar->session_settings.DefaultRhostsHostPrivateKeyFile,
553 sizeof(pvar->session_settings.
554 DefaultRhostsHostPrivateKeyFile));
555 GetDlgItemText(dlg, IDC_LOCALUSERNAME,
556 pvar->session_settings.DefaultRhostsLocalUserName,
557 sizeof(pvar->session_settings.
558 DefaultRhostsLocalUserName));
559
560 if (SSHv1(pvar)) {
561 SSH_notify_user_name(pvar);
562 SSH_notify_cred(pvar);
563 } else {
564 // for SSH2(yutaka)
565 do_SSH2_userauth(pvar);
566 }
567
568 EndDialog(dlg, 1);
569 if (DlgAuthFont != NULL) {
570 DeleteObject(DlgAuthFont);
571 }
572
573 return TRUE;
574 }
575
576 static BOOL CALLBACK auth_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
577 LPARAM lParam)
578 {
579 const int IDC_TIMER1 = 300;
580 const int autologin_timeout = 10; // �~���b
581 PTInstVar pvar;
582 LOGFONT logfont;
583 HFONT font;
584
585 switch (msg) {
586 case WM_INITDIALOG:
587 pvar = (PTInstVar) lParam;
588 pvar->auth_state.auth_dialog = dlg;
589 SetWindowLong(dlg, DWL_USER, lParam);
590
591 init_auth_dlg(pvar, dlg);
592
593 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
594 GetObject(font, sizeof(LOGFONT), &logfont);
595 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthFont, pvar)) {
596 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
597 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
598 SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
599 SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
600 SendDlgItemMessage(dlg, IDC_SSHPASSWORDCAPTION, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
601 SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
602 SendDlgItemMessage(dlg, IDC_REMEMBER_PASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
603 SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
604 SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
605 SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
606 SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
607 SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
608 SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
609 SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
610 SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
611 SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
612 SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
613 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
614 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
615 }
616 else {
617 DlgAuthFont = NULL;
618 }
619
620 // SSH2 autologin���L�����������A�^�C�}���d�|�����B (2004.12.1 yutaka)
621 if (pvar->ssh2_autologin == 1) {
622 SetTimer(dlg, IDC_TIMER1, autologin_timeout, 0);
623 }
624 return FALSE; /* because we set the focus */
625
626 case WM_TIMER:
627 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
628 // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2004.12.16 yutaka)
629 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME)) {
630 KillTimer(dlg, IDC_TIMER1);
631 SendMessage(dlg, WM_COMMAND, IDOK, 0);
632 }
633 return TRUE;
634
635 case WM_COMMAND:
636 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
637
638 switch (LOWORD(wParam)) {
639 case IDOK:
640 // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2001.1.25 yutaka)
641 if (pvar->userauth_retry_count == 0 && (pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME)) {
642 return FALSE;
643 }
644
645 return end_auth_dlg(pvar, dlg);
646
647 case IDCANCEL: /* kill the connection */
648 pvar->auth_state.auth_dialog = NULL;
649 notify_closed_connection(pvar);
650 EndDialog(dlg, 0);
651
652 if (DlgAuthFont != NULL) {
653 DeleteObject(DlgAuthFont);
654 }
655
656 return TRUE;
657
658 case IDC_SSHUSEPASSWORD:
659 case IDC_SSHUSERSA:
660 case IDC_SSHUSERHOSTS:
661 case IDC_SSHUSETIS:
662 set_auth_options_status(dlg, LOWORD(wParam));
663 return TRUE;
664
665 case IDC_CHOOSERSAFILE:
666 choose_RSA_key_file(dlg, pvar);
667 return TRUE;
668
669 case IDC_CHOOSEHOSTRSAFILE:
670 choose_host_RSA_key_file(dlg, pvar);
671 return TRUE;
672
673 default:
674 return FALSE;
675 }
676
677 default:
678 return FALSE;
679 }
680 }
681
682 char FAR *AUTH_get_user_name(PTInstVar pvar)
683 {
684 return pvar->auth_state.user;
685 }
686
687 int AUTH_set_supported_auth_types(PTInstVar pvar, int types)
688 {
689 char buf[1024];
690
691 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
692 "Server reports supported authentication method mask = %d",
693 types);
694 buf[sizeof(buf) - 1] = 0;
695 notify_verbose_message(pvar, buf, LOG_LEVEL_VERBOSE);
696
697 if (SSHv1(pvar)) {
698 types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
699 | (1 << SSH_AUTH_RHOSTS_RSA) | (1 << SSH_AUTH_RHOSTS)
700 | (1 << SSH_AUTH_TIS);
701 } else {
702 // for SSH2(yutaka)
703 // types &= (1 << SSH_AUTH_PASSWORD);
704 // ���J���F�����L�������� (2004.12.18 yutaka)
705 // TIS�������BSSH2����keyboard-interactive�����������B(2005.3.12 yutaka)
706 types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
707 | (1 << SSH_AUTH_DSA)
708 | (1 << SSH_AUTH_TIS);
709 }
710 pvar->auth_state.supported_types = types;
711
712 if (types == 0) {
713 UTIL_get_lang_msg("MSG_NOAUTHMETHOD_ERROR", pvar,
714 "Server does not support any of the authentication options\n"
715 "provided by TTSSH. This connection will now close.");
716 notify_fatal_error(pvar, pvar->ts->UIMsg);
717 return 0;
718 } else {
719 if (pvar->auth_state.auth_dialog != NULL) {
720 update_server_supported_types(pvar,
721 pvar->auth_state.auth_dialog);
722 }
723
724 return 1;
725 }
726 }
727
728 static void start_user_auth(PTInstVar pvar)
729 {
730 // �F���_�C�A���O���\�������� (2004.12.1 yutaka)
731 PostMessage(pvar->NotificationWindow, WM_COMMAND, (WPARAM) ID_SSHAUTH,
732 (LPARAM) NULL);
733 pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
734 }
735
736 static void try_default_auth(PTInstVar pvar)
737 {
738 if (pvar->session_settings.TryDefaultAuth) {
739 switch (pvar->session_settings.DefaultAuthMethod) {
740 case SSH_AUTH_RSA:{
741 BOOL invalid_passphrase;
742 char password[] = "";
743
744 pvar->auth_state.cur_cred.key_pair
745 =
746 KEYFILES_read_private_key(pvar,
747 pvar->session_settings.
748 DefaultRSAPrivateKeyFile,
749 password,
750 &invalid_passphrase, TRUE);
751 if (pvar->auth_state.cur_cred.key_pair == NULL) {
752 return;
753 } else {
754 pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
755 }
756 break;
757 }
758
759 case SSH_AUTH_RHOSTS:
760 if (pvar->session_settings.
761 DefaultRhostsHostPrivateKeyFile[0] != 0) {
762 BOOL invalid_passphrase;
763 char password[] = "";
764
765 pvar->auth_state.cur_cred.key_pair
766 =
767 KEYFILES_read_private_key(pvar,
768 pvar->session_settings.
769 DefaultRhostsHostPrivateKeyFile,
770 password,
771 &invalid_passphrase, TRUE);
772 if (pvar->auth_state.cur_cred.key_pair == NULL) {
773 return;
774 } else {
775 pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS_RSA;
776 }
777 } else {
778 pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS;
779 }
780
781 pvar->auth_state.cur_cred.rhosts_client_user =
782 _strdup(pvar->session_settings.DefaultRhostsLocalUserName);
783 break;
784
785 case SSH_AUTH_PASSWORD:
786 pvar->auth_state.cur_cred.password = _strdup("");
787 pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
788 break;
789
790 case SSH_AUTH_TIS:
791 default:
792 return;
793 }
794
795 pvar->auth_state.user =
796 _strdup(pvar->session_settings.DefaultUserName);
797 }
798 }
799
800 void AUTH_notify_end_error(PTInstVar pvar)
801 {
802 if ((pvar->auth_state.flags & AUTH_START_USER_AUTH_ON_ERROR_END) != 0) {
803 start_user_auth(pvar);
804 pvar->auth_state.flags &= ~AUTH_START_USER_AUTH_ON_ERROR_END;
805 }
806 }
807
808 void AUTH_advance_to_next_cred(PTInstVar pvar)
809 {
810 pvar->auth_state.failed_method = pvar->auth_state.cur_cred.method;
811
812 if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
813 try_default_auth(pvar);
814
815 if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
816 if (pvar->err_msg != NULL) {
817 pvar->auth_state.flags |=
818 AUTH_START_USER_AUTH_ON_ERROR_END;
819 } else {
820 // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
821 // �R�}���h���C���w������������
822 start_user_auth(pvar);
823 }
824 }
825 } else {
826 // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
827 // �R�}���h���C���w������(/auth=xxxx)������
828 start_user_auth(pvar);
829 }
830 }
831
832 static void init_TIS_dlg(PTInstVar pvar, HWND dlg)
833 {
834 char uimsg[MAX_UIMSG];
835
836 GetWindowText(dlg, uimsg, sizeof(uimsg));
837 UTIL_get_lang_msg("DLG_TIS_TITLE", pvar, uimsg);
838 SetWindowText(dlg, pvar->ts->UIMsg);
839 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
840 UTIL_get_lang_msg("DLG_TIS_BANNER", pvar, uimsg);
841 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
842 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
843 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
844 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
845 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
846 UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
847 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
848
849 init_auth_machine_banner(pvar, dlg);
850 init_password_control(dlg);
851
852 if (pvar->auth_state.TIS_prompt != NULL) {
853 if (strlen(pvar->auth_state.TIS_prompt) > 10000) {
854 pvar->auth_state.TIS_prompt[10000] = 0;
855 }
856 SetDlgItemText(dlg, IDC_SSHAUTHBANNER2,
857 pvar->auth_state.TIS_prompt);
858 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
859 }
860 }
861
862 static BOOL end_TIS_dlg(PTInstVar pvar, HWND dlg)
863 {
864 char FAR *password =
865 alloc_control_text(GetDlgItem(dlg, IDC_SSHPASSWORD));
866
867 pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
868 pvar->auth_state.cur_cred.password = password;
869 pvar->auth_state.auth_dialog = NULL;
870
871 // add
872 if (SSHv2(pvar)) {
873 pvar->keyboard_interactive_password_input = 1;
874 handle_SSH2_userauth_inforeq(pvar);
875 }
876
877 SSH_notify_cred(pvar);
878
879 EndDialog(dlg, 1);
880 return TRUE;
881 }
882
883 static BOOL CALLBACK TIS_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
884 LPARAM lParam)
885 {
886 PTInstVar pvar;
887 LOGFONT logfont;
888 HFONT font;
889
890 switch (msg) {
891 case WM_INITDIALOG:
892 pvar = (PTInstVar) lParam;
893 pvar->auth_state.auth_dialog = dlg;
894 SetWindowLong(dlg, DWL_USER, lParam);
895
896 init_TIS_dlg(pvar, dlg);
897
898 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
899 GetObject(font, sizeof(LOGFONT), &logfont);
900 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgTisFont, pvar)) {
901 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
902 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
903 SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
904 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
905 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
906 }
907 else {
908 DlgTisFont = NULL;
909 }
910
911 return FALSE; /* because we set the focus */
912
913 case WM_COMMAND:
914 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
915
916 switch (LOWORD(wParam)) {
917 case IDOK:
918 if (DlgTisFont != NULL) {
919 DeleteObject(DlgTisFont);
920 }
921
922 return end_TIS_dlg(pvar, dlg);
923
924 case IDCANCEL: /* kill the connection */
925 pvar->auth_state.auth_dialog = NULL;
926 notify_closed_connection(pvar);
927 EndDialog(dlg, 0);
928
929 if (DlgTisFont != NULL) {
930 DeleteObject(DlgTisFont);
931 }
932
933 return TRUE;
934
935 default:
936 return FALSE;
937 }
938
939 default:
940 return FALSE;
941 }
942 }
943
944 void AUTH_do_cred_dialog(PTInstVar pvar)
945 {
946 if (pvar->auth_state.auth_dialog == NULL) {
947 HWND cur_active = GetActiveWindow();
948 DLGPROC dlg_proc;
949 LPCTSTR dialog_template;
950
951 switch (pvar->auth_state.mode) {
952 case TIS_AUTH_MODE:
953 dialog_template = MAKEINTRESOURCE(IDD_SSHTISAUTH);
954 dlg_proc = TIS_dlg_proc;
955 break;
956 case GENERIC_AUTH_MODE:
957 default:
958 dialog_template = MAKEINTRESOURCE(IDD_SSHAUTH);
959 dlg_proc = auth_dlg_proc;
960 }
961
962 if (!DialogBoxParam(hInst, dialog_template,
963 cur_active !=
964 NULL ? cur_active : pvar->NotificationWindow,
965 dlg_proc, (LPARAM) pvar) == -1) {
966 UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTH_ERROR", pvar,
967 "Unable to display authentication dialog box.\n"
968 "Connection terminated.");
969 notify_fatal_error(pvar, pvar->ts->UIMsg);
970 }
971 }
972 }
973
974 static void init_default_auth_dlg(PTInstVar pvar, HWND dlg)
975 {
976 char uimsg[MAX_UIMSG];
977
978 GetWindowText(dlg, uimsg, sizeof(uimsg));
979 UTIL_get_lang_msg("DLG_AUTHSETUP_TITLE", pvar, uimsg);
980 SetWindowText(dlg, pvar->ts->UIMsg);
981 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
982 UTIL_get_lang_msg("DLG_AUTHSETUP_BANNER", pvar, uimsg);
983 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
984 GetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, uimsg, sizeof(uimsg));
985 UTIL_get_lang_msg("DLG_AUTHSETUP_USERNAME", pvar, uimsg);
986 SetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, pvar->ts->UIMsg);
987 GetDlgItemText(dlg, IDC_SSHUSEPASSWORD, uimsg, sizeof(uimsg));
988 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PASSWORD", pvar, uimsg);
989 SetDlgItemText(dlg, IDC_SSHUSEPASSWORD, pvar->ts->UIMsg);
990 GetDlgItemText(dlg, IDC_KEYBOARD_INTERACTIVE_CHECK, uimsg, sizeof(uimsg));
991 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PASSWORD_KBDINT", pvar, uimsg);
992 SetDlgItemText(dlg, IDC_KEYBOARD_INTERACTIVE_CHECK, pvar->ts->UIMsg);
993 GetDlgItemText(dlg, IDC_SSHUSERSA, uimsg, sizeof(uimsg));
994 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RSA", pvar, uimsg);
995 SetDlgItemText(dlg, IDC_SSHUSERSA, pvar->ts->UIMsg);
996 GetDlgItemText(dlg, IDC_SSHUSERHOSTS, uimsg, sizeof(uimsg));
997 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RHOST", pvar, uimsg);
998 SetDlgItemText(dlg, IDC_SSHUSERHOSTS, pvar->ts->UIMsg);
999 GetDlgItemText(dlg, IDC_SSHUSETIS, uimsg, sizeof(uimsg));
1000 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_CHALLENGE", pvar, uimsg);
1001 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
1002 GetDlgItemText(dlg, IDC_CHOOSERSAFILE, uimsg, sizeof(uimsg));
1003 UTIL_get_lang_msg("DLG_AUTH_PRIVATEKEY", pvar, uimsg);
1004 SetDlgItemText(dlg, IDC_CHOOSERSAFILE, pvar->ts->UIMsg);
1005 GetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, uimsg, sizeof(uimsg));
1006 UTIL_get_lang_msg("DLG_AUTH_LOCALUSER", pvar, uimsg);
1007 SetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, pvar->ts->UIMsg);
1008 GetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, uimsg, sizeof(uimsg));
1009 UTIL_get_lang_msg("DLG_AUTH_HOST_PRIVATEKEY", pvar, uimsg);
1010 SetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, pvar->ts->UIMsg);
1011 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1012 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1013 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1014 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1015 UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
1016 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1017
1018 switch (pvar->settings.DefaultAuthMethod) {
1019 case SSH_AUTH_RSA:
1020 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1021 IDC_SSHUSERSA);
1022 break;
1023 case SSH_AUTH_RHOSTS:
1024 case SSH_AUTH_RHOSTS_RSA:
1025 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1026 IDC_SSHUSERHOSTS);
1027 break;
1028 case SSH_AUTH_TIS:
1029 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1030 IDC_SSHUSETIS);
1031 break;
1032 case SSH_AUTH_PASSWORD:
1033 default:
1034 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1035 IDC_SSHUSEPASSWORD);
1036 }
1037
1038 SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName);
1039 SetDlgItemText(dlg, IDC_RSAFILENAME,
1040 pvar->settings.DefaultRSAPrivateKeyFile);
1041 SetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1042 pvar->settings.DefaultRhostsHostPrivateKeyFile);
1043 SetDlgItemText(dlg, IDC_LOCALUSERNAME,
1044 pvar->settings.DefaultRhostsLocalUserName);
1045
1046 // SSH2 keyboard-interactive method (2005.2.22 yutaka)
1047 if (pvar->settings.ssh2_keyboard_interactive) {
1048 SendMessage(GetDlgItem(dlg, IDC_KEYBOARD_INTERACTIVE_CHECK), BM_SETCHECK, BST_CHECKED, 0);
1049 }
1050
1051 }
1052
1053 static BOOL end_default_auth_dlg(PTInstVar pvar, HWND dlg)
1054 {
1055 if (IsDlgButtonChecked(dlg, IDC_SSHUSERSA)) {
1056 pvar->settings.DefaultAuthMethod = SSH_AUTH_RSA;
1057 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSERHOSTS)) {
1058 if (GetWindowTextLength(GetDlgItem(dlg, IDC_HOSTRSAFILENAME)) > 0) {
1059 pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS_RSA;
1060 } else {
1061 pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS;
1062 }
1063 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSETIS)) {
1064 pvar->settings.DefaultAuthMethod = SSH_AUTH_TIS;
1065 } else {
1066 pvar->settings.DefaultAuthMethod = SSH_AUTH_PASSWORD;
1067 }
1068
1069 GetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName,
1070 sizeof(pvar->settings.DefaultUserName));
1071 GetDlgItemText(dlg, IDC_RSAFILENAME,
1072 pvar->settings.DefaultRSAPrivateKeyFile,
1073 sizeof(pvar->settings.DefaultRSAPrivateKeyFile));
1074 GetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1075 pvar->settings.DefaultRhostsHostPrivateKeyFile,
1076 sizeof(pvar->settings.DefaultRhostsHostPrivateKeyFile));
1077 GetDlgItemText(dlg, IDC_LOCALUSERNAME,
1078 pvar->settings.DefaultRhostsLocalUserName,
1079 sizeof(pvar->settings.DefaultRhostsLocalUserName));
1080
1081 // SSH2 keyboard-interactive method (2005.2.22 yutaka)
1082 {
1083 LRESULT ret;
1084 ret = SendMessage(GetDlgItem(dlg, IDC_KEYBOARD_INTERACTIVE_CHECK), BM_GETCHECK, 0, 0);
1085 if (ret & BST_CHECKED) {
1086 pvar->settings.ssh2_keyboard_interactive = 1;
1087 } else {
1088 pvar->settings.ssh2_keyboard_interactive = 0;
1089 }
1090 }
1091
1092 EndDialog(dlg, 1);
1093 return TRUE;
1094 }
1095
1096 static BOOL CALLBACK default_auth_dlg_proc(HWND dlg, UINT msg,
1097 WPARAM wParam, LPARAM lParam)
1098 {
1099 PTInstVar pvar;
1100 LOGFONT logfont;
1101 HFONT font;
1102
1103 switch (msg) {
1104 case WM_INITDIALOG:
1105 pvar = (PTInstVar) lParam;
1106 SetWindowLong(dlg, DWL_USER, lParam);
1107
1108 init_default_auth_dlg(pvar, dlg);
1109
1110 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1111 GetObject(font, sizeof(LOGFONT), &logfont);
1112 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthSetupFont, pvar)) {
1113 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1114 SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1115 SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1116 SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1117 SendDlgItemMessage(dlg, IDC_KEYBOARD_INTERACTIVE_CHECK, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1118 SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1119 SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1120 SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1121 SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1122 SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1123 SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1124 SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1125 SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1126 SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1127 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1128 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1129 }
1130 else {
1131 DlgAuthSetupFont = NULL;
1132 }
1133
1134 return TRUE; /* because we do not set the focus */
1135
1136 case WM_COMMAND:
1137 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1138
1139 switch (LOWORD(wParam)) {
1140 case IDOK:
1141
1142 if (DlgAuthSetupFont != NULL) {
1143 DeleteObject(DlgAuthSetupFont);
1144 }
1145
1146 return end_default_auth_dlg(pvar, dlg);
1147
1148 case IDCANCEL:
1149 EndDialog(dlg, 0);
1150
1151 if (DlgAuthSetupFont != NULL) {
1152 DeleteObject(DlgAuthSetupFont);
1153 }
1154
1155 return TRUE;
1156
1157 case IDC_CHOOSERSAFILE:
1158 choose_RSA_key_file(dlg, pvar);
1159 return TRUE;
1160
1161 case IDC_CHOOSEHOSTRSAFILE:
1162 choose_host_RSA_key_file(dlg, pvar);
1163 return TRUE;
1164
1165 default:
1166 return FALSE;
1167 }
1168
1169 default:
1170 return FALSE;
1171 }
1172 }
1173
1174 void AUTH_init(PTInstVar pvar)
1175 {
1176 pvar->auth_state.failed_method = SSH_AUTH_NONE;
1177 pvar->auth_state.auth_dialog = NULL;
1178 pvar->auth_state.user = NULL;
1179 pvar->auth_state.flags = 0;
1180 pvar->auth_state.TIS_prompt = NULL;
1181 pvar->auth_state.supported_types = 0;
1182 pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
1183 pvar->auth_state.cur_cred.password = NULL;
1184 pvar->auth_state.cur_cred.rhosts_client_user = NULL;
1185 pvar->auth_state.cur_cred.key_pair = NULL;
1186 AUTH_set_generic_mode(pvar);
1187 }
1188
1189 void AUTH_set_generic_mode(PTInstVar pvar)
1190 {
1191 pvar->auth_state.mode = GENERIC_AUTH_MODE;
1192 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1193 }
1194
1195 void AUTH_set_TIS_mode(PTInstVar pvar, char FAR * prompt, int len)
1196 {
1197 if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1198 pvar->auth_state.mode = TIS_AUTH_MODE;
1199
1200 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1201 pvar->auth_state.TIS_prompt = malloc(len + 1);
1202 memcpy(pvar->auth_state.TIS_prompt, prompt, len);
1203 pvar->auth_state.TIS_prompt[len] = 0;
1204 } else {
1205 AUTH_set_generic_mode(pvar);
1206 }
1207 }
1208
1209 void AUTH_do_default_cred_dialog(PTInstVar pvar)
1210 {
1211 HWND cur_active = GetActiveWindow();
1212
1213 if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHAUTHSETUP),
1214 cur_active != NULL ? cur_active
1215 : pvar->NotificationWindow,
1216 default_auth_dlg_proc, (LPARAM) pvar) == -1) {
1217 UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTHSETUP_ERROR", pvar,
1218 "Unable to display authentication setup dialog box.");
1219 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1220 }
1221 }
1222
1223 void AUTH_destroy_cur_cred(PTInstVar pvar)
1224 {
1225 destroy_malloced_string(&pvar->auth_state.cur_cred.password);
1226 destroy_malloced_string(&pvar->auth_state.cur_cred.rhosts_client_user);
1227 if (pvar->auth_state.cur_cred.key_pair != NULL) {
1228 CRYPT_free_key_pair(pvar->auth_state.cur_cred.key_pair);
1229 pvar->auth_state.cur_cred.key_pair = NULL;
1230 }
1231 }
1232
1233 static char FAR *get_auth_method_name(SSHAuthMethod auth)
1234 {
1235 switch (auth) {
1236 case SSH_AUTH_PASSWORD:
1237 return "password";
1238 case SSH_AUTH_RSA:
1239 return "RSA";
1240 case SSH_AUTH_RHOSTS:
1241 return "rhosts";
1242 case SSH_AUTH_RHOSTS_RSA:
1243 return "rhosts with RSA";
1244 case SSH_AUTH_TIS:
1245 return "challenge/response (TIS)";
1246 default:
1247 return "unknown method";
1248 }
1249 }
1250
1251 void AUTH_get_auth_info(PTInstVar pvar, char FAR * dest, int len)
1252 {
1253 char *method = "unknown";
1254
1255 if (pvar->auth_state.user == NULL) {
1256 strncpy_s(dest, len, "None", _TRUNCATE);
1257 } else if (pvar->auth_state.cur_cred.method != SSH_AUTH_NONE) {
1258 if (SSHv1(pvar)) {
1259 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1260 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1261 get_auth_method_name(pvar->auth_state.cur_cred.method));
1262
1263 } else {
1264 // SSH2:�F�����\�b�h������ (2004.12.23 yutaka)
1265 // keyboard-interactive���\�b�h������ (2005.3.12 yutaka)
1266 if (pvar->auth_state.cur_cred.method == SSH_AUTH_PASSWORD ||
1267 pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1268 // keyboard-interactive���\�b�h������ (2005.1.24 yutaka)
1269 if (pvar->keyboard_interactive_done == 1 ||
1270 pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1271 method = "keyboard-interactive";
1272 } else {
1273 method = get_auth_method_name(pvar->auth_state.cur_cred.method);
1274 }
1275 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1276 _snprintf_s(dest, len, _TRUNCATE,
1277 pvar->ts->UIMsg, pvar->auth_state.user, method);
1278
1279 } else {
1280 if (pvar->auth_state.cur_cred.key_pair->RSA_key != NULL) {
1281 method = "RSA";
1282 } else if (pvar->auth_state.cur_cred.key_pair->DSA_key != NULL) {
1283 method = "DSA";
1284 }
1285 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1286 _snprintf_s(dest, len, _TRUNCATE,
1287 pvar->ts->UIMsg, pvar->auth_state.user, method);
1288 }
1289
1290 }
1291
1292 } else {
1293 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1294 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1295 get_auth_method_name(pvar->auth_state.failed_method));
1296 }
1297
1298 dest[len - 1] = 0;
1299 }
1300
1301 void AUTH_notify_disconnecting(PTInstVar pvar)
1302 {
1303 if (pvar->auth_state.auth_dialog != NULL) {
1304 PostMessage(pvar->auth_state.auth_dialog, WM_COMMAND, IDCANCEL, 0);
1305 /* the main window might not go away if it's not enabled. (see vtwin.cpp) */
1306 EnableWindow(pvar->NotificationWindow, TRUE);
1307 }
1308 }
1309
1310 void AUTH_end(PTInstVar pvar)
1311 {
1312 destroy_malloced_string(&pvar->auth_state.user);
1313 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1314
1315 AUTH_destroy_cur_cred(pvar);
1316 }

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