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 3007 - (hide annotations) (download) (as text)
Sun Sep 2 05:20:58 2007 UTC (16 years, 7 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 107427 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 maya 3003 (LPARAM) pvar->OldLargeIcon);
147 yutakakn 2728 pvar->OldLargeIcon = NULL;
148     }
149     if (pvar->OldSmallIcon != NULL) {
150     PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_SMALL,
151 maya 3003 (LPARAM) pvar->OldSmallIcon);
152 yutakakn 2728 pvar->OldSmallIcon = NULL;
153     }
154 yutakakn 2766
155     ssh_heartbeat_lock_finalize();
156 yutakakn 2728 }
157    
158     static void PASCAL FAR TTXInit(PTTSet ts, PComVar cv)
159     {
160     pvar->settings = *pvar->ts_SSH;
161     pvar->ts = ts;
162     pvar->cv = cv;
163     pvar->fatal_error = FALSE;
164     pvar->showing_err = FALSE;
165     pvar->err_msg = NULL;
166    
167     init_TTSSH(pvar);
168     }
169    
170     static void normalize_cipher_order(char FAR * buf)
171     {
172     char ciphers_listed[SSH_CIPHER_MAX + 1];
173     char ciphers_allowed[SSH_CIPHER_MAX + 1];
174     int i, j;
175    
176     /* SSH_CIPHER_NONE means that all ciphers below that one are disabled.
177     We *never* allow no encryption. */
178     #if 0
179     static char default_ciphers[] = {
180     SSH_CIPHER_3DES,
181     SSH_CIPHER_NONE,
182     SSH_CIPHER_DES, SSH_CIPHER_BLOWFISH
183     };
184     #else
185     // for SSH2(yutaka)
186     static char default_ciphers[] = {
187     SSH_CIPHER_AES128,
188     SSH_CIPHER_3DES_CBC,
189     SSH_CIPHER_3DES,
190     SSH_CIPHER_NONE,
191     SSH_CIPHER_DES, SSH_CIPHER_BLOWFISH
192     };
193     #endif
194    
195     memset(ciphers_listed, 0, sizeof(ciphers_listed));
196    
197     memset(ciphers_allowed, 0, sizeof(ciphers_allowed));
198     for (i = 0; i < NUM_ELEM(default_ciphers); i++) {
199     ciphers_allowed[default_ciphers[i]] = 1;
200     }
201    
202     for (i = 0; buf[i] != 0; i++) {
203     int cipher_num = buf[i] - '0';
204    
205     if (cipher_num < 0 || cipher_num > SSH_CIPHER_MAX
206     || !ciphers_allowed[cipher_num]
207     || ciphers_listed[cipher_num]) {
208     memmove(buf + i, buf + i + 1, strlen(buf + i + 1) + 1);
209     i--;
210     } else {
211     ciphers_listed[cipher_num] = 1;
212     }
213     }
214    
215     for (j = 0; j < NUM_ELEM(default_ciphers); j++) {
216     int cipher_num = default_ciphers[j];
217    
218     if (!ciphers_listed[cipher_num]) {
219     buf[i] = cipher_num + '0';
220     i++;
221     }
222     }
223    
224     buf[i] = 0;
225     }
226    
227     /* Remove local settings from the shared memory block. */
228     static void clear_local_settings(PTInstVar pvar)
229     {
230     pvar->ts_SSH->TryDefaultAuth = FALSE;
231     }
232    
233     static BOOL read_BOOL_option(PCHAR fileName, char FAR * keyName, BOOL def)
234     {
235     char buf[1024];
236    
237     buf[0] = 0;
238     GetPrivateProfileString("TTSSH", keyName, "", buf, sizeof(buf),
239 maya 3003 fileName);
240 yutakakn 2728 if (buf[0] == 0) {
241     return def;
242     } else {
243     return atoi(buf) != 0 ||
244 maya 3003 _stricmp(buf, "yes") == 0 ||
245     _stricmp(buf, "y") == 0;
246 yutakakn 2728 }
247     }
248    
249     static void read_string_option(PCHAR fileName, char FAR * keyName,
250 maya 3003 char FAR * def, char FAR * buf, int bufSize)
251 yutakakn 2728 {
252    
253     buf[0] = 0;
254     GetPrivateProfileString("TTSSH", keyName, def, buf, bufSize, fileName);
255     }
256    
257     static void read_ssh_options(PTInstVar pvar, PCHAR fileName)
258     {
259     char buf[1024];
260     TS_SSH FAR *settings = pvar->ts_SSH;
261    
262     #define READ_STD_STRING_OPTION(name) \
263 maya 3003 read_string_option(fileName, #name, "", settings->name, sizeof(settings->name))
264 yutakakn 2728
265     settings->Enabled = read_BOOL_option(fileName, "Enabled", FALSE);
266    
267     buf[0] = 0;
268     GetPrivateProfileString("TTSSH", "Compression", "", buf, sizeof(buf),
269 maya 3003 fileName);
270 yutakakn 2728 settings->CompressionLevel = atoi(buf);
271     if (settings->CompressionLevel < 0 || settings->CompressionLevel > 9) {
272     settings->CompressionLevel = 0;
273     }
274    
275     READ_STD_STRING_OPTION(DefaultUserName);
276     READ_STD_STRING_OPTION(DefaultForwarding);
277     READ_STD_STRING_OPTION(DefaultRhostsLocalUserName);
278     READ_STD_STRING_OPTION(DefaultRhostsHostPrivateKeyFile);
279     READ_STD_STRING_OPTION(DefaultRSAPrivateKeyFile);
280    
281     READ_STD_STRING_OPTION(CipherOrder);
282     normalize_cipher_order(settings->CipherOrder);
283    
284     read_string_option(fileName, "KnownHostsFiles", "ssh_known_hosts",
285 maya 3003 settings->KnownHostsFiles,
286     sizeof(settings->KnownHostsFiles));
287 yutakakn 2728
288     buf[0] = 0;
289     GetPrivateProfileString("TTSSH", "DefaultAuthMethod", "", buf,
290 maya 3003 sizeof(buf), fileName);
291 yutakakn 2728 settings->DefaultAuthMethod = atoi(buf);
292     if (settings->DefaultAuthMethod != SSH_AUTH_PASSWORD
293 maya 3003 && settings->DefaultAuthMethod != SSH_AUTH_RSA
294     && settings->DefaultAuthMethod != SSH_AUTH_TIS // add (2005.3.12 yutaka)
295     && settings->DefaultAuthMethod != SSH_AUTH_RHOSTS) {
296 yutakakn 2728 /* this default can never be SSH_AUTH_RHOSTS_RSA because that is not a
297     selection in the dialog box; SSH_AUTH_RHOSTS_RSA is automatically chosen
298     when the dialog box has rhosts selected and an host private key file
299     is supplied. */
300     settings->DefaultAuthMethod = SSH_AUTH_PASSWORD;
301     }
302    
303     buf[0] = 0;
304     GetPrivateProfileString("TTSSH", "LogLevel", "", buf, sizeof(buf),
305 maya 3003 fileName);
306 yutakakn 2728 settings->LogLevel = atoi(buf);
307    
308     buf[0] = 0;
309     GetPrivateProfileString("TTSSH", "WriteBufferSize", "", buf,
310 maya 3003 sizeof(buf), fileName);
311 yutakakn 2728 settings->WriteBufferSize = atoi(buf);
312     if (settings->WriteBufferSize <= 0) {
313     settings->WriteBufferSize = 2 * 1024 * 1024;
314     }
315    
316     settings->LocalForwardingIdentityCheck =
317     read_BOOL_option(fileName, "LocalForwardingIdentityCheck", TRUE);
318    
319     // SSH protocol version (2004.10.11 yutaka)
320 yutakakn 2738 // default is SSH2 (2004.11.30 yutaka)
321     settings->ssh_protocol_version = GetPrivateProfileInt("TTSSH", "ProtocolVersion", 2, fileName);
322 yutakakn 2728
323 yutakakn 2748 // SSH heartbeat time(second) (2004.12.11 yutaka)
324     settings->ssh_heartbeat_overtime = GetPrivateProfileInt("TTSSH", "HeartBeat", 60, fileName);
325    
326 yutakakn 2782 // SSH2 keyboard-interactive (2005.1.23 yutaka)
327 yutakakn 2799 // �f�t�H���g���������������BOpenSSH 4.0����keyboard-interactive���\�b�h�����`�������������������A
328     // ���Y���\�b�h���g�����R�l�N�V���������������������B(2005.3.12 yutaka)
329     settings->ssh2_keyboard_interactive = GetPrivateProfileInt("TTSSH", "KeyboardInteractive", 0, fileName);
330 yutakakn 2782
331 yutakakn 2891 // �p�X���[�h�F�����������J���F�����g���p�X���[�h����������������������������������
332     // �\���B(2006.8.5 yutaka)
333     settings->remember_password = GetPrivateProfileInt("TTSSH", "RememberPassword", 1, fileName);
334    
335 yutakakn 2728 clear_local_settings(pvar);
336     }
337    
338     static void write_ssh_options(PTInstVar pvar, PCHAR fileName,
339 maya 2909 TS_SSH FAR * settings, BOOL copy_forward)
340 yutakakn 2728 {
341     char buf[1024];
342    
343     WritePrivateProfileString("TTSSH", "Enabled",
344 maya 3003 settings->Enabled ? "1" : "0", fileName);
345 yutakakn 2728
346     _itoa(settings->CompressionLevel, buf, 10);
347     WritePrivateProfileString("TTSSH", "Compression", buf, fileName);
348    
349     WritePrivateProfileString("TTSSH", "DefaultUserName",
350 maya 3003 settings->DefaultUserName, fileName);
351 yutakakn 2728
352 maya 2909 if (copy_forward) {
353     WritePrivateProfileString("TTSSH", "DefaultForwarding",
354 maya 3003 settings->DefaultForwarding, fileName);
355 maya 2909 }
356 yutakakn 2728
357     WritePrivateProfileString("TTSSH", "CipherOrder",
358 maya 3003 settings->CipherOrder, fileName);
359 yutakakn 2728
360     WritePrivateProfileString("TTSSH", "KnownHostsFiles",
361 maya 3003 settings->KnownHostsFiles, fileName);
362 yutakakn 2728
363     WritePrivateProfileString("TTSSH", "DefaultRhostsLocalUserName",
364 maya 3003 settings->DefaultRhostsLocalUserName,
365     fileName);
366 yutakakn 2728
367     WritePrivateProfileString("TTSSH", "DefaultRhostsHostPrivateKeyFile",
368 maya 3003 settings->DefaultRhostsHostPrivateKeyFile,
369     fileName);
370 yutakakn 2728
371     WritePrivateProfileString("TTSSH", "DefaultRSAPrivateKeyFile",
372 maya 3003 settings->DefaultRSAPrivateKeyFile,
373     fileName);
374 yutakakn 2728
375     _itoa(settings->DefaultAuthMethod, buf, 10);
376     WritePrivateProfileString("TTSSH", "DefaultAuthMethod", buf, fileName);
377    
378     _itoa(settings->LogLevel, buf, 10);
379     WritePrivateProfileString("TTSSH", "LogLevel", buf, fileName);
380    
381     _itoa(settings->WriteBufferSize, buf, 10);
382     WritePrivateProfileString("TTSSH", "WriteBufferSize", buf, fileName);
383    
384     WritePrivateProfileString("TTSSH", "LocalForwardingIdentityCheck",
385 maya 3003 settings->LocalForwardingIdentityCheck ? "1" : "0",
386     fileName);
387 yutakakn 2728
388     // SSH protocol version (2004.10.11 yutaka)
389     WritePrivateProfileString("TTSSH", "ProtocolVersion",
390 maya 3003 settings->ssh_protocol_version==2 ? "2" : "1",
391     fileName);
392 yutakakn 2728
393 yutakakn 2748 // SSH heartbeat time(second) (2004.12.11 yutaka)
394 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
395 maya 3003 "%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 maya 3003 settings->ssh2_keyboard_interactive ? "1" : "0",
401     fileName);
402 yutakakn 2782
403 yutakakn 2891 // Remember password (2006.8.5 yutaka)
404     WritePrivateProfileString("TTSSH", "RememberPassword",
405 maya 3003 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 maya 3003 SOCKET_ERROR) {
460 yutakakn 2728 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 maya 3003 (connecter, (struct sockaddr FAR *) &connecter_addr,
490     sizeof(connecter_addr)) != SOCKET_ERROR) {
491     closesocket(connecter);
492 yutakakn 2728 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 maya 3003 const struct sockaddr FAR * name,
507     int namelen)
508 yutakakn 2728 {
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 maya 3003 #else
534 yutakakn 2728 memset(&((struct sockaddr_in6 FAR *) &ss)->sin6_addr, 0,
535 maya 3003 sizeof(struct in_addr6));
536 yutakakn 2728 #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 maya 3003 long lEvent)
567 yutakakn 2728 {
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 maya 3003 int flags)
602 yutakakn 2728 {
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 maya 3003 IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR);
622 yutakakn 2728 }
623 maya 2896 if (SecureSmallIcon == NULL) {
624     SecureSmallIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_SECURETT),
625 maya 3003 IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
626 maya 2896 }
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 maya 3003 ICON_SMALL, 0);
635 maya 2897
636 yutakakn 2728 PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_BIG,
637 maya 3003 (LPARAM) SecureLargeIcon);
638 yutakakn 2728 PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_SMALL,
639 maya 3003 (LPARAM) SecureSmallIcon);
640 yutakakn 2728 }
641    
642     notify_verbose_message(pvar, "Entering secure mode",
643 maya 3003 LOG_LEVEL_VERBOSE);
644 yutakakn 2728 }
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 maya 3003 pvar->socket, MAKELPARAM(FD_CLOSE, 0));
654 yutakakn 2728
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 maya 3003 "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 maya 3003 ID_SSHASYNCMESSAGEBOX, 0);
687 yutakakn 2868 }
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 maya 3003 pvar->socket, MAKELPARAM(FD_CLOSE,
711     (pvar->PWSAGetLastError) ()));
712 yutakakn 2728 }
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 maya 3003 _S_IREAD | _S_IWRITE);
724 yutakakn 2728
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 maya 3003 LOG_LEVEL_VERBOSE);
790 yutakakn 2728
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 maya 3003 LPARAM lParam)
810 yutakakn 2728 {
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 maya 3003 TempHost, sizeof(TempHost),
888     GetHNRec->SetupFN);
889 yutakakn 2728 if (strlen(TempHost) > 0)
890     SendDlgItemMessage(dlg, IDC_HOSTNAME, CB_ADDSTRING,
891 maya 3003 0, (LPARAM) TempHost);
892 yutakakn 2728 i++;
893 maya 3005 } while ((i <= MAXHOSTLIST) && (strlen(TempHost) > 0));
894 yutakakn 2728
895     SendDlgItemMessage(dlg, IDC_HOSTNAME, EM_LIMITTEXT,
896 maya 3003 HostNameMaxLength - 1, 0);
897 yutakakn 2728
898     SendDlgItemMessage(dlg, IDC_HOSTNAME, CB_SETCURSEL, 0, 0);
899    
900     CheckRadioButton(dlg, IDC_HOSTTELNET, IDC_HOSTOTHER,
901 maya 3003 pvar->settings.Enabled ? IDC_HOSTSSH : GetHNRec->
902     Telnet ? IDC_HOSTTELNET : IDC_HOSTOTHER);
903 yutakakn 2728 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 maya 3003 0, (LPARAM) ProtocolFamilyList[i]);
909 yutakakn 2728 }
910     SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, EM_LIMITTEXT,
911 maya 3003 ProtocolFamilyMaxLength - 1, 0);
912 yutakakn 2728 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 maya 3003 0, (LPARAM) ssh_version[i]);
919 yutakakn 2728 }
920     SendDlgItemMessage(dlg, IDC_SSH_VERSION, EM_LIMITTEXT,
921 maya 3003 NUM_ELEM(ssh_version) - 1, 0);
922 yutakakn 2728
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 3006 // MaxComPort ���z�����|�[�g���\��������
943     if (ComPortTable[i] > GetHNRec->MaxComPort) {
944     continue;
945     }
946    
947 maya 3007 // �g�p�����|�[�g���\��������
948     if (CheckCOMFlag(ComPortTable[i]) == 1) {
949     continue;
950     }
951    
952 maya 2992 _snprintf_s(&EntName[3], sizeof(EntName)-3, _TRUNCATE, "%d", ComPortTable[i]);
953 maya 2998 if (ComPortDesc[i] != NULL) {
954     strncat_s(EntName, sizeof(EntName), ": ", _TRUNCATE);
955     strncat_s(EntName, sizeof(EntName), ComPortDesc[i], _TRUNCATE);
956     }
957 doda 2964 SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,
958 maya 3003 0, (LPARAM)EntName);
959 doda 2964 j++;
960     if (GetHNRec->ComPort == ComPortTable[i])
961     w = j;
962     }
963    
964     } else {
965     for (i = 1; i <= GetHNRec->MaxComPort; i++) {
966 maya 3007 // �g�p�����|�[�g���\��������
967     if (CheckCOMFlag(i) == 1) {
968     continue;
969     }
970    
971 maya 2992 _snprintf_s(&EntName[3], sizeof(EntName)-3, _TRUNCATE, "%d", i);
972 doda 2964 SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,
973 maya 3003 0, (LPARAM) EntName);
974 doda 2964 j++;
975     if (GetHNRec->ComPort == i)
976     w = j;
977     }
978 yutakakn 2728 }
979 doda 2964
980 yutakakn 2728 if (j > 0)
981     SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_SETCURSEL, w - 1, 0);
982 doda 2982 else { /* All com ports are already used */
983 yutakakn 2728 GetHNRec->PortType = IdTCPIP;
984 doda 2982 enable_dlg_items(dlg, IDC_HOSTSERIAL, IDC_HOSTSERIAL, FALSE);
985     }
986 yutakakn 2728
987 doda 2982 CheckRadioButton(dlg, IDC_HOSTTCPIP, IDC_HOSTSERIAL,
988 maya 3003 IDC_HOSTTCPIP + GetHNRec->PortType - 1);
989 doda 2982
990 yutakakn 2803 if (GetHNRec->PortType == IdTCPIP) {
991 yutakakn 2728 enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, FALSE);
992 yutakakn 2803
993     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE);
994     enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, TRUE);
995     }
996 maya 2980 #ifndef NO_INET6
997 yutakakn 2728 else {
998     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
999 maya 3003 FALSE);
1000 yutakakn 2728 enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1001 maya 3003 IDC_HOSTTCPPROTOCOL, FALSE);
1002 yutakakn 2803
1003     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1004     enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, FALSE); // disabled (2004.11.23 yutaka)
1005 yutakakn 2728 }
1006     #else
1007     else
1008     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1009     FALSE);
1010 maya 2980 #endif /* NO_INET6 */
1011 yutakakn 2728
1012     // Host dialog���t�H�[�J�X�������� (2004.10.2 yutaka)
1013 yutakakn 2803 if (GetHNRec->PortType == IdTCPIP) {
1014     HWND hwnd = GetDlgItem(dlg, IDC_HOSTNAME);
1015     SetFocus(hwnd);
1016     } else {
1017     HWND hwnd = GetDlgItem(dlg, IDC_HOSTCOM);
1018     SetFocus(hwnd);
1019 yutakakn 2728 }
1020    
1021 maya 2943 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1022     GetObject(font, sizeof(LOGFONT), &logfont);
1023 maya 2946 if (UTIL_get_lang_font("DLG_SYSTEM_FONT", dlg, &logfont, &DlgHostFont, pvar)) {
1024 maya 2943 SendDlgItemMessage(dlg, IDC_HOSTTCPIP, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1025     SendDlgItemMessage(dlg, IDC_HOSTNAMELABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1026 maya 2946 SendDlgItemMessage(dlg, IDC_HOSTNAME, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1027 maya 2943 SendDlgItemMessage(dlg, IDC_HISTORY, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1028     SendDlgItemMessage(dlg, IDC_SERVICELABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1029     SendDlgItemMessage(dlg, IDC_HOSTTELNET, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1030     SendDlgItemMessage(dlg, IDC_HOSTSSH, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1031     SendDlgItemMessage(dlg, IDC_HOSTOTHER, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1032     SendDlgItemMessage(dlg, IDC_HOSTTCPPORTLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1033 maya 2946 SendDlgItemMessage(dlg, IDC_HOSTTCPPORT, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1034 maya 2943 SendDlgItemMessage(dlg, IDC_SSH_VERSION_LABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1035 maya 2946 SendDlgItemMessage(dlg, IDC_SSH_VERSION, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1036 maya 2943 SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOLLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1037 maya 2946 SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1038 maya 2943 SendDlgItemMessage(dlg, IDC_HOSTSERIAL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1039     SendDlgItemMessage(dlg, IDC_HOSTCOMLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1040 maya 2946 SendDlgItemMessage(dlg, IDC_HOSTCOM, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1041 maya 2943 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1042     SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1043     SendDlgItemMessage(dlg, IDC_HOSTHELP, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1044     }
1045     else {
1046     DlgHostFont = NULL;
1047     }
1048    
1049 yutakakn 2734 // SetFocus()���t�H�[�J�X���������������AFALSE�������K�v�������B
1050     // TRUE���������ATABSTOP�������������������R���g���[�����I�������B
1051     // (2004.11.23 yutaka)
1052     return FALSE;
1053     //return TRUE;
1054 yutakakn 2728
1055     case WM_COMMAND:
1056     switch (LOWORD(wParam)) {
1057     case IDOK:
1058     GetHNRec = (PGetHNRec) GetWindowLong(dlg, DWL_USER);
1059     if (GetHNRec != NULL) {
1060     if (IsDlgButtonChecked(dlg, IDC_HOSTTCPIP)) {
1061 maya 2980 #ifndef NO_INET6
1062 yutakakn 2728 char afstr[BUFSIZ];
1063 maya 2980 #endif /* NO_INET6 */
1064 yutakakn 2728 i = GetDlgItemInt(dlg, IDC_HOSTTCPPORT, &Ok, FALSE);
1065     if (Ok) {
1066     GetHNRec->TCPPort = i;
1067     } else {
1068 maya 2994 UTIL_get_lang_msg("MSG_TCPPORT_NAN_ERROR", pvar,
1069 maya 3003 "The TCP port must be a number.");
1070 maya 2937 MessageBox(dlg, pvar->ts->UIMsg,
1071 maya 3003 "Teraterm", MB_OK | MB_ICONEXCLAMATION);
1072 yutakakn 2728 return TRUE;
1073     }
1074 maya 2980 #ifndef NO_INET6
1075 yutakakn 2728 #define getaf(str) \
1076     ((strcmp((str), "IPv6") == 0) ? AF_INET6 : \
1077     ((strcmp((str), "IPv4") == 0) ? AF_INET : AF_UNSPEC))
1078     memset(afstr, 0, sizeof(afstr));
1079     GetDlgItemText(dlg, IDC_HOSTTCPPROTOCOL, afstr,
1080 maya 3003 sizeof(afstr));
1081 yutakakn 2728 GetHNRec->ProtocolFamily = getaf(afstr);
1082 maya 2980 #endif /* NO_INET6 */
1083 yutakakn 2728 GetHNRec->PortType = IdTCPIP;
1084     GetDlgItemText(dlg, IDC_HOSTNAME, GetHNRec->HostName,
1085 maya 3003 HostNameMaxLength);
1086 yutakakn 2728 GetHNRec->Telnet = FALSE;
1087     pvar->hostdlg_activated = TRUE;
1088     pvar->hostdlg_Enabled = FALSE;
1089     if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
1090     GetHNRec->Telnet = TRUE;
1091     } else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1092     pvar->hostdlg_Enabled = TRUE;
1093    
1094     // check SSH protocol version
1095     memset(afstr, 0, sizeof(afstr));
1096     GetDlgItemText(dlg, IDC_SSH_VERSION, afstr, sizeof(afstr));
1097 yutakakn 2850 if (_stricmp(afstr, "SSH1") == 0) {
1098 yutakakn 2728 pvar->settings.ssh_protocol_version = 1;
1099     } else {
1100     pvar->settings.ssh_protocol_version = 2;
1101     }
1102     }
1103 yutakakn 2846
1104     // host history check button
1105     if (SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_GETCHECK, 0, 0) == BST_CHECKED) {
1106     pvar->ts->HistoryList = 1;
1107     } else {
1108     pvar->ts->HistoryList = 0;
1109     }
1110    
1111 yutakakn 2728 } else {
1112     GetHNRec->PortType = IdSerial;
1113     GetHNRec->HostName[0] = 0;
1114     memset(EntName, 0, sizeof(EntName));
1115     GetDlgItemText(dlg, IDC_HOSTCOM, EntName,
1116 maya 3003 sizeof(EntName) - 1);
1117 doda 2982 if (strncmp(EntName, "COM", 3) == 0 && EntName[3] != '\0') {
1118 yutakapon 2997 #if 0
1119 doda 2982 GetHNRec->ComPort = (BYTE) (EntName[3]) - 0x30;
1120     if (strlen(EntName) > 4)
1121     GetHNRec->ComPort =
1122     GetHNRec->ComPort * 10 + (BYTE) (EntName[4]) -
1123     0x30;
1124 yutakapon 2997 #else
1125     GetHNRec->ComPort = atoi(&EntName[3]);
1126     #endif
1127 doda 2982 if (GetHNRec->ComPort > GetHNRec->MaxComPort)
1128     GetHNRec->ComPort = 1;
1129     } else {
1130     GetHNRec->ComPort = 1;
1131     }
1132 yutakakn 2728 }
1133     }
1134     EndDialog(dlg, 1);
1135 maya 2943
1136 maya 2947 if (DlgHostFont != NULL) {
1137     DeleteObject(DlgHostFont);
1138 maya 2943 }
1139    
1140 yutakakn 2728 return TRUE;
1141    
1142     case IDCANCEL:
1143     EndDialog(dlg, 0);
1144 maya 2943
1145 maya 2947 if (DlgHostFont != NULL) {
1146     DeleteObject(DlgHostFont);
1147 maya 2943 }
1148 maya 2994
1149 yutakakn 2728 return TRUE;
1150    
1151     case IDC_HOSTTCPIP:
1152     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1153 maya 3003 TRUE);
1154 maya 2980 #ifndef NO_INET6
1155 yutakakn 2728 enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1156 maya 3003 IDC_HOSTTCPPROTOCOL, TRUE);
1157 maya 2980 #endif /* NO_INET6 */
1158 yutakakn 2728 enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, FALSE);
1159    
1160 yutakakn 2734 enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, TRUE); // disabled (2004.11.23 yutaka)
1161 yutakakn 2728 if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1162     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE);
1163     } else {
1164     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1165     }
1166    
1167 yutakakn 2847 enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, TRUE); // disabled
1168    
1169 yutakakn 2728 return TRUE;
1170    
1171     case IDC_HOSTSERIAL:
1172     enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, TRUE);
1173     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1174 maya 3003 FALSE);
1175 maya 2980 #ifndef NO_INET6
1176 yutakakn 2728 enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1177 maya 3003 IDC_HOSTTCPPROTOCOL, FALSE);
1178 maya 2980 #endif /* NO_INET6 */
1179 yutakakn 2728 enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1180 yutakakn 2734 enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, FALSE); // disabled (2004.11.23 yutaka)
1181 yutakakn 2728
1182 yutakakn 2847 enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, FALSE); // disabled
1183    
1184 yutakakn 2728 return TRUE;
1185    
1186     case IDC_HOSTSSH:
1187     enable_dlg_items(dlg, IDC_SSH_VERSION,
1188 maya 3003 IDC_SSH_VERSION, TRUE);
1189 yutakakn 2728 goto hostssh_enabled;
1190    
1191     case IDC_HOSTTELNET:
1192     case IDC_HOSTOTHER:
1193     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1194     hostssh_enabled:
1195    
1196     GetHNRec = (PGetHNRec) GetWindowLong(dlg, DWL_USER);
1197    
1198     if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
1199     if (GetHNRec != NULL)
1200     SetDlgItemInt(dlg, IDC_HOSTTCPPORT, GetHNRec->TelPort,
1201 maya 3003 FALSE);
1202 yutakakn 2728 } else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1203     SetDlgItemInt(dlg, IDC_HOSTTCPPORT, 22, FALSE);
1204     }
1205     return TRUE;
1206    
1207 maya 3004 case IDC_HOSTCOM:
1208     if(HIWORD(wParam) == CBN_DROPDOWN) {
1209     HWND hostcom = GetDlgItem(dlg, IDC_HOSTCOM);
1210     int count = SendMessage(hostcom, CB_GETCOUNT, 0, 0);
1211     int i, len, max_len = 0;
1212     char *lbl;
1213     HDC TmpDC = GetDC(hostcom);
1214     SIZE s;
1215     for (i=0; i<count; i++) {
1216     len = SendMessage(hostcom, CB_GETLBTEXTLEN, i, 0);
1217     lbl = (char *)calloc(len+1, sizeof(char));
1218     SendMessage(hostcom, CB_GETLBTEXT, i, (LPARAM)lbl);
1219     GetTextExtentPoint32(TmpDC, lbl, len, &s);
1220     if (s.cx > max_len)
1221     max_len = s.cx;
1222     free(lbl);
1223     }
1224     SendMessage(hostcom, CB_SETDROPPEDWIDTH,
1225     max_len + GetSystemMetrics(SM_CXVSCROLL), 0);
1226     }
1227     break;
1228    
1229 yutakakn 2728 case IDC_HOSTHELP:
1230     PostMessage(GetParent(dlg), WM_USER_DLGHELP2, 0, 0);
1231     }
1232     }
1233     return FALSE;
1234     }
1235    
1236     static BOOL FAR PASCAL TTXGetHostName(HWND parent, PGetHNRec rec)
1237     {
1238     return (BOOL) DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_HOSTDLG),
1239 maya 3003 parent, TTXHostDlg, (LONG) rec);
1240 yutakakn 2728 }
1241    
1242     static void PASCAL FAR TTXGetUIHooks(TTXUIHooks FAR * hooks)
1243     {
1244     GET_VAR();
1245    
1246     *hooks->GetHostName = TTXGetHostName;
1247     }
1248    
1249     static void FAR PASCAL TTXReadINIFile(PCHAR fileName, PTTSet ts)
1250     {
1251     GET_VAR();
1252    
1253     (pvar->ReadIniFile) (fileName, ts);
1254     read_ssh_options(pvar, fileName);
1255     pvar->settings = *pvar->ts_SSH;
1256     notify_verbose_message(pvar, "Reading INI file", LOG_LEVEL_VERBOSE);
1257     FWDUI_load_settings(pvar);
1258     }
1259    
1260     static void FAR PASCAL TTXWriteINIFile(PCHAR fileName, PTTSet ts)
1261     {
1262     GET_VAR();
1263    
1264     (pvar->WriteIniFile) (fileName, ts);
1265     *pvar->ts_SSH = pvar->settings;
1266     clear_local_settings(pvar);
1267     notify_verbose_message(pvar, "Writing INI file", LOG_LEVEL_VERBOSE);
1268 maya 2909 write_ssh_options(pvar, fileName, pvar->ts_SSH, TRUE);
1269 yutakakn 2728 }
1270    
1271     static void read_ssh_options_from_user_file(PTInstVar pvar,
1272 maya 3003 char FAR * user_file_name)
1273 yutakakn 2728 {
1274     if (user_file_name[0] == '.') {
1275     read_ssh_options(pvar, user_file_name);
1276     } else {
1277     char buf[1024];
1278    
1279     get_teraterm_dir_relative_name(buf, sizeof(buf), user_file_name);
1280     read_ssh_options(pvar, buf);
1281     }
1282    
1283     pvar->settings = *pvar->ts_SSH;
1284     FWDUI_load_settings(pvar);
1285     }
1286    
1287 yutakakn 2784
1288     // @���u�����N���u�������B (2005.1.26 yutaka)
1289     static void replace_to_blank(char *src, char *dst, int dst_len)
1290     {
1291     int len, i;
1292    
1293     len = strlen(src);
1294     if (dst_len < len) // buffer overflow check
1295     return;
1296    
1297     for (i = 0 ; i < len ; i++) {
1298     if (src[i] == '@') { // @ ���o��������
1299     if (i < len - 1 && src[i + 1] == '@') { // �������� @ �����A�b�g�}�[�N���F������
1300     *dst++ = '@';
1301     i++;
1302     } else {
1303     *dst++ = ' '; // �������u��������
1304     }
1305     } else {
1306     *dst++ = src[i];
1307     }
1308     }
1309     *dst = '\0';
1310     }
1311    
1312 yutakakn 2728 /* returns 1 if the option text must be deleted */
1313     static int parse_option(PTInstVar pvar, char FAR * option)
1314     {
1315     if ((option[0] == '-' || option[0] == '/')) {
1316     if (MATCH_STR(option + 1, "ssh") == 0) {
1317     if (option[4] == 0) {
1318     pvar->settings.Enabled = 1;
1319 maya 3003 } else if (MATCH_STR(option + 4, "-L") == 0 ||
1320     MATCH_STR(option + 4, "-R") == 0 ||
1321     _stricmp(option + 4, "-X") == 0) {
1322 yutakakn 2728 if (pvar->settings.DefaultForwarding[0] == 0) {
1323 maya 2992 strncpy_s(pvar->settings.DefaultForwarding,
1324 maya 3003 sizeof(pvar->settings.DefaultForwarding),
1325     option + 5, _TRUNCATE);
1326 yutakakn 2728 } else {
1327 maya 2992 strncat_s(pvar->settings.DefaultForwarding,
1328 maya 3003 sizeof(pvar->settings.DefaultForwarding),
1329     ";", _TRUNCATE);
1330 maya 2992 strncat_s(pvar->settings.DefaultForwarding,
1331 maya 3003 sizeof(pvar->settings.DefaultForwarding),
1332     option + 5, _TRUNCATE);
1333 yutakakn 2728 }
1334     } else if (MATCH_STR(option + 4, "-f=") == 0) {
1335 maya 2911 read_ssh_options_from_user_file(pvar, option + 7);
1336 yutakakn 2728 } else if (MATCH_STR(option + 4, "-v") == 0) {
1337     pvar->settings.LogLevel = LOG_LEVEL_VERBOSE;
1338 maya 3003 } else if (_stricmp(option + 4, "-autologin") == 0 ||
1339     _stricmp(option + 4, "-autologon") == 0) {
1340 yutakakn 2728 pvar->settings.TryDefaultAuth = TRUE;
1341 yutakakn 2739
1342 yutakakn 2728 } else if (MATCH_STR(option + 4, "-consume=") == 0) {
1343 maya 2911 read_ssh_options_from_user_file(pvar, option + 13);
1344 yutakakn 2728 DeleteFile(option + 13);
1345 maya 2907
1346     // /ssh1 �� /ssh2 �I�v�V�������V�K���� (2006.9.16 maya)
1347     } else if (MATCH_STR(option + 4, "1") == 0) {
1348     pvar->settings.ssh_protocol_version = 1;
1349     } else if (MATCH_STR(option + 4, "2") == 0) {
1350     pvar->settings.ssh_protocol_version = 2;
1351    
1352 yutakakn 2728 } else {
1353     char buf[1024];
1354    
1355 maya 2994 UTIL_get_lang_msg("MSG_UNKNOWN_OPTION_ERROR", pvar,
1356 maya 3003 "Unrecognized command-line option: %s");
1357 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, option);
1358 yutakakn 2728
1359     MessageBox(NULL, buf, "TTSSH", MB_OK | MB_ICONEXCLAMATION);
1360     }
1361    
1362     return 1;
1363 maya 2915
1364     // ttermpro.exe �� /T= �w�������p�������A������������ (2006.10.19 maya)
1365     } else if (MATCH_STR_I(option + 1, "t=") == 0) {
1366 yutakakn 2728 if (strcmp(option + 3, "2") == 0) {
1367     pvar->settings.Enabled = 1;
1368     return 1;
1369     } else {
1370     pvar->settings.Enabled = 0;
1371     }
1372    
1373 maya 2915 // ttermpro.exe �� /F= �w������ TTSSH ������������ (2006.10.11 maya)
1374     } else if (MATCH_STR_I(option + 1, "f=") == 0) {
1375 maya 2913 read_ssh_options_from_user_file(pvar, option + 3);
1376    
1377 yutakakn 2728 // /1 ������ /2 �I�v�V�������V�K���� (2004.10.3 yutaka)
1378     } else if (MATCH_STR(option + 1, "1") == 0) {
1379     // command line: /ssh /1 is SSH1 only
1380     pvar->settings.ssh_protocol_version = 1;
1381    
1382     } else if (MATCH_STR(option + 1, "2") == 0) {
1383     // command line: /ssh /2 is SSH2 & SSH1
1384     pvar->settings.ssh_protocol_version = 2;
1385    
1386     } else if (MATCH_STR(option + 1, "nossh") == 0) {
1387     // '/nossh' �I�v�V�����������B
1388     // TERATERM.INI ��SSH���L�������������������A������Cygterm���N��������������
1389     // �����������������B(2004.10.11 yutaka)
1390     pvar->settings.Enabled = 0;
1391    
1392 maya 2907 } else if (MATCH_STR(option + 1, "telnet") == 0) {
1393     // '/telnet' ���w�������������������� '/nossh' ��������
1394     // SSH������������ (2006.9.16 maya)
1395     pvar->settings.Enabled = 0;
1396    
1397 yutakakn 2739 } else if (MATCH_STR(option + 1, "auth") == 0) {
1398 yutakakn 2784 // SSH2�������O�C���I�v�V����������
1399 yutakakn 2739 //
1400 yutakakn 2784 // SYNOPSIS: /ssh /auth=passowrd /user=���[�U�� /passwd=�p�X���[�h
1401     // /ssh /auth=publickey /user=���[�U�� /passwd=�p�X���[�h /keyfile=�p�X
1402     // EXAMPLE: /ssh /auth=password /user=nike /passwd=a@bc
1403     // /ssh /auth=publickey /user=foo /passwd=bar /keyfile=d:\tmp\id_rsa
1404     // NOTICE: �p�X���[�h���p�X�������������������A�u�����N���������� @ ���g�������B
1405 yutakakn 2739 //
1406 yutakakn 2784 // (2004.11.30 yutaka)
1407     // (2005.1.26 yutaka) ���������B���J���F���T�|�[�g�B
1408     //
1409 yutakakn 2739 pvar->ssh2_autologin = 1; // for SSH2 (2004.11.30 yutaka)
1410    
1411 yutakakn 2784 if (MATCH_STR(option + 5, "=password") == 0) { // �p�X���[�h/keyboard-interactive�F��
1412     //pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
1413     pvar->ssh2_authmethod = SSH_AUTH_PASSWORD;
1414 yutakakn 2739
1415 yutakakn 2784 } else if (MATCH_STR(option + 5, "=publickey") == 0) { // ���J���F��
1416     //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
1417     pvar->ssh2_authmethod = SSH_AUTH_RSA;
1418    
1419 yutakakn 2739 } else {
1420     // TODO:
1421    
1422     }
1423    
1424     } else if (MATCH_STR(option + 1, "user=") == 0) {
1425 yutakakn 2784 replace_to_blank(option + 6, pvar->ssh2_username, sizeof(pvar->ssh2_username));
1426     //_snprintf(pvar->ssh2_username, sizeof(pvar->ssh2_username), "%s", option + 6);
1427 yutakakn 2739
1428     } else if (MATCH_STR(option + 1, "passwd=") == 0) {
1429 yutakakn 2784 replace_to_blank(option + 8, pvar->ssh2_password, sizeof(pvar->ssh2_password));
1430     //_snprintf(pvar->ssh2_password, sizeof(pvar->ssh2_password), "%s", option + 8);
1431 yutakakn 2739
1432 yutakakn 2784 } else if (MATCH_STR(option + 1, "keyfile=") == 0) {
1433     replace_to_blank(option + 9, pvar->ssh2_keyfile, sizeof(pvar->ssh2_keyfile));
1434    
1435 maya 2908 } else if (MATCH_STR(option + 1, "ask4passwd") == 0) {
1436     // �p�X���[�h������ (2006.9.18 maya)
1437     pvar->ask4passwd = 1;
1438    
1439 yutakakn 2728 }
1440    
1441 maya 2908 // �p�X���[�h�������������������O�C��������������
1442     // /auth ���F�����\�b�h���w�������������p������ (2006.9.18 maya)
1443     if (pvar->ask4passwd == 1) {
1444     pvar->ssh2_autologin = 0;
1445     }
1446    
1447 yutakakn 2728 }
1448    
1449     return 0;
1450     }
1451    
1452     static void FAR PASCAL TTXParseParam(PCHAR param, PTTSet ts,
1453 maya 3003 PCHAR DDETopic)
1454 yutakakn 2728 {
1455 maya 2911 // �X�y�[�X�������t�@�C�������F�������������C�� (2006.10.7 maya)
1456 yutakakn 2728 int i;
1457     BOOL inParam = FALSE;
1458     BOOL inQuotes = FALSE;
1459 maya 2911 BOOL inFileParam = FALSE;
1460 yutakakn 2728 PCHAR option = NULL;
1461     GET_VAR();
1462    
1463     if (pvar->hostdlg_activated) {
1464     pvar->settings.Enabled = pvar->hostdlg_Enabled;
1465     }
1466    
1467     for (i = 0; param[i] != 0; i++) {
1468 maya 2911 if (inQuotes ? param[i] == '"'
1469 maya 3003 : (param[i] == ' ' || param[i] == '\t')) {
1470 yutakakn 2728 if (option != NULL) {
1471     char ch = param[i];
1472 maya 2911 PCHAR Equal;
1473 yutakakn 2728
1474     param[i] = 0;
1475 maya 2911 Equal = strchr(option, '=');
1476     if (inFileParam && Equal != NULL && *(Equal + 1) == '"') {
1477 maya 2992 int buf_len = strlen(option) * sizeof(char);
1478 maya 2911 char *buf = (char *)calloc(strlen(option), sizeof(char));
1479 maya 2992 char c = option[Equal - option + 1];
1480     option[Equal - option + 1] = 0;
1481     strncat_s(buf, buf_len, option, _TRUNCATE);
1482     option[Equal - option + 1] = c;
1483     strncat_s(buf, buf_len, Equal + 2, _TRUNCATE);
1484 maya 3003 if (parse_option(pvar, *buf == '"' ? buf + 1 : buf)) {
1485 maya 2911 memset(option, ' ', i + 1 - (option - param));
1486     } else {
1487     param[i] = ch;
1488     }
1489     free(buf);
1490 yutakakn 2728 }
1491 maya 2911 else {
1492 maya 3003 if (parse_option(pvar, *option == '"' ? option + 1 : option)) {
1493 maya 2911 memset(option, ' ', i + 1 - (option - param));
1494     } else {
1495     param[i] = ch;
1496     }
1497     }
1498 yutakakn 2728 option = NULL;
1499     }
1500     inParam = FALSE;
1501     inQuotes = FALSE;
1502 maya 2911 inFileParam = FALSE;
1503 yutakakn 2728 } else if (!inParam) {
1504     if (param[i] == '"') {
1505     inQuotes = TRUE;
1506     inParam = TRUE;
1507     option = param + i;
1508     } else if (param[i] != ' ' && param[i] != '\t') {
1509     inParam = TRUE;
1510     option = param + i;
1511     }
1512 maya 2911 } else {
1513     if (option == NULL) {
1514     continue;
1515     }
1516     if ((option[0] == '-' || option[0] == '/') &&
1517 maya 3003 (MATCH_STR(option + 1, "ssh-f=") == 0 ||
1518     MATCH_STR(option + 1, "ssh-consume=") == 0 ||
1519     MATCH_STR_I(option + 1, "f=") == 0 ||
1520     MATCH_STR(option + 1, "keyfile=") == 0)) {
1521 maya 2911 if (param[i] == '"') {
1522     inQuotes = TRUE;
1523     }
1524     inFileParam = TRUE;
1525     }
1526 yutakakn 2728 }
1527     }
1528    
1529     if (option != NULL) {
1530 maya 2911 PCHAR Equal = strchr(option, '=');
1531     if (inFileParam && Equal != NULL && *(Equal + 1) == '"') {
1532 maya 2992 int buf_len = strlen(option) * sizeof(char);
1533 maya 2911 char *buf = (char *)calloc(strlen(option), sizeof(char));
1534 maya 2992 char c = option[Equal - option + 1];
1535     option[Equal - option + 1] = 0;
1536     strncat_s(buf, buf_len, option, _TRUNCATE);
1537     option[Equal - option + 1] = c;
1538     strncat_s(buf, buf_len, Equal + 2, _TRUNCATE);
1539 maya 3003 if (parse_option(pvar, *buf == '"' ? buf + 1 : buf)) {
1540 maya 2911 memset(option, ' ', i + 1 - (option - param));
1541     }
1542     free(buf);
1543 yutakakn 2728 }
1544 maya 2911 else {
1545     if (parse_option(pvar, option)) {
1546     memset(option, ' ', i - (option - param));
1547     }
1548     }
1549 yutakakn 2728 }
1550    
1551     FWDUI_load_settings(pvar);
1552    
1553     (pvar->ParseParam) (param, ts, DDETopic);
1554    
1555     }
1556    
1557     static void PASCAL FAR TTXGetSetupHooks(TTXSetupHooks FAR * hooks)
1558     {
1559     GET_VAR();
1560    
1561     pvar->ReadIniFile = *hooks->ReadIniFile;
1562     pvar->WriteIniFile = *hooks->WriteIniFile;
1563     pvar->ParseParam = *hooks->ParseParam;
1564    
1565     *hooks->ReadIniFile = TTXReadINIFile;
1566     *hooks->WriteIniFile = TTXWriteINIFile;
1567     *hooks->ParseParam = TTXParseParam;
1568     }
1569    
1570     static void PASCAL FAR TTXSetWinSize(int rows, int cols)
1571     {
1572     GET_VAR();
1573    
1574     SSH_notify_win_size(pvar, cols, rows);
1575     }
1576    
1577     static void insertMenuBeforeItem(HMENU menu, WORD beforeItemID, WORD flags,
1578 maya 3003 WORD newItemID, char FAR * text)
1579 yutakakn 2728 {
1580     int i, j;
1581    
1582     for (i = GetMenuItemCount(menu) - 1; i >= 0; i--) {
1583     HMENU submenu = GetSubMenu(menu, i);
1584    
1585     for (j = GetMenuItemCount(submenu) - 1; j >= 0; j--) {
1586     if (GetMenuItemID(submenu, j) == beforeItemID) {
1587 maya 3003 InsertMenu(submenu, j, MF_BYPOSITION | flags, newItemID, text);
1588 yutakakn 2728 return;
1589     }
1590     }
1591     }
1592     }
1593    
1594     static void PASCAL FAR TTXModifyMenu(HMENU menu)
1595     {
1596     GET_VAR();
1597    
1598     /* inserts before ID_HELP_ABOUT */
1599 maya 2994 UTIL_get_lang_msg("MENU_ABOUT", pvar, "About &TTSSH...");
1600 maya 2937 insertMenuBeforeItem(menu, 50990, MF_ENABLED, ID_ABOUTMENU, pvar->ts->UIMsg);
1601 yutakakn 2728
1602     /* inserts before ID_SETUP_TCPIP */
1603 maya 2994 UTIL_get_lang_msg("MENU_SSH", pvar, "SS&H...");
1604 maya 2937 insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHSETUPMENU, pvar->ts->UIMsg);
1605 yutakakn 2728 /* inserts before ID_SETUP_TCPIP */
1606 maya 2994 UTIL_get_lang_msg("MENU_SSH_AUTH", pvar, "SSH &Authentication...");
1607 maya 2937 insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHAUTHSETUPMENU, pvar->ts->UIMsg);
1608 yutakakn 2728 /* inserts before ID_SETUP_TCPIP */
1609 maya 2994 UTIL_get_lang_msg("MENU_SSH_FORWARD", pvar, "SSH F&orwarding...");
1610 maya 2937 insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHFWDSETUPMENU, pvar->ts->UIMsg);
1611 maya 2994 UTIL_get_lang_msg("MENU_SSH_KEYGEN", pvar, "SSH KeyGe&nerator...");
1612 maya 2937 insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHKEYGENMENU, pvar->ts->UIMsg);
1613 yutakakn 2728 }
1614    
1615     static void append_about_text(HWND dlg, char FAR * prefix, char FAR * msg)
1616     {
1617     SendDlgItemMessage(dlg, IDC_ABOUTTEXT, EM_REPLACESEL, 0,
1618 maya 3003 (LPARAM) prefix);
1619 yutakakn 2728 SendDlgItemMessage(dlg, IDC_ABOUTTEXT, EM_REPLACESEL, 0, (LPARAM) msg);
1620     SendDlgItemMessage(dlg, IDC_ABOUTTEXT, EM_REPLACESEL, 0,
1621 maya 3003 (LPARAM) (char FAR *) "\r\n");
1622 yutakakn 2728 }
1623    
1624 yutakakn 2792 // ���s�t�@�C�������o�[�W�������������� (2005.2.28 yutaka)
1625 yutakakn 2793 void get_file_version(char *exefile, int *major, int *minor, int *release, int *build)
1626 yutakakn 2792 {
1627     typedef struct {
1628     WORD wLanguage;
1629     WORD wCodePage;
1630     } LANGANDCODEPAGE, *LPLANGANDCODEPAGE;
1631     LPLANGANDCODEPAGE lplgcode;
1632     UINT unLen;
1633     DWORD size;
1634     char *buf = NULL;
1635     BOOL ret;
1636     int i;
1637     char fmt[80];
1638     char *pbuf;
1639    
1640     size = GetFileVersionInfoSize(exefile, NULL);
1641     if (size == 0) {
1642     goto error;
1643     }
1644     buf = malloc(size);
1645     ZeroMemory(buf, size);
1646    
1647     if (GetFileVersionInfo(exefile, 0, size, buf) == FALSE) {
1648     goto error;
1649     }
1650    
1651     ret = VerQueryValue(buf,
1652     "\\VarFileInfo\\Translation",
1653     (LPVOID *)&lplgcode, &unLen);
1654     if (ret == FALSE)
1655     goto error;
1656    
1657     for (i = 0 ; i < (int)(unLen / sizeof(LANGANDCODEPAGE)) ; i++) {
1658 maya 2992 _snprintf_s(fmt, sizeof(fmt), _TRUNCATE,
1659 maya 3003 "\\StringFileInfo\\%04x%04x\\FileVersion",
1660     lplgcode[i].wLanguage, lplgcode[i].wCodePage);
1661 yutakakn 2792 VerQueryValue(buf, fmt, &pbuf, &unLen);
1662     if (unLen > 0) { // get success
1663     int n, a, b, c, d;
1664    
1665     n = sscanf(pbuf, "%d, %d, %d, %d", &a, &b, &c, &d);
1666     if (n == 4) { // convert success
1667     *major = a;
1668     *minor = b;
1669     *release = c;
1670     *build = d;
1671     break;
1672     }
1673     }
1674     }
1675    
1676     free(buf);
1677     return;
1678    
1679     error:
1680     free(buf);
1681     *major = *minor = *release = *build = 0;
1682     }
1683    
1684 yutakakn 2728 static void init_about_dlg(PTInstVar pvar, HWND dlg)
1685     {
1686     char buf[1024];
1687 yutakakn 2792 int a, b, c, d;
1688 maya 2994 char uimsg[MAX_UIMSG];
1689    
1690     GetWindowText(dlg, uimsg, sizeof(uimsg));
1691     UTIL_get_lang_msg("DLG_ABOUT_TITLE", pvar, uimsg);
1692 maya 2937 SetWindowText(dlg, pvar->ts->UIMsg);
1693 maya 2994 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1694     UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1695 maya 2937 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1696    
1697 yutakakn 2792 // TTSSH���o�[�W�������������� (2005.2.28 yutaka)
1698     get_file_version("ttxssh.dll", &a, &b, &c, &d);
1699 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
1700     "TTSSH\r\nTeraterm Secure Shell extension, %d.%d", a, b);
1701 yutakakn 2792 SendMessage(GetDlgItem(dlg, IDC_TTSSH_VERSION), WM_SETTEXT, 0, (LPARAM)buf);
1702    
1703 yutakakn 2782 // OpenSSL���o�[�W�������������� (2005.1.24 yutaka)
1704 yutakakn 2820 // ���������� (2005.5.11 yutaka)
1705     #ifdef OPENSSL_VERSION_TEXT
1706 yutakakn 2782 SendMessage(GetDlgItem(dlg, IDC_OPENSSL_VERSION), WM_SETTEXT, 0, (LPARAM)OPENSSL_VERSION_TEXT);
1707 yutakakn 2820 #else
1708     SendMessage(GetDlgItem(dlg, IDC_OPENSSL_VERSION), WM_SETTEXT, 0, (LPARAM)"Unknown");
1709     #endif
1710 yutakakn 2782
1711 yutakakn 2820 // zlib���o�[�W�������������� (2005.5.11 yutaka)
1712     #ifdef ZLIB_VERSION
1713 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE, "ZLib %s", ZLIB_VERSION);
1714 yutakakn 2820 #else
1715 yutakakn 2823 _snprintf(buf, sizeof(buf), "ZLib Unknown");
1716 yutakakn 2820 #endif
1717     SendMessage(GetDlgItem(dlg, IDC_ZLIB_VERSION), WM_SETTEXT, 0, (LPARAM)buf);
1718    
1719    
1720 yutakakn 2728 // TTSSH�_�C�A���O���\������SSH������������ (2004.10.30 yutaka)
1721     if (pvar->socket != INVALID_SOCKET) {
1722     if (SSHv1(pvar)) {
1723     SSH_get_server_ID_info(pvar, buf, sizeof(buf));
1724 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_SERVERID", pvar, "Server ID: ");
1725 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1726 yutakakn 2728 SSH_get_protocol_version_info(pvar, buf, sizeof(buf));
1727 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol: ");
1728 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1729 yutakakn 2728 CRYPT_get_cipher_info(pvar, buf, sizeof(buf));
1730 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_ENCRYPTION", pvar, "Encryption: ");
1731 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1732 yutakakn 2728 CRYPT_get_server_key_info(pvar, buf, sizeof(buf));
1733 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_SERVERKEY", pvar, "Server keys: ");
1734 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1735 yutakakn 2728 AUTH_get_auth_info(pvar, buf, sizeof(buf));
1736 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_AUTH", pvar, "Authentication: ");
1737 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1738 yutakakn 2728 SSH_get_compression_info(pvar, buf, sizeof(buf));
1739 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_COMP", pvar, "Compression: ");
1740 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1741 yutakakn 2728
1742     } else { // SSH2
1743     SSH_get_server_ID_info(pvar, buf, sizeof(buf));
1744 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_SERVERID", pvar, "Server ID: ");
1745 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1746 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_CLIENTID", pvar, "Client ID: ");
1747 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, pvar->client_version_string);
1748 yutakakn 2728
1749     SSH_get_protocol_version_info(pvar, buf, sizeof(buf));
1750 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol: ");
1751 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1752 yutakakn 2728
1753     if (pvar->kex_type == KEX_DH_GRP1_SHA1) {
1754 maya 2992 strncpy_s(buf, sizeof(buf), KEX_DH1, _TRUNCATE);
1755 yutakakn 2728 } else if (pvar->kex_type == KEX_DH_GRP14_SHA1) {
1756 maya 2992 strncpy_s(buf, sizeof(buf), KEX_DH14, _TRUNCATE);
1757 yutakakn 2728 } else {
1758 maya 2992 strncpy_s(buf, sizeof(buf), KEX_DHGEX, _TRUNCATE);
1759 yutakakn 2728 }
1760     append_about_text(dlg, "KEX: ", buf);
1761    
1762     if (pvar->hostkey_type == KEY_DSA) {
1763 maya 2992 strncpy_s(buf, sizeof(buf), "ssh-dss", _TRUNCATE);
1764 yutakakn 2728 } else {
1765 maya 2992 strncpy_s(buf, sizeof(buf), "ssh-rsa", _TRUNCATE);
1766 yutakakn 2728 }
1767 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_HOSTKEY", pvar, "Host Key: ");
1768 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1769 yutakakn 2728
1770 yutakakn 2758 // add HMAC algorithm (2004.12.17 yutaka)
1771     buf[0] = '\0';
1772     if (pvar->ctos_hmac == HMAC_SHA1) {
1773 maya 2992 strncat_s(buf, sizeof(buf), "hmac-sha1", _TRUNCATE);
1774 yutakakn 2758 } else if (pvar->ctos_hmac == HMAC_MD5) {
1775 maya 2992 strncat_s(buf, sizeof(buf), "hmac-md5", _TRUNCATE);
1776 yutakakn 2758 }
1777 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_TOSERVER", pvar, " to server, ");
1778 maya 2992 strncat_s(buf, sizeof(buf), pvar->ts->UIMsg, _TRUNCATE);
1779 yutakakn 2758 if (pvar->stoc_hmac == HMAC_SHA1) {
1780 maya 2992 strncat_s(buf, sizeof(buf), "hmac-sha1", _TRUNCATE);
1781 yutakakn 2758 } else if (pvar->stoc_hmac == HMAC_MD5) {
1782 maya 2992 strncat_s(buf, sizeof(buf), "hmac-md5", _TRUNCATE);
1783 yutakakn 2758 }
1784 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_FROMSERVER", pvar, " from server");
1785 maya 2992 strncat_s(buf, sizeof(buf), pvar->ts->UIMsg, _TRUNCATE);
1786 yutakakn 2758 append_about_text(dlg, "HMAC: ", buf);
1787    
1788 yutakakn 2728 CRYPT_get_cipher_info(pvar, buf, sizeof(buf));
1789 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_ENCRYPTION", pvar, "Encryption: ");
1790 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1791 yutakakn 2728 CRYPT_get_server_key_info(pvar, buf, sizeof(buf));
1792 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_SERVERKEY", pvar, "Server keys: ");
1793 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1794 maya 2994
1795 yutakakn 2728 AUTH_get_auth_info(pvar, buf, sizeof(buf));
1796 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_AUTH", pvar, "Authentication: ");
1797 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1798 yutakakn 2873
1799 yutakakn 2728 SSH_get_compression_info(pvar, buf, sizeof(buf));
1800 yutakakn 2873 if (pvar->ctos_compression == COMP_DELAYED) { // �x���p�P�b�g���k������ (2006.6.23 yutaka)
1801 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_COMPDELAY", pvar, "Delayed Compression: ");
1802 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1803 yutakakn 2873 } else {
1804 maya 2994 UTIL_get_lang_msg("DLG_ABOUT_COMP", pvar, "Compression: ");
1805 maya 2949 append_about_text(dlg, pvar->ts->UIMsg, buf);
1806 yutakakn 2873 }
1807 yutakakn 2728 }
1808     }
1809     }
1810    
1811     static BOOL CALLBACK TTXAboutDlg(HWND dlg, UINT msg, WPARAM wParam,
1812 maya 3003 LPARAM lParam)
1813 yutakakn 2728 {
1814 maya 2937 LOGFONT logfont;
1815     HFONT font;
1816 maya 2994
1817 yutakakn 2728 switch (msg) {
1818     case WM_INITDIALOG:
1819 maya 2937 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1820     GetObject(font, sizeof(LOGFONT), &logfont);
1821 maya 2946 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAboutFont, pvar)) {
1822 maya 2937 SendDlgItemMessage(dlg, IDC_TTSSH_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1823     SendDlgItemMessage(dlg, IDC_SSHVERSIONS, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1824     SendDlgItemMessage(dlg, IDC_INCLUDES, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1825     SendDlgItemMessage(dlg, IDC_OPENSSL_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1826     SendDlgItemMessage(dlg, IDC_ZLIB_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1827     SendDlgItemMessage(dlg, IDC_WEBSITES, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1828     SendDlgItemMessage(dlg, IDC_CRYPTOGRAPHY, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1829     SendDlgItemMessage(dlg, IDC_CREDIT, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1830     SendDlgItemMessage(dlg, IDC_ABOUTTEXT, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1831     SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
1832     }
1833     else {
1834     DlgAboutFont = NULL;
1835     }
1836 yutakakn 2728 init_about_dlg((PTInstVar) lParam, dlg);
1837     return TRUE;
1838     case WM_COMMAND:
1839     switch (LOWORD(wParam)) {
1840     case IDOK:
1841     EndDialog(dlg, 1);
1842 maya 2937 if (DlgAboutFont != NULL) {
1843     DeleteObject(DlgAboutFont);
1844     }
1845 yutakakn 2728 return TRUE;
1846     case IDCANCEL: /* there isn't a cancel button, but other Windows
1847     UI things can send this message */
1848     EndDialog(dlg, 0);
1849 maya 2937 if (DlgAboutFont != NULL) {
1850     DeleteObject(DlgAboutFont);
1851     }
1852 yutakakn 2728 return TRUE;
1853     }
1854     break;
1855     }
1856    
1857     return FALSE;
1858     }
1859    
1860     static char FAR *get_cipher_name(int cipher)
1861     {
1862     switch (cipher) {
1863     case SSH_CIPHER_NONE:
1864 maya 2994 UTIL_get_lang_msg("DLG_SSHSETUP_CIPHER_BORDER", pvar,
1865 maya 3003 "<ciphers below this line are disabled>");
1866 maya 2937 return pvar->ts->UIMsg;
1867 yutakakn 2728 case SSH_CIPHER_RC4:
1868     return "RC4";
1869     case SSH_CIPHER_3DES:
1870     return "3DES";
1871     case SSH_CIPHER_DES:
1872     return "DES";
1873     case SSH_CIPHER_IDEA:
1874     return "IDEA";
1875     case SSH_CIPHER_TSS:
1876     return "TSS";
1877     case SSH_CIPHER_BLOWFISH:
1878     return "Blowfish";
1879    
1880     // for SSH2(yutaka)
1881     case SSH_CIPHER_AES128:
1882     return "AES128(SSH2)";
1883     case SSH_CIPHER_3DES_CBC:
1884     return "3DES-CBC(SSH2)";
1885    
1886     default:
1887     return NULL;
1888     }
1889     }
1890    
1891     static void set_move_button_status(HWND dlg)
1892     {
1893     HWND cipherControl = GetDlgItem(dlg, IDC_SSHCIPHERPREFS);
1894     int curPos = (int) SendMessage(cipherControl, LB_GETCURSEL, 0, 0);
1895     int maxPos = (int) SendMessage(cipherControl, LB_GETCOUNT, 0, 0) - 1;
1896    
1897 maya 3003 EnableWindow(GetDlgItem(dlg, IDC_SSHMOVECIPHERUP),
1898     curPos > 0 && curPos <= maxPos);
1899     EnableWindow(GetDlgItem(dlg, IDC_SSHMOVECIPHERDOWN),
1900     curPos >= 0 && curPos < maxPos);
1901 yutakakn 2728 }
1902    
1903     static void init_setup_dlg(PTInstVar pvar, HWND dlg)
1904     {
1905     HWND compressionControl = GetDlgItem(dlg, IDC_SSHCOMPRESSIONLEVEL);
1906     HWND cipherControl = GetDlgItem(dlg, IDC_SSHCIPHERPREFS);
1907     int i;
1908     int ch;
1909 maya 2994 char uimsg[MAX_UIMSG];
1910 maya 2937
1911 maya 2994 GetWindowText(dlg, uimsg, sizeof(uimsg));
1912     UTIL_get_lang_msg("DLG_SSHSETUP_TITLE", pvar, uimsg);
1913 maya 2937 SetWindowText(dlg, pvar->ts->UIMsg);
1914 maya 2994 GetDlgItemText(dlg, IDC_COMPRESSLABEL, uimsg, sizeof(uimsg));
1915     UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS", pvar, uimsg);
1916 maya 2937 SetDlgItemText(dlg, IDC_COMPRESSLABEL, pvar->ts->UIMsg);
1917 maya 2994 GetDlgItemText(dlg, IDC_COMPRESSNONE, uimsg, sizeof(uimsg));
1918     UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS_NONE", pvar, uimsg);
1919 maya 2937 SetDlgItemText(dlg, IDC_COMPRESSNONE, pvar->ts->UIMsg);
1920 maya 2994 GetDlgItemText(dlg, IDC_COMPRESSHIGH, uimsg, sizeof(uimsg));
1921     UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS_HIGHEST", pvar, uimsg);
1922 maya 2937 SetDlgItemText(dlg, IDC_COMPRESSHIGH, pvar->ts->UIMsg);
1923 maya 2994 GetDlgItemText(dlg, IDC_CIPHERORDER, uimsg, sizeof(uimsg));
1924     UTIL_get_lang_msg("DLG_SSHSETUP_CHIPER", pvar, uimsg);
1925 maya 2937 SetDlgItemText(dlg, IDC_CIPHERORDER, pvar->ts->UIMsg);
1926 maya 2994 GetDlgItemText(dlg, IDC_SSHMOVECIPHERUP, uimsg, sizeof(uimsg));
1927     UTIL_get_lang_msg("DLG_SSHSETUP_CHIPER_UP", pvar, uimsg);
1928 maya 2937 SetDlgItemText(dlg, IDC_SSHMOVECIPHERUP, pvar->ts->UIMsg);
1929 maya 2994 GetDlgItemText(dlg, IDC_SSHMOVECIPHERDOWN, uimsg, sizeof(uimsg));
1930     UTIL_get_lang_msg("DLG_SSHSETUP_CHIPER_DOWN", pvar, uimsg);
1931 maya 2937 SetDlgItemText(dlg, IDC_SSHMOVECIPHERDOWN, pvar->ts->UIMsg);
1932 maya 2994 GetDlgItemText(dlg, IDC_KNOWNHOSTS, uimsg, sizeof(uimsg));
1933     UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST", pvar, uimsg);
1934 maya 2937 SetDlgItemText(dlg, IDC_KNOWNHOSTS, pvar->ts->UIMsg);
1935 maya 2994 GetDlgItemText(dlg, IDC_CHOOSEREADWRITEFILE, uimsg, sizeof(uimsg));
1936     UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST_RW", pvar, uimsg);
1937 maya 2937 SetDlgItemText(dlg, IDC_CHOOSEREADWRITEFILE, pvar->ts->UIMsg);
1938 maya 2994 GetDlgItemText(dlg, IDC_CHOOSEREADONLYFILE, uimsg, sizeof(uimsg));
1939     UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST_RO", pvar, uimsg);
1940 maya 2937 SetDlgItemText(dlg, IDC_CHOOSEREADONLYFILE, pvar->ts->UIMsg);
1941 maya 2994 GetDlgItemText(dlg, IDC_HEARTBEATLABEL, uimsg, sizeof(uimsg));
1942     UTIL_get_lang_msg("DLG_SSHSETUP_HEARTBEAT", pvar, uimsg);
1943 maya 2937 SetDlgItemText(dlg, IDC_HEARTBEATLABEL, pvar->ts->UIMsg);
1944 maya 2994 GetDlgItemText(dlg, IDC_HEARTBEATLABEL2, uimsg, sizeof(uimsg));
1945     UTIL_get_lang_msg("DLG_SSHSETUP_HEARTBEAT_UNIT", pvar, uimsg);
1946 maya 2937 SetDlgItemText(dlg, IDC_HEARTBEATLABEL2, pvar->ts->UIMsg);
1947 maya 2994 GetDlgItemText(dlg, IDC_NOTICEBANNER, uimsg, sizeof(uimsg));
1948     UTIL_get_lang_msg("DLG_SSHSETUP_NOTICE", pvar, uimsg);
1949 maya 2937 SetDlgItemText(dlg, IDC_NOTICEBANNER, pvar->ts->UIMsg);
1950 maya 3002 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1951 maya 2994 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1952 maya 2937 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1953 maya 3002 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1954 maya 2994 UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
1955 maya 2937 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1956    
1957 yutakakn 2728 SendMessage(compressionControl, TBM_SETRANGE, TRUE, MAKELONG(0, 9));
1958     SendMessage(compressionControl, TBM_SETPOS, TRUE,
1959 maya 3003 pvar->settings.CompressionLevel);
1960 yutakakn 2728
1961     normalize_cipher_order(pvar->settings.CipherOrder);
1962    
1963     for (i = 0; pvar->settings.CipherOrder[i] != 0; i++) {
1964     int cipher = pvar->settings.CipherOrder[i] - '0';
1965     char FAR *name = get_cipher_name(cipher);
1966    
1967     if (name != NULL) {
1968     SendMessage(cipherControl, LB_ADDSTRING, 0, (LPARAM) name);
1969     }
1970     }
1971    
1972     SendMessage(cipherControl, LB_SETCURSEL, 0, 0);
1973     set_move_button_status(dlg);
1974    
1975     for (i = 0; (ch = pvar->settings.KnownHostsFiles[i]) != 0 && ch != ';';
1976     i++) {
1977     }
1978     if (ch != 0) {
1979     pvar->settings.KnownHostsFiles[i] = 0;
1980     SetDlgItemText(dlg, IDC_READWRITEFILENAME,
1981 maya 3003 pvar->settings.KnownHostsFiles);
1982 yutakakn 2728 pvar->settings.KnownHostsFiles[i] = ch;
1983     SetDlgItemText(dlg, IDC_READONLYFILENAME,
1984 maya 3003 pvar->settings.KnownHostsFiles + i + 1);
1985 yutakakn 2728 } else {
1986     SetDlgItemText(dlg, IDC_READWRITEFILENAME,
1987 maya 3003 pvar->settings.KnownHostsFiles);
1988 yutakakn 2728 }
1989 yutakakn 2789
1990     // SSH2 HeartBeat(keep-alive)������ (2005.2.22 yutaka)
1991     {
1992     char buf[10];
1993 maya 2992 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
1994 maya 3003 "%d", pvar->settings.ssh_heartbeat_overtime);
1995 yutakakn 2789 SetDlgItemText(dlg, IDC_HEARTBEAT_EDIT, buf);
1996     }
1997    
1998 yutakakn 2728 }
1999    
2000     void get_teraterm_dir_relative_name(char FAR * buf, int bufsize,
2001 maya 3003 char FAR * basename)
2002 yutakakn 2728 {
2003     int filename_start = 0;
2004     int i;
2005     int ch;
2006    
2007     if (basename[0] == '\\' || basename[0] == '/'
2008 maya 3003 || (basename[0] != 0 && basename[1] == ':')) {
2009 maya 2992 strncpy_s(buf, bufsize, basename, _TRUNCATE);
2010 yutakakn 2728 return;
2011     }
2012    
2013     GetModuleFileName(NULL, buf, bufsize);
2014     for (i = 0; (ch = buf[i]) != 0; i++) {
2015     if (ch == '\\' || ch == '/' || ch == ':') {
2016     filename_start = i + 1;
2017     }
2018     }
2019    
2020     if (bufsize > filename_start) {
2021 maya 2992 strncpy_s(buf + filename_start, bufsize - filename_start, basename, _TRUNCATE);
2022 yutakakn 2728 }
2023     }
2024    
2025     int copy_teraterm_dir_relative_path(char FAR * dest, int destsize,
2026 maya 3003 char FAR * basename)
2027 yutakakn 2728 {
2028     char buf[1024];
2029     int filename_start = 0;
2030     int i;
2031     int ch, ch2;
2032    
2033     if (basename[0] != '\\' && basename[0] != '/'
2034 maya 3003 && (basename[0] == 0 || basename[1] != ':')) {
2035 maya 2992 strncpy_s(dest, destsize, basename, _TRUNCATE);
2036 yutakakn 2728 return strlen(dest);
2037     }
2038    
2039     GetModuleFileName(NULL, buf, sizeof(buf));
2040     for (i = 0; (ch = buf[i]) != 0; i++) {
2041     if (ch == '\\' || ch == '/' || ch == ':') {
2042     filename_start = i + 1;
2043     }
2044     }
2045    
2046     for (i = 0; i < filename_start; i++) {
2047     ch = toupper(buf[i]);
2048     ch2 = toupper(basename[i]);
2049    
2050 maya 3003 if (ch == ch2 ||
2051     ((ch == '\\' || ch == '/') && (ch2 == '\\' || ch2 == '/'))) {
2052 yutakakn 2728 } else {
2053     break;
2054     }
2055     }
2056    
2057     if (i == filename_start) {
2058 maya 2992 strncpy_s(dest, destsize, basename + i, _TRUNCATE);
2059 yutakakn 2728 } else {
2060 maya 2992 strncpy_s(dest, destsize, basename, _TRUNCATE);
2061 yutakakn 2728 }
2062     return strlen(dest);
2063     }
2064    
2065     static void complete_setup_dlg(PTInstVar pvar, HWND dlg)
2066     {
2067     char buf[4096];
2068     char buf2[1024];
2069     HWND compressionControl = GetDlgItem(dlg, IDC_SSHCOMPRESSIONLEVEL);
2070     HWND cipherControl = GetDlgItem(dlg, IDC_SSHCIPHERPREFS);
2071     int i, j, buf2index, bufindex;
2072     int count = (int) SendMessage(cipherControl, LB_GETCOUNT, 0, 0);
2073    
2074     pvar->settings.CompressionLevel =
2075     (int) SendMessage(compressionControl, TBM_GETPOS, 0, 0);
2076    
2077     buf2index = 0;
2078     for (i = 0; i < count; i++) {
2079     int len = SendMessage(cipherControl, LB_GETTEXTLEN, i, 0);
2080    
2081     if (len > 0 && len < sizeof(buf)) { /* should always be true */
2082     buf[0] = 0;
2083     SendMessage(cipherControl, LB_GETTEXT, i, (LPARAM) buf);
2084     for (j = 0;
2085     j <= SSH_CIPHER_MAX
2086     && strcmp(buf, get_cipher_name(j)) != 0; j++) {
2087     }
2088     if (j <= SSH_CIPHER_MAX) {
2089     buf2[buf2index] = '0' + j;
2090     buf2index++;
2091     }
2092     }
2093     }
2094     buf2[buf2index] = 0;
2095     normalize_cipher_order(buf2);
2096 maya 2992 strncpy_s(pvar->settings.CipherOrder, sizeof(pvar->settings.CipherOrder), buf2, _TRUNCATE);
2097 yutakakn 2728
2098     buf[0] = 0;
2099     GetDlgItemText(dlg, IDC_READWRITEFILENAME, buf, sizeof(buf));
2100     j = copy_teraterm_dir_relative_path(pvar->settings.KnownHostsFiles,
2101 maya 3003 sizeof(pvar->settings.KnownHostsFiles),
2102     buf);
2103 yutakakn 2728 buf[0] = 0;
2104     bufindex = 0;
2105     GetDlgItemText(dlg, IDC_READONLYFILENAME, buf, sizeof(buf));
2106     for (i = 0; buf[i] != 0; i++) {
2107     if (buf[i] == ';') {
2108     buf[i] = 0;
2109     if (j < sizeof(pvar->settings.KnownHostsFiles) - 1) {
2110     pvar->settings.KnownHostsFiles[j] = ';';
2111     j++;
2112     j += copy_teraterm_dir_relative_path(pvar->settings.
2113     KnownHostsFiles + j,
2114     sizeof(pvar->settings.
2115     KnownHostsFiles)
2116     - j, buf + bufindex);
2117     }
2118     bufindex = i + 1;
2119     }
2120     }
2121     if (bufindex < i && j < sizeof(pvar->settings.KnownHostsFiles) - 1) {
2122     pvar->settings.KnownHostsFiles[j] = ';';
2123     j++;
2124     copy_teraterm_dir_relative_path(pvar->settings.KnownHostsFiles + j,
2125 maya 3003 sizeof(pvar->settings. KnownHostsFiles) - j,
2126     buf + bufindex);
2127 yutakakn 2728 }
2128 yutakakn 2789
2129     // get SSH HeartBeat(keep-alive)
2130     SendMessage(GetDlgItem(dlg, IDC_HEARTBEAT_EDIT), WM_GETTEXT, sizeof(buf), (LPARAM)buf);
2131     i = atoi(buf);
2132     if (i < 0)
2133     i = 60;
2134     pvar->settings.ssh_heartbeat_overtime = i;
2135    
2136 yutakakn 2728 }
2137    
2138     static void move_cur_sel_delta(HWND listbox, int delta)
2139