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 3152 - (show annotations) (download) (as text)
Sat Oct 4 12:37:29 2008 UTC (15 years, 6 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 50518 byte(s)
CheckAuthListFirst が有効な場合には、"none"認証の返事が返ってくるまで
OKボタンを押しても何も起こらないようにした。

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

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