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 3063 - (show annotations) (download) (as text)
Sat Nov 3 13:34:24 2007 UTC (16 years, 5 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 46590 byte(s)
"CheckAuthListFirst" のためのチェックボックスを "SSH Authentication" ダイアログに追加した。

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_TIS);
801 }
802 pvar->auth_state.supported_types = types;
803
804 if (types == 0) {
805 UTIL_get_lang_msg("MSG_NOAUTHMETHOD_ERROR", pvar,
806 "Server does not support any of the authentication options\n"
807 "provided by TTSSH. This connection will now close.");
808 notify_fatal_error(pvar, pvar->ts->UIMsg);
809 return 0;
810 } else {
811 if (pvar->auth_state.auth_dialog != NULL) {
812 update_server_supported_types(pvar,
813 pvar->auth_state.auth_dialog);
814 }
815
816 return 1;
817 }
818 }
819
820 static void start_user_auth(PTInstVar pvar)
821 {
822 // �F���_�C�A���O���\�������� (2004.12.1 yutaka)
823 PostMessage(pvar->NotificationWindow, WM_COMMAND, (WPARAM) ID_SSHAUTH,
824 (LPARAM) NULL);
825 pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
826 }
827
828 static void try_default_auth(PTInstVar pvar)
829 {
830 if (pvar->session_settings.TryDefaultAuth) {
831 switch (pvar->session_settings.DefaultAuthMethod) {
832 case SSH_AUTH_RSA:{
833 BOOL invalid_passphrase;
834 char password[] = "";
835
836 pvar->auth_state.cur_cred.key_pair
837 =
838 KEYFILES_read_private_key(pvar,
839 pvar->session_settings.
840 DefaultRSAPrivateKeyFile,
841 password,
842 &invalid_passphrase, TRUE);
843 if (pvar->auth_state.cur_cred.key_pair == NULL) {
844 return;
845 } else {
846 pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
847 }
848 break;
849 }
850
851 case SSH_AUTH_RHOSTS:
852 if (pvar->session_settings.
853 DefaultRhostsHostPrivateKeyFile[0] != 0) {
854 BOOL invalid_passphrase;
855 char password[] = "";
856
857 pvar->auth_state.cur_cred.key_pair
858 =
859 KEYFILES_read_private_key(pvar,
860 pvar->session_settings.
861 DefaultRhostsHostPrivateKeyFile,
862 password,
863 &invalid_passphrase, TRUE);
864 if (pvar->auth_state.cur_cred.key_pair == NULL) {
865 return;
866 } else {
867 pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS_RSA;
868 }
869 } else {
870 pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS;
871 }
872
873 pvar->auth_state.cur_cred.rhosts_client_user =
874 _strdup(pvar->session_settings.DefaultRhostsLocalUserName);
875 break;
876
877 case SSH_AUTH_PASSWORD:
878 pvar->auth_state.cur_cred.password = _strdup("");
879 pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
880 break;
881
882 case SSH_AUTH_TIS:
883 default:
884 return;
885 }
886
887 pvar->auth_state.user =
888 _strdup(pvar->session_settings.DefaultUserName);
889 }
890 }
891
892 void AUTH_notify_end_error(PTInstVar pvar)
893 {
894 if ((pvar->auth_state.flags & AUTH_START_USER_AUTH_ON_ERROR_END) != 0) {
895 start_user_auth(pvar);
896 pvar->auth_state.flags &= ~AUTH_START_USER_AUTH_ON_ERROR_END;
897 }
898 }
899
900 void AUTH_advance_to_next_cred(PTInstVar pvar)
901 {
902 pvar->auth_state.failed_method = pvar->auth_state.cur_cred.method;
903
904 if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
905 try_default_auth(pvar);
906
907 if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
908 if (pvar->err_msg != NULL) {
909 pvar->auth_state.flags |=
910 AUTH_START_USER_AUTH_ON_ERROR_END;
911 } else {
912 // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
913 // �R�}���h���C���w������������
914 start_user_auth(pvar);
915 }
916 }
917 } else {
918 // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
919 // �R�}���h���C���w������(/auth=xxxx)������
920 start_user_auth(pvar);
921 }
922 }
923
924 static void init_TIS_dlg(PTInstVar pvar, HWND dlg)
925 {
926 char uimsg[MAX_UIMSG];
927
928 GetWindowText(dlg, uimsg, sizeof(uimsg));
929 UTIL_get_lang_msg("DLG_TIS_TITLE", pvar, uimsg);
930 SetWindowText(dlg, pvar->ts->UIMsg);
931 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
932 UTIL_get_lang_msg("DLG_TIS_BANNER", pvar, uimsg);
933 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
934 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
935 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
936 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
937 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
938 UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
939 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
940
941 init_auth_machine_banner(pvar, dlg);
942 init_password_control(dlg);
943
944 if (pvar->auth_state.TIS_prompt != NULL) {
945 if (strlen(pvar->auth_state.TIS_prompt) > 10000) {
946 pvar->auth_state.TIS_prompt[10000] = 0;
947 }
948 SetDlgItemText(dlg, IDC_SSHAUTHBANNER2,
949 pvar->auth_state.TIS_prompt);
950 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
951 }
952 }
953
954 static BOOL end_TIS_dlg(PTInstVar pvar, HWND dlg)
955 {
956 char FAR *password =
957 alloc_control_text(GetDlgItem(dlg, IDC_SSHPASSWORD));
958
959 pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
960 pvar->auth_state.cur_cred.password = password;
961 pvar->auth_state.auth_dialog = NULL;
962
963 // add
964 if (SSHv2(pvar)) {
965 pvar->keyboard_interactive_password_input = 1;
966 handle_SSH2_userauth_inforeq(pvar);
967 }
968
969 SSH_notify_cred(pvar);
970
971 EndDialog(dlg, 1);
972 return TRUE;
973 }
974
975 static BOOL CALLBACK TIS_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
976 LPARAM lParam)
977 {
978 PTInstVar pvar;
979 LOGFONT logfont;
980 HFONT font;
981
982 switch (msg) {
983 case WM_INITDIALOG:
984 pvar = (PTInstVar) lParam;
985 pvar->auth_state.auth_dialog = dlg;
986 SetWindowLong(dlg, DWL_USER, lParam);
987
988 init_TIS_dlg(pvar, dlg);
989
990 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
991 GetObject(font, sizeof(LOGFONT), &logfont);
992 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgTisFont, pvar)) {
993 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
994 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
995 SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
996 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
997 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
998 }
999 else {
1000 DlgTisFont = NULL;
1001 }
1002
1003 // /auth=challenge ������ (2007.10.5 maya)
1004 if (pvar->ssh2_autologin == 1) {
1005 SetDlgItemText(dlg, IDC_SSHPASSWORD, pvar->ssh2_password);
1006 SendMessage(dlg, WM_COMMAND, IDOK, 0);
1007 }
1008
1009 return FALSE; /* because we set the focus */
1010
1011 case WM_COMMAND:
1012 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1013
1014 switch (LOWORD(wParam)) {
1015 case IDOK:
1016 if (DlgTisFont != NULL) {
1017 DeleteObject(DlgTisFont);
1018 }
1019
1020 return end_TIS_dlg(pvar, dlg);
1021
1022 case IDCANCEL: /* kill the connection */
1023 pvar->auth_state.auth_dialog = NULL;
1024 notify_closed_connection(pvar);
1025 EndDialog(dlg, 0);
1026
1027 if (DlgTisFont != NULL) {
1028 DeleteObject(DlgTisFont);
1029 }
1030
1031 return TRUE;
1032
1033 default:
1034 return FALSE;
1035 }
1036
1037 default:
1038 return FALSE;
1039 }
1040 }
1041
1042 void AUTH_do_cred_dialog(PTInstVar pvar)
1043 {
1044 if (pvar->auth_state.auth_dialog == NULL) {
1045 HWND cur_active = GetActiveWindow();
1046 DLGPROC dlg_proc;
1047 LPCTSTR dialog_template;
1048
1049 switch (pvar->auth_state.mode) {
1050 case TIS_AUTH_MODE:
1051 dialog_template = MAKEINTRESOURCE(IDD_SSHTISAUTH);
1052 dlg_proc = TIS_dlg_proc;
1053 break;
1054 case GENERIC_AUTH_MODE:
1055 default:
1056 dialog_template = MAKEINTRESOURCE(IDD_SSHAUTH);
1057 dlg_proc = auth_dlg_proc;
1058 }
1059
1060 if (!DialogBoxParam(hInst, dialog_template,
1061 cur_active !=
1062 NULL ? cur_active : pvar->NotificationWindow,
1063 dlg_proc, (LPARAM) pvar) == -1) {
1064 UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTH_ERROR", pvar,
1065 "Unable to display authentication dialog box.\n"
1066 "Connection terminated.");
1067 notify_fatal_error(pvar, pvar->ts->UIMsg);
1068 }
1069 }
1070 }
1071
1072 static void init_default_auth_dlg(PTInstVar pvar, HWND dlg)
1073 {
1074 char uimsg[MAX_UIMSG];
1075
1076 GetWindowText(dlg, uimsg, sizeof(uimsg));
1077 UTIL_get_lang_msg("DLG_AUTHSETUP_TITLE", pvar, uimsg);
1078 SetWindowText(dlg, pvar->ts->UIMsg);
1079 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
1080 UTIL_get_lang_msg("DLG_AUTHSETUP_BANNER", pvar, uimsg);
1081 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
1082 GetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, uimsg, sizeof(uimsg));
1083 UTIL_get_lang_msg("DLG_AUTHSETUP_USERNAME", pvar, uimsg);
1084 SetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, pvar->ts->UIMsg);
1085 GetDlgItemText(dlg, IDC_SSHUSEPASSWORD, uimsg, sizeof(uimsg));
1086 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PASSWORD", pvar, uimsg);
1087 SetDlgItemText(dlg, IDC_SSHUSEPASSWORD, pvar->ts->UIMsg);
1088 GetDlgItemText(dlg, IDC_SSHUSERSA, uimsg, sizeof(uimsg));
1089 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RSA", pvar, uimsg);
1090 SetDlgItemText(dlg, IDC_SSHUSERSA, pvar->ts->UIMsg);
1091 GetDlgItemText(dlg, IDC_SSHUSERHOSTS, uimsg, sizeof(uimsg));
1092 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RHOST", pvar, uimsg);
1093 SetDlgItemText(dlg, IDC_SSHUSERHOSTS, pvar->ts->UIMsg);
1094 GetDlgItemText(dlg, IDC_SSHUSETIS, uimsg, sizeof(uimsg));
1095 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_CHALLENGE", pvar, uimsg);
1096 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
1097 GetDlgItemText(dlg, IDC_CHOOSERSAFILE, uimsg, sizeof(uimsg));
1098 UTIL_get_lang_msg("DLG_AUTH_PRIVATEKEY", pvar, uimsg);
1099 SetDlgItemText(dlg, IDC_CHOOSERSAFILE, pvar->ts->UIMsg);
1100 GetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, uimsg, sizeof(uimsg));
1101 UTIL_get_lang_msg("DLG_AUTH_LOCALUSER", pvar, uimsg);
1102 SetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, pvar->ts->UIMsg);
1103 GetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, uimsg, sizeof(uimsg));
1104 UTIL_get_lang_msg("DLG_AUTH_HOST_PRIVATEKEY", pvar, uimsg);
1105 SetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, pvar->ts->UIMsg);
1106 GetDlgItemText(dlg, IDC_CHECKAUTH, uimsg, sizeof(uimsg));
1107 UTIL_get_lang_msg("DLG_AUTHSETUP_CHECKAUTH", pvar, uimsg);
1108 SetDlgItemText(dlg, IDC_CHECKAUTH, pvar->ts->UIMsg);
1109 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1110 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1111 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1112 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1113 UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
1114 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1115
1116 switch (pvar->settings.DefaultAuthMethod) {
1117 case SSH_AUTH_RSA:
1118 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1119 IDC_SSHUSERSA);
1120 break;
1121 case SSH_AUTH_RHOSTS:
1122 case SSH_AUTH_RHOSTS_RSA:
1123 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1124 IDC_SSHUSERHOSTS);
1125 break;
1126 case SSH_AUTH_TIS:
1127 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1128 IDC_SSHUSETIS);
1129 break;
1130 case SSH_AUTH_PASSWORD:
1131 default:
1132 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1133 IDC_SSHUSEPASSWORD);
1134 }
1135
1136 SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName);
1137 SetDlgItemText(dlg, IDC_RSAFILENAME,
1138 pvar->settings.DefaultRSAPrivateKeyFile);
1139 SetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1140 pvar->settings.DefaultRhostsHostPrivateKeyFile);
1141 SetDlgItemText(dlg, IDC_LOCALUSERNAME,
1142 pvar->settings.DefaultRhostsLocalUserName);
1143
1144 if (pvar->settings.CheckAuthListFirst) {
1145 CheckDlgButton(dlg, IDC_CHECKAUTH, TRUE);
1146 }
1147 }
1148
1149 static BOOL end_default_auth_dlg(PTInstVar pvar, HWND dlg)
1150 {
1151 if (IsDlgButtonChecked(dlg, IDC_SSHUSERSA)) {
1152 pvar->settings.DefaultAuthMethod = SSH_AUTH_RSA;
1153 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSERHOSTS)) {
1154 if (GetWindowTextLength(GetDlgItem(dlg, IDC_HOSTRSAFILENAME)) > 0) {
1155 pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS_RSA;
1156 } else {
1157 pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS;
1158 }
1159 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSETIS)) {
1160 pvar->settings.DefaultAuthMethod = SSH_AUTH_TIS;
1161 } else {
1162 pvar->settings.DefaultAuthMethod = SSH_AUTH_PASSWORD;
1163 }
1164
1165 GetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName,
1166 sizeof(pvar->settings.DefaultUserName));
1167 GetDlgItemText(dlg, IDC_RSAFILENAME,
1168 pvar->settings.DefaultRSAPrivateKeyFile,
1169 sizeof(pvar->settings.DefaultRSAPrivateKeyFile));
1170 GetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1171 pvar->settings.DefaultRhostsHostPrivateKeyFile,
1172 sizeof(pvar->settings.DefaultRhostsHostPrivateKeyFile));
1173 GetDlgItemText(dlg, IDC_LOCALUSERNAME,
1174 pvar->settings.DefaultRhostsLocalUserName,
1175 sizeof(pvar->settings.DefaultRhostsLocalUserName));
1176
1177 if (IsDlgButtonChecked(dlg, IDC_CHECKAUTH)) {
1178 pvar->settings.CheckAuthListFirst = TRUE;
1179 }
1180 else {
1181 pvar->settings.CheckAuthListFirst = FALSE;
1182 }
1183
1184 EndDialog(dlg, 1);
1185 return TRUE;
1186 }
1187
1188 static BOOL CALLBACK default_auth_dlg_proc(HWND dlg, UINT msg,
1189 WPARAM wParam, LPARAM lParam)
1190 {
1191 PTInstVar pvar;
1192 LOGFONT logfont;
1193 HFONT font;
1194
1195 switch (msg) {
1196 case WM_INITDIALOG:
1197 pvar = (PTInstVar) lParam;
1198 SetWindowLong(dlg, DWL_USER, lParam);
1199
1200 init_default_auth_dlg(pvar, dlg);
1201
1202 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1203 GetObject(font, sizeof(LOGFONT), &logfont);
1204 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthSetupFont, pvar)) {
1205 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1206 SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1207 SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1208 SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1209 SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1210 SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1211 SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1212 SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1213 SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1214 SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1215 SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1216 SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1217 SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1218 SendDlgItemMessage(dlg, IDC_CHECKAUTH, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1219 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1220 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1221 }
1222 else {
1223 DlgAuthSetupFont = NULL;
1224 }
1225
1226 return TRUE; /* because we do not set the focus */
1227
1228 case WM_COMMAND:
1229 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1230
1231 switch (LOWORD(wParam)) {
1232 case IDOK:
1233
1234 if (DlgAuthSetupFont != NULL) {
1235 DeleteObject(DlgAuthSetupFont);
1236 }
1237
1238 return end_default_auth_dlg(pvar, dlg);
1239
1240 case IDCANCEL:
1241 EndDialog(dlg, 0);
1242
1243 if (DlgAuthSetupFont != NULL) {
1244 DeleteObject(DlgAuthSetupFont);
1245 }
1246
1247 return TRUE;
1248
1249 case IDC_CHOOSERSAFILE:
1250 choose_RSA_key_file(dlg, pvar);
1251 return TRUE;
1252
1253 case IDC_CHOOSEHOSTRSAFILE:
1254 choose_host_RSA_key_file(dlg, pvar);
1255 return TRUE;
1256
1257 default:
1258 return FALSE;
1259 }
1260
1261 default:
1262 return FALSE;
1263 }
1264 }
1265
1266 void AUTH_init(PTInstVar pvar)
1267 {
1268 pvar->auth_state.failed_method = SSH_AUTH_NONE;
1269 pvar->auth_state.auth_dialog = NULL;
1270 pvar->auth_state.user = NULL;
1271 pvar->auth_state.flags = 0;
1272 pvar->auth_state.TIS_prompt = NULL;
1273 pvar->auth_state.supported_types = 0;
1274 pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
1275 pvar->auth_state.cur_cred.password = NULL;
1276 pvar->auth_state.cur_cred.rhosts_client_user = NULL;
1277 pvar->auth_state.cur_cred.key_pair = NULL;
1278 AUTH_set_generic_mode(pvar);
1279 }
1280
1281 void AUTH_set_generic_mode(PTInstVar pvar)
1282 {
1283 pvar->auth_state.mode = GENERIC_AUTH_MODE;
1284 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1285 }
1286
1287 void AUTH_set_TIS_mode(PTInstVar pvar, char FAR * prompt, int len)
1288 {
1289 if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1290 pvar->auth_state.mode = TIS_AUTH_MODE;
1291
1292 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1293 pvar->auth_state.TIS_prompt = malloc(len + 1);
1294 memcpy(pvar->auth_state.TIS_prompt, prompt, len);
1295 pvar->auth_state.TIS_prompt[len] = 0;
1296 } else {
1297 AUTH_set_generic_mode(pvar);
1298 }
1299 }
1300
1301 void AUTH_do_default_cred_dialog(PTInstVar pvar)
1302 {
1303 HWND cur_active = GetActiveWindow();
1304
1305 if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHAUTHSETUP),
1306 cur_active != NULL ? cur_active
1307 : pvar->NotificationWindow,
1308 default_auth_dlg_proc, (LPARAM) pvar) == -1) {
1309 UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTHSETUP_ERROR", pvar,
1310 "Unable to display authentication setup dialog box.");
1311 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1312 }
1313 }
1314
1315 void AUTH_destroy_cur_cred(PTInstVar pvar)
1316 {
1317 destroy_malloced_string(&pvar->auth_state.cur_cred.password);
1318 destroy_malloced_string(&pvar->auth_state.cur_cred.rhosts_client_user);
1319 if (pvar->auth_state.cur_cred.key_pair != NULL) {
1320 CRYPT_free_key_pair(pvar->auth_state.cur_cred.key_pair);
1321 pvar->auth_state.cur_cred.key_pair = NULL;
1322 }
1323 }
1324
1325 static char FAR *get_auth_method_name(SSHAuthMethod auth)
1326 {
1327 switch (auth) {
1328 case SSH_AUTH_PASSWORD:
1329 return "password";
1330 case SSH_AUTH_RSA:
1331 return "RSA";
1332 case SSH_AUTH_RHOSTS:
1333 return "rhosts";
1334 case SSH_AUTH_RHOSTS_RSA:
1335 return "rhosts with RSA";
1336 case SSH_AUTH_TIS:
1337 return "challenge/response (TIS)";
1338 default:
1339 return "unknown method";
1340 }
1341 }
1342
1343 void AUTH_get_auth_info(PTInstVar pvar, char FAR * dest, int len)
1344 {
1345 char *method = "unknown";
1346
1347 if (pvar->auth_state.user == NULL) {
1348 strncpy_s(dest, len, "None", _TRUNCATE);
1349 } else if (pvar->auth_state.cur_cred.method != SSH_AUTH_NONE) {
1350 if (SSHv1(pvar)) {
1351 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1352 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1353 get_auth_method_name(pvar->auth_state.cur_cred.method));
1354
1355 } else {
1356 // SSH2:�F�����\�b�h������ (2004.12.23 yutaka)
1357 // keyboard-interactive���\�b�h������ (2005.3.12 yutaka)
1358 if (pvar->auth_state.cur_cred.method == SSH_AUTH_PASSWORD ||
1359 pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1360 // keyboard-interactive���\�b�h������ (2005.1.24 yutaka)
1361 if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1362 method = "keyboard-interactive";
1363 } else {
1364 method = get_auth_method_name(pvar->auth_state.cur_cred.method);
1365 }
1366 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1367 _snprintf_s(dest, len, _TRUNCATE,
1368 pvar->ts->UIMsg, pvar->auth_state.user, method);
1369
1370 } else {
1371 if (pvar->auth_state.cur_cred.key_pair->RSA_key != NULL) {
1372 method = "RSA";
1373 } else if (pvar->auth_state.cur_cred.key_pair->DSA_key != NULL) {
1374 method = "DSA";
1375 }
1376 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1377 _snprintf_s(dest, len, _TRUNCATE,
1378 pvar->ts->UIMsg, pvar->auth_state.user, method);
1379 }
1380
1381 }
1382
1383 } else {
1384 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1385 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1386 get_auth_method_name(pvar->auth_state.failed_method));
1387 }
1388
1389 dest[len - 1] = 0;
1390 }
1391
1392 void AUTH_notify_disconnecting(PTInstVar pvar)
1393 {
1394 if (pvar->auth_state.auth_dialog != NULL) {
1395 PostMessage(pvar->auth_state.auth_dialog, WM_COMMAND, IDCANCEL, 0);
1396 /* the main window might not go away if it's not enabled. (see vtwin.cpp) */
1397 EnableWindow(pvar->NotificationWindow, TRUE);
1398 }
1399 }
1400
1401 void AUTH_end(PTInstVar pvar)
1402 {
1403 destroy_malloced_string(&pvar->auth_state.user);
1404 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1405
1406 AUTH_destroy_cur_cred(pvar);
1407 }

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