Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3138 - (hide annotations) (download) (as text)
Mon Jul 28 14:55:17 2008 UTC (15 years, 8 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 50207 byte(s)
no message

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

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