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 3036 - (show annotations) (download) (as text)
Tue Oct 16 15:28:14 2007 UTC (16 years, 5 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 46075 byte(s)
SSH2 の暗号方式として AES256 をサポートした。

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

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