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 5042 - (show annotations) (download) (as text)
Tue Oct 16 12:43:13 2012 UTC (11 years, 5 months ago) by yutakapon
Original Path: trunk/ttssh2/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 53957 byte(s)
PuTTYのシンボルと衝突するため、Tera Term側の名前を変更する。

 ・key_type -> ssh_key_type


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

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