Develop and Download Open Source Software

Browse Subversion Repository

Diff of /branches/ssh_chacha20poly1305/ttssh2/ttxssh/ttxssh.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  /* Tera Term extension mechanism  /* Tera Term extension mechanism
30     Robert O'Callahan (roc+tt@cs.cmu.edu)     Robert O'Callahan (roc+tt@cs.cmu.edu)
31    
32     Tera Term by Takashi Teranishi (teranishi@rikaxp.riken.go.jp)     Tera Term by Takashi Teranishi (teranishi@rikaxp.riken.go.jp)
33  */  */
34    
35  #include "ttxssh.h"  #include "ttxssh.h"
36  #include "fwdui.h"  #include "fwdui.h"
37  #include "util.h"  #include "util.h"
38  #include "ssh.h"  #include "ssh.h"
39  #include "ttcommon.h"  #include "ttcommon.h"
40    
41  #include <stdlib.h>  #include <stdlib.h>
42  #include <stdio.h>  #include <stdio.h>
43  #include <string.h>  #include <string.h>
44  #include <io.h>  #include <io.h>
45  #include <fcntl.h>  #include <fcntl.h>
46  #include <sys/stat.h>  #include <sys/stat.h>
47  #include <time.h>  #include <time.h>
48    
49  #include "resource.h"  #include "resource.h"
50  #include <commctrl.h>  #include <commctrl.h>
51  #include <commdlg.h>  #include <commdlg.h>
52  #ifndef NO_INET6  #ifndef NO_INET6
53  #include <winsock2.h>  #include <winsock2.h>
54  static char FAR *ProtocolFamilyList[] = { "UNSPEC", "IPv6", "IPv4", NULL };  static char FAR *ProtocolFamilyList[] = { "UNSPEC", "IPv6", "IPv4", NULL };
55  #else  #else
56  #include <winsock.h>  #include <winsock.h>
57  #endif                                                  /* NO_INET6 */  #endif                                                  /* NO_INET6 */
58    
59  #include <Lmcons.h>  #include <Lmcons.h>
60    
61  // include OpenSSL header file  // include OpenSSL header file
62  #include <openssl/opensslv.h>  #include <openssl/opensslv.h>
63  #include <openssl/evp.h>  #include <openssl/evp.h>
64  #include <openssl/rsa.h>  #include <openssl/rsa.h>
65  #include <openssl/dsa.h>  #include <openssl/dsa.h>
66  #include <openssl/bn.h>  #include <openssl/bn.h>
67  #include <openssl/pem.h>  #include <openssl/pem.h>
68  #include <openssl/rand.h>  #include <openssl/rand.h>
69  #include <openssl/rc4.h>  #include <openssl/rc4.h>
70  #include <openssl/md5.h>  #include <openssl/md5.h>
71    
72  // include ZLib header file  // include ZLib header file
73  #include <zlib.h>  #include <zlib.h>
74    
75  #include "buffer.h"  #include "buffer.h"
76  #include "cipher.h"  #include "cipher.h"
77    
78  #include "sftp.h"  #include "sftp.h"
79    
80  #include "compat_w95.h"  #include "compat_w95.h"
81    
82  #define MATCH_STR(s, o) strncmp((s), (o), NUM_ELEM(o) - 1)  #define MATCH_STR(s, o) strncmp((s), (o), NUM_ELEM(o) - 1)
83  #define MATCH_STR_I(s, o) _strnicmp((s), (o), NUM_ELEM(o) - 1)  #define MATCH_STR_I(s, o) _strnicmp((s), (o), NUM_ELEM(o) - 1)
84    
85  /* This extension implements SSH, so we choose a load order in the  /* This extension implements SSH, so we choose a load order in the
86     "protocols" range. */     "protocols" range. */
87  #define ORDER 2500  #define ORDER 2500
88    
89  static HICON SecureLargeIcon = NULL;  static HICON SecureLargeIcon = NULL;
90  static HICON SecureSmallIcon = NULL;  static HICON SecureSmallIcon = NULL;
91    
92  static HFONT DlgHostFont;  static HFONT DlgHostFont;
93  static HFONT DlgAboutFont;  static HFONT DlgAboutFont;
94  static HFONT DlgSetupFont;  static HFONT DlgSetupFont;
95  static HFONT DlgKeygenFont;  static HFONT DlgKeygenFont;
96    
97  static TInstVar FAR *pvar;  static TInstVar FAR *pvar;
98    
99  typedef struct {  typedef struct {
100          int     cnt;          int     cnt;
101          HWND    dlg;          HWND    dlg;
102          enum hostkey_type type;          enum hostkey_type type;
103  } cbarg_t;  } cbarg_t;
104    
105    /* WIN32 allows multiple instances of a DLL */    /* WIN32 allows multiple instances of a DLL */
106  static TInstVar InstVar;  static TInstVar InstVar;
107    
108  /*  /*
109  This code makes lots of assumptions about the order in which Tera Term  This code makes lots of assumptions about the order in which Tera Term
110  does things, and how. A key assumption is that the Notification window  does things, and how. A key assumption is that the Notification window
111  passed into WSAAsyncSelect is the main terminal window. We also assume  passed into WSAAsyncSelect is the main terminal window. We also assume
112  that the socket used in the first WSAconnect is the main session socket.  that the socket used in the first WSAconnect is the main session socket.
113  */  */
114    
115  static void init_TTSSH(PTInstVar pvar)  static void init_TTSSH(PTInstVar pvar)
116  {  {
117          pvar->socket = INVALID_SOCKET;          pvar->socket = INVALID_SOCKET;
118          pvar->OldLargeIcon = NULL;          pvar->OldLargeIcon = NULL;
119          pvar->OldSmallIcon = NULL;          pvar->OldSmallIcon = NULL;
120          pvar->NotificationWindow = NULL;          pvar->NotificationWindow = NULL;
121          pvar->hostdlg_activated = FALSE;          pvar->hostdlg_activated = FALSE;
122          pvar->socket = INVALID_SOCKET;          pvar->socket = INVALID_SOCKET;
123          pvar->NotificationWindow = NULL;          pvar->NotificationWindow = NULL;
124          pvar->protocol_major = 0;          pvar->protocol_major = 0;
125          pvar->protocol_minor = 0;          pvar->protocol_minor = 0;
126    
127          PKT_init(pvar);          PKT_init(pvar);
128          SSH_init(pvar);          SSH_init(pvar);
129          CRYPT_init(pvar);          CRYPT_init(pvar);
130          AUTH_init(pvar);          AUTH_init(pvar);
131          HOSTS_init(pvar);          HOSTS_init(pvar);
132          FWD_init(pvar);          FWD_init(pvar);
133          FWDUI_init(pvar);          FWDUI_init(pvar);
134    
135          ssh_heartbeat_lock_initialize();          ssh_heartbeat_lock_initialize();
136  }  }
137    
138  static void uninit_TTSSH(PTInstVar pvar)  static void uninit_TTSSH(PTInstVar pvar)
139  {  {
140          halt_ssh_heartbeat_thread(pvar);          halt_ssh_heartbeat_thread(pvar);
141    
142          ssh2_channel_free();          ssh2_channel_free();
143    
144          SSH_end(pvar);          SSH_end(pvar);
145          PKT_end(pvar);          PKT_end(pvar);
146          AUTH_end(pvar);          AUTH_end(pvar);
147          CRYPT_end(pvar);          CRYPT_end(pvar);
148          HOSTS_end(pvar);          HOSTS_end(pvar);
149          FWD_end(pvar);          FWD_end(pvar);
150          FWDUI_end(pvar);          FWDUI_end(pvar);
151    
152          if (pvar->OldLargeIcon != NULL) {          if (pvar->OldLargeIcon != NULL) {
153                  PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_BIG,                  PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_BIG,
154                              (LPARAM) pvar->OldLargeIcon);                              (LPARAM) pvar->OldLargeIcon);
155                  pvar->OldLargeIcon = NULL;                  pvar->OldLargeIcon = NULL;
156          }          }
157          if (pvar->OldSmallIcon != NULL) {          if (pvar->OldSmallIcon != NULL) {
158                  PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_SMALL,                  PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_SMALL,
159                              (LPARAM) pvar->OldSmallIcon);                              (LPARAM) pvar->OldSmallIcon);
160                  pvar->OldSmallIcon = NULL;                  pvar->OldSmallIcon = NULL;
161          }          }
162    
163          ssh_heartbeat_lock_finalize();          ssh_heartbeat_lock_finalize();
164  }  }
165    
166  static void PASCAL FAR TTXInit(PTTSet ts, PComVar cv)  static void PASCAL FAR TTXInit(PTTSet ts, PComVar cv)
167  {  {
168          pvar->settings = *pvar->ts_SSH;          pvar->settings = *pvar->ts_SSH;
169          pvar->ts = ts;          pvar->ts = ts;
170          pvar->cv = cv;          pvar->cv = cv;
171          pvar->fatal_error = FALSE;          pvar->fatal_error = FALSE;
172          pvar->showing_err = FALSE;          pvar->showing_err = FALSE;
173          pvar->err_msg = NULL;          pvar->err_msg = NULL;
174    
175          init_TTSSH(pvar);          init_TTSSH(pvar);
176  }  }
177    
178  /*  /*
179   * Remove unsupported cipher or duplicated cipher.   * Remove unsupported cipher or duplicated cipher.
180   * Add unspecified ciphers at the end of list.   * Add unspecified ciphers at the end of list.
181   */   */
182  static void normalize_cipher_order(char FAR * buf)  static void normalize_cipher_order(char FAR * buf)
183  {  {
184          char ciphers_listed[SSH_CIPHER_MAX + 1];          char ciphers_listed[SSH_CIPHER_MAX + 1];
185          char ciphers_allowed[SSH_CIPHER_MAX + 1];          char ciphers_allowed[SSH_CIPHER_MAX + 1];
186          int i, j;          int i, j;
187    
188          /* SSH_CIPHER_NONE means that all ciphers below that one are disabled.          /* SSH_CIPHER_NONE means that all ciphers below that one are disabled.
189             We *never* allow no encryption. */             We *never* allow no encryption. */
190  #if 0  #if 0
191          static char default_ciphers[] = {          static char default_ciphers[] = {
192                  SSH_CIPHER_3DES,                  SSH_CIPHER_3DES,
193                  SSH_CIPHER_NONE,                  SSH_CIPHER_NONE,
194                  SSH_CIPHER_DES, SSH_CIPHER_BLOWFISH                  SSH_CIPHER_DES, SSH_CIPHER_BLOWFISH
195          };          };
196  #else  #else
197          // for SSH2(yutaka)          // for SSH2(yutaka)
198          static char default_ciphers[] = {          static char default_ciphers[] = {
199                  SSH2_CIPHER_AES256_CTR,                  SSH2_CIPHER_AES256_CTR,
200                  SSH2_CIPHER_AES256_CBC,                  SSH2_CIPHER_AES256_CBC,
201                  SSH2_CIPHER_AES192_CTR,                  SSH2_CIPHER_AES192_CTR,
202                  SSH2_CIPHER_AES192_CBC,                  SSH2_CIPHER_AES192_CBC,
203                  SSH2_CIPHER_AES128_CTR,                  SSH2_CIPHER_AES128_CTR,
204                  SSH2_CIPHER_AES128_CBC,                  SSH2_CIPHER_AES128_CBC,
205                  SSH2_CIPHER_3DES_CBC,                  SSH2_CIPHER_3DES_CBC,
206                  SSH2_CIPHER_BLOWFISH_CBC,                  SSH2_CIPHER_BLOWFISH_CBC,
207                  SSH2_CIPHER_ARCFOUR256,                  SSH2_CIPHER_ARCFOUR256,
208                  SSH2_CIPHER_ARCFOUR128,                  SSH2_CIPHER_ARCFOUR128,
209                  SSH2_CIPHER_ARCFOUR,                  SSH2_CIPHER_ARCFOUR,
210                  SSH2_CIPHER_CAST128_CBC,                  SSH2_CIPHER_CAST128_CBC,
211                  SSH_CIPHER_3DES,                  SSH_CIPHER_3DES,
212                  SSH_CIPHER_NONE,                  SSH_CIPHER_NONE,
213                  SSH_CIPHER_DES,                  SSH_CIPHER_DES,
214                  SSH_CIPHER_BLOWFISH                  SSH_CIPHER_BLOWFISH
215          };          };
216  #endif  #endif
217    
218          memset(ciphers_listed, 0, sizeof(ciphers_listed));          memset(ciphers_listed, 0, sizeof(ciphers_listed));
219    
220          memset(ciphers_allowed, 0, sizeof(ciphers_allowed));          memset(ciphers_allowed, 0, sizeof(ciphers_allowed));
221          for (i = 0; i < NUM_ELEM(default_ciphers); i++) {          for (i = 0; i < NUM_ELEM(default_ciphers); i++) {
222                  ciphers_allowed[default_ciphers[i]] = 1;                  ciphers_allowed[default_ciphers[i]] = 1;
223          }          }
224    
225          for (i = 0; buf[i] != 0; i++) {          for (i = 0; buf[i] != 0; i++) {
226                  int cipher_num = buf[i] - '0';                  int cipher_num = buf[i] - '0';
227    
228                  if (cipher_num < 0 || cipher_num > SSH_CIPHER_MAX                  if (cipher_num < 0 || cipher_num > SSH_CIPHER_MAX
229                          || !ciphers_allowed[cipher_num]                          || !ciphers_allowed[cipher_num]
230                          || ciphers_listed[cipher_num]) {                          || ciphers_listed[cipher_num]) {
231                          memmove(buf + i, buf + i + 1, strlen(buf + i + 1) + 1);                          memmove(buf + i, buf + i + 1, strlen(buf + i + 1) + 1);
232                          i--;                          i--;
233                  } else {                  } else {
234                          ciphers_listed[cipher_num] = 1;                          ciphers_listed[cipher_num] = 1;
235                  }                  }
236          }          }
237    
238          for (j = 0; j < NUM_ELEM(default_ciphers); j++) {          for (j = 0; j < NUM_ELEM(default_ciphers); j++) {
239                  int cipher_num = default_ciphers[j];                  int cipher_num = default_ciphers[j];
240    
241                  if (!ciphers_listed[cipher_num]) {                  if (!ciphers_listed[cipher_num]) {
242                          buf[i] = cipher_num + '0';                          buf[i] = cipher_num + '0';
243                          i++;                          i++;
244                  }                  }
245          }          }
246    
247          buf[i] = 0;          buf[i] = 0;
248  }  }
249    
250  /* Remove local settings from the shared memory block. */  /* Remove local settings from the shared memory block. */
251  static void clear_local_settings(PTInstVar pvar)  static void clear_local_settings(PTInstVar pvar)
252  {  {
253          pvar->ts_SSH->TryDefaultAuth = FALSE;          pvar->ts_SSH->TryDefaultAuth = FALSE;
254  }  }
255    
256  static BOOL read_BOOL_option(PCHAR fileName, char FAR * keyName, BOOL def)  static BOOL read_BOOL_option(PCHAR fileName, char FAR * keyName, BOOL def)
257  {  {
258          char buf[1024];          char buf[1024];
259    
260          buf[0] = 0;          buf[0] = 0;
261          GetPrivateProfileString("TTSSH", keyName, "", buf, sizeof(buf),          GetPrivateProfileString("TTSSH", keyName, "", buf, sizeof(buf),
262                                  fileName);                                  fileName);
263          if (buf[0] == 0) {          if (buf[0] == 0) {
264                  return def;                  return def;
265          } else {          } else {
266                  return atoi(buf) != 0 ||                  return atoi(buf) != 0 ||
267                         _stricmp(buf, "yes") == 0 ||                         _stricmp(buf, "yes") == 0 ||
268                         _stricmp(buf, "y") == 0;                         _stricmp(buf, "y") == 0;
269          }          }
270  }  }
271    
272  static void read_string_option(PCHAR fileName, char FAR * keyName,  static void read_string_option(PCHAR fileName, char FAR * keyName,
273                                 char FAR * def, char FAR * buf, int bufSize)                                 char FAR * def, char FAR * buf, int bufSize)
274  {  {
275    
276          buf[0] = 0;          buf[0] = 0;
277          GetPrivateProfileString("TTSSH", keyName, def, buf, bufSize, fileName);          GetPrivateProfileString("TTSSH", keyName, def, buf, bufSize, fileName);
278  }  }
279    
280  static void read_ssh_options(PTInstVar pvar, PCHAR fileName)  static void read_ssh_options(PTInstVar pvar, PCHAR fileName)
281  {  {
282          char buf[1024];          char buf[1024];
283          TS_SSH FAR *settings = pvar->ts_SSH;          TS_SSH FAR *settings = pvar->ts_SSH;
284    
285  #define READ_STD_STRING_OPTION(name) \  #define READ_STD_STRING_OPTION(name) \
286          read_string_option(fileName, #name, "", settings->name, sizeof(settings->name))          read_string_option(fileName, #name, "", settings->name, sizeof(settings->name))
287    
288          settings->Enabled = read_BOOL_option(fileName, "Enabled", FALSE);          settings->Enabled = read_BOOL_option(fileName, "Enabled", FALSE);
289    
290          buf[0] = 0;          buf[0] = 0;
291          GetPrivateProfileString("TTSSH", "Compression", "", buf, sizeof(buf),          GetPrivateProfileString("TTSSH", "Compression", "", buf, sizeof(buf),
292                                  fileName);                                  fileName);
293          settings->CompressionLevel = atoi(buf);          settings->CompressionLevel = atoi(buf);
294          if (settings->CompressionLevel < 0 || settings->CompressionLevel > 9) {          if (settings->CompressionLevel < 0 || settings->CompressionLevel > 9) {
295                  settings->CompressionLevel = 0;                  settings->CompressionLevel = 0;
296          }          }
297    
298          READ_STD_STRING_OPTION(DefaultUserName);          READ_STD_STRING_OPTION(DefaultUserName);
299          READ_STD_STRING_OPTION(DefaultForwarding);          READ_STD_STRING_OPTION(DefaultForwarding);
300          READ_STD_STRING_OPTION(DefaultRhostsLocalUserName);          READ_STD_STRING_OPTION(DefaultRhostsLocalUserName);
301          READ_STD_STRING_OPTION(DefaultRhostsHostPrivateKeyFile);          READ_STD_STRING_OPTION(DefaultRhostsHostPrivateKeyFile);
302          READ_STD_STRING_OPTION(DefaultRSAPrivateKeyFile);          READ_STD_STRING_OPTION(DefaultRSAPrivateKeyFile);
303    
304          READ_STD_STRING_OPTION(CipherOrder);          READ_STD_STRING_OPTION(CipherOrder);
305          normalize_cipher_order(settings->CipherOrder);          normalize_cipher_order(settings->CipherOrder);
306    
307          read_string_option(fileName, "KnownHostsFiles", "ssh_known_hosts",          read_string_option(fileName, "KnownHostsFiles", "ssh_known_hosts",
308                             settings->KnownHostsFiles,                             settings->KnownHostsFiles,
309                             sizeof(settings->KnownHostsFiles));                             sizeof(settings->KnownHostsFiles));
310    
311          buf[0] = 0;          buf[0] = 0;
312          GetPrivateProfileString("TTSSH", "DefaultAuthMethod", "", buf,          GetPrivateProfileString("TTSSH", "DefaultAuthMethod", "", buf,
313                                  sizeof(buf), fileName);                                  sizeof(buf), fileName);
314          settings->DefaultAuthMethod = atoi(buf);          settings->DefaultAuthMethod = atoi(buf);
315          if (settings->DefaultAuthMethod != SSH_AUTH_PASSWORD          if (settings->DefaultAuthMethod != SSH_AUTH_PASSWORD
316           && settings->DefaultAuthMethod != SSH_AUTH_RSA           && settings->DefaultAuthMethod != SSH_AUTH_RSA
317           && settings->DefaultAuthMethod != SSH_AUTH_TIS  // add (2005.3.12 yutaka)           && settings->DefaultAuthMethod != SSH_AUTH_TIS  // add (2005.3.12 yutaka)
318           && settings->DefaultAuthMethod != SSH_AUTH_RHOSTS           && settings->DefaultAuthMethod != SSH_AUTH_RHOSTS
319           && settings->DefaultAuthMethod != SSH_AUTH_PAGEANT) {           && settings->DefaultAuthMethod != SSH_AUTH_PAGEANT) {
320                  /* this default can never be SSH_AUTH_RHOSTS_RSA because that is not a                  /* this default can never be SSH_AUTH_RHOSTS_RSA because that is not a
321                     selection in the dialog box; SSH_AUTH_RHOSTS_RSA is automatically chosen                     selection in the dialog box; SSH_AUTH_RHOSTS_RSA is automatically chosen
322                     when the dialog box has rhosts selected and an host private key file                     when the dialog box has rhosts selected and an host private key file
323                     is supplied. */                     is supplied. */
324                  settings->DefaultAuthMethod = SSH_AUTH_PASSWORD;                  settings->DefaultAuthMethod = SSH_AUTH_PASSWORD;
325          }          }
326    
327          buf[0] = 0;          buf[0] = 0;
328          GetPrivateProfileString("TTSSH", "LogLevel", "", buf, sizeof(buf),          GetPrivateProfileString("TTSSH", "LogLevel", "", buf, sizeof(buf),
329                                  fileName);                                  fileName);
330          settings->LogLevel = atoi(buf);          settings->LogLevel = atoi(buf);
331    
332          buf[0] = 0;          buf[0] = 0;
333          GetPrivateProfileString("TTSSH", "WriteBufferSize", "", buf,          GetPrivateProfileString("TTSSH", "WriteBufferSize", "", buf,
334                                  sizeof(buf), fileName);                                  sizeof(buf), fileName);
335          settings->WriteBufferSize = atoi(buf);          settings->WriteBufferSize = atoi(buf);
336          if (settings->WriteBufferSize <= 0) {          if (settings->WriteBufferSize <= 0) {
337                  settings->WriteBufferSize = (PACKET_MAX_SIZE / 2);   // 2MB                  settings->WriteBufferSize = (PACKET_MAX_SIZE / 2);   // 2MB
338          }          }
339    
340          settings->LocalForwardingIdentityCheck =          settings->LocalForwardingIdentityCheck =
341                  read_BOOL_option(fileName, "LocalForwardingIdentityCheck", TRUE);                  read_BOOL_option(fileName, "LocalForwardingIdentityCheck", TRUE);
342    
343          // SSH protocol version (2004.10.11 yutaka)          // SSH protocol version (2004.10.11 yutaka)
344          // default is SSH2 (2004.11.30 yutaka)          // default is SSH2 (2004.11.30 yutaka)
345          settings->ssh_protocol_version = GetPrivateProfileInt("TTSSH", "ProtocolVersion", 2, fileName);          settings->ssh_protocol_version = GetPrivateProfileInt("TTSSH", "ProtocolVersion", 2, fileName);
346    
347          // SSH heartbeat time(second) (2004.12.11 yutaka)          // SSH heartbeat time(second) (2004.12.11 yutaka)
348          settings->ssh_heartbeat_overtime = GetPrivateProfileInt("TTSSH", "HeartBeat", 60, fileName);          settings->ssh_heartbeat_overtime = GetPrivateProfileInt("TTSSH", "HeartBeat", 60, fileName);
349    
350          // パスワード認証および公開鍵認証に使うパスワードをメモリ上に保持しておくかどうかを          // パスワード認証および公開鍵認証に使うパスワードをメモリ上に保持しておくかどうかを
351          // 表す。(2006.8.5 yutaka)          // 表す。(2006.8.5 yutaka)
352          settings->remember_password = GetPrivateProfileInt("TTSSH", "RememberPassword", 1, fileName);          settings->remember_password = GetPrivateProfileInt("TTSSH", "RememberPassword", 1, fileName);
353    
354          // 初回の認証ダイアログでサポートされているメソッドをチェックし、          // 初回の認証ダイアログでサポートされているメソッドをチェックし、
355          // 無効なメソッドをグレイアウトする (2007.9.24 maya)          // 無効なメソッドをグレイアウトする (2007.9.24 maya)
356          settings->CheckAuthListFirst = read_BOOL_option(fileName, "CheckAuthListFirst", FALSE);          settings->CheckAuthListFirst = read_BOOL_option(fileName, "CheckAuthListFirst", FALSE);
357    
358          // 768bit 未満の RSA 鍵を持つサーバへの接続を有効にする (2008.9.11 maya)          // 768bit 未満の RSA 鍵を持つサーバへの接続を有効にする (2008.9.11 maya)
359          settings->EnableRsaShortKeyServer = read_BOOL_option(fileName, "EnableRsaShortKeyServer", FALSE);          settings->EnableRsaShortKeyServer = read_BOOL_option(fileName, "EnableRsaShortKeyServer", FALSE);
360    
361          // agent forward を有効にする (2008.11.25 maya)          // agent forward を有効にする (2008.11.25 maya)
362          settings->ForwardAgent = read_BOOL_option(fileName, "ForwardAgent", FALSE);          settings->ForwardAgent = read_BOOL_option(fileName, "ForwardAgent", FALSE);
363    
364          clear_local_settings(pvar);          clear_local_settings(pvar);
365  }  }
366    
367  static void write_ssh_options(PTInstVar pvar, PCHAR fileName,  static void write_ssh_options(PTInstVar pvar, PCHAR fileName,
368                                                            TS_SSH FAR * settings, BOOL copy_forward)                                                            TS_SSH FAR * settings, BOOL copy_forward)
369  {  {
370          char buf[1024];          char buf[1024];
371    
372          WritePrivateProfileString("TTSSH", "Enabled",          WritePrivateProfileString("TTSSH", "Enabled",
373                                    settings->Enabled ? "1" : "0", fileName);                                    settings->Enabled ? "1" : "0", fileName);
374    
375          _itoa(settings->CompressionLevel, buf, 10);          _itoa(settings->CompressionLevel, buf, 10);
376          WritePrivateProfileString("TTSSH", "Compression", buf, fileName);          WritePrivateProfileString("TTSSH", "Compression", buf, fileName);
377    
378          WritePrivateProfileString("TTSSH", "DefaultUserName",          WritePrivateProfileString("TTSSH", "DefaultUserName",
379                                    settings->DefaultUserName, fileName);                                    settings->DefaultUserName, fileName);
380    
381          if (copy_forward) {          if (copy_forward) {
382                  WritePrivateProfileString("TTSSH", "DefaultForwarding",                  WritePrivateProfileString("TTSSH", "DefaultForwarding",
383                                            settings->DefaultForwarding, fileName);                                            settings->DefaultForwarding, fileName);
384          }          }
385    
386          WritePrivateProfileString("TTSSH", "CipherOrder",          WritePrivateProfileString("TTSSH", "CipherOrder",
387                                    settings->CipherOrder, fileName);                                    settings->CipherOrder, fileName);
388    
389          WritePrivateProfileString("TTSSH", "KnownHostsFiles",          WritePrivateProfileString("TTSSH", "KnownHostsFiles",
390                                    settings->KnownHostsFiles, fileName);                                    settings->KnownHostsFiles, fileName);
391    
392          WritePrivateProfileString("TTSSH", "DefaultRhostsLocalUserName",          WritePrivateProfileString("TTSSH", "DefaultRhostsLocalUserName",
393                                    settings->DefaultRhostsLocalUserName,                                    settings->DefaultRhostsLocalUserName,
394                                    fileName);                                    fileName);
395    
396          WritePrivateProfileString("TTSSH", "DefaultRhostsHostPrivateKeyFile",          WritePrivateProfileString("TTSSH", "DefaultRhostsHostPrivateKeyFile",
397                                    settings->DefaultRhostsHostPrivateKeyFile,                                    settings->DefaultRhostsHostPrivateKeyFile,
398                                    fileName);                                    fileName);
399    
400          WritePrivateProfileString("TTSSH", "DefaultRSAPrivateKeyFile",          WritePrivateProfileString("TTSSH", "DefaultRSAPrivateKeyFile",
401                                    settings->DefaultRSAPrivateKeyFile,                                    settings->DefaultRSAPrivateKeyFile,
402                                    fileName);                                    fileName);
403    
404          _itoa(settings->DefaultAuthMethod, buf, 10);          _itoa(settings->DefaultAuthMethod, buf, 10);
405          WritePrivateProfileString("TTSSH", "DefaultAuthMethod", buf, fileName);          WritePrivateProfileString("TTSSH", "DefaultAuthMethod", buf, fileName);
406    
407          _itoa(settings->LogLevel, buf, 10);          _itoa(settings->LogLevel, buf, 10);
408          WritePrivateProfileString("TTSSH", "LogLevel", buf, fileName);          WritePrivateProfileString("TTSSH", "LogLevel", buf, fileName);
409    
410          _itoa(settings->WriteBufferSize, buf, 10);          _itoa(settings->WriteBufferSize, buf, 10);
411          WritePrivateProfileString("TTSSH", "WriteBufferSize", buf, fileName);          WritePrivateProfileString("TTSSH", "WriteBufferSize", buf, fileName);
412    
413          WritePrivateProfileString("TTSSH", "LocalForwardingIdentityCheck",          WritePrivateProfileString("TTSSH", "LocalForwardingIdentityCheck",
414                                    settings->LocalForwardingIdentityCheck ? "1" : "0",                                    settings->LocalForwardingIdentityCheck ? "1" : "0",
415                                    fileName);                                    fileName);
416    
417          // SSH protocol version (2004.10.11 yutaka)          // SSH protocol version (2004.10.11 yutaka)
418          WritePrivateProfileString("TTSSH", "ProtocolVersion",          WritePrivateProfileString("TTSSH", "ProtocolVersion",
419              settings->ssh_protocol_version==2 ? "2" : "1",              settings->ssh_protocol_version==2 ? "2" : "1",
420              fileName);              fileName);
421    
422          // SSH heartbeat time(second) (2004.12.11 yutaka)          // SSH heartbeat time(second) (2004.12.11 yutaka)
423          _snprintf_s(buf, sizeof(buf), _TRUNCATE,          _snprintf_s(buf, sizeof(buf), _TRUNCATE,
424                      "%d", settings->ssh_heartbeat_overtime);                      "%d", settings->ssh_heartbeat_overtime);
425          WritePrivateProfileString("TTSSH", "HeartBeat", buf, fileName);          WritePrivateProfileString("TTSSH", "HeartBeat", buf, fileName);
426    
427          // Remember password (2006.8.5 yutaka)          // Remember password (2006.8.5 yutaka)
428          WritePrivateProfileString("TTSSH", "RememberPassword",          WritePrivateProfileString("TTSSH", "RememberPassword",
429              settings->remember_password ? "1" : "0",              settings->remember_password ? "1" : "0",
430              fileName);              fileName);
431    
432          // 初回の認証ダイアログでサポートされているメソッドをチェックし、          // 初回の認証ダイアログでサポートされているメソッドをチェックし、
433          // 無効なメソッドをグレイアウトする (2007.9.24 maya)          // 無効なメソッドをグレイアウトする (2007.9.24 maya)
434          WritePrivateProfileString("TTSSH", "CheckAuthListFirst",          WritePrivateProfileString("TTSSH", "CheckAuthListFirst",
435                                    settings->CheckAuthListFirst ? "1" : "0", fileName);                                    settings->CheckAuthListFirst ? "1" : "0", fileName);
436    
437          // 768bit 未満の RSA 鍵を持つサーバへの接続を有効にする (2008.9.11 maya)          // 768bit 未満の RSA 鍵を持つサーバへの接続を有効にする (2008.9.11 maya)
438          WritePrivateProfileString("TTSSH", "EnableRsaShortKeyServer",          WritePrivateProfileString("TTSSH", "EnableRsaShortKeyServer",
439                                    settings->EnableRsaShortKeyServer ? "1" : "0", fileName);                                    settings->EnableRsaShortKeyServer ? "1" : "0", fileName);
440    
441          // agent forward を有効にする (2008.11.25 maya)          // agent forward を有効にする (2008.11.25 maya)
442          WritePrivateProfileString("TTSSH", "ForwardAgent",          WritePrivateProfileString("TTSSH", "ForwardAgent",
443                                    settings->ForwardAgent ? "1" : "0", fileName);                                    settings->ForwardAgent ? "1" : "0", fileName);
444  }  }
445    
446    
447  /* find free port in all protocol family */  /* find free port in all protocol family */
448  static unsigned short find_local_port(PTInstVar pvar)  static unsigned short find_local_port(PTInstVar pvar)
449  {  {
450          int tries;          int tries;
451  #ifndef NO_INET6  #ifndef NO_INET6
452          SOCKET connecter;          SOCKET connecter;
453          struct addrinfo hints;          struct addrinfo hints;
454          struct addrinfo FAR *res;          struct addrinfo FAR *res;
455          struct addrinfo FAR *res0;          struct addrinfo FAR *res0;
456          unsigned short port;          unsigned short port;
457          char pname[NI_MAXHOST];          char pname[NI_MAXHOST];
458  #endif                                                  /* NO_INET6 */  #endif                                                  /* NO_INET6 */
459    
460          if (pvar->session_settings.DefaultAuthMethod != SSH_AUTH_RHOSTS) {          if (pvar->session_settings.DefaultAuthMethod != SSH_AUTH_RHOSTS) {
461                  return 0;                  return 0;
462          }          }
463    
464          /* The random numbers here are only used to try to get fresh          /* The random numbers here are only used to try to get fresh
465             ports across runs (dangling ports can cause bind errors             ports across runs (dangling ports can cause bind errors
466             if we're unlucky). They do not need to be (and are not)             if we're unlucky). They do not need to be (and are not)
467             cryptographically strong.             cryptographically strong.
468           */           */
469          srand((unsigned) GetTickCount());          srand((unsigned) GetTickCount());
470    
471  #ifndef NO_INET6  #ifndef NO_INET6
472          for (tries = 20; tries > 0; tries--) {          for (tries = 20; tries > 0; tries--) {
473                  memset(&hints, 0, sizeof(hints));                  memset(&hints, 0, sizeof(hints));
474                  hints.ai_family = pvar->ts->ProtocolFamily;                  hints.ai_family = pvar->ts->ProtocolFamily;
475                  hints.ai_flags = AI_PASSIVE;                  hints.ai_flags = AI_PASSIVE;
476                  hints.ai_socktype = SOCK_STREAM;                  hints.ai_socktype = SOCK_STREAM;
477                  port = (unsigned) rand() % 512 + 512;                  port = (unsigned) rand() % 512 + 512;
478                  _snprintf_s(pname, sizeof(pname), _TRUNCATE, "%d", (int) port);                  _snprintf_s(pname, sizeof(pname), _TRUNCATE, "%d", (int) port);
479                  if (getaddrinfo(NULL, pname, &hints, &res0)) {                  if (getaddrinfo(NULL, pname, &hints, &res0)) {
480                          return 0;                          return 0;
481                          /* NOT REACHED */                          /* NOT REACHED */
482                  }                  }
483    
484                  for (res = res0; res; res = res->ai_next) {                  for (res = res0; res; res = res->ai_next) {
485                          if (res->ai_family == AF_INET || res->ai_family == AF_INET6)                          if (res->ai_family == AF_INET || res->ai_family == AF_INET6)
486                                  continue;                                  continue;
487    
488                          connecter =                          connecter =
489                                  socket(res->ai_family, res->ai_socktype, res->ai_protocol);                                  socket(res->ai_family, res->ai_socktype, res->ai_protocol);
490                          if (connecter == INVALID_SOCKET) {                          if (connecter == INVALID_SOCKET) {
491                                  freeaddrinfo(res0);                                  freeaddrinfo(res0);
492                                  return 0;                                  return 0;
493                          }                          }
494    
495                          if (bind(connecter, res->ai_addr, res->ai_addrlen) !=                          if (bind(connecter, res->ai_addr, res->ai_addrlen) !=
496                              SOCKET_ERROR) {                              SOCKET_ERROR) {
497                                  return port;                                  return port;
498                                  freeaddrinfo(res0);                                  freeaddrinfo(res0);
499                                  closesocket(connecter);                                  closesocket(connecter);
500                          } else if (WSAGetLastError() != WSAEADDRINUSE) {                          } else if (WSAGetLastError() != WSAEADDRINUSE) {
501                                  closesocket(connecter);                                  closesocket(connecter);
502                                  freeaddrinfo(res0);                                  freeaddrinfo(res0);
503                                  return 0;                                  return 0;
504                          }                          }
505    
506                          closesocket(connecter);                          closesocket(connecter);
507                  }                  }
508                  freeaddrinfo(res0);                  freeaddrinfo(res0);
509          }          }
510    
511          return 0;          return 0;
512  #else  #else
513          for (tries = 20; tries > 0; tries--) {          for (tries = 20; tries > 0; tries--) {
514                  SOCKET connecter = socket(AF_INET, SOCK_STREAM, 0);                  SOCKET connecter = socket(AF_INET, SOCK_STREAM, 0);
515                  struct sockaddr_in connecter_addr;                  struct sockaddr_in connecter_addr;
516    
517                  connecter_addr.sin_family = AF_INET;                  connecter_addr.sin_family = AF_INET;
518                  connecter_addr.sin_port = (unsigned) rand() % 512 + 512;                  connecter_addr.sin_port = (unsigned) rand() % 512 + 512;
519                  connecter_addr.sin_addr.s_addr = htonl(INADDR_ANY);                  connecter_addr.sin_addr.s_addr = htonl(INADDR_ANY);
520    
521                  if (connecter == INVALID_SOCKET) {                  if (connecter == INVALID_SOCKET) {
522                          return 0;                          return 0;
523                  }                  }
524    
525                  if (bind                  if (bind
526                      (connecter, (struct sockaddr FAR *) &connecter_addr,                      (connecter, (struct sockaddr FAR *) &connecter_addr,
527                       sizeof(connecter_addr)) != SOCKET_ERROR) {                       sizeof(connecter_addr)) != SOCKET_ERROR) {
528                      closesocket(connecter);                      closesocket(connecter);
529                          return connecter_addr.sin_port;                          return connecter_addr.sin_port;
530                  } else if (WSAGetLastError() != WSAEADDRINUSE) {                  } else if (WSAGetLastError() != WSAEADDRINUSE) {
531                          closesocket(connecter);                          closesocket(connecter);
532                          return 0;                          return 0;
533                  }                  }
534    
535                  closesocket(connecter);                  closesocket(connecter);
536          }          }
537    
538          return 0;          return 0;
539  #endif                                                  /* NO_INET6 */  #endif                                                  /* NO_INET6 */
540  }  }
541    
542  static int PASCAL FAR TTXconnect(SOCKET s,  static int PASCAL FAR TTXconnect(SOCKET s,
543                                   const struct sockaddr FAR * name,                                   const struct sockaddr FAR * name,
544                                   int namelen)                                   int namelen)
545  {  {
546  #ifndef NO_INET6  #ifndef NO_INET6
547          if (pvar->socket == INVALID_SOCKET) {          if (pvar->socket == INVALID_SOCKET) {
548                  struct sockaddr_storage ss;                  struct sockaddr_storage ss;
549                  int len;                  int len;
550    
551                  pvar->socket = s;                  pvar->socket = s;
552    
553                  memset(&ss, 0, sizeof(ss));                  memset(&ss, 0, sizeof(ss));
554                  switch (pvar->ts->ProtocolFamily) {                  switch (pvar->ts->ProtocolFamily) {
555                  case AF_INET:                  case AF_INET:
556                          len = sizeof(struct sockaddr_in);                          len = sizeof(struct sockaddr_in);
557                          ((struct sockaddr_in FAR *) &ss)->sin_family = AF_INET;                          ((struct sockaddr_in FAR *) &ss)->sin_family = AF_INET;
558                          ((struct sockaddr_in FAR *) &ss)->sin_addr.s_addr = INADDR_ANY;                          ((struct sockaddr_in FAR *) &ss)->sin_addr.s_addr = INADDR_ANY;
559                          ((struct sockaddr_in FAR *) &ss)->sin_port =                          ((struct sockaddr_in FAR *) &ss)->sin_port =
560                                  htons(find_local_port(pvar));                                  htons(find_local_port(pvar));
561                          break;                          break;
562                  case AF_INET6:                  case AF_INET6:
563                          len = sizeof(struct sockaddr_in6);                          len = sizeof(struct sockaddr_in6);
564                          ((struct sockaddr_in6 FAR *) &ss)->sin6_family = AF_INET6;                          ((struct sockaddr_in6 FAR *) &ss)->sin6_family = AF_INET6;
565  #if 0                                                   /* symbol "in6addr_any" is not included in wsock32.lib */  #if 0                                                   /* symbol "in6addr_any" is not included in wsock32.lib */
566                          /* if wsock32.lib will be linked, we can't refer "in6addr_any" */                          /* if wsock32.lib will be linked, we can't refer "in6addr_any" */
567                          ((struct sockaddr_in6 FAR *) &ss)->sin6_addr = in6addr_any;                          ((struct sockaddr_in6 FAR *) &ss)->sin6_addr = in6addr_any;
568  #else  #else
569                          memset(&((struct sockaddr_in6 FAR *) &ss)->sin6_addr, 0,                          memset(&((struct sockaddr_in6 FAR *) &ss)->sin6_addr, 0,
570                                 sizeof(struct in_addr6));                                 sizeof(struct in_addr6));
571  #endif                                                  /* 0 */  #endif                                                  /* 0 */
572                          ((struct sockaddr_in6 FAR *) &ss)->sin6_port =                          ((struct sockaddr_in6 FAR *) &ss)->sin6_port =
573                                  htons(find_local_port(pvar));                                  htons(find_local_port(pvar));
574                          break;                          break;
575                  default:                  default:
576                          /* NOT REACHED */                          /* NOT REACHED */
577                          break;                          break;
578                  }                  }
579    
580                  bind(s, (struct sockaddr FAR *) &ss, len);                  bind(s, (struct sockaddr FAR *) &ss, len);
581          }          }
582  #else  #else
583          if (pvar->socket == INVALID_SOCKET) {          if (pvar->socket == INVALID_SOCKET) {
584                  struct sockaddr_in addr;                  struct sockaddr_in addr;
585    
586                  pvar->socket = s;                  pvar->socket = s;
587    
588                  addr.sin_family = AF_INET;                  addr.sin_family = AF_INET;
589                  addr.sin_port = htons(find_local_port(pvar));                  addr.sin_port = htons(find_local_port(pvar));
590                  addr.sin_addr.s_addr = INADDR_ANY;                  addr.sin_addr.s_addr = INADDR_ANY;
591                  memset(addr.sin_zero, 0, sizeof(addr.sin_zero));                  memset(addr.sin_zero, 0, sizeof(addr.sin_zero));
592    
593                  bind(s, (struct sockaddr FAR *) &addr, sizeof(addr));                  bind(s, (struct sockaddr FAR *) &addr, sizeof(addr));
594          }          }
595  #endif                                                  /* NO_INET6 */  #endif                                                  /* NO_INET6 */
596    
597          return (pvar->Pconnect) (s, name, namelen);          return (pvar->Pconnect) (s, name, namelen);
598  }  }
599    
600  static int PASCAL FAR TTXWSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg,  static int PASCAL FAR TTXWSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg,
601                                          long lEvent)                                          long lEvent)
602  {  {
603          if (s == pvar->socket) {          if (s == pvar->socket) {
604                  pvar->notification_events = lEvent;                  pvar->notification_events = lEvent;
605                  pvar->notification_msg = wMsg;                  pvar->notification_msg = wMsg;
606    
607                  if (pvar->NotificationWindow == NULL) {                  if (pvar->NotificationWindow == NULL) {
608                          pvar->NotificationWindow = hWnd;                          pvar->NotificationWindow = hWnd;
609                          AUTH_advance_to_next_cred(pvar);                          AUTH_advance_to_next_cred(pvar);
610                  }                  }
611          }          }
612    
613          return (pvar->PWSAAsyncSelect) (s, hWnd, wMsg, lEvent);          return (pvar->PWSAAsyncSelect) (s, hWnd, wMsg, lEvent);
614  }  }
615    
616  static int PASCAL FAR TTXrecv(SOCKET s, char FAR * buf, int len, int flags)  static int PASCAL FAR TTXrecv(SOCKET s, char FAR * buf, int len, int flags)
617  {  {
618          if (s == pvar->socket) {          if (s == pvar->socket) {
619                  int ret;                  int ret;
620    
621                  ssh_heartbeat_lock();                  ssh_heartbeat_lock();
622                  ret = PKT_recv(pvar, buf, len);                  ret = PKT_recv(pvar, buf, len);
623                  ssh_heartbeat_unlock();                  ssh_heartbeat_unlock();
624                  return (ret);                  return (ret);
625    
626          } else {          } else {
627                  return (pvar->Precv) (s, buf, len, flags);                  return (pvar->Precv) (s, buf, len, flags);
628          }          }
629  }  }
630    
631  static int PASCAL FAR TTXsend(SOCKET s, char const FAR * buf, int len,  static int PASCAL FAR TTXsend(SOCKET s, char const FAR * buf, int len,
632                                int flags)                                int flags)
633  {  {
634          if (s == pvar->socket) {          if (s == pvar->socket) {
635                  ssh_heartbeat_lock();                  ssh_heartbeat_lock();
636                  SSH_send(pvar, buf, len);                  SSH_send(pvar, buf, len);
637                  ssh_heartbeat_unlock();                  ssh_heartbeat_unlock();
638                  return len;                  return len;
639          } else {          } else {
640                  return (pvar->Psend) (s, buf, len, flags);                  return (pvar->Psend) (s, buf, len, flags);
641          }          }
642  }  }
643    
644  void notify_established_secure_connection(PTInstVar pvar)  void notify_established_secure_connection(PTInstVar pvar)
645  {  {
646          int fuLoad = LR_DEFAULTCOLOR;          int fuLoad = LR_DEFAULTCOLOR;
647    
648          if (is_NT4()) {          if (is_NT4()) {
649                  fuLoad = LR_VGACOLOR;                  fuLoad = LR_VGACOLOR;
650          }          }
651    
652          // LoadIcon ではなく LoadImage を使うようにし、          // LoadIcon ではなく LoadImage を使うようにし、
653          // 16x16 のアイコンを明示的に取得するようにした (2006.8.9 maya)          // 16x16 のアイコンを明示的に取得するようにした (2006.8.9 maya)
654          if (SecureLargeIcon == NULL) {          if (SecureLargeIcon == NULL) {
655                  SecureLargeIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_SECURETT),                  SecureLargeIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_SECURETT),
656                                              IMAGE_ICON, 0, 0, fuLoad);                                              IMAGE_ICON, 0, 0, fuLoad);
657          }          }
658          if (SecureSmallIcon == NULL) {          if (SecureSmallIcon == NULL) {
659                  SecureSmallIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_SECURETT),                  SecureSmallIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_SECURETT),
660                                              IMAGE_ICON, 16, 16, fuLoad);                                              IMAGE_ICON, 16, 16, fuLoad);
661          }          }
662    
663          if (SecureLargeIcon != NULL && SecureSmallIcon != NULL) {          if (SecureLargeIcon != NULL && SecureSmallIcon != NULL) {
664                  // 大きいアイコンは WNDCLASS にセットしているので取り出し方が違う (2006.8.10 maya)                  // 大きいアイコンは WNDCLASS にセットしているので取り出し方が違う (2006.8.10 maya)
665                  pvar->OldLargeIcon =                  pvar->OldLargeIcon =
666                          (HICON) GetClassLong(pvar->NotificationWindow, GCL_HICON);                          (HICON) GetClassLong(pvar->NotificationWindow, GCL_HICON);
667                  pvar->OldSmallIcon =                  pvar->OldSmallIcon =
668                          (HICON) SendMessage(pvar->NotificationWindow, WM_GETICON,                          (HICON) SendMessage(pvar->NotificationWindow, WM_GETICON,
669                                              ICON_SMALL, 0);                                              ICON_SMALL, 0);
670    
671                  PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_BIG,                  PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_BIG,
672                              (LPARAM) SecureLargeIcon);                              (LPARAM) SecureLargeIcon);
673                  PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_SMALL,                  PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_SMALL,
674                              (LPARAM) SecureSmallIcon);                              (LPARAM) SecureSmallIcon);
675          }          }
676    
677          notify_verbose_message(pvar, "Entering secure mode",          notify_verbose_message(pvar, "Entering secure mode",
678                                 LOG_LEVEL_VERBOSE);                                 LOG_LEVEL_VERBOSE);
679  }  }
680    
681  void notify_closed_connection(PTInstVar pvar)  void notify_closed_connection(PTInstVar pvar)
682  {  {
683          SSH_notify_disconnecting(pvar, NULL);          SSH_notify_disconnecting(pvar, NULL);
684          AUTH_notify_disconnecting(pvar);          AUTH_notify_disconnecting(pvar);
685          HOSTS_notify_disconnecting(pvar);          HOSTS_notify_disconnecting(pvar);
686    
687          PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,          PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,
688                      pvar->socket, MAKELPARAM(FD_CLOSE, 0));                      pvar->socket, MAKELPARAM(FD_CLOSE, 0));
689    
690  }  }
691    
692  static void add_err_msg(PTInstVar pvar, char FAR * msg)  static void add_err_msg(PTInstVar pvar, char FAR * msg)
693  {  {
694          if (pvar->err_msg != NULL) {          if (pvar->err_msg != NULL) {
695                  int buf_len = strlen(pvar->err_msg) + 3 + strlen(msg);                  int buf_len = strlen(pvar->err_msg) + 3 + strlen(msg);
696                  char FAR *buf = (char FAR *) malloc(buf_len);                  char FAR *buf = (char FAR *) malloc(buf_len);
697    
698                  strncpy_s(buf, buf_len, pvar->err_msg, _TRUNCATE);                  strncpy_s(buf, buf_len, pvar->err_msg, _TRUNCATE);
699                  strncat_s(buf, buf_len, "\n\n", _TRUNCATE);                  strncat_s(buf, buf_len, "\n\n", _TRUNCATE);
700                  strncat_s(buf, buf_len, msg, _TRUNCATE);                  strncat_s(buf, buf_len, msg, _TRUNCATE);
701                  free(pvar->err_msg);                  free(pvar->err_msg);
702                  pvar->err_msg = buf;                  pvar->err_msg = buf;
703          } else {          } else {
704                  pvar->err_msg = _strdup(msg);                  pvar->err_msg = _strdup(msg);
705          }          }
706  }  }
707    
708  void notify_nonfatal_error(PTInstVar pvar, char FAR * msg)  void notify_nonfatal_error(PTInstVar pvar, char FAR * msg)
709  {  {
710          if (!pvar->showing_err) {          if (!pvar->showing_err) {
711                  // 未接続の状態では通知先ウィンドウがないので、デスクトップをオーナーとして                  // 未接続の状態では通知先ウィンドウがないので、デスクトップをオーナーとして
712                  // メッセージボックスを出現させる。(2006.6.11 yutaka)                  // メッセージボックスを出現させる。(2006.6.11 yutaka)
713                  if (pvar->NotificationWindow == NULL) {                  if (pvar->NotificationWindow == NULL) {
714                          UTIL_get_lang_msg("MSG_ERROR_NONFAITAL", pvar,                          UTIL_get_lang_msg("MSG_ERROR_NONFAITAL", pvar,
715                                            "Tera Term: not fatal error");                                            "Tera Term: not fatal error");
716                          MessageBox(NULL, msg, pvar->ts->UIMsg, MB_OK|MB_ICONINFORMATION);                          MessageBox(NULL, msg, pvar->ts->UIMsg, MB_OK|MB_ICONINFORMATION);
717                          msg[0] = '\0';                          msg[0] = '\0';
718    
719                  } else {                  } else {
720                          PostMessage(pvar->NotificationWindow, WM_COMMAND,                          PostMessage(pvar->NotificationWindow, WM_COMMAND,
721                                      ID_SSHASYNCMESSAGEBOX, 0);                                      ID_SSHASYNCMESSAGEBOX, 0);
722                  }                  }
723          }          }
724          if (msg[0] != 0) {          if (msg[0] != 0) {
725                  notify_verbose_message(pvar, msg, LOG_LEVEL_ERROR);                  notify_verbose_message(pvar, msg, LOG_LEVEL_ERROR);
726                  add_err_msg(pvar, msg);                  add_err_msg(pvar, msg);
727          }          }
728  }  }
729    
730  void notify_fatal_error(PTInstVar pvar, char FAR * msg)  void notify_fatal_error(PTInstVar pvar, char FAR * msg)
731  {  {
732          if (msg[0] != 0) {          if (msg[0] != 0) {
733                  notify_verbose_message(pvar, msg, LOG_LEVEL_FATAL);                  notify_verbose_message(pvar, msg, LOG_LEVEL_FATAL);
734                  add_err_msg(pvar, msg);                  add_err_msg(pvar, msg);
735          }          }
736    
737          if (!pvar->fatal_error) {          if (!pvar->fatal_error) {
738                  pvar->fatal_error = TRUE;                  pvar->fatal_error = TRUE;
739    
740                  SSH_notify_disconnecting(pvar, msg);                  SSH_notify_disconnecting(pvar, msg);
741                  AUTH_notify_disconnecting(pvar);                  AUTH_notify_disconnecting(pvar);
742                  HOSTS_notify_disconnecting(pvar);                  HOSTS_notify_disconnecting(pvar);
743    
744                  PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,                  PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,
745                              pvar->socket, MAKELPARAM(FD_CLOSE,                              pvar->socket, MAKELPARAM(FD_CLOSE,
746                                                       (pvar->PWSAGetLastError) ()));                                                       (pvar->PWSAGetLastError) ()));
747          }          }
748  }  }
749    
750  void notify_verbose_message(PTInstVar pvar, char FAR * msg, int level)  void notify_verbose_message(PTInstVar pvar, char FAR * msg, int level)
751  {  {
752          if (level <= pvar->session_settings.LogLevel) {          if (level <= pvar->session_settings.LogLevel) {
753                  char buf[1024];                  char buf[1024];
754                  int file;                  int file;
755    
756                  get_teraterm_dir_relative_name(buf, NUM_ELEM(buf), "TTSSH.LOG");                  get_teraterm_dir_relative_name(buf, NUM_ELEM(buf), "TTSSH.LOG");
757                  file = _open(buf, _O_RDWR | _O_APPEND | _O_CREAT | _O_TEXT,                  file = _open(buf, _O_RDWR | _O_APPEND | _O_CREAT | _O_TEXT,
758                               _S_IREAD | _S_IWRITE);                               _S_IREAD | _S_IWRITE);
759    
760                  if (file >= 0) {                  if (file >= 0) {
761                          time_t now = time(NULL);                          time_t now = time(NULL);
762                          char tmp[26];                          char tmp[26];
763                          DWORD processid;                          DWORD processid;
764                          strcpy_s(tmp, sizeof(tmp), ctime(&now));                          strcpy_s(tmp, sizeof(tmp), ctime(&now));
765                          tmp[strlen(tmp)-1]= 0; // delete "\n"                          tmp[strlen(tmp)-1]= 0; // delete "\n"
766                          _write(file, tmp, strlen(tmp));                          _write(file, tmp, strlen(tmp));
767                          GetWindowThreadProcessId(pvar->cv->HWin, &processid);                          GetWindowThreadProcessId(pvar->cv->HWin, &processid);
768                          _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, " [%lu] ",processid);                          _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, " [%lu] ",processid);
769                          _write(file, tmp, strlen(tmp));                          _write(file, tmp, strlen(tmp));
770                          _write(file, msg, strlen(msg));                          _write(file, msg, strlen(msg));
771                          _write(file, "\n", 1);                          _write(file, "\n", 1);
772                          _close(file);                          _close(file);
773                  }                  }
774          }          }
775  }  }
776    
777  static void PASCAL FAR TTXOpenTCP(TTXSockHooks FAR * hooks)  static void PASCAL FAR TTXOpenTCP(TTXSockHooks FAR * hooks)
778  {  {
779          if (pvar->settings.Enabled) {          if (pvar->settings.Enabled) {
780                  // TCPLocalEcho/TCPCRSend を無効にする (maya 2007.4.25)                  // TCPLocalEcho/TCPCRSend を無効にする (maya 2007.4.25)
781                  pvar->ts->DisableTCPEchoCR = TRUE;                  pvar->ts->DisableTCPEchoCR = TRUE;
782    
783                  pvar->session_settings = pvar->settings;                  pvar->session_settings = pvar->settings;
784    
785                  notify_verbose_message(pvar, "---------------------------------------------------------------------", LOG_LEVEL_VERBOSE);                  notify_verbose_message(pvar, "---------------------------------------------------------------------", LOG_LEVEL_VERBOSE);
786                  notify_verbose_message(pvar, "Initiating SSH session", LOG_LEVEL_VERBOSE);                  notify_verbose_message(pvar, "Initiating SSH session", LOG_LEVEL_VERBOSE);
787    
788                  FWDUI_load_settings(pvar);                  FWDUI_load_settings(pvar);
789    
790                  pvar->cv->TelAutoDetect = FALSE;                  pvar->cv->TelAutoDetect = FALSE;
791                  /* This next line should not be needed because Tera Term's                  /* This next line should not be needed because Tera Term's
792                     CommLib should find ts->Telnet == 0 ... but we'll do this                     CommLib should find ts->Telnet == 0 ... but we'll do this
793                     just to be on the safe side. */                     just to be on the safe side. */
794                  pvar->cv->TelFlag = FALSE;                  pvar->cv->TelFlag = FALSE;
795    
796                  pvar->Precv = *hooks->Precv;                  pvar->Precv = *hooks->Precv;
797                  pvar->Psend = *hooks->Psend;                  pvar->Psend = *hooks->Psend;
798                  pvar->PWSAAsyncSelect = *hooks->PWSAAsyncSelect;                  pvar->PWSAAsyncSelect = *hooks->PWSAAsyncSelect;
799                  pvar->Pconnect = *hooks->Pconnect;                  pvar->Pconnect = *hooks->Pconnect;
800                  pvar->PWSAGetLastError = *hooks->PWSAGetLastError;                  pvar->PWSAGetLastError = *hooks->PWSAGetLastError;
801    
802                  *hooks->Precv = TTXrecv;                  *hooks->Precv = TTXrecv;
803                  *hooks->Psend = TTXsend;                  *hooks->Psend = TTXsend;
804                  *hooks->PWSAAsyncSelect = TTXWSAAsyncSelect;                  *hooks->PWSAAsyncSelect = TTXWSAAsyncSelect;
805                  *hooks->Pconnect = TTXconnect;                  *hooks->Pconnect = TTXconnect;
806    
807                  SSH_open(pvar);                  SSH_open(pvar);
808                  HOSTS_open(pvar);                  HOSTS_open(pvar);
809                  FWDUI_open(pvar);                  FWDUI_open(pvar);
810    
811                  // 設定を myproposal に反映するのは、接続直前のここだけ。 (2006.6.26 maya)                  // 設定を myproposal に反映するのは、接続直前のここだけ。 (2006.6.26 maya)
812                  SSH2_update_cipher_myproposal(pvar);                  SSH2_update_cipher_myproposal(pvar);
813                  SSH2_update_compression_myproposal(pvar);                  SSH2_update_compression_myproposal(pvar);
814          }          }
815  }  }
816    
817  static void PASCAL FAR TTXCloseTCP(TTXSockHooks FAR * hooks)  static void PASCAL FAR TTXCloseTCP(TTXSockHooks FAR * hooks)
818  {  {
819          if (pvar->session_settings.Enabled) {          if (pvar->session_settings.Enabled) {
820                  pvar->socket = INVALID_SOCKET;                  pvar->socket = INVALID_SOCKET;
821    
822                  notify_verbose_message(pvar, "Terminating SSH session...",                  notify_verbose_message(pvar, "Terminating SSH session...",
823                                         LOG_LEVEL_VERBOSE);                                         LOG_LEVEL_VERBOSE);
824    
825                  *hooks->Precv = pvar->Precv;                  *hooks->Precv = pvar->Precv;
826                  *hooks->Psend = pvar->Psend;                  *hooks->Psend = pvar->Psend;
827                  *hooks->PWSAAsyncSelect = pvar->PWSAAsyncSelect;                  *hooks->PWSAAsyncSelect = pvar->PWSAAsyncSelect;
828                  *hooks->Pconnect = pvar->Pconnect;                  *hooks->Pconnect = pvar->Pconnect;
829          }          }
830    
831          uninit_TTSSH(pvar);          uninit_TTSSH(pvar);
832          init_TTSSH(pvar);          init_TTSSH(pvar);
833  }  }
834    
835  static void enable_dlg_items(HWND dlg, int from, int to, BOOL enabled)  static void enable_dlg_items(HWND dlg, int from, int to, BOOL enabled)
836  {  {
837          for (; from <= to; from++) {          for (; from <= to; from++) {
838                  EnableWindow(GetDlgItem(dlg, from), enabled);                  EnableWindow(GetDlgItem(dlg, from), enabled);
839          }          }
840  }  }
841    
842  // C-p/C-n/C-b/C-f/C-a/C-e をサポート (2007.9.5 maya)  // C-p/C-n/C-b/C-f/C-a/C-e をサポート (2007.9.5 maya)
843  // C-d/C-k をサポート (2007.10.3 yutaka)  // C-d/C-k をサポート (2007.10.3 yutaka)
844  // ドロップダウンの中のエディットコントロールを  // ドロップダウンの中のエディットコントロールを
845  // サブクラス化するためのウインドウプロシージャ  // サブクラス化するためのウインドウプロシージャ
846  WNDPROC OrigHostnameEditProc; // Original window procedure  WNDPROC OrigHostnameEditProc; // Original window procedure
847  LRESULT CALLBACK HostnameEditProc(HWND dlg, UINT msg,  LRESULT CALLBACK HostnameEditProc(HWND dlg, UINT msg,
848                                           WPARAM wParam, LPARAM lParam)                                           WPARAM wParam, LPARAM lParam)
849  {  {
850          HWND parent;          HWND parent;
851          int  max, select, len;          int  max, select, len;
852          char *str, *orgstr;          char *str, *orgstr;
853    
854          switch (msg) {          switch (msg) {
855                  // キーが押されたのを検知する                  // キーが押されたのを検知する
856                  case WM_KEYDOWN:                  case WM_KEYDOWN:
857                          if (GetKeyState(VK_CONTROL) < 0) {                          if (GetKeyState(VK_CONTROL) < 0) {
858                                  switch (wParam) {                                  switch (wParam) {
859                                          case 0x50: // Ctrl+p ... up                                          case 0x50: // Ctrl+p ... up
860                                                  parent = GetParent(dlg);                                                  parent = GetParent(dlg);
861                                                  select = SendMessage(parent, CB_GETCURSEL, 0, 0);                                                  select = SendMessage(parent, CB_GETCURSEL, 0, 0);
862                                                  if (select > 0) {                                                  if (select > 0) {
863                                                          PostMessage(parent, CB_SETCURSEL, select - 1, 0);                                                          PostMessage(parent, CB_SETCURSEL, select - 1, 0);
864                                                  }                                                  }
865                                                  return 0;                                                  return 0;
866                                          case 0x4e: // Ctrl+n ... down                                          case 0x4e: // Ctrl+n ... down
867                                                  parent = GetParent(dlg);                                                  parent = GetParent(dlg);
868                                                  max = SendMessage(parent, CB_GETCOUNT, 0, 0);                                                  max = SendMessage(parent, CB_GETCOUNT, 0, 0);
869                                                  select = SendMessage(parent, CB_GETCURSEL, 0, 0);                                                  select = SendMessage(parent, CB_GETCURSEL, 0, 0);
870                                                  if (select < max - 1) {                                                  if (select < max - 1) {
871                                                          PostMessage(parent, CB_SETCURSEL, select + 1, 0);                                                          PostMessage(parent, CB_SETCURSEL, select + 1, 0);
872                                                  }                                                  }
873                                                  return 0;                                                  return 0;
874                                          case 0x42: // Ctrl+b ... left                                          case 0x42: // Ctrl+b ... left
875                                                  SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);                                                  SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
876                                                  PostMessage(dlg, EM_SETSEL, select-1, select-1);                                                  PostMessage(dlg, EM_SETSEL, select-1, select-1);
877                                                  return 0;                                                  return 0;
878                                          case 0x46: // Ctrl+f ... right                                          case 0x46: // Ctrl+f ... right
879                                                  SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);                                                  SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
880                                                  max = GetWindowTextLength(dlg) ;                                                  max = GetWindowTextLength(dlg) ;
881                                                  PostMessage(dlg, EM_SETSEL, select+1, select+1);                                                  PostMessage(dlg, EM_SETSEL, select+1, select+1);
882                                                  return 0;                                                  return 0;
883                                          case 0x41: // Ctrl+a ... home                                          case 0x41: // Ctrl+a ... home
884                                                  PostMessage(dlg, EM_SETSEL, 0, 0);                                                  PostMessage(dlg, EM_SETSEL, 0, 0);
885                                                  return 0;                                                  return 0;
886                                          case 0x45: // Ctrl+e ... end                                          case 0x45: // Ctrl+e ... end
887                                                  max = GetWindowTextLength(dlg) ;                                                  max = GetWindowTextLength(dlg) ;
888                                                  PostMessage(dlg, EM_SETSEL, max, max);                                                  PostMessage(dlg, EM_SETSEL, max, max);
889                                                  return 0;                                                  return 0;
890    
891                                          case 0x44: // Ctrl+d                                          case 0x44: // Ctrl+d
892                                          case 0x4b: // Ctrl+k                                          case 0x4b: // Ctrl+k
893                                          case 0x55: // Ctrl+u                                          case 0x55: // Ctrl+u
894                                                  SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);                                                  SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
895                                                  max = GetWindowTextLength(dlg);                                                  max = GetWindowTextLength(dlg);
896                                                  max++; // '\0'                                                  max++; // '\0'
897                                                  orgstr = str = malloc(max);                                                  orgstr = str = malloc(max);
898                                                  if (str != NULL) {                                                  if (str != NULL) {
899                                                          len = GetWindowText(dlg, str, max);                                                          len = GetWindowText(dlg, str, max);
900                                                          if (select >= 0 && select < len) {                                                          if (select >= 0 && select < len) {
901                                                                  if (wParam == 0x44) { // カーソル配下の文字のみを削除する                                                                  if (wParam == 0x44) { // カーソル配下の文字のみを削除する
902                                                                          memmove(&str[select], &str[select + 1], len - select - 1);                                                                          memmove(&str[select], &str[select + 1], len - select - 1);
903                                                                          str[len - 1] = '\0';                                                                          str[len - 1] = '\0';
904    
905                                                                  } else if (wParam == 0x4b) { // カーソルから行末まで削除する                                                                  } else if (wParam == 0x4b) { // カーソルから行末まで削除する
906                                                                          str[select] = '\0';                                                                          str[select] = '\0';
907    
908                                                                  }                                                                  }
909                                                          }                                                          }
910    
911                                                          if (wParam == 0x55) { // カーソルより左側をすべて消す                                                          if (wParam == 0x55) { // カーソルより左側をすべて消す
912                                                                  if (select >= len) {                                                                  if (select >= len) {
913                                                                          str[0] = '\0';                                                                          str[0] = '\0';
914                                                                  } else {                                                                  } else {
915                                                                          str = &str[select];                                                                          str = &str[select];
916                                                                  }                                                                  }
917                                                                  select = 0;                                                                  select = 0;
918                                                          }                                                          }
919    
920                                                          SetWindowText(dlg, str);                                                          SetWindowText(dlg, str);
921                                                          SendMessage(dlg, EM_SETSEL, select, select);                                                          SendMessage(dlg, EM_SETSEL, select, select);
922                                                          free(orgstr);                                                          free(orgstr);
923                                                          return 0;                                                          return 0;
924                                                  }                                                  }
925                                                  break;                                                  break;
926                                  }                                  }
927                          }                          }
928                          break;                          break;
929    
930                  // 上のキーを押した結果送られる文字で音が鳴るので捨てる                  // 上のキーを押した結果送られる文字で音が鳴るので捨てる
931                  case WM_CHAR:                  case WM_CHAR:
932                          switch (wParam) {                          switch (wParam) {
933                                  case 0x01:                                  case 0x01:
934                                  case 0x02:                                  case 0x02:
935                                  case 0x04:                                  case 0x04:
936                                  case 0x05:                                  case 0x05:
937                                  case 0x06:                                  case 0x06:
938                                  case 0x0b:                                  case 0x0b:
939                                  case 0x0e:                                  case 0x0e:
940                                  case 0x10:                                  case 0x10:
941                                  case 0x15:                                  case 0x15:
942                                          return 0;                                          return 0;
943                          }                          }
944          }          }
945    
946          return CallWindowProc(OrigHostnameEditProc, dlg, msg, wParam, lParam);          return CallWindowProc(OrigHostnameEditProc, dlg, msg, wParam, lParam);
947  }  }
948    
949  static BOOL CALLBACK TTXHostDlg(HWND dlg, UINT msg, WPARAM wParam,  static BOOL CALLBACK TTXHostDlg(HWND dlg, UINT msg, WPARAM wParam,
950                                  LPARAM lParam)                                  LPARAM lParam)
951  {  {
952          static char *ssh_version[] = {"SSH1", "SSH2", NULL};          static char *ssh_version[] = {"SSH1", "SSH2", NULL};
953          PGetHNRec GetHNRec;          PGetHNRec GetHNRec;
954          char EntName[128];          char EntName[128];
955          char TempHost[HostNameMaxLength + 1];          char TempHost[HostNameMaxLength + 1];
956          WORD i, j, w;          WORD i, j, w;
957          WORD ComPortTable[MAXCOMPORT];          WORD ComPortTable[MAXCOMPORT];
958          static char *ComPortDesc[MAXCOMPORT];          static char *ComPortDesc[MAXCOMPORT];
959          int comports;          int comports;
960          BOOL Ok;          BOOL Ok;
961          LOGFONT logfont;          LOGFONT logfont;
962          HFONT font;          HFONT font;
963          char uimsg[MAX_UIMSG];          char uimsg[MAX_UIMSG];
964          static HWND hwndHostname     = NULL; // HOSTNAME dropdown          static HWND hwndHostname     = NULL; // HOSTNAME dropdown
965          static HWND hwndHostnameEdit = NULL; // Edit control on HOSTNAME dropdown          static HWND hwndHostnameEdit = NULL; // Edit control on HOSTNAME dropdown
966    
967          switch (msg) {          switch (msg) {
968          case WM_INITDIALOG:          case WM_INITDIALOG:
969                  GetHNRec = (PGetHNRec) lParam;                  GetHNRec = (PGetHNRec) lParam;
970                  SetWindowLong(dlg, DWL_USER, lParam);                  SetWindowLong(dlg, DWL_USER, lParam);
971    
972                  GetWindowText(dlg, uimsg, sizeof(uimsg));                  GetWindowText(dlg, uimsg, sizeof(uimsg));
973                  UTIL_get_lang_msg("DLG_HOST_TITLE", pvar, uimsg);                  UTIL_get_lang_msg("DLG_HOST_TITLE", pvar, uimsg);
974                  SetWindowText(dlg, pvar->ts->UIMsg);                  SetWindowText(dlg, pvar->ts->UIMsg);
975                  GetDlgItemText(dlg, IDC_HOSTNAMELABEL, uimsg, sizeof(uimsg));                  GetDlgItemText(dlg, IDC_HOSTNAMELABEL, uimsg, sizeof(uimsg));
976                  UTIL_get_lang_msg("DLG_HOST_TCPIPHOST", pvar, uimsg);                  UTIL_get_lang_msg("DLG_HOST_TCPIPHOST", pvar, uimsg);
977                  SetDlgItemText(dlg, IDC_HOSTNAMELABEL, pvar->ts->UIMsg);                  SetDlgItemText(dlg, IDC_HOSTNAMELABEL, pvar->ts->UIMsg);
978                  GetDlgItemText(dlg, IDC_HISTORY, uimsg, sizeof(uimsg));                  GetDlgItemText(dlg, IDC_HISTORY, uimsg, sizeof(uimsg));
979                  UTIL_get_lang_msg("DLG_HOST_TCPIPHISTORY", pvar, uimsg);                  UTIL_get_lang_msg("DLG_HOST_TCPIPHISTORY", pvar, uimsg);
980                  SetDlgItemText(dlg, IDC_HISTORY, pvar->ts->UIMsg);                  SetDlgItemText(dlg, IDC_HISTORY, pvar->ts->UIMsg);
981                  GetDlgItemText(dlg, IDC_SERVICELABEL, uimsg, sizeof(uimsg));                  GetDlgItemText(dlg, IDC_SERVICELABEL, uimsg, sizeof(uimsg));
982                  UTIL_get_lang_msg("DLG_HOST_TCPIPSERVICE", pvar, uimsg);                  UTIL_get_lang_msg("DLG_HOST_TCPIPSERVICE", pvar, uimsg);
983                  SetDlgItemText(dlg, IDC_SERVICELABEL, pvar->ts->UIMsg);                  SetDlgItemText(dlg, IDC_SERVICELABEL, pvar->ts->UIMsg);
984                  GetDlgItemText(dlg, IDC_HOSTOTHER, uimsg, sizeof(uimsg));                  GetDlgItemText(dlg, IDC_HOSTOTHER, uimsg, sizeof(uimsg));
985                  UTIL_get_lang_msg("DLG_HOST_TCPIPOTHER", pvar, uimsg);                  UTIL_get_lang_msg("DLG_HOST_TCPIPOTHER", pvar, uimsg);
986                  SetDlgItemText(dlg, IDC_HOSTOTHER, pvar->ts->UIMsg);                  SetDlgItemText(dlg, IDC_HOSTOTHER, pvar->ts->UIMsg);
987                  GetDlgItemText(dlg, IDC_HOSTTCPPORTLABEL, uimsg, sizeof(uimsg));                  GetDlgItemText(dlg, IDC_HOSTTCPPORTLABEL, uimsg, sizeof(uimsg));
988                  UTIL_get_lang_msg("DLG_HOST_TCPIPPORT", pvar, uimsg);                  UTIL_get_lang_msg("DLG_HOST_TCPIPPORT", pvar, uimsg);
989                  SetDlgItemText(dlg, IDC_HOSTTCPPORTLABEL, pvar->ts->UIMsg);                  SetDlgItemText(dlg, IDC_HOSTTCPPORTLABEL, pvar->ts->UIMsg);
990                  GetDlgItemText(dlg, IDC_SSH_VERSION_LABEL, uimsg, sizeof(uimsg));                  GetDlgItemText(dlg, IDC_SSH_VERSION_LABEL, uimsg, sizeof(uimsg));
991                  UTIL_get_lang_msg("DLG_HOST_TCPIPSSHVERSION", pvar, uimsg);                  UTIL_get_lang_msg("DLG_HOST_TCPIPSSHVERSION", pvar, uimsg);
992                  SetDlgItemText(dlg, IDC_SSH_VERSION_LABEL, pvar->ts->UIMsg);                  SetDlgItemText(dlg, IDC_SSH_VERSION_LABEL, pvar->ts->UIMsg);
993                  GetDlgItemText(dlg, IDC_HOSTTCPPROTOCOLLABEL, uimsg, sizeof(uimsg));                  GetDlgItemText(dlg, IDC_HOSTTCPPROTOCOLLABEL, uimsg, sizeof(uimsg));
994                  UTIL_get_lang_msg("DLG_HOST_TCPIPPROTOCOL", pvar, uimsg);                  UTIL_get_lang_msg("DLG_HOST_TCPIPPROTOCOL", pvar, uimsg);
995                  SetDlgItemText(dlg, IDC_HOSTTCPPROTOCOLLABEL, pvar->ts->UIMsg);                  SetDlgItemText(dlg, IDC_HOSTTCPPROTOCOLLABEL, pvar->ts->UIMsg);
996                  GetDlgItemText(dlg, IDC_HOSTSERIAL, uimsg, sizeof(uimsg));                  GetDlgItemText(dlg, IDC_HOSTSERIAL, uimsg, sizeof(uimsg));
997                  UTIL_get_lang_msg("DLG_HOST_SERIAL", pvar, uimsg);                  UTIL_get_lang_msg("DLG_HOST_SERIAL", pvar, uimsg);
998                  SetDlgItemText(dlg, IDC_HOSTSERIAL, pvar->ts->UIMsg);                  SetDlgItemText(dlg, IDC_HOSTSERIAL, pvar->ts->UIMsg);
999                  GetDlgItemText(dlg, IDC_HOSTCOMLABEL, uimsg, sizeof(uimsg));                  GetDlgItemText(dlg, IDC_HOSTCOMLABEL, uimsg, sizeof(uimsg));
1000                  UTIL_get_lang_msg("DLG_HOST_SERIALPORT", pvar, uimsg);                  UTIL_get_lang_msg("DLG_HOST_SERIALPORT", pvar, uimsg);
1001                  SetDlgItemText(dlg, IDC_HOSTCOMLABEL, pvar->ts->UIMsg);                  SetDlgItemText(dlg, IDC_HOSTCOMLABEL, pvar->ts->UIMsg);
1002                  GetDlgItemText(dlg, IDC_HOSTHELP, uimsg, sizeof(uimsg));                  GetDlgItemText(dlg, IDC_HOSTHELP, uimsg, sizeof(uimsg));
1003                  UTIL_get_lang_msg("DLG_HOST_HELP", pvar, uimsg);                  UTIL_get_lang_msg("DLG_HOST_HELP", pvar, uimsg);
1004                  SetDlgItemText(dlg, IDC_HOSTHELP, pvar->ts->UIMsg);                  SetDlgItemText(dlg, IDC_HOSTHELP, pvar->ts->UIMsg);
1005                  GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));                  GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1006                  UTIL_get_lang_msg("BTN_OK", pvar, uimsg);                  UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1007                  SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);                  SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1008                  GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));                  GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1009                  UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);                  UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
1010                  SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);                  SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1011    
1012                  // ホストヒストリのチェックボックスを追加 (2005.10.21 yutaka)                  // ホストヒストリのチェックボックスを追加 (2005.10.21 yutaka)
1013                  if (pvar->ts->HistoryList > 0) {                  if (pvar->ts->HistoryList > 0) {
1014                          SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_SETCHECK, BST_CHECKED, 0);                          SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_SETCHECK, BST_CHECKED, 0);
1015                  } else {                  } else {
1016                          SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_SETCHECK, BST_UNCHECKED, 0);                          SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_SETCHECK, BST_UNCHECKED, 0);
1017                  }                  }
1018    
1019                  if (GetHNRec->PortType == IdFile)                  if (GetHNRec->PortType == IdFile)
1020                          GetHNRec->PortType = IdTCPIP;                          GetHNRec->PortType = IdTCPIP;
1021    
1022                  strncpy_s(EntName, sizeof(EntName), "Host", _TRUNCATE);                  strncpy_s(EntName, sizeof(EntName), "Host", _TRUNCATE);
1023    
1024                  i = 1;                  i = 1;
1025                  do {                  do {
1026                          _snprintf_s(&EntName[4], sizeof(EntName)-4, _TRUNCATE, "%d", i);                          _snprintf_s(&EntName[4], sizeof(EntName)-4, _TRUNCATE, "%d", i);
1027                          GetPrivateProfileString("Hosts", EntName, "",                          GetPrivateProfileString("Hosts", EntName, "",
1028                                                  TempHost, sizeof(TempHost),                                                  TempHost, sizeof(TempHost),
1029                                                  GetHNRec->SetupFN);                                                  GetHNRec->SetupFN);
1030                          if (strlen(TempHost) > 0)                          if (strlen(TempHost) > 0)
1031                                  SendDlgItemMessage(dlg, IDC_HOSTNAME, CB_ADDSTRING,                                  SendDlgItemMessage(dlg, IDC_HOSTNAME, CB_ADDSTRING,
1032                                                     0, (LPARAM) TempHost);                                                     0, (LPARAM) TempHost);
1033                          i++;                          i++;
1034                  } while ((i <= MAXHOSTLIST) && (strlen(TempHost) > 0));                  } while ((i <= MAXHOSTLIST) && (strlen(TempHost) > 0));
1035    
1036                  SendDlgItemMessage(dlg, IDC_HOSTNAME, EM_LIMITTEXT,                  SendDlgItemMessage(dlg, IDC_HOSTNAME, EM_LIMITTEXT,
1037                                     HostNameMaxLength - 1, 0);                                     HostNameMaxLength - 1, 0);
1038    
1039                  SendDlgItemMessage(dlg, IDC_HOSTNAME, CB_SETCURSEL, 0, 0);                  SendDlgItemMessage(dlg, IDC_HOSTNAME, CB_SETCURSEL, 0, 0);
1040    
1041                  // C-n/C-p のためにサブクラス化 (2007.9.4 maya)                  // C-n/C-p のためにサブクラス化 (2007.9.4 maya)
1042                  hwndHostname = GetDlgItem(dlg, IDC_HOSTNAME);                  hwndHostname = GetDlgItem(dlg, IDC_HOSTNAME);
1043                  hwndHostnameEdit = GetWindow(hwndHostname, GW_CHILD);                  hwndHostnameEdit = GetWindow(hwndHostname, GW_CHILD);
1044                  OrigHostnameEditProc = (WNDPROC)GetWindowLong(hwndHostnameEdit, GWL_WNDPROC);                  OrigHostnameEditProc = (WNDPROC)GetWindowLong(hwndHostnameEdit, GWL_WNDPROC);
1045                  SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)HostnameEditProc);                  SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)HostnameEditProc);
1046    
1047                  CheckRadioButton(dlg, IDC_HOSTTELNET, IDC_HOSTOTHER,                  CheckRadioButton(dlg, IDC_HOSTTELNET, IDC_HOSTOTHER,
1048                                   pvar->settings.Enabled ? IDC_HOSTSSH : GetHNRec->                                   pvar->settings.Enabled ? IDC_HOSTSSH : GetHNRec->
1049                                   Telnet ? IDC_HOSTTELNET : IDC_HOSTOTHER);                                   Telnet ? IDC_HOSTTELNET : IDC_HOSTOTHER);
1050                  SendDlgItemMessage(dlg, IDC_HOSTTCPPORT, EM_LIMITTEXT, 5, 0);                  SendDlgItemMessage(dlg, IDC_HOSTTCPPORT, EM_LIMITTEXT, 5, 0);
1051                  SetDlgItemInt(dlg, IDC_HOSTTCPPORT, GetHNRec->TCPPort, FALSE);                  SetDlgItemInt(dlg, IDC_HOSTTCPPORT, GetHNRec->TCPPort, FALSE);
1052  #ifndef NO_INET6  #ifndef NO_INET6
1053                  for (i = 0; ProtocolFamilyList[i]; ++i) {                  for (i = 0; ProtocolFamilyList[i]; ++i) {
1054                          SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, CB_ADDSTRING,                          SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, CB_ADDSTRING,
1055                                             0, (LPARAM) ProtocolFamilyList[i]);                                             0, (LPARAM) ProtocolFamilyList[i]);
1056                  }                  }
1057                  SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, EM_LIMITTEXT,                  SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, EM_LIMITTEXT,
1058                                     ProtocolFamilyMaxLength - 1, 0);                                     ProtocolFamilyMaxLength - 1, 0);
1059                  SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, CB_SETCURSEL, 0, 0);                  SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, CB_SETCURSEL, 0, 0);
1060  #endif                                                  /* NO_INET6 */  #endif                                                  /* NO_INET6 */
1061    
1062                  /////// SSH version                  /////// SSH version
1063                  for (i = 0; ssh_version[i]; ++i) {                  for (i = 0; ssh_version[i]; ++i) {
1064                          SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_ADDSTRING,                          SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_ADDSTRING,
1065                                             0, (LPARAM) ssh_version[i]);                                             0, (LPARAM) ssh_version[i]);
1066                  }                  }
1067                  SendDlgItemMessage(dlg, IDC_SSH_VERSION, EM_LIMITTEXT,                  SendDlgItemMessage(dlg, IDC_SSH_VERSION, EM_LIMITTEXT,
1068                                     NUM_ELEM(ssh_version) - 1, 0);                                     NUM_ELEM(ssh_version) - 1, 0);
1069    
1070                  if (pvar->settings.ssh_protocol_version == 1) {                  if (pvar->settings.ssh_protocol_version == 1) {
1071                          SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_SETCURSEL, 0, 0); // SSH1                          SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_SETCURSEL, 0, 0); // SSH1
1072                  } else {                  } else {
1073                          SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_SETCURSEL, 1, 0); // SSH2                          SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_SETCURSEL, 1, 0); // SSH2
1074                  }                  }
1075    
1076                  if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {                  if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1077                          enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE); // enabled                          enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE); // enabled
1078                  } else {                  } else {
1079                          enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled                          enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1080                  }                  }
1081                  /////// SSH version                  /////// SSH version
1082    
1083    
1084                  j = 0;                  j = 0;
1085                  w = 1;                  w = 1;
1086                  if ((comports=DetectComPorts(ComPortTable, GetHNRec->MaxComPort, ComPortDesc)) >= 0) {                  if ((comports=DetectComPorts(ComPortTable, GetHNRec->MaxComPort, ComPortDesc)) >= 0) {
1087                          for (i=0; i<comports; i++) {                          for (i=0; i<comports; i++) {
1088                                  // MaxComPort を越えるポートは表示しない                                  // MaxComPort を越えるポートは表示しない
1089                                  if (ComPortTable[i] > GetHNRec->MaxComPort) {                                  if (ComPortTable[i] > GetHNRec->MaxComPort) {
1090                                          continue;                                          continue;
1091                                  }                                  }
1092    
1093                                  // 使用中のポートは表示しない                                  // 使用中のポートは表示しない
1094                                  if (CheckCOMFlag(ComPortTable[i]) == 1) {                                  if (CheckCOMFlag(ComPortTable[i]) == 1) {
1095                                          continue;                                          continue;
1096                                  }                                  }
1097    
1098                                  _snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "COM%d", ComPortTable[i]);                                  _snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "COM%d", ComPortTable[i]);
1099                                  if (ComPortDesc[i] != NULL) {                                  if (ComPortDesc[i] != NULL) {
1100                                          strncat_s(EntName, sizeof(EntName), ": ", _TRUNCATE);                                          strncat_s(EntName, sizeof(EntName), ": ", _TRUNCATE);
1101                                          strncat_s(EntName, sizeof(EntName), ComPortDesc[i], _TRUNCATE);                                          strncat_s(EntName, sizeof(EntName), ComPortDesc[i], _TRUNCATE);
1102                                  }                                  }
1103                                  SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,                                  SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,
1104                                                     0, (LPARAM)EntName);                                                     0, (LPARAM)EntName);
1105                                  j++;                                  j++;
1106                                  if (GetHNRec->ComPort == ComPortTable[i])                                  if (GetHNRec->ComPort == ComPortTable[i])
1107                                          w = j;                                          w = j;
1108                          }                          }
1109    
1110                  } else {                  } else {
1111                          for (i = 1; i <= GetHNRec->MaxComPort; i++) {                          for (i = 1; i <= GetHNRec->MaxComPort; i++) {
1112                                  // 使用中のポートは表示しない                                  // 使用中のポートは表示しない
1113                                  if (CheckCOMFlag(i) == 1) {                                  if (CheckCOMFlag(i) == 1) {
1114                                          continue;                                          continue;
1115                                  }                                  }
1116    
1117                                  _snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "COM%d", i);                                  _snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "COM%d", i);
1118                                  SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,                                  SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,
1119                                                     0, (LPARAM) EntName);                                                     0, (LPARAM) EntName);
1120                                  j++;                                  j++;
1121                                  if (GetHNRec->ComPort == i)                                  if (GetHNRec->ComPort == i)
1122                                          w = j;                                          w = j;
1123                          }                          }
1124                  }                  }
1125    
1126                  if (j > 0)                  if (j > 0)
1127                          SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_SETCURSEL, w - 1, 0);                          SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_SETCURSEL, w - 1, 0);
1128                  else {                                  /* All com ports are already used */                  else {                                  /* All com ports are already used */
1129                          GetHNRec->PortType = IdTCPIP;                          GetHNRec->PortType = IdTCPIP;
1130                          enable_dlg_items(dlg, IDC_HOSTSERIAL, IDC_HOSTSERIAL, FALSE);                          enable_dlg_items(dlg, IDC_HOSTSERIAL, IDC_HOSTSERIAL, FALSE);
1131                  }                  }
1132    
1133                  CheckRadioButton(dlg, IDC_HOSTTCPIP, IDC_HOSTSERIAL,                  CheckRadioButton(dlg, IDC_HOSTTCPIP, IDC_HOSTSERIAL,
1134                                   IDC_HOSTTCPIP + GetHNRec->PortType - 1);                                   IDC_HOSTTCPIP + GetHNRec->PortType - 1);
1135    
1136                  if (GetHNRec->PortType == IdTCPIP) {                  if (GetHNRec->PortType == IdTCPIP) {
1137                          enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, FALSE);                          enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, FALSE);
1138    
1139                          enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE);                          enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE);
1140                          enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, TRUE);                          enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, TRUE);
1141    
1142                          enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, TRUE); // enabled                          enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, TRUE); // enabled
1143                  }                  }
1144  #ifndef NO_INET6  #ifndef NO_INET6
1145                  else {                  else {
1146                          enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,                          enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1147                                           FALSE);                                           FALSE);
1148                          enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,                          enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1149                                           IDC_HOSTTCPPROTOCOL, FALSE);                                           IDC_HOSTTCPPROTOCOL, FALSE);
1150    
1151                          enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled                          enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1152                          enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, FALSE); // disabled (2004.11.23 yutaka)                          enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, FALSE); // disabled (2004.11.23 yutaka)
1153    
1154                          enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, FALSE); // disabled                          enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, FALSE); // disabled
1155                  }                  }
1156  #else  #else
1157                  else                  else
1158                          enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,                          enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1159                                                           FALSE);                                                           FALSE);
1160  #endif                                                  /* NO_INET6 */  #endif                                                  /* NO_INET6 */
1161    
1162                  // Host dialogにフォーカスをあてる (2004.10.2 yutaka)                  // Host dialogにフォーカスをあてる (2004.10.2 yutaka)
1163                  if (GetHNRec->PortType == IdTCPIP) {                  if (GetHNRec->PortType == IdTCPIP) {
1164                          HWND hwnd = GetDlgItem(dlg, IDC_HOSTNAME);                          HWND hwnd = GetDlgItem(dlg, IDC_HOSTNAME);
1165                          SetFocus(hwnd);                          SetFocus(hwnd);
1166                  } else {                  } else {
1167                          HWND hwnd = GetDlgItem(dlg, IDC_HOSTCOM);                          HWND hwnd = GetDlgItem(dlg, IDC_HOSTCOM);
1168                          SetFocus(hwnd);                          SetFocus(hwnd);
1169                  }                  }
1170    
1171                  font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);                  font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1172                  GetObject(font, sizeof(LOGFONT), &logfont);                  GetObject(font, sizeof(LOGFONT), &logfont);
1173                  if (UTIL_get_lang_font("DLG_SYSTEM_FONT", dlg, &logfont, &DlgHostFont, pvar)) {                  if (UTIL_get_lang_font("DLG_SYSTEM_FONT", dlg, &logfont, &DlgHostFont, pvar)) {
1174                          SendDlgItemMessage(dlg, IDC_HOSTTCPIP, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_HOSTTCPIP, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1175                          SendDlgItemMessage(dlg, IDC_HOSTNAMELABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_HOSTNAMELABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1176                          SendDlgItemMessage(dlg, IDC_HOSTNAME, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_HOSTNAME, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1177                          SendDlgItemMessage(dlg, IDC_HISTORY, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_HISTORY, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1178                          SendDlgItemMessage(dlg, IDC_SERVICELABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_SERVICELABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1179                          SendDlgItemMessage(dlg, IDC_HOSTTELNET, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_HOSTTELNET, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1180                          SendDlgItemMessage(dlg, IDC_HOSTSSH, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_HOSTSSH, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1181                          SendDlgItemMessage(dlg, IDC_HOSTOTHER, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_HOSTOTHER, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1182                          SendDlgItemMessage(dlg, IDC_HOSTTCPPORTLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_HOSTTCPPORTLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1183                          SendDlgItemMessage(dlg, IDC_HOSTTCPPORT, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_HOSTTCPPORT, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1184                          SendDlgItemMessage(dlg, IDC_SSH_VERSION_LABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_SSH_VERSION_LABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1185                          SendDlgItemMessage(dlg, IDC_SSH_VERSION, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_SSH_VERSION, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1186                          SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOLLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOLLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1187                          SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1188                          SendDlgItemMessage(dlg, IDC_HOSTSERIAL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_HOSTSERIAL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1189                          SendDlgItemMessage(dlg, IDC_HOSTCOMLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_HOSTCOMLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1190                          SendDlgItemMessage(dlg, IDC_HOSTCOM, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_HOSTCOM, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1191                          SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1192                          SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1193                          SendDlgItemMessage(dlg, IDC_HOSTHELP, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_HOSTHELP, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1194                  }                  }
1195                  else {                  else {
1196                          DlgHostFont = NULL;                          DlgHostFont = NULL;
1197                  }                  }
1198    
1199                  // SetFocus()でフォーカスをあわせた場合、FALSEを返す必要がある。                  // SetFocus()でフォーカスをあわせた場合、FALSEを返す必要がある。
1200                  // TRUEを返すと、TABSTOP対象の一番はじめのコントロールが選ばれる。                  // TRUEを返すと、TABSTOP対象の一番はじめのコントロールが選ばれる。
1201                  // (2004.11.23 yutaka)                  // (2004.11.23 yutaka)
1202                  return FALSE;                  return FALSE;
1203                  //return TRUE;                  //return TRUE;
1204    
1205          case WM_COMMAND:          case WM_COMMAND:
1206                  switch (LOWORD(wParam)) {                  switch (LOWORD(wParam)) {
1207                  case IDOK:                  case IDOK:
1208                          GetHNRec = (PGetHNRec) GetWindowLong(dlg, DWL_USER);                          GetHNRec = (PGetHNRec) GetWindowLong(dlg, DWL_USER);
1209                          if (GetHNRec != NULL) {                          if (GetHNRec != NULL) {
1210                                  if (IsDlgButtonChecked(dlg, IDC_HOSTTCPIP)) {                                  if (IsDlgButtonChecked(dlg, IDC_HOSTTCPIP)) {
1211  #ifndef NO_INET6  #ifndef NO_INET6
1212                                          char afstr[BUFSIZ];                                          char afstr[BUFSIZ];
1213  #endif                                                  /* NO_INET6 */  #endif                                                  /* NO_INET6 */
1214                                          i = GetDlgItemInt(dlg, IDC_HOSTTCPPORT, &Ok, FALSE);                                          i = GetDlgItemInt(dlg, IDC_HOSTTCPPORT, &Ok, FALSE);
1215                                          if (Ok) {                                          if (Ok) {
1216                                                  GetHNRec->TCPPort = i;                                                  GetHNRec->TCPPort = i;
1217                                          } else {                                          } else {
1218                                                  UTIL_get_lang_msg("MSG_TCPPORT_NAN_ERROR", pvar,                                                  UTIL_get_lang_msg("MSG_TCPPORT_NAN_ERROR", pvar,
1219                                                                    "The TCP port must be a number.");                                                                    "The TCP port must be a number.");
1220                                                  MessageBox(dlg, pvar->ts->UIMsg,                                                  MessageBox(dlg, pvar->ts->UIMsg,
1221                                                             "Tera Term", MB_OK | MB_ICONEXCLAMATION);                                                             "Tera Term", MB_OK | MB_ICONEXCLAMATION);
1222                                                  return TRUE;                                                  return TRUE;
1223                                          }                                          }
1224  #ifndef NO_INET6  #ifndef NO_INET6
1225  #define getaf(str) \  #define getaf(str) \
1226  ((strcmp((str), "IPv6") == 0) ? AF_INET6 : \  ((strcmp((str), "IPv6") == 0) ? AF_INET6 : \
1227   ((strcmp((str), "IPv4") == 0) ? AF_INET : AF_UNSPEC))   ((strcmp((str), "IPv4") == 0) ? AF_INET : AF_UNSPEC))
1228                                          memset(afstr, 0, sizeof(afstr));                                          memset(afstr, 0, sizeof(afstr));
1229                                          GetDlgItemText(dlg, IDC_HOSTTCPPROTOCOL, afstr,                                          GetDlgItemText(dlg, IDC_HOSTTCPPROTOCOL, afstr,
1230                                                         sizeof(afstr));                                                         sizeof(afstr));
1231                                          GetHNRec->ProtocolFamily = getaf(afstr);                                          GetHNRec->ProtocolFamily = getaf(afstr);
1232  #endif                                                  /* NO_INET6 */  #endif                                                  /* NO_INET6 */
1233                                          GetHNRec->PortType = IdTCPIP;                                          GetHNRec->PortType = IdTCPIP;
1234                                          GetDlgItemText(dlg, IDC_HOSTNAME, GetHNRec->HostName,                                          GetDlgItemText(dlg, IDC_HOSTNAME, GetHNRec->HostName,
1235                                                         HostNameMaxLength);                                                         HostNameMaxLength);
1236                                          GetHNRec->Telnet = FALSE;                                          GetHNRec->Telnet = FALSE;
1237                                          pvar->hostdlg_activated = TRUE;                                          pvar->hostdlg_activated = TRUE;
1238                                          pvar->hostdlg_Enabled = FALSE;                                          pvar->hostdlg_Enabled = FALSE;
1239                                          if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {                                          if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
1240                                                  GetHNRec->Telnet = TRUE;                                                  GetHNRec->Telnet = TRUE;
1241                                          } else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {                                          } else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1242                                                  pvar->hostdlg_Enabled = TRUE;                                                  pvar->hostdlg_Enabled = TRUE;
1243    
1244                                                  // check SSH protocol version                                                  // check SSH protocol version
1245                                                  memset(afstr, 0, sizeof(afstr));                                                  memset(afstr, 0, sizeof(afstr));
1246                                                  GetDlgItemText(dlg, IDC_SSH_VERSION, afstr, sizeof(afstr));                                                  GetDlgItemText(dlg, IDC_SSH_VERSION, afstr, sizeof(afstr));
1247                                                  if (_stricmp(afstr, "SSH1") == 0) {                                                  if (_stricmp(afstr, "SSH1") == 0) {
1248                                                          pvar->settings.ssh_protocol_version = 1;                                                          pvar->settings.ssh_protocol_version = 1;
1249                                                  } else {                                                  } else {
1250                                                          pvar->settings.ssh_protocol_version = 2;                                                          pvar->settings.ssh_protocol_version = 2;
1251                                                  }                                                  }
1252                                          }                                          }
1253    
1254                                          // host history check button                                          // host history check button
1255                                          if (SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_GETCHECK, 0, 0) == BST_CHECKED) {                                          if (SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_GETCHECK, 0, 0) == BST_CHECKED) {
1256                                                  pvar->ts->HistoryList = 1;                                                  pvar->ts->HistoryList = 1;
1257                                          } else {                                          } else {
1258                                                  pvar->ts->HistoryList = 0;                                                  pvar->ts->HistoryList = 0;
1259                                          }                                          }
1260    
1261                                  } else {                                  } else {
1262                                          GetHNRec->PortType = IdSerial;                                          GetHNRec->PortType = IdSerial;
1263                                          GetHNRec->HostName[0] = 0;                                          GetHNRec->HostName[0] = 0;
1264                                          memset(EntName, 0, sizeof(EntName));                                          memset(EntName, 0, sizeof(EntName));
1265                                          GetDlgItemText(dlg, IDC_HOSTCOM, EntName,                                          GetDlgItemText(dlg, IDC_HOSTCOM, EntName,
1266                                                         sizeof(EntName) - 1);                                                         sizeof(EntName) - 1);
1267                                          if (strncmp(EntName, "COM", 3) == 0 && EntName[3] != '\0') {                                          if (strncmp(EntName, "COM", 3) == 0 && EntName[3] != '\0') {
1268  #if 0  #if 0
1269                                                  GetHNRec->ComPort = (BYTE) (EntName[3]) - 0x30;                                                  GetHNRec->ComPort = (BYTE) (EntName[3]) - 0x30;
1270                                                  if (strlen(EntName) > 4)                                                  if (strlen(EntName) > 4)
1271                                                          GetHNRec->ComPort =                                                          GetHNRec->ComPort =
1272                                                                  GetHNRec->ComPort * 10 + (BYTE) (EntName[4]) -                                                                  GetHNRec->ComPort * 10 + (BYTE) (EntName[4]) -
1273                                                                  0x30;                                                                  0x30;
1274  #else  #else
1275                                                  GetHNRec->ComPort = atoi(&EntName[3]);                                                  GetHNRec->ComPort = atoi(&EntName[3]);
1276  #endif  #endif
1277                                                  if (GetHNRec->ComPort > GetHNRec->MaxComPort)                                                  if (GetHNRec->ComPort > GetHNRec->MaxComPort)
1278                                                          GetHNRec->ComPort = 1;                                                          GetHNRec->ComPort = 1;
1279                                          } else {                                          } else {
1280                                                  GetHNRec->ComPort = 1;                                                  GetHNRec->ComPort = 1;
1281                                          }                                          }
1282                                  }                                  }
1283                          }                          }
1284                          SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)OrigHostnameEditProc);                          SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)OrigHostnameEditProc);
1285                          EndDialog(dlg, 1);                          EndDialog(dlg, 1);
1286    
1287                          if (DlgHostFont != NULL) {                          if (DlgHostFont != NULL) {
1288                                  DeleteObject(DlgHostFont);                                  DeleteObject(DlgHostFont);
1289                          }                          }
1290    
1291                          return TRUE;                          return TRUE;
1292    
1293                  case IDCANCEL:                  case IDCANCEL:
1294                          SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)OrigHostnameEditProc);                          SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)OrigHostnameEditProc);
1295                          EndDialog(dlg, 0);                          EndDialog(dlg, 0);
1296    
1297                          if (DlgHostFont != NULL) {                          if (DlgHostFont != NULL) {
1298                                  DeleteObject(DlgHostFont);                                  DeleteObject(DlgHostFont);
1299                          }                          }
1300    
1301                          return TRUE;                          return TRUE;
1302    
1303                  case IDC_HOSTTCPIP:                  case IDC_HOSTTCPIP:
1304                          enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,                          enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1305                                           TRUE);                                           TRUE);
1306  #ifndef NO_INET6  #ifndef NO_INET6
1307                          enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,                          enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1308                                           IDC_HOSTTCPPROTOCOL, TRUE);                                           IDC_HOSTTCPPROTOCOL, TRUE);
1309  #endif                                                  /* NO_INET6 */  #endif                                                  /* NO_INET6 */
1310                          enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, FALSE);                          enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, FALSE);
1311    
1312                          enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, TRUE); // disabled (2004.11.23 yutaka)                          enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, TRUE); // disabled (2004.11.23 yutaka)
1313                          if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {                          if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1314                                  enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE);                                  enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE);
1315                          } else {                          } else {
1316                                  enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled                                  enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1317                          }                          }
1318    
1319                          enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, TRUE); // disabled                          enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, TRUE); // disabled
1320    
1321                          return TRUE;                          return TRUE;
1322    
1323                  case IDC_HOSTSERIAL:                  case IDC_HOSTSERIAL:
1324                          enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, TRUE);                          enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, TRUE);
1325                          enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,                          enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1326                                           FALSE);                                           FALSE);
1327  #ifndef NO_INET6  #ifndef NO_INET6
1328                          enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,                          enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1329                                           IDC_HOSTTCPPROTOCOL, FALSE);                                           IDC_HOSTTCPPROTOCOL, FALSE);
1330  #endif                                                  /* NO_INET6 */  #endif                                                  /* NO_INET6 */
1331                          enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled                          enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1332                          enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, FALSE); // disabled (2004.11.23 yutaka)                          enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, FALSE); // disabled (2004.11.23 yutaka)
1333    
1334                          enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, FALSE); // disabled                          enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, FALSE); // disabled
1335    
1336                          return TRUE;                          return TRUE;
1337    
1338                  case IDC_HOSTSSH:                  case IDC_HOSTSSH:
1339                          enable_dlg_items(dlg, IDC_SSH_VERSION,                          enable_dlg_items(dlg, IDC_SSH_VERSION,
1340                                           IDC_SSH_VERSION, TRUE);                                           IDC_SSH_VERSION, TRUE);
1341                          goto hostssh_enabled;                          goto hostssh_enabled;
1342    
1343                  case IDC_HOSTTELNET:                  case IDC_HOSTTELNET:
1344                  case IDC_HOSTOTHER:                  case IDC_HOSTOTHER:
1345                          enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled                          enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1346  hostssh_enabled:  hostssh_enabled:
1347    
1348                          GetHNRec = (PGetHNRec) GetWindowLong(dlg, DWL_USER);                          GetHNRec = (PGetHNRec) GetWindowLong(dlg, DWL_USER);
1349    
1350                          if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {                          if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
1351                                  if (GetHNRec != NULL)                                  if (GetHNRec != NULL)
1352                                          SetDlgItemInt(dlg, IDC_HOSTTCPPORT, GetHNRec->TelPort,                                          SetDlgItemInt(dlg, IDC_HOSTTCPPORT, GetHNRec->TelPort,
1353                                                        FALSE);                                                        FALSE);
1354                          } else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {                          } else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1355                                  SetDlgItemInt(dlg, IDC_HOSTTCPPORT, 22, FALSE);                                  SetDlgItemInt(dlg, IDC_HOSTTCPPORT, 22, FALSE);
1356                          }                          }
1357                          return TRUE;                          return TRUE;
1358    
1359                  case IDC_HOSTCOM:                  case IDC_HOSTCOM:
1360                          if(HIWORD(wParam) == CBN_DROPDOWN) {                          if(HIWORD(wParam) == CBN_DROPDOWN) {
1361                                  HWND hostcom = GetDlgItem(dlg, IDC_HOSTCOM);                                  HWND hostcom = GetDlgItem(dlg, IDC_HOSTCOM);
1362                                  int count = SendMessage(hostcom, CB_GETCOUNT, 0, 0);                                  int count = SendMessage(hostcom, CB_GETCOUNT, 0, 0);
1363                                  int i, len, max_len = 0;                                  int i, len, max_len = 0;
1364                                  char *lbl;                                  char *lbl;
1365                                  HDC TmpDC = GetDC(hostcom);                                  HDC TmpDC = GetDC(hostcom);
1366                                  SIZE s;                                  SIZE s;
1367                                  for (i=0; i<count; i++) {                                  for (i=0; i<count; i++) {
1368                                          len = SendMessage(hostcom, CB_GETLBTEXTLEN, i, 0);                                          len = SendMessage(hostcom, CB_GETLBTEXTLEN, i, 0);
1369                                          lbl = (char *)calloc(len+1, sizeof(char));                                          lbl = (char *)calloc(len+1, sizeof(char));
1370                                          SendMessage(hostcom, CB_GETLBTEXT, i, (LPARAM)lbl);                                          SendMessage(hostcom, CB_GETLBTEXT, i, (LPARAM)lbl);
1371                                          GetTextExtentPoint32(TmpDC, lbl, len, &s);                                          GetTextExtentPoint32(TmpDC, lbl, len, &s);
1372                                          if (s.cx > max_len)                                          if (s.cx > max_len)
1373                                                  max_len = s.cx;                                                  max_len = s.cx;
1374                                          free(lbl);                                          free(lbl);
1375                                  }                                  }
1376                                  SendMessage(hostcom, CB_SETDROPPEDWIDTH,                                  SendMessage(hostcom, CB_SETDROPPEDWIDTH,
1377                                                          max_len + GetSystemMetrics(SM_CXVSCROLL), 0);                                                          max_len + GetSystemMetrics(SM_CXVSCROLL), 0);
1378                          }                          }
1379                          break;                          break;
1380    
1381                  case IDC_HOSTHELP:                  case IDC_HOSTHELP:
1382                          PostMessage(GetParent(dlg), WM_USER_DLGHELP2, 0, 0);                          PostMessage(GetParent(dlg), WM_USER_DLGHELP2, 0, 0);
1383                  }                  }
1384          }          }
1385          return FALSE;          return FALSE;
1386  }  }
1387    
1388  static BOOL FAR PASCAL TTXGetHostName(HWND parent, PGetHNRec rec)  static BOOL FAR PASCAL TTXGetHostName(HWND parent, PGetHNRec rec)
1389  {  {
1390          return (BOOL) DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_HOSTDLG),          return (BOOL) DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_HOSTDLG),
1391                                       parent, TTXHostDlg, (LONG) rec);                                       parent, TTXHostDlg, (LONG) rec);
1392  }  }
1393    
1394  static void PASCAL FAR TTXGetUIHooks(TTXUIHooks FAR * hooks)  static void PASCAL FAR TTXGetUIHooks(TTXUIHooks FAR * hooks)
1395  {  {
1396          *hooks->GetHostName = TTXGetHostName;          *hooks->GetHostName = TTXGetHostName;
1397  }  }
1398    
1399  static void FAR PASCAL TTXReadINIFile(PCHAR fileName, PTTSet ts)  static void FAR PASCAL TTXReadINIFile(PCHAR fileName, PTTSet ts)
1400  {  {
1401          (pvar->ReadIniFile) (fileName, ts);          (pvar->ReadIniFile) (fileName, ts);
1402          read_ssh_options(pvar, fileName);          read_ssh_options(pvar, fileName);
1403          pvar->settings = *pvar->ts_SSH;          pvar->settings = *pvar->ts_SSH;
1404          notify_verbose_message(pvar, "Reading INI file", LOG_LEVEL_VERBOSE);          notify_verbose_message(pvar, "Reading INI file", LOG_LEVEL_VERBOSE);
1405          FWDUI_load_settings(pvar);          FWDUI_load_settings(pvar);
1406  }  }
1407    
1408  static void FAR PASCAL TTXWriteINIFile(PCHAR fileName, PTTSet ts)  static void FAR PASCAL TTXWriteINIFile(PCHAR fileName, PTTSet ts)
1409  {  {
1410          (pvar->WriteIniFile) (fileName, ts);          (pvar->WriteIniFile) (fileName, ts);
1411          *pvar->ts_SSH = pvar->settings;          *pvar->ts_SSH = pvar->settings;
1412          clear_local_settings(pvar);          clear_local_settings(pvar);
1413          notify_verbose_message(pvar, "Writing INI file", LOG_LEVEL_VERBOSE);          notify_verbose_message(pvar, "Writing INI file", LOG_LEVEL_VERBOSE);
1414          write_ssh_options(pvar, fileName, pvar->ts_SSH, TRUE);          write_ssh_options(pvar, fileName, pvar->ts_SSH, TRUE);
1415  }  }
1416    
1417  static void read_ssh_options_from_user_file(PTInstVar pvar,  static void read_ssh_options_from_user_file(PTInstVar pvar,
1418                                              char FAR * user_file_name)                                              char FAR * user_file_name)
1419  {  {
1420          if (user_file_name[0] == '.') {          if (user_file_name[0] == '.') {
1421                  read_ssh_options(pvar, user_file_name);                  read_ssh_options(pvar, user_file_name);
1422          } else {          } else {
1423                  char buf[1024];                  char buf[1024];
1424    
1425                  get_teraterm_dir_relative_name(buf, sizeof(buf), user_file_name);                  get_teraterm_dir_relative_name(buf, sizeof(buf), user_file_name);
1426                  read_ssh_options(pvar, buf);                  read_ssh_options(pvar, buf);
1427          }          }
1428    
1429          pvar->settings = *pvar->ts_SSH;          pvar->settings = *pvar->ts_SSH;
1430          FWDUI_load_settings(pvar);          FWDUI_load_settings(pvar);
1431  }  }
1432    
1433    
1434  // @をブランクに置換する。 (2005.1.26 yutaka)  // @をブランクに置換する。 (2005.1.26 yutaka)
1435  static void replace_to_blank(char *src, char *dst, int dst_len)  static void replace_to_blank(char *src, char *dst, int dst_len)
1436  {  {
1437          int len, i;          int len, i;
1438    
1439          len = strlen(src);          len = strlen(src);
1440          if (dst_len < len) // buffer overflow check          if (dst_len < len) // buffer overflow check
1441                  return;                  return;
1442    
1443          for (i = 0 ; i < len ; i++) {          for (i = 0 ; i < len ; i++) {
1444                  if (src[i] == '@') { // @ が登場したら                  if (src[i] == '@') { // @ が登場したら
1445                          if (i < len - 1 && src[i + 1] == '@') { // その次も @ ならアットマークと認識する                          if (i < len - 1 && src[i + 1] == '@') { // その次も @ ならアットマークと認識する
1446                                  *dst++ = '@';                                  *dst++ = '@';
1447                                  i++;                                  i++;
1448                          } else {                          } else {
1449                                  *dst++ = ' '; // 空白に置き換える                                  *dst++ = ' '; // 空白に置き換える
1450                          }                          }
1451                  } else {                  } else {
1452                          *dst++ = src[i];                          *dst++ = src[i];
1453                  }                  }
1454          }          }
1455          *dst = '\0';          *dst = '\0';
1456  }  }
1457    
1458  // Percent-encodeされた文字列srcをデコードしてdstにコピーする。  // Percent-encodeされた文字列srcをデコードしてdstにコピーする。
1459  // dstlenはdstのサイズ。これより結果が長い場合、その分は切り捨てられる。  // dstlenはdstのサイズ。これより結果が長い場合、その分は切り捨てられる。
1460  static void percent_decode(char *dst, int dstlen, char *src) {  static void percent_decode(char *dst, int dstlen, char *src) {
1461          if (src == NULL || dst == NULL || dstlen < 1) {          if (src == NULL || dst == NULL || dstlen < 1) {
1462                  return;                  return;
1463          }          }
1464    
1465          while (*src != 0 && dstlen > 1) {          while (*src != 0 && dstlen > 1) {
1466                  if (*src == '%' && isxdigit(*(src+1)) && isxdigit(*(src+2))) {                  if (*src == '%' && isxdigit(*(src+1)) && isxdigit(*(src+2))) {
1467                          src++; *dst  = (isalpha(*src) ? (*src|0x20) - 'a' + 10 : *src - '0') << 4;                          src++; *dst  = (isalpha(*src) ? (*src|0x20) - 'a' + 10 : *src - '0') << 4;
1468                          src++; *dst |= (isalpha(*src) ? (*src|0x20) - 'a' + 10 : *src - '0');                          src++; *dst |= (isalpha(*src) ? (*src|0x20) - 'a' + 10 : *src - '0');
1469                          src++; dst++;                          src++; dst++;
1470                  }                  }
1471                  else {                  else {
1472                          *dst++ = *src++;                          *dst++ = *src++;
1473                  }                  }
1474                  dstlen--;                  dstlen--;
1475          }          }
1476          *dst = 0;          *dst = 0;
1477          return;          return;
1478  }  }
1479    
1480  /* returns 1 if the option text must be deleted */  /* returns 1 if the option text must be deleted */
1481  static int parse_option(PTInstVar pvar, char FAR * option)  static int parse_option(PTInstVar pvar, char FAR * option)
1482  {  {
1483          if ((option[0] == '-' || option[0] == '/')) {          if ((option[0] == '-' || option[0] == '/')) {
1484                  if (MATCH_STR(option + 1, "ssh") == 0) {                  if (MATCH_STR(option + 1, "ssh") == 0) {
1485                          if (option[4] == 0) {                          if (option[4] == 0) {
1486                                  pvar->settings.Enabled = 1;                                  pvar->settings.Enabled = 1;
1487                          } else if (MATCH_STR(option + 4, "-L") == 0 ||                          } else if (MATCH_STR(option + 4, "-L") == 0 ||
1488                                     MATCH_STR(option + 4, "-R") == 0 ||                                     MATCH_STR(option + 4, "-R") == 0 ||
1489                                     _stricmp(option + 4, "-X") == 0) {                                     _stricmp(option + 4, "-X") == 0) {
1490                                  if (pvar->settings.DefaultForwarding[0] == 0) {                                  if (pvar->settings.DefaultForwarding[0] == 0) {
1491                                          strncpy_s(pvar->settings.DefaultForwarding,                                          strncpy_s(pvar->settings.DefaultForwarding,
1492                                                    sizeof(pvar->settings.DefaultForwarding),                                                    sizeof(pvar->settings.DefaultForwarding),
1493                                                    option + 5, _TRUNCATE);                                                    option + 5, _TRUNCATE);
1494                                  } else {                                  } else {
1495                                          strncat_s(pvar->settings.DefaultForwarding,                                          strncat_s(pvar->settings.DefaultForwarding,
1496                                                    sizeof(pvar->settings.DefaultForwarding),                                                    sizeof(pvar->settings.DefaultForwarding),
1497                                                    ";", _TRUNCATE);                                                    ";", _TRUNCATE);
1498                                          strncat_s(pvar->settings.DefaultForwarding,                                          strncat_s(pvar->settings.DefaultForwarding,
1499                                                    sizeof(pvar->settings.DefaultForwarding),                                                    sizeof(pvar->settings.DefaultForwarding),
1500                                                    option + 5, _TRUNCATE);                                                    option + 5, _TRUNCATE);
1501                                  }                                  }
1502                          } else if (MATCH_STR(option + 4, "-f=") == 0) {                          } else if (MATCH_STR(option + 4, "-f=") == 0) {
1503                                  read_ssh_options_from_user_file(pvar, option + 7);                                  read_ssh_options_from_user_file(pvar, option + 7);
1504                          } else if (MATCH_STR(option + 4, "-v") == 0) {                          } else if (MATCH_STR(option + 4, "-v") == 0) {
1505                                  pvar->settings.LogLevel = LOG_LEVEL_VERBOSE;                                  pvar->settings.LogLevel = LOG_LEVEL_VERBOSE;
1506                          } else if (_stricmp(option + 4, "-autologin") == 0 ||                          } else if (_stricmp(option + 4, "-autologin") == 0 ||
1507                                     _stricmp(option + 4, "-autologon") == 0) {                                     _stricmp(option + 4, "-autologon") == 0) {
1508                                  pvar->settings.TryDefaultAuth = TRUE;                                  pvar->settings.TryDefaultAuth = TRUE;
1509    
1510                          } else if (_stricmp(option + 4, "-acceptall") == 0) {                          } else if (_stricmp(option + 4, "-acceptall") == 0) {
1511                                  pvar->settings.LocalForwardingIdentityCheck = FALSE;                                  pvar->settings.LocalForwardingIdentityCheck = FALSE;
1512    
1513                          // -axxより上にしてはだめ                          // -axxより上にしてはだめ
1514                          } else if (MATCH_STR(option + 4, "-a") == 0) {                          } else if (MATCH_STR(option + 4, "-a") == 0) {
1515                                  pvar->settings.ForwardAgent = FALSE;                                  pvar->settings.ForwardAgent = FALSE;
1516                          } else if (MATCH_STR(option + 4, "-A") == 0) {                          } else if (MATCH_STR(option + 4, "-A") == 0) {
1517                                  pvar->settings.ForwardAgent = TRUE;                                  pvar->settings.ForwardAgent = TRUE;
1518    
1519                          } else if (MATCH_STR(option + 4, "-consume=") == 0) {                          } else if (MATCH_STR(option + 4, "-consume=") == 0) {
1520                                  read_ssh_options_from_user_file(pvar, option + 13);                                  read_ssh_options_from_user_file(pvar, option + 13);
1521                                  DeleteFile(option + 13);                                  DeleteFile(option + 13);
1522    
1523                          // /ssh1 と /ssh2 オプションの新規追加 (2006.9.16 maya)                          // /ssh1 と /ssh2 オプションの新規追加 (2006.9.16 maya)
1524                          } else if (MATCH_STR(option + 4, "1") == 0) {                          } else if (MATCH_STR(option + 4, "1") == 0) {
1525                                  pvar->settings.Enabled = 1;                                  pvar->settings.Enabled = 1;
1526                                  pvar->settings.ssh_protocol_version = 1;                                  pvar->settings.ssh_protocol_version = 1;
1527                          } else if (MATCH_STR(option + 4, "2") == 0) {                          } else if (MATCH_STR(option + 4, "2") == 0) {
1528                                  pvar->settings.Enabled = 1;                                  pvar->settings.Enabled = 1;
1529                                  pvar->settings.ssh_protocol_version = 2;                                  pvar->settings.ssh_protocol_version = 2;
1530    
1531                          } else {                          } else {
1532                                  char buf[1024];                                  char buf[1024];
1533    
1534                                  UTIL_get_lang_msg("MSG_UNKNOWN_OPTION_ERROR", pvar,                                  UTIL_get_lang_msg("MSG_UNKNOWN_OPTION_ERROR", pvar,
1535                                                    "Unrecognized command-line option: %s");                                                    "Unrecognized command-line option: %s");
1536                                  _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, option);                                  _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, option);
1537    
1538                                  MessageBox(NULL, buf, "TTSSH", MB_OK | MB_ICONEXCLAMATION);                                  MessageBox(NULL, buf, "TTSSH", MB_OK | MB_ICONEXCLAMATION);
1539                          }                          }
1540    
1541                          return OPTION_CLEAR;                          return OPTION_CLEAR;
1542    
1543                  // ttermpro.exe の /T= 指定の流用なので、大文字も許す (2006.10.19 maya)                  // ttermpro.exe の /T= 指定の流用なので、大文字も許す (2006.10.19 maya)
1544                  } else if (MATCH_STR_I(option + 1, "t=") == 0) {                  } else if (MATCH_STR_I(option + 1, "t=") == 0) {
1545                          if (strcmp(option + 3, "2") == 0) {                          if (strcmp(option + 3, "2") == 0) {
1546                                  pvar->settings.Enabled = 1;                                  pvar->settings.Enabled = 1;
1547                                  return OPTION_CLEAR;                                  return OPTION_CLEAR;
1548                          } else {                          } else {
1549                                  pvar->settings.Enabled = 0;                                  pvar->settings.Enabled = 0;
1550                          }                          }
1551    
1552                  // ttermpro.exe の /F= 指定でも TTSSH の設定を読む (2006.10.11 maya)                  // ttermpro.exe の /F= 指定でも TTSSH の設定を読む (2006.10.11 maya)
1553                  } else if (MATCH_STR_I(option + 1, "f=") == 0) {                  } else if (MATCH_STR_I(option + 1, "f=") == 0) {
1554                          read_ssh_options_from_user_file(pvar, option + 3);                          read_ssh_options_from_user_file(pvar, option + 3);
1555    
1556                  // /1 および /2 オプションの新規追加 (2004.10.3 yutaka)                  // /1 および /2 オプションの新規追加 (2004.10.3 yutaka)
1557                  } else if (MATCH_STR(option + 1, "1") == 0) {                  } else if (MATCH_STR(option + 1, "1") == 0) {
1558                          // command line: /ssh /1 is SSH1 only                          // command line: /ssh /1 is SSH1 only
1559                          pvar->settings.ssh_protocol_version = 1;                          pvar->settings.ssh_protocol_version = 1;
1560    
1561                  } else if (MATCH_STR(option + 1, "2") == 0) {                  } else if (MATCH_STR(option + 1, "2") == 0) {
1562                          // command line: /ssh /2 is SSH2 & SSH1                          // command line: /ssh /2 is SSH2 & SSH1
1563                          pvar->settings.ssh_protocol_version = 2;                          pvar->settings.ssh_protocol_version = 2;
1564    
1565                  } else if (MATCH_STR(option + 1, "nossh") == 0) {                  } else if (MATCH_STR(option + 1, "nossh") == 0) {
1566                          // '/nossh' オプションの追加。                          // '/nossh' オプションの追加。
1567                          // TERATERM.INI でSSHが有効になっている場合、うまくCygtermが起動しないことが                          // TERATERM.INI でSSHが有効になっている場合、うまくCygtermが起動しないことが
1568                          // あることへの対処。(2004.10.11 yutaka)                          // あることへの対処。(2004.10.11 yutaka)
1569                          pvar->settings.Enabled = 0;                          pvar->settings.Enabled = 0;
1570    
1571                  } else if (MATCH_STR(option + 1, "telnet") == 0) {                  } else if (MATCH_STR(option + 1, "telnet") == 0) {
1572                          // '/telnet' が指定されているときには '/nossh' と同じく                          // '/telnet' が指定されているときには '/nossh' と同じく
1573                          // SSHを無効にする (2006.9.16 maya)                          // SSHを無効にする (2006.9.16 maya)
1574                          pvar->settings.Enabled = 0;                          pvar->settings.Enabled = 0;
1575    
1576                  } else if (MATCH_STR(option + 1, "auth") == 0) {                  } else if (MATCH_STR(option + 1, "auth") == 0) {
1577                          // SSH2自動ログインオプションの追加                          // SSH2自動ログインオプションの追加
1578                          //                          //
1579                          // SYNOPSIS: /ssh /auth=passowrd /user=ユーザ名 /passwd=パスワード                          // SYNOPSIS: /ssh /auth=passowrd /user=ユーザ名 /passwd=パスワード
1580                          //           /ssh /auth=publickey /user=ユーザ名 /passwd=パスワード /keyfile=パス                          //           /ssh /auth=publickey /user=ユーザ名 /passwd=パスワード /keyfile=パス
1581                          // EXAMPLE: /ssh /auth=password /user=nike /passwd=a@bc                          // EXAMPLE: /ssh /auth=password /user=nike /passwd=a@bc
1582                          //          /ssh /auth=publickey /user=foo /passwd=bar /keyfile=d:\tmp\id_rsa                          //          /ssh /auth=publickey /user=foo /passwd=bar /keyfile=d:\tmp\id_rsa
1583                          // NOTICE: パスワードやパスに空白が含む場合は、ブランクの代わりに @ を使うこと。                          // NOTICE: パスワードやパスに空白が含む場合は、ブランクの代わりに @ を使うこと。
1584                          //                          //
1585                          // (2004.11.30 yutaka)                          // (2004.11.30 yutaka)
1586                          // (2005.1.26 yutaka) 空白対応。公開鍵認証サポート。                          // (2005.1.26 yutaka) 空白対応。公開鍵認証サポート。
1587                          //                          //
1588                          pvar->ssh2_autologin = 1; // for SSH2 (2004.11.30 yutaka)                          pvar->ssh2_autologin = 1; // for SSH2 (2004.11.30 yutaka)
1589    
1590                          if (MATCH_STR(option + 5, "=password") == 0) { // パスワード                          if (MATCH_STR(option + 5, "=password") == 0) { // パスワード
1591                                  //pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;                                  //pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
1592                                  pvar->ssh2_authmethod = SSH_AUTH_PASSWORD;                                  pvar->ssh2_authmethod = SSH_AUTH_PASSWORD;
1593    
1594                          // /auth=challenge を追加 (2007.10.5 maya)                          // /auth=challenge を追加 (2007.10.5 maya)
1595                          } else if (MATCH_STR(option + 5, "=challenge") == 0) { // keyboard-interactive認証                          } else if (MATCH_STR(option + 5, "=challenge") == 0) { // keyboard-interactive認証
1596                                  //pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;                                  //pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
1597                                  pvar->ssh2_authmethod = SSH_AUTH_TIS;                                  pvar->ssh2_authmethod = SSH_AUTH_TIS;
1598    
1599                          } else if (MATCH_STR(option + 5, "=publickey") == 0) { // 公開鍵認証                          } else if (MATCH_STR(option + 5, "=publickey") == 0) { // 公開鍵認証
1600                                  //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;                                  //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
1601                                  pvar->ssh2_authmethod = SSH_AUTH_RSA;                                  pvar->ssh2_authmethod = SSH_AUTH_RSA;
1602    
1603                          } else if (MATCH_STR(option + 5, "=pageant") == 0) { // 公開鍵認証 by Pageant                          } else if (MATCH_STR(option + 5, "=pageant") == 0) { // 公開鍵認証 by Pageant
1604                                  //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;                                  //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
1605                                  pvar->ssh2_authmethod = SSH_AUTH_PAGEANT;                                  pvar->ssh2_authmethod = SSH_AUTH_PAGEANT;
1606    
1607                          } else {                          } else {
1608                                  // TODO:                                  // TODO:
1609    
1610                          }                          }
1611    
1612                  } else if (MATCH_STR(option + 1, "user=") == 0) {                  } else if (MATCH_STR(option + 1, "user=") == 0) {
1613                          replace_to_blank(option + 6, pvar->ssh2_username, sizeof(pvar->ssh2_username));                          replace_to_blank(option + 6, pvar->ssh2_username, sizeof(pvar->ssh2_username));
1614                          //_snprintf(pvar->ssh2_username, sizeof(pvar->ssh2_username), "%s", option + 6);                          //_snprintf(pvar->ssh2_username, sizeof(pvar->ssh2_username), "%s", option + 6);
1615    
1616                  } else if (MATCH_STR(option + 1, "passwd=") == 0) {                  } else if (MATCH_STR(option + 1, "passwd=") == 0) {
1617                          replace_to_blank(option + 8, pvar->ssh2_password, sizeof(pvar->ssh2_password));                          replace_to_blank(option + 8, pvar->ssh2_password, sizeof(pvar->ssh2_password));
1618                          //_snprintf(pvar->ssh2_password, sizeof(pvar->ssh2_password), "%s", option + 8);                          //_snprintf(pvar->ssh2_password, sizeof(pvar->ssh2_password), "%s", option + 8);
1619    
1620                  } else if (MATCH_STR(option + 1, "keyfile=") == 0) {                  } else if (MATCH_STR(option + 1, "keyfile=") == 0) {
1621                          replace_to_blank(option + 9, pvar->ssh2_keyfile, sizeof(pvar->ssh2_keyfile));                          replace_to_blank(option + 9, pvar->ssh2_keyfile, sizeof(pvar->ssh2_keyfile));
1622    
1623                  } else if (MATCH_STR(option + 1, "ask4passwd") == 0) {                  } else if (MATCH_STR(option + 1, "ask4passwd") == 0) {
1624                          // パスワードを聞く (2006.9.18 maya)                          // パスワードを聞く (2006.9.18 maya)
1625                          pvar->ask4passwd = 1;                          pvar->ask4passwd = 1;
1626    
1627                  }                  }
1628    
1629                  // パスワードを聞く場合は自動ログインが無効になる                  // パスワードを聞く場合は自動ログインが無効になる
1630                  // /auth は認証メソッドの指定としては利用される (2006.9.18 maya)                  // /auth は認証メソッドの指定としては利用される (2006.9.18 maya)
1631                  if (pvar->ask4passwd == 1) {                  if (pvar->ask4passwd == 1) {
1632                          pvar->ssh2_autologin = 0;                          pvar->ssh2_autologin = 0;
1633                  }                  }
1634    
1635          }          }
1636          else if ((MATCH_STR_I(option, "ssh://") == 0) ||          else if ((MATCH_STR_I(option, "ssh://") == 0) ||
1637                   (MATCH_STR_I(option, "ssh1://") == 0) ||                   (MATCH_STR_I(option, "ssh1://") == 0) ||
1638                   (MATCH_STR_I(option, "ssh2://") == 0) ||                   (MATCH_STR_I(option, "ssh2://") == 0) ||
1639                   (MATCH_STR_I(option, "slogin://") == 0) ||                   (MATCH_STR_I(option, "slogin://") == 0) ||
1640                   (MATCH_STR_I(option, "slogin1://") == 0) ||                   (MATCH_STR_I(option, "slogin1://") == 0) ||
1641                   (MATCH_STR_I(option, "slogin2://") == 0)) {                   (MATCH_STR_I(option, "slogin2://") == 0)) {
1642                  //                  //
1643                  // ssh://user@host/ 等のURL形式のサポート                  // ssh://user@host/ 等のURL形式のサポート
1644                  // 基本的な書式は telnet:// URLに順ずる                  // 基本的な書式は telnet:// URLに順ずる
1645                  //                  //
1646                  // 参考:                  // 参考:
1647                  //   RFC3986: Uniform Resource Identifier (URI): Generic Syntax                  //   RFC3986: Uniform Resource Identifier (URI): Generic Syntax
1648                  //   RFC4248: The telnet URI Scheme                  //   RFC4248: The telnet URI Scheme
1649                  //                  //
1650                  char *p, *p2, *p3;                  char *p, *p2, *p3;
1651                  int optlen, hostlen;                  int optlen, hostlen;
1652    
1653                  optlen = strlen(option);                  optlen = strlen(option);
1654    
1655                  // 最初の':'の前の文字が数字だった場合、それをsshプロトコルバージョンとみなす                  // 最初の':'の前の文字が数字だった場合、それをsshプロトコルバージョンとみなす
1656                  p = strchr(option, ':');                  p = strchr(option, ':');
1657                  switch (*(p-1)) {                  switch (*(p-1)) {
1658                  case '1':                  case '1':
1659                          pvar->settings.ssh_protocol_version = 1;                          pvar->settings.ssh_protocol_version = 1;
1660                          break;                          break;
1661                  case '2':                  case '2':
1662                          pvar->settings.ssh_protocol_version = 2;                          pvar->settings.ssh_protocol_version = 2;
1663                          break;                          break;
1664                  }                  }
1665    
1666                  // authority part までポインタを移動                  // authority part までポインタを移動
1667                  p += 3;                  p += 3;
1668    
1669                  // path part を切り捨てる                  // path part を切り捨てる
1670                  if ((p2 = strchr(p, '/')) != NULL) {                  if ((p2 = strchr(p, '/')) != NULL) {
1671                          *p2 = 0;                          *p2 = 0;
1672                  }                  }
1673    
1674                  // '@'があった場合、それより前はユーザ情報                  // '@'があった場合、それより前はユーザ情報
1675                  if ((p2 = strchr(p, '@')) != NULL) {                  if ((p2 = strchr(p, '@')) != NULL) {
1676                          *p2 = 0;                          *p2 = 0;
1677                          // ':'以降はパスワード                          // ':'以降はパスワード
1678                          if ((p3 = strchr(p, ':')) != NULL) {                          if ((p3 = strchr(p, ':')) != NULL) {
1679                                  *p3 = 0;                                  *p3 = 0;
1680                                  percent_decode(pvar->ssh2_password, sizeof(pvar->ssh2_password), p3 + 1);                                  percent_decode(pvar->ssh2_password, sizeof(pvar->ssh2_password), p3 + 1);
1681                                  pvar->ssh2_autologin = 1;                                  pvar->ssh2_autologin = 1;
1682                          }                          }
1683                          percent_decode(pvar->ssh2_username, sizeof(pvar->ssh2_username), p);                          percent_decode(pvar->ssh2_username, sizeof(pvar->ssh2_username), p);
1684                          // p が host part の先頭('@'の次の文字)を差すようにする                          // p が host part の先頭('@'の次の文字)を差すようにする
1685                          p = p2 + 1;                          p = p2 + 1;
1686                  }                  }
1687    
1688                  // host part を option の先頭に移動して、scheme part を潰す                  // host part を option の先頭に移動して、scheme part を潰す
1689                  // port指定が無かった時にport番号を足すための領域確保の意味もある                  // port指定が無かった時にport番号を足すための領域確保の意味もある
1690                  hostlen = strlen(p);                  hostlen = strlen(p);
1691                  memmove_s(option, optlen, p, hostlen);                  memmove_s(option, optlen, p, hostlen);
1692                  option[hostlen] = 0;                  option[hostlen] = 0;
1693    
1694                  // ポート指定が無い時は":22"を足す                  // ポート指定が無い時は":22"を足す
1695  #ifndef NO_INET6  #ifndef NO_INET6
1696                  if (option[0] == '[' && option[hostlen-1] == ']' ||     // IPv6 raw address without port                  if (option[0] == '[' && option[hostlen-1] == ']' ||     // IPv6 raw address without port
1697                      option[0] != '[' && strchr(option, ':') == NULL) {  // hostname or IPv4 raw address without port                      option[0] != '[' && strchr(option, ':') == NULL) {  // hostname or IPv4 raw address without port
1698  #else  #else
1699                  if (strchr(option, ':') == NULL) {                  if (strchr(option, ':') == NULL) {
1700  #endif                                                  /* NO_INET6 */  #endif                                                  /* NO_INET6 */
1701                          memcpy_s(option+hostlen, optlen-hostlen, ":22", 3);                          memcpy_s(option+hostlen, optlen-hostlen, ":22", 3);
1702                          hostlen += 3;                          hostlen += 3;
1703                  }                  }
1704    
1705                  // ポート指定より後をすべてスペースで潰す                  // ポート指定より後をすべてスペースで潰す
1706                  memset(option+hostlen, ' ', optlen-hostlen);                  memset(option+hostlen, ' ', optlen-hostlen);
1707    
1708                  pvar->settings.Enabled = 1;                  pvar->settings.Enabled = 1;
1709    
1710                  return OPTION_REPLACE;                  return OPTION_REPLACE;
1711          }          }
1712          else if (strchr(option, '@') != NULL) {          else if (strchr(option, '@') != NULL) {
1713                  //                  //
1714                  // user@host 形式のサポート                  // user@host 形式のサポート
1715                  //   取り合えずsshでのみサポートの為、ユーザ名はttssh内で潰す。                  //   取り合えずsshでのみサポートの為、ユーザ名はttssh内で潰す。
1716                  //   (ssh接続以外 --  ttsshには関係ない場合でも)                  //   (ssh接続以外 --  ttsshには関係ない場合でも)
1717                  //   将来的にtelnet authentication optionをサポートした時は                  //   将来的にtelnet authentication optionをサポートした時は
1718                  //   Tera Term本体で処理するようにする予定。                  //   Tera Term本体で処理するようにする予定。
1719                  //                  //
1720                  char *p;                  char *p;
1721                  p = strchr(option, '@');                  p = strchr(option, '@');
1722                  *p = 0;                  *p = 0;
1723    
1724                  strncpy_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), option, _TRUNCATE);                  strncpy_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), option, _TRUNCATE);
1725    
1726                  // ユーザ名部分をスペースで潰す。                  // ユーザ名部分をスペースで潰す。
1727                  // 後続のTTXやTera Term本体で解釈する時にはスペースを読み飛ばすので、                  // 後続のTTXやTera Term本体で解釈する時にはスペースを読み飛ばすので、
1728                  // ホスト名を先頭に詰める必要は無い。                  // ホスト名を先頭に詰める必要は無い。
1729                  memset(option, ' ', p-option+1);                  memset(option, ' ', p-option+1);
1730    
1731                  return OPTION_REPLACE;                  return OPTION_REPLACE;
1732          }          }
1733    
1734          return OPTION_NONE;          return OPTION_NONE;
1735  }  }
1736    
1737  static void FAR PASCAL TTXParseParam(PCHAR param, PTTSet ts,  static void FAR PASCAL TTXParseParam(PCHAR param, PTTSet ts,
1738                                       PCHAR DDETopic)                                       PCHAR DDETopic)
1739  {  {
1740          // スペースを含むファイル名を認識するように修正 (2006.10.7 maya)          // スペースを含むファイル名を認識するように修正 (2006.10.7 maya)
1741          int i, buflen;          int i, buflen;
1742          BOOL inParam = FALSE;          BOOL inParam = FALSE;
1743          BOOL inQuotes = FALSE;          BOOL inQuotes = FALSE;
1744          BOOL inFileParam = FALSE;          BOOL inFileParam = FALSE;
1745          PCHAR option = NULL;          PCHAR option = NULL;
1746    
1747          if (pvar->hostdlg_activated) {          if (pvar->hostdlg_activated) {
1748                  pvar->settings.Enabled = pvar->hostdlg_Enabled;                  pvar->settings.Enabled = pvar->hostdlg_Enabled;
1749          }          }
1750    
1751          for (i = 0; param[i] != 0; i++) {          for (i = 0; param[i] != 0; i++) {
1752                  if (inQuotes ? param[i] == '"'                  if (inQuotes ? param[i] == '"'
1753                               : (param[i] == ' ' || param[i] == '\t')) {                               : (param[i] == ' ' || param[i] == '\t')) {
1754                          if (option != NULL) {                          if (option != NULL) {
1755                                  char ch = param[i];                                  char ch = param[i];
1756                                  PCHAR Equal;                                  PCHAR Equal;
1757    
1758                                  param[i] = 0;                                  param[i] = 0;
1759                                  Equal = strchr(option, '=');                                  Equal = strchr(option, '=');
1760                                  if (inFileParam && Equal != NULL && *(Equal + 1) == '"') {                                  if (inFileParam && Equal != NULL && *(Equal + 1) == '"') {
1761                                          int buf_len = strlen(option) * sizeof(char);                                          int buf_len = strlen(option) * sizeof(char);
1762                                          char *buf = (char *)calloc(strlen(option), sizeof(char));                                          char *buf = (char *)calloc(strlen(option), sizeof(char));
1763                                          char c = option[Equal - option + 1];                                          char c = option[Equal - option + 1];
1764                                          option[Equal - option + 1] = 0;                                          option[Equal - option + 1] = 0;
1765                                          strncat_s(buf, buf_len, option, _TRUNCATE);                                          strncat_s(buf, buf_len, option, _TRUNCATE);
1766                                          option[Equal - option + 1] = c;                                          option[Equal - option + 1] = c;
1767                                          strncat_s(buf, buf_len, Equal + 2, _TRUNCATE);                                          strncat_s(buf, buf_len, Equal + 2, _TRUNCATE);
1768                                          switch (parse_option(pvar, *buf == '"' ? buf + 1 : buf)) {                                          switch (parse_option(pvar, *buf == '"' ? buf + 1 : buf)) {
1769                                            case OPTION_CLEAR:                                            case OPTION_CLEAR:
1770                                                  memset(option, ' ', i + 1 - (option - param));                                                  memset(option, ' ', i + 1 - (option - param));
1771                                                  break;                                                  break;
1772                                            case OPTION_REPLACE:                                            case OPTION_REPLACE:
1773                                                  buflen = strlen(buf);                                                  buflen = strlen(buf);
1774                                                  memcpy(option, buf, buflen);                                                  memcpy(option, buf, buflen);
1775                                                  memset(option + buflen, ' ', i + 1 - buflen - (option - param));                                                  memset(option + buflen, ' ', i + 1 - buflen - (option - param));
1776                                                  break;                                                  break;
1777                                            default:                                            default:
1778                                                  param[i] = ch;                                                  param[i] = ch;
1779                                          }                                          }
1780                                          free(buf);                                          free(buf);
1781                                  }                                  }
1782                                  else {                                  else {
1783                                          switch (parse_option(pvar, *option == '"' ? option + 1 : option)) {                                          switch (parse_option(pvar, *option == '"' ? option + 1 : option)) {
1784                                            case OPTION_CLEAR:                                            case OPTION_CLEAR:
1785                                                  memset(option, ' ', i + 1 - (option - param));                                                  memset(option, ' ', i + 1 - (option - param));
1786                                                  break;                                                  break;
1787                                            default:                                            default:
1788                                                  param[i] = ch;                                                  param[i] = ch;
1789                                          }                                          }
1790                                  }                                  }
1791                                  option = NULL;                                  option = NULL;
1792                          }                          }
1793                          inParam = FALSE;                          inParam = FALSE;
1794                          inQuotes = FALSE;                          inQuotes = FALSE;
1795                          inFileParam = FALSE;                          inFileParam = FALSE;
1796                  } else if (!inParam) {                  } else if (!inParam) {
1797                          if (param[i] == '"') {                          if (param[i] == '"') {
1798                                  inQuotes = TRUE;                                  inQuotes = TRUE;
1799                                  inParam = TRUE;                                  inParam = TRUE;
1800                                  option = param + i;                                  option = param + i;
1801                          } else if (param[i] != ' ' && param[i] != '\t') {                          } else if (param[i] != ' ' && param[i] != '\t') {
1802                                  inParam = TRUE;                                  inParam = TRUE;
1803                                  option = param + i;                                  option = param + i;
1804                          }                          }
1805                  } else {                  } else {
1806                          if (option == NULL) {                          if (option == NULL) {
1807                                  continue;                                  continue;
1808                          }                          }
1809                          if ((option[0] == '-' || option[0] == '/') &&                          if ((option[0] == '-' || option[0] == '/') &&
1810                              (MATCH_STR(option + 1, "ssh-f=") == 0 ||                              (MATCH_STR(option + 1, "ssh-f=") == 0 ||
1811                               MATCH_STR(option + 1, "ssh-consume=") == 0 ||                               MATCH_STR(option + 1, "ssh-consume=") == 0 ||
1812                               MATCH_STR_I(option + 1, "f=") == 0 ||                               MATCH_STR_I(option + 1, "f=") == 0 ||
1813                               MATCH_STR(option + 1, "keyfile=") == 0)) {                               MATCH_STR(option + 1, "keyfile=") == 0)) {
1814                                  if (param[i] == '"') {                                  if (param[i] == '"') {
1815                                          inQuotes = TRUE;                                          inQuotes = TRUE;
1816                                  }                                  }
1817                                  inFileParam = TRUE;                                  inFileParam = TRUE;
1818                          }                          }
1819                  }                  }
1820          }          }
1821    
1822          if (option != NULL) {          if (option != NULL) {
1823                  PCHAR Equal = strchr(option, '=');                  PCHAR Equal = strchr(option, '=');
1824                  if (inFileParam && Equal != NULL && *(Equal + 1) == '"') {                  if (inFileParam && Equal != NULL && *(Equal + 1) == '"') {
1825                          int buf_len = strlen(option) * sizeof(char);                          int buf_len = strlen(option) * sizeof(char);
1826                          char *buf = (char *)calloc(strlen(option), sizeof(char));                          char *buf = (char *)calloc(strlen(option), sizeof(char));
1827                          char c = option[Equal - option + 1];                          char c = option[Equal - option + 1];
1828                          option[Equal - option + 1] = 0;                          option[Equal - option + 1] = 0;
1829                          strncat_s(buf, buf_len, option, _TRUNCATE);                          strncat_s(buf, buf_len, option, _TRUNCATE);
1830                          option[Equal - option + 1] = c;                          option[Equal - option + 1] = c;
1831                          strncat_s(buf, buf_len, Equal + 2, _TRUNCATE);                          strncat_s(buf, buf_len, Equal + 2, _TRUNCATE);
1832                          switch (parse_option(pvar, *buf == '"' ? buf + 1 : buf)) {                          switch (parse_option(pvar, *buf == '"' ? buf + 1 : buf)) {
1833                            case OPTION_CLEAR:                            case OPTION_CLEAR:
1834                                  memset(option, ' ', i + 1 - (option - param));                                  memset(option, ' ', i + 1 - (option - param));
1835                                  break;                                  break;
1836                            case OPTION_REPLACE:                            case OPTION_REPLACE:
1837                                  strcpy_s(option, i - (param - option), buf);                                  strcpy_s(option, i - (param - option), buf);
1838                                  break;                                  break;
1839                          }                          }
1840                          free(buf);                          free(buf);
1841                  }                  }
1842                  else {                  else {
1843                          switch (parse_option(pvar, option)) {                          switch (parse_option(pvar, option)) {
1844                            case OPTION_CLEAR:                            case OPTION_CLEAR:
1845                                  memset(option, ' ', i - (option - param));                                  memset(option, ' ', i - (option - param));
1846                                  break;                                  break;
1847                          }                          }
1848                  }                  }
1849          }          }
1850    
1851          FWDUI_load_settings(pvar);          FWDUI_load_settings(pvar);
1852    
1853          (pvar->ParseParam) (param, ts, DDETopic);          (pvar->ParseParam) (param, ts, DDETopic);
1854    
1855  }  }
1856    
1857  static void PASCAL FAR TTXGetSetupHooks(TTXSetupHooks FAR * hooks)  static void PASCAL FAR TTXGetSetupHooks(TTXSetupHooks FAR * hooks)
1858  {  {
1859          pvar->ReadIniFile = *hooks->ReadIniFile;          pvar->ReadIniFile = *hooks->ReadIniFile;
1860          pvar->WriteIniFile = *hooks->WriteIniFile;          pvar->WriteIniFile = *hooks->WriteIniFile;
1861          pvar->ParseParam = *hooks->ParseParam;          pvar->ParseParam = *hooks->ParseParam;
1862    
1863          *hooks->ReadIniFile = TTXReadINIFile;          *hooks->ReadIniFile = TTXReadINIFile;
1864          *hooks->WriteIniFile = TTXWriteINIFile;          *hooks->WriteIniFile = TTXWriteINIFile;
1865          *hooks->ParseParam = TTXParseParam;          *hooks->ParseParam = TTXParseParam;
1866  }  }
1867    
1868  static void PASCAL FAR TTXSetWinSize(int rows, int cols)  static void PASCAL FAR TTXSetWinSize(int rows, int cols)
1869  {  {
1870          SSH_notify_win_size(pvar, cols, rows);          SSH_notify_win_size(pvar, cols, rows);
1871  }  }
1872    
1873  static void insertMenuBeforeItem(HMENU menu, WORD beforeItemID, WORD flags,  static void insertMenuBeforeItem(HMENU menu, WORD beforeItemID, WORD flags,
1874                                   WORD newItemID, char FAR * text)                                   WORD newItemID, char FAR * text)
1875  {  {
1876          int i, j;          int i, j;
1877    
1878          for (i = GetMenuItemCount(menu) - 1; i >= 0; i--) {          for (i = GetMenuItemCount(menu) - 1; i >= 0; i--) {
1879                  HMENU submenu = GetSubMenu(menu, i);                  HMENU submenu = GetSubMenu(menu, i);
1880    
1881                  for (j = GetMenuItemCount(submenu) - 1; j >= 0; j--) {                  for (j = GetMenuItemCount(submenu) - 1; j >= 0; j--) {
1882                          if (GetMenuItemID(submenu, j) == beforeItemID) {                          if (GetMenuItemID(submenu, j) == beforeItemID) {
1883                                  InsertMenu(submenu, j, MF_BYPOSITION | flags, newItemID, text);                                  InsertMenu(submenu, j, MF_BYPOSITION | flags, newItemID, text);
1884                                  return;                                  return;
1885                          }                          }
1886                  }                  }
1887          }          }
1888  }  }
1889    
1890  static void PASCAL FAR TTXModifyMenu(HMENU menu)  static void PASCAL FAR TTXModifyMenu(HMENU menu)
1891  {  {
1892          /* inserts before ID_HELP_ABOUT */          /* inserts before ID_HELP_ABOUT */
1893          UTIL_get_lang_msg("MENU_ABOUT", pvar, "About &TTSSH...");          UTIL_get_lang_msg("MENU_ABOUT", pvar, "About &TTSSH...");
1894          insertMenuBeforeItem(menu, 50990, MF_ENABLED, ID_ABOUTMENU, pvar->ts->UIMsg);          insertMenuBeforeItem(menu, 50990, MF_ENABLED, ID_ABOUTMENU, pvar->ts->UIMsg);
1895    
1896          /* inserts before ID_SETUP_TCPIP */          /* inserts before ID_SETUP_TCPIP */
1897          UTIL_get_lang_msg("MENU_SSH", pvar, "SS&H...");          UTIL_get_lang_msg("MENU_SSH", pvar, "SS&H...");
1898          insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHSETUPMENU, pvar->ts->UIMsg);          insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHSETUPMENU, pvar->ts->UIMsg);
1899          /* inserts before ID_SETUP_TCPIP */          /* inserts before ID_SETUP_TCPIP */
1900          UTIL_get_lang_msg("MENU_SSH_AUTH", pvar, "SSH &Authentication...");          UTIL_get_lang_msg("MENU_SSH_AUTH", pvar, "SSH &Authentication...");
1901          insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHAUTHSETUPMENU, pvar->ts->UIMsg);          insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHAUTHSETUPMENU, pvar->ts->UIMsg);
1902          /* inserts before ID_SETUP_TCPIP */          /* inserts before ID_SETUP_TCPIP */
1903          UTIL_get_lang_msg("MENU_SSH_FORWARD", pvar, "SSH F&orwarding...");          UTIL_get_lang_msg("MENU_SSH_FORWARD", pvar, "SSH F&orwarding...");
1904          insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHFWDSETUPMENU, pvar->ts->UIMsg);          insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHFWDSETUPMENU, pvar->ts->UIMsg);
1905          UTIL_get_lang_msg("MENU_SSH_KEYGEN", pvar, "SSH KeyGe&nerator...");          UTIL_get_lang_msg("MENU_SSH_KEYGEN", pvar, "SSH KeyGe&nerator...");
1906          insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHKEYGENMENU, pvar->ts->UIMsg);          insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHKEYGENMENU, pvar->ts->UIMsg);
1907    
1908          /* inserts before ID_FILE_CHANGEDIR */          /* inserts before ID_FILE_CHANGEDIR */
1909          UTIL_get_lang_msg("MENU_SSH_SCP", pvar, "SS&H SCP...");          UTIL_get_lang_msg("MENU_SSH_SCP", pvar, "SS&H SCP...");
1910          insertMenuBeforeItem(menu, 50170, MF_ENABLED, ID_SSHSCPMENU, pvar->ts->UIMsg);          insertMenuBeforeItem(menu, 50170, MF_ENABLED, ID_SSHSCPMENU, pvar->ts->UIMsg);
1911  }  }
1912    
1913  static void append_about_text(HWND dlg, char FAR * prefix, char FAR * msg)  static void append_about_text(HWND dlg, char FAR * prefix, char FAR * msg)
1914  {  {
1915          SendDlgItemMessage(dlg, IDC_ABOUTTEXT, EM_REPLACESEL, 0,          SendDlgItemMessage(dlg, IDC_ABOUTTEXT, EM_REPLACESEL, 0,
1916                             (LPARAM) prefix);                             (LPARAM) prefix);
1917          SendDlgItemMessage(dlg, IDC_ABOUTTEXT, EM_REPLACESEL, 0, (LPARAM) msg);          SendDlgItemMessage(dlg, IDC_ABOUTTEXT, EM_REPLACESEL, 0, (LPARAM) msg);
1918          SendDlgItemMessage(dlg, IDC_ABOUTTEXT, EM_REPLACESEL, 0,          SendDlgItemMessage(dlg, IDC_ABOUTTEXT, EM_REPLACESEL, 0,
1919                             (LPARAM) (char FAR *) "\r\n");                             (LPARAM) (char FAR *) "\r\n");
1920  }  }
1921    
1922  // 実行ファイルからバージョン情報を得る (2005.2.28 yutaka)  // 実行ファイルからバージョン情報を得る (2005.2.28 yutaka)
1923  void get_file_version(char *exefile, int *major, int *minor, int *release, int *build)  void get_file_version(char *exefile, int *major, int *minor, int *release, int *build)
1924  {  {
1925          typedef struct {          typedef struct {
1926                  WORD wLanguage;                  WORD wLanguage;
1927                  WORD wCodePage;                  WORD wCodePage;
1928          } LANGANDCODEPAGE, *LPLANGANDCODEPAGE;          } LANGANDCODEPAGE, *LPLANGANDCODEPAGE;
1929          LPLANGANDCODEPAGE lplgcode;          LPLANGANDCODEPAGE lplgcode;
1930          UINT unLen;          UINT unLen;
1931          DWORD size;          DWORD size;
1932          char *buf = NULL;          char *buf = NULL;
1933          BOOL ret;          BOOL ret;
1934          int i;          int i;
1935          char fmt[80];          char fmt[80];
1936          char *pbuf;          char *pbuf;
1937    
1938          size = GetFileVersionInfoSize(exefile, NULL);          size = GetFileVersionInfoSize(exefile, NULL);
1939          if (size == 0) {          if (size == 0) {
1940                  goto error;                  goto error;
1941          }          }
1942          buf = malloc(size);          buf = malloc(size);
1943          ZeroMemory(buf, size);          ZeroMemory(buf, size);
1944    
1945          if (GetFileVersionInfo(exefile, 0, size, buf) == FALSE) {          if (GetFileVersionInfo(exefile, 0, size, buf) == FALSE) {
1946                  goto error;                  goto error;
1947          }          }
1948    
1949          ret = VerQueryValue(buf,          ret = VerQueryValue(buf,
1950                          "\\VarFileInfo\\Translation",                          "\\VarFileInfo\\Translation",
1951                          (LPVOID *)&lplgcode, &unLen);                          (LPVOID *)&lplgcode, &unLen);
1952          if (ret == FALSE)          if (ret == FALSE)
1953                  goto error;                  goto error;
1954    
1955          for (i = 0 ; i < (int)(unLen / sizeof(LANGANDCODEPAGE)) ; i++) {          for (i = 0 ; i < (int)(unLen / sizeof(LANGANDCODEPAGE)) ; i++) {
1956                  _snprintf_s(fmt, sizeof(fmt), _TRUNCATE,                  _snprintf_s(fmt, sizeof(fmt), _TRUNCATE,
1957                              "\\StringFileInfo\\%04x%04x\\FileVersion",                              "\\StringFileInfo\\%04x%04x\\FileVersion",
1958                              lplgcode[i].wLanguage, lplgcode[i].wCodePage);                              lplgcode[i].wLanguage, lplgcode[i].wCodePage);
1959                  VerQueryValue(buf, fmt, &pbuf, &unLen);                  VerQueryValue(buf, fmt, &pbuf, &unLen);
1960                  if (unLen > 0) { // get success                  if (unLen > 0) { // get success
1961                          int n, a, b, c, d;                          int n, a, b, c, d;
1962    
1963                          n = sscanf(pbuf, "%d, %d, %d, %d", &a, &b, &c, &d);                          n = sscanf(pbuf, "%d, %d, %d, %d", &a, &b, &c, &d);
1964                          if (n == 4) { // convert success                          if (n == 4) { // convert success
1965                                  *major = a;                                  *major = a;
1966                                  *minor = b;                                  *minor = b;
1967                                  *release = c;                                  *release = c;
1968                                  *build = d;                                  *build = d;
1969                                  break;                                  break;
1970                          }                          }
1971                  }                  }
1972          }          }
1973    
1974          free(buf);          free(buf);
1975          return;          return;
1976    
1977  error:  error:
1978          free(buf);          free(buf);
1979          *major = *minor = *release = *build = 0;          *major = *minor = *release = *build = 0;
1980  }  }
1981    
1982  static void init_about_dlg(PTInstVar pvar, HWND dlg)  static void init_about_dlg(PTInstVar pvar, HWND dlg)
1983  {  {
1984          char buf[1024];          char buf[1024];
1985          int a, b, c, d;          int a, b, c, d;
1986          char uimsg[MAX_UIMSG];          char uimsg[MAX_UIMSG];
1987    
1988          GetWindowText(dlg, uimsg, sizeof(uimsg));          GetWindowText(dlg, uimsg, sizeof(uimsg));
1989          UTIL_get_lang_msg("DLG_ABOUT_TITLE", pvar, uimsg);          UTIL_get_lang_msg("DLG_ABOUT_TITLE", pvar, uimsg);
1990          SetWindowText(dlg, pvar->ts->UIMsg);          SetWindowText(dlg, pvar->ts->UIMsg);
1991          GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));          GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1992          UTIL_get_lang_msg("BTN_OK", pvar, uimsg);          UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1993          SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);          SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1994    
1995          // TTSSHのバージョンを設定する (2005.2.28 yutaka)          // TTSSHのバージョンを設定する (2005.2.28 yutaka)
1996          get_file_version("ttxssh.dll", &a, &b, &c, &d);          get_file_version("ttxssh.dll", &a, &b, &c, &d);
1997          _snprintf_s(buf, sizeof(buf), _TRUNCATE,          _snprintf_s(buf, sizeof(buf), _TRUNCATE,
1998                  "TTSSH\r\nTera Term Secure Shell extension, %d.%d", a, b);                  "TTSSH\r\nTera Term Secure Shell extension, %d.%d", a, b);
1999          SendMessage(GetDlgItem(dlg, IDC_TTSSH_VERSION), WM_SETTEXT, 0, (LPARAM)buf);          SendMessage(GetDlgItem(dlg, IDC_TTSSH_VERSION), WM_SETTEXT, 0, (LPARAM)buf);
2000    
2001          // OpenSSLのバージョンを設定する (2005.1.24 yutaka)          // OpenSSLのバージョンを設定する (2005.1.24 yutaka)
2002          // 条件文追加 (2005.5.11 yutaka)          // 条件文追加 (2005.5.11 yutaka)
2003  #ifdef OPENSSL_VERSION_TEXT  #ifdef OPENSSL_VERSION_TEXT
2004          SendMessage(GetDlgItem(dlg, IDC_OPENSSL_VERSION), WM_SETTEXT, 0, (LPARAM)OPENSSL_VERSION_TEXT);          SendMessage(GetDlgItem(dlg, IDC_OPENSSL_VERSION), WM_SETTEXT, 0, (LPARAM)OPENSSL_VERSION_TEXT);
2005  #else  #else
2006          SendMessage(GetDlgItem(dlg, IDC_OPENSSL_VERSION), WM_SETTEXT, 0, (LPARAM)"Unknown");          SendMessage(GetDlgItem(dlg, IDC_OPENSSL_VERSION), WM_SETTEXT, 0, (LPARAM)"Unknown");
2007  #endif  #endif
2008    
2009          // zlibのバージョンを設定する (2005.5.11 yutaka)          // zlibのバージョンを設定する (2005.5.11 yutaka)
2010  #ifdef ZLIB_VERSION  #ifdef ZLIB_VERSION
2011          _snprintf_s(buf, sizeof(buf), _TRUNCATE, "ZLib %s", ZLIB_VERSION);          _snprintf_s(buf, sizeof(buf), _TRUNCATE, "ZLib %s", ZLIB_VERSION);
2012  #else  #else
2013          _snprintf(buf, sizeof(buf), "ZLib Unknown");          _snprintf(buf, sizeof(buf), "ZLib Unknown");
2014  #endif  #endif
2015          SendMessage(GetDlgItem(dlg, IDC_ZLIB_VERSION), WM_SETTEXT, 0, (LPARAM)buf);          SendMessage(GetDlgItem(dlg, IDC_ZLIB_VERSION), WM_SETTEXT, 0, (LPARAM)buf);
2016    
2017    
2018          // TTSSHダイアログに表示するSSHに関する情報 (2004.10.30 yutaka)          // TTSSHダイアログに表示するSSHに関する情報 (2004.10.30 yutaka)
2019          if (pvar->socket != INVALID_SOCKET) {          if (pvar->socket != INVALID_SOCKET) {
2020                  if (SSHv1(pvar)) {                  if (SSHv1(pvar)) {
2021                          SSH_get_server_ID_info(pvar, buf, sizeof(buf));                          SSH_get_server_ID_info(pvar, buf, sizeof(buf));
2022                          UTIL_get_lang_msg("DLG_ABOUT_SERVERID", pvar, "Server ID:");                          UTIL_get_lang_msg("DLG_ABOUT_SERVERID", pvar, "Server ID:");
2023                          append_about_text(dlg, pvar->ts->UIMsg, buf);                          append_about_text(dlg, pvar->ts->UIMsg, buf);
2024                          SSH_get_protocol_version_info(pvar, buf, sizeof(buf));                          SSH_get_protocol_version_info(pvar, buf, sizeof(buf));
2025                          UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol:");                          UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol:");
2026                          append_about_text(dlg, pvar->ts->UIMsg, buf);                          append_about_text(dlg, pvar->ts->UIMsg, buf);
2027                          CRYPT_get_cipher_info(pvar, buf, sizeof(buf));                          CRYPT_get_cipher_info(pvar, buf, sizeof(buf));
2028                          UTIL_get_lang_msg("DLG_ABOUT_ENCRYPTION", pvar, "Encryption:");                          UTIL_get_lang_msg("DLG_ABOUT_ENCRYPTION", pvar, "Encryption:");
2029                          append_about_text(dlg, pvar->ts->UIMsg, buf);                          append_about_text(dlg, pvar->ts->UIMsg, buf);
2030                          CRYPT_get_server_key_info(pvar, buf, sizeof(buf));                          CRYPT_get_server_key_info(pvar, buf, sizeof(buf));
2031                          UTIL_get_lang_msg("DLG_ABOUT_SERVERKEY", pvar, "Server keys:");                          UTIL_get_lang_msg("DLG_ABOUT_SERVERKEY", pvar, "Server keys:");
2032                          append_about_text(dlg, pvar->ts->UIMsg, buf);                          append_about_text(dlg, pvar->ts->UIMsg, buf);
2033                          AUTH_get_auth_info(pvar, buf, sizeof(buf));                          AUTH_get_auth_info(pvar, buf, sizeof(buf));
2034                          UTIL_get_lang_msg("DLG_ABOUT_AUTH", pvar, "Authentication:");                          UTIL_get_lang_msg("DLG_ABOUT_AUTH", pvar, "Authentication:");
2035                          append_about_text(dlg, pvar->ts->UIMsg, buf);                          append_about_text(dlg, pvar->ts->UIMsg, buf);
2036                          SSH_get_compression_info(pvar, buf, sizeof(buf));                          SSH_get_compression_info(pvar, buf, sizeof(buf));
2037                          UTIL_get_lang_msg("DLG_ABOUT_COMP", pvar, "Compression:");                          UTIL_get_lang_msg("DLG_ABOUT_COMP", pvar, "Compression:");
2038                          append_about_text(dlg, pvar->ts->UIMsg, buf);                          append_about_text(dlg, pvar->ts->UIMsg, buf);
2039    
2040                  } else { // SSH2                  } else { // SSH2
2041                          SSH_get_server_ID_info(pvar, buf, sizeof(buf));                          SSH_get_server_ID_info(pvar, buf, sizeof(buf));
2042                          UTIL_get_lang_msg("DLG_ABOUT_SERVERID", pvar, "Server ID:");                          UTIL_get_lang_msg("DLG_ABOUT_SERVERID", pvar, "Server ID:");
2043                          append_about_text(dlg, pvar->ts->UIMsg, buf);                          append_about_text(dlg, pvar->ts->UIMsg, buf);
2044                          UTIL_get_lang_msg("DLG_ABOUT_CLIENTID", pvar, "Client ID:");                          UTIL_get_lang_msg("DLG_ABOUT_CLIENTID", pvar, "Client ID:");
2045                          append_about_text(dlg, pvar->ts->UIMsg, pvar->client_version_string);                          append_about_text(dlg, pvar->ts->UIMsg, pvar->client_version_string);
2046    
2047                          SSH_get_protocol_version_info(pvar, buf, sizeof(buf));                          SSH_get_protocol_version_info(pvar, buf, sizeof(buf));
2048                          UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol:");                          UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol:");
2049                          append_about_text(dlg, pvar->ts->UIMsg, buf);                          append_about_text(dlg, pvar->ts->UIMsg, buf);
2050    
2051                          if (pvar->kex_type == KEX_DH_GRP1_SHA1) {                          if (pvar->kex_type == KEX_DH_GRP1_SHA1) {
2052                                  strncpy_s(buf, sizeof(buf), KEX_DH1, _TRUNCATE);                                  strncpy_s(buf, sizeof(buf), KEX_DH1, _TRUNCATE);
2053                          } else if (pvar->kex_type == KEX_DH_GRP14_SHA1) {                          } else if (pvar->kex_type == KEX_DH_GRP14_SHA1) {
2054                                  strncpy_s(buf, sizeof(buf), KEX_DH14, _TRUNCATE);                                  strncpy_s(buf, sizeof(buf), KEX_DH14, _TRUNCATE);
2055                          } else {                          } else {
2056                                  strncpy_s(buf, sizeof(buf), KEX_DHGEX, _TRUNCATE);                                  strncpy_s(buf, sizeof(buf), KEX_DHGEX, _TRUNCATE);
2057                          }                          }
2058                          append_about_text(dlg, "KEX:", buf);                          append_about_text(dlg, "KEX:", buf);
2059    
2060                          if (pvar->hostkey_type == KEY_DSA) {                          if (pvar->hostkey_type == KEY_DSA) {
2061                                  strncpy_s(buf, sizeof(buf), "ssh-dss", _TRUNCATE);                                  strncpy_s(buf, sizeof(buf), "ssh-dss", _TRUNCATE);
2062                          } else {                          } else {
2063                                  strncpy_s(buf, sizeof(buf), "ssh-rsa", _TRUNCATE);                                  strncpy_s(buf, sizeof(buf), "ssh-rsa", _TRUNCATE);
2064                          }                          }
2065                          UTIL_get_lang_msg("DLG_ABOUT_HOSTKEY", pvar, "Host Key:");                          UTIL_get_lang_msg("DLG_ABOUT_HOSTKEY", pvar, "Host Key:");
2066                          append_about_text(dlg, pvar->ts->UIMsg, buf);                          append_about_text(dlg, pvar->ts->UIMsg, buf);
2067    
2068                          // add HMAC algorithm (2004.12.17 yutaka)                          // add HMAC algorithm (2004.12.17 yutaka)
2069                          buf[0] = '\0';                          buf[0] = '\0';
2070                          if (pvar->ctos_hmac == HMAC_SHA1) {                          if (pvar->ctos_hmac == HMAC_SHA1) {
2071                                  strncat_s(buf, sizeof(buf), "hmac-sha1", _TRUNCATE);                                  strncat_s(buf, sizeof(buf), "hmac-sha1", _TRUNCATE);
2072                          } else if (pvar->ctos_hmac == HMAC_MD5) {                          } else if (pvar->ctos_hmac == HMAC_MD5) {
2073                                  strncat_s(buf, sizeof(buf), "hmac-md5", _TRUNCATE);                                  strncat_s(buf, sizeof(buf), "hmac-md5", _TRUNCATE);
2074                          }                          }
2075                          UTIL_get_lang_msg("DLG_ABOUT_TOSERVER", pvar, " to server,");                          UTIL_get_lang_msg("DLG_ABOUT_TOSERVER", pvar, " to server,");
2076                          strncat_s(buf, sizeof(buf), pvar->ts->UIMsg, _TRUNCATE);                          strncat_s(buf, sizeof(buf), pvar->ts->UIMsg, _TRUNCATE);
2077                          if (pvar->stoc_hmac == HMAC_SHA1) {                          if (pvar->stoc_hmac == HMAC_SHA1) {
2078                                  strncat_s(buf, sizeof(buf), "hmac-sha1", _TRUNCATE);                                  strncat_s(buf, sizeof(buf), "hmac-sha1", _TRUNCATE);
2079                          } else if (pvar->stoc_hmac == HMAC_MD5) {                          } else if (pvar->stoc_hmac == HMAC_MD5) {
2080                                  strncat_s(buf, sizeof(buf), "hmac-md5", _TRUNCATE);                                  strncat_s(buf, sizeof(buf), "hmac-md5", _TRUNCATE);
2081                          }                          }
2082                          UTIL_get_lang_msg("DLG_ABOUT_FROMSERVER", pvar, " from server");                          UTIL_get_lang_msg("DLG_ABOUT_FROMSERVER", pvar, " from server");
2083                          strncat_s(buf, sizeof(buf), pvar->ts->UIMsg, _TRUNCATE);                          strncat_s(buf, sizeof(buf), pvar->ts->UIMsg, _TRUNCATE);
2084                          append_about_text(dlg, "HMAC:", buf);                          append_about_text(dlg, "HMAC:", buf);
2085    
2086                          CRYPT_get_cipher_info(pvar, buf, sizeof(buf));                          CRYPT_get_cipher_info(pvar, buf, sizeof(buf));
2087                          UTIL_get_lang_msg("DLG_ABOUT_ENCRYPTION", pvar, "Encryption:");                          UTIL_get_lang_msg("DLG_ABOUT_ENCRYPTION", pvar, "Encryption:");
2088                          append_about_text(dlg, pvar->ts->UIMsg, buf);                          append_about_text(dlg, pvar->ts->UIMsg, buf);
2089                          CRYPT_get_server_key_info(pvar, buf, sizeof(buf));                          CRYPT_get_server_key_info(pvar, buf, sizeof(buf));
2090                          UTIL_get_lang_msg("DLG_ABOUT_SERVERKEY", pvar, "Server keys:");                          UTIL_get_lang_msg("DLG_ABOUT_SERVERKEY", pvar, "Server keys:");
2091                          append_about_text(dlg, pvar->ts->UIMsg, buf);                          append_about_text(dlg, pvar->ts->UIMsg, buf);
2092    
2093                          AUTH_get_auth_info(pvar, buf, sizeof(buf));                          AUTH_get_auth_info(pvar, buf, sizeof(buf));
2094                          UTIL_get_lang_msg("DLG_ABOUT_AUTH", pvar, "Authentication:");                          UTIL_get_lang_msg("DLG_ABOUT_AUTH", pvar, "Authentication:");
2095                          append_about_text(dlg, pvar->ts->UIMsg, buf);                          append_about_text(dlg, pvar->ts->UIMsg, buf);
2096    
2097                          SSH_get_compression_info(pvar, buf, sizeof(buf));                          SSH_get_compression_info(pvar, buf, sizeof(buf));
2098                          if (pvar->ctos_compression == COMP_DELAYED) { // 遅延パケット圧縮の場合 (2006.6.23 yutaka)                          if (pvar->ctos_compression == COMP_DELAYED) { // 遅延パケット圧縮の場合 (2006.6.23 yutaka)
2099                                  UTIL_get_lang_msg("DLG_ABOUT_COMPDELAY", pvar, "Delayed Compression:");                                  UTIL_get_lang_msg("DLG_ABOUT_COMPDELAY", pvar, "Delayed Compression:");
2100                                  append_about_text(dlg, pvar->ts->UIMsg, buf);                                  append_about_text(dlg, pvar->ts->UIMsg, buf);
2101                          } else {                          } else {
2102                                  UTIL_get_lang_msg("DLG_ABOUT_COMP", pvar, "Compression:");                                  UTIL_get_lang_msg("DLG_ABOUT_COMP", pvar, "Compression:");
2103                                  append_about_text(dlg, pvar->ts->UIMsg, buf);                                  append_about_text(dlg, pvar->ts->UIMsg, buf);
2104                          }                          }
2105                  }                  }
2106          }          }
2107  }  }
2108    
2109  static BOOL CALLBACK TTXAboutDlg(HWND dlg, UINT msg, WPARAM wParam,  static BOOL CALLBACK TTXAboutDlg(HWND dlg, UINT msg, WPARAM wParam,
2110                                   LPARAM lParam)                                   LPARAM lParam)
2111  {  {
2112          LOGFONT logfont;          LOGFONT logfont;
2113          HFONT font;          HFONT font;
2114    
2115          switch (msg) {          switch (msg) {
2116          case WM_INITDIALOG:          case WM_INITDIALOG:
2117                  font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);                  font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
2118                  GetObject(font, sizeof(LOGFONT), &logfont);                  GetObject(font, sizeof(LOGFONT), &logfont);
2119                  if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAboutFont, pvar)) {                  if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAboutFont, pvar)) {
2120                          SendDlgItemMessage(dlg, IDC_TTSSH_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_TTSSH_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2121                          SendDlgItemMessage(dlg, IDC_SSHVERSIONS, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_SSHVERSIONS, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2122                          SendDlgItemMessage(dlg, IDC_INCLUDES, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_INCLUDES, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2123                          SendDlgItemMessage(dlg, IDC_OPENSSL_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_OPENSSL_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2124                          SendDlgItemMessage(dlg, IDC_ZLIB_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_ZLIB_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2125                          SendDlgItemMessage(dlg, IDC_WEBSITES, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_WEBSITES, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2126                          SendDlgItemMessage(dlg, IDC_CRYPTOGRAPHY, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_CRYPTOGRAPHY, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2127                          SendDlgItemMessage(dlg, IDC_CREDIT, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_CREDIT, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2128                          SendDlgItemMessage(dlg, IDC_ABOUTTEXT, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDC_ABOUTTEXT, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2129                          SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));                          SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2130                  }                  }
2131                  else {                  else {
2132                          DlgAboutFont = NULL;                          DlgAboutFont = NULL;
2133                  }                  }
2134    
2135                  // アイコンを動的にセット                  // アイコンを動的にセット
2136                  {                  {
2137                          int fuLoad = LR_DEFAULTCOLOR;                          int fuLoad = LR_DEFAULTCOLOR;
2138                          HICON hicon;                          HICON hicon;
2139    
2140                          if (is_NT4()) {                          if (is_NT4()) {
2141                                  fuLoad = LR_VGACOLOR;                                  fuLoad = LR_VGACOLOR;
2142                          }                          }
2143    
2144                          hicon = LoadImage(hInst, MAKEINTRESOURCE(IDI_SECURETT),                          hicon = LoadImage(hInst, MAKEINTRESOURCE(IDI_SECURETT),
2145                                            IMAGE_ICON, 32, 32, fuLoad);                                            IMAGE_ICON, 32, 32, fuLoad);
2146                          SendDlgItemMessage(dlg, IDC_TTSSH_ICON, STM_SETICON, (WPARAM)hicon, 0);                          SendDlgItemMessage(dlg, IDC_TTSSH_ICON, STM_SETICON, (WPARAM)hicon, 0);
2147                  }                  }
2148    
2149                  init_about_dlg((PTInstVar) lParam, dlg);                  init_about_dlg((PTInstVar) lParam, dlg);
2150                  return TRUE;                  return TRUE;
2151          case WM_COMMAND:          case WM_COMMAND:
2152                  switch (LOWORD(wParam)) {                  switch (LOWORD(wParam)) {
2153                  case IDOK:                  case IDOK:
2154                          EndDialog(dlg, 1);                          EndDialog(dlg, 1);
2155                          if (DlgAboutFont != NULL) {                          if (DlgAboutFont != NULL) {
2156                                  DeleteObject(DlgAboutFont);                                  DeleteObject(DlgAboutFont);
2157                          }                          }
2158                          return TRUE;                          return TRUE;
2159                  case IDCANCEL:                  /* there isn't a cancel button, but other Windows                  case IDCANCEL:                  /* there isn't a cancel button, but other Windows
2160                                                                     UI things can send this message */                                                                     UI things can send this message */
2161                          EndDialog(dlg, 0);                          EndDialog(dlg, 0);
2162                          if (DlgAboutFont != NULL) {                          if (DlgAboutFont != NULL) {
2163                                  DeleteObject(DlgAboutFont);                                  DeleteObject(DlgAboutFont);
2164                          }                          }
2165                          return TRUE;                          return TRUE;
2166                  }                  }
2167                  break;                  break;
2168          }          }
2169    
2170          return FALSE;          return FALSE;
2171  }  }
2172    
2173  static char FAR *get_cipher_name(int cipher)  static char FAR *get_cipher_name(int cipher)
2174  {  {
2175          switch (cipher) {          switch (cipher) {
2176          case SSH_CIPHER_NONE:          case SSH_CIPHER_NONE:
2177                  UTIL_get_lang_msg("DLG_SSHSETUP_CIPHER_BORDER", pvar,                  UTIL_get_lang_msg("DLG_SSHSETUP_CIPHER_BORDER", pvar,
2178                                    "<ciphers below this line are disabled>");                                    "<ciphers below this line are disabled>");
2179                  return pvar->ts->UIMsg;                  return pvar->ts->UIMsg;
2180          case SSH_CIPHER_RC4:          case SSH_CIPHER_RC4:
2181                  return "RC4(SSH1)";                  return "RC4(SSH1)";
2182          case SSH_CIPHER_3DES:          case SSH_CIPHER_3DES:
2183                  return "3DES(SSH1)";                  return "3DES(SSH1)";
2184          case SSH_CIPHER_DES:          case SSH_CIPHER_DES:
2185                  return "DES(SSH1)";                  return "DES(SSH1)";
2186          case SSH_CIPHER_IDEA:          case SSH_CIPHER_IDEA:
2187                  return "IDEA(SSH1)";                  return "IDEA(SSH1)";
2188          case SSH_CIPHER_TSS:          case SSH_CIPHER_TSS:
2189                  return "TSS(SSH1)";                  return "TSS(SSH1)";
2190          case SSH_CIPHER_BLOWFISH:          case SSH_CIPHER_BLOWFISH:
2191                  return "Blowfish(SSH1)";                  return "Blowfish(SSH1)";
2192    
2193          // for SSH2(yutaka)          // for SSH2(yutaka)
2194          case SSH2_CIPHER_AES128_CBC:          case SSH2_CIPHER_AES128_CBC:
2195                  return "AES128-CBC(SSH2)";                  return "AES128-CBC(SSH2)";
2196          case SSH2_CIPHER_AES192_CBC:          case SSH2_CIPHER_AES192_CBC:
2197                  return "AES192-CBC(SSH2)";                  return "AES192-CBC(SSH2)";
2198          case SSH2_CIPHER_AES256_CBC:          case SSH2_CIPHER_AES256_CBC:
2199                  return "AES256-CBC(SSH2)";                  return "AES256-CBC(SSH2)";
2200          case SSH2_CIPHER_3DES_CBC:          case SSH2_CIPHER_3DES_CBC:
2201                  return "3DES-CBC(SSH2)";                  return "3DES-CBC(SSH2)";
2202          case SSH2_CIPHER_BLOWFISH_CBC:          case SSH2_CIPHER_BLOWFISH_CBC:
2203                  return "Blowfish-CBC(SSH2)";                  return "Blowfish-CBC(SSH2)";
2204          case SSH2_CIPHER_AES128_CTR:          case SSH2_CIPHER_AES128_CTR:
2205                  return "AES128-CTR(SSH2)";                  return "AES128-CTR(SSH2)";
2206          case SSH2_CIPHER_AES192_CTR:          case SSH2_CIPHER_AES192_CTR:
2207                  return "AES192-CTR(SSH2)";                  return "AES192-CTR(SSH2)";
2208          case SSH2_CIPHER_AES256_CTR:          case SSH2_CIPHER_AES256_CTR:
2209                  return "AES256-CTR(SSH2)";                  return "AES256-CTR(SSH2)";
2210          case SSH2_CIPHER_ARCFOUR:          case SSH2_CIPHER_ARCFOUR:
2211                  return "Arcfour(SSH2)";                  return "Arcfour(SSH2)";
2212          case SSH2_CIPHER_ARCFOUR128:          case SSH2_CIPHER_ARCFOUR128:
2213                  return "Arcfour128(SSH2)";                  return "Arcfour128(SSH2)";
2214          case SSH2_CIPHER_ARCFOUR256:          case SSH2_CIPHER_ARCFOUR256:
2215                  return "Arcfour256(SSH2)";                  return "Arcfour256(SSH2)";
2216          case SSH2_CIPHER_CAST128_CBC:          case SSH2_CIPHER_CAST128_CBC:
2217                  return "CAST128-CBC(SSH2)";                  return "CAST128-CBC(SSH2)";
2218    
2219          default:          default:
2220                  return NULL;                  return NULL;
2221          }          }
2222  }  }
2223    
2224  static void set_move_button_status(HWND dlg)  static void set_move_button_status(HWND dlg)
2225  {  {
2226          HWND cipherControl = GetDlgItem(dlg, IDC_SSHCIPHERPREFS);          HWND cipherControl = GetDlgItem(dlg, IDC_SSHCIPHERPREFS);
2227          int curPos = (int) SendMessage(cipherControl, LB_GETCURSEL, 0, 0);          int curPos = (int) SendMessage(cipherControl, LB_GETCURSEL, 0, 0);
2228          int maxPos = (int) SendMessage(cipherControl, LB_GETCOUNT, 0, 0) - 1;          int maxPos = (int) SendMessage(cipherControl, LB_GETCOUNT, 0, 0) - 1;
2229    
2230          EnableWindow(GetDlgItem(dlg, IDC_SSHMOVECIPHERUP),          EnableWindow(GetDlgItem(dlg, IDC_SSHMOVECIPHERUP),
2231                       curPos > 0 && curPos <= maxPos);                       curPos > 0 && curPos <= maxPos);
2232          EnableWindow(GetDlgItem(dlg, IDC_SSHMOVECIPHERDOWN),          EnableWindow(GetDlgItem(dlg, IDC_SSHMOVECIPHERDOWN),
2233                       curPos >= 0 && curPos < maxPos);                       curPos >= 0 && curPos < maxPos);
2234  }  }
2235    
2236  static void init_setup_dlg(PTInstVar pvar, HWND dlg)  static void init_setup_dlg(PTInstVar pvar, HWND dlg)
2237  {  {
2238          HWND compressionControl = GetDlgItem(dlg, IDC_SSHCOMPRESSIONLEVEL);          HWND compressionControl = GetDlgItem(dlg, IDC_SSHCOMPRESSIONLEVEL);
2239          HWND cipherControl = GetDlgItem(dlg, IDC_SSHCIPHERPREFS);          HWND cipherControl = GetDlgItem(dlg, IDC_SSHCIPHERPREFS);
2240          int i;          int i;
2241          int ch;          int ch;
2242          char uimsg[MAX_UIMSG];          char uimsg[MAX_UIMSG];
2243    
2244          GetWindowText(dlg, uimsg, sizeof(uimsg));          GetWindowText(dlg, uimsg, sizeof(uimsg));
2245          UTIL_get_lang_msg("DLG_SSHSETUP_TITLE", pvar, uimsg);          UTIL_get_lang_msg("DLG_SSHSETUP_TITLE", pvar, uimsg);
2246          SetWindowText(dlg, pvar->ts->UIMsg);          SetWindowText(dlg, pvar->ts->UIMsg);
2247          GetDlgItemText(dlg, IDC_COMPRESSLABEL, uimsg, sizeof(uimsg));          GetDlgItemText(dlg, IDC_COMPRESSLABEL, uimsg, sizeof(uimsg));
2248          UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS", pvar, uimsg);          UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS", pvar, uimsg);
2249          SetDlgItemText(dlg, IDC_COMPRESSLABEL, pvar->ts->UIMsg);          SetDlgItemText(dlg, IDC_COMPRESSLABEL, pvar->ts->UIMsg);
2250          GetDlgItemText(dlg, IDC_COMPRESSNONE, uimsg, sizeof(uimsg));          GetDlgItemText(dlg, IDC_COMPRESSNONE, uimsg, sizeof(uimsg));
2251          UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS_NONE", pvar, uimsg);          UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS_NONE", pvar, uimsg);
2252          SetDlgItemText(dlg, IDC_COMPRESSNONE, pvar->ts->UIMsg);          SetDlgItemText(dlg, IDC_COMPRESSNONE, pvar->ts->UIMsg);
2253          GetDlgItemText(dlg, IDC_COMPRESSHIGH, uimsg, sizeof(uimsg));          GetDlgItemText(dlg, IDC_COMPRESSHIGH, uimsg, sizeof(uimsg));
2254          UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS_HIGHEST", pvar, uimsg);          UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS_HIGHEST", pvar, uimsg);
2255          SetDlgItemText(dlg, IDC_COMPRESSHIGH, pvar->ts->UIMsg);          SetDlgItemText(dlg, IDC_COMPRESSHIGH, pvar->ts->UIMsg);
2256          GetDlgItemText(dlg, IDC_CIPHERORDER, uimsg, sizeof(uimsg));          GetDlgItemText(dlg, IDC_CIPHERORDER, uimsg, sizeof(uimsg));
2257          UTIL_get_lang_msg("DLG_SSHSETUP_CHIPER", pvar, uimsg);          UTIL_get_lang_msg("DLG_SSHSETUP_CHIPER", pvar, uimsg);
2258          SetDlgItemText(dlg, IDC_CIPHERORDER, pvar->ts->UIMsg);          SetDlgItemText(dlg, IDC_CIPHERORDER, pvar->ts->UIMsg);
2259          GetDlgItemText(dlg, IDC_SSHMOVECIPHERUP, uimsg, sizeof(uimsg));          GetDlgItemText(dlg, IDC_SSHMOVECIPHERUP, uimsg, sizeof(uimsg));
2260          UTIL_get_lang_msg("DLG_SSHSETUP_CHIPER_UP", pvar, uimsg);          UTIL_get_lang_msg("DLG_SSHSETUP_CHIPER_UP", pvar, uimsg);
2261          SetDlgItemText(dlg, IDC_SSHMOVECIPHERUP, pvar->ts->UIMsg);          SetDlgItemText(dlg, IDC_SSHMOVECIPHERUP, pvar->ts->UIMsg);
2262          GetDlgItemText(dlg, IDC_SSHMOVECIPHERDOWN, uimsg, sizeof(uimsg));          GetDlgItemText(dlg, IDC_SSHMOVECIPHERDOWN, uimsg, sizeof(uimsg));
2263          UTIL_get_lang_msg("DLG_SSHSETUP_CHIPER_DOWN", pvar, uimsg);          UTIL_get_lang_msg("DLG_SSHSETUP_CHIPER_DOWN", pvar, uimsg);
2264          SetDlgItemText(dlg, IDC_SSHMOVECIPHERDOWN, pvar->ts->UIMsg);          SetDlgItemText(dlg, IDC_SSHMOVECIPHERDOWN, pvar->ts->UIMsg);
2265          GetDlgItemText(dlg, IDC_KNOWNHOSTS, uimsg, sizeof(uimsg));          GetDlgItemText(dlg, IDC_KNOWNHOSTS, uimsg, sizeof(uimsg));
2266          UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST", pvar, uimsg);          UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST", pvar, uimsg);
2267          SetDlgItemText(dlg, IDC_KNOWNHOSTS, pvar->ts->UIMsg);          SetDlgItemText(dlg, IDC_KNOWNHOSTS, pvar->ts->UIMsg);
2268          GetDlgItemText(dlg, IDC_CHOOSEREADWRITEFILE, uimsg, sizeof(uimsg));          GetDlgItemText(dlg, IDC_CHOOSEREADWRITEFILE, uimsg, sizeof(uimsg));
2269          UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST_RW", pvar, uimsg);          UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST_RW", pvar, uimsg);
2270          SetDlgItemText(dlg, IDC_CHOOSEREADWRITEFILE, pvar->ts->UIMsg);          SetDlgItemText(dlg, IDC_CHOOSEREADWRITEFILE, pvar->ts->UIMsg);
2271          GetDlgItemText(dlg, IDC_CHOOSEREADONLYFILE, uimsg, sizeof(uimsg));          GetDlgItemText(dlg, IDC_CHOOSEREADONLYFILE, uimsg, sizeof(uimsg));
2272          UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST_RO", pvar, uimsg);          UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST_RO", pvar, uimsg);
2273          SetDlgItemText(dlg, IDC_CHOOSEREADONLYFILE, pvar->ts->UIMsg);          SetDlgItemText(dlg, IDC_CHOOSEREADONLYFILE, pvar->ts->UIMsg);
2274          GetDlgItemText(dlg, IDC_HEARTBEATLABEL, uimsg, sizeof(uimsg));          GetDlgItemText(dlg, IDC_HEARTBEATLABEL, uimsg, sizeof(uimsg));
2275          UTIL_get_lang_msg("DLG_SSHSETUP_HEARTBEAT", pvar, uimsg);          UTIL_get_lang_msg("DLG_SSHSETUP_HEARTBEAT", pvar, uimsg);
2276          SetDlgItemText(dlg, IDC_HEARTBEATLABEL, pvar->ts->UIMsg);          SetDlgItemText(dlg, IDC_HEARTBEATLABEL, pvar->ts->UIMsg);
2277          GetDlgItemText(dlg, IDC_HEARTBEATLABEL2, uimsg, sizeof(uimsg));          GetDlgItemText(dlg, IDC_HEARTBEATLABEL2, uimsg, sizeof(uimsg));
2278          UTIL_get_lang_msg("DLG_SSHSETUP_HEARTBEAT_UNIT", pvar, uimsg);          UTIL_get_lang_msg("DLG_SSHSETUP_HEARTBEAT_UNIT", pvar, uimsg);
2279          SetDlgItemText(dlg, IDC_HEARTBEATLABEL2, pvar->ts->UIMsg);          SetDlgItemText(dlg, IDC_HEARTBEATLABEL2, pvar->ts->UIMsg);
2280          GetDlgItemText(dlg, IDC_FORWARDAGENT, uimsg, sizeof(uimsg));          GetDlgItemText(dlg, IDC_FORWARDAGENT, uimsg, sizeof(uimsg));
2281          UTIL_get_lang_msg("DLG_SSHSETUP_FORWARDAGENT", pvar, uimsg);          UTIL_get_lang_msg("DLG_SSHSETUP_FORWARDAGENT", pvar, uimsg);
2282          SetDlgItemText(dlg, IDC_FORWARDAGENT, pvar->ts->UIMsg);          SetDlgItemText(dlg, IDC_FORWARDAGENT, pvar->ts->UIMsg);
2283          GetDlgItemText(dlg, IDC_NOTICEBANNER, uimsg, sizeof(uimsg));          GetDlgItemText(dlg, IDC_NOTICEBANNER, uimsg, sizeof(uimsg));
2284          UTIL_get_lang_msg("DLG_SSHSETUP_NOTICE", pvar, uimsg);          UTIL_get_lang_msg("DLG_SSHSETUP_NOTICE", pvar, uimsg);
2285          SetDlgItemText(dlg, IDC_NOTICEBANNER, pvar->ts->UIMsg);          SetDlgItemText(dlg, IDC_NOTICEBANNER, pvar->ts->UIMsg);
2286          GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));          GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
2287          UTIL_get_lang_msg("BTN_OK", pvar, uimsg);          UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
2288          SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);          SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
2289          GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));          GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
2290          UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);          UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
2291          SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);          SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
2292    
2293          SendMessage(compressionControl, TBM_SETRANGE, TRUE, MAKELONG(0, 9));          SendMessage(compressionControl, TBM_SETRANGE, TRUE, MAKELONG(0, 9));
2294          SendMessage(compressionControl, TBM_SETPOS, TRUE,          SendMessage(compressionControl, TBM_SETPOS, TRUE,
2295                      pvar->settings.CompressionLevel);                      pvar->settings.CompressionLevel);
2296    
2297          normalize_cipher_order(pvar->settings.CipherOrder);          normalize_cipher_order(pvar->settings.CipherOrder);
2298    
2299          for (i = 0; pvar->settings.CipherOrder[i] != 0; i++) {          for (i = 0; pvar->settings.CipherOrder[i] != 0; i++) {
2300                  int cipher = pvar->settings.CipherOrder[i] - '0';                  int cipher = pvar->settings.CipherOrder[i] - '0';
2301                  char FAR *name = get_cipher_name(cipher);                  char FAR *name = get_cipher_name(cipher);
2302    
2303                  if (name != NULL) {                  if (name != NULL) {
2304                          SendMessage(cipherControl, LB_ADDSTRING, 0, (LPARAM) name);                          SendMessage(cipherControl, LB_ADDSTRING, 0, (LPARAM) name);
2305                  }                  }
2306          }          }
2307    
2308          SendMessage(cipherControl, LB_SETCURSEL, 0, 0);          SendMessage(cipherControl, LB_SETCURSEL, 0, 0);
2309          set_move_button_status(dlg);          set_move_button_status(dlg);
2310    
2311          for (i = 0; (ch = pvar->settings.KnownHostsFiles[i]) != 0 && ch != ';';          for (i = 0; (ch = pvar->settings.KnownHostsFiles[i]) != 0 && ch != ';';
2312                   i++) {                   i++) {
2313          }          }
2314          if (ch != 0) {          if (ch != 0) {
2315                  pvar->settings.KnownHostsFiles[i] = 0;                  pvar->settings.KnownHostsFiles[i] = 0;
2316                  SetDlgItemText(dlg, IDC_READWRITEFILENAME,                  SetDlgItemText(dlg, IDC_READWRITEFILENAME,
2317                                 pvar->settings.KnownHostsFiles);                                 pvar->settings.KnownHostsFiles);
2318                  pvar->settings.KnownHostsFiles[i] = ch;                  pvar->settings.KnownHostsFiles[i] = ch;
2319                  SetDlgItemText(dlg, IDC_READONLYFILENAME,                  SetDlgItemText(dlg, IDC_READONLYFILENAME,
2320                                 pvar->settings.KnownHostsFiles + i + 1);                                 pvar->settings.KnownHostsFiles + i + 1);
2321          } else {          } else {
2322                  SetDlgItemText(dlg, IDC_READWRITEFILENAME,                  SetDlgItemText(dlg, IDC_READWRITEFILENAME,
2323                                 pvar->settings.KnownHostsFiles);                                 pvar->settings.KnownHostsFiles);
2324          }          }
2325    
2326          // SSH2 HeartBeat(keep-alive)を追加 (2005.2.22 yutaka)          // SSH2 HeartBeat(keep-alive)を追加 (2005.2.22 yutaka)
2327          {          {
2328                  char buf[10];                  char buf[10];
2329                  _snprintf_s(buf, sizeof(buf), _TRUNCATE,                  _snprintf_s(buf, sizeof(buf), _TRUNCATE,
2330