Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.3221  
changed lines
  Added in v.3227

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