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 3006 - (hide annotations) (download) (as text)
Thu Aug 30 13:18:20 2007 UTC (16 years, 7 months ago) by maya
Original Path: ttssh2/trunk/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 107237 byte(s)
MaxComPort を越えるシリアルポートを表示しないようにした。

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