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 3154 - (hide annotations) (download) (as text)
Sat Oct 11 16:27:20 2008 UTC (15 years, 7 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 51021 byte(s)
自動ログインが動かなくなっていたので修正

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

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