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 2999 - (hide annotations) (download) (as text)
Sat Aug 18 08:54:14 2007 UTC (16 years, 7 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 107271 byte(s)
不定なメモリを free して落ちることがある問題を修正した。

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