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 3065 - (hide annotations) (download) (as text)
Mon Nov 5 00:51:38 2007 UTC (16 years, 5 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 112165 byte(s)
"New connection" ダイアログのコマンドラインの SSH 判定を修正した。

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