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 3002 - (hide annotations) (download) (as text)
Mon Aug 20 13:59:45 2007 UTC (16 years, 7 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 104834 byte(s)
ボタンの文字列がおかしくなるバグを修正した。

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