Open-Source-Software-Entwicklung und Downloads

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3026 - (show annotations) (download) (as text)
Thu Oct 4 15:18:31 2007 UTC (16 years, 8 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 45713 byte(s)
no message

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

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