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 3025 - (hide annotations) (download) (as text)
Thu Oct 4 15:15:04 2007 UTC (16 years, 6 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 110838 byte(s)
/auth=challange コマンドラインパラメータを追加した。

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