Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 7703 - (hide annotations) (download) (as text)
Tue May 21 14:27:30 2019 UTC (4 years, 10 months ago) by zmatsuo
Original Path: trunk/ttssh2/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 173973 byte(s)
ttssh 無効化していたフォント関連のソースを削除
1 maya 3227 /*
2 doda 6841 * Copyright (c) 1998-2001, Robert O'Callahan
3 zmatsuo 7605 * (C) 2004-2019 TeraTerm Project
4 doda 6841 * 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 maya 3227
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 zmatsuo 7554 #include "teraterm_conf.h"
37 maya 3227 #include "ttxssh.h"
38     #include "fwdui.h"
39     #include "util.h"
40     #include "ssh.h"
41     #include "ttcommon.h"
42 r850 3298 #include "ttlib.h"
43 yutakapon 5545 #include "keyfiles.h"
44 doda 6250 #include "arc4random.h"
45 zmatsuo 7605 #include "auth.h"
46 maya 3227
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 doda 3232 #include <mbstring.h>
55 maya 3227
56     #include "resource.h"
57     #include <commctrl.h>
58     #include <commdlg.h>
59     #include <winsock2.h>
60 doda 6801 static char *ProtocolFamilyList[] = { "UNSPEC", "IPv6", "IPv4", NULL };
61 maya 3227
62 zmatsuo 7542 #include <lmcons.h>
63 maya 3227
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 maya 4321 #include "key.h"
80 zmatsuo 7560 #include "dlglib.h"
81 maya 3227
82     #include "sftp.h"
83    
84     #include "compat_w95.h"
85 zmatsuo 7554 #include "compat_win.h"
86 maya 3227
87 maya 6625 #include "libputty.h"
88 yutakapon 4533
89 zmatsuo 7560 #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 maya 3227 #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 doda 6691 static HICON SecureNotifyIcon = NULL;
106     static HICON OldNotifyIcon = NULL;
107 maya 3227
108 yutakapon 5578 static HFONT DlgAboutTextFont;
109 maya 3227
110 doda 6801 static TInstVar *pvar;
111 maya 3227
112     typedef struct {
113 maya 4307 int cnt;
114     HWND dlg;
115 maya 4378 ssh_keytype type;
116 maya 3227 } cbarg_t;
117    
118     /* WIN32 allows multiple instances of a DLL */
119     static TInstVar InstVar;
120    
121     /*
122     This code makes lots of assumptions about the order in which Tera Term
123     does things, and how. A key assumption is that the Notification window
124     passed into WSAAsyncSelect is the main terminal window. We also assume
125     that the socket used in the first WSAconnect is the main session socket.
126     */
127    
128     static void init_TTSSH(PTInstVar pvar)
129     {
130     pvar->socket = INVALID_SOCKET;
131     pvar->OldLargeIcon = NULL;
132     pvar->OldSmallIcon = NULL;
133     pvar->NotificationWindow = NULL;
134     pvar->hostdlg_activated = FALSE;
135     pvar->socket = INVALID_SOCKET;
136     pvar->NotificationWindow = NULL;
137     pvar->protocol_major = 0;
138     pvar->protocol_minor = 0;
139    
140     PKT_init(pvar);
141     SSH_init(pvar);
142     CRYPT_init(pvar);
143     AUTH_init(pvar);
144     HOSTS_init(pvar);
145     FWD_init(pvar);
146     FWDUI_init(pvar);
147    
148     ssh_heartbeat_lock_initialize();
149     }
150    
151     static void uninit_TTSSH(PTInstVar pvar)
152     {
153     halt_ssh_heartbeat_thread(pvar);
154    
155     ssh2_channel_free();
156    
157     SSH_end(pvar);
158     PKT_end(pvar);
159     AUTH_end(pvar);
160     CRYPT_end(pvar);
161     HOSTS_end(pvar);
162     FWD_end(pvar);
163     FWDUI_end(pvar);
164    
165     if (pvar->OldLargeIcon != NULL) {
166     PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_BIG,
167     (LPARAM) pvar->OldLargeIcon);
168     pvar->OldLargeIcon = NULL;
169     }
170     if (pvar->OldSmallIcon != NULL) {
171     PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_SMALL,
172     (LPARAM) pvar->OldSmallIcon);
173     pvar->OldSmallIcon = NULL;
174     }
175 doda 6691 if (OldNotifyIcon) {
176     SetCustomNotifyIcon(OldNotifyIcon);
177     }
178 maya 3227
179     ssh_heartbeat_lock_finalize();
180     }
181    
182 doda 6801 static void PASCAL TTXInit(PTTSet ts, PComVar cv)
183 maya 3227 {
184     pvar->settings = *pvar->ts_SSH;
185     pvar->ts = ts;
186     pvar->cv = cv;
187     pvar->fatal_error = FALSE;
188     pvar->showing_err = FALSE;
189     pvar->err_msg = NULL;
190    
191     init_TTSSH(pvar);
192     }
193    
194 maya 4378 static void normalize_generic_order(char *buf, char default_strings[], int default_strings_len)
195     {
196     char listed[max(KEX_DH_MAX,max(SSH_CIPHER_MAX,max(KEY_MAX,max(HMAC_MAX,COMP_MAX)))) + 1];
197     char allowed[max(KEX_DH_MAX,max(SSH_CIPHER_MAX,max(KEY_MAX,max(HMAC_MAX,COMP_MAX)))) + 1];
198 maya 6031 int i, j, k=-1;
199 maya 4378
200     memset(listed, 0, sizeof(listed));
201     memset(allowed, 0, sizeof(allowed));
202 yutakapon 6508
203     // �����������������������X�g�������B
204 maya 4378 for (i = 0; i < default_strings_len ; i++) {
205     allowed[default_strings[i]] = 1;
206     }
207    
208 yutakapon 6508 // �w�����������������������A���������������������A�d���������������������B
209     //
210     // ex. (i=5 ����������������)
211     // i=012345
212     // >:=9<87;A@?B3026(\0)
213     // i+1
214     // <------------>
215     // ��
216     // >:=9<7;A@?B3026(\0)
217     //
218 maya 4378 for (i = 0; buf[i] != 0; i++) {
219     int num = buf[i] - '0';
220    
221     if (num < 0 || num > default_strings_len
222     || !allowed[num]
223     || listed[num]) {
224     memmove(buf + i, buf + i + 1, strlen(buf + i + 1) + 1);
225     i--;
226     } else {
227     listed[num] = 1;
228     }
229 maya 6031
230 yutakapon 6508 // disabled line���������A���u���o���������B
231 maya 6031 if (num == 0) {
232     k = i;
233     }
234 maya 4378 }
235    
236 yutakapon 6508 // �w���������������������������Adisabled line�����O���}�������B
237     //
238     // ex. (Z���}������)
239     // k
240     // >:=9<87;A@?B3026(\0)
241     // k+1
242     // <---->
243     // �� k
244     // >:=9<87;A@?B30026(\0)
245     // �� k
246     // >:=9<87;A@?B3Z026(\0)
247     //
248 maya 6031 for (j = 0; j < default_strings_len && default_strings[j] != 0; j++) {
249     int num = default_strings[j];
250    
251     if (!listed[num] && k >= 0) {
252 yutakapon 6508 int copylen = strlen(buf + k + 1) + 1;
253    
254     memmove(buf + k + 1, buf + k, copylen);
255     buf[k + 1 + copylen] = '\0'; // �I�[���Y�������t�����B
256 maya 6031 buf[k] = num + '0';
257     k++;
258     i++;
259     }
260     }
261     if (k < 0) {
262     j = 0;
263     }
264     else {
265     j++;
266     }
267 yutakapon 6508
268     // disabled line�������������������A�����������������������B
269 maya 6031 for (; j < default_strings_len ; j++) {
270     int num = default_strings[j];
271    
272     if (!listed[num]) {
273     buf[i] = num + '0';
274 doda 7454 listed[num] = 1;
275 maya 6031 i++;
276     }
277     }
278 maya 4378
279     buf[i] = 0;
280     }
281    
282 maya 3227 /*
283     * Remove unsupported cipher or duplicated cipher.
284     * Add unspecified ciphers at the end of list.
285     */
286 doda 6801 static void normalize_cipher_order(char *buf)
287 maya 3227 {
288     /* SSH_CIPHER_NONE means that all ciphers below that one are disabled.
289     We *never* allow no encryption. */
290 maya 4378 static char default_strings[] = {
291 doda 6985 SSH2_CIPHER_AES256_GCM,
292 doda 4433 SSH2_CIPHER_CAMELLIA256_CTR,
293 maya 3227 SSH2_CIPHER_AES256_CTR,
294 doda 4433 SSH2_CIPHER_CAMELLIA256_CBC,
295 maya 3227 SSH2_CIPHER_AES256_CBC,
296 doda 4433 SSH2_CIPHER_CAMELLIA192_CTR,
297 maya 3227 SSH2_CIPHER_AES192_CTR,
298 doda 4433 SSH2_CIPHER_CAMELLIA192_CBC,
299 maya 3227 SSH2_CIPHER_AES192_CBC,
300 doda 6985 SSH2_CIPHER_AES128_GCM,
301 doda 4433 SSH2_CIPHER_CAMELLIA128_CTR,
302 maya 3227 SSH2_CIPHER_AES128_CTR,
303 doda 4433 SSH2_CIPHER_CAMELLIA128_CBC,
304 maya 3227 SSH2_CIPHER_AES128_CBC,
305 doda 3850 SSH2_CIPHER_3DES_CTR,
306 maya 3227 SSH2_CIPHER_3DES_CBC,
307 doda 3850 SSH2_CIPHER_BLOWFISH_CTR,
308 maya 3227 SSH2_CIPHER_BLOWFISH_CBC,
309 doda 3850 SSH2_CIPHER_CAST128_CTR,
310 maya 3227 SSH2_CIPHER_CAST128_CBC,
311     SSH_CIPHER_3DES,
312     SSH_CIPHER_NONE,
313 maya 5917 SSH2_CIPHER_ARCFOUR256,
314     SSH2_CIPHER_ARCFOUR128,
315     SSH2_CIPHER_ARCFOUR,
316     SSH_CIPHER_BLOWFISH,
317 maya 3227 SSH_CIPHER_DES,
318 maya 4432 0, 0, 0 // Dummy for SSH_CIPHER_IDEA, SSH_CIPHER_TSS, SSH_CIPHER_RC4
319 maya 3227 };
320    
321 maya 4378 normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings));
322 maya 3227 }
323    
324 doda 6801 static void normalize_kex_order(char *buf)
325 yutakapon 4367 {
326     static char default_strings[] = {
327     KEX_ECDH_SHA2_256,
328     KEX_ECDH_SHA2_384,
329     KEX_ECDH_SHA2_521,
330 doda 6310 KEX_DH_GRP18_SHA512,
331     KEX_DH_GRP16_SHA512,
332 doda 6263 KEX_DH_GRP14_SHA256,
333 yutakapon 4367 KEX_DH_GEX_SHA256,
334     KEX_DH_GEX_SHA1,
335     KEX_DH_GRP14_SHA1,
336     KEX_DH_GRP1_SHA1,
337     KEX_DH_NONE,
338     };
339    
340     normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings));
341     }
342    
343 doda 6801 static void normalize_host_key_order(char *buf)
344 yutakapon 4367 {
345     static char default_strings[] = {
346     KEY_ECDSA256,
347     KEY_ECDSA384,
348     KEY_ECDSA521,
349 yutakapon 5545 KEY_ED25519,
350 yutakapon 4367 KEY_RSA,
351     KEY_DSA,
352     KEY_NONE,
353     };
354    
355     normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings));
356     }
357    
358 doda 6801 static void normalize_mac_order(char *buf)
359 yutakapon 4367 {
360     static char default_strings[] = {
361 doda 6969 HMAC_SHA2_512_EtM,
362     HMAC_SHA2_256_EtM,
363     HMAC_SHA1_EtM,
364 doda 4434 HMAC_SHA2_512,
365     HMAC_SHA2_256,
366 yutakapon 4367 HMAC_SHA1,
367 doda 6969 HMAC_RIPEMD160_EtM,
368 doda 4423 HMAC_RIPEMD160,
369 doda 6969 HMAC_MD5_EtM,
370 yutakapon 4367 HMAC_MD5,
371 doda 4426 HMAC_NONE,
372 doda 6969 HMAC_SHA1_96_EtM,
373     HMAC_MD5_96_EtM,
374 doda 4434 HMAC_SHA1_96,
375     HMAC_MD5_96,
376 doda 5016 0, // Dummy for HMAC_SHA2_512_96,
377     0, // Dummy for HMAC_SHA2_256_96,
378 yutakapon 4367 };
379    
380     normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings));
381     }
382    
383 doda 6801 static void normalize_comp_order(char *buf)
384 yutakapon 4367 {
385     static char default_strings[] = {
386 doda 4371 COMP_DELAYED,
387     COMP_ZLIB,
388 maya 4378 COMP_NOCOMP,
389 yutakapon 4367 COMP_NONE,
390     };
391    
392     normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings));
393     }
394    
395    
396 maya 3227 /* Remove local settings from the shared memory block. */
397     static void clear_local_settings(PTInstVar pvar)
398     {
399     pvar->ts_SSH->TryDefaultAuth = FALSE;
400     }
401    
402 doda 6801 static BOOL read_BOOL_option(PCHAR fileName, char *keyName, BOOL def)
403 maya 3227 {
404     char buf[1024];
405    
406     buf[0] = 0;
407     GetPrivateProfileString("TTSSH", keyName, "", buf, sizeof(buf),
408     fileName);
409     if (buf[0] == 0) {
410     return def;
411     } else {
412     return atoi(buf) != 0 ||
413     _stricmp(buf, "yes") == 0 ||
414     _stricmp(buf, "y") == 0;
415     }
416     }
417    
418 doda 6801 static void read_string_option(PCHAR fileName, char *keyName,
419     char *def, char *buf, int bufSize)
420 maya 3227 {
421    
422     buf[0] = 0;
423     GetPrivateProfileString("TTSSH", keyName, def, buf, bufSize, fileName);
424     }
425    
426     static void read_ssh_options(PTInstVar pvar, PCHAR fileName)
427     {
428     char buf[1024];
429 doda 6801 TS_SSH *settings = pvar->ts_SSH;
430 maya 3227
431     #define READ_STD_STRING_OPTION(name) \
432     read_string_option(fileName, #name, "", settings->name, sizeof(settings->name))
433    
434     settings->Enabled = read_BOOL_option(fileName, "Enabled", FALSE);
435    
436     buf[0] = 0;
437     GetPrivateProfileString("TTSSH", "Compression", "", buf, sizeof(buf),
438     fileName);
439     settings->CompressionLevel = atoi(buf);
440     if (settings->CompressionLevel < 0 || settings->CompressionLevel > 9) {
441     settings->CompressionLevel = 0;
442     }
443    
444     READ_STD_STRING_OPTION(DefaultUserName);
445 zmatsuo 7632 settings->DefaultUserType = GetPrivateProfileInt("TTSSH", "DefaultUserType", 1, fileName);
446    
447 maya 3227 READ_STD_STRING_OPTION(DefaultForwarding);
448     READ_STD_STRING_OPTION(DefaultRhostsLocalUserName);
449     READ_STD_STRING_OPTION(DefaultRhostsHostPrivateKeyFile);
450     READ_STD_STRING_OPTION(DefaultRSAPrivateKeyFile);
451    
452     READ_STD_STRING_OPTION(CipherOrder);
453     normalize_cipher_order(settings->CipherOrder);
454    
455 yutakapon 4367 // KEX order
456     READ_STD_STRING_OPTION(KexOrder);
457     normalize_kex_order(settings->KexOrder);
458     // Host Key algorithm order
459     READ_STD_STRING_OPTION(HostKeyOrder);
460     normalize_host_key_order(settings->HostKeyOrder);
461 doda 6821 // HMAC order
462 yutakapon 4367 READ_STD_STRING_OPTION(MacOrder);
463     normalize_mac_order(settings->MacOrder);
464     // Compression algorithm order
465     READ_STD_STRING_OPTION(CompOrder);
466     normalize_comp_order(settings->CompOrder);
467    
468 maya 3227 read_string_option(fileName, "KnownHostsFiles", "ssh_known_hosts",
469     settings->KnownHostsFiles,
470     sizeof(settings->KnownHostsFiles));
471    
472     buf[0] = 0;
473     GetPrivateProfileString("TTSSH", "DefaultAuthMethod", "", buf,
474     sizeof(buf), fileName);
475     settings->DefaultAuthMethod = atoi(buf);
476     if (settings->DefaultAuthMethod != SSH_AUTH_PASSWORD
477     && settings->DefaultAuthMethod != SSH_AUTH_RSA
478     && settings->DefaultAuthMethod != SSH_AUTH_TIS // add (2005.3.12 yutaka)
479     && settings->DefaultAuthMethod != SSH_AUTH_RHOSTS
480     && settings->DefaultAuthMethod != SSH_AUTH_PAGEANT) {
481     /* this default can never be SSH_AUTH_RHOSTS_RSA because that is not a
482     selection in the dialog box; SSH_AUTH_RHOSTS_RSA is automatically chosen
483     when the dialog box has rhosts selected and an host private key file
484     is supplied. */
485     settings->DefaultAuthMethod = SSH_AUTH_PASSWORD;
486     }
487    
488     buf[0] = 0;
489     GetPrivateProfileString("TTSSH", "LogLevel", "", buf, sizeof(buf),
490     fileName);
491     settings->LogLevel = atoi(buf);
492    
493     buf[0] = 0;
494     GetPrivateProfileString("TTSSH", "WriteBufferSize", "", buf,
495     sizeof(buf), fileName);
496     settings->WriteBufferSize = atoi(buf);
497     if (settings->WriteBufferSize <= 0) {
498     settings->WriteBufferSize = (PACKET_MAX_SIZE / 2); // 2MB
499     }
500    
501     // SSH protocol version (2004.10.11 yutaka)
502     // default is SSH2 (2004.11.30 yutaka)
503     settings->ssh_protocol_version = GetPrivateProfileInt("TTSSH", "ProtocolVersion", 2, fileName);
504    
505     // SSH heartbeat time(second) (2004.12.11 yutaka)
506     settings->ssh_heartbeat_overtime = GetPrivateProfileInt("TTSSH", "HeartBeat", 60, fileName);
507    
508     // �p�X���[�h�F�����������J���F�����g���p�X���[�h����������������������������������
509     // �\���B(2006.8.5 yutaka)
510     settings->remember_password = GetPrivateProfileInt("TTSSH", "RememberPassword", 1, fileName);
511    
512     // �������F���_�C�A���O���T�|�[�g�������������\�b�h���`�F�b�N���A
513     // ���������\�b�h���O���C�A�E�g���� (2007.9.24 maya)
514     settings->CheckAuthListFirst = read_BOOL_option(fileName, "CheckAuthListFirst", FALSE);
515    
516     // 768bit ������ RSA ���������T�[�o�����������L�������� (2008.9.11 maya)
517     settings->EnableRsaShortKeyServer = read_BOOL_option(fileName, "EnableRsaShortKeyServer", FALSE);
518    
519     // agent forward ���L�������� (2008.11.25 maya)
520     settings->ForwardAgent = read_BOOL_option(fileName, "ForwardAgent", FALSE);
521    
522 maya 4229 // agent forward �m�F���L��������
523     settings->ForwardAgentConfirm = read_BOOL_option(fileName, "ForwardAgentConfirm", TRUE);
524    
525 doda 6663 // agent forward �m�F���L��������
526     settings->ForwardAgentNotify = read_BOOL_option(fileName, "ForwardAgentNotify", TRUE);
527    
528 doda 4531 // �z�X�g���� DNS �����`�F�b�N (RFC 4255)
529 doda 4619 settings->VerifyHostKeyDNS = read_BOOL_option(fileName, "VerifyHostKeyDNS", TRUE);
530 doda 4531
531 doda 5261 // icon
532     GetPrivateProfileString("TTSSH", "SSHIcon", "", buf, sizeof(buf), fileName);
533     if ((_stricmp(buf, "old") == 0) ||
534     (_stricmp(buf, "yellow") == 0) ||
535     (_stricmp(buf, "securett_yellow") == 0)) {
536     settings->IconID = IDI_SECURETT_YELLOW;
537     }
538 maya 6386 else if ((_stricmp(buf, "green") == 0) ||
539     (_stricmp(buf, "securett_green") == 0)) {
540     settings->IconID = IDI_SECURETT_GREEN;
541     }
542 doda 5261 else {
543     settings->IconID = IDI_SECURETT;
544     }
545    
546 yutakapon 5620 // �G���[�������x�������|�b�v�A�b�v���b�Z�[�W���}�~���� (2014.6.26 yutaka)
547     settings->DisablePopupMessage = GetPrivateProfileInt("TTSSH", "DisablePopupMessage", 0, fileName);
548    
549 doda 5793 READ_STD_STRING_OPTION(X11Display);
550    
551 yutakapon 5849 settings->UpdateHostkeys = GetPrivateProfileInt("TTSSH", "UpdateHostkeys", 0, fileName);
552 yutakapon 5839
553 doda 5900 settings->GexMinimalGroupSize = GetPrivateProfileInt("TTSSH", "GexMinimalGroupSize", 0, fileName);
554    
555 doda 7048 settings->AuthBanner = GetPrivateProfileInt("TTSSH", "AuthBanner", 1, fileName);
556    
557 maya 3227 clear_local_settings(pvar);
558     }
559    
560     static void write_ssh_options(PTInstVar pvar, PCHAR fileName,
561 doda 6801 TS_SSH *settings, BOOL copy_forward)
562 maya 3227 {
563     char buf[1024];
564    
565     WritePrivateProfileString("TTSSH", "Enabled",
566     settings->Enabled ? "1" : "0", fileName);
567    
568     _itoa(settings->CompressionLevel, buf, 10);
569     WritePrivateProfileString("TTSSH", "Compression", buf, fileName);
570    
571 zmatsuo 7632 _itoa(settings->DefaultUserType, buf, 10);
572     WritePrivateProfileString("TTSSH", "DefaultUserType", buf, fileName);
573 maya 3227 WritePrivateProfileString("TTSSH", "DefaultUserName",
574     settings->DefaultUserName, fileName);
575    
576     if (copy_forward) {
577     WritePrivateProfileString("TTSSH", "DefaultForwarding",
578 maya 5960 settings->DefaultForwarding, fileName);
579 maya 3227 }
580    
581     WritePrivateProfileString("TTSSH", "CipherOrder",
582     settings->CipherOrder, fileName);
583    
584 yutakapon 4367 WritePrivateProfileString("TTSSH", "KexOrder",
585     settings->KexOrder, fileName);
586    
587     WritePrivateProfileString("TTSSH", "HostKeyOrder",
588     settings->HostKeyOrder, fileName);
589    
590     WritePrivateProfileString("TTSSH", "MacOrder",
591     settings->MacOrder, fileName);
592    
593     WritePrivateProfileString("TTSSH", "CompOrder",
594     settings->CompOrder, fileName);
595    
596 maya 3227 WritePrivateProfileString("TTSSH", "KnownHostsFiles",
597     settings->KnownHostsFiles, fileName);
598    
599     WritePrivateProfileString("TTSSH", "DefaultRhostsLocalUserName",
600     settings->DefaultRhostsLocalUserName,
601     fileName);
602    
603     WritePrivateProfileString("TTSSH", "DefaultRhostsHostPrivateKeyFile",
604     settings->DefaultRhostsHostPrivateKeyFile,
605     fileName);
606    
607     WritePrivateProfileString("TTSSH", "DefaultRSAPrivateKeyFile",
608     settings->DefaultRSAPrivateKeyFile,
609     fileName);
610    
611     _itoa(settings->DefaultAuthMethod, buf, 10);
612     WritePrivateProfileString("TTSSH", "DefaultAuthMethod", buf, fileName);
613    
614     _itoa(settings->LogLevel, buf, 10);
615     WritePrivateProfileString("TTSSH", "LogLevel", buf, fileName);
616    
617     _itoa(settings->WriteBufferSize, buf, 10);
618     WritePrivateProfileString("TTSSH", "WriteBufferSize", buf, fileName);
619    
620     // SSH protocol version (2004.10.11 yutaka)
621     WritePrivateProfileString("TTSSH", "ProtocolVersion",
622     settings->ssh_protocol_version==2 ? "2" : "1",
623     fileName);
624    
625     // SSH heartbeat time(second) (2004.12.11 yutaka)
626     _snprintf_s(buf, sizeof(buf), _TRUNCATE,
627     "%d", settings->ssh_heartbeat_overtime);
628     WritePrivateProfileString("TTSSH", "HeartBeat", buf, fileName);
629    
630     // Remember password (2006.8.5 yutaka)
631     WritePrivateProfileString("TTSSH", "RememberPassword",
632     settings->remember_password ? "1" : "0",
633     fileName);
634    
635     // �������F���_�C�A���O���T�|�[�g�������������\�b�h���`�F�b�N���A
636     // ���������\�b�h���O���C�A�E�g���� (2007.9.24 maya)
637     WritePrivateProfileString("TTSSH", "CheckAuthListFirst",
638     settings->CheckAuthListFirst ? "1" : "0", fileName);
639    
640     // 768bit ������ RSA ���������T�[�o�����������L�������� (2008.9.11 maya)
641     WritePrivateProfileString("TTSSH", "EnableRsaShortKeyServer",
642     settings->EnableRsaShortKeyServer ? "1" : "0", fileName);
643    
644     // agent forward ���L�������� (2008.11.25 maya)
645     WritePrivateProfileString("TTSSH", "ForwardAgent",
646     settings->ForwardAgent ? "1" : "0", fileName);
647 maya 4229
648     // agent forward �m�F���L��������
649     WritePrivateProfileString("TTSSH", "ForwardAgentConfirm",
650     settings->ForwardAgentConfirm ? "1" : "0", fileName);
651 doda 4531
652 doda 6663 // agent forward ���m���L��������
653     WritePrivateProfileString("TTSSH", "ForwardAgentNotify",
654     settings->ForwardAgentNotify ? "1" : "0", fileName);
655    
656 doda 4531 // �z�X�g���� DNS �����`�F�b�N (RFC 4255)
657     WritePrivateProfileString("TTSSH", "VerifyHostKeyDNS",
658     settings->VerifyHostKeyDNS ? "1" : "0", fileName);
659 doda 5294
660     // SSH �A�C�R��
661 maya 6386 if (settings->IconID==IDI_SECURETT_YELLOW) {
662     WritePrivateProfileString("TTSSH", "SSHIcon", "yellow", fileName);
663     }
664     else if (settings->IconID==IDI_SECURETT_GREEN) {
665     WritePrivateProfileString("TTSSH", "SSHIcon", "green", fileName);
666     }
667     else {
668     WritePrivateProfileString("TTSSH", "SSHIcon", "Default", fileName);
669     }
670 yutakapon 5620
671     _itoa(settings->DisablePopupMessage, buf, 10);
672     WritePrivateProfileString("TTSSH", "DisablePopupMessage", buf, fileName);
673 doda 5793
674     WritePrivateProfileString("TTSSH", "X11Display", settings->X11Display, fileName);
675 yutakapon 5839
676 yutakapon 5849 _snprintf_s(buf, sizeof(buf), _TRUNCATE,
677     "%d", settings->UpdateHostkeys);
678     WritePrivateProfileString("TTSSH", "UpdateHostkeys", buf, fileName);
679 doda 5900
680     _itoa_s(settings->GexMinimalGroupSize, buf, sizeof(buf), 10);
681     WritePrivateProfileString("TTSSH", "GexMinimalGroupSize", buf, fileName);
682 doda 7048
683     _itoa_s(settings->AuthBanner, buf, sizeof(buf), 10);
684     WritePrivateProfileString("TTSSH", "AuthBanner", buf, fileName);
685 maya 3227 }
686    
687    
688     /* find free port in all protocol family */
689     static unsigned short find_local_port(PTInstVar pvar)
690     {
691     int tries;
692     SOCKET connecter;
693     struct addrinfo hints;
694 doda 6801 struct addrinfo *res;
695     struct addrinfo *res0;
696 maya 3227 unsigned short port;
697     char pname[NI_MAXHOST];
698    
699     if (pvar->session_settings.DefaultAuthMethod != SSH_AUTH_RHOSTS) {
700     return 0;
701     }
702    
703     /* The random numbers here are only used to try to get fresh
704     ports across runs (dangling ports can cause bind errors
705     if we're unlucky). They do not need to be (and are not)
706     cryptographically strong.
707     */
708     srand((unsigned) GetTickCount());
709    
710     for (tries = 20; tries > 0; tries--) {
711     memset(&hints, 0, sizeof(hints));
712     hints.ai_family = pvar->ts->ProtocolFamily;
713     hints.ai_flags = AI_PASSIVE;
714     hints.ai_socktype = SOCK_STREAM;
715     port = (unsigned) rand() % 512 + 512;
716     _snprintf_s(pname, sizeof(pname), _TRUNCATE, "%d", (int) port);
717     if (getaddrinfo(NULL, pname, &hints, &res0)) {
718     return 0;
719     /* NOT REACHED */
720     }
721    
722     for (res = res0; res; res = res->ai_next) {
723     if (res->ai_family == AF_INET || res->ai_family == AF_INET6)
724     continue;
725    
726     connecter =
727     socket(res->ai_family, res->ai_socktype, res->ai_protocol);
728     if (connecter == INVALID_SOCKET) {
729     freeaddrinfo(res0);
730     return 0;
731     }
732    
733     if (bind(connecter, res->ai_addr, res->ai_addrlen) !=
734     SOCKET_ERROR) {
735     return port;
736     freeaddrinfo(res0);
737     closesocket(connecter);
738     } else if (WSAGetLastError() != WSAEADDRINUSE) {
739     closesocket(connecter);
740     freeaddrinfo(res0);
741     return 0;
742     }
743    
744     closesocket(connecter);
745     }
746     freeaddrinfo(res0);
747     }
748    
749     return 0;
750     }
751    
752 doda 6801 static int PASCAL TTXconnect(SOCKET s,
753     const struct sockaddr *name,
754 maya 3227 int namelen)
755     {
756 maya 4584 if (pvar->socket == INVALID_SOCKET || pvar->socket != s) {
757 maya 3227 struct sockaddr_storage ss;
758     int len;
759    
760     pvar->socket = s;
761    
762     memset(&ss, 0, sizeof(ss));
763     switch (pvar->ts->ProtocolFamily) {
764     case AF_INET:
765     len = sizeof(struct sockaddr_in);
766 doda 6801 ((struct sockaddr_in *) &ss)->sin_family = AF_INET;
767     ((struct sockaddr_in *) &ss)->sin_addr.s_addr = INADDR_ANY;
768     ((struct sockaddr_in *) &ss)->sin_port =
769 maya 3227 htons(find_local_port(pvar));
770     break;
771     case AF_INET6:
772     len = sizeof(struct sockaddr_in6);
773 doda 6801 ((struct sockaddr_in6 *) &ss)->sin6_family = AF_INET6;
774 zmatsuo 7197 ((struct sockaddr_in6 *) &ss)->sin6_addr = in6addr_any;
775 doda 6801 ((struct sockaddr_in6 *) &ss)->sin6_port =
776 maya 3227 htons(find_local_port(pvar));
777     break;
778     default:
779 maya 4586 /* UNSPEC */
780 zmatsuo 7197 len = sizeof(ss);
781     ss.ss_family = AF_UNSPEC;
782 maya 3227 break;
783     }
784    
785 doda 6801 bind(s, (struct sockaddr *) &ss, len);
786 maya 3227 }
787    
788     return (pvar->Pconnect) (s, name, namelen);
789     }
790    
791 doda 6801 static int PASCAL TTXWSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg,
792 maya 3227 long lEvent)
793     {
794     if (s == pvar->socket) {
795     pvar->notification_events = lEvent;
796     pvar->notification_msg = wMsg;
797    
798     if (pvar->NotificationWindow == NULL) {
799     pvar->NotificationWindow = hWnd;
800     AUTH_advance_to_next_cred(pvar);
801     }
802     }
803    
804     return (pvar->PWSAAsyncSelect) (s, hWnd, wMsg, lEvent);
805     }
806    
807 doda 6801 static int PASCAL TTXrecv(SOCKET s, char *buf, int len, int flags)
808 maya 3227 {
809     if (s == pvar->socket) {
810     int ret;
811    
812     ssh_heartbeat_lock();
813     ret = PKT_recv(pvar, buf, len);
814     ssh_heartbeat_unlock();
815     return (ret);
816    
817     } else {
818     return (pvar->Precv) (s, buf, len, flags);
819     }
820     }
821    
822 doda 6801 static int PASCAL TTXsend(SOCKET s, char const *buf, int len,
823 maya 3227 int flags)
824     {
825     if (s == pvar->socket) {
826     ssh_heartbeat_lock();
827     SSH_send(pvar, buf, len);
828     ssh_heartbeat_unlock();
829     return len;
830     } else {
831     return (pvar->Psend) (s, buf, len, flags);
832     }
833     }
834    
835     void notify_established_secure_connection(PTInstVar pvar)
836     {
837     int fuLoad = LR_DEFAULTCOLOR;
838    
839 yutakapon 6286 if (IsWindowsNT4()) {
840 maya 3227 fuLoad = LR_VGACOLOR;
841     }
842    
843     // LoadIcon �������� LoadImage ���g�����������A
844     // 16x16 ���A�C�R���������I�������������������� (2006.8.9 maya)
845     if (SecureLargeIcon == NULL) {
846 doda 5261 SecureLargeIcon = LoadImage(hInst, MAKEINTRESOURCE(pvar->settings.IconID),
847 maya 3227 IMAGE_ICON, 0, 0, fuLoad);
848     }
849     if (SecureSmallIcon == NULL) {
850 doda 5261 SecureSmallIcon = LoadImage(hInst, MAKEINTRESOURCE(pvar->settings.IconID),
851 maya 3227 IMAGE_ICON, 16, 16, fuLoad);
852     }
853    
854     if (SecureLargeIcon != NULL && SecureSmallIcon != NULL) {
855     pvar->OldLargeIcon =
856 maya 3454 (HICON) SendMessage(pvar->NotificationWindow, WM_GETICON,
857     ICON_BIG, 0);
858 maya 3227 pvar->OldSmallIcon =
859     (HICON) SendMessage(pvar->NotificationWindow, WM_GETICON,
860     ICON_SMALL, 0);
861    
862     PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_BIG,
863     (LPARAM) SecureLargeIcon);
864     PostMessage(pvar->NotificationWindow, WM_SETICON, ICON_SMALL,
865     (LPARAM) SecureSmallIcon);
866     }
867    
868 doda 6691 if (IsWindows2000()) {
869     if (SecureNotifyIcon == NULL) {
870     SecureNotifyIcon = LoadImage(hInst, MAKEINTRESOURCE(pvar->settings.IconID),
871     IMAGE_ICON, 0, 0, LR_VGACOLOR | LR_SHARED);
872     }
873     OldNotifyIcon = GetCustomNotifyIcon();
874     SetCustomNotifyIcon(SecureNotifyIcon);
875     }
876    
877 doda 6809 logputs(LOG_LEVEL_VERBOSE, "Entering secure mode");
878 maya 3227 }
879    
880 doda 6801 void notify_closed_connection(PTInstVar pvar, char *send_msg)
881 maya 3227 {
882 maya 5678 SSH_notify_disconnecting(pvar, send_msg);
883 maya 3227 AUTH_notify_disconnecting(pvar);
884     HOSTS_notify_disconnecting(pvar);
885    
886     PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,
887     pvar->socket, MAKELPARAM(FD_CLOSE, 0));
888     }
889    
890 doda 6801 static void add_err_msg(PTInstVar pvar, char *msg)
891 maya 3227 {
892     if (pvar->err_msg != NULL) {
893     int buf_len = strlen(pvar->err_msg) + 3 + strlen(msg);
894 doda 6801 char *buf = (char *) malloc(buf_len);
895 maya 3227
896     strncpy_s(buf, buf_len, pvar->err_msg, _TRUNCATE);
897     strncat_s(buf, buf_len, "\n\n", _TRUNCATE);
898     strncat_s(buf, buf_len, msg, _TRUNCATE);
899     free(pvar->err_msg);
900     pvar->err_msg = buf;
901     } else {
902     pvar->err_msg = _strdup(msg);
903     }
904     }
905    
906 doda 6801 void notify_nonfatal_error(PTInstVar pvar, char *msg)
907 maya 3227 {
908     if (!pvar->showing_err) {
909     // �������������������m���E�B���h�E�����������A�f�X�N�g�b�v���I�[�i�[������
910     // ���b�Z�[�W�{�b�N�X���o���������B(2006.6.11 yutaka)
911     if (pvar->NotificationWindow == NULL) {
912 doda 6688 UTIL_get_lang_msg("MSG_NONFATAL_ERROR", pvar,
913 maya 3227 "Tera Term: not fatal error");
914     MessageBox(NULL, msg, pvar->ts->UIMsg, MB_OK|MB_ICONINFORMATION);
915     msg[0] = '\0';
916    
917     } else {
918     PostMessage(pvar->NotificationWindow, WM_COMMAND,
919     ID_SSHASYNCMESSAGEBOX, 0);
920     }
921     }
922     if (msg[0] != 0) {
923 doda 6809 logputs(LOG_LEVEL_ERROR, msg);
924 maya 3227 add_err_msg(pvar, msg);
925     }
926     }
927    
928 doda 6801 void notify_fatal_error(PTInstVar pvar, char *msg, BOOL send_disconnect)
929 maya 3227 {
930     if (msg[0] != 0) {
931 doda 6809 logputs(LOG_LEVEL_FATAL, msg);
932 maya 3227 add_err_msg(pvar, msg);
933     }
934    
935     if (!pvar->fatal_error) {
936     pvar->fatal_error = TRUE;
937    
938 maya 5678 if (send_disconnect) {
939     SSH_notify_disconnecting(pvar, msg);
940     }
941 maya 3227 AUTH_notify_disconnecting(pvar);
942     HOSTS_notify_disconnecting(pvar);
943    
944     PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY,
945     pvar->socket, MAKELPARAM(FD_CLOSE,
946     (pvar->PWSAGetLastError) ()));
947     }
948     }
949    
950 doda 6809 void logputs(int level, char *msg)
951 maya 3227 {
952 doda 6823 if (level <= pvar->settings.LogLevel) {
953 doda 7016 char buf[4096];
954 maya 3227 int file;
955    
956     get_teraterm_dir_relative_name(buf, NUM_ELEM(buf), "TTSSH.LOG");
957     file = _open(buf, _O_RDWR | _O_APPEND | _O_CREAT | _O_TEXT,
958     _S_IREAD | _S_IWRITE);
959    
960     if (file >= 0) {
961 doda 6778 char *strtime = mctimelocal("%Y-%m-%d %H:%M:%S.%NZ", TRUE);
962 maya 4546 DWORD processid;
963 maya 3227 char tmp[26];
964 maya 4546
965     _write(file, strtime, strlen(strtime));
966 maya 3227 GetWindowThreadProcessId(pvar->cv->HWin, &processid);
967     _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, " [%lu] ",processid);
968     _write(file, tmp, strlen(tmp));
969     _write(file, msg, strlen(msg));
970     _write(file, "\n", 1);
971     _close(file);
972     }
973     }
974     }
975    
976 zmatsuo 7648 #if defined(_MSC_VER)
977     void logprintf(int level, _Printf_format_string_ const char *fmt, ...)
978     #else
979     void logprintf(int level, const char *fmt, ...)
980     #endif
981 doda 6051 {
982     char buff[4096];
983     va_list params;
984    
985 doda 6823 if (level <= pvar->settings.LogLevel) {
986 doda 6051 va_start(params, fmt);
987     vsnprintf_s(buff, sizeof(buff), _TRUNCATE, fmt, params);
988     va_end(params);
989    
990 doda 6809 logputs(level, buff);
991 doda 6051 }
992     }
993    
994 yutakapon 6302 static void format_line_hexdump(char *buf, int buflen, int addr, int *bytes, int byte_cnt)
995     {
996     int i, c;
997     char tmp[128];
998    
999     buf[0] = 0;
1000    
1001     /* �������A�h���X�\�� */
1002     _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%08X : ", addr);
1003     strncat_s(buf, buflen, tmp, _TRUNCATE);
1004    
1005     /* �o�C�i���\���i4�o�C�g�������������}���j*/
1006     for (i = 0; i < byte_cnt; i++) {
1007     if (i > 0 && i % 4 == 0) {
1008     strncat_s(buf, buflen, " ", _TRUNCATE);
1009     }
1010    
1011     _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%02X", bytes[i]);
1012     strncat_s(buf, buflen, tmp, _TRUNCATE);
1013     }
1014    
1015     /* ASCII�\���������������������� */
1016     _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, " %*s%*s", (16 - byte_cnt) * 2 + 1, " ", (16 - byte_cnt + 3) / 4, " ");
1017     strncat_s(buf, buflen, tmp, _TRUNCATE);
1018    
1019     /* ASCII�\�� */
1020     for (i = 0; i < byte_cnt; i++) {
1021     c = bytes[i];
1022     if (isprint(c)) {
1023     _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%c", c);
1024     strncat_s(buf, buflen, tmp, _TRUNCATE);
1025     }
1026     else {
1027     strncat_s(buf, buflen, ".", _TRUNCATE);
1028     }
1029     }
1030    
1031     //strncat_s(buf, buflen, "\n", _TRUNCATE);
1032     }
1033    
1034 zmatsuo 7648 #if defined(_MSC_VER)
1035     void logprintf_hexdump(int level, const char *data, int len, _Printf_format_string_ const char *fmt, ...)
1036     #else
1037     void logprintf_hexdump(int level, const char *data, int len, const char *fmt, ...)
1038     #endif
1039 yutakapon 6302 {
1040     char buff[4096];
1041     va_list params;
1042     int c, addr;
1043     int bytes[16], *ptr;
1044     int byte_cnt;
1045     int i;
1046    
1047 doda 6823 if (level <= pvar->settings.LogLevel) {
1048 yutakapon 6302 va_start(params, fmt);
1049     vsnprintf_s(buff, sizeof(buff), _TRUNCATE, fmt, params);
1050     va_end(params);
1051    
1052 doda 6809 logputs(level, buff);
1053 yutakapon 6302
1054     addr = 0;
1055     byte_cnt = 0;
1056     ptr = bytes;
1057     for (i = 0; i < len; i++) {
1058     c = data[i];
1059     *ptr++ = c & 0xff;
1060     byte_cnt++;
1061    
1062     if (byte_cnt == 16) {
1063     format_line_hexdump(buff, sizeof(buff), addr, bytes, byte_cnt);
1064 doda 6809 logputs(level, buff);
1065 yutakapon 6302
1066     addr += 16;
1067     byte_cnt = 0;
1068     ptr = bytes;
1069     }
1070     }
1071    
1072     if (byte_cnt > 0) {
1073     format_line_hexdump(buff, sizeof(buff), addr, bytes, byte_cnt);
1074 doda 6809 logputs(level, buff);
1075 yutakapon 6302 }
1076     }
1077     }
1078    
1079 doda 6801 static void PASCAL TTXOpenTCP(TTXSockHooks *hooks)
1080 maya 3227 {
1081     if (pvar->settings.Enabled) {
1082     // TCPLocalEcho/TCPCRSend ������������ (maya 2007.4.25)
1083 doda 3579 pvar->origDisableTCPEchoCR = pvar->ts->DisableTCPEchoCR;
1084 maya 3227 pvar->ts->DisableTCPEchoCR = TRUE;
1085    
1086     pvar->session_settings = pvar->settings;
1087    
1088 doda 6809 logputs(LOG_LEVEL_VERBOSE, "---------------------------------------------------------------------");
1089     logputs(LOG_LEVEL_VERBOSE, "Initiating SSH session");
1090 maya 3227
1091     FWDUI_load_settings(pvar);
1092    
1093     pvar->cv->TelAutoDetect = FALSE;
1094     /* This next line should not be needed because Tera Term's
1095     CommLib should find ts->Telnet == 0 ... but we'll do this
1096     just to be on the safe side. */
1097     pvar->cv->TelFlag = FALSE;
1098 doda 3495 pvar->cv->TelLineMode = FALSE;
1099 maya 3227
1100     pvar->Precv = *hooks->Precv;
1101     pvar->Psend = *hooks->Psend;
1102     pvar->PWSAAsyncSelect = *hooks->PWSAAsyncSelect;
1103     pvar->Pconnect = *hooks->Pconnect;
1104     pvar->PWSAGetLastError = *hooks->PWSAGetLastError;
1105    
1106     *hooks->Precv = TTXrecv;
1107     *hooks->Psend = TTXsend;
1108     *hooks->PWSAAsyncSelect = TTXWSAAsyncSelect;
1109     *hooks->Pconnect = TTXconnect;
1110    
1111     SSH_open(pvar);
1112     HOSTS_open(pvar);
1113     FWDUI_open(pvar);
1114    
1115     // ������ myproposal �����f���������A�������O�����������B (2006.6.26 maya)
1116     SSH2_update_cipher_myproposal(pvar);
1117 yutakapon 4367 SSH2_update_kex_myproposal(pvar);
1118     SSH2_update_host_key_myproposal(pvar);
1119     SSH2_update_hmac_myproposal(pvar);
1120 maya 3227 SSH2_update_compression_myproposal(pvar);
1121     }
1122     }
1123    
1124 doda 6801 static void PASCAL TTXCloseTCP(TTXSockHooks *hooks)
1125 maya 3227 {
1126     if (pvar->session_settings.Enabled) {
1127     pvar->socket = INVALID_SOCKET;
1128    
1129 doda 6809 logputs(LOG_LEVEL_VERBOSE, "Terminating SSH session...");
1130 maya 3227
1131     *hooks->Precv = pvar->Precv;
1132     *hooks->Psend = pvar->Psend;
1133     *hooks->PWSAAsyncSelect = pvar->PWSAAsyncSelect;
1134     *hooks->Pconnect = pvar->Pconnect;
1135 doda 3579
1136     pvar->ts->DisableTCPEchoCR = pvar->origDisableTCPEchoCR;
1137 maya 3227 }
1138    
1139     uninit_TTSSH(pvar);
1140     init_TTSSH(pvar);
1141     }
1142    
1143     static void enable_dlg_items(HWND dlg, int from, int to, BOOL enabled)
1144     {
1145     for (; from <= to; from++) {
1146     EnableWindow(GetDlgItem(dlg, from), enabled);
1147     }
1148     }
1149    
1150     // C-p/C-n/C-b/C-f/C-a/C-e ���T�|�[�g (2007.9.5 maya)
1151     // C-d/C-k ���T�|�[�g (2007.10.3 yutaka)
1152     // �h���b�v�_�E���������G�f�B�b�g�R���g���[����
1153     // �T�u�N���X�������������E�C���h�E�v���V�[�W��
1154     WNDPROC OrigHostnameEditProc; // Original window procedure
1155     LRESULT CALLBACK HostnameEditProc(HWND dlg, UINT msg,
1156 maya 5868 WPARAM wParam, LPARAM lParam)
1157 maya 3227 {
1158     HWND parent;
1159     int max, select, len;
1160     char *str, *orgstr;
1161    
1162     switch (msg) {
1163     // �L�[�����������������m����
1164     case WM_KEYDOWN:
1165     if (GetKeyState(VK_CONTROL) < 0) {
1166     switch (wParam) {
1167     case 0x50: // Ctrl+p ... up
1168     parent = GetParent(dlg);
1169     select = SendMessage(parent, CB_GETCURSEL, 0, 0);
1170     if (select > 0) {
1171     PostMessage(parent, CB_SETCURSEL, select - 1, 0);
1172     }
1173     return 0;
1174     case 0x4e: // Ctrl+n ... down
1175     parent = GetParent(dlg);
1176     max = SendMessage(parent, CB_GETCOUNT, 0, 0);
1177     select = SendMessage(parent, CB_GETCURSEL, 0, 0);
1178     if (select < max - 1) {
1179     PostMessage(parent, CB_SETCURSEL, select + 1, 0);
1180     }
1181     return 0;
1182     case 0x42: // Ctrl+b ... left
1183     SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
1184     PostMessage(dlg, EM_SETSEL, select-1, select-1);
1185     return 0;
1186     case 0x46: // Ctrl+f ... right
1187     SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
1188     max = GetWindowTextLength(dlg) ;
1189     PostMessage(dlg, EM_SETSEL, select+1, select+1);
1190     return 0;
1191     case 0x41: // Ctrl+a ... home
1192     PostMessage(dlg, EM_SETSEL, 0, 0);
1193     return 0;
1194     case 0x45: // Ctrl+e ... end
1195     max = GetWindowTextLength(dlg) ;
1196     PostMessage(dlg, EM_SETSEL, max, max);
1197     return 0;
1198    
1199     case 0x44: // Ctrl+d
1200     case 0x4b: // Ctrl+k
1201     case 0x55: // Ctrl+u
1202     SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
1203     max = GetWindowTextLength(dlg);
1204     max++; // '\0'
1205     orgstr = str = malloc(max);
1206     if (str != NULL) {
1207     len = GetWindowText(dlg, str, max);
1208     if (select >= 0 && select < len) {
1209     if (wParam == 0x44) { // �J�[�\���z����������������������
1210     memmove(&str[select], &str[select + 1], len - select - 1);
1211     str[len - 1] = '\0';
1212    
1213     } else if (wParam == 0x4b) { // �J�[�\�������s��������������
1214     str[select] = '\0';
1215    
1216     }
1217     }
1218    
1219     if (wParam == 0x55) { // �J�[�\����������������������
1220     if (select >= len) {
1221     str[0] = '\0';
1222     } else {
1223     str = &str[select];
1224     }
1225     select = 0;
1226     }
1227    
1228     SetWindowText(dlg, str);
1229     SendMessage(dlg, EM_SETSEL, select, select);
1230     free(orgstr);
1231     return 0;
1232     }
1233     break;
1234     }
1235     }
1236     break;
1237    
1238     // �����L�[��������������������������������������������
1239     case WM_CHAR:
1240     switch (wParam) {
1241     case 0x01:
1242     case 0x02:
1243     case 0x04:
1244     case 0x05:
1245     case 0x06:
1246     case 0x0b:
1247     case 0x0e:
1248     case 0x10:
1249     case 0x15:
1250     return 0;
1251     }
1252     }
1253    
1254     return CallWindowProc(OrigHostnameEditProc, dlg, msg, wParam, lParam);
1255     }
1256    
1257     static BOOL CALLBACK TTXHostDlg(HWND dlg, UINT msg, WPARAM wParam,
1258     LPARAM lParam)
1259     {
1260     static char *ssh_version[] = {"SSH1", "SSH2", NULL};
1261     PGetHNRec GetHNRec;
1262     char EntName[128];
1263     char TempHost[HostNameMaxLength + 1];
1264     WORD i, j, w;
1265     WORD ComPortTable[MAXCOMPORT];
1266     static char *ComPortDesc[MAXCOMPORT];
1267     int comports;
1268     BOOL Ok;
1269     char uimsg[MAX_UIMSG];
1270     static HWND hwndHostname = NULL; // HOSTNAME dropdown
1271     static HWND hwndHostnameEdit = NULL; // Edit control on HOSTNAME dropdown
1272    
1273     switch (msg) {
1274     case WM_INITDIALOG:
1275     GetHNRec = (PGetHNRec) lParam;
1276     SetWindowLong(dlg, DWL_USER, lParam);
1277    
1278     GetWindowText(dlg, uimsg, sizeof(uimsg));
1279     UTIL_get_lang_msg("DLG_HOST_TITLE", pvar, uimsg);
1280     SetWindowText(dlg, pvar->ts->UIMsg);
1281     GetDlgItemText(dlg, IDC_HOSTNAMELABEL, uimsg, sizeof(uimsg));
1282     UTIL_get_lang_msg("DLG_HOST_TCPIPHOST", pvar, uimsg);
1283     SetDlgItemText(dlg, IDC_HOSTNAMELABEL, pvar->ts->UIMsg);
1284     GetDlgItemText(dlg, IDC_HISTORY, uimsg, sizeof(uimsg));
1285     UTIL_get_lang_msg("DLG_HOST_TCPIPHISTORY", pvar, uimsg);
1286     SetDlgItemText(dlg, IDC_HISTORY, pvar->ts->UIMsg);
1287     GetDlgItemText(dlg, IDC_SERVICELABEL, uimsg, sizeof(uimsg));
1288     UTIL_get_lang_msg("DLG_HOST_TCPIPSERVICE", pvar, uimsg);
1289     SetDlgItemText(dlg, IDC_SERVICELABEL, pvar->ts->UIMsg);
1290     GetDlgItemText(dlg, IDC_HOSTOTHER, uimsg, sizeof(uimsg));
1291     UTIL_get_lang_msg("DLG_HOST_TCPIPOTHER", pvar, uimsg);
1292     SetDlgItemText(dlg, IDC_HOSTOTHER, pvar->ts->UIMsg);
1293     GetDlgItemText(dlg, IDC_HOSTTCPPORTLABEL, uimsg, sizeof(uimsg));
1294     UTIL_get_lang_msg("DLG_HOST_TCPIPPORT", pvar, uimsg);
1295     SetDlgItemText(dlg, IDC_HOSTTCPPORTLABEL, pvar->ts->UIMsg);
1296     GetDlgItemText(dlg, IDC_SSH_VERSION_LABEL, uimsg, sizeof(uimsg));
1297     UTIL_get_lang_msg("DLG_HOST_TCPIPSSHVERSION", pvar, uimsg);
1298     SetDlgItemText(dlg, IDC_SSH_VERSION_LABEL, pvar->ts->UIMsg);
1299     GetDlgItemText(dlg, IDC_HOSTTCPPROTOCOLLABEL, uimsg, sizeof(uimsg));
1300     UTIL_get_lang_msg("DLG_HOST_TCPIPPROTOCOL", pvar, uimsg);
1301     SetDlgItemText(dlg, IDC_HOSTTCPPROTOCOLLABEL, pvar->ts->UIMsg);
1302     GetDlgItemText(dlg, IDC_HOSTSERIAL, uimsg, sizeof(uimsg));
1303     UTIL_get_lang_msg("DLG_HOST_SERIAL", pvar, uimsg);
1304     SetDlgItemText(dlg, IDC_HOSTSERIAL, pvar->ts->UIMsg);
1305     GetDlgItemText(dlg, IDC_HOSTCOMLABEL, uimsg, sizeof(uimsg));
1306     UTIL_get_lang_msg("DLG_HOST_SERIALPORT", pvar, uimsg);
1307     SetDlgItemText(dlg, IDC_HOSTCOMLABEL, pvar->ts->UIMsg);
1308     GetDlgItemText(dlg, IDC_HOSTHELP, uimsg, sizeof(uimsg));
1309     UTIL_get_lang_msg("DLG_HOST_HELP", pvar, uimsg);
1310     SetDlgItemText(dlg, IDC_HOSTHELP, pvar->ts->UIMsg);
1311     GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1312     UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1313     SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1314     GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1315     UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
1316     SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1317    
1318     // �z�X�g�q�X�g�����`�F�b�N�{�b�N�X������ (2005.10.21 yutaka)
1319     if (pvar->ts->HistoryList > 0) {
1320     SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_SETCHECK, BST_CHECKED, 0);
1321     } else {
1322     SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_SETCHECK, BST_UNCHECKED, 0);
1323     }
1324    
1325 yutakapon 4860 // �t�@�C�����������O�t���p�C�v�������ATCP/IP�����������B
1326     if (GetHNRec->PortType == IdFile ||
1327     GetHNRec->PortType == IdNamedPipe
1328     )
1329 maya 3227 GetHNRec->PortType = IdTCPIP;
1330    
1331     strncpy_s(EntName, sizeof(EntName), "Host", _TRUNCATE);
1332    
1333     i = 1;
1334     do {
1335     _snprintf_s(&EntName[4], sizeof(EntName)-4, _TRUNCATE, "%d", i);
1336     GetPrivateProfileString("Hosts", EntName, "",
1337     TempHost, sizeof(TempHost),
1338     GetHNRec->SetupFN);
1339     if (strlen(TempHost) > 0)
1340     SendDlgItemMessage(dlg, IDC_HOSTNAME, CB_ADDSTRING,
1341     0, (LPARAM) TempHost);
1342     i++;
1343 maya 4963 } while (i <= MAXHOSTLIST);
1344 maya 3227
1345     SendDlgItemMessage(dlg, IDC_HOSTNAME, EM_LIMITTEXT,
1346     HostNameMaxLength - 1, 0);
1347    
1348     SendDlgItemMessage(dlg, IDC_HOSTNAME, CB_SETCURSEL, 0, 0);
1349    
1350     // C-n/C-p ���������T�u�N���X�� (2007.9.4 maya)
1351     hwndHostname = GetDlgItem(dlg, IDC_HOSTNAME);
1352     hwndHostnameEdit = GetWindow(hwndHostname, GW_CHILD);
1353     OrigHostnameEditProc = (WNDPROC)GetWindowLong(hwndHostnameEdit, GWL_WNDPROC);
1354     SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)HostnameEditProc);
1355    
1356     CheckRadioButton(dlg, IDC_HOSTTELNET, IDC_HOSTOTHER,
1357     pvar->settings.Enabled ? IDC_HOSTSSH : GetHNRec->
1358     Telnet ? IDC_HOSTTELNET : IDC_HOSTOTHER);
1359     SendDlgItemMessage(dlg, IDC_HOSTTCPPORT, EM_LIMITTEXT, 5, 0);
1360     SetDlgItemInt(dlg, IDC_HOSTTCPPORT, GetHNRec->TCPPort, FALSE);
1361     for (i = 0; ProtocolFamilyList[i]; ++i) {
1362     SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, CB_ADDSTRING,
1363     0, (LPARAM) ProtocolFamilyList[i]);
1364     }
1365     SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, EM_LIMITTEXT,
1366     ProtocolFamilyMaxLength - 1, 0);
1367     SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, CB_SETCURSEL, 0, 0);
1368    
1369     /////// SSH version
1370     for (i = 0; ssh_version[i]; ++i) {
1371     SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_ADDSTRING,
1372     0, (LPARAM) ssh_version[i]);
1373     }
1374     SendDlgItemMessage(dlg, IDC_SSH_VERSION, EM_LIMITTEXT,
1375     NUM_ELEM(ssh_version) - 1, 0);
1376    
1377     if (pvar->settings.ssh_protocol_version == 1) {
1378     SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_SETCURSEL, 0, 0); // SSH1
1379     } else {
1380     SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_SETCURSEL, 1, 0); // SSH2
1381     }
1382    
1383     if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1384     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE); // enabled
1385     } else {
1386     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1387     }
1388     /////// SSH version
1389    
1390    
1391     j = 0;
1392     w = 1;
1393     if ((comports=DetectComPorts(ComPortTable, GetHNRec->MaxComPort, ComPortDesc)) >= 0) {
1394     for (i=0; i<comports; i++) {
1395     // MaxComPort ���z�����|�[�g���\��������
1396     if (ComPortTable[i] > GetHNRec->MaxComPort) {
1397     continue;
1398     }
1399    
1400     // �g�p�����|�[�g���\��������
1401     if (CheckCOMFlag(ComPortTable[i]) == 1) {
1402     continue;
1403     }
1404    
1405     _snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "COM%d", ComPortTable[i]);
1406     if (ComPortDesc[i] != NULL) {
1407     strncat_s(EntName, sizeof(EntName), ": ", _TRUNCATE);
1408     strncat_s(EntName, sizeof(EntName), ComPortDesc[i], _TRUNCATE);
1409     }
1410     SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,
1411     0, (LPARAM)EntName);
1412     j++;
1413     if (GetHNRec->ComPort == ComPortTable[i])
1414     w = j;
1415     }
1416    
1417     } else {
1418     for (i = 1; i <= GetHNRec->MaxComPort; i++) {
1419     // �g�p�����|�[�g���\��������
1420     if (CheckCOMFlag(i) == 1) {
1421     continue;
1422     }
1423    
1424     _snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "COM%d", i);
1425     SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,
1426     0, (LPARAM) EntName);
1427     j++;
1428     if (GetHNRec->ComPort == i)
1429     w = j;
1430     }
1431     }
1432    
1433     if (j > 0)
1434     SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_SETCURSEL, w - 1, 0);
1435     else { /* All com ports are already used */
1436     GetHNRec->PortType = IdTCPIP;
1437     enable_dlg_items(dlg, IDC_HOSTSERIAL, IDC_HOSTSERIAL, FALSE);
1438     }
1439    
1440     CheckRadioButton(dlg, IDC_HOSTTCPIP, IDC_HOSTSERIAL,
1441     IDC_HOSTTCPIP + GetHNRec->PortType - 1);
1442    
1443     if (GetHNRec->PortType == IdTCPIP) {
1444     enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, FALSE);
1445    
1446     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE);
1447     enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, TRUE);
1448    
1449     enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, TRUE); // enabled
1450     }
1451     else {
1452     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1453     FALSE);
1454     enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1455     IDC_HOSTTCPPROTOCOL, FALSE);
1456    
1457     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1458     enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, FALSE); // disabled (2004.11.23 yutaka)
1459    
1460     enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, FALSE); // disabled
1461     }
1462    
1463     // Host dialog���t�H�[�J�X�������� (2004.10.2 yutaka)
1464     if (GetHNRec->PortType == IdTCPIP) {
1465     HWND hwnd = GetDlgItem(dlg, IDC_HOSTNAME);
1466     SetFocus(hwnd);
1467     } else {
1468     HWND hwnd = GetDlgItem(dlg, IDC_HOSTCOM);
1469     SetFocus(hwnd);
1470     }
1471    
1472 zmatsuo 7592 CenterWindow(dlg, GetParent(dlg));
1473    
1474 maya 3227 // SetFocus()���t�H�[�J�X���������������AFALSE�������K�v�������B
1475     // TRUE���������ATABSTOP�������������������R���g���[�����I�������B
1476     // (2004.11.23 yutaka)
1477     return FALSE;
1478     //return TRUE;
1479    
1480     case WM_COMMAND:
1481     switch (LOWORD(wParam)) {
1482     case IDOK:
1483     GetHNRec = (PGetHNRec) GetWindowLong(dlg, DWL_USER);
1484     if (GetHNRec != NULL) {
1485     if (IsDlgButtonChecked(dlg, IDC_HOSTTCPIP)) {
1486     char afstr[BUFSIZ];
1487     i = GetDlgItemInt(dlg, IDC_HOSTTCPPORT, &Ok, FALSE);
1488     if (Ok) {
1489     GetHNRec->TCPPort = i;
1490     } else {
1491     UTIL_get_lang_msg("MSG_TCPPORT_NAN_ERROR", pvar,
1492     "The TCP port must be a number.");
1493     MessageBox(dlg, pvar->ts->UIMsg,
1494     "Tera Term", MB_OK | MB_ICONEXCLAMATION);
1495     return TRUE;
1496     }
1497     #define getaf(str) \
1498     ((strcmp((str), "IPv6") == 0) ? AF_INET6 : \
1499     ((strcmp((str), "IPv4") == 0) ? AF_INET : AF_UNSPEC))
1500     memset(afstr, 0, sizeof(afstr));
1501     GetDlgItemText(dlg, IDC_HOSTTCPPROTOCOL, afstr,
1502     sizeof(afstr));
1503     GetHNRec->ProtocolFamily = getaf(afstr);
1504     GetHNRec->PortType = IdTCPIP;
1505     GetDlgItemText(dlg, IDC_HOSTNAME, GetHNRec->HostName,
1506     HostNameMaxLength);
1507     pvar->hostdlg_activated = TRUE;
1508     pvar->hostdlg_Enabled = FALSE;
1509     if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
1510     GetHNRec->Telnet = TRUE;
1511     } else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1512     pvar->hostdlg_Enabled = TRUE;
1513    
1514     // check SSH protocol version
1515     memset(afstr, 0, sizeof(afstr));
1516     GetDlgItemText(dlg, IDC_SSH_VERSION, afstr, sizeof(afstr));
1517     if (_stricmp(afstr, "SSH1") == 0) {
1518     pvar->settings.ssh_protocol_version = 1;
1519     } else {
1520     pvar->settings.ssh_protocol_version = 2;
1521     }
1522     }
1523 doda 3541 else { // IDC_HOSTOTHER
1524     GetHNRec->Telnet = FALSE;
1525     }
1526 maya 3227
1527     // host history check button
1528     if (SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_GETCHECK, 0, 0) == BST_CHECKED) {
1529     pvar->ts->HistoryList = 1;
1530     } else {
1531     pvar->ts->HistoryList = 0;
1532     }
1533    
1534     } else {
1535     GetHNRec->PortType = IdSerial;
1536     GetHNRec->HostName[0] = 0;
1537     memset(EntName, 0, sizeof(EntName));
1538     GetDlgItemText(dlg, IDC_HOSTCOM, EntName,
1539     sizeof(EntName) - 1);
1540     if (strncmp(EntName, "COM", 3) == 0 && EntName[3] != '\0') {
1541     GetHNRec->ComPort = atoi(&EntName[3]);
1542     if (GetHNRec->ComPort > GetHNRec->MaxComPort)
1543     GetHNRec->ComPort = 1;
1544     } else {
1545     GetHNRec->ComPort = 1;
1546     }
1547     }
1548     }
1549     SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)OrigHostnameEditProc);
1550     EndDialog(dlg, 1);
1551     return TRUE;
1552    
1553     case IDCANCEL:
1554     SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)OrigHostnameEditProc);
1555     EndDialog(dlg, 0);
1556     return TRUE;
1557    
1558     case IDC_HOSTTCPIP:
1559     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1560     TRUE);
1561     enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1562     IDC_HOSTTCPPROTOCOL, TRUE);
1563     enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, FALSE);
1564    
1565     enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, TRUE); // disabled (2004.11.23 yutaka)
1566     if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1567     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE);
1568     } else {
1569     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1570     }
1571    
1572     enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, TRUE); // disabled
1573    
1574     return TRUE;
1575    
1576     case IDC_HOSTSERIAL:
1577     enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, TRUE);
1578     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1579     FALSE);
1580     enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1581     IDC_HOSTTCPPROTOCOL, FALSE);
1582     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1583     enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, FALSE); // disabled (2004.11.23 yutaka)
1584    
1585     enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, FALSE); // disabled
1586    
1587     return TRUE;
1588    
1589     case IDC_HOSTSSH:
1590     enable_dlg_items(dlg, IDC_SSH_VERSION,
1591     IDC_SSH_VERSION, TRUE);
1592     goto hostssh_enabled;
1593    
1594     case IDC_HOSTTELNET:
1595     case IDC_HOSTOTHER:
1596     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1597     hostssh_enabled:
1598    
1599     GetHNRec = (PGetHNRec) GetWindowLong(dlg, DWL_USER);
1600    
1601     if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
1602     if (GetHNRec != NULL)
1603     SetDlgItemInt(dlg, IDC_HOSTTCPPORT, GetHNRec->TelPort,
1604     FALSE);
1605     } else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1606     SetDlgItemInt(dlg, IDC_HOSTTCPPORT, 22, FALSE);
1607     }
1608     return TRUE;
1609    
1610     case IDC_HOSTCOM:
1611     if(HIWORD(wParam) == CBN_DROPDOWN) {
1612     HWND hostcom = GetDlgItem(dlg, IDC_HOSTCOM);
1613     int count = SendMessage(hostcom, CB_GETCOUNT, 0, 0);
1614     int i, len, max_len = 0;
1615     char *lbl;
1616     HDC TmpDC = GetDC(hostcom);
1617     SIZE s;
1618     for (i=0; i<count; i++) {
1619     len = SendMessage(hostcom, CB_GETLBTEXTLEN, i, 0);
1620     lbl = (char *)calloc(len+1, sizeof(char));
1621     SendMessage(hostcom, CB_GETLBTEXT, i, (LPARAM)lbl);
1622     GetTextExtentPoint32(TmpDC, lbl, len, &s);
1623     if (s.cx > max_len)
1624     max_len = s.cx;
1625     free(lbl);
1626     }
1627     SendMessage(hostcom, CB_SETDROPPEDWIDTH,
1628     max_len + GetSystemMetrics(SM_CXVSCROLL), 0);
1629     }
1630     break;
1631    
1632     case IDC_HOSTHELP:
1633     PostMessage(GetParent(dlg), WM_USER_DLGHELP2, 0, 0);
1634     }
1635     }
1636     return FALSE;
1637     }
1638    
1639 zmatsuo 7560 static void UTIL_SetDialogFont()
1640     {
1641 zmatsuo 7589 SetDialogFont(pvar->ts->SetupFName, pvar->ts->UILanguageFile, "TTSSH", "DLG_TAHOMA_FONT");
1642 zmatsuo 7560 }
1643    
1644 doda 6801 static BOOL PASCAL TTXGetHostName(HWND parent, PGetHNRec rec)
1645 maya 3227 {
1646 zmatsuo 7589 SetDialogFont(pvar->ts->SetupFName,
1647     pvar->ts->UILanguageFile, "TTSSH", "DLG_SYSTEM_FONT");
1648 maya 3227 return (BOOL) DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_HOSTDLG),
1649 zmatsuo 7560 parent, TTXHostDlg, (LPARAM)rec);
1650 maya 3227 }
1651    
1652 doda 6801 static void PASCAL TTXGetUIHooks(TTXUIHooks *hooks)
1653 maya 3227 {
1654     *hooks->GetHostName = TTXGetHostName;
1655     }
1656    
1657 doda 6801 static void PASCAL TTXReadINIFile(PCHAR fileName, PTTSet ts)
1658 maya 3227 {
1659     (pvar->ReadIniFile) (fileName, ts);
1660     read_ssh_options(pvar, fileName);
1661     pvar->settings = *pvar->ts_SSH;
1662 doda 6809 logputs(LOG_LEVEL_VERBOSE, "Reading INI file");
1663 maya 3227 FWDUI_load_settings(pvar);
1664     }
1665    
1666 doda 6801 static void PASCAL TTXWriteINIFile(PCHAR fileName, PTTSet ts)
1667 maya 3227 {
1668     (pvar->WriteIniFile) (fileName, ts);
1669     *pvar->ts_SSH = pvar->settings;
1670     clear_local_settings(pvar);
1671 doda 6809 logputs(LOG_LEVEL_VERBOSE, "Writing INI file");
1672 maya 3227 write_ssh_options(pvar, fileName, pvar->ts_SSH, TRUE);
1673     }
1674    
1675     static void read_ssh_options_from_user_file(PTInstVar pvar,
1676 doda 6801 char *user_file_name)
1677 maya 3227 {
1678     if (user_file_name[0] == '.') {
1679     read_ssh_options(pvar, user_file_name);
1680     } else {
1681     char buf[1024];
1682    
1683     get_teraterm_dir_relative_name(buf, sizeof(buf), user_file_name);
1684     read_ssh_options(pvar, buf);
1685     }
1686    
1687     pvar->settings = *pvar->ts_SSH;
1688     FWDUI_load_settings(pvar);
1689     }
1690    
1691     // Percent-encode������������src���f�R�[�h����dst���R�s�[�����B
1692     // dstlen��dst���T�C�Y�B�����������������������A�����������������������B
1693     static void percent_decode(char *dst, int dstlen, char *src) {
1694     if (src == NULL || dst == NULL || dstlen < 1) {
1695     return;
1696     }
1697    
1698     while (*src != 0 && dstlen > 1) {
1699     if (*src == '%' && isxdigit(*(src+1)) && isxdigit(*(src+2))) {
1700     src++; *dst = (isalpha(*src) ? (*src|0x20) - 'a' + 10 : *src - '0') << 4;
1701     src++; *dst |= (isalpha(*src) ? (*src|0x20) - 'a' + 10 : *src - '0');
1702     src++; dst++;
1703     }
1704     else {
1705     *dst++ = *src++;
1706     }
1707     dstlen--;
1708     }
1709     *dst = 0;
1710     return;
1711     }
1712    
1713 doda 5799 void add_forward_param(PTInstVar pvar, char *param)
1714     {
1715     if (pvar->settings.DefaultForwarding[0] == 0) {
1716     strncpy_s(pvar->settings.DefaultForwarding,
1717     sizeof(pvar->settings.DefaultForwarding),
1718     param, _TRUNCATE);
1719     } else {
1720     strncat_s(pvar->settings.DefaultForwarding,
1721     sizeof(pvar->settings.DefaultForwarding),
1722     ";", _TRUNCATE);
1723     strncat_s(pvar->settings.DefaultForwarding,
1724     sizeof(pvar->settings.DefaultForwarding),
1725     param, _TRUNCATE);
1726     }
1727     }
1728    
1729 doda 6801 static void PASCAL TTXParseParam(PCHAR param, PTTSet ts, PCHAR DDETopic) {
1730 maya 5869 int param_len=strlen(param);
1731     int opt_len = param_len+1;
1732     char *option = (char *)calloc(opt_len, sizeof(char));
1733 maya 5882 char *option2 = (char *)calloc(opt_len, sizeof(char));
1734 maya 5869 int action;
1735 maya 5874 PCHAR start, cur, next;
1736 maya 5908 size_t i;
1737 maya 5869
1738     if (pvar->hostdlg_activated) {
1739     pvar->settings.Enabled = pvar->hostdlg_Enabled;
1740     }
1741    
1742 maya 5874 /* the first term shuld be executable filename of Tera Term */
1743     start = GetParam(option, opt_len, param);
1744    
1745     cur = start;
1746 maya 5869 while (next = GetParam(option, opt_len, cur)) {
1747 doda 6140 DequoteParam(option, opt_len, option);
1748 maya 5869 action = OPTION_NONE;
1749    
1750     if ((option[0] == '-' || option[0] == '/')) {
1751     if (MATCH_STR(option + 1, "ssh") == 0) {
1752     if (MATCH_STR(option + 4, "-f=") == 0) {
1753 doda 6140 strncpy_s(option2, opt_len, option + 7, _TRUNCATE);
1754 maya 5882 read_ssh_options_from_user_file(pvar, option2);
1755 maya 5869 action = OPTION_CLEAR;
1756     } else if (MATCH_STR(option + 4, "-consume=") == 0) {
1757 doda 6140 strncpy_s(option2, opt_len, option + 13, _TRUNCATE);
1758 maya 5882 read_ssh_options_from_user_file(pvar, option2);
1759     DeleteFile(option2);
1760 maya 5869 action = OPTION_CLEAR;
1761     }
1762    
1763     // ttermpro.exe �� /F= �w������ TTSSH ������������ (2006.10.11 maya)
1764     } else if (MATCH_STR_I(option + 1, "f=") == 0) {
1765 doda 6140 strncpy_s(option2, opt_len, option + 3, _TRUNCATE);
1766 maya 5882 read_ssh_options_from_user_file(pvar, option2);
1767 maya 5869 // Tera Term���������������K�v������������������
1768     }
1769     }
1770    
1771     switch (action) {
1772     case OPTION_CLEAR:
1773     memset(cur, ' ', next-cur);
1774     break;
1775     case OPTION_REPLACE:
1776     memset(cur, ' ', next-cur);
1777     memcpy(cur+1, option, strlen(option));
1778     break;
1779     }
1780    
1781     cur = next;
1782     }
1783    
1784 maya 5874 cur = start;
1785 maya 5869 while (next = GetParam(option, opt_len, cur)) {
1786 doda 6140 DequoteParam(option, opt_len, option);
1787 maya 5869 action = OPTION_NONE;
1788    
1789     if ((option[0] == '-' || option[0] == '/')) {
1790     action = OPTION_CLEAR;
1791     if (MATCH_STR(option + 1, "ssh") == 0) {
1792     if (option[4] == 0) {
1793     pvar->settings.Enabled = 1;
1794     } else if (MATCH_STR(option + 4, "-L") == 0 ||
1795 doda 6846 MATCH_STR(option + 4, "-R") == 0 ||
1796     MATCH_STR(option + 4, "-D") == 0) {
1797 doda 5959 char *p = option + 5;
1798     option2[0] = *p;
1799     i = 1;
1800     while (*++p) {
1801     if (*p == ';' || *p == ',') {
1802     option2[i] = 0;
1803     add_forward_param(pvar, option2);
1804     i = 1;
1805 maya 5908 }
1806 doda 5959 else {
1807     option2[i++] = *p;
1808     }
1809 maya 5908 }
1810 doda 5959 if (i > 1) {
1811     option2[i] = 0;
1812     add_forward_param(pvar, option2);
1813     }
1814 maya 5869 } else if (MATCH_STR(option + 4, "-X") == 0) {
1815     add_forward_param(pvar, "X");
1816 doda 5959 if (option+6 != 0) {
1817     strncpy_s(pvar->settings.X11Display,
1818     sizeof(pvar->settings.X11Display),
1819     option + 6, _TRUNCATE);
1820     }
1821 doda 6473 } else if (strcmp(option + 4, "-v") == 0) {
1822 maya 5869 pvar->settings.LogLevel = LOG_LEVEL_VERBOSE;
1823     } else if (_stricmp(option + 4, "-autologin") == 0 ||
1824     _stricmp(option + 4, "-autologon") == 0) {
1825     pvar->settings.TryDefaultAuth = TRUE;
1826     } else if (MATCH_STR_I(option + 4, "-agentconfirm=") == 0) {
1827     if ((_stricmp(option+18, "off") == 0) ||
1828     (_stricmp(option+18, "no") == 0) ||
1829     (_stricmp(option+18, "false") == 0) ||
1830     (_stricmp(option+18, "0") == 0) ||
1831     (_stricmp(option+18, "n") == 0)) {
1832     pvar->settings.ForwardAgentConfirm = 0;
1833     }
1834     else {
1835     pvar->settings.ForwardAgentConfirm = 1;
1836     }
1837 doda 6473 } else if (strcmp(option + 4, "-a") == 0) {
1838 maya 5869 pvar->settings.ForwardAgent = FALSE;
1839 doda 6473 } else if (strcmp(option + 4, "-A") == 0) {
1840 maya 5869 pvar->settings.ForwardAgent = TRUE;
1841    
1842     } else if (MATCH_STR(option + 4, "-C=") == 0) {
1843     pvar->settings.CompressionLevel = atoi(option+7);
1844     if (pvar->settings.CompressionLevel < 0) {
1845     pvar->settings.CompressionLevel = 0;
1846     }
1847     else if (pvar->settings.CompressionLevel > 9) {
1848     pvar->settings.CompressionLevel = 9;
1849     }
1850 doda 6473 } else if (strcmp(option + 4, "-C") == 0) {
1851 maya 5869 pvar->settings.CompressionLevel = 6;
1852 doda 6473 } else if (strcmp(option + 4, "-c") == 0) {
1853 maya 5869 pvar->settings.CompressionLevel = 0;
1854     } else if (MATCH_STR_I(option + 4, "-icon=") == 0) {
1855     if ((_stricmp(option+10, "old") == 0) ||
1856     (_stricmp(option+10, "yellow") == 0) ||
1857     (_stricmp(option+10, "securett_yellow") == 0)) {
1858     pvar->settings.IconID = IDI_SECURETT_YELLOW;
1859     }
1860 maya 6386 else if ((_stricmp(option+10, "green") == 0) ||
1861     (_stricmp(option+10, "securett_green") == 0)) {
1862     pvar->settings.IconID = IDI_SECURETT_GREEN;
1863     }
1864 maya 5869 else {
1865     pvar->settings.IconID = IDI_SECURETT;
1866     }
1867 doda 6717 } else if (MATCH_STR(option + 4, "-subsystem=") == 0) {
1868     pvar->use_subsystem = TRUE;
1869     strncpy_s(pvar->subsystem_name,
1870     sizeof(pvar->subsystem_name),
1871     option + 15, _TRUNCATE);
1872 doda 7364 } else if (strcmp(option + 4, "-N") == 0) {
1873 doda 7363 pvar->nosession = TRUE;
1874 maya 5869
1875     // /ssh1 �� /ssh2 �I�v�V�������V�K���� (2006.9.16 maya)
1876 doda 6473 } else if (strcmp(option + 4, "1") == 0) {
1877 maya 5869 pvar->settings.Enabled = 1;
1878     pvar->settings.ssh_protocol_version = 1;
1879 doda 6473 } else if (strcmp(option + 4, "2") == 0) {
1880 maya 5869 pvar->settings.Enabled = 1;
1881     pvar->settings.ssh_protocol_version = 2;
1882    
1883     } else {
1884     char buf[1024];
1885    
1886     UTIL_get_lang_msg("MSG_UNKNOWN_OPTION_ERROR", pvar,
1887     "Unrecognized command-line option: %s");
1888     _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, option);
1889    
1890     MessageBox(NULL, buf, "TTSSH", MB_OK | MB_ICONEXCLAMATION);
1891     }
1892    
1893     // ttermpro.exe �� /T= �w�������p�������A������������ (2006.10.19 maya)
1894     } else if (MATCH_STR_I(option + 1, "t=") == 0) {
1895     if (strcmp(option + 3, "2") == 0) {
1896     pvar->settings.Enabled = 1;
1897     // /t=2��ttssh�������g������������
1898     } else {
1899     pvar->settings.Enabled = 0;
1900     action = OPTION_NONE; // Tera Term������������������������
1901     }
1902    
1903     // /1 ������ /2 �I�v�V�������V�K���� (2004.10.3 yutaka)
1904 doda 6473 } else if (strcmp(option + 1, "1") == 0) {
1905 maya 5869 // command line: /ssh /1 is SSH1 only
1906     pvar->settings.ssh_protocol_version = 1;
1907    
1908 doda 6473 } else if (strcmp(option + 1, "2") == 0) {
1909 maya 5869 // command line: /ssh /2 is SSH2 & SSH1
1910     pvar->settings.ssh_protocol_version = 2;
1911    
1912 doda 6473 } else if (strcmp(option + 1, "nossh") == 0) {
1913 maya 5869 // '/nossh' �I�v�V�����������B
1914     // TERATERM.INI ��SSH���L�������������������A������Cygterm���N��������������
1915     // �����������������B(2004.10.11 yutaka)
1916     pvar->settings.Enabled = 0;
1917    
1918 doda 6473 } else if (strcmp(option + 1, "telnet") == 0) {
1919 maya 5869 // '/telnet' ���w�������������������� '/nossh' ��������
1920     // SSH������������ (2006.9.16 maya)
1921     pvar->settings.Enabled = 0;
1922     // Tera Term �� Telnet �t���O���t����
1923     pvar->ts->Telnet = 1;
1924    
1925 doda 6473 } else if (MATCH_STR(option + 1, "auth=") == 0) {
1926 maya 5869 // SSH2�������O�C���I�v�V����������
1927     //
1928     // SYNOPSIS: /ssh /auth=passowrd /user=���[�U�� /passwd=�p�X���[�h
1929     // /ssh /auth=publickey /user=���[�U�� /passwd=�p�X���[�h /keyfile=�p�X
1930 doda 6472 // EXAMPLE: /ssh /auth=password /user=nike /passwd="a b""c" ; �p�X���[�h: �ua b"c�v
1931 maya 5869 // /ssh /auth=publickey /user=foo /passwd=bar /keyfile=d:\tmp\id_rsa
1932 doda 6472 // NOTICE: �p�X���[�h���p�X���������Z�~�R���������������������_�u���N�H�[�g " ������
1933     // �p�X���[�h���_�u���N�H�[�g�����������������A�������_�u���N�H�[�g "" ���u��������
1934 maya 5869 //
1935     pvar->ssh2_autologin = 1; // for SSH2 (2004.11.30 yutaka)
1936    
1937 doda 6473 if (_stricmp(option + 6, "password") == 0) { // �p�X���[�h
1938 maya 5869 //pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
1939     pvar->ssh2_authmethod = SSH_AUTH_PASSWORD;
1940    
1941 doda 7101 } else if (_stricmp(option + 6, "keyboard-interactive") == 0) { // keyboard-interactive�F��
1942     //pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
1943     pvar->ssh2_authmethod = SSH_AUTH_TIS;
1944    
1945 doda 6473 } else if (_stricmp(option + 6, "challenge") == 0) { // keyboard-interactive�F��
1946 maya 5869 //pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
1947     pvar->ssh2_authmethod = SSH_AUTH_TIS;
1948    
1949 doda 6473 } else if (_stricmp(option + 6, "publickey") == 0) { // ���J���F��
1950 maya 5869 //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
1951     pvar->ssh2_authmethod = SSH_AUTH_RSA;
1952    
1953 doda 6473 } else if (_stricmp(option + 6, "pageant") == 0) { // ���J���F�� by Pageant
1954 maya 5869 //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
1955     pvar->ssh2_authmethod = SSH_AUTH_PAGEANT;
1956    
1957     } else {
1958     // TODO:
1959     }
1960    
1961     } else if (MATCH_STR(option + 1, "user=") == 0) {
1962 doda 6140 _snprintf_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), _TRUNCATE, "%s", option+6);
1963 maya 5869
1964     } else if (MATCH_STR(option + 1, "passwd=") == 0) {
1965 doda 6140 _snprintf_s(pvar->ssh2_password, sizeof(pvar->ssh2_password), _TRUNCATE, "%s", option+8);
1966 maya 5869
1967     } else if (MATCH_STR(option + 1, "keyfile=") == 0) {
1968 doda 6140 _snprintf_s(pvar->ssh2_keyfile, sizeof(pvar->ssh2_keyfile), _TRUNCATE, "%s", option+9);
1969 maya 5869
1970 doda 6473 } else if (strcmp(option + 1, "ask4passwd") == 0) {
1971 maya 5869 // �p�X���[�h������ (2006.9.18 maya)
1972     pvar->ask4passwd = 1;
1973    
1974 doda 6473 } else if (strcmp(option + 1, "nosecuritywarning") == 0) {
1975 maya 5869 // known_hosts�`�F�b�N���������B���Y�I�v�V�������g�����A�Z�L�����e�B������������
1976     // �����A�B���I�v�V���������������B
1977     // (2009.10.4 yutaka)
1978     pvar->nocheck_known_hosts = TRUE;
1979    
1980     }
1981     else { // Other (not ttssh) option
1982     action = OPTION_NONE; // ttssh���I�v�V������������������������
1983     }
1984    
1985     // �p�X���[�h�������������������O�C��������������
1986     // /auth ���F�����\�b�h���w�������������p������ (2006.9.18 maya)
1987     if (pvar->ask4passwd == 1) {
1988     pvar->ssh2_autologin = 0;
1989     }
1990    
1991     }
1992     else if ((MATCH_STR_I(option, "ssh://") == 0) ||
1993     (MATCH_STR_I(option, "ssh1://") == 0) ||
1994     (MATCH_STR_I(option, "ssh2://") == 0) ||
1995     (MATCH_STR_I(option, "slogin://") == 0) ||
1996     (MATCH_STR_I(option, "slogin1://") == 0) ||
1997     (MATCH_STR_I(option, "slogin2://") == 0)) {
1998     //
1999     // ssh://user@host/ ����URL�`�����T�|�[�g
2000     // ���{�I�������� telnet:// URL��������
2001     //
2002     // �Q�l:
2003     // RFC3986: Uniform Resource Identifier (URI): Generic Syntax
2004     // RFC4248: The telnet URI Scheme
2005     //
2006     char *p, *p2, *p3;
2007     int optlen, hostlen;
2008    
2009     optlen = strlen(option);
2010    
2011     // ������':'���O�����������������������A������ssh�v���g�R���o�[�W������������
2012     p = _mbschr(option, ':');
2013     switch (*(p-1)) {
2014     case '1':
2015     pvar->settings.ssh_protocol_version = 1;
2016     break;
2017     case '2':
2018     pvar->settings.ssh_protocol_version = 2;
2019     break;
2020     }
2021    
2022     // authority part �����|�C���^������
2023     p += 3;
2024    
2025     // path part ������������
2026     if ((p2 = _mbschr(p, '/')) != NULL) {
2027     *p2 = 0;
2028     }
2029    
2030     // '@'�������������A���������O�����[�U����
2031     if ((p2 = _mbschr(p, '@')) != NULL) {
2032     *p2 = 0;
2033     // ':'���~���p�X���[�h
2034     if ((p3 = _mbschr(p, ':')) != NULL) {
2035     *p3 = 0;
2036     percent_decode(pvar->ssh2_password, sizeof(pvar->ssh2_password), p3 + 1);
2037     }
2038     percent_decode(pvar->ssh2_username, sizeof(pvar->ssh2_username), p);
2039     // p �� host part ������('@'����������)����������������
2040     p = p2 + 1;
2041     }
2042    
2043     // host part �� option �����������������Ascheme part ������
2044     // port�w����������������port���������������������m��������������
2045     hostlen = strlen(p);
2046     memmove_s(option, optlen, p, hostlen);
2047     option[hostlen] = 0;
2048    
2049     // �|�[�g�w������������":22"������
2050     if (option[0] == '[' && option[hostlen-1] == ']' || // IPv6 raw address without port
2051     option[0] != '[' && _mbschr(option, ':') == NULL) { // hostname or IPv4 raw address without port
2052     memcpy_s(option+hostlen, optlen-hostlen, ":22", 3);
2053     hostlen += 3;
2054     }
2055    
2056     // �|�[�g�w�����������������X�y�[�X������
2057     memset(option+hostlen, ' ', optlen-hostlen);
2058    
2059     pvar->settings.Enabled = 1;
2060    
2061     action = OPTION_REPLACE;
2062     }
2063     else if (_mbschr(option, '@') != NULL) {
2064     //
2065     // user@host �`�����T�|�[�g
2066     // ����������ssh�������T�|�[�g�����A���[�U����ttssh���������B
2067     // (ssh�������O -- ttssh�������W������������)
2068     // �����I��telnet authentication option���T�|�[�g��������
2069     // Tera Term�{�����������������������\���B
2070     //
2071     char *p;
2072     p = _mbschr(option, '@');
2073     *p = 0;
2074    
2075     strncpy_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), option, _TRUNCATE);
2076    
2077     // ���[�U���������X�y�[�X�������B
2078     // ������TTX��Tera Term�{�������������������X�y�[�X�����������������A
2079     // �z�X�g�����������l�����K�v�������B
2080     memset(option, ' ', p-option+1);
2081    
2082     action = OPTION_REPLACE;
2083     }
2084    
2085    
2086     switch (action) {
2087     case OPTION_CLEAR:
2088     memset(cur, ' ', next-cur);
2089     break;
2090     case OPTION_REPLACE:
2091     memset(cur, ' ', next-cur);
2092     memcpy(cur+1, option, strlen(option));
2093     break;
2094     }
2095    
2096     cur = next;
2097     }
2098    
2099     free(option);
2100    
2101     FWDUI_load_settings(pvar);
2102    
2103     (pvar->ParseParam) (param, ts, DDETopic);
2104     }
2105 maya 3227
2106 doda 6801 static void PASCAL TTXGetSetupHooks(TTXSetupHooks *hooks)
2107 maya 3227 {
2108     pvar->ReadIniFile = *hooks->ReadIniFile;
2109     pvar->WriteIniFile = *hooks->WriteIniFile;
2110     pvar->ParseParam = *hooks->ParseParam;
2111    
2112     *hooks->ReadIniFile = TTXReadINIFile;
2113     *hooks->WriteIniFile = TTXWriteINIFile;
2114     *hooks->ParseParam = TTXParseParam;
2115     }
2116    
2117 doda 6801 static void PASCAL TTXSetWinSize(int rows, int cols)
2118 maya 3227 {
2119     SSH_notify_win_size(pvar, cols, rows);
2120     }
2121    
2122     static void insertMenuBeforeItem(HMENU menu, WORD beforeItemID, WORD flags,
2123 doda 6801 WORD newItemID, char *text)
2124 maya 3227 {
2125     int i, j;
2126    
2127     for (i = GetMenuItemCount(menu) - 1; i >= 0; i--) {
2128     HMENU submenu = GetSubMenu(menu, i);
2129    
2130     for (j = GetMenuItemCount(submenu) - 1; j >= 0; j--) {
2131     if (GetMenuItemID(submenu, j) == beforeItemID) {
2132     InsertMenu(submenu, j, MF_BYPOSITION | flags, newItemID, text);
2133     return;
2134     }
2135     }
2136     }
2137     }
2138    
2139 doda 4463 #define GetFileMenu(menu) GetSubMenuByChildID(menu, 50110) // ID_FILE_NEWCONNECTION
2140     #define GetEditMenu(menu) GetSubMenuByChildID(menu, 50210) // ID_EDIT_COPY2
2141     #define GetSetupMenu(menu) GetSubMenuByChildID(menu, 50310) // ID_SETUP_TERMINAL
2142     #define GetControlMenu(menu) GetSubMenuByChildID(menu, 50410) // ID_CONTROL_RESETTERMINAL
2143     #define GetHelpMenu(menu) GetSubMenuByChildID(menu, 50990) // ID_HELP_ABOUT
2144    
2145     HMENU GetSubMenuByChildID(HMENU menu, UINT id) {
2146     int i, j, items, subitems, cur_id;
2147     HMENU m;
2148    
2149     items = GetMenuItemCount(menu);
2150    
2151     for (i=0; i<items; i++) {
2152     if (m = GetSubMenu(menu, i)) {
2153     subitems = GetMenuItemCount(m);
2154     for (j=0; j<subitems; j++) {
2155     cur_id = GetMenuItemID(m, j);
2156     if (cur_id == id) {
2157     return m;
2158     }
2159     }
2160     }
2161     }
2162     return NULL;
2163     }
2164    
2165 doda 6801 static void PASCAL TTXModifyMenu(HMENU menu)
2166 maya 3227 {
2167 doda 4463 pvar->FileMenu = GetFileMenu(menu);
2168    
2169 maya 3227 /* inserts before ID_HELP_ABOUT */
2170     UTIL_get_lang_msg("MENU_ABOUT", pvar, "About &TTSSH...");
2171     insertMenuBeforeItem(menu, 50990, MF_ENABLED, ID_ABOUTMENU, pvar->ts->UIMsg);
2172    
2173     /* inserts before ID_SETUP_TCPIP */
2174     UTIL_get_lang_msg("MENU_SSH", pvar, "SS&H...");
2175     insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHSETUPMENU, pvar->ts->UIMsg);
2176     /* inserts before ID_SETUP_TCPIP */
2177     UTIL_get_lang_msg("MENU_SSH_AUTH", pvar, "SSH &Authentication...");
2178     insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHAUTHSETUPMENU, pvar->ts->UIMsg);
2179     /* inserts before ID_SETUP_TCPIP */
2180     UTIL_get_lang_msg("MENU_SSH_FORWARD", pvar, "SSH F&orwarding...");
2181     insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHFWDSETUPMENU, pvar->ts->UIMsg);
2182     UTIL_get_lang_msg("MENU_SSH_KEYGEN", pvar, "SSH KeyGe&nerator...");
2183     insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHKEYGENMENU, pvar->ts->UIMsg);
2184    
2185     /* inserts before ID_FILE_CHANGEDIR */
2186     UTIL_get_lang_msg("MENU_SSH_SCP", pvar, "SS&H SCP...");
2187 doda 4463 insertMenuBeforeItem(menu, 50170, MF_GRAYED, ID_SSHSCPMENU, pvar->ts->UIMsg);
2188 maya 3227 }
2189    
2190 doda 6801 static void PASCAL TTXModifyPopupMenu(HMENU menu) {
2191 doda 4463 if (menu == pvar->FileMenu) {
2192 maya 6997 if (pvar->cv->Ready && pvar->socket != INVALID_SOCKET)
2193 doda 4463 EnableMenuItem(menu, ID_SSHSCPMENU, MF_BYCOMMAND | MF_ENABLED);
2194     else
2195     EnableMenuItem(menu, ID_SSHSCPMENU, MF_BYCOMMAND | MF_GRAYED);
2196     }
2197     }
2198    
2199 maya 6132 static void about_dlg_set_abouttext(PTInstVar pvar, HWND dlg, digest_algorithm dgst_alg)
2200 maya 3227 {
2201 maya 6135 char buf[1024], buf2[2048];
2202 yutakapon 5575 char *fp = NULL;
2203 maya 3227
2204     // TTSSH�_�C�A���O���\������SSH������������ (2004.10.30 yutaka)
2205     if (pvar->socket != INVALID_SOCKET) {
2206 maya 6135 buf2[0] = '\0';
2207 maya 6132
2208 maya 3227 if (SSHv1(pvar)) {
2209 maya 6135 UTIL_get_lang_msg("DLG_ABOUT_SERVERID", pvar, "Server ID:");
2210     strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2211     strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2212 maya 3227 SSH_get_server_ID_info(pvar, buf, sizeof(buf));
2213 maya 6135 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2214     strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2215    
2216 maya 3227 UTIL_get_lang_msg("DLG_ABOUT_PROTOCOL", pvar, "Using protocol:");
2217 maya 6135 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2218     strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2219 maya 6150 SSH_get_protocol_version_info(pvar, buf, sizeof(buf));
2220 maya 6135 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2221     strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2222    
2223 maya 3227 UTIL_get_lang_msg("DLG_ABOUT_ENCRYPTION", pvar, "Encryption:");
2224 maya 6135 strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2225     strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2226 maya 6150 CRYPT_get_cipher_info(pvar, buf, sizeof(buf));
2227 maya 6135 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2228     strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2229    
2230     UTIL_get_lang_msg("DLG_ABOUT_SERVERKEY", pvar, "Server keys:");
2231     strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2232