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 3108 - (hide annotations) (download) (as text)
Tue Feb 12 23:11:49 2008 UTC (16 years, 2 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 49536 byte(s)
Pageant 対応処理を追加した。
SSH2 はひととおり対応済み。
SSH1 は実装途中。

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

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