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 3168 - (hide annotations) (download) (as text)
Fri Nov 21 18:54:22 2008 UTC (15 years, 4 months ago) by doda
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 118598 byte(s)
SSH2 の共通鍵暗号として Arcfour をサポート (yasuhide) [Ttssh2-devel 1250]

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