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 3128 - (show annotations) (download) (as text)
Wed May 21 01:05:36 2008 UTC (16 years ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 50002 byte(s)
認証ダイアログで Pageant が国際化対応されていなかったのを修正した。

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 static BOOL CALLBACK auth_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
629 LPARAM lParam)
630 {
631 const int IDC_TIMER1 = 300;
632 const int IDC_TIMER2 = 301;
633 const int IDC_TIMER3 = 302;
634 const int autologin_timeout = 10; // �~���b
635 PTInstVar pvar;
636 LOGFONT logfont;
637 HFONT font;
638
639 switch (msg) {
640 case WM_INITDIALOG:
641 pvar = (PTInstVar) lParam;
642 pvar->auth_state.auth_dialog = dlg;
643 SetWindowLong(dlg, DWL_USER, lParam);
644
645 init_auth_dlg(pvar, dlg);
646
647 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
648 GetObject(font, sizeof(LOGFONT), &logfont);
649 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthFont, pvar)) {
650 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
651 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
652 SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
653 SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
654 SendDlgItemMessage(dlg, IDC_SSHPASSWORDCAPTION, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
655 SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
656 SendDlgItemMessage(dlg, IDC_REMEMBER_PASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
657 SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
658 SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
659 SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
660 SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
661 SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
662 SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
663 SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
664 SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
665 SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
666 SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
667 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
668 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
669 }
670 else {
671 DlgAuthFont = NULL;
672 }
673
674 // SSH2 autologin���L�����������A�^�C�}���d�|�����B (2004.12.1 yutaka)
675 if (pvar->ssh2_autologin == 1) {
676 SetTimer(dlg, IDC_TIMER1, autologin_timeout, 0);
677 }
678 else {
679 // �T�|�[�g�������������\�b�h���`�F�b�N�����B(2007.9.24 maya)
680 // �������L�����A�����������s�����������A���[�U�����m����������
681 if (pvar->session_settings.CheckAuthListFirst &&
682 !pvar->tryed_ssh2_authlist &&
683 GetWindowTextLength(GetDlgItem(dlg, IDC_SSHUSERNAME)) > 0) {
684 SetTimer(dlg, IDC_TIMER2, autologin_timeout, 0);
685 }
686 // /auth=challenge ���w���������������[�U�����m������������
687 // �������������������v�����������AOK �{�^����������
688 // TIS auth �_�C�A���O���o��
689 else {
690 SetTimer(dlg, IDC_TIMER3, autologin_timeout, 0);
691 }
692 }
693 return FALSE; /* because we set the focus */
694
695 case WM_TIMER:
696 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
697 // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2004.12.16 yutaka)
698 if (wParam == IDC_TIMER1) {
699 // �������O�C��������
700 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
701 (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
702 KillTimer(dlg, IDC_TIMER1);
703 SendMessage(dlg, WM_COMMAND, IDOK, 0);
704 }
705 }
706 else if (wParam == IDC_TIMER2) {
707 // authlist ����������
708 if (SSHv2(pvar)) {
709 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
710 (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
711 KillTimer(dlg, IDC_TIMER2);
712
713 // �_�C�A���O�����[�U������������
714 if (pvar->auth_state.user == NULL) {
715 pvar->auth_state.user =
716 alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
717 }
718
719 // ���[�U�������X��������
720 EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
721
722 // none ������
723 do_SSH2_userauth(pvar);
724
725 // TIS �p�� OK �������^�C�}�[���d�|��������
726 // �F�������s������������������
727 // Unexpected SSH2 message �������B
728 }
729 }
730 else if (SSHv1(pvar)) {
731 KillTimer(dlg, IDC_TIMER2);
732 // TIS �p�� OK �������^�C�}�[���d�|����
733 if (pvar->ssh2_authmethod == SSH_AUTH_TIS) {
734 SendMessage(dlg, WM_COMMAND, IDOK, 0);
735 }
736 // SSH1 ���� none ����������
737 }
738 // �v���g�R���o�[�W�����m���O������������
739 }
740 else if (wParam == IDC_TIMER3) {
741 if (SSHv2(pvar) || SSHv1(pvar)) {
742 // TIS �p�� OK �������^�C�}�[���d�|����
743 if (pvar->ssh2_authmethod == SSH_AUTH_TIS) {
744 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
745 (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
746 KillTimer(dlg, IDC_TIMER3);
747 SendMessage(dlg, WM_COMMAND, IDOK, 0);
748 }
749 }
750 }
751 // �v���g�R���o�[�W�����m���O������������
752 }
753 return FALSE;
754
755 case WM_COMMAND:
756 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
757
758 switch (LOWORD(wParam)) {
759 case IDOK:
760 // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2001.1.25 yutaka)
761 if (pvar->userauth_retry_count == 0 &&
762 ((pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) ||
763 !(pvar->ssh_state.status_flags & STATUS_HOST_OK))) {
764 return FALSE;
765 }
766
767 return end_auth_dlg(pvar, dlg);
768
769 case IDCANCEL: /* kill the connection */
770 pvar->auth_state.auth_dialog = NULL;
771 notify_closed_connection(pvar);
772 EndDialog(dlg, 0);
773
774 if (DlgAuthFont != NULL) {
775 DeleteObject(DlgAuthFont);
776 }
777
778 return TRUE;
779
780 case IDC_SSHUSERNAME:
781 // ���[�U�����t�H�[�J�X������������ (2007.9.29 maya)
782 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
783 (pvar->ssh_state.status_flags & STATUS_HOST_OK) &&
784 HIWORD(wParam) == EN_KILLFOCUS) {
785 // �������L���������������s��������������
786 if (SSHv2(pvar) &&
787 pvar->session_settings.CheckAuthListFirst &&
788 !pvar->tryed_ssh2_authlist) {
789 // �_�C�A���O�����[�U�������f
790 if (pvar->auth_state.user == NULL) {
791 pvar->auth_state.user =
792 alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
793 }
794
795 // ���[�U���������������������`�F�b�N����
796 if (strlen(pvar->auth_state.user) == 0) {
797 return FALSE;
798 }
799
800 // ���[�U�������X��������
801 EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
802
803 // none ������
804 do_SSH2_userauth(pvar);
805 return TRUE;
806 }
807 }
808
809 return FALSE;
810
811 case IDC_SSHUSEPASSWORD:
812 case IDC_SSHUSERSA:
813 case IDC_SSHUSERHOSTS:
814 case IDC_SSHUSETIS:
815 case IDC_SSHUSEPAGEANT:
816 set_auth_options_status(dlg, LOWORD(wParam));
817 return TRUE;
818
819 case IDC_CHOOSERSAFILE:
820 choose_RSA_key_file(dlg, pvar);
821 return TRUE;
822
823 case IDC_CHOOSEHOSTRSAFILE:
824 choose_host_RSA_key_file(dlg, pvar);
825 return TRUE;
826
827 default:
828 return FALSE;
829 }
830
831 default:
832 return FALSE;
833 }
834 }
835
836 char FAR *AUTH_get_user_name(PTInstVar pvar)
837 {
838 return pvar->auth_state.user;
839 }
840
841 int AUTH_set_supported_auth_types(PTInstVar pvar, int types)
842 {
843 char buf[1024];
844
845 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
846 "Server reports supported authentication method mask = %d",
847 types);
848 buf[sizeof(buf) - 1] = 0;
849 notify_verbose_message(pvar, buf, LOG_LEVEL_VERBOSE);
850
851 if (SSHv1(pvar)) {
852 types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
853 | (1 << SSH_AUTH_RHOSTS_RSA) | (1 << SSH_AUTH_RHOSTS)
854 | (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);
855 } else {
856 // for SSH2(yutaka)
857 // types &= (1 << SSH_AUTH_PASSWORD);
858 // ���J���F�����L�������� (2004.12.18 yutaka)
859 // TIS�������BSSH2����keyboard-interactive�����������B(2005.3.12 yutaka)
860 types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
861 | (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);
862 }
863 pvar->auth_state.supported_types = types;
864
865 if (types == 0) {
866 UTIL_get_lang_msg("MSG_NOAUTHMETHOD_ERROR", pvar,
867 "Server does not support any of the authentication options\n"
868 "provided by TTSSH. This connection will now close.");
869 notify_fatal_error(pvar, pvar->ts->UIMsg);
870 return 0;
871 } else {
872 if (pvar->auth_state.auth_dialog != NULL) {
873 update_server_supported_types(pvar,
874 pvar->auth_state.auth_dialog);
875 }
876
877 return 1;
878 }
879 }
880
881 static void start_user_auth(PTInstVar pvar)
882 {
883 // �F���_�C�A���O���\�������� (2004.12.1 yutaka)
884 PostMessage(pvar->NotificationWindow, WM_COMMAND, (WPARAM) ID_SSHAUTH,
885 (LPARAM) NULL);
886 pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
887 }
888
889 static void try_default_auth(PTInstVar pvar)
890 {
891 if (pvar->session_settings.TryDefaultAuth) {
892 switch (pvar->session_settings.DefaultAuthMethod) {
893 case SSH_AUTH_RSA:{
894 BOOL invalid_passphrase;
895 char password[] = "";
896
897 pvar->auth_state.cur_cred.key_pair
898 =
899 KEYFILES_read_private_key(pvar,
900 pvar->session_settings.
901 DefaultRSAPrivateKeyFile,
902 password,
903 &invalid_passphrase, TRUE);
904 if (pvar->auth_state.cur_cred.key_pair == NULL) {
905 return;
906 } else {
907 pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
908 }
909 break;
910 }
911
912 case SSH_AUTH_RHOSTS:
913 if (pvar->session_settings.
914 DefaultRhostsHostPrivateKeyFile[0] != 0) {
915 BOOL invalid_passphrase;
916 char password[] = "";
917
918 pvar->auth_state.cur_cred.key_pair
919 =
920 KEYFILES_read_private_key(pvar,
921 pvar->session_settings.
922 DefaultRhostsHostPrivateKeyFile,
923 password,
924 &invalid_passphrase, TRUE);
925 if (pvar->auth_state.cur_cred.key_pair == NULL) {
926 return;
927 } else {
928 pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS_RSA;
929 }
930 } else {
931 pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS;
932 }
933
934 pvar->auth_state.cur_cred.rhosts_client_user =
935 _strdup(pvar->session_settings.DefaultRhostsLocalUserName);
936 break;
937
938 case SSH_AUTH_PAGEANT:
939 pvar->auth_state.cur_cred.method = SSH_AUTH_PAGEANT;
940 break;
941
942 case SSH_AUTH_PASSWORD:
943 pvar->auth_state.cur_cred.password = _strdup("");
944 pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
945 break;
946
947 case SSH_AUTH_TIS:
948 default:
949 return;
950 }
951
952 pvar->auth_state.user =
953 _strdup(pvar->session_settings.DefaultUserName);
954 }
955 }
956
957 void AUTH_notify_end_error(PTInstVar pvar)
958 {
959 if ((pvar->auth_state.flags & AUTH_START_USER_AUTH_ON_ERROR_END) != 0) {
960 start_user_auth(pvar);
961 pvar->auth_state.flags &= ~AUTH_START_USER_AUTH_ON_ERROR_END;
962 }
963 }
964
965 void AUTH_advance_to_next_cred(PTInstVar pvar)
966 {
967 pvar->auth_state.failed_method = pvar->auth_state.cur_cred.method;
968
969 if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
970 try_default_auth(pvar);
971
972 if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
973 if (pvar->err_msg != NULL) {
974 pvar->auth_state.flags |=
975 AUTH_START_USER_AUTH_ON_ERROR_END;
976 } else {
977 // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
978 // �R�}���h���C���w������������
979 start_user_auth(pvar);
980 }
981 }
982 } else {
983 // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
984 // �R�}���h���C���w������(/auth=xxxx)������
985 start_user_auth(pvar);
986 }
987 }
988
989 static void init_TIS_dlg(PTInstVar pvar, HWND dlg)
990 {
991 char uimsg[MAX_UIMSG];
992
993 GetWindowText(dlg, uimsg, sizeof(uimsg));
994 UTIL_get_lang_msg("DLG_TIS_TITLE", pvar, uimsg);
995 SetWindowText(dlg, pvar->ts->UIMsg);
996 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
997 UTIL_get_lang_msg("DLG_TIS_BANNER", pvar, uimsg);
998 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
999 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1000 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1001 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1002 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1003 UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
1004 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1005
1006 init_auth_machine_banner(pvar, dlg);
1007 init_password_control(dlg);
1008
1009 if (pvar->auth_state.TIS_prompt != NULL) {
1010 if (strlen(pvar->auth_state.TIS_prompt) > 10000) {
1011 pvar->auth_state.TIS_prompt[10000] = 0;
1012 }
1013 SetDlgItemText(dlg, IDC_SSHAUTHBANNER2,
1014 pvar->auth_state.TIS_prompt);
1015 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1016 }
1017 }
1018
1019 static BOOL end_TIS_dlg(PTInstVar pvar, HWND dlg)
1020 {
1021 char FAR *password =
1022 alloc_control_text(GetDlgItem(dlg, IDC_SSHPASSWORD));
1023
1024 pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
1025 pvar->auth_state.cur_cred.password = password;
1026 pvar->auth_state.auth_dialog = NULL;
1027
1028 // add
1029 if (SSHv2(pvar)) {
1030 pvar->keyboard_interactive_password_input = 1;
1031 handle_SSH2_userauth_inforeq(pvar);
1032 }
1033
1034 SSH_notify_cred(pvar);
1035
1036 EndDialog(dlg, 1);
1037 return TRUE;
1038 }
1039
1040 static BOOL CALLBACK TIS_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
1041 LPARAM lParam)
1042 {
1043 PTInstVar pvar;
1044 LOGFONT logfont;
1045 HFONT font;
1046
1047 switch (msg) {
1048 case WM_INITDIALOG:
1049 pvar = (PTInstVar) lParam;
1050 pvar->auth_state.auth_dialog = dlg;
1051 SetWindowLong(dlg, DWL_USER, lParam);
1052
1053 init_TIS_dlg(pvar, dlg);
1054
1055 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1056 GetObject(font, sizeof(LOGFONT), &logfont);
1057 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgTisFont, pvar)) {
1058 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1059 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1060 SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1061 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1062 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1063 }
1064 else {
1065 DlgTisFont = NULL;
1066 }
1067
1068 // /auth=challenge ������ (2007.10.5 maya)
1069 if (pvar->ssh2_autologin == 1) {
1070 SetDlgItemText(dlg, IDC_SSHPASSWORD, pvar->ssh2_password);
1071 SendMessage(dlg, WM_COMMAND, IDOK, 0);
1072 }
1073
1074 return FALSE; /* because we set the focus */
1075
1076 case WM_COMMAND:
1077 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1078
1079 switch (LOWORD(wParam)) {
1080 case IDOK:
1081 if (DlgTisFont != NULL) {
1082 DeleteObject(DlgTisFont);
1083 }
1084
1085 return end_TIS_dlg(pvar, dlg);
1086
1087 case IDCANCEL: /* kill the connection */
1088 pvar->auth_state.auth_dialog = NULL;
1089 notify_closed_connection(pvar);
1090 EndDialog(dlg, 0);
1091
1092 if (DlgTisFont != NULL) {
1093 DeleteObject(DlgTisFont);
1094 }
1095
1096 return TRUE;
1097
1098 default:
1099 return FALSE;
1100 }
1101
1102 default:
1103 return FALSE;
1104 }
1105 }
1106
1107 void AUTH_do_cred_dialog(PTInstVar pvar)
1108 {
1109 if (pvar->auth_state.auth_dialog == NULL) {
1110 HWND cur_active = GetActiveWindow();
1111 DLGPROC dlg_proc;
1112 LPCTSTR dialog_template;
1113
1114 switch (pvar->auth_state.mode) {
1115 case TIS_AUTH_MODE:
1116 dialog_template = MAKEINTRESOURCE(IDD_SSHTISAUTH);
1117 dlg_proc = TIS_dlg_proc;
1118 break;
1119 case GENERIC_AUTH_MODE:
1120 default:
1121 dialog_template = MAKEINTRESOURCE(IDD_SSHAUTH);
1122 dlg_proc = auth_dlg_proc;
1123 }
1124
1125 if (!DialogBoxParam(hInst, dialog_template,
1126 cur_active !=
1127 NULL ? cur_active : pvar->NotificationWindow,
1128 dlg_proc, (LPARAM) pvar) == -1) {
1129 UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTH_ERROR", pvar,
1130 "Unable to display authentication dialog box.\n"
1131 "Connection terminated.");
1132 notify_fatal_error(pvar, pvar->ts->UIMsg);
1133 }
1134 }
1135 }
1136
1137 static void init_default_auth_dlg(PTInstVar pvar, HWND dlg)
1138 {
1139 char uimsg[MAX_UIMSG];
1140
1141 GetWindowText(dlg, uimsg, sizeof(uimsg));
1142 UTIL_get_lang_msg("DLG_AUTHSETUP_TITLE", pvar, uimsg);
1143 SetWindowText(dlg, pvar->ts->UIMsg);
1144 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
1145 UTIL_get_lang_msg("DLG_AUTHSETUP_BANNER", pvar, uimsg);
1146 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
1147 GetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, uimsg, sizeof(uimsg));
1148 UTIL_get_lang_msg("DLG_AUTHSETUP_USERNAME", pvar, uimsg);
1149 SetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, pvar->ts->UIMsg);
1150 GetDlgItemText(dlg, IDC_SSHUSEPASSWORD, uimsg, sizeof(uimsg));
1151 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PASSWORD", pvar, uimsg);
1152 SetDlgItemText(dlg, IDC_SSHUSEPASSWORD, pvar->ts->UIMsg);
1153 GetDlgItemText(dlg, IDC_SSHUSERSA, uimsg, sizeof(uimsg));
1154 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RSA", pvar, uimsg);
1155 SetDlgItemText(dlg, IDC_SSHUSERSA, pvar->ts->UIMsg);
1156 GetDlgItemText(dlg, IDC_SSHUSERHOSTS, uimsg, sizeof(uimsg));
1157 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RHOST", pvar, uimsg);
1158 SetDlgItemText(dlg, IDC_SSHUSERHOSTS, pvar->ts->UIMsg);
1159 GetDlgItemText(dlg, IDC_SSHUSETIS, uimsg, sizeof(uimsg));
1160 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_CHALLENGE", pvar, uimsg);
1161 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
1162 GetDlgItemText(dlg, IDC_SSHUSEPAGEANT, uimsg, sizeof(uimsg));
1163 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PAGEANT", pvar, uimsg);
1164 SetDlgItemText(dlg, IDC_SSHUSEPAGEANT, pvar->ts->UIMsg);
1165 GetDlgItemText(dlg, IDC_CHOOSERSAFILE, uimsg, sizeof(uimsg));
1166 UTIL_get_lang_msg("DLG_AUTH_PRIVATEKEY", pvar, uimsg);
1167 SetDlgItemText(dlg, IDC_CHOOSERSAFILE, pvar->ts->UIMsg);
1168 GetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, uimsg, sizeof(uimsg));
1169 UTIL_get_lang_msg("DLG_AUTH_LOCALUSER", pvar, uimsg);
1170 SetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, pvar->ts->UIMsg);
1171 GetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, uimsg, sizeof(uimsg));
1172 UTIL_get_lang_msg("DLG_AUTH_HOST_PRIVATEKEY", pvar, uimsg);
1173 SetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, pvar->ts->UIMsg);
1174 GetDlgItemText(dlg, IDC_CHECKAUTH, uimsg, sizeof(uimsg));
1175 UTIL_get_lang_msg("DLG_AUTHSETUP_CHECKAUTH", pvar, uimsg);
1176 SetDlgItemText(dlg, IDC_CHECKAUTH, pvar->ts->UIMsg);
1177 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1178 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1179 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1180 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1181 UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
1182 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1183
1184 switch (pvar->settings.DefaultAuthMethod) {
1185 case SSH_AUTH_RSA:
1186 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1187 IDC_SSHUSERSA);
1188 break;
1189 case SSH_AUTH_RHOSTS:
1190 case SSH_AUTH_RHOSTS_RSA:
1191 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1192 IDC_SSHUSERHOSTS);
1193 break;
1194 case SSH_AUTH_TIS:
1195 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1196 IDC_SSHUSETIS);
1197 break;
1198 case SSH_AUTH_PAGEANT:
1199 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1200 IDC_SSHUSEPAGEANT);
1201 break;
1202 case SSH_AUTH_PASSWORD:
1203 default:
1204 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1205 IDC_SSHUSEPASSWORD);
1206 }
1207
1208 SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName);
1209 SetDlgItemText(dlg, IDC_RSAFILENAME,
1210 pvar->settings.DefaultRSAPrivateKeyFile);
1211 SetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1212 pvar->settings.DefaultRhostsHostPrivateKeyFile);
1213 SetDlgItemText(dlg, IDC_LOCALUSERNAME,
1214 pvar->settings.DefaultRhostsLocalUserName);
1215
1216 if (pvar->settings.CheckAuthListFirst) {
1217 CheckDlgButton(dlg, IDC_CHECKAUTH, TRUE);
1218 }
1219 }
1220
1221 static BOOL end_default_auth_dlg(PTInstVar pvar, HWND dlg)
1222 {
1223 if (IsDlgButtonChecked(dlg, IDC_SSHUSERSA)) {
1224 pvar->settings.DefaultAuthMethod = SSH_AUTH_RSA;
1225 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSERHOSTS)) {
1226 if (GetWindowTextLength(GetDlgItem(dlg, IDC_HOSTRSAFILENAME)) > 0) {
1227 pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS_RSA;
1228 } else {
1229 pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS;
1230 }
1231 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSETIS)) {
1232 pvar->settings.DefaultAuthMethod = SSH_AUTH_TIS;
1233 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSEPAGEANT)) {
1234 pvar->settings.DefaultAuthMethod = SSH_AUTH_PAGEANT;
1235 } else {
1236 pvar->settings.DefaultAuthMethod = SSH_AUTH_PASSWORD;
1237 }
1238
1239 GetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName,
1240 sizeof(pvar->settings.DefaultUserName));
1241 GetDlgItemText(dlg, IDC_RSAFILENAME,
1242 pvar->settings.DefaultRSAPrivateKeyFile,
1243 sizeof(pvar->settings.DefaultRSAPrivateKeyFile));
1244 GetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1245 pvar->settings.DefaultRhostsHostPrivateKeyFile,
1246 sizeof(pvar->settings.DefaultRhostsHostPrivateKeyFile));
1247 GetDlgItemText(dlg, IDC_LOCALUSERNAME,
1248 pvar->settings.DefaultRhostsLocalUserName,
1249 sizeof(pvar->settings.DefaultRhostsLocalUserName));
1250
1251 if (IsDlgButtonChecked(dlg, IDC_CHECKAUTH)) {
1252 pvar->settings.CheckAuthListFirst = TRUE;
1253 }
1254 else {
1255 pvar->settings.CheckAuthListFirst = FALSE;
1256 }
1257
1258 EndDialog(dlg, 1);
1259 return TRUE;
1260 }
1261
1262 static BOOL CALLBACK default_auth_dlg_proc(HWND dlg, UINT msg,
1263 WPARAM wParam, LPARAM lParam)
1264 {
1265 PTInstVar pvar;
1266 LOGFONT logfont;
1267 HFONT font;
1268
1269 switch (msg) {
1270 case WM_INITDIALOG:
1271 pvar = (PTInstVar) lParam;
1272 SetWindowLong(dlg, DWL_USER, lParam);
1273
1274 init_default_auth_dlg(pvar, dlg);
1275
1276 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1277 GetObject(font, sizeof(LOGFONT), &logfont);
1278 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthSetupFont, pvar)) {
1279 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1280 SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1281 SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1282 SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1283 SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1284 SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1285 SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1286 SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1287 SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1288 SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1289 SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1290 SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1291 SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1292 SendDlgItemMessage(dlg, IDC_CHECKAUTH, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1293 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1294 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1295 }
1296 else {
1297 DlgAuthSetupFont = NULL;
1298 }
1299
1300 return TRUE; /* because we do not set the focus */
1301
1302 case WM_COMMAND:
1303 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1304
1305 switch (LOWORD(wParam)) {
1306 case IDOK:
1307
1308 if (DlgAuthSetupFont != NULL) {
1309 DeleteObject(DlgAuthSetupFont);
1310 }
1311
1312 return end_default_auth_dlg(pvar, dlg);
1313
1314 case IDCANCEL:
1315 EndDialog(dlg, 0);
1316
1317 if (DlgAuthSetupFont != NULL) {
1318 DeleteObject(DlgAuthSetupFont);
1319 }
1320
1321 return TRUE;
1322
1323 case IDC_CHOOSERSAFILE:
1324 choose_RSA_key_file(dlg, pvar);
1325 return TRUE;
1326
1327 case IDC_CHOOSEHOSTRSAFILE:
1328 choose_host_RSA_key_file(dlg, pvar);
1329 return TRUE;
1330
1331 default:
1332 return FALSE;
1333 }
1334
1335 default:
1336 return FALSE;
1337 }
1338 }
1339
1340 void AUTH_init(PTInstVar pvar)
1341 {
1342 pvar->auth_state.failed_method = SSH_AUTH_NONE;
1343 pvar->auth_state.auth_dialog = NULL;
1344 pvar->auth_state.user = NULL;
1345 pvar->auth_state.flags = 0;
1346 pvar->auth_state.TIS_prompt = NULL;
1347 pvar->auth_state.supported_types = 0;
1348 pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
1349 pvar->auth_state.cur_cred.password = NULL;
1350 pvar->auth_state.cur_cred.rhosts_client_user = NULL;
1351 pvar->auth_state.cur_cred.key_pair = NULL;
1352 AUTH_set_generic_mode(pvar);
1353 }
1354
1355 void AUTH_set_generic_mode(PTInstVar pvar)
1356 {
1357 pvar->auth_state.mode = GENERIC_AUTH_MODE;
1358 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1359 }
1360
1361 void AUTH_set_TIS_mode(PTInstVar pvar, char FAR * prompt, int len)
1362 {
1363 if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1364 pvar->auth_state.mode = TIS_AUTH_MODE;
1365
1366 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1367 pvar->auth_state.TIS_prompt = malloc(len + 1);
1368 memcpy(pvar->auth_state.TIS_prompt, prompt, len);
1369 pvar->auth_state.TIS_prompt[len] = 0;
1370 } else {
1371 AUTH_set_generic_mode(pvar);
1372 }
1373 }
1374
1375 void AUTH_do_default_cred_dialog(PTInstVar pvar)
1376 {
1377 HWND cur_active = GetActiveWindow();
1378
1379 if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHAUTHSETUP),
1380 cur_active != NULL ? cur_active
1381 : pvar->NotificationWindow,
1382 default_auth_dlg_proc, (LPARAM) pvar) == -1) {
1383 UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTHSETUP_ERROR", pvar,
1384 "Unable to display authentication setup dialog box.");
1385 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1386 }
1387 }
1388
1389 void AUTH_destroy_cur_cred(PTInstVar pvar)
1390 {
1391 destroy_malloced_string(&pvar->auth_state.cur_cred.password);
1392 destroy_malloced_string(&pvar->auth_state.cur_cred.rhosts_client_user);
1393 if (pvar->auth_state.cur_cred.key_pair != NULL) {
1394 CRYPT_free_key_pair(pvar->auth_state.cur_cred.key_pair);
1395 pvar->auth_state.cur_cred.key_pair = NULL;
1396 }
1397 }
1398
1399 static char FAR *get_auth_method_name(SSHAuthMethod auth)
1400 {
1401 switch (auth) {
1402 case SSH_AUTH_PASSWORD:
1403 return "password";
1404 case SSH_AUTH_RSA:
1405 return "RSA";
1406 case SSH_AUTH_PAGEANT:
1407 return "RSA (with Pageant)";
1408 case SSH_AUTH_RHOSTS:
1409 return "rhosts";
1410 case SSH_AUTH_RHOSTS_RSA:
1411 return "rhosts with RSA";
1412 case SSH_AUTH_TIS:
1413 return "challenge/response (TIS)";
1414 default:
1415 return "unknown method";
1416 }
1417 }
1418
1419 void AUTH_get_auth_info(PTInstVar pvar, char FAR * dest, int len)
1420 {
1421 char *method = "unknown";
1422
1423 if (pvar->auth_state.user == NULL) {
1424 strncpy_s(dest, len, "None", _TRUNCATE);
1425 } else if (pvar->auth_state.cur_cred.method != SSH_AUTH_NONE) {
1426 if (SSHv1(pvar)) {
1427 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1428 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1429 get_auth_method_name(pvar->auth_state.cur_cred.method));
1430
1431 } else {
1432 // SSH2:�F�����\�b�h������ (2004.12.23 yutaka)
1433 // keyboard-interactive���\�b�h������ (2005.3.12 yutaka)
1434 if (pvar->auth_state.cur_cred.method == SSH_AUTH_PASSWORD ||
1435 pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1436 // keyboard-interactive���\�b�h������ (2005.1.24 yutaka)
1437 if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1438 method = "keyboard-interactive";
1439 } else {
1440 method = get_auth_method_name(pvar->auth_state.cur_cred.method);
1441 }
1442 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1443 _snprintf_s(dest, len, _TRUNCATE,
1444 pvar->ts->UIMsg, pvar->auth_state.user, method);
1445
1446 } else {
1447 if (pvar->auth_state.cur_cred.method == SSH_AUTH_RSA) {
1448 if (pvar->auth_state.cur_cred.key_pair->RSA_key != NULL) {
1449 method = "RSA";
1450 } else if (pvar->auth_state.cur_cred.key_pair->DSA_key != NULL) {
1451 method = "DSA";
1452 }
1453 }
1454 else if (pvar->auth_state.cur_cred.method == SSH_AUTH_PAGEANT) {
1455 int len = get_uint32_MSBfirst(pvar->pageant_curkey + 4);
1456 char *s = (char *)malloc(len+1);
1457 enum hostkey_type keytype;
1458
1459 memcpy(s, pvar->pageant_curkey+4+4, len);
1460 s[len] = '\0';
1461 keytype = get_keytype_from_name(s);
1462 if (keytype == KEY_RSA) {
1463 method = "RSA with Pageant";
1464 } else if (keytype == KEY_DSA) {
1465 method = "DSA with Pageant";
1466 }
1467 free(s);
1468 }
1469 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1470 _snprintf_s(dest, len, _TRUNCATE,
1471 pvar->ts->UIMsg, pvar->auth_state.user, method);
1472 }
1473
1474 }
1475
1476 } else {
1477 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1478 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1479 get_auth_method_name(pvar->auth_state.failed_method));
1480 }
1481
1482 dest[len - 1] = 0;
1483 }
1484
1485 void AUTH_notify_disconnecting(PTInstVar pvar)
1486 {
1487 if (pvar->auth_state.auth_dialog != NULL) {
1488 PostMessage(pvar->auth_state.auth_dialog, WM_COMMAND, IDCANCEL, 0);
1489 /* the main window might not go away if it's not enabled. (see vtwin.cpp) */
1490 EnableWindow(pvar->NotificationWindow, TRUE);
1491 }
1492 }
1493
1494 void AUTH_end(PTInstVar pvar)
1495 {
1496 destroy_malloced_string(&pvar->auth_state.user);
1497 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1498
1499 AUTH_destroy_cur_cred(pvar);
1500 }

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