Open-Source-Software-Entwicklung und Downloads

Browse Subversion Repository

Annotation of /trunk/ttssh2/ttxssh/auth.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3152 - (hide annotations) (download) (as text)
Sat Oct 4 12:37:29 2008 UTC (15 years, 8 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 50518 byte(s)
CheckAuthListFirst が有効な場合には、"none"認証の返事が返ってくるまで
OKボタンを押しても何も起こらないようにした。

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 3152 const int IDC_TIMER1 = 300; // �������O�C��
632     const int IDC_TIMER2 = 301; // �T�|�[�g�������������\�b�h���`�F�b�N
633     const int IDC_TIMER3 = 302; // �`�������W���X�|���X
634 maya 3029 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 maya 3138 SendDlgItemMessage(dlg, IDC_SSHUSEPAGEANT, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
668 maya 2943 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
669     SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
670     }
671     else {
672     DlgAuthFont = NULL;
673     }
674    
675 yutakakn 2739 // SSH2 autologin���L�����������A�^�C�}���d�|�����B (2004.12.1 yutaka)
676     if (pvar->ssh2_autologin == 1) {
677     SetTimer(dlg, IDC_TIMER1, autologin_timeout, 0);
678     }
679 maya 3015 else {
680     // �T�|�[�g�������������\�b�h���`�F�b�N�����B(2007.9.24 maya)
681     // �������L�����A�����������s�����������A���[�U�����m����������
682     if (pvar->session_settings.CheckAuthListFirst &&
683 maya 3029 !pvar->tryed_ssh2_authlist &&
684     GetWindowTextLength(GetDlgItem(dlg, IDC_SSHUSERNAME)) > 0) {
685     SetTimer(dlg, IDC_TIMER2, autologin_timeout, 0);
686 maya 3015 }
687 maya 3073 // /auth=challenge ���w���������������[�U�����m������������
688     // �������������������v�����������AOK �{�^����������
689     // TIS auth �_�C�A���O���o��
690 maya 3029 else {
691     SetTimer(dlg, IDC_TIMER3, autologin_timeout, 0);
692     }
693 maya 3015 }
694 yutakakn 2728 return FALSE; /* because we set the focus */
695    
696 yutakakn 2739 case WM_TIMER:
697 yutakakn 2752 pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
698     // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2004.12.16 yutaka)
699 maya 3015 if (wParam == IDC_TIMER1) {
700     // �������O�C��������
701 maya 3016 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
702     (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
703 maya 3015 KillTimer(dlg, IDC_TIMER1);
704     SendMessage(dlg, WM_COMMAND, IDOK, 0);
705     }
706 yutakakn 2752 }
707 maya 3015 else if (wParam == IDC_TIMER2) {
708     // authlist ����������
709 maya 3029 if (SSHv2(pvar)) {
710     if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
711     (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
712 maya 3015 KillTimer(dlg, IDC_TIMER2);
713 yutakakn 2739
714 maya 3029 // �_�C�A���O�����[�U������������
715     if (pvar->auth_state.user == NULL) {
716     pvar->auth_state.user =
717     alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
718     }
719    
720 maya 3015 // ���[�U�������X��������
721     EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
722    
723     // none ������
724     do_SSH2_userauth(pvar);
725 maya 3029
726     // TIS �p�� OK �������^�C�}�[���d�|��������
727     // �F�������s������������������
728     // Unexpected SSH2 message �������B
729 maya 3015 }
730 maya 3029 }
731     else if (SSHv1(pvar)) {
732     KillTimer(dlg, IDC_TIMER2);
733     // TIS �p�� OK �������^�C�}�[���d�|����
734     if (pvar->ssh2_authmethod == SSH_AUTH_TIS) {
735     SendMessage(dlg, WM_COMMAND, IDOK, 0);
736 maya 3015 }
737 maya 3029 // SSH1 ���� none ����������
738 maya 3015 }
739 maya 3029 // �v���g�R���o�[�W�����m���O������������
740 maya 3015 }
741 maya 3029 else if (wParam == IDC_TIMER3) {
742     if (SSHv2(pvar) || SSHv1(pvar)) {
743     // TIS �p�� OK �������^�C�}�[���d�|����
744     if (pvar->ssh2_authmethod == SSH_AUTH_TIS) {
745 maya 3073 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
746     (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
747     KillTimer(dlg, IDC_TIMER3);
748     SendMessage(dlg, WM_COMMAND, IDOK, 0);
749     }
750 maya 3029 }
751     }
752     // �v���g�R���o�[�W�����m���O������������
753     }
754 maya 3015 return FALSE;
755    
756 yutakakn 2728 case WM_COMMAND:
757     pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
758    
759     switch (LOWORD(wParam)) {
760     case IDOK:
761 yutakakn 2783 // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2001.1.25 yutaka)
762 maya 3016 if (pvar->userauth_retry_count == 0 &&
763     ((pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) ||
764     !(pvar->ssh_state.status_flags & STATUS_HOST_OK))) {
765 yutakakn 2783 return FALSE;
766     }
767 maya 3152 else if (pvar->session_settings.CheckAuthListFirst &&
768     !pvar->tryed_ssh2_authlist) {
769     // CheckAuthListFirst ���L�����F������������������������
770     // OK �������������������� (2008.10.4 maya)
771     return FALSE;
772     }
773 maya 2943
774 yutakakn 2728 return end_auth_dlg(pvar, dlg);
775    
776     case IDCANCEL: /* kill the connection */
777     pvar->auth_state.auth_dialog = NULL;
778     notify_closed_connection(pvar);
779     EndDialog(dlg, 0);
780 maya 2943
781     if (DlgAuthFont != NULL) {
782     DeleteObject(DlgAuthFont);
783     }
784    
785 yutakakn 2728 return TRUE;
786    
787 maya 3015 case IDC_SSHUSERNAME:
788     // ���[�U�����t�H�[�J�X������������ (2007.9.29 maya)
789     if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
790 maya 3016 (pvar->ssh_state.status_flags & STATUS_HOST_OK) &&
791 maya 3015 HIWORD(wParam) == EN_KILLFOCUS) {
792     // �������L���������������s��������������
793     if (SSHv2(pvar) &&
794     pvar->session_settings.CheckAuthListFirst &&
795     !pvar->tryed_ssh2_authlist) {
796     // �_�C�A���O�����[�U�������f
797     if (pvar->auth_state.user == NULL) {
798     pvar->auth_state.user =
799     alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
800     }
801    
802 maya 3023 // ���[�U���������������������`�F�b�N����
803     if (strlen(pvar->auth_state.user) == 0) {
804     return FALSE;
805     }
806    
807 maya 3015 // ���[�U�������X��������
808     EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
809    
810     // none ������
811     do_SSH2_userauth(pvar);
812     return TRUE;
813     }
814     }
815    
816     return FALSE;
817    
818 yutakakn 2728 case IDC_SSHUSEPASSWORD:
819     case IDC_SSHUSERSA:
820     case IDC_SSHUSERHOSTS:
821     case IDC_SSHUSETIS:
822 maya 3108 case IDC_SSHUSEPAGEANT:
823 yutakakn 2728 set_auth_options_status(dlg, LOWORD(wParam));
824     return TRUE;
825    
826     case IDC_CHOOSERSAFILE:
827 maya 2937 choose_RSA_key_file(dlg, pvar);
828 yutakakn 2728 return TRUE;
829    
830     case IDC_CHOOSEHOSTRSAFILE:
831 maya 2937 choose_host_RSA_key_file(dlg, pvar);
832 yutakakn 2728 return TRUE;
833    
834     default:
835     return FALSE;
836     }
837    
838     default:
839     return FALSE;
840     }
841     }
842    
843     char FAR *AUTH_get_user_name(PTInstVar pvar)
844     {
845     return pvar->auth_state.user;
846     }
847    
848     int AUTH_set_supported_auth_types(PTInstVar pvar, int types)
849     {
850     char buf[1024];
851    
852 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
853 maya 3003 "Server reports supported authentication method mask = %d",
854     types);
855 yutakakn 2728 buf[sizeof(buf) - 1] = 0;
856     notify_verbose_message(pvar, buf, LOG_LEVEL_VERBOSE);
857    
858     if (SSHv1(pvar)) {
859     types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
860 maya 3003 | (1 << SSH_AUTH_RHOSTS_RSA) | (1 << SSH_AUTH_RHOSTS)
861 maya 3108 | (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);
862 yutakakn 2728 } else {
863     // for SSH2(yutaka)
864 yutakakn 2762 // types &= (1 << SSH_AUTH_PASSWORD);
865     // ���J���F�����L�������� (2004.12.18 yutaka)
866 yutakakn 2800 // TIS�������BSSH2����keyboard-interactive�����������B(2005.3.12 yutaka)
867 yutakakn 2762 types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
868 maya 3108 | (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);
869 yutakakn 2728 }
870     pvar->auth_state.supported_types = types;
871    
872     if (types == 0) {
873 maya 2994 UTIL_get_lang_msg("MSG_NOAUTHMETHOD_ERROR", pvar,
874 maya 3003 "Server does not support any of the authentication options\n"
875     "provided by TTSSH. This connection will now close.");
876 maya 2937 notify_fatal_error(pvar, pvar->ts->UIMsg);
877 yutakakn 2728 return 0;
878     } else {
879     if (pvar->auth_state.auth_dialog != NULL) {
880     update_server_supported_types(pvar,
881 maya 3003 pvar->auth_state.auth_dialog);
882 yutakakn 2728 }
883    
884     return 1;
885     }
886     }
887    
888     static void start_user_auth(PTInstVar pvar)
889     {
890 yutakakn 2739 // �F���_�C�A���O���\�������� (2004.12.1 yutaka)
891 yutakakn 2728 PostMessage(pvar->NotificationWindow, WM_COMMAND, (WPARAM) ID_SSHAUTH,
892     (LPARAM) NULL);
893     pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
894     }
895    
896     static void try_default_auth(PTInstVar pvar)
897     {
898     if (pvar->session_settings.TryDefaultAuth) {
899     switch (pvar->session_settings.DefaultAuthMethod) {
900     case SSH_AUTH_RSA:{
901     BOOL invalid_passphrase;
902     char password[] = "";
903    
904     pvar->auth_state.cur_cred.key_pair
905     =
906     KEYFILES_read_private_key(pvar,
907 maya 3003 pvar->session_settings.
908     DefaultRSAPrivateKeyFile,
909     password,
910     &invalid_passphrase, TRUE);
911 yutakakn 2728 if (pvar->auth_state.cur_cred.key_pair == NULL) {
912     return;
913     } else {
914     pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
915     }
916     break;
917     }
918    
919     case SSH_AUTH_RHOSTS:
920     if (pvar->session_settings.
921     DefaultRhostsHostPrivateKeyFile[0] != 0) {
922     BOOL invalid_passphrase;
923     char password[] = "";
924    
925     pvar->auth_state.cur_cred.key_pair
926     =
927     KEYFILES_read_private_key(pvar,
928 maya 3003 pvar->session_settings.
929     DefaultRhostsHostPrivateKeyFile,
930     password,
931     &invalid_passphrase, TRUE);
932 yutakakn 2728 if (pvar->auth_state.cur_cred.key_pair == NULL) {
933     return;
934     } else {
935     pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS_RSA;
936     }
937     } else {
938     pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS;
939     }
940    
941     pvar->auth_state.cur_cred.rhosts_client_user =
942     _strdup(pvar->session_settings.DefaultRhostsLocalUserName);
943     break;
944    
945 maya 3108 case SSH_AUTH_PAGEANT:
946     pvar->auth_state.cur_cred.method = SSH_AUTH_PAGEANT;
947     break;
948    
949 yutakakn 2728 case SSH_AUTH_PASSWORD:
950     pvar->auth_state.cur_cred.password = _strdup("");
951     pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
952     break;
953    
954     case SSH_AUTH_TIS:
955     default:
956     return;
957     }
958    
959     pvar->auth_state.user =
960     _strdup(pvar->session_settings.DefaultUserName);
961     }
962     }
963    
964     void AUTH_notify_end_error(PTInstVar pvar)
965     {
966     if ((pvar->auth_state.flags & AUTH_START_USER_AUTH_ON_ERROR_END) != 0) {
967     start_user_auth(pvar);
968     pvar->auth_state.flags &= ~AUTH_START_USER_AUTH_ON_ERROR_END;
969     }
970     }
971    
972     void AUTH_advance_to_next_cred(PTInstVar pvar)
973     {
974     pvar->auth_state.failed_method = pvar->auth_state.cur_cred.method;
975    
976     if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
977     try_default_auth(pvar);
978    
979     if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
980     if (pvar->err_msg != NULL) {
981     pvar->auth_state.flags |=
982     AUTH_START_USER_AUTH_ON_ERROR_END;
983     } else {
984 yutakakn 2739 // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
985     // �R�}���h���C���w������������
986 yutakakn 2728 start_user_auth(pvar);
987     }
988     }
989     } else {
990 yutakakn 2739 // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
991     // �R�}���h���C���w������(/auth=xxxx)������
992 yutakakn 2728 start_user_auth(pvar);
993     }
994     }
995    
996     static void init_TIS_dlg(PTInstVar pvar, HWND dlg)
997     {
998 maya 2994 char uimsg[MAX_UIMSG];
999    
1000     GetWindowText(dlg, uimsg, sizeof(uimsg));
1001     UTIL_get_lang_msg("DLG_TIS_TITLE", pvar, uimsg);
1002 maya 2937 SetWindowText(dlg, pvar->ts->UIMsg);
1003 maya 2994 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
1004     UTIL_get_lang_msg("DLG_TIS_BANNER", pvar, uimsg);
1005 maya 2937 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
1006 maya 2994 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1007     UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1008 maya 2961 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1009 maya 2994 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1010     UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
1011 maya 2961 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1012 maya 2937
1013 yutakakn 2728 init_auth_machine_banner(pvar, dlg);
1014     init_password_control(dlg);
1015    
1016     if (pvar->auth_state.TIS_prompt != NULL) {
1017     if (strlen(pvar->auth_state.TIS_prompt) > 10000) {
1018     pvar->auth_state.TIS_prompt[10000] = 0;
1019     }
1020     SetDlgItemText(dlg, IDC_SSHAUTHBANNER2,
1021     pvar->auth_state.TIS_prompt);
1022     destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1023     }
1024     }
1025    
1026     static BOOL end_TIS_dlg(PTInstVar pvar, HWND dlg)
1027     {
1028     char FAR *password =
1029     alloc_control_text(GetDlgItem(dlg, IDC_SSHPASSWORD));
1030    
1031     pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
1032     pvar->auth_state.cur_cred.password = password;
1033     pvar->auth_state.auth_dialog = NULL;
1034    
1035 yutakakn 2800 // add
1036     if (SSHv2(pvar)) {
1037     pvar->keyboard_interactive_password_input = 1;
1038     handle_SSH2_userauth_inforeq(pvar);
1039     }
1040    
1041 yutakakn 2728 SSH_notify_cred(pvar);
1042    
1043     EndDialog(dlg, 1);
1044     return TRUE;
1045     }
1046    
1047     static BOOL CALLBACK TIS_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
1048 maya 3003 LPARAM lParam)
1049 yutakakn 2728 {
1050     PTInstVar pvar;
1051 maya 2943 LOGFONT logfont;
1052     HFONT font;
1053 yutakakn 2728
1054     switch (msg) {
1055     case WM_INITDIALOG:
1056     pvar = (PTInstVar) lParam;
1057     pvar->auth_state.auth_dialog = dlg;
1058     SetWindowLong(dlg, DWL_USER, lParam);
1059    
1060     init_TIS_dlg(pvar, dlg);
1061 maya 2943
1062     font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1063     GetObject(font, sizeof(LOGFONT), &logfont);
1064 maya 2946 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgTisFont, pvar)) {
1065 maya 2943 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1066     SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1067 maya 2946 SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1068 maya 2943 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1069     SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1070     }
1071     else {
1072     DlgTisFont = NULL;
1073     }
1074    
1075 maya 3028 // /auth=challenge ������ (2007.10.5 maya)
1076 maya 3025 if (pvar->ssh2_autologin == 1) {
1077     SetDlgItemText(dlg, IDC_SSHPASSWORD, pvar->ssh2_password);
1078     SendMessage(dlg, WM_COMMAND, IDOK, 0);
1079     }
1080    
1081 yutakakn 2728 return FALSE; /* because we set the focus */
1082    
1083     case WM_COMMAND:
1084     pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1085    
1086     switch (LOWORD(wParam)) {
1087     case IDOK:
1088 maya 2943 if (DlgTisFont != NULL) {
1089     DeleteObject(DlgTisFont);
1090     }
1091    
1092 yutakakn 2728 return end_TIS_dlg(pvar, dlg);
1093    
1094     case IDCANCEL: /* kill the connection */
1095     pvar->auth_state.auth_dialog = NULL;
1096     notify_closed_connection(pvar);
1097     EndDialog(dlg, 0);
1098 maya 2943
1099     if (DlgTisFont != NULL) {
1100     DeleteObject(DlgTisFont);
1101     }
1102    
1103 yutakakn 2728 return TRUE;
1104    
1105     default:
1106     return FALSE;
1107     }
1108    
1109     default:
1110     return FALSE;
1111     }
1112     }
1113    
1114     void AUTH_do_cred_dialog(PTInstVar pvar)
1115     {
1116     if (pvar->auth_state.auth_dialog == NULL) {
1117     HWND cur_active = GetActiveWindow();
1118     DLGPROC dlg_proc;
1119     LPCTSTR dialog_template;
1120    
1121     switch (pvar->auth_state.mode) {
1122     case TIS_AUTH_MODE:
1123     dialog_template = MAKEINTRESOURCE(IDD_SSHTISAUTH);
1124     dlg_proc = TIS_dlg_proc;
1125     break;
1126     case GENERIC_AUTH_MODE:
1127     default:
1128     dialog_template = MAKEINTRESOURCE(IDD_SSHAUTH);
1129     dlg_proc = auth_dlg_proc;
1130     }
1131    
1132     if (!DialogBoxParam(hInst, dialog_template,
1133 maya 3003 cur_active !=
1134     NULL ? cur_active : pvar->NotificationWindow,
1135     dlg_proc, (LPARAM) pvar) == -1) {
1136 maya 2994 UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTH_ERROR", pvar,
1137 maya 3003 "Unable to display authentication dialog box.\n"
1138     "Connection terminated.");
1139 maya 2937 notify_fatal_error(pvar, pvar->ts->UIMsg);
1140 yutakakn 2728 }
1141     }
1142     }
1143    
1144     static void init_default_auth_dlg(PTInstVar pvar, HWND dlg)
1145     {
1146 maya 2994 char uimsg[MAX_UIMSG];
1147    
1148     GetWindowText(dlg, uimsg, sizeof(uimsg));
1149     UTIL_get_lang_msg("DLG_AUTHSETUP_TITLE", pvar, uimsg);
1150 maya 2937 SetWindowText(dlg, pvar->ts->UIMsg);
1151 maya 2994 GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
1152     UTIL_get_lang_msg("DLG_AUTHSETUP_BANNER", pvar, uimsg);
1153 maya 2937 SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
1154 maya 2994 GetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, uimsg, sizeof(uimsg));
1155     UTIL_get_lang_msg("DLG_AUTHSETUP_USERNAME", pvar, uimsg);
1156 maya 2937 SetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, pvar->ts->UIMsg);
1157 maya 2994 GetDlgItemText(dlg, IDC_SSHUSEPASSWORD, uimsg, sizeof(uimsg));
1158     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PASSWORD", pvar, uimsg);
1159 maya 2937 SetDlgItemText(dlg, IDC_SSHUSEPASSWORD, pvar->ts->UIMsg);
1160 maya 2994 GetDlgItemText(dlg, IDC_SSHUSERSA, uimsg, sizeof(uimsg));
1161     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RSA", pvar, uimsg);
1162 maya 2937 SetDlgItemText(dlg, IDC_SSHUSERSA, pvar->ts->UIMsg);
1163 maya 2994 GetDlgItemText(dlg, IDC_SSHUSERHOSTS, uimsg, sizeof(uimsg));
1164     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RHOST", pvar, uimsg);
1165 maya 2937 SetDlgItemText(dlg, IDC_SSHUSERHOSTS, pvar->ts->UIMsg);
1166 maya 2994 GetDlgItemText(dlg, IDC_SSHUSETIS, uimsg, sizeof(uimsg));
1167     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_CHALLENGE", pvar, uimsg);
1168 maya 2937 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
1169 maya 3128 GetDlgItemText(dlg, IDC_SSHUSEPAGEANT, uimsg, sizeof(uimsg));
1170     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PAGEANT", pvar, uimsg);
1171     SetDlgItemText(dlg, IDC_SSHUSEPAGEANT, pvar->ts->UIMsg);
1172 maya 2994 GetDlgItemText(dlg, IDC_CHOOSERSAFILE, uimsg, sizeof(uimsg));
1173     UTIL_get_lang_msg("DLG_AUTH_PRIVATEKEY", pvar, uimsg);
1174 maya 2937 SetDlgItemText(dlg, IDC_CHOOSERSAFILE, pvar->ts->UIMsg);
1175 maya 2994 GetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, uimsg, sizeof(uimsg));
1176     UTIL_get_lang_msg("DLG_AUTH_LOCALUSER", pvar, uimsg);
1177 maya 2937 SetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, pvar->ts->UIMsg);
1178 maya 2994 GetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, uimsg, sizeof(uimsg));
1179     UTIL_get_lang_msg("DLG_AUTH_HOST_PRIVATEKEY", pvar, uimsg);
1180 maya 2937 SetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, pvar->ts->UIMsg);
1181 maya 3063 GetDlgItemText(dlg, IDC_CHECKAUTH, uimsg, sizeof(uimsg));
1182     UTIL_get_lang_msg("DLG_AUTHSETUP_CHECKAUTH", pvar, uimsg);
1183     SetDlgItemText(dlg, IDC_CHECKAUTH, pvar->ts->UIMsg);
1184 maya 2994 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1185     UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1186 maya 2937 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1187 maya 2994 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1188     UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
1189 maya 2937 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1190    
1191 yutakakn 2728 switch (pvar->settings.DefaultAuthMethod) {
1192     case SSH_AUTH_RSA:
1193     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1194 maya 3003 IDC_SSHUSERSA);
1195 yutakakn 2728 break;
1196     case SSH_AUTH_RHOSTS:
1197     case SSH_AUTH_RHOSTS_RSA:
1198     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1199 maya 3003 IDC_SSHUSERHOSTS);
1200 yutakakn 2728 break;
1201     case SSH_AUTH_TIS:
1202     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1203 maya 3003 IDC_SSHUSETIS);
1204 yutakakn 2728 break;
1205 maya 3108 case SSH_AUTH_PAGEANT:
1206     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1207     IDC_SSHUSEPAGEANT);
1208     break;
1209 yutakakn 2728 case SSH_AUTH_PASSWORD:
1210     default:
1211     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1212 maya 3003 IDC_SSHUSEPASSWORD);
1213 yutakakn 2728 }
1214    
1215     SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName);
1216     SetDlgItemText(dlg, IDC_RSAFILENAME,
1217 maya 3003 pvar->settings.DefaultRSAPrivateKeyFile);
1218 yutakakn 2728 SetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1219 maya 3003 pvar->settings.DefaultRhostsHostPrivateKeyFile);
1220 yutakakn 2728 SetDlgItemText(dlg, IDC_LOCALUSERNAME,
1221 maya 3003 pvar->settings.DefaultRhostsLocalUserName);
1222 maya 3063
1223     if (pvar->settings.CheckAuthListFirst) {
1224     CheckDlgButton(dlg, IDC_CHECKAUTH, TRUE);
1225     }
1226 yutakakn 2728 }
1227    
1228     static BOOL end_default_auth_dlg(PTInstVar pvar, HWND dlg)
1229     {
1230     if (IsDlgButtonChecked(dlg, IDC_SSHUSERSA)) {
1231     pvar->settings.DefaultAuthMethod = SSH_AUTH_RSA;
1232     } else if (IsDlgButtonChecked(dlg, IDC_SSHUSERHOSTS)) {
1233     if (GetWindowTextLength(GetDlgItem(dlg, IDC_HOSTRSAFILENAME)) > 0) {
1234     pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS_RSA;
1235     } else {
1236     pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS;
1237     }
1238     } else if (IsDlgButtonChecked(dlg, IDC_SSHUSETIS)) {
1239     pvar->settings.DefaultAuthMethod = SSH_AUTH_TIS;
1240 maya 3108 } else if (IsDlgButtonChecked(dlg, IDC_SSHUSEPAGEANT)) {
1241     pvar->settings.DefaultAuthMethod = SSH_AUTH_PAGEANT;
1242 yutakakn 2728 } else {
1243     pvar->settings.DefaultAuthMethod = SSH_AUTH_PASSWORD;
1244     }
1245    
1246     GetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName,
1247 maya 3003 sizeof(pvar->settings.DefaultUserName));
1248 yutakakn 2728 GetDlgItemText(dlg, IDC_RSAFILENAME,
1249 maya 3003 pvar->settings.DefaultRSAPrivateKeyFile,
1250     sizeof(pvar->settings.DefaultRSAPrivateKeyFile));
1251 yutakakn 2728 GetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1252 maya 3003 pvar->settings.DefaultRhostsHostPrivateKeyFile,
1253     sizeof(pvar->settings.DefaultRhostsHostPrivateKeyFile));
1254 yutakakn 2728 GetDlgItemText(dlg, IDC_LOCALUSERNAME,
1255 maya 3003 pvar->settings.DefaultRhostsLocalUserName,
1256     sizeof(pvar->settings.DefaultRhostsLocalUserName));
1257 yutakakn 2728
1258 maya 3063 if (IsDlgButtonChecked(dlg, IDC_CHECKAUTH)) {
1259     pvar->settings.CheckAuthListFirst = TRUE;
1260     }
1261     else {
1262     pvar->settings.CheckAuthListFirst = FALSE;
1263     }
1264    
1265 yutakakn 2728 EndDialog(dlg, 1);
1266     return TRUE;
1267     }
1268    
1269     static BOOL CALLBACK default_auth_dlg_proc(HWND dlg, UINT msg,
1270     WPARAM wParam, LPARAM lParam)
1271     {
1272     PTInstVar pvar;
1273 maya 2943 LOGFONT logfont;
1274     HFONT font;
1275 yutakakn 2728
1276     switch (msg) {
1277     case WM_INITDIALOG:
1278     pvar = (PTInstVar) lParam;
1279     SetWindowLong(dlg, DWL_USER, lParam);
1280    
1281     init_default_auth_dlg(pvar, dlg);
1282 maya 2943
1283     font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1284     GetObject(font, sizeof(LOGFONT), &logfont);
1285 maya 2946 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthSetupFont, pvar)) {
1286 maya 2943 SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1287     SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1288 maya 2946 SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1289 maya 2943 SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1290     SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1291     SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1292 maya 2946 SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1293 maya 2943 SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1294     SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1295 maya 2946 SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1296 maya 2943 SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1297 maya 2946 SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1298 maya 2943 SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1299 maya 3138 SendDlgItemMessage(dlg, IDC_SSHUSEPAGEANT, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1300 maya 3063 SendDlgItemMessage(dlg, IDC_CHECKAUTH, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1301 maya 2943 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1302     SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1303     }
1304     else {
1305     DlgAuthSetupFont = NULL;
1306     }
1307    
1308 yutakakn 2728 return TRUE; /* because we do not set the focus */
1309    
1310     case WM_COMMAND:
1311     pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1312    
1313     switch (LOWORD(wParam)) {
1314     case IDOK:
1315 maya 2943
1316     if (DlgAuthSetupFont != NULL) {
1317     DeleteObject(DlgAuthSetupFont);
1318     }
1319    
1320 yutakakn 2728 return end_default_auth_dlg(pvar, dlg);
1321    
1322     case IDCANCEL:
1323     EndDialog(dlg, 0);
1324 maya 2943
1325     if (DlgAuthSetupFont != NULL) {
1326     DeleteObject(DlgAuthSetupFont);
1327     }
1328    
1329 yutakakn 2728 return TRUE;
1330    
1331     case IDC_CHOOSERSAFILE:
1332 maya 2937 choose_RSA_key_file(dlg, pvar);
1333 yutakakn 2728 return TRUE;
1334    
1335     case IDC_CHOOSEHOSTRSAFILE:
1336 maya 2937 choose_host_RSA_key_file(dlg, pvar);
1337 yutakakn 2728 return TRUE;
1338    
1339     default:
1340     return FALSE;
1341     }
1342    
1343     default:
1344     return FALSE;
1345     }
1346     }
1347    
1348     void AUTH_init(PTInstVar pvar)
1349     {
1350     pvar->auth_state.failed_method = SSH_AUTH_NONE;
1351     pvar->auth_state.auth_dialog = NULL;
1352     pvar->auth_state.user = NULL;
1353     pvar->auth_state.flags = 0;
1354     pvar->auth_state.TIS_prompt = NULL;
1355     pvar->auth_state.supported_types = 0;
1356     pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
1357     pvar->auth_state.cur_cred.password = NULL;
1358     pvar->auth_state.cur_cred.rhosts_client_user = NULL;
1359     pvar->auth_state.cur_cred.key_pair = NULL;
1360     AUTH_set_generic_mode(pvar);
1361     }
1362    
1363     void AUTH_set_generic_mode(PTInstVar pvar)
1364     {
1365     pvar->auth_state.mode = GENERIC_AUTH_MODE;
1366     destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1367     }
1368    
1369     void AUTH_set_TIS_mode(PTInstVar pvar, char FAR * prompt, int len)
1370     {
1371     if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1372     pvar->auth_state.mode = TIS_AUTH_MODE;
1373    
1374     destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1375     pvar->auth_state.TIS_prompt = malloc(len + 1);
1376     memcpy(pvar->auth_state.TIS_prompt, prompt, len);
1377     pvar->auth_state.TIS_prompt[len] = 0;
1378     } else {
1379     AUTH_set_generic_mode(pvar);
1380     }
1381     }
1382    
1383     void AUTH_do_default_cred_dialog(PTInstVar pvar)
1384     {
1385     HWND cur_active = GetActiveWindow();
1386    
1387     if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHAUTHSETUP),
1388 maya 3003 cur_active != NULL ? cur_active
1389     : pvar->NotificationWindow,
1390     default_auth_dlg_proc, (LPARAM) pvar) == -1) {
1391 maya 2994 UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTHSETUP_ERROR", pvar,
1392 maya 3003 "Unable to display authentication setup dialog box.");
1393 maya 2937 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1394 yutakakn 2728 }
1395     }
1396    
1397     void AUTH_destroy_cur_cred(PTInstVar pvar)
1398     {
1399     destroy_malloced_string(&pvar->auth_state.cur_cred.password);
1400     destroy_malloced_string(&pvar->auth_state.cur_cred.rhosts_client_user);
1401     if (pvar->auth_state.cur_cred.key_pair != NULL) {
1402     CRYPT_free_key_pair(pvar->auth_state.cur_cred.key_pair);
1403     pvar->auth_state.cur_cred.key_pair = NULL;
1404     }
1405     }
1406    
1407     static char FAR *get_auth_method_name(SSHAuthMethod auth)
1408     {
1409     switch (auth) {
1410     case SSH_AUTH_PASSWORD:
1411     return "password";
1412     case SSH_AUTH_RSA:
1413     return "RSA";
1414 maya 3108 case SSH_AUTH_PAGEANT:
1415     return "RSA (with Pageant)";
1416 yutakakn 2728 case SSH_AUTH_RHOSTS:
1417     return "rhosts";
1418     case SSH_AUTH_RHOSTS_RSA:
1419     return "rhosts with RSA";
1420     case SSH_AUTH_TIS:
1421     return "challenge/response (TIS)";
1422     default:
1423     return "unknown method";
1424     }
1425     }
1426    
1427     void AUTH_get_auth_info(PTInstVar pvar, char FAR * dest, int len)
1428     {
1429 yutakakn 2782 char *method = "unknown";
1430    
1431 yutakakn 2728 if (pvar->auth_state.user == NULL) {
1432 maya 2992 strncpy_s(dest, len, "None", _TRUNCATE);
1433 yutakakn 2728 } else if (pvar->auth_state.cur_cred.method != SSH_AUTH_NONE) {
1434 yutakakn 2762 if (SSHv1(pvar)) {
1435 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1436 maya 2992 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1437 maya 3003 get_auth_method_name(pvar->auth_state.cur_cred.method));
1438 yutakakn 2762
1439 yutakakn 2800 } else {
1440     // SSH2:�F�����\�b�h������ (2004.12.23 yutaka)
1441     // keyboard-interactive���\�b�h������ (2005.3.12 yutaka)
1442     if (pvar->auth_state.cur_cred.method == SSH_AUTH_PASSWORD ||
1443     pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1444 yutakakn 2782 // keyboard-interactive���\�b�h������ (2005.1.24 yutaka)
1445 maya 3011 if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1446 yutakakn 2782 method = "keyboard-interactive";
1447     } else {
1448     method = get_auth_method_name(pvar->auth_state.cur_cred.method);
1449     }
1450 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1451 maya 2992 _snprintf_s(dest, len, _TRUNCATE,
1452 maya 3003 pvar->ts->UIMsg, pvar->auth_state.user, method);
1453 yutakakn 2782
1454 yutakakn 2762 } else {
1455 maya 3108 if (pvar->auth_state.cur_cred.method == SSH_AUTH_RSA) {
1456     if (pvar->auth_state.cur_cred.key_pair->RSA_key != NULL) {
1457     method = "RSA";
1458     } else if (pvar->auth_state.cur_cred.key_pair->DSA_key != NULL) {
1459     method = "DSA";
1460     }
1461 yutakakn 2762 }
1462 maya 3108 else if (pvar->auth_state.cur_cred.method == SSH_AUTH_PAGEANT) {
1463     int len = get_uint32_MSBfirst(pvar->pageant_curkey + 4);
1464     char *s = (char *)malloc(len+1);
1465     enum hostkey_type keytype;
1466    
1467     memcpy(s, pvar->pageant_curkey+4+4, len);
1468     s[len] = '\0';
1469     keytype = get_keytype_from_name(s);
1470     if (keytype == KEY_RSA) {
1471     method = "RSA with Pageant";
1472     } else if (keytype == KEY_DSA) {
1473     method = "DSA with Pageant";
1474     }
1475     free(s);
1476     }
1477 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1478 maya 2992 _snprintf_s(dest, len, _TRUNCATE,
1479 maya 3003 pvar->ts->UIMsg, pvar->auth_state.user, method);
1480 yutakakn 2762 }
1481    
1482     }
1483    
1484 yutakakn 2728 } else {
1485 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1486 maya 2992 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1487 maya 3003 get_auth_method_name(pvar->auth_state.failed_method));
1488 yutakakn 2728 }
1489    
1490     dest[len - 1] = 0;
1491     }
1492    
1493     void AUTH_notify_disconnecting(PTInstVar pvar)
1494     {
1495     if (pvar->auth_state.auth_dialog != NULL) {
1496     PostMessage(pvar->auth_state.auth_dialog, WM_COMMAND, IDCANCEL, 0);
1497     /* the main window might not go away if it's not enabled. (see vtwin.cpp) */
1498     EnableWindow(pvar->NotificationWindow, TRUE);
1499     }
1500     }
1501    
1502     void AUTH_end(PTInstVar pvar)
1503     {
1504     destroy_malloced_string(&pvar->auth_state.user);
1505     destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1506    
1507     AUTH_destroy_cur_cred(pvar);
1508     }

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