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 3183 - (show annotations) (download) (as text)
Wed Dec 3 16:13:27 2008 UTC (15 years, 4 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 51605 byte(s)
SSH Authentication ダイアログにエージェント転送のチェックボックスを追加した

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

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