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 3009 - (hide annotations) (download) (as text)
Wed Sep 5 12:07:04 2007 UTC (16 years, 7 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 109590 byte(s)
接続ダイアログのホスト名ドロップダウンにおいて、Ctrl+a/Ctrl+e を使って先頭/終端に移動できるようにした。

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