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

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