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