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 4378 - (show annotations) (download) (as text)
Tue Mar 8 14:19:03 2011 UTC (13 years, 1 month ago) by maya
Original Path: trunk/ttssh2/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 53737 byte(s)
SSH2 の 圧縮で none を利用できるように修正した。
ソース整理
  鍵形式・KEXプロトコル・MAC・圧縮の名前や関数を取得する関数を作成。
    これにより定義で順序を入れ替えてもよくなった。
  enum に型名を付けた。
  共通の関数を使えるところで使うようにした。
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 static 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 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 memcpy(filter, pvar->ts->UIMsg, sizeof(filter));
382 params.lpstrFilter = filter;
383 params.lpstrCustomFilter = NULL;
384 params.nFilterIndex = 0;
385 buf[0] = 0;
386 params.lpstrFile = fullname_buf;
387 params.nMaxFile = sizeof(fullname_buf);
388 params.lpstrFileTitle = NULL;
389 params.lpstrInitialDir = NULL;
390 UTIL_get_lang_msg("FILEDLG_OPEN_PRIVATEKEY_TITLE", pvar,
391 "Choose a file with the RSA/DSA/ECDSA private key");
392 params.lpstrTitle = pvar->ts->UIMsg;
393 params.Flags =
394 OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;
395 params.lpstrDefExt = NULL;
396
397 if (GetOpenFileName(&params) != 0) {
398 copy_teraterm_dir_relative_path(buf, bufsize, fullname_buf);
399 return 1;
400 } else {
401 return 0;
402 }
403 }
404
405 static void choose_RSA_key_file(HWND dlg, PTInstVar pvar)
406 {
407 char buf[1024];
408
409 if (get_key_file_name(dlg, buf, sizeof(buf), pvar)) {
410 SetDlgItemText(dlg, IDC_RSAFILENAME, buf);
411 }
412 }
413
414 static void choose_host_RSA_key_file(HWND dlg, PTInstVar pvar)
415 {
416 char buf[1024];
417
418 if (get_key_file_name(dlg, buf, sizeof(buf), pvar)) {
419 SetDlgItemText(dlg, IDC_HOSTRSAFILENAME, buf);
420 }
421 }
422
423 static BOOL end_auth_dlg(PTInstVar pvar, HWND dlg)
424 {
425 int method = SSH_AUTH_PASSWORD;
426 char FAR *password =
427 alloc_control_text(GetDlgItem(dlg, IDC_SSHPASSWORD));
428 Key *key_pair = NULL;
429
430 if (IsDlgButtonChecked(dlg, IDC_SSHUSERSA)) {
431 method = SSH_AUTH_RSA;
432 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSERHOSTS)) {
433 if (GetWindowTextLength(GetDlgItem(dlg, IDC_HOSTRSAFILENAME)) > 0) {
434 method = SSH_AUTH_RHOSTS_RSA;
435 } else {
436 method = SSH_AUTH_RHOSTS;
437 }
438 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSETIS)) {
439 method = SSH_AUTH_TIS;
440 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSEPAGEANT)) {
441 method = SSH_AUTH_PAGEANT;
442 }
443
444 if (method == SSH_AUTH_RSA || method == SSH_AUTH_RHOSTS_RSA) {
445 char buf[2048];
446 int file_ctl_ID =
447 method == SSH_AUTH_RSA ? IDC_RSAFILENAME : IDC_HOSTRSAFILENAME;
448
449 buf[0] = 0;
450 GetDlgItemText(dlg, file_ctl_ID, buf, sizeof(buf));
451 if (buf[0] == 0) {
452 UTIL_get_lang_msg("MSG_KEYSPECIFY_ERROR", pvar,
453 "You must specify a file containing the RSA/DSA/ECDSA private key.");
454 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
455 SetFocus(GetDlgItem(dlg, file_ctl_ID));
456 destroy_malloced_string(&password);
457 return FALSE;
458 }
459
460 if (SSHv1(pvar)) {
461 BOOL invalid_passphrase = FALSE;
462
463 key_pair = KEYFILES_read_private_key(pvar, buf, password,
464 &invalid_passphrase,
465 FALSE);
466
467 if (key_pair == NULL) {
468 if (invalid_passphrase) {
469 HWND passwordCtl = GetDlgItem(dlg, IDC_SSHPASSWORD);
470
471 SetFocus(passwordCtl);
472 SendMessage(passwordCtl, EM_SETSEL, 0, -1);
473 } else {
474 SetFocus(GetDlgItem(dlg, file_ctl_ID));
475 }
476 destroy_malloced_string(&password);
477 return FALSE;
478 }
479
480 } else { // SSH2(yutaka)
481 BOOL invalid_passphrase = FALSE;
482 char errmsg[256];
483
484 memset(errmsg, 0, sizeof(errmsg));
485 //GetCurrentDirectory(sizeof(errmsg), errmsg);
486
487 key_pair = read_SSH2_private_key(pvar, buf, password,
488 &invalid_passphrase,
489 FALSE,
490 errmsg,
491 sizeof(errmsg)
492 );
493
494 if (key_pair == NULL) { // read error
495 char buf[1024];
496 UTIL_get_lang_msg("MSG_READKEY_ERROR", pvar,
497 "read error SSH2 private key file\r\n%s");
498 _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, errmsg);
499 notify_nonfatal_error(pvar, buf);
500 // �p�X�t���[�Y���������v����������������IDC_SSHPASSWORD���t�H�[�J�X������ (2006.10.29 yasuhide)
501 if (invalid_passphrase) {
502 HWND passwordCtl = GetDlgItem(dlg, IDC_SSHPASSWORD);
503
504 SetFocus(passwordCtl);
505 SendMessage(passwordCtl, EM_SETSEL, 0, -1);
506 } else {
507 SetFocus(GetDlgItem(dlg, file_ctl_ID));
508 }
509 destroy_malloced_string(&password);
510 return FALSE;
511 }
512
513 }
514
515 }
516 else if (method == SSH_AUTH_PAGEANT) {
517 pvar->pageant_key = NULL;
518 pvar->pageant_curkey = NULL;
519 pvar->pageant_keylistlen = 0;
520 pvar->pageant_keycount = 0;
521 pvar->pageant_keycurrent = 0;
522 pvar->pageant_keyfinal=FALSE;
523
524 // Pageant �����M
525 if (SSHv1(pvar)) {
526 pvar->pageant_keylistlen = putty_get_ssh1_keylist(&pvar->pageant_key);
527 }
528 else {
529 pvar->pageant_keylistlen = putty_get_ssh2_keylist(&pvar->pageant_key);
530 }
531 if (pvar->pageant_keylistlen == 0) {
532 UTIL_get_lang_msg("MSG_PAGEANT_NOTFOUND", pvar,
533 "Can't find Pageant.");
534 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
535
536 return FALSE;
537 }
538 pvar->pageant_curkey = pvar->pageant_key;
539
540 // ������
541 pvar->pageant_keycount = get_uint32_MSBfirst(pvar->pageant_curkey);
542 if (pvar->pageant_keycount == 0) {
543 UTIL_get_lang_msg("MSG_PAGEANT_NOKEY", pvar,
544 "Pageant has no valid key.");
545 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
546
547 return FALSE;
548 }
549 pvar->pageant_curkey += 4;
550 }
551
552 /* from here on, we cannot fail, so just munge cur_cred in place */
553 pvar->auth_state.cur_cred.method = method;
554 pvar->auth_state.cur_cred.key_pair = key_pair;
555 /* we can't change the user name once it's set. It may already have
556 been sent to the server, and it can only be sent once. */
557 if (pvar->auth_state.user == NULL) {
558 pvar->auth_state.user =
559 alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
560 }
561
562 // �p�X���[�h���������������������������� (2006.8.3 yutaka)
563 if (SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_GETCHECK, 0,0) == BST_CHECKED) {
564 pvar->settings.remember_password = 1; // �o��������
565 pvar->ts_SSH->remember_password = 1;
566 } else {
567 pvar->settings.remember_password = 0; // ���������������Y����
568 pvar->ts_SSH->remember_password = 0;
569 }
570
571 // ���J���F���������A�Z�b�V�������������p�X���[�h���g�����������������������������������B
572 // (2005.4.8 yutaka)
573 if (method == SSH_AUTH_PASSWORD || method == SSH_AUTH_RSA) {
574 pvar->auth_state.cur_cred.password = password;
575 } else {
576 destroy_malloced_string(&password);
577 }
578 if (method == SSH_AUTH_RHOSTS || method == SSH_AUTH_RHOSTS_RSA) {
579 if (pvar->session_settings.DefaultAuthMethod != SSH_AUTH_RHOSTS) {
580 UTIL_get_lang_msg("MSG_RHOSTS_NOTDEFAULT_ERROR", pvar,
581 "Rhosts authentication will probably fail because it was not "
582 "the default authentication method.\n"
583 "To use Rhosts authentication "
584 "in TTSSH, you need to set it to be the default by restarting\n"
585 "TTSSH and selecting \"SSH Authentication...\" from the Setup menu"
586 "before connecting.");
587 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
588 }
589
590 pvar->auth_state.cur_cred.rhosts_client_user =
591 alloc_control_text(GetDlgItem(dlg, IDC_LOCALUSERNAME));
592 }
593 pvar->auth_state.auth_dialog = NULL;
594
595 GetDlgItemText(dlg, IDC_RSAFILENAME,
596 pvar->session_settings.DefaultRSAPrivateKeyFile,
597 sizeof(pvar->session_settings.
598 DefaultRSAPrivateKeyFile));
599 GetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
600 pvar->session_settings.DefaultRhostsHostPrivateKeyFile,
601 sizeof(pvar->session_settings.
602 DefaultRhostsHostPrivateKeyFile));
603 GetDlgItemText(dlg, IDC_LOCALUSERNAME,
604 pvar->session_settings.DefaultRhostsLocalUserName,
605 sizeof(pvar->session_settings.
606 DefaultRhostsLocalUserName));
607
608 if (SSHv1(pvar)) {
609 SSH_notify_user_name(pvar);
610 SSH_notify_cred(pvar);
611 } else {
612 // for SSH2(yutaka)
613 do_SSH2_userauth(pvar);
614 }
615
616 EndDialog(dlg, 1);
617 if (DlgAuthFont != NULL) {
618 DeleteObject(DlgAuthFont);
619 }
620
621 return TRUE;
622 }
623
624 BOOL autologin_sent_none;
625 static BOOL CALLBACK auth_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
626 LPARAM lParam)
627 {
628 const int IDC_TIMER1 = 300; // �������O�C�����L��������
629 const int IDC_TIMER2 = 301; // �T�|�[�g�������������\�b�h�������`�F�b�N(CheckAuthListFirst)
630 const int IDC_TIMER3 = 302; // challenge �� ask4passwd ��CheckAuthListFirst �� FALSE ������
631 const int autologin_timeout = 10; // �~���b
632 PTInstVar pvar;
633 LOGFONT logfont;
634 HFONT font;
635
636 switch (msg) {
637 case WM_INITDIALOG:
638 pvar = (PTInstVar) lParam;
639 pvar->auth_state.auth_dialog = dlg;
640 SetWindowLong(dlg, DWL_USER, lParam);
641
642 init_auth_dlg(pvar, dlg);
643
644 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
645 GetObject(font, sizeof(LOGFONT), &logfont);
646 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthFont, pvar)) {
647 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
648 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
649 SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
650 SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
651 SendDlgItemMessage(dlg, IDC_SSHPASSWORDCAPTION, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
652 SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
653 SendDlgItemMessage(dlg, IDC_REMEMBER_PASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
654 SendDlgItemMessage(dlg, IDC_FORWARD_AGENT, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
655 SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
656 SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
657 SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
658 SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
659 SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
660 SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
661 SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
662 SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
663 SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
664 SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
665 SendDlgItemMessage(dlg, IDC_SSHUSEPAGEANT, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
666 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
667 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
668 }
669 else {
670 DlgAuthFont = NULL;
671 }
672
673 // SSH2 autologin���L�����������A�^�C�}���d�|�����B (2004.12.1 yutaka)
674 if (pvar->ssh2_autologin == 1) {
675 autologin_sent_none = FALSE;
676 SetTimer(dlg, IDC_TIMER1, autologin_timeout, 0);
677 }
678 else {
679 // �T�|�[�g�������������\�b�h���`�F�b�N�����B(2007.9.24 maya)
680 // �������L�����A�����������s�����������A���[�U�����m����������
681 if (pvar->session_settings.CheckAuthListFirst &&
682 !pvar->tryed_ssh2_authlist &&
683 GetWindowTextLength(GetDlgItem(dlg, IDC_SSHUSERNAME)) > 0) {
684 SetTimer(dlg, IDC_TIMER2, autologin_timeout, 0);
685 }
686 // /auth=challenge �� /ask4passwd ���w���������������[�U�����m����������
687 // �������AOK �{�^���������� TIS auth �_�C�A���O���o��
688 else if (pvar->ssh2_authmethod == SSH_AUTH_TIS &&
689 pvar->ask4passwd &&
690 GetWindowTextLength(GetDlgItem(dlg, IDC_SSHUSERNAME)) > 0) {
691 SetTimer(dlg, IDC_TIMER3, autologin_timeout, 0);
692 }
693 }
694 return FALSE; /* because we set the focus */
695
696 case WM_TIMER:
697 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
698 // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2004.12.16 yutaka)
699 if (wParam == IDC_TIMER1) {
700 // �������O�C��������
701 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
702 (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
703 if (SSHv2(pvar) &&
704 pvar->session_settings.CheckAuthListFirst &&
705 !pvar->tryed_ssh2_authlist) {
706 if (!autologin_sent_none) {
707 autologin_sent_none = TRUE;
708
709 // �_�C�A���O�����[�U������������
710 if (pvar->auth_state.user == NULL) {
711 pvar->auth_state.user =
712 alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
713 }
714
715 // CheckAuthListFirst �� TRUE �������� AuthList ���A����������������
716 // IDOK �����������i�����������A�F�����\�b�h none ������ (2008.10.12 maya)
717 do_SSH2_userauth(pvar);
718 }
719 //else {
720 // none �������������A����������������
721 //}
722 }
723 else {
724 // SSH1 ������
725 // ������ CheckAuthListFirst �� FALSE ������
726 // ������ CheckAuthListFirst TRUE ���Aauthlist ���A������������
727 KillTimer(dlg, IDC_TIMER1);
728
729 // �_�C�A���O�����[�U������������
730 if (pvar->auth_state.user == NULL) {
731 pvar->auth_state.user =
732 alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
733 }
734
735 SendMessage(dlg, WM_COMMAND, IDOK, 0);
736 }
737 }
738 }
739 else if (wParam == IDC_TIMER2) {
740 // authlist ����������
741 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
742 (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
743 if (SSHv2(pvar)) {
744 KillTimer(dlg, IDC_TIMER2);
745
746 // �_�C�A���O�����[�U������������
747 if (pvar->auth_state.user == NULL) {
748 pvar->auth_state.user =
749 alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
750 }
751
752 // ���[�U�������X��������
753 EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
754
755 // �F�����\�b�h none ������
756 do_SSH2_userauth(pvar);
757
758 // TIS �p�� OK �����������F�������s������������������
759 // Unexpected SSH2 message �������B
760 }
761 else if (SSHv1(pvar)) {
762 KillTimer(dlg, IDC_TIMER2);
763
764 // TIS �p�� OK ������
765 if (pvar->ssh2_authmethod == SSH_AUTH_TIS) {
766 SendMessage(dlg, WM_COMMAND, IDOK, 0);
767 }
768 // SSH1 �����F�����\�b�h none ����������
769 }
770 // �v���g�R���o�[�W�����m���O������������
771 }
772 }
773 else if (wParam == IDC_TIMER3) {
774 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
775 (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
776 if (SSHv2(pvar) || SSHv1(pvar)) {
777 KillTimer(dlg, IDC_TIMER3);
778
779 // TIS �p�� OK ������
780 SendMessage(dlg, WM_COMMAND, IDOK, 0);
781 }
782 // �v���g�R���o�[�W�����m���O������������
783 }
784 }
785 return FALSE;
786
787 case WM_COMMAND:
788 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
789
790 switch (LOWORD(wParam)) {
791 case IDOK:
792 // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2001.1.25 yutaka)
793 if (pvar->userauth_retry_count == 0 &&
794 ((pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) ||
795 !(pvar->ssh_state.status_flags & STATUS_HOST_OK))) {
796 return FALSE;
797 }
798 else if (SSHv2(pvar) &&
799 pvar->session_settings.CheckAuthListFirst &&
800 !pvar->tryed_ssh2_authlist) {
801 // CheckAuthListFirst ���L�����F������������������������
802 // OK �������������������� (2008.10.4 maya)
803 return FALSE;
804 }
805
806 return end_auth_dlg(pvar, dlg);
807
808 case IDCANCEL: /* kill the connection */
809 pvar->auth_state.auth_dialog = NULL;
810 notify_closed_connection(pvar);
811 EndDialog(dlg, 0);
812
813 if (DlgAuthFont != NULL) {
814 DeleteObject(DlgAuthFont);
815 }
816
817 return TRUE;
818
819 case IDC_SSHUSERNAME:
820 // ���[�U�����t�H�[�J�X������������ (2007.9.29 maya)
821 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
822 (pvar->ssh_state.status_flags & STATUS_HOST_OK) &&
823 HIWORD(wParam) == EN_KILLFOCUS) {
824 // �������L���������������s��������������
825 if (SSHv2(pvar) &&
826 pvar->session_settings.CheckAuthListFirst &&
827 !pvar->tryed_ssh2_authlist) {
828 // �_�C�A���O�����[�U�������f
829 if (pvar->auth_state.user == NULL) {
830 pvar->auth_state.user =
831 alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
832 }
833
834 // ���[�U���������������������`�F�b�N����
835 if (strlen(pvar->auth_state.user) == 0) {
836 return FALSE;
837 }
838
839 // ���[�U�������X��������
840 EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
841
842 // �F�����\�b�h none ������
843 do_SSH2_userauth(pvar);
844 return TRUE;
845 }
846 }
847
848 return FALSE;
849
850 case IDC_SSHUSEPASSWORD:
851 case IDC_SSHUSERSA:
852 case IDC_SSHUSERHOSTS:
853 case IDC_SSHUSETIS:
854 case IDC_SSHUSEPAGEANT:
855 set_auth_options_status(dlg, LOWORD(wParam));
856 return TRUE;
857
858 case IDC_CHOOSERSAFILE:
859 choose_RSA_key_file(dlg, pvar);
860 return TRUE;
861
862 case IDC_CHOOSEHOSTRSAFILE:
863 choose_host_RSA_key_file(dlg, pvar);
864 return TRUE;
865
866 case IDC_FORWARD_AGENT:
867 // �����Z�b�V�������������f������ (2008.12.4 maya)
868 pvar->session_settings.ForwardAgent = IsDlgButtonChecked(dlg, IDC_FORWARD_AGENT);
869 return TRUE;
870
871 default:
872 return FALSE;
873 }
874
875 default:
876 return FALSE;
877 }
878 }
879
880 char FAR *AUTH_get_user_name(PTInstVar pvar)
881 {
882 return pvar->auth_state.user;
883 }
884
885 int AUTH_set_supported_auth_types(PTInstVar pvar, int types)
886 {
887 char buf[1024];
888
889 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
890 "Server reports supported authentication method mask = %d",
891 types);
892 buf[sizeof(buf) - 1] = 0;
893 notify_verbose_message(pvar, buf, LOG_LEVEL_VERBOSE);
894
895 if (SSHv1(pvar)) {
896 types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
897 | (1 << SSH_AUTH_RHOSTS_RSA) | (1 << SSH_AUTH_RHOSTS)
898 | (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);
899 } else {
900 // for SSH2(yutaka)
901 // types &= (1 << SSH_AUTH_PASSWORD);
902 // ���J���F�����L�������� (2004.12.18 yutaka)
903 // TIS�������BSSH2����keyboard-interactive�����������B(2005.3.12 yutaka)
904 types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
905 | (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);
906 }
907 pvar->auth_state.supported_types = types;
908
909 if (types == 0) {
910 UTIL_get_lang_msg("MSG_NOAUTHMETHOD_ERROR", pvar,
911 "Server does not support any of the authentication options\n"
912 "provided by TTSSH. This connection will now close.");
913 notify_fatal_error(pvar, pvar->ts->UIMsg);
914 return 0;
915 } else {
916 if (pvar->auth_state.auth_dialog != NULL) {
917 update_server_supported_types(pvar,
918 pvar->auth_state.auth_dialog);
919 }
920
921 return 1;
922 }
923 }
924
925 static void start_user_auth(PTInstVar pvar)
926 {
927 // �F���_�C�A���O���\�������� (2004.12.1 yutaka)
928 PostMessage(pvar->NotificationWindow, WM_COMMAND, (WPARAM) ID_SSHAUTH,
929 (LPARAM) NULL);
930 pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
931 }
932
933 static void try_default_auth(PTInstVar pvar)
934 {
935 if (pvar->session_settings.TryDefaultAuth) {
936 switch (pvar->session_settings.DefaultAuthMethod) {
937 case SSH_AUTH_RSA:{
938 BOOL invalid_passphrase;
939 char password[] = "";
940
941 pvar->auth_state.cur_cred.key_pair
942 =
943 KEYFILES_read_private_key(pvar,
944 pvar->session_settings.
945 DefaultRSAPrivateKeyFile,
946 password,
947 &invalid_passphrase, TRUE);
948 if (pvar->auth_state.cur_cred.key_pair == NULL) {
949 return;
950 } else {
951 pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
952 }
953 break;
954 }
955
956 case SSH_AUTH_RHOSTS:
957 if (pvar->session_settings.
958 DefaultRhostsHostPrivateKeyFile[0] != 0) {
959 BOOL invalid_passphrase;
960 char password[] = "";
961
962 pvar->auth_state.cur_cred.key_pair
963 =
964 KEYFILES_read_private_key(pvar,
965 pvar->session_settings.
966 DefaultRhostsHostPrivateKeyFile,
967 password,
968 &invalid_passphrase, TRUE);
969 if (pvar->auth_state.cur_cred.key_pair == NULL) {
970 return;
971 } else {
972 pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS_RSA;
973 }
974 } else {
975 pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS;
976 }
977
978 pvar->auth_state.cur_cred.rhosts_client_user =
979 _strdup(pvar->session_settings.DefaultRhostsLocalUserName);
980 break;
981
982 case SSH_AUTH_PAGEANT:
983 pvar->auth_state.cur_cred.method = SSH_AUTH_PAGEANT;
984 break;
985
986 case SSH_AUTH_PASSWORD:
987 pvar->auth_state.cur_cred.password = _strdup("");
988 pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
989 break;
990
991 case SSH_AUTH_TIS:
992 default:
993 return;
994 }
995
996 pvar->auth_state.user =
997 _strdup(pvar->session_settings.DefaultUserName);
998 }
999 }
1000
1001 void AUTH_notify_end_error(PTInstVar pvar)
1002 {
1003 if ((pvar->auth_state.flags & AUTH_START_USER_AUTH_ON_ERROR_END) != 0) {
1004 start_user_auth(pvar);
1005 pvar->auth_state.flags &= ~AUTH_START_USER_AUTH_ON_ERROR_END;
1006 }
1007 }
1008
1009 void AUTH_advance_to_next_cred(PTInstVar pvar)
1010 {
1011 pvar->auth_state.failed_method = pvar->auth_state.cur_cred.method;
1012
1013 if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
1014 try_default_auth(pvar);
1015
1016 if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
1017 if (pvar->err_msg != NULL) {
1018 pvar->auth_state.flags |=
1019 AUTH_START_USER_AUTH_ON_ERROR_END;
1020 } else {
1021 // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
1022 // �R�}���h���C���w������������
1023 start_user_auth(pvar);
1024 }
1025 }
1026 } else {
1027 // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
1028 // �R�}���h���C���w������(/auth=xxxx)������
1029 start_user_auth(pvar);
1030 }
1031 }
1032
1033 static void init_TIS_dlg(PTInstVar pvar, HWND dlg)
1034 {
1035 char uimsg[MAX_UIMSG];
1036
1037 GetWindowText(dlg, uimsg, sizeof(uimsg));
1038 UTIL_get_lang_msg("DLG_TIS_TITLE", pvar, uimsg);
1039 SetWindowText(dlg, pvar->ts->UIMsg);
1040 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
1041 UTIL_get_lang_msg("DLG_TIS_BANNER", pvar, uimsg);
1042 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
1043 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1044 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1045 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1046 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1047 UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
1048 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1049
1050 init_auth_machine_banner(pvar, dlg);
1051 init_password_control(dlg);
1052
1053 if (pvar->auth_state.TIS_prompt != NULL) {
1054 if (strlen(pvar->auth_state.TIS_prompt) > 10000) {
1055 pvar->auth_state.TIS_prompt[10000] = 0;
1056 }
1057 SetDlgItemText(dlg, IDC_SSHAUTHBANNER2,
1058 pvar->auth_state.TIS_prompt);
1059 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1060 }
1061 }
1062
1063 static BOOL end_TIS_dlg(PTInstVar pvar, HWND dlg)
1064 {
1065 char FAR *password =
1066 alloc_control_text(GetDlgItem(dlg, IDC_SSHPASSWORD));
1067
1068 pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
1069 pvar->auth_state.cur_cred.password = password;
1070 pvar->auth_state.auth_dialog = NULL;
1071
1072 // add
1073 if (SSHv2(pvar)) {
1074 pvar->keyboard_interactive_password_input = 1;
1075 handle_SSH2_userauth_inforeq(pvar);
1076 }
1077
1078 SSH_notify_cred(pvar);
1079
1080 EndDialog(dlg, 1);
1081 return TRUE;
1082 }
1083
1084 static BOOL CALLBACK TIS_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
1085 LPARAM lParam)
1086 {
1087 PTInstVar pvar;
1088 LOGFONT logfont;
1089 HFONT font;
1090
1091 switch (msg) {
1092 case WM_INITDIALOG:
1093 pvar = (PTInstVar) lParam;
1094 pvar->auth_state.auth_dialog = dlg;
1095 SetWindowLong(dlg, DWL_USER, lParam);
1096
1097 init_TIS_dlg(pvar, dlg);
1098
1099 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1100 GetObject(font, sizeof(LOGFONT), &logfont);
1101 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgTisFont, pvar)) {
1102 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1103 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1104 SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1105 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1106 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1107 }
1108 else {
1109 DlgTisFont = NULL;
1110 }
1111
1112 // /auth=challenge ������ (2007.10.5 maya)
1113 if (pvar->ssh2_autologin == 1) {
1114 SetDlgItemText(dlg, IDC_SSHPASSWORD, pvar->ssh2_password);
1115 SendMessage(dlg, WM_COMMAND, IDOK, 0);
1116 }
1117
1118 return FALSE; /* because we set the focus */
1119
1120 case WM_COMMAND:
1121 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1122
1123 switch (LOWORD(wParam)) {
1124 case IDOK:
1125 if (DlgTisFont != NULL) {
1126 DeleteObject(DlgTisFont);
1127 }
1128
1129 return end_TIS_dlg(pvar, dlg);
1130
1131 case IDCANCEL: /* kill the connection */
1132 pvar->auth_state.auth_dialog = NULL;
1133 notify_closed_connection(pvar);
1134 EndDialog(dlg, 0);
1135
1136 if (DlgTisFont != NULL) {
1137 DeleteObject(DlgTisFont);
1138 }
1139
1140 return TRUE;
1141
1142 default:
1143 return FALSE;
1144 }
1145
1146 default:
1147 return FALSE;
1148 }
1149 }
1150
1151 void AUTH_do_cred_dialog(PTInstVar pvar)
1152 {
1153 if (pvar->auth_state.auth_dialog == NULL) {
1154 HWND cur_active = GetActiveWindow();
1155 DLGPROC dlg_proc;
1156 LPCTSTR dialog_template;
1157
1158 switch (pvar->auth_state.mode) {
1159 case TIS_AUTH_MODE:
1160 dialog_template = MAKEINTRESOURCE(IDD_SSHTISAUTH);
1161 dlg_proc = TIS_dlg_proc;
1162 break;
1163 case GENERIC_AUTH_MODE:
1164 default:
1165 dialog_template = MAKEINTRESOURCE(IDD_SSHAUTH);
1166 dlg_proc = auth_dlg_proc;
1167 }
1168
1169 if (!DialogBoxParam(hInst, dialog_template,
1170 cur_active !=
1171 NULL ? cur_active : pvar->NotificationWindow,
1172 dlg_proc, (LPARAM) pvar) == -1) {
1173 UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTH_ERROR", pvar,
1174 "Unable to display authentication dialog box.\n"
1175 "Connection terminated.");
1176 notify_fatal_error(pvar, pvar->ts->UIMsg);
1177 }
1178 }
1179 }
1180
1181 static void init_default_auth_dlg(PTInstVar pvar, HWND dlg)
1182 {
1183 char uimsg[MAX_UIMSG];
1184
1185 GetWindowText(dlg, uimsg, sizeof(uimsg));
1186 UTIL_get_lang_msg("DLG_AUTHSETUP_TITLE", pvar, uimsg);
1187 SetWindowText(dlg, pvar->ts->UIMsg);
1188 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
1189 UTIL_get_lang_msg("DLG_AUTHSETUP_BANNER", pvar, uimsg);
1190 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
1191 GetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, uimsg, sizeof(uimsg));
1192 UTIL_get_lang_msg("DLG_AUTHSETUP_USERNAME", pvar, uimsg);
1193 SetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, pvar->ts->UIMsg);
1194 GetDlgItemText(dlg, IDC_SSHUSEPASSWORD, uimsg, sizeof(uimsg));
1195 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PASSWORD", pvar, uimsg);
1196 SetDlgItemText(dlg, IDC_SSHUSEPASSWORD, pvar->ts->UIMsg);
1197 GetDlgItemText(dlg, IDC_SSHUSERSA, uimsg, sizeof(uimsg));
1198 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RSA", pvar, uimsg);
1199 SetDlgItemText(dlg, IDC_SSHUSERSA, pvar->ts->UIMsg);
1200 GetDlgItemText(dlg, IDC_SSHUSERHOSTS, uimsg, sizeof(uimsg));
1201 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RHOST", pvar, uimsg);
1202 SetDlgItemText(dlg, IDC_SSHUSERHOSTS, pvar->ts->UIMsg);
1203 GetDlgItemText(dlg, IDC_SSHUSETIS, uimsg, sizeof(uimsg));
1204 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_CHALLENGE", pvar, uimsg);
1205 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
1206 GetDlgItemText(dlg, IDC_SSHUSEPAGEANT, uimsg, sizeof(uimsg));
1207 UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PAGEANT", pvar, uimsg);
1208 SetDlgItemText(dlg, IDC_SSHUSEPAGEANT, pvar->ts->UIMsg);
1209 GetDlgItemText(dlg, IDC_CHOOSERSAFILE, uimsg, sizeof(uimsg));
1210 UTIL_get_lang_msg("DLG_AUTH_PRIVATEKEY", pvar, uimsg);
1211 SetDlgItemText(dlg, IDC_CHOOSERSAFILE, pvar->ts->UIMsg);
1212 GetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, uimsg, sizeof(uimsg));
1213 UTIL_get_lang_msg("DLG_AUTH_LOCALUSER", pvar, uimsg);
1214 SetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, pvar->ts->UIMsg);
1215 GetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, uimsg, sizeof(uimsg));
1216 UTIL_get_lang_msg("DLG_AUTH_HOST_PRIVATEKEY", pvar, uimsg);
1217 SetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, pvar->ts->UIMsg);
1218 GetDlgItemText(dlg, IDC_CHECKAUTH, uimsg, sizeof(uimsg));
1219 UTIL_get_lang_msg("DLG_AUTHSETUP_CHECKAUTH", pvar, uimsg);
1220 SetDlgItemText(dlg, IDC_CHECKAUTH, pvar->ts->UIMsg);
1221 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1222 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1223 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1224 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1225 UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
1226 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1227
1228 switch (pvar->settings.DefaultAuthMethod) {
1229 case SSH_AUTH_RSA:
1230 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1231 IDC_SSHUSERSA);
1232 break;
1233 case SSH_AUTH_RHOSTS:
1234 case SSH_AUTH_RHOSTS_RSA:
1235 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1236 IDC_SSHUSERHOSTS);
1237 break;
1238 case SSH_AUTH_TIS:
1239 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1240 IDC_SSHUSETIS);
1241 break;
1242 case SSH_AUTH_PAGEANT:
1243 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1244 IDC_SSHUSEPAGEANT);
1245 break;
1246 case SSH_AUTH_PASSWORD:
1247 default:
1248 CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1249 IDC_SSHUSEPASSWORD);
1250 }
1251
1252 SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName);
1253 SetDlgItemText(dlg, IDC_RSAFILENAME,
1254 pvar->settings.DefaultRSAPrivateKeyFile);
1255 SetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1256 pvar->settings.DefaultRhostsHostPrivateKeyFile);
1257 SetDlgItemText(dlg, IDC_LOCALUSERNAME,
1258 pvar->settings.DefaultRhostsLocalUserName);
1259
1260 if (pvar->settings.CheckAuthListFirst) {
1261 CheckDlgButton(dlg, IDC_CHECKAUTH, TRUE);
1262 }
1263 }
1264
1265 static BOOL end_default_auth_dlg(PTInstVar pvar, HWND dlg)
1266 {
1267 if (IsDlgButtonChecked(dlg, IDC_SSHUSERSA)) {
1268 pvar->settings.DefaultAuthMethod = SSH_AUTH_RSA;
1269 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSERHOSTS)) {
1270 if (GetWindowTextLength(GetDlgItem(dlg, IDC_HOSTRSAFILENAME)) > 0) {
1271 pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS_RSA;
1272 } else {
1273 pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS;
1274 }
1275 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSETIS)) {
1276 pvar->settings.DefaultAuthMethod = SSH_AUTH_TIS;
1277 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSEPAGEANT)) {
1278 pvar->settings.DefaultAuthMethod = SSH_AUTH_PAGEANT;
1279 } else {
1280 pvar->settings.DefaultAuthMethod = SSH_AUTH_PASSWORD;
1281 }
1282
1283 GetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName,
1284 sizeof(pvar->settings.DefaultUserName));
1285 GetDlgItemText(dlg, IDC_RSAFILENAME,
1286 pvar->settings.DefaultRSAPrivateKeyFile,
1287 sizeof(pvar->settings.DefaultRSAPrivateKeyFile));
1288 GetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1289 pvar->settings.DefaultRhostsHostPrivateKeyFile,
1290 sizeof(pvar->settings.DefaultRhostsHostPrivateKeyFile));
1291 GetDlgItemText(dlg, IDC_LOCALUSERNAME,
1292 pvar->settings.DefaultRhostsLocalUserName,
1293 sizeof(pvar->settings.DefaultRhostsLocalUserName));
1294
1295 if (IsDlgButtonChecked(dlg, IDC_CHECKAUTH)) {
1296 pvar->settings.CheckAuthListFirst = TRUE;
1297 }
1298 else {
1299 pvar->settings.CheckAuthListFirst = FALSE;
1300 }
1301
1302 EndDialog(dlg, 1);
1303 return TRUE;
1304 }
1305
1306 static BOOL CALLBACK default_auth_dlg_proc(HWND dlg, UINT msg,
1307 WPARAM wParam, LPARAM lParam)
1308 {
1309 PTInstVar pvar;
1310 LOGFONT logfont;
1311 HFONT font;
1312
1313 switch (msg) {
1314 case WM_INITDIALOG:
1315 pvar = (PTInstVar) lParam;
1316 SetWindowLong(dlg, DWL_USER, lParam);
1317
1318 init_default_auth_dlg(pvar, dlg);
1319
1320 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1321 GetObject(font, sizeof(LOGFONT), &logfont);
1322 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthSetupFont, pvar)) {
1323 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1324 SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1325 SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1326 SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1327 SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1328 SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1329 SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1330 SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1331 SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1332 SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1333 SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1334 SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1335 SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1336 SendDlgItemMessage(dlg, IDC_SSHUSEPAGEANT, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1337 SendDlgItemMessage(dlg, IDC_CHECKAUTH, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1338 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1339 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1340 }
1341 else {
1342 DlgAuthSetupFont = NULL;
1343 }
1344
1345 return TRUE; /* because we do not set the focus */
1346
1347 case WM_COMMAND:
1348 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1349
1350 switch (LOWORD(wParam)) {
1351 case IDOK:
1352
1353 if (DlgAuthSetupFont != NULL) {
1354 DeleteObject(DlgAuthSetupFont);
1355 }
1356
1357 return end_default_auth_dlg(pvar, dlg);
1358
1359 case IDCANCEL:
1360 EndDialog(dlg, 0);
1361
1362 if (DlgAuthSetupFont != NULL) {
1363 DeleteObject(DlgAuthSetupFont);
1364 }
1365
1366 return TRUE;
1367
1368 case IDC_CHOOSERSAFILE:
1369 choose_RSA_key_file(dlg, pvar);
1370 return TRUE;
1371
1372 case IDC_CHOOSEHOSTRSAFILE:
1373 choose_host_RSA_key_file(dlg, pvar);
1374 return TRUE;
1375
1376 default:
1377 return FALSE;
1378 }
1379
1380 default:
1381 return FALSE;
1382 }
1383 }
1384
1385 void AUTH_init(PTInstVar pvar)
1386 {
1387 pvar->auth_state.failed_method = SSH_AUTH_NONE;
1388 pvar->auth_state.auth_dialog = NULL;
1389 pvar->auth_state.user = NULL;
1390 pvar->auth_state.flags = 0;
1391 pvar->auth_state.TIS_prompt = NULL;
1392 pvar->auth_state.supported_types = 0;
1393 pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
1394 pvar->auth_state.cur_cred.password = NULL;
1395 pvar->auth_state.cur_cred.rhosts_client_user = NULL;
1396 pvar->auth_state.cur_cred.key_pair = NULL;
1397 AUTH_set_generic_mode(pvar);
1398 }
1399
1400 void AUTH_set_generic_mode(PTInstVar pvar)
1401 {
1402 pvar->auth_state.mode = GENERIC_AUTH_MODE;
1403 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1404 }
1405
1406 void AUTH_set_TIS_mode(PTInstVar pvar, char FAR * prompt, int len)
1407 {
1408 if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1409 pvar->auth_state.mode = TIS_AUTH_MODE;
1410
1411 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1412 pvar->auth_state.TIS_prompt = malloc(len + 1);
1413 memcpy(pvar->auth_state.TIS_prompt, prompt, len);
1414 pvar->auth_state.TIS_prompt[len] = 0;
1415 } else {
1416 AUTH_set_generic_mode(pvar);
1417 }
1418 }
1419
1420 void AUTH_do_default_cred_dialog(PTInstVar pvar)
1421 {
1422 HWND cur_active = GetActiveWindow();
1423
1424 if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHAUTHSETUP),
1425 cur_active != NULL ? cur_active
1426 : pvar->NotificationWindow,
1427 default_auth_dlg_proc, (LPARAM) pvar) == -1) {
1428 UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTHSETUP_ERROR", pvar,
1429 "Unable to display authentication setup dialog box.");
1430 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1431 }
1432 }
1433
1434 void AUTH_destroy_cur_cred(PTInstVar pvar)
1435 {
1436 destroy_malloced_string(&pvar->auth_state.cur_cred.password);
1437 destroy_malloced_string(&pvar->auth_state.cur_cred.rhosts_client_user);
1438 if (pvar->auth_state.cur_cred.key_pair != NULL) {
1439 key_free(pvar->auth_state.cur_cred.key_pair);
1440 pvar->auth_state.cur_cred.key_pair = NULL;
1441 }
1442 }
1443
1444 static const char *get_auth_method_name(SSHAuthMethod auth)
1445 {
1446 switch (auth) {
1447 case SSH_AUTH_PASSWORD:
1448 return "password";
1449 case SSH_AUTH_RSA:
1450 return "RSA";
1451 case SSH_AUTH_PAGEANT:
1452 return "RSA (with Pageant)";
1453 case SSH_AUTH_RHOSTS:
1454 return "rhosts";
1455 case SSH_AUTH_RHOSTS_RSA:
1456 return "rhosts with RSA";
1457 case SSH_AUTH_TIS:
1458 return "challenge/response (TIS)";
1459 default:
1460 return "unknown method";
1461 }
1462 }
1463
1464 void AUTH_get_auth_info(PTInstVar pvar, char FAR * dest, int len)
1465 {
1466 const char *method = "unknown";
1467
1468 if (pvar->auth_state.user == NULL) {
1469 strncpy_s(dest, len, "None", _TRUNCATE);
1470 } else if (pvar->auth_state.cur_cred.method != SSH_AUTH_NONE) {
1471 if (SSHv1(pvar)) {
1472 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1473 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1474 get_auth_method_name(pvar->auth_state.cur_cred.method));
1475
1476 } else {
1477 // SSH2:�F�����\�b�h������ (2004.12.23 yutaka)
1478 // keyboard-interactive���\�b�h������ (2005.3.12 yutaka)
1479 if (pvar->auth_state.cur_cred.method == SSH_AUTH_PASSWORD ||
1480 pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1481 // keyboard-interactive���\�b�h������ (2005.1.24 yutaka)
1482 if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1483 method = "keyboard-interactive";
1484 } else {
1485 method = get_auth_method_name(pvar->auth_state.cur_cred.method);
1486 }
1487 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1488 _snprintf_s(dest, len, _TRUNCATE,
1489 pvar->ts->UIMsg, pvar->auth_state.user, method);
1490
1491 } else {
1492 if (pvar->auth_state.cur_cred.method == SSH_AUTH_RSA) {
1493 method = key_type(pvar->auth_state.cur_cred.key_pair);
1494 }
1495 else if (pvar->auth_state.cur_cred.method == SSH_AUTH_PAGEANT) {
1496 int len = get_uint32_MSBfirst(pvar->pageant_curkey + 4);
1497 char *s = (char *)malloc(len+1);
1498 ssh_keytype keytype;
1499
1500 memcpy(s, pvar->pageant_curkey+4+4, len);
1501 s[len] = '\0';
1502 keytype = get_keytype_from_name(s);
1503 if (keytype == KEY_RSA) {
1504 method = "RSA with Pageant";
1505 } else if (keytype == KEY_DSA) {
1506 method = "DSA with Pageant";
1507 }
1508 free(s);
1509 }
1510 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1511 _snprintf_s(dest, len, _TRUNCATE,
1512 pvar->ts->UIMsg, pvar->auth_state.user, method);
1513 }
1514
1515 }
1516
1517 } else {
1518 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1519 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1520 get_auth_method_name(pvar->auth_state.failed_method));
1521 }
1522
1523 dest[len - 1] = 0;
1524 }
1525
1526 void AUTH_notify_disconnecting(PTInstVar pvar)
1527 {
1528 if (pvar->auth_state.auth_dialog != NULL) {
1529 PostMessage(pvar->auth_state.auth_dialog, WM_COMMAND, IDCANCEL, 0);
1530 /* the main window might not go away if it's not enabled. (see vtwin.cpp) */
1531 EnableWindow(pvar->NotificationWindow, TRUE);
1532 }
1533 }
1534
1535 void AUTH_end(PTInstVar pvar)
1536 {
1537 destroy_malloced_string(&pvar->auth_state.user);
1538 destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1539
1540 AUTH_destroy_cur_cred(pvar);
1541 }

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