Develop and Download Open Source Software

Browse Subversion Repository

Contents of /branches/ssh_chacha20poly1305/ttssh2/ttxssh/ttxssh.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 7648 - (show annotations) (download) (as text)
Mon May 6 13:41:50 2019 UTC (4 years, 11 months ago) by zmatsuo
Original Path: trunk/ttssh2/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 185877 byte(s)
ttxsshのlogprintf()とlogprintf_hexdump()の引数チェックを強化
可変引数関数にattributeを追加
1 /*
2 * Copyright (c) 1998-2001, Robert O'Callahan
3 * (C) 2004-2019 TeraTerm Project
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30 /* Tera Term extension mechanism
31 Robert O'Callahan (roc+tt@cs.cmu.edu)
32
33 Tera Term by Takashi Teranishi (teranishi@rikaxp.riken.go.jp)
34 */
35
36 #include "teraterm_conf.h"
37 #include "ttxssh.h"
38 #include "fwdui.h"
39 #include "util.h"
40 #include "ssh.h"
41 #include "ttcommon.h"
42 #include "ttlib.h"
43 #include "keyfiles.h"
44 #include "arc4random.h"
45 #include "auth.h"
46
47 #include <stdlib.h>
48 #include <stdio.h>
49 #include <string.h>
50 #include <io.h>
51 #include <fcntl.h>
52 #include <sys/stat.h>
53 #include <time.h>
54 #include <mbstring.h>
55
56 #include "resource.h"
57 #include <commctrl.h>
58 #include <commdlg.h>
59 #include <winsock2.h>
60 static char *ProtocolFamilyList[] = { "UNSPEC", "IPv6", "IPv4", NULL };
61
62 #include <lmcons.h>
63
64 // include OpenSSL header file
65 #include <openssl/evp.h>
66 #include <openssl/rsa.h>
67 #include <openssl/dsa.h>
68 #include <openssl/bn.h>
69 #include <openssl/pem.h>
70 #include <openssl/rand.h>
71 #include <openssl/rc4.h>
72 #include <openssl/md5.h>
73
74 // include ZLib header file
75 #include <zlib.h>
76
77 #include "buffer.h"
78 #include "cipher.h"
79 #include "key.h"
80 #include "dlglib.h"
81
82 #include "sftp.h"
83
84 #include "compat_w95.h"
85 #include "compat_win.h"
86
87 #include "libputty.h"
88
89 #undef DialogBoxParam
90 #define DialogBoxParam(p1,p2,p3,p4,p5) \
91 TTDialogBoxParam(p1,p2,p3,p4,p5)
92 #undef EndDialog
93 #define EndDialog(p1,p2) \
94 TTEndDialog(p1, p2)
95
96 #define MATCH_STR(s, o) strncmp((s), (o), NUM_ELEM(o) - 1)
97 #define MATCH_STR_I(s, o) _strnicmp((s), (o), NUM_ELEM(o) - 1)
98
99 /* This extension implements SSH, so we choose a load order in the
100 "protocols" range. */
101 #define ORDER 2500
102
103 static HICON SecureLargeIcon = NULL;
104 static HICON SecureSmallIcon = NULL;
105 static HICON SecureNotifyIcon = NULL;
106 static HICON OldNotifyIcon = NULL;
107
108 //static HFONT DlgHostFont;
109 //static HFONT DlgAboutFont;
110 static HFONT DlgAboutTextFont;
111 //static HFONT DlgSetupFont;
112 //static HFONT DlgKeygenFont;
113
114 static TInstVar *pvar;
115
116 typedef struct {
117 int cnt;
118 HWND dlg;
119 ssh_keytype type;
120 } cbarg_t;
121
122 /* WIN32 allows multiple instances of a DLL */
123 static TInstVar InstVar;
124
125 /*
126 This code makes lots of assumptions about the order in which Tera Term
127 does things, and how. A key assumption is that the Notification window
128 passed into WSAAsyncSelect is the main terminal window. We also assume
129 that the socket used in the first WSAconnect is the main session socket.
130 */
131
132 static void init_TTSSH(PTInstVar pvar)
133 {
134 pvar->socket = INVALID_SOCKET;
135 pvar->OldLargeIcon = NULL;
136 pvar->OldSmallIcon = NULL;
137 pvar->NotificationWindow = NULL;
138 pvar->hostdlg_activated = FALSE;
139 pvar->socket = INVALID_SOCKET;
140 pvar->NotificationWindow = NULL;
141 pvar->protocol_major = 0;
142 pvar->protocol_minor = 0;
143
144 PKT_init(pvar);
145 SSH_init(pvar);
146 CRYPT_init(pvar);
147 AUTH_init(pvar);
148 HOSTS_init(pvar);
149 FWD_init(pvar);
150 FWDUI_init(pvar);
151
152 ssh_heartbeat_lock_initialize();
153 }
154
155 static void uninit_TTSSH(PTInstVar pvar)
156 {
157 halt_ssh_heartbeat_thread(pvar);
158
159 ssh2_channel_free();
160
161 SSH_end(pvar);
162 PKT_end(pvar);
163 AUTH_end(pvar);
164 CRYPT_end(pvar);
165 HOSTS_end(pvar);
166 FWD_end(pvar);
167 FWDUI_end(pvar);
168
169 if (pvar->OldLargeIcon != NULL) {
170 PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_BIG,
171 (LPARAM) pvar->OldLargeIcon);
172 pvar->OldLargeIcon = NULL;
173 }
174 if (pvar->OldSmallIcon != NULL) {
175 PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_SMALL,
176 (LPARAM) pvar->OldSmallIcon);
177 pvar->OldSmallIcon = NULL;
178 }
179 if (OldNotifyIcon) {
180 SetCustomNotifyIcon(OldNotifyIcon);
181 }
182
183 ssh_heartbeat_lock_finalize();
184 }
185
186 static void PASCAL TTXInit(PTTSet ts, PComVar cv)
187 {
188 pvar->settings = *pvar->ts_SSH;
189 pvar->ts = ts;
190 pvar->cv = cv;
191 pvar->fatal_error = FALSE;
192 pvar->showing_err = FALSE;
193 pvar->err_msg = NULL;
194
195 init_TTSSH(pvar);
196 }
197
198 static void normalize_generic_order(char *buf, char default_strings[], int default_strings_len)
199 {
200 char listed[max(KEX_DH_MAX,max(SSH_CIPHER_MAX,max(KEY_MAX,max(HMAC_MAX,COMP_MAX)))) + 1];
201 char allowed[max(KEX_DH_MAX,max(SSH_CIPHER_MAX,max(KEY_MAX,max(HMAC_MAX,COMP_MAX)))) + 1];
202 int i, j, k=-1;
203
204 memset(listed, 0, sizeof(listed));
205 memset(allowed, 0, sizeof(allowed));
206
207 // �����������������������X�g�������B
208 for (i = 0; i < default_strings_len ; i++) {
209 allowed[default_strings[i]] = 1;
210 }
211
212 // �w�����������������������A���������������������A�d���������������������B
213 //
214 // ex. (i=5 ����������������)
215 // i=012345
216 // >:=9<87;A@?B3026(\0)
217 // i+1
218 // <------------>
219 // ��
220 // >:=9<7;A@?B3026(\0)
221 //
222 for (i = 0; buf[i] != 0; i++) {
223 int num = buf[i] - '0';
224
225 if (num < 0 || num > default_strings_len
226 || !allowed[num]
227 || listed[num]) {
228 memmove(buf + i, buf + i + 1, strlen(buf + i + 1) + 1);
229 i--;
230 } else {
231 listed[num] = 1;
232 }
233
234 // disabled line���������A���u���o���������B
235 if (num == 0) {
236 k = i;
237 }
238 }
239
240 // �w���������������������������Adisabled line�����O���}�������B
241 //
242 // ex. (Z���}������)
243 // k
244 // >:=9<87;A@?B3026(\0)
245 // k+1
246 // <---->
247 // �� k
248 // >:=9<87;A@?B30026(\0)
249 // �� k
250 // >:=9<87;A@?B3Z026(\0)
251 //
252 for (j = 0; j < default_strings_len && default_strings[j] != 0; j++) {
253 int num = default_strings[j];
254
255 if (!listed[num] && k >= 0) {
256 int copylen = strlen(buf + k + 1) + 1;
257
258 memmove(buf + k + 1, buf + k, copylen);
259 buf[k + 1 + copylen] = '\0'; // �I�[���Y�������t�����B
260 buf[k] = num + '0';
261 k++;
262 i++;
263 }
264 }
265 if (k < 0) {
266 j = 0;
267 }
268 else {
269 j++;
270 }
271
272 // disabled line�������������������A�����������������������B
273 for (; j < default_strings_len ; j++) {
274 int num = default_strings[j];
275
276 if (!listed[num]) {
277 buf[i] = num + '0';
278 listed[num] = 1;
279 i++;
280 }
281 }
282
283 buf[i] = 0;
284 }
285
286 /*
287 * Remove unsupported cipher or duplicated cipher.
288 * Add unspecified ciphers at the end of list.
289 */
290 static void normalize_cipher_order(char *buf)
291 {
292 /* SSH_CIPHER_NONE means that all ciphers below that one are disabled.
293 We *never* allow no encryption. */
294 static char default_strings[] = {
295 SSH2_CIPHER_AES256_GCM,
296 SSH2_CIPHER_CAMELLIA256_CTR,
297 SSH2_CIPHER_AES256_CTR,
298 SSH2_CIPHER_CAMELLIA256_CBC,
299 SSH2_CIPHER_AES256_CBC,
300 SSH2_CIPHER_CAMELLIA192_CTR,
301 SSH2_CIPHER_AES192_CTR,
302 SSH2_CIPHER_CAMELLIA192_CBC,
303 SSH2_CIPHER_AES192_CBC,
304 SSH2_CIPHER_AES128_GCM,
305 SSH2_CIPHER_CAMELLIA128_CTR,
306 SSH2_CIPHER_AES128_CTR,
307 SSH2_CIPHER_CAMELLIA128_CBC,
308 SSH2_CIPHER_AES128_CBC,
309 SSH2_CIPHER_3DES_CTR,
310 SSH2_CIPHER_3DES_CBC,
311 SSH2_CIPHER_BLOWFISH_CTR,
312 SSH2_CIPHER_BLOWFISH_CBC,
313 SSH2_CIPHER_CAST128_CTR,
314 SSH2_CIPHER_CAST128_CBC,
315 SSH_CIPHER_3DES,
316 SSH_CIPHER_NONE,
317 SSH2_CIPHER_ARCFOUR256,
318 SSH2_CIPHER_ARCFOUR128,
319 SSH2_CIPHER_ARCFOUR,
320 SSH_CIPHER_BLOWFISH,
321 SSH_CIPHER_DES,
322 0, 0, 0 // Dummy for SSH_CIPHER_IDEA, SSH_CIPHER_TSS, SSH_CIPHER_RC4
323 };
324
325 normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings));
326 }
327
328 static void normalize_kex_order(char *buf)
329 {
330 static char default_strings[] = {
331 KEX_ECDH_SHA2_256,
332 KEX_ECDH_SHA2_384,
333 KEX_ECDH_SHA2_521,
334 KEX_DH_GRP18_SHA512,
335 KEX_DH_GRP16_SHA512,
336 KEX_DH_GRP14_SHA256,
337 KEX_DH_GEX_SHA256,
338 KEX_DH_GEX_SHA1,
339 KEX_DH_GRP14_SHA1,
340 KEX_DH_GRP1_SHA1,
341 KEX_DH_NONE,
342 };
343
344 normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings));
345 }
346
347 static void normalize_host_key_order(char *buf)
348 {
349 static char default_strings[] = {
350 KEY_ECDSA256,
351 KEY_ECDSA384,
352 KEY_ECDSA521,
353 KEY_ED25519,
354 KEY_RSA,
355 KEY_DSA,
356 KEY_NONE,
357 };
358
359 normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings));
360 }
361
362 static void normalize_mac_order(char *buf)
363 {
364 static char default_strings[] = {
365 HMAC_SHA2_512_EtM,
366 HMAC_SHA2_256_EtM,
367 HMAC_SHA1_EtM,
368 HMAC_SHA2_512,
369 HMAC_SHA2_256,
370 HMAC_SHA1,
371 HMAC_RIPEMD160_EtM,
372 HMAC_RIPEMD160,
373 HMAC_MD5_EtM,
374 HMAC_MD5,
375 HMAC_NONE,
376 HMAC_SHA1_96_EtM,
377 HMAC_MD5_96_EtM,
378 HMAC_SHA1_96,
379 HMAC_MD5_96,
380 0, // Dummy for HMAC_SHA2_512_96,
381 0, // Dummy for HMAC_SHA2_256_96,
382 };
383
384 normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings));
385 }
386
387 static void normalize_comp_order(char *buf)
388 {
389 static char default_strings[] = {
390 COMP_DELAYED,
391 COMP_ZLIB,
392 COMP_NOCOMP,
393 COMP_NONE,
394 };
395
396 normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings));
397 }
398
399
400 /* Remove local settings from the shared memory block. */
401 static void clear_local_settings(PTInstVar pvar)
402 {
403 pvar->ts_SSH->TryDefaultAuth = FALSE;
404 }
405
406 static BOOL read_BOOL_option(PCHAR fileName, char *keyName, BOOL def)
407 {
408 char buf[1024];
409
410 buf[0] = 0;
411 GetPrivateProfileString("TTSSH", keyName, "", buf, sizeof(buf),
412 fileName);
413 if (buf[0] == 0) {
414 return def;
415 } else {
416 return atoi(buf) != 0 ||
417 _stricmp(buf, "yes") == 0 ||
418 _stricmp(buf, "y") == 0;
419 }
420 }
421
422 static void read_string_option(PCHAR fileName, char *keyName,
423 char *def, char *buf, int bufSize)
424 {
425
426 buf[0] = 0;
427 GetPrivateProfileString("TTSSH", keyName, def, buf, bufSize, fileName);
428 }
429
430 static void read_ssh_options(PTInstVar pvar, PCHAR fileName)
431 {
432 char buf[1024];
433 TS_SSH *settings = pvar->ts_SSH;
434
435 #define READ_STD_STRING_OPTION(name) \
436 read_string_option(fileName, #name, "", settings->name, sizeof(settings->name))
437
438 settings->Enabled = read_BOOL_option(fileName, "Enabled", FALSE);
439
440 buf[0] = 0;
441 GetPrivateProfileString("TTSSH", "Compression", "", buf, sizeof(buf),
442 fileName);
443 settings->CompressionLevel = atoi(buf);
444 if (settings->CompressionLevel < 0 || settings->CompressionLevel > 9) {
445 settings->CompressionLevel = 0;
446 }
447
448 READ_STD_STRING_OPTION(DefaultUserName);
449 settings->DefaultUserType = GetPrivateProfileInt("TTSSH", "DefaultUserType", 1, fileName);
450
451 READ_STD_STRING_OPTION(DefaultForwarding);
452 READ_STD_STRING_OPTION(DefaultRhostsLocalUserName);
453 READ_STD_STRING_OPTION(DefaultRhostsHostPrivateKeyFile);
454 READ_STD_STRING_OPTION(DefaultRSAPrivateKeyFile);
455
456 READ_STD_STRING_OPTION(CipherOrder);
457 normalize_cipher_order(settings->CipherOrder);
458
459 // KEX order
460 READ_STD_STRING_OPTION(KexOrder);
461 normalize_kex_order(settings->KexOrder);
462 // Host Key algorithm order
463 READ_STD_STRING_OPTION(HostKeyOrder);
464 normalize_host_key_order(settings->HostKeyOrder);
465 // HMAC order
466 READ_STD_STRING_OPTION(MacOrder);
467 normalize_mac_order(settings->MacOrder);
468 // Compression algorithm order
469 READ_STD_STRING_OPTION(CompOrder);
470 normalize_comp_order(settings->CompOrder);
471
472 read_string_option(fileName, "KnownHostsFiles", "ssh_known_hosts",
473 settings->KnownHostsFiles,
474 sizeof(settings->KnownHostsFiles));
475
476 buf[0] = 0;
477 GetPrivateProfileString("TTSSH", "DefaultAuthMethod", "", buf,
478 sizeof(buf), fileName);
479 settings->DefaultAuthMethod = atoi(buf);
480 if (settings->DefaultAuthMethod != SSH_AUTH_PASSWORD
481 && settings->DefaultAuthMethod != SSH_AUTH_RSA
482 && settings->DefaultAuthMethod != SSH_AUTH_TIS // add (2005.3.12 yutaka)
483 && settings->DefaultAuthMethod != SSH_AUTH_RHOSTS
484 && settings->DefaultAuthMethod != SSH_AUTH_PAGEANT) {
485 /* this default can never be SSH_AUTH_RHOSTS_RSA because that is not a
486 selection in the dialog box; SSH_AUTH_RHOSTS_RSA is automatically chosen
487 when the dialog box has rhosts selected and an host private key file
488 is supplied. */
489 settings->DefaultAuthMethod = SSH_AUTH_PASSWORD;
490 }
491
492 buf[0] = 0;
493 GetPrivateProfileString("TTSSH", "LogLevel", "", buf, sizeof(buf),
494 fileName);
495 settings->LogLevel = atoi(buf);
496
497 buf[0] = 0;
498 GetPrivateProfileString("TTSSH", "WriteBufferSize", "", buf,
499 sizeof(buf), fileName);
500 settings->WriteBufferSize = atoi(buf);
501 if (settings->WriteBufferSize <= 0) {
502 settings->WriteBufferSize = (PACKET_MAX_SIZE / 2); // 2MB
503 }
504
505 // SSH protocol version (2004.10.11 yutaka)
506 // default is SSH2 (2004.11.30 yutaka)
507 settings->ssh_protocol_version = GetPrivateProfileInt("TTSSH", "ProtocolVersion", 2, fileName);
508
509 // SSH heartbeat time(second) (2004.12.11 yutaka)
510 settings->ssh_heartbeat_overtime = GetPrivateProfileInt("TTSSH", "HeartBeat", 60, fileName);
511
512 // �p�X���[�h�F�����������J���F�����g���p�X���[�h����������������������������������
513 // �\���B(2006.8.5 yutaka)
514 settings->remember_password = GetPrivateProfileInt("TTSSH", "RememberPassword", 1, fileName);
515
516 // �������F���_�C�A���O���T�|�[�g�������������\�b�h���`�F�b�N���A
517 // ���������\�b�h���O���C�A�E�g���� (2007.9.24 maya)
518 settings->CheckAuthListFirst = read_BOOL_option(fileName, "CheckAuthListFirst", FALSE);
519
520 // 768bit ������ RSA ���������T�[�o�����������L�������� (2008.9.11 maya)
521 settings->EnableRsaShortKeyServer = read_BOOL_option(fileName, "EnableRsaShortKeyServer", FALSE);
522
523 // agent forward ���L�������� (2008.11.25 maya)
524 settings->ForwardAgent = read_BOOL_option(fileName, "ForwardAgent", FALSE);
525
526 // agent forward �m�F���L��������
527 settings->ForwardAgentConfirm = read_BOOL_option(fileName, "ForwardAgentConfirm", TRUE);
528
529 // agent forward �m�F���L��������
530 settings->ForwardAgentNotify = read_BOOL_option(fileName, "ForwardAgentNotify", TRUE);
531
532 // �z�X�g���� DNS �����`�F�b�N (RFC 4255)
533 settings->VerifyHostKeyDNS = read_BOOL_option(fileName, "VerifyHostKeyDNS", TRUE);
534
535 // icon
536 GetPrivateProfileString("TTSSH", "SSHIcon", "", buf, sizeof(buf), fileName);
537 if ((_stricmp(buf, "old") == 0) ||
538 (_stricmp(buf, "yellow") == 0) ||
539 (_stricmp(buf, "securett_yellow") == 0)) {
540 settings->IconID = IDI_SECURETT_YELLOW;
541 }
542 else if ((_stricmp(buf, "green") == 0) ||
543 (_stricmp(buf, "securett_green") == 0)) {
544 settings->IconID = IDI_SECURETT_GREEN;
545 }
546 else {
547 settings->IconID = IDI_SECURETT;
548 }
549
550 // �G���[�������x�������|�b�v�A�b�v���b�Z�[�W���}�~���� (2014.6.26 yutaka)
551 settings->DisablePopupMessage = GetPrivateProfileInt("TTSSH", "DisablePopupMessage", 0, fileName);
552
553 READ_STD_STRING_OPTION(X11Display);
554
555 settings->UpdateHostkeys = GetPrivateProfileInt("TTSSH", "UpdateHostkeys", 0, fileName);
556
557 settings->GexMinimalGroupSize = GetPrivateProfileInt("TTSSH", "GexMinimalGroupSize", 0, fileName);
558
559 settings->AuthBanner = GetPrivateProfileInt("TTSSH", "AuthBanner", 1, fileName);
560
561 clear_local_settings(pvar);
562 }
563
564 static void write_ssh_options(PTInstVar pvar, PCHAR fileName,
565 TS_SSH *settings, BOOL copy_forward)
566 {
567 char buf[1024];
568
569 WritePrivateProfileString("TTSSH", "Enabled",
570 settings->Enabled ? "1" : "0", fileName);
571
572 _itoa(settings->CompressionLevel, buf, 10);
573 WritePrivateProfileString("TTSSH", "Compression", buf, fileName);
574
575 _itoa(settings->DefaultUserType, buf, 10);
576 WritePrivateProfileString("TTSSH", "DefaultUserType", buf, fileName);
577 WritePrivateProfileString("TTSSH", "DefaultUserName",
578 settings->DefaultUserName, fileName);
579
580 if (copy_forward) {
581 WritePrivateProfileString("TTSSH", "DefaultForwarding",
582 settings->DefaultForwarding, fileName);
583 }
584
585 WritePrivateProfileString("TTSSH", "CipherOrder",
586 settings->CipherOrder, fileName);
587
588 WritePrivateProfileString("TTSSH", "KexOrder",
589 settings->KexOrder, fileName);
590
591 WritePrivateProfileString("TTSSH", "HostKeyOrder",
592 settings->HostKeyOrder, fileName);
593
594 WritePrivateProfileString("TTSSH", "MacOrder",
595 settings->MacOrder, fileName);
596
597 WritePrivateProfileString("TTSSH", "CompOrder",
598 settings->CompOrder, fileName);
599
600 WritePrivateProfileString("TTSSH", "KnownHostsFiles",
601 settings->KnownHostsFiles, fileName);
602
603 WritePrivateProfileString("TTSSH", "DefaultRhostsLocalUserName",
604 settings->DefaultRhostsLocalUserName,
605 fileName);
606
607 WritePrivateProfileString("TTSSH", "DefaultRhostsHostPrivateKeyFile",
608 settings->DefaultRhostsHostPrivateKeyFile,
609 fileName);
610
611 WritePrivateProfileString("TTSSH", "DefaultRSAPrivateKeyFile",
612 settings->DefaultRSAPrivateKeyFile,
613 fileName);
614
615 _itoa(settings->DefaultAuthMethod, buf, 10);
616 WritePrivateProfileString("TTSSH", "DefaultAuthMethod", buf, fileName);
617
618 _itoa(settings->LogLevel, buf, 10);
619 WritePrivateProfileString("TTSSH", "LogLevel", buf, fileName);
620
621 _itoa(settings->WriteBufferSize, buf, 10);
622 WritePrivateProfileString("TTSSH", "WriteBufferSize", buf, fileName);
623
624 // SSH protocol version (2004.10.11 yutaka)
625 WritePrivateProfileString("TTSSH", "ProtocolVersion",
626 settings->ssh_protocol_version==2 ? "2" : "1",
627 fileName);
628
629 // SSH heartbeat time(second) (2004.12.11 yutaka)
630 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
631 "%d", settings->ssh_heartbeat_overtime);
632 WritePrivateProfileString("TTSSH", "HeartBeat", buf, fileName);
633
634 // Remember password (2006.8.5 yutaka)
635 WritePrivateProfileString("TTSSH", "RememberPassword",
636 settings->remember_password ? "1" : "0",
637 fileName);
638
639 // �������F���_�C�A���O���T�|�[�g�������������\�b�h���`�F�b�N���A
640 // ���������\�b�h���O���C�A�E�g���� (2007.9.24 maya)
641 WritePrivateProfileString("TTSSH", "CheckAuthListFirst",
642 settings->CheckAuthListFirst ? "1" : "0", fileName);
643
644 // 768bit ������ RSA ���������T�[�o�����������L�������� (2008.9.11 maya)
645 WritePrivateProfileString("TTSSH", "EnableRsaShortKeyServer",
646 settings->EnableRsaShortKeyServer ? "1" : "0", fileName);
647
648 // agent forward ���L�������� (2008.11.25 maya)
649 WritePrivateProfileString("TTSSH", "ForwardAgent",
650 settings->ForwardAgent ? "1" : "0", fileName);
651
652 // agent forward �m�F���L��������
653 WritePrivateProfileString("TTSSH", "ForwardAgentConfirm",
654 settings->ForwardAgentConfirm ? "1" : "0", fileName);
655
656 // agent forward ���m���L��������
657 WritePrivateProfileString("TTSSH", "ForwardAgentNotify",
658 settings->ForwardAgentNotify ? "1" : "0", fileName);
659
660 // �z�X�g���� DNS �����`�F�b�N (RFC 4255)
661 WritePrivateProfileString("TTSSH", "VerifyHostKeyDNS",
662 settings->VerifyHostKeyDNS ? "1" : "0", fileName);
663
664 // SSH �A�C�R��
665 if (settings->IconID==IDI_SECURETT_YELLOW) {
666 WritePrivateProfileString("TTSSH", "SSHIcon", "yellow", fileName);
667 }
668 else if (settings->IconID==IDI_SECURETT_GREEN) {
669 WritePrivateProfileString("TTSSH", "SSHIcon", "green", fileName);
670 }
671 else {
672 WritePrivateProfileString("TTSSH", "SSHIcon", "Default", fileName);
673 }
674
675 _itoa(settings->DisablePopupMessage, buf, 10);
676 WritePrivateProfileString("TTSSH", "DisablePopupMessage", buf, fileName);
677
678 WritePrivateProfileString("TTSSH", "X11Display", settings->X11Display, fileName);
679
680 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
681 "%d", settings->UpdateHostkeys);
682 WritePrivateProfileString("TTSSH", "UpdateHostkeys", buf, fileName);
683
684 _itoa_s(settings->GexMinimalGroupSize, buf, sizeof(buf), 10);
685 WritePrivateProfileString("TTSSH", "GexMinimalGroupSize", buf, fileName);
686
687 _itoa_s(settings->AuthBanner, buf, sizeof(buf), 10);
688 WritePrivateProfileString("TTSSH", "AuthBanner", buf, fileName);
689 }
690
691
692 /* find free port in all protocol family */
693 static unsigned short find_local_port(PTInstVar pvar)
694 {
695 int tries;
696 SOCKET connecter;
697 struct addrinfo hints;
698 struct addrinfo *res;
699 struct addrinfo *res0;
700 unsigned short port;
701 char pname[NI_MAXHOST];
702
703 if (pvar->session_settings.DefaultAuthMethod != SSH_AUTH_RHOSTS) {
704 return 0;
705 }
706
707 /* The random numbers here are only used to try to get fresh
708 ports across runs (dangling ports can cause bind errors
709 if we're unlucky). They do not need to be (and are not)
710 cryptographically strong.
711 */
712 srand((unsigned) GetTickCount());
713
714 for (tries = 20; tries > 0; tries--) {
715 memset(&hints, 0, sizeof(hints));
716 hints.ai_family = pvar->ts->ProtocolFamily;
717 hints.ai_flags = AI_PASSIVE;
718 hints.ai_socktype = SOCK_STREAM;
719 port = (unsigned) rand() % 512 + 512;
720 _snprintf_s(pname, sizeof(pname), _TRUNCATE, "%d", (int) port);
721 if (getaddrinfo(NULL, pname, &hints, &res0)) {
722 return 0;
723 /* NOT REACHED */
724 }
725
726 for (res = res0; res; res = res->ai_next) {
727 if (res->ai_family == AF_INET || res->ai_family == AF_INET6)
728 continue;
729
730 connecter =
731 socket(res->ai_family, res->ai_socktype, res->ai_protocol);
732 if (connecter == INVALID_SOCKET) {
733 freeaddrinfo(res0);
734 return 0;
735 }
736
737 if (bind(connecter, res->ai_addr, res->ai_addrlen) !=
738 SOCKET_ERROR) {
739 return port;
740 freeaddrinfo(res0);
741 closesocket(connecter);
742 } else if (WSAGetLastError() != WSAEADDRINUSE) {
743 closesocket(connecter);
744 freeaddrinfo(res0);
745 return 0;
746 }
747
748 closesocket(connecter);
749 }
750 freeaddrinfo(res0);
751 }
752
753 return 0;
754 }
755
756 static int PASCAL TTXconnect(SOCKET s,
757 const struct sockaddr *name,
758 int namelen)
759 {
760 if (pvar->socket == INVALID_SOCKET || pvar->socket != s) {
761 struct sockaddr_storage ss;
762 int len;
763
764 pvar->socket = s;
765
766 memset(&ss, 0, sizeof(ss));
767 switch (pvar->ts->ProtocolFamily) {
768 case AF_INET:
769 len = sizeof(struct sockaddr_in);
770 ((struct sockaddr_in *) &ss)->sin_family = AF_INET;
771 ((struct sockaddr_in *) &ss)->sin_addr.s_addr = INADDR_ANY;
772 ((struct sockaddr_in *) &ss)->sin_port =
773 htons(find_local_port(pvar));
774 break;
775 case AF_INET6:
776 len = sizeof(struct sockaddr_in6);
777 ((struct sockaddr_in6 *) &ss)->sin6_family = AF_INET6;
778 ((struct sockaddr_in6 *) &ss)->sin6_addr = in6addr_any;
779 ((struct sockaddr_in6 *) &ss)->sin6_port =
780 htons(find_local_port(pvar));
781 break;
782 default:
783 /* UNSPEC */
784 len = sizeof(ss);
785 ss.ss_family = AF_UNSPEC;
786 break;
787 }
788
789 bind(s, (struct sockaddr *) &ss, len);
790 }
791
792 return (pvar->Pconnect) (s, name, namelen);
793 }
794
795 static int PASCAL TTXWSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg,
796 long lEvent)
797 {
798 if (s == pvar->socket) {
799 pvar->notification_events = lEvent;
800 pvar->notification_msg = wMsg;
801
802 if (pvar->NotificationWindow == NULL) {
803 pvar->NotificationWindow = hWnd;
804 AUTH_advance_to_next_cred(pvar);
805 }
806 }
807
808 return (pvar->PWSAAsyncSelect) (s, hWnd, wMsg, lEvent);
809 }
810
811 static int PASCAL TTXrecv(SOCKET s, char *buf, int len, int flags)
812 {
813 if (s == pvar->socket) {
814 int ret;
815
816 ssh_heartbeat_lock();
817 ret = PKT_recv(pvar, buf, len);
818 ssh_heartbeat_unlock();
819 return (ret);
820
821 } else {
822 return (pvar->Precv) (s, buf, len, flags);
823 }
824 }
825
826 static int PASCAL TTXsend(SOCKET s, char const *buf, int len,
827 int flags)
828 {
829 if (s == pvar->socket) {
830 ssh_heartbeat_lock();
831 SSH_send(pvar, buf, len);
832 ssh_heartbeat_unlock();
833 return len;
834 } else {
835 return (pvar->Psend) (s, buf, len, flags);
836 }
837 }
838
839 void notify_established_secure_connection(PTInstVar pvar)
840 {
841 int fuLoad = LR_DEFAULTCOLOR;
842
843 if (IsWindowsNT4()) {
844 fuLoad = LR_VGACOLOR;
845 }
846
847 // LoadIcon �������� LoadImage ���g�����������A
848 // 16x16 ���A�C�R���������I�������������������� (2006.8.9 maya)
849 if (SecureLargeIcon == NULL) {
850 SecureLargeIcon = LoadImage(hInst, MAKEINTRESOURCE(pvar->settings.IconID),
851 IMAGE_ICON, 0, 0, fuLoad);
852 }
853 if (SecureSmallIcon == NULL) {
854 SecureSmallIcon = LoadImage(hInst, MAKEINTRESOURCE(pvar->settings.IconID),
855 IMAGE_ICON, 16, 16, fuLoad);
856 }
857
858 if (SecureLargeIcon != NULL && SecureSmallIcon != NULL) {
859 pvar->OldLargeIcon =
860 (HICON) SendMessage(pvar->NotificationWindow, WM_GETICON,
861 ICON_BIG, 0);
862 pvar->OldSmallIcon =
863 (HICON) SendMessage(pvar->NotificationWindow, WM_GETICON,
864 ICON_SMALL, 0);
865
866 PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_BIG,
867 (LPARAM) SecureLargeIcon);
868 PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_SMALL,
869 (LPARAM) SecureSmallIcon);
870 }
871
872 if (IsWindows2000()) {
873 if (SecureNotifyIcon == NULL) {
874 SecureNotifyIcon = LoadImage(hInst, MAKEINTRESOURCE(pvar->settings.IconID),
875 IMAGE_ICON, 0, 0, LR_VGACOLOR | LR_SHARED);
876 }
877 OldNotifyIcon = GetCustomNotifyIcon();
878 SetCustomNotifyIcon(SecureNotifyIcon);
879 }
880
881 logputs(LOG_LEVEL_VERBOSE, "Entering secure mode");
882 }
883
884 void notify_closed_connection(PTInstVar pvar, char *send_msg)
885 {
886 SSH_notify_disconnecting(pvar, send_msg);
887 AUTH_notify_disconnecting(pvar);
888 HOSTS_notify_disconnecting(pvar);
889
890 PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,
891 pvar->socket, MAKELPARAM(FD_CLOSE, 0));
892 }
893
894 static void add_err_msg(PTInstVar pvar, char *msg)
895 {
896 if (pvar->err_msg != NULL) {
897 int buf_len = strlen(pvar->err_msg) + 3 + strlen(msg);
898 char *buf = (char *) malloc(buf_len);
899
900 strncpy_s(buf, buf_len, pvar->err_msg, _TRUNCATE);
901 strncat_s(buf, buf_len, "\n\n", _TRUNCATE);
902 strncat_s(buf, buf_len, msg, _TRUNCATE);
903 free(pvar->err_msg);
904 pvar->err_msg = buf;
905 } else {
906 pvar->err_msg = _strdup(msg);
907 }
908 }
909
910 void notify_nonfatal_error(PTInstVar pvar, char *msg)
911 {
912 if (!pvar->showing_err) {
913 // �������������������m���E�B���h�E�����������A�f�X�N�g�b�v���I�[�i�[������
914 // ���b�Z�[�W�{�b�N�X���o���������B(2006.6.11 yutaka)
915 if (pvar->NotificationWindow == NULL) {
916 UTIL_get_lang_msg("MSG_NONFATAL_ERROR", pvar,
917 "Tera Term: not fatal error");
918 MessageBox(NULL, msg, pvar->ts->UIMsg, MB_OK|MB_ICONINFORMATION);
919 msg[0] = '\0';
920
921 } else {
922 PostMessage(pvar->NotificationWindow, WM_COMMAND,
923 ID_SSHASYNCMESSAGEBOX, 0);
924 }
925 }
926 if (msg[0] != 0) {
927 logputs(LOG_LEVEL_ERROR, msg);
928 add_err_msg(pvar, msg);
929 }
930 }
931
932 void notify_fatal_error(PTInstVar pvar, char *msg, BOOL send_disconnect)
933 {
934 if (msg[0] != 0) {
935 logputs(LOG_LEVEL_FATAL, msg);
936 add_err_msg(pvar, msg);
937 }
938
939 if (!pvar->fatal_error) {
940 pvar->fatal_error = TRUE;
941
942 if (send_disconnect) {
943 SSH_notify_disconnecting(pvar, msg);
944 }
945 AUTH_notify_disconnecting(pvar);
946 HOSTS_notify_disconnecting(pvar);
947
948 PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,
949 pvar->socket, MAKELPARAM(FD_CLOSE,
950 (pvar->PWSAGetLastError) ()));
951 }
952 }
953
954 void logputs(int level, char *msg)
955 {
956 if (level <= pvar->settings.LogLevel) {
957 char buf[4096];
958 int file;
959
960 get_teraterm_dir_relative_name(buf, NUM_ELEM(buf), "TTSSH.LOG");
961 file = _open(buf, _O_RDWR | _O_APPEND | _O_CREAT | _O_TEXT,
962 _S_IREAD | _S_IWRITE);
963
964 if (file >= 0) {
965 char *strtime = mctimelocal("%Y-%m-%d %H:%M:%S.%NZ", TRUE);
966 DWORD processid;
967 char tmp[26];
968
969 _write(file, strtime, strlen(strtime));
970 GetWindowThreadProcessId(pvar->cv->HWin, &processid);
971 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, " [%lu] ",processid);
972 _write(file, tmp, strlen(tmp));
973 _write(file, msg, strlen(msg));
974 _write(file, "\n", 1);
975 _close(file);
976 }
977 }
978 }
979
980 #if defined(_MSC_VER)
981 void logprintf(int level, _Printf_format_string_ const char *fmt, ...)
982 #else
983 void logprintf(int level, const char *fmt, ...)
984 #endif
985 {
986 char buff[4096];
987 va_list params;
988
989 if (level <= pvar->settings.LogLevel) {
990 va_start(params, fmt);
991 vsnprintf_s(buff, sizeof(buff), _TRUNCATE, fmt, params);
992 va_end(params);
993
994 logputs(level, buff);
995 }
996 }
997
998 static void format_line_hexdump(char *buf, int buflen, int addr, int *bytes, int byte_cnt)
999 {
1000 int i, c;
1001 char tmp[128];
1002
1003 buf[0] = 0;
1004
1005 /* �������A�h���X�\�� */
1006 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%08X : ", addr);
1007 strncat_s(buf, buflen, tmp, _TRUNCATE);
1008
1009 /* �o�C�i���\���i4�o�C�g�������������}���j*/
1010 for (i = 0; i < byte_cnt; i++) {
1011 if (i > 0 && i % 4 == 0) {
1012 strncat_s(buf, buflen, " ", _TRUNCATE);
1013 }
1014
1015 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%02X", bytes[i]);
1016 strncat_s(buf, buflen, tmp, _TRUNCATE);
1017 }
1018
1019 /* ASCII�\���������������������� */
1020 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, " %*s%*s", (16 - byte_cnt) * 2 + 1, " ", (16 - byte_cnt + 3) / 4, " ");
1021 strncat_s(buf, buflen, tmp, _TRUNCATE);
1022
1023 /* ASCII�\�� */
1024 for (i = 0; i < byte_cnt; i++) {
1025 c = bytes[i];
1026 if (isprint(c)) {
1027 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%c", c);
1028 strncat_s(buf, buflen, tmp, _TRUNCATE);
1029 }
1030 else {
1031 strncat_s(buf, buflen, ".", _TRUNCATE);
1032 }
1033 }
1034
1035 //strncat_s(buf, buflen, "\n", _TRUNCATE);
1036 }
1037
1038 #if defined(_MSC_VER)
1039 void logprintf_hexdump(int level, const char *data, int len, _Printf_format_string_ const char *fmt, ...)
1040 #else
1041 void logprintf_hexdump(int level, const char *data, int len, const char *fmt, ...)
1042 #endif
1043 {
1044 char buff[4096];
1045 va_list params;
1046 int c, addr;
1047 int bytes[16], *ptr;
1048 int byte_cnt;
1049 int i;
1050
1051 if (level <= pvar->settings.LogLevel) {
1052 va_start(params, fmt);
1053 vsnprintf_s(buff, sizeof(buff), _TRUNCATE, fmt, params);
1054 va_end(params);
1055
1056 logputs(level, buff);
1057
1058 addr = 0;
1059 byte_cnt = 0;
1060 ptr = bytes;
1061 for (i = 0; i < len; i++) {
1062 c = data[i];
1063 *ptr++ = c & 0xff;
1064 byte_cnt++;
1065
1066 if (byte_cnt == 16) {
1067 format_line_hexdump(buff, sizeof(buff), addr, bytes, byte_cnt);
1068 logputs(level, buff);
1069
1070 addr += 16;
1071 byte_cnt = 0;
1072 ptr = bytes;
1073 }
1074 }
1075
1076 if (byte_cnt > 0) {
1077 format_line_hexdump(buff, sizeof(buff), addr, bytes, byte_cnt);
1078 logputs(level, buff);
1079 }
1080 }
1081 }
1082
1083 static void PASCAL TTXOpenTCP(TTXSockHooks *hooks)
1084 {
1085 if (pvar->settings.Enabled) {
1086 // TCPLocalEcho/TCPCRSend ������������ (maya 2007.4.25)
1087 pvar->origDisableTCPEchoCR = pvar->ts->DisableTCPEchoCR;
1088 pvar->ts->DisableTCPEchoCR = TRUE;
1089
1090 pvar->session_settings = pvar->settings;
1091
1092 logputs(LOG_LEVEL_VERBOSE, "---------------------------------------------------------------------");
1093 logputs(LOG_LEVEL_VERBOSE, "Initiating SSH session");
1094
1095 FWDUI_load_settings(pvar);
1096
1097 pvar->cv->TelAutoDetect = FALSE;
1098 /* This next line should not be needed because Tera Term's
1099 CommLib should find ts->Telnet == 0 ... but we'll do this
1100 just to be on the safe side. */
1101 pvar->cv->TelFlag = FALSE;
1102 pvar->cv->TelLineMode = FALSE;
1103
1104 pvar->Precv = *hooks->Precv;
1105 pvar->Psend = *hooks->Psend;
1106 pvar->PWSAAsyncSelect = *hooks->PWSAAsyncSelect;
1107 pvar->Pconnect = *hooks->Pconnect;
1108 pvar->PWSAGetLastError = *hooks->PWSAGetLastError;
1109
1110 *hooks->Precv = TTXrecv;
1111 *hooks->Psend = TTXsend;
1112 *hooks->PWSAAsyncSelect = TTXWSAAsyncSelect;
1113 *hooks->Pconnect = TTXconnect;
1114
1115 SSH_open(pvar);
1116 HOSTS_open(pvar);
1117 FWDUI_open(pvar);
1118
1119 // ������ myproposal �����f���������A�������O�����������B (2006.6.26 maya)
1120 SSH2_update_cipher_myproposal(pvar);
1121 SSH2_update_kex_myproposal(pvar);
1122 SSH2_update_host_key_myproposal(pvar);
1123 SSH2_update_hmac_myproposal(pvar);
1124 SSH2_update_compression_myproposal(pvar);
1125 }
1126 }
1127
1128 static void PASCAL TTXCloseTCP(TTXSockHooks *hooks)
1129 {
1130 if (pvar->session_settings.Enabled) {
1131 pvar->socket = INVALID_SOCKET;
1132
1133 logputs(LOG_LEVEL_VERBOSE, "Terminating SSH session...");
1134
1135 *hooks->Precv = pvar->Precv;
1136 *hooks->Psend = pvar->Psend;
1137 *hooks->PWSAAsyncSelect = pvar->PWSAAsyncSelect;
1138 *hooks->Pconnect = pvar->Pconnect;
1139
1140 pvar->ts->DisableTCPEchoCR = pvar->origDisableTCPEchoCR;
1141 }
1142
1143 uninit_TTSSH(pvar);
1144 init_TTSSH(pvar);
1145 }
1146
1147 static void enable_dlg_items(HWND dlg, int from, int to, BOOL enabled)
1148 {
1149 for (; from <= to; from++) {
1150 EnableWindow(GetDlgItem(dlg, from), enabled);
1151 }
1152 }
1153
1154 // C-p/C-n/C-b/C-f/C-a/C-e ���T�|�[�g (2007.9.5 maya)
1155 // C-d/C-k ���T�|�[�g (2007.10.3 yutaka)
1156 // �h���b�v�_�E���������G�f�B�b�g�R���g���[����
1157 // �T�u�N���X�������������E�C���h�E�v���V�[�W��
1158 WNDPROC OrigHostnameEditProc; // Original window procedure
1159 LRESULT CALLBACK HostnameEditProc(HWND dlg, UINT msg,
1160 WPARAM wParam, LPARAM lParam)
1161 {
1162 HWND parent;
1163 int max, select, len;
1164 char *str, *orgstr;
1165
1166 switch (msg) {
1167 // �L�[�����������������m����
1168 case WM_KEYDOWN:
1169 if (GetKeyState(VK_CONTROL) < 0) {
1170 switch (wParam) {
1171 case 0x50: // Ctrl+p ... up
1172 parent = GetParent(dlg);
1173 select = SendMessage(parent, CB_GETCURSEL, 0, 0);
1174 if (select > 0) {
1175 PostMessage(parent, CB_SETCURSEL, select - 1, 0);
1176 }
1177 return 0;
1178 case 0x4e: // Ctrl+n ... down
1179 parent = GetParent(dlg);
1180 max = SendMessage(parent, CB_GETCOUNT, 0, 0);
1181 select = SendMessage(parent, CB_GETCURSEL, 0, 0);
1182 if (select < max - 1) {
1183 PostMessage(parent, CB_SETCURSEL, select + 1, 0);
1184 }
1185 return 0;
1186 case 0x42: // Ctrl+b ... left
1187 SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
1188 PostMessage(dlg, EM_SETSEL, select-1, select-1);
1189 return 0;
1190 case 0x46: // Ctrl+f ... right
1191 SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
1192 max = GetWindowTextLength(dlg) ;
1193 PostMessage(dlg, EM_SETSEL, select+1, select+1);
1194 return 0;
1195 case 0x41: // Ctrl+a ... home
1196 PostMessage(dlg, EM_SETSEL, 0, 0);
1197 return 0;
1198 case 0x45: // Ctrl+e ... end
1199 max = GetWindowTextLength(dlg) ;
1200 PostMessage(dlg, EM_SETSEL, max, max);
1201 return 0;
1202
1203 case 0x44: // Ctrl+d
1204 case 0x4b: // Ctrl+k
1205 case 0x55: // Ctrl+u
1206 SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
1207 max = GetWindowTextLength(dlg);
1208 max++; // '\0'
1209 orgstr = str = malloc(max);
1210 if (str != NULL) {
1211 len = GetWindowText(dlg, str, max);
1212 if (select >= 0 && select < len) {
1213 if (wParam == 0x44) { // �J�[�\���z����������������������
1214 memmove(&str[select], &str[select + 1], len - select - 1);
1215 str[len - 1] = '\0';
1216
1217 } else if (wParam == 0x4b) { // �J�[�\�������s��������������
1218 str[select] = '\0';
1219
1220 }
1221 }
1222
1223 if (wParam == 0x55) { // �J�[�\����������������������
1224 if (select >= len) {
1225 str[0] = '\0';
1226 } else {
1227 str = &str[select];
1228 }
1229 select = 0;
1230 }
1231
1232 SetWindowText(dlg, str);
1233 SendMessage(dlg, EM_SETSEL, select, select);
1234 free(orgstr);
1235 return 0;
1236 }
1237 break;
1238 }
1239 }
1240 break;
1241
1242 // �����L�[��������������������������������������������
1243 case WM_CHAR:
1244 switch (wParam) {
1245 case 0x01:
1246 case 0x02:
1247 case 0x04:
1248 case 0x05:
1249 case 0x06:
1250 case 0x0b:
1251 case 0x0e:
1252 case 0x10:
1253 case 0x15:
1254 return 0;
1255 }
1256 }
1257
1258 return CallWindowProc(OrigHostnameEditProc, dlg, msg, wParam, lParam);
1259 }
1260
1261 static BOOL CALLBACK TTXHostDlg(HWND dlg, UINT msg, WPARAM wParam,
1262 LPARAM lParam)
1263 {
1264 static char *ssh_version[] = {"SSH1", "SSH2", NULL};
1265 PGetHNRec GetHNRec;
1266 char EntName[128];
1267 char TempHost[HostNameMaxLength + 1];
1268 WORD i, j, w;
1269 WORD ComPortTable[MAXCOMPORT];
1270 static char *ComPortDesc[MAXCOMPORT];
1271 int comports;
1272 BOOL Ok;
1273 // LOGFONT logfont;
1274 // HFONT font;
1275 char uimsg[MAX_UIMSG];
1276 static HWND hwndHostname = NULL; // HOSTNAME dropdown
1277 static HWND hwndHostnameEdit = NULL; // Edit control on HOSTNAME dropdown
1278
1279 switch (msg) {
1280 case WM_INITDIALOG:
1281 GetHNRec = (PGetHNRec) lParam;
1282 SetWindowLong(dlg, DWL_USER, lParam);
1283
1284 GetWindowText(dlg, uimsg, sizeof(uimsg));
1285 UTIL_get_lang_msg("DLG_HOST_TITLE", pvar, uimsg);
1286 SetWindowText(dlg, pvar->ts->UIMsg);
1287 GetDlgItemText(dlg, IDC_HOSTNAMELABEL, uimsg, sizeof(uimsg));
1288 UTIL_get_lang_msg("DLG_HOST_TCPIPHOST", pvar, uimsg);
1289 SetDlgItemText(dlg, IDC_HOSTNAMELABEL, pvar->ts->UIMsg);
1290 GetDlgItemText(dlg, IDC_HISTORY, uimsg, sizeof(uimsg));
1291 UTIL_get_lang_msg("DLG_HOST_TCPIPHISTORY", pvar, uimsg);
1292 SetDlgItemText(dlg, IDC_HISTORY, pvar->ts->UIMsg);
1293 GetDlgItemText(dlg, IDC_SERVICELABEL, uimsg, sizeof(uimsg));
1294 UTIL_get_lang_msg("DLG_HOST_TCPIPSERVICE", pvar, uimsg);
1295 SetDlgItemText(dlg, IDC_SERVICELABEL, pvar->ts->UIMsg);
1296 GetDlgItemText(dlg, IDC_HOSTOTHER, uimsg, sizeof(uimsg));
1297 UTIL_get_lang_msg("DLG_HOST_TCPIPOTHER", pvar, uimsg);
1298 SetDlgItemText(dlg, IDC_HOSTOTHER, pvar->ts->UIMsg);
1299 GetDlgItemText(dlg, IDC_HOSTTCPPORTLABEL, uimsg, sizeof(uimsg));
1300 UTIL_get_lang_msg("DLG_HOST_TCPIPPORT", pvar, uimsg);
1301 SetDlgItemText(dlg, IDC_HOSTTCPPORTLABEL, pvar->ts->UIMsg);
1302 GetDlgItemText(dlg, IDC_SSH_VERSION_LABEL, uimsg, sizeof(uimsg));
1303 UTIL_get_lang_msg("DLG_HOST_TCPIPSSHVERSION", pvar, uimsg);
1304 SetDlgItemText(dlg, IDC_SSH_VERSION_LABEL, pvar->ts->UIMsg);
1305 GetDlgItemText(dlg, IDC_HOSTTCPPROTOCOLLABEL, uimsg, sizeof(uimsg));
1306 UTIL_get_lang_msg("DLG_HOST_TCPIPPROTOCOL", pvar, uimsg);
1307 SetDlgItemText(dlg, IDC_HOSTTCPPROTOCOLLABEL, pvar->ts->UIMsg);
1308 GetDlgItemText(dlg, IDC_HOSTSERIAL, uimsg, sizeof(uimsg));
1309 UTIL_get_lang_msg("DLG_HOST_SERIAL", pvar, uimsg);
1310 SetDlgItemText(dlg, IDC_HOSTSERIAL, pvar->ts->UIMsg);
1311 GetDlgItemText(dlg, IDC_HOSTCOMLABEL, uimsg, sizeof(uimsg));
1312 UTIL_get_lang_msg("DLG_HOST_SERIALPORT", pvar, uimsg);
1313 SetDlgItemText(dlg, IDC_HOSTCOMLABEL, pvar->ts->UIMsg);
1314 GetDlgItemText(dlg, IDC_HOSTHELP, uimsg, sizeof(uimsg));
1315 UTIL_get_lang_msg("DLG_HOST_HELP", pvar, uimsg);
1316 SetDlgItemText(dlg, IDC_HOSTHELP, pvar->ts->UIMsg);
1317 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1318 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1319 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1320 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1321 UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
1322 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1323
1324 // �z�X�g�q�X�g�����`�F�b�N�{�b�N�X������ (2005.10.21 yutaka)
1325 if (pvar->ts->HistoryList > 0) {
1326 SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_SETCHECK, BST_CHECKED, 0);
1327 } else {
1328 SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_SETCHECK, BST_UNCHECKED, 0);
1329 }
1330
1331 // �t�@�C�����������O�t���p�C�v�������ATCP/IP�����������B
1332 if (GetHNRec->PortType == IdFile ||
1333 GetHNRec->PortType == IdNamedPipe
1334 )
1335 GetHNRec->PortType = IdTCPIP;
1336
1337 strncpy_s(EntName, sizeof(EntName), "Host", _TRUNCATE);
1338
1339 i = 1;
1340 do {
1341 _snprintf_s(&EntName[4], sizeof(EntName)-4, _TRUNCATE, "%d", i);
1342 GetPrivateProfileString("Hosts", EntName, "",
1343 TempHost, sizeof(TempHost),
1344 GetHNRec->SetupFN);
1345 if (strlen(TempHost) > 0)
1346 SendDlgItemMessage(dlg, IDC_HOSTNAME, CB_ADDSTRING,
1347 0, (LPARAM) TempHost);
1348 i++;
1349 } while (i <= MAXHOSTLIST);
1350
1351 SendDlgItemMessage(dlg, IDC_HOSTNAME, EM_LIMITTEXT,
1352 HostNameMaxLength - 1, 0);
1353
1354 SendDlgItemMessage(dlg, IDC_HOSTNAME, CB_SETCURSEL, 0, 0);
1355
1356 // C-n/C-p ���������T�u�N���X�� (2007.9.4 maya)
1357 hwndHostname = GetDlgItem(dlg, IDC_HOSTNAME);
1358 hwndHostnameEdit = GetWindow(hwndHostname, GW_CHILD);
1359 OrigHostnameEditProc = (WNDPROC)GetWindowLong(hwndHostnameEdit, GWL_WNDPROC);
1360 SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)HostnameEditProc);
1361
1362 CheckRadioButton(dlg, IDC_HOSTTELNET, IDC_HOSTOTHER,
1363 pvar->settings.Enabled ? IDC_HOSTSSH : GetHNRec->
1364 Telnet ? IDC_HOSTTELNET : IDC_HOSTOTHER);
1365 SendDlgItemMessage(dlg, IDC_HOSTTCPPORT, EM_LIMITTEXT, 5, 0);
1366 SetDlgItemInt(dlg, IDC_HOSTTCPPORT, GetHNRec->TCPPort, FALSE);
1367 for (i = 0; ProtocolFamilyList[i]; ++i) {
1368 SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, CB_ADDSTRING,
1369 0, (LPARAM) ProtocolFamilyList[i]);
1370 }
1371 SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, EM_LIMITTEXT,
1372 ProtocolFamilyMaxLength - 1, 0);
1373 SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, CB_SETCURSEL, 0, 0);
1374
1375 /////// SSH version
1376 for (i = 0; ssh_version[i]; ++i) {
1377 SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_ADDSTRING,
1378 0, (LPARAM) ssh_version[i]);
1379 }
1380 SendDlgItemMessage(dlg, IDC_SSH_VERSION, EM_LIMITTEXT,
1381 NUM_ELEM(ssh_version) - 1, 0);
1382
1383 if (pvar->settings.ssh_protocol_version == 1) {
1384 SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_SETCURSEL, 0, 0); // SSH1
1385 } else {
1386 SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_SETCURSEL, 1, 0); // SSH2
1387 }
1388
1389 if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1390 enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE); // enabled
1391 } else {
1392 enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1393 }
1394 /////// SSH version
1395
1396
1397 j = 0;
1398 w = 1;
1399 if ((comports=DetectComPorts(ComPortTable, GetHNRec->MaxComPort, ComPortDesc)) >= 0) {
1400 for (i=0; i<comports; i++) {
1401 // MaxComPort ���z�����|�[�g���\��������
1402 if (ComPortTable[i] > GetHNRec->MaxComPort) {
1403 continue;
1404 }
1405
1406 // �g�p�����|�[�g���\��������
1407 if (CheckCOMFlag(ComPortTable[i]) == 1) {
1408 continue;
1409 }
1410
1411 _snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "COM%d", ComPortTable[i]);
1412 if (ComPortDesc[i] != NULL) {
1413 strncat_s(EntName, sizeof(EntName), ": ", _TRUNCATE);
1414 strncat_s(EntName, sizeof(EntName), ComPortDesc[i], _TRUNCATE);
1415 }
1416 SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,
1417 0, (LPARAM)EntName);
1418 j++;
1419 if (GetHNRec->ComPort == ComPortTable[i])
1420 w = j;
1421 }
1422
1423 } else {
1424 for (i = 1; i <= GetHNRec->MaxComPort; i++) {
1425 // �g�p�����|�[�g���\��������
1426 if (CheckCOMFlag(i) == 1) {
1427 continue;
1428 }
1429
1430 _snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "COM%d", i);
1431 SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,
1432 0, (LPARAM) EntName);
1433 j++;
1434 if (GetHNRec->ComPort == i)
1435 w = j;
1436 }
1437 }
1438
1439 if (j > 0)
1440 SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_SETCURSEL, w - 1, 0);
1441 else { /* All com ports are already used */
1442 GetHNRec->PortType = IdTCPIP;
1443 enable_dlg_items(dlg, IDC_HOSTSERIAL, IDC_HOSTSERIAL, FALSE);
1444 }
1445
1446 CheckRadioButton(dlg, IDC_HOSTTCPIP, IDC_HOSTSERIAL,
1447 IDC_HOSTTCPIP + GetHNRec->PortType - 1);
1448
1449 if (GetHNRec->PortType == IdTCPIP) {
1450 enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, FALSE);
1451
1452 enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE);
1453 enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, TRUE);
1454
1455 enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, TRUE); // enabled
1456 }
1457 else {
1458 enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1459 FALSE);
1460 enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1461 IDC_HOSTTCPPROTOCOL, FALSE);
1462
1463 enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1464 enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, FALSE); // disabled (2004.11.23 yutaka)
1465
1466 enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, FALSE); // disabled
1467 }
1468
1469 // Host dialog���t�H�[�J�X�������� (2004.10.2 yutaka)
1470 if (GetHNRec->PortType == IdTCPIP) {
1471 HWND hwnd = GetDlgItem(dlg, IDC_HOSTNAME);
1472 SetFocus(hwnd);
1473 } else {
1474 HWND hwnd = GetDlgItem(dlg, IDC_HOSTCOM);
1475 SetFocus(hwnd);
1476 }
1477
1478 #if 0
1479 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1480 GetObject(font, sizeof(LOGFONT), &logfont);
1481 if (UTIL_get_lang_font("DLG_SYSTEM_FONT", dlg, &logfont, &DlgHostFont, pvar)) {
1482 SendDlgItemMessage(dlg, IDC_HOSTTCPIP, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1483 SendDlgItemMessage(dlg, IDC_HOSTNAMELABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1484 SendDlgItemMessage(dlg, IDC_HOSTNAME, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1485 SendDlgItemMessage(dlg, IDC_HISTORY, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1486 SendDlgItemMessage(dlg, IDC_SERVICELABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1487 SendDlgItemMessage(dlg, IDC_HOSTTELNET, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1488 SendDlgItemMessage(dlg, IDC_HOSTSSH, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1489 SendDlgItemMessage(dlg, IDC_HOSTOTHER, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1490 SendDlgItemMessage(dlg, IDC_HOSTTCPPORTLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1491 SendDlgItemMessage(dlg, IDC_HOSTTCPPORT, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1492 SendDlgItemMessage(dlg, IDC_SSH_VERSION_LABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1493 SendDlgItemMessage(dlg, IDC_SSH_VERSION, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1494 SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOLLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1495 SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1496 SendDlgItemMessage(dlg, IDC_HOSTSERIAL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1497 SendDlgItemMessage(dlg, IDC_HOSTCOMLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1498 SendDlgItemMessage(dlg, IDC_HOSTCOM, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1499 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1500 SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1501 SendDlgItemMessage(dlg, IDC_HOSTHELP, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1502 }
1503 else {
1504 DlgHostFont = NULL;
1505 }
1506 #endif
1507
1508 CenterWindow(dlg, GetParent(dlg));
1509
1510 // SetFocus()���t�H�[�J�X���������������AFALSE�������K�v�������B
1511 // TRUE���������ATABSTOP�������������������R���g���[�����I�������B
1512 // (2004.11.23 yutaka)
1513 return FALSE;
1514 //return TRUE;
1515
1516 case WM_COMMAND:
1517 switch (LOWORD(wParam)) {
1518 case IDOK:
1519 GetHNRec = (PGetHNRec) GetWindowLong(dlg, DWL_USER);
1520 if (GetHNRec != NULL) {
1521 if (IsDlgButtonChecked(dlg, IDC_HOSTTCPIP)) {
1522 char afstr[BUFSIZ];
1523 i = GetDlgItemInt(dlg, IDC_HOSTTCPPORT, &Ok, FALSE);
1524 if (Ok) {
1525 GetHNRec->TCPPort = i;
1526 } else {
1527 UTIL_get_lang_msg("MSG_TCPPORT_NAN_ERROR", pvar,
1528 "The TCP port must be a number.");
1529 MessageBox(dlg, pvar->ts->UIMsg,
1530 "Tera Term", MB_OK | MB_ICONEXCLAMATION);
1531 return TRUE;
1532 }
1533 #define getaf(str) \
1534 ((strcmp((str), "IPv6") == 0) ? AF_INET6 : \
1535 ((strcmp((str), "IPv4") == 0) ? AF_INET : AF_UNSPEC))
1536 memset(afstr, 0, sizeof(afstr));
1537 GetDlgItemText(dlg, IDC_HOSTTCPPROTOCOL, afstr,
1538 sizeof(afstr));
1539 GetHNRec->ProtocolFamily = getaf(afstr);
1540 GetHNRec->PortType = IdTCPIP;
1541 GetDlgItemText(dlg, IDC_HOSTNAME, GetHNRec->HostName,
1542 HostNameMaxLength);
1543 pvar->hostdlg_activated = TRUE;
1544 pvar->hostdlg_Enabled = FALSE;
1545 if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
1546 GetHNRec->Telnet = TRUE;
1547 } else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1548 pvar->hostdlg_Enabled = TRUE;
1549
1550 // check SSH protocol version
1551 memset(afstr, 0, sizeof(afstr));
1552 GetDlgItemText(dlg, IDC_SSH_VERSION, afstr, sizeof(afstr));
1553 if (_stricmp(afstr, "SSH1") == 0) {
1554 pvar->settings.ssh_protocol_version = 1;
1555 } else {
1556 pvar->settings.ssh_protocol_version = 2;
1557 }
1558 }
1559 else { // IDC_HOSTOTHER
1560 GetHNRec->Telnet = FALSE;
1561 }
1562
1563 // host history check button
1564 if (SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_GETCHECK, 0, 0) == BST_CHECKED) {
1565 pvar->ts->HistoryList = 1;
1566 } else {
1567 pvar->ts->HistoryList = 0;
1568 }
1569
1570 } else {
1571 GetHNRec->PortType = IdSerial;
1572 GetHNRec->HostName[0] = 0;
1573 memset(EntName, 0, sizeof(EntName));
1574 GetDlgItemText(dlg, IDC_HOSTCOM, EntName,
1575 sizeof(EntName) - 1);
1576 if (strncmp(EntName, "COM", 3) == 0 && EntName[3] != '\0') {
1577 GetHNRec->ComPort = atoi(&EntName[3]);
1578 if (GetHNRec->ComPort > GetHNRec->MaxComPort)
1579 GetHNRec->ComPort = 1;
1580 } else {
1581 GetHNRec->ComPort = 1;
1582 }
1583 }
1584 }
1585 SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)OrigHostnameEditProc);
1586 EndDialog(dlg, 1);
1587 #if 0
1588 if (DlgHostFont != NULL) {
1589 DeleteObject(DlgHostFont);
1590 }
1591 #endif
1592 return TRUE;
1593
1594 case IDCANCEL:
1595 SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)OrigHostnameEditProc);
1596 EndDialog(dlg, 0);
1597 #if 0
1598 if (DlgHostFont != NULL) {
1599 DeleteObject(DlgHostFont);
1600 }
1601 #endif
1602 return TRUE;
1603
1604 case IDC_HOSTTCPIP:
1605 enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1606 TRUE);
1607 enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1608 IDC_HOSTTCPPROTOCOL, TRUE);
1609 enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, FALSE);
1610
1611 enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, TRUE); // disabled (2004.11.23 yutaka)
1612 if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1613 enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE);
1614 } else {
1615 enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1616 }
1617
1618 enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, TRUE); // disabled
1619
1620 return TRUE;
1621
1622 case IDC_HOSTSERIAL:
1623 enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, TRUE);
1624 enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1625 FALSE);
1626 enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1627 IDC_HOSTTCPPROTOCOL, FALSE);
1628 enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1629 enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, FALSE); // disabled (2004.11.23 yutaka)
1630
1631 enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, FALSE); // disabled
1632
1633 return TRUE;
1634
1635 case IDC_HOSTSSH:
1636 enable_dlg_items(dlg, IDC_SSH_VERSION,
1637 IDC_SSH_VERSION, TRUE);
1638 goto hostssh_enabled;
1639
1640 case IDC_HOSTTELNET:
1641 case IDC_HOSTOTHER:
1642 enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1643 hostssh_enabled:
1644
1645 GetHNRec = (PGetHNRec) GetWindowLong(dlg, DWL_USER);
1646
1647 if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
1648 if (GetHNRec != NULL)
1649 SetDlgItemInt(dlg, IDC_HOSTTCPPORT, GetHNRec->TelPort,
1650 FALSE);
1651 } else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1652 SetDlgItemInt(dlg, IDC_HOSTTCPPORT, 22, FALSE);
1653 }
1654 return TRUE;
1655
1656 case IDC_HOSTCOM:
1657 if(HIWORD(wParam) == CBN_DROPDOWN) {
1658 HWND hostcom = GetDlgItem(dlg, IDC_HOSTCOM);
1659 int count = SendMessage(hostcom, CB_GETCOUNT, 0, 0);
1660 int i, len, max_len = 0;
1661 char *lbl;
1662 HDC TmpDC = GetDC(hostcom);
1663 SIZE s;
1664 for (i=0; i<count; i++) {
1665 len = SendMessage(hostcom, CB_GETLBTEXTLEN, i, 0);
1666 lbl = (char *)calloc(len+1, sizeof(char));
1667 SendMessage(hostcom, CB_GETLBTEXT, i, (LPARAM)lbl);
1668 GetTextExtentPoint32(TmpDC, lbl, len, &s);
1669 if (s.cx > max_len)
1670 max_len = s.cx;
1671 free(lbl);
1672 }
1673 SendMessage(hostcom, CB_SETDROPPEDWIDTH,
1674 max_len + GetSystemMetrics(SM_CXVSCROLL), 0);
1675 }
1676 break;
1677
1678 case IDC_HOSTHELP:
1679 PostMessage(GetParent(dlg), WM_USER_DLGHELP2, 0, 0);
1680 }
1681 }
1682 return FALSE;
1683 }
1684
1685 static void UTIL_SetDialogFont()
1686 {
1687 SetDialogFont(pvar->ts->SetupFName, pvar->ts->UILanguageFile, "TTSSH", "DLG_TAHOMA_FONT");
1688 }
1689
1690 static BOOL PASCAL TTXGetHostName(HWND parent, PGetHNRec rec)
1691 {
1692 SetDialogFont(pvar->ts->SetupFName,
1693 pvar->ts->UILanguageFile, "TTSSH", "DLG_SYSTEM_FONT");
1694 return (BOOL) DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_HOSTDLG),
1695 parent, TTXHostDlg, (LPARAM)rec);
1696 }
1697
1698 static void PASCAL TTXGetUIHooks(TTXUIHooks *hooks)
1699 {
1700 *hooks->GetHostName = TTXGetHostName;
1701 }
1702
1703 static void PASCAL TTXReadINIFile(PCHAR fileName, PTTSet ts)
1704 {
1705 (pvar->ReadIniFile) (fileName, ts);
1706 read_ssh_options(pvar, fileName);
1707 pvar->settings = *pvar->ts_SSH;
1708 logputs(LOG_LEVEL_VERBOSE, "Reading INI file");
1709 FWDUI_load_settings(pvar);
1710 }
1711
1712 static void PASCAL TTXWriteINIFile(PCHAR fileName, PTTSet ts)
1713 {
1714 (pvar->WriteIniFile) (fileName, ts);
1715 *pvar->ts_SSH = pvar->settings;
1716 clear_local_settings(pvar);
1717 logputs(LOG_LEVEL_VERBOSE, "Writing INI file");
1718 write_ssh_options(pvar, fileName, pvar->ts_SSH, TRUE);
1719 }
1720
1721 static void read_ssh_options_from_user_file(PTInstVar pvar,
1722 char *user_file_name)
1723 {
1724 if (user_file_name[0] == '.') {
1725 read_ssh_options(pvar, user_file_name);
1726 } else {
1727 char buf[1024];
1728
1729 get_teraterm_dir_relative_name(buf, sizeof(buf), user_file_name);
1730 read_ssh_options(pvar, buf);
1731 }
1732
1733 pvar->settings = *pvar->ts_SSH;
1734 FWDUI_load_settings(pvar);
1735 }
1736
1737 // Percent-encode������������src���f�R�[�h����dst���R�s�[�����B
1738 // dstlen��dst���T�C�Y�B�����������������������A�����������������������B
1739 static void percent_decode(char *dst, int dstlen, char *src) {
1740 if (src == NULL || dst == NULL || dstlen < 1) {
1741 return;
1742 }
1743
1744 while (*src != 0 && dstlen > 1) {
1745 if (*src == '%' && isxdigit(*(src+1)) && isxdigit(*(src+2))) {
1746 src++; *dst = (isalpha(*src) ? (*src|0x20) - 'a' + 10 : *src - '0') << 4;
1747 src++; *dst |= (isalpha(*src) ? (*src|0x20) - 'a' + 10 : *src - '0');
1748 src++; dst++;
1749 }
1750 else {
1751 *dst++ = *src++;
1752 }
1753 dstlen--;
1754 }
1755 *dst = 0;
1756 return;
1757 }
1758
1759 void add_forward_param(PTInstVar pvar, char *param)
1760 {
1761 if (pvar->settings.DefaultForwarding[0] == 0) {
1762 strncpy_s(pvar->settings.DefaultForwarding,
1763 sizeof(pvar->settings.DefaultForwarding),
1764 param, _TRUNCATE);
1765 } else {
1766 strncat_s(pvar->settings.DefaultForwarding,
1767 sizeof(pvar->settings.DefaultForwarding),
1768 ";", _TRUNCATE);
1769 strncat_s(pvar->settings.DefaultForwarding,
1770 sizeof(pvar->settings.DefaultForwarding),
1771 param, _TRUNCATE);
1772 }
1773 }
1774
1775 static void PASCAL TTXParseParam(PCHAR param, PTTSet ts, PCHAR DDETopic) {
1776 int param_len=strlen(param);
1777 int opt_len = param_len+1;
1778 char *option = (char *)calloc(opt_len, sizeof(char));
1779 char *option2 = (char *)calloc(opt_len, sizeof(char));
1780 int action;
1781 PCHAR start, cur, next;
1782 size_t i;
1783
1784 if (pvar->hostdlg_activated) {
1785 pvar->settings.Enabled = pvar->hostdlg_Enabled;
1786 }
1787
1788 /* the first term shuld be executable filename of Tera Term */
1789 start = GetParam(option, opt_len, param);
1790
1791 cur = start;
1792 while (next = GetParam(option, opt_len, cur)) {
1793 DequoteParam(option, opt_len, option);
1794 action = OPTION_NONE;
1795
1796 if ((option[0] == '-' || option[0] == '/')) {
1797 if (MATCH_STR(option + 1, "ssh") == 0) {
1798 if (MATCH_STR(option + 4, "-f=") == 0) {
1799 strncpy_s(option2, opt_len, option + 7, _TRUNCATE);
1800 read_ssh_options_from_user_file(pvar, option2);
1801 action = OPTION_CLEAR;
1802 } else if (MATCH_STR(option + 4, "-consume=") == 0) {
1803 strncpy_s(option2, opt_len, option + 13, _TRUNCATE);
1804 read_ssh_options_from_user_file(pvar, option2);
1805 DeleteFile(option2);
1806 action = OPTION_CLEAR;
1807 }
1808
1809 // ttermpro.exe �� /F= �w������ TTSSH ������������ (2006.10.11 maya)
1810 } else if (MATCH_STR_I(option + 1, "f=") == 0) {
1811 strncpy_s(option2, opt_len, option + 3, _TRUNCATE);
1812 read_ssh_options_from_user_file(pvar, option2);
1813 // Tera Term���������������K�v������������������
1814 }
1815 }
1816
1817 switch (action) {
1818 case OPTION_CLEAR:
1819 memset(cur, ' ', next-cur);
1820 break;
1821 case OPTION_REPLACE:
1822 memset(cur, ' ', next-cur);
1823 memcpy(cur+1, option, strlen(option));
1824 break;
1825 }
1826
1827 cur = next;
1828 }
1829
1830 cur = start;
1831 while (next = GetParam(option, opt_len, cur)) {
1832 DequoteParam(option, opt_len, option);
1833 action = OPTION_NONE;
1834
1835 if ((option[0] == '-' || option[0] == '/')) {
1836 action = OPTION_CLEAR;
1837 if (MATCH_STR(option + 1, "ssh") == 0) {
1838 if (option[4] == 0) {
1839 pvar->settings.Enabled = 1;
1840 } else if (MATCH_STR(option + 4, "-L") == 0 ||
1841 MATCH_STR(option + 4, "-R") == 0 ||
1842 MATCH_STR(option + 4, "-D") == 0) {
1843 char *p = option + 5;
1844 option2[0] = *p;
1845 i = 1;
1846 while (*++p) {
1847 if (*p == ';' || *p == ',') {
1848 option2[i] = 0;
1849 add_forward_param(pvar, option2);
1850 i = 1;
1851 }
1852 else {
1853 option2[i++] = *p;
1854 }
1855 }
1856 if (i > 1) {
1857 option2[i] = 0;
1858 add_forward_param(pvar, option2);
1859 }
1860 } else if (MATCH_STR(option + 4, "-X") == 0) {
1861 add_forward_param(pvar, "X");
1862 if (option+6 != 0) {
1863 strncpy_s(pvar->settings.X11Display,
1864 sizeof(pvar->settings.X11Display),
1865 option + 6, _TRUNCATE);
1866 }
1867 } else if (strcmp(option + 4, "-v") == 0) {
1868 pvar->settings.LogLevel = LOG_LEVEL_VERBOSE;
1869 } else if (_stricmp(option + 4, "-autologin") == 0 ||
1870 _stricmp(option + 4, "-autologon") == 0) {
1871 pvar->settings.TryDefaultAuth = TRUE;
1872 } else if (MATCH_STR_I(option + 4, "-agentconfirm=") == 0) {
1873 if ((_stricmp(option+18, "off") == 0) ||
1874 (_stricmp(option+18, "no") == 0) ||
1875 (_stricmp(option+18, "false") == 0) ||
1876 (_stricmp(option+18, "0") == 0) ||
1877 (_stricmp(option+18, "n") == 0)) {
1878 pvar->settings.ForwardAgentConfirm = 0;
1879 }
1880 else {
1881 pvar->settings.ForwardAgentConfirm = 1;
1882 }
1883 } else if (strcmp(option + 4, "-a") == 0) {
1884 pvar->settings.ForwardAgent = FALSE;
1885 } else if (strcmp(option + 4, "-A") == 0) {
1886 pvar->settings.ForwardAgent = TRUE;
1887
1888 } else if (MATCH_STR(option + 4, "-C=") == 0) {
1889 pvar->settings.CompressionLevel = atoi(option+7);
1890 if (pvar->settings.CompressionLevel < 0) {
1891 pvar->settings.CompressionLevel = 0;
1892 }
1893 else if (pvar->settings.CompressionLevel > 9) {
1894 pvar->settings.CompressionLevel = 9;
1895 }
1896 } else if (strcmp(option + 4, "-C") == 0) {
1897 pvar->settings.CompressionLevel = 6;
1898 } else if (strcmp(option + 4, "-c") == 0) {
1899 pvar->settings.CompressionLevel = 0;
1900 } else if (MATCH_STR_I(option + 4, "-icon=") == 0) {
1901 if ((_stricmp(option+10, "old") == 0) ||
1902 (_stricmp(option+10, "yellow") == 0) ||
1903 (_stricmp(option+10, "securett_yellow") == 0)) {
1904 pvar->settings.IconID = IDI_SECURETT_YELLOW;
1905 }
1906 else if ((_stricmp(option+10, "green") == 0) ||
1907 (_stricmp(option+10, "securett_green") == 0)) {
1908 pvar->settings.IconID = IDI_SECURETT_GREEN;
1909 }
1910 else {
1911 pvar->settings.IconID = IDI_SECURETT;
1912 }
1913 } else if (MATCH_STR(option + 4, "-subsystem=") == 0) {
1914 pvar->use_subsystem = TRUE;
1915 strncpy_s(pvar->subsystem_name,
1916 sizeof(pvar->subsystem_name),
1917 option + 15, _TRUNCATE);
1918 } else if (strcmp(option + 4, "-N") == 0) {
1919 pvar->nosession = TRUE;
1920
1921 // /ssh1 �� /ssh2 �I�v�V�������V�K���� (2006.9.16 maya)
1922 } else if (strcmp(option + 4, "1") == 0) {
1923 pvar->settings.Enabled = 1;
1924 pvar->settings.ssh_protocol_version = 1;
1925 } else if (strcmp(option + 4, "2") == 0) {
1926 pvar->settings.Enabled = 1;
1927 pvar->settings.ssh_protocol_version = 2;
1928
1929 } else {
1930 char buf[1024];
1931
1932 UTIL_get_lang_msg("MSG_UNKNOWN_OPTION_ERROR", pvar,
1933 "Unrecognized command-line option: %s");
1934 _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, option);
1935
1936 MessageBox(NULL, buf, "TTSSH", MB_OK | MB_ICONEXCLAMATION);
1937 }
1938
1939 // ttermpro.exe �� /T= �w�������p�������A������������ (2006.10.19 maya)
1940 } else if (MATCH_STR_I(option + 1, "t=") == 0) {
1941 if (strcmp(option + 3, "2") == 0) {
1942 pvar->settings.Enabled = 1;
1943 // /t=2��ttssh�������g������������
1944 } else {
1945 pvar->settings.Enabled = 0;
1946 action = OPTION_NONE; // Tera Term������������������������
1947 }
1948
1949 // /1 ������ /2 �I�v�V�������V�K���� (2004.10.3 yutaka)
1950 } else if (strcmp(option + 1, "1") == 0) {
1951 // command line: /ssh /1 is SSH1 only
1952 pvar->settings.ssh_protocol_version = 1;
1953
1954 } else if (strcmp(option + 1, "2") == 0) {
1955 // command line: /ssh /2 is SSH2 & SSH1
1956 pvar->settings.ssh_protocol_version = 2;
1957
1958 } else if (strcmp(option + 1, "nossh") == 0) {
1959 // '/nossh' �I�v�V�����������B
1960 // TERATERM.INI ��SSH���L�������������������A������Cygterm���N��������������
1961 // �����������������B(2004.10.11 yutaka)
1962 pvar->settings.Enabled = 0;
1963
1964 } else if (strcmp(option + 1, "telnet") == 0) {
1965 // '/telnet' ���w�������������������� '/nossh' ��������
1966 // SSH������������ (2006.9.16 maya)
1967 pvar->settings.Enabled = 0;
1968 // Tera Term �� Telnet �t���O���t����
1969 pvar->ts->Telnet = 1;
1970
1971 } else if (MATCH_STR(option + 1, "auth=") == 0) {
1972 // SSH2�������O�C���I�v�V����������
1973 //
1974 // SYNOPSIS: /ssh /auth=passowrd /user=���[�U�� /passwd=�p�X���[�h
1975 // /ssh /auth=publickey /user=���[�U�� /passwd=�p�X���[�h /keyfile=�p�X
1976 // EXAMPLE: /ssh /auth=password /user=nike /passwd="a b""c" ; �p�X���[�h: �ua b"c�v
1977 // /ssh /auth=publickey /user=foo /passwd=bar /keyfile=d:\tmp\id_rsa
1978 // NOTICE: �p�X���[�h���p�X���������Z�~�R���������������������_�u���N�H�[�g " ������
1979 // �p�X���[�h���_�u���N�H�[�g�����������������A�������_�u���N�H�[�g "" ���u��������
1980 //
1981 pvar->ssh2_autologin = 1; // for SSH2 (2004.11.30 yutaka)
1982
1983 if (_stricmp(option + 6, "password") == 0) { // �p�X���[�h
1984 //pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
1985 pvar->ssh2_authmethod = SSH_AUTH_PASSWORD;
1986
1987 } else if (_stricmp(option + 6, "keyboard-interactive") == 0) { // keyboard-interactive�F��
1988 //pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
1989 pvar->ssh2_authmethod = SSH_AUTH_TIS;
1990
1991 } else if (_stricmp(option + 6, "challenge") == 0) { // keyboard-interactive�F��
1992 //pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
1993 pvar->ssh2_authmethod = SSH_AUTH_TIS;
1994
1995 } else if (_stricmp(option + 6, "publickey") == 0) { // ���J���F��
1996 //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
1997 pvar->ssh2_authmethod = SSH_AUTH_RSA;
1998
1999 } else if (_stricmp(option + 6, "pageant") == 0) { // ���J���F�� by Pageant
2000 //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
2001 pvar->ssh2_authmethod = SSH_AUTH_PAGEANT;
2002
2003 } else {
2004 // TODO:
2005 }
2006
2007 } else if (MATCH_STR(option + 1, "user=") == 0) {
2008 _snprintf_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), _TRUNCATE, "%s", option+6);
2009
2010 } else if (MATCH_STR(option + 1, "passwd=") == 0) {
2011 _snprintf_s(pvar->ssh2_password, sizeof(pvar->ssh2_password), _TRUNCATE, "%s", option+8);
2012
2013 } else if (MATCH_STR(option + 1, "keyfile=") == 0) {
2014 _snprintf_s(pvar->ssh2_keyfile, sizeof(pvar->ssh2_keyfile), _TRUNCATE, "%s", option+9);
2015
2016 } else if (strcmp(option + 1, "ask4passwd") == 0) {
2017 // �p�X���[�h������ (2006.9.18 maya)
2018 pvar->ask4passwd = 1;
2019
2020 } else if (strcmp(option + 1, "nosecuritywarning") == 0) {
2021 // known_hosts�`�F�b�N���������B���Y�I�v�V�������g�����A�Z�L�����e�B������������
2022 // �����A�B���I�v�V���������������B
2023 // (2009.10.4 yutaka)
2024 pvar->nocheck_known_hosts = TRUE;
2025
2026 }
2027 else { // Other (not ttssh) option
2028 action = OPTION_NONE; // ttssh���I�v�V������������������������
2029 }
2030
2031 // �p�X���[�h�������������������O�C��������������
2032 // /auth ���F�����\�b�h���w�������������p������ (2006.9.18 maya)
2033 if (pvar->ask4passwd == 1) {
2034 pvar->ssh2_autologin = 0;
2035 }
2036
2037 }
2038 else if ((MATCH_STR_I(option, "ssh://") == 0) ||
2039 (MATCH_STR_I(option, "ssh1://") == 0) ||
2040 (MATCH_STR_I(option, "ssh2://") == 0) ||
2041 (MATCH_STR_I(option, "slogin://") == 0) ||
2042 (MATCH_STR_I(option, "slogin1://") == 0) ||
2043 (MATCH_STR_I(option, "slogin2://") == 0)) {
2044 //
2045 // ssh://user@host/ ����URL�`�����T�|�[�g
2046 // ���{�I�������� telnet:// URL��������
2047 //
2048 // �Q�l:
2049 // RFC3986: Uniform Resource Identifier (URI): Generic Syntax
2050 // RFC4248: The telnet URI Scheme
2051 //
2052 char *p, *p2, *p3;
2053 int optlen, hostlen;
2054
2055 optlen = strlen(option);
2056
2057 // ������':'���O�����������������������A������ssh�v���g�R���o�[�W������������
2058 p = _mbschr(option, ':');
2059 switch (*(p-1)) {
2060 case '1':
2061 pvar->settings.ssh_protocol_version = 1;
2062 break;
2063 case '2':
2064 pvar->settings.ssh_protocol_version = 2;
2065 break;
2066 }
2067
2068 // authority part �����|�C���^������
2069 p += 3;
2070
2071 // path part ������������
2072 if ((p2 = _mbschr(p, '/')) != NULL) {
2073 *p2 = 0;
2074 }
2075
2076 // '@'�������������A���������O�����[�U����
2077 if ((p2 = _mbschr(p, '@')) != NULL) {
2078 *p2 = 0;
2079 // ':'���~���p�X���[�h
2080 if ((p3 = _mbschr(p, ':')) != NULL) {
2081 *p3 = 0;
2082 percent_decode(pvar->ssh2_password, sizeof(pvar->ssh2_password), p3 + 1);
2083 }
2084 percent_decode(pvar->ssh2_username, sizeof(pvar->ssh2_username), p);
2085 // p �� host part ������('@'����������)����������������
2086 p = p2 + 1;
2087 }
2088
2089 // host part �� option �����������������Ascheme part ������
2090 // port�w����������������port���������������������m��������������
2091 hostlen = strlen(p);
2092 memmove_s(option, optlen, p, hostlen);
2093 option[hostlen] = 0;
2094
2095 // �|�[�g�w������������":22"������
2096 if (option[0] == '[' && option[hostlen-1] == ']' || // IPv6 raw address without port
2097 option[0] != '[' && _mbschr(option, ':') == NULL) { // hostname or IPv4 raw address without port
2098 memcpy_s(option+hostlen, optlen-hostlen, ":22", 3);
2099 hostlen += 3;
2100 }
2101
2102 // �|�[�g�w�����������������X�y�[�X������
2103 memset(option+hostlen, ' ', optlen-hostlen);
2104
2105 pvar->settings.Enabled = 1;
2106
2107 action = OPTION_REPLACE;
2108 }
2109 else if (_mbschr(option, '@') != NULL) {
2110 //
2111 // user@host �`�����T�|�[�g
2112 // ����������ssh�������T�|�[�g�����A���[�U����ttssh���������B
2113 // (ssh�������O -- ttssh�������W������������)
2114 // �����I��telnet authentication option���T�|�[�g��������
2115 // Tera Term�{�����������������������\���B
2116 //
2117 char *p;
2118 p = _mbschr(option, '@');
2119 *p = 0;
2120
2121 strncpy_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), option, _TRUNCATE);
2122
2123 // ���[�U���������X�y�[�X�������B
2124 // ������TTX��Tera Term�{�������������������X�y�[�X�����������������A
2125 // �z�X�g�����������l�����K�v�������B
2126 memset(option, ' ', p-option+1);
2127
2128 action = OPTION_REPLACE;
2129 }
2130
2131
2132 switch (action) {
2133 case OPTION_CLEAR:
2134 memset(cur, ' ', next-cur);
2135 break;
2136 case OPTION_REPLACE:
2137 memset(cur, ' ', next-cur);
2138 memcpy(cur+1, option, strlen(option));
2139 break;
2140 }
2141
2142 cur = next;
2143 }
2144
2145 free(option);
2146
2147 FWDUI_load_settings(pvar);
2148
2149 (pvar->ParseParam) (param, ts, DDETopic);
2150 }
2151
2152 static void PASCAL TTXGetSetupHooks(TTXSetupHooks *hooks)
2153 {
2154 pvar->ReadIniFile = *hooks->ReadIniFile;
2155 pvar->WriteIniFile = *hooks->WriteIniFile;
2156 pvar->ParseParam = *hooks->ParseParam;
2157
2158 *hooks->ReadIniFile = TTXReadINIFile;
2159 *hooks->WriteIniFile = TTXWriteINIFile;
2160 *hooks->ParseParam = TTXParseParam;
2161 }
2162
2163 static void PASCAL TTXSetWinSize(int rows, int cols)
2164 {
2165 SSH_notify_win_size(pvar, cols, rows);
2166 }
2167
2168 static void insertMenuBeforeItem(HMENU menu, WORD beforeItemID, WORD flags,
2169 WORD newItemID, char *text)
2170 {
2171 int i, j;
2172
2173 for (i = GetMenuItemCount(menu) - 1; i >= 0; i--) {
2174 HMENU submenu = GetSubMenu(menu, i);
2175
2176 for (j = GetMenuItemCount(submenu) - 1; j >= 0; j--) {
2177 if (GetMenuItemID(submenu, j) == beforeItemID) {
2178 InsertMenu(submenu, j, MF_BYPOSITION | flags, newItemID, text);
2179 return;
2180 }
2181 }
2182 }
2183 }
2184
2185 #define GetFileMenu(menu) GetSubMenuByChildID(menu, 50110) // ID_FILE_NEWCONNECTION
2186 #define GetEditMenu(menu) GetSubMenuByChildID(menu, 50210) // ID_EDIT_COPY2
2187 #define GetSetupMenu(menu) GetSubMenuByChildID(menu, 50310) // ID_SETUP_TERMINAL
2188 #define GetControlMenu(menu) GetSubMenuByChildID(menu, 50410) // ID_CONTROL_RESETTERMINAL
2189 #define GetHelpMenu(menu) GetSubMenuByChildID(menu, 50990) // ID_HELP_ABOUT
2190
2191 HMENU GetSubMenuByChildID(HMENU menu, UINT id) {
2192 int i, j, items, subitems, cur_id;
2193 HMENU m;
2194
2195 items = GetMenuItemCount(menu);
2196
2197 for (i=0; i<items; i++) {
2198 if (m = GetSubMenu(menu, i)) {
2199 subitems = GetMenuItemCount(m);
2200 for (j=0; j<subitems; j++) {
2201 cur_id = GetMenuItemID(m, j);
2202 if (cur_id == id) {
2203 return m;
2204 }
2205 }
2206 }
2207 }
2208 return NULL;
2209 }
2210
2211 static void PASCAL TTXModifyMenu(HMENU menu)
2212 {
2213 pvar->FileMenu = GetFileMenu(menu);
2214
2215 /* inserts before ID_HELP_ABOUT */
2216 UTIL_get_lang_msg("MENU_ABOUT", pvar, "About &TTSSH...");
2217 insertMenuBeforeItem(menu, 50990, MF_ENABLED, ID_ABOUTMENU, pvar->ts->UIMsg);
2218
2219 /* inserts before ID_SETUP_TCPIP */
2220 UTIL_get_lang_msg("MENU_SSH", pvar, "SS&H...");
2221 insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHSETUPMENU, pvar->ts->UIMsg);
2222 /* inserts before ID_SETUP_TCPIP */
2223 UTIL_get_lang_msg("MENU_SSH_AUTH", pvar, "SSH &Authentication...");
2224 insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHAUTHSETUPMENU, pvar->ts->UIMsg);
2225 /* inserts before ID_SETUP_TCPIP */
2226 UTIL_get_lang_msg("MENU_SSH_FORWARD", pvar, "SSH F&orwarding...");
2227 insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHFWDSETUPMENU, pvar->ts->UIMsg);
2228 UTIL_get_lang_msg("MENU_SSH_KEYGEN", pvar, "SSH KeyGe&nerator...");
2229 insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHKEYGENMENU, pvar->ts->UIMsg);
2230
2231 /* inserts before ID_FILE_CHANGEDIR */
2232 UTIL_get_lang_msg("MENU_SSH_SCP", pvar, "SS&H SCP...");
2233 insertMenuBeforeItem(menu, 50170, MF_GRAYED, ID_SSHSCPMENU, pvar->ts->UIMsg);
2234 }
2235
2236 static void PASCAL TTXModifyPopupMenu(HMENU menu) {
2237 if (menu == pvar->FileMenu) {
2238 if (pvar->cv->Ready && pvar->socket != INVALID_SOCKET)
2239 EnableMenuItem(menu, ID_SSHSCPMENU, MF_BYCOMMAND | MF_ENABLED);
2240 else
2241 EnableMenuItem(menu, ID_SSHSCPMENU, MF_BYCOMMAND | MF_GRAYED);
2242 }
2243 }
2244
2245 static void about_dlg_set_abouttext(PTInstVar pvar, HWND dlg, digest_algorithm dgst_alg)
2246 {
2247 char buf[1024], buf2[2048];
2248 char *fp = NULL;
2249
2250 // TTSSH�_�C�A���O���\������SSH������������ (2004.10.30 yutaka)
2251 if (pvar->socket != INVALID_SOCKET) {
2252 buf2[0] = '\0';
2253
2254 if (SSHv1(pvar)) {
2255 UTIL_get_lang_msg("DLG_ABOUT_SERVERID", pvar, "Server ID:");
2256 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2257 strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2258 SSH_get_server_ID_info(pvar, buf, sizeof(buf));
2259 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2260 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2261
2262 UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol:");
2263 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2264 strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2265 SSH_get_protocol_version_info(pvar, buf, sizeof(buf));
2266 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2267 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2268
2269 UTIL_get_lang_msg("DLG_ABOUT_ENCRYPTION", pvar, "Encryption:");
2270 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2271 strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2272 CRYPT_get_cipher_info(pvar, buf, sizeof(buf));
2273 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2274 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2275
2276 UTIL_get_lang_msg("DLG_ABOUT_SERVERKEY", pvar, "Server keys:");
2277 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2278 strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2279 CRYPT_get_server_key_info(pvar, buf, sizeof(buf));
2280 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2281 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2282
2283 UTIL_get_lang_msg("DLG_ABOUT_AUTH", pvar, "Authentication:");
2284 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2285 strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2286 AUTH_get_auth_info(pvar, buf, sizeof(buf));
2287 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2288 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2289
2290 UTIL_get_lang_msg("DLG_ABOUT_COMP", pvar, "Compression:");
2291 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2292 strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2293 SSH_get_compression_info(pvar, buf, sizeof(buf));
2294 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2295 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2296
2297 } else { // SSH2
2298 UTIL_get_lang_msg("DLG_ABOUT_SERVERID", pvar, "Server ID:");
2299 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2300 strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2301 SSH_get_server_ID_info(pvar, buf, sizeof(buf));
2302 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2303 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2304
2305 UTIL_get_lang_msg("DLG_ABOUT_CLIENTID", pvar, "Client ID:");
2306 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2307 strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2308 strncat_s(buf2, sizeof(buf2), pvar->client_version_string, _TRUNCATE);
2309 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2310
2311 UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol:");
2312 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2313 strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2314 SSH_get_protocol_version_info(pvar, buf, sizeof(buf));
2315 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2316 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2317
2318 UTIL_get_lang_msg("DLG_ABOUT_KEX", pvar, "Key exchange algorithm:");
2319 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2320 strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2321 strncat_s(buf2, sizeof(buf2), get_kex_algorithm_name(pvar->kex_type), _TRUNCATE);
2322 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2323
2324 UTIL_get_lang_msg("DLG_ABOUT_HOSTKEY", pvar, "Host Key:");
2325 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2326 strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2327 strncat_s(buf2, sizeof(buf2), get_ssh_keytype_name(pvar->hostkey_type), _TRUNCATE);
2328 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2329
2330 UTIL_get_lang_msg("DLG_ABOUT_ENCRYPTION", pvar, "Encryption:");
2331 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2332 strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2333 CRYPT_get_cipher_info(pvar, buf, sizeof(buf));
2334 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2335 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2336
2337 UTIL_get_lang_msg("DLG_ABOUT_MAC", pvar, "MAC algorithm:");
2338 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2339 strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2340 SSH_get_mac_info(pvar, buf, sizeof(buf));
2341 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2342 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2343
2344 if (pvar->ctos_compression == COMP_DELAYED) { // �x���p�P�b�g���k������ (2006.6.23 yutaka)
2345 UTIL_get_lang_msg("DLG_ABOUT_COMPDELAY", pvar, "Delayed Compression:");
2346 }
2347 else {
2348 UTIL_get_lang_msg("DLG_ABOUT_COMP", pvar, "Compression:");
2349 }
2350 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2351 strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2352 SSH_get_compression_info(pvar, buf, sizeof(buf));
2353 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2354 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2355
2356 UTIL_get_lang_msg("DLG_ABOUT_KEXKEY", pvar, "Key exchange keys:");
2357 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2358 strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2359 CRYPT_get_server_key_info(pvar, buf, sizeof(buf));
2360 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2361 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2362
2363 UTIL_get_lang_msg("DLG_ABOUT_AUTH", pvar, "Authentication:");
2364 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2365 strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2366 AUTH_get_auth_info(pvar, buf, sizeof(buf));
2367 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2368 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2369 }
2370
2371 // �z�X�g���J����fingerprint���\�������B
2372 // (2014.5.1 yutaka)
2373 UTIL_get_lang_msg("DLG_ABOUT_FINGERPRINT", pvar, "Host key's fingerprint:");
2374 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2375 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2376
2377 switch (dgst_alg) {
2378 case SSH_DIGEST_MD5:
2379 fp = key_fingerprint(&pvar->hosts_state.hostkey, SSH_FP_HEX, dgst_alg);
2380 strncat_s(buf2, sizeof(buf2), fp, _TRUNCATE);
2381 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2382 free(fp);
2383 break;
2384 case SSH_DIGEST_SHA256:
2385 default:
2386 fp = key_fingerprint(&pvar->hosts_state.hostkey, SSH_FP_BASE64, SSH_DIGEST_SHA256);
2387 if (fp != NULL) {
2388 strncat_s(buf2, sizeof(buf2), fp, _TRUNCATE);
2389 free(fp);
2390 }
2391 strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2392 break;
2393 }
2394
2395 fp = key_fingerprint(&pvar->hosts_state.hostkey, SSH_FP_RANDOMART, dgst_alg);
2396 strncat_s(buf2, sizeof(buf2), fp, _TRUNCATE);
2397 free(fp);
2398
2399 SendDlgItemMessage(dlg, IDC_ABOUTTEXT, WM_SETTEXT, 0, (LPARAM)(char *)buf2);
2400 }
2401 }
2402
2403 static void init_about_dlg(PTInstVar pvar, HWND dlg)
2404 {
2405 char buf[1024];
2406 char uimsg[MAX_UIMSG];
2407
2408 GetWindowText(dlg, uimsg, sizeof(uimsg));
2409 UTIL_get_lang_msg("DLG_ABOUT_TITLE", pvar, uimsg);
2410 SetWindowText(dlg, pvar->ts->UIMsg);
2411 GetDlgItemText(dlg, IDC_FP_HASH_ALG, uimsg, sizeof(uimsg));
2412 UTIL_get_lang_msg("DLG_ABOUT_FP_HASH_ALGORITHM", pvar, uimsg);
2413 SetDlgItemText(dlg, IDC_FP_HASH_ALG, pvar->ts->UIMsg);
2414 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
2415 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
2416 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
2417
2418 // TTSSH���o�[�W�������������� (2005.2.28 yutaka)
2419 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
2420 "TTSSH\r\nTera Term Secure Shell extension, %d.%d", TTSSH_VERSION_MAJOR, TTSSH_VERSION_MINOR);
2421 SendMessage(GetDlgItem(dlg, IDC_TTSSH_VERSION), WM_SETTEXT, 0, (LPARAM)buf);
2422
2423 // OpenSSL���o�[�W�������������� (2005.1.24 yutaka)
2424 // ���������� (2005.5.11 yutaka)
2425 // OPENSSL_VERSION_TEXT �}�N�����`���������A�������g�����o�[�W���������������B(2013.11.24 yutaka)
2426 SendMessage(GetDlgItem(dlg, IDC_OPENSSL_VERSION), WM_SETTEXT, 0, (LPARAM)SSLeay_version(SSLEAY_VERSION));
2427
2428 // zlib���o�[�W�������������� (2005.5.11 yutaka)
2429 #ifdef ZLIB_VERSION
2430 _snprintf_s(buf, sizeof(buf), _TRUNCATE, "ZLib %s", ZLIB_VERSION);
2431 #else
2432 _snprintf(buf, sizeof(buf), "ZLib Unknown");
2433 #endif
2434 SendMessage(GetDlgItem(dlg, IDC_ZLIB_VERSION), WM_SETTEXT, 0, (LPARAM)buf);
2435
2436 // PuTTY���o�[�W�������������� (2011.7.26 yutaka)
2437 _snprintf_s(buf, sizeof(buf), _TRUNCATE, "PuTTY %s", putty_get_version());
2438 SendMessage(GetDlgItem(dlg, IDC_PUTTY_VERSION), WM_SETTEXT, 0, (LPARAM)buf);
2439 }
2440
2441 #if 0
2442 // WM_MOUSEWHEEL �� winuser.h �w�b�_���������������������A#define _WIN32_WINNT 0x0400 ���������������������F�������������B
2443 #define WM_MOUSEWHEEL 0x020A1
2444 #define WHEEL_DELTA 120
2445 #define GET_WHEEL_DELTA_WPARAM(wParam) ((short)HIWORD(wParam))
2446 #define GET_KEYSTATE_WPARAM(wParam) (LOWORD(wParam))
2447 #endif
2448
2449 static WNDPROC g_defAboutDlgEditWndProc; // Edit Control���T�u�N���X���p
2450 static int g_deltaSumAboutDlg = 0; // �}�E�X�z�C�[����Delta�����p
2451
2452 static LRESULT CALLBACK AboutDlgEditWindowProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
2453 {
2454 WORD keys;
2455 short delta;
2456 BOOL page;
2457
2458 switch (msg) {
2459 case WM_KEYDOWN:
2460 // Edit control���� CTRL+A �������������A�e�L�X�g���S�I�������B
2461 if (wp == 'A' && GetKeyState(VK_CONTROL) < 0) {
2462 PostMessage(hWnd, EM_SETSEL, 0, -1);
2463 return 0;
2464 }
2465 break;
2466
2467 case WM_MOUSEWHEEL:
2468 // CTRLorSHIFT + �}�E�X�z�C�[���������A���X�N���[���������B
2469 keys = GET_KEYSTATE_WPARAM(wp);
2470 delta = GET_WHEEL_DELTA_WPARAM(wp);
2471 page = keys & (MK_CONTROL | MK_SHIFT);
2472
2473 if (page == 0)
2474 break;
2475
2476 g_deltaSumAboutDlg += delta;
2477
2478 if (g_deltaSumAboutDlg >= WHEEL_DELTA) {
2479 g_deltaSumAboutDlg -= WHEEL_DELTA;
2480 SendMessage(hWnd, WM_HSCROLL, SB_PAGELEFT , 0);
2481 } else if (g_deltaSumAboutDlg <= -WHEEL_DELTA) {
2482 g_deltaSumAboutDlg += WHEEL_DELTA;
2483 SendMessage(hWnd, WM_HSCROLL, SB_PAGERIGHT, 0);
2484 }
2485
2486 break;
2487 }
2488 return CallWindowProc(g_defAboutDlgEditWndProc, hWnd, msg, wp, lp);
2489 }
2490
2491 static BOOL CALLBACK TTXAboutDlg(HWND dlg, UINT msg, WPARAM wParam,
2492 LPARAM lParam)
2493 {
2494 // LOGFONTA logfont;
2495 // HFONT font;
2496
2497 switch (msg) {
2498 case WM_INITDIALOG:
2499 #if 0
2500 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
2501 GetObject(font, sizeof(LOGFONT), &logfont);
2502 if (UTIL_get_lang_font("DLG_TAHOMA_FONT", dlg, &logfont, &DlgAboutFont, pvar)) {
2503 SendDlgItemMessage(dlg, IDC_TTSSH_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2504 SendDlgItemMessage(dlg, IDC_SSHVERSIONS, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2505 SendDlgItemMessage(dlg, IDC_INCLUDES, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2506 SendDlgItemMessage(dlg, IDC_OPENSSL_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2507 SendDlgItemMessage(dlg, IDC_ZLIB_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2508 SendDlgItemMessage(dlg, IDC_PUTTY_VERSION, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE, 0));
2509 SendDlgItemMessage(dlg, IDC_WEBSITES, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE, 0));
2510 SendDlgItemMessage(dlg, IDC_CRYPTOGRAPHY, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2511 SendDlgItemMessage(dlg, IDC_CREDIT, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2512 SendDlgItemMessage(dlg, IDC_FP_HASH_ALG, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE, 0));
2513 SendDlgItemMessage(dlg, IDC_FP_HASH_ALG_MD5, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE, 0));
2514 SendDlgItemMessage(dlg, IDC_FP_HASH_ALG_SHA256, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE, 0));
2515 SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgAboutFont, MAKELPARAM(TRUE,0));
2516 }
2517 else {
2518 DlgAboutFont = NULL;
2519 }
2520 #endif
2521
2522 // Edit control�������t�H���g���\�������������A���������������t�H���g���Z�b�g�����B
2523 // (2014.5.5. yutaka)
2524 if (!UTIL_get_lang_font("DLG_ABOUT_FONT", dlg, NULL, &DlgAboutTextFont, pvar)) {
2525 // ���������������������������t�H���g���w�������B
2526 // �G�f�B�b�g�R���g���[�����_�C�A���O�������t�H���g������������
2527 // �����t�H���g�������������B
2528 LOGFONTA logfont = {0};
2529 strncpy_s(logfont.lfFaceName, sizeof(logfont.lfFaceName), "Courier New", _TRUNCATE);
2530 logfont.lfCharSet = 0;
2531 logfont.lfHeight = MulDiv(8, GetDeviceCaps(GetDC(dlg),LOGPIXELSY) * -1, 72);
2532 logfont.lfWidth = 0;
2533 DlgAboutTextFont = CreateFontIndirect(&logfont); // �G���[�� NULL
2534 }
2535 if (DlgAboutTextFont != NULL) {
2536 SendDlgItemMessage(dlg, IDC_ABOUTTEXT, WM_SETFONT, (WPARAM)DlgAboutTextFont, MAKELPARAM(TRUE,0));
2537 }
2538
2539 // �A�C�R�������I���Z�b�g
2540 {
2541 int fuLoad = LR_DEFAULTCOLOR;
2542 HICON hicon;
2543
2544 if (IsWindowsNT4()) {
2545 fuLoad = LR_VGACOLOR;
2546 }
2547
2548 hicon = LoadImage(hInst, MAKEINTRESOURCE(pvar->settings.IconID),
2549 IMAGE_ICON, 32, 32, fuLoad);
2550 SendDlgItemMessage(dlg, IDC_TTSSH_ICON, STM_SETICON, (WPARAM)hicon, 0);
2551 }
2552
2553 init_about_dlg(pvar, dlg);
2554 CheckDlgButton(dlg, IDC_FP_HASH_ALG_SHA256, TRUE);
2555 about_dlg_set_abouttext(pvar, dlg, SSH_DIGEST_SHA256);
2556 SetFocus(GetDlgItem(dlg, IDOK));
2557
2558 // Edit control���T�u�N���X�������B
2559 g_deltaSumAboutDlg = 0;
2560 g_defAboutDlgEditWndProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(dlg, IDC_ABOUTTEXT), GWLP_WNDPROC, (LONG_PTR)AboutDlgEditWindowProc);
2561
2562 CenterWindow(dlg, GetParent(dlg));
2563
2564 return FALSE;
2565
2566 case WM_COMMAND:
2567 switch (LOWORD(wParam)) {
2568 case IDOK:
2569 EndDialog(dlg, 1);
2570 #if 0
2571 if (DlgAboutFont != NULL) {
2572 DeleteObject(DlgAboutFont);
2573 }
2574 #endif
2575 if (DlgAboutTextFont != NULL) {
2576 DeleteObject(DlgAboutTextFont);
2577 }
2578 return TRUE;
2579 case IDCANCEL: /* there isn't a cancel button, but other Windows
2580 UI things can send this message */
2581 EndDialog(dlg, 0);
2582 #if 0
2583 if (DlgAboutFont != NULL) {
2584 DeleteObject(DlgAboutFont);
2585 }
2586 #endif
2587 if (DlgAboutTextFont != NULL) {
2588 DeleteObject(DlgAboutTextFont);
2589 }
2590 return TRUE;
2591 case IDC_FP_HASH_ALG_MD5:
2592 about_dlg_set_abouttext(pvar, dlg, SSH_DIGEST_MD5);
2593 return TRUE;
2594 case IDC_FP_HASH_ALG_SHA256:
2595 about_dlg_set_abouttext(pvar, dlg, SSH_DIGEST_SHA256);
2596 return TRUE;
2597 }
2598 break;
2599 }
2600
2601 return FALSE;
2602 }
2603
2604 static char *get_cipher_name(int cipher)
2605 {
2606 switch (cipher) {
2607 case SSH_CIPHER_NONE:
2608 UTIL_get_lang_msg("DLG_SSHSETUP_CIPHER_BORDER", pvar,
2609 "<ciphers below this line are disabled>");
2610 return pvar->ts->UIMsg;
2611 case SSH_CIPHER_3DES:
2612 return "3DES(SSH1)";
2613 case SSH_CIPHER_DES:
2614 return "DES(SSH1)";
2615 case SSH_CIPHER_BLOWFISH:
2616 return "Blowfish(SSH1)";
2617
2618 // for SSH2(yutaka)
2619 case SSH2_CIPHER_AES128_CBC:
2620 return "aes128-cbc(SSH2)";
2621 case SSH2_CIPHER_AES192_CBC:
2622 return "aes192-cbc(SSH2)";
2623 case SSH2_CIPHER_AES256_CBC:
2624 return "aes256-cbc(SSH2)";
2625 case SSH2_CIPHER_3DES_CBC:
2626 return "3des-cbc(SSH2)";
2627 case SSH2_CIPHER_BLOWFISH_CBC:
2628 return "blowfish-cbc(SSH2)";
2629 case SSH2_CIPHER_AES128_CTR:
2630 return "aes128-ctr(SSH2)";
2631 case SSH2_CIPHER_AES192_CTR:
2632 return "aes192-ctr(SSH2)";
2633 case SSH2_CIPHER_AES256_CTR:
2634 return "aes256-ctr(SSH2)";
2635 case SSH2_CIPHER_ARCFOUR:
2636 return "arcfour(SSH2)";
2637 case SSH2_CIPHER_ARCFOUR128:
2638 return "arcfour128(SSH2)";
2639 case SSH2_CIPHER_ARCFOUR256:
2640 return "arcfour256(SSH2)";
2641 case SSH2_CIPHER_CAST128_CBC:
2642 return "cast128-cbc(SSH2)";
2643 case SSH2_CIPHER_3DES_CTR:
2644 return "3des-ctr(SSH2)";
2645 case SSH2_CIPHER_BLOWFISH_CTR:
2646 return "blowfish-ctr(SSH2)";
2647 case SSH2_CIPHER_CAST128_CTR:
2648 return "cast128-ctr(SSH2)";
2649 case SSH2_CIPHER_CAMELLIA128_CBC:
2650 return "camellia128-cbc(SSH2)";
2651 case SSH2_CIPHER_CAMELLIA192_CBC:
2652 return "camellia192-cbc(SSH2)";
2653 case SSH2_CIPHER_CAMELLIA256_CBC:
2654 return "camellia256-cbc(SSH2)";
2655 case SSH2_CIPHER_CAMELLIA128_CTR:
2656 return "camellia128-ctr(SSH2)";
2657 case SSH2_CIPHER_CAMELLIA192_CTR:
2658 return "camellia192-ctr(SSH2)";
2659 case SSH2_CIPHER_CAMELLIA256_CTR:
2660 return "camellia256-ctr(SSH2)";
2661 case SSH2_CIPHER_AES128_GCM:
2662 return "aes128-gcm@openssh.com(SSH2)";
2663 case SSH2_CIPHER_AES256_GCM:
2664 return "aes256-gcm@openssh.com(SSH2)";
2665
2666 default:
2667 return NULL;
2668 }
2669 }
2670
2671 static void set_move_button_status(HWND dlg, int type, int up, int down)
2672 {
2673 HWND cipherControl = GetDlgItem(dlg, type);
2674 int curPos = (int) SendMessage(cipherControl, LB_GETCURSEL, 0, 0);
2675 int maxPos = (int) SendMessage(cipherControl, LB_GETCOUNT, 0, 0) - 1;
2676
2677 EnableWindow(GetDlgItem(dlg, up),
2678 curPos > 0 && curPos <= maxPos);
2679 EnableWindow(GetDlgItem(dlg, down),
2680 curPos >= 0 && curPos < maxPos);
2681 }
2682
2683 static void init_setup_dlg(PTInstVar pvar, HWND dlg)
2684 {
2685 HWND compressionControl = GetDlgItem(dlg, IDC_SSHCOMPRESSIONLEVEL);
2686 HWND cipherControl = GetDlgItem(dlg, IDC_SSHCIPHERPREFS);
2687 HWND kexControl = GetDlgItem(dlg, IDC_SSHKEX_LIST);
2688 HWND hostkeyControl = GetDlgItem(dlg, IDC_SSHHOST_KEY_LIST);
2689 HWND macControl = GetDlgItem(dlg, IDC_SSHMAC_LIST);
2690 HWND compControl = GetDlgItem(dlg, IDC_SSHCOMP_LIST);
2691 HWND hostkeyRotationControl = GetDlgItem(dlg, IDC_HOSTKEY_ROTATION_STATIC);
2692 HWND hostkeyRotationControlList = GetDlgItem(dlg, IDC_HOSTKEY_ROTATION_COMBO);
2693 int i;
2694 int ch;
2695 char uimsg[MAX_UIMSG];
2696 char *rotationItem[SSH_UPDATE_HOSTKEYS_MAX] = {
2697 "No",
2698 "Yes",
2699 "Ask",
2700 };
2701 char *rotationItemKey[SSH_UPDATE_HOSTKEYS_MAX] = {
2702 "DLG_SSHSETUP_HOSTKEY_ROTATION_NO",
2703 "DLG_SSHSETUP_HOSTKEY_ROTATION_YES",
2704 "DLG_SSHSETUP_HOSTKEY_ROTATION_ASK",
2705 };
2706
2707 GetWindowText(dlg, uimsg, sizeof(uimsg));
2708 UTIL_get_lang_msg("DLG_SSHSETUP_TITLE", pvar, uimsg);
2709 SetWindowText(dlg, pvar->ts->UIMsg);
2710 GetDlgItemText(dlg, IDC_COMPRESSLABEL, uimsg, sizeof(uimsg));
2711 UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS", pvar, uimsg);
2712 SetDlgItemText(dlg, IDC_COMPRESSLABEL, pvar->ts->UIMsg);
2713 GetDlgItemText(dlg, IDC_COMPRESSNONE, uimsg, sizeof(uimsg));
2714 UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS_NONE", pvar, uimsg);
2715 SetDlgItemText(dlg, IDC_COMPRESSNONE, pvar->ts->UIMsg);
2716 GetDlgItemText(dlg, IDC_COMPRESSHIGH, uimsg, sizeof(uimsg));
2717 UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS_HIGHEST", pvar, uimsg);
2718 SetDlgItemText(dlg, IDC_COMPRESSHIGH, pvar->ts->UIMsg);
2719 GetDlgItemText(dlg, IDC_COMPRESSNOTE, uimsg, sizeof(uimsg));
2720 UTIL_get_lang_msg("DLG_SSHSETUP_COMPRESS_NOTE", pvar, uimsg);
2721 SetDlgItemText(dlg, IDC_COMPRESSNOTE, pvar->ts->UIMsg);
2722
2723 GetDlgItemText(dlg, IDC_CIPHERORDER, uimsg, sizeof(uimsg));
2724 UTIL_get_lang_msg("DLG_SSHSETUP_CIPHER", pvar, uimsg);
2725 SetDlgItemText(dlg, IDC_CIPHERORDER, pvar->ts->UIMsg);
2726 GetDlgItemText(dlg, IDC_SSHMOVECIPHERUP, uimsg, sizeof(uimsg));
2727 UTIL_get_lang_msg("DLG_SSHSETUP_CIPHER_UP", pvar, uimsg);
2728 SetDlgItemText(dlg, IDC_SSHMOVECIPHERUP, pvar->ts->UIMsg);
2729 GetDlgItemText(dlg, IDC_SSHMOVECIPHERDOWN, uimsg, sizeof(uimsg));
2730 UTIL_get_lang_msg("DLG_SSHSETUP_CIPHER_DOWN", pvar, uimsg);
2731 SetDlgItemText(dlg, IDC_SSHMOVECIPHERDOWN, pvar->ts->UIMsg);
2732
2733 GetDlgItemText(dlg, IDC_KEX_ORDER, uimsg, sizeof(uimsg));
2734 UTIL_get_lang_msg("DLG_SSHSETUP_KEX", pvar, uimsg);
2735 SetDlgItemText(dlg, IDC_KEX_ORDER, pvar->ts->UIMsg);
2736 GetDlgItemText(dlg, IDC_SSHKEX_MOVEUP, uimsg, sizeof(uimsg));
2737 UTIL_get_lang_msg("DLG_SSHSETUP_KEX_UP", pvar, uimsg);
2738 SetDlgItemText(dlg, IDC_SSHKEX_MOVEUP, pvar->ts->UIMsg);
2739 GetDlgItemText(dlg, IDC_SSHKEX_MOVEDOWN, uimsg, sizeof(uimsg));
2740 UTIL_get_lang_msg("DLG_SSHSETUP_KEX_DOWN", pvar, uimsg);
2741 SetDlgItemText(dlg, IDC_SSHKEX_MOVEDOWN, pvar->ts->UIMsg);
2742
2743 GetDlgItemText(dlg, IDC_HOST_KEY_ORDER, uimsg, sizeof(uimsg));
2744 UTIL_get_lang_msg("DLG_SSHSETUP_HOST_KEY", pvar, uimsg);
2745 SetDlgItemText(dlg, IDC_HOST_KEY_ORDER, pvar->ts->UIMsg);
2746 GetDlgItemText(dlg, IDC_SSHHOST_KEY_MOVEUP, uimsg, sizeof(uimsg));
2747 UTIL_get_lang_msg("DLG_SSHSETUP_HOST_KEY_UP", pvar, uimsg);
2748 SetDlgItemText(dlg, IDC_SSHHOST_KEY_MOVEUP, pvar->ts->UIMsg);
2749 GetDlgItemText(dlg, IDC_SSHHOST_KEY_MOVEDOWN, uimsg, sizeof(uimsg));
2750 UTIL_get_lang_msg("DLG_SSHSETUP_HOST_KEY_DOWN", pvar, uimsg);
2751 SetDlgItemText(dlg, IDC_SSHHOST_KEY_MOVEDOWN, pvar->ts->UIMsg);
2752
2753 GetDlgItemText(dlg, IDC_MAC_ORDER, uimsg, sizeof(uimsg));
2754 UTIL_get_lang_msg("DLG_SSHSETUP_MAC", pvar, uimsg);
2755 SetDlgItemText(dlg, IDC_MAC_ORDER, pvar->ts->UIMsg);
2756 GetDlgItemText(dlg, IDC_SSHMAC_MOVEUP, uimsg, sizeof(uimsg));
2757 UTIL_get_lang_msg("DLG_SSHSETUP_MAC_UP", pvar, uimsg);
2758 SetDlgItemText(dlg, IDC_SSHMAC_MOVEUP, pvar->ts->UIMsg);
2759 GetDlgItemText(dlg, IDC_SSHMAC_MOVEDOWN, uimsg, sizeof(uimsg));
2760 UTIL_get_lang_msg("DLG_SSHSETUP_MAC_DOWN", pvar, uimsg);
2761 SetDlgItemText(dlg, IDC_SSHMAC_MOVEDOWN, pvar->ts->UIMsg);
2762
2763 GetDlgItemText(dlg, IDC_COMP_ORDER, uimsg, sizeof(uimsg));
2764 UTIL_get_lang_msg("DLG_SSHSETUP_COMP", pvar, uimsg);
2765 SetDlgItemText(dlg, IDC_COMP_ORDER, pvar->ts->UIMsg);
2766 GetDlgItemText(dlg, IDC_SSHCOMP_MOVEUP, uimsg, sizeof(uimsg));
2767 UTIL_get_lang_msg("DLG_SSHSETUP_COMP_UP", pvar, uimsg);
2768 SetDlgItemText(dlg, IDC_SSHCOMP_MOVEUP, pvar->ts->UIMsg);
2769 GetDlgItemText(dlg, IDC_SSHCOMP_MOVEDOWN, uimsg, sizeof(uimsg));
2770 UTIL_get_lang_msg("DLG_SSHSETUP_COMP_DOWN", pvar, uimsg);
2771 SetDlgItemText(dlg, IDC_SSHCOMP_MOVEDOWN, pvar->ts->UIMsg);
2772
2773 GetDlgItemText(dlg, IDC_KNOWNHOSTS, uimsg, sizeof(uimsg));
2774 UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST", pvar, uimsg);
2775 SetDlgItemText(dlg, IDC_KNOWNHOSTS, pvar->ts->UIMsg);
2776 GetDlgItemText(dlg, IDC_CHOOSEREADWRITEFILE, uimsg, sizeof(uimsg));
2777 UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST_RW", pvar, uimsg);
2778 SetDlgItemText(dlg, IDC_CHOOSEREADWRITEFILE, pvar->ts->UIMsg);
2779 GetDlgItemText(dlg, IDC_CHOOSEREADONLYFILE, uimsg, sizeof(uimsg));
2780 UTIL_get_lang_msg("DLG_SSHSETUP_KNOWNHOST_RO", pvar, uimsg);
2781 SetDlgItemText(dlg, IDC_CHOOSEREADONLYFILE, pvar->ts->UIMsg);
2782 GetDlgItemText(dlg, IDC_HEARTBEATLABEL, uimsg, sizeof(uimsg));
2783 UTIL_get_lang_msg("DLG_SSHSETUP_HEARTBEAT", pvar, uimsg);
2784 SetDlgItemText(dlg, IDC_HEARTBEATLABEL, pvar->ts->UIMsg);
2785 GetDlgItemText(dlg, IDC_HEARTBEATLABEL2, uimsg, sizeof(uimsg));
2786 UTIL_get_lang_msg("DLG_SSHSETUP_HEARTBEAT_UNIT", pvar, uimsg);
2787 SetDlgItemText(dlg, IDC_HEARTBEATLABEL2, pvar->ts->UIMsg);
2788 GetDlgItemText(dlg, IDC_REMEMBERPASSWORD, uimsg, sizeof(uimsg));
2789 UTIL_get_lang_msg("DLG_SSHSETUP_PASSWORD", pvar, uimsg);
2790 SetDlgItemText(dlg, IDC_REMEMBERPASSWORD, pvar->ts->UIMsg);
2791 GetDlgItemText(dlg, IDC_FORWARDAGENT, uimsg, sizeof(uimsg));
2792 UTIL_get_lang_msg("DLG_SSHSETUP_FORWARDAGENT", pvar, uimsg);
2793 SetDlgItemText(dlg, IDC_FORWARDAGENT, pvar->ts->UIMsg);
2794 GetDlgItemText(dlg, IDC_FORWARDAGENTCONFIRM, uimsg, sizeof(uimsg));
2795 UTIL_get_lang_msg("DLG_SSHSETUP_FORWARDAGENTCONFIRM", pvar, uimsg);
2796 SetDlgItemText(dlg, IDC_FORWARDAGENTCONFIRM, pvar->ts->UIMsg);
2797 GetDlgItemText(dlg, IDC_FORWARDAGENTNOTIFY, uimsg, sizeof(uimsg));
2798 UTIL_get_lang_msg("DLG_SSHSETUP_FORWARDAGENTNOTIFY", pvar, uimsg);
2799 SetDlgItemText(dlg, IDC_FORWARDAGENTNOTIFY, pvar->ts->UIMsg);
2800 GetDlgItemText(dlg, IDC_VERIFYHOSTKEYDNS, uimsg, sizeof(uimsg));
2801 UTIL_get_lang_msg("DLG_SSHSETUP_VERIFYHOSTKEYDNS", pvar, uimsg);
2802 SetDlgItemText(dlg, IDC_VERIFYHOSTKEYDNS, pvar->ts->UIMsg);
2803 GetDlgItemText(dlg, IDC_NOTICEBANNER, uimsg, sizeof(uimsg));
2804 UTIL_get_lang_msg("DLG_SSHSETUP_NOTICE", pvar, uimsg);
2805 SetDlgItemText(dlg, IDC_NOTICEBANNER, pvar->ts->UIMsg);
2806 GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
2807 UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
2808 SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
2809 GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
2810 UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
2811 SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
2812
2813 GetDlgItemText(dlg, IDC_HOSTKEY_ROTATION_STATIC, uimsg, sizeof(uimsg));
2814 UTIL_get_lang_msg("DLG_SSHSETUP_HOSTKEY_ROTATION", pvar, uimsg);
2815 SetDlgItemText(dlg, IDC_HOSTKEY_ROTATION_STATIC, pvar->ts->UIMsg);
2816
2817 SendMessage(compressionControl, TBM_SETRANGE, TRUE, MAKELONG(0, 9));
2818 SendMessage(compressionControl, TBM_SETPOS, TRUE,
2819 pvar->settings.CompressionLevel);
2820
2821 // Cipher order
2822 normalize_cipher_order(pvar->settings.CipherOrder);
2823
2824 for (i = 0; pvar->settings.CipherOrder[i] != 0; i++) {
2825 int cipher = pvar->settings.CipherOrder[i] - '0';
2826 char *name = get_cipher_name(cipher);
2827
2828 if (name != NULL) {
2829 SendMessage(cipherControl, LB_ADDSTRING, 0, (LPARAM) name);
2830 }
2831 }
2832
2833 SendMessage(cipherControl, LB_SETCURSEL, 0, 0);
2834 set_move_button_status(dlg, IDC_SSHCIPHERPREFS, IDC_SSHMOVECIPHERUP, IDC_SSHMOVECIPHERDOWN);
2835
2836 // KEX order
2837 normalize_kex_order(pvar->settings.KexOrder);
2838 for (i = 0; pvar->settings.KexOrder[i] != 0; i++) {
2839 int index = pvar->settings.KexOrder[i] - '0';
2840 char *name = NULL;
2841
2842 if (index == 0) {
2843 UTIL_get_lang_msg("DLG_SSHSETUP_KEX_BORDER", pvar,
2844 "<KEXs below this line are disabled>");
2845 name = pvar->ts->UIMsg;
2846 } else {
2847 name = get_kex_algorithm_name(index);
2848 }
2849
2850 if (name != NULL) {
2851 SendMessage(kexControl, LB_ADDSTRING, 0, (LPARAM) name);
2852 }
2853 }
2854 SendMessage(kexControl, LB_SETCURSEL, 0, 0);
2855 set_move_button_status(dlg, IDC_SSHKEX_LIST, IDC_SSHKEX_MOVEUP, IDC_SSHKEX_MOVEDOWN);
2856
2857 // Host Key order
2858 normalize_host_key_order(pvar->settings.HostKeyOrder);
2859 for (i = 0; pvar->settings.HostKeyOrder[i] != 0; i++) {
2860 int index = pvar->settings.HostKeyOrder[i] - '0';
2861 char *name = NULL;
2862
2863 if (index == 0) {
2864 UTIL_get_lang_msg("DLG_SSHSETUP_HOST_KEY_BORDER", pvar,
2865 "<Host Keys below this line are disabled>");
2866 name = pvar->ts->UIMsg;
2867 } else {
2868 name = get_ssh_keytype_name(index);
2869 }
2870
2871 if (name != NULL) {
2872 SendMessage(hostkeyControl, LB_ADDSTRING, 0, (LPARAM) name);
2873 }
2874 }
2875 SendMessage(hostkeyControl, LB_SETCURSEL, 0, 0);
2876 set_move_button_status(dlg, IDC_SSHHOST_KEY_LIST, IDC_SSHHOST_KEY_MOVEUP, IDC_SSHHOST_KEY_MOVEDOWN);
2877
2878 // MAC order
2879 normalize_mac_order(pvar->settings.MacOrder);
2880 for (i = 0; pvar->settings.MacOrder[i] != 0; i++) {
2881 int index = pvar->settings.MacOrder[i] - '0';