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 7560 - (hide annotations) (download) (as text)
Mon Apr 8 17:12:02 2019 UTC (5 years ago) by zmatsuo
Original Path: trunk/ttssh2/ttxssh/auth.c
File MIME type: text/x-csrc
File size: 59783 byte(s)
ttssh 高DPI対応
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     return FALSE; /* because we set the focus */
833    
834     case WM_TIMER:
835     pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
836     // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2004.12.16 yutaka)
837     if (wParam == IDC_TIMER1) {
838     // �������O�C��������
839     if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
840     (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
841     if (SSHv2(pvar) &&
842     pvar->session_settings.CheckAuthListFirst &&
843     !pvar->tryed_ssh2_authlist) {
844     if (!autologin_sent_none) {
845 maya 3342 autologin_sent_none = TRUE;
846    
847 maya 3336 // �_�C�A���O�����[�U������������
848     if (pvar->auth_state.user == NULL) {
849     pvar->auth_state.user =
850     alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
851     }
852    
853 maya 3342 // CheckAuthListFirst �� TRUE �������� AuthList ���A����������������
854     // IDOK �����������i�����������A�F�����\�b�h none ������ (2008.10.12 maya)
855 maya 3227 do_SSH2_userauth(pvar);
856     }
857     //else {
858     // none �������������A����������������
859     //}
860     }
861     else {
862 maya 3342 // SSH1 ������
863     // ������ CheckAuthListFirst �� FALSE ������
864     // ������ CheckAuthListFirst TRUE ���Aauthlist ���A������������
865 maya 3346 KillTimer(dlg, IDC_TIMER1);
866 maya 3342
867     // �_�C�A���O�����[�U������������
868     if (pvar->auth_state.user == NULL) {
869     pvar->auth_state.user =
870     alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
871     }
872    
873 maya 3227 SendMessage(dlg, WM_COMMAND, IDOK, 0);
874     }
875     }
876     }
877     else if (wParam == IDC_TIMER2) {
878     // authlist ����������
879 maya 3346 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
880     (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
881     if (SSHv2(pvar)) {
882 maya 3227 KillTimer(dlg, IDC_TIMER2);
883    
884     // �_�C�A���O�����[�U������������
885     if (pvar->auth_state.user == NULL) {
886     pvar->auth_state.user =
887     alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
888     }
889    
890     // ���[�U�������X��������
891     EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
892    
893 maya 3342 // �F�����\�b�h none ������
894 maya 3227 do_SSH2_userauth(pvar);
895    
896 maya 3342 // TIS �p�� OK �����������F�������s������������������
897 maya 3227 // Unexpected SSH2 message �������B
898     }
899 maya 3346 else if (SSHv1(pvar)) {
900     KillTimer(dlg, IDC_TIMER2);
901    
902     // TIS �p�� OK ������
903     if (pvar->ssh2_authmethod == SSH_AUTH_TIS) {
904     SendMessage(dlg, WM_COMMAND, IDOK, 0);
905     }
906     // SSH1 �����F�����\�b�h none ����������
907 maya 3227 }
908 maya 3346 // �v���g�R���o�[�W�����m���O������������
909 maya 3227 }
910     }
911     else if (wParam == IDC_TIMER3) {
912 maya 3346 if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
913     (pvar->ssh_state.status_flags & STATUS_HOST_OK)) {
914     if (SSHv2(pvar) || SSHv1(pvar)) {
915     KillTimer(dlg, IDC_TIMER3);
916    
917     // TIS �p�� OK ������
918     SendMessage(dlg, WM_COMMAND, IDOK, 0);
919 maya 3227 }
920 maya 3346 // �v���g�R���o�[�W�����m���O������������
921 maya 3227 }
922     }
923     return FALSE;
924    
925     case WM_COMMAND:
926     pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
927    
928     switch (LOWORD(wParam)) {
929     case IDOK:
930 yutakapon 5562 // �F�������T�[�o�������f�������������A�L�����Z�������������B(2014.3.31 yutaka)
931     if (!pvar->cv->Ready) {
932     goto canceled;
933     }
934    
935 maya 3227 // �F�������������������A�F���f�[�^�����M�����B�����������A�������B(2001.1.25 yutaka)
936     if (pvar->userauth_retry_count == 0 &&
937     ((pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) ||
938     !(pvar->ssh_state.status_flags & STATUS_HOST_OK))) {
939     return FALSE;
940     }
941     else if (SSHv2(pvar) &&
942     pvar->session_settings.CheckAuthListFirst &&
943     !pvar->tryed_ssh2_authlist) {
944     // CheckAuthListFirst ���L�����F������������������������
945     // OK �������������������� (2008.10.4 maya)
946     return FALSE;
947     }
948    
949     return end_auth_dlg(pvar, dlg);
950    
951     case IDCANCEL: /* kill the connection */
952 yutakapon 5562 canceled:
953 maya 3227 pvar->auth_state.auth_dialog = NULL;
954 maya 5678 notify_closed_connection(pvar, "authentication cancelled");
955 maya 3227 EndDialog(dlg, 0);
956 zmatsuo 7560 #if 0
957 maya 3227 if (DlgAuthFont != NULL) {
958     DeleteObject(DlgAuthFont);
959     }
960 zmatsuo 7560 #endif
961 maya 3227 return TRUE;
962    
963     case IDC_SSHUSERNAME:
964     // ���[�U�����t�H�[�J�X������������ (2007.9.29 maya)
965     if (!(pvar->ssh_state.status_flags & STATUS_DONT_SEND_USER_NAME) &&
966     (pvar->ssh_state.status_flags & STATUS_HOST_OK) &&
967     HIWORD(wParam) == EN_KILLFOCUS) {
968     // �������L���������������s��������������
969     if (SSHv2(pvar) &&
970     pvar->session_settings.CheckAuthListFirst &&
971     !pvar->tryed_ssh2_authlist) {
972     // �_�C�A���O�����[�U�������f
973     if (pvar->auth_state.user == NULL) {
974     pvar->auth_state.user =
975     alloc_control_text(GetDlgItem(dlg, IDC_SSHUSERNAME));
976     }
977    
978     // ���[�U���������������������`�F�b�N����
979     if (strlen(pvar->auth_state.user) == 0) {
980     return FALSE;
981     }
982    
983     // ���[�U�������X��������
984     EnableWindow(GetDlgItem(dlg, IDC_SSHUSERNAME), FALSE);
985    
986 maya 3342 // �F�����\�b�h none ������
987 maya 3227 do_SSH2_userauth(pvar);
988     return TRUE;
989     }
990     }
991    
992     return FALSE;
993    
994     case IDC_SSHUSEPASSWORD:
995     case IDC_SSHUSERSA:
996     case IDC_SSHUSERHOSTS:
997     case IDC_SSHUSETIS:
998     case IDC_SSHUSEPAGEANT:
999     set_auth_options_status(dlg, LOWORD(wParam));
1000     return TRUE;
1001    
1002     case IDC_CHOOSERSAFILE:
1003     choose_RSA_key_file(dlg, pvar);
1004     return TRUE;
1005    
1006     case IDC_CHOOSEHOSTRSAFILE:
1007     choose_host_RSA_key_file(dlg, pvar);
1008     return TRUE;
1009    
1010     case IDC_FORWARD_AGENT:
1011     // �����Z�b�V�������������f������ (2008.12.4 maya)
1012     pvar->session_settings.ForwardAgent = IsDlgButtonChecked(dlg, IDC_FORWARD_AGENT);
1013     return TRUE;
1014    
1015 zmatsuo 7507 case IDC_FROM_CLIPBOARD: {
1016     char *clipboard = GetClipboardTextA(dlg, TRUE);
1017     if (clipboard != NULL) {
1018     SetDlgItemTextA(dlg, IDC_SSHPASSWORD, clipboard);
1019     free(clipboard);
1020     SendMessage(dlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(dlg, IDOK), TRUE);
1021     return FALSE;
1022     }
1023     return TRUE;
1024     }
1025    
1026 maya 3227 default:
1027     return FALSE;
1028     }
1029    
1030     default:
1031     return FALSE;
1032     }
1033     }
1034    
1035 doda 6801 char *AUTH_get_user_name(PTInstVar pvar)
1036 maya 3227 {
1037     return pvar->auth_state.user;
1038     }
1039    
1040     int AUTH_set_supported_auth_types(PTInstVar pvar, int types)
1041     {
1042 doda 6809 logprintf(LOG_LEVEL_VERBOSE, "Server reports supported authentication method mask = %d", types);
1043 maya 3227
1044     if (SSHv1(pvar)) {
1045     types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
1046     | (1 << SSH_AUTH_RHOSTS_RSA) | (1 << SSH_AUTH_RHOSTS)
1047     | (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);
1048     } else {
1049     // for SSH2(yutaka)
1050     // types &= (1 << SSH_AUTH_PASSWORD);
1051     // ���J���F�����L�������� (2004.12.18 yutaka)
1052     // TIS�������BSSH2����keyboard-interactive�����������B(2005.3.12 yutaka)
1053     types &= (1 << SSH_AUTH_PASSWORD) | (1 << SSH_AUTH_RSA)
1054     | (1 << SSH_AUTH_TIS) | (1 << SSH_AUTH_PAGEANT);
1055     }
1056     pvar->auth_state.supported_types = types;
1057    
1058     if (types == 0) {
1059     UTIL_get_lang_msg("MSG_NOAUTHMETHOD_ERROR", pvar,
1060     "Server does not support any of the authentication options\n"
1061     "provided by TTSSH. This connection will now close.");
1062 maya 5678 notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
1063 maya 3227 return 0;
1064     } else {
1065     if (pvar->auth_state.auth_dialog != NULL) {
1066 doda 6809 update_server_supported_types(pvar, pvar->auth_state.auth_dialog);
1067 maya 3227 }
1068    
1069     return 1;
1070     }
1071     }
1072    
1073     static void start_user_auth(PTInstVar pvar)
1074     {
1075     // �F���_�C�A���O���\�������� (2004.12.1 yutaka)
1076     PostMessage(pvar->NotificationWindow, WM_COMMAND, (WPARAM) ID_SSHAUTH,
1077     (LPARAM) NULL);
1078     pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
1079     }
1080    
1081     static void try_default_auth(PTInstVar pvar)
1082     {
1083     if (pvar->session_settings.TryDefaultAuth) {
1084     switch (pvar->session_settings.DefaultAuthMethod) {
1085     case SSH_AUTH_RSA:{
1086     BOOL invalid_passphrase;
1087     char password[] = "";
1088    
1089     pvar->auth_state.cur_cred.key_pair
1090     =
1091     KEYFILES_read_private_key(pvar,
1092     pvar->session_settings.
1093     DefaultRSAPrivateKeyFile,
1094     password,
1095     &invalid_passphrase, TRUE);
1096     if (pvar->auth_state.cur_cred.key_pair == NULL) {
1097     return;
1098     } else {
1099     pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
1100     }
1101     break;
1102     }
1103    
1104     case SSH_AUTH_RHOSTS:
1105     if (pvar->session_settings.
1106     DefaultRhostsHostPrivateKeyFile[0] != 0) {
1107     BOOL invalid_passphrase;
1108     char password[] = "";
1109    
1110     pvar->auth_state.cur_cred.key_pair
1111     =
1112     KEYFILES_read_private_key(pvar,
1113     pvar->session_settings.
1114     DefaultRhostsHostPrivateKeyFile,
1115     password,
1116     &invalid_passphrase, TRUE);
1117     if (pvar->auth_state.cur_cred.key_pair == NULL) {
1118     return;
1119     } else {
1120     pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS_RSA;
1121     }
1122     } else {
1123     pvar->auth_state.cur_cred.method = SSH_AUTH_RHOSTS;
1124     }
1125    
1126     pvar->auth_state.cur_cred.rhosts_client_user =
1127     _strdup(pvar->session_settings.DefaultRhostsLocalUserName);
1128     break;
1129    
1130     case SSH_AUTH_PAGEANT:
1131     pvar->auth_state.cur_cred.method = SSH_AUTH_PAGEANT;
1132     break;
1133    
1134     case SSH_AUTH_PASSWORD:
1135     pvar->auth_state.cur_cred.password = _strdup("");
1136     pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
1137     break;
1138    
1139     case SSH_AUTH_TIS:
1140     default:
1141     return;
1142     }
1143    
1144     pvar->auth_state.user =
1145     _strdup(pvar->session_settings.DefaultUserName);
1146     }
1147     }
1148    
1149     void AUTH_notify_end_error(PTInstVar pvar)
1150     {
1151     if ((pvar->auth_state.flags & AUTH_START_USER_AUTH_ON_ERROR_END) != 0) {
1152     start_user_auth(pvar);
1153     pvar->auth_state.flags &= ~AUTH_START_USER_AUTH_ON_ERROR_END;
1154     }
1155     }
1156    
1157     void AUTH_advance_to_next_cred(PTInstVar pvar)
1158     {
1159     pvar->auth_state.failed_method = pvar->auth_state.cur_cred.method;
1160    
1161     if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
1162     try_default_auth(pvar);
1163    
1164     if (pvar->auth_state.cur_cred.method == SSH_AUTH_NONE) {
1165     if (pvar->err_msg != NULL) {
1166     pvar->auth_state.flags |=
1167     AUTH_START_USER_AUTH_ON_ERROR_END;
1168     } else {
1169     // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
1170     // �R�}���h���C���w������������
1171     start_user_auth(pvar);
1172     }
1173     }
1174     } else {
1175     // �������F���_�C�A���O���o�������� (2004.12.1 yutaka)
1176     // �R�}���h���C���w������(/auth=xxxx)������
1177     start_user_auth(pvar);
1178     }
1179     }
1180    
1181     static void init_TIS_dlg(PTInstVar pvar, HWND dlg)
1182     {
1183     char uimsg[MAX_UIMSG];
1184    
1185     GetWindowText(dlg, uimsg, sizeof(uimsg));
1186     UTIL_get_lang_msg("DLG_TIS_TITLE", pvar, uimsg);
1187     SetWindowText(dlg, pvar->ts->UIMsg);
1188     GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
1189     UTIL_get_lang_msg("DLG_TIS_BANNER", pvar, uimsg);
1190     SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
1191     GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1192     UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1193     SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1194     GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1195     UTIL_get_lang_msg("BTN_DISCONNECT", pvar, uimsg);
1196     SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1197    
1198     init_auth_machine_banner(pvar, dlg);
1199     init_password_control(dlg);
1200    
1201     if (pvar->auth_state.TIS_prompt != NULL) {
1202     if (strlen(pvar->auth_state.TIS_prompt) > 10000) {
1203     pvar->auth_state.TIS_prompt[10000] = 0;
1204     }
1205     SetDlgItemText(dlg, IDC_SSHAUTHBANNER2,
1206     pvar->auth_state.TIS_prompt);
1207     destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1208     }
1209 doda 7477
1210     if (pvar->auth_state.echo) {
1211     SendMessage(GetDlgItem(dlg, IDC_SSHPASSWORD), EM_SETPASSWORDCHAR, 0, 0);
1212     }
1213 maya 3227 }
1214    
1215     static BOOL end_TIS_dlg(PTInstVar pvar, HWND dlg)
1216     {
1217 doda 6801 char *password =
1218 maya 3227 alloc_control_text(GetDlgItem(dlg, IDC_SSHPASSWORD));
1219    
1220     pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
1221     pvar->auth_state.cur_cred.password = password;
1222     pvar->auth_state.auth_dialog = NULL;
1223    
1224     // add
1225     if (SSHv2(pvar)) {
1226     pvar->keyboard_interactive_password_input = 1;
1227     handle_SSH2_userauth_inforeq(pvar);
1228     }
1229    
1230     SSH_notify_cred(pvar);
1231    
1232     EndDialog(dlg, 1);
1233     return TRUE;
1234     }
1235    
1236     static BOOL CALLBACK TIS_dlg_proc(HWND dlg, UINT msg, WPARAM wParam,
1237     LPARAM lParam)
1238     {
1239     PTInstVar pvar;
1240 zmatsuo 7560 // LOGFONT logfont;
1241     // HFONT font;
1242 maya 3227
1243     switch (msg) {
1244     case WM_INITDIALOG:
1245     pvar = (PTInstVar) lParam;
1246     pvar->auth_state.auth_dialog = dlg;
1247     SetWindowLong(dlg, DWL_USER, lParam);
1248    
1249     init_TIS_dlg(pvar, dlg);
1250 zmatsuo 7560 #if 0
1251 maya 3227 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1252     GetObject(font, sizeof(LOGFONT), &logfont);
1253     if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgTisFont, pvar)) {
1254     SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1255     SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER2, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1256     SendDlgItemMessage(dlg, IDC_SSHPASSWORD, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1257     SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1258     SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgTisFont, MAKELPARAM(TRUE,0));
1259     }
1260     else {
1261     DlgTisFont = NULL;
1262     }
1263 zmatsuo 7560 #endif
1264 maya 3227 // /auth=challenge ������ (2007.10.5 maya)
1265     if (pvar->ssh2_autologin == 1) {
1266     SetDlgItemText(dlg, IDC_SSHPASSWORD, pvar->ssh2_password);
1267     SendMessage(dlg, WM_COMMAND, IDOK, 0);
1268     }
1269    
1270     return FALSE; /* because we set the focus */
1271    
1272     case WM_COMMAND:
1273     pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1274    
1275     switch (LOWORD(wParam)) {
1276     case IDOK:
1277 zmatsuo 7560 #if 0
1278 maya 3227 if (DlgTisFont != NULL) {
1279     DeleteObject(DlgTisFont);
1280     }
1281 zmatsuo 7560 #endif
1282 maya 3227 return end_TIS_dlg(pvar, dlg);
1283    
1284     case IDCANCEL: /* kill the connection */
1285     pvar->auth_state.auth_dialog = NULL;
1286 maya 5678 notify_closed_connection(pvar, "authentication cancelled");
1287 maya 3227 EndDialog(dlg, 0);
1288 zmatsuo 7560 #if 0
1289 maya 3227 if (DlgTisFont != NULL) {
1290     DeleteObject(DlgTisFont);
1291     }
1292 zmatsuo 7560 #endif
1293 maya 3227 return TRUE;
1294    
1295     default:
1296     return FALSE;
1297     }
1298    
1299     default:
1300     return FALSE;
1301     }
1302     }
1303    
1304     void AUTH_do_cred_dialog(PTInstVar pvar)
1305     {
1306     if (pvar->auth_state.auth_dialog == NULL) {
1307     HWND cur_active = GetActiveWindow();
1308     DLGPROC dlg_proc;
1309     LPCTSTR dialog_template;
1310    
1311     switch (pvar->auth_state.mode) {
1312     case TIS_AUTH_MODE:
1313     dialog_template = MAKEINTRESOURCE(IDD_SSHTISAUTH);
1314     dlg_proc = TIS_dlg_proc;
1315     break;
1316     case GENERIC_AUTH_MODE:
1317     default:
1318     dialog_template = MAKEINTRESOURCE(IDD_SSHAUTH);
1319     dlg_proc = auth_dlg_proc;
1320     }
1321    
1322     if (!DialogBoxParam(hInst, dialog_template,
1323     cur_active !=
1324     NULL ? cur_active : pvar->NotificationWindow,
1325     dlg_proc, (LPARAM) pvar) == -1) {
1326     UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTH_ERROR", pvar,
1327     "Unable to display authentication dialog box.\n"
1328     "Connection terminated.");
1329 maya 5678 notify_fatal_error(pvar, pvar->ts->UIMsg, TRUE);
1330 maya 3227 }
1331     }
1332     }
1333    
1334     static void init_default_auth_dlg(PTInstVar pvar, HWND dlg)
1335     {
1336     char uimsg[MAX_UIMSG];
1337    
1338     GetWindowText(dlg, uimsg, sizeof(uimsg));
1339     UTIL_get_lang_msg("DLG_AUTHSETUP_TITLE", pvar, uimsg);
1340     SetWindowText(dlg, pvar->ts->UIMsg);
1341     GetDlgItemText(dlg, IDC_SSHAUTHBANNER, uimsg, sizeof(uimsg));
1342     UTIL_get_lang_msg("DLG_AUTHSETUP_BANNER", pvar, uimsg);
1343     SetDlgItemText(dlg, IDC_SSHAUTHBANNER, pvar->ts->UIMsg);
1344     GetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, uimsg, sizeof(uimsg));
1345     UTIL_get_lang_msg("DLG_AUTHSETUP_USERNAME", pvar, uimsg);
1346     SetDlgItemText(dlg, IDC_SSHUSERNAMELABEL, pvar->ts->UIMsg);
1347     GetDlgItemText(dlg, IDC_SSHUSEPASSWORD, uimsg, sizeof(uimsg));
1348     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PASSWORD", pvar, uimsg);
1349     SetDlgItemText(dlg, IDC_SSHUSEPASSWORD, pvar->ts->UIMsg);
1350     GetDlgItemText(dlg, IDC_SSHUSERSA, uimsg, sizeof(uimsg));
1351     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RSA", pvar, uimsg);
1352     SetDlgItemText(dlg, IDC_SSHUSERSA, pvar->ts->UIMsg);
1353     GetDlgItemText(dlg, IDC_SSHUSERHOSTS, uimsg, sizeof(uimsg));
1354     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_RHOST", pvar, uimsg);
1355     SetDlgItemText(dlg, IDC_SSHUSERHOSTS, pvar->ts->UIMsg);
1356     GetDlgItemText(dlg, IDC_SSHUSETIS, uimsg, sizeof(uimsg));
1357     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_CHALLENGE", pvar, uimsg);
1358     SetDlgItemText(dlg, IDC_SSHUSETIS, pvar->ts->UIMsg);
1359     GetDlgItemText(dlg, IDC_SSHUSEPAGEANT, uimsg, sizeof(uimsg));
1360     UTIL_get_lang_msg("DLG_AUTHSETUP_METHOD_PAGEANT", pvar, uimsg);
1361     SetDlgItemText(dlg, IDC_SSHUSEPAGEANT, pvar->ts->UIMsg);
1362     GetDlgItemText(dlg, IDC_CHOOSERSAFILE, uimsg, sizeof(uimsg));
1363     UTIL_get_lang_msg("DLG_AUTH_PRIVATEKEY", pvar, uimsg);
1364     SetDlgItemText(dlg, IDC_CHOOSERSAFILE, pvar->ts->UIMsg);
1365     GetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, uimsg, sizeof(uimsg));
1366     UTIL_get_lang_msg("DLG_AUTH_LOCALUSER", pvar, uimsg);
1367     SetDlgItemText(dlg, IDC_LOCALUSERNAMELABEL, pvar->ts->UIMsg);
1368     GetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, uimsg, sizeof(uimsg));
1369     UTIL_get_lang_msg("DLG_AUTH_HOST_PRIVATEKEY", pvar, uimsg);
1370     SetDlgItemText(dlg, IDC_CHOOSEHOSTRSAFILE, pvar->ts->UIMsg);
1371     GetDlgItemText(dlg, IDC_CHECKAUTH, uimsg, sizeof(uimsg));
1372     UTIL_get_lang_msg("DLG_AUTHSETUP_CHECKAUTH", pvar, uimsg);
1373     SetDlgItemText(dlg, IDC_CHECKAUTH, pvar->ts->UIMsg);
1374     GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1375     UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1376     SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1377     GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1378     UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
1379     SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1380    
1381     switch (pvar->settings.DefaultAuthMethod) {
1382     case SSH_AUTH_RSA:
1383     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1384     IDC_SSHUSERSA);
1385     break;
1386     case SSH_AUTH_RHOSTS:
1387     case SSH_AUTH_RHOSTS_RSA:
1388     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1389     IDC_SSHUSERHOSTS);
1390     break;
1391     case SSH_AUTH_TIS:
1392     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1393     IDC_SSHUSETIS);
1394     break;
1395     case SSH_AUTH_PAGEANT:
1396     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1397     IDC_SSHUSEPAGEANT);
1398     break;
1399     case SSH_AUTH_PASSWORD:
1400     default:
1401     CheckRadioButton(dlg, IDC_SSHUSEPASSWORD, MAX_AUTH_CONTROL,
1402     IDC_SSHUSEPASSWORD);
1403     }
1404    
1405     SetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName);
1406     SetDlgItemText(dlg, IDC_RSAFILENAME,
1407     pvar->settings.DefaultRSAPrivateKeyFile);
1408     SetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1409     pvar->settings.DefaultRhostsHostPrivateKeyFile);
1410     SetDlgItemText(dlg, IDC_LOCALUSERNAME,
1411     pvar->settings.DefaultRhostsLocalUserName);
1412    
1413     if (pvar->settings.CheckAuthListFirst) {
1414     CheckDlgButton(dlg, IDC_CHECKAUTH, TRUE);
1415     }
1416     }
1417    
1418     static BOOL end_default_auth_dlg(PTInstVar pvar, HWND dlg)
1419     {
1420     if (IsDlgButtonChecked(dlg, IDC_SSHUSERSA)) {
1421     pvar->settings.DefaultAuthMethod = SSH_AUTH_RSA;
1422     } else if (IsDlgButtonChecked(dlg, IDC_SSHUSERHOSTS)) {
1423     if (GetWindowTextLength(GetDlgItem(dlg, IDC_HOSTRSAFILENAME)) > 0) {
1424     pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS_RSA;
1425     } else {
1426     pvar->settings.DefaultAuthMethod = SSH_AUTH_RHOSTS;
1427     }
1428     } else if (IsDlgButtonChecked(dlg, IDC_SSHUSETIS)) {
1429     pvar->settings.DefaultAuthMethod = SSH_AUTH_TIS;
1430     } else if (IsDlgButtonChecked(dlg, IDC_SSHUSEPAGEANT)) {
1431     pvar->settings.DefaultAuthMethod = SSH_AUTH_PAGEANT;
1432     } else {
1433     pvar->settings.DefaultAuthMethod = SSH_AUTH_PASSWORD;
1434     }
1435    
1436     GetDlgItemText(dlg, IDC_SSHUSERNAME, pvar->settings.DefaultUserName,
1437     sizeof(pvar->settings.DefaultUserName));
1438     GetDlgItemText(dlg, IDC_RSAFILENAME,
1439     pvar->settings.DefaultRSAPrivateKeyFile,
1440     sizeof(pvar->settings.DefaultRSAPrivateKeyFile));
1441     GetDlgItemText(dlg, IDC_HOSTRSAFILENAME,
1442     pvar->settings.DefaultRhostsHostPrivateKeyFile,
1443     sizeof(pvar->settings.DefaultRhostsHostPrivateKeyFile));
1444     GetDlgItemText(dlg, IDC_LOCALUSERNAME,
1445     pvar->settings.DefaultRhostsLocalUserName,
1446     sizeof(pvar->settings.DefaultRhostsLocalUserName));
1447    
1448     if (IsDlgButtonChecked(dlg, IDC_CHECKAUTH)) {
1449     pvar->settings.CheckAuthListFirst = TRUE;
1450     }
1451     else {
1452     pvar->settings.CheckAuthListFirst = FALSE;
1453     }
1454    
1455     EndDialog(dlg, 1);
1456     return TRUE;
1457     }
1458    
1459     static BOOL CALLBACK default_auth_dlg_proc(HWND dlg, UINT msg,
1460     WPARAM wParam, LPARAM lParam)
1461     {
1462     PTInstVar pvar;
1463 zmatsuo 7560 // LOGFONT logfont;
1464     // HFONT font;
1465 maya 3227
1466     switch (msg) {
1467     case WM_INITDIALOG:
1468     pvar = (PTInstVar) lParam;
1469     SetWindowLong(dlg, DWL_USER, lParam);
1470    
1471     init_default_auth_dlg(pvar, dlg);
1472 zmatsuo 7560 #if 0
1473 maya 3227 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1474     GetObject(font, sizeof(LOGFONT), &logfont);
1475     if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAuthSetupFont, pvar)) {
1476     SendDlgItemMessage(dlg, IDC_SSHAUTHBANNER, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1477     SendDlgItemMessage(dlg, IDC_SSHUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1478     SendDlgItemMessage(dlg, IDC_SSHUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1479     SendDlgItemMessage(dlg, IDC_SSHUSEPASSWORD, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1480     SendDlgItemMessage(dlg, IDC_SSHUSERSA, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1481     SendDlgItemMessage(dlg, IDC_CHOOSERSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1482     SendDlgItemMessage(dlg, IDC_RSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1483     SendDlgItemMessage(dlg, IDC_SSHUSERHOSTS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1484     SendDlgItemMessage(dlg, IDC_LOCALUSERNAMELABEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1485     SendDlgItemMessage(dlg, IDC_LOCALUSERNAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1486     SendDlgItemMessage(dlg, IDC_CHOOSEHOSTRSAFILE, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1487     SendDlgItemMessage(dlg, IDC_HOSTRSAFILENAME, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1488     SendDlgItemMessage(dlg, IDC_SSHUSETIS, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1489     SendDlgItemMessage(dlg, IDC_SSHUSEPAGEANT, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1490     SendDlgItemMessage(dlg, IDC_CHECKAUTH, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1491     SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1492     SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgAuthSetupFont, MAKELPARAM(TRUE,0));
1493     }
1494     else {
1495     DlgAuthSetupFont = NULL;
1496     }
1497 zmatsuo 7560 #endif
1498 maya 3227 return TRUE; /* because we do not set the focus */
1499    
1500     case WM_COMMAND:
1501     pvar = (PTInstVar) GetWindowLong(dlg, DWL_USER);
1502    
1503     switch (LOWORD(wParam)) {
1504     case IDOK:
1505 zmatsuo 7560 #if 0
1506 maya 3227 if (DlgAuthSetupFont != NULL) {
1507     DeleteObject(DlgAuthSetupFont);
1508     }
1509 zmatsuo 7560 #endif
1510 maya 3227 return end_default_auth_dlg(pvar, dlg);
1511    
1512     case IDCANCEL:
1513     EndDialog(dlg, 0);
1514 zmatsuo 7560 #if 0
1515 maya 3227 if (DlgAuthSetupFont != NULL) {
1516     DeleteObject(DlgAuthSetupFont);
1517     }
1518 zmatsuo 7560 #endif
1519 maya 3227 return TRUE;
1520    
1521     case IDC_CHOOSERSAFILE:
1522     choose_RSA_key_file(dlg, pvar);
1523     return TRUE;
1524    
1525     case IDC_CHOOSEHOSTRSAFILE:
1526     choose_host_RSA_key_file(dlg, pvar);
1527     return TRUE;
1528    
1529     default:
1530     return FALSE;
1531     }
1532    
1533     default:
1534     return FALSE;
1535     }
1536     }
1537    
1538     void AUTH_init(PTInstVar pvar)
1539     {
1540     pvar->auth_state.failed_method = SSH_AUTH_NONE;
1541     pvar->auth_state.auth_dialog = NULL;
1542     pvar->auth_state.user = NULL;
1543     pvar->auth_state.flags = 0;
1544     pvar->auth_state.TIS_prompt = NULL;
1545 doda 7477 pvar->auth_state.echo = 0;
1546 maya 3227 pvar->auth_state.supported_types = 0;
1547     pvar->auth_state.cur_cred.method = SSH_AUTH_NONE;
1548     pvar->auth_state.cur_cred.password = NULL;
1549     pvar->auth_state.cur_cred.rhosts_client_user = NULL;
1550     pvar->auth_state.cur_cred.key_pair = NULL;
1551     AUTH_set_generic_mode(pvar);
1552     }
1553    
1554     void AUTH_set_generic_mode(PTInstVar pvar)
1555     {
1556     pvar->auth_state.mode = GENERIC_AUTH_MODE;
1557     destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1558     }
1559    
1560 doda 7477 void AUTH_set_TIS_mode(PTInstVar pvar, char *prompt, int len, int echo)
1561 maya 3227 {
1562     if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1563     pvar->auth_state.mode = TIS_AUTH_MODE;
1564    
1565     destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1566     pvar->auth_state.TIS_prompt = malloc(len + 1);
1567     memcpy(pvar->auth_state.TIS_prompt, prompt, len);
1568     pvar->auth_state.TIS_prompt[len] = 0;
1569 doda 7477 pvar->auth_state.echo = echo;
1570 maya 3227 } else {
1571     AUTH_set_generic_mode(pvar);
1572     }
1573     }
1574    
1575     void AUTH_do_default_cred_dialog(PTInstVar pvar)
1576     {
1577     HWND cur_active = GetActiveWindow();
1578    
1579     if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_SSHAUTHSETUP),
1580     cur_active != NULL ? cur_active
1581     : pvar->NotificationWindow,
1582     default_auth_dlg_proc, (LPARAM) pvar) == -1) {
1583     UTIL_get_lang_msg("MSG_CREATEWINDOW_AUTHSETUP_ERROR", pvar,
1584     "Unable to display authentication setup dialog box.");
1585     notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1586     }
1587     }
1588    
1589     void AUTH_destroy_cur_cred(PTInstVar pvar)
1590     {
1591     destroy_malloced_string(&pvar->auth_state.cur_cred.password);
1592     destroy_malloced_string(&pvar->auth_state.cur_cred.rhosts_client_user);
1593     if (pvar->auth_state.cur_cred.key_pair != NULL) {
1594 maya 4307 key_free(pvar->auth_state.cur_cred.key_pair);
1595 maya 3227 pvar->auth_state.cur_cred.key_pair = NULL;
1596     }
1597     }
1598    
1599 maya 4307 static const char *get_auth_method_name(SSHAuthMethod auth)
1600 maya 3227 {
1601     switch (auth) {
1602     case SSH_AUTH_PASSWORD:
1603     return "password";
1604     case SSH_AUTH_RSA:
1605 maya 5550 return "publickey";
1606 maya 3227 case SSH_AUTH_PAGEANT:
1607 maya 5550 return "publickey";
1608 maya 3227 case SSH_AUTH_RHOSTS:
1609     return "rhosts";
1610     case SSH_AUTH_RHOSTS_RSA:
1611     return "rhosts with RSA";
1612     case SSH_AUTH_TIS:
1613     return "challenge/response (TIS)";
1614     default:
1615     return "unknown method";
1616     }
1617     }
1618    
1619 doda 6801 void AUTH_get_auth_info(PTInstVar pvar, char *dest, int len)
1620 maya 3227 {
1621 maya 4307 const char *method = "unknown";
1622 yutakapon 5545 char buf[256];
1623 maya 3227
1624     if (pvar->auth_state.user == NULL) {
1625     strncpy_s(dest, len, "None", _TRUNCATE);
1626     } else if (pvar->auth_state.cur_cred.method != SSH_AUTH_NONE) {
1627     if (SSHv1(pvar)) {
1628     UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1629 maya 5550 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
1630     pvar->auth_state.user,
1631 maya 3227 get_auth_method_name(pvar->auth_state.cur_cred.method));
1632    
1633 maya 5550 if (pvar->auth_state.cur_cred.method == SSH_AUTH_RSA) {
1634     UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO2", pvar, " with %s key");
1635     _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
1636     "RSA");
1637     strncat_s(dest, len, buf, _TRUNCATE);
1638     }
1639     else if (pvar->auth_state.cur_cred.method == SSH_AUTH_PAGEANT) {
1640     UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO3", pvar, " with %s key from Pageant");
1641     _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
1642     "RSA");
1643     strncat_s(dest, len, buf, _TRUNCATE);
1644     }
1645 maya 3227 } else {
1646     // SSH2:�F�����\�b�h������ (2004.12.23 yutaka)
1647     // keyboard-interactive���\�b�h������ (2005.3.12 yutaka)
1648     if (pvar->auth_state.cur_cred.method == SSH_AUTH_PASSWORD ||
1649     pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1650     // keyboard-interactive���\�b�h������ (2005.1.24 yutaka)
1651     if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) {
1652     method = "keyboard-interactive";
1653     } else {
1654     method = get_auth_method_name(pvar->auth_state.cur_cred.method);
1655     }
1656     UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1657 maya 5550 _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
1658     pvar->auth_state.user, method);
1659     }
1660     else if (pvar->auth_state.cur_cred.method == SSH_AUTH_RSA) {
1661     method = get_auth_method_name(pvar->auth_state.cur_cred.method);
1662     UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1663     _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
1664     pvar->auth_state.user,
1665     get_auth_method_name(pvar->auth_state.cur_cred.method));
1666 maya 3227
1667 maya 5550 UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO2", pvar, " with %s key");
1668     _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
1669     ssh_key_type(pvar->auth_state.cur_cred.key_pair->type));
1670     strncat_s(dest, len, buf, _TRUNCATE);
1671     }
1672     else if (pvar->auth_state.cur_cred.method == SSH_AUTH_PAGEANT) {
1673     int key_len = get_uint32_MSBfirst(pvar->pageant_curkey + 4);
1674     char *s = (char *)malloc(key_len+1);
1675 yutakapon 5545
1676 maya 5550 method = get_auth_method_name(pvar->auth_state.cur_cred.method);
1677     UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1678     _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg,
1679     pvar->auth_state.user,
1680     get_auth_method_name(pvar->auth_state.cur_cred.method));
1681 maya 3227
1682 maya 5550 memcpy(s, pvar->pageant_curkey+4+4, key_len);
1683     s[key_len] = '\0';
1684     UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO3", pvar, " with %s key from Pageant");
1685     _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg,
1686     ssh_key_type(get_keytype_from_name(s)));
1687     strncat_s(dest, len, buf, _TRUNCATE);
1688    
1689     free(s);
1690 maya 3227 }
1691     }
1692    
1693     } else {
1694     UTIL_get_lang_msg("DLG_ABOUT_AUTH_INFO", pvar, "User '%s', using %s");
1695     _snprintf_s(dest, len, _TRUNCATE, pvar->ts->UIMsg, pvar->auth_state.user,
1696     get_auth_method_name(pvar->auth_state.failed_method));
1697     }
1698    
1699     dest[len - 1] = 0;
1700     }
1701    
1702     void AUTH_notify_disconnecting(PTInstVar pvar)
1703     {
1704     if (pvar->auth_state.auth_dialog != NULL) {
1705     PostMessage(pvar->auth_state.auth_dialog, WM_COMMAND, IDCANCEL, 0);
1706     /* the main window might not go away if it's not enabled. (see vtwin.cpp) */
1707     EnableWindow(pvar->NotificationWindow, TRUE);
1708     }
1709     }
1710    
1711     void AUTH_end(PTInstVar pvar)
1712     {
1713     destroy_malloced_string(&pvar->auth_state.user);
1714     destroy_malloced_string(&pvar->auth_state.TIS_prompt);
1715    
1716     AUTH_destroy_cur_cred(pvar);
1717     }

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