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 3045 - (hide annotations) (download) (as text)
Thu Oct 18 03:49:39 2007 UTC (16 years, 5 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 111383 byte(s)
SSH2 の暗号化方式として Blowfish をサポートしたい。

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