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 3210 - (hide annotations) (download) (as text)
Tue Feb 17 13:53:42 2009 UTC (15 years, 1 month ago) by maya
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 128625 byte(s)
* Windows 95
- Winsock2 が必須
- ttermpro の起動に IE4 以上が必須
- ヘルプの表示に IE5 以上が必須
- LogMeTTc は動かない
- TTLEdit はボタンの色がうまく出ない

* NT 4.0
- ヘルプの表示に IE5 以上が必須
- LogMeTT, TTLEdit の起動に SP4(?)以上 が必須
- LogMeTTc の起動に SP6 以上が必須

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