Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /branches/ssh_chacha20poly1305/ttssh2/ttxssh/auth.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3128 - (hide annotations) (download) (as text)
Wed May 21 01:05:36 2008 UTC (15 years, 10 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 50002 byte(s)
認証ダイアログで Pageant が国際化対応されていなかったのを修正した。

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

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