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 3010 - (hide annotations) (download) (as text)
Wed Sep 5 14:51:28 2007 UTC (16 years, 7 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 109935 byte(s)
接続ダイアログのホスト名ドロップダウンにおいて、Ctrl+b/Ctrl+f をサポートした。

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