Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4433 - (show annotations) (download) (as text)
Mon Apr 11 00:29:12 2011 UTC (13 years ago) by doda
Original Path: trunk/ttssh2/ttxssh/ttxssh.c
File MIME type: text/x-csrc
File size: 148770 byte(s)
Camellia γ‚΅γƒγƒΌγƒˆ

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