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 7605 - (hide annotations) (download) (as text)
Mon Apr 22 16:18:08 2019 UTC (4 years, 11 months ago) by zmatsuo
Original Path: trunk/ttssh2/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 185380 byte(s)
ttssh の passphrase edit control の tooltip を i18n化
auth dialog,Key generator dialogで使用
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 zmatsuo 7560 //static HFONT DlgHostFont;
109     //static HFONT DlgAboutFont;
110 yutakapon 5578 static HFONT DlgAboutTextFont;
111 zmatsuo 7560 //static HFONT DlgSetupFont;
112     //static HFONT DlgKeygenFont;
113 maya 3227
114 doda 6801 static TInstVar *pvar;
115 maya 3227
116     typedef struct {
117 maya 4307 int cnt;
118     HWND dlg;
119 maya 4378 ssh_keytype type;
120 maya 3227 } 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 doda 6691 if (OldNotifyIcon) {
180     SetCustomNotifyIcon(OldNotifyIcon);
181     }
182 maya 3227
183     ssh_heartbeat_lock_finalize();
184     }
185    
186 doda 6801 static void PASCAL TTXInit(PTTSet ts, PComVar cv)
187 maya 3227 {
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 maya 4378 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 maya 6031 int i, j, k=-1;
203 maya 4378
204     memset(listed, 0, sizeof(listed));
205     memset(allowed, 0, sizeof(allowed));
206 yutakapon 6508
207     // �����������������������X�g�������B
208 maya 4378 for (i = 0; i < default_strings_len ; i++) {
209     allowed[default_strings[i]] = 1;
210     }
211    
212 yutakapon 6508 // �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 maya 4378 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 maya 6031
234 yutakapon 6508 // disabled line���������A���u���o���������B
235 maya 6031 if (num == 0) {
236     k = i;
237     }
238 maya 4378 }
239    
240 yutakapon 6508 // �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 maya 6031 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 yutakapon 6508 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 maya 6031 buf[k] = num + '0';
261     k++;
262     i++;
263     }
264     }
265     if (k < 0) {
266     j = 0;
267     }
268     else {
269     j++;
270     }
271 yutakapon 6508
272     // disabled line�������������������A�����������������������B
273 maya 6031 for (; j < default_strings_len ; j++) {
274     int num = default_strings[j];
275    
276     if (!listed[num]) {
277     buf[i] = num + '0';
278 doda 7454 listed[num] = 1;
279 maya 6031 i++;
280     }
281     }
282 maya 4378
283     buf[i] = 0;
284     }
285    
286 maya 3227 /*
287     * Remove unsupported cipher or duplicated cipher.
288     * Add unspecified ciphers at the end of list.
289     */
290 doda 6801 static void normalize_cipher_order(char *buf)
291 maya 3227 {
292     /* SSH_CIPHER_NONE means that all ciphers below that one are disabled.
293     We *never* allow no encryption. */
294 maya 4378 static char default_strings[] = {
295 doda 6985 SSH2_CIPHER_AES256_GCM,
296 doda 4433 SSH2_CIPHER_CAMELLIA256_CTR,
297 maya 3227 SSH2_CIPHER_AES256_CTR,
298 doda 4433 SSH2_CIPHER_CAMELLIA256_CBC,
299 maya 3227 SSH2_CIPHER_AES256_CBC,
300 doda 4433 SSH2_CIPHER_CAMELLIA192_CTR,
301 maya 3227 SSH2_CIPHER_AES192_CTR,
302 doda 4433 SSH2_CIPHER_CAMELLIA192_CBC,
303 maya 3227 SSH2_CIPHER_AES192_CBC,
304 doda 6985 SSH2_CIPHER_AES128_GCM,
305 doda 4433 SSH2_CIPHER_CAMELLIA128_CTR,
306 maya 3227 SSH2_CIPHER_AES128_CTR,
307 doda 4433 SSH2_CIPHER_CAMELLIA128_CBC,
308 maya 3227 SSH2_CIPHER_AES128_CBC,
309 doda 3850 SSH2_CIPHER_3DES_CTR,
310 maya 3227 SSH2_CIPHER_3DES_CBC,
311 doda 3850 SSH2_CIPHER_BLOWFISH_CTR,
312 maya 3227 SSH2_CIPHER_BLOWFISH_CBC,
313 doda 3850 SSH2_CIPHER_CAST128_CTR,
314 maya 3227 SSH2_CIPHER_CAST128_CBC,
315     SSH_CIPHER_3DES,
316     SSH_CIPHER_NONE,
317 maya 5917 SSH2_CIPHER_ARCFOUR256,
318     SSH2_CIPHER_ARCFOUR128,
319     SSH2_CIPHER_ARCFOUR,
320     SSH_CIPHER_BLOWFISH,
321 maya 3227 SSH_CIPHER_DES,
322 maya 4432 0, 0, 0 // Dummy for SSH_CIPHER_IDEA, SSH_CIPHER_TSS, SSH_CIPHER_RC4
323 maya 3227 };
324    
325 maya 4378 normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings));
326 maya 3227 }
327    
328 doda 6801 static void normalize_kex_order(char *buf)
329 yutakapon 4367 {
330     static char default_strings[] = {
331     KEX_ECDH_SHA2_256,
332     KEX_ECDH_SHA2_384,
333     KEX_ECDH_SHA2_521,
334 doda 6310 KEX_DH_GRP18_SHA512,
335     KEX_DH_GRP16_SHA512,
336 doda 6263 KEX_DH_GRP14_SHA256,
337 yutakapon 4367 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 doda 6801 static void normalize_host_key_order(char *buf)
348 yutakapon 4367 {
349     static char default_strings[] = {
350     KEY_ECDSA256,
351     KEY_ECDSA384,
352     KEY_ECDSA521,
353 yutakapon 5545 KEY_ED25519,
354 yutakapon 4367 KEY_RSA,
355     KEY_DSA,
356     KEY_NONE,
357     };
358    
359     normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings));
360     }
361    
362 doda 6801 static void normalize_mac_order(char *buf)
363 yutakapon 4367 {
364     static char default_strings[] = {
365 doda 6969 HMAC_SHA2_512_EtM,
366     HMAC_SHA2_256_EtM,
367     HMAC_SHA1_EtM,
368 doda 4434 HMAC_SHA2_512,
369     HMAC_SHA2_256,
370 yutakapon 4367 HMAC_SHA1,
371 doda 6969 HMAC_RIPEMD160_EtM,
372 doda 4423 HMAC_RIPEMD160,
373 doda 6969 HMAC_MD5_EtM,
374 yutakapon 4367 HMAC_MD5,
375 doda 4426 HMAC_NONE,
376 doda 6969 HMAC_SHA1_96_EtM,
377     HMAC_MD5_96_EtM,
378 doda 4434 HMAC_SHA1_96,
379     HMAC_MD5_96,
380 doda 5016 0, // Dummy for HMAC_SHA2_512_96,
381     0, // Dummy for HMAC_SHA2_256_96,
382 yutakapon 4367 };
383    
384     normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings));
385     }
386    
387 doda 6801 static void normalize_comp_order(char *buf)
388 yutakapon 4367 {
389     static char default_strings[] = {
390 doda 4371 COMP_DELAYED,
391     COMP_ZLIB,
392 maya 4378 COMP_NOCOMP,
393 yutakapon 4367 COMP_NONE,
394     };
395    
396     normalize_generic_order(buf, default_strings, NUM_ELEM(default_strings));
397     }
398    
399    
400 maya 3227 /* 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 doda 6801 static BOOL read_BOOL_option(PCHAR fileName, char *keyName, BOOL def)
407 maya 3227 {
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 doda 6801 static void read_string_option(PCHAR fileName, char *keyName,
423     char *def, char *buf, int bufSize)
424 maya 3227 {
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 doda 6801 TS_SSH *settings = pvar->ts_SSH;
434 maya 3227
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     READ_STD_STRING_OPTION(DefaultForwarding);
450     READ_STD_STRING_OPTION(DefaultRhostsLocalUserName);
451     READ_STD_STRING_OPTION(DefaultRhostsHostPrivateKeyFile);
452     READ_STD_STRING_OPTION(DefaultRSAPrivateKeyFile);
453    
454     READ_STD_STRING_OPTION(CipherOrder);
455     normalize_cipher_order(settings->CipherOrder);
456    
457 yutakapon 4367 // KEX order
458     READ_STD_STRING_OPTION(KexOrder);
459     normalize_kex_order(settings->KexOrder);
460     // Host Key algorithm order
461     READ_STD_STRING_OPTION(HostKeyOrder);
462     normalize_host_key_order(settings->HostKeyOrder);
463 doda 6821 // HMAC order
464 yutakapon 4367 READ_STD_STRING_OPTION(MacOrder);
465     normalize_mac_order(settings->MacOrder);
466     // Compression algorithm order
467     READ_STD_STRING_OPTION(CompOrder);
468     normalize_comp_order(settings->CompOrder);
469    
470 maya 3227 read_string_option(fileName, "KnownHostsFiles", "ssh_known_hosts",
471     settings->KnownHostsFiles,
472     sizeof(settings->KnownHostsFiles));
473    
474     buf[0] = 0;
475     GetPrivateProfileString("TTSSH", "DefaultAuthMethod", "", buf,
476     sizeof(buf), fileName);
477     settings->DefaultAuthMethod = atoi(buf);
478     if (settings->DefaultAuthMethod != SSH_AUTH_PASSWORD
479     && settings->DefaultAuthMethod != SSH_AUTH_RSA
480     && settings->DefaultAuthMethod != SSH_AUTH_TIS // add (2005.3.12 yutaka)
481     && settings->DefaultAuthMethod != SSH_AUTH_RHOSTS
482     && settings->DefaultAuthMethod != SSH_AUTH_PAGEANT) {
483     /* this default can never be SSH_AUTH_RHOSTS_RSA because that is not a
484     selection in the dialog box; SSH_AUTH_RHOSTS_RSA is automatically chosen
485     when the dialog box has rhosts selected and an host private key file
486     is supplied. */
487     settings->DefaultAuthMethod = SSH_AUTH_PASSWORD;
488     }
489    
490     buf[0] = 0;
491     GetPrivateProfileString("TTSSH", "LogLevel", "", buf, sizeof(buf),
492     fileName);
493     settings->LogLevel = atoi(buf);
494    
495     buf[0] = 0;
496     GetPrivateProfileString("TTSSH", "WriteBufferSize", "", buf,
497     sizeof(buf), fileName);
498     settings->WriteBufferSize = atoi(buf);
499     if (settings->WriteBufferSize <= 0) {
500     settings->WriteBufferSize = (PACKET_MAX_SIZE / 2); // 2MB
501     }
502    
503     // SSH protocol version (2004.10.11 yutaka)
504     // default is SSH2 (2004.11.30 yutaka)
505     settings->ssh_protocol_version = GetPrivateProfileInt("TTSSH", "ProtocolVersion", 2, fileName);
506    
507     // SSH heartbeat time(second) (2004.12.11 yutaka)
508     settings->ssh_heartbeat_overtime = GetPrivateProfileInt("TTSSH", "HeartBeat", 60, fileName);
509    
510     // �p�X���[�h�F�����������J���F�����g���p�X���[�h����������������������������������
511     // �\���B(2006.8.5 yutaka)
512     settings->remember_password = GetPrivateProfileInt("TTSSH", "RememberPassword", 1, fileName);
513    
514     // �������F���_�C�A���O���T�|�[�g�������������\�b�h���`�F�b�N���A
515     // ���������\�b�h���O���C�A�E�g���� (2007.9.24 maya)
516     settings->CheckAuthListFirst = read_BOOL_option(fileName, "CheckAuthListFirst", FALSE);
517    
518     // 768bit ������ RSA ���������T�[�o�����������L�������� (2008.9.11 maya)
519     settings->EnableRsaShortKeyServer = read_BOOL_option(fileName, "EnableRsaShortKeyServer", FALSE);
520    
521     // agent forward ���L�������� (2008.11.25 maya)
522     settings->ForwardAgent = read_BOOL_option(fileName, "ForwardAgent", FALSE);
523    
524 maya 4229 // agent forward �m�F���L��������
525     settings->ForwardAgentConfirm = read_BOOL_option(fileName, "ForwardAgentConfirm", TRUE);
526    
527 doda 6663 // agent forward �m�F���L��������
528     settings->ForwardAgentNotify = read_BOOL_option(fileName, "ForwardAgentNotify", TRUE);
529    
530 doda 4531 // �z�X�g���� DNS �����`�F�b�N (RFC 4255)
531 doda 4619 settings->VerifyHostKeyDNS = read_BOOL_option(fileName, "VerifyHostKeyDNS", TRUE);
532 doda 4531
533 doda 5261 // icon
534     GetPrivateProfileString("TTSSH", "SSHIcon", "", buf, sizeof(buf), fileName);
535     if ((_stricmp(buf, "old") == 0) ||
536     (_stricmp(buf, "yellow") == 0) ||
537     (_stricmp(buf, "securett_yellow") == 0)) {
538     settings->IconID = IDI_SECURETT_YELLOW;
539     }
540 maya 6386 else if ((_stricmp(buf, "green") == 0) ||
541     (_stricmp(buf, "securett_green") == 0)) {
542     settings->IconID = IDI_SECURETT_GREEN;
543     }
544 doda 5261 else {
545     settings->IconID = IDI_SECURETT;
546     }
547    
548 yutakapon 5620 // �G���[�������x�������|�b�v�A�b�v���b�Z�[�W���}�~���� (2014.6.26 yutaka)
549     settings->DisablePopupMessage = GetPrivateProfileInt("TTSSH", "DisablePopupMessage", 0, fileName);
550    
551 doda 5793 READ_STD_STRING_OPTION(X11Display);
552    
553 yutakapon 5849 settings->UpdateHostkeys = GetPrivateProfileInt("TTSSH", "UpdateHostkeys", 0, fileName);
554 yutakapon 5839
555 doda 5900 settings->GexMinimalGroupSize = GetPrivateProfileInt("TTSSH", "GexMinimalGroupSize", 0, fileName);
556    
557 doda 7048 settings->AuthBanner = GetPrivateProfileInt("TTSSH", "AuthBanner", 1, fileName);
558    
559 maya 3227 clear_local_settings(pvar);
560     }
561    
562     static void write_ssh_options(PTInstVar pvar, PCHAR fileName,
563 doda 6801 TS_SSH *settings, BOOL copy_forward)
564 maya 3227 {
565     char buf[1024];
566    
567     WritePrivateProfileString("TTSSH", "Enabled",
568     settings->Enabled ? "1" : "0", fileName);
569    
570     _itoa(settings->CompressionLevel, buf, 10);
571     WritePrivateProfileString("TTSSH", "Compression", buf, fileName);
572    
573     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 doda 6808 void logprintf(int level, char *fmt, ...)
977 doda 6051 {
978     char buff[4096];
979     va_list params;
980    
981 doda 6823 if (level <= pvar->settings.LogLevel) {
982 doda 6051 va_start(params, fmt);
983     vsnprintf_s(buff, sizeof(buff), _TRUNCATE, fmt, params);
984     va_end(params);
985    
986 doda 6809 logputs(level, buff);
987 doda 6051 }
988     }
989    
990 yutakapon 6302 static void format_line_hexdump(char *buf, int buflen, int addr, int *bytes, int byte_cnt)
991     {
992     int i, c;
993     char tmp[128];
994    
995     buf[0] = 0;
996    
997     /* �������A�h���X�\�� */
998     _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%08X : ", addr);
999     strncat_s(buf, buflen, tmp, _TRUNCATE);
1000    
1001     /* �o�C�i���\���i4�o�C�g�������������}���j*/
1002     for (i = 0; i < byte_cnt; i++) {
1003     if (i > 0 && i % 4 == 0) {
1004     strncat_s(buf, buflen, " ", _TRUNCATE);
1005     }
1006    
1007     _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%02X", bytes[i]);
1008     strncat_s(buf, buflen, tmp, _TRUNCATE);
1009     }
1010    
1011     /* ASCII�\���������������������� */
1012     _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, " %*s%*s", (16 - byte_cnt) * 2 + 1, " ", (16 - byte_cnt + 3) / 4, " ");
1013     strncat_s(buf, buflen, tmp, _TRUNCATE);
1014    
1015     /* ASCII�\�� */
1016     for (i = 0; i < byte_cnt; i++) {
1017     c = bytes[i];
1018     if (isprint(c)) {
1019     _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, "%c", c);
1020     strncat_s(buf, buflen, tmp, _TRUNCATE);
1021     }
1022     else {
1023     strncat_s(buf, buflen, ".", _TRUNCATE);
1024     }
1025     }
1026    
1027     //strncat_s(buf, buflen, "\n", _TRUNCATE);
1028     }
1029    
1030 doda 6808 void logprintf_hexdump(int level, char *data, int len, char *fmt, ...)
1031 yutakapon 6302 {
1032     char buff[4096];
1033     va_list params;
1034     int c, addr;
1035     int bytes[16], *ptr;
1036     int byte_cnt;
1037     int i;
1038    
1039 doda 6823 if (level <= pvar->settings.LogLevel) {
1040 yutakapon 6302 va_start(params, fmt);
1041     vsnprintf_s(buff, sizeof(buff), _TRUNCATE, fmt, params);
1042     va_end(params);
1043    
1044 doda 6809 logputs(level, buff);
1045 yutakapon 6302
1046     addr = 0;
1047     byte_cnt = 0;
1048     ptr = bytes;
1049     for (i = 0; i < len; i++) {
1050     c = data[i];
1051     *ptr++ = c & 0xff;
1052     byte_cnt++;
1053    
1054     if (byte_cnt == 16) {
1055     format_line_hexdump(buff, sizeof(buff), addr, bytes, byte_cnt);
1056 doda 6809 logputs(level, buff);
1057 yutakapon 6302
1058     addr += 16;
1059     byte_cnt = 0;
1060     ptr = bytes;
1061     }
1062     }
1063    
1064     if (byte_cnt > 0) {
1065     format_line_hexdump(buff, sizeof(buff), addr, bytes, byte_cnt);
1066 doda 6809 logputs(level, buff);
1067 yutakapon 6302 }
1068     }
1069     }
1070    
1071 doda 6801 static void PASCAL TTXOpenTCP(TTXSockHooks *hooks)
1072 maya 3227 {
1073     if (pvar->settings.Enabled) {
1074     // TCPLocalEcho/TCPCRSend ������������ (maya 2007.4.25)
1075 doda 3579 pvar->origDisableTCPEchoCR = pvar->ts->DisableTCPEchoCR;
1076 maya 3227 pvar->ts->DisableTCPEchoCR = TRUE;
1077    
1078     pvar->session_settings = pvar->settings;
1079    
1080 doda 6809 logputs(LOG_LEVEL_VERBOSE, "---------------------------------------------------------------------");
1081     logputs(LOG_LEVEL_VERBOSE, "Initiating SSH session");
1082 maya 3227
1083     FWDUI_load_settings(pvar);
1084    
1085     pvar->cv->TelAutoDetect = FALSE;
1086     /* This next line should not be needed because Tera Term's
1087     CommLib should find ts->Telnet == 0 ... but we'll do this
1088     just to be on the safe side. */
1089     pvar->cv->TelFlag = FALSE;
1090 doda 3495 pvar->cv->TelLineMode = FALSE;
1091 maya 3227
1092     pvar->Precv = *hooks->Precv;
1093     pvar->Psend = *hooks->Psend;
1094     pvar->PWSAAsyncSelect = *hooks->PWSAAsyncSelect;
1095     pvar->Pconnect = *hooks->Pconnect;
1096     pvar->PWSAGetLastError = *hooks->PWSAGetLastError;
1097    
1098     *hooks->Precv = TTXrecv;
1099     *hooks->Psend = TTXsend;
1100     *hooks->PWSAAsyncSelect = TTXWSAAsyncSelect;
1101     *hooks->Pconnect = TTXconnect;
1102    
1103     SSH_open(pvar);
1104     HOSTS_open(pvar);
1105     FWDUI_open(pvar);
1106    
1107     // ������ myproposal �����f���������A�������O�����������B (2006.6.26 maya)
1108     SSH2_update_cipher_myproposal(pvar);
1109 yutakapon 4367 SSH2_update_kex_myproposal(pvar);
1110     SSH2_update_host_key_myproposal(pvar);
1111     SSH2_update_hmac_myproposal(pvar);
1112 maya 3227 SSH2_update_compression_myproposal(pvar);
1113     }
1114     }
1115    
1116 doda 6801 static void PASCAL TTXCloseTCP(TTXSockHooks *hooks)
1117 maya 3227 {
1118     if (pvar->session_settings.Enabled) {
1119     pvar->socket = INVALID_SOCKET;
1120    
1121 doda 6809 logputs(LOG_LEVEL_VERBOSE, "Terminating SSH session...");
1122 maya 3227
1123     *hooks->Precv = pvar->Precv;
1124     *hooks->Psend = pvar->Psend;
1125     *hooks->PWSAAsyncSelect = pvar->PWSAAsyncSelect;
1126     *hooks->Pconnect = pvar->Pconnect;
1127 doda 3579
1128     pvar->ts->DisableTCPEchoCR = pvar->origDisableTCPEchoCR;
1129 maya 3227 }
1130    
1131     uninit_TTSSH(pvar);
1132     init_TTSSH(pvar);
1133     }
1134    
1135     static void enable_dlg_items(HWND dlg, int from, int to, BOOL enabled)
1136     {
1137     for (; from <= to; from++) {
1138     EnableWindow(GetDlgItem(dlg, from), enabled);
1139     }
1140     }
1141    
1142     // C-p/C-n/C-b/C-f/C-a/C-e ���T�|�[�g (2007.9.5 maya)
1143     // C-d/C-k ���T�|�[�g (2007.10.3 yutaka)
1144     // �h���b�v�_�E���������G�f�B�b�g�R���g���[����
1145     // �T�u�N���X�������������E�C���h�E�v���V�[�W��
1146     WNDPROC OrigHostnameEditProc; // Original window procedure
1147     LRESULT CALLBACK HostnameEditProc(HWND dlg, UINT msg,
1148 maya 5868 WPARAM wParam, LPARAM lParam)
1149 maya 3227 {
1150     HWND parent;
1151     int max, select, len;
1152     char *str, *orgstr;
1153    
1154     switch (msg) {
1155     // �L�[�����������������m����
1156     case WM_KEYDOWN:
1157     if (GetKeyState(VK_CONTROL) < 0) {
1158     switch (wParam) {
1159     case 0x50: // Ctrl+p ... up
1160     parent = GetParent(dlg);
1161     select = SendMessage(parent, CB_GETCURSEL, 0, 0);
1162     if (select > 0) {
1163     PostMessage(parent, CB_SETCURSEL, select - 1, 0);
1164     }
1165     return 0;
1166     case 0x4e: // Ctrl+n ... down
1167     parent = GetParent(dlg);
1168     max = SendMessage(parent, CB_GETCOUNT, 0, 0);
1169     select = SendMessage(parent, CB_GETCURSEL, 0, 0);
1170     if (select < max - 1) {
1171     PostMessage(parent, CB_SETCURSEL, select + 1, 0);
1172     }
1173     return 0;
1174     case 0x42: // Ctrl+b ... left
1175     SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
1176     PostMessage(dlg, EM_SETSEL, select-1, select-1);
1177     return 0;
1178     case 0x46: // Ctrl+f ... right
1179     SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
1180     max = GetWindowTextLength(dlg) ;
1181     PostMessage(dlg, EM_SETSEL, select+1, select+1);
1182     return 0;
1183     case 0x41: // Ctrl+a ... home
1184     PostMessage(dlg, EM_SETSEL, 0, 0);
1185     return 0;
1186     case 0x45: // Ctrl+e ... end
1187     max = GetWindowTextLength(dlg) ;
1188     PostMessage(dlg, EM_SETSEL, max, max);
1189     return 0;
1190    
1191     case 0x44: // Ctrl+d
1192     case 0x4b: // Ctrl+k
1193     case 0x55: // Ctrl+u
1194     SendMessage(dlg, EM_GETSEL, 0, (LPARAM)&select);
1195     max = GetWindowTextLength(dlg);
1196     max++; // '\0'
1197     orgstr = str = malloc(max);
1198     if (str != NULL) {
1199     len = GetWindowText(dlg, str, max);
1200     if (select >= 0 && select < len) {
1201     if (wParam == 0x44) { // �J�[�\���z����������������������
1202     memmove(&str[select], &str[select + 1], len - select - 1);
1203     str[len - 1] = '\0';
1204    
1205     } else if (wParam == 0x4b) { // �J�[�\�������s��������������
1206     str[select] = '\0';
1207    
1208     }
1209     }
1210    
1211     if (wParam == 0x55) { // �J�[�\����������������������
1212     if (select >= len) {
1213     str[0] = '\0';
1214     } else {
1215     str = &str[select];
1216     }
1217     select = 0;
1218     }
1219    
1220     SetWindowText(dlg, str);
1221     SendMessage(dlg, EM_SETSEL, select, select);
1222     free(orgstr);
1223     return 0;
1224     }
1225     break;
1226     }
1227     }
1228     break;
1229    
1230     // �����L�[��������������������������������������������
1231     case WM_CHAR:
1232     switch (wParam) {
1233     case 0x01:
1234     case 0x02:
1235     case 0x04:
1236     case 0x05:
1237     case 0x06:
1238     case 0x0b:
1239     case 0x0e:
1240     case 0x10:
1241     case 0x15:
1242     return 0;
1243     }
1244     }
1245    
1246     return CallWindowProc(OrigHostnameEditProc, dlg, msg, wParam, lParam);
1247     }
1248    
1249     static BOOL CALLBACK TTXHostDlg(HWND dlg, UINT msg, WPARAM wParam,
1250     LPARAM lParam)
1251     {
1252     static char *ssh_version[] = {"SSH1", "SSH2", NULL};
1253     PGetHNRec GetHNRec;
1254     char EntName[128];
1255     char TempHost[HostNameMaxLength + 1];
1256     WORD i, j, w;
1257     WORD ComPortTable[MAXCOMPORT];
1258     static char *ComPortDesc[MAXCOMPORT];
1259     int comports;
1260     BOOL Ok;
1261 zmatsuo 7560 // LOGFONT logfont;
1262     // HFONT font;
1263 maya 3227 char uimsg[MAX_UIMSG];
1264     static HWND hwndHostname = NULL; // HOSTNAME dropdown
1265     static HWND hwndHostnameEdit = NULL; // Edit control on HOSTNAME dropdown
1266    
1267     switch (msg) {
1268     case WM_INITDIALOG:
1269     GetHNRec = (PGetHNRec) lParam;
1270     SetWindowLong(dlg, DWL_USER, lParam);
1271    
1272     GetWindowText(dlg, uimsg, sizeof(uimsg));
1273     UTIL_get_lang_msg("DLG_HOST_TITLE", pvar, uimsg);
1274     SetWindowText(dlg, pvar->ts->UIMsg);
1275     GetDlgItemText(dlg, IDC_HOSTNAMELABEL, uimsg, sizeof(uimsg));
1276     UTIL_get_lang_msg("DLG_HOST_TCPIPHOST", pvar, uimsg);
1277     SetDlgItemText(dlg, IDC_HOSTNAMELABEL, pvar->ts->UIMsg);
1278     GetDlgItemText(dlg, IDC_HISTORY, uimsg, sizeof(uimsg));
1279     UTIL_get_lang_msg("DLG_HOST_TCPIPHISTORY", pvar, uimsg);
1280     SetDlgItemText(dlg, IDC_HISTORY, pvar->ts->UIMsg);
1281     GetDlgItemText(dlg, IDC_SERVICELABEL, uimsg, sizeof(uimsg));
1282     UTIL_get_lang_msg("DLG_HOST_TCPIPSERVICE", pvar, uimsg);
1283     SetDlgItemText(dlg, IDC_SERVICELABEL, pvar->ts->UIMsg);
1284     GetDlgItemText(dlg, IDC_HOSTOTHER, uimsg, sizeof(uimsg));
1285     UTIL_get_lang_msg("DLG_HOST_TCPIPOTHER", pvar, uimsg);
1286     SetDlgItemText(dlg, IDC_HOSTOTHER, pvar->ts->UIMsg);
1287     GetDlgItemText(dlg, IDC_HOSTTCPPORTLABEL, uimsg, sizeof(uimsg));
1288     UTIL_get_lang_msg("DLG_HOST_TCPIPPORT", pvar, uimsg);
1289     SetDlgItemText(dlg, IDC_HOSTTCPPORTLABEL, pvar->ts->UIMsg);
1290     GetDlgItemText(dlg, IDC_SSH_VERSION_LABEL, uimsg, sizeof(uimsg));
1291     UTIL_get_lang_msg("DLG_HOST_TCPIPSSHVERSION", pvar, uimsg);
1292     SetDlgItemText(dlg, IDC_SSH_VERSION_LABEL, pvar->ts->UIMsg);
1293     GetDlgItemText(dlg, IDC_HOSTTCPPROTOCOLLABEL, uimsg, sizeof(uimsg));
1294     UTIL_get_lang_msg("DLG_HOST_TCPIPPROTOCOL", pvar, uimsg);
1295     SetDlgItemText(dlg, IDC_HOSTTCPPROTOCOLLABEL, pvar->ts->UIMsg);
1296     GetDlgItemText(dlg, IDC_HOSTSERIAL, uimsg, sizeof(uimsg));
1297     UTIL_get_lang_msg("DLG_HOST_SERIAL", pvar, uimsg);
1298     SetDlgItemText(dlg, IDC_HOSTSERIAL, pvar->ts->UIMsg);
1299     GetDlgItemText(dlg, IDC_HOSTCOMLABEL, uimsg, sizeof(uimsg));
1300     UTIL_get_lang_msg("DLG_HOST_SERIALPORT", pvar, uimsg);
1301     SetDlgItemText(dlg, IDC_HOSTCOMLABEL, pvar->ts->UIMsg);
1302     GetDlgItemText(dlg, IDC_HOSTHELP, uimsg, sizeof(uimsg));
1303     UTIL_get_lang_msg("DLG_HOST_HELP", pvar, uimsg);
1304     SetDlgItemText(dlg, IDC_HOSTHELP, pvar->ts->UIMsg);
1305     GetDlgItemText(dlg, IDOK, uimsg, sizeof(uimsg));
1306     UTIL_get_lang_msg("BTN_OK", pvar, uimsg);
1307     SetDlgItemText(dlg, IDOK, pvar->ts->UIMsg);
1308     GetDlgItemText(dlg, IDCANCEL, uimsg, sizeof(uimsg));
1309     UTIL_get_lang_msg("BTN_CANCEL", pvar, uimsg);
1310     SetDlgItemText(dlg, IDCANCEL, pvar->ts->UIMsg);
1311    
1312     // �z�X�g�q�X�g�����`�F�b�N�{�b�N�X������ (2005.10.21 yutaka)
1313     if (pvar->ts->HistoryList > 0) {
1314     SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_SETCHECK, BST_CHECKED, 0);
1315     } else {
1316     SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_SETCHECK, BST_UNCHECKED, 0);
1317     }
1318    
1319 yutakapon 4860 // �t�@�C�����������O�t���p�C�v�������ATCP/IP�����������B
1320     if (GetHNRec->PortType == IdFile ||
1321     GetHNRec->PortType == IdNamedPipe
1322     )
1323 maya 3227 GetHNRec->PortType = IdTCPIP;
1324    
1325     strncpy_s(EntName, sizeof(EntName), "Host", _TRUNCATE);
1326    
1327     i = 1;
1328     do {
1329     _snprintf_s(&EntName[4], sizeof(EntName)-4, _TRUNCATE, "%d", i);
1330     GetPrivateProfileString("Hosts", EntName, "",
1331     TempHost, sizeof(TempHost),
1332     GetHNRec->SetupFN);
1333     if (strlen(TempHost) > 0)
1334     SendDlgItemMessage(dlg, IDC_HOSTNAME, CB_ADDSTRING,
1335     0, (LPARAM) TempHost);
1336     i++;
1337 maya 4963 } while (i <= MAXHOSTLIST);
1338 maya 3227
1339     SendDlgItemMessage(dlg, IDC_HOSTNAME, EM_LIMITTEXT,
1340     HostNameMaxLength - 1, 0);
1341    
1342     SendDlgItemMessage(dlg, IDC_HOSTNAME, CB_SETCURSEL, 0, 0);
1343    
1344     // C-n/C-p ���������T�u�N���X�� (2007.9.4 maya)
1345     hwndHostname = GetDlgItem(dlg, IDC_HOSTNAME);
1346     hwndHostnameEdit = GetWindow(hwndHostname, GW_CHILD);
1347     OrigHostnameEditProc = (WNDPROC)GetWindowLong(hwndHostnameEdit, GWL_WNDPROC);
1348     SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)HostnameEditProc);
1349    
1350     CheckRadioButton(dlg, IDC_HOSTTELNET, IDC_HOSTOTHER,
1351     pvar->settings.Enabled ? IDC_HOSTSSH : GetHNRec->
1352     Telnet ? IDC_HOSTTELNET : IDC_HOSTOTHER);
1353     SendDlgItemMessage(dlg, IDC_HOSTTCPPORT, EM_LIMITTEXT, 5, 0);
1354     SetDlgItemInt(dlg, IDC_HOSTTCPPORT, GetHNRec->TCPPort, FALSE);
1355     for (i = 0; ProtocolFamilyList[i]; ++i) {
1356     SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, CB_ADDSTRING,
1357     0, (LPARAM) ProtocolFamilyList[i]);
1358     }
1359     SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, EM_LIMITTEXT,
1360     ProtocolFamilyMaxLength - 1, 0);
1361     SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, CB_SETCURSEL, 0, 0);
1362    
1363     /////// SSH version
1364     for (i = 0; ssh_version[i]; ++i) {
1365     SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_ADDSTRING,
1366     0, (LPARAM) ssh_version[i]);
1367     }
1368     SendDlgItemMessage(dlg, IDC_SSH_VERSION, EM_LIMITTEXT,
1369     NUM_ELEM(ssh_version) - 1, 0);
1370    
1371     if (pvar->settings.ssh_protocol_version == 1) {
1372     SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_SETCURSEL, 0, 0); // SSH1
1373     } else {
1374     SendDlgItemMessage(dlg, IDC_SSH_VERSION, CB_SETCURSEL, 1, 0); // SSH2
1375     }
1376    
1377     if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1378     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE); // enabled
1379     } else {
1380     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1381     }
1382     /////// SSH version
1383    
1384    
1385     j = 0;
1386     w = 1;
1387     if ((comports=DetectComPorts(ComPortTable, GetHNRec->MaxComPort, ComPortDesc)) >= 0) {
1388     for (i=0; i<comports; i++) {
1389     // MaxComPort ���z�����|�[�g���\��������
1390     if (ComPortTable[i] > GetHNRec->MaxComPort) {
1391     continue;
1392     }
1393    
1394     // �g�p�����|�[�g���\��������
1395     if (CheckCOMFlag(ComPortTable[i]) == 1) {
1396     continue;
1397     }
1398    
1399     _snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "COM%d", ComPortTable[i]);
1400     if (ComPortDesc[i] != NULL) {
1401     strncat_s(EntName, sizeof(EntName), ": ", _TRUNCATE);
1402     strncat_s(EntName, sizeof(EntName), ComPortDesc[i], _TRUNCATE);
1403     }
1404     SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,
1405     0, (LPARAM)EntName);
1406     j++;
1407     if (GetHNRec->ComPort == ComPortTable[i])
1408     w = j;
1409     }
1410    
1411     } else {
1412     for (i = 1; i <= GetHNRec->MaxComPort; i++) {
1413     // �g�p�����|�[�g���\��������
1414     if (CheckCOMFlag(i) == 1) {
1415     continue;
1416     }
1417    
1418     _snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "COM%d", i);
1419     SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_ADDSTRING,
1420     0, (LPARAM) EntName);
1421     j++;
1422     if (GetHNRec->ComPort == i)
1423     w = j;
1424     }
1425     }
1426    
1427     if (j > 0)
1428     SendDlgItemMessage(dlg, IDC_HOSTCOM, CB_SETCURSEL, w - 1, 0);
1429     else { /* All com ports are already used */
1430     GetHNRec->PortType = IdTCPIP;
1431     enable_dlg_items(dlg, IDC_HOSTSERIAL, IDC_HOSTSERIAL, FALSE);
1432     }
1433    
1434     CheckRadioButton(dlg, IDC_HOSTTCPIP, IDC_HOSTSERIAL,
1435     IDC_HOSTTCPIP + GetHNRec->PortType - 1);
1436    
1437     if (GetHNRec->PortType == IdTCPIP) {
1438     enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, FALSE);
1439    
1440     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE);
1441     enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, TRUE);
1442    
1443     enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, TRUE); // enabled
1444     }
1445     else {
1446     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1447     FALSE);
1448     enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1449     IDC_HOSTTCPPROTOCOL, FALSE);
1450    
1451     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1452     enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, FALSE); // disabled (2004.11.23 yutaka)
1453    
1454     enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, FALSE); // disabled
1455     }
1456    
1457     // Host dialog���t�H�[�J�X�������� (2004.10.2 yutaka)
1458     if (GetHNRec->PortType == IdTCPIP) {
1459     HWND hwnd = GetDlgItem(dlg, IDC_HOSTNAME);
1460     SetFocus(hwnd);
1461     } else {
1462     HWND hwnd = GetDlgItem(dlg, IDC_HOSTCOM);
1463     SetFocus(hwnd);
1464     }
1465    
1466 zmatsuo 7560 #if 0
1467 maya 3227 font = (HFONT)SendMessage(dlg, WM_GETFONT, 0, 0);
1468     GetObject(font, sizeof(LOGFONT), &logfont);
1469     if (UTIL_get_lang_font("DLG_SYSTEM_FONT", dlg, &logfont, &DlgHostFont, pvar)) {
1470     SendDlgItemMessage(dlg, IDC_HOSTTCPIP, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1471     SendDlgItemMessage(dlg, IDC_HOSTNAMELABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1472     SendDlgItemMessage(dlg, IDC_HOSTNAME, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1473     SendDlgItemMessage(dlg, IDC_HISTORY, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1474     SendDlgItemMessage(dlg, IDC_SERVICELABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1475     SendDlgItemMessage(dlg, IDC_HOSTTELNET, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1476     SendDlgItemMessage(dlg, IDC_HOSTSSH, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1477     SendDlgItemMessage(dlg, IDC_HOSTOTHER, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1478     SendDlgItemMessage(dlg, IDC_HOSTTCPPORTLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1479     SendDlgItemMessage(dlg, IDC_HOSTTCPPORT, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1480     SendDlgItemMessage(dlg, IDC_SSH_VERSION_LABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1481     SendDlgItemMessage(dlg, IDC_SSH_VERSION, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1482     SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOLLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1483     SendDlgItemMessage(dlg, IDC_HOSTTCPPROTOCOL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1484     SendDlgItemMessage(dlg, IDC_HOSTSERIAL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1485     SendDlgItemMessage(dlg, IDC_HOSTCOMLABEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1486     SendDlgItemMessage(dlg, IDC_HOSTCOM, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1487     SendDlgItemMessage(dlg, IDOK, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1488     SendDlgItemMessage(dlg, IDCANCEL, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1489     SendDlgItemMessage(dlg, IDC_HOSTHELP, WM_SETFONT, (WPARAM)DlgHostFont, MAKELPARAM(TRUE,0));
1490     }
1491     else {
1492     DlgHostFont = NULL;
1493     }
1494 zmatsuo 7560 #endif
1495 zmatsuo 7592
1496     CenterWindow(dlg, GetParent(dlg));
1497    
1498 maya 3227 // SetFocus()���t�H�[�J�X���������������AFALSE�������K�v�������B
1499     // TRUE���������ATABSTOP�������������������R���g���[�����I�������B
1500     // (2004.11.23 yutaka)
1501     return FALSE;
1502     //return TRUE;
1503    
1504     case WM_COMMAND:
1505     switch (LOWORD(wParam)) {
1506     case IDOK:
1507     GetHNRec = (PGetHNRec) GetWindowLong(dlg, DWL_USER);
1508     if (GetHNRec != NULL) {
1509     if (IsDlgButtonChecked(dlg, IDC_HOSTTCPIP)) {
1510     char afstr[BUFSIZ];
1511     i = GetDlgItemInt(dlg, IDC_HOSTTCPPORT, &Ok, FALSE);
1512     if (Ok) {
1513     GetHNRec->TCPPort = i;
1514     } else {
1515     UTIL_get_lang_msg("MSG_TCPPORT_NAN_ERROR", pvar,
1516     "The TCP port must be a number.");
1517     MessageBox(dlg, pvar->ts->UIMsg,
1518     "Tera Term", MB_OK | MB_ICONEXCLAMATION);
1519     return TRUE;
1520     }
1521     #define getaf(str) \
1522     ((strcmp((str), "IPv6") == 0) ? AF_INET6 : \
1523     ((strcmp((str), "IPv4") == 0) ? AF_INET : AF_UNSPEC))
1524     memset(afstr, 0, sizeof(afstr));
1525     GetDlgItemText(dlg, IDC_HOSTTCPPROTOCOL, afstr,
1526     sizeof(afstr));
1527     GetHNRec->ProtocolFamily = getaf(afstr);
1528     GetHNRec->PortType = IdTCPIP;
1529     GetDlgItemText(dlg, IDC_HOSTNAME, GetHNRec->HostName,
1530     HostNameMaxLength);
1531     pvar->hostdlg_activated = TRUE;
1532     pvar->hostdlg_Enabled = FALSE;
1533     if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
1534     GetHNRec->Telnet = TRUE;
1535     } else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1536     pvar->hostdlg_Enabled = TRUE;
1537    
1538     // check SSH protocol version
1539     memset(afstr, 0, sizeof(afstr));
1540     GetDlgItemText(dlg, IDC_SSH_VERSION, afstr, sizeof(afstr));
1541     if (_stricmp(afstr, "SSH1") == 0) {
1542     pvar->settings.ssh_protocol_version = 1;
1543     } else {
1544     pvar->settings.ssh_protocol_version = 2;
1545     }
1546     }
1547 doda 3541 else { // IDC_HOSTOTHER
1548     GetHNRec->Telnet = FALSE;
1549     }
1550 maya 3227
1551     // host history check button
1552     if (SendMessage(GetDlgItem(dlg, IDC_HISTORY), BM_GETCHECK, 0, 0) == BST_CHECKED) {
1553     pvar->ts->HistoryList = 1;
1554     } else {
1555     pvar->ts->HistoryList = 0;
1556     }
1557    
1558     } else {
1559     GetHNRec->PortType = IdSerial;
1560     GetHNRec->HostName[0] = 0;
1561     memset(EntName, 0, sizeof(EntName));
1562     GetDlgItemText(dlg, IDC_HOSTCOM, EntName,
1563     sizeof(EntName) - 1);
1564     if (strncmp(EntName, "COM", 3) == 0 && EntName[3] != '\0') {
1565     GetHNRec->ComPort = atoi(&EntName[3]);
1566     if (GetHNRec->ComPort > GetHNRec->MaxComPort)
1567     GetHNRec->ComPort = 1;
1568     } else {
1569     GetHNRec->ComPort = 1;
1570     }
1571     }
1572     }
1573     SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)OrigHostnameEditProc);
1574     EndDialog(dlg, 1);
1575 zmatsuo 7560 #if 0
1576 maya 3227 if (DlgHostFont != NULL) {
1577     DeleteObject(DlgHostFont);
1578     }
1579 zmatsuo 7560 #endif
1580 maya 3227 return TRUE;
1581    
1582     case IDCANCEL:
1583     SetWindowLong(hwndHostnameEdit, GWL_WNDPROC, (LONG)OrigHostnameEditProc);
1584     EndDialog(dlg, 0);
1585 zmatsuo 7560 #if 0
1586 maya 3227 if (DlgHostFont != NULL) {
1587     DeleteObject(DlgHostFont);
1588     }
1589 zmatsuo 7560 #endif
1590 maya 3227 return TRUE;
1591    
1592     case IDC_HOSTTCPIP:
1593     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1594     TRUE);
1595     enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1596     IDC_HOSTTCPPROTOCOL, TRUE);
1597     enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, FALSE);
1598    
1599     enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, TRUE); // disabled (2004.11.23 yutaka)
1600     if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1601     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, TRUE);
1602     } else {
1603     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1604     }
1605    
1606     enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, TRUE); // disabled
1607    
1608     return TRUE;
1609    
1610     case IDC_HOSTSERIAL:
1611     enable_dlg_items(dlg, IDC_HOSTCOMLABEL, IDC_HOSTCOM, TRUE);
1612     enable_dlg_items(dlg, IDC_HOSTNAMELABEL, IDC_HOSTTCPPORT,
1613     FALSE);
1614     enable_dlg_items(dlg, IDC_HOSTTCPPROTOCOLLABEL,
1615     IDC_HOSTTCPPROTOCOL, FALSE);
1616     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1617     enable_dlg_items(dlg, IDC_SSH_VERSION_LABEL, IDC_SSH_VERSION_LABEL, FALSE); // disabled (2004.11.23 yutaka)
1618    
1619     enable_dlg_items(dlg, IDC_HISTORY, IDC_HISTORY, FALSE); // disabled
1620    
1621     return TRUE;
1622    
1623     case IDC_HOSTSSH:
1624     enable_dlg_items(dlg, IDC_SSH_VERSION,
1625     IDC_SSH_VERSION, TRUE);
1626     goto hostssh_enabled;
1627    
1628     case IDC_HOSTTELNET:
1629     case IDC_HOSTOTHER:
1630     enable_dlg_items(dlg, IDC_SSH_VERSION, IDC_SSH_VERSION, FALSE); // disabled
1631     hostssh_enabled:
1632    
1633     GetHNRec = (PGetHNRec) GetWindowLong(dlg, DWL_USER);
1634    
1635     if (IsDlgButtonChecked(dlg, IDC_HOSTTELNET)) {
1636     if (GetHNRec != NULL)
1637     SetDlgItemInt(dlg, IDC_HOSTTCPPORT, GetHNRec->TelPort,
1638     FALSE);
1639     } else if (IsDlgButtonChecked(dlg, IDC_HOSTSSH)) {
1640     SetDlgItemInt(dlg, IDC_HOSTTCPPORT, 22, FALSE);
1641     }
1642     return TRUE;
1643    
1644     case IDC_HOSTCOM:
1645     if(HIWORD(wParam) == CBN_DROPDOWN) {
1646     HWND hostcom = GetDlgItem(dlg, IDC_HOSTCOM);
1647     int count = SendMessage(hostcom, CB_GETCOUNT, 0, 0);
1648     int i, len, max_len = 0;
1649     char *lbl;
1650     HDC TmpDC = GetDC(hostcom);
1651     SIZE s;
1652     for (i=0; i<count; i++) {
1653     len = SendMessage(hostcom, CB_GETLBTEXTLEN, i, 0);
1654     lbl = (char *)calloc(len+1, sizeof(char));
1655     SendMessage(hostcom, CB_GETLBTEXT, i, (LPARAM)lbl);
1656     GetTextExtentPoint32(TmpDC, lbl, len, &s);
1657     if (s.cx > max_len)
1658     max_len = s.cx;
1659     free(lbl);
1660     }
1661     SendMessage(hostcom, CB_SETDROPPEDWIDTH,
1662     max_len + GetSystemMetrics(SM_CXVSCROLL), 0);
1663     }
1664     break;
1665    
1666     case IDC_HOSTHELP:
1667     PostMessage(GetParent(dlg), WM_USER_DLGHELP2, 0, 0);
1668     }
1669     }
1670     return FALSE;
1671     }
1672    
1673 zmatsuo 7560 static void UTIL_SetDialogFont()
1674     {
1675 zmatsuo 7589 SetDialogFont(pvar->ts->SetupFName, pvar->ts->UILanguageFile, "TTSSH", "DLG_TAHOMA_FONT");
1676 zmatsuo 7560 }
1677    
1678 doda 6801 static BOOL PASCAL TTXGetHostName(HWND parent, PGetHNRec rec)
1679 maya 3227 {
1680 zmatsuo 7589 SetDialogFont(pvar->ts->SetupFName,
1681     pvar->ts->UILanguageFile, "TTSSH", "DLG_SYSTEM_FONT");
1682 maya 3227 return (BOOL) DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_HOSTDLG),
1683 zmatsuo 7560 parent, TTXHostDlg, (LPARAM)rec);
1684 maya 3227 }
1685    
1686 doda 6801 static void PASCAL TTXGetUIHooks(TTXUIHooks *hooks)
1687 maya 3227 {
1688     *hooks->GetHostName = TTXGetHostName;
1689     }
1690    
1691 doda 6801 static void PASCAL TTXReadINIFile(PCHAR fileName, PTTSet ts)
1692 maya 3227 {
1693     (pvar->ReadIniFile) (fileName, ts);
1694     read_ssh_options(pvar, fileName);
1695     pvar->settings = *pvar->ts_SSH;
1696 doda 6809 logputs(LOG_LEVEL_VERBOSE, "Reading INI file");
1697 maya 3227 FWDUI_load_settings(pvar);
1698     }
1699    
1700 doda 6801 static void PASCAL TTXWriteINIFile(PCHAR fileName, PTTSet ts)
1701 maya 3227 {
1702     (pvar->WriteIniFile) (fileName, ts);
1703     *pvar->ts_SSH = pvar->settings;
1704     clear_local_settings(pvar);
1705 doda 6809 logputs(LOG_LEVEL_VERBOSE, "Writing INI file");
1706 maya 3227 write_ssh_options(pvar, fileName, pvar->ts_SSH, TRUE);
1707     }
1708    
1709     static void read_ssh_options_from_user_file(PTInstVar pvar,
1710 doda 6801 char *user_file_name)
1711 maya 3227 {
1712     if (user_file_name[0] == '.') {
1713     read_ssh_options(pvar, user_file_name);
1714     } else {
1715     char buf[1024];
1716    
1717     get_teraterm_dir_relative_name(buf, sizeof(buf), user_file_name);
1718     read_ssh_options(pvar, buf);
1719     }
1720    
1721     pvar->settings = *pvar->ts_SSH;
1722     FWDUI_load_settings(pvar);
1723     }
1724    
1725     // Percent-encode������������src���f�R�[�h����dst���R�s�[�����B
1726     // dstlen��dst���T�C�Y�B�����������������������A�����������������������B
1727     static void percent_decode(char *dst, int dstlen, char *src) {
1728     if (src == NULL || dst == NULL || dstlen < 1) {
1729     return;
1730     }
1731    
1732     while (*src != 0 && dstlen > 1) {
1733     if (*src == '%' && isxdigit(*(src+1)) && isxdigit(*(src+2))) {
1734     src++; *dst = (isalpha(*src) ? (*src|0x20) - 'a' + 10 : *src - '0') << 4;
1735     src++; *dst |= (isalpha(*src) ? (*src|0x20) - 'a' + 10 : *src - '0');
1736     src++; dst++;
1737     }
1738     else {
1739     *dst++ = *src++;
1740     }
1741     dstlen--;
1742     }
1743     *dst = 0;
1744     return;
1745     }
1746    
1747 doda 5799 void add_forward_param(PTInstVar pvar, char *param)
1748     {
1749     if (pvar->settings.DefaultForwarding[0] == 0) {
1750     strncpy_s(pvar->settings.DefaultForwarding,
1751     sizeof(pvar->settings.DefaultForwarding),
1752     param, _TRUNCATE);
1753     } else {
1754     strncat_s(pvar->settings.DefaultForwarding,
1755     sizeof(pvar->settings.DefaultForwarding),
1756     ";", _TRUNCATE);
1757     strncat_s(pvar->settings.DefaultForwarding,
1758     sizeof(pvar->settings.DefaultForwarding),
1759     param, _TRUNCATE);
1760     }
1761     }
1762    
1763 doda 6801 static void PASCAL TTXParseParam(PCHAR param, PTTSet ts, PCHAR DDETopic) {
1764 maya 5869 int param_len=strlen(param);
1765     int opt_len = param_len+1;
1766     char *option = (char *)calloc(opt_len, sizeof(char));
1767 maya 5882 char *option2 = (char *)calloc(opt_len, sizeof(char));
1768 maya 5869 int action;
1769 maya 5874 PCHAR start, cur, next;
1770 maya 5908 size_t i;
1771 maya 5869
1772     if (pvar->hostdlg_activated) {
1773     pvar->settings.Enabled = pvar->hostdlg_Enabled;
1774     }
1775    
1776 maya 5874 /* the first term shuld be executable filename of Tera Term */
1777     start = GetParam(option, opt_len, param);
1778    
1779     cur = start;
1780 maya 5869 while (next = GetParam(option, opt_len, cur)) {
1781 doda 6140 DequoteParam(option, opt_len, option);
1782 maya 5869 action = OPTION_NONE;
1783    
1784     if ((option[0] == '-' || option[0] == '/')) {
1785     if (MATCH_STR(option + 1, "ssh") == 0) {
1786     if (MATCH_STR(option + 4, "-f=") == 0) {
1787 doda 6140 strncpy_s(option2, opt_len, option + 7, _TRUNCATE);
1788 maya 5882 read_ssh_options_from_user_file(pvar, option2);
1789 maya 5869 action = OPTION_CLEAR;
1790     } else if (MATCH_STR(option + 4, "-consume=") == 0) {
1791 doda 6140 strncpy_s(option2, opt_len, option + 13, _TRUNCATE);
1792 maya 5882 read_ssh_options_from_user_file(pvar, option2);
1793     DeleteFile(option2);
1794 maya 5869 action = OPTION_CLEAR;
1795     }
1796    
1797     // ttermpro.exe �� /F= �w������ TTSSH ������������ (2006.10.11 maya)
1798     } else if (MATCH_STR_I(option + 1, "f=") == 0) {
1799 doda 6140 strncpy_s(option2, opt_len, option + 3, _TRUNCATE);
1800 maya 5882 read_ssh_options_from_user_file(pvar, option2);
1801 maya 5869 // Tera Term���������������K�v������������������
1802     }
1803     }
1804    
1805     switch (action) {
1806     case OPTION_CLEAR:
1807     memset(cur, ' ', next-cur);
1808     break;
1809     case OPTION_REPLACE:
1810     memset(cur, ' ', next-cur);
1811     memcpy(cur+1, option, strlen(option));
1812     break;
1813     }
1814    
1815     cur = next;
1816     }
1817    
1818 maya 5874 cur = start;
1819 maya 5869 while (next = GetParam(option, opt_len, cur)) {
1820 doda 6140 DequoteParam(option, opt_len, option);
1821 maya 5869 action = OPTION_NONE;
1822    
1823     if ((option[0] == '-' || option[0] == '/')) {
1824     action = OPTION_CLEAR;
1825     if (MATCH_STR(option + 1, "ssh") == 0) {
1826     if (option[4] == 0) {
1827     pvar->settings.Enabled = 1;
1828     } else if (MATCH_STR(option + 4, "-L") == 0 ||
1829 doda 6846 MATCH_STR(option + 4, "-R") == 0 ||
1830     MATCH_STR(option + 4, "-D") == 0) {
1831 doda 5959 char *p = option + 5;
1832     option2[0] = *p;
1833     i = 1;
1834     while (*++p) {
1835     if (*p == ';' || *p == ',') {
1836     option2[i] = 0;
1837     add_forward_param(pvar, option2);
1838     i = 1;
1839 maya 5908 }
1840 doda 5959 else {
1841     option2[i++] = *p;
1842     }
1843 maya 5908 }
1844 doda 5959 if (i > 1) {
1845     option2[i] = 0;
1846     add_forward_param(pvar, option2);
1847     }
1848 maya 5869 } else if (MATCH_STR(option + 4, "-X") == 0) {
1849     add_forward_param(pvar, "X");
1850 doda 5959 if (option+6 != 0) {
1851     strncpy_s(pvar->settings.X11Display,
1852     sizeof(pvar->settings.X11Display),
1853     option + 6, _TRUNCATE);
1854     }
1855 doda 6473 } else if (strcmp(option + 4, "-v") == 0) {
1856 maya 5869 pvar->settings.LogLevel = LOG_LEVEL_VERBOSE;
1857     } else if (_stricmp(option + 4, "-autologin") == 0 ||
1858     _stricmp(option + 4, "-autologon") == 0) {
1859     pvar->settings.TryDefaultAuth = TRUE;
1860     } else if (MATCH_STR_I(option + 4, "-agentconfirm=") == 0) {
1861     if ((_stricmp(option+18, "off") == 0) ||
1862     (_stricmp(option+18, "no") == 0) ||
1863     (_stricmp(option+18, "false") == 0) ||
1864     (_stricmp(option+18, "0") == 0) ||
1865     (_stricmp(option+18, "n") == 0)) {
1866     pvar->settings.ForwardAgentConfirm = 0;
1867     }
1868     else {
1869     pvar->settings.ForwardAgentConfirm = 1;
1870     }
1871 doda 6473 } else if (strcmp(option + 4, "-a") == 0) {
1872 maya 5869 pvar->settings.ForwardAgent = FALSE;
1873 doda 6473 } else if (strcmp(option + 4, "-A") == 0) {
1874 maya 5869 pvar->settings.ForwardAgent = TRUE;
1875    
1876     } else if (MATCH_STR(option + 4, "-C=") == 0) {
1877     pvar->settings.CompressionLevel = atoi(option+7);
1878     if (pvar->settings.CompressionLevel < 0) {
1879     pvar->settings.CompressionLevel = 0;
1880     }
1881     else if (pvar->settings.CompressionLevel > 9) {
1882     pvar->settings.CompressionLevel = 9;
1883     }
1884 doda 6473 } else if (strcmp(option + 4, "-C") == 0) {
1885 maya 5869 pvar->settings.CompressionLevel = 6;
1886 doda 6473 } else if (strcmp(option + 4, "-c") == 0) {
1887 maya 5869 pvar->settings.CompressionLevel = 0;
1888     } else if (MATCH_STR_I(option + 4, "-icon=") == 0) {
1889     if ((_stricmp(option+10, "old") == 0) ||
1890     (_stricmp(option+10, "yellow") == 0) ||
1891     (_stricmp(option+10, "securett_yellow") == 0)) {
1892     pvar->settings.IconID = IDI_SECURETT_YELLOW;
1893     }
1894 maya 6386 else if ((_stricmp(option+10, "green") == 0) ||
1895     (_stricmp(option+10, "securett_green") == 0)) {
1896     pvar->settings.IconID = IDI_SECURETT_GREEN;
1897     }
1898 maya 5869 else {
1899     pvar->settings.IconID = IDI_SECURETT;
1900     }
1901 doda 6717 } else if (MATCH_STR(option + 4, "-subsystem=") == 0) {
1902     pvar->use_subsystem = TRUE;
1903     strncpy_s(pvar->subsystem_name,
1904     sizeof(pvar->subsystem_name),
1905     option + 15, _TRUNCATE);
1906 doda 7364 } else if (strcmp(option + 4, "-N") == 0) {
1907 doda 7363 pvar->nosession = TRUE;
1908 maya 5869
1909     // /ssh1 �� /ssh2 �I�v�V�������V�K���� (2006.9.16 maya)
1910 doda 6473 } else if (strcmp(option + 4, "1") == 0) {
1911 maya 5869 pvar->settings.Enabled = 1;
1912     pvar->settings.ssh_protocol_version = 1;
1913 doda 6473 } else if (strcmp(option + 4, "2") == 0) {
1914 maya 5869 pvar->settings.Enabled = 1;
1915     pvar->settings.ssh_protocol_version = 2;
1916    
1917     } else {
1918     char buf[1024];
1919    
1920     UTIL_get_lang_msg("MSG_UNKNOWN_OPTION_ERROR", pvar,
1921     "Unrecognized command-line option: %s");
1922     _snprintf_s(buf, sizeof(buf), _TRUNCATE, pvar->ts->UIMsg, option);
1923    
1924     MessageBox(NULL, buf, "TTSSH", MB_OK | MB_ICONEXCLAMATION);
1925     }
1926    
1927     // ttermpro.exe �� /T= �w�������p�������A������������ (2006.10.19 maya)
1928     } else if (MATCH_STR_I(option + 1, "t=") == 0) {
1929     if (strcmp(option + 3, "2") == 0) {
1930     pvar->settings.Enabled = 1;
1931     // /t=2��ttssh�������g������������
1932     } else {
1933     pvar->settings.Enabled = 0;
1934     action = OPTION_NONE; // Tera Term������������������������
1935     }
1936    
1937     // /1 ������ /2 �I�v�V�������V�K���� (2004.10.3 yutaka)
1938 doda 6473 } else if (strcmp(option + 1, "1") == 0) {
1939 maya 5869 // command line: /ssh /1 is SSH1 only
1940     pvar->settings.ssh_protocol_version = 1;
1941    
1942 doda 6473 } else if (strcmp(option + 1, "2") == 0) {
1943 maya 5869 // command line: /ssh /2 is SSH2 & SSH1
1944     pvar->settings.ssh_protocol_version = 2;
1945    
1946 doda 6473 } else if (strcmp(option + 1, "nossh") == 0) {
1947 maya 5869 // '/nossh' �I�v�V�����������B
1948     // TERATERM.INI ��SSH���L�������������������A������Cygterm���N��������������
1949     // �����������������B(2004.10.11 yutaka)
1950     pvar->settings.Enabled = 0;
1951    
1952 doda 6473 } else if (strcmp(option + 1, "telnet") == 0) {
1953 maya 5869 // '/telnet' ���w�������������������� '/nossh' ��������
1954     // SSH������������ (2006.9.16 maya)
1955     pvar->settings.Enabled = 0;
1956     // Tera Term �� Telnet �t���O���t����
1957     pvar->ts->Telnet = 1;
1958    
1959 doda 6473 } else if (MATCH_STR(option + 1, "auth=") == 0) {
1960 maya 5869 // SSH2�������O�C���I�v�V����������
1961     //
1962     // SYNOPSIS: /ssh /auth=passowrd /user=���[�U�� /passwd=�p�X���[�h
1963     // /ssh /auth=publickey /user=���[�U�� /passwd=�p�X���[�h /keyfile=�p�X
1964 doda 6472 // EXAMPLE: /ssh /auth=password /user=nike /passwd="a b""c" ; �p�X���[�h: �ua b"c�v
1965 maya 5869 // /ssh /auth=publickey /user=foo /passwd=bar /keyfile=d:\tmp\id_rsa
1966 doda 6472 // NOTICE: �p�X���[�h���p�X���������Z�~�R���������������������_�u���N�H�[�g " ������
1967     // �p�X���[�h���_�u���N�H�[�g�����������������A�������_�u���N�H�[�g "" ���u��������
1968 maya 5869 //
1969     pvar->ssh2_autologin = 1; // for SSH2 (2004.11.30 yutaka)
1970    
1971 doda 6473 if (_stricmp(option + 6, "password") == 0) { // �p�X���[�h
1972 maya 5869 //pvar->auth_state.cur_cred.method = SSH_AUTH_PASSWORD;
1973     pvar->ssh2_authmethod = SSH_AUTH_PASSWORD;
1974    
1975 doda 7101 } else if (_stricmp(option + 6, "keyboard-interactive") == 0) { // keyboard-interactive�F��
1976     //pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
1977     pvar->ssh2_authmethod = SSH_AUTH_TIS;
1978    
1979 doda 6473 } else if (_stricmp(option + 6, "challenge") == 0) { // keyboard-interactive�F��
1980 maya 5869 //pvar->auth_state.cur_cred.method = SSH_AUTH_TIS;
1981     pvar->ssh2_authmethod = SSH_AUTH_TIS;
1982    
1983 doda 6473 } else if (_stricmp(option + 6, "publickey") == 0) { // ���J���F��
1984 maya 5869 //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
1985     pvar->ssh2_authmethod = SSH_AUTH_RSA;
1986    
1987 doda 6473 } else if (_stricmp(option + 6, "pageant") == 0) { // ���J���F�� by Pageant
1988 maya 5869 //pvar->auth_state.cur_cred.method = SSH_AUTH_RSA;
1989     pvar->ssh2_authmethod = SSH_AUTH_PAGEANT;
1990    
1991     } else {
1992     // TODO:
1993     }
1994    
1995     } else if (MATCH_STR(option + 1, "user=") == 0) {
1996 doda 6140 _snprintf_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), _TRUNCATE, "%s", option+6);
1997 maya 5869
1998     } else if (MATCH_STR(option + 1, "passwd=") == 0) {
1999 doda 6140 _snprintf_s(pvar->ssh2_password, sizeof(pvar->ssh2_password), _TRUNCATE, "%s", option+8);
2000 maya 5869
2001     } else if (MATCH_STR(option + 1, "keyfile=") == 0) {
2002 doda 6140 _snprintf_s(pvar->ssh2_keyfile, sizeof(pvar->ssh2_keyfile), _TRUNCATE, "%s", option+9);
2003 maya 5869
2004 doda 6473 } else if (strcmp(option + 1, "ask4passwd") == 0) {
2005 maya 5869 // �p�X���[�h������ (2006.9.18 maya)
2006     pvar->ask4passwd = 1;
2007    
2008 doda 6473 } else if (strcmp(option + 1, "nosecuritywarning") == 0) {
2009 maya 5869 // known_hosts�`�F�b�N���������B���Y�I�v�V�������g�����A�Z�L�����e�B������������
2010     // �����A�B���I�v�V���������������B
2011     // (2009.10.4 yutaka)
2012     pvar->nocheck_known_hosts = TRUE;
2013    
2014     }
2015     else { // Other (not ttssh) option
2016     action = OPTION_NONE; // ttssh���I�v�V������������������������
2017     }
2018    
2019     // �p�X���[�h�������������������O�C��������������
2020     // /auth ���F�����\�b�h���w�������������p������ (2006.9.18 maya)
2021     if (pvar->ask4passwd == 1) {
2022     pvar->ssh2_autologin = 0;
2023     }
2024    
2025     }
2026     else if ((MATCH_STR_I(option, "ssh://") == 0) ||
2027     (MATCH_STR_I(option, "ssh1://") == 0) ||
2028     (MATCH_STR_I(option, "ssh2://") == 0) ||
2029     (MATCH_STR_I(option, "slogin://") == 0) ||
2030     (MATCH_STR_I(option, "slogin1://") == 0) ||
2031     (MATCH_STR_I(option, "slogin2://") == 0)) {
2032     //
2033     // ssh://user@host/ ����URL�`�����T�|�[�g
2034     // ���{�I�������� telnet:// URL��������
2035     //
2036     // �Q�l:
2037     // RFC3986: Uniform Resource Identifier (URI): Generic Syntax
2038     // RFC4248: The telnet URI Scheme
2039     //
2040     char *p, *p2, *p3;
2041     int optlen, hostlen;
2042    
2043     optlen = strlen(option);
2044    
2045     // ������':'���O�����������������������A������ssh�v���g�R���o�[�W������������
2046     p = _mbschr(option, ':');
2047     switch (*(p-1)) {
2048     case '1':
2049     pvar->settings.ssh_protocol_version = 1;
2050     break;
2051     case '2':
2052     pvar->settings.ssh_protocol_version = 2;
2053     break;
2054     }
2055    
2056     // authority part �����|�C���^������
2057     p += 3;
2058    
2059     // path part ������������
2060     if ((p2 = _mbschr(p, '/')) != NULL) {
2061     *p2 = 0;
2062     }
2063    
2064     // '@'�������������A���������O�����[�U����
2065     if ((p2 = _mbschr(p, '@')) != NULL) {
2066     *p2 = 0;
2067     // ':'���~���p�X���[�h
2068     if ((p3 = _mbschr(p, ':')) != NULL) {
2069     *p3 = 0;
2070     percent_decode(pvar->ssh2_password, sizeof(pvar->ssh2_password), p3 + 1);
2071     }
2072     percent_decode(pvar->ssh2_username, sizeof(pvar->ssh2_username), p);
2073     // p �� host part ������('@'����������)����������������
2074     p = p2 + 1;
2075     }
2076    
2077     // host part �� option �����������������Ascheme part ������
2078     // port�w����������������port���������������������m��������������
2079     hostlen = strlen(p);
2080     memmove_s(option, optlen, p, hostlen);
2081     option[hostlen] = 0;
2082    
2083     // �|�[�g�w������������":22"������
2084     if (option[0] == '[' && option[hostlen-1] == ']' || // IPv6 raw address without port
2085     option[0] != '[' && _mbschr(option, ':') == NULL) { // hostname or IPv4 raw address without port
2086     memcpy_s(option+hostlen, optlen-hostlen, ":22", 3);
2087     hostlen += 3;
2088     }
2089    
2090     // �|�[�g�w�����������������X�y�[�X������
2091     memset(option+hostlen, ' ', optlen-hostlen);
2092    
2093     pvar->settings.Enabled = 1;
2094    
2095     action = OPTION_REPLACE;
2096     }
2097     else if (_mbschr(option, '@') != NULL) {
2098     //
2099     // user@host �`�����T�|�[�g
2100     // ����������ssh�������T�|�[�g�����A���[�U����ttssh���������B
2101     // (ssh�������O -- ttssh�������W������������)
2102     // �����I��telnet authentication option���T�|�[�g��������
2103     // Tera Term�{�����������������������\���B
2104     //
2105     char *p;
2106     p = _mbschr(option, '@');
2107     *p = 0;
2108    
2109     strncpy_s(pvar->ssh2_username, sizeof(pvar->ssh2_username), option, _TRUNCATE);
2110    
2111     // ���[�U���������X�y�[�X�������B
2112     // ������TTX��Tera Term�{�������������������X�y�[�X�����������������A
2113     // �z�X�g�����������l�����K�v�������B
2114     memset(option, ' ', p-option+1);
2115    
2116     action = OPTION_REPLACE;
2117     }
2118    
2119    
2120     switch (action) {
2121     case OPTION_CLEAR:
2122     memset(cur, ' ', next-cur);
2123     break;
2124     case OPTION_REPLACE:
2125     memset(cur, ' ', next-cur);
2126     memcpy(cur+1, option, strlen(option));
2127     break;
2128     }
2129    
2130     cur = next;
2131     }
2132    
2133     free(option);
2134    
2135     FWDUI_load_settings(pvar);
2136    
2137     (pvar->ParseParam) (param, ts, DDETopic);
2138     }
2139 maya 3227
2140 doda 6801 static void PASCAL TTXGetSetupHooks(TTXSetupHooks *hooks)
2141 maya 3227 {
2142     pvar->ReadIniFile = *hooks->ReadIniFile;
2143     pvar->WriteIniFile = *hooks->WriteIniFile;
2144     pvar->ParseParam = *hooks->ParseParam;
2145    
2146     *hooks->ReadIniFile = TTXReadINIFile;
2147     *hooks->WriteIniFile = TTXWriteINIFile;
2148     *hooks->ParseParam = TTXParseParam;
2149     }
2150    
2151 doda 6801 static void PASCAL TTXSetWinSize(int rows, int cols)
2152 maya 3227 {
2153     SSH_notify_win_size(pvar, cols, rows);
2154     }
2155    
2156     static void insertMenuBeforeItem(HMENU menu, WORD beforeItemID, WORD flags,
2157 doda 6801 WORD newItemID, char *text)
2158 maya 3227 {
2159     int i, j;
2160    
2161     for (i = GetMenuItemCount(menu) - 1; i >= 0; i--) {
2162     HMENU submenu = GetSubMenu(menu, i);
2163    
2164     for (j = GetMenuItemCount(submenu) - 1; j >= 0; j--) {
2165     if (GetMenuItemID(submenu, j) == beforeItemID) {
2166     InsertMenu(submenu, j, MF_BYPOSITION | flags, newItemID, text);
2167     return;
2168     }
2169     }
2170     }
2171     }
2172    
2173 doda 4463 #define GetFileMenu(menu) GetSubMenuByChildID(menu, 50110) // ID_FILE_NEWCONNECTION
2174     #define GetEditMenu(menu) GetSubMenuByChildID(menu, 50210) // ID_EDIT_COPY2
2175     #define GetSetupMenu(menu) GetSubMenuByChildID(menu, 50310) // ID_SETUP_TERMINAL
2176     #define GetControlMenu(menu) GetSubMenuByChildID(menu, 50410) // ID_CONTROL_RESETTERMINAL
2177     #define GetHelpMenu(menu) GetSubMenuByChildID(menu, 50990) // ID_HELP_ABOUT
2178    
2179     HMENU GetSubMenuByChildID(HMENU menu, UINT id) {
2180     int i, j, items, subitems, cur_id;
2181     HMENU m;
2182    
2183     items = GetMenuItemCount(menu);
2184    
2185     for (i=0; i<items; i++) {
2186     if (m = GetSubMenu(menu, i)) {
2187     subitems = GetMenuItemCount(m);
2188     for (j=0; j<subitems; j++) {
2189     cur_id = GetMenuItemID(m, j);
2190     if (cur_id == id) {
2191     return m;
2192     }
2193     }
2194     }
2195     }
2196     return NULL;
2197     }
2198    
2199 doda 6801 static void PASCAL TTXModifyMenu(HMENU menu)
2200 maya 3227 {
2201 doda 4463 pvar->FileMenu = GetFileMenu(menu);
2202    
2203 maya 3227 /* inserts before ID_HELP_ABOUT */
2204     UTIL_get_lang_msg("MENU_ABOUT", pvar, "About &TTSSH...");
2205     insertMenuBeforeItem(menu, 50990, MF_ENABLED, ID_ABOUTMENU, pvar->ts->UIMsg);
2206    
2207     /* inserts before ID_SETUP_TCPIP */
2208     UTIL_get_lang_msg("MENU_SSH", pvar, "SS&H...");
2209     insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHSETUPMENU, pvar->ts->UIMsg);
2210     /* inserts before ID_SETUP_TCPIP */
2211     UTIL_get_lang_msg("MENU_SSH_AUTH", pvar, "SSH &Authentication...");
2212     insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHAUTHSETUPMENU, pvar->ts->UIMsg);
2213     /* inserts before ID_SETUP_TCPIP */
2214     UTIL_get_lang_msg("MENU_SSH_FORWARD", pvar, "SSH F&orwarding...");
2215     insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHFWDSETUPMENU, pvar->ts->UIMsg);
2216     UTIL_get_lang_msg("MENU_SSH_KEYGEN", pvar, "SSH KeyGe&nerator...");
2217     insertMenuBeforeItem(menu, 50360, MF_ENABLED, ID_SSHKEYGENMENU, pvar->ts->UIMsg);
2218    
2219     /* inserts before ID_FILE_CHANGEDIR */
2220     UTIL_get_lang_msg("MENU_SSH_SCP", pvar, "SS&H SCP...");
2221 doda 4463 insertMenuBeforeItem(menu, 50170, MF_GRAYED, ID_SSHSCPMENU, pvar->ts->UIMsg);
2222 maya 3227 }
2223    
2224 doda 6801 static void PASCAL TTXModifyPopupMenu(HMENU menu) {
2225 doda 4463 if (menu == pvar->FileMenu) {
2226 maya 6997 if (pvar->cv->Ready && pvar->socket != INVALID_SOCKET)
2227 doda 4463 EnableMenuItem(menu, ID_SSHSCPMENU, MF_BYCOMMAND | MF_ENABLED);
2228     else
2229     EnableMenuItem(menu, ID_SSHSCPMENU, MF_BYCOMMAND | MF_GRAYED);
2230     }
2231     }
2232    
2233 maya 6132 static void about_dlg_set_abouttext(PTInstVar pvar, HWND dlg, digest_algorithm dgst_alg)
2234 maya 3227 {
2235 maya 6135 char buf[1024], buf2[2048];
2236 yutakapon 5575 char *fp = NULL;
2237 maya 3227
2238     // TTSSH�_�C�A���O���\������SSH������������ (2004.10.30 yutaka)
2239     if (pvar->socket != INVALID_SOCKET) {
2240 maya 6135 buf2[0] = '\0';
2241 maya 6132
2242 maya 3227 if (SSHv1(pvar)) {
2243 maya 6135 UTIL_get_lang_msg("DLG_ABOUT_SERVERID", pvar, "Server ID:");
2244     strncat_s(buf2, sizeof(buf2), pvar->ts->UIMsg, _TRUNCATE);
2245     strncat_s(buf2, sizeof(buf2), " ", _TRUNCATE);
2246 maya 3227 SSH_get_server_ID_info(pvar, buf, sizeof(buf));
2247 maya 6135 strncat_s(buf2, sizeof(buf2), buf, _TRUNCATE);
2248     strncat_s(buf2, sizeof(buf2), "\r\n", _TRUNCATE);
2249    
2250 maya 3227 UTIL_get_lang_msg(&