Open-Source-Software-Entwicklung und Downloads

Browse Subversion Repository

Contents of /trunk/ttssh2/ttxssh/auth.c

Parent Directory Parent Directory | Revision Log Revision Log


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

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