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

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