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 3016 - (show annotations) (download) (as text)
Mon Oct 1 06:22:57 2007 UTC (16 years, 6 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 44933 byte(s)
ホスト鍵が確認されるまで認証情報を送らないよう変更した。

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

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