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 7592 - (hide annotations) (download) (as text)
Wed Apr 17 15:08:42 2019 UTC (4 years, 11 months ago) by zmatsuo
Original Path: trunk/ttssh2/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 59897 byte(s)
ダイアログを親(vtwin)の中央に表示するよう修正
1 maya 3227 /*
2 doda 6841 * Copyright (c) 1998-2001, Robert O'Callahan
3     * (C) 2004-2017 TeraTerm Project
4     * All rights reserved.
5     *
6     * Redistribution and use in source and binary forms, with or without
7     * modification, are permitted provided that the following conditions
8     * are met:
9     *
10     * 1. Redistributions of source code must retain the above copyright
11     * notice, this list of conditions and the following disclaimer.
12     * 2. Redistributions in binary form must reproduce the above copyright
13     * notice, this list of conditions and the following disclaimer in the
14     * documentation and/or other materials provided with the distribution.
15     * 3. The name of the author may not be used to endorse or promote products
16     * derived from this software without specific prior written permission.
17     *
18     * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21     * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27     * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28     */
29 maya 3227
30     #include "ttxssh.h"
31     #include "util.h"
32     #include "ssh.h"
33 maya 4304 #include "key.h"
34 zmatsuo 7360 #include "ttlib.h"
35 zmatsuo 7560 #include "dlglib.h"
36 maya 3227
37     #include <io.h>
38     #include <fcntl.h>
39     #include <stdlib.h>
40     #include <errno.h>
41    
42     #include "resource.h"
43     #include "keyfiles.h"
44     #include "libputty.h"
45 zmatsuo 7507 #include "tipwin.h"
46 maya 3227
47     #define AUTH_START_USER_AUTH_ON_ERROR_END 1
48    
49     #define MAX_AUTH_CONTROL IDC_SSHUSEPAGEANT
50    
51 zmatsuo 7560 #undef DialogBoxParam
52     #define DialogBoxParam(p1,p2,p3,p4,p5) \
53     TTDialogBoxParam(p1,p2,p3,p4,p5)
54     #undef EndDialog
55     #define EndDialog(p1,p2) \
56     TTEndDialog(p1, p2)
57 maya 3227
58 zmatsuo 7560 //static HFONT DlgAuthFont;
59     //static HFONT DlgTisFont;
60     //static HFONT DlgAuthSetupFont;
61    
62 doda 6801 void destroy_malloced_string(char **str)
63 maya 3227 {
64     if (*str != NULL) {
65 yutakapon 6229 SecureZeroMemory(*str, strlen(*str));
66 maya 3227 free(*str);
67     *str = NULL;
68     }
69     }
70    
71     static int auth_types_to_control_IDs[] = {
72     -1, IDC_SSHUSERHOSTS, IDC_SSHUSERSA, IDC_SSHUSEPASSWORD,
73     IDC_SSHUSERHOSTS, IDC_SSHUSETIS, -1,
74     -1, -1, -1, -1, -1, -1, -1, -1, -1, IDC_SSHUSEPAGEANT, -1
75     };
76 zmatsuo 7507 static TipWin *tipwin;
77 maya 3227
78 maya 4649 LRESULT CALLBACK password_wnd_proc(HWND control, UINT msg,
79     WPARAM wParam, LPARAM lParam)
80 maya 3227 {
81     switch (msg) {
82     case WM_CHAR:
83     if ((GetKeyState(VK_CONTROL) & 0x8000) != 0) {
84 zmatsuo 7507 TCHAR chars[] = { (TCHAR) wParam, 0 };
85 maya 3227
86     SendMessage(control, EM_REPLACESEL, (WPARAM) TRUE,
87 zmatsuo 7507 (LPARAM) (TCHAR *) chars);
88    
89     if (tipwin == NULL) {
90     TCHAR *s;
91 maya 7508 RECT rect;
92 zmatsuo 7507 if (wParam == 'V' - 'A' + 1) {
93     s = _T("������������������������")
94     _T("\n")
95     _T("�N���b�v�{�[�h�������\���t�����V���[�g�J�b�g��CTRL+Insert����");
96     } else {
97     s = _T("������������������������");
98     }
99     GetWindowRect(control, &rect);
100     tipwin = TipWinCreate(control, rect.left, rect.bottom, s);
101     }
102    
103 maya 3227 return 0;
104 zmatsuo 7507 } else {
105     if (tipwin != NULL) {
106     TipWinDestroy(tipwin);
107     tipwin = NULL;
108     }
109 maya 3227 }
110 zmatsuo 7507 break;
111     case WM_NCDESTROY:
112     if (tipwin != NULL) {
113     TipWinDestroy(tipwin);
114     tipwin = NULL;
115     }
116     break;
117 maya 3227 }
118    
119     return CallWindowProc((WNDPROC) GetWindowLong(control, GWL_USERDATA),
120     control, msg, wParam, lParam);
121     }
122    
123     static void init_password_control(HWND dlg)
124     {
125     HWND passwordControl = GetDlgItem(dlg, IDC_SSHPASSWORD);
126    
127     SetWindowLong(passwordControl, GWL_USERDATA,
128     SetWindowLong(passwordControl, GWL_WNDPROC,
129     (LONG) password_wnd_proc));
130    
131     SetFocus(passwordControl);
132     }
133    
134     static void set_auth_options_status(HWND dlg, int controlID)
135     {
136     BOOL RSA_enabled = controlID == IDC_SSHUSERSA;
137     BOOL rhosts_enabled = controlID == IDC_SSHUSERHOSTS;
138     BOOL TIS_enabled = controlID == IDC_SSHUSETIS;
139     BOOL PAGEANT_enabled = controlID == IDC_SSHUSEPAGEANT;
140     int i;
141    
142     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, controlID);
143    
144     EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORDCAPTION), (!TIS_enabled && !PAGEANT_enabled));
145     EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORD), (!TIS_enabled && !PAGEANT_enabled));
146 zmatsuo 7507 EnableWindow(GetDlgItem(dlg, IDC_FROM_CLIPBOARD), (!TIS_enabled && !PAGEANT_enabled));
147 maya 3227
148     for (i = IDC_CHOOSERSAFILE; i <= IDC_RSAFILENAME; i++) {
149     EnableWindow(GetDlgItem(dlg, i), RSA_enabled);
150     }
151    
152     for (i = IDC_LOCALUSERNAMELABEL; i <= IDC_HOSTRSAFILENAME; i++) {
153     EnableWindow(GetDlgItem(dlg, i), rhosts_enabled);
154     }
155     }
156    
157     static void init_auth_machine_banner(PTInstVar pvar, HWND dlg)
158     {
159     char buf[1024], buf2[1024];
160    
161     GetDlgItemText(dlg, IDC_SSHAUTHBANNER, buf2, sizeof(buf2));
162     _snprintf_s(buf, sizeof(buf), _TRUNCATE, buf2, SSH_get_host_name(pvar));
163     SetDlgItemText(dlg, IDC_SSHAUTHBANNER, buf);
164     }
165    
166     static void update_server_supported_types(PTInstVar pvar, HWND dlg)
167     {
168     int supported_methods = pvar->auth_state.supported_types;
169     int cur_control = -1;
170     int control;
171     HWND focus = GetFocus();
172    
173     if (supported_methods == 0) {
174     return;
175     }
176    
177     for (control = IDC_SSHUSEPASSWORD; control <= MAX_AUTH_CONTROL;
178     control++) {
179     BOOL enabled = FALSE;
180     int method;
181     HWND item = GetDlgItem(dlg, control);
182    
183     if (item != NULL) {
184     for (method = 0; method <= SSH_AUTH_MAX; method++) {
185     if (auth_types_to_control_IDs[method] == control
186     && (supported_methods & (1 << method)) != 0) {
187     enabled = TRUE;
188     }
189     }
190    
191     EnableWindow(item, enabled);
192    
193     if (IsDlgButtonChecked(dlg, control)) {
194     cur_control = control;
195     }
196     }
197     }
198    
199     if (cur_control >= 0) {
200     if (!IsWindowEnabled(GetDlgItem(dlg, cur_control))) {
201     do {
202     cur_control++;
203     if (cur_control > MAX_AUTH_CONTROL) {
204     cur_control = IDC_SSHUSEPASSWORD;
205     }
206     } while (!IsWindowEnabled(GetDlgItem(dlg, cur_control)));
207    
208     set_auth_options_status(dlg, cur_control);
209    
210     if (focus != NULL && !IsWindowEnabled(focus)) {
211     SetFocus(GetDlgItem(dlg, cur_control));
212     }
213     }
214     }
215     }
216    
217     static void init_auth_dlg(PTInstVar pvar, HWND dlg)
218     {
219     int default_method = pvar->session_settings.DefaultAuthMethod;
220     char uimsg[MAX_UIMSG];
221    
222     GetWindowText(dlg, uimsg, sizeof(uimsg));
223     UTIL_get_lang_msg("DLG_AUTH_TITLE", pvar, uimsg);
224     SetWindowText(dlg, pvar->ts->UIMsg);
225     GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
226     UTIL_get_lang_msg("DLG_AUTH_BANNER", pvar, uimsg);
227     SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
228     GetDlgItemText(dlg, IDC_SSHAUTHBANNER2, uimsg, sizeof(uimsg));
229     UTIL_get_lang_msg("DLG_AUTH_BANNER2", pvar, uimsg);
230     SetDlgItemText(dlg, IDC_SSHAUTHBANNER2, pvar->ts->UIMsg);
231     GetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, uimsg, sizeof(uimsg));
232     UTIL_get_lang_msg("DLG_AUTH_USERNAME", pvar, uimsg);
233     SetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, pvar->ts->UIMsg);
234     GetDlgItemText(dlg, IDC_SSHPASSWORDCAPTION, uimsg, sizeof(uimsg));
235     UTIL_get_lang_msg("DLG_AUTH_PASSWORD", pvar, uimsg);
236     SetDlgItemText(dlg, IDC_SSHPASSWORDCAPTION, pvar->ts->UIMsg);
237     GetDlgItemText(dlg, IDC_REMEMBER_PASSWORD, uimsg, sizeof(uimsg));
238     UTIL_get_lang_msg("DLG_AUTH_REMEMBER_PASSWORD", pvar, uimsg);
239     SetDlgItemText(dlg, IDC_REMEMBER_PASSWORD, pvar->ts->UIMsg);
240     GetDlgItemText(dlg, IDC_FORWARD_AGENT, uimsg, sizeof(uimsg));
241     UTIL_get_lang_msg("DLG_AUTH_FWDAGENT", pvar, uimsg);
242     SetDlgItemText(dlg, IDC_FORWARD_AGENT, pvar->ts->UIMsg);
243     GetDlgItemText(dlg, IDC_SSHUSEPASSWORD, uimsg, sizeof(uimsg));
244     UTIL_get_lang_msg("DLG_AUTH_METHOD_PASSWORD", pvar, uimsg);
245     SetDlgItemText(dlg, IDC_SSHUSEPASSWORD, pvar->ts->UIMsg);
246     GetDlgItemText(dlg, IDC_SSHUSERSA, uimsg, sizeof(uimsg));
247     UTIL_get_lang_msg("DLG_AUTH_METHOD_RSA", pvar, uimsg);
248     SetDlgItemText(dlg, IDC_SSHUSERSA, pvar->ts->UIMsg);
249     GetDlgItemText(dlg, IDC_SSHUSERHOSTS, uimsg, sizeof(uimsg));
250     UTIL_get_lang_msg("DLG_AUTH_METHOD_RHOST", pvar, uimsg);
251     SetDlgItemText(dlg, IDC_SSHUSERHOSTS, pvar->ts->UIMsg);
252     GetDlgItemText(dlg, IDC_SSHUSEPAGEANT, uimsg, sizeof(uimsg));
253     UTIL_get_lang_msg("DLG_AUTH_METHOD_PAGEANT", pvar, uimsg);
254     SetDlgItemText(dlg, IDC_SSHUSEPAGEANT, pvar->ts->UIMsg);
255     GetDlgItemText(dlg, IDC_CHOOSERSAFILE, uimsg, sizeof(uimsg));
256     UTIL_get_lang_msg("DLG_AUTH_PRIVATEKEY", pvar, uimsg);
257     SetDlgItemText(dlg, IDC_CHOOSERSAFILE, pvar->ts->UIMsg);
258     GetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, uimsg, sizeof(uimsg));
259     UTIL_get_lang_msg("DLG_AUTH_LOCALUSER", pvar, uimsg);
260     SetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, pvar->ts->UIMsg);
261     GetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, uimsg, sizeof(uimsg));
262     UTIL_get_lang_msg("DLG_AUTH_HOST_PRIVATEKEY", pvar, uimsg);
263     SetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, pvar->ts->UIMsg);
264     GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
265     UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
266     SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
267     GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
268     UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
269     SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
270    
271     init_auth_machine_banner(pvar, dlg);
272     init_password_control(dlg);
273    
274 maya 3342 // �F�����s�������x������������
275 maya 3227 if (pvar->auth_state.failed_method != SSH_AUTH_NONE) {
276     /* must be retrying a failed attempt */
277     UTIL_get_lang_msg("DLG_AUTH_BANNER2_FAILED", pvar, "Authentication failed. Please retry.");
278     SetDlgItemText(dlg, IDC_SSHAUTHBANNER2, pvar->ts->UIMsg);
279     UTIL_get_lang_msg("DLG_AUTH_TITLE_FAILED", pvar, "Retrying SSH Authentication");
280     SetWindowText(dlg, pvar->ts->UIMsg);
281     default_method = pvar->auth_state.failed_method;
282     }
283    
284 maya 3342 // �p�X���[�h���o���������`�F�b�N�{�b�N�X�����f�t�H���g���L�������� (2006.8.3 yutaka)
285     if (pvar->ts_SSH->remember_password) {
286     SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_SETCHECK, BST_CHECKED, 0);
287     } else {
288     SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_SETCHECK, BST_UNCHECKED, 0);
289     }
290 maya 3227
291 maya 3342 // ForwardAgent �����������f���� (2008.12.4 maya)
292     CheckDlgButton(dlg, IDC_FORWARD_AGENT, pvar->settings.ForwardAgent);
293    
294     // SSH �o�[�W������������ TIS �����x������������
295     if (pvar->settings.ssh_protocol_version == 1) {
296     UTIL_get_lang_msg("DLG_AUTH_METHOD_CHALLENGE1", pvar,
297 doda 7101 "Use challenge/response(&TIS) to log in");
298 maya 3342 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
299     } else {
300     UTIL_get_lang_msg("DLG_AUTH_METHOD_CHALLENGE2", pvar,
301 doda 7101 "Use keyboard-&interactive to log in");
302 maya 3342 SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
303 maya 3227 }
304    
305     if (pvar->auth_state.user != NULL) {
306     SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->auth_state.user);
307     EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
308     EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAMELABEL), FALSE);
309 maya 3342 }
310 maya 4759 else if (strlen(pvar->ssh2_username) > 0) {
311 maya 3342 SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->ssh2_username);
312     if (pvar->ssh2_autologin == 1) {
313     EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
314     EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAMELABEL), FALSE);
315     }
316     }
317     else if (pvar->session_settings.DefaultUserName[0] != 0) {
318 maya 3227 SetDlgItemText(dlg, IDC_SSHUSERNAME,
319     pvar->session_settings.DefaultUserName);
320     }
321    
322 maya 3342 if (strlen(pvar->ssh2_password) > 0) {
323     SetDlgItemText(dlg, IDC_SSHPASSWORD, pvar->ssh2_password);
324     if (pvar->ssh2_autologin == 1) {
325     EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORD), FALSE);
326     EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORDCAPTION), FALSE);
327 zmatsuo 7507 EnableWindow(GetDlgItem(dlg, IDC_FROM_CLIPBOARD), FALSE);
328 maya 3342 }
329     }
330    
331 maya 3227 SetDlgItemText(dlg, IDC_RSAFILENAME,
332     pvar->session_settings.DefaultRSAPrivateKeyFile);
333     SetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
334     pvar->session_settings.DefaultRhostsHostPrivateKeyFile);
335     SetDlgItemText(dlg, IDC_LOCALUSERNAME,
336     pvar->session_settings.DefaultRhostsLocalUserName);
337    
338 maya 3342 if (pvar->ssh2_authmethod == SSH_AUTH_PASSWORD) {
339     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, IDC_SSHUSEPASSWORD);
340 maya 3227
341 maya 3342 } else if (pvar->ssh2_authmethod == SSH_AUTH_RSA) {
342     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, IDC_SSHUSERSA);
343 maya 3227
344 maya 3342 SetDlgItemText(dlg, IDC_RSAFILENAME, pvar->ssh2_keyfile);
345 maya 3227 if (pvar->ssh2_autologin == 1) {
346 maya 3342 EnableWindow(GetDlgItem(dlg, IDC_CHOOSERSAFILE), FALSE);
347     EnableWindow(GetDlgItem(dlg, IDC_RSAFILENAME), FALSE);
348 maya 3227 }
349    
350 maya 3342 // /auth=challenge ������ (2007.10.5 maya)
351     } else if (pvar->ssh2_authmethod == SSH_AUTH_TIS) {
352     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, IDC_SSHUSETIS);
353     EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORD), FALSE);
354 zmatsuo 7507 EnableWindow(GetDlgItem(dlg, IDC_FROM_CLIPBOARD), FALSE);
355 maya 3342 SetDlgItemText(dlg, IDC_SSHPASSWORD, "");
356 maya 3227
357 maya 3342 // /auth=pageant ������
358     } else if (pvar->ssh2_authmethod == SSH_AUTH_PAGEANT) {
359     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL, IDC_SSHUSEPAGEANT);
360     EnableWindow(GetDlgItem(dlg, IDC_SSHPASSWORD), FALSE);
361 zmatsuo 7507 EnableWindow(GetDlgItem(dlg, IDC_FROM_CLIPBOARD), FALSE);
362 maya 3342 SetDlgItemText(dlg, IDC_SSHPASSWORD, "");
363 maya 3227
364 maya 3342 } else {
365     // �f�t�H���g���F�����\�b�h���_�C�A���O�����f
366     set_auth_options_status(dlg, auth_types_to_control_IDs[default_method]);
367 maya 3227
368 maya 3342 update_server_supported_types(pvar, dlg);
369 maya 3227
370 maya 3342 // �z�X�g�m�F�_�C�A���O��������������=�E�B���h�E���A�N�e�B�u������������
371     // �� SetFocus �����s�����A�R�}���h���C�����n�������F��������������������
372     // �����������A�������O�C���L������ SetFocus ������ (2009.1.31 maya)
373     if (default_method == SSH_AUTH_TIS) {
374     /* we disabled the password control, so fix the focus */
375     SetFocus(GetDlgItem(dlg, IDC_SSHUSETIS));
376 maya 3227 }
377 maya 3342 else if (default_method == SSH_AUTH_PAGEANT) {
378     SetFocus(GetDlgItem(dlg, IDC_SSHUSEPAGEANT));
379     }
380 maya 3227
381     }
382    
383 maya 3342 if (GetWindowTextLength(GetDlgItem(dlg, IDC_SSHUSERNAME)) == 0) {
384     SetFocus(GetDlgItem(dlg, IDC_SSHUSERNAME));
385 maya 3227 }
386 maya 3342 else if (pvar->ask4passwd == 1) {
387     SetFocus(GetDlgItem(dlg, IDC_SSHPASSWORD));
388     }
389 maya 3227
390 maya 3342 // '/I' �w�������������������������� (2005.9.5 yutaka)
391     if (pvar->ts->Minimize) {
392     //20050822���� start T.Takahashi
393     ShowWindow(dlg,SW_MINIMIZE);
394     //20050822���� end T.Takahashi
395 maya 3227 }
396     }
397    
398 doda 6801 static char *alloc_control_text(HWND ctl)
399 maya 3227 {
400     int len = GetWindowTextLength(ctl);
401 doda 6801 char *result = malloc(len + 1);
402 maya 3227
403     if (result != NULL) {
404     GetWindowText(ctl, result, len + 1);
405     result[len] = 0;
406     }
407    
408     return result;
409     }
410    
411 doda 6801 static int get_key_file_name(HWND parent, char *buf, int bufsize, PTInstVar pvar)
412 maya 3227 {
413     OPENFILENAME params;
414     char fullname_buf[2048] = "identity";
415     char filter[MAX_UIMSG];
416    
417     ZeroMemory(&params, sizeof(params));
418 zmatsuo 7360 params.lStructSize = get_OPENFILENAME_SIZE();
419 maya 3227 params.hwndOwner = parent;
420     // �t�B���^������ (2004.12.19 yutaka)
421     // 3�t�@�C���t�B���^������ (2005.4.26 yutaka)
422     UTIL_get_lang_msg("FILEDLG_OPEN_PRIVATEKEY_FILTER", pvar,
423 doda 7373 "identity files\\0identity;id_rsa;id_dsa;id_ecdsa;id_ed25519;*.ppk;*.pem\\0identity(RSA1)\\0identity\\0id_rsa(SSH2)\\0id_rsa\\0id_dsa(SSH2)\\0id_dsa\\0id_ecdsa(SSH2)\\0id_ecdsa\\0id_ed25519(SSH2)\\0id_ed25519\\0PuTTY(*.ppk)\\0*.ppk\\0PEM files(*.pem)\\0*.pem\\0all(*.*)\\0*.*\\0\\0");
424 maya 3227 memcpy(filter, pvar->ts->UIMsg, sizeof(filter));
425     params.lpstrFilter = filter;
426     params.lpstrCustomFilter = NULL;
427     params.nFilterIndex = 0;
428     buf[0] = 0;
429     params.lpstrFile = fullname_buf;
430     params.nMaxFile = sizeof(fullname_buf);
431     params.lpstrFileTitle = NULL;
432     params.lpstrInitialDir = NULL;
433     UTIL_get_lang_msg("FILEDLG_OPEN_PRIVATEKEY_TITLE", pvar,
434 maya 5553 "Choose a file with the RSA/DSA/ECDSA/ED25519 private key");
435 maya 3227 params.lpstrTitle = pvar->ts->UIMsg;
436     params.Flags =
437     OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;
438     params.lpstrDefExt = NULL;
439    
440     if (GetOpenFileName(&params) != 0) {
441     copy_teraterm_dir_relative_path(buf, bufsize, fullname_buf);
442     return 1;
443     } else {
444     return 0;
445     }
446     }
447    
448     static void choose_RSA_key_file(HWND dlg, PTInstVar pvar)
449     {
450     char buf[1024];
451    
452     if (get_key_file_name(dlg, buf, sizeof(buf), pvar)) {
453     SetDlgItemText(dlg, IDC_RSAFILENAME, buf);
454     }
455     }
456    
457     static void choose_host_RSA_key_file(HWND dlg, PTInstVar pvar)
458     {
459     char buf[1024];
460    
461     if (get_key_file_name(dlg, buf, sizeof(buf), pvar)) {
462     SetDlgItemText(dlg, IDC_HOSTRSAFILENAME, buf);
463     }
464     }
465    
466     static BOOL end_auth_dlg(PTInstVar pvar, HWND dlg)
467     {
468     int method = SSH_AUTH_PASSWORD;
469 doda 6801 char *password =
470 maya 3227 alloc_control_text(GetDlgItem(dlg, IDC_SSHPASSWORD));
471 maya 4307 Key *key_pair = NULL;
472 maya 3227
473     if (IsDlgButtonChecked(dlg, IDC_SSHUSERSA)) {
474     method = SSH_AUTH_RSA;
475     } else if (IsDlgButtonChecked(dlg, IDC_SSHUSERHOSTS)) {
476     if (GetWindowTextLength(GetDlgItem(dlg, IDC_HOSTRSAFILENAME)) > 0) {
477     method = SSH_AUTH_RHOSTS_RSA;
478     } else {
479     method = SSH_AUTH_RHOSTS;
480     }
481     } else if (IsDlgButtonChecked(dlg, IDC_SSHUSETIS)) {
482     method = SSH_AUTH_TIS;
483     } else if (IsDlgButtonChecked(dlg, IDC_SSHUSEPAGEANT)) {
484     method = SSH_AUTH_PAGEANT;
485     }
486    
487     if (method == SSH_AUTH_RSA || method == SSH_AUTH_RHOSTS_RSA) {
488 maya 5767 char keyfile[2048];
489 maya 3227 int file_ctl_ID =
490     method == SSH_AUTH_RSA ? IDC_RSAFILENAME : IDC_HOSTRSAFILENAME;
491    
492 maya 5767 keyfile[0] = 0;
493     GetDlgItemText(dlg, file_ctl_ID, keyfile, sizeof(keyfile));
494     if (keyfile[0] == 0) {
495 maya 3227 UTIL_get_lang_msg("MSG_KEYSPECIFY_ERROR", pvar,
496 maya 5553 "You must specify a file containing the RSA/DSA/ECDSA/ED25519 private key.");
497 maya 3227 notify_nonfatal_error(pvar, pvar->ts->UIMsg);
498     SetFocus(GetDlgItem(dlg, file_ctl_ID));
499     destroy_malloced_string(&password);
500     return FALSE;
501     }
502    
503     if (SSHv1(pvar)) {
504     BOOL invalid_passphrase = FALSE;
505    
506 maya 5767 key_pair = KEYFILES_read_private_key(pvar, keyfile, password,
507 maya 3227 &invalid_passphrase,
508     FALSE);
509    
510     if (key_pair == NULL) {
511     if (invalid_passphrase) {
512     HWND passwordCtl = GetDlgItem(dlg, IDC_SSHPASSWORD);
513    
514     SetFocus(passwordCtl);
515     SendMessage(passwordCtl, EM_SETSEL, 0, -1);
516     } else {
517     SetFocus(GetDlgItem(dlg, file_ctl_ID));
518     }
519     destroy_malloced_string(&password);
520     return FALSE;
521     }
522    
523     } else { // SSH2(yutaka)
524     BOOL invalid_passphrase = FALSE;
525     char errmsg[256];
526 maya 5056 FILE *fp = NULL;
527     ssh2_keyfile_type keyfile_type;
528 maya 3227
529     memset(errmsg, 0, sizeof(errmsg));
530    
531 maya 5767 keyfile_type = get_ssh2_keytype(keyfile, &fp, errmsg, sizeof(errmsg));
532 maya 5056 switch (keyfile_type) {
533     case SSH2_KEYFILE_TYPE_OPENSSH:
534     {
535     key_pair = read_SSH2_private_key(pvar, fp, password,
536     &invalid_passphrase,
537     FALSE,
538     errmsg,
539     sizeof(errmsg)
540     );
541     break;
542     }
543     case SSH2_KEYFILE_TYPE_PUTTY:
544     {
545     key_pair = read_SSH2_PuTTY_private_key(pvar, fp, password,
546     &invalid_passphrase,
547     FALSE,
548     errmsg,
549     sizeof(errmsg)
550     );
551     break;
552     }
553     case SSH2_KEYFILE_TYPE_SECSH:
554     {
555     key_pair = read_SSH2_SECSH_private_key(pvar, fp, password,
556     &invalid_passphrase,
557     FALSE,
558     errmsg,
559     sizeof(errmsg)
560     );
561     break;
562     }
563     default:
564     {
565     char buf[1024];
566 maya 5552
567     // �t�@�C�����J�����������t�@�C���`�����s��������������������
568     if (fp != NULL) {
569     key_pair = read_SSH2_private_key(pvar, fp, password,
570     &invalid_passphrase,
571     FALSE,
572     errmsg,
573     sizeof(errmsg)
574     );
575     break;
576     }
577    
578 maya 5056 UTIL_get_lang_msg("MSG_READKEY_ERROR", pvar,
579     "read error SSH2 private key file\r\n%s");
580     _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, errmsg);
581     notify_nonfatal_error(pvar, buf);
582 maya 5552 // ���������������������� SSH2 �������t�@�C�����J����������
583 maya 5056 // ���t�@�C�����I���{�^�����t�H�[�J�X������
584     SetFocus(GetDlgItem(dlg, IDC_CHOOSERSAFILE));
585     destroy_malloced_string(&password);
586     return FALSE;
587     }
588     }
589 maya 3227
590     if (key_pair == NULL) { // read error
591     char buf[1024];
592     UTIL_get_lang_msg("MSG_READKEY_ERROR", pvar,
593     "read error SSH2 private key file\r\n%s");
594     _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, errmsg);
595     notify_nonfatal_error(pvar, buf);
596     // �p�X�t���[�Y���������v����������������IDC_SSHPASSWORD���t�H�[�J�X������ (2006.10.29 yasuhide)
597     if (invalid_passphrase) {
598     HWND passwordCtl = GetDlgItem(dlg, IDC_SSHPASSWORD);
599    
600     SetFocus(passwordCtl);
601     SendMessage(passwordCtl, EM_SETSEL, 0, -1);
602     } else {
603     SetFocus(GetDlgItem(dlg, file_ctl_ID));
604     }
605     destroy_malloced_string(&password);
606     return FALSE;
607     }
608    
609     }
610    
611     }
612     else if (method == SSH_AUTH_PAGEANT) {
613     pvar->pageant_key = NULL;
614     pvar->pageant_curkey = NULL;
615     pvar->pageant_keylistlen = 0;
616     pvar->pageant_keycount = 0;
617     pvar->pageant_keycurrent = 0;
618     pvar->pageant_keyfinal=FALSE;
619    
620     // Pageant �����M
621     if (SSHv1(pvar)) {
622     pvar->pageant_keylistlen = putty_get_ssh1_keylist(&pvar->pageant_key);
623     }
624     else {
625     pvar->pageant_keylistlen = putty_get_ssh2_keylist(&pvar->pageant_key);
626     }
627     if (pvar->pageant_keylistlen == 0) {
628     UTIL_get_lang_msg("MSG_PAGEANT_NOTFOUND", pvar,
629     "Can't find Pageant.");
630     notify_nonfatal_error(pvar, pvar->ts->UIMsg);
631    
632     return FALSE;
633     }
634     pvar->pageant_curkey = pvar->pageant_key;
635    
636     // ������
637     pvar->pageant_keycount = get_uint32_MSBfirst(pvar->pageant_curkey);
638     if (pvar->pageant_keycount == 0) {
639     UTIL_get_lang_msg("MSG_PAGEANT_NOKEY", pvar,
640     "Pageant has no valid key.");
641     notify_nonfatal_error(pvar, pvar->ts->UIMsg);
642    
643     return FALSE;
644     }
645     pvar->pageant_curkey += 4;
646     }
647    
648     /* from here on, we cannot fail, so just munge cur_cred in place */
649     pvar->auth_state.cur_cred.method = method;
650     pvar->auth_state.cur_cred.key_pair = key_pair;
651     /* we can't change the user name once it's set. It may already have
652     been sent to the server, and it can only be sent once. */
653     if (pvar->auth_state.user == NULL) {
654     pvar->auth_state.user =
655     alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
656     }
657    
658     // �p�X���[�h���������������������������� (2006.8.3 yutaka)
659     if (SendMessage(GetDlgItem(dlg, IDC_REMEMBER_PASSWORD), BM_GETCHECK, 0,0) == BST_CHECKED) {
660     pvar->settings.remember_password = 1; // �o��������
661     pvar->ts_SSH->remember_password = 1;
662     } else {
663     pvar->settings.remember_password = 0; // ���������������Y����
664     pvar->ts_SSH->remember_password = 0;
665     }
666    
667     // ���J���F���������A�Z�b�V�������������p�X���[�h���g�����������������������������������B
668     // (2005.4.8 yutaka)
669     if (method == SSH_AUTH_PASSWORD || method == SSH_AUTH_RSA) {
670     pvar->auth_state.cur_cred.password = password;
671     } else {
672     destroy_malloced_string(&password);
673     }
674     if (method == SSH_AUTH_RHOSTS || method == SSH_AUTH_RHOSTS_RSA) {
675     if (pvar->session_settings.DefaultAuthMethod != SSH_AUTH_RHOSTS) {
676     UTIL_get_lang_msg("MSG_RHOSTS_NOTDEFAULT_ERROR", pvar,
677     "Rhosts authentication will probably fail because it was not "
678     "the default authentication method.\n"
679     "To use Rhosts authentication "
680     "in TTSSH, you need to set it to be the default by restarting\n"
681 yutakapon 6019 "TTSSH and selecting \"SSH Authentication...\" from the Setup menu "
682 maya 3227 "before connecting.");
683     notify_nonfatal_error(pvar, pvar->ts->UIMsg);
684     }
685    
686     pvar->auth_state.cur_cred.rhosts_client_user =
687     alloc_control_text(GetDlgItem(dlg, IDC_LOCALUSERNAME));
688     }
689     pvar->auth_state.auth_dialog = NULL;
690    
691     GetDlgItemText(dlg, IDC_RSAFILENAME,
692     pvar->session_settings.DefaultRSAPrivateKeyFile,
693     sizeof(pvar->session_settings.
694     DefaultRSAPrivateKeyFile));
695     GetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
696     pvar->session_settings.DefaultRhostsHostPrivateKeyFile,
697     sizeof(pvar->session_settings.
698     DefaultRhostsHostPrivateKeyFile));
699     GetDlgItemText(dlg, IDC_LOCALUSERNAME,
700     pvar->session_settings.DefaultRhostsLocalUserName,
701     sizeof(pvar->session_settings.
702     DefaultRhostsLocalUserName));
703    
704     if (SSHv1(pvar)) {
705     SSH_notify_user_name(pvar);
706     SSH_notify_cred(pvar);
707     } else {
708     // for SSH2(yutaka)
709     do_SSH2_userauth(pvar);
710     }
711    
712     EndDialog(dlg, 1);
713 zmatsuo 7560 #if 0
714 maya 3227 if (DlgAuthFont != NULL) {
715     DeleteObject(DlgAuthFont);
716     }
717 zmatsuo 7560 #endif
718 maya 3227
719     return TRUE;
720     }
721    
722 zmatsuo 7507 /**
723     * �N���b�v�{�[�h����ANSI����������������
724     * �����������K�v��������strlen()��������
725     * @param hWnd
726     * @param emtpy TRUE�������N���b�v�{�[�h����������
727     * @retval �����������|�C���^ �g�p��free()��������
728     * ����������(�������G���[��)��NULL
729     */
730     char *GetClipboardTextA(HWND hWnd, BOOL empty)
731     {
732     HGLOBAL hGlobal;
733     const char *lpStr;
734     size_t length;
735     char *pool;
736    
737     OpenClipboard(hWnd);
738     hGlobal = (HGLOBAL)GetClipboardData(CF_TEXT);
739     if (hGlobal == NULL) {
740     CloseClipboard();
741     return NULL;
742     }
743     lpStr = (const char *)GlobalLock(hGlobal);
744     length = GlobalSize(hGlobal);
745     if (length == 0) {
746     pool = NULL;
747     } else {
748     pool = (char *)malloc(length + 1); // +1 for terminator
749     memcpy(pool, lpStr, length);
750     pool[length] = '\0';
751     }
752     GlobalUnlock(hGlobal);
753     if (empty) {
754     EmptyClipboard();
755     }
756     CloseClipboard();
757    
758     return pool;
759     }
760    
761    
762 maya 3227 BOOL autologin_sent_none;
763     static BOOL CALLBACK auth_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
764     LPARAM lParam)
765     {
766 maya 3342 const int IDC_TIMER1 = 300; // �������O�C�����L��������
767     const int IDC_TIMER2 = 301; // �T�|�[�g�������������\�b�h�������`�F�b�N(CheckAuthListFirst)
768     const int IDC_TIMER3 = 302; // challenge �� ask4passwd ��CheckAuthListFirst �� FALSE ������
769 maya 3227 const int autologin_timeout = 10; // �~���b
770     PTInstVar pvar;
771 zmatsuo 7560 // LOGFONT logfont;
772     // HFONT font;
773 maya 3227
774     switch (msg) {
775     case WM_INITDIALOG:
776     pvar = (PTInstVar) lParam;
777     pvar->auth_state.auth_dialog = dlg;
778     SetWindowLong(dlg, DWL_USER, lParam);
779    
780     init_auth_dlg(pvar, dlg);
781 zmatsuo 7560 #if 0
782 maya 3227 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
783     GetObject(font, sizeof(LOGFONT), &logfont);
784     if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthFont, pvar)) {
785     SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
786     SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
787     SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
788     SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
789     SendDlgItemMessage(dlg, IDC_SSHPASSWORDCAPTION, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
790     SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
791     SendDlgItemMessage(dlg, IDC_REMEMBER_PASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
792     SendDlgItemMessage(dlg, IDC_FORWARD_AGENT, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
793     SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
794     SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
795     SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
796     SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
797     SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
798     SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
799     SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
800     SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
801     SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
802     SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
803     SendDlgItemMessage(dlg, IDC_SSHUSEPAGEANT, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
804     SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
805     SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthFont, MAKELPARAM(TRUE,0));
806     }
807     else {
808     DlgAuthFont = NULL;
809     }
810 zmatsuo 7560 #endif
811 maya 3227 // SSH2 autologin���L�����������A�^�C�}���d�|�����B (2004.12.1 yutaka)
812     if (pvar->ssh2_autologin == 1) {
813     autologin_sent_none = FALSE;
814     SetTimer(dlg, IDC_TIMER1, autologin_timeout, 0);
815     }
816     else {
817     // �T�|�[�g�������������\�b�h���`�F�b�N�����B(2007.9.24 maya)
818     // �������L�����A�����������s�����������A���[�U�����m����������
819     if (pvar->session_settings.CheckAuthListFirst &&
820     !pvar->tryed_ssh2_authlist &&
821     GetWindowTextLength(GetDlgItem(dlg, IDC_SSHUSERNAME)) > 0) {
822     SetTimer(dlg, IDC_TIMER2, autologin_timeout, 0);
823     }
824 maya 3342 // /auth=challenge �� /ask4passwd ���w���������������[�U�����m����������
825     // �������AOK �{�^���������� TIS auth �_�C�A���O���o��
826     else if (pvar->ssh2_authmethod == SSH_AUTH_TIS &&
827     pvar->ask4passwd &&
828     GetWindowTextLength(GetDlgItem(dlg, IDC_SSHUSERNAME)) > 0) {
829 maya 3227 SetTimer(dlg, IDC_TIMER3, autologin_timeout, 0);
830     }
831     }
832 zmatsuo 7592 CenterWindow(dlg, GetParent(dlg));
833 maya 3227 return FALSE; /* because we set the focus */
834    
835     case WM_TIMER:
836     pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
837     // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2004.12.16 yutaka)
838     if (wParam == IDC_TIMER1) {
839     // �������O�C��������
840     if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
841     (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
842     if (SSHv2(pvar) &&
843     pvar->session_settings.CheckAuthListFirst &&
844     !pvar->tryed_ssh2_authlist) {
845     if (!autologin_sent_none) {
846 maya 3342 autologin_sent_none = TRUE;
847    
848 maya 3336 // �_�C�A���O�����[�U������������
849     if (pvar->auth_state.user == NULL) {
850     pvar->auth_state.user =
851     alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
852     }
853    
854 maya 3342 // CheckAuthListFirst �� TRUE �������� AuthList ���A����������������
855     // IDOK �����������i�����������A�F�����\�b�h none ������ (2008.10.12 maya)
856 maya 3227 do_SSH2_userauth(pvar);
857     }
858     //else {
859     // none �������������A����������������
860     //}
861     }
862     else {
863 maya 3342 // SSH1 ������
864     // ������ CheckAuthListFirst �� FALSE ������
865     // ������ CheckAuthListFirst TRUE ���Aauthlist ���A������������
866 maya 3346 KillTimer(dlg, IDC_TIMER1);
867 maya 3342
868     // �_�C�A���O�����[�U������������
869     if (pvar->auth_state.user == NULL) {
870     pvar->auth_state.user =
871     alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
872     }
873    
874 maya 3227 SendMessage(dlg, WM_COMMAND, IDOK, 0);
875     }
876     }
877     }
878     else if (wParam == IDC_TIMER2) {
879     // authlist ����������
880 maya 3346 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
881     (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
882     if (SSHv2(pvar)) {
883 maya 3227 KillTimer(dlg, IDC_TIMER2);
884    
885     // �_�C�A���O�����[�U������������
886     if (pvar->auth_state.user == NULL) {
887     pvar->auth_state.user =
888     alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
889     }
890    
891     // ���[�U�������X��������
892     EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
893    
894 maya 3342 // �F�����\�b�h none ������
895 maya 3227 do_SSH2_userauth(pvar);
896    
897 maya 3342 // TIS �p�� OK �����������F�������s������������������
898 maya 3227 // Unexpected SSH2 message �������B
899     }
900 maya 3346 else if (SSHv1(pvar)) {
901     KillTimer(dlg, IDC_TIMER2);
902    
903     // TIS �p�� OK ������
904     if (pvar->ssh2_authmethod == SSH_AUTH_TIS) {
905     SendMessage(dlg, WM_COMMAND, IDOK, 0);
906     }
907     // SSH1 �����F�����\�b�h none ����������
908 maya 3227 }
909 maya 3346 // �v���g�R���o�[�W�����m���O������������
910 maya 3227 }
911     }
912     else if (wParam == IDC_TIMER3) {
913 maya 3346 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
914     (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
915     if (SSHv2(pvar) || SSHv1(pvar)) {
916     KillTimer(dlg, IDC_TIMER3);
917    
918     // TIS �p�� OK ������
919     SendMessage(dlg, WM_COMMAND, IDOK, 0);
920 maya 3227 }
921 maya 3346 // �v���g�R���o�[�W�����m���O������������
922 maya 3227 }
923     }
924     return FALSE;
925    
926     case WM_COMMAND:
927     pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
928    
929     switch (LOWORD(wParam)) {
930     case IDOK:
931 yutakapon 5562 // �F�������T�[�o�������f�������������A�L�����Z�������������B(2014.3.31 yutaka)
932     if (!pvar->cv->Ready) {
933     goto canceled;
934     }
935    
936 maya 3227 // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2001.1.25 yutaka)
937     if (pvar->userauth_retry_count == 0 &&
938     ((pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) ||
939     !(pvar->ssh_state.status_flags & STATUS_HOST_OK))) {
940     return FALSE;
941     }
942     else if (SSHv2(pvar) &&
943     pvar->session_settings.CheckAuthListFirst &&
944     !pvar->tryed_ssh2_authlist) {
945     // CheckAuthListFirst ���L�����F������������������������
946     // OK �������������������� (2008.10.4 maya)
947     return FALSE;
948     }
949    
950     return end_auth_dlg(pvar, dlg);
951    
952     case IDCANCEL: /* kill the connection */
953 yutakapon 5562 canceled:
954 maya 3227 pvar->auth_state.auth_dialog = NULL;
955 maya 5678 notify_closed_connection(pvar, "authentication cancelled");
956 maya 3227 EndDialog(dlg, 0);
957 zmatsuo 7560 #if 0
958 maya 3227 if (DlgAuthFont != NULL) {
959     DeleteObject(DlgAuthFont);
960     }
961 zmatsuo 7560 #endif
962 maya 3227 return TRUE;
963    
964     case IDC_SSHUSERNAME:
965     // ���[�U�����t�H�[�J�X������������ (2007.9.29 maya)
966     if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
967     (pvar->ssh_state.status_flags & STATUS_HOST_OK) &&
968     HIWORD(wParam) == EN_KILLFOCUS) {
969     // �������L���������������s��������������
970     if (SSHv2(pvar) &&
971     pvar->session_settings.CheckAuthListFirst &&
972     !pvar->tryed_ssh2_authlist) {
973     // �_�C�A���O�����[�U�������f
974     if (pvar->auth_state.user == NULL) {
975     pvar->auth_state.user =
976     alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
977     }
978    
979     // ���[�U���������������������`�F�b�N����
980     if (strlen(pvar->auth_state.user) == 0) {
981     return FALSE;
982     }
983    
984     // ���[�U�������X��������
985     EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
986    
987 maya 3342 // �F�����\�b�h none ������
988 maya 3227 do_SSH2_userauth(pvar);
989     return TRUE;
990     }
991     }
992    
993     return FALSE;
994    
995     case IDC_SSHUSEPASSWORD:
996     case IDC_SSHUSERSA:
997     case IDC_SSHUSERHOSTS:
998     case IDC_SSHUSETIS:
999     case IDC_SSHUSEPAGEANT:
1000     set_auth_options_status(dlg, LOWORD(wParam));
1001     return TRUE;
1002    
1003     case IDC_CHOOSERSAFILE:
1004     choose_RSA_key_file(dlg, pvar);
1005     return TRUE;
1006    
1007     case IDC_CHOOSEHOSTRSAFILE:
1008     choose_host_RSA_key_file(dlg, pvar);
1009     return TRUE;
1010    
1011     case IDC_FORWARD_AGENT:
1012     // �����Z�b�V�������������f������ (2008.12.4 maya)
1013     pvar->session_settings.ForwardAgent = IsDlgButtonChecked(dlg, IDC_FORWARD_AGENT);
1014     return TRUE;
1015    
1016 zmatsuo 7507 case IDC_FROM_CLIPBOARD: {
1017     char *clipboard = GetClipboardTextA(dlg, TRUE);
1018     if (clipboard != NULL) {
1019     SetDlgItemTextA(dlg, IDC_SSHPASSWORD, clipboard);
1020     free(clipboard);
1021     SendMessage(dlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(dlg, IDOK), TRUE);
1022     return FALSE;
1023     }
1024     return TRUE;
1025     }
1026    
1027 maya 3227 default:
1028     return FALSE;
1029     }
1030    
1031     default:
1032     return FALSE;
1033     }
1034     }
1035    
1036 doda 6801 char *AUTH_get_user_name(PTInstVar pvar)
1037 maya 3227 {
1038     return pvar->auth_state.user;
1039     }
1040    
1041     int AUTH_set_supported_auth_types(PTInstVar pvar, int types)
1042     {
1043 doda 6809 logprintf(LOG_LEVEL_VERBOSE, "Server reports supported authentication method mask = %d", types);
1044 maya 3227
1045     if (SSHv1(pvar)) {
1046     types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
1047     | (1 << SSH_AUTH_RHOSTS_RSA) | (1 << SSH_AUTH_RHOSTS)
1048     | (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);
1049     } else {
1050     // for SSH2(yutaka)
1051     // types &= (1 << SSH_AUTH_PASSWORD);
1052     // ���J���F�����L�������� (2004.12.18 yutaka)
1053     // TIS�������BSSH2����keyboard-interactive�����������B(2005.3.12 yutaka)
1054     types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
1055     | (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);
1056     }
1057     pvar->auth_state.supported_types = types;
1058    
1059     if (types == 0) {
1060     UTIL_get_lang_msg("MSG_NOAUTHMETHOD_ERROR", pvar,
1061     "Server does not support any of the authentication options\n"
1062     "provided by TTSSH. This connection will now close.");
1063 maya 5678 notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
1064 maya 3227 return 0;
1065     } else {
1066     if (pvar->auth_state.auth_dialog != NULL) {
1067 doda 6809 update_server_supported_types(pvar, pvar->auth_state.auth_dialog);
1068 maya 3227 }
1069    
1070     return 1;
1071     }
1072     }
1073    
1074     static void start_user_auth(PTInstVar pvar)
1075     {
1076     // �F���_�C�A���O���\�������� (2004.12.1 yutaka)
1077     PostMessage(pvar->NotificationWindow, WM_COMMAND, (WPARAM) ID_SSHAUTH,
1078     (LPARAM) NULL);
1079     pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
1080     }
1081    
1082     static void try_default_auth(PTInstVar pvar)
1083     {
1084     if (pvar->session_settings.TryDefaultAuth) {
1085     switch (pvar->session_settings.DefaultAuthMethod) {
1086     case SSH_AUTH_RSA:{
1087     BOOL invalid_passphrase;
1088     char password[] = "";
1089    
1090     pvar->auth_state.cur_cred.key_pair
1091     =
1092     KEYFILES_read_private_key(pvar,
1093     pvar->session_settings.
1094     DefaultRSAPrivateKeyFile,
1095     password,
1096     &invalid_passphrase, TRUE);
1097     if (pvar->auth_state.cur_cred.key_pair == NULL) {
1098     return;
1099     } else {
1100     pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
1101     }
1102     break;
1103     }
1104    
1105     case SSH_AUTH_RHOSTS:
1106     if (pvar->session_settings.
1107     DefaultRhostsHostPrivateKeyFile[0] != 0) {
1108     BOOL invalid_passphrase;
1109     char password[] = "";
1110    
1111     pvar->auth_state.cur_cred.key_pair
1112     =
1113     KEYFILES_read_private_key(pvar,
1114     pvar->session_settings.
1115     DefaultRhostsHostPrivateKeyFile,
1116     password,
1117     &invalid_passphrase, TRUE);
1118     if (pvar->auth_state.cur_cred.key_pair == NULL) {
1119     return;
1120     } else {
1121     pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS_RSA;
1122     }
1123     } else {
1124     pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS;
1125     }
1126    
1127     pvar->auth_state.cur_cred.rhosts_client_user =
1128     _strdup(pvar->session_settings.DefaultRhostsLocalUserName);
1129     break;
1130    
1131     case SSH_AUTH_PAGEANT:
1132     pvar->auth_state.cur_cred.method = SSH_AUTH_PAGEANT;
1133     break;
1134    
1135     case SSH_AUTH_PASSWORD:
1136     pvar->auth_state.cur_cred.password = _strdup("");
1137     pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
1138     break;
1139    
1140     case SSH_AUTH_TIS:
1141     default:
1142     return;
1143     }
1144    
1145     pvar->auth_state.user =
1146     _strdup(pvar->session_settings.DefaultUserName);
1147     }
1148     }
1149    
1150     void AUTH_notify_end_error(PTInstVar pvar)
1151     {
1152     if ((pvar->auth_state.flags & AUTH_START_USER_AUTH_ON_ERROR_END) != 0) {
1153     start_user_auth(pvar);
1154     pvar->auth_state.flags &= ~AUTH_START_USER_AUTH_ON_ERROR_END;
1155     }
1156     }
1157    
1158     void AUTH_advance_to_next_cred(PTInstVar pvar)
1159     {
1160     pvar->auth_state.failed_method = pvar->auth_state.cur_cred.method;
1161    
1162     if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
1163     try_default_auth(pvar);
1164    
1165     if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
1166     if (pvar->err_msg != NULL) {
1167     pvar->auth_state.flags |=
1168     AUTH_START_USER_AUTH_ON_ERROR_END;
1169     } else {
1170     // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
1171     // �R�}���h���C���w������������
1172     start_user_auth(pvar);
1173     }
1174     }
1175     } else {
1176     // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
1177     // �R�}���h���C���w������(/auth=xxxx)������
1178     start_user_auth(pvar);
1179     }
1180     }
1181    
1182     static void init_TIS_dlg(PTInstVar pvar, HWND dlg)
1183     {
1184     char uimsg[MAX_UIMSG];
1185    
1186     GetWindowText(dlg, uimsg, sizeof(uimsg));
1187     UTIL_get_lang_msg("DLG_TIS_TITLE", pvar, uimsg);
1188     SetWindowText(dlg, pvar->ts->UIMsg);
1189     GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
1190     UTIL_get_lang_msg("DLG_TIS_BANNER", pvar, uimsg);
1191     SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
1192     GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1193     UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1194     SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1195     GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1196     UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
1197     SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1198    
1199     init_auth_machine_banner(pvar, dlg);
1200     init_password_control(dlg);
1201    
1202     if (pvar->auth_state.TIS_prompt != NULL) {
1203     if (strlen(pvar->auth_state.TIS_prompt) > 10000) {
1204     pvar->auth_state.TIS_prompt[10000] = 0;
1205     }
1206     SetDlgItemText(dlg, IDC_SSHAUTHBANNER2,
1207     pvar->auth_state.TIS_prompt);
1208     destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1209     }
1210 doda 7477
1211     if (pvar->auth_state.echo) {
1212     SendMessage(GetDlgItem(dlg, IDC_SSHPASSWORD), EM_SETPASSWORDCHAR, 0, 0);
1213     }
1214 maya 3227 }
1215    
1216     static BOOL end_TIS_dlg(PTInstVar pvar, HWND dlg)
1217     {
1218 doda 6801 char *password =
1219 maya 3227 alloc_control_text(GetDlgItem(dlg, IDC_SSHPASSWORD));
1220    
1221     pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
1222     pvar->auth_state.cur_cred.password = password;
1223     pvar->auth_state.auth_dialog = NULL;
1224    
1225     // add
1226     if (SSHv2(pvar)) {
1227     pvar->keyboard_interactive_password_input = 1;
1228     handle_SSH2_userauth_inforeq(pvar);
1229     }
1230    
1231     SSH_notify_cred(pvar);
1232    
1233     EndDialog(dlg, 1);
1234     return TRUE;
1235     }
1236    
1237     static BOOL CALLBACK TIS_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
1238     LPARAM lParam)
1239     {
1240     PTInstVar pvar;
1241 zmatsuo 7560 // LOGFONT logfont;
1242     // HFONT font;
1243 maya 3227
1244     switch (msg) {
1245     case WM_INITDIALOG:
1246     pvar = (PTInstVar) lParam;
1247     pvar->auth_state.auth_dialog = dlg;
1248     SetWindowLong(dlg, DWL_USER, lParam);
1249    
1250     init_TIS_dlg(pvar, dlg);
1251 zmatsuo 7560 #if 0
1252 maya 3227 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1253     GetObject(font, sizeof(LOGFONT), &logfont);
1254     if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgTisFont, pvar)) {
1255     SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1256     SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1257     SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1258     SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1259     SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1260     }
1261     else {
1262     DlgTisFont = NULL;
1263     }
1264 zmatsuo 7560 #endif
1265 maya 3227 // /auth=challenge ������ (2007.10.5 maya)
1266     if (pvar->ssh2_autologin == 1) {
1267     SetDlgItemText(dlg, IDC_SSHPASSWORD, pvar->ssh2_password);
1268     SendMessage(dlg, WM_COMMAND, IDOK, 0);
1269     }
1270    
1271 zmatsuo 7592 CenterWindow(dlg, GetParent(dlg));
1272 maya 3227 return FALSE; /* because we set the focus */
1273    
1274     case WM_COMMAND:
1275     pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1276    
1277     switch (LOWORD(wParam)) {
1278     case IDOK:
1279 zmatsuo 7560 #if 0
1280 maya 3227 if (DlgTisFont != NULL) {
1281     DeleteObject(DlgTisFont);
1282     }
1283 zmatsuo 7560 #endif
1284 maya 3227 return end_TIS_dlg(pvar, dlg);
1285    
1286     case IDCANCEL: /* kill the connection */
1287     pvar->auth_state.auth_dialog = NULL;
1288 maya 5678 notify_closed_connection(pvar, "authentication cancelled");
1289 maya 3227 EndDialog(dlg, 0);
1290 zmatsuo 7560 #if 0
1291 maya 3227 if (DlgTisFont != NULL) {
1292     DeleteObject(DlgTisFont);
1293     }
1294 zmatsuo 7560 #endif
1295 maya 3227 return TRUE;
1296    
1297     default:
1298     return FALSE;
1299     }
1300    
1301     default:
1302     return FALSE;
1303     }
1304     }
1305    
1306     void AUTH_do_cred_dialog(PTInstVar pvar)
1307     {
1308     if (pvar->auth_state.auth_dialog == NULL) {
1309     HWND cur_active = GetActiveWindow();
1310     DLGPROC dlg_proc;
1311     LPCTSTR dialog_template;
1312    
1313     switch (pvar->auth_state.mode) {
1314     case TIS_AUTH_MODE:
1315     dialog_template = MAKEINTRESOURCE(IDD_SSHTISAUTH);
1316     dlg_proc = TIS_dlg_proc;
1317     break;
1318     case GENERIC_AUTH_MODE:
1319     default:
1320     dialog_template = MAKEINTRESOURCE(IDD_SSHAUTH);
1321     dlg_proc = auth_dlg_proc;
1322     }
1323    
1324     if (!DialogBoxParam(hInst, dialog_template,
1325     cur_active !=
1326     NULL ? cur_active : pvar->NotificationWindow,
1327     dlg_proc, (LPARAM) pvar) == -1) {
1328     UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTH_ERROR", pvar,
1329     "Unable to display authentication dialog box.\n"
1330     "Connection terminated.");
1331 maya 5678 notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
1332 maya 3227 }
1333     }
1334     }
1335    
1336     static void init_default_auth_dlg(PTInstVar pvar, HWND dlg)
1337     {
1338     char uimsg[MAX_UIMSG];
1339    
1340     GetWindowText(dlg, uimsg, sizeof(uimsg));
1341     UTIL_get_lang_msg("DLG_AUTHSETUP_TITLE", pvar, uimsg);
1342     SetWindowText(dlg, pvar->ts->UIMsg);
1343     GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
1344     UTIL_get_lang_msg("DLG_AUTHSETUP_BANNER", pvar, uimsg);
1345     SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
1346     GetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, uimsg, sizeof(uimsg));
1347     UTIL_get_lang_msg("DLG_AUTHSETUP_USERNAME", pvar, uimsg);
1348     SetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, pvar->ts->UIMsg);
1349     GetDlgItemText(dlg, IDC_SSHUSEPASSWORD, uimsg, sizeof(uimsg));
1350     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PASSWORD", pvar, uimsg);
1351     SetDlgItemText(dlg, IDC_SSHUSEPASSWORD, pvar->ts->UIMsg);
1352     GetDlgItemText(dlg, IDC_SSHUSERSA, uimsg, sizeof(uimsg));
1353     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RSA", pvar, uimsg);
1354     SetDlgItemText(dlg, IDC_SSHUSERSA, pvar->ts->UIMsg);
1355     GetDlgItemText(dlg, IDC_SSHUSERHOSTS, uimsg, sizeof(uimsg));
1356     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RHOST", pvar, uimsg);
1357     SetDlgItemText(dlg, IDC_SSHUSERHOSTS, pvar->ts->UIMsg);
1358     GetDlgItemText(dlg, IDC_SSHUSETIS, uimsg, sizeof(uimsg));
1359     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_CHALLENGE", pvar, uimsg);
1360     SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
1361     GetDlgItemText(dlg, IDC_SSHUSEPAGEANT, uimsg, sizeof(uimsg));
1362     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PAGEANT", pvar, uimsg);
1363     SetDlgItemText(dlg, IDC_SSHUSEPAGEANT, pvar->ts->UIMsg);
1364     GetDlgItemText(dlg, IDC_CHOOSERSAFILE, uimsg, sizeof(uimsg));
1365     UTIL_get_lang_msg("DLG_AUTH_PRIVATEKEY", pvar, uimsg);
1366     SetDlgItemText(dlg, IDC_CHOOSERSAFILE, pvar->ts->UIMsg);
1367     GetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, uimsg, sizeof(uimsg));
1368     UTIL_get_lang_msg("DLG_AUTH_LOCALUSER", pvar, uimsg);
1369     SetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, pvar->ts->UIMsg);
1370     GetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, uimsg, sizeof(uimsg));
1371     UTIL_get_lang_msg("DLG_AUTH_HOST_PRIVATEKEY", pvar, uimsg);
1372     SetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, pvar->ts->UIMsg);
1373     GetDlgItemText(dlg, IDC_CHECKAUTH, uimsg, sizeof(uimsg));
1374     UTIL_get_lang_msg("DLG_AUTHSETUP_CHECKAUTH", pvar, uimsg);
1375     SetDlgItemText(dlg, IDC_CHECKAUTH, pvar->ts->UIMsg);
1376     GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1377     UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1378     SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1379     GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1380     UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
1381     SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1382    
1383     switch (pvar->settings.DefaultAuthMethod) {
1384     case SSH_AUTH_RSA:
1385     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1386     IDC_SSHUSERSA);
1387     break;
1388     case SSH_AUTH_RHOSTS:
1389     case SSH_AUTH_RHOSTS_RSA:
1390     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1391     IDC_SSHUSERHOSTS);
1392     break;
1393     case SSH_AUTH_TIS:
1394     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1395     IDC_SSHUSETIS);
1396     break;
1397     case SSH_AUTH_PAGEANT:
1398     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1399     IDC_SSHUSEPAGEANT);
1400     break;
1401     case SSH_AUTH_PASSWORD:
1402     default:
1403     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1404     IDC_SSHUSEPASSWORD);
1405     }
1406    
1407     SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName);
1408     SetDlgItemText(dlg, IDC_RSAFILENAME,
1409     pvar->settings.DefaultRSAPrivateKeyFile);
1410     SetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1411     pvar->settings.DefaultRhostsHostPrivateKeyFile);
1412     SetDlgItemText(dlg, IDC_LOCALUSERNAME,
1413     pvar->settings.DefaultRhostsLocalUserName);
1414    
1415     if (pvar->settings.CheckAuthListFirst) {
1416     CheckDlgButton(dlg, IDC_CHECKAUTH, TRUE);
1417     }
1418     }
1419    
1420     static BOOL end_default_auth_dlg(PTInstVar pvar, HWND dlg)
1421     {
1422     if (IsDlgButtonChecked(dlg, IDC_SSHUSERSA)) {
1423     pvar->settings.DefaultAuthMethod = SSH_AUTH_RSA;
1424     } else if (IsDlgButtonChecked(dlg, IDC_SSHUSERHOSTS)) {
1425     if (GetWindowTextLength(GetDlgItem(dlg, IDC_HOSTRSAFILENAME)) > 0) {
1426     pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS_RSA;
1427     } else {
1428     pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS;
1429     }
1430     } else if (IsDlgButtonChecked(dlg, IDC_SSHUSETIS)) {
1431     pvar->settings.DefaultAuthMethod = SSH_AUTH_TIS;
1432     } else if (IsDlgButtonChecked(dlg, IDC_SSHUSEPAGEANT)) {
1433     pvar->settings.DefaultAuthMethod = SSH_AUTH_PAGEANT;
1434     } else {
1435     pvar->settings.DefaultAuthMethod = SSH_AUTH_PASSWORD;
1436     }
1437    
1438     GetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName,
1439     sizeof(pvar->settings.DefaultUserName));
1440     GetDlgItemText(dlg, IDC_RSAFILENAME,
1441     pvar->settings.DefaultRSAPrivateKeyFile,
1442     sizeof(pvar->settings.DefaultRSAPrivateKeyFile));
1443     GetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1444     pvar->settings.DefaultRhostsHostPrivateKeyFile,
1445     sizeof(pvar->settings.DefaultRhostsHostPrivateKeyFile));
1446     GetDlgItemText(dlg, IDC_LOCALUSERNAME,
1447     pvar->settings.DefaultRhostsLocalUserName,
1448     sizeof(pvar->settings.DefaultRhostsLocalUserName));
1449    
1450     if (IsDlgButtonChecked(dlg, IDC_CHECKAUTH)) {
1451     pvar->settings.CheckAuthListFirst = TRUE;
1452     }
1453     else {
1454     pvar->settings.CheckAuthListFirst = FALSE;
1455     }
1456    
1457     EndDialog(dlg, 1);
1458     return TRUE;
1459     }
1460    
1461     static BOOL CALLBACK default_auth_dlg_proc(HWND dlg, UINT msg,
1462     WPARAM wParam, LPARAM lParam)
1463     {
1464     PTInstVar pvar;
1465 zmatsuo 7560 // LOGFONT logfont;
1466     // HFONT font;
1467 maya 3227
1468     switch (msg) {
1469     case WM_INITDIALOG:
1470     pvar = (PTInstVar) lParam;
1471     SetWindowLong(dlg, DWL_USER, lParam);
1472    
1473     init_default_auth_dlg(pvar, dlg);
1474 zmatsuo 7560 #if 0
1475 maya 3227 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1476     GetObject(font, sizeof(LOGFONT), &logfont);
1477     if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthSetupFont, pvar)) {
1478     SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1479     SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1480     SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1481     SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1482     SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1483     SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1484     SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1485     SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1486     SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1487     SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1488     SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1489     SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1490     SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1491     SendDlgItemMessage(dlg, IDC_SSHUSEPAGEANT, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1492     SendDlgItemMessage(dlg, IDC_CHECKAUTH, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1493     SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1494     SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1495     }
1496     else {
1497     DlgAuthSetupFont = NULL;
1498     }
1499 zmatsuo 7560 #endif
1500 zmatsuo 7592 CenterWindow(dlg, GetParent(dlg));
1501 maya 3227 return TRUE; /* because we do not set the focus */
1502    
1503     case WM_COMMAND:
1504     pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1505    
1506     switch (LOWORD(wParam)) {
1507     case IDOK:
1508 zmatsuo 7560 #if 0
1509 maya 3227 if (DlgAuthSetupFont != NULL) {
1510     DeleteObject(DlgAuthSetupFont);
1511     }
1512 zmatsuo 7560 #endif
1513 maya 3227 return end_default_auth_dlg(pvar, dlg);
1514    
1515     case IDCANCEL:
1516     EndDialog(dlg, 0);
1517 zmatsuo 7560 #if 0
1518 maya 3227 if (DlgAuthSetupFont != NULL) {
1519     DeleteObject(DlgAuthSetupFont);
1520     }
1521 zmatsuo 7560 #endif
1522 maya 3227 return TRUE;
1523    
1524     case IDC_CHOOSERSAFILE:
1525     choose_RSA_key_file(dlg, pvar);
1526     return TRUE;
1527    
1528     case IDC_CHOOSEHOSTRSAFILE:
1529     choose_host_RSA_key_file(dlg, pvar);
1530     return TRUE;
1531    
1532     default:
1533     return FALSE;
1534     }
1535    
1536     default:
1537     return FALSE;
1538     }
1539     }
1540    
1541     void AUTH_init(PTInstVar pvar)
1542     {
1543     pvar->auth_state.failed_method = SSH_AUTH_NONE;
1544     pvar->auth_state.auth_dialog = NULL;
1545     pvar->auth_state.user = NULL;
1546     pvar->auth_state.flags = 0;
1547     pvar->auth_state.TIS_prompt = NULL;
1548 doda 7477 pvar->auth_state.echo = 0;
1549 maya 3227 pvar->auth_state.supported_types = 0;
1550     pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
1551     pvar->auth_state.cur_cred.password = NULL;
1552     pvar->auth_state.cur_cred.rhosts_client_user = NULL;
1553     pvar->auth_state.cur_cred.key_pair = NULL;
1554     AUTH_set_generic_mode(pvar);
1555     }
1556    
1557     void AUTH_set_generic_mode(PTInstVar pvar)
1558     {
1559     pvar->auth_state.mode = GENERIC_AUTH_MODE;
1560     destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1561     }
1562    
1563 doda 7477 void AUTH_set_TIS_mode(PTInstVar pvar, char *prompt, int len, int echo)
1564 maya 3227 {
1565     if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1566     pvar->auth_state.mode = TIS_AUTH_MODE;
1567    
1568     destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1569     pvar->auth_state.TIS_prompt = malloc(len + 1);
1570     memcpy(pvar->auth_state.TIS_prompt, prompt, len);
1571     pvar->auth_state.TIS_prompt[len] = 0;
1572 doda 7477 pvar->auth_state.echo = echo;
1573 maya 3227 } else {
1574     AUTH_set_generic_mode(pvar);
1575     }
1576     }
1577    
1578     void AUTH_do_default_cred_dialog(PTInstVar pvar)
1579     {
1580     HWND cur_active = GetActiveWindow();
1581    
1582     if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHAUTHSETUP),
1583     cur_active != NULL ? cur_active
1584     : pvar->NotificationWindow,
1585     default_auth_dlg_proc, (LPARAM) pvar) == -1) {
1586     UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTHSETUP_ERROR", pvar,
1587     "Unable to display authentication setup dialog box.");
1588     notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1589     }
1590     }
1591    
1592     void AUTH_destroy_cur_cred(PTInstVar pvar)
1593     {
1594     destroy_malloced_string(&pvar->auth_state.cur_cred.password);
1595     destroy_malloced_string(&pvar->auth_state.cur_cred.rhosts_client_user);
1596     if (pvar->auth_state.cur_cred.key_pair != NULL) {
1597 maya 4307 key_free(pvar->auth_state.cur_cred.key_pair);
1598 maya 3227 pvar->auth_state.cur_cred.key_pair = NULL;
1599     }
1600     }
1601    
1602 maya 4307 static const char *get_auth_method_name(SSHAuthMethod auth)
1603 maya 3227 {
1604     switch (auth) {
1605     case SSH_AUTH_PASSWORD:
1606     return "password";
1607     case SSH_AUTH_RSA:
1608 maya 5550 return "publickey";
1609 maya 3227 case SSH_AUTH_PAGEANT:
1610 maya 5550 return "publickey";
1611 maya 3227 case SSH_AUTH_RHOSTS:
1612     return "rhosts";
1613     case SSH_AUTH_RHOSTS_RSA:
1614     return "rhosts with RSA";
1615     case SSH_AUTH_TIS:
1616     return "challenge/response (TIS)";
1617     default:
1618     return "unknown method";
1619     }
1620     }
1621    
1622 doda 6801 void AUTH_get_auth_info(PTInstVar pvar, char *dest, int len)
1623 maya 3227 {
1624 maya 4307 const char *method = "unknown";
1625 yutakapon 5545 char buf[256];
1626 maya 3227
1627     if (pvar->auth_state.user == NULL) {
1628     strncpy_s(dest, len, "None", _TRUNCATE);
1629     } else if (pvar->auth_state.cur_cred.method != SSH_AUTH_NONE) {
1630     if (SSHv1(pvar)) {
1631     UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1632 maya 5550 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
1633     pvar->auth_state.user,
1634 maya 3227 get_auth_method_name(pvar->auth_state.cur_cred.method));
1635    
1636 maya 5550 if (pvar->auth_state.cur_cred.method == SSH_AUTH_RSA) {
1637     UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO2", pvar, " with %s key");
1638     _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
1639     "RSA");
1640     strncat_s(dest, len, buf, _TRUNCATE);
1641     }
1642     else if (pvar->auth_state.cur_cred.method == SSH_AUTH_PAGEANT) {
1643     UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO3", pvar, " with %s key from Pageant");
1644     _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
1645     "RSA");
1646     strncat_s(dest, len, buf, _TRUNCATE);
1647     }
1648 maya 3227 } else {
1649     // SSH2:�F�����\�b�h������ (2004.12.23 yutaka)
1650     // keyboard-interactive���\�b�h������ (2005.3.12 yutaka)
1651     if (pvar->auth_state.cur_cred.method == SSH_AUTH_PASSWORD ||
1652     pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1653     // keyboard-interactive���\�b�h������ (2005.1.24 yutaka)
1654     if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1655     method = "keyboard-interactive";
1656     } else {
1657     method = get_auth_method_name(pvar->auth_state.cur_cred.method);
1658     }
1659     UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1660 maya 5550 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
1661     pvar->auth_state.user, method);
1662     }
1663     else if (pvar->auth_state.cur_cred.method == SSH_AUTH_RSA) {
1664     method = get_auth_method_name(pvar->auth_state.cur_cred.method);
1665     UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1666     _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
1667     pvar->auth_state.user,
1668     get_auth_method_name(pvar->auth_state.cur_cred.method));
1669 maya 3227
1670 maya 5550 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO2", pvar, " with %s key");
1671     _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
1672     ssh_key_type(pvar->auth_state.cur_cred.key_pair->type));
1673     strncat_s(dest, len, buf, _TRUNCATE);
1674     }
1675     else if (pvar->auth_state.cur_cred.method == SSH_AUTH_PAGEANT) {
1676     int key_len = get_uint32_MSBfirst(pvar->pageant_curkey + 4);
1677     char *s = (char *)malloc(key_len+1);
1678 yutakapon 5545
1679 maya 5550 method = get_auth_method_name(pvar->auth_state.cur_cred.method);
1680     UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1681     _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
1682     pvar->auth_state.user,
1683     get_auth_method_name(pvar->auth_state.cur_cred.method));
1684 maya 3227
1685 maya 5550 memcpy(s, pvar->pageant_curkey+4+4, key_len);
1686     s[key_len] = '\0';
1687     UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO3", pvar, " with %s key from Pageant");
1688     _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
1689     ssh_key_type(get_keytype_from_name(s)));
1690     strncat_s(dest, len, buf, _TRUNCATE);
1691    
1692     free(s);
1693 maya 3227 }
1694     }
1695    
1696     } else {
1697     UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1698     _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1699     get_auth_method_name(pvar->auth_state.failed_method));
1700     }
1701    
1702     dest[len - 1] = 0;
1703     }
1704    
1705     void AUTH_notify_disconnecting(PTInstVar pvar)
1706     {
1707     if (pvar->auth_state.auth_dialog != NULL) {
1708     PostMessage(pvar->auth_state.auth_dialog, WM_COMMAND, IDCANCEL, 0);
1709     /* the main window might not go away if it's not enabled. (see vtwin.cpp) */
1710     EnableWindow(pvar->NotificationWindow, TRUE);
1711     }
1712     }
1713    
1714     void AUTH_end(PTInstVar pvar)
1715     {
1716     destroy_malloced_string(&pvar->auth_state.user);
1717     destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1718    
1719     AUTH_destroy_cur_cred(pvar);
1720     }

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