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 3113 - (show annotations) (download) (as text)
Sat Feb 16 11:26:57 2008 UTC (16 years, 1 month ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 49635 byte(s)
Pageant のときにも認証ダイアログのフォーカスがどこかに行ってしまうので、フォーカスをセットする。

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

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