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 3138 - (show annotations) (download) (as text)
Mon Jul 28 14:55:17 2008 UTC (15 years, 8 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 50207 byte(s)
no message

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

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