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 5553 - (show annotations) (download) (as text)
Wed Mar 19 15:24:50 2014 UTC (10 years ago) by maya
Original Path: trunk/ttssh2/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 57008 byte(s)
ED25519 を追記
  r5547 で見落としたぶん
1 /*
2 Copyright (c) 1998-2001, Robert O'Callahan
3 All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without modification,
6 are permitted provided that the following conditions are met:
7
8 Redistributions of source code must retain the above copyright notice, this list of
9 conditions and the following disclaimer.
10
11 Redistributions in binary form must reproduce the above copyright notice, this list
12 of conditions and the following disclaimer in the documentation and/or other materials
13 provided with the distribution.
14
15 The name of Robert O'Callahan may not be used to endorse or promote products derived from
16 this software without specific prior written permission.
17
18 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
19 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21 THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include "ttxssh.h"
30 #include "util.h"
31 #include "ssh.h"
32 #include "key.h"
33
34 #include <io.h>
35 #include <fcntl.h>
36 #include <stdlib.h>
37 #include <errno.h>
38
39 #include "resource.h"
40 #include "keyfiles.h"
41 #include "libputty.h"
42
43 #define AUTH_START_USER_AUTH_ON_ERROR_END 1
44
45 #define MAX_AUTH_CONTROL IDC_SSHUSEPAGEANT
46
47 static HFONT DlgAuthFont;
48 static HFONT DlgTisFont;
49 static HFONT DlgAuthSetupFont;
50
51 void destroy_malloced_string(char FAR * FAR * str)
52 {
53 if (*str != NULL) {
54 memset(*str, 0, strlen(*str));
55 free(*str);
56 *str = NULL;
57 }
58 }
59
60 static int auth_types_to_control_IDs[] = {
61 -1, IDC_SSHUSERHOSTS, IDC_SSHUSERSA, IDC_SSHUSEPASSWORD,
62 IDC_SSHUSERHOSTS, IDC_SSHUSETIS, -1,
63 -1, -1, -1, -1, -1, -1, -1, -1, -1, IDC_SSHUSEPAGEANT, -1
64 };
65
66 LRESULT CALLBACK password_wnd_proc(HWND control, UINT msg,
67 WPARAM wParam, LPARAM lParam)
68 {
69 switch (msg) {
70 case WM_CHAR:
71 if ((GetKeyState(VK_CONTROL) & 0x8000) != 0) {
72 char chars[] = { (char) wParam, 0 };
73
74 SendMessage(control, EM_REPLACESEL, (WPARAM) TRUE,
75 (LPARAM) (char FAR *) chars);
76 return 0;
77 }
78 }
79
80 return CallWindowProc((WNDPROC) GetWindowLong(control, GWL_USERDATA),
81 control, msg, wParam, lParam);
82 }
83
84 static void init_password_control(HWND dlg)
85 {
86 HWND passwordControl = GetDlgItem(dlg, IDC_SSHPASSWORD);
87
88 SetWindowLong(passwordControl, GWL_USERDATA,
89 SetWindowLong(passwordControl, GWL_WNDPROC,
90 (LONG) password_wnd_proc));
91
92 SetFocus(passwordControl);
93 }
94
95 static void set_auth_options_status(HWND dlg, int controlID)
96 {
97 BOOL RSA_enabled = controlID == IDC_SSHUSERSA;
98 BOOL rhosts_enabled = controlID == IDC_SSHUSERHOSTS;
99 BOOL TIS_enabled = controlID == IDC_SSHUSETIS;
100 BOOL PAGEANT_enabled = controlID == IDC_SSHUSEPAGEANT;
101 int i;
102
103 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, controlID);
104
105 EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORDCAPTION), (!TIS_enabled && !PAGEANT_enabled));
106 EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORD), (!TIS_enabled && !PAGEANT_enabled));
107
108 for (i = IDC_CHOOSERSAFILE; i <= IDC_RSAFILENAME; i++) {
109 EnableWindow(GetDlgItem(dlg, i), RSA_enabled);
110 }
111
112 for (i = IDC_LOCALUSERNAMELABEL; i <= IDC_HOSTRSAFILENAME; i++) {
113 EnableWindow(GetDlgItem(dlg, i), rhosts_enabled);
114 }
115 }
116
117 static void init_auth_machine_banner(PTInstVar pvar, HWND dlg)
118 {
119 char buf[1024], buf2[1024];
120
121 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, buf2, sizeof(buf2));
122 _snprintf_s(buf, sizeof(buf), _TRUNCATE, buf2, SSH_get_host_name(pvar));
123 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, buf);
124 }
125
126 static void update_server_supported_types(PTInstVar pvar, HWND dlg)
127 {
128 int supported_methods = pvar->auth_state.supported_types;
129 int cur_control = -1;
130 int control;
131 HWND focus = GetFocus();
132
133 if (supported_methods == 0) {
134 return;
135 }
136
137 for (control = IDC_SSHUSEPASSWORD; control <= MAX_AUTH_CONTROL;
138 control++) {
139 BOOL enabled = FALSE;
140 int method;
141 HWND item = GetDlgItem(dlg, control);
142
143 if (item != NULL) {
144 for (method = 0; method <= SSH_AUTH_MAX; method++) {
145 if (auth_types_to_control_IDs[method] == control
146 && (supported_methods & (1 << method)) != 0) {
147 enabled = TRUE;
148 }
149 }
150
151 EnableWindow(item, enabled);
152
153 if (IsDlgButtonChecked(dlg, control)) {
154 cur_control = control;
155 }
156 }
157 }
158
159 if (cur_control >= 0) {
160 if (!IsWindowEnabled(GetDlgItem(dlg, cur_control))) {
161 do {
162 cur_control++;
163 if (cur_control > MAX_AUTH_CONTROL) {
164 cur_control = IDC_SSHUSEPASSWORD;
165 }
166 } while (!IsWindowEnabled(GetDlgItem(dlg, cur_control)));
167
168 set_auth_options_status(dlg, cur_control);
169
170 if (focus != NULL && !IsWindowEnabled(focus)) {
171 SetFocus(GetDlgItem(dlg, cur_control));
172 }
173 }
174 }
175 }
176
177 static void init_auth_dlg(PTInstVar pvar, HWND dlg)
178 {
179 int default_method = pvar->session_settings.DefaultAuthMethod;
180 char uimsg[MAX_UIMSG];
181
182 GetWindowText(dlg, uimsg, sizeof(uimsg));
183 UTIL_get_lang_msg("DLG_AUTH_TITLE", pvar, uimsg);
184 SetWindowText(dlg, pvar->ts->UIMsg);
185 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
186 UTIL_get_lang_msg("DLG_AUTH_BANNER", pvar, uimsg);
187 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
188 GetDlgItemText(dlg, IDC_SSHAUTHBANNER2, uimsg, sizeof(uimsg));
189 UTIL_get_lang_msg("DLG_AUTH_BANNER2", pvar, uimsg);
190 SetDlgItemText(dlg, IDC_SSHAUTHBANNER2, pvar->ts->UIMsg);
191 GetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, uimsg, sizeof(uimsg));
192 UTIL_get_lang_msg("DLG_AUTH_USERNAME", pvar, uimsg);
193 SetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, pvar->ts->UIMsg);
194 GetDlgItemText(dlg, IDC_SSHPASSWORDCAPTION, uimsg, sizeof(uimsg));
195 UTIL_get_lang_msg("DLG_AUTH_PASSWORD", pvar, uimsg);
196 SetDlgItemText(dlg, IDC_SSHPASSWORDCAPTION, pvar->ts->UIMsg);
197 GetDlgItemText(dlg, IDC_REMEMBER_PASSWORD, uimsg, sizeof(uimsg));
198 UTIL_get_lang_msg("DLG_AUTH_REMEMBER_PASSWORD", pvar, uimsg);
199 SetDlgItemText(dlg, IDC_REMEMBER_PASSWORD, pvar->ts->UIMsg);
200 GetDlgItemText(dlg, IDC_FORWARD_AGENT, uimsg, sizeof(uimsg));
201 UTIL_get_lang_msg("DLG_AUTH_FWDAGENT", pvar, uimsg);
202 SetDlgItemText(dlg, IDC_FORWARD_AGENT, pvar->ts->UIMsg);
203 GetDlgItemText(dlg, IDC_SSHUSEPASSWORD, uimsg, sizeof(uimsg));
204 UTIL_get_lang_msg("DLG_AUTH_METHOD_PASSWORD", pvar, uimsg);
205 SetDlgItemText(dlg, IDC_SSHUSEPASSWORD, pvar->ts->UIMsg);
206 GetDlgItemText(dlg, IDC_SSHUSERSA, uimsg, sizeof(uimsg));
207 UTIL_get_lang_msg("DLG_AUTH_METHOD_RSA", pvar, uimsg);
208 SetDlgItemText(dlg, IDC_SSHUSERSA, pvar->ts->UIMsg);
209 GetDlgItemText(dlg, IDC_SSHUSERHOSTS, uimsg, sizeof(uimsg));
210 UTIL_get_lang_msg("DLG_AUTH_METHOD_RHOST", pvar, uimsg);
211 SetDlgItemText(dlg, IDC_SSHUSERHOSTS, pvar->ts->UIMsg);
212 GetDlgItemText(dlg, IDC_SSHUSEPAGEANT, uimsg, sizeof(uimsg));
213 UTIL_get_lang_msg("DLG_AUTH_METHOD_PAGEANT", pvar, uimsg);
214 SetDlgItemText(dlg, IDC_SSHUSEPAGEANT, pvar->ts->UIMsg);
215 GetDlgItemText(dlg, IDC_CHOOSERSAFILE, uimsg, sizeof(uimsg));
216 UTIL_get_lang_msg("DLG_AUTH_PRIVATEKEY", pvar, uimsg);
217 SetDlgItemText(dlg, IDC_CHOOSERSAFILE, pvar->ts->UIMsg);
218 GetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, uimsg, sizeof(uimsg));
219 UTIL_get_lang_msg("DLG_AUTH_LOCALUSER", pvar, uimsg);
220 SetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, pvar->ts->UIMsg);
221 GetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, uimsg, sizeof(uimsg));
222 UTIL_get_lang_msg("DLG_AUTH_HOST_PRIVATEKEY", pvar, uimsg);
223 SetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, pvar->ts->UIMsg);
224 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
225 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
226 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
227 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
228 UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
229 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
230
231 init_auth_machine_banner(pvar, dlg);
232 init_password_control(dlg);
233
234 // �F�����s�������x������������
235 if (pvar->auth_state.failed_method != SSH_AUTH_NONE) {
236 /* must be retrying a failed attempt */
237 UTIL_get_lang_msg("DLG_AUTH_BANNER2_FAILED", pvar, "Authentication failed. Please retry.");
238 SetDlgItemText(dlg, IDC_SSHAUTHBANNER2, pvar->ts->UIMsg);
239 UTIL_get_lang_msg("DLG_AUTH_TITLE_FAILED", pvar, "Retrying SSH Authentication");
240 SetWindowText(dlg, pvar->ts->UIMsg);
241 default_method = pvar->auth_state.failed_method;
242 }
243
244 // �p�X���[�h���o���������`�F�b�N�{�b�N�X�����f�t�H���g���L�������� (2006.8.3 yutaka)
245 if (pvar->ts_SSH->remember_password) {
246 SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_SETCHECK, BST_CHECKED, 0);
247 } else {
248 SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_SETCHECK, BST_UNCHECKED, 0);
249 }
250
251 // ForwardAgent �����������f���� (2008.12.4 maya)
252 CheckDlgButton(dlg, IDC_FORWARD_AGENT, pvar->settings.ForwardAgent);
253
254 // SSH �o�[�W������������ TIS �����x������������
255 if (pvar->settings.ssh_protocol_version == 1) {
256 UTIL_get_lang_msg("DLG_AUTH_METHOD_CHALLENGE1", pvar,
257 "Use challenge/response to log in(&TIS)");
258 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
259 } else {
260 UTIL_get_lang_msg("DLG_AUTH_METHOD_CHALLENGE2", pvar,
261 "Use &challenge/response to log in(keyboard-interactive)");
262 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
263 }
264
265 if (pvar->auth_state.user != NULL) {
266 SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->auth_state.user);
267 EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
268 EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAMELABEL), FALSE);
269 }
270 else if (strlen(pvar->ssh2_username) > 0) {
271 SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->ssh2_username);
272 if (pvar->ssh2_autologin == 1) {
273 EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
274 EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAMELABEL), FALSE);
275 }
276 }
277 else if (pvar->session_settings.DefaultUserName[0] != 0) {
278 SetDlgItemText(dlg, IDC_SSHUSERNAME,
279 pvar->session_settings.DefaultUserName);
280 }
281
282 if (strlen(pvar->ssh2_password) > 0) {
283 SetDlgItemText(dlg, IDC_SSHPASSWORD, pvar->ssh2_password);
284 if (pvar->ssh2_autologin == 1) {
285 EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORD), FALSE);
286 EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORDCAPTION), FALSE);
287 }
288 }
289
290 SetDlgItemText(dlg, IDC_RSAFILENAME,
291 pvar->session_settings.DefaultRSAPrivateKeyFile);
292 SetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
293 pvar->session_settings.DefaultRhostsHostPrivateKeyFile);
294 SetDlgItemText(dlg, IDC_LOCALUSERNAME,
295 pvar->session_settings.DefaultRhostsLocalUserName);
296
297 if (pvar->ssh2_authmethod == SSH_AUTH_PASSWORD) {
298 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, IDC_SSHUSEPASSWORD);
299
300 } else if (pvar->ssh2_authmethod == SSH_AUTH_RSA) {
301 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, IDC_SSHUSERSA);
302
303 SetDlgItemText(dlg, IDC_RSAFILENAME, pvar->ssh2_keyfile);
304 if (pvar->ssh2_autologin == 1) {
305 EnableWindow(GetDlgItem(dlg, IDC_CHOOSERSAFILE), FALSE);
306 EnableWindow(GetDlgItem(dlg, IDC_RSAFILENAME), FALSE);
307 }
308
309 // /auth=challenge ������ (2007.10.5 maya)
310 } else if (pvar->ssh2_authmethod == SSH_AUTH_TIS) {
311 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, IDC_SSHUSETIS);
312 EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORD), FALSE);
313 SetDlgItemText(dlg, IDC_SSHPASSWORD, "");
314
315 // /auth=pageant ������
316 } else if (pvar->ssh2_authmethod == SSH_AUTH_PAGEANT) {
317 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, IDC_SSHUSEPAGEANT);
318 EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORD), FALSE);
319 SetDlgItemText(dlg, IDC_SSHPASSWORD, "");
320
321 } else {
322 // �f�t�H���g���F�����\�b�h���_�C�A���O�����f
323 set_auth_options_status(dlg, auth_types_to_control_IDs[default_method]);
324
325 update_server_supported_types(pvar, dlg);
326
327 // �z�X�g�m�F�_�C�A���O��������������=�E�B���h�E���A�N�e�B�u������������
328 // �� SetFocus �����s�����A�R�}���h���C�����n�������F��������������������
329 // �����������A�������O�C���L������ SetFocus ������ (2009.1.31 maya)
330 if (default_method == SSH_AUTH_TIS) {
331 /* we disabled the password control, so fix the focus */
332 SetFocus(GetDlgItem(dlg, IDC_SSHUSETIS));
333 }
334 else if (default_method == SSH_AUTH_PAGEANT) {
335 SetFocus(GetDlgItem(dlg, IDC_SSHUSEPAGEANT));
336 }
337
338 }
339
340 if (GetWindowTextLength(GetDlgItem(dlg, IDC_SSHUSERNAME)) == 0) {
341 SetFocus(GetDlgItem(dlg, IDC_SSHUSERNAME));
342 }
343 else if (pvar->ask4passwd == 1) {
344 SetFocus(GetDlgItem(dlg, IDC_SSHPASSWORD));
345 }
346
347 // '/I' �w�������������������������� (2005.9.5 yutaka)
348 if (pvar->ts->Minimize) {
349 //20050822���� start T.Takahashi
350 ShowWindow(dlg,SW_MINIMIZE);
351 //20050822���� end T.Takahashi
352 }
353 }
354
355 static char FAR *alloc_control_text(HWND ctl)
356 {
357 int len = GetWindowTextLength(ctl);
358 char FAR *result = malloc(len + 1);
359
360 if (result != NULL) {
361 GetWindowText(ctl, result, len + 1);
362 result[len] = 0;
363 }
364
365 return result;
366 }
367
368 static int get_key_file_name(HWND parent, char FAR * buf, int bufsize, PTInstVar pvar)
369 {
370 OPENFILENAME params;
371 char fullname_buf[2048] = "identity";
372 char filter[MAX_UIMSG];
373
374 ZeroMemory(&params, sizeof(params));
375 params.lStructSize = sizeof(OPENFILENAME);
376 params.hwndOwner = parent;
377 // �t�B���^������ (2004.12.19 yutaka)
378 // 3�t�@�C���t�B���^������ (2005.4.26 yutaka)
379 UTIL_get_lang_msg("FILEDLG_OPEN_PRIVATEKEY_FILTER", pvar,
380 "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");
381 memcpy(filter, pvar->ts->UIMsg, sizeof(filter));
382 params.lpstrFilter = filter;
383 params.lpstrCustomFilter = NULL;
384 params.nFilterIndex = 0;
385 buf[0] = 0;
386 params.lpstrFile = fullname_buf;
387 params.nMaxFile = sizeof(fullname_buf);
388 params.lpstrFileTitle = NULL;
389 params.lpstrInitialDir = NULL;
390 UTIL_get_lang_msg("FILEDLG_OPEN_PRIVATEKEY_TITLE", pvar,
391 "Choose a file with the RSA/DSA/ECDSA/ED25519 private key");
392 params.lpstrTitle = pvar->ts->UIMsg;
393 params.Flags =
394 OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;
395 params.lpstrDefExt = NULL;
396
397 if (GetOpenFileName(&params) != 0) {
398 copy_teraterm_dir_relative_path(buf, bufsize, fullname_buf);
399 return 1;
400 } else {
401 return 0;
402 }
403 }
404
405 static void choose_RSA_key_file(HWND dlg, PTInstVar pvar)
406 {
407 char buf[1024];
408
409 if (get_key_file_name(dlg, buf, sizeof(buf), pvar)) {
410 SetDlgItemText(dlg, IDC_RSAFILENAME, buf);
411 }
412 }
413
414 static void choose_host_RSA_key_file(HWND dlg, PTInstVar pvar)
415 {
416 char buf[1024];
417
418 if (get_key_file_name(dlg, buf, sizeof(buf), pvar)) {
419 SetDlgItemText(dlg, IDC_HOSTRSAFILENAME, buf);
420 }
421 }
422
423 static BOOL end_auth_dlg(PTInstVar pvar, HWND dlg)
424 {
425 int method = SSH_AUTH_PASSWORD;
426 char FAR *password =
427 alloc_control_text(GetDlgItem(dlg, IDC_SSHPASSWORD));
428 Key *key_pair = NULL;
429
430 if (IsDlgButtonChecked(dlg, IDC_SSHUSERSA)) {
431 method = SSH_AUTH_RSA;
432 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSERHOSTS)) {
433 if (GetWindowTextLength(GetDlgItem(dlg, IDC_HOSTRSAFILENAME)) > 0) {
434 method = SSH_AUTH_RHOSTS_RSA;
435 } else {
436 method = SSH_AUTH_RHOSTS;
437 }
438 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSETIS)) {
439 method = SSH_AUTH_TIS;
440 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSEPAGEANT)) {
441 method = SSH_AUTH_PAGEANT;
442 }
443
444 if (method == SSH_AUTH_RSA || method == SSH_AUTH_RHOSTS_RSA) {
445 char buf[2048];
446 int file_ctl_ID =
447 method == SSH_AUTH_RSA ? IDC_RSAFILENAME : IDC_HOSTRSAFILENAME;
448
449 buf[0] = 0;
450 GetDlgItemText(dlg, file_ctl_ID, buf, sizeof(buf));
451 if (buf[0] == 0) {
452 UTIL_get_lang_msg("MSG_KEYSPECIFY_ERROR", pvar,
453 "You must specify a file containing the RSA/DSA/ECDSA/ED25519 private key.");
454 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
455 SetFocus(GetDlgItem(dlg, file_ctl_ID));
456 destroy_malloced_string(&password);
457 return FALSE;
458 }
459
460 if (SSHv1(pvar)) {
461 BOOL invalid_passphrase = FALSE;
462
463 key_pair = KEYFILES_read_private_key(pvar, buf, password,
464 &invalid_passphrase,
465 FALSE);
466
467 if (key_pair == NULL) {
468 if (invalid_passphrase) {
469 HWND passwordCtl = GetDlgItem(dlg, IDC_SSHPASSWORD);
470
471 SetFocus(passwordCtl);
472 SendMessage(passwordCtl, EM_SETSEL, 0, -1);
473 } else {
474 SetFocus(GetDlgItem(dlg, file_ctl_ID));
475 }
476 destroy_malloced_string(&password);
477 return FALSE;
478 }
479
480 } else { // SSH2(yutaka)
481 BOOL invalid_passphrase = FALSE;
482 char errmsg[256];
483 FILE *fp = NULL;
484 ssh2_keyfile_type keyfile_type;
485
486 memset(errmsg, 0, sizeof(errmsg));
487
488 keyfile_type = get_ssh2_keytype(buf, &fp, errmsg, sizeof(errmsg));
489 switch (keyfile_type) {
490 case SSH2_KEYFILE_TYPE_OPENSSH:
491 {
492 key_pair = read_SSH2_private_key(pvar, fp, password,
493 &invalid_passphrase,
494 FALSE,
495 errmsg,
496 sizeof(errmsg)
497 );
498 break;
499 }
500 case SSH2_KEYFILE_TYPE_PUTTY:
501 {
502 key_pair = read_SSH2_PuTTY_private_key(pvar, fp, password,
503 &invalid_passphrase,
504 FALSE,
505 errmsg,
506 sizeof(errmsg)
507 );
508 break;
509 }
510 case SSH2_KEYFILE_TYPE_SECSH:
511 {
512 key_pair = read_SSH2_SECSH_private_key(pvar, fp, password,
513 &invalid_passphrase,
514 FALSE,
515 errmsg,
516 sizeof(errmsg)
517 );
518 break;
519 }
520 default:
521 {
522 char buf[1024];
523
524 // �t�@�C�����J�����������t�@�C���`�����s��������������������
525 if (fp != NULL) {
526 key_pair = read_SSH2_private_key(pvar, fp, password,
527 &invalid_passphrase,
528 FALSE,
529 errmsg,
530 sizeof(errmsg)
531 );
532 break;
533 }
534
535 UTIL_get_lang_msg("MSG_READKEY_ERROR", pvar,
536 "read error SSH2 private key file\r\n%s");
537 _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, errmsg);
538 notify_nonfatal_error(pvar, buf);
539 // ���������������������� SSH2 �������t�@�C�����J����������
540 // ���t�@�C�����I���{�^�����t�H�[�J�X������
541 SetFocus(GetDlgItem(dlg, IDC_CHOOSERSAFILE));
542 destroy_malloced_string(&password);
543 return FALSE;
544 }
545 }
546
547 if (key_pair == NULL) { // read error
548 char buf[1024];
549 UTIL_get_lang_msg("MSG_READKEY_ERROR", pvar,
550 "read error SSH2 private key file\r\n%s");
551 _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, errmsg);
552 notify_nonfatal_error(pvar, buf);
553 // �p�X�t���[�Y���������v����������������IDC_SSHPASSWORD���t�H�[�J�X������ (2006.10.29 yasuhide)
554 if (invalid_passphrase) {
555 HWND passwordCtl = GetDlgItem(dlg, IDC_SSHPASSWORD);
556
557 SetFocus(passwordCtl);
558 SendMessage(passwordCtl, EM_SETSEL, 0, -1);
559 } else {
560 SetFocus(GetDlgItem(dlg, file_ctl_ID));
561 }
562 destroy_malloced_string(&password);
563 return FALSE;
564 }
565
566 }
567
568 }
569 else if (method == SSH_AUTH_PAGEANT) {
570 pvar->pageant_key = NULL;
571 pvar->pageant_curkey = NULL;
572 pvar->pageant_keylistlen = 0;
573 pvar->pageant_keycount = 0;
574 pvar->pageant_keycurrent = 0;
575 pvar->pageant_keyfinal=FALSE;
576
577 // Pageant �����M
578 if (SSHv1(pvar)) {
579 pvar->pageant_keylistlen = putty_get_ssh1_keylist(&pvar->pageant_key);
580 }
581 else {
582 pvar->pageant_keylistlen = putty_get_ssh2_keylist(&pvar->pageant_key);
583 }
584 if (pvar->pageant_keylistlen == 0) {
585 UTIL_get_lang_msg("MSG_PAGEANT_NOTFOUND", pvar,
586 "Can't find Pageant.");
587 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
588
589 return FALSE;
590 }
591 pvar->pageant_curkey = pvar->pageant_key;
592
593 // ������
594 pvar->pageant_keycount = get_uint32_MSBfirst(pvar->pageant_curkey);
595 if (pvar->pageant_keycount == 0) {
596 UTIL_get_lang_msg("MSG_PAGEANT_NOKEY", pvar,
597 "Pageant has no valid key.");
598 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
599
600 return FALSE;
601 }
602 pvar->pageant_curkey += 4;
603 }
604
605 /* from here on, we cannot fail, so just munge cur_cred in place */
606 pvar->auth_state.cur_cred.method = method;
607 pvar->auth_state.cur_cred.key_pair = key_pair;
608 /* we can't change the user name once it's set. It may already have
609 been sent to the server, and it can only be sent once. */
610 if (pvar->auth_state.user == NULL) {
611 pvar->auth_state.user =
612 alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
613 }
614
615 // �p�X���[�h���������������������������� (2006.8.3 yutaka)
616 if (SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_GETCHECK, 0,0) == BST_CHECKED) {
617 pvar->settings.remember_password = 1; // �o��������
618 pvar->ts_SSH->remember_password = 1;
619 } else {
620 pvar->settings.remember_password = 0; // ���������������Y����
621 pvar->ts_SSH->remember_password = 0;
622 }
623
624 // ���J���F���������A�Z�b�V�������������p�X���[�h���g�����������������������������������B
625 // (2005.4.8 yutaka)
626 if (method == SSH_AUTH_PASSWORD || method == SSH_AUTH_RSA) {
627 pvar->auth_state.cur_cred.password = password;
628 } else {
629 destroy_malloced_string(&password);
630 }
631 if (method == SSH_AUTH_RHOSTS || method == SSH_AUTH_RHOSTS_RSA) {
632 if (pvar->session_settings.DefaultAuthMethod != SSH_AUTH_RHOSTS) {
633 UTIL_get_lang_msg("MSG_RHOSTS_NOTDEFAULT_ERROR", pvar,
634 "Rhosts authentication will probably fail because it was not "
635 "the default authentication method.\n"
636 "To use Rhosts authentication "
637 "in TTSSH, you need to set it to be the default by restarting\n"
638 "TTSSH and selecting \"SSH Authentication...\" from the Setup menu"
639 "before connecting.");
640 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
641 }
642
643 pvar->auth_state.cur_cred.rhosts_client_user =
644 alloc_control_text(GetDlgItem(dlg, IDC_LOCALUSERNAME));
645 }
646 pvar->auth_state.auth_dialog = NULL;
647
648 GetDlgItemText(dlg, IDC_RSAFILENAME,
649 pvar->session_settings.DefaultRSAPrivateKeyFile,
650 sizeof(pvar->session_settings.
651 DefaultRSAPrivateKeyFile));
652 GetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
653 pvar->session_settings.DefaultRhostsHostPrivateKeyFile,
654 sizeof(pvar->session_settings.
655 DefaultRhostsHostPrivateKeyFile));
656 GetDlgItemText(dlg, IDC_LOCALUSERNAME,
657 pvar->session_settings.DefaultRhostsLocalUserName,
658 sizeof(pvar->session_settings.
659 DefaultRhostsLocalUserName));
660
661 if (SSHv1(pvar)) {
662 SSH_notify_user_name(pvar);
663 SSH_notify_cred(pvar);
664 } else {
665 // for SSH2(yutaka)
666 do_SSH2_userauth(pvar);
667 }
668
669 EndDialog(dlg, 1);
670 if (DlgAuthFont != NULL) {
671 DeleteObject(DlgAuthFont);
672 }
673
674 return TRUE;
675 }
676
677 BOOL autologin_sent_none;
678 static BOOL CALLBACK auth_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
679 LPARAM lParam)
680 {
681 const int IDC_TIMER1 = 300; // �������O�C�����L��������
682 const int IDC_TIMER2 = 301; // �T�|�[�g�������������\�b�h�������`�F�b�N(CheckAuthListFirst)
683 const int IDC_TIMER3 = 302; // challenge �� ask4passwd ��CheckAuthListFirst �� FALSE ������
684 const int autologin_timeout = 10; // �~���b
685 PTInstVar pvar;
686 LOGFONT logfont;
687 HFONT font;
688
689 switch (msg) {
690 case WM_INITDIALOG:
691 pvar = (PTInstVar) lParam;
692 pvar->auth_state.auth_dialog = dlg;
693 SetWindowLong(dlg, DWL_USER, lParam);
694
695 init_auth_dlg(pvar, dlg);
696
697 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
698 GetObject(font, sizeof(LOGFONT), &logfont);
699 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthFont, pvar)) {
700 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
701 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
702 SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
703 SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
704 SendDlgItemMessage(dlg, IDC_SSHPASSWORDCAPTION, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
705 SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
706 SendDlgItemMessage(dlg, IDC_REMEMBER_PASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
707 SendDlgItemMessage(dlg, IDC_FORWARD_AGENT, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
708 SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
709 SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
710 SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
711 SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
712 SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
713 SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
714 SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
715 SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
716 SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
717 SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
718 SendDlgItemMessage(dlg, IDC_SSHUSEPAGEANT, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
719 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
720 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
721 }
722 else {
723 DlgAuthFont = NULL;
724 }
725
726 // SSH2 autologin���L�����������A�^�C�}���d�|�����B (2004.12.1 yutaka)
727 if (pvar->ssh2_autologin == 1) {
728 autologin_sent_none = FALSE;
729 SetTimer(dlg, IDC_TIMER1, autologin_timeout, 0);
730 }
731 else {
732 // �T�|�[�g�������������\�b�h���`�F�b�N�����B(2007.9.24 maya)
733 // �������L�����A�����������s�����������A���[�U�����m����������
734 if (pvar->session_settings.CheckAuthListFirst &&
735 !pvar->tryed_ssh2_authlist &&
736 GetWindowTextLength(GetDlgItem(dlg, IDC_SSHUSERNAME)) > 0) {
737 SetTimer(dlg, IDC_TIMER2, autologin_timeout, 0);
738 }
739 // /auth=challenge �� /ask4passwd ���w���������������[�U�����m����������
740 // �������AOK �{�^���������� TIS auth �_�C�A���O���o��
741 else if (pvar->ssh2_authmethod == SSH_AUTH_TIS &&
742 pvar->ask4passwd &&
743 GetWindowTextLength(GetDlgItem(dlg, IDC_SSHUSERNAME)) > 0) {
744 SetTimer(dlg, IDC_TIMER3, autologin_timeout, 0);
745 }
746 }
747 return FALSE; /* because we set the focus */
748
749 case WM_TIMER:
750 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
751 // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2004.12.16 yutaka)
752 if (wParam == IDC_TIMER1) {
753 // �������O�C��������
754 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
755 (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
756 if (SSHv2(pvar) &&
757 pvar->session_settings.CheckAuthListFirst &&
758 !pvar->tryed_ssh2_authlist) {
759 if (!autologin_sent_none) {
760 autologin_sent_none = TRUE;
761
762 // �_�C�A���O�����[�U������������
763 if (pvar->auth_state.user == NULL) {
764 pvar->auth_state.user =
765 alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
766 }
767
768 // CheckAuthListFirst �� TRUE �������� AuthList ���A����������������
769 // IDOK �����������i�����������A�F�����\�b�h none ������ (2008.10.12 maya)
770 do_SSH2_userauth(pvar);
771 }
772 //else {
773 // none �������������A����������������
774 //}
775 }
776 else {
777 // SSH1 ������
778 // ������ CheckAuthListFirst �� FALSE ������
779 // ������ CheckAuthListFirst TRUE ���Aauthlist ���A������������
780 KillTimer(dlg, IDC_TIMER1);
781
782 // �_�C�A���O�����[�U������������
783 if (pvar->auth_state.user == NULL) {
784 pvar->auth_state.user =
785 alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
786 }
787
788 SendMessage(dlg, WM_COMMAND, IDOK, 0);
789 }
790 }
791 }
792 else if (wParam == IDC_TIMER2) {
793 // authlist ����������
794 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
795 (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
796 if (SSHv2(pvar)) {
797 KillTimer(dlg, IDC_TIMER2);
798
799 // �_�C�A���O�����[�U������������
800 if (pvar->auth_state.user == NULL) {
801 pvar->auth_state.user =
802 alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
803 }
804
805 // ���[�U�������X��������
806 EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
807
808 // �F�����\�b�h none ������
809 do_SSH2_userauth(pvar);
810
811 // TIS �p�� OK �����������F�������s������������������
812 // Unexpected SSH2 message �������B
813 }
814 else if (SSHv1(pvar)) {
815 KillTimer(dlg, IDC_TIMER2);
816
817 // TIS �p�� OK ������
818 if (pvar->ssh2_authmethod == SSH_AUTH_TIS) {
819 SendMessage(dlg, WM_COMMAND, IDOK, 0);
820 }
821 // SSH1 �����F�����\�b�h none ����������
822 }
823 // �v���g�R���o�[�W�����m���O������������
824 }
825 }
826 else if (wParam == IDC_TIMER3) {
827 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
828 (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
829 if (SSHv2(pvar) || SSHv1(pvar)) {
830 KillTimer(dlg, IDC_TIMER3);
831
832 // TIS �p�� OK ������
833 SendMessage(dlg, WM_COMMAND, IDOK, 0);
834 }
835 // �v���g�R���o�[�W�����m���O������������
836 }
837 }
838 return FALSE;
839
840 case WM_COMMAND:
841 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
842
843 switch (LOWORD(wParam)) {
844 case IDOK:
845 // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2001.1.25 yutaka)
846 if (pvar->userauth_retry_count == 0 &&
847 ((pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) ||
848 !(pvar->ssh_state.status_flags & STATUS_HOST_OK))) {
849 return FALSE;
850 }
851 else if (SSHv2(pvar) &&
852 pvar->session_settings.CheckAuthListFirst &&
853 !pvar->tryed_ssh2_authlist) {
854 // CheckAuthListFirst ���L�����F������������������������
855 // OK �������������������� (2008.10.4 maya)
856 return FALSE;
857 }
858
859 return end_auth_dlg(pvar, dlg);
860
861 case IDCANCEL: /* kill the connection */
862 pvar->auth_state.auth_dialog = NULL;
863 notify_closed_connection(pvar);
864 EndDialog(dlg, 0);
865
866 if (DlgAuthFont != NULL) {
867 DeleteObject(DlgAuthFont);
868 }
869
870 return TRUE;
871
872 case IDC_SSHUSERNAME:
873 // ���[�U�����t�H�[�J�X������������ (2007.9.29 maya)
874 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
875 (pvar->ssh_state.status_flags & STATUS_HOST_OK) &&
876 HIWORD(wParam) == EN_KILLFOCUS) {
877 // �������L���������������s��������������
878 if (SSHv2(pvar) &&
879 pvar->session_settings.CheckAuthListFirst &&
880 !pvar->tryed_ssh2_authlist) {
881 // �_�C�A���O�����[�U�������f
882 if (pvar->auth_state.user == NULL) {
883 pvar->auth_state.user =
884 alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
885 }
886
887 // ���[�U���������������������`�F�b�N����
888 if (strlen(pvar->auth_state.user) == 0) {
889 return FALSE;
890 }
891
892 // ���[�U�������X��������
893 EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
894
895 // �F�����\�b�h none ������
896 do_SSH2_userauth(pvar);
897 return TRUE;
898 }
899 }
900
901 return FALSE;
902
903 case IDC_SSHUSEPASSWORD:
904 case IDC_SSHUSERSA:
905 case IDC_SSHUSERHOSTS:
906 case IDC_SSHUSETIS:
907 case IDC_SSHUSEPAGEANT:
908 set_auth_options_status(dlg, LOWORD(wParam));
909 return TRUE;
910
911 case IDC_CHOOSERSAFILE:
912 choose_RSA_key_file(dlg, pvar);
913 return TRUE;
914
915 case IDC_CHOOSEHOSTRSAFILE:
916 choose_host_RSA_key_file(dlg, pvar);
917 return TRUE;
918
919 case IDC_FORWARD_AGENT:
920 // �����Z�b�V�������������f������ (2008.12.4 maya)
921 pvar->session_settings.ForwardAgent = IsDlgButtonChecked(dlg, IDC_FORWARD_AGENT);
922 return TRUE;
923
924 default:
925 return FALSE;
926 }
927
928 default:
929 return FALSE;
930 }
931 }
932
933 char FAR *AUTH_get_user_name(PTInstVar pvar)
934 {
935 return pvar->auth_state.user;
936 }
937
938 int AUTH_set_supported_auth_types(PTInstVar pvar, int types)
939 {
940 char buf[1024];
941
942 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
943 "Server reports supported authentication method mask = %d",
944 types);
945 buf[sizeof(buf) - 1] = 0;
946 notify_verbose_message(pvar, buf, LOG_LEVEL_VERBOSE);
947
948 if (SSHv1(pvar)) {
949 types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
950 | (1 << SSH_AUTH_RHOSTS_RSA) | (1 << SSH_AUTH_RHOSTS)
951 | (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);
952 } else {
953 // for SSH2(yutaka)
954 // types &= (1 << SSH_AUTH_PASSWORD);
955 // ���J���F�����L�������� (2004.12.18 yutaka)
956 // TIS�������BSSH2����keyboard-interactive�����������B(2005.3.12 yutaka)
957 types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
958 | (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);
959 }
960 pvar->auth_state.supported_types = types;
961
962 if (types == 0) {
963 UTIL_get_lang_msg("MSG_NOAUTHMETHOD_ERROR", pvar,
964 "Server does not support any of the authentication options\n"
965 "provided by TTSSH. This connection will now close.");
966 notify_fatal_error(pvar, pvar->ts->UIMsg);
967 return 0;
968 } else {
969 if (pvar->auth_state.auth_dialog != NULL) {
970 update_server_supported_types(pvar,
971 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 FAR *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);
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);
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 FAR * 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 FAR * 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