Open-Source-Software-Entwicklung und Downloads

Browse Subversion Repository

Contents of /trunk/ttssh2/ttxssh/auth.c

Parent Directory Parent Directory | Revision Log Revision Log


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

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