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 3170 - (hide annotations) (download) (as text)
Sat Nov 22 10:05:33 2008 UTC (15 years, 4 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 118862 byte(s)
SSH2 の共通鍵暗号方式として CAST128-CBC をサポート

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