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 3029 - (show annotations) (download) (as text)
Fri Oct 5 02:08:13 2007 UTC (16 years, 6 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 46106 byte(s)
SSH1 でうまく動かないのを修正した。
TIS で OK ボタンを自動的に押すタイミングを修正した。

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

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