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 3025 - (show annotations) (download) (as text)
Thu Oct 4 15:15:04 2007 UTC (16 years, 6 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 45715 byte(s)
/auth=challange コマンドラインパラメータを追加した。

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

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