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 3020 - (hide annotations) (download) (as text)
Wed Oct 3 06:00:37 2007 UTC (16 years, 6 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 109841 byte(s)
no message

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