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 3169 - (hide annotations) (download) (as text)
Sat Nov 22 06:46:43 2008 UTC (15 years, 4 months ago) by doda
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 118774 byte(s)
SSH2 の共通鍵暗号方式として Arcfour128, Arcfour256 をサポート

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