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 2939 - (show annotations) (download) (as text)
Wed Nov 29 16:58:52 2006 UTC (17 years, 4 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 42784 byte(s)
表示メッセージの読み込み対応

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

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