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 3163 - (hide annotations) (download) (as text)
Wed Nov 19 14:00:14 2008 UTC (15 years, 4 months ago) by doda
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 118318 byte(s)
GET_VER()を削除。

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