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 3108 - (show annotations) (download) (as text)
Tue Feb 12 23:11:49 2008 UTC (16 years, 2 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 49536 byte(s)
Pageant 対応処理を追加した。
SSH2 はひととおり対応済み。
SSH1 は実装途中。

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

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