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 6841 - (show annotations) (download) (as text)
Tue Jul 4 15:02:28 2017 UTC (6 years, 9 months ago) by doda
Original Path: trunk/ttssh2/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 57117 byte(s)
TeraTerm Project としてのライセンス表記を追加

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

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