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 3113 - (hide annotations) (download) (as text)
Sat Feb 16 11:26:57 2008 UTC (16 years, 1 month ago) by maya
Original Path: ttssh2/trunk/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 49635 byte(s)
Pageant のときにも認証ダイアログのフォーカスがどこかに行ってしまうので、フォーカスをセットする。

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

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