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 2997 - (hide annotations) (download) (as text)
Fri Aug 17 06:15:06 2007 UTC (16 years, 7 months ago) by yutakapon
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 107079 byte(s)
Serial portのDescriptionを取得するようにした。

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     j = 0;
1022     w = 1;
1023 maya 2992 strncpy_s(EntName, sizeof(EntName), "COM", _TRUNCATE);
1024 yutakapon 2996 if ((comports=DetectComPorts(ComPortTable, GetHNRec->MaxComPort, ComPortDesc)) >= 0) {
1025 doda 2964 for (i=0; i<comports; i++) {
1026 maya 2992 _snprintf_s(&EntName[3], sizeof(EntName)-3, _TRUNCATE, "%d", ComPortTable[i]);
1027 yutakapon 2996 strncat_s(EntName, sizeof(EntName), ": ", _TRUNCATE);
1028     strncat_s(EntName, sizeof(EntName), ComPortDesc[i], _TRUNCATE);
1029 doda 2964 SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,
1030     0, (LPARAM)EntName);
1031     j++;
1032     if (GetHNRec->ComPort == ComPortTable[i])
1033     w = j;
1034     }
1035    
1036     } else {
1037     for (i = 1; i <= GetHNRec->MaxComPort; i++) {
1038 maya 2992 _snprintf_s(&EntName[3], sizeof(EntName)-3, _TRUNCATE, "%d", i);
1039 doda 2964 SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,
1040     0, (LPARAM) EntName);
1041     j++;
1042     if (GetHNRec->ComPort == i)
1043     w = j;
1044     }
1045 yutakakn 2728 }
1046 doda 2964
1047 yutakakn 2728 if (j > 0)
1048     SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_SETCURSEL, w - 1, 0);
1049 doda 2982 else { /* All com ports are already used */
1050 yutakakn 2728 GetHNRec->PortType = IdTCPIP;
1051 doda 2982 enable_dlg_items(dlg, IDC_HOSTSERIAL, IDC_HOSTSERIAL, FALSE);
1052     }
1053 yutakakn 2728
1054 doda 2982 CheckRadioButton(dlg, IDC_HOSTTCPIP, IDC_HOSTSERIAL,
1055     IDC_HOSTTCPIP + GetHNRec->PortType - 1);
1056    
1057 yutakakn 2803 if (GetHNRec->PortType == IdTCPIP) {
1058 yutakakn 2728 enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, FALSE);
1059 yutakakn 2803
1060     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE);
1061     enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, TRUE);
1062     }
1063 maya 2980 #ifndef NO_INET6
1064 yutakakn 2728 else {
1065     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1066     FALSE);
1067     enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1068     IDC_HOSTTCPPROTOCOL, FALSE);
1069 yutakakn 2803
1070     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1071     enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, FALSE); // disabled (2004.11.23 yutaka)
1072 yutakakn 2728 }
1073     #else
1074     else
1075     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1076     FALSE);
1077 maya 2980 #endif /* NO_INET6 */
1078 yutakakn 2728
1079     // Host dialog���t�H�[�J�X�������� (2004.10.2 yutaka)
1080 yutakakn 2803 if (GetHNRec->PortType == IdTCPIP) {
1081     HWND hwnd = GetDlgItem(dlg, IDC_HOSTNAME);
1082     SetFocus(hwnd);
1083     } else {
1084     HWND hwnd = GetDlgItem(dlg, IDC_HOSTCOM);
1085     SetFocus(hwnd);
1086 yutakakn 2728 }
1087    
1088 maya 2943 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1089     GetObject(font, sizeof(LOGFONT), &logfont);
1090 maya 2946 if (UTIL_get_lang_font("DLG_SYSTEM_FONT", dlg, &logfont, &DlgHostFont, pvar)) {
1091 maya 2943 SendDlgItemMessage(dlg, IDC_HOSTTCPIP, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1092     SendDlgItemMessage(dlg, IDC_HOSTNAMELABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1093 maya 2946 SendDlgItemMessage(dlg, IDC_HOSTNAME, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1094 maya 2943 SendDlgItemMessage(dlg, IDC_HISTORY, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1095     SendDlgItemMessage(dlg, IDC_SERVICELABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1096     SendDlgItemMessage(dlg, IDC_HOSTTELNET, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1097     SendDlgItemMessage(dlg, IDC_HOSTSSH, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1098     SendDlgItemMessage(dlg, IDC_HOSTOTHER, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1099     SendDlgItemMessage(dlg, IDC_HOSTTCPPORTLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1100 maya 2946 SendDlgItemMessage(dlg, IDC_HOSTTCPPORT, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1101 maya 2943 SendDlgItemMessage(dlg, IDC_SSH_VERSION_LABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1102 maya 2946 SendDlgItemMessage(dlg, IDC_SSH_VERSION, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1103 maya 2943 SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOLLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1104 maya 2946 SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1105 maya 2943 SendDlgItemMessage(dlg, IDC_HOSTSERIAL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1106     SendDlgItemMessage(dlg, IDC_HOSTCOMLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1107 maya 2946 SendDlgItemMessage(dlg, IDC_HOSTCOM, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1108 maya 2943 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1109     SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1110     SendDlgItemMessage(dlg, IDC_HOSTHELP, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1111     }
1112     else {
1113     DlgHostFont = NULL;
1114     }
1115    
1116 yutakakn 2734 // SetFocus()���t�H�[�J�X���������������AFALSE�������K�v�������B
1117     // TRUE���������ATABSTOP�������������������R���g���[�����I�������B
1118     // (2004.11.23 yutaka)
1119     return FALSE;
1120     //return TRUE;
1121 yutakakn 2728
1122     case WM_COMMAND:
1123     switch (LOWORD(wParam)) {
1124     case IDOK:
1125     GetHNRec = (PGetHNRec) GetWindowLong(dlg, DWL_USER);
1126     if (GetHNRec != NULL) {
1127     if (IsDlgButtonChecked(dlg, IDC_HOSTTCPIP)) {
1128 maya 2980 #ifndef NO_INET6
1129 yutakakn 2728 char afstr[BUFSIZ];
1130 maya 2980 #endif /* NO_INET6 */
1131 yutakakn 2728 i = GetDlgItemInt(dlg, IDC_HOSTTCPPORT, &Ok, FALSE);
1132     if (Ok) {
1133     GetHNRec->TCPPort = i;
1134     } else {
1135 maya 2994 UTIL_get_lang_msg("MSG_TCPPORT_NAN_ERROR", pvar,
1136     "The TCP port must be a number.");
1137 maya 2937 MessageBox(dlg, pvar->ts->UIMsg,
1138     "Teraterm", MB_OK | MB_ICONEXCLAMATION);
1139 yutakakn 2728 return TRUE;
1140     }
1141 maya 2980 #ifndef NO_INET6
1142 yutakakn 2728 #define getaf(str) \
1143     ((strcmp((str), "IPv6") == 0) ? AF_INET6 : \
1144     ((strcmp((str), "IPv4") == 0) ? AF_INET : AF_UNSPEC))
1145     memset(afstr, 0, sizeof(afstr));
1146     GetDlgItemText(dlg, IDC_HOSTTCPPROTOCOL, afstr,
1147     sizeof(afstr));
1148     GetHNRec->ProtocolFamily = getaf(afstr);
1149 maya 2980 #endif /* NO_INET6 */
1150 yutakakn 2728 GetHNRec->PortType = IdTCPIP;
1151     GetDlgItemText(dlg, IDC_HOSTNAME, GetHNRec->HostName,
1152     HostNameMaxLength);
1153     GetHNRec->Telnet = FALSE;
1154     pvar->hostdlg_activated = TRUE;
1155     pvar->hostdlg_Enabled = FALSE;
1156     if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
1157     GetHNRec->Telnet = TRUE;
1158     } else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1159     pvar->hostdlg_Enabled = TRUE;
1160    
1161     // check SSH protocol version
1162     memset(afstr, 0, sizeof(afstr));
1163     GetDlgItemText(dlg, IDC_SSH_VERSION, afstr, sizeof(afstr));
1164 yutakakn 2850 if (_stricmp(afstr, "SSH1") == 0) {
1165 yutakakn 2728 pvar->settings.ssh_protocol_version = 1;
1166     } else {
1167     pvar->settings.ssh_protocol_version = 2;
1168     }
1169     }
1170 yutakakn 2846
1171     // host history check button
1172     if (SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_GETCHECK, 0, 0) == BST_CHECKED) {
1173     pvar->ts->HistoryList = 1;
1174     } else {
1175     pvar->ts->HistoryList = 0;
1176     }
1177    
1178 yutakakn 2728 } else {
1179     GetHNRec->PortType = IdSerial;
1180     GetHNRec->HostName[0] = 0;
1181     memset(EntName, 0, sizeof(EntName));
1182     GetDlgItemText(dlg, IDC_HOSTCOM, EntName,
1183     sizeof(EntName) - 1);
1184 doda 2982 if (strncmp(EntName, "COM", 3) == 0 && EntName[3] != '\0') {
1185 yutakapon 2997 #if 0
1186 doda 2982 GetHNRec->ComPort = (BYTE) (EntName[3]) - 0x30;
1187     if (strlen(EntName) > 4)
1188     GetHNRec->ComPort =
1189     GetHNRec->ComPort * 10 + (BYTE) (EntName[4]) -
1190     0x30;
1191 yutakapon 2997 #else
1192     GetHNRec->ComPort = atoi(&EntName[3]);
1193     #endif
1194 doda 2982 if (GetHNRec->ComPort > GetHNRec->MaxComPort)
1195     GetHNRec->ComPort = 1;
1196     } else {
1197     GetHNRec->ComPort = 1;
1198     }
1199 yutakakn 2728 }
1200     }
1201     EndDialog(dlg, 1);
1202 maya 2943
1203 maya 2947 if (DlgHostFont != NULL) {
1204     DeleteObject(DlgHostFont);
1205 maya 2943 }
1206    
1207 yutakakn 2728 return TRUE;
1208    
1209     case IDCANCEL:
1210     EndDialog(dlg, 0);
1211 maya 2943
1212 maya 2947 if (DlgHostFont != NULL) {
1213     DeleteObject(DlgHostFont);
1214 maya 2943 }
1215 maya 2994
1216 yutakakn 2728 return TRUE;
1217    
1218     case IDC_HOSTTCPIP:
1219     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1220     TRUE);
1221 maya 2980 #ifndef NO_INET6
1222 yutakakn 2728 enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1223     IDC_HOSTTCPPROTOCOL, TRUE);
1224 maya 2980 #endif /* NO_INET6 */
1225 yutakakn 2728 enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, FALSE);
1226    
1227 yutakakn 2734 enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, TRUE); // disabled (2004.11.23 yutaka)
1228 yutakakn 2728 if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1229     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE);
1230     } else {
1231     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1232     }
1233    
1234 yutakakn 2847 enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, TRUE); // disabled
1235    
1236 yutakakn 2728 return TRUE;
1237    
1238     case IDC_HOSTSERIAL:
1239     enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, TRUE);
1240     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1241     FALSE);
1242 maya 2980 #ifndef NO_INET6
1243 yutakakn 2728 enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1244     IDC_HOSTTCPPROTOCOL, FALSE);
1245 maya 2980 #endif /* NO_INET6 */
1246 yutakakn 2728 enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1247 yutakakn 2734 enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, FALSE); // disabled (2004.11.23 yutaka)
1248 yutakakn 2728
1249 yutakakn 2847 enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, FALSE); // disabled
1250    
1251 yutakakn 2728 return TRUE;
1252    
1253     case IDC_HOSTSSH:
1254     enable_dlg_items(dlg, IDC_SSH_VERSION,
1255     IDC_SSH_VERSION, TRUE);
1256     goto hostssh_enabled;
1257    
1258     case IDC_HOSTTELNET:
1259     case IDC_HOSTOTHER:
1260     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1261     hostssh_enabled:
1262    
1263     GetHNRec = (PGetHNRec) GetWindowLong(dlg, DWL_USER);
1264    
1265     if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
1266     if (GetHNRec != NULL)
1267     SetDlgItemInt(dlg, IDC_HOSTTCPPORT, GetHNRec->TelPort,
1268     FALSE);
1269     } else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1270     SetDlgItemInt(dlg, IDC_HOSTTCPPORT, 22, FALSE);
1271     }
1272     return TRUE;
1273    
1274     case IDC_HOSTHELP:
1275     PostMessage(GetParent(dlg), WM_USER_DLGHELP2, 0, 0);
1276     }
1277     }
1278     return FALSE;
1279     }
1280    
1281     static BOOL FAR PASCAL TTXGetHostName(HWND parent, PGetHNRec rec)
1282     {
1283     return (BOOL) DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_HOSTDLG),
1284     parent, TTXHostDlg, (LONG) rec);
1285     }
1286    
1287     static void PASCAL FAR TTXGetUIHooks(TTXUIHooks FAR * hooks)
1288     {
1289     GET_VAR();
1290    
1291     *hooks->GetHostName = TTXGetHostName;
1292     }
1293    
1294     static void FAR PASCAL TTXReadINIFile(PCHAR fileName, PTTSet ts)
1295     {
1296     GET_VAR();
1297    
1298     (pvar->ReadIniFile) (fileName, ts);
1299     read_ssh_options(pvar, fileName);
1300     pvar->settings = *pvar->ts_SSH;
1301     notify_verbose_message(pvar, "Reading INI file", LOG_LEVEL_VERBOSE);
1302     FWDUI_load_settings(pvar);
1303     }
1304    
1305     static void FAR PASCAL TTXWriteINIFile(PCHAR fileName, PTTSet ts)
1306     {
1307     GET_VAR();
1308    
1309     (pvar->WriteIniFile) (fileName, ts);
1310     *pvar->ts_SSH = pvar->settings;
1311     clear_local_settings(pvar);
1312     notify_verbose_message(pvar, "Writing INI file", LOG_LEVEL_VERBOSE);
1313 maya 2909 write_ssh_options(pvar, fileName, pvar->ts_SSH, TRUE);
1314 yutakakn 2728 }
1315    
1316     static void read_ssh_options_from_user_file(PTInstVar pvar,
1317     char FAR * user_file_name)
1318     {
1319     if (user_file_name[0] == '.') {
1320     read_ssh_options(pvar, user_file_name);
1321     } else {
1322     char buf[1024];
1323    
1324     get_teraterm_dir_relative_name(buf, sizeof(buf), user_file_name);
1325     read_ssh_options(pvar, buf);
1326     }
1327    
1328     pvar->settings = *pvar->ts_SSH;
1329     FWDUI_load_settings(pvar);
1330     }
1331    
1332 yutakakn 2784
1333     // @���u�����N���u�������B (2005.1.26 yutaka)
1334     static void replace_to_blank(char *src, char *dst, int dst_len)
1335     {
1336     int len, i;
1337    
1338     len = strlen(src);
1339     if (dst_len < len) // buffer overflow check
1340     return;
1341    
1342     for (i = 0 ; i < len ; i++) {
1343     if (src[i] == '@') { // @ ���o��������
1344     if (i < len - 1 && src[i + 1] == '@') { // �������� @ �����A�b�g�}�[�N���F������
1345     *dst++ = '@';
1346     i++;
1347     } else {
1348     *dst++ = ' '; // �������u��������
1349     }
1350     } else {
1351     *dst++ = src[i];
1352     }
1353     }
1354     *dst = '\0';
1355     }
1356    
1357 yutakakn 2728 /* returns 1 if the option text must be deleted */
1358     static int parse_option(PTInstVar pvar, char FAR * option)
1359     {
1360     if ((option[0] == '-' || option[0] == '/')) {
1361     if (MATCH_STR(option + 1, "ssh") == 0) {
1362     if (option[4] == 0) {
1363     pvar->settings.Enabled = 1;
1364     } else if (MATCH_STR(option + 4, "-L") == 0
1365     || MATCH_STR(option + 4, "-R") == 0
1366 yutakakn 2850 || _stricmp(option + 4, "-X") == 0) {
1367 yutakakn 2728 if (pvar->settings.DefaultForwarding[0] == 0) {
1368 maya 2992 strncpy_s(pvar->settings.DefaultForwarding,
1369     sizeof(pvar->settings.DefaultForwarding),
1370     option + 5, _TRUNCATE);
1371 yutakakn 2728 } else {
1372 maya 2992 strncat_s(pvar->settings.DefaultForwarding,
1373     sizeof(pvar->settings.DefaultForwarding),
1374     ";", _TRUNCATE);
1375     strncat_s(pvar->settings.DefaultForwarding,
1376     sizeof(pvar->settings.DefaultForwarding),
1377     option + 5, _TRUNCATE);
1378 yutakakn 2728 }
1379     } else if (MATCH_STR(option + 4, "-f=") == 0) {
1380 maya 2911 read_ssh_options_from_user_file(pvar, option + 7);
1381 yutakakn 2728 } else if (MATCH_STR(option + 4, "-v") == 0) {
1382     pvar->settings.LogLevel = LOG_LEVEL_VERBOSE;
1383 yutakakn 2850 } else if (_stricmp(option + 4, "-autologin") == 0
1384     || _stricmp(option + 4, "-autologon") == 0) {
1385 yutakakn 2728 pvar->settings.TryDefaultAuth = TRUE;
1386 yutakakn 2739
1387 yutakakn 2728 } else if (MATCH_STR(option + 4, "-consume=") == 0) {
1388 maya 2911 read_ssh_options_from_user_file(pvar, option + 13);
1389 yutakakn 2728 DeleteFile(option + 13);
1390 maya 2907
1391     // /ssh1 �� /ssh2 �I�v�V�������V�K���� (2006.9.16 maya)
1392     } else if (MATCH_STR(option + 4, "1") == 0) {
1393     pvar->settings.ssh_protocol_version = 1;
1394     } else if (MATCH_STR(option + 4, "2") == 0) {
1395     pvar->settings.ssh_protocol_version = 2;
1396    
1397 yutakakn 2728 } else {
1398     char buf[1024];
1399    
1400 maya 2994 UTIL_get_lang_msg("MSG_UNKNOWN_OPTION_ERROR", pvar,
1401     "Unrecognized command-line option: %s");
1402 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, option);
1403 yutakakn 2728
1404     MessageBox(NULL, buf, "TTSSH", MB_OK | MB_ICONEXCLAMATION);
1405     }
1406    
1407     return 1;
1408 maya 2915
1409     // ttermpro.exe �� /T= �w�������p�������A������������ (2006.10.19 maya)
1410     } else if (MATCH_STR_I(option + 1, "t=") == 0) {
1411 yutakakn 2728 if (strcmp(option + 3, "2") == 0) {
1412     pvar->settings.Enabled = 1;
1413     return 1;
1414     } else {
1415     pvar->settings.Enabled = 0;
1416     }
1417    
1418 maya 2915 // ttermpro.exe �� /F= �w������ TTSSH ������������ (2006.10.11 maya)
1419     } else if (MATCH_STR_I(option + 1, "f=") == 0) {
1420 maya 2913 read_ssh_options_from_user_file(pvar, option + 3);
1421    
1422 yutakakn 2728 // /1 ������ /2 �I�v�V�������V�K���� (2004.10.3 yutaka)
1423     } else if (MATCH_STR(option + 1, "1") == 0) {
1424     // command line: /ssh /1 is SSH1 only
1425     pvar->settings.ssh_protocol_version = 1;
1426    
1427     } else if (MATCH_STR(option + 1, "2") == 0) {
1428     // command line: /ssh /2 is SSH2 & SSH1
1429     pvar->settings.ssh_protocol_version = 2;
1430    
1431     } else if (MATCH_STR(option + 1, "nossh") == 0) {
1432     // '/nossh' �I�v�V�����������B
1433     // TERATERM.INI ��SSH���L�������������������A������Cygterm���N��������������
1434     // �����������������B(2004.10.11 yutaka)
1435     pvar->settings.Enabled = 0;
1436    
1437 maya 2907 } else if (MATCH_STR(option + 1, "telnet") == 0) {
1438     // '/telnet' ���w�������������������� '/nossh' ��������
1439     // SSH������������ (2006.9.16 maya)
1440     pvar->settings.Enabled = 0;
1441    
1442 yutakakn 2739 } else if (MATCH_STR(option + 1, "auth") == 0) {
1443 yutakakn 2784 // SSH2�������O�C���I�v�V����������
1444 yutakakn 2739 //
1445 yutakakn 2784 // SYNOPSIS: /ssh /auth=passowrd /user=���[�U�� /passwd=�p�X���[�h
1446     // /ssh /auth=publickey /user=���[�U�� /passwd=�p�X���[�h /keyfile=�p�X
1447     // EXAMPLE: /ssh /auth=password /user=nike /passwd=a@bc
1448     // /ssh /auth=publickey /user=foo /passwd=bar /keyfile=d:\tmp\id_rsa
1449     // NOTICE: �p�X���[�h���p�X�������������������A�u�����N���������� @ ���g�������B
1450 yutakakn 2739 //
1451 yutakakn 2784 // (2004.11.30 yutaka)
1452     // (2005.1.26 yutaka) ���������B���J���F���T�|�[�g�B
1453     //
1454 yutakakn 2739 pvar->ssh2_autologin = 1; // for SSH2 (2004.11.30 yutaka)
1455    
1456 yutakakn 2784 if (MATCH_STR(option + 5, "=password") == 0) { // �p�X���[�h/keyboard-interactive�F��
1457     //pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
1458     pvar->ssh2_authmethod = SSH_AUTH_PASSWORD;
1459 yutakakn 2739
1460 yutakakn 2784 } else if (MATCH_STR(option + 5, "=publickey") == 0) { // ���J���F��
1461     //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
1462     pvar->ssh2_authmethod = SSH_AUTH_RSA;
1463    
1464 yutakakn 2739 } else {
1465     // TODO:
1466    
1467     }
1468    
1469     } else if (MATCH_STR(option + 1, "user=") == 0) {
1470 yutakakn 2784 replace_to_blank(option + 6, pvar->ssh2_username, sizeof(pvar->ssh2_username));
1471     //_snprintf(pvar->ssh2_username, sizeof(pvar->ssh2_username), "%s", option + 6);
1472 yutakakn 2739
1473     } else if (MATCH_STR(option + 1, "passwd=") == 0) {
1474 yutakakn 2784 replace_to_blank(option + 8, pvar->ssh2_password, sizeof(pvar->ssh2_password));
1475     //_snprintf(pvar->ssh2_password, sizeof(pvar->ssh2_password), "%s", option + 8);
1476 yutakakn 2739
1477 yutakakn 2784 } else if (MATCH_STR(option + 1, "keyfile=") == 0) {
1478     replace_to_blank(option + 9, pvar->ssh2_keyfile, sizeof(pvar->ssh2_keyfile));
1479    
1480 maya 2908 } else if (MATCH_STR(option + 1, "ask4passwd") == 0) {
1481     // �p�X���[�h������ (2006.9.18 maya)
1482     pvar->ask4passwd = 1;
1483    
1484 yutakakn 2728 }
1485    
1486 maya 2908 // �p�X���[�h�������������������O�C��������������
1487     // /auth ���F�����\�b�h���w�������������p������ (2006.9.18 maya)
1488     if (pvar->ask4passwd == 1) {
1489     pvar->ssh2_autologin = 0;
1490     }
1491    
1492 yutakakn 2728 }
1493    
1494     return 0;
1495     }
1496    
1497     static void FAR PASCAL TTXParseParam(PCHAR param, PTTSet ts,
1498     PCHAR DDETopic)
1499     {
1500 maya 2911 // �X�y�[�X�������t�@�C�������F�������������C�� (2006.10.7 maya)
1501 yutakakn 2728 int i;
1502     BOOL inParam = FALSE;
1503     BOOL inQuotes = FALSE;
1504 maya 2911 BOOL inFileParam = FALSE;
1505 yutakakn 2728 PCHAR option = NULL;
1506     GET_VAR();
1507    
1508     if (pvar->hostdlg_activated) {
1509     pvar->settings.Enabled = pvar->hostdlg_Enabled;
1510     }
1511    
1512     for (i = 0; param[i] != 0; i++) {
1513 maya 2911 if (inQuotes ? param[i] == '"'
1514     : (param[i] == ' ' || param[i] == '\t')) {
1515 yutakakn 2728 if (option != NULL) {
1516     char ch = param[i];
1517 maya 2911 PCHAR Equal;
1518 yutakakn 2728
1519     param[i] = 0;
1520 maya 2911 Equal = strchr(option, '=');
1521     if (inFileParam && Equal != NULL && *(Equal + 1) == '"') {
1522 maya 2992 int buf_len = strlen(option) * sizeof(char);
1523 maya 2911 char *buf = (char *)calloc(strlen(option), sizeof(char));
1524 maya 2992 char c = option[Equal - option + 1];
1525     option[Equal - option + 1] = 0;
1526     strncat_s(buf, buf_len, option, _TRUNCATE);
1527     option[Equal - option + 1] = c;
1528     strncat_s(buf, buf_len, Equal + 2, _TRUNCATE);
1529 maya 2911 if (parse_option
1530     (pvar, *buf == '"' ? buf + 1 : buf)) {
1531     memset(option, ' ', i + 1 - (option - param));
1532     } else {
1533     param[i] = ch;
1534     }
1535     free(buf);
1536 yutakakn 2728 }
1537 maya 2911 else {
1538     if (parse_option
1539     (pvar, *option == '"' ? option + 1 : option)) {
1540     memset(option, ' ', i + 1 - (option - param));
1541     } else {
1542     param[i] = ch;
1543     }
1544     }
1545 yutakakn 2728 option = NULL;
1546     }
1547     inParam = FALSE;
1548     inQuotes = FALSE;
1549 maya 2911 inFileParam = FALSE;
1550 yutakakn 2728 } else if (!inParam) {
1551     if (param[i] == '"') {
1552     inQuotes = TRUE;
1553     inParam = TRUE;
1554     option = param + i;
1555     } else if (param[i] != ' ' && param[i] != '\t') {
1556     inParam = TRUE;
1557     option = param + i;
1558     }
1559 maya 2911 } else {
1560     if (option == NULL) {
1561     continue;
1562     }
1563     if ((option[0] == '-' || option[0] == '/') &&
1564     (MATCH_STR(option + 1, "ssh-f=") == 0 ||
1565     MATCH_STR(option + 1, "ssh-consume=") == 0 ||
1566 maya 2967 MATCH_STR_I(option + 1, "f=") == 0 ||
1567     MATCH_STR(option + 1, "keyfile=") == 0)) {
1568 maya 2911 if (param[i] == '"') {
1569     inQuotes = TRUE;
1570     }
1571     inFileParam = TRUE;
1572     }
1573 yutakakn 2728 }
1574     }
1575    
1576     if (option != NULL) {
1577 maya 2911 PCHAR Equal = strchr(option, '=');
1578     if (inFileParam && Equal != NULL && *(Equal + 1) == '"') {
1579 maya 2992 int buf_len = strlen(option) * sizeof(char);
1580 maya 2911 char *buf = (char *)calloc(strlen(option), sizeof(char));
1581 maya 2992 char c = option[Equal - option + 1];
1582     option[Equal - option + 1] = 0;
1583     strncat_s(buf, buf_len, option, _TRUNCATE);
1584     option[Equal - option + 1] = c;
1585     strncat_s(buf, buf_len, Equal + 2, _TRUNCATE);
1586 maya 2911 if (parse_option
1587     (pvar, *buf == '"' ? buf + 1 : buf)) {
1588     memset(option, ' ', i + 1 - (option - param));
1589     }
1590     free(buf);
1591 yutakakn 2728 }
1592 maya 2911 else {
1593     if (parse_option(pvar, option)) {
1594     memset(option, ' ', i - (option - param));
1595     }
1596     }
1597 yutakakn 2728 }
1598    
1599     FWDUI_load_settings(pvar);
1600    
1601     (pvar->ParseParam) (param, ts, DDETopic);
1602    
1603     }
1604    
1605     static void PASCAL FAR TTXGetSetupHooks(TTXSetupHooks FAR * hooks)
1606     {
1607     GET_VAR();
1608    
1609     pvar->ReadIniFile = *hooks->ReadIniFile;
1610     pvar->WriteIniFile = *hooks->WriteIniFile;
1611     pvar->ParseParam = *hooks->ParseParam;
1612    
1613     *hooks->ReadIniFile = TTXReadINIFile;
1614     *hooks->WriteIniFile = TTXWriteINIFile;
1615     *hooks->ParseParam = TTXParseParam;
1616     }
1617    
1618     static void PASCAL FAR TTXSetWinSize(int rows, int cols)
1619     {
1620     GET_VAR();
1621    
1622     SSH_notify_win_size(pvar, cols, rows);
1623     }
1624    
1625     static void insertMenuBeforeItem(HMENU menu, WORD beforeItemID, WORD flags,
1626     WORD newItemID, char FAR * text)
1627     {
1628     int i, j;
1629    
1630     for (i = GetMenuItemCount(menu) - 1; i >= 0; i--) {
1631     HMENU submenu = GetSubMenu(menu, i);
1632    
1633     for (j = GetMenuItemCount(submenu) - 1; j >= 0; j--) {
1634     if (GetMenuItemID(submenu, j) == beforeItemID) {
1635     InsertMenu(submenu, j, MF_BYPOSITION | flags, newItemID,
1636     text);
1637     return;
1638     }
1639     }
1640     }
1641     }
1642    
1643     static void PASCAL FAR TTXModifyMenu(HMENU menu)
1644     {
1645     GET_VAR();
1646    
1647     /* inserts before ID_HELP_ABOUT */
1648 maya 2994 UTIL_get_lang_msg("MENU_ABOUT", pvar, "About &TTSSH...");
1649 maya 2937 insertMenuBeforeItem(menu, 50990, MF_ENABLED, ID_ABOUTMENU, pvar->ts->UIMsg);
1650 yutakakn 2728
1651     /* inserts before ID_SETUP_TCPIP */
1652 maya 2994 UTIL_get_lang_msg("MENU_SSH", pvar, "SS&H...");
1653 maya 2937 insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHSETUPMENU, pvar->ts->UIMsg);
1654 yutakakn 2728 /* inserts before ID_SETUP_TCPIP */
1655 maya 2994 UTIL_get_lang_msg("MENU_SSH_AUTH", pvar, "SSH &Authentication...");
1656 maya 2937 insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHAUTHSETUPMENU, pvar->ts->UIMsg);
1657 yutakakn 2728 /* inserts before ID_SETUP_TCPIP */
1658 maya 2994 UTIL_get_lang_msg("MENU_SSH_FORWARD", pvar, "SSH F&orwarding...");
1659 maya 2937 insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHFWDSETUPMENU, pvar->ts->UIMsg);
1660 maya 2994 UTIL_get_lang_msg("MENU_SSH_KEYGEN", pvar, "SSH KeyGe&nerator...");
1661 maya 2937 insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHKEYGENMENU, pvar->ts->UIMsg);
1662 yutakakn 2728 }
1663    
1664     static void append_about_text(HWND dlg, char FAR * prefix, char FAR * msg)
1665     {
1666     SendDlgItemMessage(dlg, IDC_ABOUTTEXT, EM_REPLACESEL, 0,
1667     (LPARAM) prefix);
1668     SendDlgItemMessage(dlg, IDC_ABOUTTEXT, EM_REPLACESEL, 0, (LPARAM) msg);
1669     SendDlgItemMessage(dlg, IDC_ABOUTTEXT, EM_REPLACESEL, 0,
1670     (LPARAM) (char FAR *) "\r\n");
1671     }
1672    
1673 yutakakn 2792 // ���s�t�@�C�������o�[�W�������������� (2005.2.28 yutaka)
1674 yutakakn 2793 void get_file_version(char *exefile, int *major, int *minor, int *release, int *build)
1675 yutakakn 2792 {
1676     typedef struct {
1677     WORD wLanguage;
1678     WORD wCodePage;
1679     } LANGANDCODEPAGE, *LPLANGANDCODEPAGE;
1680     LPLANGANDCODEPAGE lplgcode;
1681     UINT unLen;
1682     DWORD size;
1683     char *buf = NULL;
1684     BOOL ret;
1685     int i;
1686     char fmt[80];
1687     char *pbuf;
1688    
1689     size = GetFileVersionInfoSize(exefile, NULL);
1690     if (size == 0) {
1691     goto error;
1692     }
1693     buf = malloc(size);
1694     ZeroMemory(buf, size);
1695    
1696     if (GetFileVersionInfo(exefile, 0, size, buf) == FALSE) {
1697     goto error;
1698     }
1699    
1700     ret = VerQueryValue(buf,
1701     "\\VarFileInfo\\Translation",
1702     (LPVOID *)&lplgcode, &unLen);
1703     if (ret == FALSE)
1704     goto error;
1705    
1706     for (i = 0 ; i < (int)(unLen / sizeof(LANGANDCODEPAGE)) ; i++) {
1707 maya 2992 _snprintf_s(fmt, sizeof(fmt), _TRUNCATE,
1708     "\\StringFileInfo\\%04x%04x\\FileVersion",
1709 yutakakn 2792 lplgcode[i].wLanguage, lplgcode[i].wCodePage);
1710     VerQueryValue(buf, fmt, &pbuf, &unLen);
1711     if (unLen > 0) { // get success
1712     int n, a, b, c, d;
1713    
1714     n = sscanf(pbuf, "%d, %d, %d, %d", &a, &b, &c, &d);
1715     if (n == 4) { // convert success
1716     *major = a;
1717     *minor = b;
1718     *release = c;
1719     *build = d;
1720     break;
1721     }
1722     }
1723     }
1724    
1725     free(buf);
1726     return;
1727    
1728     error:
1729     free(buf);
1730     *major = *minor = *release = *build = 0;
1731     }
1732    
1733 yutakakn 2728 static void init_about_dlg(PTInstVar pvar, HWND dlg)
1734     {
1735     char buf[1024];
1736 yutakakn 2792 int a, b, c, d;
1737 maya 2994 char uimsg[MAX_UIMSG];
1738    
1739     GetWindowText(dlg, uimsg, sizeof(uimsg));
1740     UTIL_get_lang_msg("DLG_ABOUT_TITLE", pvar, uimsg);
1741 maya 2937 SetWindowText(dlg, pvar->ts->UIMsg);
1742 maya 2994 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1743     UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1744 maya 2937 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1745    
1746 yutakakn 2792 // TTSSH���o�[�W�������������� (2005.2.28 yutaka)
1747     get_file_version("ttxssh.dll", &a, &b, &c, &d);
1748 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
1749     "TTSSH\r\nTeraterm Secure Shell extension, %d.%d", a, b);
1750 yutakakn 2792 SendMessage(GetDlgItem(dlg, IDC_TTSSH_VERSION), WM_SETTEXT, 0, (LPARAM)buf);
1751    
1752 yutakakn 2782 // OpenSSL���o�[�W�������������� (2005.1.24 yutaka)
1753 yutakakn 2820 // ���������� (2005.5.11 yutaka)
1754     #ifdef OPENSSL_VERSION_TEXT
1755 yutakakn 2782 SendMessage(GetDlgItem(dlg, IDC_OPENSSL_VERSION), WM_SETTEXT, 0, (LPARAM)OPENSSL_VERSION_TEXT);
1756 yutakakn 2820 #else
1757     SendMessage(GetDlgItem(dlg, IDC_OPENSSL_VERSION), WM_SETTEXT, 0, (LPARAM)"Unknown");
1758     #endif
1759 yutakakn 2782
1760 yutakakn 2820 // zlib���o�[�W�������������� (2005.5.11 yutaka)
1761     #ifdef ZLIB_VERSION
1762 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE, "ZLib %s", ZLIB_VERSION);
1763 yutakakn 2820 #else
1764 yutakakn 2823 _snprintf(buf, sizeof(buf), "ZLib Unknown");
1765 yutakakn 2820 #endif
1766     SendMessage(GetDlgItem(dlg, IDC_ZLIB_VERSION), WM_SETTEXT, 0, (LPARAM)buf);
1767    
1768    
1769 yutakakn 2728 // TTSSH�_�C�A���O���\������SSH������������ (2004.10.30 yutaka)
1770     if (pvar->socket != INVALID_SOCKET) {
1771     if (SSHv1(pvar)) {
1772     SSH_get_server_ID_info(pvar, buf, sizeof(buf));
1773 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_SERVERID", pvar, "Server ID: ");
1774 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1775 yutakakn 2728 SSH_get_protocol_version_info(pvar, buf, sizeof(buf));
1776 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol: ");
1777 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1778 yutakakn 2728 CRYPT_get_cipher_info(pvar, buf, sizeof(buf));
1779 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_ENCRYPTION", pvar, "Encryption: ");
1780 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1781 yutakakn 2728 CRYPT_get_server_key_info(pvar, buf, sizeof(buf));
1782 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_SERVERKEY", pvar, "Server keys: ");
1783 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1784 yutakakn 2728 AUTH_get_auth_info(pvar, buf, sizeof(buf));
1785 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_AUTH", pvar, "Authentication: ");
1786 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1787 yutakakn 2728 SSH_get_compression_info(pvar, buf, sizeof(buf));
1788 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_COMP", pvar, "Compression: ");
1789 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1790 yutakakn 2728
1791     } else { // SSH2
1792     SSH_get_server_ID_info(pvar, buf, sizeof(buf));
1793 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_SERVERID", pvar, "Server ID: ");
1794 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1795 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_CLIENTID", pvar, "Client ID: ");
1796 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, pvar->client_version_string);
1797 yutakakn 2728
1798     SSH_get_protocol_version_info(pvar, buf, sizeof(buf));
1799 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol: ");
1800 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1801 yutakakn 2728
1802     if (pvar->kex_type == KEX_DH_GRP1_SHA1) {
1803 maya 2992 strncpy_s(buf, sizeof(buf), KEX_DH1, _TRUNCATE);
1804 yutakakn 2728 } else if (pvar->kex_type == KEX_DH_GRP14_SHA1) {
1805 maya 2992 strncpy_s(buf, sizeof(buf), KEX_DH14, _TRUNCATE);
1806 yutakakn 2728 } else {
1807 maya 2992 strncpy_s(buf, sizeof(buf), KEX_DHGEX, _TRUNCATE);
1808 yutakakn 2728 }
1809     append_about_text(dlg, "KEX: ", buf);
1810    
1811     if (pvar->hostkey_type == KEY_DSA) {
1812 maya 2992 strncpy_s(buf, sizeof(buf), "ssh-dss", _TRUNCATE);
1813 yutakakn 2728 } else {
1814 maya 2992 strncpy_s(buf, sizeof(buf), "ssh-rsa", _TRUNCATE);
1815 yutakakn 2728 }
1816 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_HOSTKEY", pvar, "Host Key: ");
1817 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1818 yutakakn 2728
1819 yutakakn 2758 // add HMAC algorithm (2004.12.17 yutaka)
1820     buf[0] = '\0';
1821     if (pvar->ctos_hmac == HMAC_SHA1) {
1822 maya 2992 strncat_s(buf, sizeof(buf), "hmac-sha1", _TRUNCATE);
1823 yutakakn 2758 } else if (pvar->ctos_hmac == HMAC_MD5) {
1824 maya 2992 strncat_s(buf, sizeof(buf), "hmac-md5", _TRUNCATE);
1825 yutakakn 2758 }
1826 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_TOSERVER", pvar, " to server, ");
1827 maya 2992 strncat_s(buf, sizeof(buf), pvar->ts->UIMsg, _TRUNCATE);
1828 yutakakn 2758 if (pvar->stoc_hmac == HMAC_SHA1) {
1829 maya 2992 strncat_s(buf, sizeof(buf), "hmac-sha1", _TRUNCATE);
1830 yutakakn 2758 } else if (pvar->stoc_hmac == HMAC_MD5) {
1831 maya 2992 strncat_s(buf, sizeof(buf), "hmac-md5", _TRUNCATE);
1832 yutakakn 2758 }
1833 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_FROMSERVER", pvar, " from server");
1834 maya 2992 strncat_s(buf, sizeof(buf), pvar->ts->UIMsg, _TRUNCATE);
1835 yutakakn 2758 append_about_text(dlg, "HMAC: ", buf);
1836    
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 maya 2994
1844 yutakakn 2728 AUTH_get_auth_info(pvar, buf, sizeof(buf));
1845 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_AUTH", pvar, "Authentication: ");
1846 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1847 yutakakn 2873
1848 yutakakn 2728 SSH_get_compression_info(pvar, buf, sizeof(buf));
1849 yutakakn 2873 if (pvar->ctos_compression == COMP_DELAYED) { // �x���p�P�b�g���k������ (2006.6.23 yutaka)
1850 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_COMPDELAY", pvar, "Delayed Compression: ");
1851 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1852 yutakakn 2873 } else {
1853 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_COMP", pvar, "Compression: ");
1854 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1855 yutakakn 2873 }
1856 yutakakn 2728 }
1857     }
1858     }
1859    
1860     static BOOL CALLBACK TTXAboutDlg(HWND dlg, UINT msg, WPARAM wParam,
1861     LPARAM lParam)
1862     {
1863 maya 2937 LOGFONT logfont;
1864     HFONT font;
1865 maya 2994
1866 yutakakn 2728 switch (msg) {
1867     case WM_INITDIALOG:
1868 maya 2937 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1869     GetObject(font, sizeof(LOGFONT), &logfont);
1870 maya 2946 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAboutFont, pvar)) {
1871 maya 2937 SendDlgItemMessage(dlg, IDC_TTSSH_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1872     SendDlgItemMessage(dlg, IDC_SSHVERSIONS, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1873     SendDlgItemMessage(dlg, IDC_INCLUDES, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1874     SendDlgItemMessage(dlg, IDC_OPENSSL_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1875     SendDlgItemMessage(dlg, IDC_ZLIB_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1876     SendDlgItemMessage(dlg, IDC_WEBSITES, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1877     SendDlgItemMessage(dlg, IDC_CRYPTOGRAPHY, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1878     SendDlgItemMessage(dlg, IDC_CREDIT, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1879     SendDlgItemMessage(dlg, IDC_ABOUTTEXT, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1880     SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1881     }
1882     else {
1883     DlgAboutFont = NULL;
1884     }
1885 yutakakn 2728 init_about_dlg((PTInstVar) lParam, dlg);
1886     return TRUE;
1887     case WM_COMMAND:
1888     switch (LOWORD(wParam)) {
1889     case IDOK:
1890     EndDialog(dlg, 1);
1891 maya 2937 if (DlgAboutFont != NULL) {
1892     DeleteObject(DlgAboutFont);
1893     }
1894 yutakakn 2728 return TRUE;
1895     case IDCANCEL: /* there isn't a cancel button, but other Windows
1896     UI things can send this message */
1897     EndDialog(dlg, 0);
1898 maya 2937 if (DlgAboutFont != NULL) {
1899     DeleteObject(DlgAboutFont);
1900     }
1901 yutakakn 2728 return TRUE;
1902     }
1903     break;
1904     }
1905    
1906     return FALSE;
1907     }
1908    
1909     static char FAR *get_cipher_name(int cipher)
1910     {
1911     switch (cipher) {
1912     case SSH_CIPHER_NONE:
1913 maya 2994 UTIL_get_lang_msg("DLG_SSHSETUP_CIPHER_BORDER", pvar,
1914     "<ciphers below this line are disabled>");
1915 maya 2937 return pvar->ts->UIMsg;
1916 yutakakn 2728 case SSH_CIPHER_RC4:
1917     return "RC4";
1918     case SSH_CIPHER_3DES:
1919     return "3DES";
1920     case SSH_CIPHER_DES:
1921     return "DES";
1922     case SSH_CIPHER_IDEA:
1923     return "IDEA";
1924     case SSH_CIPHER_TSS:
1925     return "TSS";
1926     case SSH_CIPHER_BLOWFISH:
1927     return "Blowfish";
1928    
1929     // for SSH2(yutaka)
1930     case SSH_CIPHER_AES128:
1931     return "AES128(SSH2)";
1932     case SSH_CIPHER_3DES_CBC:
1933     return "3DES-CBC(SSH2)";
1934    
1935     default:
1936     return NULL;
1937     }
1938     }
1939    
1940     static void set_move_button_status(HWND dlg)
1941     {
1942     HWND cipherControl = GetDlgItem(dlg, IDC_SSHCIPHERPREFS);
1943     int curPos = (int) SendMessage(cipherControl, LB_GETCURSEL, 0, 0);
1944     int maxPos = (int) SendMessage(cipherControl, LB_GETCOUNT, 0, 0) - 1;
1945    
1946     EnableWindow(GetDlgItem(dlg, IDC_SSHMOVECIPHERUP), curPos > 0
1947     && curPos <= maxPos);
1948     EnableWindow(GetDlgItem(dlg, IDC_SSHMOVECIPHERDOWN), curPos >= 0
1949     && curPos < maxPos);
1950     }
1951    
1952     static void init_setup_dlg(PTInstVar pvar, HWND dlg)
1953     {
1954     HWND compressionControl = GetDlgItem(dlg, IDC_SSHCOMPRESSIONLEVEL);
1955     HWND cipherControl = GetDlgItem(dlg, IDC_SSHCIPHERPREFS);
1956     int i;
1957     int ch;
1958 maya 2994 char uimsg[MAX_UIMSG];
1959 maya 2937
1960 maya 2994 GetWindowText(dlg, uimsg, sizeof(uimsg));
1961     UTIL_get_lang_msg("DLG_SSHSETUP_TITLE", pvar, uimsg);
1962 maya 2937 SetWindowText(dlg, pvar->ts->UIMsg);
1963 maya 2994 GetDlgItemText(dlg, IDC_COMPRESSLABEL, uimsg, sizeof(uimsg));
1964     UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS", pvar, uimsg);
1965 maya 2937 SetDlgItemText(dlg, IDC_COMPRESSLABEL, pvar->ts->UIMsg);
1966 maya 2994 GetDlgItemText(dlg, IDC_COMPRESSNONE, uimsg, sizeof(uimsg));
1967     UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS_NONE", pvar, uimsg);
1968 maya 2937 SetDlgItemText(dlg, IDC_COMPRESSNONE, pvar->ts->UIMsg);
1969 maya 2994 GetDlgItemText(dlg, IDC_COMPRESSHIGH, uimsg, sizeof(uimsg));
1970     UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS_HIGHEST", pvar, uimsg);
1971 maya 2937 SetDlgItemText(dlg, IDC_COMPRESSHIGH, pvar->ts->UIMsg);
1972 maya 2994 GetDlgItemText(dlg, IDC_CIPHERORDER, uimsg, sizeof(uimsg));
1973     UTIL_get_lang_msg("DLG_SSHSETUP_CHIPER", pvar, uimsg);
1974 maya 2937 SetDlgItemText(dlg, IDC_CIPHERORDER, pvar->ts->UIMsg);
1975 maya 2994 GetDlgItemText(dlg, IDC_SSHMOVECIPHERUP, uimsg, sizeof(uimsg));
1976     UTIL_get_lang_msg("DLG_SSHSETUP_CHIPER_UP", pvar, uimsg);
1977 maya 2937 SetDlgItemText(dlg, IDC_SSHMOVECIPHERUP, pvar->ts->UIMsg);
1978 maya 2994 GetDlgItemText(dlg, IDC_SSHMOVECIPHERDOWN, uimsg, sizeof(uimsg));
1979     UTIL_get_lang_msg("DLG_SSHSETUP_CHIPER_DOWN", pvar, uimsg);
1980 maya 2937 SetDlgItemText(dlg, IDC_SSHMOVECIPHERDOWN, pvar->ts->UIMsg);
1981 maya 2994 GetDlgItemText(dlg, IDC_KNOWNHOSTS, uimsg, sizeof(uimsg));
1982     UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST", pvar, uimsg);
1983 maya 2937 SetDlgItemText(dlg, IDC_KNOWNHOSTS, pvar->ts->UIMsg);
1984 maya 2994 GetDlgItemText(dlg, IDC_CHOOSEREADWRITEFILE, uimsg, sizeof(uimsg));
1985     UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST_RW", pvar, uimsg);
1986 maya 2937 SetDlgItemText(dlg, IDC_CHOOSEREADWRITEFILE, pvar->ts->UIMsg);
1987 maya 2994 GetDlgItemText(dlg, IDC_CHOOSEREADONLYFILE, uimsg, sizeof(uimsg));
1988     UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST_RO", pvar, uimsg);
1989 maya 2937 SetDlgItemText(dlg, IDC_CHOOSEREADONLYFILE, pvar->ts->UIMsg);
1990 maya 2994 GetDlgItemText(dlg, IDC_HEARTBEATLABEL, uimsg, sizeof(uimsg));
1991     UTIL_get_lang_msg("DLG_SSHSETUP_HEARTBEAT", pvar, uimsg);
1992 maya 2937 SetDlgItemText(dlg, IDC_HEARTBEATLABEL, pvar->ts->UIMsg);
1993 maya 2994 GetDlgItemText(dlg, IDC_HEARTBEATLABEL2, uimsg, sizeof(uimsg));
1994     UTIL_get_lang_msg("DLG_SSHSETUP_HEARTBEAT_UNIT", pvar, uimsg);
1995 maya 2937 SetDlgItemText(dlg, IDC_HEARTBEATLABEL2, pvar->ts->UIMsg);
1996 maya 2994 GetDlgItemText(dlg, IDC_NOTICEBANNER, uimsg, sizeof(uimsg));
1997     UTIL_get_lang_msg("DLG_SSHSETUP_NOTICE", pvar, uimsg);
1998 maya 2937 SetDlgItemText(dlg, IDC_NOTICEBANNER, pvar->ts->UIMsg);
1999 maya 2992 strncpy_s(pvar->ts->UIMsg, sizeof(pvar->ts->UIMsg), "OK", _TRUNCATE);
2000 maya 2994 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
2001 maya 2937 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
2002 maya 2992 strncpy_s(pvar->ts->UIMsg, sizeof(pvar->ts->UIMsg), "Cancel", _TRUNCATE);
2003 maya 2994 UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
2004 maya 2937 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
2005    
2006 yutakakn 2728 SendMessage(compressionControl, TBM_SETRANGE, TRUE, MAKELONG(0, 9));
2007     SendMessage(compressionControl, TBM_SETPOS, TRUE,
2008     pvar->settings.CompressionLevel);
2009    
2010     normalize_cipher_order(pvar->settings.CipherOrder);
2011    
2012     for (i = 0; pvar->settings.CipherOrder[i] != 0; i++) {
2013     int cipher = pvar->settings.CipherOrder[i] - '0';
2014     char FAR *name = get_cipher_name(cipher);
2015    
2016     if (name != NULL) {
2017     SendMessage(cipherControl, LB_ADDSTRING, 0, (LPARAM) name);
2018     }
2019     }
2020    
2021     SendMessage(cipherControl, LB_SETCURSEL, 0, 0);
2022     set_move_button_status(dlg);
2023    
2024     for (i = 0; (ch = pvar->settings.KnownHostsFiles[i]) != 0 && ch != ';';
2025     i++) {
2026     }
2027     if (ch != 0) {
2028     pvar->settings.KnownHostsFiles[i] = 0;
2029     SetDlgItemText(dlg, IDC_READWRITEFILENAME,
2030     pvar->settings.KnownHostsFiles);
2031     pvar->settings.KnownHostsFiles[i] = ch;
2032     SetDlgItemText(dlg, IDC_READONLYFILENAME,
2033     pvar->settings.KnownHostsFiles + i + 1);
2034     } else {
2035     SetDlgItemText(dlg, IDC_READWRITEFILENAME,
2036     pvar->settings.KnownHostsFiles);
2037     }
2038 yutakakn 2789
2039     // SSH2 HeartBeat(keep-alive)������ (2005.2.22 yutaka)
2040     {
2041     char buf[10];
2042 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
2043     "%d", pvar->settings.ssh_heartbeat_overtime);
2044 yutakakn 2789 SetDlgItemText(dlg, IDC_HEARTBEAT_EDIT, buf);
2045     }
2046    
2047 yutakakn 2728 }
2048    
2049     void get_teraterm_dir_relative_name(char FAR * buf, int bufsize,
2050     char FAR * basename)
2051     {
2052     int filename_start = 0;
2053     int i;
2054     int ch;
2055    
2056     if (basename[0] == '\\' || basename[0] == '/'
2057     || (basename[0] != 0 && basename[1] == ':')) {
2058 maya 2992 strncpy_s(buf, bufsize, basename, _TRUNCATE);
2059 yutakakn 2728 return;
2060     }
2061    
2062     GetModuleFileName(NULL, buf, bufsize);
2063     for (i = 0; (ch = buf[i]) != 0; i++) {
2064     if (ch == '\\' || ch == '/' || ch == ':') {
2065     filename_start = i + 1;
2066     }
2067     }
2068    
2069     if (bufsize > filename_start) {
2070 maya 2992 strncpy_s(buf + filename_start, bufsize - filename_start, basename, _TRUNCATE);
2071 yutakakn 2728 }
2072     }
2073    
2074     int copy_teraterm_dir_relative_path(char FAR * dest, int destsize,
2075     char FAR * basename)
2076     {
2077     char buf[1024];
2078     int filename_start = 0;
2079     int i;
2080     int ch, ch2;
2081    
2082     if (basename[0] != '\\' && basename[0] != '/'
2083     && (basename[0] == 0 || basename[1] != ':')) {
2084 maya 2992 strncpy_s(dest, destsize, basename, _TRUNCATE);
2085 yutakakn 2728 return strlen(dest);
2086     }
2087    
2088     GetModuleFileName(NULL, buf, sizeof(buf));
2089     for (i = 0; (ch = buf[i]) != 0; i++) {
2090     if (ch == '\\' || ch == '/' || ch == ':') {
2091     filename_start = i + 1;
2092     }
2093     }
2094    
2095     for (i = 0; i < filename_start; i++) {
2096     ch = toupper(buf[i]);
2097     ch2 = toupper(basename[i]);
2098    
2099     if (ch == ch2
2100     || ((ch == '\\' || ch == '/')
2101     && (ch2 == '\\' || ch2 == '/'))) {
2102     } else {
2103     break;
2104     }
2105     }
2106    
2107     if (i == filename_start) {
2108 maya 2992 strncpy_s(dest, destsize, basename + i, _TRUNCATE);
2109 yutakakn 2728 } else {
2110 maya 2992 strncpy_s(dest, destsize, basename, _TRUNCATE);
2111 yutakakn 2728 }
2112     return strlen(dest);
2113     }
2114    
2115     static void complete_setup_dlg(PTInstVar pvar, HWND dlg)
2116     {
2117     char buf[4096];
2118     char buf2[1024];
2119     HWND compressionControl = GetDlgItem(dlg, IDC_SSHCOMPRESSIONLEVEL);
2120     HWND cipherControl = GetDlgItem(dlg, IDC_SSHCIPHERPREFS);
2121     int i, j, buf2index, bufindex;
2122     int count = (int) SendMessage(cipherControl, LB_GETCOUNT, 0, 0);
2123    
2124     pvar->settings.CompressionLevel =
2125     (int) SendMessage(compressionControl, TBM_GETPOS, 0, 0);
2126    
2127     buf2index = 0;
2128     for (i = 0; i < count; i++) {
2129     int len = SendMessage(cipherControl, LB_GETTEXTLEN, i, 0);
2130    
2131     if (len > 0 && len < sizeof(buf)) { /* should always be true */
2132     buf[0] = 0;
2133     SendMessage(cipherControl, LB_GETTEXT, i, (LPARAM) buf);
2134     for (j = 0;
2135     j <= SSH_CIPHER_MAX
2136     && strcmp(buf, get_cipher_name(j)) != 0; j++) {
2137     }
2138     if (j <= SSH_CIPHER_MAX) {
2139     buf2[buf2index] = '0' + j;
2140     buf2index++;
2141     }
2142     }
2143     }
2144     buf2[buf2index] = 0;
2145     normalize_cipher_order(buf2);
2146 maya 2992 strncpy_s(pvar->settings.CipherOrder, sizeof(pvar->settings.CipherOrder), buf2, _TRUNCATE);
2147 yutakakn 2728
2148     buf[0] = 0;
2149     GetDlgItemText(dlg, IDC_READWRITEFILENAME, buf, sizeof(buf));
2150     j = copy_teraterm_dir_relative_path(pvar->settings.KnownHostsFiles,
2151     sizeof(pvar->settings.
2152     KnownHostsFiles), buf);
2153     buf[0] = 0;
2154     bufindex = 0;
2155     GetDlgItemText(dlg, IDC_READONLYFILENAME, buf, sizeof(buf));
2156     for (i = 0; buf[i] != 0; i++) {
2157     if (buf[i] == ';') {
2158     buf[i] = 0;
2159     if (j < sizeof(pvar->settings.KnownHostsFiles) - 1) {
2160     pvar->settings.KnownHostsFiles[j] = ';';
2161     j++;
2162     j += copy_teraterm_dir_relative_path(pvar->settings.
2163     KnownHostsFiles + j,
2164     sizeof(pvar->settings.
2165     KnownHostsFiles)
2166     - j, buf + bufindex);
2167     }
2168     bufindex = i + 1;
2169     }
2170     }
2171     if (bufindex < i && j < sizeof(pvar->settings.KnownHostsFiles) - 1) {
2172     pvar->settings.KnownHostsFiles[j] = ';';
2173     j++;
2174     copy_teraterm_dir_relative_path(pvar->settings.KnownHostsFiles + j,
2175     sizeof(pvar->settings.
2176     KnownHostsFiles) - j,
2177     buf + bufindex);
2178     }
2179 yutakakn 2789
2180     // get SSH HeartBeat(keep-alive)
2181     SendMessage(GetDlgItem(dlg, IDC_HEARTBEAT_EDIT), WM_GETTEXT, sizeof(buf), (LPARAM)buf);
2182     i = atoi(buf);
2183     if (i < 0)
2184     i = 60;
2185     pvar->settings.ssh_heartbeat_overtime = i;
2186    
2187 yutakakn 2728 }
2188    
2189     static void move_cur_sel_delta(HWND listbox, int delta)
2190     {
2191     int curPos = (int) SendMessage(listbox, LB_GETCURSEL, 0, 0);
2192     int maxPos = (int) SendMessage(listbox, LB_GETCOUNT, 0, 0) - 1;
2193     int newPos = curPos + delta;
2194     char buf[1024];