Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /branches/ssh_chacha20poly1305/ttssh2/ttxssh/ttxssh.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3215 - (hide annotations) (download) (as text)
Wed Mar 4 11:40:44 2009 UTC (15 years, 1 month ago) by yutakapon
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 127217 byte(s)
最大パケットサイズをマクロ定義した。

1 yutakakn 2728 /*
2     Copyright (c) 1998-2001, Robert O'Callahan
3     All rights reserved.
4    
5     Redistribution and use in source and binary forms, with or without modification,
6     are permitted provided that the following conditions are met:
7    
8     Redistributions of source code must retain the above copyright notice, this list of
9     conditions and the following disclaimer.
10    
11     Redistributions in binary form must reproduce the above copyright notice, this list
12     of conditions and the following disclaimer in the documentation and/or other materials
13     provided with the distribution.
14    
15     The name of Robert O'Callahan may not be used to endorse or promote products derived from
16     this software without specific prior written permission.
17    
18     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
19     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20     OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21     THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22     EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26     SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27     */
28    
29 doda 3134 /* Tera Term extension mechanism
30 yutakakn 2728 Robert O'Callahan (roc+tt@cs.cmu.edu)
31 doda 3195
32 doda 3134 Tera Term by Takashi Teranishi (teranishi@rikaxp.riken.go.jp)
33 yutakakn 2728 */
34    
35     #include "ttxssh.h"
36     #include "fwdui.h"
37     #include "util.h"
38 yutakakn 2748 #include "ssh.h"
39 maya 2965 #include "ttcommon.h"
40 yutakakn 2728
41     #include <stdlib.h>
42     #include <stdio.h>
43     #include <string.h>
44     #include <io.h>
45     #include <fcntl.h>
46     #include <sys/stat.h>
47     #include <time.h>
48    
49     #include "resource.h"
50     #include <commctrl.h>
51     #include <commdlg.h>
52 maya 2980 #ifndef NO_INET6
53 yutakakn 2728 #include <winsock2.h>
54     static char FAR *ProtocolFamilyList[] = { "UNSPEC", "IPv6", "IPv4", NULL };
55     #else
56     #include <winsock.h>
57 maya 2980 #endif /* NO_INET6 */
58 yutakakn 2728
59 yutakakn 2816 #include <Lmcons.h>
60    
61     // include OpenSSL header file
62 yutakakn 2782 #include <openssl/opensslv.h>
63 yutakakn 2816 #include <openssl/evp.h>
64     #include <openssl/rsa.h>
65     #include <openssl/dsa.h>
66     #include <openssl/bn.h>
67     #include <openssl/pem.h>
68     #include <openssl/rand.h>
69     #include <openssl/rc4.h>
70 yutakakn 2831 #include <openssl/md5.h>
71 yutakakn 2782
72 yutakakn 2820 // include ZLib header file
73     #include <zlib.h>
74    
75 yutakakn 2816 #include "buffer.h"
76     #include "cipher.h"
77    
78 yutakapon 3107 #include "sftp.h"
79 maya 2937
80 maya 3214 #include "compat_w95.h"
81 maya 3210
82 maya 2910 #define MATCH_STR(s, o) strncmp((s), (o), NUM_ELEM(o) - 1)
83 maya 2915 #define MATCH_STR_I(s, o) _strnicmp((s), (o), NUM_ELEM(o) - 1)
84 yutakakn 2728
85     /* This extension implements SSH, so we choose a load order in the
86     "protocols" range. */
87     #define ORDER 2500
88    
89 maya 2896 static HICON SecureLargeIcon = NULL;
90     static HICON SecureSmallIcon = NULL;
91 yutakakn 2728
92 maya 2943 static HFONT DlgHostFont;
93 maya 2937 static HFONT DlgAboutFont;
94 maya 2943 static HFONT DlgSetupFont;
95     static HFONT DlgKeygenFont;
96 maya 2937
97 yutakakn 2728 static TInstVar FAR *pvar;
98    
99 doda 3201 typedef struct {
100     int cnt;
101     HWND dlg;
102     enum hostkey_type type;
103     } cbarg_t;
104    
105 yutakakn 2728 /* WIN32 allows multiple instances of a DLL */
106     static TInstVar InstVar;
107    
108     /*
109 doda 3134 This code makes lots of assumptions about the order in which Tera Term
110 yutakakn 2728 does things, and how. A key assumption is that the Notification window
111     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.
113     */
114    
115     static void init_TTSSH(PTInstVar pvar)
116     {
117     pvar->socket = INVALID_SOCKET;
118     pvar->OldLargeIcon = NULL;
119     pvar->OldSmallIcon = NULL;
120     pvar->NotificationWindow = NULL;
121     pvar->hostdlg_activated = FALSE;
122     pvar->socket = INVALID_SOCKET;
123     pvar->NotificationWindow = NULL;
124     pvar->protocol_major = 0;
125     pvar->protocol_minor = 0;
126    
127     PKT_init(pvar);
128     SSH_init(pvar);
129     CRYPT_init(pvar);
130     AUTH_init(pvar);
131     HOSTS_init(pvar);
132     FWD_init(pvar);
133     FWDUI_init(pvar);
134 yutakakn 2748
135     ssh_heartbeat_lock_initialize();
136 yutakakn 2728 }
137    
138     static void uninit_TTSSH(PTInstVar pvar)
139     {
140 yutakakn 2766 halt_ssh_heartbeat_thread(pvar);
141    
142 yutakakn 2809 ssh2_channel_free();
143    
144 yutakakn 2728 SSH_end(pvar);
145     PKT_end(pvar);
146     AUTH_end(pvar);
147     CRYPT_end(pvar);
148     HOSTS_end(pvar);
149     FWD_end(pvar);
150     FWDUI_end(pvar);
151    
152     if (pvar->OldLargeIcon != NULL) {
153     PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_BIG,
154 maya 3003 (LPARAM) pvar->OldLargeIcon);
155 yutakakn 2728 pvar->OldLargeIcon = NULL;
156     }
157     if (pvar->OldSmallIcon != NULL) {
158     PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_SMALL,
159 maya 3003 (LPARAM) pvar->OldSmallIcon);
160 yutakakn 2728 pvar->OldSmallIcon = NULL;
161     }
162 yutakakn 2766
163     ssh_heartbeat_lock_finalize();
164 yutakakn 2728 }
165    
166     static void PASCAL FAR TTXInit(PTTSet ts, PComVar cv)
167     {
168     pvar->settings = *pvar->ts_SSH;
169     pvar->ts = ts;
170     pvar->cv = cv;
171     pvar->fatal_error = FALSE;
172     pvar->showing_err = FALSE;
173     pvar->err_msg = NULL;
174    
175     init_TTSSH(pvar);
176     }
177    
178 maya 3173 /*
179     * Remove unsupported cipher or duplicated cipher.
180     * Add unspecified ciphers at the end of list.
181     */
182 yutakakn 2728 static void normalize_cipher_order(char FAR * buf)
183     {
184     char ciphers_listed[SSH_CIPHER_MAX + 1];
185     char ciphers_allowed[SSH_CIPHER_MAX + 1];
186     int i, j;
187    
188     /* SSH_CIPHER_NONE means that all ciphers below that one are disabled.
189     We *never* allow no encryption. */
190     #if 0
191     static char default_ciphers[] = {
192     SSH_CIPHER_3DES,
193     SSH_CIPHER_NONE,
194     SSH_CIPHER_DES, SSH_CIPHER_BLOWFISH
195     };
196     #else
197     // for SSH2(yutaka)
198     static char default_ciphers[] = {
199 maya 3173 SSH2_CIPHER_AES256_CTR,
200     SSH2_CIPHER_AES256_CBC,
201     SSH2_CIPHER_AES192_CTR,
202     SSH2_CIPHER_AES192_CBC,
203     SSH2_CIPHER_AES128_CTR,
204 maya 3157 SSH2_CIPHER_AES128_CBC,
205 maya 3045 SSH2_CIPHER_3DES_CBC,
206 maya 3157 SSH2_CIPHER_BLOWFISH_CBC,
207 maya 3173 SSH2_CIPHER_ARCFOUR256,
208     SSH2_CIPHER_ARCFOUR128,
209 doda 3168 SSH2_CIPHER_ARCFOUR,
210 maya 3170 SSH2_CIPHER_CAST128_CBC,
211 yutakakn 2728 SSH_CIPHER_3DES,
212     SSH_CIPHER_NONE,
213 maya 3159 SSH_CIPHER_DES,
214     SSH_CIPHER_BLOWFISH
215 yutakakn 2728 };
216     #endif
217    
218     memset(ciphers_listed, 0, sizeof(ciphers_listed));
219    
220     memset(ciphers_allowed, 0, sizeof(ciphers_allowed));
221     for (i = 0; i < NUM_ELEM(default_ciphers); i++) {
222     ciphers_allowed[default_ciphers[i]] = 1;
223     }
224    
225     for (i = 0; buf[i] != 0; i++) {
226     int cipher_num = buf[i] - '0';
227    
228     if (cipher_num < 0 || cipher_num > SSH_CIPHER_MAX
229     || !ciphers_allowed[cipher_num]
230     || ciphers_listed[cipher_num]) {
231     memmove(buf + i, buf + i + 1, strlen(buf + i + 1) + 1);
232     i--;
233     } else {
234     ciphers_listed[cipher_num] = 1;
235     }
236     }
237    
238     for (j = 0; j < NUM_ELEM(default_ciphers); j++) {
239     int cipher_num = default_ciphers[j];
240    
241     if (!ciphers_listed[cipher_num]) {
242     buf[i] = cipher_num + '0';
243     i++;
244     }
245     }
246    
247     buf[i] = 0;
248     }
249    
250     /* Remove local settings from the shared memory block. */
251     static void clear_local_settings(PTInstVar pvar)
252     {
253     pvar->ts_SSH->TryDefaultAuth = FALSE;
254     }
255    
256     static BOOL read_BOOL_option(PCHAR fileName, char FAR * keyName, BOOL def)
257     {
258     char buf[1024];
259    
260     buf[0] = 0;
261     GetPrivateProfileString("TTSSH", keyName, "", buf, sizeof(buf),
262 maya 3003 fileName);
263 yutakakn 2728 if (buf[0] == 0) {
264     return def;
265     } else {
266     return atoi(buf) != 0 ||
267 maya 3003 _stricmp(buf, "yes") == 0 ||
268     _stricmp(buf, "y") == 0;
269 yutakakn 2728 }
270     }
271    
272     static void read_string_option(PCHAR fileName, char FAR * keyName,
273 maya 3003 char FAR * def, char FAR * buf, int bufSize)
274 yutakakn 2728 {
275    
276     buf[0] = 0;
277     GetPrivateProfileString("TTSSH", keyName, def, buf, bufSize, fileName);
278     }
279    
280     static void read_ssh_options(PTInstVar pvar, PCHAR fileName)
281     {
282     char buf[1024];
283     TS_SSH FAR *settings = pvar->ts_SSH;
284    
285     #define READ_STD_STRING_OPTION(name) \
286 maya 3003 read_string_option(fileName, #name, "", settings->name, sizeof(settings->name))
287 yutakakn 2728
288     settings->Enabled = read_BOOL_option(fileName, "Enabled", FALSE);
289    
290     buf[0] = 0;
291     GetPrivateProfileString("TTSSH", "Compression", "", buf, sizeof(buf),
292 maya 3003 fileName);
293 yutakakn 2728 settings->CompressionLevel = atoi(buf);
294     if (settings->CompressionLevel < 0 || settings->CompressionLevel > 9) {
295     settings->CompressionLevel = 0;
296     }
297    
298     READ_STD_STRING_OPTION(DefaultUserName);
299     READ_STD_STRING_OPTION(DefaultForwarding);
300     READ_STD_STRING_OPTION(DefaultRhostsLocalUserName);
301     READ_STD_STRING_OPTION(DefaultRhostsHostPrivateKeyFile);
302     READ_STD_STRING_OPTION(DefaultRSAPrivateKeyFile);
303    
304     READ_STD_STRING_OPTION(CipherOrder);
305     normalize_cipher_order(settings->CipherOrder);
306    
307     read_string_option(fileName, "KnownHostsFiles", "ssh_known_hosts",
308 maya 3003 settings->KnownHostsFiles,
309     sizeof(settings->KnownHostsFiles));
310 yutakakn 2728
311     buf[0] = 0;
312     GetPrivateProfileString("TTSSH", "DefaultAuthMethod", "", buf,
313 maya 3003 sizeof(buf), fileName);
314 yutakakn 2728 settings->DefaultAuthMethod = atoi(buf);
315     if (settings->DefaultAuthMethod != SSH_AUTH_PASSWORD
316 maya 3003 && settings->DefaultAuthMethod != SSH_AUTH_RSA
317     && settings->DefaultAuthMethod != SSH_AUTH_TIS // add (2005.3.12 yutaka)
318 maya 3108 && settings->DefaultAuthMethod != SSH_AUTH_RHOSTS
319     && settings->DefaultAuthMethod != SSH_AUTH_PAGEANT) {
320 yutakakn 2728 /* 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
322     when the dialog box has rhosts selected and an host private key file
323     is supplied. */
324     settings->DefaultAuthMethod = SSH_AUTH_PASSWORD;
325     }
326    
327     buf[0] = 0;
328     GetPrivateProfileString("TTSSH", "LogLevel", "", buf, sizeof(buf),
329 maya 3003 fileName);
330 yutakakn 2728 settings->LogLevel = atoi(buf);
331    
332     buf[0] = 0;
333     GetPrivateProfileString("TTSSH", "WriteBufferSize", "", buf,
334 maya 3003 sizeof(buf), fileName);
335 yutakakn 2728 settings->WriteBufferSize = atoi(buf);
336     if (settings->WriteBufferSize <= 0) {
337 yutakapon 3215 settings->WriteBufferSize = (PACKET_MAX_SIZE / 2); // 2MB
338 yutakakn 2728 }
339    
340     settings->LocalForwardingIdentityCheck =
341     read_BOOL_option(fileName, "LocalForwardingIdentityCheck", TRUE);
342    
343     // SSH protocol version (2004.10.11 yutaka)
344 yutakakn 2738 // default is SSH2 (2004.11.30 yutaka)
345     settings->ssh_protocol_version = GetPrivateProfileInt("TTSSH", "ProtocolVersion", 2, fileName);
346 yutakakn 2728
347 yutakakn 2748 // SSH heartbeat time(second) (2004.12.11 yutaka)
348     settings->ssh_heartbeat_overtime = GetPrivateProfileInt("TTSSH", "HeartBeat", 60, fileName);
349    
350 yutakakn 2891 // �p�X���[�h�F�����������J���F�����g���p�X���[�h����������������������������������
351     // �\���B(2006.8.5 yutaka)
352     settings->remember_password = GetPrivateProfileInt("TTSSH", "RememberPassword", 1, fileName);
353    
354 maya 3015 // �������F���_�C�A���O���T�|�[�g�������������\�b�h���`�F�b�N���A
355     // ���������\�b�h���O���C�A�E�g���� (2007.9.24 maya)
356 maya 3035 settings->CheckAuthListFirst = read_BOOL_option(fileName, "CheckAuthListFirst", FALSE);
357 maya 3015
358 maya 3146 // 768bit ������ RSA ���������T�[�o�����������L�������� (2008.9.11 maya)
359     settings->EnableRsaShortKeyServer = read_BOOL_option(fileName, "EnableRsaShortKeyServer", FALSE);
360    
361 maya 3176 // agent forward ���L�������� (2008.11.25 maya)
362     settings->ForwardAgent = read_BOOL_option(fileName, "ForwardAgent", FALSE);
363    
364 yutakakn 2728 clear_local_settings(pvar);
365     }
366    
367     static void write_ssh_options(PTInstVar pvar, PCHAR fileName,
368 maya 2909 TS_SSH FAR * settings, BOOL copy_forward)
369 yutakakn 2728 {
370     char buf[1024];
371    
372     WritePrivateProfileString("TTSSH", "Enabled",
373 maya 3003 settings->Enabled ? "1" : "0", fileName);
374 yutakakn 2728
375     _itoa(settings->CompressionLevel, buf, 10);
376     WritePrivateProfileString("TTSSH", "Compression", buf, fileName);
377    
378     WritePrivateProfileString("TTSSH", "DefaultUserName",
379 maya 3003 settings->DefaultUserName, fileName);
380 yutakakn 2728
381 maya 2909 if (copy_forward) {
382     WritePrivateProfileString("TTSSH", "DefaultForwarding",
383 maya 3003 settings->DefaultForwarding, fileName);
384 maya 2909 }
385 yutakakn 2728
386     WritePrivateProfileString("TTSSH", "CipherOrder",
387 maya 3003 settings->CipherOrder, fileName);
388 yutakakn 2728
389     WritePrivateProfileString("TTSSH", "KnownHostsFiles",
390 maya 3003 settings->KnownHostsFiles, fileName);
391 yutakakn 2728
392     WritePrivateProfileString("TTSSH", "DefaultRhostsLocalUserName",
393 maya 3003 settings->DefaultRhostsLocalUserName,
394     fileName);
395 yutakakn 2728
396     WritePrivateProfileString("TTSSH", "DefaultRhostsHostPrivateKeyFile",
397 maya 3003 settings->DefaultRhostsHostPrivateKeyFile,
398     fileName);
399 yutakakn 2728
400     WritePrivateProfileString("TTSSH", "DefaultRSAPrivateKeyFile",
401 maya 3003 settings->DefaultRSAPrivateKeyFile,
402     fileName);
403 yutakakn 2728
404     _itoa(settings->DefaultAuthMethod, buf, 10);
405     WritePrivateProfileString("TTSSH", "DefaultAuthMethod", buf, fileName);
406    
407     _itoa(settings->LogLevel, buf, 10);
408     WritePrivateProfileString("TTSSH", "LogLevel", buf, fileName);
409    
410     _itoa(settings->WriteBufferSize, buf, 10);
411     WritePrivateProfileString("TTSSH", "WriteBufferSize", buf, fileName);
412    
413     WritePrivateProfileString("TTSSH", "LocalForwardingIdentityCheck",
414 maya 3003 settings->LocalForwardingIdentityCheck ? "1" : "0",
415     fileName);
416 yutakakn 2728
417     // SSH protocol version (2004.10.11 yutaka)
418     WritePrivateProfileString("TTSSH", "ProtocolVersion",
419 maya 3003 settings->ssh_protocol_version==2 ? "2" : "1",
420     fileName);
421 yutakakn 2728
422 yutakakn 2748 // SSH heartbeat time(second) (2004.12.11 yutaka)
423 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
424 maya 3003 "%d", settings->ssh_heartbeat_overtime);
425 yutakakn 2748 WritePrivateProfileString("TTSSH", "HeartBeat", buf, fileName);
426    
427 yutakakn 2891 // Remember password (2006.8.5 yutaka)
428 doda 3195 WritePrivateProfileString("TTSSH", "RememberPassword",
429     settings->remember_password ? "1" : "0",
430 maya 3003 fileName);
431 maya 3015
432     // �������F���_�C�A���O���T�|�[�g�������������\�b�h���`�F�b�N���A
433     // ���������\�b�h���O���C�A�E�g���� (2007.9.24 maya)
434     WritePrivateProfileString("TTSSH", "CheckAuthListFirst",
435     settings->CheckAuthListFirst ? "1" : "0", fileName);
436 maya 3146
437     // 768bit ������ RSA ���������T�[�o�����������L�������� (2008.9.11 maya)
438     WritePrivateProfileString("TTSSH", "EnableRsaShortKeyServer",
439     settings->EnableRsaShortKeyServer ? "1" : "0", fileName);
440 maya 3176
441     // agent forward ���L�������� (2008.11.25 maya)
442     WritePrivateProfileString("TTSSH", "ForwardAgent",
443     settings->ForwardAgent ? "1" : "0", fileName);
444 yutakakn 2728 }
445    
446 yutakakn 2748
447 yutakakn 2728 /* find free port in all protocol family */
448     static unsigned short find_local_port(PTInstVar pvar)
449     {
450     int tries;
451 maya 2980 #ifndef NO_INET6
452 yutakakn 2728 SOCKET connecter;
453     struct addrinfo hints;
454     struct addrinfo FAR *res;
455     struct addrinfo FAR *res0;
456     unsigned short port;
457     char pname[NI_MAXHOST];
458 maya 2980 #endif /* NO_INET6 */
459 yutakakn 2728
460     if (pvar->session_settings.DefaultAuthMethod != SSH_AUTH_RHOSTS) {
461     return 0;
462     }
463    
464     /* The random numbers here are only used to try to get fresh
465     ports across runs (dangling ports can cause bind errors
466     if we're unlucky). They do not need to be (and are not)
467     cryptographically strong.
468     */
469     srand((unsigned) GetTickCount());
470    
471 maya 2980 #ifndef NO_INET6
472 yutakakn 2728 for (tries = 20; tries > 0; tries--) {
473     memset(&hints, 0, sizeof(hints));
474     hints.ai_family = pvar->ts->ProtocolFamily;
475     hints.ai_flags = AI_PASSIVE;
476     hints.ai_socktype = SOCK_STREAM;
477     port = (unsigned) rand() % 512 + 512;
478 maya 2992 _snprintf_s(pname, sizeof(pname), _TRUNCATE, "%d", (int) port);
479 yutakakn 2728 if (getaddrinfo(NULL, pname, &hints, &res0)) {
480     return 0;
481     /* NOT REACHED */
482     }
483    
484     for (res = res0; res; res = res->ai_next) {
485     if (res->ai_family == AF_INET || res->ai_family == AF_INET6)
486     continue;
487    
488     connecter =
489     socket(res->ai_family, res->ai_socktype, res->ai_protocol);
490     if (connecter == INVALID_SOCKET) {
491     freeaddrinfo(res0);
492     return 0;
493     }
494    
495     if (bind(connecter, res->ai_addr, res->ai_addrlen) !=
496 maya 3003 SOCKET_ERROR) {
497 yutakakn 2728 return port;
498     freeaddrinfo(res0);
499     closesocket(connecter);
500     } else if (WSAGetLastError() != WSAEADDRINUSE) {
501     closesocket(connecter);
502     freeaddrinfo(res0);
503     return 0;
504     }
505    
506     closesocket(connecter);
507     }
508     freeaddrinfo(res0);
509     }
510    
511     return 0;
512     #else
513     for (tries = 20; tries > 0; tries--) {
514     SOCKET connecter = socket(AF_INET, SOCK_STREAM, 0);
515     struct sockaddr_in connecter_addr;
516    
517     connecter_addr.sin_family = AF_INET;
518     connecter_addr.sin_port = (unsigned) rand() % 512 + 512;
519     connecter_addr.sin_addr.s_addr = htonl(INADDR_ANY);
520    
521     if (connecter == INVALID_SOCKET) {
522     return 0;
523     }
524    
525     if (bind
526 maya 3003 (connecter, (struct sockaddr FAR *) &connecter_addr,
527     sizeof(connecter_addr)) != SOCKET_ERROR) {
528     closesocket(connecter);
529 yutakakn 2728 return connecter_addr.sin_port;
530     } else if (WSAGetLastError() != WSAEADDRINUSE) {
531     closesocket(connecter);
532     return 0;
533     }
534    
535     closesocket(connecter);
536     }
537    
538     return 0;
539 maya 2980 #endif /* NO_INET6 */
540 yutakakn 2728 }
541    
542     static int PASCAL FAR TTXconnect(SOCKET s,
543 maya 3003 const struct sockaddr FAR * name,
544     int namelen)
545 yutakakn 2728 {
546 maya 2980 #ifndef NO_INET6
547 yutakakn 2728 if (pvar->socket == INVALID_SOCKET) {
548     struct sockaddr_storage ss;
549     int len;
550    
551     pvar->socket = s;
552    
553     memset(&ss, 0, sizeof(ss));
554     switch (pvar->ts->ProtocolFamily) {
555     case AF_INET:
556     len = sizeof(struct sockaddr_in);
557     ((struct sockaddr_in FAR *) &ss)->sin_family = AF_INET;
558     ((struct sockaddr_in FAR *) &ss)->sin_addr.s_addr = INADDR_ANY;
559     ((struct sockaddr_in FAR *) &ss)->sin_port =
560     htons(find_local_port(pvar));
561     break;
562     case AF_INET6:
563     len = sizeof(struct sockaddr_in6);
564     ((struct sockaddr_in6 FAR *) &ss)->sin6_family = AF_INET6;
565     #if 0 /* symbol "in6addr_any" is not included in wsock32.lib */
566     /* if wsock32.lib will be linked, we can't refer "in6addr_any" */
567     ((struct sockaddr_in6 FAR *) &ss)->sin6_addr = in6addr_any;
568 maya 3003 #else
569 yutakakn 2728 memset(&((struct sockaddr_in6 FAR *) &ss)->sin6_addr, 0,
570 maya 3003 sizeof(struct in_addr6));
571 yutakakn 2728 #endif /* 0 */
572     ((struct sockaddr_in6 FAR *) &ss)->sin6_port =
573     htons(find_local_port(pvar));
574     break;
575     default:
576     /* NOT REACHED */
577     break;
578     }
579    
580     bind(s, (struct sockaddr FAR *) &ss, len);
581     }
582     #else
583     if (pvar->socket == INVALID_SOCKET) {
584     struct sockaddr_in addr;
585    
586     pvar->socket = s;
587    
588     addr.sin_family = AF_INET;
589     addr.sin_port = htons(find_local_port(pvar));
590     addr.sin_addr.s_addr = INADDR_ANY;
591     memset(addr.sin_zero, 0, sizeof(addr.sin_zero));
592    
593     bind(s, (struct sockaddr FAR *) &addr, sizeof(addr));
594     }
595 maya 2980 #endif /* NO_INET6 */
596 yutakakn 2728
597     return (pvar->Pconnect) (s, name, namelen);
598     }
599    
600     static int PASCAL FAR TTXWSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg,
601 maya 3003 long lEvent)
602 yutakakn 2728 {
603     if (s == pvar->socket) {
604     pvar->notification_events = lEvent;
605     pvar->notification_msg = wMsg;
606    
607     if (pvar->NotificationWindow == NULL) {
608     pvar->NotificationWindow = hWnd;
609     AUTH_advance_to_next_cred(pvar);
610     }
611     }
612    
613     return (pvar->PWSAAsyncSelect) (s, hWnd, wMsg, lEvent);
614     }
615    
616     static int PASCAL FAR TTXrecv(SOCKET s, char FAR * buf, int len, int flags)
617     {
618     if (s == pvar->socket) {
619 yutakakn 2748 int ret;
620    
621     ssh_heartbeat_lock();
622     ret = PKT_recv(pvar, buf, len);
623     ssh_heartbeat_unlock();
624     return (ret);
625    
626 yutakakn 2728 } else {
627     return (pvar->Precv) (s, buf, len, flags);
628     }
629     }
630    
631     static int PASCAL FAR TTXsend(SOCKET s, char const FAR * buf, int len,
632 maya 3003 int flags)
633 yutakakn 2728 {
634     if (s == pvar->socket) {
635 yutakakn 2748 ssh_heartbeat_lock();
636 yutakakn 2728 SSH_send(pvar, buf, len);
637 yutakakn 2748 ssh_heartbeat_unlock();
638 yutakakn 2728 return len;
639     } else {
640     return (pvar->Psend) (s, buf, len, flags);
641     }
642     }
643    
644     void notify_established_secure_connection(PTInstVar pvar)
645     {
646 maya 3139 int fuLoad = LR_DEFAULTCOLOR;
647    
648     if (is_NT4()) {
649     fuLoad = LR_VGACOLOR;
650     }
651    
652 maya 2897 // LoadIcon �������� LoadImage ���g�����������A
653     // 16x16 ���A�C�R���������I�������������������� (2006.8.9 maya)
654 maya 2896 if (SecureLargeIcon == NULL) {
655     SecureLargeIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_SECURETT),
656 maya 3139 IMAGE_ICON, 0, 0, fuLoad);
657 yutakakn 2728 }
658 maya 2896 if (SecureSmallIcon == NULL) {
659     SecureSmallIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_SECURETT),
660 maya 3139 IMAGE_ICON, 16, 16, fuLoad);
661 maya 2896 }
662 yutakakn 2728
663 maya 2896 if (SecureLargeIcon != NULL && SecureSmallIcon != NULL) {
664 maya 2897 // �������A�C�R���� WNDCLASS ���Z�b�g�����������������o���������� (2006.8.10 maya)
665     pvar->OldLargeIcon =
666     (HICON) GetClassLong(pvar->NotificationWindow, GCL_HICON);
667 yutakakn 2728 pvar->OldSmallIcon =
668     (HICON) SendMessage(pvar->NotificationWindow, WM_GETICON,
669 maya 3003 ICON_SMALL, 0);
670 maya 2897
671 yutakakn 2728 PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_BIG,
672 maya 3003 (LPARAM) SecureLargeIcon);
673 yutakakn 2728 PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_SMALL,
674 maya 3003 (LPARAM) SecureSmallIcon);
675 yutakakn 2728 }
676    
677     notify_verbose_message(pvar, "Entering secure mode",
678 maya 3003 LOG_LEVEL_VERBOSE);
679 yutakakn 2728 }
680    
681     void notify_closed_connection(PTInstVar pvar)
682     {
683 yutakakn 2766 SSH_notify_disconnecting(pvar, NULL);
684     AUTH_notify_disconnecting(pvar);
685     HOSTS_notify_disconnecting(pvar);
686    
687 yutakakn 2728 PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,
688 maya 3003 pvar->socket, MAKELPARAM(FD_CLOSE, 0));
689 yutakakn 2728
690     }
691    
692     static void add_err_msg(PTInstVar pvar, char FAR * msg)
693     {
694     if (pvar->err_msg != NULL) {
695 maya 2992 int buf_len = strlen(pvar->err_msg) + 3 + strlen(msg);
696     char FAR *buf = (char FAR *) malloc(buf_len);
697 yutakakn 2728
698 maya 2992 strncpy_s(buf, buf_len, pvar->err_msg, _TRUNCATE);
699     strncat_s(buf, buf_len, "\n\n", _TRUNCATE);
700     strncat_s(buf, buf_len, msg, _TRUNCATE);
701 yutakakn 2728 free(pvar->err_msg);
702     pvar->err_msg = buf;
703     } else {
704     pvar->err_msg = _strdup(msg);
705     }
706     }
707    
708     void notify_nonfatal_error(PTInstVar pvar, char FAR * msg)
709     {
710     if (!pvar->showing_err) {
711 yutakakn 2868 // �������������������m���E�B���h�E�����������A�f�X�N�g�b�v���I�[�i�[������
712     // ���b�Z�[�W�{�b�N�X���o���������B(2006.6.11 yutaka)
713     if (pvar->NotificationWindow == NULL) {
714 maya 2994 UTIL_get_lang_msg("MSG_ERROR_NONFAITAL", pvar,
715 maya 3003 "Tera Term: not fatal error");
716 maya 2937 MessageBox(NULL, msg, pvar->ts->UIMsg, MB_OK|MB_ICONINFORMATION);
717 yutakakn 2868 msg[0] = '\0';
718    
719     } else {
720     PostMessage(pvar->NotificationWindow, WM_COMMAND,
721 maya 3003 ID_SSHASYNCMESSAGEBOX, 0);
722 yutakakn 2868 }
723 yutakakn 2728 }
724     if (msg[0] != 0) {
725     notify_verbose_message(pvar, msg, LOG_LEVEL_ERROR);
726     add_err_msg(pvar, msg);
727     }
728     }
729    
730     void notify_fatal_error(PTInstVar pvar, char FAR * msg)
731     {
732     if (msg[0] != 0) {
733     notify_verbose_message(pvar, msg, LOG_LEVEL_FATAL);
734     add_err_msg(pvar, msg);
735     }
736    
737     if (!pvar->fatal_error) {
738     pvar->fatal_error = TRUE;
739    
740     SSH_notify_disconnecting(pvar, msg);
741     AUTH_notify_disconnecting(pvar);
742     HOSTS_notify_disconnecting(pvar);
743    
744     PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,
745 maya 3003 pvar->socket, MAKELPARAM(FD_CLOSE,
746     (pvar->PWSAGetLastError) ()));
747 yutakakn 2728 }
748     }
749    
750     void notify_verbose_message(PTInstVar pvar, char FAR * msg, int level)
751     {
752     if (level <= pvar->session_settings.LogLevel) {
753     char buf[1024];
754     int file;
755    
756     get_teraterm_dir_relative_name(buf, NUM_ELEM(buf), "TTSSH.LOG");
757     file = _open(buf, _O_RDWR | _O_APPEND | _O_CREAT | _O_TEXT,
758 maya 3003 _S_IREAD | _S_IWRITE);
759 yutakakn 2728
760     if (file >= 0) {
761 maya 3164 time_t now = time(NULL);
762     char tmp[26];
763     DWORD processid;
764 maya 3166 strcpy_s(tmp, sizeof(tmp), ctime(&now));
765 maya 3164 tmp[strlen(tmp)-1]= 0; // delete "\n"
766     _write(file, tmp, strlen(tmp));
767     GetWindowThreadProcessId(pvar->cv->HWin, &processid);
768     _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, " [%lu] ",processid);
769     _write(file, tmp, strlen(tmp));
770 yutakakn 2728 _write(file, msg, strlen(msg));
771     _write(file, "\n", 1);
772     _close(file);
773     }
774     }
775     }
776    
777     static void PASCAL FAR TTXOpenTCP(TTXSockHooks FAR * hooks)
778     {
779     if (pvar->settings.Enabled) {
780 maya 2970 // TCPLocalEcho/TCPCRSend ������������ (maya 2007.4.25)
781     pvar->ts->DisableTCPEchoCR = TRUE;
782    
783 yutakakn 2728 pvar->session_settings = pvar->settings;
784    
785 maya 3164 notify_verbose_message(pvar, "---------------------------------------------------------------------", LOG_LEVEL_VERBOSE);
786     notify_verbose_message(pvar, "Initiating SSH session", LOG_LEVEL_VERBOSE);
787 yutakakn 2728
788     FWDUI_load_settings(pvar);
789    
790     pvar->cv->TelAutoDetect = FALSE;
791 doda 3134 /* This next line should not be needed because Tera Term's
792 yutakakn 2728 CommLib should find ts->Telnet == 0 ... but we'll do this
793     just to be on the safe side. */
794     pvar->cv->TelFlag = FALSE;
795    
796     pvar->Precv = *hooks->Precv;
797     pvar->Psend = *hooks->Psend;
798     pvar->PWSAAsyncSelect = *hooks->PWSAAsyncSelect;
799     pvar->Pconnect = *hooks->Pconnect;
800     pvar->PWSAGetLastError = *hooks->PWSAGetLastError;
801    
802     *hooks->Precv = TTXrecv;
803     *hooks->Psend = TTXsend;
804     *hooks->PWSAAsyncSelect = TTXWSAAsyncSelect;
805     *hooks->Pconnect = TTXconnect;
806    
807     SSH_open(pvar);
808     HOSTS_open(pvar);
809     FWDUI_open(pvar);
810 yutakakn 2875
811     // ������ myproposal �����f���������A�������O�����������B (2006.6.26 maya)
812     SSH2_update_cipher_myproposal(pvar);
813     SSH2_update_compression_myproposal(pvar);
814 yutakakn 2728 }
815     }
816    
817     static void PASCAL FAR TTXCloseTCP(TTXSockHooks FAR * hooks)
818     {
819     if (pvar->session_settings.Enabled) {
820     pvar->socket = INVALID_SOCKET;
821    
822     notify_verbose_message(pvar, "Terminating SSH session...",
823 maya 3003 LOG_LEVEL_VERBOSE);
824 yutakakn 2728
825     *hooks->Precv = pvar->Precv;
826     *hooks->Psend = pvar->Psend;
827     *hooks->PWSAAsyncSelect = pvar->PWSAAsyncSelect;
828     *hooks->Pconnect = pvar->Pconnect;
829     }
830    
831     uninit_TTSSH(pvar);
832     init_TTSSH(pvar);
833     }
834    
835     static void enable_dlg_items(HWND dlg, int from, int to, BOOL enabled)
836     {
837     for (; from <= to; from++) {
838     EnableWindow(GetDlgItem(dlg, from), enabled);
839     }
840     }
841    
842 maya 3010 // C-p/C-n/C-b/C-f/C-a/C-e ���T�|�[�g (2007.9.5 maya)
843 yutakapon 3022 // C-d/C-k ���T�|�[�g (2007.10.3 yutaka)
844 maya 3008 // �h���b�v�_�E���������G�f�B�b�g�R���g���[����
845     // �T�u�N���X�������������E�C���h�E�v���V�[�W��
846 yutakapon 3022 WNDPROC OrigHostnameEditProc; // Original window procedure
847     LRESULT CALLBACK HostnameEditProc(HWND dlg, UINT msg,
848 maya 3008 WPARAM wParam, LPARAM lParam)
849     {
850     HWND parent;
851 yutakapon 3022 int max, select, len;
852 yutakapon 3048 char *str, *orgstr;
853 maya 3008
854     switch (msg) {
855     // �L�[�����������������m����
856     case WM_KEYDOWN:
857     if (GetKeyState(VK_CONTROL) < 0) {
858     switch (wParam) {
859 maya 3010 case 0x50: // Ctrl+p ... up
860 maya 3008 parent = GetParent(dlg);
861 maya 3010 select = SendMessage(parent, CB_GETCURSEL, 0, 0);
862     if (select > 0) {
863     PostMessage(parent, CB_SETCURSEL, select - 1, 0);
864 maya 3008 }
865     return 0;
866 maya 3010 case 0x4e: // Ctrl+n ... down
867 maya 3008 parent = GetParent(dlg);
868 maya 3010 max = SendMessage(parent, CB_GETCOUNT, 0, 0);
869     select = SendMessage(parent, CB_GETCURSEL, 0, 0);
870     if (select < max - 1) {
871     PostMessage(parent, CB_SETCURSEL, select + 1, 0);
872 maya 3008 }
873     return 0;
874 maya 3010 case 0x42: // Ctrl+b ... left
875     SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
876     PostMessage(dlg, EM_SETSEL, select-1, select-1);
877     return 0;
878     case 0x46: // Ctrl+f ... right
879     SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
880     max = GetWindowTextLength(dlg) ;
881     PostMessage(dlg, EM_SETSEL, select+1, select+1);
882     return 0;
883     case 0x41: // Ctrl+a ... home
884 maya 3009 PostMessage(dlg, EM_SETSEL, 0, 0);
885     return 0;
886 maya 3010 case 0x45: // Ctrl+e ... end
887     max = GetWindowTextLength(dlg) ;
888     PostMessage(dlg, EM_SETSEL, max, max);
889 maya 3009 return 0;
890 yutakapon 3022
891     case 0x44: // Ctrl+d
892     case 0x4b: // Ctrl+k
893 yutakapon 3048 case 0x55: // Ctrl+u
894 yutakapon 3022 SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
895     max = GetWindowTextLength(dlg);
896     max++; // '\0'
897 yutakapon 3048 orgstr = str = malloc(max);
898 yutakapon 3022 if (str != NULL) {
899     len = GetWindowText(dlg, str, max);
900     if (select >= 0 && select < len) {
901     if (wParam == 0x44) { // �J�[�\���z����������������������
902     memmove(&str[select], &str[select + 1], len - select - 1);
903     str[len - 1] = '\0';
904    
905     } else if (wParam == 0x4b) { // �J�[�\�������s��������������
906     str[select] = '\0';
907 yutakapon 3048
908 yutakapon 3022 }
909 doda 3195 }
910 yutakapon 3022
911 yutakapon 3048 if (wParam == 0x55) { // �J�[�\����������������������
912     if (select >= len) {
913     str[0] = '\0';
914     } else {
915     str = &str[select];
916     }
917     select = 0;
918 yutakapon 3022 }
919 yutakapon 3048
920     SetWindowText(dlg, str);
921     SendMessage(dlg, EM_SETSEL, select, select);
922     free(orgstr);
923 yutakapon 3022 return 0;
924     }
925     break;
926 maya 3008 }
927     }
928     break;
929    
930 maya 3010 // �����L�[��������������������������������������������
931 maya 3008 case WM_CHAR:
932     switch (wParam) {
933 maya 3009 case 0x01:
934 maya 3010 case 0x02:
935 yutakapon 3022 case 0x04:
936 maya 3009 case 0x05:
937 maya 3010 case 0x06:
938 yutakapon 3022 case 0x0b:
939 maya 3008 case 0x0e:
940     case 0x10:
941 yutakapon 3048 case 0x15:
942 maya 3008 return 0;
943     }
944     }
945    
946     return CallWindowProc(OrigHostnameEditProc, dlg, msg, wParam, lParam);
947     }
948    
949 yutakakn 2728 static BOOL CALLBACK TTXHostDlg(HWND dlg, UINT msg, WPARAM wParam,
950 maya 3003 LPARAM lParam)
951 yutakakn 2728 {
952     static char *ssh_version[] = {"SSH1", "SSH2", NULL};
953     PGetHNRec GetHNRec;
954 yutakapon 2996 char EntName[128];
955 yutakakn 2728 char TempHost[HostNameMaxLength + 1];
956     WORD i, j, w;
957 maya 3021 WORD ComPortTable[MAXCOMPORT];
958 yutakapon 2996 static char *ComPortDesc[MAXCOMPORT];
959 doda 2964 int comports;
960 yutakakn 2728 BOOL Ok;
961 maya 2943 LOGFONT logfont;
962     HFONT font;
963 maya 2994 char uimsg[MAX_UIMSG];
964 maya 3099 static HWND hwndHostname = NULL; // HOSTNAME dropdown
965     static HWND hwndHostnameEdit = NULL; // Edit control on HOSTNAME dropdown
966 yutakakn 2728
967     switch (msg) {
968     case WM_INITDIALOG:
969     GetHNRec = (PGetHNRec) lParam;
970     SetWindowLong(dlg, DWL_USER, lParam);
971    
972 maya 2994 GetWindowText(dlg, uimsg, sizeof(uimsg));
973     UTIL_get_lang_msg("DLG_HOST_TITLE", pvar, uimsg);
974 maya 2937 SetWindowText(dlg, pvar->ts->UIMsg);
975 maya 2994 GetDlgItemText(dlg, IDC_HOSTNAMELABEL, uimsg, sizeof(uimsg));
976 maya 3114 UTIL_get_lang_msg("DLG_HOST_TCPIPHOST", pvar, uimsg);
977 maya 2937 SetDlgItemText(dlg, IDC_HOSTNAMELABEL, pvar->ts->UIMsg);
978 maya 2994 GetDlgItemText(dlg, IDC_HISTORY, uimsg, sizeof(uimsg));
979 maya 3114 UTIL_get_lang_msg("DLG_HOST_TCPIPHISTORY", pvar, uimsg);
980 maya 2937 SetDlgItemText(dlg, IDC_HISTORY, pvar->ts->UIMsg);
981 maya 2994 GetDlgItemText(dlg, IDC_SERVICELABEL, uimsg, sizeof(uimsg));
982 maya 3114 UTIL_get_lang_msg("DLG_HOST_TCPIPSERVICE", pvar, uimsg);
983 maya 2937 SetDlgItemText(dlg, IDC_SERVICELABEL, pvar->ts->UIMsg);
984 maya 2994 GetDlgItemText(dlg, IDC_HOSTOTHER, uimsg, sizeof(uimsg));
985 maya 3114 UTIL_get_lang_msg("DLG_HOST_TCPIPOTHER", pvar, uimsg);
986 maya 2937 SetDlgItemText(dlg, IDC_HOSTOTHER, pvar->ts->UIMsg);
987 maya 2994 GetDlgItemText(dlg, IDC_HOSTTCPPORTLABEL, uimsg, sizeof(uimsg));
988 maya 3114 UTIL_get_lang_msg("DLG_HOST_TCPIPPORT", pvar, uimsg);
989 maya 2937 SetDlgItemText(dlg, IDC_HOSTTCPPORTLABEL, pvar->ts->UIMsg);
990 maya 2994 GetDlgItemText(dlg, IDC_SSH_VERSION_LABEL, uimsg, sizeof(uimsg));
991 maya 3114 UTIL_get_lang_msg("DLG_HOST_TCPIPSSHVERSION", pvar, uimsg);
992 maya 2937 SetDlgItemText(dlg, IDC_SSH_VERSION_LABEL, pvar->ts->UIMsg);
993 maya 2994 GetDlgItemText(dlg, IDC_HOSTTCPPROTOCOLLABEL, uimsg, sizeof(uimsg));
994 maya 3114 UTIL_get_lang_msg("DLG_HOST_TCPIPPROTOCOL", pvar, uimsg);
995 maya 2937 SetDlgItemText(dlg, IDC_HOSTTCPPROTOCOLLABEL, pvar->ts->UIMsg);
996 maya 2994 GetDlgItemText(dlg, IDC_HOSTSERIAL, uimsg, sizeof(uimsg));
997     UTIL_get_lang_msg("DLG_HOST_SERIAL", pvar, uimsg);
998 maya 2937 SetDlgItemText(dlg, IDC_HOSTSERIAL, pvar->ts->UIMsg);
999 maya 2994 GetDlgItemText(dlg, IDC_HOSTCOMLABEL, uimsg, sizeof(uimsg));
1000 maya 3114 UTIL_get_lang_msg("DLG_HOST_SERIALPORT", pvar, uimsg);
1001 maya 2937 SetDlgItemText(dlg, IDC_HOSTCOMLABEL, pvar->ts->UIMsg);
1002 maya 2994 GetDlgItemText(dlg, IDC_HOSTHELP, uimsg, sizeof(uimsg));
1003     UTIL_get_lang_msg("DLG_HOST_HELP", pvar, uimsg);
1004 maya 2937 SetDlgItemText(dlg, IDC_HOSTHELP, pvar->ts->UIMsg);
1005 maya 2994 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1006     UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1007 maya 2937 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1008 maya 2994 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1009     UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
1010 maya 2937 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1011    
1012 yutakakn 2846 // �z�X�g�q�X�g�����`�F�b�N�{�b�N�X������ (2005.10.21 yutaka)
1013     if (pvar->ts->HistoryList > 0) {
1014     SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_SETCHECK, BST_CHECKED, 0);
1015     } else {
1016     SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_SETCHECK, BST_UNCHECKED, 0);
1017     }
1018    
1019 yutakakn 2728 if (GetHNRec->PortType == IdFile)
1020     GetHNRec->PortType = IdTCPIP;
1021    
1022 maya 2992 strncpy_s(EntName, sizeof(EntName), "Host", _TRUNCATE);
1023 yutakakn 2728
1024     i = 1;
1025     do {
1026 maya 2992 _snprintf_s(&EntName[4], sizeof(EntName)-4, _TRUNCATE, "%d", i);
1027 yutakakn 2728 GetPrivateProfileString("Hosts", EntName, "",
1028 maya 3003 TempHost, sizeof(TempHost),
1029     GetHNRec->SetupFN);
1030 yutakakn 2728 if (strlen(TempHost) > 0)
1031     SendDlgItemMessage(dlg, IDC_HOSTNAME, CB_ADDSTRING,
1032 maya 3003 0, (LPARAM) TempHost);
1033 yutakakn 2728 i++;
1034 maya 3005 } while ((i <= MAXHOSTLIST) && (strlen(TempHost) > 0));
1035 yutakakn 2728
1036     SendDlgItemMessage(dlg, IDC_HOSTNAME, EM_LIMITTEXT,
1037 maya 3003 HostNameMaxLength - 1, 0);
1038 yutakakn 2728
1039     SendDlgItemMessage(dlg, IDC_HOSTNAME, CB_SETCURSEL, 0, 0);
1040    
1041 maya 3008 // C-n/C-p ���������T�u�N���X�� (2007.9.4 maya)
1042     hwndHostname = GetDlgItem(dlg, IDC_HOSTNAME);
1043     hwndHostnameEdit = GetWindow(hwndHostname, GW_CHILD);
1044     OrigHostnameEditProc = (WNDPROC)GetWindowLong(hwndHostnameEdit, GWL_WNDPROC);
1045     SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)HostnameEditProc);
1046    
1047 yutakakn 2728 CheckRadioButton(dlg, IDC_HOSTTELNET, IDC_HOSTOTHER,
1048 maya 3003 pvar->settings.Enabled ? IDC_HOSTSSH : GetHNRec->
1049     Telnet ? IDC_HOSTTELNET : IDC_HOSTOTHER);
1050 yutakakn 2728 SendDlgItemMessage(dlg, IDC_HOSTTCPPORT, EM_LIMITTEXT, 5, 0);
1051     SetDlgItemInt(dlg, IDC_HOSTTCPPORT, GetHNRec->TCPPort, FALSE);
1052 maya 2980 #ifndef NO_INET6
1053 yutakakn 2728 for (i = 0; ProtocolFamilyList[i]; ++i) {
1054     SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, CB_ADDSTRING,
1055 maya 3003 0, (LPARAM) ProtocolFamilyList[i]);
1056 yutakakn 2728 }
1057     SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, EM_LIMITTEXT,
1058 maya 3003 ProtocolFamilyMaxLength - 1, 0);
1059 yutakakn 2728 SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, CB_SETCURSEL, 0, 0);
1060 maya 2980 #endif /* NO_INET6 */
1061 yutakakn 2728
1062     /////// SSH version
1063     for (i = 0; ssh_version[i]; ++i) {
1064     SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_ADDSTRING,
1065 maya 3003 0, (LPARAM) ssh_version[i]);
1066 yutakakn 2728 }
1067     SendDlgItemMessage(dlg, IDC_SSH_VERSION, EM_LIMITTEXT,
1068 maya 3003 NUM_ELEM(ssh_version) - 1, 0);
1069 yutakakn 2728
1070 yutakakn 2734 if (pvar->settings.ssh_protocol_version == 1) {
1071     SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_SETCURSEL, 0, 0); // SSH1
1072     } else {
1073 yutakakn 2728 SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_SETCURSEL, 1, 0); // SSH2
1074     }
1075    
1076     if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1077     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE); // enabled
1078     } else {
1079     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1080     }
1081     /////// SSH version
1082    
1083    
1084     j = 0;
1085     w = 1;
1086 yutakapon 2996 if ((comports=DetectComPorts(ComPortTable, GetHNRec->MaxComPort, ComPortDesc)) >= 0) {
1087 doda 2964 for (i=0; i<comports; i++) {
1088 maya 3006 // MaxComPort ���z�����|�[�g���\��������
1089     if (ComPortTable[i] > GetHNRec->MaxComPort) {
1090     continue;
1091     }
1092    
1093 maya 3007 // �g�p�����|�[�g���\��������
1094     if (CheckCOMFlag(ComPortTable[i]) == 1) {
1095     continue;
1096     }
1097    
1098 maya 3020 _snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "COM%d", ComPortTable[i]);
1099 maya 2998 if (ComPortDesc[i] != NULL) {
1100     strncat_s(EntName, sizeof(EntName), ": ", _TRUNCATE);
1101     strncat_s(EntName, sizeof(EntName), ComPortDesc[i], _TRUNCATE);
1102     }
1103 doda 2964 SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,
1104 maya 3003 0, (LPARAM)EntName);
1105 doda 2964 j++;
1106     if (GetHNRec->ComPort == ComPortTable[i])
1107     w = j;
1108     }
1109    
1110     } else {
1111     for (i = 1; i <= GetHNRec->MaxComPort; i++) {
1112 maya 3007 // �g�p�����|�[�g���\��������
1113     if (CheckCOMFlag(i) == 1) {
1114     continue;
1115     }
1116    
1117 maya 3020 _snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "COM%d", i);
1118 doda 2964 SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,
1119 maya 3003 0, (LPARAM) EntName);
1120 doda 2964 j++;
1121     if (GetHNRec->ComPort == i)
1122     w = j;
1123     }
1124 yutakakn 2728 }
1125 doda 2964
1126 yutakakn 2728 if (j > 0)
1127     SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_SETCURSEL, w - 1, 0);
1128 doda 2982 else { /* All com ports are already used */
1129 yutakakn 2728 GetHNRec->PortType = IdTCPIP;
1130 doda 3195 enable_dlg_items(dlg, IDC_HOSTSERIAL, IDC_HOSTSERIAL, FALSE);
1131 doda 2982 }
1132 yutakakn 2728
1133 doda 2982 CheckRadioButton(dlg, IDC_HOSTTCPIP, IDC_HOSTSERIAL,
1134 maya 3003 IDC_HOSTTCPIP + GetHNRec->PortType - 1);
1135 doda 2982
1136 yutakakn 2803 if (GetHNRec->PortType == IdTCPIP) {
1137 yutakakn 2728 enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, FALSE);
1138 yutakakn 2803
1139 doda 3195 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);
1141 yutakapon 3155
1142     enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, TRUE); // enabled
1143 yutakakn 2803 }
1144 maya 2980 #ifndef NO_INET6
1145 yutakakn 2728 else {
1146     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1147 maya 3003 FALSE);
1148 yutakakn 2728 enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1149 maya 3003 IDC_HOSTTCPPROTOCOL, FALSE);
1150 yutakakn 2803
1151     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)
1153 yutakapon 3155
1154     enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, FALSE); // disabled
1155 yutakakn 2728 }
1156     #else
1157     else
1158     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1159     FALSE);
1160 maya 2980 #endif /* NO_INET6 */
1161 yutakakn 2728
1162     // Host dialog���t�H�[�J�X�������� (2004.10.2 yutaka)
1163 yutakakn 2803 if (GetHNRec->PortType == IdTCPIP) {
1164     HWND hwnd = GetDlgItem(dlg, IDC_HOSTNAME);
1165     SetFocus(hwnd);
1166     } else {
1167     HWND hwnd = GetDlgItem(dlg, IDC_HOSTCOM);
1168     SetFocus(hwnd);
1169 yutakakn 2728 }
1170    
1171 maya 2943 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1172     GetObject(font, sizeof(LOGFONT), &logfont);
1173 maya 2946 if (UTIL_get_lang_font("DLG_SYSTEM_FONT", dlg, &logfont, &DlgHostFont, pvar)) {
1174 maya 2943 SendDlgItemMessage(dlg, IDC_HOSTTCPIP, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1175     SendDlgItemMessage(dlg, IDC_HOSTNAMELABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1176 maya 2946 SendDlgItemMessage(dlg, IDC_HOSTNAME, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1177 maya 2943 SendDlgItemMessage(dlg, IDC_HISTORY, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1178     SendDlgItemMessage(dlg, IDC_SERVICELABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1179     SendDlgItemMessage(dlg, IDC_HOSTTELNET, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1180     SendDlgItemMessage(dlg, IDC_HOSTSSH, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1181     SendDlgItemMessage(dlg, IDC_HOSTOTHER, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1182     SendDlgItemMessage(dlg, IDC_HOSTTCPPORTLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1183 maya 2946 SendDlgItemMessage(dlg, IDC_HOSTTCPPORT, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1184 maya 2943 SendDlgItemMessage(dlg, IDC_SSH_VERSION_LABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1185 maya 2946 SendDlgItemMessage(dlg, IDC_SSH_VERSION, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1186 maya 2943 SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOLLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1187 maya 2946 SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1188 maya 2943 SendDlgItemMessage(dlg, IDC_HOSTSERIAL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1189     SendDlgItemMessage(dlg, IDC_HOSTCOMLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1190 maya 2946 SendDlgItemMessage(dlg, IDC_HOSTCOM, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1191 maya 2943 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1192     SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1193     SendDlgItemMessage(dlg, IDC_HOSTHELP, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1194     }
1195     else {
1196     DlgHostFont = NULL;
1197     }
1198    
1199 yutakakn 2734 // SetFocus()���t�H�[�J�X���������������AFALSE�������K�v�������B
1200     // TRUE���������ATABSTOP�������������������R���g���[�����I�������B
1201     // (2004.11.23 yutaka)
1202     return FALSE;
1203     //return TRUE;
1204 yutakakn 2728
1205     case WM_COMMAND:
1206     switch (LOWORD(wParam)) {
1207     case IDOK:
1208     GetHNRec = (PGetHNRec) GetWindowLong(dlg, DWL_USER);
1209     if (GetHNRec != NULL) {
1210     if (IsDlgButtonChecked(dlg, IDC_HOSTTCPIP)) {
1211 maya 2980 #ifndef NO_INET6
1212 yutakakn 2728 char afstr[BUFSIZ];
1213 maya 2980 #endif /* NO_INET6 */
1214 yutakakn 2728 i = GetDlgItemInt(dlg, IDC_HOSTTCPPORT, &Ok, FALSE);
1215     if (Ok) {
1216     GetHNRec->TCPPort = i;
1217     } else {
1218 maya 2994 UTIL_get_lang_msg("MSG_TCPPORT_NAN_ERROR", pvar,
1219 maya 3003 "The TCP port must be a number.");
1220 maya 2937 MessageBox(dlg, pvar->ts->UIMsg,
1221 doda 3134 "Tera Term", MB_OK | MB_ICONEXCLAMATION);
1222 yutakakn 2728 return TRUE;
1223     }
1224 maya 2980 #ifndef NO_INET6
1225 yutakakn 2728 #define getaf(str) \
1226     ((strcmp((str), "IPv6") == 0) ? AF_INET6 : \
1227     ((strcmp((str), "IPv4") == 0) ? AF_INET : AF_UNSPEC))
1228     memset(afstr, 0, sizeof(afstr));
1229     GetDlgItemText(dlg, IDC_HOSTTCPPROTOCOL, afstr,
1230 maya 3003 sizeof(afstr));
1231 yutakakn 2728 GetHNRec->ProtocolFamily = getaf(afstr);
1232 maya 2980 #endif /* NO_INET6 */
1233 yutakakn 2728 GetHNRec->PortType = IdTCPIP;
1234     GetDlgItemText(dlg, IDC_HOSTNAME, GetHNRec->HostName,
1235 maya 3003 HostNameMaxLength);
1236 yutakakn 2728 GetHNRec->Telnet = FALSE;
1237     pvar->hostdlg_activated = TRUE;
1238     pvar->hostdlg_Enabled = FALSE;
1239     if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
1240     GetHNRec->Telnet = TRUE;
1241     } else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1242     pvar->hostdlg_Enabled = TRUE;
1243    
1244 doda 3195 // check SSH protocol version
1245 yutakakn 2728 memset(afstr, 0, sizeof(afstr));
1246     GetDlgItemText(dlg, IDC_SSH_VERSION, afstr, sizeof(afstr));
1247 yutakakn 2850 if (_stricmp(afstr, "SSH1") == 0) {
1248 yutakakn 2728 pvar->settings.ssh_protocol_version = 1;
1249     } else {
1250     pvar->settings.ssh_protocol_version = 2;
1251     }
1252     }
1253 yutakakn 2846
1254     // host history check button
1255     if (SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_GETCHECK, 0, 0) == BST_CHECKED) {
1256     pvar->ts->HistoryList = 1;
1257     } else {
1258     pvar->ts->HistoryList = 0;
1259     }
1260    
1261 yutakakn 2728 } else {
1262     GetHNRec->PortType = IdSerial;
1263     GetHNRec->HostName[0] = 0;
1264     memset(EntName, 0, sizeof(EntName));
1265     GetDlgItemText(dlg, IDC_HOSTCOM, EntName,
1266 maya 3003 sizeof(EntName) - 1);
1267 doda 2982 if (strncmp(EntName, "COM", 3) == 0 && EntName[3] != '\0') {
1268 yutakapon 2997 #if 0
1269 doda 2982 GetHNRec->ComPort = (BYTE) (EntName[3]) - 0x30;
1270     if (strlen(EntName) > 4)
1271     GetHNRec->ComPort =
1272     GetHNRec->ComPort * 10 + (BYTE) (EntName[4]) -
1273     0x30;
1274 yutakapon 2997 #else
1275     GetHNRec->ComPort = atoi(&EntName[3]);
1276     #endif
1277 doda 2982 if (GetHNRec->ComPort > GetHNRec->MaxComPort)
1278     GetHNRec->ComPort = 1;
1279     } else {
1280     GetHNRec->ComPort = 1;
1281     }
1282 yutakakn 2728 }
1283     }
1284 maya 3009 SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)OrigHostnameEditProc);
1285 yutakakn 2728 EndDialog(dlg, 1);
1286 maya 2943
1287 maya 2947 if (DlgHostFont != NULL) {
1288     DeleteObject(DlgHostFont);
1289 maya 2943 }
1290    
1291 yutakakn 2728 return TRUE;
1292    
1293     case IDCANCEL:
1294 maya 3009 SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)OrigHostnameEditProc);
1295 yutakakn 2728 EndDialog(dlg, 0);
1296 maya 2943
1297 maya 2947 if (DlgHostFont != NULL) {
1298     DeleteObject(DlgHostFont);
1299 maya 2943 }
1300 maya 2994
1301 yutakakn 2728 return TRUE;
1302    
1303     case IDC_HOSTTCPIP:
1304     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1305 maya 3003 TRUE);
1306 maya 2980 #ifndef NO_INET6
1307 yutakakn 2728 enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1308 maya 3003 IDC_HOSTTCPPROTOCOL, TRUE);
1309 maya 2980 #endif /* NO_INET6 */
1310 yutakakn 2728 enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, FALSE);
1311    
1312 yutakakn 2734 enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, TRUE); // disabled (2004.11.23 yutaka)
1313 yutakakn 2728 if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1314     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE);
1315     } else {
1316     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1317     }
1318    
1319 yutakakn 2847 enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, TRUE); // disabled
1320    
1321 yutakakn 2728 return TRUE;
1322    
1323     case IDC_HOSTSERIAL:
1324     enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, TRUE);
1325     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1326 maya 3003 FALSE);
1327 maya 2980 #ifndef NO_INET6
1328 yutakakn 2728 enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1329 maya 3003 IDC_HOSTTCPPROTOCOL, FALSE);
1330 maya 2980 #endif /* NO_INET6 */
1331 yutakakn 2728 enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1332 yutakakn 2734 enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, FALSE); // disabled (2004.11.23 yutaka)
1333 yutakakn 2728
1334 yutakakn 2847 enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, FALSE); // disabled
1335    
1336 yutakakn 2728 return TRUE;
1337    
1338     case IDC_HOSTSSH:
1339     enable_dlg_items(dlg, IDC_SSH_VERSION,
1340 maya 3003 IDC_SSH_VERSION, TRUE);
1341 yutakakn 2728 goto hostssh_enabled;
1342    
1343     case IDC_HOSTTELNET:
1344     case IDC_HOSTOTHER:
1345     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1346     hostssh_enabled:
1347    
1348     GetHNRec = (PGetHNRec) GetWindowLong(dlg, DWL_USER);
1349    
1350     if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
1351     if (GetHNRec != NULL)
1352     SetDlgItemInt(dlg, IDC_HOSTTCPPORT, GetHNRec->TelPort,
1353 maya 3003 FALSE);
1354 yutakakn 2728 } else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1355     SetDlgItemInt(dlg, IDC_HOSTTCPPORT, 22, FALSE);
1356     }
1357     return TRUE;
1358    
1359 maya 3009 case IDC_HOSTCOM:
1360     if(HIWORD(wParam) == CBN_DROPDOWN) {
1361     HWND hostcom = GetDlgItem(dlg, IDC_HOSTCOM);
1362     int count = SendMessage(hostcom, CB_GETCOUNT, 0, 0);
1363     int i, len, max_len = 0;
1364     char *lbl;
1365     HDC TmpDC = GetDC(hostcom);
1366     SIZE s;
1367     for (i=0; i<count; i++) {
1368     len = SendMessage(hostcom, CB_GETLBTEXTLEN, i, 0);
1369     lbl = (char *)calloc(len+1, sizeof(char));
1370     SendMessage(hostcom, CB_GETLBTEXT, i, (LPARAM)lbl);
1371     GetTextExtentPoint32(TmpDC, lbl, len, &s);
1372     if (s.cx > max_len)
1373     max_len = s.cx;
1374     free(lbl);
1375     }
1376     SendMessage(hostcom, CB_SETDROPPEDWIDTH,
1377     max_len + GetSystemMetrics(SM_CXVSCROLL), 0);
1378 maya 3004 }
1379 maya 3009 break;
1380 maya 3004
1381 yutakakn 2728 case IDC_HOSTHELP:
1382     PostMessage(GetParent(dlg), WM_USER_DLGHELP2, 0, 0);
1383     }
1384     }
1385     return FALSE;
1386     }
1387    
1388     static BOOL FAR PASCAL TTXGetHostName(HWND parent, PGetHNRec rec)
1389     {
1390     return (BOOL) DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_HOSTDLG),
1391 maya 3003 parent, TTXHostDlg, (LONG) rec);
1392 yutakakn 2728 }
1393    
1394     static void PASCAL FAR TTXGetUIHooks(TTXUIHooks FAR * hooks)
1395     {
1396     *hooks->GetHostName = TTXGetHostName;
1397     }
1398    
1399     static void FAR PASCAL TTXReadINIFile(PCHAR fileName, PTTSet ts)
1400     {
1401     (pvar->ReadIniFile) (fileName, ts);
1402     read_ssh_options(pvar, fileName);
1403     pvar->settings = *pvar->ts_SSH;
1404     notify_verbose_message(pvar, "Reading INI file", LOG_LEVEL_VERBOSE);
1405     FWDUI_load_settings(pvar);
1406     }
1407    
1408     static void FAR PASCAL TTXWriteINIFile(PCHAR fileName, PTTSet ts)
1409     {
1410     (pvar->WriteIniFile) (fileName, ts);
1411     *pvar->ts_SSH = pvar->settings;
1412     clear_local_settings(pvar);
1413     notify_verbose_message(pvar, "Writing INI file", LOG_LEVEL_VERBOSE);
1414 maya 2909 write_ssh_options(pvar, fileName, pvar->ts_SSH, TRUE);
1415 yutakakn 2728 }
1416    
1417     static void read_ssh_options_from_user_file(PTInstVar pvar,
1418 maya 3003 char FAR * user_file_name)
1419 yutakakn 2728 {
1420     if (user_file_name[0] == '.') {
1421     read_ssh_options(pvar, user_file_name);
1422     } else {
1423     char buf[1024];
1424    
1425     get_teraterm_dir_relative_name(buf, sizeof(buf), user_file_name);
1426     read_ssh_options(pvar, buf);
1427     }
1428    
1429     pvar->settings = *pvar->ts_SSH;
1430     FWDUI_load_settings(pvar);
1431     }
1432    
1433 yutakakn 2784
1434     // @���u�����N���u�������B (2005.1.26 yutaka)
1435     static void replace_to_blank(char *src, char *dst, int dst_len)
1436     {
1437     int len, i;
1438    
1439     len = strlen(src);
1440     if (dst_len < len) // buffer overflow check
1441     return;
1442    
1443     for (i = 0 ; i < len ; i++) {
1444     if (src[i] == '@') { // @ ���o��������
1445     if (i < len - 1 && src[i + 1] == '@') { // �������� @ �����A�b�g�}�[�N���F������
1446     *dst++ = '@';
1447     i++;
1448     } else {
1449     *dst++ = ' '; // �������u��������
1450     }
1451     } else {
1452     *dst++ = src[i];
1453     }
1454     }
1455     *dst = '\0';
1456     }
1457    
1458 doda 3190 // Percent-encode������������src���f�R�[�h����dst���R�s�[�����B
1459     // dstlen��dst���T�C�Y�B�����������������������A�����������������������B
1460     static void percent_decode(char *dst, int dstlen, char *src) {
1461     if (src == NULL || dst == NULL || dstlen < 1) {
1462     return;
1463     }
1464    
1465     while (*src != 0 && dstlen > 1) {
1466     if (*src == '%' && isxdigit(*(src+1)) && isxdigit(*(src+2))) {
1467     src++; *dst = (isalpha(*src) ? (*src|0x20) - 'a' + 10 : *src - '0') << 4;
1468     src++; *dst |= (isalpha(*src) ? (*src|0x20) - 'a' + 10 : *src - '0');
1469     src++; dst++;
1470     }
1471     else {
1472     *dst++ = *src++;
1473     }
1474     dstlen--;
1475     }
1476     *dst = 0;
1477     return;
1478     }
1479    
1480 yutakakn 2728 /* returns 1 if the option text must be deleted */
1481     static int parse_option(PTInstVar pvar, char FAR * option)
1482     {
1483     if ((option[0] == '-' || option[0] == '/')) {
1484     if (MATCH_STR(option + 1, "ssh") == 0) {
1485     if (option[4] == 0) {
1486     pvar->settings.Enabled = 1;
1487 maya 3003 } else if (MATCH_STR(option + 4, "-L") == 0 ||
1488     MATCH_STR(option + 4, "-R") == 0 ||
1489     _stricmp(option + 4, "-X") == 0) {
1490 yutakakn 2728 if (pvar->settings.DefaultForwarding[0] == 0) {
1491 maya 2992 strncpy_s(pvar->settings.DefaultForwarding,
1492 maya 3003 sizeof(pvar->settings.DefaultForwarding),
1493     option + 5, _TRUNCATE);
1494 yutakakn 2728 } else {
1495 maya 2992 strncat_s(pvar->settings.DefaultForwarding,
1496 maya 3003 sizeof(pvar->settings.DefaultForwarding),
1497     ";", _TRUNCATE);
1498 maya 2992 strncat_s(pvar->settings.DefaultForwarding,
1499 maya 3003 sizeof(pvar->settings.DefaultForwarding),
1500     option + 5, _TRUNCATE);
1501 yutakakn 2728 }
1502     } else if (MATCH_STR(option + 4, "-f=") == 0) {
1503 maya 2911 read_ssh_options_from_user_file(pvar, option + 7);
1504 yutakakn 2728 } else if (MATCH_STR(option + 4, "-v") == 0) {
1505     pvar->settings.LogLevel = LOG_LEVEL_VERBOSE;
1506 maya 3003 } else if (_stricmp(option + 4, "-autologin") == 0 ||
1507     _stricmp(option + 4, "-autologon") == 0) {
1508 yutakakn 2728 pvar->settings.TryDefaultAuth = TRUE;
1509 yutakakn 2739
1510 maya 3179 } else if (_stricmp(option + 4, "-acceptall") == 0) {
1511     pvar->settings.LocalForwardingIdentityCheck = FALSE;
1512    
1513     // -axx������������������
1514     } else if (MATCH_STR(option + 4, "-a") == 0) {
1515     pvar->settings.ForwardAgent = FALSE;
1516 maya 3176 } else if (MATCH_STR(option + 4, "-A") == 0) {
1517     pvar->settings.ForwardAgent = TRUE;
1518    
1519 yutakakn 2728 } else if (MATCH_STR(option + 4, "-consume=") == 0) {
1520 maya 2911 read_ssh_options_from_user_file(pvar, option + 13);
1521 yutakakn 2728 DeleteFile(option + 13);
1522 maya 2907
1523     // /ssh1 �� /ssh2 �I�v�V�������V�K���� (2006.9.16 maya)
1524     } else if (MATCH_STR(option + 4, "1") == 0) {
1525 maya 3072 pvar->settings.Enabled = 1;
1526 maya 2907 pvar->settings.ssh_protocol_version = 1;
1527     } else if (MATCH_STR(option + 4, "2") == 0) {
1528 maya 3072 pvar->settings.Enabled = 1;
1529 maya 2907 pvar->settings.ssh_protocol_version = 2;
1530    
1531 yutakakn 2728 } else {
1532     char buf[1024];
1533    
1534 maya 2994 UTIL_get_lang_msg("MSG_UNKNOWN_OPTION_ERROR", pvar,
1535 maya 3003 "Unrecognized command-line option: %s");
1536 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, option);
1537 yutakakn 2728
1538     MessageBox(NULL, buf, "TTSSH", MB_OK | MB_ICONEXCLAMATION);
1539     }
1540    
1541 doda 3178 return OPTION_CLEAR;
1542 maya 2915
1543     // ttermpro.exe �� /T= �w�������p�������A������������ (2006.10.19 maya)
1544     } else if (MATCH_STR_I(option + 1, "t=") == 0) {
1545 yutakakn 2728 if (strcmp(option + 3, "2") == 0) {
1546     pvar->settings.Enabled = 1;
1547 doda 3178 return OPTION_CLEAR;
1548 yutakakn 2728 } else {
1549     pvar->settings.Enabled = 0;
1550     }
1551    
1552 maya 2915 // ttermpro.exe �� /F= �w������ TTSSH ������������ (2006.10.11 maya)
1553     } else if (MATCH_STR_I(option + 1, "f=") == 0) {
1554 maya 2913 read_ssh_options_from_user_file(pvar, option + 3);
1555    
1556 yutakakn 2728 // /1 ������ /2 �I�v�V�������V�K���� (2004.10.3 yutaka)
1557     } else if (MATCH_STR(option + 1, "1") == 0) {
1558     // command line: /ssh /1 is SSH1 only
1559     pvar->settings.ssh_protocol_version = 1;
1560    
1561     } else if (MATCH_STR(option + 1, "2") == 0) {
1562     // command line: /ssh /2 is SSH2 & SSH1
1563     pvar->settings.ssh_protocol_version = 2;
1564    
1565     } else if (MATCH_STR(option + 1, "nossh") == 0) {
1566     // '/nossh' �I�v�V�����������B
1567     // TERATERM.INI ��SSH���L�������������������A������Cygterm���N��������������
1568     // �����������������B(2004.10.11 yutaka)
1569     pvar->settings.Enabled = 0;
1570    
1571 maya 2907 } else if (MATCH_STR(option + 1, "telnet") == 0) {
1572     // '/telnet' ���w�������������������� '/nossh' ��������
1573     // SSH������������ (2006.9.16 maya)
1574     pvar->settings.Enabled = 0;
1575    
1576 yutakakn 2739 } else if (MATCH_STR(option + 1, "auth") == 0) {
1577 doda 3195 // SSH2�������O�C���I�v�V����������
1578 yutakakn 2739 //
1579 yutakakn 2784 // SYNOPSIS: /ssh /auth=passowrd /user=���[�U�� /passwd=�p�X���[�h
1580     // /ssh /auth=publickey /user=���[�U�� /passwd=�p�X���[�h /keyfile=�p�X
1581     // EXAMPLE: /ssh /auth=password /user=nike /passwd=a@bc
1582     // /ssh /auth=publickey /user=foo /passwd=bar /keyfile=d:\tmp\id_rsa
1583     // NOTICE: �p�X���[�h���p�X�������������������A�u�����N���������� @ ���g�������B
1584 yutakakn 2739 //
1585 yutakakn 2784 // (2004.11.30 yutaka)
1586     // (2005.1.26 yutaka) ���������B���J���F���T�|�[�g�B
1587     //
1588 yutakakn 2739 pvar->ssh2_autologin = 1; // for SSH2 (2004.11.30 yutaka)
1589    
1590 maya 3025 if (MATCH_STR(option + 5, "=password") == 0) { // �p�X���[�h
1591 yutakakn 2784 //pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
1592     pvar->ssh2_authmethod = SSH_AUTH_PASSWORD;
1593 yutakakn 2739
1594 maya 3028 // /auth=challenge ������ (2007.10.5 maya)
1595     } else if (MATCH_STR(option + 5, "=challenge") == 0) { // keyboard-interactive�F��
1596 maya 3025 //pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
1597     pvar->ssh2_authmethod = SSH_AUTH_TIS;
1598    
1599 yutakakn 2784 } else if (MATCH_STR(option + 5, "=publickey") == 0) { // ���J���F��
1600     //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
1601     pvar->ssh2_authmethod = SSH_AUTH_RSA;
1602    
1603 maya 3108 } else if (MATCH_STR(option + 5, "=pageant") == 0) { // ���J���F�� by Pageant
1604     //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
1605     pvar->ssh2_authmethod = SSH_AUTH_PAGEANT;
1606    
1607 yutakakn 2739 } else {
1608     // TODO:
1609    
1610     }
1611    
1612     } else if (MATCH_STR(option + 1, "user=") == 0) {
1613 yutakakn 2784 replace_to_blank(option + 6, pvar->ssh2_username, sizeof(pvar->ssh2_username));
1614     //_snprintf(pvar->ssh2_username, sizeof(pvar->ssh2_username), "%s", option + 6);
1615 yutakakn 2739
1616     } else if (MATCH_STR(option + 1, "passwd=") == 0) {
1617 yutakakn 2784 replace_to_blank(option + 8, pvar->ssh2_password, sizeof(pvar->ssh2_password));
1618     //_snprintf(pvar->ssh2_password, sizeof(pvar->ssh2_password), "%s", option + 8);
1619 yutakakn 2739
1620 yutakakn 2784 } else if (MATCH_STR(option + 1, "keyfile=") == 0) {
1621     replace_to_blank(option + 9, pvar->ssh2_keyfile, sizeof(pvar->ssh2_keyfile));
1622    
1623 maya 2908 } else if (MATCH_STR(option + 1, "ask4passwd") == 0) {
1624     // �p�X���[�h������ (2006.9.18 maya)
1625     pvar->ask4passwd = 1;
1626    
1627 yutakakn 2728 }
1628    
1629 maya 2908 // �p�X���[�h�������������������O�C��������������
1630     // /auth ���F�����\�b�h���w�������������p������ (2006.9.18 maya)
1631     if (pvar->ask4passwd == 1) {
1632     pvar->ssh2_autologin = 0;
1633     }
1634    
1635 yutakakn 2728 }
1636 doda 3178 else if ((MATCH_STR_I(option, "ssh://") == 0) ||
1637     (MATCH_STR_I(option, "ssh1://") == 0) ||
1638     (MATCH_STR_I(option, "ssh2://") == 0) ||
1639     (MATCH_STR_I(option, "slogin://") == 0) ||
1640     (MATCH_STR_I(option, "slogin1://") == 0) ||
1641     (MATCH_STR_I(option, "slogin2://") == 0)) {
1642 doda 3188 //
1643     // ssh://user@host/ ����URL�`�����T�|�[�g
1644     // ���{�I�������� telnet:// URL��������
1645     //
1646     // �Q�l:
1647     // RFC3986: Uniform Resource Identifier (URI): Generic Syntax
1648     // RFC4248: The telnet URI Scheme
1649     //
1650 doda 3178 char *p, *p2, *p3;
1651 doda 3188 int optlen, hostlen;
1652 doda 3178
1653     optlen = strlen(option);
1654    
1655 doda 3188 // ������':'���O�����������������������A������ssh�v���g�R���o�[�W������������
1656     p = strchr(option, ':');
1657 doda 3178 switch (*(p-1)) {
1658     case '1':
1659     pvar->settings.ssh_protocol_version = 1;
1660     break;
1661     case '2':
1662     pvar->settings.ssh_protocol_version = 2;
1663     break;
1664     }
1665    
1666 doda 3188 // authority part �����|�C���^������
1667 doda 3178 p += 3;
1668    
1669 doda 3188 // path part ������������
1670 doda 3178 if ((p2 = strchr(p, '/')) != NULL) {
1671 doda 3188 *p2 = 0;
1672 doda 3178 }
1673    
1674 doda 3188 // '@'�������������A���������O�����[�U����
1675 doda 3178 if ((p2 = strchr(p, '@')) != NULL) {
1676     *p2 = 0;
1677 doda 3188 // ':'���~���p�X���[�h
1678 doda 3178 if ((p3 = strchr(p, ':')) != NULL) {
1679     *p3 = 0;
1680 doda 3190 percent_decode(pvar->ssh2_password, sizeof(pvar->ssh2_password), p3 + 1);
1681 doda 3178 pvar->ssh2_autologin = 1;
1682     }
1683 doda 3190 percent_decode(pvar->ssh2_username, sizeof(pvar->ssh2_username), p);
1684 doda 3188 // p �� host part ������('@'����������)����������������
1685     p = p2 + 1;
1686 doda 3178 }
1687    
1688 doda 3188 // host part �� option �����������������Ascheme part ������
1689     // port�w����������������port���������������������m��������������
1690     hostlen = strlen(p);
1691     memmove_s(option, optlen, p, hostlen);
1692     option[hostlen] = 0;
1693    
1694     // �|�[�g�w������������":22"������
1695 doda 3189 #ifndef NO_INET6
1696     if (option[0] == '[' && option[hostlen-1] == ']' || // IPv6 raw address without port
1697     option[0] != '[' && strchr(option, ':') == NULL) { // hostname or IPv4 raw address without port
1698     #else
1699 doda 3188 if (strchr(option, ':') == NULL) {
1700 doda 3189 #endif /* NO_INET6 */
1701 doda 3188 memcpy_s(option+hostlen, optlen-hostlen, ":22", 3);
1702     hostlen += 3;
1703     }
1704    
1705     // �|�[�g�w�����������������X�y�[�X������
1706     memset(option+hostlen, ' ', optlen-hostlen);
1707    
1708 doda 3178 pvar->settings.Enabled = 1;
1709    
1710     return OPTION_REPLACE;
1711     }
1712 doda 3195 else if (strchr(option, '@') != NULL) {
1713     //
1714     // user@host �`�����T�|�[�g
1715     // ����������ssh�������T�|�[�g�����A���[�U����ttssh���������B
1716     // (ssh�������O -- ttssh�������W������������)
1717     // �����I��telnet authentication option���T�|�[�g��������
1718     // Tera Term�{�����������������������\���B
1719     //
1720     char *p;
1721     p = strchr(option, '@');
1722     *p = 0;
1723 doda 3178
1724 doda 3195 strncpy_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), option, _TRUNCATE);
1725    
1726     // ���[�U���������X�y�[�X�������B
1727     // ������TTX��Tera Term�{�������������������X�y�[�X�����������������A
1728     // �z�X�g�����������l�����K�v�������B
1729     memset(option, ' ', p-option+1);
1730    
1731     return OPTION_REPLACE;
1732     }
1733    
1734 doda 3178 return OPTION_NONE;
1735 yutakakn 2728 }
1736    
1737     static void FAR PASCAL TTXParseParam(PCHAR param, PTTSet ts,
1738 maya 3003 PCHAR DDETopic)
1739 yutakakn 2728 {
1740 maya 2911 // �X�y�[�X�������t�@�C�������F�������������C�� (2006.10.7 maya)
1741 doda 3178 int i, buflen;
1742 yutakakn 2728 BOOL inParam = FALSE;
1743     BOOL inQuotes = FALSE;
1744 maya 2911 BOOL inFileParam = FALSE;
1745 yutakakn 2728 PCHAR option = NULL;
1746    
1747     if (pvar->hostdlg_activated) {
1748     pvar->settings.Enabled = pvar->hostdlg_Enabled;
1749     }
1750    
1751     for (i = 0; param[i] != 0; i++) {
1752 maya 2911 if (inQuotes ? param[i] == '"'
1753 maya 3003 : (param[i] == ' ' || param[i] == '\t')) {
1754 yutakakn 2728 if (option != NULL) {
1755     char ch = param[i];
1756 maya 2911 PCHAR Equal;
1757 yutakakn 2728
1758     param[i] = 0;
1759 maya 2911 Equal = strchr(option, '=');
1760     if (inFileParam && Equal != NULL && *(Equal + 1) == '"') {
1761 maya 2992 int buf_len = strlen(option) * sizeof(char);
1762 maya 2911 char *buf = (char *)calloc(strlen(option), sizeof(char));
1763 maya 2992 char c = option[Equal - option + 1];
1764     option[Equal - option + 1] = 0;
1765     strncat_s(buf, buf_len, option, _TRUNCATE);
1766     option[Equal - option + 1] = c;
1767     strncat_s(buf, buf_len, Equal + 2, _TRUNCATE);
1768 doda 3178 switch (parse_option(pvar, *buf == '"' ? buf + 1 : buf)) {
1769     case OPTION_CLEAR:
1770 maya 2911 memset(option, ' ', i + 1 - (option - param));
1771 doda 3178 break;
1772     case OPTION_REPLACE:
1773     buflen = strlen(buf);
1774     memcpy(option, buf, buflen);
1775     memset(option + buflen, ' ', i + 1 - buflen - (option - param));
1776     break;
1777     default:
1778 maya 2911 param[i] = ch;
1779     }
1780     free(buf);
1781 yutakakn 2728 }
1782 maya 2911 else {
1783 doda 3178 switch (parse_option(pvar, *option == '"' ? option + 1 : option)) {
1784     case OPTION_CLEAR:
1785 maya 2911 memset(option, ' ', i + 1 - (option - param));
1786 doda 3178 break;
1787     default:
1788 maya 2911 param[i] = ch;
1789     }
1790     }
1791 yutakakn 2728 option = NULL;
1792     }
1793     inParam = FALSE;
1794     inQuotes = FALSE;
1795 maya 2911 inFileParam = FALSE;
1796 yutakakn 2728 } else if (!inParam) {
1797     if (param[i] == '"') {
1798     inQuotes = TRUE;
1799     inParam = TRUE;
1800     option = param + i;
1801     } else if (param[i] != ' ' && param[i] != '\t') {
1802     inParam = TRUE;
1803     option = param + i;
1804     }
1805 maya 2911 } else {
1806     if (option == NULL) {
1807     continue;
1808     }
1809     if ((option[0] == '-' || option[0] == '/') &&
1810 maya 3003 (MATCH_STR(option + 1, "ssh-f=") == 0 ||
1811     MATCH_STR(option + 1, "ssh-consume=") == 0 ||
1812     MATCH_STR_I(option + 1, "f=") == 0 ||
1813     MATCH_STR(option + 1, "keyfile=") == 0)) {
1814 maya 2911 if (param[i] == '"') {
1815     inQuotes = TRUE;
1816     }
1817     inFileParam = TRUE;
1818     }
1819 yutakakn 2728 }
1820     }
1821    
1822     if (option != NULL) {
1823 maya 2911 PCHAR Equal = strchr(option, '=');
1824     if (inFileParam && Equal != NULL && *(Equal + 1) == '"') {
1825 maya 2992 int buf_len = strlen(option) * sizeof(char);
1826 maya 2911 char *buf = (char *)calloc(strlen(option), sizeof(char));
1827 maya 2992 char c = option[Equal - option + 1];
1828     option[Equal - option + 1] = 0;
1829     strncat_s(buf, buf_len, option, _TRUNCATE);
1830     option[Equal - option + 1] = c;
1831     strncat_s(buf, buf_len, Equal + 2, _TRUNCATE);
1832 doda 3178 switch (parse_option(pvar, *buf == '"' ? buf + 1 : buf)) {
1833     case OPTION_CLEAR:
1834 maya 2911 memset(option, ' ', i + 1 - (option - param));
1835 doda 3178 break;
1836     case OPTION_REPLACE:
1837     strcpy_s(option, i - (param - option), buf);
1838     break;
1839 maya 2911 }
1840     free(buf);
1841 yutakakn 2728 }
1842 maya 2911 else {
1843 doda 3178 switch (parse_option(pvar, option)) {
1844     case OPTION_CLEAR:
1845 maya 2911 memset(option, ' ', i - (option - param));
1846 doda 3178 break;
1847 maya 2911 }
1848     }
1849 yutakakn 2728 }
1850    
1851     FWDUI_load_settings(pvar);
1852    
1853     (pvar->ParseParam) (param, ts, DDETopic);
1854    
1855     }
1856    
1857     static void PASCAL FAR TTXGetSetupHooks(TTXSetupHooks FAR * hooks)
1858     {
1859     pvar->ReadIniFile = *hooks->ReadIniFile;
1860     pvar->WriteIniFile = *hooks->WriteIniFile;
1861     pvar->ParseParam = *hooks->ParseParam;
1862    
1863     *hooks->ReadIniFile = TTXReadINIFile;
1864     *hooks->WriteIniFile = TTXWriteINIFile;
1865     *hooks->ParseParam = TTXParseParam;
1866     }
1867    
1868     static void PASCAL FAR TTXSetWinSize(int rows, int cols)
1869     {
1870     SSH_notify_win_size(pvar, cols, rows);
1871     }
1872    
1873     static void insertMenuBeforeItem(HMENU menu, WORD beforeItemID, WORD flags,
1874 maya 3003 WORD newItemID, char FAR * text)
1875 yutakakn 2728 {
1876     int i, j;
1877    
1878     for (i = GetMenuItemCount(menu) - 1; i >= 0; i--) {
1879     HMENU submenu = GetSubMenu(menu, i);
1880    
1881     for (j = GetMenuItemCount(submenu) - 1; j >= 0; j--) {
1882     if (GetMenuItemID(submenu, j) == beforeItemID) {
1883 maya 3003 InsertMenu(submenu, j, MF_BYPOSITION | flags, newItemID, text);
1884 yutakakn 2728 return;
1885     }
1886     }
1887     }
1888     }
1889    
1890     static void PASCAL FAR TTXModifyMenu(HMENU menu)
1891     {
1892     /* inserts before ID_HELP_ABOUT */
1893 maya 2994 UTIL_get_lang_msg("MENU_ABOUT", pvar, "About &TTSSH...");
1894 maya 2937 insertMenuBeforeItem(menu, 50990, MF_ENABLED, ID_ABOUTMENU, pvar->ts->UIMsg);
1895 yutakakn 2728
1896     /* inserts before ID_SETUP_TCPIP */
1897 maya 2994 UTIL_get_lang_msg("MENU_SSH", pvar, "SS&H...");
1898 maya 2937 insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHSETUPMENU, pvar->ts->UIMsg);
1899 yutakakn 2728 /* inserts before ID_SETUP_TCPIP */
1900 maya 2994 UTIL_get_lang_msg("MENU_SSH_AUTH", pvar, "SSH &Authentication...");
1901 maya 2937 insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHAUTHSETUPMENU, pvar->ts->UIMsg);
1902 yutakakn 2728 /* inserts before ID_SETUP_TCPIP */
1903 maya 2994 UTIL_get_lang_msg("MENU_SSH_FORWARD", pvar, "SSH F&orwarding...");
1904 maya 2937 insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHFWDSETUPMENU, pvar->ts->UIMsg);
1905 maya 2994 UTIL_get_lang_msg("MENU_SSH_KEYGEN", pvar, "SSH KeyGe&nerator...");
1906 maya 2937 insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHKEYGENMENU, pvar->ts->UIMsg);
1907 yutakapon 3074
1908     /* inserts before ID_FILE_CHANGEDIR */
1909 maya 3194 UTIL_get_lang_msg("MENU_SSH_SCP", pvar, "SS&H SCP...");
1910 yutakapon 3074 insertMenuBeforeItem(menu, 50170, MF_ENABLED, ID_SSHSCPMENU, pvar->ts->UIMsg);
1911 yutakakn 2728 }
1912    
1913     static void append_about_text(HWND dlg, char FAR * prefix, char FAR * msg)
1914     {
1915     SendDlgItemMessage(dlg, IDC_ABOUTTEXT, EM_REPLACESEL, 0,
1916 maya 3003 (LPARAM) prefix);
1917 yutakakn 2728 SendDlgItemMessage(dlg, IDC_ABOUTTEXT, EM_REPLACESEL, 0, (LPARAM) msg);
1918     SendDlgItemMessage(dlg, IDC_ABOUTTEXT, EM_REPLACESEL, 0,
1919 maya 3003 (LPARAM) (char FAR *) "\r\n");
1920 yutakakn 2728 }
1921    
1922 yutakakn 2792 // ���s�t�@�C�������o�[�W�������������� (2005.2.28 yutaka)
1923 yutakakn 2793 void get_file_version(char *exefile, int *major, int *minor, int *release, int *build)
1924 yutakakn 2792 {
1925     typedef struct {
1926     WORD wLanguage;
1927     WORD wCodePage;
1928     } LANGANDCODEPAGE, *LPLANGANDCODEPAGE;
1929     LPLANGANDCODEPAGE lplgcode;
1930     UINT unLen;
1931     DWORD size;
1932     char *buf = NULL;
1933     BOOL ret;
1934     int i;
1935     char fmt[80];
1936     char *pbuf;
1937    
1938     size = GetFileVersionInfoSize(exefile, NULL);
1939     if (size == 0) {
1940     goto error;
1941     }
1942     buf = malloc(size);
1943     ZeroMemory(buf, size);
1944    
1945     if (GetFileVersionInfo(exefile, 0, size, buf) == FALSE) {
1946     goto error;
1947     }
1948    
1949     ret = VerQueryValue(buf,
1950 doda 3195 "\\VarFileInfo\\Translation",
1951 yutakakn 2792 (LPVOID *)&lplgcode, &unLen);
1952     if (ret == FALSE)
1953     goto error;
1954    
1955     for (i = 0 ; i < (int)(unLen / sizeof(LANGANDCODEPAGE)) ; i++) {
1956 maya 2992 _snprintf_s(fmt, sizeof(fmt), _TRUNCATE,
1957 doda 3195 "\\StringFileInfo\\%04x%04x\\FileVersion",
1958 maya 3003 lplgcode[i].wLanguage, lplgcode[i].wCodePage);
1959 yutakakn 2792 VerQueryValue(buf, fmt, &pbuf, &unLen);
1960     if (unLen > 0) { // get success
1961     int n, a, b, c, d;
1962    
1963     n = sscanf(pbuf, "%d, %d, %d, %d", &a, &b, &c, &d);
1964     if (n == 4) { // convert success
1965     *major = a;
1966     *minor = b;
1967     *release = c;
1968     *build = d;
1969     break;
1970     }
1971     }
1972     }
1973    
1974     free(buf);
1975     return;
1976    
1977     error:
1978     free(buf);
1979     *major = *minor = *release = *build = 0;
1980     }
1981    
1982 yutakakn 2728 static void init_about_dlg(PTInstVar pvar, HWND dlg)
1983     {
1984     char buf[1024];
1985 yutakakn 2792 int a, b, c, d;
1986 maya 2994 char uimsg[MAX_UIMSG];
1987    
1988     GetWindowText(dlg, uimsg, sizeof(uimsg));
1989     UTIL_get_lang_msg("DLG_ABOUT_TITLE", pvar, uimsg);
1990 maya 2937 SetWindowText(dlg, pvar->ts->UIMsg);
1991 maya 2994 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1992     UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1993 maya 2937 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1994 doda 3195
1995 yutakakn 2792 // TTSSH���o�[�W�������������� (2005.2.28 yutaka)
1996     get_file_version("ttxssh.dll", &a, &b, &c, &d);
1997 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
1998 maya 3132 "TTSSH\r\nTera Term Secure Shell extension, %d.%d", a, b);
1999 yutakakn 2792 SendMessage(GetDlgItem(dlg, IDC_TTSSH_VERSION), WM_SETTEXT, 0, (LPARAM)buf);
2000    
2001 yutakakn 2782 // OpenSSL���o�[�W�������������� (2005.1.24 yutaka)
2002 yutakakn 2820 // ���������� (2005.5.11 yutaka)
2003     #ifdef OPENSSL_VERSION_TEXT
2004 yutakakn 2782 SendMessage(GetDlgItem(dlg, IDC_OPENSSL_VERSION), WM_SETTEXT, 0, (LPARAM)OPENSSL_VERSION_TEXT);
2005 yutakakn 2820 #else
2006     SendMessage(GetDlgItem(dlg, IDC_OPENSSL_VERSION), WM_SETTEXT, 0, (LPARAM)"Unknown");
2007     #endif
2008 yutakakn 2782
2009 yutakakn 2820 // zlib���o�[�W�������������� (2005.5.11 yutaka)
2010     #ifdef ZLIB_VERSION
2011 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE, "ZLib %s", ZLIB_VERSION);
2012 yutakakn 2820 #else
2013 yutakakn 2823 _snprintf(buf, sizeof(buf), "ZLib Unknown");
2014 yutakakn 2820 #endif
2015     SendMessage(GetDlgItem(dlg, IDC_ZLIB_VERSION), WM_SETTEXT, 0, (LPARAM)buf);
2016    
2017    
2018 yutakakn 2728 // TTSSH�_�C�A���O���\������SSH������������ (2004.10.30 yutaka)
2019     if (pvar->socket != INVALID_SOCKET) {
2020     if (SSHv1(pvar)) {
2021     SSH_get_server_ID_info(pvar, buf, sizeof(buf));
2022 maya 3213 UTIL_get_lang_msg("DLG_ABOUT_SERVERID", pvar, "Server ID:");
2023 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
2024 yutakakn 2728 SSH_get_protocol_version_info(pvar, buf, sizeof(buf));
2025 maya 3213 UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol:");
2026 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
2027 yutakakn 2728 CRYPT_get_cipher_info(pvar, buf, sizeof(buf));
2028 maya 3213 UTIL_get_lang_msg("DLG_ABOUT_ENCRYPTION", pvar, "Encryption:");
2029 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
2030 yutakakn 2728 CRYPT_get_server_key_info(pvar, buf, sizeof(buf));
2031 maya 3213 UTIL_get_lang_msg("DLG_ABOUT_SERVERKEY", pvar, "Server keys:");
2032 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
2033 yutakakn 2728 AUTH_get_auth_info(pvar, buf, sizeof(buf));
2034 maya 3213 UTIL_get_lang_msg("DLG_ABOUT_AUTH", pvar, "Authentication:");
2035 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
2036 yutakakn 2728 SSH_get_compression_info(pvar, buf, sizeof(buf));
2037 maya 3213 UTIL_get_lang_msg("DLG_ABOUT_COMP", pvar, "Compression:");
2038 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
2039 yutakakn 2728
2040     } else { // SSH2
2041     SSH_get_server_ID_info(pvar, buf, sizeof(buf));
2042 maya 3213 UTIL_get_lang_msg("DLG_ABOUT_SERVERID", pvar, "Server ID:");
2043 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
2044 maya 3213 UTIL_get_lang_msg("DLG_ABOUT_CLIENTID", pvar, "Client ID:");
2045 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, pvar->client_version_string);
2046 yutakakn 2728
2047     SSH_get_protocol_version_info(pvar, buf, sizeof(buf));
2048 maya 3213 UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol:");
2049 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
2050 yutakakn 2728
2051     if (pvar->kex_type == KEX_DH_GRP1_SHA1) {
2052 maya 2992 strncpy_s(buf, sizeof(buf), KEX_DH1, _TRUNCATE);
2053 yutakakn 2728 } else if (pvar->kex_type == KEX_DH_GRP14_SHA1) {
2054 maya 2992 strncpy_s(buf, sizeof(buf), KEX_DH14, _TRUNCATE);
2055 yutakakn 2728 } else {
2056 maya 2992 strncpy_s(buf, sizeof(buf), KEX_DHGEX, _TRUNCATE);
2057 yutakakn 2728 }
2058 maya 3213 append_about_text(dlg, "KEX:", buf);
2059 yutakakn 2728
2060     if (pvar->hostkey_type == KEY_DSA) {
2061 maya 2992 strncpy_s(buf, sizeof(buf), "ssh-dss", _TRUNCATE);
2062 yutakakn 2728 } else {
2063 maya 2992 strncpy_s(buf, sizeof(buf), "ssh-rsa", _TRUNCATE);
2064 yutakakn 2728 }
2065 maya 3213 UTIL_get_lang_msg("DLG_ABOUT_HOSTKEY", pvar, "Host Key:");
2066 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
2067 yutakakn 2728
2068 yutakakn 2758 // add HMAC algorithm (2004.12.17 yutaka)
2069     buf[0] = '\0';
2070     if (pvar->ctos_hmac == HMAC_SHA1) {
2071 maya 2992 strncat_s(buf, sizeof(buf), "hmac-sha1", _TRUNCATE);
2072 yutakakn 2758 } else if (pvar->ctos_hmac == HMAC_MD5) {
2073 maya 2992 strncat_s(buf, sizeof(buf), "hmac-md5", _TRUNCATE);
2074 maya 3214 }
2075 maya 3213 UTIL_get_lang_msg("DLG_ABOUT_TOSERVER", pvar, " to server,");
2076 maya 2992 strncat_s(buf, sizeof(buf), pvar->ts->UIMsg, _TRUNCATE);
2077 yutakakn 2758 if (pvar->stoc_hmac == HMAC_SHA1) {
2078 maya 2992 strncat_s(buf, sizeof(buf), "hmac-sha1", _TRUNCATE);
2079 yutakakn 2758 } else if (pvar->stoc_hmac == HMAC_MD5) {
2080 maya 2992 strncat_s(buf, sizeof(buf), "hmac-md5", _TRUNCATE);
2081 yutakakn 2758 }
2082 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_FROMSERVER", pvar, " from server");
2083 maya 2992 strncat_s(buf, sizeof(buf), pvar->ts->UIMsg, _TRUNCATE);
2084 maya 3213 append_about_text(dlg, "HMAC:", buf);
2085 yutakakn 2758
2086 yutakakn 2728 CRYPT_get_cipher_info(pvar, buf, sizeof(buf));
2087 maya 3213 UTIL_get_lang_msg("DLG_ABOUT_ENCRYPTION", pvar, "Encryption:");
2088 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
2089 yutakakn 2728 CRYPT_get_server_key_info(pvar, buf, sizeof(buf));
2090 maya 3213 UTIL_get_lang_msg("DLG_ABOUT_SERVERKEY", pvar, "Server keys:");
2091 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
2092 maya 2994
2093 yutakakn 2728 AUTH_get_auth_info(pvar, buf, sizeof(buf));
2094 maya 3213 UTIL_get_lang_msg("DLG_ABOUT_AUTH", pvar, "Authentication:");
2095 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
2096 yutakakn 2873
2097 yutakakn 2728 SSH_get_compression_info(pvar, buf, sizeof(buf));
2098 yutakakn 2873 if (pvar->ctos_compression == COMP_DELAYED) { // �x���p�P�b�g���k������ (2006.6.23 yutaka)
2099 maya 3213 UTIL_get_lang_msg("DLG_ABOUT_COMPDELAY", pvar, "Delayed Compression:");
2100 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
2101 yutakakn 2873 } else {
2102 maya 3213 UTIL_get_lang_msg("DLG_ABOUT_COMP", pvar, "Compression:");
2103 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
2104 yutakakn 2873 }
2105 yutakakn 2728 }
2106     }
2107     }
2108    
2109     static BOOL CALLBACK TTXAboutDlg(HWND dlg, UINT msg, WPARAM wParam,
2110 maya 3003 LPARAM lParam)
2111 yutakakn 2728 {
2112 maya 2937 LOGFONT logfont;
2113     HFONT font;
2114 maya 2994
2115 yutakakn 2728 switch (msg) {
2116     case WM_INITDIALOG:
2117 maya 2937 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
2118     GetObject(font, sizeof(LOGFONT), &logfont);
2119 maya 2946 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAboutFont, pvar)) {
2120 maya 2937 SendDlgItemMessage(dlg, IDC_TTSSH_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2121     SendDlgItemMessage(dlg, IDC_SSHVERSIONS, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2122     SendDlgItemMessage(dlg, IDC_INCLUDES, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2123     SendDlgItemMessage(dlg, IDC_OPENSSL_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont,