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 3040 - (hide annotations) (download) (as text)
Wed Oct 17 04:06:57 2007 UTC (16 years, 5 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 111347 byte(s)
SSH2 の暗号方式として AES192 をサポートした。

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