1 // SoftEther VPN Source Code - Stable Edition Repository
2 // Cedar Communication Module
3 //
4 // SoftEther VPN Server, Client and Bridge are free software under the Apache License, Version 2.0.
5 //
6 // Copyright (c) Daiyuu Nobori.
7 // Copyright (c) SoftEther VPN Project, University of Tsukuba, Japan.
8 // Copyright (c) SoftEther Corporation.
9 // Copyright (c) all contributors on SoftEther VPN project in GitHub.
10 //
11 // All Rights Reserved.
12 //
13 // http://www.softether.org/
14 //
15 // This stable branch is officially managed by Daiyuu Nobori, the owner of SoftEther VPN Project.
16 // Pull requests should be sent to the Developer Edition Master Repository on https://github.com/SoftEtherVPN/SoftEtherVPN
17 //
18 // License: The Apache License, Version 2.0
19 // https://www.apache.org/licenses/LICENSE-2.0
20 //
21 // DISCLAIMER
22 // ==========
23 //
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 // SOFTWARE.
31 //
32 // THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN, UNDER
33 // JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY, MERGE, PUBLISH,
34 // DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS SOFTWARE, THAT ANY
35 // JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS SOFTWARE OR ITS CONTENTS,
36 // AGAINST US (SOFTETHER PROJECT, SOFTETHER CORPORATION, DAIYUU NOBORI OR OTHER
37 // SUPPLIERS), OR ANY JURIDICAL DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND
38 // OF USING, COPYING, MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING,
39 // AND/OR SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
40 // CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO EXCLUSIVE
41 // JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO, JAPAN. YOU MUST WAIVE
42 // ALL DEFENSES OF LACK OF PERSONAL JURISDICTION AND FORUM NON CONVENIENS.
43 // PROCESS MAY BE SERVED ON EITHER PARTY IN THE MANNER AUTHORIZED BY APPLICABLE
44 // LAW OR COURT RULE.
45 //
46 // USE ONLY IN JAPAN. DO NOT USE THIS SOFTWARE IN ANOTHER COUNTRY UNLESS YOU HAVE
47 // A CONFIRMATION THAT THIS SOFTWARE DOES NOT VIOLATE ANY CRIMINAL LAWS OR CIVIL
48 // RIGHTS IN THAT PARTICULAR COUNTRY. USING THIS SOFTWARE IN OTHER COUNTRIES IS
49 // COMPLETELY AT YOUR OWN RISK. THE SOFTETHER VPN PROJECT HAS DEVELOPED AND
50 // DISTRIBUTED THIS SOFTWARE TO COMPLY ONLY WITH THE JAPANESE LAWS AND EXISTING
51 // CIVIL RIGHTS INCLUDING PATENTS WHICH ARE SUBJECTS APPLY IN JAPAN. OTHER
52 // COUNTRIES' LAWS OR CIVIL RIGHTS ARE NONE OF OUR CONCERNS NOR RESPONSIBILITIES.
53 // WE HAVE NEVER INVESTIGATED ANY CRIMINAL REGULATIONS, CIVIL LAWS OR
54 // INTELLECTUAL PROPERTY RIGHTS INCLUDING PATENTS IN ANY OF OTHER 200+ COUNTRIES
55 // AND TERRITORIES. BY NATURE, THERE ARE 200+ REGIONS IN THE WORLD, WITH
56 // DIFFERENT LAWS. IT IS IMPOSSIBLE TO VERIFY EVERY COUNTRIES' LAWS, REGULATIONS
57 // AND CIVIL RIGHTS TO MAKE THE SOFTWARE COMPLY WITH ALL COUNTRIES' LAWS BY THE
58 // PROJECT. EVEN IF YOU WILL BE SUED BY A PRIVATE ENTITY OR BE DAMAGED BY A
59 // PUBLIC SERVANT IN YOUR COUNTRY, THE DEVELOPERS OF THIS SOFTWARE WILL NEVER BE
60 // LIABLE TO RECOVER OR COMPENSATE SUCH DAMAGES, CRIMINAL OR CIVIL
61 // RESPONSIBILITIES. NOTE THAT THIS LINE IS NOT LICENSE RESTRICTION BUT JUST A
62 // STATEMENT FOR WARNING AND DISCLAIMER.
63 //
64 // READ AND UNDERSTAND THE 'WARNING.TXT' FILE BEFORE USING THIS SOFTWARE.
65 // SOME SOFTWARE PROGRAMS FROM THIRD PARTIES ARE INCLUDED ON THIS SOFTWARE WITH
66 // LICENSE CONDITIONS WHICH ARE DESCRIBED ON THE 'THIRD_PARTY.TXT' FILE.
67 //
68 //
69 // SOURCE CODE CONTRIBUTION
70 // ------------------------
71 //
72 // Your contribution to SoftEther VPN Project is much appreciated.
73 // Please send patches to us through GitHub.
74 // Read the SoftEther VPN Patch Acceptance Policy in advance:
75 // http://www.softether.org/5-download/src/9.patch
76 //
77 //
78 // DEAR SECURITY EXPERTS
79 // ---------------------
80 //
81 // If you find a bug or a security vulnerability please kindly inform us
82 // about the problem immediately so that we can fix the security problem
83 // to protect a lot of users around the world as soon as possible.
84 //
85 // Our e-mail address for security reports is:
86 // softether-vpn-security [at] softether.org
87 //
88 // Please note that the above e-mail address is not a technical support
89 // inquiry address. If you need technical assistance, please visit
90 // http://www.softether.org/ and ask your question on the users forum.
91 //
92 // Thank you for your cooperation.
93 //
94 //
95 // NO MEMORY OR RESOURCE LEAKS
96 // ---------------------------
97 //
98 // The memory-leaks and resource-leaks verification under the stress
99 // test has been passed before release this source code.
100 
101 
102 // Command.c
103 // vpncmd Command Line Management Utility
104 
105 #include "CedarPch.h"
106 
107 // System checker definition
108 typedef bool (CHECKER_PROC_DEF)();
109 typedef struct CHECKER_PROC
110 {
111 	char *Title;
112 	CHECKER_PROC_DEF *Proc;
113 } CHECKER_PROC;
114 
115 static CHECKER_PROC checker_procs[] =
116 {
117 	{"CHECK_PROC_KERNEL", CheckKernel},
118 	{"CHECK_PROC_MEMORY", CheckMemory},
119 	{"CHECK_PROC_STRINGS", CheckStrings},
120 	{"CHECK_PROC_FILESYSTEM", CheckFileSystem},
121 	{"CHECK_PROC_THREAD", CheckThread},
122 	{"CHECK_PROC_NETWORK", CheckNetwork},
123 };
124 
125 typedef struct CHECK_NETWORK_1
126 {
127 	SOCK *ListenSocket;
128 } CHECK_NETWORK_1;
129 
130 typedef struct CHECK_NETWORK_2
131 {
132 	SOCK *s;
133 	X *x;
134 	K *k;
135 } CHECK_NETWORK_2;
136 
137 
138 // Convert the TT_RESULT to RPC
OutRpcTtResult(PACK * p,TT_RESULT * t)139 void OutRpcTtResult(PACK *p, TT_RESULT *t)
140 {
141 	if (p == NULL || t == NULL)
142 	{
143 		return;
144 	}
145 
146 	PackAddBool(p, "Raw", t->Raw);
147 	PackAddBool(p, "Double", t->Double);
148 	PackAddInt64(p, "NumBytesUpload", t->NumBytesUpload);
149 	PackAddInt64(p, "NumBytesDownload", t->NumBytesDownload);
150 	PackAddInt64(p, "NumBytesTotal", t->NumBytesTotal);
151 	PackAddInt64(p, "Span", t->Span);
152 	PackAddInt64(p, "BpsUpload", t->BpsUpload);
153 	PackAddInt64(p, "BpsDownload", t->BpsDownload);
154 	PackAddInt64(p, "BpsTotal", t->BpsTotal);
155 }
156 
157 // Convert an RPC to a TT_RESULT
InRpcTtResult(PACK * p,TT_RESULT * t)158 void InRpcTtResult(PACK *p, TT_RESULT *t)
159 {
160 	if (p == NULL || t == NULL)
161 	{
162 		return;
163 	}
164 
165 	Zero(t, sizeof(TT_RESULT));
166 
167 	t->Raw = PackGetBool(p, "Raw");
168 	t->Double = PackGetBool(p, "Double");
169 	t->NumBytesUpload = PackGetInt64(p, "NumBytesUpload");
170 	t->NumBytesDownload = PackGetInt64(p, "NumBytesDownload");
171 	t->NumBytesTotal = PackGetInt64(p, "NumBytesTotal");
172 	t->Span = PackGetInt64(p, "Span");
173 	t->BpsUpload = PackGetInt64(p, "BpsUpload");
174 	t->BpsDownload = PackGetInt64(p, "BpsDownload");
175 	t->BpsTotal = PackGetInt64(p, "BpsTotal");
176 }
177 
178 // Accept thread
CheckNetworkAcceptThread(THREAD * thread,void * param)179 void CheckNetworkAcceptThread(THREAD *thread, void *param)
180 {
181 	CHECK_NETWORK_2 *c = (CHECK_NETWORK_2 *)param;
182 	SOCK *s = c->s;
183 	UINT i = 0;
184 
185 	if (StartSSL(s, c->x, c->k))
186 	{
187 		while (true)
188 		{
189 			i++;
190 			if (Send(s, &i, sizeof(UINT), true) == 0)
191 			{
192 				break;
193 			}
194 		}
195 	}
196 
197 	Disconnect(s);
198 	ReleaseSock(s);
199 }
200 
201 
202 // Listen thread
CheckNetworkListenThread(THREAD * thread,void * param)203 void CheckNetworkListenThread(THREAD *thread, void *param)
204 {
205 	CHECK_NETWORK_1 *c = (CHECK_NETWORK_1 *)param;
206 	SOCK *s;
207 	UINT i;
208 	K *pub, *pri;
209 	X *x;
210 	LIST *o = NewList(NULL);
211 	NAME *name = NewName(L"Test", L"Test", L"Test", L"JP", L"Ibaraki", L"Tsukuba");
212 
213 	RsaGen(&pri, &pub, 1024);
214 	x = NewRootX(pub, pri, name, 1000, NULL);
215 
216 	FreeName(name);
217 
218 	for (i = 1025;;i++)
219 	{
220 		s = Listen(i);
221 		if (s != NULL)
222 		{
223 			break;
224 		}
225 	}
226 
227 	c->ListenSocket = s;
228 	AddRef(s->ref);
229 
230 	NoticeThreadInit(thread);
231 
232 	while (true)
233 	{
234 		SOCK *new_sock = Accept(s);
235 
236 		if (new_sock == NULL)
237 		{
238 			break;
239 		}
240 		else
241 		{
242 			CHECK_NETWORK_2 c;
243 			THREAD *t;
244 
245 			Zero(&c, sizeof(c));
246 			c.s = new_sock;
247 			c.k = pri;
248 			c.x = x;
249 
250 			t = NewThread(CheckNetworkAcceptThread, &c);
251 			Insert(o, t);
252 		}
253 	}
254 
255 	for (i = 0;i < LIST_NUM(o);i++)
256 	{
257 		THREAD *t = LIST_DATA(o, i);
258 		WaitThread(t, INFINITE);
259 		ReleaseThread(t);
260 	}
261 
262 	FreeK(pri);
263 	FreeK(pub);
264 
265 	FreeX(x);
266 
267 	ReleaseSock(s);
268 	ReleaseList(o);
269 }
270 
271 // Network function check
CheckNetwork()272 bool CheckNetwork()
273 {
274 	CHECK_NETWORK_1 c;
275 	THREAD *t;
276 	SOCK *listen_socket;
277 	UINT port;
278 	UINT i, num;
279 	bool ok = true;
280 	SOCK **socks;
281 	SOCK_EVENT *se = NewSockEvent();
282 
283 	Zero(&c, sizeof(c));
284 	t = NewThread(CheckNetworkListenThread, &c);
285 	WaitThreadInit(t);
286 
287 	listen_socket = c.ListenSocket;
288 
289 	port = listen_socket->LocalPort;
290 
291 	num = 8;
292 	socks = ZeroMalloc(sizeof(SOCK *) * num);
293 	for (i = 0;i < num;i++)
294 	{
295 		socks[i] = Connect("localhost", port);
296 		if (socks[i] == NULL)
297 		{
298 			Print("Connect Failed. (%u)\n", i);
299 			ok = false;
300 			num = i;
301 			break;
302 		}
303 		if (StartSSL(socks[i], NULL, NULL) == false)
304 		{
305 			ReleaseSock(socks[i]);
306 			Print("Connect Failed. (%u)\n", i);
307 			ok = false;
308 			num = i;
309 			break;
310 		}
311 
312 		JoinSockToSockEvent(socks[i], se);
313 	}
314 
315 	if (ok)
316 	{
317 		while (true)
318 		{
319 			UINT i;
320 			bool end = false;
321 			bool all_blocked = true;
322 
323 			for (i = 0;i < num;i++)
324 			{
325 				UINT n;
326 				UINT ret;
327 
328 				n = 0;
329 				ret = Recv(socks[i], &n, sizeof(UINT), true);
330 				if (ret == 0)
331 				{
332 					Print("Recv Failed (Disconnected).\n", ret);
333 					end = true;
334 					ok = false;
335 				}
336 				if (ret != SOCK_LATER)
337 				{
338 					all_blocked = false;
339 				}
340 
341 				if (n >= 128)
342 				{
343 					end = true;
344 				}
345 			}
346 
347 			if (end)
348 			{
349 				break;
350 			}
351 
352 			if (all_blocked)
353 			{
354 				WaitSockEvent(se, INFINITE);
355 			}
356 		}
357 	}
358 
359 	for (i = 0;i < num;i++)
360 	{
361 		Disconnect(socks[i]);
362 		ReleaseSock(socks[i]);
363 	}
364 	Free(socks);
365 
366 	Disconnect(listen_socket);
367 
368 	WaitThread(t, INFINITE);
369 	ReleaseThread(t);
370 
371 	ReleaseSock(listen_socket);
372 
373 	ReleaseSockEvent(se);
374 
375 	return ok;
376 }
377 
378 typedef struct CHECK_THREAD_1
379 {
380 	UINT num;
381 	LOCK *lock;
382 	THREAD *wait_thread;
383 } CHECK_THREAD_1;
384 
385 static UINT check_thread_global_1 = 0;
386 
387 #define	CHECK_THREAD_INCREMENT_COUNT		32
388 
389 // Test thread 1
CheckThread1(THREAD * thread,void * param)390 void CheckThread1(THREAD *thread, void *param)
391 {
392 	CHECK_THREAD_1 *ct1 = (CHECK_THREAD_1 *)param;
393 	UINT i;
394 	UINT num = CHECK_THREAD_INCREMENT_COUNT;
395 
396 	WaitThread(ct1->wait_thread, INFINITE);
397 
398 	for (i = 0;i < num;i++)
399 	{
400 		Lock(ct1->lock);
401 		check_thread_global_1 = ct1->num;
402 		InputToNull((void *)check_thread_global_1);
403 		check_thread_global_1 = check_thread_global_1 + 1 + RetZero();
404 		ct1->num = check_thread_global_1;
405 		Unlock(ct1->lock);
406 	}
407 }
408 
409 // Test thread 2
CheckThread2(THREAD * thread,void * param)410 void CheckThread2(THREAD *thread, void *param)
411 {
412 	EVENT *e = (EVENT *)param;
413 	Wait(e, INFINITE);
414 }
415 
416 typedef struct CHECK_THREAD_3
417 {
418 	UINT num, a;
419 } CHECK_THREAD_3;
420 
421 // Test thread 3
CheckThread3(THREAD * thread,void * param)422 void CheckThread3(THREAD *thread, void *param)
423 {
424 	CHECK_THREAD_3 *c = (CHECK_THREAD_3 *)param;
425 	THREAD *t;
426 
427 	if (c->num == 0)
428 	{
429 		return;
430 	}
431 	c->num--;
432 	c->a++;
433 
434 	t = NewThread(CheckThread3, c);
435 	WaitThread(t, INFINITE);
436 	ReleaseThread(t);
437 }
438 
439 // Thread check
CheckThread()440 bool CheckThread()
441 {
442 	bool ok = true;
443 	CHECK_THREAD_1 ct1;
444 	UINT num = 32;
445 	UINT i;
446 	THREAD **threads;
447 	EVENT *e;
448 	THREAD *t2;
449 	THREAD *t;
450 	CHECK_THREAD_3 c;
451 
452 	e = NewEvent();
453 
454 	Zero(&ct1, sizeof(ct1));
455 	ct1.lock = NewLock();
456 
457 	t2 = NewThread(CheckThread2, e);
458 	ct1.wait_thread = t2;
459 
460 	threads = ZeroMalloc(sizeof(THREAD *) * num);
461 	for (i = 0;i < num;i++)
462 	{
463 		threads[i] = NewThread(CheckThread1, &ct1);
464 		if (threads[i] == NULL)
465 		{
466 			Print("Thread %u Create Failed.\n", i);
467 			ok = false;
468 		}
469 	}
470 
471 	Set(e);
472 
473 	for (i = 0;i < num;i++)
474 	{
475 		WaitThread(threads[i], INFINITE);
476 		ReleaseThread(threads[i]);
477 	}
478 
479 	Free(threads);
480 
481 	if (ct1.num != (num * CHECK_THREAD_INCREMENT_COUNT))
482 	{
483 		Print("Threading: %u != %u\n", ct1.num, num * CHECK_THREAD_INCREMENT_COUNT);
484 		ok = false;
485 	}
486 
487 	DeleteLock(ct1.lock);
488 
489 	WaitThread(t2, INFINITE);
490 	ReleaseThread(t2);
491 
492 	ReleaseEvent(e);
493 
494 	num = 32;
495 
496 	Zero(&c, sizeof(c));
497 	c.num = num;
498 	t = NewThread(CheckThread3, &c);
499 	WaitThread(t, INFINITE);
500 	ReleaseThread(t);
501 
502 	if (c.a != num)
503 	{
504 		Print("Threading: %u != %u\n", c.a, num);
505 		ok = false;
506 	}
507 
508 	return ok;
509 }
510 
511 // File system check
CheckFileSystem()512 bool CheckFileSystem()
513 {
514 	bool ok = true;
515 	char exe[MAX_PATH];
516 	char exe_dir[MAX_PATH];
517 	DIRLIST *dirs;
518 	UINT i;
519 
520 	GetExeName(exe, sizeof(exe));
521 	GetExeDir(exe_dir, sizeof(exe_dir));
522 
523 	ok = false;
524 	dirs = EnumDir(exe_dir);
525 	for (i = 0;i < dirs->NumFiles;i++)
526 	{
527 		if (EndWith(exe, dirs->File[i]->FileName))
528 		{
529 			ok = true;
530 			break;
531 		}
532 	}
533 	FreeDir(dirs);
534 
535 	if (ok == false)
536 	{
537 		Print("EnumDir Failed.\n");
538 		return false;
539 	}
540 	else
541 	{
542 		UINT size = 1234567;
543 		UCHAR *buf;
544 		IO *io;
545 #ifndef	OS_WIN32
546 		wchar_t *filename = L"/tmp/vpn_checker_tmp";
547 #else	// OS_WIN32
548 		wchar_t filename[MAX_PATH];
549 		CombinePathW(filename, sizeof(filename), MsGetMyTempDirW(), L"vpn_checker_tmp");
550 #endif	// OS_WIN32
551 
552 		buf = Malloc(size);
553 		for (i = 0;i < size;i++)
554 		{
555 			buf[i] = i % 256;
556 		}
557 
558 		io = FileCreateW(filename);
559 		if (io == NULL)
560 		{
561 			Print("FileCreate Failed.\n");
562 			Free(buf);
563 			return false;
564 		}
565 		else
566 		{
567 			FileWrite(io, buf, size);
568 			Free(buf);
569 			FileClose(io);
570 
571 			io = FileOpenW(filename, false);
572 			if (FileSize(io) != 1234567)
573 			{
574 				Print("FileSize Failed.\n");
575 				FileClose(io);
576 				return false;
577 			}
578 			else
579 			{
580 				BUF *b;
581 
582 				FileClose(io);
583 				b = ReadDumpW(filename);
584 
585 				for (i = 0;i < b->Size;i++)
586 				{
587 					UCHAR c = ((UCHAR *)b->Buf)[i];
588 
589 					if (c != (i % 256))
590 					{
591 						Print("FileToBuf Failed.\n");
592 						FreeBuf(b);
593 						return false;
594 					}
595 				}
596 
597 				FreeBuf(b);
598 			}
599 		}
600 
601 		FileDeleteW(filename);
602 	}
603 
604 	return ok;
605 }
606 
607 // String check
CheckStrings()608 bool CheckStrings()
609 {
610 	wchar_t *numstr = _UU("CHECK_TEST_123456789");
611 	char tmp[MAX_SIZE];
612 	wchar_t tmp2[MAX_SIZE];
613 	UINT i;
614 	UINT sum, sum2;
615 	UNI_TOKEN_LIST *t;
616 
617 	UniStrCpy(tmp2, sizeof(tmp2), L"");
618 
619 	sum2 = 0;
620 	for (i = 0;i < 64;i++)
621 	{
622 		sum2 += i;
623 		UniFormat(tmp2, sizeof(tmp2), L"%s,%u", tmp2, i);
624 	}
625 
626 	t = UniParseToken(tmp2, L",");
627 
628 	sum = 0;
629 
630 	for (i = 0;i < t->NumTokens;i++)
631 	{
632 		wchar_t *s = t->Token[i];
633 		UINT n = UniToInt(s);
634 
635 		sum += n;
636 	}
637 
638 	UniFreeToken(t);
639 
640 	if (sum != sum2)
641 	{
642 		Print("UniParseToken Failed.\n");
643 		return false;
644 	}
645 
646 	if (UniToInt(numstr) != 123456789)
647 	{
648 		Print("UniToInt Failed.\n");
649 		return false;
650 	}
651 
652 	UniToStr(tmp, sizeof(tmp), numstr);
653 	if (ToInt(tmp) != 123456789)
654 	{
655 		Print("UniToStr Failed.\n");
656 		return false;
657 	}
658 
659 	return true;
660 }
661 
662 // Memory check
CheckMemory()663 bool CheckMemory()
664 {
665 	UINT i, num, size, j;
666 	void **pp;
667 	bool ok = true;
668 	UINT old_size;
669 
670 	num = 2000;
671 	size = 1000;
672 	pp = ZeroMalloc(sizeof(void *) * num);
673 	for (i = 0;i < num;i++)
674 	{
675 		pp[i] = ZeroMalloc(size);
676 		InputToNull(pp[i]);
677 		for (j = 0;j < size;j++)
678 		{
679 			((UCHAR *)pp[i])[j] = j % 256;
680 		}
681 	}
682 	old_size = size;
683 	size = size * 3;
684 	for (i = 0;i < num;i++)
685 	{
686 		pp[i] = ReAlloc(pp[i], size);
687 		for (j = old_size;j < size;j++)
688 		{
689 			InputToNull((void *)(UINT)(((UCHAR *)pp[i])[j] = j % 256));
690 		}
691 	}
692 	for (i = 0;i < num;i++)
693 	{
694 		for (j = 0;j < size;j++)
695 		{
696 			if (((UCHAR *)pp[i])[j] != (j % 256))
697 			{
698 				ok = false;
699 			}
700 		}
701 		Free(pp[i]);
702 	}
703 	Free(pp);
704 
705 	// OpenSSL Check
706 	if (RsaCheckEx() == false)
707 	{
708 		// Abort
709 		Print("RsaCheck(): OpenSSL Library Init Failed. (too old?)\nPlease install the latest version of OpenSSL.\n\n");
710 		ok = false;
711 	}
712 
713 	return ok;
714 }
715 
716 // Function that do not do anything
InputToNull(void * p)717 void InputToNull(void *p)
718 {
719 	if (RetZero() == 1)
720 	{
721 		UCHAR *c = (UCHAR *)p;
722 		c[0] = 0x32;
723 	}
724 }
725 
726 // Function that returns 0
RetZero()727 UINT RetZero()
728 {
729 	if (g_debug == 0x123455)
730 	{
731 		return 1;
732 	}
733 	else
734 	{
735 		return 0;
736 	}
737 }
738 
739 
740 // Kernel check
CheckKernel()741 bool CheckKernel()
742 {
743 	UINT num = 10, i;
744 	UINT64 s = Tick64();
745 	UINT64 t = Tick64();
746 
747 	for (i = 0;i < num;i++)
748 	{
749 		UINT64 q = Tick64();
750 		if (t > q)
751 		{
752 			Print("Tick64 #1 Failed.\n");
753 			return false;
754 		}
755 
756 		t = q;
757 
758 		SleepThread(100);
759 	}
760 
761 	t = (Tick64() - s);
762 	if (t <= 500 || t >= 2000)
763 	{
764 		Print("Tick64 #2 Failed.\n");
765 		return false;
766 	}
767 	else if (false)
768 	{
769 		UINT64 tick1 = Tick64();
770 		UINT64 time1;
771 		UINT64 tick2, time2;
772 
773 		SleepThread(1000);
774 
775 		tick2 = Tick64();
776 		time2 = LocalTime64();
777 		time1 = SystemToLocal64(TickToTime(tick1));
778 
779 		if (time2 > time1)
780 		{
781 			s = time2 - time1;
782 		}
783 		else
784 		{
785 			s = time1 - time2;
786 		}
787 
788 		if (s <= 500 || s >= 2000)
789 		{
790 			Print("TickToTime Failed.\n");
791 			return false;
792 		}
793 	}
794 
795 #ifdef	OS_UNIX
796 	{
797 		// Test of child process
798 		UINT pid;
799 		char exe[MAX_SIZE];
800 
801 		GetExeName(exe, sizeof(exe));
802 
803 		pid = fork();
804 
805 		if (pid == -1)
806 		{
807 			Print("fork Failed.\n");
808 			return false;
809 		}
810 
811 		if (pid == 0)
812 		{
813 			char *param = UNIX_ARG_EXIT;
814 			char **args;
815 
816 			args = ZeroMalloc(sizeof(char *) * 3);
817 			args[0] = exe;
818 			args[1] = param;
819 			args[2] = NULL;
820 
821 			setsid();
822 
823 			// Close the standard I/O
824 			UnixCloseIO();
825 
826 			// Stop unwanted signals
827 			signal(SIGHUP, SIG_IGN);
828 
829 			execvp(exe, args);
830 			AbortExit();
831 		}
832 		else
833 		{
834 			int status = 0, ret;
835 
836 			// Wait for the termination of the child process
837 			ret = waitpid(pid, &status, 0);
838 
839 			if (WIFEXITED(status) == 0)
840 			{
841 				// Aborted
842 				Print("waitpid Failed: 0x%x\n", ret);
843 				return false;
844 			}
845 		}
846 	}
847 #endif	// OS_UNIX
848 
849 	return true;
850 }
851 
852 // System checker
SystemCheck()853 bool SystemCheck()
854 {
855 	UINT i;
856 	bool ng = false;
857 
858 	UniPrint(_UU("CHECK_TITLE"));
859 	UniPrint(_UU("CHECK_NOTE"));
860 	for (i = 0;i < sizeof(checker_procs) / sizeof(checker_procs[0]);i++)
861 	{
862 		wchar_t *title;
863 		bool ret = false;
864 		CHECKER_PROC *p = &checker_procs[i];
865 
866 		title = _UU(p->Title);
867 
868 		UniPrint(_UU("CHECK_EXEC_TAG"), title);
869 
870 		ret = p->Proc();
871 
872 		if (ret == false)
873 		{
874 			ng = true;
875 		}
876 
877 		UniPrint(L"              %s\n", ret ? _UU("CHECK_PASS") : _UU("CHECK_FAIL"));
878 	}
879 
880 	UniPrint(L"\n");
881 	if (ng == false)
882 	{
883 		UniPrint(L"%s\n\n", _UU("CHECK_RESULT_1"));
884 	}
885 	else
886 	{
887 		UniPrint(L"%s\n\n", _UU("CHECK_RESULT_2"));
888 	}
889 
890 	return true;
891 }
892 
893 
894 // Behavior checker
PtCheck(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)895 UINT PtCheck(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
896 {
897 	LIST *o;
898 	UINT ret = ERR_NO_ERROR;
899 	// Get the parameter list
900 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
901 	if (o == NULL)
902 	{
903 		return ERR_INVALID_PARAMETER;
904 	}
905 
906 	if (SystemCheck() == false)
907 	{
908 		ret = ERR_INTERNAL_ERROR;
909 	}
910 
911 	FreeParamValueList(o);
912 
913 	return ret;
914 }
915 
916 // VPN Tools main function
PtMain(PT * pt)917 void PtMain(PT *pt)
918 {
919 	char prompt[MAX_SIZE];
920 	wchar_t tmp[MAX_SIZE];
921 	// Validate arguments
922 	if (pt == NULL)
923 	{
924 		return;
925 	}
926 
927 	// Display a message that start-up is complete
928 	UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_TOOLS_CONNECTED"));
929 	pt->Console->Write(pt->Console, tmp);
930 	pt->Console->Write(pt->Console, L"");
931 
932 	while (true)
933 	{
934 		// Definition of command
935 		CMD cmd[] =
936 		{
937 			{"About", PsAbout},
938 			{"MakeCert", PtMakeCert},
939 			{"MakeCert2048", PtMakeCert2048},
940 			{"TrafficClient", PtTrafficClient},
941 			{"TrafficServer", PtTrafficServer},
942 			{"Check", PtCheck},
943 		};
944 
945 		// Generate a prompt
946 		StrCpy(prompt, sizeof(prompt), "VPN Tools>");
947 
948 		if (DispatchNextCmdEx(pt->Console, pt->CmdLine, prompt, cmd, sizeof(cmd) / sizeof(cmd[0]), pt) == false)
949 		{
950 			break;
951 		}
952 		pt->LastError = pt->Console->RetCode;
953 
954 		if (pt->LastError == ERR_NO_ERROR && pt->Console->ConsoleType != CONSOLE_CSV)
955 		{
956 			pt->Console->Write(pt->Console, _UU("CMD_MSG_OK"));
957 			pt->Console->Write(pt->Console, L"");
958 		}
959 
960 		if (pt->CmdLine != NULL)
961 		{
962 			break;
963 		}
964 	}
965 }
966 
967 // Create a VPN Tools context
NewPt(CONSOLE * c,wchar_t * cmdline)968 PT *NewPt(CONSOLE *c, wchar_t *cmdline)
969 {
970 	PT *pt;
971 	// Validate arguments
972 	if (c == NULL)
973 	{
974 		return NULL;
975 	}
976 
977 	if (UniIsEmptyStr(cmdline))
978 	{
979 		cmdline = NULL;
980 	}
981 
982 	pt = ZeroMalloc(sizeof(PT));
983 	pt->Console = c;
984 	pt->CmdLine = CopyUniStr(cmdline);
985 
986 	return pt;
987 }
988 
989 // Release the VPN Tools context
FreePt(PT * pt)990 void FreePt(PT *pt)
991 {
992 	// Validate arguments
993 	if (pt == NULL)
994 	{
995 		return;
996 	}
997 
998 	Free(pt->CmdLine);
999 	Free(pt);
1000 }
1001 
1002 // Start VPN Tools
PtConnect(CONSOLE * c,wchar_t * cmdline)1003 UINT PtConnect(CONSOLE *c, wchar_t *cmdline)
1004 {
1005 	PT *pt;
1006 	UINT ret = 0;
1007 	// Validate arguments
1008 	if (c == NULL)
1009 	{
1010 		return ERR_INTERNAL_ERROR;
1011 	}
1012 
1013 	pt = NewPt(c, cmdline);
1014 
1015 	PtMain(pt);
1016 
1017 	ret = pt->LastError;
1018 
1019 	FreePt(pt);
1020 
1021 	return ret;
1022 }
1023 
1024 // Initialize the execution path information of vpncmd command
VpnCmdInitBootPath()1025 void VpnCmdInitBootPath()
1026 {
1027 #ifdef	OS_WIN32
1028 	char exe_path[MAX_PATH];
1029 	char tmp[MAX_PATH];
1030 	GetExeName(exe_path, sizeof(exe_path));
1031 
1032 	if (SearchStrEx(exe_path, "ham.exe", 0, false) != INFINITE || SearchStrEx(exe_path, "ham_x64.exe", 0, false) != INFINITE || SearchStrEx(exe_path, "ham_ia64.exe", 0, false) != INFINITE)
1033 	{
1034 		return;
1035 	}
1036 
1037 	if (MsIsAdmin())
1038 	{
1039 		UINT current_ver;
1040 
1041 		// Get the version of vpncmd that is currently installed
1042 		current_ver = MsRegReadInt(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER);
1043 
1044 		if ((CEDAR_BUILD >= current_ver) ||
1045 			MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)
1046 		{
1047 			char *src_filename;
1048 			bool b = false;
1049 			// Copy the vpncmdsys.exe to system32
1050 			if (MsIsNt())
1051 			{
1052 				Format(tmp, sizeof(tmp), "%s\\vpncmd.exe", MsGetSystem32Dir());
1053 			}
1054 			else
1055 			{
1056 				Format(tmp, sizeof(tmp), "%s\\vpncmd.exe", MsGetWindowsDir());
1057 			}
1058 
1059 			src_filename = VPNCMD_BOOTSTRAP_FILENAME;
1060 
1061 			if (IsX64())
1062 			{
1063 				src_filename = VPNCMD_BOOTSTRAP_FILENAME_X64;
1064 			}
1065 
1066 			if (IsIA64())
1067 			{
1068 				src_filename = VPNCMD_BOOTSTRAP_FILENAME_IA64;
1069 			}
1070 
1071 			b = true;
1072 
1073 			if (MsIs64BitWindows() == false || Is64())
1074 			{
1075 				if (IsFile(tmp) == false || (CEDAR_BUILD > current_ver) || MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)
1076 				{
1077 					b = FileCopy(src_filename, tmp);
1078 				}
1079 			}
1080 			else
1081 			{
1082 				void *wow;
1083 
1084 				wow = MsDisableWow64FileSystemRedirection();
1085 
1086 				if (true)
1087 				{
1088 					if (IsFile(tmp) == false || (CEDAR_BUILD > current_ver) || MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)
1089 					{
1090 						b = FileCopy(src_filename, tmp);
1091 					}
1092 				}
1093 
1094 				MsRestoreWow64FileSystemRedirection(wow);
1095 
1096 				if (true)
1097 				{
1098 					if (IsFile(tmp) == false || (CEDAR_BUILD > current_ver) || MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)
1099 					{
1100 						b = FileCopy(src_filename, tmp);
1101 					}
1102 				}
1103 			}
1104 
1105 			// Because the currently running prompt is newer version, overwrite the registry
1106 			if (MsIs64BitWindows() == false)
1107 			{
1108 				MsRegWriteStr(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH, exe_path);
1109 				MsRegWriteInt(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER, CEDAR_BUILD);
1110 			}
1111 			else
1112 			{
1113 				MsRegWriteStrEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH, exe_path, true, false);
1114 				MsRegWriteIntEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER, CEDAR_BUILD, true, false);
1115 
1116 				MsRegWriteStrEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH, exe_path, false, true);
1117 				MsRegWriteIntEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER, CEDAR_BUILD, false, true);
1118 			}
1119 		}
1120 	}
1121 #endif	// OS_WIN32
1122 }
1123 
1124 // Show the string
TtPrint(void * param,TT_PRINT_PROC * print_proc,wchar_t * str)1125 void TtPrint(void *param, TT_PRINT_PROC *print_proc, wchar_t *str)
1126 {
1127 	// Validate arguments
1128 	if (print_proc == NULL || str == NULL)
1129 	{
1130 		return;
1131 	}
1132 
1133 	print_proc(param, str);
1134 }
1135 
1136 // Generate new random data
TtGenerateRandomData(UCHAR ** buf,UINT * size)1137 void TtGenerateRandomData(UCHAR **buf, UINT *size)
1138 {
1139 	UCHAR *tmp;
1140 	UINT sz;
1141 	UINT i;
1142 	// Validate arguments
1143 	if (buf == NULL || size == NULL)
1144 	{
1145 		return;
1146 	}
1147 
1148 	sz = TRAFFIC_BUF_SIZE;
1149 	tmp = Malloc(sz);
1150 	for (i = 0;i < sz;i++)
1151 	{
1152 		tmp[i] = rand() % 256;
1153 
1154 		if (tmp[i] == '!')
1155 		{
1156 			tmp[i] = '_';
1157 		}
1158 	}
1159 
1160 	*buf = tmp;
1161 	*size = sz;
1162 }
1163 
1164 // Communication throughput measurement server worker thread
TtsWorkerThread(THREAD * thread,void * param)1165 void TtsWorkerThread(THREAD *thread, void *param)
1166 {
1167 	TTS *tts;
1168 	TTS_WORKER *w;
1169 	UINT buf_size;
1170 	UCHAR *send_buf_data, *recv_buf_data;
1171 	bool all_sockets_blocked = false;
1172 	UINT64 tmp64;
1173 	LIST *o;
1174 	UINT i;
1175 	wchar_t tmp[MAX_SIZE];
1176 	bool dont_block_next_time = false;
1177 	char *ver_str = TRAFFIC_VER_STR;
1178 	// Validate arguments
1179 	if (thread == NULL || param == NULL)
1180 	{
1181 		return;
1182 	}
1183 
1184 	// Allocate the data area
1185 	TtGenerateRandomData(&send_buf_data, &buf_size);
1186 	TtGenerateRandomData(&recv_buf_data, &buf_size);
1187 
1188 	w = (TTS_WORKER *)param;
1189 	tts = (TTS *)w->Tts;
1190 
1191 	// Preparation of socket events
1192 	w->SockEvent = NewSockEvent();
1193 	AddRef(w->SockEvent->ref);
1194 
1195 	// Preparing the Server socket list
1196 	w->TtsSockList = NewList(NULL);
1197 
1198 	// Notify completion of preparation to parent thread
1199 	NoticeThreadInit(thread);
1200 
1201 	o = NewList(NULL);
1202 
1203 	while (tts->Halt == false)
1204 	{
1205 		UINT64 now = Tick64();
1206 
1207 		// Wait for all sockets
1208 		if (dont_block_next_time == false)
1209 		{
1210 			WaitSockEvent(w->SockEvent, 50);
1211 		}
1212 		dont_block_next_time = false;
1213 
1214 		// Process for sockets that are currently registered
1215 		LockList(w->TtsSockList);
1216 		{
1217 			UINT i;
1218 
1219 			all_sockets_blocked = false;
1220 
1221 			// Continue to send and receive data
1222 			// until all sockets become block state
1223 			while (all_sockets_blocked == false)
1224 			{
1225 				all_sockets_blocked = true;
1226 
1227 				for (i = 0;i < LIST_NUM(w->TtsSockList);i++)
1228 				{
1229 					UINT ret = SOCK_LATER;
1230 					UCHAR *send_data = NULL, *recv_data = NULL;
1231 					UINT send_size = 0, recv_size = 0;
1232 					TTS_SOCK *ts = LIST_DATA(w->TtsSockList, i);
1233 					bool blocked_for_this_socket = false;
1234 
1235 					if (ts->SockJoined == false)
1236 					{
1237 						JoinSockToSockEvent(ts->Sock, w->SockEvent);
1238 						ts->SockJoined = true;
1239 					}
1240 
1241 					switch (ts->State)
1242 					{
1243 					case 0:
1244 						// Return the version string
1245 						ret = Send(ts->Sock, ver_str, TRAFFIC_VER_STR_SIZE, false);
1246 						if (ret != 0 && ret != SOCK_LATER)
1247 						{
1248 							ts->State = 5;
1249 							ts->LastCommTime = now;
1250 						}
1251 						break;
1252 
1253 					case 5:
1254 						// Receive the direction from the client
1255 						ret = Recv(ts->Sock, recv_buf_data, buf_size, false);
1256 						if (ret != 0 && ret != SOCK_LATER)
1257 						{
1258 							UCHAR c;
1259 
1260 							ts->LastCommTime = now;
1261 
1262 							// Direction of the data is in the first byte that is received
1263 							c = recv_buf_data[0];
1264 
1265 							if (c == 0)
1266 							{
1267 								// In the case of 0, Client -> Server
1268 								ts->State = 1;
1269 							}
1270 							else
1271 							{
1272 								// Otherwise Server -> Client
1273 								ts->State = 2;
1274 							}
1275 
1276 							if (ret >= (sizeof(UINT64) + sizeof(UINT64) + 1))
1277 							{
1278 								// Session ID
1279 								ts->SessionId = READ_UINT64(recv_buf_data + 1);
1280 
1281 								// Span
1282 								ts->Span = READ_UINT64(recv_buf_data + sizeof(UINT64) + 1);
1283 
1284 								ts->GiveupSpan = ts->Span * 3ULL + 180000ULL;
1285 							}
1286 						}
1287 						break;
1288 
1289 					case 1:
1290 						// Client -> Server
1291 						ret = Recv(ts->Sock, recv_buf_data, buf_size, false);
1292 
1293 						if (ret != 0 && ret != SOCK_LATER)
1294 						{
1295 							// Checking the first byte of received
1296 							UCHAR c = recv_buf_data[0];
1297 
1298 							ts->LastCommTime = now;
1299 
1300 							if (ts->FirstRecvTick == 0)
1301 							{
1302 								// Record the time at which the data has been received for the first
1303 								ts->FirstRecvTick = now;
1304 							}
1305 							else
1306 							{
1307 								// Check whether the span didn't finish yet
1308 								if (ts->FirstRecvTick <= now)
1309 								{
1310 									if (ts->Span != 0)
1311 									{
1312 										UINT64 giveup_tick = ts->FirstRecvTick + ts->Span;
1313 
1314 										if (now > giveup_tick)
1315 										{
1316 											// Span has expired
1317 											c = '!';
1318 										}
1319 									}
1320 								}
1321 							}
1322 
1323 							if (c == '!')
1324 							{
1325 								// Notice the size information from the server to the client
1326 								ts->State = 3;
1327 								Debug("!");
1328 							}
1329 						}
1330 						break;
1331 
1332 					case 2:
1333 						// Server -> Client
1334 						if (ts->NoMoreSendData == false)
1335 						{
1336 							ret = Send(ts->Sock, send_buf_data, buf_size, false);
1337 
1338 							if (ret != 0 && ret != SOCK_LATER)
1339 							{
1340 								ts->LastCommTime = now;
1341 							}
1342 						}
1343 						else
1344 						{
1345 							ret = Recv(ts->Sock, recv_buf_data, buf_size, false);
1346 
1347 							if (ret != 0 && ret != SOCK_LATER)
1348 							{
1349 								ts->LastCommTime = now;
1350 							}
1351 						}
1352 
1353 						if (ts->FirstSendTick == 0)
1354 						{
1355 							ts->FirstSendTick = now;
1356 						}
1357 						else
1358 						{
1359 							if (ts->FirstSendTick <= now)
1360 							{
1361 								if (ts->Span != 0)
1362 								{
1363 									UINT64 giveup_tick = ts->FirstSendTick + ts->Span * 3ULL + 180000ULL;
1364 
1365 									if (now > giveup_tick)
1366 									{
1367 										ret = 0;
1368 									}
1369 								}
1370 							}
1371 						}
1372 
1373 						break;
1374 
1375 					case 3:
1376 						// Notice the size information from the server to the client
1377 						tmp64 = Endian64(ts->NumBytes);
1378 
1379 						Recv(ts->Sock, recv_buf_data, buf_size, false);
1380 
1381 						if (ts->LastWaitTick == 0 || ts->LastWaitTick <= Tick64())
1382 						{
1383 							ret = Send(ts->Sock, &tmp64, sizeof(tmp64), false);
1384 
1385 							if (ret != 0 && ret != SOCK_LATER)
1386 							{
1387 								ts->LastCommTime = now;
1388 							}
1389 
1390 							if (ret != SOCK_LATER)
1391 							{
1392 								UINT j;
1393 
1394 								ts->LastWaitTick = Tick64() + 100;
1395 
1396 								if (ts->SessionId != 0)
1397 								{
1398 									// Not to send more data to the socket of the
1399 									// transmission direction in the same session ID
1400 									for (j = 0;j < LIST_NUM(w->TtsSockList);j++)
1401 									{
1402 										TTS_SOCK *ts2 = LIST_DATA(w->TtsSockList, j);
1403 
1404 										if (ts2->SessionId == ts->SessionId &&
1405 											ts2 != ts)
1406 										{
1407 											ts2->NoMoreSendData = true;
1408 										}
1409 									}
1410 								}
1411 							}
1412 						}
1413 						break;
1414 					}
1415 
1416 					if (now > (ts->LastCommTime + ts->GiveupSpan))
1417 					{
1418 						// Timeout: disconnect orphan sessions
1419 						ret = 0;
1420 					}
1421 
1422 					if (ret == 0)
1423 					{
1424 						// Mark as deleting the socket because it is disconnected
1425 						Insert(o, ts);
1426 					}
1427 					else if (ret == SOCK_LATER)
1428 					{
1429 						// Delay has occurred
1430 						blocked_for_this_socket = true;
1431 						dont_block_next_time = false;
1432 					}
1433 					else
1434 					{
1435 						if (ts->State == 1)
1436 						{
1437 							ts->NumBytes += (UINT64)ret;
1438 						}
1439 					}
1440 
1441 					if (blocked_for_this_socket == false)
1442 					{
1443 						all_sockets_blocked = false;
1444 					}
1445 				}
1446 
1447 				if (LIST_NUM(o) != 0)
1448 				{
1449 					UINT i;
1450 					// One or more sockets is disconnected
1451 					for (i = 0;i < LIST_NUM(o);i++)
1452 					{
1453 						TTS_SOCK *ts = LIST_DATA(o, i);
1454 
1455 						UniFormat(tmp, sizeof(tmp), _UU("TTS_DISCONNECTED"), ts->Id, ts->Sock->RemoteHostname);
1456 						TtPrint(tts->Param, tts->Print, tmp);
1457 
1458 						Disconnect(ts->Sock);
1459 						ReleaseSock(ts->Sock);
1460 
1461 						Delete(w->TtsSockList, ts);
1462 
1463 						Free(ts);
1464 					}
1465 
1466 					DeleteAll(o);
1467 				}
1468 
1469 				if (w->NewSocketArrived || tts->Halt)
1470 				{
1471 					w->NewSocketArrived = false;
1472 					all_sockets_blocked = true;
1473 					dont_block_next_time = true;
1474 				}
1475 			}
1476 		}
1477 		UnlockList(w->TtsSockList);
1478 	}
1479 
1480 	LockList(w->TtsSockList);
1481 	{
1482 		// Release the sockets of all remaining
1483 		for (i = 0;i < LIST_NUM(w->TtsSockList);i++)
1484 		{
1485 			TTS_SOCK *ts = LIST_DATA(w->TtsSockList, i);
1486 
1487 			UniFormat(tmp, sizeof(tmp), _UU("TTS_DISCONNECT"), ts->Id, ts->Sock->RemoteHostname);
1488 			TtPrint(tts->Param, tts->Print, tmp);
1489 
1490 			Disconnect(ts->Sock);
1491 			ReleaseSock(ts->Sock);
1492 
1493 			Free(ts);
1494 		}
1495 	}
1496 	UnlockList(w->TtsSockList);
1497 
1498 	// Cleanup
1499 	ReleaseList(o);
1500 	ReleaseList(w->TtsSockList);
1501 	ReleaseSockEvent(w->SockEvent);
1502 	Free(send_buf_data);
1503 	Free(recv_buf_data);
1504 }
1505 
1506 // Accept thread for IPv6
TtsIPv6AcceptThread(THREAD * thread,void * param)1507 void TtsIPv6AcceptThread(THREAD *thread, void *param)
1508 {
1509 	TTS *tts = (TTS *)param;
1510 	// Validate arguments
1511 	if (tts == NULL || param == NULL)
1512 	{
1513 		return;
1514 	}
1515 
1516 	TtsAcceptProc(tts, tts->ListenSocketV6);
1517 }
1518 
1519 // Accept procedure
TtsAcceptProc(TTS * tts,SOCK * listen_socket)1520 void TtsAcceptProc(TTS *tts, SOCK *listen_socket)
1521 {
1522 	wchar_t tmp[MAX_SIZE];
1523 	UINT seed = 0;
1524 	// Validate arguments
1525 	if (tts == NULL || listen_socket == NULL)
1526 	{
1527 		return;
1528 	}
1529 
1530 	while (tts->Halt == false)
1531 	{
1532 		SOCK *s;
1533 		// Accept
1534 		s = Accept(listen_socket);
1535 
1536 		if (s == NULL)
1537 		{
1538 			if (tts->Halt == false)
1539 			{
1540 				SleepThread(10);
1541 			}
1542 			continue;
1543 		}
1544 		else
1545 		{
1546 			UINT num, i;
1547 			TTS_WORKER *w;
1548 
1549 			// Connected from the client
1550 			AcceptInitEx(s, true);
1551 
1552 			// Choose a worker thread
1553 			num = LIST_NUM(tts->WorkerList);
1554 
1555 			i = seed % num;
1556 
1557 			seed++;
1558 
1559 			w = LIST_DATA(tts->WorkerList, i);
1560 
1561 			w->NewSocketArrived = true;
1562 			LockList(w->TtsSockList);
1563 			{
1564 				TTS_SOCK *ts = ZeroMalloc(sizeof(TTS_SOCK));
1565 
1566 				ts->Id = (++tts->IdSeed);
1567 				ts->Sock = s;
1568 
1569 				ts->GiveupSpan = (UINT64)(10 * 60 * 1000);
1570 				ts->LastCommTime = Tick64();
1571 
1572 				UniFormat(tmp, sizeof(tmp), _UU("TTS_ACCEPTED"), ts->Id,
1573 					s->RemoteHostname, s->RemotePort);
1574 				TtPrint(tts->Param, tts->Print, tmp);
1575 
1576 				Insert(w->TtsSockList, ts);
1577 				w->NewSocketArrived = true;
1578 			}
1579 			UnlockList(w->TtsSockList);
1580 
1581 			SetSockEvent(w->SockEvent);
1582 		}
1583 	}
1584 }
1585 
1586 // Communication throughput measurement server wait thread
TtsListenThread(THREAD * thread,void * param)1587 void TtsListenThread(THREAD *thread, void *param)
1588 {
1589 	TTS *tts;
1590 	wchar_t tmp[MAX_SIZE];
1591 	// Validate arguments
1592 	if (thread == NULL || param == NULL)
1593 	{
1594 		return;
1595 	}
1596 
1597 	tts = (TTS *)param;
1598 
1599 	tts->ListenSocket = NULL;
1600 	tts->ListenSocket = ListenEx(tts->Port, false);
1601 	tts->ListenSocketV6 = ListenEx6(tts->Port, false);
1602 
1603 	if (tts->ListenSocket == NULL && tts->ListenSocketV6 == NULL)
1604 	{
1605 		// Failed to Listen
1606 		UniFormat(tmp, sizeof(tmp), _UU("TT_LISTEN_FAILED"), tts->Port);
1607 		TtPrint(tts->Param, tts->Print, tmp);
1608 
1609 		// Notify completion of preparation to parent thread
1610 		NoticeThreadInit(thread);
1611 
1612 		tts->ErrorCode = ERR_INTERNAL_ERROR;
1613 	}
1614 	else
1615 	{
1616 		UINT i, num_worker_threads;
1617 
1618 		UniFormat(tmp, sizeof(tmp), _UU("TTS_LISTEN_STARTED"), tts->Port);
1619 		TtPrint(tts->Param, tts->Print, tmp);
1620 
1621 		if (tts->ListenSocketV6 != NULL)
1622 		{
1623 			UniFormat(tmp, sizeof(tmp), _UU("TTS_LISTEN_STARTED_V6"), tts->Port);
1624 			TtPrint(tts->Param, tts->Print, tmp);
1625 		}
1626 		else
1627 		{
1628 			UniFormat(tmp, sizeof(tmp), _UU("TTS_LISTEN_FAILED_V6"), tts->Port);
1629 			TtPrint(tts->Param, tts->Print, tmp);
1630 		}
1631 
1632 		if (tts->ListenSocket != NULL)
1633 		{
1634 			AddRef(tts->ListenSocket->ref);
1635 		}
1636 		if (tts->ListenSocketV6 != NULL)
1637 		{
1638 			AddRef(tts->ListenSocketV6->ref);
1639 		}
1640 
1641 		num_worker_threads = GetNumberOfCpu();
1642 
1643 		// Start the worker threads
1644 		for (i = 0;i < num_worker_threads;i++)
1645 		{
1646 			TTS_WORKER *w = ZeroMalloc(sizeof(TTS_WORKER));
1647 
1648 			w->Tts = tts;
1649 			w->WorkThread = NewThread(TtsWorkerThread, w);
1650 			WaitThreadInit(w->WorkThread);
1651 
1652 			Add(tts->WorkerList, w);
1653 		}
1654 
1655 		// Notify completion of preparation to parent thread
1656 		NoticeThreadInit(thread);
1657 
1658 		// Prepare for IPv6 Accept thread
1659 		tts->IPv6AcceptThread = NULL;
1660 		if (tts->ListenSocketV6 != NULL)
1661 		{
1662 			tts->IPv6AcceptThread = NewThread(TtsIPv6AcceptThread, tts);
1663 		}
1664 
1665 		TtsAcceptProc(tts, tts->ListenSocket);
1666 
1667 		if (tts->IPv6AcceptThread != NULL)
1668 		{
1669 			WaitThread(tts->IPv6AcceptThread, INFINITE);
1670 			ReleaseThread(tts->IPv6AcceptThread);
1671 		}
1672 
1673 		TtPrint(tts->Param, tts->Print, _UU("TTS_LISTEN_STOP"));
1674 
1675 		ReleaseSock(tts->ListenSocket);
1676 		ReleaseSock(tts->ListenSocketV6);
1677 
1678 		for (i = 0;i < LIST_NUM(tts->WorkerList);i++)
1679 		{
1680 			TTS_WORKER *w = LIST_DATA(tts->WorkerList, i);
1681 
1682 			SetSockEvent(w->SockEvent);
1683 
1684 			// Wait for stopping the worker thread
1685 			WaitThread(w->WorkThread, INFINITE);
1686 			ReleaseThread(w->WorkThread);
1687 			ReleaseSockEvent(w->SockEvent);
1688 
1689 			Free(w);
1690 		}
1691 	}
1692 }
1693 
1694 // String of the direction in which data flows
GetTtcTypeStr(UINT type)1695 wchar_t *GetTtcTypeStr(UINT type)
1696 {
1697 	switch (type)
1698 	{
1699 	case TRAFFIC_TYPE_DOWNLOAD:
1700 		return _UU("TTC_TYPE_DOWNLOAD");
1701 
1702 	case TRAFFIC_TYPE_UPLOAD:
1703 		return _UU("TTC_TYPE_UPLOAD");
1704 
1705 	default:
1706 		return _UU("TTC_TYPE_FULL");
1707 	}
1708 }
1709 
1710 // Show a Summary
TtcPrintSummary(TTC * ttc)1711 void TtcPrintSummary(TTC *ttc)
1712 {
1713 	wchar_t tmp[MAX_SIZE];
1714 	wchar_t tmp2[MAX_SIZE];
1715 	wchar_t *tag = L"%-35s %s";
1716 	// Validate arguments
1717 	if (ttc == NULL)
1718 	{
1719 		return;
1720 	}
1721 
1722 	TtPrint(ttc->Param, ttc->Print, L"");
1723 	TtPrint(ttc->Param, ttc->Print, _UU("TTC_SUMMARY_BAR"));
1724 	TtPrint(ttc->Param, ttc->Print, _UU("TTC_SUMMARY_TITLE"));
1725 	TtPrint(ttc->Param, ttc->Print, L"");
1726 
1727 	// Destination host name
1728 	StrToUni(tmp2, sizeof(tmp2), ttc->Host);
1729 	UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_HOST"), tmp2);
1730 	TtPrint(ttc->Param, ttc->Print, tmp);
1731 
1732 	// Destination TCP port number
1733 	UniToStru(tmp2, ttc->Port);
1734 	UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_PORT"), tmp2);
1735 	TtPrint(ttc->Param, ttc->Print, tmp);
1736 
1737 	// Number of TCP connections to establish
1738 	UniToStru(tmp2, ttc->NumTcp);
1739 	UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_NUMTCP"), tmp2);
1740 	TtPrint(ttc->Param, ttc->Print, tmp);
1741 
1742 	// Data transmission direction
1743 	UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_TYPE"), GetTtcTypeStr(ttc->Type));
1744 	TtPrint(ttc->Param, ttc->Print, tmp);
1745 
1746 	// Data transmission span
1747 	UniFormat(tmp2, sizeof(tmp2), _UU("TTC_SPAN_STR"), (double)(ttc->Span) / 1000.0);
1748 	UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_SPAN"), tmp2);
1749 	TtPrint(ttc->Param, ttc->Print, tmp);
1750 
1751 	// Correct the data for Ethernet frame
1752 	UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_ETHER"), ttc->Raw ? _UU("SEC_NO") : _UU("SEC_YES"));
1753 	TtPrint(ttc->Param, ttc->Print, tmp);
1754 
1755 	// Measure the total amount of input and output throughput of relay equipment
1756 	UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_DOUBLE"), ttc->Double ? _UU("SEC_YES") : _UU("SEC_NO"));
1757 	TtPrint(ttc->Param, ttc->Print, tmp);
1758 
1759 	TtPrint(ttc->Param, ttc->Print, _UU("TTC_SUMMARY_BAR"));
1760 	TtPrint(ttc->Param, ttc->Print, L"");
1761 }
1762 
1763 // Stop the communication throughput measurement client
StopTtc(TTC * ttc)1764 void StopTtc(TTC *ttc)
1765 {
1766 	// Validate arguments
1767 	if (ttc == NULL)
1768 	{
1769 		return;
1770 	}
1771 
1772 	TtPrint(ttc->Param, ttc->Print, _UU("TTC_STOPPING"));
1773 
1774 	ttc->Halt = true;
1775 }
1776 
1777 // Generate a result
TtcGenerateResult(TTC * ttc)1778 void TtcGenerateResult(TTC *ttc)
1779 {
1780 	TT_RESULT *res;
1781 	UINT i;
1782 	// Validate arguments
1783 	if (ttc == NULL)
1784 	{
1785 		return;
1786 	}
1787 
1788 	res = &ttc->Result;
1789 
1790 	Zero(res, sizeof(TT_RESULT));
1791 
1792 	res->Raw = ttc->Raw;
1793 	res->Double = ttc->Double;
1794 	res->Span = ttc->RealSpan;
1795 
1796 	for (i = 0;i < LIST_NUM(ttc->ItcSockList);i++)
1797 	{
1798 		TTC_SOCK *ts = LIST_DATA(ttc->ItcSockList, i);
1799 
1800 		if (ts->Download == false)
1801 		{
1802 			// Upload
1803 			res->NumBytesUpload += ts->NumBytes;
1804 		}
1805 		else
1806 		{
1807 			// Download
1808 			res->NumBytesDownload += ts->NumBytes;
1809 		}
1810 	}
1811 
1812 	if (res->Raw == false)
1813 	{
1814 		// Correct to match the Ethernet
1815 		res->NumBytesDownload = (UINT64)((double)res->NumBytesDownload * 1514.0 / 1460.0);
1816 		res->NumBytesUpload = (UINT64)((double)res->NumBytesUpload * 1514.0 / 1460.0);
1817 	}
1818 
1819 	res->NumBytesTotal = res->NumBytesDownload + res->NumBytesUpload;
1820 
1821 	// Measure the throughput
1822 	if (res->Span != 0)
1823 	{
1824 		res->BpsUpload = (UINT64)((double)res->NumBytesUpload * 8.0 / ((double)res->Span / 1000.0));
1825 		res->BpsDownload = (UINT64)((double)res->NumBytesDownload * 8.0 / ((double)res->Span / 1000.0));
1826 	}
1827 
1828 	if (res->Double)
1829 	{
1830 		res->BpsUpload *= 2ULL;
1831 		res->BpsDownload *= 2ULL;
1832 	}
1833 
1834 	res->BpsTotal = res->BpsUpload + res->BpsDownload;
1835 }
1836 
1837 // Client worker thread
TtcWorkerThread(THREAD * thread,void * param)1838 void TtcWorkerThread(THREAD *thread, void *param)
1839 {
1840 	TTC_WORKER *w;
1841 	TTC *ttc;
1842 	bool dont_block_next_time = false;
1843 	bool halting = false;
1844 	UINT64 halt_timeout = 0;
1845 	bool all_sockets_blocked;
1846 	wchar_t tmp[MAX_SIZE];
1847 	UCHAR *send_buf_data, *recv_buf_data;
1848 	UINT buf_size;
1849 	UINT64 tmp64;
1850 
1851 	if (thread == NULL || param == NULL)
1852 	{
1853 		return;
1854 	}
1855 
1856 	w = (TTC_WORKER *)param;
1857 	ttc = w->Ttc;
1858 
1859 	// Allocate the data area
1860 	TtGenerateRandomData(&send_buf_data, &buf_size);
1861 	TtGenerateRandomData(&recv_buf_data, &buf_size);
1862 
1863 	NoticeThreadInit(thread);
1864 
1865 	// Wait for start
1866 	Wait(w->StartEvent, INFINITE);
1867 
1868 	// Main loop
1869 	while (true)
1870 	{
1871 		UINT i;
1872 
1873 		if (dont_block_next_time == false)
1874 		{
1875 			WaitSockEvent(w->SockEvent, 50);
1876 		}
1877 
1878 		dont_block_next_time = false;
1879 
1880 		if (ttc->AbnormalTerminated)
1881 		{
1882 			// Abnormal termination occured
1883 			break;
1884 		}
1885 
1886 		if (ttc->Halt || ttc->end_tick <= Tick64() || (ttc->Cancel != NULL && (*ttc->Cancel)))
1887 		{
1888 			// End measurement
1889 			if (halting == false)
1890 			{
1891 				if (ttc->Halt || (ttc->Cancel != NULL && (*ttc->Cancel)))
1892 				{
1893 					if ((ttc->flag1++) == 0)
1894 					{
1895 						// User cancel
1896 						TtPrint(ttc->Param, ttc->Print, _UU("TTC_COMM_USER_CANCEL"));
1897 					}
1898 				}
1899 				else
1900 				{
1901 					// Time elapsed
1902 					if ((ttc->flag2++) == 0)
1903 					{
1904 						UniFormat(tmp, sizeof(tmp), _UU("TTC_COMM_END"),
1905 							(double)ttc->Span / 1000.0);
1906 						TtPrint(ttc->Param, ttc->Print, tmp);
1907 					}
1908 				}
1909 
1910 				if (ttc->RealSpan == 0)
1911 				{
1912 					ttc->RealSpan = Tick64() - ttc->start_tick;
1913 				}
1914 
1915 				halting = true;
1916 
1917 				// Wait for reporting data from the server
1918 				halt_timeout = Tick64() + 60000ULL;
1919 			}
1920 		}
1921 
1922 		if (halt_timeout != 0)
1923 		{
1924 			bool ok = true;
1925 
1926 			// Wait that all TCP connections to finish processing
1927 			for (i = 0;i < LIST_NUM(w->SockList);i++)
1928 			{
1929 				TTC_SOCK *ts = LIST_DATA(w->SockList, i);
1930 
1931 				if (ts->Download == false)
1932 				{
1933 					if (ts->ServerUploadReportReceived == false)
1934 					{
1935 						ok = false;
1936 					}
1937 				}
1938 			}
1939 
1940 			if (ok)
1941 			{
1942 				// Measurement completed
1943 				w->Ok = true;
1944 				break;
1945 			}
1946 			else
1947 			{
1948 				if (halt_timeout <= Tick64())
1949 				{
1950 					// An error occured
1951 					ttc->AbnormalTerminated = true;
1952 					ttc->ErrorCode = ERR_PROTOCOL_ERROR;
1953 					break;
1954 				}
1955 			}
1956 		}
1957 
1958 		all_sockets_blocked = false;
1959 
1960 		// Continue to send and receive data
1961 		// until all sockets become block state
1962 		while (all_sockets_blocked == false)
1963 		{
1964 			all_sockets_blocked = true;
1965 
1966 			for (i = 0;i < LIST_NUM(w->SockList);i++)
1967 			{
1968 				UINT ret = SOCK_LATER;
1969 				TTC_SOCK *ts = LIST_DATA(w->SockList, i);
1970 				bool blocked_for_this_socket = false;
1971 				UCHAR c = 0;
1972 				UCHAR c_and_session_id[1 + sizeof(UINT64) + sizeof(UINT64)];
1973 
1974 				if (halt_timeout != 0)
1975 				{
1976 					if (ts->State != 3 && ts->State != 4)
1977 					{
1978 						if (ts->Download == false)
1979 						{
1980 							if (ts->State != 0)
1981 							{
1982 								ts->State = 3;
1983 							}
1984 							else
1985 							{
1986 								ts->ServerUploadReportReceived = true;
1987 								ts->State = 4;
1988 							}
1989 						}
1990 						else
1991 						{
1992 							ts->State = 4;
1993 						}
1994 					}
1995 				}
1996 
1997 				switch (ts->State)
1998 				{
1999 				case 0:
2000 					// Initial state: Specify the direction of
2001 					// the data flow between client-server
2002 					if (ts->Download)
2003 					{
2004 						c = 1;
2005 					}
2006 					else
2007 					{
2008 						c = 0;
2009 					}
2010 
2011 					c_and_session_id[0] = c;
2012 					WRITE_UINT64(c_and_session_id + 1, ttc->session_id);
2013 					WRITE_UINT64(c_and_session_id + sizeof(UINT64) + 1, ttc->Span);
2014 
2015 					ret = Send(ts->Sock, c_and_session_id, 1 + sizeof(UINT64) + sizeof(UINT64), false);
2016 
2017 					if (ret != 0 && ret != SOCK_LATER)
2018 					{
2019 						if (ts->Download)
2020 						{
2021 							ts->State = 1;
2022 						}
2023 						else
2024 						{
2025 							ts->State = 2;
2026 						}
2027 					}
2028 					break;
2029 
2030 				case 1:
2031 					// Server -> Client (download)
2032 					ret = Recv(ts->Sock, recv_buf_data, buf_size, false);
2033 					break;
2034 
2035 				case 2:
2036 					// Client -> Server (upload)
2037 					ret = Send(ts->Sock, send_buf_data, buf_size, false);
2038 					break;
2039 
2040 				case 3:
2041 					// Transmission completion client -> server (upload)
2042 					// Request the data size
2043 					if (ts->NextSendRequestReportTick == 0 ||
2044 						(Tick64() >= ts->NextSendRequestReportTick))
2045 					{
2046 						UCHAR suprise[MAX_SIZE];
2047 						UINT i;
2048 
2049 						ts->NextSendRequestReportTick = Tick64() + 200ULL;
2050 
2051 						for (i = 0;i < sizeof(suprise);i++)
2052 						{
2053 							suprise[i] = '!';
2054 						}
2055 
2056 						ret = Send(ts->Sock, suprise, sizeof(suprise), false);
2057 					}
2058 
2059 					ret = Recv(ts->Sock, &tmp64, sizeof(tmp64), false);
2060 					if (ret != 0 && ret != SOCK_LATER && ret == sizeof(tmp64))
2061 					{
2062 						ts->NumBytes = Endian64(tmp64);
2063 
2064 						ts->ServerUploadReportReceived = true;
2065 
2066 						ts->State = 4;
2067 					}
2068 					break;
2069 
2070 				case 4:
2071 					// Do Nothing
2072 					if (Recv(ts->Sock, recv_buf_data, buf_size, false) == SOCK_LATER)
2073 					{
2074 						ret = SOCK_LATER;
2075 					}
2076 					break;
2077 				}
2078 
2079 				if (ret == 0)
2080 				{
2081 					// The socket is disconnected
2082 					ttc->AbnormalTerminated = true;
2083 					ttc->ErrorCode = ERR_PROTOCOL_ERROR;
2084 					blocked_for_this_socket = true;
2085 					dont_block_next_time = false;
2086 
2087 					if (ts->HideErrMsg == false)
2088 					{
2089 						UniFormat(tmp, sizeof(tmp), _UU("TTC_COMM_DISCONNECTED"), ts->Id);
2090 						TtPrint(ttc->Param, ttc->Print, tmp);
2091 						ts->HideErrMsg = true;
2092 					}
2093 				}
2094 				else if (ret == SOCK_LATER)
2095 				{
2096 					// Delay has occurred
2097 					blocked_for_this_socket = true;
2098 					dont_block_next_time = false;
2099 				}
2100 				else
2101 				{
2102 					if (ts->Download)
2103 					{
2104 						ts->NumBytes += (UINT64)ret;
2105 					}
2106 				}
2107 
2108 				if (blocked_for_this_socket == false)
2109 				{
2110 					all_sockets_blocked = false;
2111 				}
2112 			}
2113 
2114 			if (ttc->Halt || (ttc->Cancel != NULL && (*ttc->Cancel)))
2115 			{
2116 				all_sockets_blocked = true;
2117 				dont_block_next_time = true;
2118 			}
2119 
2120 			if (ttc->end_tick <= Tick64())
2121 			{
2122 				all_sockets_blocked = true;
2123 				dont_block_next_time = true;
2124 			}
2125 		}
2126 	}
2127 
2128 	Free(send_buf_data);
2129 	Free(recv_buf_data);
2130 }
2131 
2132 // Client thread
TtcThread(THREAD * thread,void * param)2133 void TtcThread(THREAD *thread, void *param)
2134 {
2135 	TTC *ttc;
2136 	UINT i;
2137 	wchar_t tmp[MAX_SIZE];
2138 	bool ok = false;
2139 	IP ip_ret;
2140 	// Validate arguments
2141 	if (thread == NULL || param == NULL)
2142 	{
2143 		return;
2144 	}
2145 
2146 	ttc = (TTC *)param;
2147 
2148 	// Ready
2149 	NoticeThreadInit(thread);
2150 
2151 	TtcPrintSummary(ttc);
2152 
2153 	UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_START"),
2154 		ttc->Host, ttc->Port, ttc->NumTcp);
2155 	TtPrint(ttc->Param, ttc->Print, tmp);
2156 
2157 	// Establish all connections to the client
2158 	ttc->ItcSockList = NewList(NULL);
2159 
2160 	ok = true;
2161 
2162 	Zero(&ip_ret, sizeof(ip_ret));
2163 
2164 	for (i = 0;i < ttc->NumTcp;i++)
2165 	{
2166 		SOCK *s;
2167 		TTC_SOCK *ts = ZeroMalloc(sizeof(TTC_SOCK));
2168 		char target_host[MAX_SIZE];
2169 
2170 		ts->Id = i + 1;
2171 
2172 		if (ttc->Type == TRAFFIC_TYPE_DOWNLOAD)
2173 		{
2174 			ts->Download = true;
2175 		}
2176 		else if (ttc->Type == TRAFFIC_TYPE_UPLOAD)
2177 		{
2178 			ts->Download = false;
2179 		}
2180 		else
2181 		{
2182 			ts->Download = ((i % 2) == 0) ? true : false;
2183 		}
2184 
2185 		StrCpy(target_host, sizeof(target_host), ttc->Host);
2186 
2187 		if (IsZeroIp(&ip_ret) == false)
2188 		{
2189 			IPToStr(target_host, sizeof(target_host), &ip_ret);
2190 		}
2191 
2192 		s = ConnectEx4(target_host, ttc->Port, 0, ttc->Cancel, NULL, NULL, false, false, true, &ip_ret);
2193 
2194 		if (s == NULL)
2195 		{
2196 			UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_FAILED"), i + 1);
2197 			TtPrint(ttc->Param, ttc->Print, tmp);
2198 			ok = false;
2199 			Free(ts);
2200 			break;
2201 		}
2202 		else
2203 		{
2204 			char buffer[TRAFFIC_VER_STR_SIZE];
2205 
2206 			SetTimeout(s, 5000);
2207 
2208 			Zero(buffer, sizeof(buffer));
2209 			if (Recv(s, buffer, sizeof(buffer), false) != sizeof(buffer) || Cmp(buffer, TRAFFIC_VER_STR, TRAFFIC_VER_STR_SIZE) != 0)
2210 			{
2211 				TtPrint(ttc->Param, ttc->Print, _UU("TTC_CONNECT_NOT_SERVER"));
2212 				ok = false;
2213 				ReleaseSock(s);
2214 				Free(ts);
2215 				break;
2216 			}
2217 
2218 			UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_OK"), i + 1);
2219 			TtPrint(ttc->Param, ttc->Print, tmp);
2220 
2221 			UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_OK_2"), GetTtcTypeStr(ts->Download ? TRAFFIC_TYPE_DOWNLOAD : TRAFFIC_TYPE_UPLOAD));
2222 			TtPrint(ttc->Param, ttc->Print, tmp);
2223 
2224 			ts->Sock = s;
2225 
2226 			SetTimeout(s, TIMEOUT_INFINITE);
2227 		}
2228 
2229 		Insert(ttc->ItcSockList, ts);
2230 	}
2231 
2232 	Set(ttc->InitedEvent);
2233 
2234 	if (ttc->StartEvent != NULL)
2235 	{
2236 		Wait(ttc->StartEvent, INFINITE);
2237 		SleepThread(500);
2238 	}
2239 
2240 	if (ok)
2241 	{
2242 		UINT64 start_tick, end_tick;
2243 		UINT64 halt_timeout = 0;
2244 		wchar_t tmp1[MAX_SIZE], tmp2[MAX_SIZE];
2245 		UINT check_clock_seed = 0;
2246 		bool halting = false;
2247 		UINT64 session_id = Rand64();
2248 		UINT i, num_cpu;
2249 		bool all_ok = false;
2250 
2251 		ttc->session_id = session_id;
2252 
2253 		num_cpu = GetNumberOfCpu();
2254 
2255 		ttc->WorkerThreadList = NewList(NULL);
2256 
2257 		for (i = 0;i < num_cpu;i++)
2258 		{
2259 			TTC_WORKER *w = ZeroMalloc(sizeof(TTC_WORKER));
2260 
2261 			w->Ttc = ttc;
2262 			w->SockList = NewList(NULL);
2263 			w->StartEvent = NewEvent();
2264 			w->SockEvent = NewSockEvent();
2265 
2266 			w->WorkerThread = NewThread(TtcWorkerThread, w);
2267 
2268 			WaitThreadInit(w->WorkerThread);
2269 
2270 			Add(ttc->WorkerThreadList, w);
2271 		}
2272 
2273 		// Assign each of sockets to each of worker threads
2274 		for (i = 0;i < LIST_NUM(ttc->ItcSockList);i++)
2275 		{
2276 			TTC_SOCK *ts = LIST_DATA(ttc->ItcSockList, i);
2277 			UINT num = LIST_NUM(ttc->WorkerThreadList);
2278 			UINT j = i % num;
2279 			TTC_WORKER *w = LIST_DATA(ttc->WorkerThreadList, j);
2280 
2281 			Add(w->SockList, ts);
2282 
2283 			JoinSockToSockEvent(ts->Sock, w->SockEvent);
2284 		}
2285 
2286 		// Record the current time
2287 		start_tick = Tick64();
2288 		end_tick = start_tick + ttc->Span;
2289 
2290 		ttc->start_tick = start_tick;
2291 		ttc->end_tick = end_tick;
2292 
2293 		// Set the start event for all worker threads
2294 		for (i = 0;i < LIST_NUM(ttc->WorkerThreadList);i++)
2295 		{
2296 			TTC_WORKER *w = LIST_DATA(ttc->WorkerThreadList, i);
2297 
2298 			Set(w->StartEvent);
2299 		}
2300 
2301 		// Show start message
2302 		GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(TickToTime(start_tick)), NULL);
2303 		GetDateTimeStrEx64(tmp2, sizeof(tmp2), SystemToLocal64(TickToTime(end_tick)), NULL);
2304 		UniFormat(tmp, sizeof(tmp), _UU("TTC_COMM_START"), tmp1, tmp2);
2305 		TtPrint(ttc->Param, ttc->Print, tmp);
2306 
2307 		// Wait for all worker threads finish
2308 		all_ok = true;
2309 		for (i = 0;i < LIST_NUM(ttc->WorkerThreadList);i++)
2310 		{
2311 			TTC_WORKER *w = LIST_DATA(ttc->WorkerThreadList, i);
2312 
2313 			WaitThread(w->WorkerThread, INFINITE);
2314 
2315 			if (w->Ok == false)
2316 			{
2317 				all_ok = false;
2318 			}
2319 		}
2320 
2321 		if (all_ok)
2322 		{
2323 			// Measurement completed
2324 			// Show the result
2325 			TtcGenerateResult(ttc);
2326 		}
2327 
2328 		// Release worker threads
2329 		for (i = 0;i < LIST_NUM(ttc->WorkerThreadList);i++)
2330 		{
2331 			TTC_WORKER *w = LIST_DATA(ttc->WorkerThreadList, i);
2332 
2333 			ReleaseThread(w->WorkerThread);
2334 
2335 			ReleaseEvent(w->StartEvent);
2336 			ReleaseList(w->SockList);
2337 
2338 			ReleaseSockEvent(w->SockEvent);
2339 
2340 			Free(w);
2341 		}
2342 
2343 		ReleaseList(ttc->WorkerThreadList);
2344 		ttc->WorkerThreadList = NULL;
2345 	}
2346 	else
2347 	{
2348 		// Abort
2349 		TtPrint(ttc->Param, ttc->Print, _UU("TTC_ERROR_ABORTED"));
2350 		ttc->ErrorCode = ERR_CONNECT_FAILED;
2351 	}
2352 
2353 	// Cleanup
2354 	for (i = 0;i < LIST_NUM(ttc->ItcSockList);i++)
2355 	{
2356 		TTC_SOCK *ts = LIST_DATA(ttc->ItcSockList, i);
2357 
2358 		Disconnect(ts->Sock);
2359 		ReleaseSock(ts->Sock);
2360 		Free(ts);
2361 	}
2362 
2363 	ReleaseList(ttc->ItcSockList);
2364 }
2365 
2366 // Start the communication throughput measurement client
NewTtc(char * host,UINT port,UINT numtcp,UINT type,UINT64 span,bool dbl,bool raw,TT_PRINT_PROC * print_proc,void * param)2367 TTC *NewTtc(char *host, UINT port, UINT numtcp, UINT type, UINT64 span, bool dbl, bool raw, TT_PRINT_PROC *print_proc, void *param)
2368 {
2369 	return NewTtcEx(host, port, numtcp, type, span, dbl, raw, print_proc, param, NULL, NULL);
2370 }
NewTtcEx(char * host,UINT port,UINT numtcp,UINT type,UINT64 span,bool dbl,bool raw,TT_PRINT_PROC * print_proc,void * param,EVENT * start_event,bool * cancel)2371 TTC *NewTtcEx(char *host, UINT port, UINT numtcp, UINT type, UINT64 span, bool dbl, bool raw, TT_PRINT_PROC *print_proc, void *param, EVENT *start_event, bool *cancel)
2372 {
2373 	TTC *ttc;
2374 
2375 	ttc = ZeroMalloc(sizeof(TTC));
2376 	ttc->InitedEvent = NewEvent();
2377 	ttc->Port = port;
2378 	StrCpy(ttc->Host, sizeof(ttc->Host), host);
2379 	ttc->NumTcp = numtcp;
2380 	ttc->Type = type;
2381 	ttc->Span = span;
2382 	ttc->Double = dbl;
2383 	ttc->Raw = raw;
2384 	ttc->StartEvent = start_event;
2385 	ttc->Cancel = cancel;
2386 
2387 	if (ttc->Type == TRAFFIC_TYPE_FULL && ttc->NumTcp < 2)
2388 	{
2389 		ttc->NumTcp = 2;
2390 	}
2391 
2392 	ttc->Print = print_proc;
2393 	ttc->Param = param;
2394 	ttc->ErrorCode = ERR_NO_ERROR;
2395 
2396 	TtPrint(ttc->Param, ttc->Print, _UU("TTC_INIT"));
2397 
2398 	ttc->Thread = NewThread(TtcThread, ttc);
2399 	WaitThreadInit(ttc->Thread);
2400 
2401 	return ttc;
2402 }
2403 
2404 // Wait for stopping the communication throughput measurement client
FreeTtc(TTC * ttc,TT_RESULT * result)2405 UINT FreeTtc(TTC *ttc, TT_RESULT *result)
2406 {
2407 	UINT ret;
2408 	// Validate arguments
2409 	if (ttc == NULL)
2410 	{
2411 		return ERR_INVALID_PARAMETER;
2412 	}
2413 
2414 	WaitThread(ttc->Thread, INFINITE);
2415 	ReleaseThread(ttc->Thread);
2416 
2417 	TtPrint(ttc->Param, ttc->Print, _UU("TTC_FREE"));
2418 
2419 	ret = ttc->ErrorCode;
2420 
2421 	if (ret == ERR_NO_ERROR)
2422 	{
2423 		if (result != NULL)
2424 		{
2425 			Copy(result, &ttc->Result, sizeof(TT_RESULT));
2426 		}
2427 	}
2428 
2429 	ReleaseEvent(ttc->InitedEvent);
2430 
2431 	Free(ttc);
2432 
2433 	return ret;
2434 }
2435 
2436 // Start the communication throughput measurement server
NewTts(UINT port,void * param,TT_PRINT_PROC * print_proc)2437 TTS *NewTts(UINT port, void *param, TT_PRINT_PROC *print_proc)
2438 {
2439 	TTS *tts;
2440 	THREAD *t;
2441 
2442 	tts = ZeroMalloc(sizeof(TTS));
2443 	tts->Port = port;
2444 	tts->Param = param;
2445 	tts->Print = print_proc;
2446 
2447 	TtPrint(param, print_proc, _UU("TTS_INIT"));
2448 
2449 	tts->WorkerList = NewList(NULL);
2450 
2451 	// Creating a thread
2452 	t = NewThread(TtsListenThread, tts);
2453 	WaitThreadInit(t);
2454 
2455 	tts->Thread = t;
2456 
2457 	return tts;
2458 }
2459 
2460 // Wait for stopping the communication throughput measurement server
FreeTts(TTS * tts)2461 UINT FreeTts(TTS *tts)
2462 {
2463 	UINT ret;
2464 	// Validate arguments
2465 	if (tts == NULL)
2466 	{
2467 		return ERR_INVALID_PARAMETER;
2468 	}
2469 
2470 	TtPrint(tts->Param, tts->Print, _UU("TTS_STOP_INIT"));
2471 
2472 	tts->Halt = true;
2473 	Disconnect(tts->ListenSocket);
2474 	ReleaseSock(tts->ListenSocket);
2475 	Disconnect(tts->ListenSocketV6);
2476 	ReleaseSock(tts->ListenSocketV6);
2477 
2478 	// Wait for the termination of the thread
2479 	WaitThread(tts->Thread, INFINITE);
2480 
2481 	ReleaseThread(tts->Thread);
2482 
2483 	TtPrint(tts->Param, tts->Print, _UU("TTS_STOP_FINISHED"));
2484 
2485 	ret = tts->ErrorCode;
2486 
2487 	ReleaseList(tts->WorkerList);
2488 
2489 	Free(tts);
2490 
2491 	return ret;
2492 }
2493 
2494 // Show the measurement tools prompt
PtTrafficPrintProc(void * param,wchar_t * str)2495 void PtTrafficPrintProc(void *param, wchar_t *str)
2496 {
2497 	CONSOLE *c;
2498 	// Validate arguments
2499 	if (param == NULL || str == NULL)
2500 	{
2501 		return;
2502 	}
2503 
2504 	c = (CONSOLE *)param;
2505 
2506 	if (c->ConsoleType == CONSOLE_LOCAL)
2507 	{
2508 		Lock(c->OutputLock);
2509 		{
2510 			wchar_t tmp[MAX_SIZE];
2511 
2512 			// Display only if the local console
2513 			// (Can not be displayed because threads aren't synchronized otherwise?)
2514 			UniStrCpy(tmp, sizeof(tmp), str);
2515 			if (UniEndWith(str, L"\n") == false)
2516 			{
2517 				UniStrCat(tmp, sizeof(tmp), L"\n");
2518 			}
2519 			UniPrint(L"%s", tmp);
2520 		}
2521 		Unlock(c->OutputLock);
2522 	}
2523 }
2524 
2525 // Display the communication throughput results
TtcPrintResult(CONSOLE * c,TT_RESULT * res)2526 void TtcPrintResult(CONSOLE *c, TT_RESULT *res)
2527 {
2528 	CT *ct;
2529 	wchar_t tmp[MAX_SIZE];
2530 	wchar_t tmp1[MAX_SIZE];
2531 	wchar_t tmp2[MAX_SIZE];
2532 	char str[MAX_SIZE];
2533 	// Validate arguments
2534 	if (c == NULL || res == NULL)
2535 	{
2536 		return;
2537 	}
2538 
2539 	c->Write(c, _UU("TTC_RES_TITLE"));
2540 
2541 	ct = CtNew();
2542 	CtInsertColumn(ct, _UU("TTC_RES_COLUMN_1"), false);
2543 	CtInsertColumn(ct, _UU("TTC_RES_COLUMN_2"), true);
2544 	CtInsertColumn(ct, _UU("TTC_RES_COLUMN_3"), true);
2545 
2546 	// Time that was used to measure
2547 	GetSpanStrMilli(str, sizeof(str), res->Span);
2548 	StrToUni(tmp, sizeof(tmp), str);
2549 	CtInsert(ct, _UU("TTC_RES_SPAN"), tmp, L"");
2550 
2551 	// Correct the data for Ethernet frame
2552 	CtInsert(ct, _UU("TTC_RES_ETHER"), res->Raw ? _UU("SEC_NO") : _UU("SEC_YES"), L"");
2553 
2554 	// Amount of communication data of download direction
2555 	ToStr3(str, sizeof(str), res->NumBytesDownload);
2556 	UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);
2557 	ToStrByte1000(str, sizeof(str), res->NumBytesDownload);
2558 	StrToUni(tmp2, sizeof(tmp2), str);
2559 	CtInsert(ct, _UU("TTC_RES_BYTES_DOWNLOAD"), tmp1, tmp2);
2560 
2561 	// Amount of communication data of upload direction
2562 	ToStr3(str, sizeof(str), res->NumBytesUpload);
2563 	UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);
2564 	ToStrByte1000(str, sizeof(str), res->NumBytesUpload);
2565 	StrToUni(tmp2, sizeof(tmp2), str);
2566 	CtInsert(ct, _UU("TTC_RES_BYTES_UPLOAD"), tmp1, tmp2);
2567 
2568 	// Total amount of communication data
2569 	ToStr3(str, sizeof(str), res->NumBytesTotal);
2570 	UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);
2571 	ToStrByte1000(str, sizeof(str), res->NumBytesTotal);
2572 	StrToUni(tmp2, sizeof(tmp2), str);
2573 	CtInsert(ct, _UU("TTC_RES_BYTES_TOTAL"), tmp1, tmp2);
2574 
2575 	// Calculate the total throughput of input and output of the relay equipment
2576 	CtInsert(ct, _UU("TTC_RES_DOUBLE"), (res->Double == false) ? _UU("SEC_NO") : _UU("SEC_YES"), L"");
2577 
2578 	// Average throughput of download direction
2579 	ToStr3(str, sizeof(str), res->BpsDownload);
2580 	UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);
2581 	ToStrByte1000(str, sizeof(str), res->BpsDownload);
2582 	ReplaceStr(str, sizeof(str), str, "Bytes", "bps");
2583 	StrToUni(tmp2, sizeof(tmp2), str);
2584 	CtInsert(ct, _UU("TTC_RES_BPS_DOWNLOAD"), tmp1, tmp2);
2585 
2586 	// Average throughput of upload direction
2587 	ToStr3(str, sizeof(str), res->BpsUpload);
2588 	UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);
2589 	ToStrByte1000(str, sizeof(str), res->BpsUpload);
2590 	ReplaceStr(str, sizeof(str), str, "Bytes", "bps");
2591 	StrToUni(tmp2, sizeof(tmp2), str);
2592 	CtInsert(ct, _UU("TTC_RES_BPS_UPLOAD"), tmp1, tmp2);
2593 
2594 	// Total average throughput
2595 	ToStr3(str, sizeof(str), res->BpsTotal);
2596 	UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);
2597 	ToStrByte1000(str, sizeof(str), res->BpsTotal);
2598 	ReplaceStr(str, sizeof(str), str, "Bytes", "bps");
2599 	StrToUni(tmp2, sizeof(tmp2), str);
2600 	CtInsert(ct, _UU("TTC_RES_BPS_TOTAL"), tmp1, tmp2);
2601 
2602 	CtFree(ct, c);
2603 }
2604 
2605 // Execute the communication throughput measurement tool server
PtTrafficServer(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)2606 UINT PtTrafficServer(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
2607 {
2608 	LIST *o;
2609 	UINT ret = ERR_NO_ERROR;
2610 	UINT port;
2611 	bool nohup;
2612 	TTS *tts;
2613 	PARAM args[] =
2614 	{
2615 		{"[port]", NULL, NULL, NULL, NULL},
2616 		{"NOHUP", NULL, NULL, NULL, NULL},
2617 	};
2618 
2619 	// Get the parameter list
2620 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
2621 	if (o == NULL)
2622 	{
2623 		return ERR_INVALID_PARAMETER;
2624 	}
2625 
2626 	port = GetParamInt(o, "[port]");
2627 	if (port == 0)
2628 	{
2629 		port = TRAFFIC_DEFAULT_PORT;
2630 	}
2631 
2632 	nohup = GetParamYes(o, "nohup");
2633 
2634 	tts = NewTts(port, c, PtTrafficPrintProc);
2635 
2636 	if (nohup)
2637 	{
2638 		while (true)
2639 		{
2640 			SleepThread(10000);
2641 		}
2642 	}
2643 
2644 	c->Write(c, _UU("TTS_ENTER_TO_EXIT"));
2645 
2646 	Free(c->ReadLine(c, L"", true));
2647 
2648 	ret = tts->ErrorCode;
2649 
2650 	FreeTts(tts);
2651 
2652 	if (ret != ERR_NO_ERROR)
2653 	{
2654 		CmdPrintError(c, ret);
2655 	}
2656 
2657 	// Release of the parameter list
2658 	FreeParamValueList(o);
2659 
2660 	return ret;
2661 }
2662 
2663 // Execute the communication throughput measurement tool client
PtTrafficClient(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)2664 UINT PtTrafficClient(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
2665 {
2666 	TTC *ttc;
2667 	LIST *o;
2668 	UINT ret = ERR_NO_ERROR;
2669 	char *host = NULL;
2670 	UINT port;
2671 	UINT num, type;
2672 	bool dbl = false, raw = false;
2673 	UINT64 span;
2674 	// Parameter list that can be specified
2675 	CMD_EVAL_MIN_MAX minmax =
2676 	{
2677 		"CMD_TrafficClient_EVAL_NUMTCP",
2678 		0, TRAFFIC_NUMTCP_MAX,
2679 	};
2680 	PARAM args[] =
2681 	{
2682 		{"[host:port]", CmdPrompt, _UU("CMD_TrafficClient_PROMPT_HOST"), CmdEvalNotEmpty, NULL},
2683 		{"NUMTCP", NULL, NULL, CmdEvalMinMax, &minmax},
2684 		{"TYPE", NULL, NULL, NULL, NULL},
2685 		{"SPAN", NULL, NULL, NULL, NULL},
2686 		{"DOUBLE", NULL, NULL, NULL, NULL},
2687 		{"RAW", NULL, NULL, NULL, NULL},
2688 	};
2689 
2690 	// Get the parameter list
2691 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
2692 	if (o == NULL)
2693 	{
2694 		return ERR_INVALID_PARAMETER;
2695 	}
2696 
2697 	if (ParseHostPort(GetParamStr(o, "[host:port]"), &host, &port, TRAFFIC_DEFAULT_PORT) == false)
2698 	{
2699 		c->Write(c, _UU("CMD_TrafficClient_ERROR_HOSTPORT"));
2700 		ret = ERR_INVALID_PARAMETER;
2701 	}
2702 	else
2703 	{
2704 		char *s;
2705 		UINT i;
2706 
2707 		Trim(host);
2708 
2709 		num = GetParamInt(o, "NUMTCP");
2710 		if (num == 0)
2711 		{
2712 			num = TRAFFIC_NUMTCP_DEFAULT;
2713 		}
2714 		s = GetParamStr(o, "TYPE");
2715 
2716 		if (StartWith("download", s))
2717 		{
2718 			type = TRAFFIC_TYPE_DOWNLOAD;
2719 		}
2720 		else if (StartWith("upload", s))
2721 		{
2722 			type = TRAFFIC_TYPE_UPLOAD;
2723 		}
2724 		else
2725 		{
2726 			type = TRAFFIC_TYPE_FULL;
2727 		}
2728 
2729 		i = GetParamInt(o, "SPAN");
2730 
2731 		if (i == 0)
2732 		{
2733 			i = TRAFFIC_SPAN_DEFAULT;
2734 		}
2735 
2736 		span = (UINT64)i * 1000ULL;
2737 
2738 		dbl = GetParamYes(o, "DOUBLE");
2739 		raw = GetParamYes(o, "RAW");
2740 
2741 		if (type == TRAFFIC_TYPE_FULL)
2742 		{
2743 			if ((num % 2) != 0)
2744 			{
2745 				ret = ERR_INVALID_PARAMETER;
2746 				c->Write(c, _UU("CMD_TrafficClient_ERROR_NUMTCP"));
2747 			}
2748 		}
2749 
2750 		if (ret == ERR_NO_ERROR)
2751 		{
2752 			TT_RESULT result;
2753 			ttc = NewTtc(host, port, num, type, span, dbl, raw, PtTrafficPrintProc, c);
2754 
2755 			if (c->ConsoleType == CONSOLE_LOCAL)
2756 			{
2757 				if (c->Param != NULL && (((LOCAL_CONSOLE_PARAM *)c->Param)->InBuf == NULL))
2758 				{
2759 //					c->Write(c, _UU("TTC_ENTER_TO_EXIT"));
2760 //					GetLine(NULL, 0);
2761 //					StopTtc(ttc);
2762 				}
2763 			}
2764 
2765 
2766 			Zero(&result, sizeof(result));
2767 			ret = FreeTtc(ttc, &result);
2768 
2769 			if (ret == ERR_NO_ERROR)
2770 			{
2771 				TtcPrintResult(c, &result);
2772 			}
2773 		}
2774 	}
2775 
2776 	if (ret != ERR_NO_ERROR)
2777 	{
2778 		CmdPrintError(c, ret);
2779 	}
2780 
2781 	// Release of the parameter list
2782 	FreeParamValueList(o);
2783 
2784 	Free(host);
2785 
2786 	return ret;
2787 }
2788 
2789 // Certificate easy creation tool (1024 bit)
PtMakeCert(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)2790 UINT PtMakeCert(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
2791 {
2792 	LIST *o;
2793 	UINT ret = ERR_NO_ERROR;
2794 	X *x = NULL;
2795 	K *pub = NULL;
2796 	K *pri = NULL;
2797 	NAME *n;
2798 	X_SERIAL *x_serial = NULL;
2799 	BUF *buf;
2800 	UINT days;
2801 	X *root_x = NULL;
2802 	K *root_k = NULL;
2803 	// Parameter list that can be specified
2804 	CMD_EVAL_MIN_MAX minmax =
2805 	{
2806 		"CMD_MakeCert_EVAL_EXPIRES",
2807 		0,
2808 		10950,
2809 	};
2810 	PARAM args[] =
2811 	{
2812 		{"CN", CmdPrompt, _UU("CMD_MakeCert_PROMPT_CN"), NULL, NULL},
2813 		{"O", CmdPrompt, _UU("CMD_MakeCert_PROMPT_O"), NULL, NULL},
2814 		{"OU", CmdPrompt, _UU("CMD_MakeCert_PROMPT_OU"), NULL, NULL},
2815 		{"C", CmdPrompt, _UU("CMD_MakeCert_PROMPT_C"), NULL, NULL},
2816 		{"ST", CmdPrompt, _UU("CMD_MakeCert_PROMPT_ST"), NULL, NULL},
2817 		{"L", CmdPrompt, _UU("CMD_MakeCert_PROMPT_L"), NULL, NULL},
2818 		{"SERIAL", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SERIAL"), NULL, NULL},
2819 		{"EXPIRES", CmdPrompt, _UU("CMD_MakeCert_PROMPT_EXPIRES"), CmdEvalMinMax, &minmax},
2820 		{"SIGNCERT", NULL, NULL, CmdEvalIsFile, NULL},
2821 		{"SIGNKEY", NULL, NULL, CmdEvalIsFile, NULL},
2822 		{"SAVECERT", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},
2823 		{"SAVEKEY", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVEKEY"), CmdEvalNotEmpty, NULL},
2824 	};
2825 
2826 	// Get the parameter list
2827 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
2828 	if (o == NULL)
2829 	{
2830 		return ERR_INVALID_PARAMETER;
2831 	}
2832 
2833 	if (IsEmptyStr(GetParamStr(o, "SIGNCERT")) == false && IsEmptyStr(GetParamStr(o, "SIGNKEY")) == false)
2834 	{
2835 		root_x = FileToXW(GetParamUniStr(o, "SIGNCERT"));
2836 		root_k = FileToKW(GetParamUniStr(o, "SIGNKEY"), true, NULL);
2837 
2838 		if (root_x == NULL || root_k == NULL || CheckXandK(root_x, root_k) == false)
2839 		{
2840 			ret = ERR_INTERNAL_ERROR;
2841 
2842 			c->Write(c, _UU("CMD_MakeCert_ERROR_SIGNKEY"));
2843 		}
2844 	}
2845 
2846 	if (ret == ERR_NO_ERROR)
2847 	{
2848 		buf = StrToBin(GetParamStr(o, "SERIAL"));
2849 		if (buf != NULL && buf->Size >= 1)
2850 		{
2851 			x_serial = NewXSerial(buf->Buf, buf->Size);
2852 		}
2853 		FreeBuf(buf);
2854 
2855 		n = NewName(GetParamUniStr(o, "CN"), GetParamUniStr(o, "O"), GetParamUniStr(o, "OU"),
2856 			GetParamUniStr(o, "C"), GetParamUniStr(o, "ST"), GetParamUniStr(o, "L"));
2857 
2858 		days = GetParamInt(o, "EXPIRES");
2859 		if (days == 0)
2860 		{
2861 			days = 3650;
2862 		}
2863 
2864 		RsaGen(&pri, &pub, 1024);
2865 
2866 		if (root_x == NULL)
2867 		{
2868 			x = NewRootX(pub, pri, n, days, x_serial);
2869 		}
2870 		else
2871 		{
2872 			x = NewX(pub, root_k, root_x, n, days, x_serial);
2873 		}
2874 
2875 		FreeXSerial(x_serial);
2876 		FreeName(n);
2877 
2878 		if (x == NULL)
2879 		{
2880 			ret = ERR_INTERNAL_ERROR;
2881 			c->Write(c, _UU("CMD_MakeCert_ERROR_GEN_FAILED"));
2882 		}
2883 		else
2884 		{
2885 			if (XToFileW(x, GetParamUniStr(o, "SAVECERT"), true) == false)
2886 			{
2887 				c->Write(c, _UU("CMD_SAVECERT_FAILED"));
2888 			}
2889 			else if (KToFileW(pri, GetParamUniStr(o, "SAVEKEY"), true, NULL) == false)
2890 			{
2891 				c->Write(c, _UU("CMD_SAVEKEY_FAILED"));
2892 			}
2893 		}
2894 	}
2895 
2896 	if (ret != ERR_NO_ERROR)
2897 	{
2898 		// Error has occurred
2899 		CmdPrintError(c, ret);
2900 	}
2901 
2902 	// Release of the parameter list
2903 	FreeParamValueList(o);
2904 
2905 	FreeX(root_x);
2906 	FreeK(root_k);
2907 
2908 	FreeX(x);
2909 	FreeK(pri);
2910 	FreeK(pub);
2911 
2912 	return ret;
2913 }
2914 
2915 // Certificate easy creation tool (2048 bit)
PtMakeCert2048(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)2916 UINT PtMakeCert2048(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
2917 {
2918 	LIST *o;
2919 	UINT ret = ERR_NO_ERROR;
2920 	X *x = NULL;
2921 	K *pub = NULL;
2922 	K *pri = NULL;
2923 	NAME *n;
2924 	X_SERIAL *x_serial = NULL;
2925 	BUF *buf;
2926 	UINT days;
2927 	X *root_x = NULL;
2928 	K *root_k = NULL;
2929 	// Parameter list that can be specified
2930 	CMD_EVAL_MIN_MAX minmax =
2931 	{
2932 		"CMD_MakeCert_EVAL_EXPIRES",
2933 		0,
2934 		10950,
2935 	};
2936 	PARAM args[] =
2937 	{
2938 		{"CN", CmdPrompt, _UU("CMD_MakeCert_PROMPT_CN"), NULL, NULL},
2939 		{"O", CmdPrompt, _UU("CMD_MakeCert_PROMPT_O"), NULL, NULL},
2940 		{"OU", CmdPrompt, _UU("CMD_MakeCert_PROMPT_OU"), NULL, NULL},
2941 		{"C", CmdPrompt, _UU("CMD_MakeCert_PROMPT_C"), NULL, NULL},
2942 		{"ST", CmdPrompt, _UU("CMD_MakeCert_PROMPT_ST"), NULL, NULL},
2943 		{"L", CmdPrompt, _UU("CMD_MakeCert_PROMPT_L"), NULL, NULL},
2944 		{"SERIAL", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SERIAL"), NULL, NULL},
2945 		{"EXPIRES", CmdPrompt, _UU("CMD_MakeCert_PROMPT_EXPIRES"), CmdEvalMinMax, &minmax},
2946 		{"SIGNCERT", NULL, NULL, CmdEvalIsFile, NULL},
2947 		{"SIGNKEY", NULL, NULL, CmdEvalIsFile, NULL},
2948 		{"SAVECERT", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},
2949 		{"SAVEKEY", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVEKEY"), CmdEvalNotEmpty, NULL},
2950 	};
2951 
2952 	// Get the parameter list
2953 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
2954 	if (o == NULL)
2955 	{
2956 		return ERR_INVALID_PARAMETER;
2957 	}
2958 
2959 	if (IsEmptyStr(GetParamStr(o, "SIGNCERT")) == false && IsEmptyStr(GetParamStr(o, "SIGNKEY")) == false)
2960 	{
2961 		root_x = FileToXW(GetParamUniStr(o, "SIGNCERT"));
2962 		root_k = FileToKW(GetParamUniStr(o, "SIGNKEY"), true, NULL);
2963 
2964 		if (root_x == NULL || root_k == NULL || CheckXandK(root_x, root_k) == false)
2965 		{
2966 			ret = ERR_INTERNAL_ERROR;
2967 
2968 			c->Write(c, _UU("CMD_MakeCert_ERROR_SIGNKEY"));
2969 		}
2970 	}
2971 
2972 	if (ret == ERR_NO_ERROR)
2973 	{
2974 		buf = StrToBin(GetParamStr(o, "SERIAL"));
2975 		if (buf != NULL && buf->Size >= 1)
2976 		{
2977 			x_serial = NewXSerial(buf->Buf, buf->Size);
2978 		}
2979 		FreeBuf(buf);
2980 
2981 		n = NewName(GetParamUniStr(o, "CN"), GetParamUniStr(o, "O"), GetParamUniStr(o, "OU"),
2982 			GetParamUniStr(o, "C"), GetParamUniStr(o, "ST"), GetParamUniStr(o, "L"));
2983 
2984 		days = GetParamInt(o, "EXPIRES");
2985 		if (days == 0)
2986 		{
2987 			days = 3650;
2988 		}
2989 
2990 		RsaGen(&pri, &pub, 2048);
2991 
2992 		if (root_x == NULL)
2993 		{
2994 			x = NewRootX(pub, pri, n, days, x_serial);
2995 		}
2996 		else
2997 		{
2998 			x = NewX(pub, root_k, root_x, n, days, x_serial);
2999 		}
3000 
3001 		FreeXSerial(x_serial);
3002 		FreeName(n);
3003 
3004 		if (x == NULL)
3005 		{
3006 			ret = ERR_INTERNAL_ERROR;
3007 			c->Write(c, _UU("CMD_MakeCert_ERROR_GEN_FAILED"));
3008 		}
3009 		else
3010 		{
3011 			if (XToFileW(x, GetParamUniStr(o, "SAVECERT"), true) == false)
3012 			{
3013 				c->Write(c, _UU("CMD_SAVECERT_FAILED"));
3014 			}
3015 			else if (KToFileW(pri, GetParamUniStr(o, "SAVEKEY"), true, NULL) == false)
3016 			{
3017 				c->Write(c, _UU("CMD_SAVEKEY_FAILED"));
3018 			}
3019 		}
3020 	}
3021 
3022 	if (ret != ERR_NO_ERROR)
3023 	{
3024 		// Error has occurred
3025 		CmdPrintError(c, ret);
3026 	}
3027 
3028 	// Release of the parameter list
3029 	FreeParamValueList(o);
3030 
3031 	FreeX(root_x);
3032 	FreeK(root_k);
3033 
3034 	FreeX(x);
3035 	FreeK(pri);
3036 	FreeK(pub);
3037 
3038 	return ret;
3039 }
3040 
3041 // Client management tool main
PcMain(PC * pc)3042 void PcMain(PC *pc)
3043 {
3044 	char prompt[MAX_SIZE];
3045 	wchar_t tmp[MAX_SIZE];
3046 	// Validate arguments
3047 	if (pc == NULL)
3048 	{
3049 		return;
3050 	}
3051 
3052 	// Display a message that the connection has been made
3053 	UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_CLIENT_CONNECTED"),
3054 		pc->ServerName);
3055 	pc->Console->Write(pc->Console, tmp);
3056 	pc->Console->Write(pc->Console, L"");
3057 
3058 	while (true)
3059 	{
3060 		// Definition of command
3061 		CMD cmd[] =
3062 		{
3063 			{"About", PsAbout},
3064 			{"Check", PtCheck},
3065 			{"VersionGet", PcVersionGet},
3066 			{"PasswordSet", PcPasswordSet},
3067 			{"PasswordGet", PcPasswordGet},
3068 			{"CertList", PcCertList},
3069 			{"CertAdd", PcCertAdd},
3070 			{"CertDelete", PcCertDelete},
3071 			{"CertGet", PcCertGet},
3072 			{"SecureList", PcSecureList},
3073 			{"SecureSelect", PcSecureSelect},
3074 			{"SecureGet", PcSecureGet},
3075 			{"NicCreate", PcNicCreate},
3076 			{"NicDelete", PcNicDelete},
3077 			{"NicUpgrade", PcNicUpgrade},
3078 			{"NicGetSetting", PcNicGetSetting},
3079 			{"NicSetSetting", PcNicSetSetting},
3080 			{"NicEnable", PcNicEnable},
3081 			{"NicDisable", PcNicDisable},
3082 			{"NicList", PcNicList},
3083 			{"AccountList", PcAccountList},
3084 			{"AccountCreate", PcAccountCreate},
3085 			{"AccountSet", PcAccountSet},
3086 			{"AccountGet", PcAccountGet},
3087 			{"AccountDelete", PcAccountDelete},
3088 			{"AccountUsernameSet", PcAccountUsernameSet},
3089 			{"AccountAnonymousSet", PcAccountAnonymousSet},
3090 			{"AccountPasswordSet", PcAccountPasswordSet},
3091 			{"AccountCertSet", PcAccountCertSet},
3092 			{"AccountCertGet", PcAccountCertGet},
3093 			{"AccountEncryptDisable", PcAccountEncryptDisable},
3094 			{"AccountEncryptEnable", PcAccountEncryptEnable},
3095 			{"AccountCompressEnable", PcAccountCompressEnable},
3096 			{"AccountCompressDisable", PcAccountCompressDisable},
3097 			{"AccountProxyNone", PcAccountProxyNone},
3098 			{"AccountProxyHttp", PcAccountProxyHttp},
3099 			{"AccountProxySocks", PcAccountProxySocks},
3100 			{"AccountServerCertEnable", PcAccountServerCertEnable},
3101 			{"AccountServerCertDisable", PcAccountServerCertDisable},
3102 			{"AccountServerCertSet", PcAccountServerCertSet},
3103 			{"AccountServerCertDelete", PcAccountServerCertDelete},
3104 			{"AccountServerCertGet", PcAccountServerCertGet},
3105 			{"AccountDetailSet", PcAccountDetailSet},
3106 			{"AccountRename", PcAccountRename},
3107 			{"AccountConnect", PcAccountConnect},
3108 			{"AccountDisconnect", PcAccountDisconnect},
3109 			{"AccountStatusGet", PcAccountStatusGet},
3110 			{"AccountNicSet", PcAccountNicSet},
3111 			{"AccountStatusShow", PcAccountStatusShow},
3112 			{"AccountStatusHide", PcAccountStatusHide},
3113 			{"AccountSecureCertSet", PcAccountSecureCertSet},
3114 			{"AccountRetrySet", PcAccountRetrySet},
3115 			{"AccountStartupSet", PcAccountStartupSet},
3116 			{"AccountStartupRemove", PcAccountStartupRemove},
3117 			{"AccountExport", PcAccountExport},
3118 			{"AccountImport", PcAccountImport},
3119 			{"RemoteEnable", PcRemoteEnable},
3120 			{"RemoteDisable", PcRemoteDisable},
3121 			{"KeepEnable", PcKeepEnable},
3122 			{"KeepDisable", PcKeepDisable},
3123 			{"KeepSet", PcKeepSet},
3124 			{"KeepGet", PcKeepGet},
3125 			{"MakeCert", PtMakeCert},
3126 			{"MakeCert2048", PtMakeCert2048},
3127 			{"TrafficClient", PtTrafficClient},
3128 			{"TrafficServer", PtTrafficServer},
3129 		};
3130 
3131 		// Generate a prompt
3132 		StrCpy(prompt, sizeof(prompt), "VPN Client>");
3133 
3134 		if (DispatchNextCmdEx(pc->Console, pc->CmdLine, prompt, cmd, sizeof(cmd) / sizeof(cmd[0]), pc) == false)
3135 		{
3136 			break;
3137 		}
3138 		pc->LastError = pc->Console->RetCode;
3139 
3140 		if (pc->LastError == ERR_NO_ERROR && pc->Console->ConsoleType != CONSOLE_CSV)
3141 		{
3142 			pc->Console->Write(pc->Console, _UU("CMD_MSG_OK"));
3143 			pc->Console->Write(pc->Console, L"");
3144 		}
3145 
3146 		if (pc->CmdLine != NULL)
3147 		{
3148 			break;
3149 		}
3150 	}
3151 }
3152 
3153 // Retrieve the version information of VPN Client service
PcVersionGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3154 UINT PcVersionGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3155 {
3156 	LIST *o;
3157 	PC *pc = (PC *)param;
3158 	UINT ret = ERR_NO_ERROR;
3159 	RPC_CLIENT_VERSION t;
3160 
3161 	// Get the parameter list
3162 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
3163 	if (o == NULL)
3164 	{
3165 		return ERR_INVALID_PARAMETER;
3166 	}
3167 
3168 	// RPC call
3169 	Zero(&t, sizeof(t));
3170 
3171 	ret = CcGetClientVersion(pc->RemoteClient, &t);
3172 
3173 	if (ret == ERR_NO_ERROR)
3174 	{
3175 		wchar_t tmp[MAX_SIZE];
3176 		CT *ct;
3177 
3178 		// Success
3179 		ct = CtNewStandard();
3180 
3181 		StrToUni(tmp, sizeof(tmp), t.ClientProductName);
3182 		CtInsert(ct, _UU("CMD_VersionGet_1"), tmp);
3183 
3184 		StrToUni(tmp, sizeof(tmp), t.ClientVersionString);
3185 		CtInsert(ct, _UU("CMD_VersionGet_2"), tmp);
3186 
3187 		StrToUni(tmp, sizeof(tmp), t.ClientBuildInfoString);
3188 		CtInsert(ct, _UU("CMD_VersionGet_3"), tmp);
3189 
3190 		UniToStru(tmp, t.ProcessId);
3191 		CtInsert(ct, _UU("CMD_VersionGet_4"), tmp);
3192 
3193 		StrToUni(tmp, sizeof(tmp), OsTypeToStr(t.OsType));
3194 		CtInsert(ct, _UU("CMD_VersionGet_5"), tmp);
3195 
3196 		CtFree(ct, c);
3197 	}
3198 
3199 	if (ret != ERR_NO_ERROR)
3200 	{
3201 		// Error has occurred
3202 		CmdPrintError(c, ret);
3203 	}
3204 
3205 	// Release the parameter list
3206 	FreeParamValueList(o);
3207 
3208 	return ret;
3209 }
3210 
3211 // Set a password to connect to the VPN Client Service
PcPasswordSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3212 UINT PcPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3213 {
3214 	LIST *o;
3215 	PC *pc = (PC *)param;
3216 	UINT ret = ERR_NO_ERROR;
3217 	RPC_CLIENT_PASSWORD t;
3218 	// Parameter list that can be specified
3219 	PARAM args[] =
3220 	{
3221 		{"[password]", CmdPromptChoosePassword, NULL, NULL, NULL},
3222 		{"REMOTEONLY", NULL, NULL, NULL, NULL},
3223 	};
3224 
3225 	// Get the parameter list
3226 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3227 	if (o == NULL)
3228 	{
3229 		return ERR_INVALID_PARAMETER;
3230 	}
3231 
3232 	// RPC call
3233 	Zero(&t, sizeof(t));
3234 	StrCpy(t.Password, sizeof(t.Password), GetParamStr(o, "[password]"));
3235 	t.PasswordRemoteOnly = GetParamYes(o, "REMOTEONLY");
3236 
3237 	ret = CcSetPassword(pc->RemoteClient, &t);
3238 
3239 	if (ret == ERR_NO_ERROR)
3240 	{
3241 		// Success
3242 	}
3243 
3244 	if (ret != ERR_NO_ERROR)
3245 	{
3246 		// Error has occurred
3247 		CmdPrintError(c, ret);
3248 	}
3249 
3250 	// Release of the parameter list
3251 	FreeParamValueList(o);
3252 
3253 	return ret;
3254 }
3255 
3256 // Get the settings of the password to connect to the VPN Client service
PcPasswordGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3257 UINT PcPasswordGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3258 {
3259 	LIST *o;
3260 	PC *pc = (PC *)param;
3261 	UINT ret = ERR_NO_ERROR;
3262 	RPC_CLIENT_PASSWORD_SETTING t;
3263 
3264 	// Get the parameter list
3265 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
3266 	if (o == NULL)
3267 	{
3268 		return ERR_INVALID_PARAMETER;
3269 	}
3270 
3271 	// RPC call
3272 	Zero(&t, sizeof(t));
3273 
3274 	ret = CcGetPasswordSetting(pc->RemoteClient, &t);
3275 
3276 	if (ret == ERR_NO_ERROR)
3277 	{
3278 		// Success
3279 		CT *ct = CtNewStandard();
3280 
3281 		CtInsert(ct, _UU("CMD_PasswordGet_1"),
3282 			t.IsPasswordPresented ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
3283 
3284 		CtInsert(ct, _UU("CMD_PasswordGet_2"),
3285 			t.PasswordRemoteOnly ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
3286 
3287 		CtFree(ct, c);
3288 	}
3289 
3290 	if (ret != ERR_NO_ERROR)
3291 	{
3292 		// Error has occurred
3293 		CmdPrintError(c, ret);
3294 	}
3295 
3296 	// Release the parameter list
3297 	FreeParamValueList(o);
3298 
3299 	return ret;
3300 }
3301 
3302 // Get the list of certificates of the trusted certification authority
PcCertList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3303 UINT PcCertList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3304 {
3305 	LIST *o;
3306 	PC *pc = (PC *)param;
3307 	UINT ret = ERR_NO_ERROR;
3308 	RPC_CLIENT_ENUM_CA t;
3309 
3310 	// Get the parameter list
3311 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
3312 	if (o == NULL)
3313 	{
3314 		return ERR_INVALID_PARAMETER;
3315 	}
3316 
3317 	// RPC call
3318 	Zero(&t, sizeof(t));
3319 
3320 	ret = CcEnumCa(pc->RemoteClient, &t);
3321 
3322 	if (ret == ERR_NO_ERROR)
3323 	{
3324 		// Success
3325 		UINT i;
3326 		CT *ct = CtNewStandard();
3327 
3328 		for (i = 0;i < t.NumItem;i++)
3329 		{
3330 			wchar_t tmp[MAX_SIZE];
3331 			wchar_t tmp2[64];
3332 			RPC_CLIENT_ENUM_CA_ITEM *e = t.Items[i];
3333 
3334 			GetDateStrEx64(tmp, sizeof(tmp), SystemToLocal64(e->Expires), NULL);
3335 
3336 			UniToStru(tmp2, e->Key);
3337 
3338 			CtInsert(ct, _UU("CMD_CAList_COLUMN_ID"), tmp2);
3339 			CtInsert(ct, _UU("CM_CERT_COLUMN_1"), e->SubjectName);
3340 			CtInsert(ct, _UU("CM_CERT_COLUMN_2"), e->IssuerName);
3341 			CtInsert(ct, _UU("CM_CERT_COLUMN_3"), tmp);
3342 
3343 			if (i != (t.NumItem - 1))
3344 			{
3345 				CtInsert(ct, L"---", L"---");
3346 			}
3347 		}
3348 
3349 		CtFree(ct, c);
3350 
3351 		CiFreeClientEnumCa(&t);
3352 	}
3353 
3354 	if (ret != ERR_NO_ERROR)
3355 	{
3356 		// Error has occurred
3357 		CmdPrintError(c, ret);
3358 	}
3359 
3360 
3361 	// Release of the parameter list
3362 	FreeParamValueList(o);
3363 
3364 	return ret;
3365 }
3366 
3367 // Add a certificate of the trusted certification authority
PcCertAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3368 UINT PcCertAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3369 {
3370 	LIST *o;
3371 	PC *pc = (PC *)param;
3372 	UINT ret = ERR_NO_ERROR;
3373 	RPC_CERT t;
3374 	X *x;
3375 	// Parameter list that can be specified
3376 	PARAM args[] =
3377 	{
3378 		{"[path]", CmdPrompt, _UU("CMD_CAAdd_PROMPT_PATH"), CmdEvalIsFile, NULL},
3379 	};
3380 
3381 	// Get the parameter list
3382 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3383 	if (o == NULL)
3384 	{
3385 		return ERR_INVALID_PARAMETER;
3386 	}
3387 
3388 
3389 	x = FileToXW(GetParamUniStr(o, "[path]"));
3390 
3391 	if (x == NULL)
3392 	{
3393 		FreeParamValueList(o);
3394 		c->Write(c, _UU("CMD_MSG_LOAD_CERT_FAILED"));
3395 		return ERR_INVALID_PARAMETER;
3396 	}
3397 
3398 	// RPC call
3399 	Zero(&t, sizeof(t));
3400 	t.x = x;
3401 
3402 	ret = CcAddCa(pc->RemoteClient, &t);
3403 
3404 	if (ret == ERR_NO_ERROR)
3405 	{
3406 		// Success
3407 	}
3408 
3409 	if (ret != ERR_NO_ERROR)
3410 	{
3411 		// Error has occurred
3412 		CmdPrintError(c, ret);
3413 	}
3414 
3415 	FreeX(x);
3416 
3417 	// Release of the parameter list
3418 	FreeParamValueList(o);
3419 
3420 	return ret;
3421 }
3422 
3423 // Delete the certificate of the trusted certification authority
PcCertDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3424 UINT PcCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3425 {
3426 	LIST *o;
3427 	PC *pc = (PC *)param;
3428 	UINT ret = ERR_NO_ERROR;
3429 	RPC_CLIENT_DELETE_CA t;
3430 	// Parameter list that can be specified
3431 	PARAM args[] =
3432 	{
3433 		{"[id]", CmdPrompt, _UU("CMD_CADelete_PROMPT_ID"), CmdEvalNotEmpty, NULL},
3434 	};
3435 
3436 	// Get the parameter list
3437 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3438 	if (o == NULL)
3439 	{
3440 		return ERR_INVALID_PARAMETER;
3441 	}
3442 
3443 	// RPC call
3444 	Zero(&t, sizeof(t));
3445 	t.Key = GetParamInt(o, "[id]");
3446 
3447 	ret = CcDeleteCa(pc->RemoteClient, &t);
3448 
3449 	if (ret == ERR_NO_ERROR)
3450 	{
3451 		// Success
3452 	}
3453 
3454 	if (ret != ERR_NO_ERROR)
3455 	{
3456 		// Error has occurred
3457 		CmdPrintError(c, ret);
3458 	}
3459 
3460 	// Release of the parameter list
3461 	FreeParamValueList(o);
3462 
3463 	return ret;
3464 }
3465 
3466 // Get the certificate of the trusted certification authority
PcCertGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3467 UINT PcCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3468 {
3469 	LIST *o;
3470 	PC *pc = (PC *)param;
3471 	UINT ret = ERR_NO_ERROR;
3472 	RPC_GET_CA t;
3473 	// Parameter list that can be specified
3474 	PARAM args[] =
3475 	{
3476 		{"[id]", CmdPrompt, _UU("CMD_CAGet_PROMPT_ID"), CmdEvalNotEmpty, NULL},
3477 		{"SAVECERT", CmdPrompt, _UU("CMD_CAGet_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},
3478 	};
3479 
3480 	// Get the parameter list
3481 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3482 	if (o == NULL)
3483 	{
3484 		return ERR_INVALID_PARAMETER;
3485 	}
3486 
3487 	// RPC call
3488 	Zero(&t, sizeof(t));
3489 	t.Key = GetParamInt(o, "[id]");
3490 
3491 	ret = CcGetCa(pc->RemoteClient, &t);
3492 
3493 	if (ret == ERR_NO_ERROR)
3494 	{
3495 		// Success
3496 		if (XToFileW(t.x, GetParamUniStr(o, "SAVECERT"), true))
3497 		{
3498 			// Success
3499 		}
3500 		else
3501 		{
3502 			// Failure
3503 			ret = ERR_INTERNAL_ERROR;
3504 			c->Write(c, _UU("CMD_MSG_SAVE_CERT_FAILED"));
3505 		}
3506 
3507 		CiFreeGetCa(&t);
3508 	}
3509 
3510 	if (ret != ERR_NO_ERROR)
3511 	{
3512 		// Error has occurred
3513 		CmdPrintError(c, ret);
3514 	}
3515 
3516 	// Release of the parameter list
3517 	FreeParamValueList(o);
3518 
3519 	return ret;
3520 }
3521 
3522 // Get the list of the type of smart card that can be used
PcSecureList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3523 UINT PcSecureList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3524 {
3525 	LIST *o;
3526 	PC *pc = (PC *)param;
3527 	UINT ret = ERR_NO_ERROR;
3528 	RPC_CLIENT_ENUM_SECURE t;
3529 
3530 	// Get the parameter list
3531 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
3532 	if (o == NULL)
3533 	{
3534 		return ERR_INVALID_PARAMETER;
3535 	}
3536 
3537 	// RPC call
3538 	Zero(&t, sizeof(t));
3539 
3540 	ret = CcEnumSecure(pc->RemoteClient, &t);
3541 
3542 	if (ret == ERR_NO_ERROR)
3543 	{
3544 		CT *ct;
3545 		UINT i;
3546 		wchar_t tmp1[MAX_SIZE];
3547 		wchar_t tmp2[MAX_SIZE];
3548 		wchar_t tmp4[MAX_SIZE];
3549 		wchar_t *tmp3;
3550 
3551 		// Success
3552 		ct = CtNew();
3553 		CtInsertColumn(ct, _UU("SEC_COLUMN1"), false);
3554 		CtInsertColumn(ct, _UU("SEC_COLUMN2"), false);
3555 		CtInsertColumn(ct, _UU("SEC_COLUMN3"), false);
3556 		CtInsertColumn(ct, _UU("SEC_COLUMN4"), false);
3557 
3558 		for (i = 0;i < t.NumItem;i++)
3559 		{
3560 			RPC_CLIENT_ENUM_SECURE_ITEM *e = t.Items[i];
3561 
3562 			// ID
3563 			UniToStru(tmp1, e->DeviceId);
3564 
3565 			// Device name
3566 			StrToUni(tmp2, sizeof(tmp2), e->DeviceName);
3567 
3568 			// Type
3569 			tmp3 = (e->Type == SECURE_IC_CARD) ? _UU("SEC_SMART_CARD") : _UU("SEC_USB_TOKEN");
3570 
3571 			// Manufacturer
3572 			StrToUni(tmp4, sizeof(tmp4), e->Manufacturer);
3573 
3574 			CtInsert(ct, tmp1, tmp2, tmp3, tmp4);
3575 		}
3576 
3577 		CtFreeEx(ct, c, true);
3578 
3579 		CiFreeClientEnumSecure(&t);
3580 	}
3581 
3582 	if (ret != ERR_NO_ERROR)
3583 	{
3584 		// Error has occurred
3585 		CmdPrintError(c, ret);
3586 	}
3587 
3588 	// Release of the parameter list
3589 	FreeParamValueList(o);
3590 
3591 	return ret;
3592 }
3593 
3594 // Select the type of smart card to be used
PcSecureSelect(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3595 UINT PcSecureSelect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3596 {
3597 	LIST *o;
3598 	PC *pc = (PC *)param;
3599 	UINT ret = ERR_NO_ERROR;
3600 	RPC_USE_SECURE t;
3601 	// Parameter list that can be specified
3602 	PARAM args[] =
3603 	{
3604 		{"[id]", CmdPrompt, _UU("CMD_SecureSelect_PROMPT_ID"), NULL, NULL},
3605 	};
3606 
3607 	// Get the parameter list
3608 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3609 	if (o == NULL)
3610 	{
3611 		return ERR_INVALID_PARAMETER;
3612 	}
3613 
3614 	// RPC call
3615 	Zero(&t, sizeof(t));
3616 	t.DeviceId = GetParamInt(o, "[id]");
3617 
3618 	ret = CcUseSecure(pc->RemoteClient, &t);
3619 
3620 	if (ret == ERR_NO_ERROR)
3621 	{
3622 		// Success
3623 	}
3624 
3625 	if (ret != ERR_NO_ERROR)
3626 	{
3627 		// Error has occurred
3628 		CmdPrintError(c, ret);
3629 	}
3630 
3631 	// Release of the parameter list
3632 	FreeParamValueList(o);
3633 
3634 	return ret;
3635 }
3636 
3637 // Get the type ID of smart card to be used
PcSecureGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3638 UINT PcSecureGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3639 {
3640 	LIST *o;
3641 	PC *pc = (PC *)param;
3642 	UINT ret = ERR_NO_ERROR;
3643 	RPC_USE_SECURE t;
3644 
3645 	// Get the parameter list
3646 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
3647 	if (o == NULL)
3648 	{
3649 		return ERR_INVALID_PARAMETER;
3650 	}
3651 
3652 	// RPC call
3653 	Zero(&t, sizeof(t));
3654 
3655 	ret = CcGetUseSecure(pc->RemoteClient, &t);
3656 
3657 	if (ret == ERR_NO_ERROR)
3658 	{
3659 		// Success
3660 		wchar_t tmp[MAX_SIZE];
3661 
3662 		if (t.DeviceId != 0)
3663 		{
3664 			UniFormat(tmp, sizeof(tmp), _UU("CMD_SecureGet_Print"), t.DeviceId);
3665 		}
3666 		else
3667 		{
3668 			UniStrCpy(tmp, sizeof(tmp), _UU("CMD_SecureGet_NoPrint"));
3669 		}
3670 		c->Write(c, tmp);
3671 	}
3672 
3673 	if (ret != ERR_NO_ERROR)
3674 	{
3675 		// Error has occurred
3676 		CmdPrintError(c, ret);
3677 	}
3678 
3679 	// Release of the parameter list
3680 	FreeParamValueList(o);
3681 
3682 	return ret;
3683 }
3684 
3685 // Create a new virtual LAN card
PcNicCreate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3686 UINT PcNicCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3687 {
3688 	LIST *o;
3689 	PC *pc = (PC *)param;
3690 	UINT ret = ERR_NO_ERROR;
3691 	RPC_CLIENT_CREATE_VLAN t;
3692 	// Parameter list that can be specified
3693 	PARAM args[] =
3694 	{
3695 		{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
3696 	};
3697 
3698 	// Get the parameter list
3699 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3700 	if (o == NULL)
3701 	{
3702 		return ERR_INVALID_PARAMETER;
3703 	}
3704 
3705 	// RPC call
3706 	Zero(&t, sizeof(t));
3707 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
3708 
3709 	ret = CcCreateVLan(pc->RemoteClient, &t);
3710 
3711 	if (ret == ERR_NO_ERROR)
3712 	{
3713 		// Success
3714 	}
3715 
3716 	if (ret != ERR_NO_ERROR)
3717 	{
3718 		// Error has occurred
3719 		CmdPrintError(c, ret);
3720 	}
3721 
3722 	// Release of the parameter list
3723 	FreeParamValueList(o);
3724 
3725 	return ret;
3726 }
3727 
3728 // Delete the virtual LAN card
PcNicDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3729 UINT PcNicDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3730 {
3731 	LIST *o;
3732 	PC *pc = (PC *)param;
3733 	UINT ret = ERR_NO_ERROR;
3734 	RPC_CLIENT_CREATE_VLAN t;
3735 	// Parameter list that can be specified
3736 	PARAM args[] =
3737 	{
3738 		{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
3739 	};
3740 
3741 	// Get the parameter list
3742 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3743 	if (o == NULL)
3744 	{
3745 		return ERR_INVALID_PARAMETER;
3746 	}
3747 
3748 	// RPC call
3749 	Zero(&t, sizeof(t));
3750 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
3751 
3752 	ret = CcDeleteVLan(pc->RemoteClient, &t);
3753 
3754 	if (ret == ERR_NO_ERROR)
3755 	{
3756 		// Success
3757 	}
3758 
3759 	if (ret != ERR_NO_ERROR)
3760 	{
3761 		// Error has occurred
3762 		CmdPrintError(c, ret);
3763 	}
3764 
3765 	// Release of the parameter list
3766 	FreeParamValueList(o);
3767 
3768 	return ret;
3769 }
3770 
3771 // Upgrading the device driver of the virtual LAN card
PcNicUpgrade(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3772 UINT PcNicUpgrade(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3773 {
3774 	LIST *o;
3775 	PC *pc = (PC *)param;
3776 	UINT ret = ERR_NO_ERROR;
3777 	RPC_CLIENT_CREATE_VLAN t;
3778 	// Parameter list that can be specified
3779 	PARAM args[] =
3780 	{
3781 		{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
3782 	};
3783 
3784 	// Get the parameter list
3785 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3786 	if (o == NULL)
3787 	{
3788 		return ERR_INVALID_PARAMETER;
3789 	}
3790 
3791 	// RPC call
3792 	Zero(&t, sizeof(t));
3793 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
3794 
3795 	ret = CcUpgradeVLan(pc->RemoteClient, &t);
3796 
3797 	if (ret == ERR_NO_ERROR)
3798 	{
3799 		// Success
3800 	}
3801 
3802 	if (ret != ERR_NO_ERROR)
3803 	{
3804 		// Error has occurred
3805 		CmdPrintError(c, ret);
3806 	}
3807 
3808 	// Release of the parameter list
3809 	FreeParamValueList(o);
3810 
3811 	return ret;
3812 }
3813 
3814 // Get the settings of the virtual LAN card
PcNicGetSetting(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3815 UINT PcNicGetSetting(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3816 {
3817 	LIST *o;
3818 	PC *pc = (PC *)param;
3819 	UINT ret = ERR_NO_ERROR;
3820 	RPC_CLIENT_GET_VLAN t;
3821 	// Parameter list that can be specified
3822 	PARAM args[] =
3823 	{
3824 		{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
3825 	};
3826 
3827 	// Get the parameter list
3828 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3829 	if (o == NULL)
3830 	{
3831 		return ERR_INVALID_PARAMETER;
3832 	}
3833 
3834 	// RPC call
3835 	Zero(&t, sizeof(t));
3836 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
3837 
3838 	ret = CcGetVLan(pc->RemoteClient, &t);
3839 
3840 	if (ret == ERR_NO_ERROR)
3841 	{
3842 		// Success
3843 		CT *ct = CtNewStandard();
3844 		wchar_t tmp[MAX_SIZE];
3845 
3846 		StrToUni(tmp, sizeof(tmp), t.DeviceName);
3847 		CtInsert(ct, _UU("CMD_NicGetSetting_1"), tmp);
3848 
3849 		CtInsert(ct, _UU("CMD_NicGetSetting_2"), t.Enabled ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
3850 
3851 		StrToUni(tmp, sizeof(tmp), t.MacAddress);
3852 		CtInsert(ct, _UU("CMD_NicGetSetting_3"), tmp);
3853 
3854 		StrToUni(tmp, sizeof(tmp), t.Version);
3855 		CtInsert(ct, _UU("CMD_NicGetSetting_4"), tmp);
3856 
3857 		StrToUni(tmp, sizeof(tmp), t.FileName);
3858 		CtInsert(ct, _UU("CMD_NicGetSetting_5"), tmp);
3859 
3860 		StrToUni(tmp, sizeof(tmp), t.Guid);
3861 		CtInsert(ct, _UU("CMD_NicGetSetting_6"), tmp);
3862 
3863 		CtFree(ct, c);
3864 	}
3865 
3866 	if (ret != ERR_NO_ERROR)
3867 	{
3868 		// Error has occurred
3869 		CmdPrintError(c, ret);
3870 	}
3871 
3872 	// Release of the parameter list
3873 	FreeParamValueList(o);
3874 
3875 	return ret;
3876 }
3877 
3878 // Change the settings for the virtual LAN card
PcNicSetSetting(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3879 UINT PcNicSetSetting(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3880 {
3881 	LIST *o;
3882 	PC *pc = (PC *)param;
3883 	UINT ret = ERR_NO_ERROR;
3884 	RPC_CLIENT_SET_VLAN t;
3885 	UCHAR mac_address[6];
3886 	BUF *b;
3887 	// Parameter list that can be specified
3888 	PARAM args[] =
3889 	{
3890 		{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
3891 		{"MAC", CmdPrompt, _UU("CMD_NicSetSetting_PROMPT_MAC"), CmdEvalNotEmpty, NULL},
3892 	};
3893 
3894 	// Get the parameter list
3895 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3896 	if (o == NULL)
3897 	{
3898 		return ERR_INVALID_PARAMETER;
3899 	}
3900 
3901 	// Inspect the MAC address
3902 	Zero(mac_address, sizeof(mac_address));
3903 	b = StrToBin(GetParamStr(o, "MAC"));
3904 	if (b != NULL && b->Size == 6)
3905 	{
3906 		Copy(mac_address, b->Buf, 6);
3907 	}
3908 	FreeBuf(b);
3909 
3910 	if (IsZero(mac_address, 6))
3911 	{
3912 		// MAC address is invalid
3913 		FreeParamValueList(o);
3914 
3915 		CmdPrintError(c, ERR_INVALID_PARAMETER);
3916 		return ERR_INVALID_PARAMETER;
3917 	}
3918 
3919 	// RPC call
3920 	Zero(&t, sizeof(t));
3921 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
3922 	NormalizeMacAddress(t.MacAddress, sizeof(t.MacAddress), GetParamStr(o, "MAC"));
3923 
3924 	ret = CcSetVLan(pc->RemoteClient, &t);
3925 
3926 	if (ret == ERR_NO_ERROR)
3927 	{
3928 		// Success
3929 	}
3930 
3931 	if (ret != ERR_NO_ERROR)
3932 	{
3933 		// Error has occurred
3934 		CmdPrintError(c, ret);
3935 	}
3936 
3937 	// Release of the parameter list
3938 	FreeParamValueList(o);
3939 
3940 	return ret;
3941 }
3942 
3943 // Enable the virtual LAN card
PcNicEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3944 UINT PcNicEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3945 {
3946 	LIST *o;
3947 	PC *pc = (PC *)param;
3948 	UINT ret = ERR_NO_ERROR;
3949 	RPC_CLIENT_CREATE_VLAN t;
3950 	// Parameter list that can be specified
3951 	PARAM args[] =
3952 	{
3953 		{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
3954 	};
3955 
3956 	// Get the parameter list
3957 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3958 	if (o == NULL)
3959 	{
3960 		return ERR_INVALID_PARAMETER;
3961 	}
3962 
3963 	// RPC call
3964 	Zero(&t, sizeof(t));
3965 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
3966 
3967 	ret = CcEnableVLan(pc->RemoteClient, &t);
3968 
3969 	if (ret == ERR_NO_ERROR)
3970 	{
3971 		// Success
3972 	}
3973 
3974 	if (ret != ERR_NO_ERROR)
3975 	{
3976 		// Error has occurred
3977 		CmdPrintError(c, ret);
3978 	}
3979 
3980 	// Release of the parameter list
3981 	FreeParamValueList(o);
3982 
3983 	return ret;
3984 }
3985 
3986 // Disable the virtual LAN card
PcNicDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3987 UINT PcNicDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3988 {
3989 	LIST *o;
3990 	PC *pc = (PC *)param;
3991 	UINT ret = ERR_NO_ERROR;
3992 	RPC_CLIENT_CREATE_VLAN t;
3993 	// Parameter list that can be specified
3994 	PARAM args[] =
3995 	{
3996 		{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
3997 	};
3998 
3999 	// Get the parameter list
4000 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4001 	if (o == NULL)
4002 	{
4003 		return ERR_INVALID_PARAMETER;
4004 	}
4005 
4006 	// RPC call
4007 	Zero(&t, sizeof(t));
4008 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
4009 
4010 	ret = CcDisableVLan(pc->RemoteClient, &t);
4011 
4012 	if (ret == ERR_NO_ERROR)
4013 	{
4014 		// Success
4015 	}
4016 
4017 	if (ret != ERR_NO_ERROR)
4018 	{
4019 		// Error has occurred
4020 		CmdPrintError(c, ret);
4021 	}
4022 
4023 	// Release of the parameter list
4024 	FreeParamValueList(o);
4025 
4026 	return ret;
4027 }
4028 
4029 // Get the Virtual LAN card list
PcNicList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4030 UINT PcNicList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4031 {
4032 	LIST *o;
4033 	PC *pc = (PC *)param;
4034 	UINT ret = ERR_NO_ERROR;
4035 	RPC_CLIENT_ENUM_VLAN t;
4036 
4037 	// Get the parameter list
4038 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
4039 	if (o == NULL)
4040 	{
4041 		return ERR_INVALID_PARAMETER;
4042 	}
4043 
4044 	// RPC call
4045 	Zero(&t, sizeof(t));
4046 
4047 	ret = CcEnumVLan(pc->RemoteClient, &t);
4048 
4049 	if (ret == ERR_NO_ERROR)
4050 	{
4051 		CT *ct;
4052 		UINT i;
4053 
4054 		// Success
4055 		ct = CtNew();
4056 		CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_1"), false);
4057 		CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_2"), false);
4058 		CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_3"), false);
4059 		CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_4"), false);
4060 
4061 		for (i = 0;i < t.NumItem;i++)
4062 		{
4063 			wchar_t name[MAX_SIZE];
4064 			wchar_t mac[MAX_SIZE];
4065 			wchar_t ver[MAX_SIZE];
4066 			wchar_t *status;
4067 			RPC_CLIENT_ENUM_VLAN_ITEM *v = t.Items[i];
4068 
4069 			// Device name
4070 			StrToUni(name, sizeof(name), v->DeviceName);
4071 
4072 			// State
4073 			status = v->Enabled ? _UU("CM_VLAN_ENABLED") : _UU("CM_VLAN_DISABLED");
4074 
4075 			// MAC address
4076 			StrToUni(mac, sizeof(mac), v->MacAddress);
4077 
4078 			// Version
4079 			StrToUni(ver, sizeof(ver), v->Version);
4080 
4081 			CtInsert(ct,
4082 				name, status, mac, ver);
4083 		}
4084 
4085 		CtFreeEx(ct, c, true);
4086 	}
4087 
4088 	if (ret != ERR_NO_ERROR)
4089 	{
4090 		// Error has occurred
4091 		CmdPrintError(c, ret);
4092 	}
4093 
4094 	CiFreeClientEnumVLan(&t);
4095 
4096 	// Release of the parameter list
4097 	FreeParamValueList(o);
4098 
4099 	return ret;
4100 }
4101 
4102 // Get the protocol name string from ID
GetProtocolName(UINT n)4103 wchar_t *GetProtocolName(UINT n)
4104 {
4105 	switch (n)
4106 	{
4107 	case PROXY_DIRECT:
4108 		return _UU("PROTO_DIRECT_TCP");
4109 	case PROXY_HTTP:
4110 		return _UU("PROTO_HTTP_PROXY");
4111 	case PROXY_SOCKS:
4112 		return _UU("PROTO_SOCKS_PROXY");
4113 	}
4114 
4115 	return _UU("PROTO_UNKNOWN");
4116 }
4117 
4118 // Get the connection settings list
PcAccountList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4119 UINT PcAccountList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4120 {
4121 	LIST *o;
4122 	PC *pc = (PC *)param;
4123 	UINT ret = ERR_NO_ERROR;
4124 	RPC_CLIENT_ENUM_ACCOUNT t;
4125 
4126 	// Get the parameter list
4127 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
4128 	if (o == NULL)
4129 	{
4130 		return ERR_INVALID_PARAMETER;
4131 	}
4132 
4133 	// RPC call
4134 	Zero(&t, sizeof(t));
4135 
4136 	ret = CcEnumAccount(pc->RemoteClient, &t);
4137 
4138 	if (ret == ERR_NO_ERROR)
4139 	{
4140 		UINT i;
4141 		CT *ct;
4142 
4143 		// Success
4144 		ct = CtNew();
4145 		CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_1"), false);
4146 		CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_2"), false);
4147 		CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_3"), false);
4148 		CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_3_2"), false);
4149 		CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_4"), false);
4150 
4151 		for (i = 0;i < t.NumItem;i++)
4152 		{
4153 			RPC_CLIENT_ENUM_ACCOUNT_ITEM *e = t.Items[i];
4154 			wchar_t tmp[MAX_SIZE];
4155 			wchar_t tmp2[MAX_SIZE];
4156 			wchar_t tmp4[MAX_SIZE];
4157 			IP ip;
4158 			char ip_str[MAX_SIZE];
4159 
4160 			// Special treatment for IPv6 addresses
4161 			if (StrToIP6(&ip, e->ServerName) && StartWith(e->ServerName, "[") == false)
4162 			{
4163 				Format(ip_str, sizeof(ip_str),
4164 					"[%s]", e->ServerName);
4165 			}
4166 			else
4167 			{
4168 				StrCpy(ip_str, sizeof(ip_str), e->ServerName);
4169 			}
4170 
4171 			if (e->Port == 0)
4172 			{
4173 				// Port number unknown
4174 				UniFormat(tmp2, sizeof(tmp2), L"%S (%s)", ip_str, GetProtocolName(e->ProxyType));
4175 			}
4176 			else
4177 			{
4178 				// Port number are also shown
4179 				UniFormat(tmp2, sizeof(tmp2), L"%S:%u (%s)", ip_str, e->Port, GetProtocolName(e->ProxyType));
4180 			}
4181 
4182 			// Virtual HUB name
4183 			StrToUni(tmp4, sizeof(tmp4), e->HubName);
4184 
4185 			// Add
4186 			StrToUni(tmp, sizeof(tmp), e->DeviceName);
4187 
4188 			CtInsert(ct,
4189 				e->AccountName,
4190 				e->Active == false ? _UU("CM_ACCOUNT_OFFLINE") :
4191 				(e->Connected ? _UU("CM_ACCOUNT_ONLINE") : _UU("CM_ACCOUNT_CONNECTING")),
4192 				tmp2, tmp4,
4193 				tmp);
4194 		}
4195 
4196 		CtFreeEx(ct, c, true);
4197 	}
4198 
4199 	CiFreeClientEnumAccount(&t);
4200 
4201 	if (ret != ERR_NO_ERROR)
4202 	{
4203 		// Error has occurred
4204 		CmdPrintError(c, ret);
4205 	}
4206 
4207 	// Release of the parameter list
4208 	FreeParamValueList(o);
4209 
4210 	return ret;
4211 }
4212 
4213 // Create new connection settings
PcAccountCreate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4214 UINT PcAccountCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4215 {
4216 	LIST *o;
4217 	PC *pc = (PC *)param;
4218 	UINT ret = ERR_NO_ERROR;
4219 	RPC_CLIENT_CREATE_ACCOUNT t;
4220 	UINT port = 443;
4221 	char *host = NULL;
4222 	// Parameter list that can be specified
4223 	PARAM args[] =
4224 	{
4225 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4226 		{"SERVER", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},
4227 		{"HUB", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Hub"), CmdEvalSafe, NULL},
4228 		{"USERNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},
4229 		{"NICNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Nicname"), CmdEvalNotEmpty, NULL},
4230 	};
4231 
4232 	// Get the parameter list
4233 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4234 	if (o == NULL)
4235 	{
4236 		return ERR_INVALID_PARAMETER;
4237 	}
4238 
4239 	ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);
4240 
4241 	// RPC call
4242 	Zero(&t, sizeof(t));
4243 
4244 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
4245 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
4246 	t.ClientOption->Port = port;
4247 	StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);
4248 	StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));
4249 	t.ClientOption->NumRetry = INFINITE;
4250 	t.ClientOption->RetryInterval = 15;
4251 	t.ClientOption->MaxConnection = 1;
4252 	t.ClientOption->UseEncrypt = true;
4253 	t.ClientOption->AdditionalConnectionInterval = 1;
4254 	StrCpy(t.ClientOption->DeviceName, sizeof(t.ClientOption->DeviceName), GetParamStr(o, "NICNAME"));
4255 
4256 	t.ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));
4257 	t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
4258 	StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username), GetParamStr(o, "USERNAME"));
4259 
4260 	Free(host);
4261 
4262 	ret = CcCreateAccount(pc->RemoteClient, &t);
4263 
4264 	if (ret == ERR_NO_ERROR)
4265 	{
4266 		// Success
4267 	}
4268 
4269 	CiFreeClientCreateAccount(&t);
4270 
4271 	if (ret != ERR_NO_ERROR)
4272 	{
4273 		// Error has occurred
4274 		CmdPrintError(c, ret);
4275 	}
4276 
4277 	// Release of the parameter list
4278 	FreeParamValueList(o);
4279 
4280 	return ret;
4281 }
4282 
4283 // Set the destination of the connection settings
PcAccountSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4284 UINT PcAccountSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4285 {
4286 	LIST *o;
4287 	PC *pc = (PC *)param;
4288 	UINT ret = ERR_NO_ERROR;
4289 	RPC_CLIENT_GET_ACCOUNT t;
4290 	char *host = NULL;
4291 	UINT port = 443;
4292 	// Parameter list that can be specified
4293 	PARAM args[] =
4294 	{
4295 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4296 		{"SERVER", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},
4297 		{"HUB", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Hub"), CmdEvalSafe, NULL},
4298 	};
4299 
4300 	// Get the parameter list
4301 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4302 	if (o == NULL)
4303 	{
4304 		return ERR_INVALID_PARAMETER;
4305 	}
4306 
4307 	// RPC call
4308 	Zero(&t, sizeof(t));
4309 
4310 	ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);
4311 
4312 	Zero(&t, sizeof(t));
4313 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4314 
4315 	ret = CcGetAccount(pc->RemoteClient, &t);
4316 
4317 	if (ret == ERR_NO_ERROR)
4318 	{
4319 		RPC_CLIENT_CREATE_ACCOUNT c;
4320 		// Success
4321 		t.ClientOption->Port = port;
4322 		StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);
4323 		StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));
4324 
4325 		Zero(&c, sizeof(c));
4326 
4327 		c.ClientAuth = t.ClientAuth;
4328 		c.ClientOption = t.ClientOption;
4329 		c.CheckServerCert = t.CheckServerCert;
4330 		c.ServerCert = t.ServerCert;
4331 		c.StartupAccount = t.StartupAccount;
4332 
4333 		ret = CcSetAccount(pc->RemoteClient, &c);
4334 	}
4335 
4336 	if (ret != ERR_NO_ERROR)
4337 	{
4338 		// Error has occurred
4339 		CmdPrintError(c, ret);
4340 	}
4341 
4342 	CiFreeClientGetAccount(&t);
4343 
4344 	// Release of the parameter list
4345 	FreeParamValueList(o);
4346 
4347 	Free(host);
4348 
4349 	return ret;
4350 }
4351 
4352 // Get the configuration of the connection settings
PcAccountGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4353 UINT PcAccountGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4354 {
4355 	LIST *o;
4356 	PC *pc = (PC *)param;
4357 	UINT ret = ERR_NO_ERROR;
4358 	RPC_CLIENT_GET_ACCOUNT t;
4359 	// Parameter list that can be specified
4360 	PARAM args[] =
4361 	{
4362 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4363 	};
4364 
4365 	// Get the parameter list
4366 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4367 	if (o == NULL)
4368 	{
4369 		return ERR_INVALID_PARAMETER;
4370 	}
4371 
4372 	// RPC call
4373 	Zero(&t, sizeof(t));
4374 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4375 
4376 	ret = CcGetAccount(pc->RemoteClient, &t);
4377 
4378 	if (ret == ERR_NO_ERROR)
4379 	{
4380 		// Show the contents of the connection settings
4381 		wchar_t tmp[MAX_SIZE];
4382 
4383 		CT *ct = CtNewStandard();
4384 
4385 		// Connection settings name
4386 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NAME"), t.ClientOption->AccountName);
4387 
4388 		// Host name of the destination VPN Server
4389 		StrToUni(tmp, sizeof(tmp), t.ClientOption->Hostname);
4390 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HOSTNAME"), tmp);
4391 
4392 		// The port number to connect to VPN Server
4393 		UniToStru(tmp, t.ClientOption->Port);
4394 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PORT"), tmp);
4395 
4396 		// Virtual HUB name of the destination VPN Server
4397 		StrToUni(tmp, sizeof(tmp), t.ClientOption->HubName);
4398 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HUBNAME"), tmp);
4399 
4400 		// Type of proxy server to go through
4401 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_TYPE"), GetProxyTypeStr(t.ClientOption->ProxyType));
4402 
4403 		if (t.ClientOption->ProxyType != PROXY_DIRECT)
4404 		{
4405 			// Host name of the proxy server
4406 			StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyName);
4407 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_HOSTNAME"), tmp);
4408 
4409 			// Port number of the proxy server
4410 			UniToStru(tmp, t.ClientOption->ProxyPort);
4411 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_PORT"), tmp);
4412 
4413 			// User name of the proxy server
4414 			StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyUsername);
4415 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_USERNAME"), tmp);
4416 		}
4417 
4418 		// Verify the server certificate
4419 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_USE"),
4420 			t.CheckServerCert ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4421 
4422 		// Registered specific certificate
4423 		if (t.ServerCert != NULL)
4424 		{
4425 			GetAllNameFromX(tmp, sizeof(tmp), t.ServerCert);
4426 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_NAME"), tmp);
4427 		}
4428 
4429 		// Device name to be used for the connection
4430 		StrToUni(tmp, sizeof(tmp), t.ClientOption->DeviceName);
4431 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_DEVICE_NAME"), tmp);
4432 
4433 		// Authentication type
4434 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_TYPE"), GetClientAuthTypeStr(t.ClientAuth->AuthType));
4435 
4436 		// User name
4437 		StrToUni(tmp, sizeof(tmp), t.ClientAuth->Username);
4438 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_USERNAME"), tmp);
4439 
4440 		if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_CERT)
4441 		{
4442 			if (t.ClientAuth->ClientX != NULL)
4443 			{
4444 				// Client certificate name
4445 				GetAllNameFromX(tmp, sizeof(tmp), t.ClientAuth->ClientX);
4446 				CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_CERT_NAME"), tmp);
4447 			}
4448 		}
4449 
4450 		// Number of TCP connections to be used for VPN communication
4451 		UniToStru(tmp, t.ClientOption->MaxConnection);
4452 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NUMTCP"), tmp);
4453 
4454 		// Establishment interval of each TCP connection
4455 		UniToStru(tmp, t.ClientOption->AdditionalConnectionInterval);
4456 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_INTERVAL"), tmp);
4457 
4458 		// Life span of each TCP connection
4459 		if (t.ClientOption->ConnectionDisconnectSpan != 0)
4460 		{
4461 			UniToStru(tmp, t.ClientOption->ConnectionDisconnectSpan);
4462 		}
4463 		else
4464 		{
4465 			UniStrCpy(tmp, sizeof(tmp), _UU("CMD_MSG_INFINITE"));
4466 		}
4467 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_TTL"), tmp);
4468 
4469 		// Use of half-duplex mode
4470 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_HALF"),
4471 			t.ClientOption->HalfConnection ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4472 
4473 		// Encryption by SSL
4474 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_ENCRYPT"),
4475 			t.ClientOption->UseEncrypt ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4476 
4477 		// Data compression
4478 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_COMPRESS"),
4479 			t.ClientOption->UseCompress ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4480 
4481 		// Connect in bridge / router mode
4482 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_BRIDGE_ROUTER"),
4483 			t.ClientOption->RequireBridgeRoutingMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4484 
4485 		// Connect in monitoring mode
4486 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_MONITOR"),
4487 			t.ClientOption->RequireMonitorMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4488 
4489 		// Not to rewrite the routing table
4490 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NO_TRACKING"),
4491 			t.ClientOption->NoRoutingTracking ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4492 
4493 		// Disable the QoS control
4494 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_QOS_DISABLE"),
4495 			t.ClientOption->DisableQoS ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4496 
4497 		CtFree(ct, c);
4498 	}
4499 
4500 	if (ret != ERR_NO_ERROR)
4501 	{
4502 		// Error has occurred
4503 		CmdPrintError(c, ret);
4504 	}
4505 
4506 	CiFreeClientGetAccount(&t);
4507 
4508 	// Release of the parameter list
4509 	FreeParamValueList(o);
4510 
4511 	return ret;
4512 }
4513 
4514 // Delete the connection settings
PcAccountDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4515 UINT PcAccountDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4516 {
4517 	LIST *o;
4518 	PC *pc = (PC *)param;
4519 	UINT ret = ERR_NO_ERROR;
4520 	RPC_CLIENT_DELETE_ACCOUNT t;
4521 	// Parameter list that can be specified
4522 	PARAM args[] =
4523 	{
4524 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4525 	};
4526 
4527 	// Get the parameter list
4528 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4529 	if (o == NULL)
4530 	{
4531 		return ERR_INVALID_PARAMETER;
4532 	}
4533 
4534 	// RPC call
4535 	Zero(&t, sizeof(t));
4536 
4537 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4538 
4539 	ret = CcDeleteAccount(pc->RemoteClient, &t);
4540 
4541 	if (ret == ERR_NO_ERROR)
4542 	{
4543 		// Success
4544 	}
4545 
4546 	if (ret != ERR_NO_ERROR)
4547 	{
4548 		// Error has occurred
4549 		CmdPrintError(c, ret);
4550 	}
4551 
4552 	// Release of the parameter list
4553 	FreeParamValueList(o);
4554 
4555 	return ret;
4556 }
4557 
4558 // Set the user name used to connect with connection settings
PcAccountUsernameSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4559 UINT PcAccountUsernameSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4560 {
4561 	LIST *o;
4562 	PC *pc = (PC *)param;
4563 	UINT ret = ERR_NO_ERROR;
4564 	RPC_CLIENT_GET_ACCOUNT t;
4565 	// Parameter list that can be specified
4566 	PARAM args[] =
4567 	{
4568 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4569 		{"USERNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},
4570 	};
4571 
4572 	// Get the parameter list
4573 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4574 	if (o == NULL)
4575 	{
4576 		return ERR_INVALID_PARAMETER;
4577 	}
4578 
4579 	// RPC call
4580 	Zero(&t, sizeof(t));
4581 
4582 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4583 
4584 	ret = CcGetAccount(pc->RemoteClient, &t);
4585 
4586 	if (ret == ERR_NO_ERROR)
4587 	{
4588 		RPC_CLIENT_CREATE_ACCOUNT z;
4589 		// Change the settings
4590 		StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username), GetParamStr(o, "USERNAME"));
4591 
4592 		if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_PASSWORD)
4593 		{
4594 			c->Write(c, _UU("CMD_AccountUsername_Notice"));
4595 		}
4596 
4597 		Zero(&z, sizeof(z));
4598 		z.CheckServerCert = t.CheckServerCert;
4599 		z.ClientAuth = t.ClientAuth;
4600 		z.ClientOption = t.ClientOption;
4601 		z.ServerCert = t.ServerCert;
4602 		z.StartupAccount = t.StartupAccount;
4603 
4604 		ret = CcSetAccount(pc->RemoteClient, &z);
4605 	}
4606 
4607 	if (ret != ERR_NO_ERROR)
4608 	{
4609 		// Error has occurred
4610 		CmdPrintError(c, ret);
4611 	}
4612 
4613 	CiFreeClientGetAccount(&t);
4614 
4615 	// Release of the parameter list
4616 	FreeParamValueList(o);
4617 
4618 	return ret;
4619 }
4620 
4621 // Set the type of user authentication of connection settings to anonymous authentication
PcAccountAnonymousSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4622 UINT PcAccountAnonymousSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4623 {
4624 	LIST *o;
4625 	PC *pc = (PC *)param;
4626 	UINT ret = ERR_NO_ERROR;
4627 	RPC_CLIENT_GET_ACCOUNT t;
4628 	// Parameter list that can be specified
4629 	PARAM args[] =
4630 	{
4631 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4632 	};
4633 
4634 	// Get the parameter list
4635 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4636 	if (o == NULL)
4637 	{
4638 		return ERR_INVALID_PARAMETER;
4639 	}
4640 
4641 	// RPC call
4642 	Zero(&t, sizeof(t));
4643 
4644 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4645 
4646 	ret = CcGetAccount(pc->RemoteClient, &t);
4647 
4648 	if (ret == ERR_NO_ERROR)
4649 	{
4650 		RPC_CLIENT_CREATE_ACCOUNT z;
4651 		// Change the settings
4652 		t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
4653 
4654 		Zero(&z, sizeof(z));
4655 		z.CheckServerCert = t.CheckServerCert;
4656 		z.ClientAuth = t.ClientAuth;
4657 		z.ClientOption = t.ClientOption;
4658 		z.ServerCert = t.ServerCert;
4659 		z.StartupAccount = t.StartupAccount;
4660 
4661 		ret = CcSetAccount(pc->RemoteClient, &z);
4662 	}
4663 
4664 	if (ret != ERR_NO_ERROR)
4665 	{
4666 		// Error has occurred
4667 		CmdPrintError(c, ret);
4668 	}
4669 
4670 	CiFreeClientGetAccount(&t);
4671 
4672 	// Release of the parameter list
4673 	FreeParamValueList(o);
4674 
4675 	return ret;
4676 }
4677 
4678 // Set the type of user authentication of connection settings to the password authentication
PcAccountPasswordSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4679 UINT PcAccountPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4680 {
4681 	LIST *o;
4682 	PC *pc = (PC *)param;
4683 	UINT ret = ERR_NO_ERROR;
4684 	RPC_CLIENT_GET_ACCOUNT t;
4685 	// Parameter list that can be specified
4686 	PARAM args[] =
4687 	{
4688 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4689 		{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
4690 		{"TYPE", CmdPrompt, _UU("CMD_CascadePasswordSet_Prompt_Type"), CmdEvalNotEmpty, NULL},
4691 	};
4692 
4693 	// Get the parameter list
4694 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4695 	if (o == NULL)
4696 	{
4697 		return ERR_INVALID_PARAMETER;
4698 	}
4699 
4700 	// RPC call
4701 	Zero(&t, sizeof(t));
4702 
4703 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4704 
4705 	ret = CcGetAccount(pc->RemoteClient, &t);
4706 
4707 	if (ret == ERR_NO_ERROR)
4708 	{
4709 		char *typestr = GetParamStr(o, "TYPE");
4710 		RPC_CLIENT_CREATE_ACCOUNT z;
4711 
4712 		// Change the settings
4713 		if (StartWith("standard", typestr))
4714 		{
4715 			t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PASSWORD;
4716 			HashPassword(t.ClientAuth->HashedPassword, t.ClientAuth->Username,
4717 				GetParamStr(o, "PASSWORD"));
4718 		}
4719 		else if (StartWith("radius", typestr) || StartWith("ntdomain", typestr))
4720 		{
4721 			t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PLAIN_PASSWORD;
4722 
4723 			StrCpy(t.ClientAuth->PlainPassword, sizeof(t.ClientAuth->PlainPassword),
4724 				GetParamStr(o, "PASSWORD"));
4725 		}
4726 		else
4727 		{
4728 			// Error has occured
4729 			c->Write(c, _UU("CMD_CascadePasswordSet_Type_Invalid"));
4730 			ret = ERR_INVALID_PARAMETER;
4731 		}
4732 
4733 		if (ret == ERR_NO_ERROR)
4734 		{
4735 			Zero(&z, sizeof(z));
4736 			z.CheckServerCert = t.CheckServerCert;
4737 			z.ClientAuth = t.ClientAuth;
4738 			z.ClientOption = t.ClientOption;
4739 			z.ServerCert = t.ServerCert;
4740 			z.StartupAccount = t.StartupAccount;
4741 
4742 			ret = CcSetAccount(pc->RemoteClient, &z);
4743 		}
4744 	}
4745 
4746 	if (ret != ERR_NO_ERROR)
4747 	{
4748 		// Error has occurred
4749 		CmdPrintError(c, ret);
4750 	}
4751 
4752 	CiFreeClientGetAccount(&t);
4753 
4754 	// Release of the parameter list
4755 	FreeParamValueList(o);
4756 
4757 	return ret;
4758 }
4759 
4760 // Set the type of user authentication of connection settings to the client certificate authentication
PcAccountCertSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4761 UINT PcAccountCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4762 {
4763 	LIST *o;
4764 	PC *pc = (PC *)param;
4765 	UINT ret = ERR_NO_ERROR;
4766 	RPC_CLIENT_GET_ACCOUNT t;
4767 	X *x;
4768 	K *k;
4769 	// Parameter list that can be specified
4770 	PARAM args[] =
4771 	{
4772 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4773 		{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
4774 		{"LOADKEY", CmdPrompt, _UU("CMD_LOADKEYPATH"), CmdEvalIsFile, NULL},
4775 	};
4776 
4777 	// Get the parameter list
4778 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4779 	if (o == NULL)
4780 	{
4781 		return ERR_INVALID_PARAMETER;
4782 	}
4783 
4784 	if (CmdLoadCertAndKey(c, &x, &k, GetParamUniStr(o, "LOADCERT"), GetParamUniStr(o, "LOADKEY")) == false)
4785 	{
4786 		return ERR_INTERNAL_ERROR;
4787 	}
4788 
4789 	// RPC call
4790 	Zero(&t, sizeof(t));
4791 
4792 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4793 
4794 	ret = CcGetAccount(pc->RemoteClient, &t);
4795 
4796 	if (ret == ERR_NO_ERROR)
4797 	{
4798 		RPC_CLIENT_CREATE_ACCOUNT z;
4799 
4800 		t.ClientAuth->AuthType = CLIENT_AUTHTYPE_CERT;
4801 		if (t.ClientAuth->ClientX != NULL)
4802 		{
4803 			FreeX(t.ClientAuth->ClientX);
4804 		}
4805 		if (t.ClientAuth->ClientK != NULL)
4806 		{
4807 			FreeK(t.ClientAuth->ClientK);
4808 		}
4809 
4810 		t.ClientAuth->ClientX = CloneX(x);
4811 		t.ClientAuth->ClientK = CloneK(k);
4812 
4813 		Zero(&z, sizeof(z));
4814 		z.CheckServerCert = t.CheckServerCert;
4815 		z.ClientAuth = t.ClientAuth;
4816 		z.ClientOption = t.ClientOption;
4817 		z.ServerCert = t.ServerCert;
4818 		z.StartupAccount = t.StartupAccount;
4819 
4820 		ret = CcSetAccount(pc->RemoteClient, &z);
4821 	}
4822 
4823 	if (ret != ERR_NO_ERROR)
4824 	{
4825 		// Error has occurred
4826 		CmdPrintError(c, ret);
4827 	}
4828 
4829 	FreeX(x);
4830 	FreeK(k);
4831 
4832 	CiFreeClientGetAccount(&t);
4833 
4834 	// Release of the parameter list
4835 	FreeParamValueList(o);
4836 
4837 	return ret;
4838 }
4839 
4840 // Get the client certificate to be used for the connection settings
PcAccountCertGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4841 UINT PcAccountCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4842 {
4843 	LIST *o;
4844 	PC *pc = (PC *)param;
4845 	UINT ret = ERR_NO_ERROR;
4846 	RPC_CLIENT_GET_ACCOUNT t;
4847 	// Parameter list that can be specified
4848 	PARAM args[] =
4849 	{
4850 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4851 		{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
4852 	};
4853 
4854 	// Get the parameter list
4855 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4856 	if (o == NULL)
4857 	{
4858 		return ERR_INVALID_PARAMETER;
4859 	}
4860 
4861 	// RPC call
4862 	Zero(&t, sizeof(t));
4863 
4864 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4865 
4866 	ret = CcGetAccount(pc->RemoteClient, &t);
4867 
4868 	if (ret == ERR_NO_ERROR)
4869 	{
4870 		if (t.ClientAuth->AuthType != CLIENT_AUTHTYPE_CERT)
4871 		{
4872 			c->Write(c, _UU("CMD_CascadeCertSet_Not_Auth_Cert"));
4873 			ret = ERR_INTERNAL_ERROR;
4874 		}
4875 		else if (t.ClientAuth->ClientX == NULL)
4876 		{
4877 			c->Write(c, _UU("CMD_CascadeCertSet_Cert_Not_Exists"));
4878 			ret = ERR_INTERNAL_ERROR;
4879 		}
4880 		else
4881 		{
4882 			XToFileW(t.ClientAuth->ClientX, GetParamUniStr(o, "SAVECERT"), true);
4883 		}
4884 	}
4885 
4886 	CiFreeClientGetAccount(&t);
4887 
4888 	if (ret != ERR_NO_ERROR)
4889 	{
4890 		// Error has occurred
4891 		CmdPrintError(c, ret);
4892 	}
4893 
4894 	// Release of the parameter list
4895 	FreeParamValueList(o);
4896 
4897 	return ret;
4898 }
4899 
4900 // Disable communication encryption with the connection settings
PcAccountEncryptDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4901 UINT PcAccountEncryptDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4902 {
4903 	LIST *o;
4904 	PC *pc = (PC *)param;
4905 	UINT ret = ERR_NO_ERROR;
4906 	RPC_CLIENT_GET_ACCOUNT t;
4907 	// Parameter list that can be specified
4908 	PARAM args[] =
4909 	{
4910 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4911 	};
4912 
4913 	// Get the parameter list
4914 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4915 	if (o == NULL)
4916 	{
4917 		return ERR_INVALID_PARAMETER;
4918 	}
4919 
4920 	// RPC call
4921 	Zero(&t, sizeof(t));
4922 
4923 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4924 
4925 	ret = CcGetAccount(pc->RemoteClient, &t);
4926 
4927 	if (ret == ERR_NO_ERROR)
4928 	{
4929 		RPC_CLIENT_CREATE_ACCOUNT z;
4930 		// Change the settings
4931 		t.ClientOption->UseEncrypt = false;
4932 
4933 		Zero(&z, sizeof(z));
4934 		z.CheckServerCert = t.CheckServerCert;
4935 		z.ClientAuth = t.ClientAuth;
4936 		z.ClientOption = t.ClientOption;
4937 		z.ServerCert = t.ServerCert;
4938 		z.StartupAccount = t.StartupAccount;
4939 
4940 		ret = CcSetAccount(pc->RemoteClient, &z);
4941 	}
4942 
4943 	if (ret != ERR_NO_ERROR)
4944 	{
4945 		// Error has occurred
4946 		CmdPrintError(c, ret);
4947 	}
4948 
4949 	CiFreeClientGetAccount(&t);
4950 
4951 	// Release of the parameter list
4952 	FreeParamValueList(o);
4953 
4954 	return ret;
4955 }
4956 
4957 // Enable communication encryption with the connection settings
PcAccountEncryptEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4958 UINT PcAccountEncryptEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4959 {
4960 	LIST *o;
4961 	PC *pc = (PC *)param;
4962 	UINT ret = ERR_NO_ERROR;
4963 	RPC_CLIENT_GET_ACCOUNT t;
4964 	// Parameter list that can be specified
4965 	PARAM args[] =
4966 	{
4967 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4968 	};
4969 
4970 	// Get the parameter list
4971 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4972 	if (o == NULL)
4973 	{
4974 		return ERR_INVALID_PARAMETER;
4975 	}
4976 
4977 	// RPC call
4978 	Zero(&t, sizeof(t));
4979 
4980 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4981 
4982 	ret = CcGetAccount(pc->RemoteClient, &t);
4983 
4984 	if (ret == ERR_NO_ERROR)
4985 	{
4986 		RPC_CLIENT_CREATE_ACCOUNT z;
4987 		// Change the settings
4988 		t.ClientOption->UseEncrypt = true;
4989 
4990 		Zero(&z, sizeof(z));
4991 		z.CheckServerCert = t.CheckServerCert;
4992 		z.ClientAuth = t.ClientAuth;
4993 		z.ClientOption = t.ClientOption;
4994 		z.ServerCert = t.ServerCert;
4995 		z.StartupAccount = t.StartupAccount;
4996 
4997 		ret = CcSetAccount(pc->RemoteClient, &z);
4998 	}
4999 
5000 	if (ret != ERR_NO_ERROR)
5001 	{
5002 		// Error has occurred
5003 		CmdPrintError(c, ret);
5004 	}
5005 
5006 	CiFreeClientGetAccount(&t);
5007 
5008 	// Release of the parameter list
5009 	FreeParamValueList(o);
5010 
5011 	return ret;
5012 }
5013 
5014 // Enable communication data compression with the connection settings
PcAccountCompressEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5015 UINT PcAccountCompressEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5016 {
5017 	LIST *o;
5018 	PC *pc = (PC *)param;
5019 	UINT ret = ERR_NO_ERROR;
5020 	RPC_CLIENT_GET_ACCOUNT t;
5021 	// Parameter list that can be specified
5022 	PARAM args[] =
5023 	{
5024 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5025 	};
5026 
5027 	// Get the parameter list
5028 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5029 	if (o == NULL)
5030 	{
5031 		return ERR_INVALID_PARAMETER;
5032 	}
5033 
5034 	// RPC call
5035 	Zero(&t, sizeof(t));
5036 
5037 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5038 
5039 	ret = CcGetAccount(pc->RemoteClient, &t);
5040 
5041 	if (ret == ERR_NO_ERROR)
5042 	{
5043 		RPC_CLIENT_CREATE_ACCOUNT z;
5044 		// Change the settings
5045 		t.ClientOption->UseCompress = true;
5046 
5047 		Zero(&z, sizeof(z));
5048 		z.CheckServerCert = t.CheckServerCert;
5049 		z.ClientAuth = t.ClientAuth;
5050 		z.ClientOption = t.ClientOption;
5051 		z.ServerCert = t.ServerCert;
5052 		z.StartupAccount = t.StartupAccount;
5053 
5054 		ret = CcSetAccount(pc->RemoteClient, &z);
5055 	}
5056 
5057 	if (ret != ERR_NO_ERROR)
5058 	{
5059 		// Error has occurred
5060 		CmdPrintError(c, ret);
5061 	}
5062 
5063 	CiFreeClientGetAccount(&t);
5064 
5065 	// Release of the parameter list
5066 	FreeParamValueList(o);
5067 
5068 	return ret;
5069 }
5070 
5071 // Disable communication data compression with the connection settings
PcAccountCompressDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5072 UINT PcAccountCompressDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5073 {
5074 	LIST *o;
5075 	PC *pc = (PC *)param;
5076 	UINT ret = ERR_NO_ERROR;
5077 	RPC_CLIENT_GET_ACCOUNT t;
5078 	// Parameter list that can be specified
5079 	PARAM args[] =
5080 	{
5081 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5082 	};
5083 
5084 	// Get the parameter list
5085 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5086 	if (o == NULL)
5087 	{
5088 		return ERR_INVALID_PARAMETER;
5089 	}
5090 
5091 	// RPC call
5092 	Zero(&t, sizeof(t));
5093 
5094 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5095 
5096 	ret = CcGetAccount(pc->RemoteClient, &t);
5097 
5098 	if (ret == ERR_NO_ERROR)
5099 	{
5100 		RPC_CLIENT_CREATE_ACCOUNT z;
5101 		// Change the settings
5102 		t.ClientOption->UseCompress = false;
5103 
5104 		Zero(&z, sizeof(z));
5105 		z.CheckServerCert = t.CheckServerCert;
5106 		z.ClientAuth = t.ClientAuth;
5107 		z.ClientOption = t.ClientOption;
5108 		z.ServerCert = t.ServerCert;
5109 		z.StartupAccount = t.StartupAccount;
5110 
5111 		ret = CcSetAccount(pc->RemoteClient, &z);
5112 	}
5113 
5114 	if (ret != ERR_NO_ERROR)
5115 	{
5116 		// Error has occurred
5117 		CmdPrintError(c, ret);
5118 	}
5119 
5120 	CiFreeClientGetAccount(&t);
5121 
5122 	// Release of the parameter list
5123 	FreeParamValueList(o);
5124 
5125 	return ret;
5126 }
5127 
5128 // Set the connection method of the connection settings to the direct TCP/IP connection
PcAccountProxyNone(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5129 UINT PcAccountProxyNone(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5130 {
5131 	LIST *o;
5132 	PC *pc = (PC *)param;
5133 	UINT ret = ERR_NO_ERROR;
5134 	RPC_CLIENT_GET_ACCOUNT t;
5135 	// Parameter list that can be specified
5136 	PARAM args[] =
5137 	{
5138 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5139 	};
5140 
5141 	// Get the parameter list
5142 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5143 	if (o == NULL)
5144 	{
5145 		return ERR_INVALID_PARAMETER;
5146 	}
5147 
5148 	// RPC call
5149 	Zero(&t, sizeof(t));
5150 
5151 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5152 
5153 	ret = CcGetAccount(pc->RemoteClient, &t);
5154 
5155 	if (ret == ERR_NO_ERROR)
5156 	{
5157 		RPC_CLIENT_CREATE_ACCOUNT z;
5158 		// Change the settings
5159 		t.ClientOption->ProxyType = PROXY_DIRECT;
5160 
5161 		Zero(&z, sizeof(z));
5162 		z.CheckServerCert = t.CheckServerCert;
5163 		z.ClientAuth = t.ClientAuth;
5164 		z.ClientOption = t.ClientOption;
5165 		z.ServerCert = t.ServerCert;
5166 		z.StartupAccount = t.StartupAccount;
5167 
5168 		ret = CcSetAccount(pc->RemoteClient, &z);
5169 	}
5170 
5171 	if (ret != ERR_NO_ERROR)
5172 	{
5173 		// Error has occurred
5174 		CmdPrintError(c, ret);
5175 	}
5176 
5177 	CiFreeClientGetAccount(&t);
5178 
5179 	// Release of the parameter list
5180 	FreeParamValueList(o);
5181 
5182 	return ret;
5183 }
5184 
5185 // Set the connection method of the connection settings to the HTTP proxy server connection
PcAccountProxyHttp(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5186 UINT PcAccountProxyHttp(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5187 {
5188 	LIST *o;
5189 	PC *pc = (PC *)param;
5190 	UINT ret = ERR_NO_ERROR;
5191 	RPC_CLIENT_GET_ACCOUNT t;
5192 	// Parameter list that can be specified
5193 	PARAM args[] =
5194 	{
5195 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5196 		{"SERVER", CmdPrompt, _UU("CMD_AccountProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
5197 		{"USERNAME", NULL, NULL, NULL, NULL},
5198 		{"PASSWORD", NULL, NULL, NULL, NULL},
5199 	};
5200 
5201 	// Get the parameter list
5202 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5203 	if (o == NULL)
5204 	{
5205 		return ERR_INVALID_PARAMETER;
5206 	}
5207 
5208 	// RPC call
5209 	Zero(&t, sizeof(t));
5210 
5211 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5212 
5213 	ret = CcGetAccount(pc->RemoteClient, &t);
5214 
5215 	if (ret == ERR_NO_ERROR)
5216 	{
5217 		RPC_CLIENT_CREATE_ACCOUNT z;
5218 		char *host;
5219 		UINT port;
5220 
5221 		// Data change
5222 		if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))
5223 		{
5224 			t.ClientOption->ProxyType = PROXY_HTTP;
5225 			StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
5226 			t.ClientOption->ProxyPort = port;
5227 			StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
5228 			StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
5229 			Free(host);
5230 		}
5231 
5232 		Zero(&z, sizeof(z));
5233 		z.CheckServerCert = t.CheckServerCert;
5234 		z.ClientAuth = t.ClientAuth;
5235 		z.ClientOption = t.ClientOption;
5236 		z.ServerCert = t.ServerCert;
5237 		z.StartupAccount = t.StartupAccount;
5238 
5239 		ret = CcSetAccount(pc->RemoteClient, &z);
5240 	}
5241 
5242 	if (ret != ERR_NO_ERROR)
5243 	{
5244 		// Error has occurred
5245 		CmdPrintError(c, ret);
5246 	}
5247 
5248 	CiFreeClientGetAccount(&t);
5249 
5250 	// Release of the parameter list
5251 	FreeParamValueList(o);
5252 
5253 	return ret;
5254 }
5255 
5256 // Set the connection method of the connection settings to the SOCKS proxy server connection
PcAccountProxySocks(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5257 UINT PcAccountProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5258 {
5259 	LIST *o;
5260 	PC *pc = (PC *)param;
5261 	UINT ret = ERR_NO_ERROR;
5262 	RPC_CLIENT_GET_ACCOUNT t;
5263 	// Parameter list that can be specified
5264 	PARAM args[] =
5265 	{
5266 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5267 		{"SERVER", CmdPrompt, _UU("CMD_AccountProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
5268 		{"USERNAME", NULL, NULL, NULL, NULL},
5269 		{"PASSWORD", NULL, NULL, NULL, NULL},
5270 	};
5271 
5272 	// Get the parameter list
5273 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5274 	if (o == NULL)
5275 	{
5276 		return ERR_INVALID_PARAMETER;
5277 	}
5278 
5279 	// RPC call
5280 	Zero(&t, sizeof(t));
5281 
5282 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5283 
5284 	ret = CcGetAccount(pc->RemoteClient, &t);
5285 
5286 	if (ret == ERR_NO_ERROR)
5287 	{
5288 		RPC_CLIENT_CREATE_ACCOUNT z;
5289 		char *host;
5290 		UINT port;
5291 
5292 		// Data change
5293 		if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))
5294 		{
5295 			t.ClientOption->ProxyType = PROXY_SOCKS;
5296 			StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
5297 			t.ClientOption->ProxyPort = port;
5298 			StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
5299 			StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
5300 			Free(host);
5301 		}
5302 
5303 		Zero(&z, sizeof(z));
5304 		z.CheckServerCert = t.CheckServerCert;
5305 		z.ClientAuth = t.ClientAuth;
5306 		z.ClientOption = t.ClientOption;
5307 		z.ServerCert = t.ServerCert;
5308 		z.StartupAccount = t.StartupAccount;
5309 
5310 		ret = CcSetAccount(pc->RemoteClient, &z);
5311 	}
5312 
5313 	if (ret != ERR_NO_ERROR)
5314 	{
5315 		// Error has occurred
5316 		CmdPrintError(c, ret);
5317 	}
5318 
5319 	CiFreeClientGetAccount(&t);
5320 
5321 	// Release of the parameter list
5322 	FreeParamValueList(o);
5323 
5324 	return ret;
5325 }
5326 
5327 // Enable validation option for server certificate of connection settings
PcAccountServerCertEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5328 UINT PcAccountServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5329 {
5330 	LIST *o;
5331 	PC *pc = (PC *)param;
5332 	UINT ret = ERR_NO_ERROR;
5333 	RPC_CLIENT_GET_ACCOUNT t;
5334 	// Parameter list that can be specified
5335 	PARAM args[] =
5336 	{
5337 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5338 	};
5339 
5340 	// Get the parameter list
5341 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5342 	if (o == NULL)
5343 	{
5344 		return ERR_INVALID_PARAMETER;
5345 	}
5346 
5347 	// RPC call
5348 	Zero(&t, sizeof(t));
5349 
5350 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5351 
5352 	ret = CcGetAccount(pc->RemoteClient, &t);
5353 
5354 	if (ret == ERR_NO_ERROR)
5355 	{
5356 		RPC_CLIENT_CREATE_ACCOUNT z;
5357 		// Change the settings
5358 		t.CheckServerCert = true;
5359 
5360 		Zero(&z, sizeof(z));
5361 		z.CheckServerCert = t.CheckServerCert;
5362 		z.ClientAuth = t.ClientAuth;
5363 		z.ClientOption = t.ClientOption;
5364 		z.ServerCert = t.ServerCert;
5365 		z.StartupAccount = t.StartupAccount;
5366 
5367 		ret = CcSetAccount(pc->RemoteClient, &z);
5368 	}
5369 
5370 	if (ret != ERR_NO_ERROR)
5371 	{
5372 		// Error has occurred
5373 		CmdPrintError(c, ret);
5374 	}
5375 
5376 	CiFreeClientGetAccount(&t);
5377 
5378 	// Release of the parameter list
5379 	FreeParamValueList(o);
5380 
5381 	return ret;
5382 }
5383 
5384 // Disable validation option of the server certificate of connection settings
PcAccountServerCertDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5385 UINT PcAccountServerCertDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5386 {
5387 	LIST *o;
5388 	PC *pc = (PC *)param;
5389 	UINT ret = ERR_NO_ERROR;
5390 	RPC_CLIENT_GET_ACCOUNT t;
5391 	// Parameter list that can be specified
5392 	PARAM args[] =
5393 	{
5394 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5395 	};
5396 
5397 	// Get the parameter list
5398 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5399 	if (o == NULL)
5400 	{
5401 		return ERR_INVALID_PARAMETER;
5402 	}
5403 
5404 	// RPC call
5405 	Zero(&t, sizeof(t));
5406 
5407 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5408 
5409 	ret = CcGetAccount(pc->RemoteClient, &t);
5410 
5411 	if (ret == ERR_NO_ERROR)
5412 	{
5413 		RPC_CLIENT_CREATE_ACCOUNT z;
5414 		// Change the settings
5415 		t.CheckServerCert = false;
5416 
5417 		Zero(&z, sizeof(z));
5418 		z.CheckServerCert = t.CheckServerCert;
5419 		z.ClientAuth = t.ClientAuth;
5420 		z.ClientOption = t.ClientOption;
5421 		z.ServerCert = t.ServerCert;
5422 		z.StartupAccount = t.StartupAccount;
5423 
5424 		ret = CcSetAccount(pc->RemoteClient, &z);
5425 	}
5426 
5427 	if (ret != ERR_NO_ERROR)
5428 	{
5429 		// Error has occurred
5430 		CmdPrintError(c, ret);
5431 	}
5432 
5433 	CiFreeClientGetAccount(&t);
5434 
5435 	// Release of the parameter list
5436 	FreeParamValueList(o);
5437 
5438 	return ret;
5439 }
5440 
5441 // Set the server-specific certificate of connection settings
PcAccountServerCertSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5442 UINT PcAccountServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5443 {
5444 	LIST *o;
5445 	PC *pc = (PC *)param;
5446 	UINT ret = ERR_NO_ERROR;
5447 	RPC_CLIENT_GET_ACCOUNT t;
5448 	X *x;
5449 	// Parameter list that can be specified
5450 	PARAM args[] =
5451 	{
5452 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5453 		{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
5454 	};
5455 
5456 	// Get the parameter list
5457 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5458 	if (o == NULL)
5459 	{
5460 		return ERR_INVALID_PARAMETER;
5461 	}
5462 
5463 	x = FileToXW(GetParamUniStr(o, "LOADCERT"));
5464 	if (x == NULL)
5465 	{
5466 		FreeParamValueList(o);
5467 		c->Write(c, _UU("CMD_LOADCERT_FAILED"));
5468 		return ERR_INTERNAL_ERROR;
5469 	}
5470 
5471 	// RPC call
5472 	Zero(&t, sizeof(t));
5473 
5474 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5475 
5476 	ret = CcGetAccount(pc->RemoteClient, &t);
5477 
5478 	if (ret == ERR_NO_ERROR)
5479 	{
5480 		RPC_CLIENT_CREATE_ACCOUNT z;
5481 		// Change the settings
5482 		if (t.ServerCert != NULL)
5483 		{
5484 			FreeX(t.ServerCert);
5485 		}
5486 		t.ServerCert = CloneX(x);
5487 
5488 		Zero(&z, sizeof(z));
5489 		z.CheckServerCert = t.CheckServerCert;
5490 		z.ClientAuth = t.ClientAuth;
5491 		z.ClientOption = t.ClientOption;
5492 		z.ServerCert = t.ServerCert;
5493 		z.StartupAccount = t.StartupAccount;
5494 
5495 		ret = CcSetAccount(pc->RemoteClient, &z);
5496 	}
5497 
5498 	if (ret != ERR_NO_ERROR)
5499 	{
5500 		// Error has occurred
5501 		CmdPrintError(c, ret);
5502 	}
5503 
5504 	CiFreeClientGetAccount(&t);
5505 
5506 	// Release of the parameter list
5507 	FreeParamValueList(o);
5508 
5509 	FreeX(x);
5510 
5511 	return ret;
5512 }
5513 
5514 // Delete a server-specific certificate of connection settings
PcAccountServerCertDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5515 UINT PcAccountServerCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5516 {
5517 	LIST *o;
5518 	PC *pc = (PC *)param;
5519 	UINT ret = ERR_NO_ERROR;
5520 	RPC_CLIENT_GET_ACCOUNT t;
5521 	// Parameter list that can be specified
5522 	PARAM args[] =
5523 	{
5524 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5525 	};
5526 
5527 	// Get the parameter list
5528 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5529 	if (o == NULL)
5530 	{
5531 		return ERR_INVALID_PARAMETER;
5532 	}
5533 
5534 	// RPC call
5535 	Zero(&t, sizeof(t));
5536 
5537 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5538 
5539 	ret = CcGetAccount(pc->RemoteClient, &t);
5540 
5541 	if (ret == ERR_NO_ERROR)
5542 	{
5543 		RPC_CLIENT_CREATE_ACCOUNT z;
5544 		// Change the settings
5545 		if (t.ServerCert != NULL)
5546 		{
5547 			FreeX(t.ServerCert);
5548 		}
5549 		t.ServerCert = NULL;
5550 
5551 		Zero(&z, sizeof(z));
5552 		z.CheckServerCert = t.CheckServerCert;
5553 		z.ClientAuth = t.ClientAuth;
5554 		z.ClientOption = t.ClientOption;
5555 		z.ServerCert = t.ServerCert;
5556 		z.StartupAccount = t.StartupAccount;
5557 
5558 		ret = CcSetAccount(pc->RemoteClient, &z);
5559 	}
5560 
5561 	if (ret != ERR_NO_ERROR)
5562 	{
5563 		// Error has occurred
5564 		CmdPrintError(c, ret);
5565 	}
5566 
5567 	CiFreeClientGetAccount(&t);
5568 
5569 	// Release of the parameter list
5570 	FreeParamValueList(o);
5571 
5572 	return ret;
5573 }
5574 
5575 // Get a server-specific certificate of connection settings
PcAccountServerCertGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5576 UINT PcAccountServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5577 {
5578 	LIST *o;
5579 	PC *pc = (PC *)param;
5580 	UINT ret = ERR_NO_ERROR;
5581 	RPC_CLIENT_GET_ACCOUNT t;
5582 	// Parameter list that can be specified
5583 	PARAM args[] =
5584 	{
5585 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5586 		{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
5587 	};
5588 
5589 	// Get the parameter list
5590 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5591 	if (o == NULL)
5592 	{
5593 		return ERR_INVALID_PARAMETER;
5594 	}
5595 
5596 	// RPC call
5597 	Zero(&t, sizeof(t));
5598 
5599 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5600 
5601 	ret = CcGetAccount(pc->RemoteClient, &t);
5602 
5603 	if (ret == ERR_NO_ERROR)
5604 	{
5605 		RPC_CLIENT_CREATE_ACCOUNT z;
5606 		// Change the settings
5607 		if (t.ServerCert != NULL)
5608 		{
5609 			FreeX(t.ServerCert);
5610 		}
5611 		t.ServerCert = NULL;
5612 
5613 		Zero(&z, sizeof(z));
5614 		z.CheckServerCert = t.CheckServerCert;
5615 		z.ClientAuth = t.ClientAuth;
5616 		z.ClientOption = t.ClientOption;
5617 		z.ServerCert = t.ServerCert;
5618 		z.StartupAccount = t.StartupAccount;
5619 
5620 		ret = CcSetAccount(pc->RemoteClient, &z);
5621 	}
5622 
5623 	if (ret != ERR_NO_ERROR)
5624 	{
5625 		// Error has occurred
5626 		CmdPrintError(c, ret);
5627 	}
5628 
5629 	CiFreeClientGetAccount(&t);
5630 
5631 	// Release of the parameter list
5632 	FreeParamValueList(o);
5633 
5634 	return ret;
5635 }
5636 
5637 // Set the advanced settings of connection settings
PcAccountDetailSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5638 UINT PcAccountDetailSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5639 {
5640 	LIST *o;
5641 	PC *pc = (PC *)param;
5642 	UINT ret = ERR_NO_ERROR;
5643 	RPC_CLIENT_GET_ACCOUNT t;
5644 	CMD_EVAL_MIN_MAX mm_maxtcp =
5645 	{
5646 		"CMD_CascadeDetailSet_Eval_MaxTcp", 1, 32
5647 	};
5648 	CMD_EVAL_MIN_MAX mm_interval =
5649 	{
5650 		"CMD_CascadeDetailSet_Eval_Interval", 1, 4294967295UL
5651 	};
5652 	// Parameter list that can be specified
5653 	PARAM args[] =
5654 	{
5655 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5656 		{"MAXTCP", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_MaxTcp"), CmdEvalMinMax, &mm_maxtcp},
5657 		{"INTERVAL", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_Interval"), CmdEvalMinMax, &mm_interval},
5658 		{"TTL", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_TTL"), NULL, NULL},
5659 		{"HALF", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_HALF"), NULL, NULL},
5660 		{"BRIDGE", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_BRIDGE"), NULL, NULL},
5661 		{"MONITOR", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_MONITOR"), NULL, NULL},
5662 		{"NOTRACK", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_NOTRACK"), NULL, NULL},
5663 		{"NOQOS", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_NOQOS"), NULL, NULL},
5664 	};
5665 
5666 	// Get the parameter list
5667 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5668 	if (o == NULL)
5669 	{
5670 		return ERR_INVALID_PARAMETER;
5671 	}
5672 
5673 	// RPC call
5674 	Zero(&t, sizeof(t));
5675 
5676 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5677 
5678 	ret = CcGetAccount(pc->RemoteClient, &t);
5679 
5680 	if (ret == ERR_NO_ERROR)
5681 	{
5682 		RPC_CLIENT_CREATE_ACCOUNT z;
5683 		// Data change
5684 		t.ClientOption->MaxConnection = GetParamInt(o, "MAXTCP");
5685 		t.ClientOption->AdditionalConnectionInterval = GetParamInt(o, "INTERVAL");
5686 		t.ClientOption->ConnectionDisconnectSpan = GetParamInt(o, "TTL");
5687 		t.ClientOption->HalfConnection = GetParamYes(o, "HALF");
5688 		t.ClientOption->RequireBridgeRoutingMode = GetParamYes(o, "BRIDGE");
5689 		t.ClientOption->RequireMonitorMode = GetParamYes(o, "MONITOR");
5690 		t.ClientOption->NoRoutingTracking = GetParamYes(o, "NOTRACK");
5691 		t.ClientOption->DisableQoS = GetParamYes(o, "NOQOS");
5692 
5693 		Zero(&z, sizeof(z));
5694 		z.CheckServerCert = t.CheckServerCert;
5695 		z.ClientAuth = t.ClientAuth;
5696 		z.ClientOption = t.ClientOption;
5697 		z.ServerCert = t.ServerCert;
5698 		z.StartupAccount = t.StartupAccount;
5699 
5700 		ret = CcSetAccount(pc->RemoteClient, &z);
5701 	}
5702 
5703 	if (ret != ERR_NO_ERROR)
5704 	{
5705 		// Error has occurred
5706 		CmdPrintError(c, ret);
5707 	}
5708 
5709 	CiFreeClientGetAccount(&t);
5710 
5711 	// Release of the parameter list
5712 	FreeParamValueList(o);
5713 
5714 	return ret;
5715 }
5716 
5717 // Change the name of the connection settings
PcAccountRename(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5718 UINT PcAccountRename(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5719 {
5720 	LIST *o;
5721 	PC *pc = (PC *)param;
5722 	UINT ret = ERR_NO_ERROR;
5723 	RPC_RENAME_ACCOUNT t;
5724 	// Parameter list that can be specified
5725 	PARAM args[] =
5726 	{
5727 		{"[name]", CmdPrompt, _UU("CMD_AccountRename_PROMPT_OLD"), CmdEvalNotEmpty, NULL},
5728 		{"NEW", CmdPrompt, _UU("CMD_AccountRename_PROMPT_NEW"), CmdEvalNotEmpty, NULL},
5729 	};
5730 
5731 	// Get the parameter list
5732 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5733 	if (o == NULL)
5734 	{
5735 		return ERR_INVALID_PARAMETER;
5736 	}
5737 
5738 	// RPC call
5739 	Zero(&t, sizeof(t));
5740 	UniStrCpy(t.NewName, sizeof(t.NewName), GetParamUniStr(o, "NEW"));
5741 	UniStrCpy(t.OldName, sizeof(t.OldName), GetParamUniStr(o, "[name]"));
5742 
5743 	ret = CcRenameAccount(pc->RemoteClient, &t);
5744 
5745 	if (ret == ERR_NO_ERROR)
5746 	{
5747 		// Success
5748 	}
5749 
5750 	if (ret != ERR_NO_ERROR)
5751 	{
5752 		// Error has occurred
5753 		CmdPrintError(c, ret);
5754 	}
5755 
5756 	// Release of the parameter list
5757 	FreeParamValueList(o);
5758 
5759 	return ret;
5760 }
5761 
5762 // Start to connect to the VPN Server using the connection settings
PcAccountConnect(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5763 UINT PcAccountConnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5764 {
5765 	LIST *o;
5766 	PC *pc = (PC *)param;
5767 	UINT ret = ERR_NO_ERROR;
5768 	RPC_CLIENT_CONNECT t;
5769 	// Parameter list that can be specified
5770 	PARAM args[] =
5771 	{
5772 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5773 	};
5774 
5775 	// Get the parameter list
5776 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5777 	if (o == NULL)
5778 	{
5779 		return ERR_INVALID_PARAMETER;
5780 	}
5781 
5782 	// RPC call
5783 	Zero(&t, sizeof(t));
5784 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5785 
5786 	ret = CcConnect(pc->RemoteClient, &t);
5787 
5788 	if (ret == ERR_NO_ERROR)
5789 	{
5790 		// Success
5791 	}
5792 
5793 	if (ret != ERR_NO_ERROR)
5794 	{
5795 		// Error has occurred
5796 		CmdPrintError(c, ret);
5797 	}
5798 
5799 	// Release of the parameter list
5800 	FreeParamValueList(o);
5801 
5802 	return ret;
5803 }
5804 
5805 // Disconnect the connection settings of connected
PcAccountDisconnect(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5806 UINT PcAccountDisconnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5807 {
5808 	LIST *o;
5809 	PC *pc = (PC *)param;
5810 	UINT ret = ERR_NO_ERROR;
5811 	RPC_CLIENT_CONNECT t;
5812 	// Parameter list that can be specified
5813 	PARAM args[] =
5814 	{
5815 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5816 	};
5817 
5818 	// Get the parameter list
5819 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5820 	if (o == NULL)
5821 	{
5822 		return ERR_INVALID_PARAMETER;
5823 	}
5824 
5825 	// RPC call
5826 	Zero(&t, sizeof(t));
5827 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5828 
5829 	ret = CcDisconnect(pc->RemoteClient, &t);
5830 
5831 	if (ret == ERR_NO_ERROR)
5832 	{
5833 		// Success
5834 	}
5835 
5836 	if (ret != ERR_NO_ERROR)
5837 	{
5838 		// Error has occurred
5839 		CmdPrintError(c, ret);
5840 	}
5841 
5842 	// Release of the parameter list
5843 	FreeParamValueList(o);
5844 
5845 	return ret;
5846 }
5847 
5848 // Get the current state of the connection settings
PcAccountStatusGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5849 UINT PcAccountStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5850 {
5851 	LIST *o;
5852 	PC *pc = (PC *)param;
5853 	UINT ret = ERR_NO_ERROR;
5854 	RPC_CLIENT_GET_CONNECTION_STATUS t;
5855 	// Parameter list that can be specified
5856 	PARAM args[] =
5857 	{
5858 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5859 	};
5860 
5861 	// Get the parameter list
5862 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5863 	if (o == NULL)
5864 	{
5865 		return ERR_INVALID_PARAMETER;
5866 	}
5867 
5868 	// RPC call
5869 	Zero(&t, sizeof(t));
5870 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5871 
5872 	ret = CcGetAccountStatus(pc->RemoteClient, &t);
5873 
5874 	if (ret == ERR_NO_ERROR)
5875 	{
5876 		if (t.Active == false)
5877 		{
5878 			// Has been disconnected
5879 			ret = ERR_ACCOUNT_INACTIVE;
5880 		}
5881 		else
5882 		{
5883 			CT *ct = CtNewStandard();
5884 
5885 			CmdPrintStatusToListView(ct, &t);
5886 
5887 			CtFree(ct, c);
5888 		}
5889 	}
5890 
5891 	if (ret != ERR_NO_ERROR)
5892 	{
5893 		// Error has occurred
5894 		CmdPrintError(c, ret);
5895 	}
5896 
5897 	CiFreeClientGetConnectionStatus(&t);
5898 
5899 	// Release of the parameter list
5900 	FreeParamValueList(o);
5901 
5902 	return ret;
5903 }
5904 
5905 // Set a virtual LAN card to be used in the connection settings
PcAccountNicSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5906 UINT PcAccountNicSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5907 {
5908 	LIST *o;
5909 	PC *pc = (PC *)param;
5910 	UINT ret = ERR_NO_ERROR;
5911 	RPC_CLIENT_GET_ACCOUNT t;
5912 	// Parameter list that can be specified
5913 	PARAM args[] =
5914 	{
5915 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5916 		{"NICNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Nicname"), CmdEvalNotEmpty, NULL},
5917 	};
5918 
5919 	// Get the parameter list
5920 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5921 	if (o == NULL)
5922 	{
5923 		return ERR_INVALID_PARAMETER;
5924 	}
5925 
5926 	// RPC call
5927 	Zero(&t, sizeof(t));
5928 
5929 	Zero(&t, sizeof(t));
5930 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5931 
5932 	ret = CcGetAccount(pc->RemoteClient, &t);
5933 
5934 	if (ret == ERR_NO_ERROR)
5935 	{
5936 		RPC_CLIENT_CREATE_ACCOUNT c;
5937 		// Success
5938 		StrCpy(t.ClientOption->DeviceName, sizeof(t.ClientOption->DeviceName),
5939 			GetParamStr(o, "NICNAME"));
5940 
5941 		Zero(&c, sizeof(c));
5942 
5943 		c.ClientAuth = t.ClientAuth;
5944 		c.ClientOption = t.ClientOption;
5945 		c.CheckServerCert = t.CheckServerCert;
5946 		c.ServerCert = t.ServerCert;
5947 		c.StartupAccount = t.StartupAccount;
5948 
5949 		ret = CcSetAccount(pc->RemoteClient, &c);
5950 	}
5951 
5952 	if (ret != ERR_NO_ERROR)
5953 	{
5954 		// Error has occurred
5955 		CmdPrintError(c, ret);
5956 	}
5957 
5958 	CiFreeClientGetAccount(&t);
5959 
5960 	// Release of the parameter list
5961 	FreeParamValueList(o);
5962 
5963 	return ret;
5964 }
5965 
5966 // Set to display error screens and connection status while connecting to the VPN Server
PcAccountStatusShow(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5967 UINT PcAccountStatusShow(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5968 {
5969 	LIST *o;
5970 	PC *pc = (PC *)param;
5971 	UINT ret = ERR_NO_ERROR;
5972 	RPC_CLIENT_GET_ACCOUNT t;
5973 	// Parameter list that can be specified
5974 	PARAM args[] =
5975 	{
5976 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5977 	};
5978 
5979 	// Get the parameter list
5980 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5981 	if (o == NULL)
5982 	{
5983 		return ERR_INVALID_PARAMETER;
5984 	}
5985 
5986 	// RPC call
5987 	Zero(&t, sizeof(t));
5988 
5989 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5990 
5991 	ret = CcGetAccount(pc->RemoteClient, &t);
5992 
5993 	if (ret == ERR_NO_ERROR)
5994 	{
5995 		RPC_CLIENT_CREATE_ACCOUNT z;
5996 		// Change the settings
5997 		t.ClientOption->HideStatusWindow = false;
5998 
5999 		Zero(&z, sizeof(z));
6000 		z.CheckServerCert = t.CheckServerCert;
6001 		z.ClientAuth = t.ClientAuth;
6002 		z.ClientOption = t.ClientOption;
6003 		z.ServerCert = t.ServerCert;
6004 		z.StartupAccount = t.StartupAccount;
6005 
6006 		ret = CcSetAccount(pc->RemoteClient, &z);
6007 	}
6008 
6009 	if (ret != ERR_NO_ERROR)
6010 	{
6011 		// Error has occurred
6012 		CmdPrintError(c, ret);
6013 	}
6014 
6015 	CiFreeClientGetAccount(&t);
6016 
6017 	// Release of the parameter list
6018 	FreeParamValueList(o);
6019 
6020 	return ret;
6021 }
6022 
6023 // Configure not to display error screens and connection status while connecting to the VPN Server
PcAccountStatusHide(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6024 UINT PcAccountStatusHide(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6025 {
6026 	LIST *o;
6027 	PC *pc = (PC *)param;
6028 	UINT ret = ERR_NO_ERROR;
6029 	RPC_CLIENT_GET_ACCOUNT t;
6030 	// Parameter list that can be specified
6031 	PARAM args[] =
6032 	{
6033 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6034 	};
6035 
6036 	// Get the parameter list
6037 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6038 	if (o == NULL)
6039 	{
6040 		return ERR_INVALID_PARAMETER;
6041 	}
6042 
6043 	// RPC call
6044 	Zero(&t, sizeof(t));
6045 
6046 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6047 
6048 	ret = CcGetAccount(pc->RemoteClient, &t);
6049 
6050 	if (ret == ERR_NO_ERROR)
6051 	{
6052 		RPC_CLIENT_CREATE_ACCOUNT z;
6053 		// Change the settings
6054 		t.ClientOption->HideStatusWindow = true;
6055 
6056 		Zero(&z, sizeof(z));
6057 		z.CheckServerCert = t.CheckServerCert;
6058 		z.ClientAuth = t.ClientAuth;
6059 		z.ClientOption = t.ClientOption;
6060 		z.ServerCert = t.ServerCert;
6061 		z.StartupAccount = t.StartupAccount;
6062 
6063 		ret = CcSetAccount(pc->RemoteClient, &z);
6064 	}
6065 
6066 	if (ret != ERR_NO_ERROR)
6067 	{
6068 		// Error has occurred
6069 		CmdPrintError(c, ret);
6070 	}
6071 
6072 	CiFreeClientGetAccount(&t);
6073 
6074 	// Release of the parameter list
6075 	FreeParamValueList(o);
6076 
6077 	return ret;
6078 }
6079 
6080 // Set the type of user authentication of connection settings to the smart card authentication
PcAccountSecureCertSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6081 UINT PcAccountSecureCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6082 {
6083 	LIST *o;
6084 	PC *pc = (PC *)param;
6085 	UINT ret = ERR_NO_ERROR;
6086 	RPC_CLIENT_GET_ACCOUNT t;
6087 	// Parameter list that can be specified
6088 	PARAM args[] =
6089 	{
6090 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6091 		{"CERTNAME", CmdPrompt, _UU("CMD_AccountSecureCertSet_PROMPT_CERTNAME"), CmdEvalNotEmpty, NULL},
6092 		{"KEYNAME", CmdPrompt, _UU("CMD_AccountSecureCertSet_PROMPT_KEYNAME"), CmdEvalNotEmpty, NULL},
6093 	};
6094 
6095 	// Get the parameter list
6096 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6097 	if (o == NULL)
6098 	{
6099 		return ERR_INVALID_PARAMETER;
6100 	}
6101 
6102 	// RPC call
6103 	Zero(&t, sizeof(t));
6104 
6105 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6106 
6107 	ret = CcGetAccount(pc->RemoteClient, &t);
6108 
6109 	if (ret == ERR_NO_ERROR)
6110 	{
6111 		RPC_CLIENT_CREATE_ACCOUNT z;
6112 		// Change the settings
6113 		t.ClientAuth->AuthType = CLIENT_AUTHTYPE_SECURE;
6114 		StrCpy(t.ClientAuth->SecurePublicCertName, sizeof(t.ClientAuth->SecurePublicCertName),
6115 			GetParamStr(o, "CERTNAME"));
6116 		StrCpy(t.ClientAuth->SecurePrivateKeyName, sizeof(t.ClientAuth->SecurePrivateKeyName),
6117 			GetParamStr(o, "KEYNAME"));
6118 
6119 		Zero(&z, sizeof(z));
6120 		z.CheckServerCert = t.CheckServerCert;
6121 		z.ClientAuth = t.ClientAuth;
6122 		z.ClientOption = t.ClientOption;
6123 		z.ServerCert = t.ServerCert;
6124 		z.StartupAccount = t.StartupAccount;
6125 
6126 		ret = CcSetAccount(pc->RemoteClient, &z);
6127 	}
6128 
6129 	if (ret != ERR_NO_ERROR)
6130 	{
6131 		// Error has occurred
6132 		CmdPrintError(c, ret);
6133 	}
6134 
6135 	CiFreeClientGetAccount(&t);
6136 
6137 	// Release of the parameter list
6138 	FreeParamValueList(o);
6139 
6140 	return ret;
6141 }
6142 
6143 // Set the retry interval and number of retries when disconnect or connection failure of connection settings
PcAccountRetrySet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6144 UINT PcAccountRetrySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6145 {
6146 	LIST *o;
6147 	PC *pc = (PC *)param;
6148 	UINT ret = ERR_NO_ERROR;
6149 	RPC_CLIENT_GET_ACCOUNT t;
6150 	// Parameter list that can be specified
6151 	CMD_EVAL_MIN_MAX minmax =
6152 	{
6153 		"CMD_AccountRetrySet_EVAL_INTERVAL",
6154 		5,
6155 		4294967295UL,
6156 	};
6157 	PARAM args[] =
6158 	{
6159 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6160 		{"NUM", CmdPrompt, _UU("CMD_AccountRetrySet_PROMPT_NUM"), CmdEvalNotEmpty, NULL},
6161 		{"INTERVAL", CmdPrompt, _UU("CMD_AccountRetrySet_PROMPY_INTERVAL"), CmdEvalMinMax, &minmax},
6162 	};
6163 
6164 	// Get the parameter list
6165 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6166 	if (o == NULL)
6167 	{
6168 		return ERR_INVALID_PARAMETER;
6169 	}
6170 
6171 	// RPC call
6172 	Zero(&t, sizeof(t));
6173 
6174 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6175 
6176 	ret = CcGetAccount(pc->RemoteClient, &t);
6177 
6178 	if (ret == ERR_NO_ERROR)
6179 	{
6180 		RPC_CLIENT_CREATE_ACCOUNT z;
6181 		// Change the settings
6182 		UINT num = GetParamInt(o, "NUM");
6183 		UINT interval = GetParamInt(o, "INTERVAL");
6184 
6185 		t.ClientOption->NumRetry = (num == 999) ? INFINITE : num;
6186 		t.ClientOption->RetryInterval = interval;
6187 
6188 		Zero(&z, sizeof(z));
6189 		z.CheckServerCert = t.CheckServerCert;
6190 		z.ClientAuth = t.ClientAuth;
6191 		z.ClientOption = t.ClientOption;
6192 		z.ServerCert = t.ServerCert;
6193 		z.StartupAccount = t.StartupAccount;
6194 
6195 		ret = CcSetAccount(pc->RemoteClient, &z);
6196 	}
6197 
6198 	if (ret != ERR_NO_ERROR)
6199 	{
6200 		// Error has occurred
6201 		CmdPrintError(c, ret);
6202 	}
6203 
6204 	CiFreeClientGetAccount(&t);
6205 
6206 	// Release of the parameter list
6207 	FreeParamValueList(o);
6208 
6209 	return ret;
6210 }
6211 
6212 
6213 // Set to start-up connection the connection settings
PcAccountStartupSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6214 UINT PcAccountStartupSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6215 {
6216 	LIST *o;
6217 	PC *pc = (PC *)param;
6218 	UINT ret = ERR_NO_ERROR;
6219 	RPC_CLIENT_GET_ACCOUNT t;
6220 	// Parameter list that can be specified
6221 	PARAM args[] =
6222 	{
6223 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6224 	};
6225 
6226 	// Get the parameter list
6227 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6228 	if (o == NULL)
6229 	{
6230 		return ERR_INVALID_PARAMETER;
6231 	}
6232 
6233 	// RPC call
6234 	Zero(&t, sizeof(t));
6235 
6236 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6237 
6238 	ret = CcGetAccount(pc->RemoteClient, &t);
6239 
6240 	if (ret == ERR_NO_ERROR)
6241 	{
6242 		RPC_CLIENT_CREATE_ACCOUNT z;
6243 		// Change the settings
6244 		t.StartupAccount = true;
6245 
6246 		Zero(&z, sizeof(z));
6247 		z.CheckServerCert = t.CheckServerCert;
6248 		z.ClientAuth = t.ClientAuth;
6249 		z.ClientOption = t.ClientOption;
6250 		z.ServerCert = t.ServerCert;
6251 		z.StartupAccount = t.StartupAccount;
6252 
6253 		ret = CcSetAccount(pc->RemoteClient, &z);
6254 	}
6255 
6256 	if (ret != ERR_NO_ERROR)
6257 	{
6258 		// Error has occurred
6259 		CmdPrintError(c, ret);
6260 	}
6261 
6262 	CiFreeClientGetAccount(&t);
6263 
6264 	// Release of the parameter list
6265 	FreeParamValueList(o);
6266 
6267 	return ret;
6268 }
6269 
6270 // Unset the start-up connection of the connection settings
PcAccountStartupRemove(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6271 UINT PcAccountStartupRemove(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6272 {
6273 	LIST *o;
6274 	PC *pc = (PC *)param;
6275 	UINT ret = ERR_NO_ERROR;
6276 	RPC_CLIENT_GET_ACCOUNT t;
6277 	// Parameter list that can be specified
6278 	PARAM args[] =
6279 	{
6280 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6281 	};
6282 
6283 	// Get the parameter list
6284 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6285 	if (o == NULL)
6286 	{
6287 		return ERR_INVALID_PARAMETER;
6288 	}
6289 
6290 	// RPC call
6291 	Zero(&t, sizeof(t));
6292 
6293 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6294 
6295 	ret = CcGetAccount(pc->RemoteClient, &t);
6296 
6297 	if (ret == ERR_NO_ERROR)
6298 	{
6299 		RPC_CLIENT_CREATE_ACCOUNT z;
6300 		// Change the settings
6301 		t.StartupAccount = false;
6302 
6303 		Zero(&z, sizeof(z));
6304 		z.CheckServerCert = t.CheckServerCert;
6305 		z.ClientAuth = t.ClientAuth;
6306 		z.ClientOption = t.ClientOption;
6307 		z.ServerCert = t.ServerCert;
6308 		z.StartupAccount = t.StartupAccount;
6309 
6310 		ret = CcSetAccount(pc->RemoteClient, &z);
6311 	}
6312 
6313 	if (ret != ERR_NO_ERROR)
6314 	{
6315 		// Error has occurred
6316 		CmdPrintError(c, ret);
6317 	}
6318 
6319 	CiFreeClientGetAccount(&t);
6320 
6321 	// Release of the parameter list
6322 	FreeParamValueList(o);
6323 
6324 	return ret;
6325 }
6326 
6327 // Export the connection settings
PcAccountExport(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6328 UINT PcAccountExport(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6329 {
6330 	LIST *o;
6331 	PC *pc = (PC *)param;
6332 	UINT ret = ERR_NO_ERROR;
6333 	RPC_CLIENT_GET_ACCOUNT t;
6334 	// Parameter list that can be specified
6335 	PARAM args[] =
6336 	{
6337 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6338 		{"SAVEPATH", CmdPrompt, _UU("CMD_AccountExport_PROMPT_SAVEPATH"), CmdEvalNotEmpty, NULL},
6339 	};
6340 
6341 	// Get the parameter list
6342 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6343 	if (o == NULL)
6344 	{
6345 		return ERR_INVALID_PARAMETER;
6346 	}
6347 
6348 	// RPC call
6349 	Zero(&t, sizeof(t));
6350 
6351 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6352 
6353 	ret = CcGetAccount(pc->RemoteClient, &t);
6354 
6355 	if (ret == ERR_NO_ERROR)
6356 	{
6357 		RPC_CLIENT_CREATE_ACCOUNT z;
6358 		BUF *b;
6359 		BUF *b2;
6360 		char tmp[MAX_SIZE];
6361 		UCHAR *buf;
6362 		UINT buf_size;
6363 		UCHAR bom[] = {0xef, 0xbb, 0xbf, };
6364 
6365 		Zero(&z, sizeof(z));
6366 		z.CheckServerCert = t.CheckServerCert;
6367 		z.ClientAuth = t.ClientAuth;
6368 		z.ClientOption = t.ClientOption;
6369 		z.ServerCert = t.ServerCert;
6370 		z.StartupAccount = t.StartupAccount;
6371 
6372 		b = CiAccountToCfg(&z);
6373 
6374 		StrCpy(tmp, sizeof(tmp), GetParamStr(o, "SAVEPATH"));
6375 		b2 = NewBuf();
6376 
6377 		WriteBuf(b2, bom, sizeof(bom));
6378 
6379 		// Add the header part
6380 		buf_size = CalcUniToUtf8(_UU("CM_ACCOUNT_FILE_BANNER"));
6381 		buf = ZeroMalloc(buf_size + 32);
6382 		UniToUtf8(buf, buf_size, _UU("CM_ACCOUNT_FILE_BANNER"));
6383 
6384 		WriteBuf(b2, buf, StrLen((char *)buf));
6385 		WriteBuf(b2, b->Buf, b->Size);
6386 		SeekBuf(b2, 0, 0);
6387 
6388 		FreeBuf(b);
6389 
6390 		if (DumpBuf(b2, tmp) == false)
6391 		{
6392 			c->Write(c, _UU("CMD_SAVEFILE_FAILED"));
6393 			ret = ERR_INTERNAL_ERROR;
6394 		}
6395 
6396 		FreeBuf(b2);
6397 		Free(buf);
6398 	}
6399 
6400 	if (ret != ERR_NO_ERROR)
6401 	{
6402 		// Error has occurred
6403 		CmdPrintError(c, ret);
6404 	}
6405 
6406 	CiFreeClientGetAccount(&t);
6407 
6408 	// Release of the parameter list
6409 	FreeParamValueList(o);
6410 
6411 	return ret;
6412 }
6413 
6414 // Check whether the specified account name exists
CmdIsAccountName(REMOTE_CLIENT * r,wchar_t * name)6415 bool CmdIsAccountName(REMOTE_CLIENT *r, wchar_t *name)
6416 {
6417 	UINT i;
6418 	RPC_CLIENT_ENUM_ACCOUNT t;
6419 	wchar_t tmp[MAX_SIZE];
6420 	bool b = false;
6421 	// Validate arguments
6422 	if (r == NULL || name == NULL)
6423 	{
6424 		return false;
6425 	}
6426 
6427 	if (CcEnumAccount(r, &t) != ERR_NO_ERROR)
6428 	{
6429 		return false;
6430 	}
6431 
6432 	UniStrCpy(tmp, sizeof(tmp), name);
6433 	UniTrim(tmp);
6434 
6435 	for (i = 0;i < t.NumItem;i++)
6436 	{
6437 		if (UniStrCmpi(t.Items[i]->AccountName, tmp) == 0)
6438 		{
6439 			b = true;
6440 			break;
6441 		}
6442 	}
6443 
6444 	CiFreeClientEnumAccount(&t);
6445 
6446 	return b;
6447 }
6448 
6449 // Generate an import name
CmdGenerateImportName(REMOTE_CLIENT * r,wchar_t * name,UINT size,wchar_t * old_name)6450 void CmdGenerateImportName(REMOTE_CLIENT *r, wchar_t *name, UINT size, wchar_t *old_name)
6451 {
6452 	UINT i;
6453 	// Validate arguments
6454 	if (r == NULL || name == NULL || old_name == NULL)
6455 	{
6456 		return;
6457 	}
6458 
6459 	for (i = 1;;i++)
6460 	{
6461 		wchar_t tmp[MAX_SIZE];
6462 		if (i == 1)
6463 		{
6464 			UniFormat(tmp, sizeof(tmp), _UU("CM_IMPORT_NAME_1"), old_name);
6465 		}
6466 		else
6467 		{
6468 			UniFormat(tmp, sizeof(tmp), _UU("CM_IMPORT_NAME_2"), old_name, i);
6469 		}
6470 
6471 		if (CmdIsAccountName(r, tmp) == false)
6472 		{
6473 			UniStrCpy(name, size, tmp);
6474 			return;
6475 		}
6476 	}
6477 }
6478 
6479 // Import a connection setting
PcAccountImport(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6480 UINT PcAccountImport(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6481 {
6482 	LIST *o;
6483 	PC *pc = (PC *)param;
6484 	UINT ret = ERR_NO_ERROR;
6485 	BUF *b;
6486 	wchar_t name[MAX_SIZE];
6487 	// Parameter list that can be specified
6488 	PARAM args[] =
6489 	{
6490 		{"[path]", CmdPrompt, _UU("CMD_AccountImport_PROMPT_PATH"), CmdEvalIsFile, NULL},
6491 	};
6492 
6493 	// Get the parameter list
6494 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6495 	if (o == NULL)
6496 	{
6497 		return ERR_INVALID_PARAMETER;
6498 	}
6499 
6500 	// Read the file
6501 	b = ReadDumpW(GetParamUniStr(o, "[path]"));
6502 
6503 	if (b == NULL)
6504 	{
6505 		// Read failure
6506 		c->Write(c, _UU("CMD_LOADFILE_FAILED"));
6507 		ret = ERR_INTERNAL_ERROR;
6508 	}
6509 	else
6510 	{
6511 		RPC_CLIENT_CREATE_ACCOUNT *t;
6512 
6513 		t = CiCfgToAccount(b);
6514 
6515 		if (t == NULL)
6516 		{
6517 			// Failed to parse
6518 			c->Write(c, _UU("CMD_AccountImport_FAILED_PARSE"));
6519 			ret = ERR_INTERNAL_ERROR;
6520 		}
6521 		else
6522 		{
6523 			CmdGenerateImportName(pc->RemoteClient, name, sizeof(name), t->ClientOption->AccountName);
6524 			UniStrCpy(t->ClientOption->AccountName, sizeof(t->ClientOption->AccountName), name);
6525 
6526 			ret = CcCreateAccount(pc->RemoteClient, t);
6527 
6528 			if (ret == ERR_NO_ERROR)
6529 			{
6530 				wchar_t tmp[MAX_SIZE];
6531 
6532 				UniFormat(tmp, sizeof(tmp), _UU("CMD_AccountImport_OK"), name);
6533 				c->Write(c, tmp);
6534 			}
6535 
6536 			CiFreeClientCreateAccount(t);
6537 			Free(t);
6538 		}
6539 
6540 		FreeBuf(b);
6541 	}
6542 
6543 	if (ret != ERR_NO_ERROR)
6544 	{
6545 		// Error has occurred
6546 		CmdPrintError(c, ret);
6547 	}
6548 
6549 	// Release of the parameter list
6550 	FreeParamValueList(o);
6551 
6552 	return ret;
6553 }
6554 
6555 // Allow remote management of the VPN Client Service
PcRemoteEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6556 UINT PcRemoteEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6557 {
6558 	LIST *o;
6559 	PC *pc = (PC *)param;
6560 	UINT ret = ERR_NO_ERROR;
6561 	CLIENT_CONFIG t;
6562 
6563 	// Get the parameter list
6564 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
6565 	if (o == NULL)
6566 	{
6567 		return ERR_INVALID_PARAMETER;
6568 	}
6569 
6570 	// RPC call
6571 	Zero(&t, sizeof(t));
6572 
6573 	ret = CcGetClientConfig(pc->RemoteClient, &t);
6574 
6575 	if (ret == ERR_NO_ERROR)
6576 	{
6577 		t.AllowRemoteConfig = true;
6578 		ret = CcSetClientConfig(pc->RemoteClient, &t);
6579 	}
6580 
6581 	if (ret == ERR_NO_ERROR)
6582 	{
6583 		// Success
6584 	}
6585 
6586 	if (ret != ERR_NO_ERROR)
6587 	{
6588 		// Error has occurred
6589 		CmdPrintError(c, ret);
6590 	}
6591 
6592 	// Release of the parameter list
6593 	FreeParamValueList(o);
6594 
6595 	return ret;
6596 }
6597 
6598 // Prohibit remote management of the VPN Client Service
PcRemoteDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6599 UINT PcRemoteDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6600 {
6601 	LIST *o;
6602 	PC *pc = (PC *)param;
6603 	UINT ret = ERR_NO_ERROR;
6604 	CLIENT_CONFIG t;
6605 
6606 	// Get the parameter list
6607 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
6608 	if (o == NULL)
6609 	{
6610 		return ERR_INVALID_PARAMETER;
6611 	}
6612 
6613 	// RPC call
6614 	Zero(&t, sizeof(t));
6615 
6616 	ret = CcGetClientConfig(pc->RemoteClient, &t);
6617 
6618 	if (ret == ERR_NO_ERROR)
6619 	{
6620 		t.AllowRemoteConfig = false;
6621 		ret = CcSetClientConfig(pc->RemoteClient, &t);
6622 	}
6623 
6624 	if (ret == ERR_NO_ERROR)
6625 	{
6626 		// Success
6627 	}
6628 
6629 	if (ret != ERR_NO_ERROR)
6630 	{
6631 		// Error has occurred
6632 		CmdPrintError(c, ret);
6633 	}
6634 
6635 	// Release of the parameter list
6636 	FreeParamValueList(o);
6637 
6638 	return ret;
6639 }
6640 
6641 // Enable the maintenance function of the Internet connection
PcKeepEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6642 UINT PcKeepEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6643 {
6644 	LIST *o;
6645 	PC *pc = (PC *)param;
6646 	UINT ret = ERR_NO_ERROR;
6647 	CLIENT_CONFIG t;
6648 
6649 	// Get the parameter list
6650 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
6651 	if (o == NULL)
6652 	{
6653 		return ERR_INVALID_PARAMETER;
6654 	}
6655 
6656 	// RPC call
6657 	Zero(&t, sizeof(t));
6658 
6659 	ret = CcGetClientConfig(pc->RemoteClient, &t);
6660 
6661 	if (ret == ERR_NO_ERROR)
6662 	{
6663 		// Change the settings
6664 		t.UseKeepConnect = true;
6665 		ret = CcSetClientConfig(pc->RemoteClient, &t);
6666 	}
6667 
6668 	if (ret == ERR_NO_ERROR)
6669 	{
6670 		// Success
6671 	}
6672 
6673 	if (ret != ERR_NO_ERROR)
6674 	{
6675 		// Error has occurred
6676 		CmdPrintError(c, ret);
6677 	}
6678 
6679 	// Release of the parameter list
6680 	FreeParamValueList(o);
6681 
6682 	return ret;
6683 }
6684 
6685 // Disable the maintenance function of the Internet connection
PcKeepDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6686 UINT PcKeepDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6687 {
6688 	LIST *o;
6689 	PC *pc = (PC *)param;
6690 	UINT ret = ERR_NO_ERROR;
6691 	CLIENT_CONFIG t;
6692 
6693 	// Get the parameter list
6694 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
6695 	if (o == NULL)
6696 	{
6697 		return ERR_INVALID_PARAMETER;
6698 	}
6699 
6700 	// RPC call
6701 	Zero(&t, sizeof(t));
6702 
6703 	ret = CcGetClientConfig(pc->RemoteClient, &t);
6704 
6705 	if (ret == ERR_NO_ERROR)
6706 	{
6707 		// Change the settings
6708 		t.UseKeepConnect = false;
6709 		ret = CcSetClientConfig(pc->RemoteClient, &t);
6710 	}
6711 
6712 	if (ret == ERR_NO_ERROR)
6713 	{
6714 		// Success
6715 	}
6716 
6717 	if (ret != ERR_NO_ERROR)
6718 	{
6719 		// Error has occurred
6720 		CmdPrintError(c, ret);
6721 	}
6722 
6723 	// Release of the parameter list
6724 	FreeParamValueList(o);
6725 
6726 	return ret;
6727 }
6728 
6729 // Set the maintenance function of the Internet connection
PcKeepSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6730 UINT PcKeepSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6731 {
6732 	LIST *o;
6733 	PC *pc = (PC *)param;
6734 	UINT ret = ERR_NO_ERROR;
6735 	CLIENT_CONFIG t;
6736 	char *host;
6737 	UINT port;
6738 	// Parameter list that can be specified
6739 	PARAM args[] =
6740 	{
6741 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
6742 		{"HOST", CmdPrompt, _UU("CMD_KeepSet_PROMPT_HOST"), CmdEvalHostAndPort, NULL},
6743 		{"PROTOCOL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_PROTOCOL"), CmdEvalTcpOrUdp, NULL},
6744 		{"INTERVAL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_INTERVAL"), NULL, NULL},
6745 	};
6746 
6747 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6748 	if (o == NULL)
6749 	{
6750 		return ERR_INVALID_PARAMETER;
6751 	}
6752 
6753 	// RPC call
6754 	Zero(&t, sizeof(t));
6755 
6756 	ret = CcGetClientConfig(pc->RemoteClient, &t);
6757 
6758 	if (ret == ERR_NO_ERROR)
6759 	{
6760 		if (ParseHostPort(GetParamStr(o, "HOST"), &host, &port, 0))
6761 		{
6762 			StrCpy(t.KeepConnectHost, sizeof(t.KeepConnectHost), host);
6763 			t.KeepConnectPort = port;
6764 			t.KeepConnectInterval = GetParamInt(o, "INTERVAL");
6765 			t.KeepConnectProtocol = (StrCmpi(GetParamStr(o, "PROTOCOL"), "tcp") == 0) ? 0 : 1;
6766 			Free(host);
6767 
6768 			ret = CcSetClientConfig(pc->RemoteClient, &t);
6769 		}
6770 	}
6771 
6772 	if (ret != ERR_NO_ERROR)
6773 	{
6774 		// Error has occurred
6775 		CmdPrintError(c, ret);
6776 	}
6777 
6778 	// Release of the parameter list
6779 	FreeParamValueList(o);
6780 
6781 	return ret;
6782 }
6783 
6784 // Get the maintenance function of the Internet connection
PcKeepGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6785 UINT PcKeepGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6786 {
6787 	LIST *o;
6788 	PC *pc = (PC *)param;
6789 	UINT ret = ERR_NO_ERROR;
6790 	CLIENT_CONFIG t;
6791 
6792 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
6793 	if (o == NULL)
6794 	{
6795 		return ERR_INVALID_PARAMETER;
6796 	}
6797 
6798 	// RPC call
6799 	Zero(&t, sizeof(t));
6800 
6801 	ret = CcGetClientConfig(pc->RemoteClient, &t);
6802 
6803 	if (ret == ERR_NO_ERROR)
6804 	{
6805 		wchar_t tmp[MAX_SIZE];
6806 		CT *ct = CtNewStandard();
6807 
6808 		StrToUni(tmp, sizeof(tmp), t.KeepConnectHost);
6809 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_1"), tmp);
6810 
6811 		UniToStru(tmp, t.KeepConnectPort);
6812 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_2"), tmp);
6813 
6814 		UniToStru(tmp, t.KeepConnectInterval);
6815 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_3"), tmp);
6816 
6817 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_4"),
6818 			t.KeepConnectProtocol == 0 ? L"TCP/IP" : L"UDP/IP");
6819 
6820 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_5"),
6821 			t.UseKeepConnect ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"));
6822 
6823 		CtFree(ct, c);
6824 	}
6825 
6826 	if (ret != ERR_NO_ERROR)
6827 	{
6828 		// Error has occurred
6829 		CmdPrintError(c, ret);
6830 	}
6831 
6832 	// Release of the parameter list
6833 	FreeParamValueList(o);
6834 
6835 	return ret;
6836 }
6837 
6838 
6839 // Creat a new client management tool context
NewPc(CONSOLE * c,REMOTE_CLIENT * remote_client,char * servername,wchar_t * cmdline)6840 PC *NewPc(CONSOLE *c, REMOTE_CLIENT *remote_client, char *servername, wchar_t *cmdline)
6841 {
6842 	PC *pc;
6843 	// Validate arguments
6844 	if (c == NULL || remote_client == NULL || servername == NULL)
6845 	{
6846 		return NULL;
6847 	}
6848 	if (UniIsEmptyStr(cmdline))
6849 	{
6850 		cmdline = NULL;
6851 	}
6852 
6853 	pc = ZeroMalloc(sizeof(PC));
6854 	pc->ConsoleForServer = false;
6855 	pc->ServerName = CopyStr(servername);
6856 	pc->Console = c;
6857 	pc->LastError = 0;
6858 	pc->RemoteClient = remote_client;
6859 	pc->CmdLine = CopyUniStr(cmdline);
6860 
6861 	return pc;
6862 }
6863 
6864 // Release the client management tools context
FreePc(PC * pc)6865 void FreePc(PC *pc)
6866 {
6867 	// Validate arguments
6868 	if (pc == NULL)
6869 	{
6870 		return;
6871 	}
6872 
6873 	Free(pc->ServerName);
6874 	Free(pc->CmdLine);
6875 	Free(pc);
6876 }
6877 
6878 // Client management tool
PcConnect(CONSOLE * c,char * target,wchar_t * cmdline,char * password)6879 UINT PcConnect(CONSOLE *c, char *target, wchar_t *cmdline, char *password)
6880 {
6881 	CEDAR *cedar;
6882 	REMOTE_CLIENT *client;
6883 	bool bad_pass;
6884 	bool no_remote;
6885 	char pass[MAX_SIZE];
6886 	UINT ret = 0;
6887 	// Validate arguments
6888 	if (c == NULL || target == NULL)
6889 	{
6890 		return ERR_INTERNAL_ERROR;
6891 	}
6892 
6893 	StrCpy(pass, sizeof(pass), password);
6894 
6895 	cedar = NewCedar(NULL, NULL);
6896 
6897 RETRY:
6898 	client = CcConnectRpc(target, pass, &bad_pass, &no_remote, 0);
6899 
6900 	if (client == NULL)
6901 	{
6902 		if (no_remote)
6903 		{
6904 			// Remote connection refusal
6905 			c->Write(c, _UU("CMD_VPNCMD_CLIENT_NO_REMODE"));
6906 			ReleaseCedar(cedar);
6907 			return ERR_INTERNAL_ERROR;
6908 		}
6909 		else if (bad_pass)
6910 		{
6911 			char *tmp;
6912 			// Password is different
6913 			c->Write(c, _UU("CMD_VPNCMD_PASSWORD_1"));
6914 			tmp = c->ReadPassword(c, _UU("CMD_VPNCMD_PASSWORD_2"));
6915 			c->Write(c, L"");
6916 
6917 			if (tmp == NULL)
6918 			{
6919 				// Cancel
6920 				ReleaseCedar(cedar);
6921 				return ERR_ACCESS_DENIED;
6922 			}
6923 			else
6924 			{
6925 				StrCpy(pass, sizeof(pass), tmp);
6926 				Free(tmp);
6927 			}
6928 
6929 			goto RETRY;
6930 		}
6931 		else
6932 		{
6933 			// Connection failure
6934 			CmdPrintError(c, ERR_CONNECT_FAILED);
6935 			ReleaseCedar(cedar);
6936 			return ERR_CONNECT_FAILED;
6937 		}
6938 	}
6939 	else
6940 	{
6941 		// Connection complete
6942 		PC *pc = NewPc(c, client, target, cmdline);
6943 		PcMain(pc);
6944 		ret = pc->LastError;
6945 		FreePc(pc);
6946 	}
6947 
6948 	CcDisconnectRpc(client);
6949 
6950 	ReleaseCedar(cedar);
6951 
6952 	return ret;
6953 }
6954 
6955 
6956 // Server Administration Tool Processor Main
PsMain(PS * ps)6957 void PsMain(PS *ps)
6958 {
6959 	char prompt[MAX_SIZE];
6960 	wchar_t tmp[MAX_SIZE];
6961 	// Validate arguments
6962 	if (ps == NULL)
6963 	{
6964 		return;
6965 	}
6966 
6967 	// If it's not in CSV mode, to display a message that the connection has been made
6968 	if(ps->Console->ConsoleType != CONSOLE_CSV)
6969 	{
6970 		UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_SERVER_CONNECTED"),
6971 			ps->ServerName, ps->ServerPort);
6972 		ps->Console->Write(ps->Console, tmp);
6973 		ps->Console->Write(ps->Console, L"");
6974 
6975 		if (ps->HubName == NULL)
6976 		{
6977 			// Server management mode
6978 			ps->Console->Write(ps->Console, _UU("CMD_VPNCMD_SERVER_CONNECTED_1"));
6979 		}
6980 		else
6981 		{
6982 			// Virtual HUB management mode
6983 			UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_SERVER_CONNECTED_2"),
6984 				ps->HubName);
6985 			ps->Console->Write(ps->Console, tmp);
6986 		}
6987 		ps->Console->Write(ps->Console, L"");
6988 	}
6989 
6990 	// Get the Caps
6991 	ps->CapsList = ScGetCapsEx(ps->Rpc);
6992 
6993 	if (ps->AdminHub != NULL)
6994 	{
6995 		RPC_HUB_STATUS t;
6996 		UINT ret;
6997 		wchar_t tmp[MAX_SIZE];
6998 
6999 		// Choose the Virtual HUB that is specified in the ADMINHUB
7000 		Zero(&t, sizeof(t));
7001 
7002 		StrCpy(t.HubName, sizeof(t.HubName), ps->AdminHub);
7003 
7004 		ret = ScGetHubStatus(ps->Rpc, &t);
7005 		if (ret == ERR_NO_ERROR)
7006 		{
7007 			// Success
7008 			UniFormat(tmp, sizeof(tmp), _UU("CMD_Hub_Selected"), t.HubName);
7009 
7010 			if (ps->HubName != NULL)
7011 			{
7012 				Free(ps->HubName);
7013 			}
7014 			ps->HubName = CopyStr(t.HubName);
7015 
7016 			if( ps->Console->ConsoleType != CONSOLE_CSV)
7017 			{
7018 				ps->Console->Write(ps->Console, tmp);
7019 			}
7020 		}
7021 		else
7022 		{
7023 			// Failure
7024 			UniFormat(tmp, sizeof(tmp), _UU("CMD_Hub_Select_Failed"), ps->AdminHub);
7025 
7026 			ps->Console->Write(ps->Console, tmp);
7027 			CmdPrintError(ps->Console, ret);
7028 		}
7029 	}
7030 
7031 	if (ps->HubName == NULL)
7032 	{
7033 		RPC_KEY_PAIR t;
7034 
7035 		Zero(&t, sizeof(t));
7036 
7037 		if (ScGetServerCert(ps->Rpc, &t) == ERR_NO_ERROR)
7038 		{
7039 			if (t.Cert != NULL && t.Cert->has_basic_constraints == false)
7040 			{
7041 				if (t.Cert->root_cert)
7042 				{
7043 					ps->Console->Write(ps->Console, L"");
7044 					ps->Console->Write(ps->Console, _UU("SM_CERT_MESSAGE_CLI"));
7045 					ps->Console->Write(ps->Console, L"");
7046 				}
7047 			}
7048 
7049 			FreeRpcKeyPair(&t);
7050 		}
7051 	}
7052 
7053 	while (true)
7054 	{
7055 		// Definition of command
7056 		CMD cmd[] =
7057 		{
7058 			{"About", PsAbout},
7059 			{"Check", PtCheck},
7060 			{"Crash", PsCrash},
7061 			{"Flush", PsFlush},
7062 			{"Debug", PsDebug},
7063 			{"ServerInfoGet", PsServerInfoGet},
7064 			{"ServerStatusGet", PsServerStatusGet},
7065 			{"ListenerCreate", PsListenerCreate},
7066 			{"ListenerDelete", PsListenerDelete},
7067 			{"ListenerList", PsListenerList},
7068 			{"ListenerEnable", PsListenerEnable},
7069 			{"ListenerDisable", PsListenerDisable},
7070 			{"ServerPasswordSet", PsServerPasswordSet},
7071 			{"ClusterSettingGet", PsClusterSettingGet},
7072 			{"ClusterSettingStandalone", PsClusterSettingStandalone},
7073 			{"ClusterSettingController", PsClusterSettingController},
7074 			{"ClusterSettingMember", PsClusterSettingMember},
7075 			{"ClusterMemberList", PsClusterMemberList},
7076 			{"ClusterMemberInfoGet", PsClusterMemberInfoGet},
7077 			{"ClusterMemberCertGet", PsClusterMemberCertGet},
7078 			{"ClusterConnectionStatusGet", PsClusterConnectionStatusGet},
7079 			{"ServerCertGet", PsServerCertGet},
7080 			{"ServerKeyGet", PsServerKeyGet},
7081 			{"ServerCertSet", PsServerCertSet},
7082 			{"ServerCipherGet", PsServerCipherGet},
7083 			{"ServerCipherSet", PsServerCipherSet},
7084 			{"KeepEnable", PsKeepEnable},
7085 			{"KeepDisable", PsKeepDisable},
7086 			{"KeepSet", PsKeepSet},
7087 			{"KeepGet", PsKeepGet},
7088 			{"SyslogGet", PsSyslogGet},
7089 			{"SyslogDisable", PsSyslogDisable},
7090 			{"SyslogEnable", PsSyslogEnable},
7091 			{"ConnectionList", PsConnectionList},
7092 			{"ConnectionGet", PsConnectionGet},
7093 			{"ConnectionDisconnect", PsConnectionDisconnect},
7094 			{"BridgeDeviceList", PsBridgeDeviceList},
7095 			{"BridgeList", PsBridgeList},
7096 			{"BridgeCreate", PsBridgeCreate},
7097 			{"BridgeDelete", PsBridgeDelete},
7098 			{"Caps", PsCaps},
7099 			{"Reboot", PsReboot},
7100 			{"ConfigGet", PsConfigGet},
7101 			{"ConfigSet", PsConfigSet},
7102 			{"RouterList", PsRouterList},
7103 			{"RouterAdd", PsRouterAdd},
7104 			{"RouterDelete", PsRouterDelete},
7105 			{"RouterStart", PsRouterStart},
7106 			{"RouterStop", PsRouterStop},
7107 			{"RouterIfList", PsRouterIfList},
7108 			{"RouterIfAdd", PsRouterIfAdd},
7109 			{"RouterIfDel", PsRouterIfDel},
7110 			{"RouterTableList", PsRouterTableList},
7111 			{"RouterTableAdd", PsRouterTableAdd},
7112 			{"RouterTableDel", PsRouterTableDel},
7113 			{"LogFileList", PsLogFileList},
7114 			{"LogFileGet", PsLogFileGet},
7115 			{"HubCreate", PsHubCreate},
7116 			{"HubCreateDynamic", PsHubCreateDynamic},
7117 			{"HubCreateStatic", PsHubCreateStatic},
7118 			{"HubDelete", PsHubDelete},
7119 			{"HubSetStatic", PsHubSetStatic},
7120 			{"HubSetDynamic", PsHubSetDynamic},
7121 			{"HubList", PsHubList},
7122 			{"Hub", PsHub},
7123 			{"Online", PsOnline},
7124 			{"Offline", PsOffline},
7125 			{"SetMaxSession", PsSetMaxSession},
7126 			{"SetHubPassword", PsSetHubPassword},
7127 			{"SetEnumAllow", PsSetEnumAllow},
7128 			{"SetEnumDeny", PsSetEnumDeny},
7129 			{"OptionsGet", PsOptionsGet},
7130 			{"RadiusServerSet", PsRadiusServerSet},
7131 			{"RadiusServerDelete", PsRadiusServerDelete},
7132 			{"RadiusServerGet", PsRadiusServerGet},
7133 			{"StatusGet", PsStatusGet},
7134 			{"LogGet", PsLogGet},
7135 			{"LogEnable", PsLogEnable},
7136 			{"LogDisable", PsLogDisable},
7137 			{"LogSwitchSet", PsLogSwitchSet},
7138 			{"LogPacketSaveType", PsLogPacketSaveType},
7139 			{"CAList", PsCAList},
7140 			{"CAAdd", PsCAAdd},
7141 			{"CADelete", PsCADelete},
7142 			{"CAGet", PsCAGet},
7143 			{"CascadeList", PsCascadeList},
7144 			{"CascadeCreate", PsCascadeCreate},
7145 			{"CascadeSet", PsCascadeSet},
7146 			{"CascadeGet", PsCascadeGet},
7147 			{"CascadeDelete", PsCascadeDelete},
7148 			{"CascadeUsernameSet", PsCascadeUsernameSet},
7149 			{"CascadeAnonymousSet", PsCascadeAnonymousSet},
7150 			{"CascadePasswordSet", PsCascadePasswordSet},
7151 			{"CascadeCertSet", PsCascadeCertSet},
7152 			{"CascadeCertGet", PsCascadeCertGet},
7153 			{"CascadeEncryptEnable", PsCascadeEncryptEnable},
7154 			{"CascadeEncryptDisable", PsCascadeEncryptDisable},
7155 			{"CascadeCompressEnable", PsCascadeCompressEnable},
7156 			{"CascadeCompressDisable", PsCascadeCompressDisable},
7157 			{"CascadeProxyNone", PsCascadeProxyNone},
7158 			{"CascadeProxyHttp", PsCascadeProxyHttp},
7159 			{"CascadeProxySocks", PsCascadeProxySocks},
7160 			{"CascadeServerCertEnable", PsCascadeServerCertEnable},
7161 			{"CascadeServerCertDisable", PsCascadeServerCertDisable},
7162 			{"CascadeServerCertSet", PsCascadeServerCertSet},
7163 			{"CascadeServerCertDelete", PsCascadeServerCertDelete},
7164 			{"CascadeServerCertGet", PsCascadeServerCertGet},
7165 			{"CascadeDetailSet", PsCascadeDetailSet},
7166 			{"CascadePolicySet", PsCascadePolicySet},
7167 			{"PolicyList", PsPolicyList},
7168 			{"CascadeStatusGet", PsCascadeStatusGet},
7169 			{"CascadeRename", PsCascadeRename},
7170 			{"CascadeOnline", PsCascadeOnline},
7171 			{"CascadeOffline", PsCascadeOffline},
7172 			{"AccessAdd", PsAccessAdd},
7173 			{"AccessAddEx", PsAccessAddEx},
7174 			{"AccessAdd6", PsAccessAdd6},
7175 			{"AccessAddEx6", PsAccessAddEx6},
7176 			{"AccessList", PsAccessList},
7177 			{"AccessDelete", PsAccessDelete},
7178 			{"AccessEnable", PsAccessEnable},
7179 			{"AccessDisable", PsAccessDisable},
7180 			{"UserList", PsUserList},
7181 			{"UserCreate", PsUserCreate},
7182 			{"UserSet", PsUserSet},
7183 			{"UserDelete", PsUserDelete},
7184 			{"UserGet", PsUserGet},
7185 			{"UserAnonymousSet", PsUserAnonymousSet},
7186 			{"UserPasswordSet", PsUserPasswordSet},
7187 			{"UserCertSet", PsUserCertSet},
7188 			{"UserCertGet", PsUserCertGet},
7189 			{"UserSignedSet", PsUserSignedSet},
7190 			{"UserRadiusSet", PsUserRadiusSet},
7191 			{"UserNTLMSet", PsUserNTLMSet},
7192 			{"UserPolicyRemove", PsUserPolicyRemove},
7193 			{"UserPolicySet", PsUserPolicySet},
7194 			{"UserExpiresSet", PsUserExpiresSet},
7195 			{"GroupList", PsGroupList},
7196 			{"GroupCreate", PsGroupCreate},
7197 			{"GroupSet", PsGroupSet},
7198 			{"GroupDelete", PsGroupDelete},
7199 			{"GroupGet", PsGroupGet},
7200 			{"GroupJoin", PsGroupJoin},
7201 			{"GroupUnjoin", PsGroupUnjoin},
7202 			{"GroupPolicyRemove", PsGroupPolicyRemove},
7203 			{"GroupPolicySet", PsGroupPolicySet},
7204 			{"SessionList", PsSessionList},
7205 			{"SessionGet", PsSessionGet},
7206 			{"SessionDisconnect", PsSessionDisconnect},
7207 			{"MacTable", PsMacTable},
7208 			{"MacDelete", PsMacDelete},
7209 			{"IpTable", PsIpTable},
7210 			{"IpDelete", PsIpDelete},
7211 			{"SecureNatEnable", PsSecureNatEnable},
7212 			{"SecureNatDisable", PsSecureNatDisable},
7213 			{"SecureNatStatusGet", PsSecureNatStatusGet},
7214 			{"SecureNatHostGet", PsSecureNatHostGet},
7215 			{"SecureNatHostSet", PsSecureNatHostSet},
7216 			{"NatGet", PsNatGet},
7217 			{"NatEnable", PsNatEnable},
7218 			{"NatDisable", PsNatDisable},
7219 			{"NatSet", PsNatSet},
7220 			{"NatTable", PsNatTable},
7221 			{"DhcpGet", PsDhcpGet},
7222 			{"DhcpEnable", PsDhcpEnable},
7223 			{"DhcpDisable", PsDhcpDisable},
7224 			{"DhcpSet", PsDhcpSet},
7225 			{"DhcpTable", PsDhcpTable},
7226 			{"AdminOptionList", PsAdminOptionList},
7227 			{"AdminOptionSet", PsAdminOptionSet},
7228 			{"ExtOptionList", PsExtOptionList},
7229 			{"ExtOptionSet", PsExtOptionSet},
7230 			{"CrlList", PsCrlList},
7231 			{"CrlAdd", PsCrlAdd},
7232 			{"CrlDel", PsCrlDel},
7233 			{"CrlGet", PsCrlGet},
7234 			{"AcList", PsAcList},
7235 			{"AcAdd", PsAcAdd},
7236 			{"AcAdd6", PsAcAdd6},
7237 			{"AcDel", PsAcDel},
7238 			{"MakeCert", PtMakeCert},
7239 			{"MakeCert2048", PtMakeCert2048},
7240 			{"TrafficClient", PtTrafficClient},
7241 			{"TrafficServer", PtTrafficServer},
7242 			{"LicenseAdd", PsLicenseAdd},
7243 			{"LicenseDel", PsLicenseDel},
7244 			{"LicenseList", PsLicenseList},
7245 			{"LicenseStatus", PsLicenseStatus},
7246 			{"IPsecEnable", PsIPsecEnable},
7247 			{"IPsecGet", PsIPsecGet},
7248 			{"EtherIpClientAdd", PsEtherIpClientAdd},
7249 			{"EtherIpClientDelete", PsEtherIpClientDelete},
7250 			{"EtherIpClientList", PsEtherIpClientList},
7251 			{"OpenVpnEnable", PsOpenVpnEnable},
7252 			{"OpenVpnGet", PsOpenVpnGet},
7253 			{"OpenVpnMakeConfig", PsOpenVpnMakeConfig},
7254 			{"SstpEnable", PsSstpEnable},
7255 			{"SstpGet", PsSstpGet},
7256 			{"ServerCertRegenerate", PsServerCertRegenerate},
7257 			{"VpnOverIcmpDnsEnable", PsVpnOverIcmpDnsEnable},
7258 			{"VpnOverIcmpDnsGet", PsVpnOverIcmpDnsGet},
7259 			{"DynamicDnsGetStatus", PsDynamicDnsGetStatus},
7260 			{"DynamicDnsSetHostname", PsDynamicDnsSetHostname},
7261 			{"VpnAzureGetStatus", PsVpnAzureGetStatus},
7262 			{"VpnAzureSetEnable", PsVpnAzureSetEnable},
7263 		};
7264 
7265 		// Generate a prompt
7266 		if (ps->HubName == NULL)
7267 		{
7268 			Format(prompt, sizeof(prompt), "VPN Server>");
7269 		}
7270 		else
7271 		{
7272 			Format(prompt, sizeof(prompt), "VPN Server/%s>", ps->HubName);
7273 		}
7274 
7275 		if (DispatchNextCmdEx(ps->Console, ps->CmdLine, prompt, cmd, sizeof(cmd) / sizeof(cmd[0]), ps) == false)
7276 		{
7277 			break;
7278 		}
7279 		ps->LastError = ps->Console->RetCode;
7280 
7281 		if (ps->LastError == ERR_NO_ERROR && ps->Console->ConsoleType != CONSOLE_CSV)
7282 		{
7283 			ps->Console->Write(ps->Console, _UU("CMD_MSG_OK"));
7284 			ps->Console->Write(ps->Console, L"");
7285 		}
7286 
7287 		if (ps->CmdLine != NULL)
7288 		{
7289 			break;
7290 		}
7291 	}
7292 
7293 	// Release the Caps
7294 	FreeCapsList(ps->CapsList);
7295 	ps->CapsList = NULL;
7296 }
7297 
7298 // A template for a new command function
PsXxx(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)7299 UINT PsXxx(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
7300 {
7301 	LIST *o;
7302 	PS *ps = (PS *)param;
7303 	UINT ret;
7304 	RPC_LISTENER t;
7305 	PARAM args[] =
7306 	{
7307 		{"[port]", CmdPromptPort, _UU("CMD_ListenerCreate_PortPrompt"), CmdEvalPort, NULL},
7308 	};
7309 
7310 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
7311 	if (o == NULL)
7312 	{
7313 		return ERR_INVALID_PARAMETER;
7314 	}
7315 
7316 	Zero(&t, sizeof(t));
7317 	t.Enable = true;
7318 	t.Port = ToInt(GetParamStr(o, "[port]"));
7319 
7320 	ret = ScCreateListener(ps->Rpc, &t);
7321 
7322 	if (ret != ERR_NO_ERROR)
7323 	{
7324 		CmdPrintError(c, ret);
7325 		FreeParamValueList(o);
7326 		return ret;
7327 	}
7328 
7329 	FreeParamValueList(o);
7330 
7331 	return 0;
7332 }
7333 
7334 // Set to the stand-alone mode
PsClusterSettingStandalone(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)7335 UINT PsClusterSettingStandalone(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
7336 {
7337 	LIST *o;
7338 	PS *ps = (PS *)param;
7339 	UINT ret = 0;
7340 	RPC_FARM t;
7341 
7342 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
7343 	if (o == NULL)
7344 	{
7345 		return ERR_INVALID_PARAMETER;
7346 	}
7347 
7348 	Zero(&t, sizeof(t));
7349 	t.ServerType = SERVER_TYPE_STANDALONE;
7350 
7351 	// RPC call
7352 	ret = ScSetFarmSetting(ps->Rpc, &t);
7353 
7354 	if (ret != ERR_NO_ERROR)
7355 	{
7356 		// An error has occured
7357 		CmdPrintError(c, ret);
7358 		FreeParamValueList(o);
7359 		return ret;
7360 	}
7361 
7362 	FreeParamValueList(o);
7363 
7364 	return 0;
7365 }
7366 
7367 // Set to the cluster controller mode
PsClusterSettingController(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)7368 UINT PsClusterSettingController(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
7369 {
7370 	LIST *o;
7371 	PS *ps = (PS *)param;
7372 	UINT ret = 0;
7373 	RPC_FARM t;
7374 	UINT weight;
7375 	PARAM args[] =
7376 	{
7377 		{"WEIGHT", NULL, NULL, NULL, NULL},
7378 		{"ONLY", NULL, NULL, NULL, NULL},
7379 	};
7380 
7381 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
7382 	if (o == NULL)
7383 	{
7384 		return ERR_INVALID_PARAMETER;
7385 	}
7386 
7387 	weight = GetParamInt(o, "WEIGHT");
7388 	if (weight == 0)
7389 	{
7390 		weight = FARM_DEFAULT_WEIGHT;
7391 	}
7392 
7393 	Zero(&t, sizeof(t));
7394 	t.ServerType = SERVER_TYPE_FARM_CONTROLLER;
7395 	t.Weight = weight;
7396 	t.ControllerOnly = GetParamYes(o, "ONLY");
7397 
7398 	// RPC call
7399 	ret = ScSetFarmSetting(ps->Rpc, &t);
7400 
7401 	if (ret != ERR_NO_ERROR)
7402 	{
7403 		// An error has occured
7404 		CmdPrintError(c, ret);
7405 		FreeParamValueList(o);
7406 		return ret;
7407 	}
7408 
7409 	FreeParamValueList(o);
7410 
7411 	return 0;
7412 }
7413 
7414 // Evaluate the IP address
CmdEvalIp(CONSOLE * c,wchar_t * str,void * param)7415 bool CmdEvalIp(CONSOLE *c, wchar_t *str, void *param)
7416 {
7417 	// Validate arguments
7418 	if (c == NULL || str == NULL)
7419 	{
7420 		return false;
7421 	}
7422 
7423 	if (UniIsEmptyStr(str))
7424 	{
7425 		return true;
7426 	}
7427 
7428 	if (UniStrToIP32(str) == 0 && UniStrCmpi(str, L"0.0.0.0") != 0)
7429 	{
7430 		wchar_t *msg = (param == NULL) ? _UU("CMD_IP_EVAL_FAILED") : (wchar_t *)param;
7431 		c->Write(c, msg);
7432 		return false;
7433 	}
7434 
7435 	return true;
7436 }
7437 
7438 // Convert a string to port list
StrToPortList(char * str)7439 LIST *StrToPortList(char *str)
7440 {
7441 	LIST *o;
7442 	TOKEN_LIST *t;
7443 	UINT i;
7444 	if (str == NULL)
7445 	{
7446 		return NULL;
7447 	}
7448 
7449 	// Convert to token
7450 	t = ParseToken(str, ", ");
7451 	if (t == NULL)
7452 	{
7453 		return NULL;
7454 	}
7455 	if (t->NumTokens == 0)
7456 	{
7457 		FreeToken(t);
7458 		return NULL;
7459 	}
7460 
7461 	o = NewListFast(NULL);
7462 
7463 	for (i = 0;i < t->NumTokens;i++)
7464 	{
7465 		char *s = t->Token[i];
7466 		UINT n;
7467 		if (IsNum(s) == false)
7468 		{
7469 			ReleaseList(o);
7470 			FreeToken(t);
7471 			return NULL;
7472 		}
7473 		n = ToInt(s);
7474 		if (n == 0 || n >= 65536)
7475 		{
7476 			ReleaseList(o);
7477 			FreeToken(t);
7478 			return NULL;
7479 		}
7480 		if (IsInList(o, (void *)n))
7481 		{
7482 			ReleaseList(o);
7483 			FreeToken(t);
7484 			return NULL;
7485 		}
7486 		Add(o, (void *)n);
7487 	}
7488 
7489 	FreeToken(t);
7490 
7491 	if (LIST_NUM(o) > MAX_PUBLIC_PORT_NUM)
7492 	{
7493 		ReleaseList(o);
7494 		return NULL;
7495 	}
7496 
7497 	return o;
7498 }
7499 
7500 // Set to the cluster member mode
PsClusterSettingMember(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)7501 UINT PsClusterSettingMember(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
7502 {
7503 	LIST *o;
7504 	PS *ps = (PS *)param;
7505 	UINT ret = 0;
7506 	RPC_FARM t;
7507 	char *host_and_port;
7508 	char *host;
7509 	UINT port;
7510 	UINT weight;
7511 	// Parameter list that can be specified
7512 	PARAM args[] =
7513 	{
7514 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
7515 		{"[server:port]", CmdPrompt, _UU("CMD_ClusterSettingMember_Prompt_HOST_1"), CmdEvalHostAndPort, NULL},
7516 		{"IP", PsClusterSettingMemberPromptIp, NULL, CmdEvalIp, NULL},
7517 		{"PORTS", PsClusterSettingMemberPromptPorts, NULL, CmdEvalPortList, NULL},
7518 		{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
7519 		{"WEIGHT", NULL, NULL, NULL, NULL},
7520 	};
7521 
7522 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
7523 	if (o == NULL)
7524 	{
7525 		return ERR_INVALID_PARAMETER;
7526 	}
7527 
7528 	weight = GetParamInt(o, "WEIGHT");
7529 
7530 	if (weight == 0)
7531 	{
7532 		weight = FARM_DEFAULT_WEIGHT;
7533 	}
7534 
7535 	Zero(&t, sizeof(t));
7536 	host_and_port = GetParamStr(o, "[server:port]");
7537 	if (ParseHostPort(host_and_port, &host, &port, 0))
7538 	{
7539 		char *pw;
7540 		char *ports_str;
7541 		LIST *ports;
7542 		UINT i;
7543 
7544 		StrCpy(t.ControllerName, sizeof(t.ControllerName), host);
7545 		t.ControllerPort = port;
7546 		Free(host);
7547 
7548 		pw = GetParamStr(o, "PASSWORD");
7549 
7550 		Hash(t.MemberPassword, pw, StrLen(pw), true);
7551 		t.PublicIp = StrToIP32(GetParamStr(o, "IP"));
7552 		t.ServerType = SERVER_TYPE_FARM_MEMBER;
7553 
7554 		ports_str = GetParamStr(o, "PORTS");
7555 
7556 		ports = StrToPortList(ports_str);
7557 
7558 		t.NumPort = LIST_NUM(ports);
7559 		t.Ports = ZeroMalloc(sizeof(UINT) * t.NumPort);
7560 
7561 		for (i = 0;i < t.NumPort;i++)
7562 		{
7563 			t.Ports[i] = (UINT)LIST_DATA(ports, i);
7564 		}
7565 
7566 		t.Weight = weight;
7567 
7568 		ReleaseList(ports);
7569 
7570 		// RPC call
7571 		ret = ScSetFarmSetting(ps->Rpc, &t);
7572 
7573 		if (ret != ERR_NO_ERROR)
7574 		{
7575 			// An error has occured
7576 			CmdPrintError(c, ret);
7577 			FreeParamValueList(o);
7578 			return ret;
7579 		}
7580 
7581 		FreeRpcFarm(&t);
7582 	}
7583 
7584 	FreeParamValueList(o);
7585 
7586 	return 0;
7587 }
7588 
7589 // Evaluate the port list
CmdEvalPortList(CONSOLE * c,wchar_t * str,void * param)7590 bool CmdEvalPortList(CONSOLE *c, wchar_t *str, void *param)
7591 {
7592 	char *s;
7593 	bool ret = false;
7594 	LIST *o;
7595 	// Validate arguments
7596 	if (c == NULL || str == NULL)
7597 	{
7598 		return false;
7599 	}
7600 
7601 	s = CopyUniToStr(str);
7602 
7603 	o = StrToPortList(s);
7604 
7605 	if (o != NULL)
7606 	{
7607 		ret = true;
7608 	}
7609 
7610 	ReleaseList(o);
7611 
7612 	Free(s);
7613 
7614 	if (ret == false)
7615 	{
7616 		c->Write(c, _UU("CMD_PORTLIST_EVAL_FAILED"));
7617 	}
7618 
7619 	return ret;
7620 }
7621 
7622 // Check the string of the form of the host name and port number
CmdEvalHostAndPort(CONSOLE * c,wchar_t * str,void * param)7623 bool CmdEvalHostAndPort(CONSOLE *c, wchar_t *str, void *param)
7624 {
7625 	char *tmp;
7626 	bool ret = false;
7627 	// Validate arguments
7628 	if (c == NULL || str == NULL)
7629 	{
7630 		return false;
7631 	}
7632 
7633 	tmp = CopyUniToStr(str);
7634 
7635 	ret = ParseHostPort(tmp, NULL, NULL, (UINT)param);
7636 
7637 	if (ret == false)
7638 	{
7639 		c->Write(c, param == NULL ? _UU("CMD_HOSTPORT_EVAL_FAILED") : (wchar_t *)param);
7640 	}
7641 
7642 	Free(tmp);
7643 
7644 	return ret;
7645 }
7646 
7647 // Input the public port number
PsClusterSettingMemberPromptPorts(CONSOLE * c,void * param)7648 wchar_t *PsClusterSettingMemberPromptPorts(CONSOLE *c, void *param)
7649 {
7650 	wchar_t *ret;
7651 	// Validate arguments
7652 	if (c == NULL)
7653 	{
7654 		return NULL;
7655 	}
7656 
7657 	c->Write(c, _UU("CMD_ClusterSettingMember_Prompt_PORT_1"));
7658 	c->Write(c, L"");
7659 
7660 	ret = c->ReadLine(c, _UU("CMD_ClusterSettingMember_Prompt_PORT_2"), true);
7661 
7662 	return ret;
7663 }
7664 
7665 // Input the public IP address
PsClusterSettingMemberPromptIp(CONSOLE * c,void * param)7666 wchar_t *PsClusterSettingMemberPromptIp(CONSOLE *c, void *param)
7667 {
7668 	wchar_t *ret;
7669 	// Validate arguments
7670 	if (c == NULL)
7671 	{
7672 		return NULL;
7673 	}
7674 
7675 	c->Write(c, _UU("CMD_ClusterSettingMember_Prompt_IP_1"));
7676 	c->Write(c, L"");
7677 
7678 	ret = c->ReadLine(c, _UU("CMD_ClusterSettingMember_Prompt_IP_2"), true);
7679 
7680 	return ret;
7681 }
7682 
7683 // Show the cluster members list
PsClusterMemberList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)7684 UINT PsClusterMemberList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
7685 {
7686 	LIST *o;
7687 	PS *ps = (PS *)param;
7688 	UINT ret = 0;
7689 	RPC_ENUM_FARM t;
7690 	CT *ct;
7691 	UINT i;
7692 
7693 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
7694 	if (o == NULL)
7695 	{
7696 		return ERR_INVALID_PARAMETER;
7697 	}
7698 
7699 	Zero(&t, sizeof(t));
7700 
7701 	// RPC call
7702 	ret = ScEnumFarmMember(ps->Rpc, &t);
7703 
7704 	if (ret != ERR_NO_ERROR)
7705 	{
7706 		// An error has occured
7707 		CmdPrintError(c, ret);
7708 		FreeParamValueList(o);
7709 		return ret;
7710 	}
7711 
7712 	ct = CtNew();
7713 
7714 	CtInsertColumn(ct, _UU("CMD_ID"), true);
7715 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_1"), false);
7716 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_2"), false);
7717 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_3"), false);
7718 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_4"), true);
7719 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_5"), true);
7720 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_6"), true);
7721 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_7"), true);
7722 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_8"), true);
7723 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_9"), true);
7724 
7725 	for (i = 0;i < t.NumFarm;i++)
7726 	{
7727 		RPC_ENUM_FARM_ITEM *e = &t.Farms[i];
7728 		wchar_t tmp0[64];
7729 		wchar_t tmp1[MAX_SIZE];
7730 		wchar_t tmp2[MAX_SIZE];
7731 		wchar_t tmp3[64];
7732 		wchar_t tmp4[64];
7733 		wchar_t tmp5[64];
7734 		wchar_t tmp6[64];
7735 		wchar_t tmp7[64];
7736 		wchar_t tmp8[64];
7737 
7738 		GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->ConnectedTime), NULL);
7739 		StrToUni(tmp2, sizeof(tmp2), e->Hostname);
7740 		UniToStru(tmp3, e->Point);
7741 		UniToStru(tmp4, e->NumSessions);
7742 		UniToStru(tmp5, e->NumTcpConnections);
7743 		UniToStru(tmp6, e->NumHubs);
7744 		UniToStru(tmp7, e->AssignedClientLicense);
7745 		UniToStru(tmp8, e->AssignedBridgeLicense);
7746 
7747 		UniToStru(tmp0, e->Id);
7748 
7749 		CtInsert(ct, tmp0,
7750 			e->Controller ? _UU("SM_FM_CONTROLLER") : _UU("SM_FM_MEMBER"),
7751 			tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8);
7752 	}
7753 
7754 	CtFree(ct, c);
7755 
7756 	FreeRpcEnumFarm(&t);
7757 
7758 	FreeParamValueList(o);
7759 
7760 	return 0;
7761 }
7762 
7763 // Get information of cluster members
PsClusterMemberInfoGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)7764 UINT PsClusterMemberInfoGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
7765 {
7766 	LIST *o;
7767 	PS *ps = (PS *)param;
7768 	UINT ret = 0;
7769 	RPC_FARM_INFO t;
7770 	CT *ct;
7771 	// Parameter list that can be specified
7772 	PARAM args[] =
7773 	{
7774 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
7775 		{"[id]", CmdPrompt, _UU("CMD_ClusterMemberInfoGet_PROMPT_ID"), NULL, NULL},
7776 	};
7777 
7778 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
7779 	if (o == NULL)
7780 	{
7781 		return ERR_INVALID_PARAMETER;
7782 	}
7783 
7784 	Zero(&t, sizeof(t));
7785 	t.Id = UniToInt(GetParamUniStr(o, "[id]"));
7786 
7787 	// RPC call
7788 	ret = ScGetFarmInfo(ps->Rpc, &t);
7789 
7790 	if (ret != ERR_NO_ERROR)
7791 	{
7792 		// An error has occured
7793 		CmdPrintError(c, ret);
7794 		FreeParamValueList(o);
7795 		return ret;
7796 	}
7797 
7798 	ct = CtNewStandard();
7799 
7800 	{
7801 		wchar_t tmp[MAX_SIZE];
7802 		char str[MAX_SIZE];
7803 		UINT i;
7804 
7805 		CtInsert(ct, _UU("SM_FMINFO_TYPE"),
7806 			t.Controller ? _UU("SM_FARM_CONTROLLER") : _UU("SM_FARM_MEMBER"));
7807 
7808 		GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ConnectedTime), NULL);
7809 		CtInsert(ct, _UU("SM_FMINFO_CONNECT_TIME"), tmp);
7810 
7811 		IPToStr32(str, sizeof(str), t.Ip);
7812 		StrToUni(tmp, sizeof(tmp), str);
7813 		CtInsert(ct, _UU("SM_FMINFO_IP"), tmp);
7814 
7815 		StrToUni(tmp, sizeof(tmp), t.Hostname);
7816 		CtInsert(ct, _UU("SM_FMINFO_HOSTNAME"), tmp);
7817 
7818 		UniToStru(tmp, t.Point);
7819 		CtInsert(ct, _UU("SM_FMINFO_POINT"), tmp);
7820 
7821 		UniToStru(tmp, t.Weight);
7822 		CtInsert(ct, _UU("SM_FMINFO_WEIGHT"), tmp);
7823 
7824 		UniToStru(tmp, t.NumPort);
7825 		CtInsert(ct, _UU("SM_FMINFO_NUM_PORT"), tmp);
7826 
7827 		for (i = 0;i < t.NumPort;i++)
7828 		{
7829 			wchar_t tmp2[MAX_SIZE];
7830 			UniFormat(tmp, sizeof(tmp), _UU("SM_FMINFO_PORT"), i + 1);
7831 			UniToStru(tmp2, t.Ports[i]);
7832 			CtInsert(ct, tmp, tmp2);
7833 		}
7834 
7835 		UniToStru(tmp, t.NumFarmHub);
7836 		CtInsert(ct, _UU("SM_FMINFO_NUM_HUB"), tmp);
7837 
7838 		for (i = 0;i < t.NumFarmHub;i++)
7839 		{
7840 			wchar_t tmp2[MAX_SIZE];
7841 			UniFormat(tmp, sizeof(tmp), _UU("SM_FMINFO_HUB"), i + 1);
7842 			UniFormat(tmp2, sizeof(tmp2),
7843 				t.FarmHubs[i].DynamicHub ? _UU("SM_FMINFO_HUB_TAG_2") : _UU("SM_FMINFO_HUB_TAG_1"),
7844 				t.FarmHubs[i].HubName);
7845 			CtInsert(ct, tmp, tmp2);
7846 		}
7847 
7848 		UniToStru(tmp, t.NumSessions);
7849 		CtInsert(ct, _UU("SM_FMINFO_NUM_SESSION"), tmp);
7850 
7851 		UniToStru(tmp, t.NumTcpConnections);
7852 		CtInsert(ct, _UU("SM_FMINFO_NUN_CONNECTION"), tmp);
7853 	}
7854 
7855 	CtFree(ct, c);
7856 
7857 	FreeRpcFarmInfo(&t);
7858 
7859 	FreeParamValueList(o);
7860 
7861 	return 0;
7862 }
7863 
7864 // Get certificates of cluster members
PsClusterMemberCertGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)7865 UINT PsClusterMemberCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
7866 {
7867 	LIST *o;
7868 	PS *ps = (PS *)param;
7869 	UINT ret = 0;
7870 	RPC_FARM_INFO t;
7871 	// Parameter list that can be specified
7872 	PARAM args[] =
7873 	{
7874 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
7875 		{"[id]", CmdPrompt, _UU("CMD_ClusterMemberCertGet_PROMPT_ID"), NULL, NULL},
7876 		{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
7877 	};
7878 
7879 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
7880 	if (o == NULL)
7881 	{
7882 		return ERR_INVALID_PARAMETER;
7883 	}
7884 
7885 	Zero(&t, sizeof(t));
7886 
7887 	t.Id = UniToInt(GetParamUniStr(o, "[id]"));
7888 
7889 	// RPC call
7890 	ret = ScGetFarmInfo(ps->Rpc, &t);
7891 
7892 	if (ret != ERR_NO_ERROR)
7893 	{
7894 		// An error has occured
7895 		CmdPrintError(c, ret);
7896 		FreeParamValueList(o);
7897 		return ret;
7898 	}
7899 	else
7900 	{
7901 		X *x = t.ServerCert;
7902 		wchar_t *filename = GetParamUniStr(o, "SAVECERT");
7903 
7904 		if (XToFileW(x, filename, true) == false)
7905 		{
7906 			c->Write(c, _UU("CMD_SAVECERT_FAILED"));
7907 
7908 			ret = ERR_INTERNAL_ERROR;
7909 		}
7910 	}
7911 
7912 	FreeRpcFarmInfo(&t);
7913 
7914 	FreeParamValueList(o);
7915 
7916 	return ret;
7917 }
7918 
7919 // Get the status of the connection to the cluster controller
PsClusterConnectionStatusGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)7920 UINT PsClusterConnectionStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
7921 {
7922 	LIST *o;
7923 	PS *ps = (PS *)param;
7924 	UINT ret = 0;
7925 	RPC_FARM_CONNECTION_STATUS t;
7926 	wchar_t tmp[MAX_SIZE];
7927 
7928 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
7929 	if (o == NULL)
7930 	{
7931 		return ERR_INVALID_PARAMETER;
7932 	}
7933 
7934 	Zero(&t, sizeof(t));
7935 
7936 	// RPC call
7937 	ret = ScGetFarmConnectionStatus(ps->Rpc, &t);
7938 
7939 	if (ret != ERR_NO_ERROR)
7940 	{
7941 		// An error has occured
7942 		CmdPrintError(c, ret);
7943 		FreeParamValueList(o);
7944 		return ret;
7945 	}
7946 	else
7947 	{
7948 		CT *ct = CtNewStandard();
7949 		char str[MAX_SIZE];
7950 
7951 		if (t.Online == false)
7952 		{
7953 			CtInsert(ct, _UU("SM_FC_IP"), _UU("SM_FC_NOT_CONNECTED"));
7954 
7955 			CtInsert(ct, _UU("SM_FC_PORT"), _UU("SM_FC_NOT_CONNECTED"));
7956 		}
7957 		else
7958 		{
7959 			IPToStr32(str, sizeof(str), t.Ip);
7960 			StrToUni(tmp, sizeof(tmp), str);
7961 			CtInsert(ct, _UU("SM_FC_IP"), tmp);
7962 
7963 			UniToStru(tmp, t.Port);
7964 			CtInsert(ct, _UU("SM_FC_PORT"), tmp);
7965 		}
7966 
7967 		CtInsert(ct,
7968 			_UU("SM_FC_STATUS"),
7969 			t.Online ? _UU("SM_FC_ONLINE") : _UU("SM_FC_OFFLINE"));
7970 
7971 		if (t.Online == false)
7972 		{
7973 			UniFormat(tmp, sizeof(tmp), _UU("SM_FC_ERROR_TAG"), _E(t.LastError), t.LastError);
7974 			CtInsert(ct,
7975 				_UU("SM_FC_LAST_ERROR"), tmp);
7976 		}
7977 
7978 		GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.StartedTime), NULL);
7979 		CtInsert(ct, _UU("SM_FC_START_TIME"), tmp);
7980 
7981 		GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.FirstConnectedTime), NULL);
7982 		CtInsert(ct, _UU("SM_FC_FIRST_TIME"), tmp);
7983 
7984 		//if (t.Online == false)
7985 		{
7986 			GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.CurrentConnectedTime), NULL);
7987 			CtInsert(ct, _UU("SM_FC_CURRENT_TIME"), tmp);
7988 		}
7989 
7990 		UniToStru(tmp, t.NumTry);
7991 		CtInsert(ct, _UU("SM_FC_NUM_TRY"), tmp);
7992 
7993 		UniToStru(tmp, t.NumConnected);
7994 		CtInsert(ct, _UU("SM_FC_NUM_CONNECTED"), tmp);
7995 
7996 		UniToStru(tmp, t.NumFailed);
7997 		CtInsert(ct, _UU("SM_FC_NUM_FAILED"), tmp);
7998 
7999 		CtFree(ct, c);
8000 	}
8001 
8002 	FreeParamValueList(o);
8003 
8004 	return 0;
8005 }
8006 
8007 // Get the SSL certificate of the VPN Server
PsServerCertGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8008 UINT PsServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8009 {
8010 	LIST *o;
8011 	PS *ps = (PS *)param;
8012 	UINT ret = 0;
8013 	RPC_KEY_PAIR t;
8014 	// Parameter list that can be specified
8015 	PARAM args[] =
8016 	{
8017 		{"[cert]", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
8018 	};
8019 
8020 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
8021 	if (o == NULL)
8022 	{
8023 		return ERR_INVALID_PARAMETER;
8024 	}
8025 
8026 	Zero(&t, sizeof(t));
8027 
8028 	// RPC call
8029 	ret = ScGetServerCert(ps->Rpc, &t);
8030 
8031 	if (ret != ERR_NO_ERROR)
8032 	{
8033 		// An error has occured
8034 		CmdPrintError(c, ret);
8035 		FreeParamValueList(o);
8036 		return ret;
8037 	}
8038 
8039 	if (XToFileW(t.Cert, GetParamUniStr(o, "[cert]"), true) == false)
8040 	{
8041 		c->Write(c, _UU("CMD_SAVECERT_FAILED"));
8042 	}
8043 
8044 	FreeRpcKeyPair(&t);
8045 
8046 	FreeParamValueList(o);
8047 
8048 	return 0;
8049 }
8050 
8051 // Get the private key of the SSL certificate of the VPN Server
PsServerKeyGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8052 UINT PsServerKeyGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8053 {
8054 	LIST *o;
8055 	PS *ps = (PS *)param;
8056 	UINT ret = 0;
8057 	RPC_KEY_PAIR t;
8058 	// Parameter list that can be specified
8059 	PARAM args[] =
8060 	{
8061 		{"[key]", CmdPrompt, _UU("CMD_SAVEKEYPATH"), CmdEvalNotEmpty, NULL},
8062 	};
8063 
8064 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
8065 	if (o == NULL)
8066 	{
8067 		return ERR_INVALID_PARAMETER;
8068 	}
8069 
8070 	Zero(&t, sizeof(t));
8071 
8072 	// RPC call
8073 	ret = ScGetServerCert(ps->Rpc, &t);
8074 
8075 	if (ret != ERR_NO_ERROR)
8076 	{
8077 		// An error has occured
8078 		CmdPrintError(c, ret);
8079 		FreeParamValueList(o);
8080 		return ret;
8081 	}
8082 
8083 	if (t.Key != NULL)
8084 	{
8085 		if (KToFileW(t.Key, GetParamUniStr(o, "[key]"), true, NULL) == false)
8086 		{
8087 			c->Write(c, _UU("CMD_SAVEKEY_FAILED"));
8088 		}
8089 	}
8090 	else
8091 	{
8092 		ret = ERR_NOT_ENOUGH_RIGHT;
8093 		CmdPrintError(c, ret);
8094 	}
8095 
8096 	FreeRpcKeyPair(&t);
8097 
8098 	FreeParamValueList(o);
8099 
8100 	return ret;
8101 }
8102 
8103 // Read the certificate and the private key
CmdLoadCertAndKey(CONSOLE * c,X ** xx,K ** kk,wchar_t * cert_filename,wchar_t * key_filename)8104 bool CmdLoadCertAndKey(CONSOLE *c, X **xx, K **kk, wchar_t *cert_filename, wchar_t *key_filename)
8105 {
8106 	X *x;
8107 	K *k;
8108 	// Validate arguments
8109 	if (c == NULL || cert_filename == NULL || key_filename == NULL || xx == NULL || kk == NULL)
8110 	{
8111 		return false;
8112 	}
8113 
8114 	x = FileToXW(cert_filename);
8115 	if (x == NULL)
8116 	{
8117 		c->Write(c, _UU("CMD_LOADCERT_FAILED"));
8118 		return false;
8119 	}
8120 
8121 	k = CmdLoadKey(c, key_filename);
8122 	if (k == NULL)
8123 	{
8124 		c->Write(c, _UU("CMD_LOADKEY_FAILED"));
8125 		FreeX(x);
8126 		return false;
8127 	}
8128 
8129 	if (CheckXandK(x, k) == false)
8130 	{
8131 		c->Write(c, _UU("CMD_KEYPAIR_FAILED"));
8132 		FreeX(x);
8133 		FreeK(k);
8134 
8135 		return false;
8136 	}
8137 
8138 	*xx = x;
8139 	*kk = k;
8140 
8141 	return true;
8142 }
8143 
8144 // Read the secret key
CmdLoadKey(CONSOLE * c,wchar_t * filename)8145 K *CmdLoadKey(CONSOLE *c, wchar_t *filename)
8146 {
8147 	BUF *b;
8148 	// Validate arguments
8149 	if (c == NULL || filename == NULL)
8150 	{
8151 		return NULL;
8152 	}
8153 
8154 	b = ReadDumpW(filename);
8155 	if (b == NULL)
8156 	{
8157 		c->Write(c, _UU("CMD_LOADCERT_FAILED"));
8158 		return NULL;
8159 	}
8160 	else
8161 	{
8162 		K *key;
8163 		if (IsEncryptedK(b, true) == false)
8164 		{
8165 			key = BufToK(b, true, IsBase64(b), NULL);
8166 		}
8167 		else
8168 		{
8169 			c->Write(c, _UU("CMD_LOADKEY_ENCRYPTED_1"));
8170 
8171 			while (true)
8172 			{
8173 				char *pass = c->ReadPassword(c, _UU("CMD_LOADKEY_ENCRYPTED_2"));
8174 
8175 				if (pass == NULL)
8176 				{
8177 					FreeBuf(b);
8178 					return NULL;
8179 				}
8180 
8181 				key = BufToK(b, true, IsBase64(b), pass);
8182 				Free(pass);
8183 
8184 				if (key != NULL)
8185 				{
8186 					break;
8187 				}
8188 
8189 				c->Write(c, _UU("CMD_LOADKEY_ENCRYPTED_3"));
8190 			}
8191 		}
8192 
8193 		FreeBuf(b);
8194 
8195 		return key;
8196 	}
8197 }
8198 
8199 // Set the SSL certificate and the private key of the VPN Server
PsServerCertSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8200 UINT PsServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8201 {
8202 	LIST *o;
8203 	PS *ps = (PS *)param;
8204 	UINT ret = 0;
8205 	RPC_KEY_PAIR t;
8206 	// Parameter list that can be specified
8207 	PARAM args[] =
8208 	{
8209 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
8210 		{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
8211 		{"LOADKEY", CmdPrompt, _UU("CMD_LOADKEYPATH"), CmdEvalIsFile, NULL},
8212 	};
8213 
8214 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
8215 	if (o == NULL)
8216 	{
8217 		return ERR_INVALID_PARAMETER;
8218 	}
8219 
8220 	Zero(&t, sizeof(t));
8221 
8222 	if (CmdLoadCertAndKey(c, &t.Cert, &t.Key,
8223 		GetParamUniStr(o, "LOADCERT"),
8224 		GetParamUniStr(o, "LOADKEY")))
8225 	{
8226 		// RPC call
8227 		ret = ScSetServerCert(ps->Rpc, &t);
8228 
8229 		if (ret != ERR_NO_ERROR)
8230 		{
8231 			// An error has occured
8232 			CmdPrintError(c, ret);
8233 			FreeParamValueList(o);
8234 			return ret;
8235 		}
8236 
8237 		if (t.Flag1 == 0)
8238 		{
8239 			// Show the warning message
8240 			c->Write(c, L"");
8241 			c->Write(c, _UU("SM_CERT_NEED_ROOT"));
8242 			c->Write(c, L"");
8243 		}
8244 
8245 		FreeRpcKeyPair(&t);
8246 	}
8247 	else
8248 	{
8249 		ret = ERR_INTERNAL_ERROR;
8250 	}
8251 
8252 	FreeParamValueList(o);
8253 
8254 	return ret;
8255 }
8256 
8257 // Get the encryption algorithm used for the VPN communication
PsServerCipherGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8258 UINT PsServerCipherGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8259 {
8260 	LIST *o;
8261 	PS *ps = (PS *)param;
8262 	UINT ret = 0;
8263 	RPC_STR t;
8264 	TOKEN_LIST *ciphers;
8265 	UINT i;
8266 	wchar_t tmp[4096];
8267 
8268 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
8269 	if (o == NULL)
8270 	{
8271 		return ERR_INVALID_PARAMETER;
8272 	}
8273 
8274 	Zero(&t, sizeof(t));
8275 
8276 	// RPC call
8277 	ret = ScGetServerCipher(ps->Rpc, &t);
8278 
8279 	if (ret != ERR_NO_ERROR)
8280 	{
8281 		// An error has occured
8282 		CmdPrintError(c, ret);
8283 		FreeParamValueList(o);
8284 		return ret;
8285 	}
8286 
8287 	ciphers = GetCipherList();
8288 
8289 	c->Write(c, _UU("CMD_ServerCipherGet_SERVER"));
8290 
8291 	UniFormat(tmp, sizeof(tmp), L" %S", t.String);
8292 	c->Write(c, tmp);
8293 
8294 	c->Write(c, L"");
8295 	c->Write(c, _UU("CMD_ServerCipherGet_CIPHERS"));
8296 
8297 	for (i = 0;i < ciphers->NumTokens;i++)
8298 	{
8299 		UniFormat(tmp, sizeof(tmp), L" %S", ciphers->Token[i]);
8300 		c->Write(c, tmp);
8301 	}
8302 
8303 	FreeRpcStr(&t);
8304 
8305 	FreeParamValueList(o);
8306 
8307 	return 0;
8308 }
8309 
8310 // Set the encryption algorithm used for the VPN communication
PsServerCipherSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8311 UINT PsServerCipherSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8312 {
8313 	LIST *o;
8314 	PS *ps = (PS *)param;
8315 	UINT ret = 0;
8316 	RPC_STR t;
8317 	// Parameter list that can be specified
8318 	PARAM args[] =
8319 	{
8320 		{"[name]", CmdPrompt, _UU("CMD_ServerCipherSet_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
8321 	};
8322 
8323 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
8324 	if (o == NULL)
8325 	{
8326 		return ERR_INVALID_PARAMETER;
8327 	}
8328 
8329 	Zero(&t, sizeof(t));
8330 	t.String = CopyStr(GetParamStr(o, "[name]"));
8331 
8332 	// RPC call
8333 	ret = ScSetServerCipher(ps->Rpc, &t);
8334 
8335 	if (ret != ERR_NO_ERROR)
8336 	{
8337 		// An error has occured
8338 		CmdPrintError(c, ret);
8339 		FreeParamValueList(o);
8340 		return ret;
8341 	}
8342 
8343 	FreeRpcStr(&t);
8344 
8345 	FreeParamValueList(o);
8346 
8347 	return 0;
8348 }
8349 
8350 // Enabling the maintenance function of the Internet connection
PsKeepEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8351 UINT PsKeepEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8352 {
8353 	LIST *o;
8354 	PS *ps = (PS *)param;
8355 	UINT ret = 0;
8356 	RPC_KEEP t;
8357 
8358 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
8359 	if (o == NULL)
8360 	{
8361 		return ERR_INVALID_PARAMETER;
8362 	}
8363 
8364 	Zero(&t, sizeof(t));
8365 
8366 	// RPC call
8367 	ret = ScGetKeep(ps->Rpc, &t);
8368 
8369 	if (ret != ERR_NO_ERROR)
8370 	{
8371 		// An error has occured
8372 		CmdPrintError(c, ret);
8373 		FreeParamValueList(o);
8374 		return ret;
8375 	}
8376 
8377 	t.UseKeepConnect = true;
8378 
8379 	ret = ScSetKeep(ps->Rpc, &t);
8380 
8381 	if (ret != ERR_NO_ERROR)
8382 	{
8383 		// An error has occured
8384 		CmdPrintError(c, ret);
8385 		FreeParamValueList(o);
8386 		return ret;
8387 	}
8388 
8389 	FreeParamValueList(o);
8390 
8391 	return 0;
8392 }
8393 
8394 // Disabling the maintenance function of the Internet connection
PsKeepDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8395 UINT PsKeepDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8396 {
8397 	LIST *o;
8398 	PS *ps = (PS *)param;
8399 	UINT ret = 0;
8400 	RPC_KEEP t;
8401 
8402 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
8403 	if (o == NULL)
8404 	{
8405 		return ERR_INVALID_PARAMETER;
8406 	}
8407 
8408 	Zero(&t, sizeof(t));
8409 
8410 	// RPC call
8411 	ret = ScGetKeep(ps->Rpc, &t);
8412 
8413 	if (ret != ERR_NO_ERROR)
8414 	{
8415 		// An error has occured
8416 		CmdPrintError(c, ret);
8417 		FreeParamValueList(o);
8418 		return ret;
8419 	}
8420 
8421 	t.UseKeepConnect = false;
8422 
8423 	ret = ScSetKeep(ps->Rpc, &t);
8424 
8425 	if (ret != ERR_NO_ERROR)
8426 	{
8427 		// An error has occured
8428 		CmdPrintError(c, ret);
8429 		FreeParamValueList(o);
8430 		return ret;
8431 	}
8432 
8433 	FreeParamValueList(o);
8434 
8435 	return 0;
8436 }
8437 
8438 // Evaluate the UDP or the TCP
CmdEvalTcpOrUdp(CONSOLE * c,wchar_t * str,void * param)8439 bool CmdEvalTcpOrUdp(CONSOLE *c, wchar_t *str, void *param)
8440 {
8441 	// Validate arguments
8442 	if (c == NULL || str == NULL)
8443 	{
8444 		return false;
8445 	}
8446 
8447 	if (UniStrCmpi(str, L"tcp") == 0 || UniStrCmpi(str, L"udp") == 0)
8448 	{
8449 		return true;
8450 	}
8451 
8452 	c->Write(c, _UU("CMD_KeepSet_EVAL_TCP_UDP"));
8453 
8454 	return false;
8455 }
8456 
8457 // Enable the syslog configuration
PsSyslogEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8458 UINT PsSyslogEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8459 {
8460 	LIST *o;
8461 	PS *ps = (PS *)param;
8462 	UINT ret = 0;
8463 	SYSLOG_SETTING t;
8464 	CMD_EVAL_MIN_MAX minmax = {"CMD_SyslogEnable_MINMAX", 1, 3};
8465 	char *host;
8466 	UINT port;
8467 
8468 	// Parameter list that can be specified
8469 	PARAM args[] =
8470 	{
8471 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
8472 		{"[1|2|3]", CmdPrompt, _UU("CMD_SyslogEnable_Prompt_123"), CmdEvalMinMax, &minmax},
8473 		{"HOST", CmdPrompt, _UU("CMD_SyslogEnable_Prompt_HOST"), CmdEvalHostAndPort, (void *)SYSLOG_PORT},
8474 	};
8475 
8476 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
8477 	if (o == NULL)
8478 	{
8479 		return ERR_INVALID_PARAMETER;
8480 	}
8481 
8482 	Zero(&t, sizeof(t));
8483 
8484 	if (ParseHostPort(GetParamStr(o, "HOST"), &host, &port, SYSLOG_PORT))
8485 	{
8486 		StrCpy(t.Hostname, sizeof(t.Hostname), host);
8487 		t.Port = port;
8488 		t.SaveType = GetParamInt(o, "[1|2|3]");
8489 
8490 		Free(host);
8491 
8492 		// RPC call
8493 		ret = ScSetSysLog(ps->Rpc, &t);
8494 
8495 		if (ret != ERR_NO_ERROR)
8496 		{
8497 			// An error has occured
8498 			CmdPrintError(c, ret);
8499 			FreeParamValueList(o);
8500 			return ret;
8501 		}
8502 	}
8503 
8504 	FreeParamValueList(o);
8505 
8506 	return 0;
8507 }
8508 
8509 // Disable the syslog configuration
PsSyslogDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8510 UINT PsSyslogDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8511 {
8512 	LIST *o;
8513 	PS *ps = (PS *)param;
8514 	UINT ret = 0;
8515 	SYSLOG_SETTING t;
8516 
8517 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
8518 	if (o == NULL)
8519 	{
8520 		return ERR_INVALID_PARAMETER;
8521 	}
8522 
8523 	Zero(&t, sizeof(t));
8524 
8525 	// RPC call
8526 	ret = ScGetSysLog(ps->Rpc, &t);
8527 
8528 	if (ret != ERR_NO_ERROR)
8529 	{
8530 		// An error has occured
8531 		CmdPrintError(c, ret);
8532 		FreeParamValueList(o);
8533 		return ret;
8534 	}
8535 
8536 	t.SaveType = SYSLOG_NONE;
8537 
8538 	// RPC call
8539 	ret = ScSetSysLog(ps->Rpc, &t);
8540 
8541 	if (ret != ERR_NO_ERROR)
8542 	{
8543 		// An error has occured
8544 		CmdPrintError(c, ret);
8545 		FreeParamValueList(o);
8546 		return ret;
8547 	}
8548 
8549 	FreeParamValueList(o);
8550 
8551 	return 0;
8552 }
8553 
8554 // Get the syslog configuration
PsSyslogGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8555 UINT PsSyslogGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8556 {
8557 	LIST *o;
8558 	PS *ps = (PS *)param;
8559 	UINT ret = 0;
8560 	SYSLOG_SETTING t;
8561 
8562 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
8563 	if (o == NULL)
8564 	{
8565 		return ERR_INVALID_PARAMETER;
8566 	}
8567 
8568 	Zero(&t, sizeof(t));
8569 
8570 	// RPC call
8571 	ret = ScGetSysLog(ps->Rpc, &t);
8572 
8573 	if (ret != ERR_NO_ERROR)
8574 	{
8575 		// An error has occured
8576 		CmdPrintError(c, ret);
8577 		FreeParamValueList(o);
8578 		return ret;
8579 	}
8580 	else
8581 	{
8582 		wchar_t tmp[MAX_SIZE];
8583 		CT *ct = CtNewStandard();
8584 
8585 		CtInsert(ct, _UU("CMD_SyslogGet_COLUMN_1"), GetSyslogSettingName(t.SaveType));
8586 
8587 		if (t.SaveType != SYSLOG_NONE)
8588 		{
8589 			StrToUni(tmp, sizeof(tmp), t.Hostname);
8590 			CtInsert(ct, _UU("CMD_SyslogGet_COLUMN_2"), tmp);
8591 
8592 			UniToStru(tmp, t.Port);
8593 			CtInsert(ct, _UU("CMD_SyslogGet_COLUMN_3"), tmp);
8594 		}
8595 
8596 		CtFree(ct, c);
8597 	}
8598 
8599 	FreeParamValueList(o);
8600 
8601 	return 0;
8602 }
8603 
8604 // Get the syslog configuration name
GetSyslogSettingName(UINT n)8605 wchar_t *GetSyslogSettingName(UINT n)
8606 {
8607 	char tmp[MAX_PATH];
8608 
8609 	Format(tmp, sizeof(tmp), "SM_SYSLOG_%u", n);
8610 
8611 	return _UU(tmp);
8612 }
8613 
8614 // Setting of maintenance function of the Internet connection
PsKeepSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8615 UINT PsKeepSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8616 {
8617 	LIST *o;
8618 	PS *ps = (PS *)param;
8619 	UINT ret = 0;
8620 	RPC_KEEP t;
8621 	char *host;
8622 	UINT port;
8623 	// Parameter list that can be specified
8624 	PARAM args[] =
8625 	{
8626 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
8627 		{"HOST", CmdPrompt, _UU("CMD_KeepSet_PROMPT_HOST"), CmdEvalHostAndPort, NULL},
8628 		{"PROTOCOL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_PROTOCOL"), CmdEvalTcpOrUdp, NULL},
8629 		{"INTERVAL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_INTERVAL"), NULL, NULL},
8630 	};
8631 
8632 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
8633 	if (o == NULL)
8634 	{
8635 		return ERR_INVALID_PARAMETER;
8636 	}
8637 
8638 	Zero(&t, sizeof(t));
8639 
8640 	// RPC call
8641 	ret = ScGetKeep(ps->Rpc, &t);
8642 
8643 	if (ret != ERR_NO_ERROR)
8644 	{
8645 		// An error has occured
8646 		CmdPrintError(c, ret);
8647 		FreeParamValueList(o);
8648 		return ret;
8649 	}
8650 
8651 	if (ParseHostPort(GetParamStr(o, "HOST"), &host, &port, 0))
8652 	{
8653 		StrCpy(t.KeepConnectHost, sizeof(t.KeepConnectHost), host);
8654 		t.KeepConnectPort = port;
8655 		t.KeepConnectInterval = GetParamInt(o, "INTERVAL");
8656 		t.KeepConnectProtocol = (StrCmpi(GetParamStr(o, "PROTOCOL"), "tcp") == 0) ? 0 : 1;
8657 		Free(host);
8658 
8659 		// RPC call
8660 		ret = ScSetKeep(ps->Rpc, &t);
8661 
8662 		if (ret != ERR_NO_ERROR)
8663 		{
8664 			// An error has occured
8665 			CmdPrintError(c, ret);
8666 			FreeParamValueList(o);
8667 			return ret;
8668 		}
8669 	}
8670 
8671 	FreeParamValueList(o);
8672 
8673 	return 0;
8674 }
8675 
8676 // Get the maintenance function of the Internet connection
PsKeepGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8677 UINT PsKeepGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8678 {
8679 	LIST *o;
8680 	PS *ps = (PS *)param;
8681 	UINT ret = 0;
8682 	RPC_KEEP t;
8683 
8684 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
8685 	if (o == NULL)
8686 	{
8687 		return ERR_INVALID_PARAMETER;
8688 	}
8689 
8690 	Zero(&t, sizeof(t));
8691 
8692 	// RPC call
8693 	ret = ScGetKeep(ps->Rpc, &t);
8694 
8695 	if (ret != ERR_NO_ERROR)
8696 	{
8697 		// An error has occured
8698 		CmdPrintError(c, ret);
8699 		FreeParamValueList(o);
8700 		return ret;
8701 	}
8702 	else
8703 	{
8704 		wchar_t tmp[MAX_SIZE];
8705 		CT *ct = CtNewStandard();
8706 
8707 		StrToUni(tmp, sizeof(tmp), t.KeepConnectHost);
8708 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_1"), tmp);
8709 
8710 		UniToStru(tmp, t.KeepConnectPort);
8711 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_2"), tmp);
8712 
8713 		UniToStru(tmp, t.KeepConnectInterval);
8714 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_3"), tmp);
8715 
8716 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_4"),
8717 			t.KeepConnectProtocol == 0 ? L"TCP/IP" : L"UDP/IP");
8718 
8719 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_5"),
8720 			t.UseKeepConnect ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"));
8721 
8722 		CtFree(ct, c);
8723 	}
8724 
8725 	FreeParamValueList(o);
8726 
8727 	return 0;
8728 }
8729 
8730 // Get the connection type string
GetConnectionTypeStr(UINT type)8731 wchar_t *GetConnectionTypeStr(UINT type)
8732 {
8733 	char tmp[MAX_SIZE];
8734 	Format(tmp, sizeof(tmp), "SM_CONNECTION_TYPE_%u", type);
8735 
8736 	return _UU(tmp);
8737 }
8738 
8739 // Get the list of TCP connections connected to VPN Server
PsConnectionList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8740 UINT PsConnectionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8741 {
8742 	LIST *o;
8743 	PS *ps = (PS *)param;
8744 	UINT ret = 0;
8745 	RPC_ENUM_CONNECTION t;
8746 	UINT i;
8747 	CT *ct;
8748 
8749 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
8750 	if (o == NULL)
8751 	{
8752 		return ERR_INVALID_PARAMETER;
8753 	}
8754 
8755 	Zero(&t, sizeof(t));
8756 
8757 	// RPC call
8758 	ret = ScEnumConnection(ps->Rpc, &t);
8759 
8760 	if (ret != ERR_NO_ERROR)
8761 	{
8762 		// An error has occured
8763 		CmdPrintError(c, ret);
8764 		FreeParamValueList(o);
8765 		return ret;
8766 	}
8767 
8768 	ct = CtNew();
8769 	CtInsertColumn(ct, _UU("SM_CONN_COLUMN_1"), false);
8770 	CtInsertColumn(ct, _UU("SM_CONN_COLUMN_2"), false);
8771 	CtInsertColumn(ct, _UU("SM_CONN_COLUMN_3"), false);
8772 	CtInsertColumn(ct, _UU("SM_CONN_COLUMN_4"), false);
8773 
8774 	for (i = 0;i < t.NumConnection;i++)
8775 	{
8776 		wchar_t tmp[MAX_SIZE];
8777 		wchar_t name[MAX_SIZE];
8778 		wchar_t datetime[MAX_SIZE];
8779 		RPC_ENUM_CONNECTION_ITEM *e = &t.Connections[i];
8780 
8781 		StrToUni(name, sizeof(name), e->Name);
8782 		UniFormat(tmp, sizeof(tmp), _UU("SM_HOSTNAME_AND_PORT"), e->Hostname, e->Port);
8783 		GetDateTimeStrEx64(datetime, sizeof(datetime), SystemToLocal64(e->ConnectedTime), NULL);
8784 
8785 		CtInsert(ct, name, tmp, datetime,
8786 			GetConnectionTypeStr(e->Type));
8787 	}
8788 
8789 	CtFree(ct, c);
8790 
8791 	FreeRpcEnumConnetion(&t);
8792 
8793 	FreeParamValueList(o);
8794 
8795 	return 0;
8796 }
8797 
8798 // Get the TCP connection information currently connected to the VPN Server
PsConnectionGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8799 UINT PsConnectionGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8800 {
8801 	LIST *o;
8802 	PS *ps = (PS *)param;
8803 	UINT ret = 0;
8804 	RPC_CONNECTION_INFO t;
8805 	CT *ct;
8806 	wchar_t tmp[MAX_SIZE];
8807 	// Parameter list that can be specified
8808 	PARAM args[] =
8809 	{
8810 		{"[name]", CmdPrompt, _UU("CMD_ConnectionGet_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
8811 	};
8812 
8813 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
8814 	if (o == NULL)
8815 	{
8816 		return ERR_INVALID_PARAMETER;
8817 	}
8818 
8819 	Zero(&t, sizeof(t));
8820 
8821 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
8822 
8823 	// RPC call
8824 	ret = ScGetConnectionInfo(ps->Rpc, &t);
8825 
8826 	if (ret != ERR_NO_ERROR)
8827 	{
8828 		// An error has occured
8829 		CmdPrintError(c, ret);
8830 		FreeParamValueList(o);
8831 		return ret;
8832 	}
8833 	else
8834 	{
8835 		ct = CtNewStandard();
8836 
8837 		StrToUni(tmp, sizeof(tmp), t.Name);
8838 		CtInsert(ct, _UU("SM_CONNINFO_NAME"), tmp);
8839 
8840 		CtInsert(ct, _UU("SM_CONNINFO_TYPE"), GetConnectionTypeStr(t.Type));
8841 
8842 		StrToUni(tmp, sizeof(tmp), t.Hostname);
8843 		CtInsert(ct, _UU("SM_CONNINFO_HOSTNAME"), tmp);
8844 
8845 		UniToStru(tmp, t.Port);
8846 		CtInsert(ct, _UU("SM_CONNINFO_PORT"), tmp);
8847 
8848 		GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ConnectedTime), NULL);
8849 		CtInsert(ct, _UU("SM_CONNINFO_TIME"), tmp);
8850 
8851 		StrToUni(tmp, sizeof(tmp), t.ServerStr);
8852 		CtInsert(ct, _UU("SM_CONNINFO_SERVER_STR"), tmp);
8853 
8854 		UniFormat(tmp, sizeof(tmp), L"%u.%02u", t.ServerVer / 100, t.ServerVer % 100);
8855 		CtInsert(ct, _UU("SM_CONNINFO_SERVER_VER"), tmp);
8856 
8857 		UniToStru(tmp, t.ServerBuild);
8858 		CtInsert(ct, _UU("SM_CONNINFO_SERVER_BUILD"), tmp);
8859 
8860 		if (StrLen(t.ClientStr) != 0)
8861 		{
8862 			StrToUni(tmp, sizeof(tmp), t.ClientStr);
8863 			CtInsert(ct, _UU("SM_CONNINFO_CLIENT_STR"), tmp);
8864 
8865 			UniFormat(tmp, sizeof(tmp), L"%u.%02u", t.ClientVer / 100, t.ClientVer % 100);
8866 			CtInsert(ct, _UU("SM_CONNINFO_CLIENT_VER"), tmp);
8867 
8868 			UniToStru(tmp, t.ClientBuild);
8869 			CtInsert(ct, _UU("SM_CONNINFO_CLIENT_BUILD"), tmp);
8870 		}
8871 
8872 		CtFree(ct, c);
8873 	}
8874 
8875 	FreeParamValueList(o);
8876 
8877 	return 0;
8878 }
8879 
8880 // Disconnect the TCP connection connected to the VPN Server
PsConnectionDisconnect(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8881 UINT PsConnectionDisconnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8882 {
8883 	LIST *o;
8884 	PS *ps = (PS *)param;
8885 	UINT ret = 0;
8886 	RPC_DISCONNECT_CONNECTION t;
8887 	// Parameter list that can be specified
8888 	PARAM args[] =
8889 	{
8890 		{"[name]", CmdPrompt, _UU("CMD_ConnectionDisconnect_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
8891 	};
8892 
8893 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
8894 	if (o == NULL)
8895 	{
8896 		return ERR_INVALID_PARAMETER;
8897 	}
8898 
8899 	Zero(&t, sizeof(t));
8900 
8901 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
8902 
8903 	// RPC call
8904 	ret = ScDisconnectConnection(ps->Rpc, &t);
8905 
8906 	if (ret != ERR_NO_ERROR)
8907 	{
8908 		// An error has occured
8909 		CmdPrintError(c, ret);
8910 		FreeParamValueList(o);
8911 		return ret;
8912 	}
8913 
8914 	FreeParamValueList(o);
8915 
8916 	return 0;
8917 }
8918 
8919 // Get the LAN card list that can be used for local bridge
PsBridgeDeviceList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8920 UINT PsBridgeDeviceList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8921 {
8922 	LIST *o;
8923 	PS *ps = (PS *)param;
8924 	UINT ret = 0;
8925 	RPC_ENUM_ETH t;
8926 	UINT i;
8927 
8928 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
8929 	if (o == NULL)
8930 	{
8931 		return ERR_INVALID_PARAMETER;
8932 	}
8933 
8934 	Zero(&t, sizeof(t));
8935 
8936 	// RPC call
8937 	ret = ScEnumEthernet(ps->Rpc, &t);
8938 
8939 	if (ret != ERR_NO_ERROR)
8940 	{
8941 		// An error has occured
8942 		CmdPrintError(c, ret);
8943 		FreeParamValueList(o);
8944 		return ret;
8945 	}
8946 
8947 	for (i = 0;i < t.NumItem;i++)
8948 	{
8949 		RPC_ENUM_ETH_ITEM *item = &t.Items[i];
8950 		wchar_t tmp[MAX_SIZE * 2];
8951 
8952 		StrToUni(tmp, sizeof(tmp), item->DeviceName);
8953 		c->Write(c, tmp);
8954 	}
8955 
8956 	FreeRpcEnumEth(&t);
8957 
8958 	FreeParamValueList(o);
8959 
8960 	return 0;
8961 }
8962 
8963 // Get the list of local bridge connection
PsBridgeList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8964 UINT PsBridgeList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8965 {
8966 	LIST *o;
8967 	PS *ps = (PS *)param;
8968 	UINT ret = 0;
8969 	RPC_ENUM_LOCALBRIDGE t;
8970 	UINT i;
8971 	CT *ct;
8972 
8973 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
8974 	if (o == NULL)
8975 	{
8976 		return ERR_INVALID_PARAMETER;
8977 	}
8978 
8979 	Zero(&t, sizeof(t));
8980 
8981 	// RPC call
8982 	ret = ScEnumLocalBridge(ps->Rpc, &t);
8983 
8984 	if (ret != ERR_NO_ERROR)
8985 	{
8986 		// An error has occured
8987 		CmdPrintError(c, ret);
8988 		FreeParamValueList(o);
8989 		return ret;
8990 	}
8991 
8992 	ct = CtNew();
8993 
8994 	CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_1"), false);
8995 	CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_2"), false);
8996 	CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_3"), false);
8997 	CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_4"), false);
8998 
8999 	for (i = 0;i < t.NumItem;i++)
9000 	{
9001 		RPC_LOCALBRIDGE *e = &t.Items[i];
9002 		wchar_t name[MAX_SIZE];
9003 		wchar_t nic[MAX_SIZE];
9004 		wchar_t hub[MAX_SIZE];
9005 		wchar_t *status = _UU("SM_BRIDGE_OFFLINE");
9006 
9007 		UniToStru(name, i + 1);
9008 		StrToUni(nic, sizeof(nic), e->DeviceName);
9009 		StrToUni(hub, sizeof(hub), e->HubName);
9010 
9011 		if (e->Online)
9012 		{
9013 			status = e->Active ? _UU("SM_BRIDGE_ONLINE") : _UU("SM_BRIDGE_ERROR");
9014 		}
9015 
9016 		CtInsert(ct, name, hub, nic, status);
9017 	}
9018 
9019 	CtFree(ct, c);
9020 
9021 	FreeRpcEnumLocalBridge(&t);
9022 
9023 	FreeParamValueList(o);
9024 
9025 	return 0;
9026 }
9027 
9028 // Create a local bridge connection
PsBridgeCreate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9029 UINT PsBridgeCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9030 {
9031 	LIST *o;
9032 	PS *ps = (PS *)param;
9033 	UINT ret = 0;
9034 	RPC_LOCALBRIDGE t;
9035 	// Parameter list that can be specified
9036 	PARAM args[] =
9037 	{
9038 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9039 		{"[hubname]", CmdPrompt, _UU("CMD_BridgeCreate_PROMPT_HUBNAME"), CmdEvalNotEmpty, NULL},
9040 		{"DEVICE", CmdPrompt, _UU("CMD_BridgeCreate_PROMPT_DEVICE"), CmdEvalNotEmpty, NULL},
9041 		{"TAP", NULL, NULL, NULL, NULL},
9042 	};
9043 
9044 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9045 	if (o == NULL)
9046 	{
9047 		return ERR_INVALID_PARAMETER;
9048 	}
9049 
9050 	Zero(&t, sizeof(t));
9051 
9052 	t.Active = true;
9053 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "DEVICE"));
9054 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[hubname]"));
9055 	t.Online = true;
9056 	t.TapMode = GetParamYes(o, "TAP");
9057 
9058 	// RPC call
9059 	ret = ScAddLocalBridge(ps->Rpc, &t);
9060 
9061 	if (ret != ERR_NO_ERROR)
9062 	{
9063 		// An error has occured
9064 		CmdPrintError(c, ret);
9065 		FreeParamValueList(o);
9066 		return ret;
9067 	}
9068 	else
9069 	{
9070 		c->Write(c, _UU("SM_BRIDGE_INTEL"));
9071 		c->Write(c, L"");
9072 
9073 		if (GetCapsBool(ps->CapsList, "b_is_in_vm"))
9074 		{
9075 			// Message in the case of operating in a VM
9076 			c->Write(c, _UU("D_SM_VMBRIDGE@CAPTION"));
9077 			c->Write(c, _UU("D_SM_VMBRIDGE@S_1"));
9078 			c->Write(c, _UU("D_SM_VMBRIDGE@S_2"));
9079 			c->Write(c, L"");
9080 		}
9081 	}
9082 
9083 	FreeParamValueList(o);
9084 
9085 	return 0;
9086 }
9087 
9088 // Delete the local bridge connection
PsBridgeDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9089 UINT PsBridgeDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9090 {
9091 	LIST *o;
9092 	PS *ps = (PS *)param;
9093 	UINT ret = 0;
9094 	RPC_LOCALBRIDGE t;
9095 	// Parameter list that can be specified
9096 	PARAM args[] =
9097 	{
9098 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9099 		{"[hubname]", CmdPrompt, _UU("CMD_BridgeDelete_PROMPT_HUBNAME"), CmdEvalNotEmpty, NULL},
9100 		{"DEVICE", CmdPrompt, _UU("CMD_BridgeDelete_PROMPT_DEVICE"), CmdEvalNotEmpty, NULL},
9101 	};
9102 
9103 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9104 	if (o == NULL)
9105 	{
9106 		return ERR_INVALID_PARAMETER;
9107 	}
9108 
9109 	Zero(&t, sizeof(t));
9110 
9111 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "DEVICE"));
9112 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[hubname]"));
9113 
9114 	// RPC call
9115 	ret = ScDeleteLocalBridge(ps->Rpc, &t);
9116 
9117 	if (ret != ERR_NO_ERROR)
9118 	{
9119 		// An error has occured
9120 		CmdPrintError(c, ret);
9121 		FreeParamValueList(o);
9122 		return ret;
9123 	}
9124 
9125 	FreeParamValueList(o);
9126 
9127 	return 0;
9128 }
9129 
9130 // Get the list of features and capabilities of the server
PsCaps(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9131 UINT PsCaps(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9132 {
9133 	LIST *o;
9134 	PS *ps = (PS *)param;
9135 	UINT ret = 0;
9136 	CAPSLIST *t;
9137 
9138 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
9139 	if (o == NULL)
9140 	{
9141 		return ERR_INVALID_PARAMETER;
9142 	}
9143 
9144 	// RPC call
9145 	t = ScGetCapsEx(ps->Rpc);
9146 
9147 	if (ret != ERR_NO_ERROR)
9148 	{
9149 		// An error has occured
9150 		CmdPrintError(c, ret);
9151 		FreeParamValueList(o);
9152 		return ret;
9153 	}
9154 	else
9155 	{
9156 		UINT i;
9157 		CT *ct;
9158 
9159 		ct = CtNewStandard();
9160 
9161 		for (i = 0;i < LIST_NUM(t->CapsList);i++)
9162 		{
9163 			CAPS *c = LIST_DATA(t->CapsList, i);
9164 			wchar_t title[MAX_SIZE];
9165 			char name[256];
9166 
9167 			Format(name, sizeof(name), "CT_%s", c->Name);
9168 
9169 			UniStrCpy(title, sizeof(title), _UU(name));
9170 
9171 			if (UniIsEmptyStr(title))
9172 			{
9173 				UniFormat(title, sizeof(title), L"%S", (StrLen(c->Name) >= 2) ? c->Name + 2 : c->Name);
9174 			}
9175 
9176 			if (StartWith(c->Name, "b_"))
9177 			{
9178 				bool icon_pass = c->Value == 0 ? false : true;
9179 				if (StrCmpi(c->Name, "b_must_install_pcap") == 0)
9180 				{
9181 					// Reverse only item of WinPcap
9182 					icon_pass = !icon_pass;
9183 				}
9184 				CtInsert(ct, title, c->Value == 0 ? _UU("CAPS_NO") : _UU("CAPS_YES"));
9185 			}
9186 			else
9187 			{
9188 				wchar_t str[64];
9189 				UniToStru(str, c->Value);
9190 				CtInsert(ct, title, str);
9191 			}
9192 		}
9193 
9194 		CtFree(ct, c);
9195 	}
9196 
9197 	FreeCapsList(t);
9198 
9199 	FreeParamValueList(o);
9200 
9201 	return 0;
9202 }
9203 
9204 // Restart the VPN Server service
PsReboot(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9205 UINT PsReboot(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9206 {
9207 	LIST *o;
9208 	PS *ps = (PS *)param;
9209 	UINT ret = 0;
9210 	RPC_TEST t;
9211 	// Parameter list that can be specified
9212 	PARAM args[] =
9213 	{
9214 		{"RESETCONFIG", NULL, NULL, NULL, NULL},
9215 	};
9216 
9217 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9218 	if (o == NULL)
9219 	{
9220 		return ERR_INVALID_PARAMETER;
9221 	}
9222 
9223 	Zero(&t, sizeof(t));
9224 
9225 	t.IntValue = GetParamYes(o, "RESETCONFIG") ? 1 : 0;
9226 
9227 	// RPC call
9228 	ret = ScRebootServer(ps->Rpc, &t);
9229 
9230 	if (ret != ERR_NO_ERROR)
9231 	{
9232 		// An error has occured
9233 		CmdPrintError(c, ret);
9234 		FreeParamValueList(o);
9235 		return ret;
9236 	}
9237 
9238 	FreeRpcTest(&t);
9239 
9240 	FreeParamValueList(o);
9241 
9242 	return 0;
9243 }
9244 
9245 // Get the current configuration of the VPN Server
PsConfigGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9246 UINT PsConfigGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9247 {
9248 	LIST *o;
9249 	PS *ps = (PS *)param;
9250 	UINT ret = 0;
9251 	RPC_CONFIG t;
9252 	// Parameter list that can be specified
9253 	PARAM args[] =
9254 	{
9255 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9256 		{"[path]", NULL, NULL, NULL, NULL},
9257 	};
9258 
9259 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9260 	if (o == NULL)
9261 	{
9262 		return ERR_INVALID_PARAMETER;
9263 	}
9264 
9265 	Zero(&t, sizeof(t));
9266 
9267 	// RPC call
9268 	ret = ScGetConfig(ps->Rpc, &t);
9269 
9270 	if (ret != ERR_NO_ERROR)
9271 	{
9272 		// An error has occured
9273 		CmdPrintError(c, ret);
9274 		FreeParamValueList(o);
9275 		return ret;
9276 	}
9277 	else
9278 	{
9279 		wchar_t *filename = GetParamUniStr(o, "[path]");
9280 
9281 		if (IsEmptyUniStr(filename))
9282 		{
9283 			// Display on the screen
9284 			wchar_t tmp[MAX_SIZE];
9285 			UINT buf_size;
9286 			wchar_t *buf;
9287 			UNI_TOKEN_LIST *lines;
9288 
9289 			UniFormat(tmp, sizeof(tmp), _UU("CMD_ConfigGet_FILENAME"), t.FileName,
9290 				StrLen(t.FileData));
9291 			c->Write(c, tmp);
9292 			c->Write(c, L"");
9293 
9294 			buf_size = CalcUtf8ToUni((BYTE *)t.FileData, StrLen(t.FileData));
9295 			buf = ZeroMalloc(buf_size + 32);
9296 
9297 			Utf8ToUni(buf, buf_size, (BYTE *)t.FileData, StrLen(t.FileData));
9298 
9299 			lines = UniGetLines(buf);
9300 			if (lines != NULL)
9301 			{
9302 				UINT i;
9303 
9304 				for (i = 0;i < lines->NumTokens;i++)
9305 				{
9306 					c->Write(c, lines->Token[i]);
9307 				}
9308 
9309 				UniFreeToken(lines);
9310 			}
9311 
9312 			c->Write(c, L"");
9313 
9314 			Free(buf);
9315 		}
9316 		else
9317 		{
9318 			// Save to the file
9319 			IO *io = FileCreateW(filename);
9320 
9321 			if (io == NULL)
9322 			{
9323 				c->Write(c, _UU("CMD_ConfigGet_FILE_SAVE_FAILED"));
9324 
9325 				ret = ERR_INTERNAL_ERROR;
9326 			}
9327 			else
9328 			{
9329 				FileWrite(io, t.FileData, StrLen(t.FileData));
9330 				FileClose(io);
9331 			}
9332 		}
9333 	}
9334 
9335 	FreeRpcConfig(&t);
9336 
9337 	FreeParamValueList(o);
9338 
9339 	return ret;
9340 }
9341 
9342 // Write the configuration to the VPN Server
PsConfigSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9343 UINT PsConfigSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9344 {
9345 	LIST *o;
9346 	PS *ps = (PS *)param;
9347 	UINT ret = 0;
9348 	RPC_CONFIG t;
9349 	wchar_t *filename;
9350 	BUF *buf;
9351 	// Parameter list that can be specified
9352 	PARAM args[] =
9353 	{
9354 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9355 		{"[path]", CmdPrompt, _UU("CMD_ConfigSet_PROMPT_PATH"), CmdEvalIsFile, NULL},
9356 	};
9357 
9358 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9359 	if (o == NULL)
9360 	{
9361 		return ERR_INVALID_PARAMETER;
9362 	}
9363 
9364 	filename = GetParamUniStr(o, "[path]");
9365 
9366 	buf = ReadDumpW(filename);
9367 	if (buf == NULL)
9368 	{
9369 		c->Write(c, _UU("CMD_ConfigSet_FILE_LOAD_FAILED"));
9370 	}
9371 	else
9372 	{
9373 		Zero(&t, sizeof(t));
9374 
9375 		t.FileData = ZeroMalloc(buf->Size + 1);
9376 		Copy(t.FileData, buf->Buf, buf->Size);
9377 		FreeBuf(buf);
9378 
9379 		// RPC call
9380 		ret = ScSetConfig(ps->Rpc, &t);
9381 
9382 		if (ret != ERR_NO_ERROR)
9383 		{
9384 			// An error has occured
9385 			CmdPrintError(c, ret);
9386 			FreeParamValueList(o);
9387 			return ret;
9388 		}
9389 
9390 		FreeRpcConfig(&t);
9391 	}
9392 
9393 	FreeParamValueList(o);
9394 
9395 	return 0;
9396 }
9397 
9398 // Get the Virtual Layer 3 switch list
PsRouterList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9399 UINT PsRouterList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9400 {
9401 	LIST *o;
9402 	PS *ps = (PS *)param;
9403 	UINT ret = 0;
9404 	RPC_ENUM_L3SW t;
9405 
9406 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
9407 	if (o == NULL)
9408 	{
9409 		return ERR_INVALID_PARAMETER;
9410 	}
9411 
9412 	Zero(&t, sizeof(t));
9413 
9414 	// RPC call
9415 	ret = ScEnumL3Switch(ps->Rpc, &t);
9416 
9417 	if (ret != ERR_NO_ERROR)
9418 	{
9419 		// An error has occured
9420 		CmdPrintError(c, ret);
9421 		FreeParamValueList(o);
9422 		return ret;
9423 	}
9424 	else
9425 	{
9426 		CT *ct = CtNew();
9427 		UINT i;
9428 
9429 		CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN1"), false);
9430 		CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN2"), false);
9431 		CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN3"), true);
9432 		CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN4"), true);
9433 
9434 		for (i = 0;i < t.NumItem;i++)
9435 		{
9436 			RPC_ENUM_L3SW_ITEM *e = &t.Items[i];
9437 			wchar_t tmp1[MAX_SIZE], *tmp2, tmp3[64], tmp4[64];
9438 
9439 			StrToUni(tmp1, sizeof(tmp1), e->Name);
9440 			if (e->Active == false)
9441 			{
9442 				tmp2 = _UU("SM_L3_SW_ST_F_F");
9443 			}
9444 			else if (e->Online == false)
9445 			{
9446 				tmp2 = _UU("SM_L3_SW_ST_T_F");
9447 			}
9448 			else
9449 			{
9450 				tmp2 = _UU("SM_L3_SW_ST_T_T");
9451 			}
9452 			UniToStru(tmp3, e->NumInterfaces);
9453 			UniToStru(tmp4, e->NumTables);
9454 
9455 			CtInsert(ct,
9456 				tmp1, tmp2, tmp3, tmp4);
9457 		}
9458 
9459 		CtFree(ct, c);
9460 	}
9461 
9462 	FreeRpcEnumL3Sw(&t);
9463 
9464 	FreeParamValueList(o);
9465 
9466 	return 0;
9467 }
9468 
9469 // Define a new virtual layer 3 switch
PsRouterAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9470 UINT PsRouterAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9471 {
9472 	LIST *o;
9473 	PS *ps = (PS *)param;
9474 	UINT ret = 0;
9475 	RPC_L3SW t;
9476 	// Parameter list that can be specified
9477 	PARAM args[] =
9478 	{
9479 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9480 		{"[name]", CmdPrompt, _UU("CMD_RouterAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
9481 	};
9482 
9483 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9484 	if (o == NULL)
9485 	{
9486 		return ERR_INVALID_PARAMETER;
9487 	}
9488 
9489 	Zero(&t, sizeof(t));
9490 
9491 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
9492 
9493 	// RPC call
9494 	ret = ScAddL3Switch(ps->Rpc, &t);
9495 
9496 	if (ret != ERR_NO_ERROR)
9497 	{
9498 		// An error has occured
9499 		CmdPrintError(c, ret);
9500 		FreeParamValueList(o);
9501 		return ret;
9502 	}
9503 
9504 	FreeParamValueList(o);
9505 
9506 	return 0;
9507 }
9508 
9509 // Delete the Virtual Layer 3 Switch
PsRouterDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9510 UINT PsRouterDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9511 {
9512 	LIST *o;
9513 	PS *ps = (PS *)param;
9514 	UINT ret = 0;
9515 	RPC_L3SW t;
9516 	// Parameter list that can be specified
9517 	PARAM args[] =
9518 	{
9519 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9520 		{"[name]", CmdPrompt, _UU("CMD_RouterDelete_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
9521 	};
9522 
9523 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9524 	if (o == NULL)
9525 	{
9526 		return ERR_INVALID_PARAMETER;
9527 	}
9528 
9529 	Zero(&t, sizeof(t));
9530 
9531 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
9532 
9533 	// RPC call
9534 	ret = ScDelL3Switch(ps->Rpc, &t);
9535 
9536 	if (ret != ERR_NO_ERROR)
9537 	{
9538 		// An error has occured
9539 		CmdPrintError(c, ret);
9540 		FreeParamValueList(o);
9541 		return ret;
9542 	}
9543 
9544 	FreeParamValueList(o);
9545 
9546 	return 0;
9547 }
9548 
9549 // Start the Virtual Layer 3 Switch
PsRouterStart(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9550 UINT PsRouterStart(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9551 {
9552 	LIST *o;
9553 	PS *ps = (PS *)param;
9554 	UINT ret = 0;
9555 	RPC_L3SW t;
9556 	// Parameter list that can be specified
9557 	PARAM args[] =
9558 	{
9559 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9560 		{"[name]", CmdPrompt, _UU("CMD_RouterStart_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
9561 	};
9562 
9563 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9564 	if (o == NULL)
9565 	{
9566 		return ERR_INVALID_PARAMETER;
9567 	}
9568 
9569 	Zero(&t, sizeof(t));
9570 
9571 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
9572 
9573 	// RPC call
9574 	ret = ScStartL3Switch(ps->Rpc, &t);
9575 
9576 	if (ret != ERR_NO_ERROR)
9577 	{
9578 		// An error has occured
9579 		CmdPrintError(c, ret);
9580 		FreeParamValueList(o);
9581 		return ret;
9582 	}
9583 
9584 	FreeParamValueList(o);
9585 
9586 	return 0;
9587 }
9588 
9589 // Stop the Virtual Layer 3 Switch
PsRouterStop(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9590 UINT PsRouterStop(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9591 {
9592 	LIST *o;
9593 	PS *ps = (PS *)param;
9594 	UINT ret = 0;
9595 	RPC_L3SW t;
9596 	// Parameter list that can be specified
9597 	PARAM args[] =
9598 	{
9599 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9600 		{"[name]", CmdPrompt, _UU("CMD_RouterStop_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
9601 	};
9602 
9603 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9604 	if (o == NULL)
9605 	{
9606 		return ERR_INVALID_PARAMETER;
9607 	}
9608 
9609 	Zero(&t, sizeof(t));
9610 
9611 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
9612 
9613 	// RPC call
9614 	ret = ScStopL3Switch(ps->Rpc, &t);
9615 
9616 	if (ret != ERR_NO_ERROR)
9617 	{
9618 		// An error has occured
9619 		CmdPrintError(c, ret);
9620 		FreeParamValueList(o);
9621 		return ret;
9622 	}
9623 
9624 	FreeParamValueList(o);
9625 
9626 	return 0;
9627 }
9628 
9629 // Get the interface list registered on Virtual Layer 3 Switch
PsRouterIfList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9630 UINT PsRouterIfList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9631 {
9632 	LIST *o;
9633 	PS *ps = (PS *)param;
9634 	UINT ret = 0;
9635 	RPC_ENUM_L3IF t;
9636 	// Parameter list that can be specified
9637 	PARAM args[] =
9638 	{
9639 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9640 		{"[name]", CmdPrompt, _UU("CMD_RouterIfList_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
9641 	};
9642 
9643 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9644 	if (o == NULL)
9645 	{
9646 		return ERR_INVALID_PARAMETER;
9647 	}
9648 
9649 	Zero(&t, sizeof(t));
9650 
9651 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
9652 
9653 	// RPC call
9654 	ret = ScEnumL3If(ps->Rpc, &t);
9655 
9656 	if (ret != ERR_NO_ERROR)
9657 	{
9658 		// An error has occured
9659 		CmdPrintError(c, ret);
9660 		FreeParamValueList(o);
9661 		return ret;
9662 	}
9663 	else
9664 	{
9665 		UINT i;
9666 		wchar_t tmp1[MAX_SIZE];
9667 		wchar_t tmp2[MAX_SIZE];
9668 		wchar_t tmp3[MAX_SIZE];
9669 		CT *ct = CtNew();
9670 
9671 		CtInsertColumn(ct, _UU("SM_L3_SW_IF_COLUMN1"), false);
9672 		CtInsertColumn(ct, _UU("SM_L3_SW_IF_COLUMN2"), false);
9673 		CtInsertColumn(ct, _UU("SM_L3_SW_IF_COLUMN3"), false);
9674 
9675 		for (i = 0;i < t.NumItem;i++)
9676 		{
9677 			RPC_L3IF *e = &t.Items[i];
9678 
9679 			IPToUniStr32(tmp1, sizeof(tmp1), e->IpAddress);
9680 			IPToUniStr32(tmp2, sizeof(tmp2), e->SubnetMask);
9681 			StrToUni(tmp3, sizeof(tmp3), e->HubName);
9682 
9683 			CtInsert(ct, tmp1, tmp2, tmp3);
9684 		}
9685 
9686 
9687 		CtFree(ct, c);
9688 	}
9689 
9690 	FreeRpcEnumL3If(&t);
9691 
9692 	FreeParamValueList(o);
9693 
9694 	return 0;
9695 }
9696 
9697 // Evaluate the IP address and mask
CmdEvalIpAndMask4(CONSOLE * c,wchar_t * str,void * param)9698 bool CmdEvalIpAndMask4(CONSOLE *c, wchar_t *str, void *param)
9699 {
9700 	char tmp[MAX_SIZE];
9701 	UINT ip, mask;
9702 	// Validate arguments
9703 	if (c == NULL || str == NULL)
9704 	{
9705 		return false;
9706 	}
9707 
9708 	UniToStr(tmp, sizeof(tmp), str);
9709 
9710 	if (ParseIpAndMask4(tmp, &ip, &mask) == false)
9711 	{
9712 		c->Write(c, _UU("CMD_PARSE_IP_MASK_ERROR_1"));
9713 		return false;
9714 	}
9715 
9716 	return true;
9717 }
CmdEvalIpAndMask6(CONSOLE * c,wchar_t * str,void * param)9718 bool CmdEvalIpAndMask6(CONSOLE *c, wchar_t *str, void *param)
9719 {
9720 	char tmp[MAX_SIZE];
9721 	IP ip, mask;
9722 	// Validate arguments
9723 	if (c == NULL || str == NULL)
9724 	{
9725 		return false;
9726 	}
9727 
9728 	UniToStr(tmp, sizeof(tmp), str);
9729 
9730 	if (ParseIpAndMask6(tmp, &ip, &mask) == false)
9731 	{
9732 		c->Write(c, _UU("CMD_PARSE_IP_MASK_ERROR_1_6"));
9733 		return false;
9734 	}
9735 
9736 	return true;
9737 }
CmdEvalIpAndMask46(CONSOLE * c,wchar_t * str,void * param)9738 bool CmdEvalIpAndMask46(CONSOLE *c, wchar_t *str, void *param)
9739 {
9740 	char tmp[MAX_SIZE];
9741 	TOKEN_LIST *t;
9742 	bool ret = false;
9743 
9744 	Zero(tmp, sizeof(tmp));
9745 	UniToStr(tmp, sizeof(tmp), str);
9746 
9747 	t = ParseToken(tmp, "/");
9748 	if (t == NULL)
9749 	{
9750 		return false;
9751 	}
9752 
9753 	if (t->NumTokens >= 1)
9754 	{
9755 		Trim(t->Token[0]);
9756 
9757 		if (IsIpStr4(t->Token[0]))
9758 		{
9759 			ret = CmdEvalIpAndMask4(c, str, param);
9760 		}
9761 		else
9762 		{
9763 			ret = CmdEvalIpAndMask6(c, str, param);
9764 		}
9765 	}
9766 
9767 	FreeToken(t);
9768 
9769 	return ret;
9770 }
9771 
9772 // Evaluate the network address and the subnet mask
CmdEvalNetworkAndSubnetMask4(CONSOLE * c,wchar_t * str,void * param)9773 bool CmdEvalNetworkAndSubnetMask4(CONSOLE *c, wchar_t *str, void *param)
9774 {
9775 	char tmp[MAX_SIZE];
9776 	UINT ip, mask;
9777 	// Validate arguments
9778 	if (c == NULL || str == NULL)
9779 	{
9780 		return false;
9781 	}
9782 
9783 	UniToStr(tmp, sizeof(tmp), str);
9784 
9785 	if (ParseIpAndSubnetMask4(tmp, &ip, &mask) == false)
9786 	{
9787 		c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_1"));
9788 		return false;
9789 	}
9790 
9791 	if (IsNetworkAddress32(ip, mask) == false)
9792 	{
9793 		c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_2"));
9794 		return false;
9795 	}
9796 
9797 	return true;
9798 }
CmdEvalNetworkAndSubnetMask6(CONSOLE * c,wchar_t * str,void * param)9799 bool CmdEvalNetworkAndSubnetMask6(CONSOLE *c, wchar_t *str, void *param)
9800 {
9801 	char tmp[MAX_SIZE];
9802 	IP ip, mask;
9803 	// Validate arguments
9804 	if (c == NULL || str == NULL)
9805 	{
9806 		return false;
9807 	}
9808 
9809 	UniToStr(tmp, sizeof(tmp), str);
9810 
9811 	if (ParseIpAndSubnetMask6(tmp, &ip, &mask) == false)
9812 	{
9813 		c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_1_6"));
9814 		return false;
9815 	}
9816 
9817 	if (IsNetworkPrefixAddress6(&ip, &mask) == false)
9818 	{
9819 		c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_3"));
9820 		return false;
9821 	}
9822 
9823 	return true;
9824 }
CmdEvalNetworkAndSubnetMask46(CONSOLE * c,wchar_t * str,void * param)9825 bool CmdEvalNetworkAndSubnetMask46(CONSOLE *c, wchar_t *str, void *param)
9826 {
9827 	char tmp[MAX_SIZE];
9828 	TOKEN_LIST *t;
9829 	bool ret = false;
9830 
9831 	Zero(tmp, sizeof(tmp));
9832 	UniToStr(tmp, sizeof(tmp), str);
9833 
9834 	t = ParseToken(tmp, "/");
9835 	if (t == NULL)
9836 	{
9837 		return false;
9838 	}
9839 
9840 	if (t->NumTokens >= 1)
9841 	{
9842 		Trim(t->Token[0]);
9843 
9844 		if (IsIpStr4(t->Token[0]))
9845 		{
9846 			ret = CmdEvalNetworkAndSubnetMask4(c, str, param);
9847 		}
9848 		else
9849 		{
9850 			ret = CmdEvalNetworkAndSubnetMask6(c, str, param);
9851 		}
9852 	}
9853 
9854 	FreeToken(t);
9855 
9856 	return ret;
9857 }
9858 
9859 // Evaluate the IP address and subnet mask
CmdEvalHostAndSubnetMask4(CONSOLE * c,wchar_t * str,void * param)9860 bool CmdEvalHostAndSubnetMask4(CONSOLE *c, wchar_t *str, void *param)
9861 {
9862 	char tmp[MAX_SIZE];
9863 	// Validate arguments
9864 	if (c == NULL || str == NULL)
9865 	{
9866 		return false;
9867 	}
9868 
9869 	UniToStr(tmp, sizeof(tmp), str);
9870 
9871 	if (ParseIpAndSubnetMask4(tmp, NULL, NULL) == false)
9872 	{
9873 		c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_1"));
9874 		return false;
9875 	}
9876 
9877 	return true;
9878 }
9879 
9880 // Add a virtual interface to the virtual layer 3 switch
PsRouterIfAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9881 UINT PsRouterIfAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9882 {
9883 	LIST *o;
9884 	PS *ps = (PS *)param;
9885 	UINT ret = 0;
9886 	RPC_L3IF t;
9887 	// Parameter list that can be specified
9888 	PARAM args[] =
9889 	{
9890 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9891 		{"[name]", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
9892 		{"HUB", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_HUB"), CmdEvalNotEmpty, NULL},
9893 		{"IP", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_IP"), CmdEvalHostAndSubnetMask4, NULL},
9894 	};
9895 
9896 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9897 	if (o == NULL)
9898 	{
9899 		return ERR_INVALID_PARAMETER;
9900 	}
9901 
9902 	Zero(&t, sizeof(t));
9903 
9904 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
9905 	ParseIpAndSubnetMask4(GetParamStr(o, "IP"), &t.IpAddress, &t.SubnetMask);
9906 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "HUB"));
9907 
9908 	// RPC call
9909 	ret = ScAddL3If(ps->Rpc, &t);
9910 
9911 	if (ret != ERR_NO_ERROR)
9912 	{
9913 		// An error has occured
9914 		CmdPrintError(c, ret);
9915 		FreeParamValueList(o);
9916 		return ret;
9917 	}
9918 
9919 	FreeParamValueList(o);
9920 
9921 	return 0;
9922 }
9923 
9924 // Delete the virtual interface of the virtual layer 3 switch
PsRouterIfDel(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9925 UINT PsRouterIfDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9926 {
9927 	LIST *o;
9928 	PS *ps = (PS *)param;
9929 	UINT ret = 0;
9930 	RPC_L3IF t;
9931 	// Parameter list that can be specified
9932 	PARAM args[] =
9933 	{
9934 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9935 		{"[name]", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
9936 		{"HUB", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_HUB"), CmdEvalNotEmpty, NULL},
9937 	};
9938 
9939 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9940 	if (o == NULL)
9941 	{
9942 		return ERR_INVALID_PARAMETER;
9943 	}
9944 
9945 	Zero(&t, sizeof(t));
9946 
9947 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
9948 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "HUB"));
9949 
9950 	// RPC call
9951 	ret = ScDelL3If(ps->Rpc, &t);
9952 
9953 	if (ret != ERR_NO_ERROR)
9954 	{
9955 		// An error has occured
9956 		CmdPrintError(c, ret);
9957 		FreeParamValueList(o);
9958 		return ret;
9959 	}
9960 
9961 	FreeParamValueList(o);
9962 
9963 	return 0;
9964 }
9965 
9966 // Get the routing table of the Virtual Layer 3 Switch
PsRouterTableList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9967 UINT PsRouterTableList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9968 {
9969 	LIST *o;
9970 	PS *ps = (PS *)param;
9971 	UINT ret = 0;
9972 	RPC_ENUM_L3TABLE t;
9973 	CT *ct;
9974 	wchar_t tmp1[MAX_SIZE];
9975 	wchar_t tmp2[MAX_SIZE];
9976 	wchar_t tmp3[MAX_SIZE];
9977 	wchar_t tmp4[MAX_SIZE];
9978 	// Parameter list that can be specified
9979 	PARAM args[] =
9980 	{
9981 		{"[name]", CmdPrompt, _UU("CMD_RouterTableList_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
9982 	};
9983 
9984 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9985 	if (o == NULL)
9986 	{
9987 		return ERR_INVALID_PARAMETER;
9988 	}
9989 
9990 	Zero(&t, sizeof(t));
9991 
9992 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
9993 
9994 	// RPC call
9995 	ret = ScEnumL3Table(ps->Rpc, &t);
9996 
9997 	if (ret != ERR_NO_ERROR)
9998 	{
9999 		// An error has occured
10000 		CmdPrintError(c, ret);
10001 		FreeParamValueList(o);
10002 		return ret;
10003 	}
10004 	else
10005 	{
10006 		UINT i;
10007 
10008 		ct = CtNew();
10009 
10010 		CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN1"), false);
10011 		CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN2"), false);
10012 		CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN3"), false);
10013 		CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN4"), true);
10014 
10015 		for (i = 0;i < t.NumItem;i++)
10016 		{
10017 			RPC_L3TABLE *e = &t.Items[i];
10018 
10019 			IPToUniStr32(tmp1, sizeof(tmp1), e->NetworkAddress);
10020 			IPToUniStr32(tmp2, sizeof(tmp2), e->SubnetMask);
10021 			IPToUniStr32(tmp3, sizeof(tmp3), e->GatewayAddress);
10022 			UniToStru(tmp4, e->Metric);
10023 
10024 			CtInsert(ct, tmp1, tmp2, tmp3, tmp4);
10025 		}
10026 
10027 		CtFree(ct, c);
10028 	}
10029 
10030 	FreeRpcEnumL3Table(&t);
10031 
10032 	FreeParamValueList(o);
10033 
10034 	return 0;
10035 }
10036 
10037 // Add a routing table entry to the Virtual Layer 3 Switch
PsRouterTableAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10038 UINT PsRouterTableAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10039 {
10040 	LIST *o;
10041 	PS *ps = (PS *)param;
10042 	UINT ret = 0;
10043 	RPC_L3TABLE t;
10044 	// Parameter list that can be specified
10045 	PARAM args[] =
10046 	{
10047 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
10048 		{"[name]", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10049 		{"NETWORK", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NETWORK"), CmdEvalNetworkAndSubnetMask4, NULL},
10050 		{"GATEWAY", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_GATEWAY"), CmdEvalIp, NULL},
10051 		{"METRIC", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_METRIC"), CmdEvalInt1, NULL},
10052 	};
10053 
10054 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10055 	if (o == NULL)
10056 	{
10057 		return ERR_INVALID_PARAMETER;
10058 	}
10059 
10060 	Zero(&t, sizeof(t));
10061 
10062 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
10063 	ParseIpAndSubnetMask4(GetParamStr(o, "NETWORK"), &t.NetworkAddress, &t.SubnetMask);
10064 	t.Metric = GetParamInt(o, "METRIC");
10065 	t.GatewayAddress = StrToIP32(GetParamStr(o, "GATEWAY"));
10066 
10067 	// RPC call
10068 	ret = ScAddL3Table(ps->Rpc, &t);
10069 
10070 	if (ret != ERR_NO_ERROR)
10071 	{
10072 		// An error has occured
10073 		CmdPrintError(c, ret);
10074 		FreeParamValueList(o);
10075 		return ret;
10076 	}
10077 
10078 	FreeParamValueList(o);
10079 
10080 	return 0;
10081 }
10082 
10083 // Delete the routing table entry of the Virtual Layer 3 Switch
PsRouterTableDel(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10084 UINT PsRouterTableDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10085 {
10086 	LIST *o;
10087 	PS *ps = (PS *)param;
10088 	UINT ret = 0;
10089 	RPC_L3TABLE t;
10090 	// Parameter list that can be specified
10091 	PARAM args[] =
10092 	{
10093 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
10094 		{"[name]", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10095 		{"NETWORK", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NETWORK"), CmdEvalNetworkAndSubnetMask4, NULL},
10096 		{"GATEWAY", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_GATEWAY"), CmdEvalIp, NULL},
10097 		{"METRIC", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_METRIC"), CmdEvalInt1, NULL},
10098 	};
10099 
10100 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10101 	if (o == NULL)
10102 	{
10103 		return ERR_INVALID_PARAMETER;
10104 	}
10105 
10106 	Zero(&t, sizeof(t));
10107 
10108 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
10109 	ParseIpAndSubnetMask4(GetParamStr(o, "NETWORK"), &t.NetworkAddress, &t.SubnetMask);
10110 	t.Metric = GetParamInt(o, "METRIC");
10111 	t.GatewayAddress = StrToIP32(GetParamStr(o, "GATEWAY"));
10112 
10113 	// RPC call
10114 	ret = ScDelL3Table(ps->Rpc, &t);
10115 
10116 	if (ret != ERR_NO_ERROR)
10117 	{
10118 		// An error has occured
10119 		CmdPrintError(c, ret);
10120 		FreeParamValueList(o);
10121 		return ret;
10122 	}
10123 
10124 	FreeParamValueList(o);
10125 
10126 	return 0;
10127 }
10128 
10129 // Get the log files list
PsLogFileList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10130 UINT PsLogFileList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10131 {
10132 	LIST *o;
10133 	PS *ps = (PS *)param;
10134 	UINT ret = 0;
10135 	RPC_ENUM_LOG_FILE t;
10136 
10137 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
10138 	if (o == NULL)
10139 	{
10140 		return ERR_INVALID_PARAMETER;
10141 	}
10142 
10143 	Zero(&t, sizeof(t));
10144 
10145 	c->Write(c, _UU("CMD_LogFileList_START"));
10146 	c->Write(c, L"");
10147 
10148 	// RPC call
10149 	ret = ScEnumLogFile(ps->Rpc, &t);
10150 
10151 	if (ret != ERR_NO_ERROR)
10152 	{
10153 		// An error has occured
10154 		CmdPrintError(c, ret);
10155 		FreeParamValueList(o);
10156 		return ret;
10157 	}
10158 	else
10159 	{
10160 		UINT i;
10161 		wchar_t tmp[MAX_SIZE];
10162 		CT *ct;
10163 
10164 		UniFormat(tmp, sizeof(tmp), _UU("CMD_LogFileList_NUM_LOGS"), t.NumItem);
10165 		c->Write(c, tmp);
10166 
10167 		ct = CtNew();
10168 
10169 		CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_1"), false);
10170 		CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_2"), true);
10171 		CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_3"), false);
10172 		CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_4"), false);
10173 
10174 		for (i = 0;i < t.NumItem;i++)
10175 		{
10176 			RPC_ENUM_LOG_FILE_ITEM *e = &t.Items[i];
10177 			wchar_t tmp1[MAX_PATH], tmp2[128], tmp3[128], tmp4[MAX_HOST_NAME_LEN + 1];
10178 			char tmp[MAX_SIZE];
10179 
10180 			StrToUni(tmp1, sizeof(tmp1), e->FilePath);
10181 
10182 			ToStrByte(tmp, sizeof(tmp), e->FileSize);
10183 			StrToUni(tmp2, sizeof(tmp2), tmp);
10184 
10185 			GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->UpdatedTime));
10186 
10187 			StrToUni(tmp4, sizeof(tmp4), e->ServerName);
10188 
10189 			CtInsert(ct, tmp1, tmp2, tmp3, tmp4);
10190 		}
10191 
10192 		CtFreeEx(ct, c, true);
10193 	}
10194 
10195 	FreeRpcEnumLogFile(&t);
10196 
10197 	FreeParamValueList(o);
10198 
10199 	return 0;
10200 }
10201 
10202 // Download a log file
PsLogFileGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10203 UINT PsLogFileGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10204 {
10205 	LIST *o;
10206 	PS *ps = (PS *)param;
10207 	UINT ret = 0;
10208 	BUF *buf;
10209 	char *filename = NULL;
10210 	char *server_name;
10211 	// Parameter list that can be specified
10212 	PARAM args[] =
10213 	{
10214 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
10215 		{"[name]", CmdPrompt, _UU("CMD_LogFileGet_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10216 		{"SERVER", NULL, NULL, NULL, NULL},
10217 		{"SAVEPATH", NULL, NULL, NULL, NULL},
10218 	};
10219 
10220 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10221 	if (o == NULL)
10222 	{
10223 		return ERR_INVALID_PARAMETER;
10224 	}
10225 
10226 	filename = GetParamStr(o, "SAVE");
10227 	if (IsEmptyStr(filename))
10228 	{
10229 		filename = GetParamStr(o, "SAVEPATH");
10230 	}
10231 
10232 	c->Write(c, _UU("CMD_LogFileGet_START"));
10233 
10234 	server_name = GetParamStr(o, "SERVER");
10235 
10236 	buf = DownloadFileFromServer(ps->Rpc, server_name,
10237 		GetParamStr(o, "[name]"), 0, NULL, NULL);
10238 
10239 	if (buf == NULL)
10240 	{
10241 		c->Write(c, _UU("CMD_LogFileGet_FAILED"));
10242 
10243 		ret = ERR_INTERNAL_ERROR;
10244 	}
10245 	else
10246 	{
10247 		if (IsEmptyStr(filename) == false)
10248 		{
10249 			// Save to the file
10250 			if (DumpBuf(buf, filename) == false)
10251 			{
10252 				ret = ERR_INTERNAL_ERROR;
10253 				c->Write(c, _UU("CMD_LogFileGet_SAVE_FAILED"));
10254 			}
10255 		}
10256 		else
10257 		{
10258 			// Display on the screen
10259 			wchar_t tmp[MAX_SIZE];
10260 			UINT buf_size;
10261 			wchar_t *uni_buf;
10262 
10263 			UniFormat(tmp, sizeof(tmp), _UU("CMD_LogFileGet_FILESIZE"),
10264 				buf->Size);
10265 			c->Write(c, tmp);
10266 			c->Write(c, L"");
10267 
10268 			buf_size = CalcUtf8ToUni((BYTE *)buf->Buf, buf->Size);
10269 			uni_buf = ZeroMalloc(buf_size + 32);
10270 
10271 			Utf8ToUni(uni_buf, buf_size, (BYTE *)buf->Buf, buf->Size);
10272 
10273 			c->Write(c, uni_buf);
10274 			c->Write(c, L"");
10275 
10276 			Free(uni_buf);
10277 		}
10278 
10279 		FreeBuf(buf);
10280 	}
10281 
10282 	FreeParamValueList(o);
10283 
10284 	return ret;
10285 }
10286 
10287 // Create a New Virtual HUB
PsHubCreate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10288 UINT PsHubCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10289 {
10290 	LIST *o;
10291 	PS *ps = (PS *)param;
10292 	UINT ret = 0;
10293 	RPC_CREATE_HUB t;
10294 	char *pass = "";
10295 	UINT hub_type = HUB_TYPE_STANDALONE;
10296 	// Parameter list that can be specified
10297 	PARAM args[] =
10298 	{
10299 		{"[name]", CmdPrompt, _UU("CMD_HubCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10300 		{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
10301 	};
10302 
10303 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10304 	if (o == NULL)
10305 	{
10306 		return ERR_INVALID_PARAMETER;
10307 	}
10308 	else
10309 	{
10310 		RPC_SERVER_INFO t;
10311 		Zero(&t, sizeof(t));
10312 		if (ScGetServerInfo(ps->Rpc, &t) == ERR_NO_ERROR)
10313 		{
10314 			if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
10315 			{
10316 				hub_type = HUB_TYPE_FARM_DYNAMIC;
10317 			}
10318 			FreeRpcServerInfo(&t);
10319 		}
10320 	}
10321 
10322 	Zero(&t, sizeof(t));
10323 
10324 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
10325 	t.HubType = hub_type;
10326 
10327 	if (IsEmptyStr(GetParamStr(o, "PASSWORD")) == false)
10328 	{
10329 		pass = GetParamStr(o, "PASSWORD");
10330 	}
10331 
10332 	Hash(t.HashedPassword, pass, StrLen(pass), true);
10333 	HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pass);
10334 	t.Online = true;
10335 
10336 	// RPC call
10337 	ret = ScCreateHub(ps->Rpc, &t);
10338 
10339 	if (ret != ERR_NO_ERROR)
10340 	{
10341 		// An error has occured
10342 		CmdPrintError(c, ret);
10343 		FreeParamValueList(o);
10344 		return ret;
10345 	}
10346 
10347 	FreeParamValueList(o);
10348 
10349 	return 0;
10350 }
10351 
10352 // Create a New Virtual HUB (dynamic mode)
PsHubCreateDynamic(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10353 UINT PsHubCreateDynamic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10354 {
10355 	LIST *o;
10356 	PS *ps = (PS *)param;
10357 	UINT ret = 0;
10358 	RPC_CREATE_HUB t;
10359 	char *pass = "";
10360 	UINT hub_type = HUB_TYPE_FARM_DYNAMIC;
10361 	// Parameter list that can be specified
10362 	PARAM args[] =
10363 	{
10364 		{"[name]", CmdPrompt, _UU("CMD_HubCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10365 		{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
10366 	};
10367 
10368 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10369 	if (o == NULL)
10370 	{
10371 		return ERR_INVALID_PARAMETER;
10372 	}
10373 
10374 	Zero(&t, sizeof(t));
10375 
10376 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
10377 	t.HubType = hub_type;
10378 
10379 	if (IsEmptyStr(GetParamStr(o, "PASSWORD")) == false)
10380 	{
10381 		pass = GetParamStr(o, "PASSWORD");
10382 	}
10383 
10384 	Hash(t.HashedPassword, pass, StrLen(pass), true);
10385 	HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pass);
10386 	t.Online = true;
10387 
10388 	// RPC call
10389 	ret = ScCreateHub(ps->Rpc, &t);
10390 
10391 	if (ret != ERR_NO_ERROR)
10392 	{
10393 		// An error has occured
10394 		CmdPrintError(c, ret);
10395 		FreeParamValueList(o);
10396 		return ret;
10397 	}
10398 
10399 	FreeParamValueList(o);
10400 
10401 	return 0;
10402 }
10403 
10404 // Create a New Virtual HUB (static mode)
PsHubCreateStatic(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10405 UINT PsHubCreateStatic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10406 {
10407 	LIST *o;
10408 	PS *ps = (PS *)param;
10409 	UINT ret = 0;
10410 	RPC_CREATE_HUB t;
10411 	char *pass = "";
10412 	UINT hub_type = HUB_TYPE_FARM_STATIC;
10413 	// Parameter list that can be specified
10414 	PARAM args[] =
10415 	{
10416 		{"[name]", CmdPrompt, _UU("CMD_HubCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10417 		{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
10418 	};
10419 
10420 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10421 	if (o == NULL)
10422 	{
10423 		return ERR_INVALID_PARAMETER;
10424 	}
10425 
10426 	Zero(&t, sizeof(t));
10427 
10428 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
10429 	t.HubType = hub_type;
10430 
10431 	if (IsEmptyStr(GetParamStr(o, "PASSWORD")) == false)
10432 	{
10433 		pass = GetParamStr(o, "PASSWORD");
10434 	}
10435 
10436 	Hash(t.HashedPassword, pass, StrLen(pass), true);
10437 	HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pass);
10438 	t.Online = true;
10439 
10440 	// RPC call
10441 	ret = ScCreateHub(ps->Rpc, &t);
10442 
10443 	if (ret != ERR_NO_ERROR)
10444 	{
10445 		// An error has occured
10446 		CmdPrintError(c, ret);
10447 		FreeParamValueList(o);
10448 		return ret;
10449 	}
10450 
10451 	FreeParamValueList(o);
10452 
10453 	return 0;
10454 }
10455 
10456 // Delete a Virtual HUB
PsHubDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10457 UINT PsHubDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10458 {
10459 	LIST *o;
10460 	PS *ps = (PS *)param;
10461 	UINT ret = 0;
10462 	RPC_DELETE_HUB t;
10463 	// Parameter list that can be specified
10464 	PARAM args[] =
10465 	{
10466 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
10467 		{"[name]", CmdPrompt, _UU("CMD_HubDelete_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10468 	};
10469 
10470 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10471 	if (o == NULL)
10472 	{
10473 		return ERR_INVALID_PARAMETER;
10474 	}
10475 
10476 	Zero(&t, sizeof(t));
10477 
10478 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
10479 
10480 	// RPC call
10481 	ret = ScDeleteHub(ps->Rpc, &t);
10482 
10483 	if (ret != ERR_NO_ERROR)
10484 	{
10485 		// An error has occured
10486 		CmdPrintError(c, ret);
10487 		FreeParamValueList(o);
10488 		return ret;
10489 	}
10490 
10491 	FreeParamValueList(o);
10492 
10493 	return 0;
10494 }
10495 
10496 // Set the Virtual HUB to static
PsHubSetStatic(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10497 UINT PsHubSetStatic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10498 {
10499 	LIST *o;
10500 	PS *ps = (PS *)param;
10501 	UINT ret = 0;
10502 	RPC_CREATE_HUB t;
10503 	// Parameter list that can be specified
10504 	PARAM args[] =
10505 	{
10506 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
10507 		{"[name]", CmdPrompt, _UU("CMD_HubChange_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10508 	};
10509 
10510 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10511 	if (o == NULL)
10512 	{
10513 		return ERR_INVALID_PARAMETER;
10514 	}
10515 
10516 	Zero(&t, sizeof(t));
10517 
10518 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
10519 
10520 	// Retrieve the current setting first
10521 	ret = ScGetHub(ps->Rpc, &t);
10522 
10523 	if (ret != ERR_NO_ERROR)
10524 	{
10525 		// An error has occured
10526 		CmdPrintError(c, ret);
10527 		FreeParamValueList(o);
10528 		return ret;
10529 	}
10530 
10531 	// Change the settings
10532 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
10533 	t.HubType = HUB_TYPE_FARM_STATIC;
10534 
10535 	// Write
10536 	ret = ScSetHub(ps->Rpc, &t);
10537 
10538 	if (ret != ERR_NO_ERROR)
10539 	{
10540 		// An error has occured
10541 		CmdPrintError(c, ret);
10542 		FreeParamValueList(o);
10543 		return ret;
10544 	}
10545 
10546 	FreeParamValueList(o);
10547 
10548 	return 0;
10549 }
10550 
10551 // Change the type of Virtual HUB to dynamic Virtual HUB
PsHubSetDynamic(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10552 UINT PsHubSetDynamic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10553 {
10554 	LIST *o;
10555 	PS *ps = (PS *)param;
10556 	UINT ret = 0;
10557 	RPC_CREATE_HUB t;
10558 	// Parameter list that can be specified
10559 	PARAM args[] =
10560 	{
10561 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
10562 		{"[name]", CmdPrompt, _UU("CMD_HubChange_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10563 	};
10564 
10565 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10566 	if (o == NULL)
10567 	{
10568 		return ERR_INVALID_PARAMETER;
10569 	}
10570 
10571 	Zero(&t, sizeof(t));
10572 
10573 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
10574 
10575 	// Retrieve the current setting first
10576 	ret = ScGetHub(ps->Rpc, &t);
10577 
10578 	if (ret != ERR_NO_ERROR)
10579 	{
10580 		// An error has occured
10581 		CmdPrintError(c, ret);
10582 		FreeParamValueList(o);
10583 		return ret;
10584 	}
10585 
10586 	// Change the settings
10587 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
10588 	t.HubType = HUB_TYPE_FARM_DYNAMIC;
10589 
10590 	// Write
10591 	ret = ScSetHub(ps->Rpc, &t);
10592 
10593 	if (ret != ERR_NO_ERROR)
10594 	{
10595 		// An error has occured
10596 		CmdPrintError(c, ret);
10597 		FreeParamValueList(o);
10598 		return ret;
10599 	}
10600 
10601 	FreeParamValueList(o);
10602 
10603 	return 0;
10604 }
10605 
10606 // Get the list of Virtual HUB
PsHubList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10607 UINT PsHubList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10608 {
10609 	LIST *o;
10610 	PS *ps = (PS *)param;
10611 	UINT ret = 0;
10612 	RPC_ENUM_HUB t;
10613 	UINT i;
10614 
10615 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
10616 	if (o == NULL)
10617 	{
10618 		return ERR_INVALID_PARAMETER;
10619 	}
10620 
10621 	Zero(&t, sizeof(t));
10622 
10623 	// RPC call
10624 	ret = ScEnumHub(ps->Rpc, &t);
10625 
10626 	if (ret != ERR_NO_ERROR)
10627 	{
10628 		// An error has occured
10629 		CmdPrintError(c, ret);
10630 		FreeParamValueList(o);
10631 		return ret;
10632 	}
10633 	else
10634 	{
10635 		CT *ct = CtNew();
10636 
10637 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_1"), false);
10638 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_2"), false);
10639 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_3"), false);
10640 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_4"), false);
10641 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_5"), false);
10642 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_6"), false);
10643 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_7"), false);
10644 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_8"), false);
10645 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_9"), false);
10646 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_10"), false);
10647 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_11"), false);
10648 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_6"), false);
10649 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_7"), false);
10650 
10651 		for (i = 0;i < t.NumHub;i++)
10652 		{
10653 			RPC_ENUM_HUB_ITEM *e = &t.Hubs[i];
10654 			wchar_t name[MAX_HUBNAME_LEN + 1];
10655 			wchar_t s1[64], s2[64], s3[64], s4[64], s5[64];
10656 			wchar_t s6[64], s7[128], s8[128];
10657 			wchar_t s9[64], s10[64];
10658 
10659 			UniToStru(s1, e->NumUsers);
10660 			UniToStru(s2, e->NumGroups);
10661 			UniToStru(s3, e->NumSessions);
10662 			UniToStru(s4, e->NumMacTables);
10663 			UniToStru(s5, e->NumIpTables);
10664 
10665 			UniToStru(s6, e->NumLogin);
10666 
10667 			if (e->LastLoginTime != 0)
10668 			{
10669 				GetDateTimeStr64Uni(s7, sizeof(s7), SystemToLocal64(e->LastLoginTime));
10670 			}
10671 			else
10672 			{
10673 				UniStrCpy(s7, sizeof(s7), _UU("COMMON_UNKNOWN"));
10674 			}
10675 
10676 			if (e->LastCommTime != 0)
10677 			{
10678 				GetDateTimeStr64Uni(s8, sizeof(s8), SystemToLocal64(e->LastCommTime));
10679 			}
10680 			else
10681 			{
10682 				UniStrCpy(s8, sizeof(s8), _UU("COMMON_UNKNOWN"));
10683 			}
10684 
10685 			if (e->IsTrafficFilled == false)
10686 			{
10687 				UniStrCpy(s9, sizeof(s9), _UU("CM_ST_NONE"));
10688 				UniStrCpy(s10, sizeof(s10), _UU("CM_ST_NONE"));
10689 			}
10690 			else
10691 			{
10692 				UniToStr3(s9, sizeof(s9),
10693 					e->Traffic.Recv.BroadcastBytes + e->Traffic.Recv.UnicastBytes +
10694 					e->Traffic.Send.BroadcastBytes + e->Traffic.Send.UnicastBytes);
10695 
10696 				UniToStr3(s10, sizeof(s10),
10697 					e->Traffic.Recv.BroadcastCount + e->Traffic.Recv.UnicastCount +
10698 					e->Traffic.Send.BroadcastCount + e->Traffic.Send.UnicastCount);
10699 			}
10700 
10701 			StrToUni(name, sizeof(name), e->HubName);
10702 
10703 			CtInsert(ct,
10704 				name,
10705 				e->Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"),
10706 				GetHubTypeStr(e->HubType),
10707 				s1, s2, s3, s4, s5, s6, s7, s8, s9, s10);
10708 		}
10709 
10710 		CtFreeEx(ct, c, true);
10711 	}
10712 
10713 	FreeRpcEnumHub(&t);
10714 
10715 	FreeParamValueList(o);
10716 
10717 	return 0;
10718 }
10719 
10720 // Select a Virtual HUB to manage
PsHub(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10721 UINT PsHub(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10722 {
10723 	LIST *o;
10724 	PS *ps = (PS *)param;
10725 	UINT ret = 0;
10726 	RPC_HUB_STATUS t;
10727 	// Parameter list that can be specified
10728 	PARAM args[] =
10729 	{
10730 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
10731 		{"[name]", NULL, NULL, NULL, NULL},
10732 	};
10733 
10734 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10735 	if (o == NULL)
10736 	{
10737 		return ERR_INVALID_PARAMETER;
10738 	}
10739 
10740 	if (IsEmptyStr(GetParamStr(o, "[name]")) == false)
10741 	{
10742 		wchar_t tmp[MAX_SIZE];
10743 		Zero(&t, sizeof(t));
10744 
10745 		// Examine whether the specified Virtual HUB is accessible
10746 		StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
10747 
10748 		// RPC call
10749 		ret = ScGetHubStatus(ps->Rpc, &t);
10750 
10751 		if (ret != ERR_NO_ERROR)
10752 		{
10753 			// An error has occured
10754 			CmdPrintError(c, ret);
10755 			FreeParamValueList(o);
10756 			return ret;
10757 		}
10758 
10759 		// Change the selection
10760 		if (ps->HubName != NULL)
10761 		{
10762 			Free(ps->HubName);
10763 		}
10764 		ps->HubName = CopyStr(t.HubName);
10765 
10766 		UniFormat(tmp, sizeof(tmp), _UU("CMD_Hub_Selected"), t.HubName);
10767 		c->Write(c, tmp);
10768 	}
10769 	else
10770 	{
10771 		// Deselect
10772 		if (ps->HubName != NULL)
10773 		{
10774 			c->Write(c, _UU("CMD_Hub_Unselected"));
10775 			Free(ps->HubName);
10776 		}
10777 		ps->HubName = NULL;
10778 	}
10779 
10780 	FreeParamValueList(o);
10781 
10782 	return 0;
10783 }
10784 
10785 // Set the Virtual HUB to online
PsOnline(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10786 UINT PsOnline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10787 {
10788 	LIST *o;
10789 	PS *ps = (PS *)param;
10790 	UINT ret = 0;
10791 	RPC_SET_HUB_ONLINE t;
10792 
10793 	// If virtual HUB is not selected, it's an error
10794 	if (ps->HubName == NULL)
10795 	{
10796 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
10797 		return ERR_INVALID_PARAMETER;
10798 	}
10799 
10800 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
10801 	if (o == NULL)
10802 	{
10803 		return ERR_INVALID_PARAMETER;
10804 	}
10805 
10806 	Zero(&t, sizeof(t));
10807 
10808 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
10809 	t.Online = true;
10810 
10811 	// RPC call
10812 	ret = ScSetHubOnline(ps->Rpc, &t);
10813 
10814 	if (ret != ERR_NO_ERROR)
10815 	{
10816 		// An error has occured
10817 		CmdPrintError(c, ret);
10818 		FreeParamValueList(o);
10819 		return ret;
10820 	}
10821 
10822 	FreeParamValueList(o);
10823 
10824 	return 0;
10825 }
10826 
10827 // Set the Virtual HUB to offline
PsOffline(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10828 UINT PsOffline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10829 {
10830 	LIST *o;
10831 	PS *ps = (PS *)param;
10832 	UINT ret = 0;
10833 	RPC_SET_HUB_ONLINE t;
10834 
10835 	// If virtual HUB is not selected, it's an error
10836 	if (ps->HubName == NULL)
10837 	{
10838 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
10839 		return ERR_INVALID_PARAMETER;
10840 	}
10841 
10842 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
10843 	if (o == NULL)
10844 	{
10845 		return ERR_INVALID_PARAMETER;
10846 	}
10847 
10848 	Zero(&t, sizeof(t));
10849 
10850 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
10851 	t.Online = false;
10852 
10853 	// RPC call
10854 	ret = ScSetHubOnline(ps->Rpc, &t);
10855 
10856 	if (ret != ERR_NO_ERROR)
10857 	{
10858 		// An error has occured
10859 		CmdPrintError(c, ret);
10860 		FreeParamValueList(o);
10861 		return ret;
10862 	}
10863 
10864 	FreeParamValueList(o);
10865 
10866 	return 0;
10867 }
10868 
10869 // Set the maximum number of concurrent connecting sessions of the Virtual HUB
PsSetMaxSession(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10870 UINT PsSetMaxSession(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10871 {
10872 	LIST *o;
10873 	PS *ps = (PS *)param;
10874 	UINT ret = 0;
10875 	RPC_CREATE_HUB t;
10876 	// Parameter list that can be specified
10877 	PARAM args[] =
10878 	{
10879 		{"[max_session]", CmdPrompt, _UU("CMD_SetMaxSession_Prompt"), CmdEvalNotEmpty, NULL},
10880 	};
10881 
10882 	// If virtual HUB is not selected, it's an error
10883 	if (ps->HubName == NULL)
10884 	{
10885 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
10886 		return ERR_INVALID_PARAMETER;
10887 	}
10888 
10889 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10890 	if (o == NULL)
10891 	{
10892 		return ERR_INVALID_PARAMETER;
10893 	}
10894 
10895 	// Get current settings of Virtual HUB
10896 	Zero(&t, sizeof(t));
10897 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
10898 	ret = ScGetHub(ps->Rpc, &t);
10899 	if (ret != ERR_NO_ERROR)
10900 	{
10901 		// An error has occured
10902 		CmdPrintError(c, ret);
10903 		FreeParamValueList(o);
10904 		return ret;
10905 	}
10906 
10907 	t.HubOption.MaxSession = GetParamInt(o, "[max_session]");
10908 
10909 	// Write the configuration of Virtual HUB
10910 	ret = ScSetHub(ps->Rpc, &t);
10911 	if (ret != ERR_NO_ERROR)
10912 	{
10913 		// An error has occured
10914 		CmdPrintError(c, ret);
10915 		FreeParamValueList(o);
10916 		return ret;
10917 	}
10918 
10919 	FreeParamValueList(o);
10920 
10921 	return 0;
10922 }
10923 
10924 // Set the administrative password of the Virtual HUB
PsSetHubPassword(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10925 UINT PsSetHubPassword(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10926 {
10927 	LIST *o;
10928 	PS *ps = (PS *)param;
10929 	UINT ret = 0;
10930 	RPC_CREATE_HUB t;
10931 	char *pw;
10932 	// Parameter list that can be specified
10933 	PARAM args[] =
10934 	{
10935 		{"[password]", CmdPromptChoosePassword, NULL, NULL, NULL},
10936 	};
10937 
10938 	// If virtual HUB is not selected, it's an error
10939 	if (ps->HubName == NULL)
10940 	{
10941 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
10942 		return ERR_INVALID_PARAMETER;
10943 	}
10944 
10945 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10946 	if (o == NULL)
10947 	{
10948 		return ERR_INVALID_PARAMETER;
10949 	}
10950 
10951 	// Get current settings of Virtual HUB
10952 	Zero(&t, sizeof(t));
10953 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
10954 	ret = ScGetHub(ps->Rpc, &t);
10955 	if (ret != ERR_NO_ERROR)
10956 	{
10957 		// An error has occured
10958 		CmdPrintError(c, ret);
10959 		FreeParamValueList(o);
10960 		return ret;
10961 	}
10962 
10963 	// Change the settings
10964 	pw = GetParamStr(o, "[password]");
10965 	HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pw);
10966 	Hash(t.HashedPassword, pw, StrLen(pw), true);
10967 
10968 	// Write the configuration of Virtual HUB
10969 	ret = ScSetHub(ps->Rpc, &t);
10970 	if (ret != ERR_NO_ERROR)
10971 	{
10972 		// An error has occured
10973 		CmdPrintError(c, ret);
10974 		FreeParamValueList(o);
10975 		return ret;
10976 	}
10977 
10978 	FreeParamValueList(o);
10979 
10980 	return 0;
10981 }
10982 
10983 // Set the Virtual HUB to permit to be enumerated for anonymous users
PsSetEnumAllow(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10984 UINT PsSetEnumAllow(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10985 {
10986 	LIST *o;
10987 	PS *ps = (PS *)param;
10988 	UINT ret = 0;
10989 	RPC_CREATE_HUB t;
10990 
10991 	// If virtual HUB is not selected, it's an error
10992 	if (ps->HubName == NULL)
10993 	{
10994 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
10995 		return ERR_INVALID_PARAMETER;
10996 	}
10997 
10998 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
10999 	if (o == NULL)
11000 	{
11001 		return ERR_INVALID_PARAMETER;
11002 	}
11003 
11004 	// Get current settings of Virtual HUB
11005 	Zero(&t, sizeof(t));
11006 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11007 	ret = ScGetHub(ps->Rpc, &t);
11008 	if (ret != ERR_NO_ERROR)
11009 	{
11010 		// An error has occured
11011 		CmdPrintError(c, ret);
11012 		FreeParamValueList(o);
11013 		return ret;
11014 	}
11015 
11016 	t.HubOption.NoEnum = false;
11017 
11018 	// Write the configuration of Virtual HUB
11019 	ret = ScSetHub(ps->Rpc, &t);
11020 	if (ret != ERR_NO_ERROR)
11021 	{
11022 		// An error has occured
11023 		CmdPrintError(c, ret);
11024 		FreeParamValueList(o);
11025 		return ret;
11026 	}
11027 
11028 	FreeParamValueList(o);
11029 
11030 	return 0;
11031 }
11032 
11033 // Set the Virtual HUB to deny to be enumerated for anonymous users
PsSetEnumDeny(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11034 UINT PsSetEnumDeny(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11035 {
11036 	LIST *o;
11037 	PS *ps = (PS *)param;
11038 	UINT ret = 0;
11039 	RPC_CREATE_HUB t;
11040 
11041 	// If virtual HUB is not selected, it's an error
11042 	if (ps->HubName == NULL)
11043 	{
11044 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11045 		return ERR_INVALID_PARAMETER;
11046 	}
11047 
11048 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
11049 	if (o == NULL)
11050 	{
11051 		return ERR_INVALID_PARAMETER;
11052 	}
11053 
11054 	// Get current settings of Virtual HUB
11055 	Zero(&t, sizeof(t));
11056 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11057 	ret = ScGetHub(ps->Rpc, &t);
11058 	if (ret != ERR_NO_ERROR)
11059 	{
11060 		// An error has occured
11061 		CmdPrintError(c, ret);
11062 		FreeParamValueList(o);
11063 		return ret;
11064 	}
11065 
11066 	t.HubOption.NoEnum = true;
11067 
11068 	// Write the configuration of Virtual HUB
11069 	ret = ScSetHub(ps->Rpc, &t);
11070 	if (ret != ERR_NO_ERROR)
11071 	{
11072 		// An error has occured
11073 		CmdPrintError(c, ret);
11074 		FreeParamValueList(o);
11075 		return ret;
11076 	}
11077 
11078 	FreeParamValueList(o);
11079 
11080 	return 0;
11081 }
11082 
11083 // Get the option settings for the virtual HUB
PsOptionsGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11084 UINT PsOptionsGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11085 {
11086 	LIST *o;
11087 	PS *ps = (PS *)param;
11088 	UINT ret = 0;
11089 	RPC_CREATE_HUB t;
11090 
11091 	// If virtual HUB is not selected, it's an error
11092 	if (ps->HubName == NULL)
11093 	{
11094 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11095 		return ERR_INVALID_PARAMETER;
11096 	}
11097 
11098 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
11099 	if (o == NULL)
11100 	{
11101 		return ERR_INVALID_PARAMETER;
11102 	}
11103 
11104 	Zero(&t, sizeof(t));
11105 
11106 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11107 
11108 	// RPC call
11109 	ret = ScGetHub(ps->Rpc, &t);
11110 
11111 	if (ret != ERR_NO_ERROR)
11112 	{
11113 		// An error has occured
11114 		CmdPrintError(c, ret);
11115 		FreeParamValueList(o);
11116 		return ret;
11117 	}
11118 	else
11119 	{
11120 		CT *ct;
11121 		wchar_t tmp[MAX_SIZE];
11122 
11123 		UniFormat(tmp, sizeof(tmp), _UU("CMD_OptionsGet_TITLE"), ps->HubName);
11124 		c->Write(c, tmp);
11125 
11126 		// Display settings
11127 		ct = CtNewStandard();
11128 
11129 		CtInsert(ct, _UU("CMD_OptionsGet_ENUM"),
11130 			t.HubOption.NoEnum ? _UU("CMD_MSG_DENY") : _UU("CMD_MSG_ALLOW"));
11131 
11132 		if (t.HubOption.MaxSession == 0)
11133 		{
11134 			UniStrCpy(tmp, sizeof(tmp), _UU("CMD_MSG_INFINITE"));
11135 		}
11136 		else
11137 		{
11138 			UniToStru(tmp, t.HubOption.MaxSession);
11139 		}
11140 		CtInsert(ct, _UU("CMD_OptionsGet_MAXSESSIONS"), tmp);
11141 
11142 		CtInsert(ct, _UU("CMD_OptionsGet_STATUS"), t.Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"));
11143 
11144 		CtInsert(ct, _UU("CMD_OptionsGet_TYPE"), GetHubTypeStr(t.HubType));
11145 
11146 		CtFree(ct, c);
11147 	}
11148 
11149 	FreeParamValueList(o);
11150 
11151 	return 0;
11152 }
11153 
11154 // Setting the Radius server to use for user authentication
PsRadiusServerSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11155 UINT PsRadiusServerSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11156 {
11157 	LIST *o;
11158 	PS *ps = (PS *)param;
11159 	UINT ret = 0;
11160 	RPC_RADIUS t;
11161 	char *host;
11162 	UINT port;
11163 	// Parameter list that can be specified
11164 	CMD_EVAL_MIN_MAX minmax =
11165 	{
11166 		"CMD_RadiusServerSet_EVAL_NUMINTERVAL", RADIUS_RETRY_INTERVAL, RADIUS_RETRY_TIMEOUT,
11167 	};
11168 	PARAM args[] =
11169 	{
11170 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
11171 		{"[server_name:port]", CmdPrompt, _UU("CMD_RadiusServerSet_Prompt_Host"), CmdEvalNotEmpty, NULL},
11172 		{"SECRET", CmdPromptChoosePassword, _UU("CMD_RadiusServerSet_Prompt_Secret"), NULL, NULL},
11173 		{"RETRY_INTERVAL", CmdPrompt, _UU("CMD_RadiusServerSet_Prompt_RetryInterval"), CmdEvalMinMax, &minmax},
11174 	};
11175 
11176 	// If virtual HUB is not selected, it's an error
11177 	if (ps->HubName == NULL)
11178 	{
11179 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11180 		return ERR_INVALID_PARAMETER;
11181 	}
11182 
11183 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
11184 	if (o == NULL)
11185 	{
11186 		return ERR_INVALID_PARAMETER;
11187 	}
11188 
11189 	if (ParseHostPort(GetParamStr(o, "[server_name:port]"), &host, &port, 1812))
11190 	{
11191 		Zero(&t, sizeof(t));
11192 
11193 		StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11194 		t.RadiusPort = port;
11195 		StrCpy(t.RadiusServerName, sizeof(t.RadiusServerName), host);
11196 		StrCpy(t.RadiusSecret, sizeof(t.RadiusSecret), GetParamStr(o, "SECRET"));
11197 		t.RadiusRetryInterval = GetParamInt(o, "RETRY_INTERVAL");
11198 
11199 		Free(host);
11200 
11201 		// RPC call
11202 		ret = ScSetHubRadius(ps->Rpc, &t);
11203 
11204 		if (ret != ERR_NO_ERROR)
11205 		{
11206 			// An error has occured
11207 			CmdPrintError(c, ret);
11208 			FreeParamValueList(o);
11209 			return ret;
11210 		}
11211 	}
11212 
11213 	FreeParamValueList(o);
11214 
11215 	return 0;
11216 }
11217 
11218 // Delete the Radius server configuration to be used for user authentication
PsRadiusServerDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11219 UINT PsRadiusServerDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11220 {
11221 	LIST *o;
11222 	PS *ps = (PS *)param;
11223 	UINT ret = 0;
11224 	RPC_RADIUS t;
11225 
11226 	// If virtual HUB is not selected, it's an error
11227 	if (ps->HubName == NULL)
11228 	{
11229 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11230 		return ERR_INVALID_PARAMETER;
11231 	}
11232 
11233 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
11234 	if (o == NULL)
11235 	{
11236 		return ERR_INVALID_PARAMETER;
11237 	}
11238 
11239 	Zero(&t, sizeof(t));
11240 
11241 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11242 	t.RadiusPort = 1812;
11243 
11244 	// RPC call
11245 	ret = ScSetHubRadius(ps->Rpc, &t);
11246 
11247 	if (ret != ERR_NO_ERROR)
11248 	{
11249 		// An error has occured
11250 		CmdPrintError(c, ret);
11251 		FreeParamValueList(o);
11252 		return ret;
11253 	}
11254 
11255 	FreeParamValueList(o);
11256 
11257 	return 0;
11258 }
11259 
11260 // Get the Radius server settings to use for user authentication
PsRadiusServerGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11261 UINT PsRadiusServerGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11262 {
11263 	LIST *o;
11264 	PS *ps = (PS *)param;
11265 	UINT ret = 0;
11266 	RPC_RADIUS t;
11267 
11268 	// If virtual HUB is not selected, it's an error
11269 	if (ps->HubName == NULL)
11270 	{
11271 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11272 		return ERR_INVALID_PARAMETER;
11273 	}
11274 
11275 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
11276 	if (o == NULL)
11277 	{
11278 		return ERR_INVALID_PARAMETER;
11279 	}
11280 
11281 	Zero(&t, sizeof(t));
11282 
11283 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11284 
11285 	// RPC call
11286 	ret = ScGetHubRadius(ps->Rpc, &t);
11287 
11288 	if (ret != ERR_NO_ERROR)
11289 	{
11290 		// An error has occured
11291 		CmdPrintError(c, ret);
11292 		FreeParamValueList(o);
11293 		return ret;
11294 	}
11295 	else
11296 	{
11297 		CT *ct;
11298 		wchar_t tmp[MAX_SIZE];
11299 
11300 		ct = CtNewStandard();
11301 
11302 		if (IsEmptyStr(t.RadiusServerName))
11303 		{
11304 			CtInsert(ct, _UU("CMD_RadiusServerGet_STATUS"), _UU("CMD_MSG_DISABLE"));
11305 		}
11306 		else
11307 		{
11308 			CtInsert(ct, _UU("CMD_RadiusServerGet_STATUS"), _UU("CMD_MSG_ENABLE"));
11309 
11310 			StrToUni(tmp, sizeof(tmp), t.RadiusServerName);
11311 			CtInsert(ct, _UU("CMD_RadiusServerGet_HOST"), tmp);
11312 
11313 			UniToStri(tmp, t.RadiusPort);
11314 			CtInsert(ct, _UU("CMD_RadiusServerGet_PORT"), tmp);
11315 
11316 			StrToUni(tmp, sizeof(tmp), t.RadiusSecret);
11317 			CtInsert(ct, _UU("CMD_RadiusServerGet_SECRET"), tmp);
11318 
11319 			UniToStri(tmp, t.RadiusRetryInterval);
11320 			CtInsert(ct, _UU("CMD_RadiusServerGet_RetryInterval"), tmp);
11321 		}
11322 
11323 		CtFree(ct, c);
11324 	}
11325 
11326 	FreeParamValueList(o);
11327 
11328 	return 0;
11329 }
11330 
11331 // Get the current status of the Virtual HUB
PsStatusGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11332 UINT PsStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11333 {
11334 	LIST *o;
11335 	PS *ps = (PS *)param;
11336 	UINT ret = 0;
11337 	RPC_HUB_STATUS t;
11338 
11339 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
11340 	if (o == NULL)
11341 	{
11342 		return ERR_INVALID_PARAMETER;
11343 	}
11344 
11345 	// If virtual HUB is not selected, it's an error
11346 	if (ps->HubName == NULL)
11347 	{
11348 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11349 		return ERR_INVALID_PARAMETER;
11350 	}
11351 
11352 	Zero(&t, sizeof(t));
11353 
11354 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11355 
11356 	// RPC call
11357 	ret = ScGetHubStatus(ps->Rpc, &t);
11358 
11359 	if (ret != ERR_NO_ERROR)
11360 	{
11361 		// An error has occured
11362 		CmdPrintError(c, ret);
11363 		FreeParamValueList(o);
11364 		return ret;
11365 	}
11366 	else
11367 	{
11368 		CT *ct = CtNewStandard();
11369 		wchar_t *s;
11370 		wchar_t tmp[MAX_SIZE];
11371 
11372 		// HUB name
11373 		s = CopyStrToUni(t.HubName);
11374 		CtInsert(ct, _UU("SM_HUB_STATUS_HUBNAME"), s);
11375 		Free(s);
11376 
11377 		// Online
11378 		CtInsert(ct, _UU("SM_HUB_STATUS_ONLINE"),
11379 			t.Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"));
11380 
11381 		// Type of HUB
11382 		CtInsert(ct, _UU("SM_HUB_TYPE"),
11383 			GetHubTypeStr(t.HubType));
11384 
11385 		if (t.HubType == HUB_TYPE_STANDALONE)
11386 		{
11387 			// Enable / Disable the SecureNAT
11388 			CtInsert(ct, _UU("SM_HUB_SECURE_NAT"),
11389 				t.SecureNATEnabled ? _UU("SM_HUB_SECURE_NAT_YES") : _UU("SM_HUB_SECURE_NAT_NO"));
11390 		}
11391 
11392 		// Other values
11393 		UniToStru(tmp, t.NumSessions);
11394 		CtInsert(ct, _UU("SM_HUB_NUM_SESSIONS"), tmp);
11395 
11396 		if (t.NumSessionsClient != 0 || t.NumSessionsBridge != 0)
11397 		{
11398 			UniToStru(tmp, t.NumSessionsClient);
11399 			CtInsert(ct, _UU("SM_HUB_NUM_SESSIONS_CLIENT"), tmp);
11400 			UniToStru(tmp, t.NumSessionsBridge);
11401 			CtInsert(ct, _UU("SM_HUB_NUM_SESSIONS_BRIDGE"), tmp);
11402 		}
11403 
11404 		UniToStru(tmp, t.NumAccessLists);
11405 		CtInsert(ct, _UU("SM_HUB_NUM_ACCESSES"), tmp);
11406 
11407 		UniToStru(tmp, t.NumUsers);
11408 		CtInsert(ct, _UU("SM_HUB_NUM_USERS"), tmp);
11409 		UniToStru(tmp, t.NumGroups);
11410 		CtInsert(ct, _UU("SM_HUB_NUM_GROUPS"), tmp);
11411 
11412 		UniToStru(tmp, t.NumMacTables);
11413 		CtInsert(ct, _UU("SM_HUB_NUM_MAC_TABLES"), tmp);
11414 		UniToStru(tmp, t.NumIpTables);
11415 		CtInsert(ct, _UU("SM_HUB_NUM_IP_TABLES"), tmp);
11416 
11417 		// Usage status
11418 		UniToStru(tmp, t.NumLogin);
11419 		CtInsert(ct, _UU("SM_HUB_NUM_LOGIN"), tmp);
11420 
11421 		if (t.LastLoginTime != 0)
11422 		{
11423 			GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.LastLoginTime));
11424 		}
11425 		else
11426 		{
11427 			UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));
11428 		}
11429 		CtInsert(ct, _UU("SM_HUB_LAST_LOGIN_TIME"), tmp);
11430 
11431 		if (t.LastCommTime != 0)
11432 		{
11433 			GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.LastCommTime));
11434 		}
11435 		else
11436 		{
11437 			UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));
11438 		}
11439 		CtInsert(ct, _UU("SM_HUB_LAST_COMM_TIME"), tmp);
11440 
11441 		if (t.CreatedTime != 0)
11442 		{
11443 			GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.CreatedTime));
11444 		}
11445 		else
11446 		{
11447 			UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));
11448 		}
11449 		CtInsert(ct, _UU("SM_HUB_CREATED_TIME"), tmp);
11450 
11451 		// Traffic information
11452 		CmdInsertTrafficInfo(ct, &t.Traffic);
11453 
11454 		CtFree(ct, c);
11455 	}
11456 
11457 	FreeParamValueList(o);
11458 
11459 	return 0;
11460 }
11461 
11462 // Get the log switching string
GetLogSwitchStr(UINT i)11463 wchar_t *GetLogSwitchStr(UINT i)
11464 {
11465 	char tmp[64];
11466 
11467 	Format(tmp, sizeof(tmp), "SM_LOG_SWITCH_%u", i);
11468 
11469 	return _UU(tmp);
11470 }
11471 
11472 // Get the packet log name string
GetPacketLogNameStr(UINT i)11473 wchar_t *GetPacketLogNameStr(UINT i)
11474 {
11475 	char tmp[64];
11476 
11477 	Format(tmp, sizeof(tmp), "CMD_Log_%u", i);
11478 
11479 	return _UU(tmp);
11480 }
11481 
11482 // Get the log storage settings for the virtual HUB
PsLogGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11483 UINT PsLogGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11484 {
11485 	LIST *o;
11486 	PS *ps = (PS *)param;
11487 	UINT ret = 0;
11488 	RPC_HUB_LOG t;
11489 
11490 	// If virtual HUB is not selected, it's an error
11491 	if (ps->HubName == NULL)
11492 	{
11493 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11494 		return ERR_INVALID_PARAMETER;
11495 	}
11496 
11497 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
11498 	if (o == NULL)
11499 	{
11500 		return ERR_INVALID_PARAMETER;
11501 	}
11502 
11503 	Zero(&t, sizeof(t));
11504 
11505 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11506 
11507 	// RPC call
11508 	ret = ScGetHubLog(ps->Rpc, &t);
11509 
11510 	if (ret != ERR_NO_ERROR)
11511 	{
11512 		// An error has occured
11513 		CmdPrintError(c, ret);
11514 		FreeParamValueList(o);
11515 		return ret;
11516 	}
11517 	else
11518 	{
11519 		CT *ct = CtNewStandard();
11520 
11521 		CtInsert(ct, _UU("CMD_Log_SecurityLog"),
11522 			t.LogSetting.SaveSecurityLog ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
11523 		if (t.LogSetting.SaveSecurityLog)
11524 		{
11525 			CtInsert(ct, _UU("CMD_Log_SwitchType"), GetLogSwitchStr(t.LogSetting.SecurityLogSwitchType));
11526 		}
11527 
11528 		CtInsert(ct, L"", L"");
11529 
11530 		CtInsert(ct, _UU("CMD_Log_PacketLog"),
11531 			t.LogSetting.SavePacketLog ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
11532 		if (t.LogSetting.SavePacketLog)
11533 		{
11534 			UINT i;
11535 
11536 			CtInsert(ct, _UU("CMD_Log_SwitchType"), GetLogSwitchStr(t.LogSetting.PacketLogSwitchType));
11537 
11538 			for (i = 0;i <= 7;i++)
11539 			{
11540 				wchar_t *tmp = NULL;
11541 
11542 				switch (t.LogSetting.PacketLogConfig[i])
11543 				{
11544 				case PACKET_LOG_NONE:
11545 					tmp = _UU("D_SM_LOG@B_PACKET_0_0");
11546 					break;
11547 
11548 				case PACKET_LOG_HEADER:
11549 					tmp = _UU("D_SM_LOG@B_PACKET_0_1");
11550 					break;
11551 
11552 				case PACKET_LOG_ALL:
11553 					tmp = _UU("D_SM_LOG@B_PACKET_0_2");
11554 					break;
11555 				}
11556 
11557 				CtInsert(ct, GetPacketLogNameStr(i),
11558 					tmp);
11559 			}
11560 		}
11561 
11562 		CtFree(ct, c);
11563 	}
11564 
11565 	FreeParamValueList(o);
11566 
11567 	return 0;
11568 }
11569 
11570 // LogEnable command
PsLogEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11571 UINT PsLogEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11572 {
11573 	LIST *o;
11574 	PS *ps = (PS *)param;
11575 	UINT ret = 0;
11576 	RPC_HUB_LOG t;
11577 	bool packet_log = false;
11578 	char *tmp;
11579 	// Parameter list that can be specified
11580 	PARAM args[] =
11581 	{
11582 		{"[security|packet]", CmdPrompt, _UU("CMD_LogEnable_Prompt"), CmdEvalNotEmpty, NULL},
11583 	};
11584 
11585 	// If virtual HUB is not selected, it's an error
11586 	if (ps->HubName == NULL)
11587 	{
11588 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11589 		return ERR_INVALID_PARAMETER;
11590 	}
11591 
11592 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
11593 	if (o == NULL)
11594 	{
11595 		return ERR_INVALID_PARAMETER;
11596 	}
11597 
11598 	tmp = GetParamStr(o, "[security|packet]");
11599 
11600 	if (StartWith(tmp, "p"))
11601 	{
11602 		packet_log = true;
11603 	}
11604 	else if (StartWith(tmp, "s") == false)
11605 	{
11606 		c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
11607 		FreeParamValueList(o);
11608 		return ret;
11609 	}
11610 
11611 	Zero(&t, sizeof(t));
11612 
11613 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11614 
11615 	// RPC call
11616 	ret = ScGetHubLog(ps->Rpc, &t);
11617 	if (ret != ERR_NO_ERROR)
11618 	{
11619 		// An error has occured
11620 		CmdPrintError(c, ret);
11621 		FreeParamValueList(o);
11622 		return ret;
11623 	}
11624 
11625 	if (packet_log == false)
11626 	{
11627 		t.LogSetting.SaveSecurityLog = true;
11628 	}
11629 	else
11630 	{
11631 		t.LogSetting.SavePacketLog = true;
11632 	}
11633 
11634 	// RPC call
11635 	ret = ScSetHubLog(ps->Rpc, &t);
11636 	if (ret != ERR_NO_ERROR)
11637 	{
11638 		// An error has occured
11639 		CmdPrintError(c, ret);
11640 		FreeParamValueList(o);
11641 		return ret;
11642 	}
11643 
11644 	FreeParamValueList(o);
11645 
11646 	return 0;
11647 }
11648 
11649 // Disable the packet log or the security log
PsLogDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11650 UINT PsLogDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11651 {
11652 	LIST *o;
11653 	PS *ps = (PS *)param;
11654 	UINT ret = 0;
11655 	RPC_HUB_LOG t;
11656 	bool packet_log = false;
11657 	char *tmp;
11658 	// Parameter list that can be specified
11659 	PARAM args[] =
11660 	{
11661 		{"[security|packet]", CmdPrompt, _UU("CMD_LogEnable_Prompt"), CmdEvalNotEmpty, NULL},
11662 	};
11663 
11664 	// If virtual HUB is not selected, it's an error
11665 	if (ps->HubName == NULL)
11666 	{
11667 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11668 		return ERR_INVALID_PARAMETER;
11669 	}
11670 
11671 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
11672 	if (o == NULL)
11673 	{
11674 		return ERR_INVALID_PARAMETER;
11675 	}
11676 
11677 	tmp = GetParamStr(o, "[security|packet]");
11678 
11679 	if (StartWith(tmp, "p"))
11680 	{
11681 		packet_log = true;
11682 	}
11683 	else if (StartWith(tmp, "s") == false)
11684 	{
11685 		c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
11686 		FreeParamValueList(o);
11687 		return ERR_INVALID_PARAMETER;
11688 	}
11689 
11690 	Zero(&t, sizeof(t));
11691 
11692 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11693 
11694 	// RPC call
11695 	ret = ScGetHubLog(ps->Rpc, &t);
11696 	if (ret != ERR_NO_ERROR)
11697 	{
11698 		// An error has occured
11699 		CmdPrintError(c, ret);
11700 		FreeParamValueList(o);
11701 		return ret;
11702 	}
11703 
11704 	if (packet_log == false)
11705 	{
11706 		t.LogSetting.SaveSecurityLog = false;
11707 	}
11708 	else
11709 	{
11710 		t.LogSetting.SavePacketLog = false;
11711 	}
11712 
11713 	// RPC call
11714 	ret = ScSetHubLog(ps->Rpc, &t);
11715 	if (ret != ERR_NO_ERROR)
11716 	{
11717 		// An error has occured
11718 		CmdPrintError(c, ret);
11719 		FreeParamValueList(o);
11720 		return ret;
11721 	}
11722 
11723 	FreeParamValueList(o);
11724 
11725 	return 0;
11726 }
11727 
11728 // Convert the string to log switching type
StrToLogSwitchType(char * str)11729 UINT StrToLogSwitchType(char *str)
11730 {
11731 	UINT ret = INFINITE;
11732 	// Validate arguments
11733 	if (str == NULL)
11734 	{
11735 		return INFINITE;
11736 	}
11737 
11738 	if (IsEmptyStr(str) || StartWith("none", str))
11739 	{
11740 		ret = LOG_SWITCH_NO;
11741 	}
11742 	else if (StartWith("second", str))
11743 	{
11744 		ret = LOG_SWITCH_SECOND;
11745 	}
11746 	else if (StartWith("minute", str))
11747 	{
11748 		ret = LOG_SWITCH_MINUTE;
11749 	}
11750 	else if (StartWith("hour", str))
11751 	{
11752 		ret = LOG_SWITCH_HOUR;
11753 	}
11754 	else if (StartWith("day", str))
11755 	{
11756 		ret = LOG_SWITCH_DAY;
11757 	}
11758 	else if (StartWith("month", str))
11759 	{
11760 		ret = LOG_SWITCH_MONTH;
11761 	}
11762 
11763 	return ret;
11764 }
11765 
11766 // Set the switching period of the log file
PsLogSwitchSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11767 UINT PsLogSwitchSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11768 {
11769 	LIST *o;
11770 	PS *ps = (PS *)param;
11771 	UINT ret = 0;
11772 	RPC_HUB_LOG t;
11773 	bool packet_log = false;
11774 	char *tmp;
11775 	UINT new_switch_type = 0;
11776 	// Parameter list that can be specified
11777 	PARAM args[] =
11778 	{
11779 		{"[security|packet]", CmdPrompt, _UU("CMD_LogEnable_Prompt"), CmdEvalNotEmpty, NULL},
11780 		{"SWITCH", CmdPrompt, _UU("CMD_LogSwitchSet_Prompt"), NULL, NULL},
11781 	};
11782 
11783 	// If virtual HUB is not selected, it's an error
11784 	if (ps->HubName == NULL)
11785 	{
11786 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11787 		return ERR_INVALID_PARAMETER;
11788 	}
11789 
11790 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
11791 	if (o == NULL)
11792 	{
11793 		return ERR_INVALID_PARAMETER;
11794 	}
11795 
11796 	tmp = GetParamStr(o, "[security|packet]");
11797 
11798 	if (StartWith(tmp, "p"))
11799 	{
11800 		packet_log = true;
11801 	}
11802 	else if (StartWith(tmp, "s") == false)
11803 	{
11804 		c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
11805 		FreeParamValueList(o);
11806 		return ERR_INVALID_PARAMETER;
11807 	}
11808 
11809 	new_switch_type = StrToLogSwitchType(GetParamStr(o, "SWITCH"));
11810 
11811 	if (new_switch_type == INFINITE)
11812 	{
11813 		c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
11814 		FreeParamValueList(o);
11815 		return ERR_INVALID_PARAMETER;
11816 	}
11817 
11818 	Zero(&t, sizeof(t));
11819 
11820 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11821 
11822 	// RPC call
11823 	ret = ScGetHubLog(ps->Rpc, &t);
11824 	if (ret != ERR_NO_ERROR)
11825 	{
11826 		// An error has occured
11827 		CmdPrintError(c, ret);
11828 		FreeParamValueList(o);
11829 		return ret;
11830 	}
11831 
11832 	if (packet_log == false)
11833 	{
11834 		t.LogSetting.SecurityLogSwitchType = new_switch_type;
11835 	}
11836 	else
11837 	{
11838 		t.LogSetting.PacketLogSwitchType = new_switch_type;
11839 	}
11840 
11841 	// RPC call
11842 	ret = ScSetHubLog(ps->Rpc, &t);
11843 	if (ret != ERR_NO_ERROR)
11844 	{
11845 		// An error has occured
11846 		CmdPrintError(c, ret);
11847 		FreeParamValueList(o);
11848 		return ret;
11849 	}
11850 
11851 	FreeParamValueList(o);
11852 
11853 	return 0;
11854 }
11855 
11856 // Convert the type string of the packet log contents to an integer
StrToPacketLogSaveInfoType(char * str)11857 UINT StrToPacketLogSaveInfoType(char *str)
11858 {
11859 	UINT ret = INFINITE;
11860 	if (str == NULL)
11861 	{
11862 		return INFINITE;
11863 	}
11864 
11865 	if (StartWith("none", str) || IsEmptyStr(str))
11866 	{
11867 		ret = PACKET_LOG_NONE;
11868 	}
11869 	else if (StartWith("header", str))
11870 	{
11871 		ret = PACKET_LOG_HEADER;
11872 	}
11873 	else if (StartWith("full", str) || StartWith("all", str))
11874 	{
11875 		ret = PACKET_LOG_ALL;
11876 	}
11877 
11878 	return ret;
11879 }
11880 
11881 // Convert a packet type string of the packet log to an integer
StrToPacketLogType(char * str)11882 UINT StrToPacketLogType(char *str)
11883 {
11884 	UINT ret = INFINITE;
11885 	if (str == NULL || IsEmptyStr(str))
11886 	{
11887 		return INFINITE;
11888 	}
11889 
11890 	if (StartWith("tcpconn", str))
11891 	{
11892 		ret = PACKET_LOG_TCP_CONN;
11893 	}
11894 	else if (StartWith("tcpdata", str))
11895 	{
11896 		ret = PACKET_LOG_TCP;
11897 	}
11898 	else if (StartWith("dhcp", str))
11899 	{
11900 		ret = PACKET_LOG_DHCP;
11901 	}
11902 	else if (StartWith("udp", str))
11903 	{
11904 		ret = PACKET_LOG_UDP;
11905 	}
11906 	else if (StartWith("icmp", str))
11907 	{
11908 		ret = PACKET_LOG_ICMP;
11909 	}
11910 	else if (StartWith("ip", str))
11911 	{
11912 		ret = PACKET_LOG_IP;
11913 	}
11914 	else if (StartWith("arp", str))
11915 	{
11916 		ret = PACKET_LOG_ARP;
11917 	}
11918 	else if (StartWith("ethernet", str))
11919 	{
11920 		ret = PACKET_LOG_ETHERNET;
11921 	}
11922 
11923 	return ret;
11924 }
11925 
11926 // Set the detail level and type of packet to be stored in the packet log
PsLogPacketSaveType(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11927 UINT PsLogPacketSaveType(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11928 {
11929 	LIST *o;
11930 	PS *ps = (PS *)param;
11931 	UINT ret = 0;
11932 	RPC_HUB_LOG t;
11933 	bool packet_log = false;
11934 	UINT packet_type = INFINITE;
11935 	UINT packet_save_info_type = INFINITE;
11936 	// Parameter list that can be specified
11937 	PARAM args[] =
11938 	{
11939 		{"TYPE", CmdPrompt, _UU("CMD_LogPacketSaveType_Prompt_TYPE"), NULL, NULL},
11940 		{"SAVE", CmdPrompt, _UU("CMD_LogPacketSaveType_Prompt_SAVE"), NULL, NULL},
11941 	};
11942 
11943 	// If virtual HUB is not selected, it's an error
11944 	if (ps->HubName == NULL)
11945 	{
11946 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11947 		return ERR_INVALID_PARAMETER;
11948 	}
11949 
11950 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
11951 	if (o == NULL)
11952 	{
11953 		return ERR_INVALID_PARAMETER;
11954 	}
11955 
11956 	packet_type = StrToPacketLogType(GetParamStr(o, "TYPE"));
11957 	packet_save_info_type = StrToPacketLogSaveInfoType(GetParamStr(o, "SAVE"));
11958 
11959 	if (packet_type == INFINITE || packet_save_info_type == INFINITE)
11960 	{
11961 		c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
11962 		FreeParamValueList(o);
11963 		return ERR_INVALID_PARAMETER;
11964 	}
11965 
11966 	Zero(&t, sizeof(t));
11967 
11968 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11969 
11970 	// RPC call
11971 	ret = ScGetHubLog(ps->Rpc, &t);
11972 	if (ret != ERR_NO_ERROR)
11973 	{
11974 		// An error has occured
11975 		CmdPrintError(c, ret);
11976 		FreeParamValueList(o);
11977 		return ret;
11978 	}
11979 
11980 	t.LogSetting.PacketLogConfig[packet_type] = packet_save_info_type;
11981 
11982 	// RPC call
11983 	ret = ScSetHubLog(ps->Rpc, &t);
11984 	if (ret != ERR_NO_ERROR)
11985 	{
11986 		// An error has occured
11987 		CmdPrintError(c, ret);
11988 		FreeParamValueList(o);
11989 		return ret;
11990 	}
11991 
11992 	FreeParamValueList(o);
11993 
11994 	return 0;
11995 }
11996 
11997 // Get the list of certificates of the trusted certification authority
PsCAList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11998 UINT PsCAList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11999 {
12000 	LIST *o;
12001 	PS *ps = (PS *)param;
12002 	UINT ret = 0;
12003 	RPC_HUB_ENUM_CA t;
12004 
12005 	// If virtual HUB is not selected, it's an error
12006 	if (ps->HubName == NULL)
12007 	{
12008 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12009 		return ERR_INVALID_PARAMETER;
12010 	}
12011 
12012 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
12013 	if (o == NULL)
12014 	{
12015 		return ERR_INVALID_PARAMETER;
12016 	}
12017 
12018 	Zero(&t, sizeof(t));
12019 
12020 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12021 
12022 	// RPC call
12023 	ret = ScEnumCa(ps->Rpc, &t);
12024 
12025 	if (ret != ERR_NO_ERROR)
12026 	{
12027 		// An error has occured
12028 		CmdPrintError(c, ret);
12029 		FreeParamValueList(o);
12030 		return ret;
12031 	}
12032 	else
12033 	{
12034 		UINT i;
12035 		CT *ct = CtNewStandard();
12036 
12037 		for (i = 0;i < t.NumCa;i++)
12038 		{
12039 			wchar_t tmp[MAX_SIZE];
12040 			wchar_t tmp2[64];
12041 			RPC_HUB_ENUM_CA_ITEM *e = &t.Ca[i];
12042 
12043 			GetDateStrEx64(tmp, sizeof(tmp), SystemToLocal64(e->Expires), NULL);
12044 
12045 			UniToStru(tmp2, e->Key);
12046 
12047 			CtInsert(ct, _UU("CMD_CAList_COLUMN_ID"), tmp2);
12048 			CtInsert(ct, _UU("CM_CERT_COLUMN_1"), e->SubjectName);
12049 			CtInsert(ct, _UU("CM_CERT_COLUMN_2"), e->IssuerName);
12050 			CtInsert(ct, _UU("CM_CERT_COLUMN_3"), tmp);
12051 
12052 			if (i != (t.NumCa - 1))
12053 			{
12054 				CtInsert(ct, L"---", L"---");
12055 			}
12056 		}
12057 
12058 		CtFree(ct, c);
12059 	}
12060 
12061 	FreeRpcHubEnumCa(&t);
12062 
12063 	FreeParamValueList(o);
12064 
12065 	return 0;
12066 }
12067 
12068 // Add a certificate to the trusted certification authority
PsCAAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12069 UINT PsCAAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12070 {
12071 	LIST *o;
12072 	PS *ps = (PS *)param;
12073 	UINT ret = 0;
12074 	RPC_HUB_ADD_CA t;
12075 	X *x;
12076 	// Parameter list that can be specified
12077 	PARAM args[] =
12078 	{
12079 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
12080 		{"[path]", CmdPrompt, _UU("CMD_CAAdd_PROMPT_PATH"), CmdEvalIsFile, NULL},
12081 	};
12082 
12083 	// If virtual HUB is not selected, it's an error
12084 	if (ps->HubName == NULL)
12085 	{
12086 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12087 		return ERR_INVALID_PARAMETER;
12088 	}
12089 
12090 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12091 	if (o == NULL)
12092 	{
12093 		return ERR_INVALID_PARAMETER;
12094 	}
12095 
12096 	x = FileToXW(GetParamUniStr(o, "[path]"));
12097 
12098 	if (x == NULL)
12099 	{
12100 		FreeParamValueList(o);
12101 		c->Write(c, _UU("CMD_MSG_LOAD_CERT_FAILED"));
12102 		return ERR_INVALID_PARAMETER;
12103 	}
12104 
12105 	Zero(&t, sizeof(t));
12106 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12107 	t.Cert = x;
12108 
12109 	// RPC call
12110 	ret = ScAddCa(ps->Rpc, &t);
12111 
12112 	if (ret != ERR_NO_ERROR)
12113 	{
12114 		// An error has occured
12115 		CmdPrintError(c, ret);
12116 		FreeParamValueList(o);
12117 		return ret;
12118 	}
12119 
12120 	FreeRpcHubAddCa(&t);
12121 
12122 	FreeParamValueList(o);
12123 
12124 	return 0;
12125 }
12126 
12127 // Delete the certificate of the trusted certification authority
PsCADelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12128 UINT PsCADelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12129 {
12130 	LIST *o;
12131 	PS *ps = (PS *)param;
12132 	UINT ret = 0;
12133 	RPC_HUB_DELETE_CA t;
12134 	// Parameter list that can be specified
12135 	PARAM args[] =
12136 	{
12137 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
12138 		{"[id]", CmdPrompt, _UU("CMD_CADelete_PROMPT_ID"), CmdEvalNotEmpty, NULL},
12139 	};
12140 
12141 	// If virtual HUB is not selected, it's an error
12142 	if (ps->HubName == NULL)
12143 	{
12144 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12145 		return ERR_INVALID_PARAMETER;
12146 	}
12147 
12148 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12149 	if (o == NULL)
12150 	{
12151 		return ERR_INVALID_PARAMETER;
12152 	}
12153 
12154 	Zero(&t, sizeof(t));
12155 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12156 	t.Key = GetParamInt(o, "[id]");
12157 
12158 	// RPC call
12159 	ret = ScDeleteCa(ps->Rpc, &t);
12160 
12161 	if (ret != ERR_NO_ERROR)
12162 	{
12163 		// An error has occured
12164 		CmdPrintError(c, ret);
12165 		FreeParamValueList(o);
12166 		return ret;
12167 	}
12168 
12169 	FreeParamValueList(o);
12170 
12171 	return 0;
12172 }
12173 
12174 // Get the certificate of the trusted certification authority
PsCAGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12175 UINT PsCAGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12176 {
12177 	LIST *o;
12178 	PS *ps = (PS *)param;
12179 	UINT ret = 0;
12180 	RPC_HUB_GET_CA t;
12181 	// Parameter list that can be specified
12182 	PARAM args[] =
12183 	{
12184 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
12185 		{"[id]", CmdPrompt, _UU("CMD_CAGet_PROMPT_ID"), CmdEvalNotEmpty, NULL},
12186 		{"SAVECERT", CmdPrompt, _UU("CMD_CAGet_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},
12187 	};
12188 
12189 	// If virtual HUB is not selected, it's an error
12190 	if (ps->HubName == NULL)
12191 	{
12192 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12193 		return ERR_INVALID_PARAMETER;
12194 	}
12195 
12196 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12197 	if (o == NULL)
12198 	{
12199 		return ERR_INVALID_PARAMETER;
12200 	}
12201 
12202 	Zero(&t, sizeof(t));
12203 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12204 	t.Key = GetParamInt(o, "[id]");
12205 
12206 	// RPC call
12207 	ret = ScGetCa(ps->Rpc, &t);
12208 
12209 	if (ret != ERR_NO_ERROR)
12210 	{
12211 		// An error has occured
12212 		CmdPrintError(c, ret);
12213 		FreeParamValueList(o);
12214 		return ret;
12215 	}
12216 	else
12217 	{
12218 		if (XToFileW(t.Cert, GetParamUniStr(o, "SAVECERT"), true))
12219 		{
12220 			// Success
12221 		}
12222 		else
12223 		{
12224 			ret = ERR_INTERNAL_ERROR;
12225 			c->Write(c, _UU("CMD_MSG_SAVE_CERT_FAILED"));
12226 		}
12227 	}
12228 
12229 	FreeRpcHubGetCa(&t);
12230 
12231 	FreeParamValueList(o);
12232 
12233 	return ret;
12234 }
12235 
12236 // Get the cascade connection list
PsCascadeList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12237 UINT PsCascadeList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12238 {
12239 	LIST *o;
12240 	PS *ps = (PS *)param;
12241 	UINT ret = 0;
12242 	RPC_ENUM_LINK t;
12243 
12244 	// If virtual HUB is not selected, it's an error
12245 	if (ps->HubName == NULL)
12246 	{
12247 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12248 		return ERR_INVALID_PARAMETER;
12249 	}
12250 
12251 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
12252 	if (o == NULL)
12253 	{
12254 		return ERR_INVALID_PARAMETER;
12255 	}
12256 
12257 	Zero(&t, sizeof(t));
12258 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12259 
12260 	// RPC call
12261 	ret = ScEnumLink(ps->Rpc, &t);
12262 
12263 	if (ret != ERR_NO_ERROR)
12264 	{
12265 		// An error has occured
12266 		CmdPrintError(c, ret);
12267 		FreeParamValueList(o);
12268 		return ret;
12269 	}
12270 	else
12271 	{
12272 		CT *ct = CtNew();
12273 		UINT i;
12274 
12275 		CtInsertColumn(ct, _UU("SM_LINK_COLUMN_1"), false);
12276 		CtInsertColumn(ct, _UU("SM_LINK_COLUMN_2"), false);
12277 		CtInsertColumn(ct, _UU("SM_LINK_COLUMN_3"), false);
12278 		CtInsertColumn(ct, _UU("SM_LINK_COLUMN_4"), false);
12279 		CtInsertColumn(ct, _UU("SM_LINK_COLUMN_5"), false);
12280 
12281 		for (i = 0;i < t.NumLink;i++)
12282 		{
12283 			RPC_ENUM_LINK_ITEM *e = &t.Links[i];
12284 			wchar_t tmp1[MAX_SIZE];
12285 			wchar_t tmp2[MAX_SIZE];
12286 			wchar_t tmp3[MAX_SIZE];
12287 			wchar_t tmp4[MAX_SIZE];
12288 
12289 			GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->ConnectedTime), NULL);
12290 			StrToUni(tmp2, sizeof(tmp2), e->Hostname);
12291 			StrToUni(tmp3, sizeof(tmp3), e->HubName);
12292 
12293 			if (e->Online == false)
12294 			{
12295 				UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_OFFLINE"));
12296 			}
12297 			else
12298 			{
12299 				if (e->Connected)
12300 				{
12301 					UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_ONLINE"));
12302 				}
12303 				else
12304 				{
12305 					if (e->LastError != 0)
12306 					{
12307 						UniFormat(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_ERROR"), e->LastError, _E(e->LastError));
12308 					}
12309 					else
12310 					{
12311 						UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_CONNECTING"));
12312 					}
12313 				}
12314 			}
12315 
12316 			CtInsert(ct, e->AccountName, tmp4, tmp1, tmp2, tmp3);
12317 		}
12318 
12319 		CtFreeEx(ct, c, true);
12320 	}
12321 
12322 	FreeRpcEnumLink(&t);
12323 
12324 	FreeParamValueList(o);
12325 
12326 	return 0;
12327 }
12328 
12329 // Creat a new cascade
PsCascadeCreate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12330 UINT PsCascadeCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12331 {
12332 	LIST *o;
12333 	PS *ps = (PS *)param;
12334 	UINT ret = 0;
12335 	RPC_CREATE_LINK t;
12336 	char *host = NULL;
12337 	UINT port = 443;
12338 	// Parameter list that can be specified
12339 	PARAM args[] =
12340 	{
12341 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
12342 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
12343 		{"SERVER", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},
12344 		{"HUB", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Hub"), CmdEvalSafe, NULL},
12345 		{"USERNAME", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},
12346 	};
12347 
12348 	// If virtual HUB is not selected, it's an error
12349 	if (ps->HubName == NULL)
12350 	{
12351 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12352 		return ERR_INVALID_PARAMETER;
12353 	}
12354 
12355 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12356 	if (o == NULL)
12357 	{
12358 		return ERR_INVALID_PARAMETER;
12359 	}
12360 
12361 	ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);
12362 
12363 	Zero(&t, sizeof(t));
12364 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12365 
12366 	t.Online = false;
12367 
12368 	Copy(&t.Policy, GetDefaultPolicy(), sizeof(POLICY));
12369 
12370 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
12371 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
12372 	t.ClientOption->Port = port;
12373 	StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);
12374 	StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));
12375 	t.ClientOption->NumRetry = INFINITE;
12376 	t.ClientOption->RetryInterval = 15;
12377 	t.ClientOption->MaxConnection = 8;
12378 	t.ClientOption->UseEncrypt = true;
12379 	t.ClientOption->AdditionalConnectionInterval = 1;
12380 	t.ClientOption->RequireBridgeRoutingMode = true;
12381 
12382 	t.ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));
12383 	t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
12384 	StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username), GetParamStr(o, "USERNAME"));
12385 
12386 	Free(host);
12387 
12388 	// RPC call
12389 	ret = ScCreateLink(ps->Rpc, &t);
12390 
12391 	if (ret != ERR_NO_ERROR)
12392 	{
12393 		// An error has occured
12394 		CmdPrintError(c, ret);
12395 		FreeParamValueList(o);
12396 		return ret;
12397 	}
12398 
12399 	FreeRpcCreateLink(&t);
12400 
12401 	FreeParamValueList(o);
12402 
12403 	return 0;
12404 }
12405 
12406 // Set the user name and destination of the cascade connection
PsCascadeSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12407 UINT PsCascadeSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12408 {
12409 	LIST *o;
12410 	PS *ps = (PS *)param;
12411 	UINT ret = 0;
12412 	RPC_CREATE_LINK t;
12413 	char *host = NULL;
12414 	UINT port = 443;
12415 	// Parameter list that can be specified
12416 	PARAM args[] =
12417 	{
12418 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
12419 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
12420 		{"SERVER", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},
12421 		{"HUB", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Hub"), CmdEvalSafe, NULL},
12422 	};
12423 
12424 	// If virtual HUB is not selected, it's an error
12425 	if (ps->HubName == NULL)
12426 	{
12427 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12428 		return ERR_INVALID_PARAMETER;
12429 	}
12430 
12431 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12432 	if (o == NULL)
12433 	{
12434 		return ERR_INVALID_PARAMETER;
12435 	}
12436 
12437 	ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);
12438 
12439 	Zero(&t, sizeof(t));
12440 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12441 
12442 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
12443 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
12444 
12445 	ret = ScGetLink(ps->Rpc, &t);
12446 	if (ret != ERR_NO_ERROR)
12447 	{
12448 		// An error has occured
12449 		CmdPrintError(c, ret);
12450 		FreeParamValueList(o);
12451 		Free(host);
12452 		return ret;
12453 	}
12454 
12455 	t.ClientOption->Port = port;
12456 	StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);
12457 	StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));
12458 
12459 	Free(host);
12460 
12461 	// RPC call
12462 	ret = ScSetLink(ps->Rpc, &t);
12463 
12464 	if (ret != ERR_NO_ERROR)
12465 	{
12466 		// An error has occured
12467 		CmdPrintError(c, ret);
12468 		FreeParamValueList(o);
12469 		return ret;
12470 	}
12471 
12472 	FreeRpcCreateLink(&t);
12473 
12474 	FreeParamValueList(o);
12475 
12476 	return 0;
12477 }
12478 
12479 // Get the type string of proxy
GetProxyTypeStr(UINT i)12480 wchar_t *GetProxyTypeStr(UINT i)
12481 {
12482 	switch (i)
12483 	{
12484 	case PROXY_DIRECT:
12485 
12486 		return _UU("PROTO_DIRECT_TCP");
12487 
12488 	case PROXY_HTTP:
12489 		return _UU("PROTO_HTTP_PROXY");
12490 
12491 	case PROXY_SOCKS:
12492 		return _UU("PROTO_SOCKS_PROXY");
12493 
12494 	default:
12495 		return _UU("PROTO_UNKNOWN");
12496 	}
12497 }
12498 
12499 // Get type string in user authentication for client
GetClientAuthTypeStr(UINT i)12500 wchar_t *GetClientAuthTypeStr(UINT i)
12501 {
12502 	char tmp[MAX_SIZE];
12503 
12504 	Format(tmp, sizeof(tmp), "PW_TYPE_%u", i);
12505 
12506 	return _UU(tmp);
12507 }
12508 
12509 // Get the setting of cascade connection
PsCascadeGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12510 UINT PsCascadeGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12511 {
12512 	LIST *o;
12513 	PS *ps = (PS *)param;
12514 	UINT ret = 0;
12515 	RPC_CREATE_LINK t;
12516 	// Parameter list that can be specified
12517 	PARAM args[] =
12518 	{
12519 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
12520 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
12521 	};
12522 
12523 	// If virtual HUB is not selected, it's an error
12524 	if (ps->HubName == NULL)
12525 	{
12526 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12527 		return ERR_INVALID_PARAMETER;
12528 	}
12529 
12530 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12531 	if (o == NULL)
12532 	{
12533 		return ERR_INVALID_PARAMETER;
12534 	}
12535 
12536 	Zero(&t, sizeof(t));
12537 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12538 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
12539 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName),
12540 		GetParamUniStr(o, "[name]"));
12541 
12542 	// RPC call
12543 	ret = ScGetLink(ps->Rpc, &t);
12544 
12545 	if (ret != ERR_NO_ERROR)
12546 	{
12547 		// An error has occured
12548 		CmdPrintError(c, ret);
12549 		FreeParamValueList(o);
12550 		return ret;
12551 	}
12552 	else
12553 	{
12554 		// Show the contents of the connection settings
12555 		wchar_t tmp[MAX_SIZE];
12556 
12557 		CT *ct = CtNewStandard();
12558 
12559 		// Connection settings name
12560 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NAME"), t.ClientOption->AccountName);
12561 
12562 		// Host name of the destination VPN Server
12563 		StrToUni(tmp, sizeof(tmp), t.ClientOption->Hostname);
12564 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HOSTNAME"), tmp);
12565 
12566 		// The port number to connect to VPN Server
12567 		UniToStru(tmp, t.ClientOption->Port);
12568 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PORT"), tmp);
12569 
12570 		// Virtual HUB name of the destination VPN Server
12571 		StrToUni(tmp, sizeof(tmp), t.ClientOption->HubName);
12572 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HUBNAME"), tmp);
12573 
12574 		// Type of proxy server to go through
12575 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_TYPE"), GetProxyTypeStr(t.ClientOption->ProxyType));
12576 
12577 		if (t.ClientOption->ProxyType != PROXY_DIRECT)
12578 		{
12579 			// Host name of the proxy server
12580 			StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyName);
12581 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_HOSTNAME"), tmp);
12582 
12583 			// Port number of the proxy server
12584 			UniToStru(tmp, t.ClientOption->ProxyPort);
12585 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_PORT"), tmp);
12586 
12587 			// User name of the proxy server
12588 			StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyUsername);
12589 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_USERNAME"), tmp);
12590 		}
12591 
12592 		// To verify the server certificate
12593 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_USE"),
12594 			t.CheckServerCert ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
12595 
12596 		// Registered specific certificate
12597 		if (t.ServerCert != NULL)
12598 		{
12599 			GetAllNameFromX(tmp, sizeof(tmp), t.ServerCert);
12600 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_NAME"), tmp);
12601 		}
12602 
12603 		// Device name to be used for the connection
12604 		StrToUni(tmp, sizeof(tmp), t.ClientOption->DeviceName);
12605 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_DEVICE_NAME"), tmp);
12606 
12607 		// Authentication type
12608 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_TYPE"), GetClientAuthTypeStr(t.ClientAuth->AuthType));
12609 
12610 		// User name
12611 		StrToUni(tmp, sizeof(tmp), t.ClientAuth->Username);
12612 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_USERNAME"), tmp);
12613 
12614 		if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_CERT)
12615 		{
12616 			if (t.ClientAuth->ClientX != NULL)
12617 			{
12618 				// Client certificate name
12619 				GetAllNameFromX(tmp, sizeof(tmp), t.ClientAuth->ClientX);
12620 				CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_CERT_NAME"), tmp);
12621 			}
12622 		}
12623 
12624 		// Number of TCP connections to be used for VPN communication
12625 		UniToStru(tmp, t.ClientOption->MaxConnection);
12626 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NUMTCP"), tmp);
12627 
12628 		// Establishment interval of each TCP connection
12629 		UniToStru(tmp, t.ClientOption->AdditionalConnectionInterval);
12630 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_INTERVAL"), tmp);
12631 
12632 		// Life span of each TCP connection
12633 		if (t.ClientOption->ConnectionDisconnectSpan != 0)
12634 		{
12635 			UniToStru(tmp, t.ClientOption->ConnectionDisconnectSpan);
12636 		}
12637 		else
12638 		{
12639 			UniStrCpy(tmp, sizeof(tmp), _UU("CMD_MSG_INFINITE"));
12640 		}
12641 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_TTL"), tmp);
12642 
12643 		// Use of half-duplex mode
12644 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_HALF"),
12645 			t.ClientOption->HalfConnection ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
12646 
12647 		// Encryption by SSL
12648 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_ENCRYPT"),
12649 			t.ClientOption->UseEncrypt ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
12650 
12651 		// Data compression
12652 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_COMPRESS"),
12653 			t.ClientOption->UseCompress ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
12654 
12655 		// Connect in bridge / router mode
12656 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_BRIDGE_ROUTER"),
12657 			t.ClientOption->RequireBridgeRoutingMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
12658 
12659 		// Connect in monitoring mode
12660 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_MONITOR"),
12661 			t.ClientOption->RequireMonitorMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
12662 
12663 		// Not to rewrite the routing table
12664 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NO_TRACKING"),
12665 			t.ClientOption->NoRoutingTracking ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
12666 
12667 		// Disable the QoS control
12668 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_QOS_DISABLE"),
12669 			t.ClientOption->DisableQoS ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
12670 
12671 		CtFree(ct, c);
12672 
12673 		// Security policy
12674 		c->Write(c, L"");
12675 		c->Write(c, _UU("CMD_CascadeGet_Policy"));
12676 		PrintPolicy(c, &t.Policy, true);
12677 	}
12678 
12679 	FreeRpcCreateLink(&t);
12680 
12681 	FreeParamValueList(o);
12682 
12683 	return 0;
12684 }
12685 
12686 // Delete the cascade connection
PsCascadeDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12687 UINT PsCascadeDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12688 {
12689 	LIST *o;
12690 	PS *ps = (PS *)param;
12691 	UINT ret = 0;
12692 	RPC_LINK t;
12693 	// Parameter list that can be specified
12694 	PARAM args[] =
12695 	{
12696 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
12697 	};
12698 
12699 	// If virtual HUB is not selected, it's an error
12700 	if (ps->HubName == NULL)
12701 	{
12702 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12703 		return ERR_INVALID_PARAMETER;
12704 	}
12705 
12706 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12707 	if (o == NULL)
12708 	{
12709 		return ERR_INVALID_PARAMETER;
12710 	}
12711 
12712 	Zero(&t, sizeof(t));
12713 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
12714 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12715 
12716 	// RPC call
12717 	ret = ScDeleteLink(ps->Rpc, &t);
12718 
12719 	if (ret != ERR_NO_ERROR)
12720 	{
12721 		// An error has occured
12722 		CmdPrintError(c, ret);
12723 		FreeParamValueList(o);
12724 		return ret;
12725 	}
12726 
12727 	FreeParamValueList(o);
12728 
12729 	return 0;
12730 }
12731 
12732 // Set the user name to use for the cascade connection
PsCascadeUsernameSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12733 UINT PsCascadeUsernameSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12734 {
12735 	LIST *o;
12736 	PS *ps = (PS *)param;
12737 	UINT ret = 0;
12738 	RPC_CREATE_LINK t;
12739 	// Parameter list that can be specified
12740 	PARAM args[] =
12741 	{
12742 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
12743 		{"USERNAME", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},
12744 	};
12745 
12746 	// If virtual HUB is not selected, it's an error
12747 	if (ps->HubName == NULL)
12748 	{
12749 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12750 		return ERR_INVALID_PARAMETER;
12751 	}
12752 
12753 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12754 	if (o == NULL)
12755 	{
12756 		return ERR_INVALID_PARAMETER;
12757 	}
12758 
12759 	Zero(&t, sizeof(t));
12760 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12761 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
12762 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
12763 
12764 	// RPC call
12765 	ret = ScGetLink(ps->Rpc, &t);
12766 
12767 	if (ret != ERR_NO_ERROR)
12768 	{
12769 		// An error has occured
12770 		CmdPrintError(c, ret);
12771 		FreeParamValueList(o);
12772 		return ret;
12773 	}
12774 	else
12775 	{
12776 		// Change the settings for the cascade connection
12777 		StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username),
12778 			GetParamStr(o, "USERNAME"));
12779 
12780 		if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_PASSWORD)
12781 		{
12782 			c->Write(c, _UU("CMD_CascadeUsername_Notice"));
12783 		}
12784 
12785 		ret = ScSetLink(ps->Rpc, &t);
12786 		if (ret != ERR_NO_ERROR)
12787 		{
12788 			// An error has occured
12789 			CmdPrintError(c, ret);
12790 			FreeParamValueList(o);
12791 			return ret;
12792 		}
12793 
12794 		FreeRpcCreateLink(&t);
12795 	}
12796 
12797 	FreeParamValueList(o);
12798 
12799 	return 0;
12800 }
12801 
12802 //Set the type of user authentication of cascade connection to the anonymous authentication
PsCascadeAnonymousSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12803 UINT PsCascadeAnonymousSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12804 {
12805 	LIST *o;
12806 	PS *ps = (PS *)param;
12807 	UINT ret = 0;
12808 	RPC_CREATE_LINK t;
12809 	// Parameter list that can be specified
12810 	PARAM args[] =
12811 	{
12812 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
12813 	};
12814 
12815 	// If virtual HUB is not selected, it's an error
12816 	if (ps->HubName == NULL)
12817 	{
12818 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12819 		return ERR_INVALID_PARAMETER;
12820 	}
12821 
12822 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12823 	if (o == NULL)
12824 	{
12825 		return ERR_INVALID_PARAMETER;
12826 	}
12827 
12828 	Zero(&t, sizeof(t));
12829 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12830 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
12831 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
12832 
12833 	// RPC call
12834 	ret = ScGetLink(ps->Rpc, &t);
12835 
12836 	if (ret != ERR_NO_ERROR)
12837 	{
12838 		// An error has occured
12839 		CmdPrintError(c, ret);
12840 		FreeParamValueList(o);
12841 		return ret;
12842 	}
12843 	else
12844 	{
12845 		// Change the settings for the cascade connection
12846 		t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
12847 
12848 		ret = ScSetLink(ps->Rpc, &t);
12849 		if (ret != ERR_NO_ERROR)
12850 		{
12851 			// An error has occured
12852 			CmdPrintError(c, ret);
12853 			FreeParamValueList(o);
12854 			return ret;
12855 		}
12856 
12857 		FreeRpcCreateLink(&t);
12858 	}
12859 
12860 	FreeParamValueList(o);
12861 
12862 	return 0;
12863 }
12864 
12865 // Set the type of user authentication of cascade connection to the password authentication
PsCascadePasswordSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12866 UINT PsCascadePasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12867 {
12868 	LIST *o;
12869 	PS *ps = (PS *)param;
12870 	UINT ret = 0;
12871 	RPC_CREATE_LINK t;
12872 	// Parameter list that can be specified
12873 	PARAM args[] =
12874 	{
12875 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
12876 		{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
12877 		{"TYPE", CmdPrompt, _UU("CMD_CascadePasswordSet_Prompt_Type"), CmdEvalNotEmpty, NULL},
12878 	};
12879 
12880 	// If virtual HUB is not selected, it's an error
12881 	if (ps->HubName == NULL)
12882 	{
12883 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12884 		return ERR_INVALID_PARAMETER;
12885 	}
12886 
12887 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12888 	if (o == NULL)
12889 	{
12890 		return ERR_INVALID_PARAMETER;
12891 	}
12892 
12893 	Zero(&t, sizeof(t));
12894 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12895 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
12896 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
12897 
12898 	// RPC call
12899 	ret = ScGetLink(ps->Rpc, &t);
12900 
12901 	if (ret != ERR_NO_ERROR)
12902 	{
12903 		// An error has occured
12904 		CmdPrintError(c, ret);
12905 		FreeParamValueList(o);
12906 		return ret;
12907 	}
12908 	else
12909 	{
12910 		// Change the settings for the cascade connection
12911 		char *typestr = GetParamStr(o, "TYPE");
12912 
12913 		if (StartWith("standard", typestr))
12914 		{
12915 			t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PASSWORD;
12916 			HashPassword(t.ClientAuth->HashedPassword, t.ClientAuth->Username,
12917 				GetParamStr(o, "PASSWORD"));
12918 		}
12919 		else if (StartWith("radius", typestr) || StartWith("ntdomain", typestr))
12920 		{
12921 			t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PLAIN_PASSWORD;
12922 
12923 			StrCpy(t.ClientAuth->PlainPassword, sizeof(t.ClientAuth->PlainPassword),
12924 				GetParamStr(o, "PASSWORD"));
12925 		}
12926 		else
12927 		{
12928 			// An error has occured
12929 			c->Write(c, _UU("CMD_CascadePasswordSet_Type_Invalid"));
12930 			FreeRpcCreateLink(&t);
12931 			ret = ERR_INVALID_PARAMETER;
12932 			CmdPrintError(c, ret);
12933 			FreeParamValueList(o);
12934 			return ERR_INTERNAL_ERROR;
12935 		}
12936 
12937 		ret = ScSetLink(ps->Rpc, &t);
12938 		if (ret != ERR_NO_ERROR)
12939 		{
12940 			// An error has occured
12941 			CmdPrintError(c, ret);
12942 			FreeParamValueList(o);
12943 			return ret;
12944 		}
12945 
12946 		FreeRpcCreateLink(&t);
12947 	}
12948 
12949 	FreeParamValueList(o);
12950 
12951 	return 0;
12952 }
12953 
12954 // Set the type of user authentication of cascade connection to the client certificate authentication
PsCascadeCertSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12955 UINT PsCascadeCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12956 {
12957 	LIST *o;
12958 	PS *ps = (PS *)param;
12959 	UINT ret = 0;
12960 	RPC_CREATE_LINK t;
12961 	X *x;
12962 	K *k;
12963 	// Parameter list that can be specified
12964 	PARAM args[] =
12965 	{
12966 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
12967 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
12968 		{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
12969 		{"LOADKEY", CmdPrompt, _UU("CMD_LOADKEYPATH"), CmdEvalIsFile, NULL},
12970 	};
12971 
12972 	// If virtual HUB is not selected, it's an error
12973 	if (ps->HubName == NULL)
12974 	{
12975 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12976 		return ERR_INVALID_PARAMETER;
12977 	}
12978 
12979 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12980 	if (o == NULL)
12981 	{
12982 		return ERR_INVALID_PARAMETER;
12983 	}
12984 
12985 	if (CmdLoadCertAndKey(c, &x, &k, GetParamUniStr(o, "LOADCERT"), GetParamUniStr(o, "LOADKEY")) == false)
12986 	{
12987 		return ERR_INTERNAL_ERROR;
12988 	}
12989 
12990 	Zero(&t, sizeof(t));
12991 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12992 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
12993 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
12994 
12995 	// RPC call
12996 	ret = ScGetLink(ps->Rpc, &t);
12997 
12998 	if (ret != ERR_NO_ERROR)
12999 	{
13000 		// An error has occured
13001 		FreeX(x);
13002 		FreeK(k);
13003 		CmdPrintError(c, ret);
13004 		FreeParamValueList(o);
13005 		return ret;
13006 	}
13007 	else
13008 	{
13009 		// Change authentication data
13010 		t.ClientAuth->AuthType = CLIENT_AUTHTYPE_CERT;
13011 		if (t.ClientAuth->ClientX != NULL)
13012 		{
13013 			FreeX(t.ClientAuth->ClientX);
13014 		}
13015 		if (t.ClientAuth->ClientK != NULL)
13016 		{
13017 			FreeK(t.ClientAuth->ClientK);
13018 		}
13019 
13020 		t.ClientAuth->ClientX = x;
13021 		t.ClientAuth->ClientK = k;
13022 
13023 		ret = ScSetLink(ps->Rpc, &t);
13024 		if (ret != ERR_NO_ERROR)
13025 		{
13026 			// An error has occured
13027 			CmdPrintError(c, ret);
13028 			FreeParamValueList(o);
13029 			return ret;
13030 		}
13031 
13032 		FreeRpcCreateLink(&t);
13033 	}
13034 
13035 	FreeParamValueList(o);
13036 
13037 	return 0;
13038 }
13039 
13040 // Get the client certificate to be used in the cascade connection
PsCascadeCertGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13041 UINT PsCascadeCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13042 {
13043 	LIST *o;
13044 	PS *ps = (PS *)param;
13045 	UINT ret = 0;
13046 	RPC_CREATE_LINK t;
13047 	// Parameter list that can be specified
13048 	PARAM args[] =
13049 	{
13050 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13051 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13052 		{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
13053 	};
13054 
13055 	// If virtual HUB is not selected, it's an error
13056 	if (ps->HubName == NULL)
13057 	{
13058 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13059 		return ERR_INVALID_PARAMETER;
13060 	}
13061 
13062 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13063 	if (o == NULL)
13064 	{
13065 		return ERR_INVALID_PARAMETER;
13066 	}
13067 
13068 	Zero(&t, sizeof(t));
13069 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13070 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13071 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13072 
13073 	// RPC call
13074 	ret = ScGetLink(ps->Rpc, &t);
13075 
13076 	if (ret != ERR_NO_ERROR)
13077 	{
13078 		// An error has occured
13079 		CmdPrintError(c, ret);
13080 		FreeParamValueList(o);
13081 		return ret;
13082 	}
13083 	else
13084 	{
13085 		if (t.ClientAuth->AuthType != CLIENT_AUTHTYPE_CERT)
13086 		{
13087 			c->Write(c, _UU("CMD_CascadeCertSet_Not_Auth_Cert"));
13088 			ret = ERR_INTERNAL_ERROR;
13089 		}
13090 		else if (t.ClientAuth->ClientX == NULL)
13091 		{
13092 			c->Write(c, _UU("CMD_CascadeCertSet_Cert_Not_Exists"));
13093 			ret = ERR_INTERNAL_ERROR;
13094 		}
13095 		else
13096 		{
13097 			XToFileW(t.ClientAuth->ClientX, GetParamUniStr(o, "SAVECERT"), true);
13098 		}
13099 		FreeRpcCreateLink(&t);
13100 	}
13101 
13102 	FreeParamValueList(o);
13103 
13104 	return ret;
13105 }
13106 
13107 // Enable encryption of communication at the time of the cascade connection
PsCascadeEncryptEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13108 UINT PsCascadeEncryptEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13109 {
13110 	LIST *o;
13111 	PS *ps = (PS *)param;
13112 	UINT ret = 0;
13113 	RPC_CREATE_LINK t;
13114 	// Parameter list that can be specified
13115 	PARAM args[] =
13116 	{
13117 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13118 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13119 	};
13120 
13121 	// If virtual HUB is not selected, it's an error
13122 	if (ps->HubName == NULL)
13123 	{
13124 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13125 		return ERR_INVALID_PARAMETER;
13126 	}
13127 
13128 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13129 	if (o == NULL)
13130 	{
13131 		return ERR_INVALID_PARAMETER;
13132 	}
13133 
13134 	Zero(&t, sizeof(t));
13135 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13136 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13137 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13138 
13139 	// RPC call
13140 	ret = ScGetLink(ps->Rpc, &t);
13141 
13142 	if (ret != ERR_NO_ERROR)
13143 	{
13144 		// An error has occured
13145 		CmdPrintError(c, ret);
13146 		FreeParamValueList(o);
13147 		return ret;
13148 	}
13149 	else
13150 	{
13151 		// Data change
13152 		t.ClientOption->UseEncrypt = true;
13153 
13154 		ret = ScSetLink(ps->Rpc, &t);
13155 		if (ret != ERR_NO_ERROR)
13156 		{
13157 			// An error has occured
13158 			CmdPrintError(c, ret);
13159 			FreeParamValueList(o);
13160 			return ret;
13161 		}
13162 
13163 		FreeRpcCreateLink(&t);
13164 	}
13165 
13166 	FreeParamValueList(o);
13167 
13168 	return 0;
13169 }
13170 
13171 // Disable encryption of communication at the time of the cascade connection
PsCascadeEncryptDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13172 UINT PsCascadeEncryptDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13173 {
13174 	LIST *o;
13175 	PS *ps = (PS *)param;
13176 	UINT ret = 0;
13177 	RPC_CREATE_LINK t;
13178 	// Parameter list that can be specified
13179 	PARAM args[] =
13180 	{
13181 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13182 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13183 	};
13184 
13185 	// If virtual HUB is not selected, it's an error
13186 	if (ps->HubName == NULL)
13187 	{
13188 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13189 		return ERR_INVALID_PARAMETER;
13190 	}
13191 
13192 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13193 	if (o == NULL)
13194 	{
13195 		return ERR_INVALID_PARAMETER;
13196 	}
13197 
13198 	Zero(&t, sizeof(t));
13199 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13200 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13201 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13202 
13203 	// RPC call
13204 	ret = ScGetLink(ps->Rpc, &t);
13205 
13206 	if (ret != ERR_NO_ERROR)
13207 	{
13208 		// An error has occured
13209 		CmdPrintError(c, ret);
13210 		FreeParamValueList(o);
13211 		return ret;
13212 	}
13213 	else
13214 	{
13215 		// Data change
13216 		t.ClientOption->UseEncrypt = false;
13217 
13218 		ret = ScSetLink(ps->Rpc, &t);
13219 		if (ret != ERR_NO_ERROR)
13220 		{
13221 			// An error has occured
13222 			CmdPrintError(c, ret);
13223 			FreeParamValueList(o);
13224 			return ret;
13225 		}
13226 
13227 		FreeRpcCreateLink(&t);
13228 	}
13229 
13230 	FreeParamValueList(o);
13231 
13232 	return 0;
13233 }
13234 
13235 // Enable data compression at the time of communication of the cascade connection
PsCascadeCompressEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13236 UINT PsCascadeCompressEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13237 {
13238 	LIST *o;
13239 	PS *ps = (PS *)param;
13240 	UINT ret = 0;
13241 	RPC_CREATE_LINK t;
13242 	// Parameter list that can be specified
13243 	PARAM args[] =
13244 	{
13245 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13246 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13247 	};
13248 
13249 	// If virtual HUB is not selected, it's an error
13250 	if (ps->HubName == NULL)
13251 	{
13252 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13253 		return ERR_INVALID_PARAMETER;
13254 	}
13255 
13256 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13257 	if (o == NULL)
13258 	{
13259 		return ERR_INVALID_PARAMETER;
13260 	}
13261 
13262 	Zero(&t, sizeof(t));
13263 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13264 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13265 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13266 
13267 	// RPC call
13268 	ret = ScGetLink(ps->Rpc, &t);
13269 
13270 	if (ret != ERR_NO_ERROR)
13271 	{
13272 		// An error has occured
13273 		CmdPrintError(c, ret);
13274 		FreeParamValueList(o);
13275 		return ret;
13276 	}
13277 	else
13278 	{
13279 		// Data change
13280 		t.ClientOption->UseCompress = true;
13281 
13282 		ret = ScSetLink(ps->Rpc, &t);
13283 		if (ret != ERR_NO_ERROR)
13284 		{
13285 			// An error has occured
13286 			CmdPrintError(c, ret);
13287 			FreeParamValueList(o);
13288 			return ret;
13289 		}
13290 
13291 		FreeRpcCreateLink(&t);
13292 	}
13293 
13294 	FreeParamValueList(o);
13295 
13296 	return 0;
13297 }
13298 
13299 // Disable data compression at the time of communication of the cascade connection
PsCascadeCompressDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13300 UINT PsCascadeCompressDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13301 {
13302 	LIST *o;
13303 	PS *ps = (PS *)param;
13304 	UINT ret = 0;
13305 	RPC_CREATE_LINK t;
13306 	// Parameter list that can be specified
13307 	PARAM args[] =
13308 	{
13309 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13310 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13311 	};
13312 
13313 	// If virtual HUB is not selected, it's an error
13314 	if (ps->HubName == NULL)
13315 	{
13316 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13317 		return ERR_INVALID_PARAMETER;
13318 	}
13319 
13320 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13321 	if (o == NULL)
13322 	{
13323 		return ERR_INVALID_PARAMETER;
13324 	}
13325 
13326 	Zero(&t, sizeof(t));
13327 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13328 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13329 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13330 
13331 	// RPC call
13332 	ret = ScGetLink(ps->Rpc, &t);
13333 
13334 	if (ret != ERR_NO_ERROR)
13335 	{
13336 		// An error has occured
13337 		CmdPrintError(c, ret);
13338 		FreeParamValueList(o);
13339 		return ret;
13340 	}
13341 	else
13342 	{
13343 		// Data change
13344 		t.ClientOption->UseCompress = false;
13345 
13346 		ret = ScSetLink(ps->Rpc, &t);
13347 		if (ret != ERR_NO_ERROR)
13348 		{
13349 			// An error has occured
13350 			CmdPrintError(c, ret);
13351 			FreeParamValueList(o);
13352 			return ret;
13353 		}
13354 
13355 		FreeRpcCreateLink(&t);
13356 	}
13357 
13358 	FreeParamValueList(o);
13359 
13360 	return 0;
13361 }
13362 
13363 // Set the cascade connection method to the TCP/IP direct connection mode
PsCascadeProxyNone(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13364 UINT PsCascadeProxyNone(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13365 {
13366 	LIST *o;
13367 	PS *ps = (PS *)param;
13368 	UINT ret = 0;
13369 	RPC_CREATE_LINK t;
13370 	// Parameter list that can be specified
13371 	PARAM args[] =
13372 	{
13373 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13374 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13375 	};
13376 
13377 	// If virtual HUB is not selected, it's an error
13378 	if (ps->HubName == NULL)
13379 	{
13380 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13381 		return ERR_INVALID_PARAMETER;
13382 	}
13383 
13384 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13385 	if (o == NULL)
13386 	{
13387 		return ERR_INVALID_PARAMETER;
13388 	}
13389 
13390 	Zero(&t, sizeof(t));
13391 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13392 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13393 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13394 
13395 	// RPC call
13396 	ret = ScGetLink(ps->Rpc, &t);
13397 
13398 	if (ret != ERR_NO_ERROR)
13399 	{
13400 		// An error has occured
13401 		CmdPrintError(c, ret);
13402 		FreeParamValueList(o);
13403 		return ret;
13404 	}
13405 	else
13406 	{
13407 		// Data change
13408 		t.ClientOption->ProxyType = PROXY_DIRECT;
13409 
13410 		ret = ScSetLink(ps->Rpc, &t);
13411 		if (ret != ERR_NO_ERROR)
13412 		{
13413 			// An error has occured
13414 			CmdPrintError(c, ret);
13415 			FreeParamValueList(o);
13416 			return ret;
13417 		}
13418 
13419 		FreeRpcCreateLink(&t);
13420 	}
13421 
13422 	FreeParamValueList(o);
13423 
13424 	return 0;
13425 }
13426 
13427 // Set the cascade connection method as the mode via HTTP proxy server
PsCascadeProxyHttp(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13428 UINT PsCascadeProxyHttp(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13429 {
13430 	LIST *o;
13431 	PS *ps = (PS *)param;
13432 	UINT ret = 0;
13433 	RPC_CREATE_LINK t;
13434 	// Parameter list that can be specified
13435 	PARAM args[] =
13436 	{
13437 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13438 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13439 		{"SERVER", CmdPrompt, _UU("CMD_CascadeProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
13440 		{"USERNAME", NULL, NULL, NULL, NULL},
13441 		{"PASSWORD", NULL, NULL, NULL, NULL},
13442 	};
13443 
13444 	// If virtual HUB is not selected, it's an error
13445 	if (ps->HubName == NULL)
13446 	{
13447 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13448 		return ERR_INVALID_PARAMETER;
13449 	}
13450 
13451 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13452 	if (o == NULL)
13453 	{
13454 		return ERR_INVALID_PARAMETER;
13455 	}
13456 
13457 	Zero(&t, sizeof(t));
13458 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13459 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13460 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13461 
13462 	// RPC call
13463 	ret = ScGetLink(ps->Rpc, &t);
13464 
13465 	if (ret != ERR_NO_ERROR)
13466 	{
13467 		// An error has occured
13468 		CmdPrintError(c, ret);
13469 		FreeParamValueList(o);
13470 		return ret;
13471 	}
13472 	else
13473 	{
13474 		char *host;
13475 		UINT port;
13476 
13477 		// Data change
13478 		if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))
13479 		{
13480 			t.ClientOption->ProxyType = PROXY_HTTP;
13481 			StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
13482 			t.ClientOption->ProxyPort = port;
13483 			StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
13484 			StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
13485 			Free(host);
13486 		}
13487 
13488 		ret = ScSetLink(ps->Rpc, &t);
13489 		if (ret != ERR_NO_ERROR)
13490 		{
13491 			// An error has occured
13492 			CmdPrintError(c, ret);
13493 			FreeParamValueList(o);
13494 			return ret;
13495 		}
13496 
13497 		FreeRpcCreateLink(&t);
13498 	}
13499 
13500 	FreeParamValueList(o);
13501 
13502 	return 0;
13503 }
13504 
13505 // Set the cascade connection method as the mode via SOCKS proxy server
PsCascadeProxySocks(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13506 UINT PsCascadeProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13507 {
13508 	LIST *o;
13509 	PS *ps = (PS *)param;
13510 	UINT ret = 0;
13511 	RPC_CREATE_LINK t;
13512 	// Parameter list that can be specified
13513 	PARAM args[] =
13514 	{
13515 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13516 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13517 		{"SERVER", CmdPrompt, _UU("CMD_CascadeProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
13518 		{"USERNAME", NULL, NULL, NULL, NULL},
13519 		{"PASSWORD", NULL, NULL, NULL, NULL},
13520 	};
13521 
13522 	// If virtual HUB is not selected, it's an error
13523 	if (ps->HubName == NULL)
13524 	{
13525 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13526 		return ERR_INVALID_PARAMETER;
13527 	}
13528 
13529 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13530 	if (o == NULL)
13531 	{
13532 		return ERR_INVALID_PARAMETER;
13533 	}
13534 
13535 	Zero(&t, sizeof(t));
13536 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13537 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13538 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13539 
13540 	// RPC call
13541 	ret = ScGetLink(ps->Rpc, &t);
13542 
13543 	if (ret != ERR_NO_ERROR)
13544 	{
13545 		// An error has occured
13546 		CmdPrintError(c, ret);
13547 		FreeParamValueList(o);
13548 		return ret;
13549 	}
13550 	else
13551 	{
13552 		char *host;
13553 		UINT port;
13554 
13555 		// Data change
13556 		if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))
13557 		{
13558 			t.ClientOption->ProxyType = PROXY_SOCKS;
13559 			StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
13560 			t.ClientOption->ProxyPort = port;
13561 			StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
13562 			StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
13563 			Free(host);
13564 		}
13565 
13566 		ret = ScSetLink(ps->Rpc, &t);
13567 		if (ret != ERR_NO_ERROR)
13568 		{
13569 			// An error has occured
13570 			CmdPrintError(c, ret);
13571 			FreeParamValueList(o);
13572 			return ret;
13573 		}
13574 
13575 		FreeRpcCreateLink(&t);
13576 	}
13577 
13578 	FreeParamValueList(o);
13579 
13580 	return 0;
13581 }
13582 
13583 // Enable the validation options for the server certificate of cascade connection
PsCascadeServerCertEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13584 UINT PsCascadeServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13585 {
13586 	LIST *o;
13587 	PS *ps = (PS *)param;
13588 	UINT ret = 0;
13589 	RPC_CREATE_LINK t;
13590 	// Parameter list that can be specified
13591 	PARAM args[] =
13592 	{
13593 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13594 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13595 	};
13596 
13597 	// If virtual HUB is not selected, it's an error
13598 	if (ps->HubName == NULL)
13599 	{
13600 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13601 		return ERR_INVALID_PARAMETER;
13602 	}
13603 
13604 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13605 	if (o == NULL)
13606 	{
13607 		return ERR_INVALID_PARAMETER;
13608 	}
13609 
13610 	Zero(&t, sizeof(t));
13611 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13612 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13613 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13614 
13615 	// RPC call
13616 	ret = ScGetLink(ps->Rpc, &t);
13617 
13618 	if (ret != ERR_NO_ERROR)
13619 	{
13620 		// An error has occured
13621 		CmdPrintError(c, ret);
13622 		FreeParamValueList(o);
13623 		return ret;
13624 	}
13625 	else
13626 	{
13627 		// Data change
13628 		t.CheckServerCert = true;
13629 
13630 		ret = ScSetLink(ps->Rpc, &t);
13631 		if (ret != ERR_NO_ERROR)
13632 		{
13633 			// An error has occured
13634 			CmdPrintError(c, ret);
13635 			FreeParamValueList(o);
13636 			return ret;
13637 		}
13638 
13639 		FreeRpcCreateLink(&t);
13640 	}
13641 
13642 	FreeParamValueList(o);
13643 
13644 	return 0;
13645 }
13646 
13647 // Disable the validation options for the server certificate of cascade connection
PsCascadeServerCertDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13648 UINT PsCascadeServerCertDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13649 {
13650 	LIST *o;
13651 	PS *ps = (PS *)param;
13652 	UINT ret = 0;
13653 	RPC_CREATE_LINK t;
13654 	// Parameter list that can be specified
13655 	PARAM args[] =
13656 	{
13657 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13658 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13659 	};
13660 
13661 	// If virtual HUB is not selected, it's an error
13662 	if (ps->HubName == NULL)
13663 	{
13664 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13665 		return ERR_INVALID_PARAMETER;
13666 	}
13667 
13668 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13669 	if (o == NULL)
13670 	{
13671 		return ERR_INVALID_PARAMETER;
13672 	}
13673 
13674 	Zero(&t, sizeof(t));
13675 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13676 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13677 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13678 
13679 	// RPC call
13680 	ret = ScGetLink(ps->Rpc, &t);
13681 
13682 	if (ret != ERR_NO_ERROR)
13683 	{
13684 		// An error has occured
13685 		CmdPrintError(c, ret);
13686 		FreeParamValueList(o);
13687 		return ret;
13688 	}
13689 	else
13690 	{
13691 		// Data change
13692 		t.CheckServerCert = false;
13693 
13694 		ret = ScSetLink(ps->Rpc, &t);
13695 		if (ret != ERR_NO_ERROR)
13696 		{
13697 			// An error has occured
13698 			CmdPrintError(c, ret);
13699 			FreeParamValueList(o);
13700 			return ret;
13701 		}
13702 
13703 		FreeRpcCreateLink(&t);
13704 	}
13705 
13706 	FreeParamValueList(o);
13707 
13708 	return 0;
13709 }
13710 
13711 // Server-specific certificate settings of cascade connection
PsCascadeServerCertSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13712 UINT PsCascadeServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13713 {
13714 	LIST *o;
13715 	PS *ps = (PS *)param;
13716 	UINT ret = 0;
13717 	RPC_CREATE_LINK t;
13718 	X *x;
13719 	// Parameter list that can be specified
13720 	PARAM args[] =
13721 	{
13722 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13723 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13724 		{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
13725 	};
13726 
13727 	// If virtual HUB is not selected, it's an error
13728 	if (ps->HubName == NULL)
13729 	{
13730 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13731 		return ERR_INVALID_PARAMETER;
13732 	}
13733 
13734 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13735 	if (o == NULL)
13736 	{
13737 		return ERR_INVALID_PARAMETER;
13738 	}
13739 
13740 	x = FileToXW(GetParamUniStr(o, "LOADCERT"));
13741 	if (x == NULL)
13742 	{
13743 		FreeParamValueList(o);
13744 		c->Write(c, _UU("CMD_LOADCERT_FAILED"));
13745 		return ERR_INTERNAL_ERROR;
13746 	}
13747 
13748 	Zero(&t, sizeof(t));
13749 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13750 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13751 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13752 
13753 	// RPC call
13754 	ret = ScGetLink(ps->Rpc, &t);
13755 
13756 	if (ret != ERR_NO_ERROR)
13757 	{
13758 		// An error has occured
13759 		CmdPrintError(c, ret);
13760 		FreeParamValueList(o);
13761 		FreeX(x);
13762 		return ret;
13763 	}
13764 	else
13765 	{
13766 		// Data change
13767 		if (t.ServerCert != NULL)
13768 		{
13769 			FreeX(t.ServerCert);
13770 		}
13771 		t.ServerCert = x;
13772 
13773 		ret = ScSetLink(ps->Rpc, &t);
13774 		if (ret != ERR_NO_ERROR)
13775 		{
13776 			// An error has occured
13777 			CmdPrintError(c, ret);
13778 			FreeParamValueList(o);
13779 			return ret;
13780 		}
13781 
13782 		FreeRpcCreateLink(&t);
13783 	}
13784 
13785 	FreeParamValueList(o);
13786 
13787 	return 0;
13788 }
13789 
13790 // Delete the server-specific certificate of cascade connection
PsCascadeServerCertDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13791 UINT PsCascadeServerCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13792 {
13793 	LIST *o;
13794 	PS *ps = (PS *)param;
13795 	UINT ret = 0;
13796 	RPC_CREATE_LINK t;
13797 	// Parameter list that can be specified
13798 	PARAM args[] =
13799 	{
13800 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13801 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13802 	};
13803 
13804 	// If virtual HUB is not selected, it's an error
13805 	if (ps->HubName == NULL)
13806 	{
13807 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13808 		return ERR_INVALID_PARAMETER;
13809 	}
13810 
13811 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13812 	if (o == NULL)
13813 	{
13814 		return ERR_INVALID_PARAMETER;
13815 	}
13816 
13817 	Zero(&t, sizeof(t));
13818 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13819 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13820 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13821 
13822 	// RPC call
13823 	ret = ScGetLink(ps->Rpc, &t);
13824 
13825 	if (ret != ERR_NO_ERROR)
13826 	{
13827 		// An error has occured
13828 		CmdPrintError(c, ret);
13829 		FreeParamValueList(o);
13830 		return ret;
13831 	}
13832 	else
13833 	{
13834 		// Data change
13835 		if (t.ServerCert != NULL)
13836 		{
13837 			FreeX(t.ServerCert);
13838 		}
13839 		t.ServerCert = NULL;
13840 
13841 		ret = ScSetLink(ps->Rpc, &t);
13842 		if (ret != ERR_NO_ERROR)
13843 		{
13844 			// An error has occured
13845 			CmdPrintError(c, ret);
13846 			FreeParamValueList(o);
13847 			return ret;
13848 		}
13849 
13850 		FreeRpcCreateLink(&t);
13851 	}
13852 
13853 	FreeParamValueList(o);
13854 
13855 	return 0;
13856 }
13857 
13858 // Get the server-specific certificate of cascade connection
PsCascadeServerCertGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13859 UINT PsCascadeServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13860 {
13861 	LIST *o;
13862 	PS *ps = (PS *)param;
13863 	UINT ret = 0;
13864 	RPC_CREATE_LINK t;
13865 	// Parameter list that can be specified
13866 	PARAM args[] =
13867 	{
13868 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13869 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13870 		{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
13871 	};
13872 
13873 	// If virtual HUB is not selected, it's an error
13874 	if (ps->HubName == NULL)
13875 	{
13876 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13877 		return ERR_INVALID_PARAMETER;
13878 	}
13879 
13880 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13881 	if (o == NULL)
13882 	{
13883 		return ERR_INVALID_PARAMETER;
13884 	}
13885 
13886 	Zero(&t, sizeof(t));
13887 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13888 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13889 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13890 
13891 	// RPC call
13892 	ret = ScGetLink(ps->Rpc, &t);
13893 
13894 	if (ret != ERR_NO_ERROR)
13895 	{
13896 		// An error has occured
13897 		CmdPrintError(c, ret);
13898 		FreeParamValueList(o);
13899 		return ret;
13900 	}
13901 	else
13902 	{
13903 		// Save the certificate
13904 		if (t.ServerCert == NULL)
13905 		{
13906 			c->Write(c, _UU("CMD_CERT_NOT_EXISTS"));
13907 			ret = ERR_INTERNAL_ERROR;
13908 		}
13909 		else
13910 		{
13911 			if (XToFileW(t.ServerCert, GetParamUniStr(o, "SAVECERT"), true) == false)
13912 			{
13913 				c->Write(c, _UU("CMD_SAVECERT_FAILED"));
13914 				ret = ERR_INTERNAL_ERROR;
13915 			}
13916 		}
13917 
13918 		FreeRpcCreateLink(&t);
13919 	}
13920 
13921 	FreeParamValueList(o);
13922 
13923 	return ret;
13924 }
13925 
13926 // Set the advanced settings of the cascade connection
PsCascadeDetailSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13927 UINT PsCascadeDetailSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13928 {
13929 	LIST *o;
13930 	PS *ps = (PS *)param;
13931 	UINT ret = 0;
13932 	RPC_CREATE_LINK t;
13933 	CMD_EVAL_MIN_MAX mm_maxtcp =
13934 	{
13935 		"CMD_CascadeDetailSet_Eval_MaxTcp", 1, 32
13936 	};
13937 	CMD_EVAL_MIN_MAX mm_interval =
13938 	{
13939 		"CMD_CascadeDetailSet_Eval_Interval", 1, 4294967295UL
13940 	};
13941 	// Parameter list that can be specified
13942 	PARAM args[] =
13943 	{
13944 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13945 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13946 		{"MAXTCP", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_MaxTcp"), CmdEvalMinMax, &mm_maxtcp},
13947 		{"INTERVAL", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_Interval"), CmdEvalMinMax, &mm_interval},
13948 		{"TTL", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_TTL"), NULL, NULL},
13949 		{"HALF", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_HALF"), NULL, NULL},
13950 		{"NOQOS", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_NOQOS"), NULL, NULL},
13951 	};
13952 
13953 	// If virtual HUB is not selected, it's an error
13954 	if (ps->HubName == NULL)
13955 	{
13956 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13957 		return ERR_INVALID_PARAMETER;
13958 	}
13959 
13960 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13961 	if (o == NULL)
13962 	{
13963 		return ERR_INVALID_PARAMETER;
13964 	}
13965 
13966 	Zero(&t, sizeof(t));
13967 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13968 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13969 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13970 
13971 	// RPC call
13972 	ret = ScGetLink(ps->Rpc, &t);
13973 
13974 	if (ret != ERR_NO_ERROR)
13975 	{
13976 		// An error has occured
13977 		CmdPrintError(c, ret);
13978 		FreeParamValueList(o);
13979 		return ret;
13980 	}
13981 	else
13982 	{
13983 		// Data change
13984 		t.ClientOption->MaxConnection = GetParamInt(o, "MAXTCP");
13985 		t.ClientOption->AdditionalConnectionInterval = GetParamInt(o, "INTERVAL");
13986 		t.ClientOption->ConnectionDisconnectSpan = GetParamInt(o, "TTL");
13987 		t.ClientOption->HalfConnection = GetParamYes(o, "HALF");
13988 		t.ClientOption->DisableQoS = GetParamYes(o, "NOQOS");
13989 
13990 		ret = ScSetLink(ps->Rpc, &t);
13991 		if (ret != ERR_NO_ERROR)
13992 		{
13993 			// An error has occured
13994 			CmdPrintError(c, ret);
13995 			FreeParamValueList(o);
13996 			return ret;
13997 		}
13998 
13999 		FreeRpcCreateLink(&t);
14000 	}
14001 
14002 	FreeParamValueList(o);
14003 
14004 	return 0;
14005 }
14006 
14007 // Show a security policy
PrintPolicy(CONSOLE * c,POLICY * pol,bool cascade_mode)14008 void PrintPolicy(CONSOLE *c, POLICY *pol, bool cascade_mode)
14009 {
14010 	UINT i;
14011 	CT *ct;
14012 	PACK *p;
14013 	// Validate arguments
14014 	if (c == NULL || pol == NULL)
14015 	{
14016 		return;
14017 	}
14018 
14019 	ct = CtNew();
14020 	CtInsertColumn(ct, _UU("CMD_PolicyList_Column_1"), false);
14021 	CtInsertColumn(ct, _UU("CMD_PolicyList_Column_2"), false);
14022 	CtInsertColumn(ct, _UU("CMD_PolicyList_Column_3"), false);
14023 
14024 	p = NewPack();
14025 	OutRpcPolicy(p, pol);
14026 
14027 	// Show the list of all policies
14028 	for (i = 0; i < PolicyNum();i++)
14029 	{
14030 		char name[64];
14031 		wchar_t *tmp;
14032 
14033 		if (cascade_mode == false || PolicyIsSupportedForCascade(i))
14034 		{
14035 			wchar_t value_str[256];
14036 			UINT value;
14037 			char tmp2[256];
14038 
14039 			Format(tmp2, sizeof(tmp2), "policy:%s", PolicyIdToStr(i));
14040 			value = PackGetInt(p, tmp2);
14041 
14042 			tmp = CopyStrToUni(PolicyIdToStr(i));
14043 
14044 			FormatPolicyValue(value_str, sizeof(value_str),
14045 				i, value);
14046 
14047 			Format(name, sizeof(name), "POL_%u", i);
14048 			CtInsert(ct, tmp, _UU(name), value_str);
14049 
14050 			Free(tmp);
14051 		}
14052 	}
14053 
14054 	FreePack(p);
14055 
14056 	CtFree(ct, c);
14057 }
14058 
14059 // Show the security policy list
PrintPolicyList(CONSOLE * c,char * name)14060 void PrintPolicyList(CONSOLE *c, char *name)
14061 {
14062 	UINT id;
14063 	// Validate arguments
14064 	if (c == NULL)
14065 	{
14066 		return;
14067 	}
14068 	if (IsEmptyStr(name))
14069 	{
14070 		name = NULL;
14071 	}
14072 
14073 	if (name != NULL)
14074 	{
14075 		id = PolicyStrToId(name);
14076 		if (id == INFINITE)
14077 		{
14078 			// Invalid ID
14079 			c->Write(c, _UU("CMD_PolicyList_Invalid_Name"));
14080 		}
14081 		else
14082 		{
14083 			wchar_t tmp[MAX_SIZE];
14084 			wchar_t tmp2[MAX_SIZE];
14085 			char name1[64], name2[64];
14086 			wchar_t *title, *descript;
14087 			wchar_t policy_name[MAX_SIZE];
14088 
14089 			Format(name1, sizeof(name1), "POL_%u", id);
14090 			Format(name2, sizeof(name2), "POL_EX_%u", id);
14091 
14092 			title = _UU(name1);
14093 			descript = _UU(name2);
14094 
14095 			StrToUni(policy_name, sizeof(policy_name), PolicyIdToStr(id));
14096 
14097 			// Policy name
14098 			c->Write(c, _UU("CMD_PolicyList_Help_1"));
14099 			UniFormat(tmp2, sizeof(tmp2), L" %s", policy_name);
14100 			c->Write(c, tmp2);
14101 			c->Write(c, L"");
14102 
14103 			// Simple description of the policy
14104 			c->Write(c, _UU("CMD_PolicyList_Help_2"));
14105 			UniFormat(tmp2, sizeof(tmp2), L" %s", title);
14106 			c->Write(c, tmp2);
14107 			c->Write(c, L"");
14108 
14109 			// Range of the value that can be set
14110 			GetPolicyValueRangeStr(tmp, sizeof(tmp), id);
14111 			c->Write(c, _UU("CMD_PolicyList_Help_3"));
14112 			UniFormat(tmp2, sizeof(tmp2), L" %s", tmp);
14113 			c->Write(c, tmp2);
14114 			c->Write(c, L"");
14115 
14116 			// Default value
14117 			FormatPolicyValue(tmp, sizeof(tmp), id, GetPolicyItem(id)->DefaultValue);
14118 			c->Write(c, _UU("CMD_PolicyList_Help_4"));
14119 			UniFormat(tmp2, sizeof(tmp2), L" %s", tmp);
14120 			c->Write(c, tmp2);
14121 			c->Write(c, L"");
14122 
14123 			// Detailed description of the policy
14124 			c->Write(c, _UU("CMD_PolicyList_Help_5"));
14125 			c->Write(c, descript);
14126 			c->Write(c, L"");
14127 		}
14128 	}
14129 	else
14130 	{
14131 		UINT i;
14132 		CT *ct = CtNew();
14133 		CtInsertColumn(ct, _UU("CMD_PolicyList_Column_1"), false);
14134 		CtInsertColumn(ct, _UU("CMD_PolicyList_Column_2"), false);
14135 
14136 		// Show the list of all policies
14137 		for (i = 0; i < PolicyNum();i++)
14138 		{
14139 			char name[64];
14140 			wchar_t *tmp;
14141 
14142 			tmp = CopyStrToUni(PolicyIdToStr(i));
14143 
14144 			Format(name, sizeof(name), "POL_%u", i);
14145 			CtInsert(ct, tmp, _UU(name));
14146 
14147 			Free(tmp);
14148 		}
14149 
14150 		CtFree(ct, c);
14151 	}
14152 }
14153 
14154 // Editing the contents of the policy
EditPolicy(CONSOLE * c,POLICY * pol,char * name,char * value,bool cascade_mode)14155 bool EditPolicy(CONSOLE *c, POLICY *pol, char *name, char *value, bool cascade_mode)
14156 {
14157 	PACK *p;
14158 	ELEMENT *e;
14159 	POLICY_ITEM *item;
14160 	UINT id;
14161 	wchar_t tmp[MAX_SIZE];
14162 	wchar_t tmp2[MAX_SIZE];
14163 	char pack_name[128];
14164 	// Validate arguments
14165 	if (c == NULL || pol == NULL || name == NULL || value == NULL)
14166 	{
14167 		return false;
14168 	}
14169 
14170 	p = NewPack();
14171 
14172 	OutRpcPolicy(p, pol);
14173 
14174 	Format(pack_name, sizeof(pack_name), "policy:%s", PolicyIdToStr(PolicyStrToId(name)));
14175 
14176 	if ((e = GetElement(p, pack_name, VALUE_INT)) == NULL || (id = PolicyStrToId(name)) == INFINITE)
14177 	{
14178 		UniFormat(tmp, sizeof(tmp), _UU("CMD_CascadePolicySet_Invalid_Name"), name);
14179 		c->Write(c, tmp);
14180 		FreePack(p);
14181 		return false;
14182 	}
14183 
14184 	if (cascade_mode && (PolicyIsSupportedForCascade(id) == false))
14185 	{
14186 		UniFormat(tmp, sizeof(tmp), _UU("CMD_CascadePolicySet_Invalid_Name_For_Cadcade"), name);
14187 		c->Write(c, tmp);
14188 		FreePack(p);
14189 		return false;
14190 	}
14191 
14192 	item = GetPolicyItem(id);
14193 
14194 	if (item->TypeInt == false)
14195 	{
14196 		// bool type
14197 		e->values[0]->IntValue = (
14198 			StartWith(value, "y") || StartWith(value, "t") ||
14199 			ToInt(value) != 0) ? 1 : 0;
14200 	}
14201 	else
14202 	{
14203 		UINT n = ToInt(value);
14204 		bool b = true;
14205 
14206 		// int type
14207 		GetPolicyValueRangeStr(tmp, sizeof(tmp), id);
14208 
14209 		if (item->AllowZero == false)
14210 		{
14211 			if (n == 0)
14212 			{
14213 				b = false;
14214 			}
14215 		}
14216 
14217 		if (n != 0 && (n < item->MinValue || n > item->MaxValue))
14218 		{
14219 			b = false;
14220 		}
14221 
14222 		if (b == false)
14223 		{
14224 			UniFormat(tmp2, sizeof(tmp2), _UU("CMD_CascadePolicySet_Invalid_Range"), PolicyIdToStr(id), tmp);
14225 			c->Write(c, tmp2);
14226 			FreePack(p);
14227 			return false;
14228 		}
14229 
14230 		e->values[0]->IntValue = n;
14231 	}
14232 
14233 	Zero(pol, sizeof(POLICY));
14234 
14235 	InRpcPolicy(pol, p);
14236 
14237 	FreePack(p);
14238 
14239 	return true;
14240 }
14241 
14242 // Show the list of the type of security policy and possible values
PsPolicyList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14243 UINT PsPolicyList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14244 {
14245 	LIST *o;
14246 	PARAM args[] =
14247 	{
14248 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14249 		{"[name]", NULL, NULL, NULL, NULL}
14250 	};
14251 
14252 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14253 	if (o == NULL)
14254 	{
14255 		return ERR_INVALID_PARAMETER;
14256 	}
14257 
14258 	PrintPolicyList(c, GetParamStr(o, "[name]"));
14259 
14260 	FreeParamValueList(o);
14261 
14262 	return ERR_NO_ERROR;
14263 }
14264 
14265 // Set the security policy of the cascade session
PsCascadePolicySet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14266 UINT PsCascadePolicySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14267 {
14268 	LIST *o;
14269 	PS *ps = (PS *)param;
14270 	UINT ret = 0;
14271 	RPC_CREATE_LINK t;
14272 	// Parameter list that can be specified
14273 	PARAM args[] =
14274 	{
14275 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14276 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
14277 		{"NAME", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLNAME"), CmdEvalNotEmpty, NULL},
14278 		{"VALUE", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLVALUE"), CmdEvalNotEmpty, NULL},
14279 	};
14280 
14281 	// If virtual HUB is not selected, it's an error
14282 	if (ps->HubName == NULL)
14283 	{
14284 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
14285 		return ERR_INVALID_PARAMETER;
14286 	}
14287 
14288 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14289 	if (o == NULL)
14290 	{
14291 		return ERR_INVALID_PARAMETER;
14292 	}
14293 
14294 	Zero(&t, sizeof(t));
14295 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
14296 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
14297 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
14298 
14299 	// RPC call
14300 	ret = ScGetLink(ps->Rpc, &t);
14301 
14302 	if (ret != ERR_NO_ERROR)
14303 	{
14304 		// An error has occured
14305 		CmdPrintError(c, ret);
14306 		FreeParamValueList(o);
14307 		return ret;
14308 	}
14309 	else
14310 	{
14311 		if (EditPolicy(c, &t.Policy, GetParamStr(o, "NAME"), GetParamStr(o, "VALUE"), true) == false)
14312 		{
14313 			// An error has occured
14314 			FreeRpcCreateLink(&t);
14315 			FreeParamValueList(o);
14316 			return ERR_INTERNAL_ERROR;
14317 		}
14318 
14319 		ret = ScSetLink(ps->Rpc, &t);
14320 		if (ret != ERR_NO_ERROR)
14321 		{
14322 			// An error has occured
14323 			CmdPrintError(c, ret);
14324 			FreeParamValueList(o);
14325 			return ret;
14326 		}
14327 
14328 		FreeRpcCreateLink(&t);
14329 	}
14330 
14331 	FreeParamValueList(o);
14332 
14333 	return 0;
14334 }
14335 
14336 // Display the status information of the session
CmdPrintStatusToListView(CT * ct,RPC_CLIENT_GET_CONNECTION_STATUS * s)14337 void CmdPrintStatusToListView(CT *ct, RPC_CLIENT_GET_CONNECTION_STATUS *s)
14338 {
14339 	CmdPrintStatusToListViewEx(ct, s, false);
14340 }
CmdPrintStatusToListViewEx(CT * ct,RPC_CLIENT_GET_CONNECTION_STATUS * s,bool server_mode)14341 void CmdPrintStatusToListViewEx(CT *ct, RPC_CLIENT_GET_CONNECTION_STATUS *s, bool server_mode)
14342 {
14343 	wchar_t tmp[MAX_SIZE];
14344 	char str[MAX_SIZE];
14345 	char vv[128];
14346 	// Validate arguments
14347 	if (s == NULL)
14348 	{
14349 		return;
14350 	}
14351 
14352 	if (server_mode == false)
14353 	{
14354 		CtInsert(ct, _UU("CM_ST_ACCOUNT_NAME"), s->AccountName);
14355 
14356 		if (s->Connected == false)
14357 		{
14358 			wchar_t *st = _UU("CM_ST_CONNECTED_FALSE");
14359 			switch (s->SessionStatus)
14360 			{
14361 			case CLIENT_STATUS_CONNECTING:
14362 				st = _UU("CM_ST_CONNECTING");
14363 				break;
14364 			case CLIENT_STATUS_NEGOTIATION:
14365 				st = _UU("CM_ST_NEGOTIATION");
14366 				break;
14367 			case CLIENT_STATUS_AUTH:
14368 				st = _UU("CM_ST_AUTH");
14369 				break;
14370 			case CLIENT_STATUS_ESTABLISHED:
14371 				st = _UU("CM_ST_ESTABLISHED");
14372 				break;
14373 			case CLIENT_STATUS_RETRY:
14374 				st = _UU("CM_ST_RETRY");
14375 				break;
14376 			case CLIENT_STATUS_IDLE:
14377 				st = _UU("CM_ST_IDLE");
14378 				break;
14379 			}
14380 			CtInsert(ct, _UU("CM_ST_CONNECTED"), st);
14381 		}
14382 		else
14383 		{
14384 			CtInsert(ct, _UU("CM_ST_CONNECTED"), _UU("CM_ST_CONNECTED_TRUE"));
14385 		}
14386 	}
14387 
14388 	if (s->Connected)
14389 	{
14390 		if (s->VLanId == 0)
14391 		{
14392 			UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_NO_VLAN"));
14393 		}
14394 		else
14395 		{
14396 			UniToStru(tmp, s->VLanId);
14397 		}
14398 
14399 		CtInsert(ct, _UU("CM_ST_VLAN_ID"), tmp);
14400 
14401 		if (server_mode == false)
14402 		{
14403 			StrToUni(tmp, sizeof(tmp), s->ServerName);
14404 			CtInsert(ct, _UU("CM_ST_SERVER_NAME"), tmp);
14405 
14406 			UniFormat(tmp, sizeof(tmp), _UU("CM_ST_PORT_TCP"), s->ServerPort);
14407 			CtInsert(ct, _UU("CM_ST_SERVER_PORT"), tmp);
14408 		}
14409 
14410 		StrToUni(tmp, sizeof(tmp), s->ServerProductName);
14411 		CtInsert(ct, _UU("CM_ST_SERVER_P_NAME"), tmp);
14412 
14413 		UniFormat(tmp, sizeof(tmp), L"%u.%02u", s->ServerProductVer / 100, s->ServerProductVer % 100);
14414 		CtInsert(ct, _UU("CM_ST_SERVER_P_VER"), tmp);
14415 		UniFormat(tmp, sizeof(tmp), L"Build %u", s->ServerProductBuild);
14416 		CtInsert(ct, _UU("CM_ST_SERVER_P_BUILD"), tmp);
14417 	}
14418 
14419 	GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->StartTime), NULL);
14420 	CtInsert(ct, _UU("CM_ST_START_TIME"), tmp);
14421 	GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->FirstConnectionEstablisiedTime), NULL);
14422 	CtInsert(ct, _UU("CM_ST_FIRST_ESTAB_TIME"), s->FirstConnectionEstablisiedTime == 0 ? _UU("CM_ST_NONE") : tmp);
14423 
14424 	if (s->Connected)
14425 	{
14426 		GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->CurrentConnectionEstablishTime), NULL);
14427 		CtInsert(ct, _UU("CM_ST_CURR_ESTAB_TIME"), tmp);
14428 	}
14429 
14430 	if (server_mode == false)
14431 	{
14432 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_STR"), s->NumConnectionsEatablished);
14433 		CtInsert(ct, _UU("CM_ST_NUM_ESTABLISHED"), tmp);
14434 	}
14435 
14436 	if (s->Connected)
14437 	{
14438 		CtInsert(ct, _UU("CM_ST_HALF_CONNECTION"), s->HalfConnection ? _UU("CM_ST_HALF_TRUE") : _UU("CM_ST_HALF_FALSE"));
14439 
14440 		CtInsert(ct, _UU("CM_ST_QOS"), s->QoS ? _UU("CM_ST_QOS_TRUE") : _UU("CM_ST_QOS_FALSE"));
14441 
14442 		UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnections);
14443 		CtInsert(ct, _UU("CM_ST_NUM_TCP"), tmp);
14444 
14445 		if (s->HalfConnection)
14446 		{
14447 			UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnectionsUpload);
14448 			CtInsert(ct, _UU("CM_ST_NUM_TCP_UPLOAD"), tmp);
14449 			UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnectionsDownload);
14450 			CtInsert(ct, _UU("CM_ST_NUM_TCP_DOWNLOAD"), tmp);
14451 		}
14452 
14453 		UniFormat(tmp, sizeof(tmp), L"%u", s->MaxTcpConnections);
14454 		CtInsert(ct, _UU("CM_ST_MAX_TCP"), tmp);
14455 
14456 		if (s->UseEncrypt == false)
14457 		{
14458 			UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_FALSE"));
14459 		}
14460 		else
14461 		{
14462 			if (StrLen(s->CipherName) != 0)
14463 			{
14464 				UniFormat(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_TRUE"), s->CipherName);
14465 			}
14466 			else
14467 			{
14468 				UniFormat(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_TRUE2"));
14469 			}
14470 		}
14471 		CtInsert(ct, _UU("CM_ST_USE_ENCRYPT"), tmp);
14472 
14473 		if (s->UseCompress)
14474 		{
14475 			UINT percent = 0;
14476 			if ((s->TotalRecvSize + s->TotalSendSize) > 0)
14477 			{
14478 				percent = (UINT)((UINT64)100 - (UINT64)(s->TotalRecvSizeReal + s->TotalSendSizeReal) * (UINT64)100 /
14479 					(s->TotalRecvSize + s->TotalSendSize));
14480 				percent = MAKESURE(percent, 0, 100);
14481 			}
14482 
14483 			UniFormat(tmp, sizeof(tmp), _UU("CM_ST_COMPRESS_TRUE"), percent);
14484 		}
14485 		else
14486 		{
14487 			UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_COMPRESS_FALSE"));
14488 		}
14489 		CtInsert(ct, _UU("CM_ST_USE_COMPRESS"), tmp);
14490 
14491 		if (IsEmptyStr(s->UnderlayProtocol) == false)
14492 		{
14493 			StrToUni(tmp, sizeof(tmp), s->UnderlayProtocol);
14494 			CtInsert(ct, _UU("CM_ST_UNDERLAY_PROTOCOL"), tmp);
14495 		}
14496 
14497 		if (IsEmptyStr(s->ProtocolDetails) == false)
14498 		{
14499 			StrToUni(tmp, sizeof(tmp), s->ProtocolDetails);
14500 			CtInsert(ct, _UU("CM_ST_PROTOCOL_DETAILS"), tmp);
14501 		}
14502 
14503 		CtInsert(ct, _UU("CM_ST_UDP_ACCEL_ENABLED"), (s->IsUdpAccelerationEnabled ? _UU("CM_ST_YES") : _UU("CM_ST_NO")));
14504 		CtInsert(ct, _UU("CM_ST_UDP_ACCEL_USING"), (s->IsUsingUdpAcceleration ? _UU("CM_ST_YES") : _UU("CM_ST_NO")));
14505 
14506 		StrToUni(tmp, sizeof(tmp), s->SessionName);
14507 		CtInsert(ct, _UU("CM_ST_SESSION_NAME"), tmp);
14508 
14509 		StrToUni(tmp, sizeof(tmp), s->ConnectionName);
14510 		if (UniStrCmpi(tmp, L"INITING") != 0)
14511 		{
14512 			CtInsert(ct, _UU("CM_ST_CONNECTION_NAME"), tmp);
14513 		}
14514 
14515 		BinToStr(str, sizeof(str), s->SessionKey, sizeof(s->SessionKey));
14516 		StrToUni(tmp, sizeof(tmp), str);
14517 		CtInsert(ct, _UU("CM_ST_SESSION_KEY"), tmp);
14518 
14519 		CtInsert(ct, _UU("CM_ST_BRIDGE_MODE"), s->IsBridgeMode ? _UU("CM_ST_YES") : _UU("CM_ST_NO"));
14520 
14521 		CtInsert(ct, _UU("CM_ST_MONITOR_MODE"), s->IsMonitorMode ? _UU("CM_ST_YES") : _UU("CM_ST_NO"));
14522 
14523 		ToStr3(vv, sizeof(vv), s->TotalSendSize);
14524 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
14525 		CtInsert(ct, _UU("CM_ST_SEND_SIZE"), tmp);
14526 
14527 		ToStr3(vv, sizeof(vv), s->TotalRecvSize);
14528 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
14529 		CtInsert(ct, _UU("CM_ST_RECV_SIZE"), tmp);
14530 
14531 		ToStr3(vv, sizeof(vv), s->Traffic.Send.UnicastCount);
14532 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
14533 		CtInsert(ct, _UU("CM_ST_SEND_UCAST_NUM"), tmp);
14534 
14535 		ToStr3(vv, sizeof(vv), s->Traffic.Send.UnicastBytes);
14536 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
14537 		CtInsert(ct, _UU("CM_ST_SEND_UCAST_SIZE"), tmp);
14538 
14539 		ToStr3(vv, sizeof(vv), s->Traffic.Send.BroadcastCount);
14540 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
14541 		CtInsert(ct, _UU("CM_ST_SEND_BCAST_NUM"), tmp);
14542 
14543 		ToStr3(vv, sizeof(vv), s->Traffic.Send.BroadcastBytes);
14544 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
14545 		CtInsert(ct, _UU("CM_ST_SEND_BCAST_SIZE"), tmp);
14546 
14547 		ToStr3(vv, sizeof(vv), s->Traffic.Recv.UnicastCount);
14548 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
14549 		CtInsert(ct, _UU("CM_ST_RECV_UCAST_NUM"), tmp);
14550 
14551 		ToStr3(vv, sizeof(vv), s->Traffic.Recv.UnicastBytes);
14552 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
14553 		CtInsert(ct, _UU("CM_ST_RECV_UCAST_SIZE"), tmp);
14554 
14555 		ToStr3(vv, sizeof(vv), s->Traffic.Recv.BroadcastCount);
14556 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
14557 		CtInsert(ct, _UU("CM_ST_RECV_BCAST_NUM"), tmp);
14558 
14559 		ToStr3(vv, sizeof(vv), s->Traffic.Recv.BroadcastBytes);
14560 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
14561 		CtInsert(ct, _UU("CM_ST_RECV_BCAST_SIZE"), tmp);
14562 	}
14563 }
14564 
14565 // Get the current state of the cascade connection
PsCascadeStatusGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14566 UINT PsCascadeStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14567 {
14568 	LIST *o;
14569 	PS *ps = (PS *)param;
14570 	UINT ret = 0;
14571 	RPC_LINK_STATUS t;
14572 	// Parameter list that can be specified
14573 	PARAM args[] =
14574 	{
14575 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14576 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
14577 	};
14578 
14579 	// If virtual HUB is not selected, it's an error
14580 	if (ps->HubName == NULL)
14581 	{
14582 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
14583 		return ERR_INVALID_PARAMETER;
14584 	}
14585 
14586 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14587 	if (o == NULL)
14588 	{
14589 		return ERR_INVALID_PARAMETER;
14590 	}
14591 
14592 	Zero(&t, sizeof(t));
14593 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
14594 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
14595 
14596 	// RPC call
14597 	ret = ScGetLinkStatus(ps->Rpc, &t);
14598 
14599 	if (ret != ERR_NO_ERROR)
14600 	{
14601 		// An error has occured
14602 		CmdPrintError(c, ret);
14603 		FreeParamValueList(o);
14604 		return ret;
14605 	}
14606 	else
14607 	{
14608 		// Get the cascade connection state
14609 		CT *ct = CtNewStandard();
14610 
14611 		CmdPrintStatusToListView(ct, &t.Status);
14612 
14613 		CtFree(ct, c);
14614 
14615 		FreeRpcLinkStatus(&t);
14616 	}
14617 
14618 	FreeParamValueList(o);
14619 
14620 	return 0;
14621 }
14622 
14623 // Rename the cascade connection
PsCascadeRename(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14624 UINT PsCascadeRename(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14625 {
14626 	LIST *o;
14627 	PS *ps = (PS *)param;
14628 	UINT ret = 0;
14629 	RPC_RENAME_LINK t;
14630 	// Parameter list that can be specified
14631 	PARAM args[] =
14632 	{
14633 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14634 		{"[name]", CmdPrompt, _UU("CMD_CascadeRename_PROMPT_OLD"), CmdEvalNotEmpty, NULL},
14635 		{"NEW", CmdPrompt, _UU("CMD_CascadeRename_PROMPT_NEW"), CmdEvalNotEmpty, NULL},
14636 	};
14637 
14638 	// If virtual HUB is not selected, it's an error
14639 	if (ps->HubName == NULL)
14640 	{
14641 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
14642 		return ERR_INVALID_PARAMETER;
14643 	}
14644 
14645 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14646 	if (o == NULL)
14647 	{
14648 		return ERR_INVALID_PARAMETER;
14649 	}
14650 
14651 	Zero(&t, sizeof(t));
14652 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
14653 
14654 	UniStrCpy(t.NewAccountName, sizeof(t.NewAccountName), GetParamUniStr(o, "NEW"));
14655 	UniStrCpy(t.OldAccountName, sizeof(t.OldAccountName), GetParamUniStr(o, "[name]"));
14656 
14657 	// RPC call
14658 	ret = ScRenameLink(ps->Rpc, &t);
14659 
14660 	if (ret != ERR_NO_ERROR)
14661 	{
14662 		// An error has occured
14663 		CmdPrintError(c, ret);
14664 		FreeParamValueList(o);
14665 		return ret;
14666 	}
14667 
14668 	FreeParamValueList(o);
14669 
14670 	return 0;
14671 }
14672 
14673 // Set the cascade connection to on-line state
PsCascadeOnline(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14674 UINT PsCascadeOnline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14675 {
14676 	LIST *o;
14677 	PS *ps = (PS *)param;
14678 	UINT ret = 0;
14679 	RPC_LINK t;
14680 	// Parameter list that can be specified
14681 	PARAM args[] =
14682 	{
14683 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14684 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
14685 	};
14686 
14687 	// If virtual HUB is not selected, it's an error
14688 	if (ps->HubName == NULL)
14689 	{
14690 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
14691 		return ERR_INVALID_PARAMETER;
14692 	}
14693 
14694 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14695 	if (o == NULL)
14696 	{
14697 		return ERR_INVALID_PARAMETER;
14698 	}
14699 
14700 	Zero(&t, sizeof(t));
14701 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
14702 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
14703 
14704 	// RPC call
14705 	ret = ScSetLinkOnline(ps->Rpc, &t);
14706 
14707 	if (ret != ERR_NO_ERROR)
14708 	{
14709 		// An error has occured
14710 		CmdPrintError(c, ret);
14711 		FreeParamValueList(o);
14712 		return ret;
14713 	}
14714 
14715 	FreeParamValueList(o);
14716 
14717 	return 0;
14718 }
14719 
14720 // Set the cascade connection to the off-line state
PsCascadeOffline(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14721 UINT PsCascadeOffline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14722 {
14723 	LIST *o;
14724 	PS *ps = (PS *)param;
14725 	UINT ret = 0;
14726 	RPC_LINK t;
14727 	// Parameter list that can be specified
14728 	PARAM args[] =
14729 	{
14730 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14731 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
14732 	};
14733 
14734 	// If virtual HUB is not selected, it's an error
14735 	if (ps->HubName == NULL)
14736 	{
14737 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
14738 		return ERR_INVALID_PARAMETER;
14739 	}
14740 
14741 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14742 	if (o == NULL)
14743 	{
14744 		return ERR_INVALID_PARAMETER;
14745 	}
14746 
14747 	Zero(&t, sizeof(t));
14748 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
14749 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
14750 
14751 	// RPC call
14752 	ret = ScSetLinkOffline(ps->Rpc, &t);
14753 
14754 	if (ret != ERR_NO_ERROR)
14755 	{
14756 		// An error has occured
14757 		CmdPrintError(c, ret);
14758 		FreeParamValueList(o);
14759 		return ret;
14760 	}
14761 
14762 	FreeParamValueList(o);
14763 
14764 	return 0;
14765 }
14766 
14767 // Convert the string to pass / discard flag
StrToPassOrDiscard(char * str)14768 bool StrToPassOrDiscard(char *str)
14769 {
14770 	// Validate arguments
14771 	if (str == NULL)
14772 	{
14773 		return false;
14774 	}
14775 
14776 	if (ToInt(str) != 0)
14777 	{
14778 		return true;
14779 	}
14780 
14781 	if (StartWith(str, "p") || StartWith(str, "y") || StartWith(str, "t"))
14782 	{
14783 		return true;
14784 	}
14785 
14786 	return false;
14787 }
14788 
14789 // Convert the string to the protocol
StrToProtocol(char * str)14790 UINT StrToProtocol(char *str)
14791 {
14792 	if (IsEmptyStr(str))
14793 	{
14794 		return 0;
14795 	}
14796 
14797 	if (StartWith("ip", str))
14798 	{
14799 		return 0;
14800 	}
14801 	else if (StartWith("tcp", str))
14802 	{
14803 		return IP_PROTO_TCP;
14804 	}
14805 	else if (StartWith("udp", str))
14806 	{
14807 		return IP_PROTO_UDP;
14808 	}
14809 	else if (StartWith("icmpv4", str))
14810 	{
14811 		return IP_PROTO_ICMPV4;
14812 	}
14813 	else if (StartWith("icmpv6", str))
14814 	{
14815 		return IP_PROTO_ICMPV6;
14816 	}
14817 
14818 	if (ToInt(str) == 0)
14819 	{
14820 		if (StrCmpi(str, "0") == 0)
14821 		{
14822 			return 0;
14823 		}
14824 		else
14825 		{
14826 			return INFINITE;
14827 		}
14828 	}
14829 
14830 	if (ToInt(str) >= 256)
14831 	{
14832 		return INFINITE;
14833 	}
14834 
14835 	return ToInt(str);
14836 }
14837 
14838 // Check the protocol name
CmdEvalProtocol(CONSOLE * c,wchar_t * str,void * param)14839 bool CmdEvalProtocol(CONSOLE *c, wchar_t *str, void *param)
14840 {
14841 	char tmp[64];
14842 	// Validate arguments
14843 	if (c == NULL || str == NULL)
14844 	{
14845 		return false;
14846 	}
14847 
14848 	UniToStr(tmp, sizeof(tmp), str);
14849 
14850 	if (StrToProtocol(tmp) == INFINITE)
14851 	{
14852 		c->Write(c, _UU("CMD_PROTOCOL_EVAL_FAILED"));
14853 		return false;
14854 	}
14855 
14856 	return true;
14857 }
14858 
14859 // Parse the port range
ParsePortRange(char * str,UINT * start,UINT * end)14860 bool ParsePortRange(char *str, UINT *start, UINT *end)
14861 {
14862 	UINT a = 0, b = 0;
14863 	TOKEN_LIST *t;
14864 	// Validate arguments
14865 	if (str == NULL)
14866 	{
14867 		return false;
14868 	}
14869 
14870 	if (IsEmptyStr(str) == false)
14871 	{
14872 
14873 		t = ParseToken(str, "\t -");
14874 
14875 		if (t->NumTokens == 1)
14876 		{
14877 			a = b = ToInt(t->Token[0]);
14878 		}
14879 		else if (t->NumTokens == 2)
14880 		{
14881 			a = ToInt(t->Token[0]);
14882 			b = ToInt(t->Token[1]);
14883 		}
14884 
14885 		FreeToken(t);
14886 
14887 		if (a > b)
14888 		{
14889 			return false;
14890 		}
14891 
14892 		if (a >= 65536 || b >= 65536)
14893 		{
14894 			return false;
14895 		}
14896 
14897 		if (a == 0 && b != 0)
14898 		{
14899 			return false;
14900 		}
14901 	}
14902 
14903 	if (start != NULL)
14904 	{
14905 		*start = a;
14906 	}
14907 	if (end != NULL)
14908 	{
14909 		*end = b;
14910 	}
14911 
14912 	return true;
14913 }
14914 
14915 // Check the port range
CmdEvalPortRange(CONSOLE * c,wchar_t * str,void * param)14916 bool CmdEvalPortRange(CONSOLE *c, wchar_t *str, void *param)
14917 {
14918 	char tmp[64];
14919 	// Validate arguments
14920 	if (c == NULL || str == NULL)
14921 	{
14922 		return false;
14923 	}
14924 
14925 	UniToStr(tmp, sizeof(tmp), str);
14926 
14927 	if (ParsePortRange(tmp, NULL, NULL) == false)
14928 	{
14929 		c->Write(c, _UU("CMD_PORT_RANGE_EVAL_FAILED"));
14930 		return false;
14931 	}
14932 
14933 	return true;
14934 }
14935 
14936 // Parse the MAC address and the mask
ParseMacAddressAndMask(char * src,bool * check_mac,UCHAR * mac_bin,UCHAR * mask_bin)14937 bool ParseMacAddressAndMask(char *src, bool *check_mac, UCHAR *mac_bin, UCHAR *mask_bin)
14938 {
14939 	TOKEN_LIST *t;
14940 	char *macstr, *maskstr;
14941 	UCHAR mac[6], mask[6];
14942 	bool ok = false;
14943 
14944 	// Validate arguments
14945 	if (src == NULL)
14946 	{
14947 		return false;
14948 	}
14949 
14950 	//Zero(mac, sizeof(mac));
14951 	//Zero(mask, sizeof(mask));
14952 
14953 	if(check_mac != NULL && mac_bin != NULL && mask_bin != NULL)
14954 	{
14955 		ok = true;
14956 	}
14957 	if(IsEmptyStr(src) != false)
14958 	{
14959 		if(ok != false)
14960 		{
14961 			*check_mac = false;
14962 			Zero(mac_bin, 6);
14963 			Zero(mask_bin, 6);
14964 		}
14965 		return true;
14966 	}
14967 
14968 	t = ParseToken(src, "/");
14969 	if(t->NumTokens != 2)
14970 	{
14971 		FreeToken(t);
14972 		return false;
14973 	}
14974 
14975 	macstr = t->Token[0];
14976 	maskstr = t->Token[1];
14977 
14978 	Trim(macstr);
14979 	Trim(maskstr);
14980 
14981 	if(StrToMac(mac, macstr) == false || StrToMac(mask, maskstr) == false)
14982 	{
14983 		FreeToken(t);
14984 		return false;
14985 	}
14986 	else
14987 	{
14988 		if(ok != false)
14989 		{
14990 			Copy(mac_bin, mac, 6);
14991 			Copy(mask_bin, mask, 6);
14992 			*check_mac = true;
14993 		}
14994 	}
14995 	FreeToken(t);
14996 
14997 	return true;
14998 }
14999 
15000 // Check the MAC address and mask
CmdEvalMacAddressAndMask(CONSOLE * c,wchar_t * str,void * param)15001 bool CmdEvalMacAddressAndMask(CONSOLE *c, wchar_t *str, void *param)
15002 {
15003 	char tmp[64];
15004 	// Validate arguments
15005 	if(c == NULL || str == NULL)
15006 	{
15007 		return false;
15008 	}
15009 
15010 	UniToStr(tmp, sizeof(tmp), str);
15011 
15012 
15013 	if(ParseMacAddressAndMask(tmp, NULL, NULL, NULL) == false)
15014 	{
15015 		c->Write(c, _UU("CMD_MAC_ADDRESS_AND_MASK_EVAL_FAILED"));
15016 		return false;
15017 	}
15018 
15019 	return true;
15020 }
15021 // Parse the status of TCP connection
ParseTcpState(char * src,bool * check_tcp_state,bool * established)15022 bool ParseTcpState(char *src, bool *check_tcp_state, bool *established)
15023 {
15024 	bool ok = false;
15025 	// Validate arguments
15026 	if(src == NULL)
15027 	{
15028 		return false;
15029 	}
15030 
15031 	if(check_tcp_state != NULL && established != NULL)
15032 	{
15033 		ok = true;
15034 	}
15035 
15036 	if (IsEmptyStr(src) == false)
15037 	{
15038 		if (StartWith("Established", src) == 0)
15039 		{
15040 			if(ok != false)
15041 			{
15042 				*check_tcp_state = true;
15043 				*established = true;
15044 			}
15045 		}
15046 		else if (StartWith("Unestablished", src) == 0)
15047 		{
15048 			if(ok != false)
15049 			{
15050 				*check_tcp_state = true;
15051 				*established = false;
15052 			}
15053 		}
15054 		else
15055 		{
15056 			// Illegal string
15057 			return false;
15058 		}
15059 	}
15060 	else
15061 	{
15062 		if(ok != false)
15063 		{
15064 			*check_tcp_state = false;
15065 			*established = false;
15066 		}
15067 	}
15068 
15069 	return true;
15070 }
15071 // Check the status of the TCP connection
CmdEvalTcpState(CONSOLE * c,wchar_t * str,void * param)15072 bool CmdEvalTcpState(CONSOLE *c, wchar_t *str, void *param)
15073 {
15074 	char tmp[64];
15075 	// Validate arguments
15076 	if(c == NULL || str == NULL)
15077 	{
15078 		return false;
15079 	}
15080 
15081 	UniToStr(tmp, sizeof(tmp), str);
15082 
15083 	if(ParseTcpState(tmp, NULL, NULL) == false)
15084 	{
15085 		c->Write(c, _UU("CMD_TCP_CONNECTION_STATE_EVAL_FAILED"));
15086 		return false;
15087 	}
15088 
15089 	return true;
15090 }
15091 
15092 // Adding a rule to the access list (Standard, IPv4)
PsAccessAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15093 UINT PsAccessAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15094 {
15095 	LIST *o;
15096 	PS *ps = (PS *)param;
15097 	UINT ret = 0;
15098 	RPC_ADD_ACCESS t;
15099 	ACCESS *a;
15100 	// Parameter list that can be specified
15101 	CMD_EVAL_MIN_MAX minmax =
15102 	{
15103 		"CMD_AccessAdd_Eval_PRIORITY", 1, 4294967295UL,
15104 	};
15105 	PARAM args[] =
15106 	{
15107 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
15108 		{"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TYPE"), CmdEvalNotEmpty, NULL},
15109 		{"MEMO", CmdPrompt, _UU("CMD_AccessAdd_Prompt_MEMO"), NULL, NULL},
15110 		{"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},
15111 		{"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCUSERNAME"), NULL, NULL},
15112 		{"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTUSERNAME"), NULL, NULL},
15113 		{"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},
15114 		{"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},
15115 		{"SRCIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCIP"), CmdEvalIpAndMask4, NULL},
15116 		{"DESTIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTIP"), CmdEvalIpAndMask4, NULL},
15117 		{"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},
15118 		{"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCPORT"), CmdEvalPortRange, NULL},
15119 		{"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTPORT"), CmdEvalPortRange, NULL},
15120 		{"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},
15121 	};
15122 
15123 	// If virtual HUB is not selected, it's an error
15124 	if (ps->HubName == NULL)
15125 	{
15126 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
15127 		return ERR_INVALID_PARAMETER;
15128 	}
15129 
15130 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
15131 	if (o == NULL)
15132 	{
15133 		return ERR_INVALID_PARAMETER;
15134 	}
15135 
15136 	Zero(&t, sizeof(t));
15137 	a = &t.Access;
15138 
15139 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
15140 	UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));
15141 	a->Active = true;
15142 	a->Priority = GetParamInt(o, "PRIORITY");
15143 	a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;
15144 	StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));
15145 	StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));
15146 	ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);
15147 	ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);
15148 	ParseIpAndMask4(GetParamStr(o, "SRCIP"), &a->SrcIpAddress, &a->SrcSubnetMask);
15149 	ParseIpAndMask4(GetParamStr(o, "DESTIP"), &a->DestIpAddress, &a->DestSubnetMask);
15150 	a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));
15151 	ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);
15152 	ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);
15153 	ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);
15154 
15155 	// RPC call
15156 	ret = ScAddAccess(ps->Rpc, &t);
15157 
15158 	if (ret != ERR_NO_ERROR)
15159 	{
15160 		// An error has occured
15161 		CmdPrintError(c, ret);
15162 		FreeParamValueList(o);
15163 		return ret;
15164 	}
15165 
15166 	FreeParamValueList(o);
15167 
15168 	return 0;
15169 }
15170 
15171 // Adding a rule to the access list (Extended, IPv4)
PsAccessAddEx(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15172 UINT PsAccessAddEx(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15173 {
15174 	LIST *o;
15175 	PS *ps = (PS *)param;
15176 	UINT ret = 0;
15177 	RPC_ADD_ACCESS t;
15178 	ACCESS *a;
15179 	// Parameter list that can be specified
15180 	CMD_EVAL_MIN_MAX minmax =
15181 	{
15182 		"CMD_AccessAdd_Eval_PRIORITY", 1, 4294967295UL,
15183 	};
15184 	CMD_EVAL_MIN_MAX minmax_delay =
15185 	{
15186 		"CMD_AccessAddEx_Eval_DELAY", 0, HUB_ACCESSLIST_DELAY_MAX,
15187 	};
15188 	CMD_EVAL_MIN_MAX minmax_jitter =
15189 	{
15190 		"CMD_AccessAddEx_Eval_JITTER", 0, HUB_ACCESSLIST_JITTER_MAX,
15191 	};
15192 	CMD_EVAL_MIN_MAX minmax_loss =
15193 	{
15194 		"CMD_AccessAddEx_Eval_LOSS", 0, HUB_ACCESSLIST_LOSS_MAX,
15195 	};
15196 	PARAM args[] =
15197 	{
15198 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
15199 		{"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TYPE"), CmdEvalNotEmpty, NULL},
15200 		{"MEMO", CmdPrompt, _UU("CMD_AccessAdd_Prompt_MEMO"), NULL, NULL},
15201 		{"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},
15202 		{"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCUSERNAME"), NULL, NULL},
15203 		{"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTUSERNAME"), NULL, NULL},
15204 		{"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},
15205 		{"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},
15206 		{"SRCIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCIP"), CmdEvalIpAndMask4, NULL},
15207 		{"DESTIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTIP"), CmdEvalIpAndMask4, NULL},
15208 		{"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},
15209 		{"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCPORT"), CmdEvalPortRange, NULL},
15210 		{"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTPORT"), CmdEvalPortRange, NULL},
15211 		{"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},
15212 		{"DELAY", CmdPrompt, _UU("CMD_AccessAddEx_Prompt_DELAY"), CmdEvalMinMax, &minmax_delay},
15213 		{"JITTER", CmdPrompt, _UU("CMD_AccessAddEx_Prompt_JITTER"), CmdEvalMinMax, &minmax_jitter},
15214 		{"LOSS", CmdPrompt, _UU("CMD_AccessAddEx_Prompt_LOSS"), CmdEvalMinMax, &minmax_loss},
15215 		{"REDIRECTURL", NULL, NULL, NULL, NULL},
15216 	};
15217 
15218 	// If virtual HUB is not selected, it's an error
15219 	if (ps->HubName == NULL)
15220 	{
15221 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
15222 		return ERR_INVALID_PARAMETER;
15223 	}
15224 
15225 	// Check whether it is supported
15226 	if (GetCapsBool(ps->CapsList, "b_support_ex_acl") == false)
15227 	{
15228 		c->Write(c, _E(ERR_NOT_SUPPORTED));
15229 		return ERR_NOT_SUPPORTED;
15230 	}
15231 
15232 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
15233 	if (o == NULL)
15234 	{
15235 		return ERR_INVALID_PARAMETER;
15236 	}
15237 
15238 	Zero(&t, sizeof(t));
15239 	a = &t.Access;
15240 
15241 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
15242 	UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));
15243 	a->Active = true;
15244 	a->Priority = GetParamInt(o, "PRIORITY");
15245 	a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;
15246 	StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));
15247 	StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));
15248 	ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);
15249 	ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);
15250 	ParseIpAndMask4(GetParamStr(o, "SRCIP"), &a->SrcIpAddress, &a->SrcSubnetMask);
15251 	ParseIpAndMask4(GetParamStr(o, "DESTIP"), &a->DestIpAddress, &a->DestSubnetMask);
15252 	a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));
15253 	ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);
15254 	ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);
15255 	ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);
15256 	a->Delay = GetParamInt(o, "DELAY");
15257 	a->Jitter = GetParamInt(o, "JITTER");
15258 	a->Loss = GetParamInt(o, "LOSS");
15259 	StrCpy(a->RedirectUrl, sizeof(a->RedirectUrl), GetParamStr(o, "REDIRECTURL"));
15260 
15261 	// RPC call
15262 	ret = ScAddAccess(ps->Rpc, &t);
15263 
15264 	if (ret != ERR_NO_ERROR)
15265 	{
15266 		// An error has occured
15267 		CmdPrintError(c, ret);
15268 		FreeParamValueList(o);
15269 		return ret;
15270 	}
15271 
15272 	FreeParamValueList(o);
15273 
15274 	return 0;
15275 }
15276 
15277 // Adding a rule to the access list (Standard, IPv6)
PsAccessAdd6(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15278 UINT PsAccessAdd6(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15279 {
15280 	LIST *o;
15281 	PS *ps = (PS *)param;
15282 	UINT ret = 0;
15283 	RPC_ADD_ACCESS t;
15284 	ACCESS *a;
15285 	IP ip, mask;
15286 	// Parameter list that can be specified
15287 	CMD_EVAL_MIN_MAX minmax =
15288 	{
15289 		"CMD_AccessAdd6_Eval_PRIORITY", 1, 4294967295UL,
15290 	};
15291 	PARAM args[] =
15292 	{
15293 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
15294 		{"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TYPE"), CmdEvalNotEmpty, NULL},
15295 		{"MEMO", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_MEMO"), NULL, NULL},
15296 		{"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},
15297 		{"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCUSERNAME"), NULL, NULL},
15298 		{"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTUSERNAME"), NULL, NULL},
15299 		{"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},
15300 		{"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},
15301 		{"SRCIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCIP"), CmdEvalIpAndMask6, NULL},
15302 		{"DESTIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTIP"), CmdEvalIpAndMask6, NULL},
15303 		{"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},
15304 		{"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCPORT"), CmdEvalPortRange, NULL},
15305 		{"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTPORT"), CmdEvalPortRange, NULL},
15306 		{"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},
15307 	};
15308 
15309 	// If virtual HUB is not selected, it's an error
15310 	if (ps->HubName == NULL)
15311 	{
15312 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
15313 		return ERR_INVALID_PARAMETER;
15314 	}
15315 
15316 	// Check whether it is supported
15317 	if (GetCapsBool(ps->CapsList, "b_support_ex_acl") == false)
15318 	{
15319 		c->Write(c, _E(ERR_NOT_SUPPORTED));
15320 		return ERR_NOT_SUPPORTED;
15321 	}
15322 
15323 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
15324 	if (o == NULL)
15325 	{
15326 		return ERR_INVALID_PARAMETER;
15327 	}
15328 
15329 	Zero(&t, sizeof(t));
15330 	a = &t.Access;
15331 
15332 	a->IsIPv6 = true;
15333 
15334 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
15335 	UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));
15336 	a->Active = true;
15337 	a->Priority = GetParamInt(o, "PRIORITY");
15338 	a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;
15339 	StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));
15340 	StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));
15341 	ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);
15342 	ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);
15343 
15344 	Zero(&ip, sizeof(ip));
15345 	Zero(&mask, sizeof(mask));
15346 
15347 	ParseIpAndMask6(GetParamStr(o, "SRCIP"), &ip, &mask);
15348 	IPToIPv6Addr(&a->SrcIpAddress6, &ip);
15349 	IPToIPv6Addr(&a->SrcSubnetMask6, &mask);
15350 
15351 	ParseIpAndMask6(GetParamStr(o, "DESTIP"), &ip, &mask);
15352 	IPToIPv6Addr(&a->DestIpAddress6, &ip);
15353 	IPToIPv6Addr(&a->DestSubnetMask6, &mask);
15354 
15355 	a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));
15356 	ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);
15357 	ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);
15358 	ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);
15359 
15360 	// RPC call
15361 	ret = ScAddAccess(ps->Rpc, &t);
15362 
15363 	if (ret != ERR_NO_ERROR)
15364 	{
15365 		// An error has occured
15366 		CmdPrintError(c, ret);
15367 		FreeParamValueList(o);
15368 		return ret;
15369 	}
15370 
15371 	FreeParamValueList(o);
15372 
15373 	return 0;
15374 }
15375 
15376 // Adding a rule to the access list (Extended, IPv6)
PsAccessAddEx6(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15377 UINT PsAccessAddEx6(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15378 {
15379 	LIST *o;
15380 	PS *ps = (PS *)param;
15381 	UINT ret = 0;
15382 	RPC_ADD_ACCESS t;
15383 	ACCESS *a;
15384 	IP ip, mask;
15385 	// Parameter list that can be specified
15386 	CMD_EVAL_MIN_MAX minmax =
15387 	{
15388 		"CMD_AccessAdd6_Eval_PRIORITY", 1, 4294967295UL,
15389 	};
15390 	CMD_EVAL_MIN_MAX minmax_delay =
15391 	{
15392 		"CMD_AccessAddEx6_Eval_DELAY", 0, HUB_ACCESSLIST_DELAY_MAX,
15393 	};
15394 	CMD_EVAL_MIN_MAX minmax_jitter =
15395 	{
15396 		"CMD_AccessAddEx6_Eval_JITTER", 0, HUB_ACCESSLIST_JITTER_MAX,
15397 	};
15398 	CMD_EVAL_MIN_MAX minmax_loss =
15399 	{
15400 		"CMD_AccessAddEx6_Eval_LOSS", 0, HUB_ACCESSLIST_LOSS_MAX,
15401 	};
15402 	PARAM args[] =
15403 	{
15404 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
15405 		{"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TYPE"), CmdEvalNotEmpty, NULL},
15406 		{"MEMO", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_MEMO"), NULL, NULL},
15407 		{"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},
15408 		{"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCUSERNAME"), NULL, NULL},
15409 		{"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTUSERNAME"), NULL, NULL},
15410 		{"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},
15411 		{"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},
15412 		{"SRCIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCIP"), CmdEvalIpAndMask6, NULL},
15413 		{"DESTIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTIP"), CmdEvalIpAndMask6, NULL},
15414 		{"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},
15415 		{"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCPORT"), CmdEvalPortRange, NULL},
15416 		{"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTPORT"), CmdEvalPortRange, NULL},
15417 		{"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},
15418 		{"DELAY", CmdPrompt, _UU("CMD_AccessAddEx6_Prompt_DELAY"), CmdEvalMinMax, &minmax_delay},
15419 		{"JITTER", CmdPrompt, _UU("CMD_AccessAddEx6_Prompt_JITTER"), CmdEvalMinMax, &minmax_jitter},
15420 		{"LOSS", CmdPrompt, _UU("CMD_AccessAddEx6_Prompt_LOSS"), CmdEvalMinMax, &minmax_loss},
15421 		{"REDIRECTURL", NULL, NULL, NULL, NULL},
15422 	};
15423 
15424 	// If virtual HUB is not selected, it's an error
15425 	if (ps->HubName == NULL)
15426 	{
15427 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
15428 		return ERR_INVALID_PARAMETER;
15429 	}
15430 
15431 	// Check whether it is supported
15432 	if (GetCapsBool(ps->CapsList, "b_support_ex_acl") == false)
15433 	{
15434 		c->Write(c, _E(ERR_NOT_SUPPORTED));
15435 		return ERR_NOT_SUPPORTED;
15436 	}
15437 
15438 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
15439 	if (o == NULL)
15440 	{
15441 		return ERR_INVALID_PARAMETER;
15442 	}
15443 
15444 	Zero(&t, sizeof(t));
15445 	a = &t.Access;
15446 
15447 	a->IsIPv6 = true;
15448 
15449 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
15450 	UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));
15451 	a->Active = true;
15452 	a->Priority = GetParamInt(o, "PRIORITY");
15453 	a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;
15454 	StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));
15455 	StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));
15456 	ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);
15457 	ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);
15458 
15459 	Zero(&ip, sizeof(ip));
15460 	Zero(&mask, sizeof(mask));
15461 
15462 	ParseIpAndMask6(GetParamStr(o, "SRCIP"), &ip, &mask);
15463 	IPToIPv6Addr(&a->SrcIpAddress6, &ip);
15464 	IPToIPv6Addr(&a->SrcSubnetMask6, &mask);
15465 
15466 	ParseIpAndMask6(GetParamStr(o, "DESTIP"), &ip, &mask);
15467 	IPToIPv6Addr(&a->DestIpAddress6, &ip);
15468 	IPToIPv6Addr(&a->DestSubnetMask6, &mask);
15469 
15470 	a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));
15471 	ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);
15472 	ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);
15473 	ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);
15474 	a->Delay = GetParamInt(o, "DELAY");
15475 	a->Jitter = GetParamInt(o, "JITTER");
15476 	a->Loss = GetParamInt(o, "LOSS");
15477 	StrCpy(a->RedirectUrl, sizeof(a->RedirectUrl), GetParamStr(o, "REDIRECTURL"));
15478 
15479 	// RPC call
15480 	ret = ScAddAccess(ps->Rpc, &t);
15481 
15482 	if (ret != ERR_NO_ERROR)
15483 	{
15484 		// An error has occured
15485 		CmdPrintError(c, ret);
15486 		FreeParamValueList(o);
15487 		return ret;
15488 	}
15489 
15490 	FreeParamValueList(o);
15491 
15492 	return 0;
15493 }
15494 
15495 
15496 // Get the list of rules in the access list
PsAccessList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15497 UINT PsAccessList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15498 {
15499 	LIST *o;
15500 	PS *ps = (PS *)param;
15501 	UINT ret = 0;
15502 	RPC_ENUM_ACCESS_LIST t;
15503 	CT *ct;
15504 	UINT i;
15505 
15506 	// If virtual HUB is not selected, it's an error
15507 	if (ps->HubName == NULL)
15508 	{
15509 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
15510 		return ERR_INVALID_PARAMETER;
15511 	}
15512 
15513 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
15514 	if (o == NULL)
15515 	{
15516 		return ERR_INVALID_PARAMETER;
15517 	}
15518 
15519 	Zero(&t, sizeof(t));
15520 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
15521 
15522 	// RPC call
15523 	ret = ScEnumAccess(ps->Rpc, &t);
15524 
15525 	if (ret != ERR_NO_ERROR)
15526 	{
15527 		// An error has occured
15528 		CmdPrintError(c, ret);
15529 		FreeParamValueList(o);
15530 		return ret;
15531 	}
15532 
15533 	ct = CtNew();
15534 	CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_0"), true);
15535 	CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_1"), true);
15536 	CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_2"), true);
15537 	CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_3"), true);
15538 	CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_6"), true);
15539 	CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_5"), false);
15540 	CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_4"), false);
15541 
15542 	for (i = 0;i < t.NumAccess;i++)
15543 	{
15544 		ACCESS *a = &t.Accesses[i];
15545 		char tmp[MAX_SIZE];
15546 		wchar_t tmp3[MAX_SIZE];
15547 		wchar_t tmp1[MAX_SIZE];
15548 		wchar_t tmp2[MAX_SIZE];
15549 		wchar_t tmp4[MAX_SIZE];
15550 
15551 		GetAccessListStr(tmp, sizeof(tmp), a);
15552 		UniToStru(tmp1, a->Priority);
15553 		StrToUni(tmp2, sizeof(tmp2), tmp);
15554 		UniToStru(tmp4, a->UniqueId);
15555 		if (a->UniqueId == 0)
15556 		{
15557 			UniStrCpy(tmp4, sizeof(tmp4), _UU("SEC_NONE"));
15558 		}
15559 
15560 		UniToStru(tmp3, a->Id);
15561 
15562 		CtInsert(ct,
15563 			tmp3,
15564 			a->Discard ? _UU("SM_ACCESS_DISCARD") : _UU("SM_ACCESS_PASS"),
15565 			a->Active ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"),
15566 			tmp1,
15567 			tmp4,
15568 			tmp2,
15569 			a->Note);
15570 	}
15571 
15572 	CtFreeEx(ct, c, true);
15573 
15574 	FreeRpcEnumAccessList(&t);
15575 
15576 	FreeParamValueList(o);
15577 
15578 	return 0;
15579 }
15580 
15581 // Remove a rule from the access list
PsAccessDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15582 UINT PsAccessDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15583 {
15584 	LIST *o;
15585 	PS *ps = (PS *)param;
15586 	UINT ret = 0;
15587 	RPC_DELETE_ACCESS t;
15588 	// Parameter list that can be specified
15589 	PARAM args[] =
15590 	{
15591 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
15592 		{"[id]", CmdPrompt, _UU("CMD_Access_Prompt_ID"), CmdEvalNotEmpty, NULL},
15593 	};
15594 
15595 	// If virtual HUB is not selected, it's an error
15596 	if (ps->HubName == NULL)
15597 	{
15598 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
15599 		return ERR_INVALID_PARAMETER;
15600 	}
15601 
15602 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
15603 	if (o == NULL)
15604 	{
15605 		return ERR_INVALID_PARAMETER;
15606 	}
15607 
15608 	Zero(&t, sizeof(t));
15609 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
15610 	t.Id = GetParamInt(o, "[id]");
15611 
15612 	// RPC call
15613 	ret = ScDeleteAccess(ps->Rpc, &t);
15614 
15615 	if (ret != ERR_NO_ERROR)
15616 	{
15617 		// An error has occured
15618 		CmdPrintError(c, ret);
15619 		FreeParamValueList(o);
15620 		return ret;
15621 	}
15622 
15623 	FreeParamValueList(o);
15624 
15625 	return 0;
15626 }
15627 
15628 // Enable the rule of access list
PsAccessEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15629 UINT PsAccessEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15630 {
15631 	LIST *o;
15632 	PS *ps = (PS *)param;
15633 	UINT ret = 0;
15634 	RPC_ENUM_ACCESS_LIST t;
15635 	// Parameter list that can be specified
15636 	PARAM args[] =
15637 	{
15638 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
15639 		{"[id]", CmdPrompt, _UU("CMD_Access_Prompt_ID"), CmdEvalNotEmpty, NULL},
15640 	};
15641 
15642 	// If virtual HUB is not selected, it's an error
15643 	if (ps->HubName == NULL)
15644 	{
15645 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
15646 		return ERR_INVALID_PARAMETER;
15647 	}
15648 
15649 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
15650 	if (o == NULL)
15651 	{
15652 		return ERR_INVALID_PARAMETER;
15653 	}
15654 
15655 	Zero(&t, sizeof(t));
15656 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
15657 
15658 	// RPC call
15659 	ret = ScEnumAccess(ps->Rpc, &t);
15660 
15661 	if (ret != ERR_NO_ERROR)
15662 	{
15663 		// An error has occured
15664 		CmdPrintError(c, ret);
15665 		FreeParamValueList(o);
15666 		return ret;
15667 	}
15668 	else
15669 	{
15670 		UINT i;
15671 		bool b = false;
15672 		for (i = 0;i < t.NumAccess;i++)
15673 		{
15674 			ACCESS *a = &t.Accesses[i];
15675 
15676 			if (a->Id == GetParamInt(o, "[id]"))
15677 			{
15678 				b = true;
15679 
15680 				a->Active = true;
15681 			}
15682 		}
15683 
15684 		if (b == false)
15685 		{
15686 			// The specified ID is not found
15687 			ret = ERR_OBJECT_NOT_FOUND;
15688 			CmdPrintError(c, ret);
15689 			FreeParamValueList(o);
15690 			FreeRpcEnumAccessList(&t);
15691 			return ret;
15692 		}
15693 
15694 		ret = ScSetAccessList(ps->Rpc, &t);
15695 		if (ret != ERR_NO_ERROR)
15696 		{
15697 			// An error has occured
15698 			CmdPrintError(c, ret);
15699 			FreeParamValueList(o);
15700 			return ret;
15701 		}
15702 
15703 		FreeRpcEnumAccessList(&t);
15704 	}
15705 
15706 	FreeParamValueList(o);
15707 
15708 	return ret;
15709 }
15710 
15711 // Disable the rule of access list
PsAccessDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15712 UINT PsAccessDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15713 {
15714 	LIST *o;
15715 	PS *ps = (PS *)param;
15716 	UINT ret = 0;
15717 	RPC_ENUM_ACCESS_LIST t;
15718 	// Parameter list that can be specified
15719 	PARAM args[] =
15720 	{
15721 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
15722 		{"[id]", CmdPrompt, _UU("CMD_Access_Prompt_ID"), CmdEvalNotEmpty, NULL},
15723 	};
15724 
15725 	// If virtual HUB is not selected, it's an error
15726 	if (ps->HubName == NULL)
15727 	{
15728 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
15729 		return ERR_INVALID_PARAMETER;
15730 	}
15731 
15732 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
15733 	if (o == NULL)
15734 	{
15735 		return ERR_INVALID_PARAMETER;
15736 	}
15737 
15738 	Zero(&t, sizeof(t));
15739 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
15740 
15741 	// RPC call
15742 	ret = ScEnumAccess(ps->Rpc, &t);
15743 
15744 	if (ret != ERR_NO_ERROR)
15745 	{
15746 		// An error has occured
15747 		CmdPrintError(c, ret);
15748 		FreeParamValueList(o);
15749 		return ret;
15750 	}
15751 	else
15752 	{
15753 		UINT i;
15754 		bool b = false;
15755 		for (i = 0;i < t.NumAccess;i++)
15756 		{
15757 			ACCESS *a = &t.Accesses[i];
15758 
15759 			if (a->Id == GetParamInt(o, "[id]"))
15760 			{
15761 				b = true;
15762 
15763 				a->Active = false;
15764 			}
15765 		}
15766 
15767 		if (b == false)
15768 		{
15769 			// The specified ID is not found
15770 			ret = ERR_OBJECT_NOT_FOUND;
15771 			CmdPrintError(c, ret);
15772 			FreeParamValueList(o);
15773 			FreeRpcEnumAccessList(&t);
15774 			return ret;
15775 		}
15776 
15777 		ret = ScSetAccessList(ps->Rpc, &t);
15778 		if (ret != ERR_NO_ERROR)
15779 		{
15780 			// An error has occured
15781 			CmdPrintError(c, ret);
15782 			FreeParamValueList(o);
15783 			return ret;
15784 		}
15785 
15786 		FreeRpcEnumAccessList(&t);
15787 	}
15788 
15789 	FreeParamValueList(o);
15790 
15791 	return ret;
15792 }
15793 
15794 // Get the user list
PsUserList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15795 UINT PsUserList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15796 {
15797 	LIST *o;
15798 	PS *ps = (PS *)param;
15799 	UINT ret = 0;
15800 	RPC_ENUM_USER t;
15801 
15802 	// If virtual HUB is not selected, it's an error
15803 	if (ps->HubName == NULL)
15804 	{
15805 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
15806 		return ERR_INVALID_PARAMETER;
15807 	}
15808 
15809 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
15810 	if (o == NULL)
15811 	{
15812 		return ERR_INVALID_PARAMETER;
15813 	}
15814 
15815 	Zero(&t, sizeof(t));
15816 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
15817 
15818 	// RPC call
15819 	ret = ScEnumUser(ps->Rpc, &t);
15820 
15821 	if (ret != ERR_NO_ERROR)
15822 	{
15823 		// An error has occured
15824 		CmdPrintError(c, ret);
15825 		FreeParamValueList(o);
15826 		return ret;
15827 	}
15828 	else
15829 	{
15830 		UINT i;
15831 		CT *ct = CtNew();
15832 
15833 		CtInsertColumn(ct, _UU("SM_USER_COLUMN_1"), false);
15834 		CtInsertColumn(ct, _UU("SM_USER_COLUMN_2"), false);
15835 		CtInsertColumn(ct, _UU("SM_USER_COLUMN_3"), false);
15836 		CtInsertColumn(ct, _UU("SM_USER_COLUMN_4"), false);
15837 		CtInsertColumn(ct, _UU("SM_USER_COLUMN_5"), false);
15838 		CtInsertColumn(ct, _UU("SM_USER_COLUMN_6"), false);
15839 		CtInsertColumn(ct, _UU("SM_USER_COLUMN_7"), false);
15840 		CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_5"), false);
15841 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_6"), false);
15842 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_7"), false);
15843 
15844 		for (i = 0;i < t.NumUser;i++)
15845 		{
15846 			RPC_ENUM_USER_ITEM *e = &t.Users[i];
15847 			wchar_t name[MAX_SIZE];
15848 			wchar_t group[MAX_SIZE];
15849 			wchar_t num[MAX_SIZE];
15850 			wchar_t time[MAX_SIZE];
15851 			wchar_t exp[MAX_SIZE];
15852 			wchar_t num1[64], num2[64];
15853 
15854 			StrToUni(name, sizeof(name), e->Name);
15855 
15856 			if (StrLen(e->GroupName) != 0)
15857 			{
15858 				StrToUni(group, sizeof(group), e->GroupName);
15859 			}
15860 			else
15861 			{
15862 				UniStrCpy(group, sizeof(group), _UU("SM_NO_GROUP"));
15863 			}
15864 
15865 			UniToStru(num, e->NumLogin);
15866 
15867 			GetDateTimeStrEx64(time, sizeof(time), SystemToLocal64(e->LastLoginTime), NULL);
15868 
15869 			if (e->IsExpiresFilled == false)
15870 			{
15871 				UniStrCpy(exp, sizeof(exp), _UU("CM_ST_NONE"));
15872 			}
15873 			else
15874 			{
15875 				if (e->Expires == 0)
15876 				{
15877 					UniStrCpy(exp, sizeof(exp), _UU("SM_LICENSE_NO_EXPIRES"));
15878 				}
15879 				else
15880 				{
15881 					GetDateTimeStrEx64(exp, sizeof(exp), SystemToLocal64(e->Expires), NULL);
15882 				}
15883 			}
15884 
15885 			if (e->IsTrafficFilled == false)
15886 			{
15887 				UniStrCpy(num1, sizeof(num1), _UU("CM_ST_NONE"));
15888 				UniStrCpy(num2, sizeof(num2), _UU("CM_ST_NONE"));
15889 			}
15890 			else
15891 			{
15892 				UniToStr3(num1, sizeof(num1),
15893 					e->Traffic.Recv.BroadcastBytes + e->Traffic.Recv.UnicastBytes +
15894 					e->Traffic.Send.BroadcastBytes + e->Traffic.Send.UnicastBytes);
15895 
15896 				UniToStr3(num2, sizeof(num2),
15897 					e->Traffic.Recv.BroadcastCount + e->Traffic.Recv.UnicastCount +
15898 					e->Traffic.Send.BroadcastBytes + e->Traffic.Send.UnicastCount);
15899 			}
15900 
15901 			CtInsert(ct,
15902 				name, e->Realname, group, e->Note, GetAuthTypeStr(e->AuthType),
15903 				num, time, exp, num1, num2);
15904 		}
15905 
15906 		CtFreeEx(ct, c, true);
15907 	}
15908 
15909 	FreeRpcEnumUser(&t);
15910 
15911 	FreeParamValueList(o);
15912 
15913 	return 0;
15914 }
15915 
15916 // Get a string of user authentication method
GetAuthTypeStr(UINT id)15917 wchar_t *GetAuthTypeStr(UINT id)
15918 {
15919 	char tmp[MAX_SIZE];
15920 	Format(tmp, sizeof(tmp), "SM_AUTHTYPE_%u", id);
15921 
15922 	return _UU(tmp);
15923 }
15924 
15925 // Creating a user
PsUserCreate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15926 UINT PsUserCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15927 {
15928 	LIST *o;
15929 	PS *ps = (PS *)param;
15930 	UINT ret = 0;
15931 	RPC_SET_USER t;
15932 	// Parameter list that can be specified
15933 	PARAM args[] =
15934 	{
15935 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
15936 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
15937 		{"GROUP", CmdPrompt, _UU("CMD_UserCreate_Prompt_GROUP"), NULL, NULL},
15938 		{"REALNAME", CmdPrompt, _UU("CMD_UserCreate_Prompt_REALNAME"), NULL, NULL},
15939 		{"NOTE", CmdPrompt, _UU("CMD_UserCreate_Prompt_NOTE"), NULL, NULL},
15940 	};
15941 
15942 	// If virtual HUB is not selected, it's an error
15943 	if (ps->HubName == NULL)
15944 	{
15945 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
15946 		return ERR_INVALID_PARAMETER;
15947 	}
15948 
15949 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
15950 	if (o == NULL)
15951 	{
15952 		return ERR_INVALID_PARAMETER;
15953 	}
15954 
15955 	Zero(&t, sizeof(t));
15956 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
15957 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
15958 	StrCpy(t.GroupName, sizeof(t.GroupName), GetParamStr(o, "GROUP"));
15959 	UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));
15960 	UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));
15961 
15962 	Trim(t.Name);
15963 	if (StrCmpi(t.Name, "*") == 0)
15964 	{
15965 		t.AuthType = AUTHTYPE_RADIUS;
15966 		t.AuthData = NewRadiusAuthData(NULL);
15967 	}
15968 	else
15969 	{
15970 		UCHAR random_pass[SHA1_SIZE];
15971 		UCHAR random_pass2[MD5_SIZE];
15972 
15973 		Rand(random_pass, sizeof(random_pass));
15974 		Rand(random_pass2, sizeof(random_pass2));
15975 		t.AuthType = AUTHTYPE_PASSWORD;
15976 		t.AuthData = NewPasswordAuthDataRaw(random_pass, random_pass2);
15977 	}
15978 
15979 	// RPC call
15980 	ret = ScCreateUser(ps->Rpc, &t);
15981 
15982 	if (ret != ERR_NO_ERROR)
15983 	{
15984 		// An error has occured
15985 		CmdPrintError(c, ret);
15986 		FreeParamValueList(o);
15987 		return ret;
15988 	}
15989 
15990 	FreeRpcSetUser(&t);
15991 
15992 	FreeParamValueList(o);
15993 
15994 	return 0;
15995 }
15996 
15997 // Change the user information
PsUserSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15998 UINT PsUserSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15999 {
16000 	LIST *o;
16001 	PS *ps = (PS *)param;
16002 	UINT ret = 0;
16003 	RPC_SET_USER t;
16004 	// Parameter list that can be specified
16005 	PARAM args[] =
16006 	{
16007 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16008 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
16009 		{"GROUP", CmdPrompt, _UU("CMD_UserCreate_Prompt_GROUP"), NULL, NULL},
16010 		{"REALNAME", CmdPrompt, _UU("CMD_UserCreate_Prompt_REALNAME"), NULL, NULL},
16011 		{"NOTE", CmdPrompt, _UU("CMD_UserCreate_Prompt_NOTE"), NULL, NULL},
16012 	};
16013 
16014 	// If virtual HUB is not selected, it's an error
16015 	if (ps->HubName == NULL)
16016 	{
16017 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16018 		return ERR_INVALID_PARAMETER;
16019 	}
16020 
16021 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16022 	if (o == NULL)
16023 	{
16024 		return ERR_INVALID_PARAMETER;
16025 	}
16026 
16027 	Zero(&t, sizeof(t));
16028 	// Get the user object
16029 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16030 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
16031 
16032 	ret = ScGetUser(ps->Rpc, &t);
16033 	if (ret != ERR_NO_ERROR)
16034 	{
16035 		// An error has occured
16036 		CmdPrintError(c, ret);
16037 		FreeParamValueList(o);
16038 		return ret;
16039 	}
16040 
16041 	// Update the information
16042 	StrCpy(t.GroupName, sizeof(t.GroupName), GetParamStr(o, "GROUP"));
16043 	UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));
16044 	UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));
16045 
16046 	// Write the user object
16047 	ret = ScSetUser(ps->Rpc, &t);
16048 
16049 	if (ret != ERR_NO_ERROR)
16050 	{
16051 		// An error has occured
16052 		CmdPrintError(c, ret);
16053 		FreeParamValueList(o);
16054 		return ret;
16055 	}
16056 
16057 	FreeRpcSetUser(&t);
16058 
16059 	FreeParamValueList(o);
16060 
16061 	return 0;
16062 }
16063 
16064 // Delete the user
PsUserDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16065 UINT PsUserDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16066 {
16067 	LIST *o;
16068 	PS *ps = (PS *)param;
16069 	UINT ret = 0;
16070 	RPC_DELETE_USER t;
16071 	// Parameter list that can be specified
16072 	PARAM args[] =
16073 	{
16074 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
16075 	};
16076 
16077 	// If virtual HUB is not selected, it's an error
16078 	if (ps->HubName == NULL)
16079 	{
16080 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16081 		return ERR_INVALID_PARAMETER;
16082 	}
16083 
16084 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16085 	if (o == NULL)
16086 	{
16087 		return ERR_INVALID_PARAMETER;
16088 	}
16089 
16090 	Zero(&t, sizeof(t));
16091 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16092 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
16093 
16094 	// RPC call
16095 	ret = ScDeleteUser(ps->Rpc, &t);
16096 
16097 	if (ret != ERR_NO_ERROR)
16098 	{
16099 		// An error has occured
16100 		CmdPrintError(c, ret);
16101 		FreeParamValueList(o);
16102 		return ret;
16103 	}
16104 
16105 	FreeParamValueList(o);
16106 
16107 	return 0;
16108 }
16109 
16110 // Get the user information
PsUserGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16111 UINT PsUserGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16112 {
16113 	LIST *o;
16114 	PS *ps = (PS *)param;
16115 	UINT ret = 0;
16116 	RPC_SET_USER t;
16117 	// Parameter list that can be specified
16118 	PARAM args[] =
16119 	{
16120 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16121 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
16122 	};
16123 
16124 	// If virtual HUB is not selected, it's an error
16125 	if (ps->HubName == NULL)
16126 	{
16127 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16128 		return ERR_INVALID_PARAMETER;
16129 	}
16130 
16131 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16132 	if (o == NULL)
16133 	{
16134 		return ERR_INVALID_PARAMETER;
16135 	}
16136 
16137 	Zero(&t, sizeof(t));
16138 	// Get the user object
16139 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16140 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
16141 
16142 	ret = ScGetUser(ps->Rpc, &t);
16143 	if (ret != ERR_NO_ERROR)
16144 	{
16145 		// An error has occured
16146 		CmdPrintError(c, ret);
16147 		FreeParamValueList(o);
16148 		return ret;
16149 	}
16150 	else
16151 	{
16152 		wchar_t tmp[MAX_SIZE];
16153 		CT *ct;
16154 
16155 		// Display the user's data
16156 		ct = CtNewStandard();
16157 
16158 		// User name
16159 		StrToUni(tmp, sizeof(tmp), t.Name);
16160 		CtInsert(ct, _UU("CMD_UserGet_Column_Name"), tmp);
16161 
16162 		// Real name
16163 		CtInsert(ct, _UU("CMD_UserGet_Column_RealName"), t.Realname);
16164 
16165 		// Description
16166 		CtInsert(ct, _UU("CMD_UserGet_Column_Note"), t.Note);
16167 
16168 		// Group name
16169 		if (IsEmptyStr(t.GroupName) == false)
16170 		{
16171 			StrToUni(tmp, sizeof(tmp), t.GroupName);
16172 			CtInsert(ct, _UU("CMD_UserGet_Column_Group"), tmp);
16173 		}
16174 
16175 		// Expiration date
16176 		GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ExpireTime), NULL);
16177 		CtInsert(ct, _UU("CMD_UserGet_Column_Expires"), tmp);
16178 
16179 		// Authentication method
16180 		CtInsert(ct, _UU("CMD_UserGet_Column_AuthType"), GetAuthTypeStr(t.AuthType));
16181 
16182 		switch (t.AuthType)
16183 		{
16184 		case AUTHTYPE_USERCERT:
16185 			if (t.AuthData != NULL)
16186 			{
16187 				AUTHUSERCERT *auc = (AUTHUSERCERT *)t.AuthData;
16188 
16189 				if (auc != NULL && auc->UserX != NULL)
16190 				{
16191 					// Registered user-specific certificate
16192 					GetAllNameFromX(tmp, sizeof(tmp), auc->UserX);
16193 					CtInsert(ct, _UU("CMD_UserGet_Column_UserCert"), tmp);
16194 				}
16195 			}
16196 			break;
16197 
16198 		case AUTHTYPE_ROOTCERT:
16199 			if (t.AuthData != NULL)
16200 			{
16201 				AUTHROOTCERT *arc = (AUTHROOTCERT *)t.AuthData;
16202 
16203 				if (IsEmptyUniStr(arc->CommonName) == false)
16204 				{
16205 					// Limitation the value of the certificate's CN
16206 					CtInsert(ct, _UU("CMD_UserGet_Column_RootCert_CN"), arc->CommonName);
16207 				}
16208 
16209 				if (arc->Serial != NULL && arc->Serial->size >= 1)
16210 				{
16211 					char tmp2[MAX_SIZE];
16212 
16213 					// Limitation the serial number of the certificate
16214 					BinToStrEx(tmp2, sizeof(tmp2), arc->Serial->data, arc->Serial->size);
16215 					StrToUni(tmp, sizeof(tmp), tmp2);
16216 					CtInsert(ct, _UU("CMD_UserGet_Column_RootCert_SERIAL"), tmp);
16217 				}
16218 			}
16219 			break;
16220 
16221 		case AUTHTYPE_RADIUS:
16222 		case AUTHTYPE_NT:
16223 			if (t.AuthData != NULL)
16224 			{
16225 				AUTHRADIUS *ar = (AUTHRADIUS *)t.AuthData;
16226 
16227 				// Authentication user name of the external authentication server
16228 				if (IsEmptyUniStr(ar->RadiusUsername) == false)
16229 				{
16230 					CtInsert(ct, _UU("CMD_UserGet_Column_RadiusAlias"), ar->RadiusUsername);
16231 				}
16232 			}
16233 			break;
16234 		}
16235 
16236 		CtInsert(ct, L"---", L"---");
16237 
16238 		GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.CreatedTime), NULL);
16239 		CtInsert(ct, _UU("SM_USERINFO_CREATE"), tmp);
16240 
16241 		GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.UpdatedTime), NULL);
16242 		CtInsert(ct, _UU("SM_USERINFO_UPDATE"), tmp);
16243 
16244 		CmdInsertTrafficInfo(ct, &t.Traffic);
16245 
16246 		UniToStru(tmp, t.NumLogin);
16247 		CtInsert(ct, _UU("SM_USERINFO_NUMLOGIN"), tmp);
16248 
16249 
16250 		CtFree(ct, c);
16251 
16252 		if (t.Policy != NULL)
16253 		{
16254 			c->Write(c, L"");
16255 			c->Write(c, _UU("CMD_UserGet_Policy"));
16256 			PrintPolicy(c, t.Policy, false);
16257 		}
16258 	}
16259 
16260 	FreeRpcSetUser(&t);
16261 
16262 	FreeParamValueList(o);
16263 
16264 	return 0;
16265 }
16266 
16267 // Set the authentication method for the user to the anonymous authentication
PsUserAnonymousSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16268 UINT PsUserAnonymousSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16269 {
16270 	LIST *o;
16271 	PS *ps = (PS *)param;
16272 	UINT ret = 0;
16273 	RPC_SET_USER t;
16274 	// Parameter list that can be specified
16275 	PARAM args[] =
16276 	{
16277 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16278 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
16279 	};
16280 
16281 	// If virtual HUB is not selected, it's an error
16282 	if (ps->HubName == NULL)
16283 	{
16284 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16285 		return ERR_INVALID_PARAMETER;
16286 	}
16287 
16288 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16289 	if (o == NULL)
16290 	{
16291 		return ERR_INVALID_PARAMETER;
16292 	}
16293 
16294 	Zero(&t, sizeof(t));
16295 	// Get the user object
16296 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16297 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
16298 
16299 	ret = ScGetUser(ps->Rpc, &t);
16300 	if (ret != ERR_NO_ERROR)
16301 	{
16302 		// An error has occured
16303 		CmdPrintError(c, ret);
16304 		FreeParamValueList(o);
16305 		return ret;
16306 	}
16307 
16308 	// Update the information
16309 	FreeAuthData(t.AuthType, t.AuthData);
16310 
16311 	// Set to anonymous authentication
16312 	t.AuthType = AUTHTYPE_ANONYMOUS;
16313 	t.AuthData = NULL;
16314 
16315 	// Write the user object
16316 	ret = ScSetUser(ps->Rpc, &t);
16317 
16318 	if (ret != ERR_NO_ERROR)
16319 	{
16320 		// An error has occured
16321 		CmdPrintError(c, ret);
16322 		FreeParamValueList(o);
16323 		return ret;
16324 	}
16325 
16326 	FreeRpcSetUser(&t);
16327 
16328 	FreeParamValueList(o);
16329 
16330 	return 0;
16331 }
16332 
16333 // Set the authentication method for the user to the password authentication and set a password
PsUserPasswordSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16334 UINT PsUserPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16335 {
16336 	LIST *o;
16337 	PS *ps = (PS *)param;
16338 	UINT ret = 0;
16339 	RPC_SET_USER t;
16340 	// Parameter list that can be specified
16341 	PARAM args[] =
16342 	{
16343 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16344 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
16345 		{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
16346 	};
16347 
16348 	// If virtual HUB is not selected, it's an error
16349 	if (ps->HubName == NULL)
16350 	{
16351 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16352 		return ERR_INVALID_PARAMETER;
16353 	}
16354 
16355 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16356 	if (o == NULL)
16357 	{
16358 		return ERR_INVALID_PARAMETER;
16359 	}
16360 
16361 	Zero(&t, sizeof(t));
16362 	// Get the user object
16363 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16364 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
16365 
16366 	ret = ScGetUser(ps->Rpc, &t);
16367 	if (ret != ERR_NO_ERROR)
16368 	{
16369 		// An error has occured
16370 		CmdPrintError(c, ret);
16371 		FreeParamValueList(o);
16372 		return ret;
16373 	}
16374 
16375 	// Update the information
16376 	FreeAuthData(t.AuthType, t.AuthData);
16377 
16378 	{
16379 		AUTHPASSWORD *pw;
16380 
16381 		pw = NewPasswordAuthData(t.Name, GetParamStr(o, "PASSWORD"));
16382 
16383 		// Set to the password authentication
16384 		t.AuthType = AUTHTYPE_PASSWORD;
16385 		t.AuthData = pw;
16386 	}
16387 
16388 	// Write the user object
16389 	ret = ScSetUser(ps->Rpc, &t);
16390 
16391 	if (ret != ERR_NO_ERROR)
16392 	{
16393 		// An error has occured
16394 		CmdPrintError(c, ret);
16395 		FreeParamValueList(o);
16396 		return ret;
16397 	}
16398 
16399 	FreeRpcSetUser(&t);
16400 
16401 	FreeParamValueList(o);
16402 
16403 	return 0;
16404 }
16405 
16406 // Set the authentication method for the user to the specific certificate authentication and set a certificate
PsUserCertSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16407 UINT PsUserCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16408 {
16409 	LIST *o;
16410 	PS *ps = (PS *)param;
16411 	UINT ret = 0;
16412 	RPC_SET_USER t;
16413 	X *x;
16414 	// Parameter list that can be specified
16415 	PARAM args[] =
16416 	{
16417 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16418 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
16419 		{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
16420 	};
16421 
16422 	// If virtual HUB is not selected, it's an error
16423 	if (ps->HubName == NULL)
16424 	{
16425 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16426 		return ERR_INVALID_PARAMETER;
16427 	}
16428 
16429 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16430 	if (o == NULL)
16431 	{
16432 		return ERR_INVALID_PARAMETER;
16433 	}
16434 
16435 	// Read the certificate
16436 	x = FileToXW(GetParamUniStr(o, "LOADCERT"));
16437 	if (x == NULL)
16438 	{
16439 		c->Write(c, _UU("CMD_LOADCERT_FAILED"));
16440 
16441 		FreeParamValueList(o);
16442 
16443 		return ERR_INTERNAL_ERROR;
16444 	}
16445 
16446 	Zero(&t, sizeof(t));
16447 	// Get the user object
16448 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16449 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
16450 
16451 	ret = ScGetUser(ps->Rpc, &t);
16452 	if (ret != ERR_NO_ERROR)
16453 	{
16454 		// An error has occured
16455 		CmdPrintError(c, ret);
16456 		FreeParamValueList(o);
16457 		FreeX(x);
16458 		return ret;
16459 	}
16460 
16461 	// Update the information
16462 	FreeAuthData(t.AuthType, t.AuthData);
16463 
16464 	{
16465 		AUTHUSERCERT *c;
16466 
16467 		c = NewUserCertAuthData(x);
16468 
16469 		FreeX(x);
16470 
16471 		// Set to the password authentication
16472 		t.AuthType = AUTHTYPE_USERCERT;
16473 		t.AuthData = c;
16474 	}
16475 
16476 	// Write the user object
16477 	ret = ScSetUser(ps->Rpc, &t);
16478 
16479 	if (ret != ERR_NO_ERROR)
16480 	{
16481 		// An error has occured
16482 		CmdPrintError(c, ret);
16483 		FreeParamValueList(o);
16484 		return ret;
16485 	}
16486 
16487 	FreeRpcSetUser(&t);
16488 
16489 	FreeParamValueList(o);
16490 
16491 	return 0;
16492 }
16493 
16494 // Get certificates that are registered in the user which uses certificate authentication
PsUserCertGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16495 UINT PsUserCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16496 {
16497 	LIST *o;
16498 	PS *ps = (PS *)param;
16499 	UINT ret = 0;
16500 	RPC_SET_USER t;
16501 	AUTHUSERCERT *a;
16502 	// Parameter list that can be specified
16503 	PARAM args[] =
16504 	{
16505 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16506 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
16507 		{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), NULL, NULL},
16508 	};
16509 
16510 	// If virtual HUB is not selected, it's an error
16511 	if (ps->HubName == NULL)
16512 	{
16513 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16514 		return ERR_INVALID_PARAMETER;
16515 	}
16516 
16517 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16518 	if (o == NULL)
16519 	{
16520 		return ERR_INVALID_PARAMETER;
16521 	}
16522 
16523 	Zero(&t, sizeof(t));
16524 	// Get the user object
16525 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16526 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
16527 
16528 	ret = ScGetUser(ps->Rpc, &t);
16529 	if (ret != ERR_NO_ERROR)
16530 	{
16531 		// An error has occured
16532 		CmdPrintError(c, ret);
16533 		FreeParamValueList(o);
16534 		return ret;
16535 	}
16536 
16537 	a = (AUTHUSERCERT *)t.AuthData;
16538 
16539 	if (t.AuthType != AUTHTYPE_USERCERT || a == NULL || a->UserX == NULL)
16540 	{
16541 		// The user is not using specific certificate authentication
16542 		ret = ERR_INVALID_PARAMETER;
16543 
16544 		c->Write(c, _UU("CMD_UserCertGet_Not_Cert"));
16545 	}
16546 	else
16547 	{
16548 		if (XToFileW(a->UserX, GetParamUniStr(o, "SAVECERT"), true) == false)
16549 		{
16550 			c->Write(c, _UU("CMD_SAVECERT_FAILED"));
16551 		}
16552 	}
16553 
16554 	FreeRpcSetUser(&t);
16555 
16556 	FreeParamValueList(o);
16557 
16558 	return ret;
16559 }
16560 
16561 // Set the authentication method for the user to the signed certificate authentication
PsUserSignedSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16562 UINT PsUserSignedSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16563 {
16564 	LIST *o;
16565 	PS *ps = (PS *)param;
16566 	UINT ret = 0;
16567 	RPC_SET_USER t;
16568 	// Parameter list that can be specified
16569 	PARAM args[] =
16570 	{
16571 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16572 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
16573 		{"CN", CmdPrompt, _UU("CMD_UserSignedSet_Prompt_CN"), NULL, NULL},
16574 		{"SERIAL", CmdPrompt, _UU("CMD_UserSignedSet_Prompt_SERIAL"), NULL, NULL},
16575 	};
16576 
16577 	// If virtual HUB is not selected, it's an error
16578 	if (ps->HubName == NULL)
16579 	{
16580 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16581 		return ERR_INVALID_PARAMETER;
16582 	}
16583 
16584 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16585 	if (o == NULL)
16586 	{
16587 		return ERR_INVALID_PARAMETER;
16588 	}
16589 
16590 	Zero(&t, sizeof(t));
16591 	// Get the user object
16592 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16593 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
16594 
16595 	ret = ScGetUser(ps->Rpc, &t);
16596 	if (ret != ERR_NO_ERROR)
16597 	{
16598 		// An error has occured
16599 		CmdPrintError(c, ret);
16600 		FreeParamValueList(o);
16601 		return ret;
16602 	}
16603 
16604 	// Update the information
16605 	FreeAuthData(t.AuthType, t.AuthData);
16606 
16607 	{
16608 		AUTHROOTCERT *c;
16609 		BUF *b;
16610 		X_SERIAL *serial = NULL;
16611 
16612 		b = StrToBin(GetParamStr(o, "SERIAL"));
16613 
16614 		if (b != NULL && b->Size >= 1)
16615 		{
16616 			serial = NewXSerial(b->Buf, b->Size);
16617 		}
16618 
16619 		FreeBuf(b);
16620 
16621 		c = NewRootCertAuthData(serial, GetParamUniStr(o, "CN"));
16622 
16623 		FreeXSerial(serial);
16624 
16625 		// Set to the signed certificate authentication
16626 		t.AuthType = AUTHTYPE_ROOTCERT;
16627 		t.AuthData = c;
16628 	}
16629 
16630 	// Write the user object
16631 	ret = ScSetUser(ps->Rpc, &t);
16632 
16633 	if (ret != ERR_NO_ERROR)
16634 	{
16635 		// An error has occured
16636 		CmdPrintError(c, ret);
16637 		FreeParamValueList(o);
16638 		return ret;
16639 	}
16640 
16641 	FreeRpcSetUser(&t);
16642 
16643 	FreeParamValueList(o);
16644 
16645 	return 0;
16646 }
16647 
16648 // Set the authentication method for the user to the Radius authentication
PsUserRadiusSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16649 UINT PsUserRadiusSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16650 {
16651 	LIST *o;
16652 	PS *ps = (PS *)param;
16653 	UINT ret = 0;
16654 	RPC_SET_USER t;
16655 	// Parameter list that can be specified
16656 	PARAM args[] =
16657 	{
16658 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16659 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
16660 		{"ALIAS", CmdPrompt, _UU("CMD_UserRadiusSet_Prompt_ALIAS"), NULL, NULL},
16661 	};
16662 
16663 	// If virtual HUB is not selected, it's an error
16664 	if (ps->HubName == NULL)
16665 	{
16666 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16667 		return ERR_INVALID_PARAMETER;
16668 	}
16669 
16670 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16671 	if (o == NULL)
16672 	{
16673 		return ERR_INVALID_PARAMETER;
16674 	}
16675 
16676 	Zero(&t, sizeof(t));
16677 	// Get the user object
16678 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16679 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
16680 
16681 	ret = ScGetUser(ps->Rpc, &t);
16682 	if (ret != ERR_NO_ERROR)
16683 	{
16684 		// An error has occured
16685 		CmdPrintError(c, ret);
16686 		FreeParamValueList(o);
16687 		return ret;
16688 	}
16689 
16690 	// Update the information
16691 	FreeAuthData(t.AuthType, t.AuthData);
16692 
16693 	{
16694 		AUTHRADIUS *a;
16695 
16696 		a = NewRadiusAuthData(GetParamUniStr(o, "ALIAS"));
16697 
16698 		// Set to Radius authentication
16699 		t.AuthType = AUTHTYPE_RADIUS;
16700 		t.AuthData = a;
16701 	}
16702 
16703 	// Write the user object
16704 	ret = ScSetUser(ps->Rpc, &t);
16705 
16706 	if (ret != ERR_NO_ERROR)
16707 	{
16708 		// An error has occured
16709 		CmdPrintError(c, ret);
16710 		FreeParamValueList(o);
16711 		return ret;
16712 	}
16713 
16714 	FreeRpcSetUser(&t);
16715 
16716 	FreeParamValueList(o);
16717 
16718 	return 0;
16719 }
16720 
16721 // Set the authentication method for the user to the NT domain authentication
PsUserNTLMSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16722 UINT PsUserNTLMSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16723 {
16724 	LIST *o;
16725 	PS *ps = (PS *)param;
16726 	UINT ret = 0;
16727 	RPC_SET_USER t;
16728 	// Parameter list that can be specified
16729 	PARAM args[] =
16730 	{
16731 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16732 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
16733 		{"ALIAS", CmdPrompt, _UU("CMD_UserRadiusSet_Prompt_ALIAS"), NULL, NULL},
16734 	};
16735 
16736 	// If virtual HUB is not selected, it's an error
16737 	if (ps->HubName == NULL)
16738 	{
16739 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16740 		return ERR_INVALID_PARAMETER;
16741 	}
16742 
16743 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16744 	if (o == NULL)
16745 	{
16746 		return ERR_INVALID_PARAMETER;
16747 	}
16748 
16749 	Zero(&t, sizeof(t));
16750 	// Get the user object
16751 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16752 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
16753 
16754 	ret = ScGetUser(ps->Rpc, &t);
16755 	if (ret != ERR_NO_ERROR)
16756 	{
16757 		// An error has occured
16758 		CmdPrintError(c, ret);
16759 		FreeParamValueList(o);
16760 		return ret;
16761 	}
16762 
16763 	// Update the information
16764 	FreeAuthData(t.AuthType, t.AuthData);
16765 
16766 	{
16767 		AUTHRADIUS *a;
16768 
16769 		a = NewRadiusAuthData(GetParamUniStr(o, "ALIAS"));
16770 
16771 		// Set to the NT domain authentication
16772 		t.AuthType = AUTHTYPE_NT;
16773 		t.AuthData = a;
16774 	}
16775 
16776 	// Write the user object
16777 	ret = ScSetUser(ps->Rpc, &t);
16778 
16779 	if (ret != ERR_NO_ERROR)
16780 	{
16781 		// An error has occured
16782 		CmdPrintError(c, ret);
16783 		FreeParamValueList(o);
16784 		return ret;
16785 	}
16786 
16787 	FreeRpcSetUser(&t);
16788 
16789 	FreeParamValueList(o);
16790 
16791 	return 0;
16792 }
16793 
16794 // Delete the security policy of the user
PsUserPolicyRemove(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16795 UINT PsUserPolicyRemove(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16796 {
16797 	LIST *o;
16798 	PS *ps = (PS *)param;
16799 	UINT ret = 0;
16800 	RPC_SET_USER t;
16801 	// Parameter list that can be specified
16802 	PARAM args[] =
16803 	{
16804 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16805 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
16806 	};
16807 
16808 	// If virtual HUB is not selected, it's an error
16809 	if (ps->HubName == NULL)
16810 	{
16811 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16812 		return ERR_INVALID_PARAMETER;
16813 	}
16814 
16815 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16816 	if (o == NULL)
16817 	{
16818 		return ERR_INVALID_PARAMETER;
16819 	}
16820 
16821 	Zero(&t, sizeof(t));
16822 	// Get the user object
16823 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16824 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
16825 
16826 	ret = ScGetUser(ps->Rpc, &t);
16827 	if (ret != ERR_NO_ERROR)
16828 	{
16829 		// An error has occured
16830 		CmdPrintError(c, ret);
16831 		FreeParamValueList(o);
16832 		return ret;
16833 	}
16834 
16835 	// Update
16836 	if (t.Policy != NULL)
16837 	{
16838 		Free(t.Policy);
16839 		t.Policy = NULL;
16840 	}
16841 
16842 	// Write the user object
16843 	ret = ScSetUser(ps->Rpc, &t);
16844 
16845 	if (ret != ERR_NO_ERROR)
16846 	{
16847 		// An error has occured
16848 		CmdPrintError(c, ret);
16849 		FreeParamValueList(o);
16850 		return ret;
16851 	}
16852 
16853 	FreeRpcSetUser(&t);
16854 
16855 	FreeParamValueList(o);
16856 
16857 	return 0;
16858 }
16859 
16860 // Set a security policy of the user
PsUserPolicySet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16861 UINT PsUserPolicySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16862 {
16863 	LIST *o;
16864 	PS *ps = (PS *)param;
16865 	UINT ret = 0;
16866 	RPC_SET_USER t;
16867 	// Parameter list that can be specified
16868 	PARAM args[] =
16869 	{
16870 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16871 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
16872 		{"NAME", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLNAME"), CmdEvalNotEmpty, NULL},
16873 		{"VALUE", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLVALUE"), CmdEvalNotEmpty, NULL},
16874 	};
16875 
16876 	// If virtual HUB is not selected, it's an error
16877 	if (ps->HubName == NULL)
16878 	{
16879 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16880 		return ERR_INVALID_PARAMETER;
16881 	}
16882 
16883 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16884 	if (o == NULL)
16885 	{
16886 		return ERR_INVALID_PARAMETER;
16887 	}
16888 
16889 	Zero(&t, sizeof(t));
16890 	// Get the user object
16891 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16892 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
16893 
16894 	ret = ScGetUser(ps->Rpc, &t);
16895 	if (ret != ERR_NO_ERROR)
16896 	{
16897 		// An error has occured
16898 		CmdPrintError(c, ret);
16899 		FreeParamValueList(o);
16900 		return ret;
16901 	}
16902 
16903 	// Update
16904 	if (t.Policy == NULL)
16905 	{
16906 		t.Policy = ClonePolicy(GetDefaultPolicy());
16907 	}
16908 
16909 	// Edit
16910 	if (EditPolicy(c, t.Policy, GetParamStr(o, "NAME"), GetParamStr(o, "VALUE"), false) == false)
16911 	{
16912 		ret = ERR_INVALID_PARAMETER;
16913 	}
16914 	else
16915 	{
16916 		// Write the user object
16917 		ret = ScSetUser(ps->Rpc, &t);
16918 
16919 		if (ret != ERR_NO_ERROR)
16920 		{
16921 			// An error has occured
16922 			CmdPrintError(c, ret);
16923 			FreeParamValueList(o);
16924 			return ret;
16925 		}
16926 	}
16927 
16928 	FreeRpcSetUser(&t);
16929 
16930 	FreeParamValueList(o);
16931 
16932 	return ret;
16933 }
16934 
16935 // Convert the string to a date and time
StrToDateTime64(char * str)16936 UINT64 StrToDateTime64(char *str)
16937 {
16938 	UINT64 ret = 0;
16939 	TOKEN_LIST *t;
16940 	UINT a, b, c, d, e, f;
16941 	// Validate arguments
16942 	if (str == NULL)
16943 	{
16944 		return INFINITE;
16945 	}
16946 
16947 	if (IsEmptyStr(str) || StrCmpi(str, "none") == 0)
16948 	{
16949 		return 0;
16950 	}
16951 
16952 	t = ParseToken(str, ":/,. \"");
16953 	if (t->NumTokens != 6)
16954 	{
16955 		FreeToken(t);
16956 		return INFINITE;
16957 	}
16958 
16959 	a = ToInt(t->Token[0]);
16960 	b = ToInt(t->Token[1]);
16961 	c = ToInt(t->Token[2]);
16962 	d = ToInt(t->Token[3]);
16963 	e = ToInt(t->Token[4]);
16964 	f = ToInt(t->Token[5]);
16965 
16966 	ret = INFINITE;
16967 
16968 	if (a >= 1000 && a <= 9999 && b >= 1 && b <= 12 && c >= 1 && c <= 31 &&
16969 		d >= 0 && d <= 23 && e >= 0 && e <= 59 && f >= 0 && f <= 59)
16970 	{
16971 		SYSTEMTIME t;
16972 
16973 		Zero(&t, sizeof(t));
16974 		t.wYear = a;
16975 		t.wMonth = b;
16976 		t.wDay = c;
16977 		t.wHour = d;
16978 		t.wMinute = e;
16979 		t.wSecond = f;
16980 
16981 		ret = SystemToUINT64(&t);
16982 	}
16983 
16984 	FreeToken(t);
16985 
16986 	return ret;
16987 }
16988 
16989 // Evaluate the date and time string
CmdEvalDateTime(CONSOLE * c,wchar_t * str,void * param)16990 bool CmdEvalDateTime(CONSOLE *c, wchar_t *str, void *param)
16991 {
16992 	UINT64 ret;
16993 	char tmp[MAX_SIZE];
16994 	// Validate arguments
16995 	if (c == NULL || str == NULL)
16996 	{
16997 		return false;
16998 	}
16999 
17000 	UniToStr(tmp, sizeof(tmp), str);
17001 
17002 	ret = StrToDateTime64(tmp);
17003 
17004 	if (ret == INFINITE)
17005 	{
17006 		c->Write(c, _UU("CMD_EVAL_DATE_TIME_FAILED"));
17007 		return false;
17008 	}
17009 
17010 	return true;
17011 }
17012 
17013 // Set the expiration date of the user
PsUserExpiresSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17014 UINT PsUserExpiresSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17015 {
17016 	LIST *o;
17017 	PS *ps = (PS *)param;
17018 	UINT ret = 0;
17019 	RPC_SET_USER t;
17020 	UINT64 expires;
17021 	// Parameter list that can be specified
17022 	PARAM args[] =
17023 	{
17024 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17025 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17026 		{"EXPIRES", CmdPrompt, _UU("CMD_UserExpiresSet_Prompt_EXPIRES"), CmdEvalDateTime, NULL},
17027 	};
17028 
17029 	// If virtual HUB is not selected, it's an error
17030 	if (ps->HubName == NULL)
17031 	{
17032 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17033 		return ERR_INVALID_PARAMETER;
17034 	}
17035 
17036 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17037 	if (o == NULL)
17038 	{
17039 		return ERR_INVALID_PARAMETER;
17040 	}
17041 
17042 	Zero(&t, sizeof(t));
17043 	// Get the user object
17044 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17045 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17046 
17047 	ret = ScGetUser(ps->Rpc, &t);
17048 	if (ret != ERR_NO_ERROR)
17049 	{
17050 		// An error has occured
17051 		CmdPrintError(c, ret);
17052 		FreeParamValueList(o);
17053 		return ret;
17054 	}
17055 
17056 	// Update the information
17057 	expires = StrToDateTime64(GetParamStr(o, "EXPIRES"));
17058 
17059 	if (expires != 0)
17060 	{
17061 		expires = LocalToSystem64(expires);
17062 	}
17063 
17064 	t.ExpireTime = expires;
17065 
17066 	// Write the user object
17067 	ret = ScSetUser(ps->Rpc, &t);
17068 
17069 	if (ret != ERR_NO_ERROR)
17070 	{
17071 		// An error has occured
17072 		CmdPrintError(c, ret);
17073 		FreeParamValueList(o);
17074 		return ret;
17075 	}
17076 
17077 	FreeRpcSetUser(&t);
17078 
17079 	FreeParamValueList(o);
17080 
17081 	return 0;
17082 }
17083 
17084 // Get the group list
PsGroupList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17085 UINT PsGroupList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17086 {
17087 	LIST *o;
17088 	PS *ps = (PS *)param;
17089 	UINT ret = 0;
17090 	RPC_ENUM_GROUP t;
17091 
17092 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
17093 	if (o == NULL)
17094 	{
17095 		return ERR_INVALID_PARAMETER;
17096 	}
17097 
17098 	// If virtual HUB is not selected, it's an error
17099 	if (ps->HubName == NULL)
17100 	{
17101 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17102 		return ERR_INVALID_PARAMETER;
17103 	}
17104 
17105 	Zero(&t, sizeof(t));
17106 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17107 
17108 	// RPC call
17109 	ret = ScEnumGroup(ps->Rpc, &t);
17110 
17111 	if (ret != ERR_NO_ERROR)
17112 	{
17113 		// An error has occured
17114 		CmdPrintError(c, ret);
17115 		FreeParamValueList(o);
17116 		return ret;
17117 	}
17118 	else
17119 	{
17120 		CT *ct = CtNew();
17121 		UINT i;
17122 
17123 		CtInsertColumn(ct, _UU("SM_GROUPLIST_NAME"), false);
17124 		CtInsertColumn(ct, _UU("SM_GROUPLIST_REALNAME"), false);
17125 		CtInsertColumn(ct, _UU("SM_GROUPLIST_NOTE"), false);
17126 		CtInsertColumn(ct, _UU("SM_GROUPLIST_NUMUSERS"), false);
17127 
17128 		for (i = 0;i < t.NumGroup;i++)
17129 		{
17130 			wchar_t tmp1[MAX_SIZE];
17131 			wchar_t tmp2[MAX_SIZE];
17132 			RPC_ENUM_GROUP_ITEM *e = &t.Groups[i];
17133 
17134 			StrToUni(tmp1, sizeof(tmp1), e->Name);
17135 			UniToStru(tmp2, e->NumUsers);
17136 
17137 			CtInsert(ct, tmp1, e->Realname, e->Note, tmp2);
17138 		}
17139 
17140 		CtFreeEx(ct, c, true);
17141 	}
17142 
17143 	FreeRpcEnumGroup(&t);
17144 
17145 	FreeParamValueList(o);
17146 
17147 	return 0;
17148 }
17149 
17150 // Create a group
PsGroupCreate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17151 UINT PsGroupCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17152 {
17153 	LIST *o;
17154 	PS *ps = (PS *)param;
17155 	UINT ret = 0;
17156 	RPC_SET_GROUP t;
17157 	// Parameter list that can be specified
17158 	PARAM args[] =
17159 	{
17160 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17161 		{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17162 		{"REALNAME", CmdPrompt, _UU("CMD_GroupCreate_Prompt_REALNAME"), NULL, NULL},
17163 		{"NOTE", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NOTE"), NULL, NULL},
17164 	};
17165 
17166 	// If virtual HUB is not selected, it's an error
17167 	if (ps->HubName == NULL)
17168 	{
17169 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17170 		return ERR_INVALID_PARAMETER;
17171 	}
17172 
17173 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17174 	if (o == NULL)
17175 	{
17176 		return ERR_INVALID_PARAMETER;
17177 	}
17178 
17179 	Zero(&t, sizeof(t));
17180 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17181 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17182 	UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));
17183 	UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));
17184 
17185 	// RPC call
17186 	ret = ScCreateGroup(ps->Rpc, &t);
17187 
17188 	if (ret != ERR_NO_ERROR)
17189 	{
17190 		// An error has occured
17191 		CmdPrintError(c, ret);
17192 		FreeParamValueList(o);
17193 		return ret;
17194 	}
17195 
17196 	FreeRpcSetGroup(&t);
17197 
17198 	FreeParamValueList(o);
17199 
17200 	return 0;
17201 }
17202 
17203 // Set the group information
PsGroupSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17204 UINT PsGroupSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17205 {
17206 	LIST *o;
17207 	PS *ps = (PS *)param;
17208 	UINT ret = 0;
17209 	RPC_SET_GROUP t;
17210 	// Parameter list that can be specified
17211 	PARAM args[] =
17212 	{
17213 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17214 		{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17215 		{"REALNAME", CmdPrompt, _UU("CMD_GroupCreate_Prompt_REALNAME"), NULL, NULL},
17216 		{"NOTE", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NOTE"), NULL, NULL},
17217 	};
17218 
17219 	// If virtual HUB is not selected, it's an error
17220 	if (ps->HubName == NULL)
17221 	{
17222 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17223 		return ERR_INVALID_PARAMETER;
17224 	}
17225 
17226 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17227 	if (o == NULL)
17228 	{
17229 		return ERR_INVALID_PARAMETER;
17230 	}
17231 
17232 	Zero(&t, sizeof(t));
17233 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17234 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17235 
17236 	// RPC call
17237 	ret = ScGetGroup(ps->Rpc, &t);
17238 
17239 	if (ret != ERR_NO_ERROR)
17240 	{
17241 		// An error has occured
17242 		CmdPrintError(c, ret);
17243 		FreeParamValueList(o);
17244 		return ret;
17245 	}
17246 
17247 	// Information update
17248 	UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));
17249 	UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));
17250 
17251 	// RPC call
17252 	ret = ScSetGroup(ps->Rpc, &t);
17253 
17254 	if (ret != ERR_NO_ERROR)
17255 	{
17256 		// An error has occured
17257 		CmdPrintError(c, ret);
17258 		FreeParamValueList(o);
17259 		return ret;
17260 	}
17261 
17262 	FreeRpcSetGroup(&t);
17263 
17264 	FreeParamValueList(o);
17265 
17266 	return 0;
17267 }
17268 
17269 // Delete a group
PsGroupDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17270 UINT PsGroupDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17271 {
17272 	LIST *o;
17273 	PS *ps = (PS *)param;
17274 	UINT ret = 0;
17275 	RPC_DELETE_USER t;
17276 	// Parameter list that can be specified
17277 	PARAM args[] =
17278 	{
17279 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17280 		{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17281 	};
17282 
17283 	// If virtual HUB is not selected, it's an error
17284 	if (ps->HubName == NULL)
17285 	{
17286 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17287 		return ERR_INVALID_PARAMETER;
17288 	}
17289 
17290 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17291 	if (o == NULL)
17292 	{
17293 		return ERR_INVALID_PARAMETER;
17294 	}
17295 
17296 	Zero(&t, sizeof(t));
17297 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17298 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17299 
17300 	// RPC call
17301 	ret = ScDeleteGroup(ps->Rpc, &t);
17302 
17303 	if (ret != ERR_NO_ERROR)
17304 	{
17305 		// An error has occured
17306 		CmdPrintError(c, ret);
17307 		FreeParamValueList(o);
17308 		return ret;
17309 	}
17310 
17311 	FreeParamValueList(o);
17312 
17313 	return 0;
17314 }
17315 
17316 // Get the group information and the list of users who belong to the group
PsGroupGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17317 UINT PsGroupGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17318 {
17319 	LIST *o;
17320 	PS *ps = (PS *)param;
17321 	UINT ret = 0;
17322 	RPC_SET_GROUP t;
17323 	// Parameter list that can be specified
17324 	PARAM args[] =
17325 	{
17326 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17327 		{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17328 	};
17329 
17330 	// If virtual HUB is not selected, it's an error
17331 	if (ps->HubName == NULL)
17332 	{
17333 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17334 		return ERR_INVALID_PARAMETER;
17335 	}
17336 
17337 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17338 	if (o == NULL)
17339 	{
17340 		return ERR_INVALID_PARAMETER;
17341 	}
17342 
17343 	Zero(&t, sizeof(t));
17344 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17345 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17346 
17347 	// RPC call
17348 	ret = ScGetGroup(ps->Rpc, &t);
17349 
17350 	if (ret != ERR_NO_ERROR)
17351 	{
17352 		// An error has occured
17353 		CmdPrintError(c, ret);
17354 		FreeParamValueList(o);
17355 		return ret;
17356 	}
17357 	else
17358 	{
17359 		wchar_t tmp[MAX_SIZE];
17360 		char groupname[MAX_USERNAME_LEN + 1];
17361 		CT *ct = CtNewStandard();
17362 
17363 		StrCpy(groupname, sizeof(groupname), t.Name);
17364 
17365 		StrToUni(tmp, sizeof(tmp), t.Name);
17366 		CtInsert(ct, _UU("CMD_GroupGet_Column_NAME"), tmp);
17367 		CtInsert(ct, _UU("CMD_GroupGet_Column_REALNAME"), t.Realname);
17368 		CtInsert(ct, _UU("CMD_GroupGet_Column_NOTE"), t.Note);
17369 
17370 		CtFree(ct, c);
17371 
17372 		if (t.Policy != NULL)
17373 		{
17374 			c->Write(c, L"");
17375 			c->Write(c, _UU("CMD_GroupGet_Column_POLICY"));
17376 
17377 			PrintPolicy(c, t.Policy, false);
17378 		}
17379 
17380 		{
17381 			RPC_ENUM_USER t;
17382 			bool b = false;
17383 
17384 			Zero(&t, sizeof(t));
17385 
17386 			StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17387 
17388 			if (ScEnumUser(ps->Rpc, &t) == ERR_NO_ERROR)
17389 			{
17390 				UINT i;
17391 
17392 				for (i = 0;i < t.NumUser;i++)
17393 				{
17394 					RPC_ENUM_USER_ITEM *u = &t.Users[i];
17395 
17396 					if (StrCmpi(u->GroupName, groupname) == 0)
17397 					{
17398 						if (b == false)
17399 						{
17400 							b = true;
17401 							c->Write(c, L"");
17402 							c->Write(c, _UU("CMD_GroupGet_Column_MEMBERS"));
17403 						}
17404 
17405 						UniFormat(tmp, sizeof(tmp), L" %S", u->Name);
17406 						c->Write(c, tmp);
17407 					}
17408 				}
17409 				FreeRpcEnumUser(&t);
17410 
17411 				if (b)
17412 				{
17413 					c->Write(c, L"");
17414 				}
17415 			}
17416 		}
17417 
17418 	}
17419 
17420 	FreeRpcSetGroup(&t);
17421 
17422 	FreeParamValueList(o);
17423 
17424 	return 0;
17425 }
17426 
17427 // Add an user to the group
PsGroupJoin(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17428 UINT PsGroupJoin(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17429 {
17430 	LIST *o;
17431 	PS *ps = (PS *)param;
17432 	UINT ret = 0;
17433 	RPC_SET_USER t;
17434 	// Parameter list that can be specified
17435 	PARAM args[] =
17436 	{
17437 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17438 		{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17439 		{"USERNAME", CmdPrompt, _UU("CMD_GroupJoin_Prompt_USERNAME"), CmdEvalNotEmpty, NULL},
17440 	};
17441 
17442 	// If virtual HUB is not selected, it's an error
17443 	if (ps->HubName == NULL)
17444 	{
17445 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17446 		return ERR_INVALID_PARAMETER;
17447 	}
17448 
17449 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17450 	if (o == NULL)
17451 	{
17452 		return ERR_INVALID_PARAMETER;
17453 	}
17454 
17455 	Zero(&t, sizeof(t));
17456 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17457 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "USERNAME"));
17458 
17459 	// RPC call
17460 	ret = ScGetUser(ps->Rpc, &t);
17461 
17462 	if (ret != ERR_NO_ERROR)
17463 	{
17464 		// An error has occured
17465 		CmdPrintError(c, ret);
17466 		FreeParamValueList(o);
17467 		return ret;
17468 	}
17469 	else
17470 	{
17471 		// Update the Group
17472 		StrCpy(t.GroupName, sizeof(t.GroupName), GetParamStr(o, "[name]"));
17473 
17474 		ret = ScSetUser(ps->Rpc, &t);
17475 
17476 		if (ret != ERR_NO_ERROR)
17477 		{
17478 			// An error has occured
17479 			CmdPrintError(c, ret);
17480 			FreeParamValueList(o);
17481 			return ret;
17482 		}
17483 	}
17484 
17485 	FreeRpcSetUser(&t);
17486 
17487 	FreeParamValueList(o);
17488 
17489 	return 0;
17490 }
17491 
17492 // Delete the user from a group
PsGroupUnjoin(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17493 UINT PsGroupUnjoin(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17494 {
17495 	LIST *o;
17496 	PS *ps = (PS *)param;
17497 	UINT ret = 0;
17498 	RPC_SET_USER t;
17499 	// Parameter list that can be specified
17500 	PARAM args[] =
17501 	{
17502 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17503 		{"[name]", CmdPrompt, _UU("CMD_GroupUnjoin_Prompt_name"), CmdEvalNotEmpty, NULL},
17504 	};
17505 
17506 	// If virtual HUB is not selected, it's an error
17507 	if (ps->HubName == NULL)
17508 	{
17509 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17510 		return ERR_INVALID_PARAMETER;
17511 	}
17512 
17513 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17514 	if (o == NULL)
17515 	{
17516 		return ERR_INVALID_PARAMETER;
17517 	}
17518 
17519 	Zero(&t, sizeof(t));
17520 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17521 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17522 
17523 	// RPC call
17524 	ret = ScGetUser(ps->Rpc, &t);
17525 
17526 	if (ret != ERR_NO_ERROR)
17527 	{
17528 		// An error has occured
17529 		CmdPrintError(c, ret);
17530 		FreeParamValueList(o);
17531 		return ret;
17532 	}
17533 	else
17534 	{
17535 		// Update the Group
17536 		StrCpy(t.GroupName, sizeof(t.GroupName), "");
17537 
17538 		ret = ScSetUser(ps->Rpc, &t);
17539 
17540 		if (ret != ERR_NO_ERROR)
17541 		{
17542 			// An error has occured
17543 			CmdPrintError(c, ret);
17544 			FreeParamValueList(o);
17545 			return ret;
17546 		}
17547 	}
17548 
17549 	FreeRpcSetUser(&t);
17550 
17551 	FreeParamValueList(o);
17552 
17553 	return 0;
17554 }
17555 
17556 // Delete the security policy of the group
PsGroupPolicyRemove(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17557 UINT PsGroupPolicyRemove(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17558 {
17559 	LIST *o;
17560 	PS *ps = (PS *)param;
17561 	UINT ret = 0;
17562 	RPC_SET_GROUP t;
17563 	// Parameter list that can be specified
17564 	PARAM args[] =
17565 	{
17566 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17567 		{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17568 	};
17569 
17570 	// If virtual HUB is not selected, it's an error
17571 	if (ps->HubName == NULL)
17572 	{
17573 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17574 		return ERR_INVALID_PARAMETER;
17575 	}
17576 
17577 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17578 	if (o == NULL)
17579 	{
17580 		return ERR_INVALID_PARAMETER;
17581 	}
17582 
17583 	Zero(&t, sizeof(t));
17584 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17585 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17586 
17587 	// RPC call
17588 	ret = ScGetGroup(ps->Rpc, &t);
17589 
17590 	if (ret != ERR_NO_ERROR)
17591 	{
17592 		// An error has occured
17593 		CmdPrintError(c, ret);
17594 		FreeParamValueList(o);
17595 		return ret;
17596 	}
17597 	else
17598 	{
17599 		// Update
17600 		if (t.Policy != NULL)
17601 		{
17602 			Free(t.Policy);
17603 			t.Policy = NULL;
17604 		}
17605 
17606 		ret = ScSetGroup(ps->Rpc, &t);
17607 
17608 		if (ret != ERR_NO_ERROR)
17609 		{
17610 			// An error has occured
17611 			CmdPrintError(c, ret);
17612 			FreeParamValueList(o);
17613 			return ret;
17614 		}
17615 	}
17616 
17617 	FreeRpcSetGroup(&t);
17618 
17619 	FreeParamValueList(o);
17620 
17621 	return 0;
17622 }
17623 
17624 // Set a security policy to a group
PsGroupPolicySet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17625 UINT PsGroupPolicySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17626 {
17627 	LIST *o;
17628 	PS *ps = (PS *)param;
17629 	UINT ret = 0;
17630 	RPC_SET_GROUP t;
17631 	// Parameter list that can be specified
17632 	PARAM args[] =
17633 	{
17634 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17635 		{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17636 		{"NAME", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLNAME"), CmdEvalNotEmpty, NULL},
17637 		{"VALUE", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLVALUE"), CmdEvalNotEmpty, NULL},
17638 	};
17639 
17640 	// If virtual HUB is not selected, it's an error
17641 	if (ps->HubName == NULL)
17642 	{
17643 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17644 		return ERR_INVALID_PARAMETER;
17645 	}
17646 
17647 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17648 	if (o == NULL)
17649 	{
17650 		return ERR_INVALID_PARAMETER;
17651 	}
17652 
17653 	Zero(&t, sizeof(t));
17654 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17655 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17656 
17657 	// RPC call
17658 	ret = ScGetGroup(ps->Rpc, &t);
17659 
17660 	if (ret != ERR_NO_ERROR)
17661 	{
17662 		// An error has occured
17663 		CmdPrintError(c, ret);
17664 		FreeParamValueList(o);
17665 		return ret;
17666 	}
17667 	else
17668 	{
17669 		// Update
17670 		if (t.Policy == NULL)
17671 		{
17672 			t.Policy = ClonePolicy(GetDefaultPolicy());
17673 		}
17674 
17675 		if (EditPolicy(c, t.Policy, GetParamStr(o, "NAME"), GetParamStr(o, "VALUE"), false) == false)
17676 		{
17677 			// An error has occured
17678 			FreeRpcSetGroup(&t);
17679 			CmdPrintError(c, ret);
17680 			FreeParamValueList(o);
17681 			return ERR_INTERNAL_ERROR;
17682 		}
17683 
17684 		ret = ScSetGroup(ps->Rpc, &t);
17685 
17686 		if (ret != ERR_NO_ERROR)
17687 		{
17688 			// An error has occured
17689 			CmdPrintError(c, ret);
17690 			FreeParamValueList(o);
17691 			return ret;
17692 		}
17693 	}
17694 
17695 	FreeRpcSetGroup(&t);
17696 
17697 	FreeParamValueList(o);
17698 
17699 	return 0;
17700 }
17701 
17702 // Get the connected session list
PsSessionList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17703 UINT PsSessionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17704 {
17705 	LIST *o;
17706 	PS *ps = (PS *)param;
17707 	UINT ret = 0;
17708 	RPC_ENUM_SESSION t;
17709 	UINT server_type = 0;
17710 
17711 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
17712 	if (o == NULL)
17713 	{
17714 		return ERR_INVALID_PARAMETER;
17715 	}
17716 
17717 	// If virtual HUB is not selected, it's an error
17718 	if (ps->HubName == NULL)
17719 	{
17720 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17721 		return ERR_INVALID_PARAMETER;
17722 	}
17723 
17724 	{
17725 		// Get the server type
17726 		RPC_SERVER_INFO t;
17727 
17728 		Zero(&t, sizeof(t));
17729 
17730 		if (ScGetServerInfo(ps->Rpc, &t) == ERR_NO_ERROR)
17731 		{
17732 			server_type = t.ServerType;
17733 
17734 			FreeRpcServerInfo(&t);
17735 		}
17736 	}
17737 
17738 	Zero(&t, sizeof(t));
17739 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17740 
17741 	// RPC call
17742 	ret = ScEnumSession(ps->Rpc, &t);
17743 
17744 	if (ret != ERR_NO_ERROR)
17745 	{
17746 		// An error has occured
17747 		CmdPrintError(c, ret);
17748 		FreeParamValueList(o);
17749 		return ret;
17750 	}
17751 	else
17752 	{
17753 		CT *ct = CtNew();
17754 		UINT i;
17755 
17756 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_1"), false);
17757 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_8"), false);
17758 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_2"), false);
17759 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_3"), false);
17760 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_4"), false);
17761 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_5"), true);
17762 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_6"), true);
17763 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_7"), true);
17764 
17765 		for (i = 0;i < t.NumSession;i++)
17766 		{
17767 			RPC_ENUM_SESSION_ITEM *e = &t.Sessions[i];
17768 			wchar_t tmp1[MAX_SIZE];
17769 			wchar_t *tmp2;
17770 			wchar_t tmp3[MAX_SIZE];
17771 			wchar_t tmp4[MAX_SIZE];
17772 			wchar_t tmp5[MAX_SIZE];
17773 			wchar_t tmp6[MAX_SIZE];
17774 			wchar_t tmp7[MAX_SIZE];
17775 			wchar_t tmp8[MAX_SIZE];
17776 			bool free_tmp2 = false;
17777 
17778 			StrToUni(tmp1, sizeof(tmp1), e->Name);
17779 
17780 			tmp2 = _UU("SM_SESS_NORMAL");
17781 			if (server_type != SERVER_TYPE_STANDALONE)
17782 			{
17783 				if (e->RemoteSession)
17784 				{
17785 					tmp2 = ZeroMalloc(MAX_SIZE);
17786 					UniFormat(tmp2, MAX_SIZE, _UU("SM_SESS_REMOTE"), e->RemoteHostname);
17787 					free_tmp2 = true;
17788 				}
17789 				else
17790 				{
17791 					if (StrLen(e->RemoteHostname) == 0)
17792 					{
17793 						tmp2 = _UU("SM_SESS_LOCAL");
17794 					}
17795 					else
17796 					{
17797 						tmp2 = ZeroMalloc(MAX_SIZE);
17798 						UniFormat(tmp2, MAX_SIZE, _UU("SM_SESS_LOCAL_2"), e->RemoteHostname);
17799 						free_tmp2 = true;
17800 					}
17801 				}
17802 			}
17803 			if (e->LinkMode)
17804 			{
17805 				if (free_tmp2)
17806 				{
17807 					Free(tmp2);
17808 					free_tmp2 = false;
17809 				}
17810 				tmp2 = _UU("SM_SESS_LINK");
17811 			}
17812 			else if (e->SecureNATMode)
17813 			{
17814 				/*if (free_tmp2)
17815 				{
17816 					Free(tmp2);
17817 					free_tmp2 = false;
17818 				}*/
17819 				tmp2 = _UU("SM_SESS_SNAT");
17820 			}
17821 
17822 			StrToUni(tmp3, sizeof(tmp3), e->Username);
17823 
17824 			StrToUni(tmp4, sizeof(tmp4), e->Hostname);
17825 			if (e->LinkMode)
17826 			{
17827 				UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_LINK_HOSTNAME"));
17828 			}
17829 			else if (e->SecureNATMode)
17830 			{
17831 				UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_SNAT_HOSTNAME"));
17832 			}
17833 			else if (e->BridgeMode)
17834 			{
17835 				UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_BRIDGE_HOSTNAME"));
17836 			}
17837 			else if (StartWith(e->Username, L3_USERNAME))
17838 			{
17839 				UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_LAYER3_HOSTNAME"));
17840 			}
17841 
17842 			UniFormat(tmp5, sizeof(tmp5), L"%u / %u", e->CurrentNumTcp, e->MaxNumTcp);
17843 			if (e->LinkMode)
17844 			{
17845 				UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_LINK_TCP"));
17846 			}
17847 			else if (e->SecureNATMode)
17848 			{
17849 				UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_SNAT_TCP"));
17850 			}
17851 			else if (e->BridgeMode)
17852 			{
17853 				UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_BRIDGE_TCP"));
17854 			}
17855 
17856 			UniToStr3(tmp6, sizeof(tmp6), e->PacketSize);
17857 			UniToStr3(tmp7, sizeof(tmp7), e->PacketNum);
17858 
17859 			if (e->VLanId == 0)
17860 			{
17861 				UniStrCpy(tmp8, sizeof(tmp8), _UU("CM_ST_NO_VLAN"));
17862 			}
17863 			else
17864 			{
17865 				UniToStru(tmp8, e->VLanId);
17866 			}
17867 
17868 			CtInsert(ct, tmp1, tmp8, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);
17869 
17870 			if (free_tmp2)
17871 			{
17872 				Free(tmp2);
17873 			}
17874 		}
17875 
17876 
17877 		CtFreeEx(ct, c, true);
17878 	}
17879 
17880 	FreeRpcEnumSession(&t);
17881 
17882 	FreeParamValueList(o);
17883 
17884 	return 0;
17885 }
17886 
17887 // Display the NODE_INFO
CmdPrintNodeInfo(CT * ct,NODE_INFO * info)17888 void CmdPrintNodeInfo(CT *ct, NODE_INFO *info)
17889 {
17890 	wchar_t tmp[MAX_SIZE];
17891 	char str[MAX_SIZE];
17892 	// Validate arguments
17893 	if (ct == NULL || info == NULL)
17894 	{
17895 		return;
17896 	}
17897 
17898 	StrToUni(tmp, sizeof(tmp), info->ClientProductName);
17899 	CtInsert(ct, _UU("SM_NODE_CLIENT_NAME"), tmp);
17900 
17901 	UniFormat(tmp, sizeof(tmp), L"%u.%02u", Endian32(info->ClientProductVer) / 100, Endian32(info->ClientProductVer) % 100);
17902 	CtInsert(ct, _UU("SM_NODE_CLIENT_VER"), tmp);
17903 
17904 	UniFormat(tmp, sizeof(tmp), L"Build %u", Endian32(info->ClientProductBuild));
17905 	CtInsert(ct, _UU("SM_NODE_CLIENT_BUILD"), tmp);
17906 
17907 	StrToUni(tmp, sizeof(tmp), info->ClientOsName);
17908 	CtInsert(ct, _UU("SM_NODE_CLIENT_OS_NAME"), tmp);
17909 
17910 	StrToUni(tmp, sizeof(tmp), info->ClientOsVer);
17911 	CtInsert(ct, _UU("SM_NODE_CLIENT_OS_VER"), tmp);
17912 
17913 	StrToUni(tmp, sizeof(tmp), info->ClientOsProductId);
17914 	CtInsert(ct, _UU("SM_NODE_CLIENT_OS_PID"), tmp);
17915 
17916 	StrToUni(tmp, sizeof(tmp), info->ClientHostname);
17917 	CtInsert(ct, _UU("SM_NODE_CLIENT_HOST"), tmp);
17918 
17919 	IPToStr4or6(str, sizeof(str), info->ClientIpAddress, info->ClientIpAddress6);
17920 	StrToUni(tmp, sizeof(tmp), str);
17921 	CtInsert(ct, _UU("SM_NODE_CLIENT_IP"), tmp);
17922 
17923 	UniToStru(tmp, Endian32(info->ClientPort));
17924 	CtInsert(ct, _UU("SM_NODE_CLIENT_PORT"), tmp);
17925 
17926 	StrToUni(tmp, sizeof(tmp), info->ServerHostname);
17927 	CtInsert(ct, _UU("SM_NODE_SERVER_HOST"), tmp);
17928 
17929 	IPToStr4or6(str, sizeof(str), info->ServerIpAddress, info->ServerIpAddress6);
17930 	StrToUni(tmp, sizeof(tmp), str);
17931 	CtInsert(ct, _UU("SM_NODE_SERVER_IP"), tmp);
17932 
17933 	UniToStru(tmp, Endian32(info->ServerPort));
17934 	CtInsert(ct, _UU("SM_NODE_SERVER_PORT"), tmp);
17935 
17936 	if (StrLen(info->ProxyHostname) != 0)
17937 	{
17938 		StrToUni(tmp, sizeof(tmp), info->ProxyHostname);
17939 		CtInsert(ct, _UU("SM_NODE_PROXY_HOSTNAME"), tmp);
17940 
17941 		IPToStr4or6(str, sizeof(str), info->ProxyIpAddress, info->ProxyIpAddress6);
17942 		StrToUni(tmp, sizeof(tmp), str);
17943 		CtInsert(ct, _UU("SM_NODE_PROXY_IP"), tmp);
17944 
17945 		UniToStru(tmp, Endian32(info->ProxyPort));
17946 		CtInsert(ct, _UU("SM_NODE_PROXY_PORT"), tmp);
17947 	}
17948 }
17949 
17950 // Get the session information
PsSessionGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17951 UINT PsSessionGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17952 {
17953 	LIST *o;
17954 	PS *ps = (PS *)param;
17955 	UINT ret = 0;
17956 	RPC_SESSION_STATUS t;
17957 	// Parameter list that can be specified
17958 	PARAM args[] =
17959 	{
17960 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17961 		{"[name]", CmdPrompt, _UU("CMD_SessionGet_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17962 	};
17963 
17964 	// If virtual HUB is not selected, it's an error
17965 	if (ps->HubName == NULL)
17966 	{
17967 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17968 		return ERR_INVALID_PARAMETER;
17969 	}
17970 
17971 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17972 	if (o == NULL)
17973 	{
17974 		return ERR_INVALID_PARAMETER;
17975 	}
17976 
17977 	Zero(&t, sizeof(t));
17978 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17979 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17980 
17981 	// RPC call
17982 	ret = ScGetSessionStatus(ps->Rpc, &t);
17983 
17984 	if (ret != ERR_NO_ERROR)
17985 	{
17986 		// An error has occured
17987 		CmdPrintError(c, ret);
17988 		FreeParamValueList(o);
17989 		return ret;
17990 	}
17991 	else
17992 	{
17993 		wchar_t tmp[MAX_SIZE];
17994 		char str[MAX_SIZE];
17995 		CT *ct = CtNewStandard();
17996 
17997 		if (t.ClientIp != 0)
17998 		{
17999 			IPToStr4or6(str, sizeof(str), t.ClientIp, t.ClientIp6);
18000 			StrToUni(tmp, sizeof(tmp), str);
18001 			CtInsert(ct, _UU("SM_CLIENT_IP"), tmp);
18002 		}
18003 
18004 		if (StrLen(t.ClientHostName) != 0)
18005 		{
18006 			StrToUni(tmp, sizeof(tmp), t.ClientHostName);
18007 			CtInsert(ct, _UU("SM_CLIENT_HOSTNAME"), tmp);
18008 		}
18009 
18010 		StrToUni(tmp, sizeof(tmp), t.Username);
18011 		CtInsert(ct, _UU("SM_SESS_STATUS_USERNAME"), tmp);
18012 
18013 		if (StrCmpi(t.Username, LINK_USER_NAME_PRINT) != 0 && StrCmpi(t.Username, SNAT_USER_NAME_PRINT) != 0 && StrCmpi(t.Username, BRIDGE_USER_NAME_PRINT) != 0)
18014 		{
18015 			StrToUni(tmp, sizeof(tmp), t.RealUsername);
18016 			CtInsert(ct, _UU("SM_SESS_STATUS_REALUSER"), tmp);
18017 		}
18018 
18019 		if (IsEmptyStr(t.GroupName) == false)
18020 		{
18021 			StrToUni(tmp, sizeof(tmp), t.GroupName);
18022 			CtInsert(ct, _UU("SM_SESS_STATUS_GROUPNAME"), tmp);
18023 		}
18024 
18025 
18026 		CmdPrintStatusToListViewEx(ct, &t.Status, true);
18027 
18028 		if (StrCmpi(t.Username, LINK_USER_NAME_PRINT) != 0 && StrCmpi(t.Username, SNAT_USER_NAME_PRINT) != 0 && StrCmpi(t.Username, BRIDGE_USER_NAME_PRINT) != 0 &&
18029 			StartWith(t.Username, L3_USERNAME) == false)
18030 		{
18031 			CmdPrintNodeInfo(ct, &t.NodeInfo);
18032 		}
18033 
18034 		CtFree(ct, c);
18035 	}
18036 
18037 	FreeRpcSessionStatus(&t);
18038 
18039 	FreeParamValueList(o);
18040 
18041 	return 0;
18042 }
18043 
18044 // Disconnect the session
PsSessionDisconnect(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18045 UINT PsSessionDisconnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18046 {
18047 	LIST *o;
18048 	PS *ps = (PS *)param;
18049 	UINT ret = 0;
18050 	RPC_DELETE_SESSION t;
18051 	// Parameter list that can be specified
18052 	PARAM args[] =
18053 	{
18054 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18055 		{"[name]", CmdPrompt, _UU("CMD_SessionGet_Prompt_NAME"), CmdEvalNotEmpty, NULL},
18056 	};
18057 
18058 	// If virtual HUB is not selected, it's an error
18059 	if (ps->HubName == NULL)
18060 	{
18061 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18062 		return ERR_INVALID_PARAMETER;
18063 	}
18064 
18065 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18066 	if (o == NULL)
18067 	{
18068 		return ERR_INVALID_PARAMETER;
18069 	}
18070 
18071 	Zero(&t, sizeof(t));
18072 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18073 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
18074 
18075 	// RPC call
18076 	ret = ScDeleteSession(ps->Rpc, &t);
18077 
18078 	if (ret != ERR_NO_ERROR)
18079 	{
18080 		// An error has occured
18081 		CmdPrintError(c, ret);
18082 		FreeParamValueList(o);
18083 		return ret;
18084 	}
18085 
18086 	FreeParamValueList(o);
18087 
18088 	return 0;
18089 }
18090 
18091 // Get the MAC address table database
PsMacTable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18092 UINT PsMacTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18093 {
18094 	LIST *o;
18095 	PS *ps = (PS *)param;
18096 	UINT ret = 0;
18097 	RPC_ENUM_MAC_TABLE t;
18098 	UINT i;
18099 
18100 	// Parameter list that can be specified
18101 	PARAM args[] =
18102 	{
18103 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18104 		{"[session_name]", NULL, NULL, NULL, NULL,}
18105 	};
18106 
18107 	// If virtual HUB is not selected, it's an error
18108 	if (ps->HubName == NULL)
18109 	{
18110 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18111 		return ERR_INVALID_PARAMETER;
18112 	}
18113 
18114 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18115 	if (o == NULL)
18116 	{
18117 		return ERR_INVALID_PARAMETER;
18118 	}
18119 
18120 	Zero(&t, sizeof(t));
18121 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18122 
18123 	// RPC call
18124 	ret = ScEnumMacTable(ps->Rpc, &t);
18125 
18126 	if (ret != ERR_NO_ERROR)
18127 	{
18128 		// An error has occured
18129 		CmdPrintError(c, ret);
18130 		FreeParamValueList(o);
18131 		return ret;
18132 	}
18133 	else
18134 	{
18135 		CT *ct = CtNew();
18136 		char *session_name = GetParamStr(o, "[session_name]");
18137 
18138 		if (IsEmptyStr(session_name))
18139 		{
18140 			session_name = NULL;
18141 		}
18142 
18143 		CtInsertColumn(ct, _UU("CMD_ID"), false);
18144 		CtInsertColumn(ct, _UU("SM_MAC_COLUMN_1"), false);
18145 		CtInsertColumn(ct, _UU("SM_MAC_COLUMN_1A"), false);
18146 		CtInsertColumn(ct, _UU("SM_MAC_COLUMN_2"), false);
18147 		CtInsertColumn(ct, _UU("SM_MAC_COLUMN_3"), false);
18148 		CtInsertColumn(ct, _UU("SM_MAC_COLUMN_4"), false);
18149 		CtInsertColumn(ct, _UU("SM_MAC_COLUMN_5"), false);
18150 
18151 		for (i = 0;i < t.NumMacTable;i++)
18152 		{
18153 			char str[MAX_SIZE];
18154 			wchar_t tmp0[128];
18155 			wchar_t tmp1[MAX_SIZE];
18156 			wchar_t tmp2[MAX_SIZE];
18157 			wchar_t tmp3[MAX_SIZE];
18158 			wchar_t tmp4[MAX_SIZE];
18159 			wchar_t tmp5[MAX_SIZE];
18160 			wchar_t tmp6[MAX_SIZE];
18161 
18162 			RPC_ENUM_MAC_TABLE_ITEM *e = &t.MacTables[i];
18163 
18164 			if (session_name == NULL || StrCmpi(e->SessionName, session_name) == 0)
18165 			{
18166 				UniToStru(tmp0, e->Key);
18167 
18168 				StrToUni(tmp1, sizeof(tmp1), e->SessionName);
18169 
18170 				MacToStr(str, sizeof(str), e->MacAddress);
18171 				StrToUni(tmp2, sizeof(tmp2), str);
18172 
18173 				GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->CreatedTime));
18174 
18175 				GetDateTimeStr64Uni(tmp4, sizeof(tmp4), SystemToLocal64(e->UpdatedTime));
18176 
18177 				if (StrLen(e->RemoteHostname) == 0)
18178 				{
18179 					UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_MACIP_LOCAL"));
18180 				}
18181 				else
18182 				{
18183 					UniFormat(tmp5, sizeof(tmp5), _UU("SM_MACIP_SERVER"), e->RemoteHostname);
18184 				}
18185 
18186 				UniToStru(tmp6, e->VlanId);
18187 				if (e->VlanId == 0)
18188 				{
18189 					UniStrCpy(tmp6, sizeof(tmp6), _UU("CM_ST_NONE"));
18190 				}
18191 
18192 				CtInsert(ct,
18193 					tmp0, tmp1, tmp6, tmp2, tmp3, tmp4, tmp5);
18194 			}
18195 		}
18196 
18197 		CtFreeEx(ct, c, true);
18198 	}
18199 
18200 	FreeRpcEnumMacTable(&t);
18201 
18202 	FreeParamValueList(o);
18203 
18204 	return 0;
18205 }
18206 
18207 // Delete a MAC address table entry
PsMacDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18208 UINT PsMacDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18209 {
18210 	LIST *o;
18211 	PS *ps = (PS *)param;
18212 	UINT ret = 0;
18213 	RPC_DELETE_TABLE t;
18214 	// Parameter list that can be specified
18215 	PARAM args[] =
18216 	{
18217 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18218 		{"[id]", CmdPrompt, _UU("CMD_MacDelete_Prompt"), CmdEvalNotEmpty, NULL},
18219 	};
18220 
18221 	// If virtual HUB is not selected, it's an error
18222 	if (ps->HubName == NULL)
18223 	{
18224 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18225 		return ERR_INVALID_PARAMETER;
18226 	}
18227 
18228 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18229 	if (o == NULL)
18230 	{
18231 		return ERR_INVALID_PARAMETER;
18232 	}
18233 
18234 	Zero(&t, sizeof(t));
18235 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18236 	t.Key = GetParamInt(o, "[id]");
18237 
18238 	// RPC call
18239 	ret = ScDeleteMacTable(ps->Rpc, &t);
18240 
18241 	if (ret != ERR_NO_ERROR)
18242 	{
18243 		// An error has occured
18244 		CmdPrintError(c, ret);
18245 		FreeParamValueList(o);
18246 		return ret;
18247 	}
18248 
18249 	FreeParamValueList(o);
18250 
18251 	return 0;
18252 }
18253 
18254 // Get the IP address table database
PsIpTable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18255 UINT PsIpTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18256 {
18257 	LIST *o;
18258 	PS *ps = (PS *)param;
18259 	UINT ret = 0;
18260 	RPC_ENUM_IP_TABLE t;
18261 	UINT i;
18262 
18263 	// Parameter list that can be specified
18264 	PARAM args[] =
18265 	{
18266 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18267 		{"[session_name]", NULL, NULL, NULL, NULL,}
18268 	};
18269 
18270 	// If virtual HUB is not selected, it's an error
18271 	if (ps->HubName == NULL)
18272 	{
18273 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18274 		return ERR_INVALID_PARAMETER;
18275 	}
18276 
18277 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18278 	if (o == NULL)
18279 	{
18280 		return ERR_INVALID_PARAMETER;
18281 	}
18282 
18283 	Zero(&t, sizeof(t));
18284 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18285 
18286 	// RPC call
18287 	ret = ScEnumIpTable(ps->Rpc, &t);
18288 
18289 	if (ret != ERR_NO_ERROR)
18290 	{
18291 		// An error has occured
18292 		CmdPrintError(c, ret);
18293 		FreeParamValueList(o);
18294 		return ret;
18295 	}
18296 	else
18297 	{
18298 		CT *ct = CtNew();
18299 		char *session_name = GetParamStr(o, "[session_name]");
18300 
18301 		if (IsEmptyStr(session_name))
18302 		{
18303 			session_name = NULL;
18304 		}
18305 
18306 		CtInsertColumn(ct, _UU("CMD_ID"), false);
18307 		CtInsertColumn(ct, _UU("SM_IP_COLUMN_1"), false);
18308 		CtInsertColumn(ct, _UU("SM_IP_COLUMN_2"), false);
18309 		CtInsertColumn(ct, _UU("SM_IP_COLUMN_3"), false);
18310 		CtInsertColumn(ct, _UU("SM_IP_COLUMN_4"), false);
18311 		CtInsertColumn(ct, _UU("SM_IP_COLUMN_5"), false);
18312 
18313 		for (i = 0;i < t.NumIpTable;i++)
18314 		{
18315 			char str[MAX_SIZE];
18316 			wchar_t tmp0[128];
18317 			wchar_t tmp1[MAX_SIZE];
18318 			wchar_t tmp2[MAX_SIZE];
18319 			wchar_t tmp3[MAX_SIZE];
18320 			wchar_t tmp4[MAX_SIZE];
18321 			wchar_t tmp5[MAX_SIZE];
18322 			RPC_ENUM_IP_TABLE_ITEM *e = &t.IpTables[i];
18323 
18324 			if (session_name == NULL || StrCmpi(e->SessionName, session_name) == 0)
18325 			{
18326 				UniToStru(tmp0, e->Key);
18327 
18328 				StrToUni(tmp1, sizeof(tmp1), e->SessionName);
18329 
18330 				if (e->DhcpAllocated == false)
18331 				{
18332 					IPToStr(str, sizeof(str), &e->IpV6);
18333 					StrToUni(tmp2, sizeof(tmp2), str);
18334 				}
18335 				else
18336 				{
18337 					IPToStr(str, sizeof(str), &e->IpV6);
18338 					UniFormat(tmp2, sizeof(tmp2), _UU("SM_MAC_IP_DHCP"), str);
18339 				}
18340 
18341 				GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->CreatedTime));
18342 
18343 				GetDateTimeStr64Uni(tmp4, sizeof(tmp4), SystemToLocal64(e->UpdatedTime));
18344 
18345 				if (StrLen(e->RemoteHostname) == 0)
18346 				{
18347 					UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_MACIP_LOCAL"));
18348 				}
18349 				else
18350 				{
18351 					UniFormat(tmp5, sizeof(tmp5), _UU("SM_MACIP_SERVER"), e->RemoteHostname);
18352 				}
18353 
18354 				CtInsert(ct,
18355 					tmp0, tmp1, tmp2, tmp3, tmp4, tmp5);
18356 			}
18357 		}
18358 
18359 		CtFreeEx(ct, c, true);
18360 	}
18361 
18362 	FreeRpcEnumIpTable(&t);
18363 
18364 	FreeParamValueList(o);
18365 
18366 	return 0;
18367 }
18368 
18369 // Delete the IP address table entry
PsIpDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18370 UINT PsIpDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18371 {
18372 	LIST *o;
18373 	PS *ps = (PS *)param;
18374 	UINT ret = 0;
18375 	RPC_DELETE_TABLE t;
18376 	// Parameter list that can be specified
18377 	PARAM args[] =
18378 	{
18379 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18380 		{"[id]", CmdPrompt, _UU("CMD_MacDelete_Prompt"), CmdEvalNotEmpty, NULL},
18381 	};
18382 
18383 	// If virtual HUB is not selected, it's an error
18384 	if (ps->HubName == NULL)
18385 	{
18386 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18387 		return ERR_INVALID_PARAMETER;
18388 	}
18389 
18390 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18391 	if (o == NULL)
18392 	{
18393 		return ERR_INVALID_PARAMETER;
18394 	}
18395 
18396 	Zero(&t, sizeof(t));
18397 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18398 	t.Key = GetParamInt(o, "[id]");
18399 
18400 	// RPC call
18401 	ret = ScDeleteIpTable(ps->Rpc, &t);
18402 
18403 	if (ret != ERR_NO_ERROR)
18404 	{
18405 		// An error has occured
18406 		CmdPrintError(c, ret);
18407 		FreeParamValueList(o);
18408 		return ret;
18409 	}
18410 
18411 	FreeParamValueList(o);
18412 
18413 	return 0;
18414 }
18415 
18416 // Enable the DHCP server function and the virtual NAT (SecureNAT function)
PsSecureNatEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18417 UINT PsSecureNatEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18418 {
18419 	LIST *o;
18420 	PS *ps = (PS *)param;
18421 	UINT ret = 0;
18422 	RPC_HUB t;
18423 
18424 	// If virtual HUB is not selected, it's an error
18425 	if (ps->HubName == NULL)
18426 	{
18427 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18428 		return ERR_INVALID_PARAMETER;
18429 	}
18430 
18431 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
18432 	if (o == NULL)
18433 	{
18434 		return ERR_INVALID_PARAMETER;
18435 	}
18436 
18437 	Zero(&t, sizeof(t));
18438 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18439 
18440 	// RPC call
18441 	ret = ScEnableSecureNAT(ps->Rpc, &t);
18442 
18443 	if (ret != ERR_NO_ERROR)
18444 	{
18445 		// An error has occured
18446 		CmdPrintError(c, ret);
18447 		FreeParamValueList(o);
18448 		return ret;
18449 	}
18450 
18451 	FreeParamValueList(o);
18452 
18453 	return 0;
18454 }
18455 
18456 // Disable the DHCP server function and the virtual NAT (SecureNAT function)
PsSecureNatDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18457 UINT PsSecureNatDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18458 {
18459 	LIST *o;
18460 	PS *ps = (PS *)param;
18461 	UINT ret = 0;
18462 	RPC_HUB t;
18463 
18464 	// If virtual HUB is not selected, it's an error
18465 	if (ps->HubName == NULL)
18466 	{
18467 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18468 		return ERR_INVALID_PARAMETER;
18469 	}
18470 
18471 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
18472 	if (o == NULL)
18473 	{
18474 		return ERR_INVALID_PARAMETER;
18475 	}
18476 
18477 	Zero(&t, sizeof(t));
18478 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18479 
18480 	// RPC call
18481 	ret = ScDisableSecureNAT(ps->Rpc, &t);
18482 
18483 	if (ret != ERR_NO_ERROR)
18484 	{
18485 		// An error has occured
18486 		CmdPrintError(c, ret);
18487 		FreeParamValueList(o);
18488 		return ret;
18489 	}
18490 
18491 	FreeParamValueList(o);
18492 
18493 	return 0;
18494 }
18495 
18496 // Get the operating status of the DHCP server function and the virtual NAT (SecureNAT function)
PsSecureNatStatusGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18497 UINT PsSecureNatStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18498 {
18499 	LIST *o;
18500 	PS *ps = (PS *)param;
18501 	UINT ret = 0;
18502 	RPC_NAT_STATUS t;
18503 
18504 	// If virtual HUB is not selected, it's an error
18505 	if (ps->HubName == NULL)
18506 	{
18507 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18508 		return ERR_INVALID_PARAMETER;
18509 	}
18510 
18511 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
18512 	if (o == NULL)
18513 	{
18514 		return ERR_INVALID_PARAMETER;
18515 	}
18516 
18517 	Zero(&t, sizeof(t));
18518 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18519 
18520 	// RPC call
18521 	ret = ScGetSecureNATStatus(ps->Rpc, &t);
18522 
18523 	if (ret != ERR_NO_ERROR)
18524 	{
18525 		// An error has occured
18526 		CmdPrintError(c, ret);
18527 		FreeParamValueList(o);
18528 		return ret;
18529 	}
18530 	else
18531 	{
18532 		wchar_t tmp[MAX_SIZE];
18533 		CT *ct = CtNewStandard();
18534 
18535 		StrToUni(tmp, sizeof(tmp), ps->HubName);
18536 		CtInsert(ct, _UU("SM_HUB_COLUMN_1"), tmp);
18537 
18538 		UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumTcpSessions);
18539 		CtInsert(ct, _UU("NM_STATUS_TCP"), tmp);
18540 
18541 		UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumUdpSessions);
18542 		CtInsert(ct, _UU("NM_STATUS_UDP"), tmp);
18543 
18544 		UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumIcmpSessions);
18545 		CtInsert(ct, _UU("NM_STATUS_ICMP"), tmp);
18546 
18547 		UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumDnsSessions);
18548 		CtInsert(ct, _UU("NM_STATUS_DNS"), tmp);
18549 
18550 		UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_CLIENT"), t.NumDhcpClients);
18551 		CtInsert(ct, _UU("NM_STATUS_DHCP"), tmp);
18552 
18553 		CtInsert(ct, _UU("SM_SNAT_IS_KERNEL"), t.IsKernelMode ? _UU("SEC_YES") : _UU("SEC_NO"));
18554 		CtInsert(ct, _UU("SM_SNAT_IS_RAW"), t.IsRawIpMode ? _UU("SEC_YES") : _UU("SEC_NO"));
18555 
18556 		CtFree(ct, c);
18557 	}
18558 
18559 	FreeRpcNatStatus(&t);
18560 
18561 	FreeParamValueList(o);
18562 
18563 	return 0;
18564 }
18565 
18566 // Get the network interface settings for a virtual host of SecureNAT function
PsSecureNatHostGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18567 UINT PsSecureNatHostGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18568 {
18569 	LIST *o;
18570 	PS *ps = (PS *)param;
18571 	UINT ret = 0;
18572 	VH_OPTION t;
18573 
18574 	// If virtual HUB is not selected, it's an error
18575 	if (ps->HubName == NULL)
18576 	{
18577 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18578 		return ERR_INVALID_PARAMETER;
18579 	}
18580 
18581 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
18582 	if (o == NULL)
18583 	{
18584 		return ERR_INVALID_PARAMETER;
18585 	}
18586 
18587 	Zero(&t, sizeof(t));
18588 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18589 
18590 	// RPC call
18591 	ret = ScGetSecureNATOption(ps->Rpc, &t);
18592 
18593 	if (ret != ERR_NO_ERROR)
18594 	{
18595 		// An error has occured
18596 		CmdPrintError(c, ret);
18597 		FreeParamValueList(o);
18598 		return ret;
18599 	}
18600 	else
18601 	{
18602 		wchar_t tmp[MAX_SIZE];
18603 		char str[MAX_SIZE];
18604 		CT *ct = CtNewStandard();
18605 
18606 		// Flags
18607 		// MAC Address
18608 		MacToStr(str, sizeof(str), t.MacAddress);
18609 		StrToUni(tmp, sizeof(tmp), str);
18610 		CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_MAC"), tmp);
18611 
18612 		// IP address
18613 		IPToUniStr(tmp, sizeof(tmp), &t.Ip);
18614 		CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_IP"), tmp);
18615 
18616 		// Subnet mask
18617 		IPToUniStr(tmp, sizeof(tmp), &t.Mask);
18618 		CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_MASK"), tmp);
18619 
18620 		CtFree(ct, c);
18621 	}
18622 
18623 	FreeParamValueList(o);
18624 
18625 	return 0;
18626 }
18627 
18628 // Change the network interface settings for a virtual host of SecureNAT function
PsSecureNatHostSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18629 UINT PsSecureNatHostSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18630 {
18631 	LIST *o;
18632 	PS *ps = (PS *)param;
18633 	UINT ret = 0;
18634 	VH_OPTION t;
18635 	// Parameter list that can be specified
18636 	PARAM args[] =
18637 	{
18638 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18639 		{"MAC", CmdPrompt, _UU("CMD_SecureNatHostSet_Prompt_MAC"), NULL, NULL},
18640 		{"IP", CmdPrompt, _UU("CMD_SecureNatHostSet_Prompt_IP"), CmdEvalIp, NULL},
18641 		{"MASK", CmdPrompt, _UU("CMD_SecureNatHostSet_Prompt_MASK"), CmdEvalIp, NULL},
18642 	};
18643 
18644 	// If virtual HUB is not selected, it's an error
18645 	if (ps->HubName == NULL)
18646 	{
18647 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18648 		return ERR_INVALID_PARAMETER;
18649 	}
18650 
18651 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18652 	if (o == NULL)
18653 	{
18654 		return ERR_INVALID_PARAMETER;
18655 	}
18656 
18657 	Zero(&t, sizeof(t));
18658 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18659 
18660 	// RPC call
18661 	ret = ScGetSecureNATOption(ps->Rpc, &t);
18662 
18663 	if (ret != ERR_NO_ERROR)
18664 	{
18665 		// An error has occured
18666 		CmdPrintError(c, ret);
18667 		FreeParamValueList(o);
18668 		return ret;
18669 	}
18670 	else
18671 	{
18672 		char *mac, *ip, *mask;
18673 		bool ok = true;
18674 
18675 		StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18676 
18677 		mac = GetParamStr(o, "MAC");
18678 		ip = GetParamStr(o, "IP");
18679 		mask = GetParamStr(o, "MASK");
18680 
18681 		if (IsEmptyStr(mac) == false)
18682 		{
18683 			BUF *b = StrToBin(mac);
18684 
18685 			if (b == NULL || b->Size != 6)
18686 			{
18687 				ok = false;
18688 			}
18689 			else
18690 			{
18691 				Copy(t.MacAddress, b->Buf, 6);
18692 			}
18693 
18694 			FreeBuf(b);
18695 		}
18696 
18697 		if (IsEmptyStr(ip) == false)
18698 		{
18699 			if (IsIpStr4(ip) == false)
18700 			{
18701 				ok = false;
18702 			}
18703 			else
18704 			{
18705 				UINT u = StrToIP32(ip);
18706 
18707 				if (u == 0 || u == 0xffffffff)
18708 				{
18709 					ok = false;
18710 				}
18711 				else
18712 				{
18713 					UINTToIP(&t.Ip, u);
18714 				}
18715 			}
18716 		}
18717 
18718 		if (IsEmptyStr(mask) == false)
18719 		{
18720 			if (IsIpStr4(mask) == false)
18721 			{
18722 				ok = false;
18723 			}
18724 			else
18725 			{
18726 				StrToIP(&t.Mask, mask);
18727 			}
18728 		}
18729 
18730 		if (ok == false)
18731 		{
18732 			// Parameter is invalid
18733 			ret = ERR_INVALID_PARAMETER;
18734 			CmdPrintError(c, ret);
18735 			FreeParamValueList(o);
18736 			return ret;
18737 		}
18738 		else
18739 		{
18740 			ret = ScSetSecureNATOption(ps->Rpc, &t);
18741 
18742 			if (ret != ERR_NO_ERROR)
18743 			{
18744 				// An error has occured
18745 				CmdPrintError(c, ret);
18746 				FreeParamValueList(o);
18747 				return ret;
18748 			}
18749 		}
18750 	}
18751 
18752 	FreeParamValueList(o);
18753 
18754 	return 0;
18755 }
18756 
18757 // Get the settings for the virtual NAT function of the SecureNAT function
PsNatGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18758 UINT PsNatGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18759 {
18760 	LIST *o;
18761 	PS *ps = (PS *)param;
18762 	UINT ret = 0;
18763 	VH_OPTION t;
18764 
18765 	// If virtual HUB is not selected, it's an error
18766 	if (ps->HubName == NULL)
18767 	{
18768 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18769 		return ERR_INVALID_PARAMETER;
18770 	}
18771 
18772 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
18773 	if (o == NULL)
18774 	{
18775 		return ERR_INVALID_PARAMETER;
18776 	}
18777 
18778 	Zero(&t, sizeof(t));
18779 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18780 
18781 	// RPC call
18782 	ret = ScGetSecureNATOption(ps->Rpc, &t);
18783 
18784 	if (ret != ERR_NO_ERROR)
18785 	{
18786 		// An error has occured
18787 		CmdPrintError(c, ret);
18788 		FreeParamValueList(o);
18789 		return ret;
18790 	}
18791 	else
18792 	{
18793 		wchar_t tmp[MAX_SIZE];
18794 		CT *ct = CtNewStandard();
18795 
18796 		// Use the virtual NAT function
18797 		CtInsert(ct, _UU("CMD_NatGet_Column_USE"), t.UseNat ? _UU("SEC_YES") : _UU("SEC_NO"));
18798 
18799 		// MTU value
18800 		UniToStru(tmp, t.Mtu);
18801 		CtInsert(ct, _UU("CMD_NetGet_Column_MTU"), tmp);
18802 
18803 		// TCP session timeout (in seconds)
18804 		UniToStru(tmp, t.NatTcpTimeout);
18805 		CtInsert(ct, _UU("CMD_NatGet_Column_TCP"), tmp);
18806 
18807 		// UDP session timeout (in seconds)
18808 		UniToStru(tmp, t.NatUdpTimeout);
18809 		CtInsert(ct, _UU("CMD_NatGet_Column_UDP"), tmp);
18810 
18811 		// To save the log
18812 		CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_LOG"), t.SaveLog ? _UU("SEC_YES") : _UU("SEC_NO"));
18813 
18814 		CtFree(ct, c);
18815 	}
18816 
18817 	FreeParamValueList(o);
18818 
18819 	return 0;
18820 }
18821 
18822 // Enable the virtual NAT function of the SecureNAT function
PsNatEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18823 UINT PsNatEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18824 {
18825 	LIST *o;
18826 	PS *ps = (PS *)param;
18827 	UINT ret = 0;
18828 	VH_OPTION t;
18829 
18830 	// If virtual HUB is not selected, it's an error
18831 	if (ps->HubName == NULL)
18832 	{
18833 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18834 		return ERR_INVALID_PARAMETER;
18835 	}
18836 
18837 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
18838 	if (o == NULL)
18839 	{
18840 		return ERR_INVALID_PARAMETER;
18841 	}
18842 
18843 	Zero(&t, sizeof(t));
18844 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18845 
18846 	// RPC call
18847 	ret = ScGetSecureNATOption(ps->Rpc, &t);
18848 
18849 	if (ret != ERR_NO_ERROR)
18850 	{
18851 		// An error has occured
18852 		CmdPrintError(c, ret);
18853 		FreeParamValueList(o);
18854 		return ret;
18855 	}
18856 	else
18857 	{
18858 		bool ok = true;
18859 
18860 		t.UseNat = true;
18861 
18862 		if (ok == false)
18863 		{
18864 			// Parameter is invalid
18865 			ret = ERR_INVALID_PARAMETER;
18866 			CmdPrintError(c, ret);
18867 			FreeParamValueList(o);
18868 			return ret;
18869 		}
18870 		else
18871 		{
18872 			StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18873 			ret = ScSetSecureNATOption(ps->Rpc, &t);
18874 
18875 			if (ret != ERR_NO_ERROR)
18876 			{
18877 				// An error has occured
18878 				CmdPrintError(c, ret);
18879 				FreeParamValueList(o);
18880 				return ret;
18881 			}
18882 		}
18883 	}
18884 
18885 	FreeParamValueList(o);
18886 
18887 	return 0;
18888 }
18889 
18890 // Disable the virtual NAT function of the SecureNAT function
PsNatDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18891 UINT PsNatDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18892 {
18893 	LIST *o;
18894 	PS *ps = (PS *)param;
18895 	UINT ret = 0;
18896 	VH_OPTION t;
18897 
18898 	// If virtual HUB is not selected, it's an error
18899 	if (ps->HubName == NULL)
18900 	{
18901 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18902 		return ERR_INVALID_PARAMETER;
18903 	}
18904 
18905 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
18906 	if (o == NULL)
18907 	{
18908 		return ERR_INVALID_PARAMETER;
18909 	}
18910 
18911 	Zero(&t, sizeof(t));
18912 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18913 
18914 	// RPC call
18915 	ret = ScGetSecureNATOption(ps->Rpc, &t);
18916 
18917 	if (ret != ERR_NO_ERROR)
18918 	{
18919 		// An error has occured
18920 		CmdPrintError(c, ret);
18921 		FreeParamValueList(o);
18922 		return ret;
18923 	}
18924 	else
18925 	{
18926 		bool ok = true;
18927 
18928 		t.UseNat = false;
18929 
18930 		if (ok == false)
18931 		{
18932 			// Parameter is invalid
18933 			ret = ERR_INVALID_PARAMETER;
18934 			CmdPrintError(c, ret);
18935 			FreeParamValueList(o);
18936 			return ret;
18937 		}
18938 		else
18939 		{
18940 			StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18941 			ret = ScSetSecureNATOption(ps->Rpc, &t);
18942 
18943 			if (ret != ERR_NO_ERROR)
18944 			{
18945 				// An error has occured
18946 				CmdPrintError(c, ret);
18947 				FreeParamValueList(o);
18948 				return ret;
18949 			}
18950 		}
18951 	}
18952 
18953 	FreeParamValueList(o);
18954 
18955 	return 0;
18956 }
18957 
18958 // Change the settings for the virtual NAT function of the SecureNAT function
PsNatSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18959 UINT PsNatSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18960 {
18961 	LIST *o;
18962 	PS *ps = (PS *)param;
18963 	UINT ret = 0;
18964 	VH_OPTION t;
18965 	// Parameter list that can be specified
18966 	CMD_EVAL_MIN_MAX mtu_mm =
18967 	{
18968 		"CMD_NatSet_Eval_MTU", TCP_HEADER_SIZE + IP_HEADER_SIZE + MAC_HEADER_SIZE + 8, MAX_L3_DATA_SIZE,
18969 	};
18970 	CMD_EVAL_MIN_MAX tcp_mm =
18971 	{
18972 		"CMD_NatSet_Eval_TCP", NAT_TCP_MIN_TIMEOUT / 1000, NAT_TCP_MAX_TIMEOUT / 1000,
18973 	};
18974 	CMD_EVAL_MIN_MAX udp_mm =
18975 	{
18976 		"CMD_NatSet_Eval_UDP", NAT_UDP_MIN_TIMEOUT / 1000, NAT_UDP_MAX_TIMEOUT / 1000,
18977 	};
18978 	PARAM args[] =
18979 	{
18980 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18981 		{"MTU", CmdPrompt, _UU("CMD_NatSet_Prompt_MTU"), CmdEvalMinMax, &mtu_mm},
18982 		{"TCPTIMEOUT", CmdPrompt, _UU("CMD_NatSet_Prompt_TCPTIMEOUT"), CmdEvalMinMax, &tcp_mm},
18983 		{"UDPTIMEOUT", CmdPrompt, _UU("CMD_NatSet_Prompt_UDPTIMEOUT"), CmdEvalMinMax, &udp_mm},
18984 		{"LOG", CmdPrompt, _UU("CMD_NatSet_Prompt_LOG"), CmdEvalNotEmpty, NULL},
18985 	};
18986 
18987 	// If virtual HUB is not selected, it's an error
18988 	if (ps->HubName == NULL)
18989 	{
18990 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18991 		return ERR_INVALID_PARAMETER;
18992 	}
18993 
18994 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18995 	if (o == NULL)
18996 	{
18997 		return ERR_INVALID_PARAMETER;
18998 	}
18999 
19000 	Zero(&t, sizeof(t));
19001 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19002 
19003 	// RPC call
19004 	ret = ScGetSecureNATOption(ps->Rpc, &t);
19005 
19006 	if (ret != ERR_NO_ERROR)
19007 	{
19008 		// An error has occured
19009 		CmdPrintError(c, ret);
19010 		FreeParamValueList(o);
19011 		return ret;
19012 	}
19013 	else
19014 	{
19015 		bool ok = true;
19016 
19017 		t.Mtu = GetParamInt(o, "MTU");
19018 		t.NatTcpTimeout = GetParamInt(o, "TCPTIMEOUT");
19019 		t.NatUdpTimeout = GetParamInt(o, "UDPTIMEOUT");
19020 		t.SaveLog = GetParamYes(o, "LOG");
19021 
19022 		if (ok == false)
19023 		{
19024 			// Parameter is invalid
19025 			ret = ERR_INVALID_PARAMETER;
19026 			CmdPrintError(c, ret);
19027 			FreeParamValueList(o);
19028 			return ret;
19029 		}
19030 		else
19031 		{
19032 			StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19033 			ret = ScSetSecureNATOption(ps->Rpc, &t);
19034 
19035 			if (ret != ERR_NO_ERROR)
19036 			{
19037 				// An error has occured
19038 				CmdPrintError(c, ret);
19039 				FreeParamValueList(o);
19040 				return ret;
19041 			}
19042 		}
19043 	}
19044 
19045 	FreeParamValueList(o);
19046 
19047 	return 0;
19048 }
19049 
19050 // Get the session table of the virtual NAT function of the SecureNAT function
PsNatTable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19051 UINT PsNatTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19052 {
19053 	LIST *o;
19054 	PS *ps = (PS *)param;
19055 	UINT ret = 0;
19056 	RPC_ENUM_NAT t;
19057 
19058 	// If virtual HUB is not selected, it's an error
19059 	if (ps->HubName == NULL)
19060 	{
19061 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19062 		return ERR_INVALID_PARAMETER;
19063 	}
19064 
19065 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19066 	if (o == NULL)
19067 	{
19068 		return ERR_INVALID_PARAMETER;
19069 	}
19070 
19071 	Zero(&t, sizeof(t));
19072 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19073 
19074 	// RPC call
19075 	ret = ScEnumNAT(ps->Rpc, &t);
19076 
19077 	if (ret != ERR_NO_ERROR)
19078 	{
19079 		// An error has occured
19080 		CmdPrintError(c, ret);
19081 		FreeParamValueList(o);
19082 		return ret;
19083 	}
19084 	else
19085 	{
19086 		CT *ct = CtNew();
19087 		UINT i;
19088 
19089 		CtInsertColumn(ct, _UU("NM_NAT_ID"), false);
19090 		CtInsertColumn(ct, _UU("NM_NAT_PROTOCOL"), false);
19091 		CtInsertColumn(ct, _UU("NM_NAT_SRC_HOST"), false);
19092 		CtInsertColumn(ct, _UU("NM_NAT_SRC_PORT"), false);
19093 		CtInsertColumn(ct, _UU("NM_NAT_DST_HOST"), false);
19094 		CtInsertColumn(ct, _UU("NM_NAT_DST_PORT"), false);
19095 		CtInsertColumn(ct, _UU("NM_NAT_CREATED"), false);
19096 		CtInsertColumn(ct, _UU("NM_NAT_LAST_COMM"), false);
19097 		CtInsertColumn(ct, _UU("NM_NAT_SIZE"), false);
19098 		CtInsertColumn(ct, _UU("NM_NAT_TCP_STATUS"), false);
19099 
19100 		for (i = 0;i < t.NumItem;i++)
19101 		{
19102 			RPC_ENUM_NAT_ITEM *e = &t.Items[i];
19103 			wchar_t tmp0[MAX_SIZE];
19104 			wchar_t *tmp1 = L"";
19105 			wchar_t tmp2[MAX_SIZE];
19106 			wchar_t tmp3[MAX_SIZE];
19107 			wchar_t tmp4[MAX_SIZE];
19108 			wchar_t tmp5[MAX_SIZE];
19109 			wchar_t tmp6[MAX_SIZE];
19110 			wchar_t tmp7[MAX_SIZE];
19111 			wchar_t tmp8[MAX_SIZE];
19112 			wchar_t *tmp9 = L"";
19113 			char v1[128], v2[128];
19114 
19115 			// ID
19116 			UniToStru(tmp0, e->Id);
19117 
19118 			// Protocol
19119 			switch (e->Protocol)
19120 			{
19121 			case NAT_TCP:
19122 				tmp1 = _UU("NM_NAT_PROTO_TCP");
19123 				break;
19124 			case NAT_UDP:
19125 				tmp1 = _UU("NM_NAT_PROTO_UDP");
19126 				break;
19127 			case NAT_DNS:
19128 				tmp1 = _UU("NM_NAT_PROTO_DNS");
19129 				break;
19130 			case NAT_ICMP:
19131 				tmp1 = _UU("NM_NAT_PROTO_ICMP");
19132 				break;
19133 			}
19134 
19135 			// Source host
19136 			StrToUni(tmp2, sizeof(tmp2), e->SrcHost);
19137 
19138 			// Source port
19139 			UniToStru(tmp3, e->SrcPort);
19140 
19141 			// Destination host
19142 			StrToUni(tmp4, sizeof(tmp4), e->DestHost);
19143 
19144 			// Destination port
19145 			UniToStru(tmp5, e->DestPort);
19146 
19147 			// Creation date and time of the session
19148 			GetDateTimeStrEx64(tmp6, sizeof(tmp6), SystemToLocal64(e->CreatedTime), NULL);
19149 
19150 			// Last communication date and time
19151 			GetDateTimeStrEx64(tmp7, sizeof(tmp7), SystemToLocal64(e->LastCommTime), NULL);
19152 
19153 			// Communication amount
19154 			ToStr3(v1, sizeof(v1), e->RecvSize);
19155 			ToStr3(v2, sizeof(v2), e->SendSize);
19156 			UniFormat(tmp8, sizeof(tmp8), L"%S / %S", v1, v2);
19157 
19158 			// TCP state
19159 			if (e->Protocol == NAT_TCP)
19160 			{
19161 				switch (e->TcpStatus)
19162 				{
19163 				case NAT_TCP_CONNECTING:
19164 					tmp9 = _UU("NAT_TCP_CONNECTING");
19165 					break;
19166 				case NAT_TCP_SEND_RESET:
19167 					tmp9 = _UU("NAT_TCP_SEND_RESET");
19168 					break;
19169 				case NAT_TCP_CONNECTED:
19170 					tmp9 = _UU("NAT_TCP_CONNECTED");
19171 					break;
19172 				case NAT_TCP_ESTABLISHED:
19173 					tmp9 = _UU("NAT_TCP_ESTABLISHED");
19174 					break;
19175 				case NAT_TCP_WAIT_DISCONNECT:
19176 					tmp9 = _UU("NAT_TCP_WAIT_DISCONNECT");
19177 					break;
19178 				}
19179 			}
19180 
19181 			CtInsert(ct,
19182 				tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9);
19183 		}
19184 
19185 		CtFreeEx(ct, c, true);
19186 	}
19187 
19188 	FreeRpcEnumNat(&t);
19189 
19190 	FreeParamValueList(o);
19191 
19192 	return 0;
19193 }
19194 
19195 // Get the settings for a virtual DHCP server function of the SecureNAT function
PsDhcpGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19196 UINT PsDhcpGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19197 {
19198 	LIST *o;
19199 	PS *ps = (PS *)param;
19200 	UINT ret = 0;
19201 	VH_OPTION t;
19202 
19203 	// If virtual HUB is not selected, it's an error
19204 	if (ps->HubName == NULL)
19205 	{
19206 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19207 		return ERR_INVALID_PARAMETER;
19208 	}
19209 
19210 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19211 	if (o == NULL)
19212 	{
19213 		return ERR_INVALID_PARAMETER;
19214 	}
19215 
19216 	Zero(&t, sizeof(t));
19217 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19218 
19219 	// RPC call
19220 	ret = ScGetSecureNATOption(ps->Rpc, &t);
19221 
19222 	if (ret != ERR_NO_ERROR)
19223 	{
19224 		// An error has occured
19225 		CmdPrintError(c, ret);
19226 		FreeParamValueList(o);
19227 		return ret;
19228 	}
19229 	else
19230 	{
19231 		wchar_t tmp[MAX_SIZE];
19232 		CT *ct = CtNewStandard();
19233 
19234 		// To use the virtual DHCP function
19235 		CtInsert(ct, _UU("CMD_DhcpGet_Column_USE"), t.UseDhcp ? _UU("SEC_YES") : _UU("SEC_NO"));
19236 
19237 		// Start address of the distributing address zone
19238 		IPToUniStr(tmp, sizeof(tmp), &t.DhcpLeaseIPStart);
19239 		CtInsert(ct, _UU("CMD_DhcpGet_Column_IP1"), tmp);
19240 
19241 		// End address of the distributing address zone
19242 		IPToUniStr(tmp, sizeof(tmp), &t.DhcpLeaseIPEnd);
19243 		CtInsert(ct, _UU("CMD_DhcpGet_Column_IP2"), tmp);
19244 
19245 		// Subnet mask
19246 		IPToUniStr(tmp, sizeof(tmp), &t.DhcpSubnetMask);
19247 		CtInsert(ct, _UU("CMD_DhcpGet_Column_MASK"), tmp);
19248 
19249 		// Lease time (in seconds)
19250 		UniToStru(tmp, t.DhcpExpireTimeSpan);
19251 		CtInsert(ct, _UU("CMD_DhcpGet_Column_LEASE"), tmp);
19252 
19253 		// Default gateway address
19254 		UniStrCpy(tmp, sizeof(tmp), _UU("SEC_NONE"));
19255 		if (IPToUINT(&t.DhcpGatewayAddress) != 0)
19256 		{
19257 			IPToUniStr(tmp, sizeof(tmp), &t.DhcpGatewayAddress);
19258 		}
19259 		CtInsert(ct, _UU("CMD_DhcpGet_Column_GW"), tmp);
19260 
19261 		// DNS server address 1
19262 		UniStrCpy(tmp, sizeof(tmp), _UU("SEC_NONE"));
19263 		if (IPToUINT(&t.DhcpDnsServerAddress) != 0)
19264 		{
19265 			IPToUniStr(tmp, sizeof(tmp), &t.DhcpDnsServerAddress);
19266 		}
19267 		CtInsert(ct, _UU("CMD_DhcpGet_Column_DNS"), tmp);
19268 
19269 		// DNS server address 2
19270 		UniStrCpy(tmp, sizeof(tmp), _UU("SEC_NONE"));
19271 		if (IPToUINT(&t.DhcpDnsServerAddress2) != 0)
19272 		{
19273 			IPToUniStr(tmp, sizeof(tmp), &t.DhcpDnsServerAddress2);
19274 		}
19275 		CtInsert(ct, _UU("CMD_DhcpGet_Column_DNS2"), tmp);
19276 
19277 		// Domain name
19278 		StrToUni(tmp, sizeof(tmp), t.DhcpDomainName);
19279 		CtInsert(ct, _UU("CMD_DhcpGet_Column_DOMAIN"), tmp);
19280 
19281 		// To save the log
19282 		CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_LOG"), t.SaveLog ? _UU("SEC_YES") : _UU("SEC_NO"));
19283 
19284 		// Push routing table
19285 		if (t.ApplyDhcpPushRoutes)
19286 		{
19287 			StrToUni(tmp, sizeof(tmp), t.DhcpPushRoutes);
19288 			CtInsert(ct, _UU("CMD_DhcpGet_Column_PUSHROUTE"), tmp);
19289 		}
19290 
19291 		CtFree(ct, c);
19292 	}
19293 
19294 	FreeParamValueList(o);
19295 
19296 	return 0;
19297 }
19298 
19299 // Enable the Virtual DHCP server function of SecureNAT function
PsDhcpEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19300 UINT PsDhcpEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19301 {
19302 	LIST *o;
19303 	PS *ps = (PS *)param;
19304 	UINT ret = 0;
19305 	VH_OPTION t;
19306 
19307 	// If virtual HUB is not selected, it's an error
19308 	if (ps->HubName == NULL)
19309 	{
19310 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19311 		return ERR_INVALID_PARAMETER;
19312 	}
19313 
19314 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19315 	if (o == NULL)
19316 	{
19317 		return ERR_INVALID_PARAMETER;
19318 	}
19319 
19320 	Zero(&t, sizeof(t));
19321 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19322 
19323 	// RPC call
19324 	ret = ScGetSecureNATOption(ps->Rpc, &t);
19325 
19326 	if (ret != ERR_NO_ERROR)
19327 	{
19328 		// An error has occured
19329 		CmdPrintError(c, ret);
19330 		FreeParamValueList(o);
19331 		return ret;
19332 	}
19333 	else
19334 	{
19335 		bool ok = true;
19336 
19337 		t.UseDhcp = true;
19338 
19339 		if (ok == false)
19340 		{
19341 			// Parameter is invalid
19342 			ret = ERR_INVALID_PARAMETER;
19343 			CmdPrintError(c, ret);
19344 			FreeParamValueList(o);
19345 			return ret;
19346 		}
19347 		else
19348 		{
19349 			StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19350 			ret = ScSetSecureNATOption(ps->Rpc, &t);
19351 
19352 			if (ret != ERR_NO_ERROR)
19353 			{
19354 				// An error has occured
19355 				CmdPrintError(c, ret);
19356 				FreeParamValueList(o);
19357 				return ret;
19358 			}
19359 		}
19360 	}
19361 
19362 	FreeParamValueList(o);
19363 
19364 	return 0;
19365 }
19366 
19367 // Disable the virtual DHCP server function of SecureNAT function
PsDhcpDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19368 UINT PsDhcpDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19369 {
19370 	LIST *o;
19371 	PS *ps = (PS *)param;
19372 	UINT ret = 0;
19373 	VH_OPTION t;
19374 
19375 	// If virtual HUB is not selected, it's an error
19376 	if (ps->HubName == NULL)
19377 	{
19378 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19379 		return ERR_INVALID_PARAMETER;
19380 	}
19381 
19382 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19383 	if (o == NULL)
19384 	{
19385 		return ERR_INVALID_PARAMETER;
19386 	}
19387 
19388 	Zero(&t, sizeof(t));
19389 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19390 
19391 	// RPC call
19392 	ret = ScGetSecureNATOption(ps->Rpc, &t);
19393 
19394 	if (ret != ERR_NO_ERROR)
19395 	{
19396 		// An error has occured
19397 		CmdPrintError(c, ret);
19398 		FreeParamValueList(o);
19399 		return ret;
19400 	}
19401 	else
19402 	{
19403 		t.UseDhcp = false;
19404 
19405 		ret = ScSetSecureNATOption(ps->Rpc, &t);
19406 
19407 		if (ret != ERR_NO_ERROR)
19408 		{
19409 			// An error has occured
19410 			CmdPrintError(c, ret);
19411 			FreeParamValueList(o);
19412 			return ret;
19413 		}
19414 	}
19415 
19416 	FreeParamValueList(o);
19417 
19418 	return 0;
19419 }
19420 
19421 // Change the settings for a virtual DHCP server function of the SecureNAT function
PsDhcpSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19422 UINT PsDhcpSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19423 {
19424 	LIST *o;
19425 	PS *ps = (PS *)param;
19426 	UINT ret = 0;
19427 	VH_OPTION t;
19428 	// Parameter list that can be specified
19429 	CMD_EVAL_MIN_MAX mm =
19430 	{
19431 		"CMD_NatSet_Eval_UDP", NAT_UDP_MIN_TIMEOUT / 1000, NAT_UDP_MAX_TIMEOUT / 1000,
19432 	};
19433 	PARAM args[] =
19434 	{
19435 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
19436 		{"START", CmdPrompt, _UU("CMD_DhcpSet_Prompt_START"), CmdEvalIp, NULL},
19437 		{"END", CmdPrompt, _UU("CMD_DhcpSet_Prompt_END"), CmdEvalIp, NULL},
19438 		{"MASK", CmdPrompt, _UU("CMD_DhcpSet_Prompt_MASK"), CmdEvalIp, NULL},
19439 		{"EXPIRE", CmdPrompt, _UU("CMD_DhcpSet_Prompt_EXPIRE"), CmdEvalMinMax, &mm},
19440 		{"GW", CmdPrompt, _UU("CMD_DhcpSet_Prompt_GW"), CmdEvalIp, NULL},
19441 		{"DNS", CmdPrompt, _UU("CMD_DhcpSet_Prompt_DNS"), CmdEvalIp, NULL},
19442 		{"DNS2", CmdPrompt, _UU("CMD_DhcpSet_Prompt_DNS2"), CmdEvalIp, NULL},
19443 		{"DOMAIN", CmdPrompt, _UU("CMD_DhcpSet_Prompt_DOMAIN"), NULL, NULL},
19444 		{"LOG", CmdPrompt, _UU("CMD_NatSet_Prompt_LOG"), CmdEvalNotEmpty, NULL},
19445 		{"PUSHROUTE", NULL, _UU("CMD_DhcpSet_PUSHROUTE"), NULL, NULL},
19446 	};
19447 
19448 	// If virtual HUB is not selected, it's an error
19449 	if (ps->HubName == NULL)
19450 	{
19451 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19452 		return ERR_INVALID_PARAMETER;
19453 	}
19454 
19455 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
19456 	if (o == NULL)
19457 	{
19458 		return ERR_INVALID_PARAMETER;
19459 	}
19460 
19461 	Zero(&t, sizeof(t));
19462 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19463 
19464 	// RPC call
19465 	ret = ScGetSecureNATOption(ps->Rpc, &t);
19466 
19467 	if (ret != ERR_NO_ERROR)
19468 	{
19469 		// An error has occured
19470 		CmdPrintError(c, ret);
19471 		FreeParamValueList(o);
19472 		return ret;
19473 	}
19474 	else
19475 	{
19476 		bool ok = true;
19477 
19478 		StrToIP(&t.DhcpLeaseIPStart, GetParamStr(o, "START"));
19479 		StrToIP(&t.DhcpLeaseIPEnd, GetParamStr(o, "END"));
19480 		StrToIP(&t.DhcpSubnetMask, GetParamStr(o, "MASK"));
19481 		t.DhcpExpireTimeSpan = GetParamInt(o, "EXPIRE");
19482 		StrToIP(&t.DhcpGatewayAddress, GetParamStr(o, "GW"));
19483 		StrToIP(&t.DhcpDnsServerAddress, GetParamStr(o, "DNS"));
19484 		StrToIP(&t.DhcpDnsServerAddress2, GetParamStr(o, "DNS2"));
19485 		StrCpy(t.DhcpDomainName, sizeof(t.DhcpDomainName), GetParamStr(o, "DOMAIN"));
19486 		t.SaveLog = GetParamYes(o, "LOG");
19487 
19488 		StrCpy(t.DhcpPushRoutes, sizeof(t.DhcpPushRoutes), GetParamStr(o, "PUSHROUTE"));
19489 		t.ApplyDhcpPushRoutes = true;
19490 
19491 		if (ok == false)
19492 		{
19493 			// Parameter is invalid
19494 			ret = ERR_INVALID_PARAMETER;
19495 			CmdPrintError(c, ret);
19496 			FreeParamValueList(o);
19497 			return ret;
19498 		}
19499 		else
19500 		{
19501 			StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19502 			ret = ScSetSecureNATOption(ps->Rpc, &t);
19503 
19504 			if (ret != ERR_NO_ERROR)
19505 			{
19506 				// An error has occured
19507 				CmdPrintError(c, ret);
19508 				FreeParamValueList(o);
19509 				return ret;
19510 			}
19511 
19512 			if (IsEmptyStr(GetParamStr(o, "PUSHROUTE")) == false)
19513 			{
19514 				if (GetCapsBool(ps->CapsList, "b_suppport_push_route") == false &&
19515 					GetCapsBool(ps->CapsList, "b_suppport_push_route_config"))
19516 				{
19517 					CmdPrintError(c, ERR_NOT_SUPPORTED_FUNCTION_ON_OPENSOURCE);
19518 				}
19519 			}
19520 		}
19521 	}
19522 
19523 	FreeParamValueList(o);
19524 
19525 	return 0;
19526 }
19527 
19528 // Get the lease table of virtual DHCP server function of the SecureNAT function
PsDhcpTable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19529 UINT PsDhcpTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19530 {
19531 	LIST *o;
19532 	PS *ps = (PS *)param;
19533 	UINT ret = 0;
19534 	RPC_ENUM_DHCP t;
19535 
19536 	// If virtual HUB is not selected, it's an error
19537 	if (ps->HubName == NULL)
19538 	{
19539 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19540 		return ERR_INVALID_PARAMETER;
19541 	}
19542 
19543 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19544 	if (o == NULL)
19545 	{
19546 		return ERR_INVALID_PARAMETER;
19547 	}
19548 
19549 	Zero(&t, sizeof(t));
19550 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19551 
19552 	// RPC call
19553 	ret = ScEnumDHCP(ps->Rpc, &t);
19554 
19555 	if (ret != ERR_NO_ERROR)
19556 	{
19557 		// An error has occured
19558 		CmdPrintError(c, ret);
19559 		FreeParamValueList(o);
19560 		return ret;
19561 	}
19562 	else
19563 	{
19564 		CT *ct = CtNew();
19565 		UINT i;
19566 
19567 		CtInsertColumn(ct, _UU("DHCP_DHCP_ID"), false);
19568 		CtInsertColumn(ct, _UU("DHCP_LEASED_TIME"), false);
19569 		CtInsertColumn(ct, _UU("DHCP_EXPIRE_TIME"), false);
19570 		CtInsertColumn(ct, _UU("DHCP_MAC_ADDRESS"), false);
19571 		CtInsertColumn(ct, _UU("DHCP_IP_ADDRESS"), false);
19572 		CtInsertColumn(ct, _UU("DHCP_HOSTNAME"), false);
19573 
19574 		for (i = 0;i < t.NumItem;i++)
19575 		{
19576 			RPC_ENUM_DHCP_ITEM *e = &t.Items[i];
19577 			wchar_t tmp0[MAX_SIZE];
19578 			wchar_t tmp1[MAX_SIZE];
19579 			wchar_t tmp2[MAX_SIZE];
19580 			wchar_t tmp3[MAX_SIZE];
19581 			wchar_t tmp4[MAX_SIZE];
19582 			wchar_t tmp5[MAX_SIZE];
19583 			char str[MAX_SIZE];
19584 
19585 			// ID
19586 			UniToStru(tmp0, e->Id);
19587 
19588 			// Time
19589 			GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->LeasedTime), NULL);
19590 			GetDateTimeStrEx64(tmp2, sizeof(tmp2), SystemToLocal64(e->ExpireTime), NULL);
19591 
19592 			MacToStr(str, sizeof(str), e->MacAddress);
19593 			StrToUni(tmp3, sizeof(tmp3), str);
19594 
19595 			IPToStr32(str, sizeof(str), e->IpAddress);
19596 			StrToUni(tmp4, sizeof(tmp4), str);
19597 
19598 			StrToUni(tmp5, sizeof(tmp5), e->Hostname);
19599 
19600 			CtInsert(ct,
19601 				tmp0, tmp1, tmp2, tmp3, tmp4, tmp5);
19602 		}
19603 
19604 		CtFreeEx(ct, c, true);
19605 	}
19606 
19607 	FreeRpcEnumDhcp(&t);
19608 
19609 	FreeParamValueList(o);
19610 
19611 	return 0;
19612 }
19613 
19614 // Get the list of Virtual HUB management options
PsAdminOptionList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19615 UINT PsAdminOptionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19616 {
19617 	LIST *o;
19618 	PS *ps = (PS *)param;
19619 	UINT ret = 0;
19620 	RPC_ADMIN_OPTION t;
19621 
19622 	// If virtual HUB is not selected, it's an error
19623 	if (ps->HubName == NULL)
19624 	{
19625 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19626 		return ERR_INVALID_PARAMETER;
19627 	}
19628 
19629 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19630 	if (o == NULL)
19631 	{
19632 		return ERR_INVALID_PARAMETER;
19633 	}
19634 
19635 	Zero(&t, sizeof(t));
19636 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19637 
19638 	// RPC call
19639 	ret = ScGetHubAdminOptions(ps->Rpc, &t);
19640 
19641 	if (ret != ERR_NO_ERROR)
19642 	{
19643 		// An error has occured
19644 		CmdPrintError(c, ret);
19645 		FreeParamValueList(o);
19646 		return ret;
19647 	}
19648 	else
19649 	{
19650 		CT *ct = CtNewStandardEx();
19651 		UINT i;
19652 
19653 		for (i = 0;i < t.NumItem;i++)
19654 		{
19655 			ADMIN_OPTION *e = &t.Items[i];
19656 			wchar_t tmp1[MAX_SIZE];
19657 			wchar_t tmp2[MAX_SIZE];
19658 
19659 			StrToUni(tmp1, sizeof(tmp1), e->Name);
19660 			UniToStru(tmp2, e->Value);
19661 
19662 			CtInsert(ct, tmp1, tmp2, GetHubAdminOptionHelpString(e->Name));
19663 
19664 		}
19665 
19666 		CtFreeEx(ct, c, true);
19667 	}
19668 
19669 	FreeRpcAdminOption(&t);
19670 
19671 	FreeParamValueList(o);
19672 
19673 	return 0;
19674 }
19675 
19676 // Set the value of a Virtual HUB management option
PsAdminOptionSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19677 UINT PsAdminOptionSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19678 {
19679 	LIST *o;
19680 	PS *ps = (PS *)param;
19681 	UINT ret = 0;
19682 	RPC_ADMIN_OPTION t;
19683 	// Parameter list that can be specified
19684 	PARAM args[] =
19685 	{
19686 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
19687 		{"[name]", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_name"), CmdEvalNotEmpty, NULL},
19688 		{"VALUE", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_VALUE"), CmdEvalNotEmpty, NULL},
19689 	};
19690 
19691 	// If virtual HUB is not selected, it's an error
19692 	if (ps->HubName == NULL)
19693 	{
19694 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19695 		return ERR_INVALID_PARAMETER;
19696 	}
19697 
19698 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
19699 	if (o == NULL)
19700 	{
19701 		return ERR_INVALID_PARAMETER;
19702 	}
19703 
19704 	Zero(&t, sizeof(t));
19705 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19706 
19707 	// RPC call
19708 	ret = ScGetHubAdminOptions(ps->Rpc, &t);
19709 
19710 	if (ret != ERR_NO_ERROR)
19711 	{
19712 		// An error has occured
19713 		CmdPrintError(c, ret);
19714 		FreeParamValueList(o);
19715 		return ret;
19716 	}
19717 	else
19718 	{
19719 		UINT i;
19720 		bool b = false;
19721 
19722 		for (i = 0;i < t.NumItem;i++)
19723 		{
19724 			if (StrCmpi(t.Items[i].Name, GetParamStr(o, "[name]")) == 0)
19725 			{
19726 				t.Items[i].Value = GetParamInt(o, "VALUE");
19727 				b = true;
19728 			}
19729 		}
19730 
19731 		if (b == false)
19732 		{
19733 			// An error has occured
19734 			ret = ERR_OBJECT_NOT_FOUND;
19735 			CmdPrintError(c, ret);
19736 			FreeParamValueList(o);
19737 			FreeRpcAdminOption(&t);
19738 			return ret;
19739 		}
19740 		else
19741 		{
19742 			StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19743 			ret = ScSetHubAdminOptions(ps->Rpc, &t);
19744 
19745 			if (ret != ERR_NO_ERROR)
19746 			{
19747 				// An error has occured
19748 				CmdPrintError(c, ret);
19749 				FreeParamValueList(o);
19750 				return ret;
19751 			}
19752 		}
19753 	}
19754 
19755 	FreeRpcAdminOption(&t);
19756 
19757 	FreeParamValueList(o);
19758 
19759 	return 0;
19760 }
19761 
19762 // Get the list of Virtual HUB extended options
PsExtOptionList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19763 UINT PsExtOptionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19764 {
19765 	LIST *o;
19766 	PS *ps = (PS *)param;
19767 	UINT ret = 0;
19768 	RPC_ADMIN_OPTION t;
19769 
19770 	// If virtual HUB is not selected, it's an error
19771 	if (ps->HubName == NULL)
19772 	{
19773 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19774 		return ERR_INVALID_PARAMETER;
19775 	}
19776 
19777 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19778 	if (o == NULL)
19779 	{
19780 		return ERR_INVALID_PARAMETER;
19781 	}
19782 
19783 	Zero(&t, sizeof(t));
19784 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19785 
19786 	// RPC call
19787 	ret = ScGetHubExtOptions(ps->Rpc, &t);
19788 
19789 	if (ret != ERR_NO_ERROR)
19790 	{
19791 		// An error has occured
19792 		CmdPrintError(c, ret);
19793 		FreeParamValueList(o);
19794 		return ret;
19795 	}
19796 	else
19797 	{
19798 		CT *ct = CtNewStandardEx();
19799 		UINT i;
19800 
19801 		for (i = 0;i < t.NumItem;i++)
19802 		{
19803 			ADMIN_OPTION *e = &t.Items[i];
19804 			wchar_t tmp1[MAX_SIZE];
19805 			wchar_t tmp2[MAX_SIZE];
19806 
19807 			StrToUni(tmp1, sizeof(tmp1), e->Name);
19808 			UniToStru(tmp2, e->Value);
19809 
19810 			CtInsert(ct, tmp1, tmp2, GetHubAdminOptionHelpString(e->Name));
19811 
19812 		}
19813 
19814 		CtFreeEx(ct, c, true);
19815 	}
19816 
19817 	FreeRpcAdminOption(&t);
19818 
19819 	FreeParamValueList(o);
19820 
19821 	return 0;
19822 }
19823 
19824 // Set the value of a Virtual HUB extended option
PsExtOptionSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19825 UINT PsExtOptionSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19826 {
19827 	LIST *o;
19828 	PS *ps = (PS *)param;
19829 	UINT ret = 0;
19830 	RPC_ADMIN_OPTION t;
19831 	// Parameter list that can be specified
19832 	PARAM args[] =
19833 	{
19834 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
19835 		{"[name]", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_name"), CmdEvalNotEmpty, NULL},
19836 		{"VALUE", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_VALUE"), CmdEvalNotEmpty, NULL},
19837 	};
19838 
19839 	// If virtual HUB is not selected, it's an error
19840 	if (ps->HubName == NULL)
19841 	{
19842 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19843 		return ERR_INVALID_PARAMETER;
19844 	}
19845 
19846 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
19847 	if (o == NULL)
19848 	{
19849 		return ERR_INVALID_PARAMETER;
19850 	}
19851 
19852 	Zero(&t, sizeof(t));
19853 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19854 
19855 	// RPC call
19856 	ret = ScGetHubExtOptions(ps->Rpc, &t);
19857 
19858 	if (ret != ERR_NO_ERROR)
19859 	{
19860 		// An error has occured
19861 		CmdPrintError(c, ret);
19862 		FreeParamValueList(o);
19863 		return ret;
19864 	}
19865 	else
19866 	{
19867 		UINT i;
19868 		bool b = false;
19869 
19870 		for (i = 0;i < t.NumItem;i++)
19871 		{
19872 			if (StrCmpi(t.Items[i].Name, GetParamStr(o, "[name]")) == 0)
19873 			{
19874 				t.Items[i].Value = GetParamInt(o, "VALUE");
19875 				b = true;
19876 			}
19877 		}
19878 
19879 		if (b == false)
19880 		{
19881 			// An error has occured
19882 			ret = ERR_OBJECT_NOT_FOUND;
19883 			CmdPrintError(c, ret);
19884 			FreeParamValueList(o);
19885 			FreeRpcAdminOption(&t);
19886 			return ret;
19887 		}
19888 		else
19889 		{
19890 			StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19891 			ret = ScSetHubExtOptions(ps->Rpc, &t);
19892 
19893 			if (ret != ERR_NO_ERROR)
19894 			{
19895 				// An error has occured
19896 				CmdPrintError(c, ret);
19897 				FreeParamValueList(o);
19898 				return ret;
19899 			}
19900 		}
19901 	}
19902 
19903 	FreeRpcAdminOption(&t);
19904 
19905 	FreeParamValueList(o);
19906 
19907 	return 0;
19908 }
19909 
19910 // Get the list of revoked certificate list
PsCrlList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19911 UINT PsCrlList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19912 {
19913 	LIST *o;
19914 	PS *ps = (PS *)param;
19915 	UINT ret = 0;
19916 	RPC_ENUM_CRL t;
19917 
19918 	// If virtual HUB is not selected, it's an error
19919 	if (ps->HubName == NULL)
19920 	{
19921 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19922 		return ERR_INVALID_PARAMETER;
19923 	}
19924 
19925 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19926 	if (o == NULL)
19927 	{
19928 		return ERR_INVALID_PARAMETER;
19929 	}
19930 
19931 	Zero(&t, sizeof(t));
19932 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19933 
19934 	// RPC call
19935 	ret = ScEnumCrl(ps->Rpc, &t);
19936 
19937 	if (ret != ERR_NO_ERROR)
19938 	{
19939 		// An error has occured
19940 		CmdPrintError(c, ret);
19941 		FreeParamValueList(o);
19942 		return ret;
19943 	}
19944 	else
19945 	{
19946 		UINT i;
19947 		CT *ct = CtNew();
19948 
19949 		CtInsertColumn(ct, _UU("CMD_ID"), false);
19950 		CtInsertColumn(ct, _UU("SM_CRL_COLUMN_1"), false);
19951 
19952 		for (i = 0;i < t.NumItem;i++)
19953 		{
19954 			wchar_t tmp[64];
19955 			RPC_ENUM_CRL_ITEM *e = &t.Items[i];
19956 
19957 			UniToStru(tmp, e->Key);
19958 			CtInsert(ct, tmp, e->CrlInfo);
19959 		}
19960 
19961 		CtFreeEx(ct, c, true);
19962 	}
19963 
19964 	FreeRpcEnumCrl(&t);
19965 
19966 	FreeParamValueList(o);
19967 
19968 	return 0;
19969 }
19970 
19971 // Add a revoked certificate
PsCrlAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19972 UINT PsCrlAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19973 {
19974 	LIST *o;
19975 	PS *ps = (PS *)param;
19976 	UINT ret = 0;
19977 	RPC_CRL t;
19978 	// Parameter list that can be specified
19979 	PARAM args[] =
19980 	{
19981 		{"SERIAL", NULL, NULL, NULL, NULL},
19982 		{"MD5", NULL, NULL, NULL, NULL},
19983 		{"SHA1", NULL, NULL, NULL, NULL},
19984 		{"CN", NULL, NULL, NULL, NULL},
19985 		{"O", NULL, NULL, NULL, NULL},
19986 		{"OU", NULL, NULL, NULL, NULL},
19987 		{"C", NULL, NULL, NULL, NULL},
19988 		{"ST", NULL, NULL, NULL, NULL},
19989 		{"L", NULL, NULL, NULL, NULL},
19990 	};
19991 
19992 	// If virtual HUB is not selected, it's an error
19993 	if (ps->HubName == NULL)
19994 	{
19995 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19996 		return ERR_INVALID_PARAMETER;
19997 	}
19998 
19999 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20000 	if (o == NULL)
20001 	{
20002 		return ERR_INVALID_PARAMETER;
20003 	}
20004 
20005 	Zero(&t, sizeof(t));
20006 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20007 
20008 	{
20009 		bool param_exists = false;
20010 		CRL *crl = ZeroMalloc(sizeof(CRL));
20011 		NAME *n;
20012 		n = crl->Name = ZeroMalloc(sizeof(NAME));
20013 
20014 		if (IsEmptyStr(GetParamStr(o, "CN")) == false)
20015 		{
20016 			n->CommonName = CopyUniStr(GetParamUniStr(o, "CN"));
20017 			param_exists = true;
20018 		}
20019 
20020 		if (IsEmptyStr(GetParamStr(o, "O")) == false)
20021 		{
20022 			n->CommonName = CopyUniStr(GetParamUniStr(o, "O"));
20023 			param_exists = true;
20024 		}
20025 
20026 		if (IsEmptyStr(GetParamStr(o, "OU")) == false)
20027 		{
20028 			n->CommonName = CopyUniStr(GetParamUniStr(o, "OU"));
20029 			param_exists = true;
20030 		}
20031 
20032 		if (IsEmptyStr(GetParamStr(o, "C")) == false)
20033 		{
20034 			n->CommonName = CopyUniStr(GetParamUniStr(o, "C"));
20035 			param_exists = true;
20036 		}
20037 
20038 		if (IsEmptyStr(GetParamStr(o, "ST")) == false)
20039 		{
20040 			n->CommonName = CopyUniStr(GetParamUniStr(o, "ST"));
20041 			param_exists = true;
20042 		}
20043 
20044 		if (IsEmptyStr(GetParamStr(o, "L")) == false)
20045 		{
20046 			n->CommonName = CopyUniStr(GetParamUniStr(o, "L"));
20047 			param_exists = true;
20048 		}
20049 
20050 		if (IsEmptyStr(GetParamStr(o, "SERIAL")) == false)
20051 		{
20052 			BUF *b;
20053 
20054 			b = StrToBin(GetParamStr(o, "SERIAL"));
20055 
20056 			if (b != NULL && b->Size >= 1)
20057 			{
20058 				crl->Serial = NewXSerial(b->Buf, b->Size);
20059 				param_exists = true;
20060 			}
20061 
20062 			FreeBuf(b);
20063 		}
20064 
20065 		if (IsEmptyStr(GetParamStr(o, "MD5")) == false)
20066 		{
20067 			BUF *b;
20068 
20069 			b = StrToBin(GetParamStr(o, "MD5"));
20070 
20071 			if (b != NULL && b->Size == MD5_SIZE)
20072 			{
20073 				Copy(crl->DigestMD5, b->Buf, MD5_SIZE);
20074 				param_exists = true;
20075 			}
20076 
20077 			FreeBuf(b);
20078 		}
20079 
20080 		if (IsEmptyStr(GetParamStr(o, "SHA1")) == false)
20081 		{
20082 			BUF *b;
20083 
20084 			b = StrToBin(GetParamStr(o, "SHA1"));
20085 
20086 			if (b != NULL && b->Size == SHA1_SIZE)
20087 			{
20088 				Copy(crl->DigestSHA1, b->Buf, SHA1_SIZE);
20089 				param_exists = true;
20090 			}
20091 
20092 			FreeBuf(b);
20093 		}
20094 
20095 		t.Crl = crl;
20096 
20097 		if (param_exists == false)
20098 		{
20099 			FreeRpcCrl(&t);
20100 			ret = ERR_INVALID_PARAMETER;
20101 			CmdPrintError(c, ret);
20102 			FreeParamValueList(o);
20103 			return ret;
20104 		}
20105 	}
20106 
20107 	// RPC call
20108 	ret = ScAddCrl(ps->Rpc, &t);
20109 
20110 	if (ret != ERR_NO_ERROR)
20111 	{
20112 		// An error has occured
20113 		CmdPrintError(c, ret);
20114 		FreeParamValueList(o);
20115 		return ret;
20116 	}
20117 
20118 	FreeRpcCrl(&t);
20119 
20120 	FreeParamValueList(o);
20121 
20122 	return 0;
20123 }
20124 
20125 // Delete the revoked certificate
PsCrlDel(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20126 UINT PsCrlDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20127 {
20128 	LIST *o;
20129 	PS *ps = (PS *)param;
20130 	UINT ret = 0;
20131 	RPC_CRL t;
20132 	// Parameter list that can be specified
20133 	PARAM args[] =
20134 	{
20135 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
20136 		{"[id]", CmdPrompt, _UU("CMD_CrlDel_Prompt_ID"), CmdEvalNotEmpty, NULL},
20137 	};
20138 
20139 	// If virtual HUB is not selected, it's an error
20140 	if (ps->HubName == NULL)
20141 	{
20142 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20143 		return ERR_INVALID_PARAMETER;
20144 	}
20145 
20146 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20147 	if (o == NULL)
20148 	{
20149 		return ERR_INVALID_PARAMETER;
20150 	}
20151 
20152 	Zero(&t, sizeof(t));
20153 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20154 	t.Key = GetParamInt(o, "[id]");
20155 
20156 	// RPC call
20157 	ret = ScDelCrl(ps->Rpc, &t);
20158 
20159 	if (ret != ERR_NO_ERROR)
20160 	{
20161 		// An error has occured
20162 		CmdPrintError(c, ret);
20163 		FreeParamValueList(o);
20164 		return ret;
20165 	}
20166 
20167 	FreeRpcCrl(&t);
20168 
20169 	FreeParamValueList(o);
20170 
20171 	return 0;
20172 }
20173 
20174 // Get the revoked certificate
PsCrlGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20175 UINT PsCrlGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20176 {
20177 	LIST *o;
20178 	PS *ps = (PS *)param;
20179 	UINT ret = 0;
20180 	RPC_CRL t;
20181 	// Parameter list that can be specified
20182 	PARAM args[] =
20183 	{
20184 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
20185 		{"[id]", CmdPrompt, _UU("CMD_CrlGet_Prompt_ID"), CmdEvalNotEmpty, NULL},
20186 	};
20187 
20188 	// If virtual HUB is not selected, it's an error
20189 	if (ps->HubName == NULL)
20190 	{
20191 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20192 		return ERR_INVALID_PARAMETER;
20193 	}
20194 
20195 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20196 	if (o == NULL)
20197 	{
20198 		return ERR_INVALID_PARAMETER;
20199 	}
20200 
20201 	Zero(&t, sizeof(t));
20202 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20203 	t.Key = GetParamInt(o, "[id]");
20204 
20205 	// RPC call
20206 	ret = ScGetCrl(ps->Rpc, &t);
20207 
20208 	if (ret != ERR_NO_ERROR)
20209 	{
20210 		// An error has occured
20211 		CmdPrintError(c, ret);
20212 		FreeParamValueList(o);
20213 		return ret;
20214 	}
20215 	else
20216 	{
20217 		// Show contents
20218 		CT *ct = CtNewStandard();
20219 		CRL *crl = t.Crl;
20220 		NAME *n;
20221 
20222 		if (crl != NULL)
20223 		{
20224 			n = crl->Name;
20225 
20226 			if (n != NULL)
20227 			{
20228 				if (UniIsEmptyStr(n->CommonName) == false)
20229 				{
20230 					CtInsert(ct, _UU("CMD_CrlGet_CN"), n->CommonName);
20231 				}
20232 				if (UniIsEmptyStr(n->Organization) == false)
20233 				{
20234 					CtInsert(ct, _UU("CMD_CrlGet_O"), n->Organization);
20235 				}
20236 				if (UniIsEmptyStr(n->Unit) == false)
20237 				{
20238 					CtInsert(ct, _UU("CMD_CrlGet_OU"), n->Unit);
20239 				}
20240 				if (UniIsEmptyStr(n->Country) == false)
20241 				{
20242 					CtInsert(ct, _UU("CMD_CrlGet_C"), n->Country);
20243 				}
20244 				if (UniIsEmptyStr(n->State) == false)
20245 				{
20246 					CtInsert(ct, _UU("CMD_CrlGet_ST"), n->State);
20247 				}
20248 				if (UniIsEmptyStr(n->Local) == false)
20249 				{
20250 					CtInsert(ct, _UU("CMD_CrlGet_L"), n->Local);
20251 				}
20252 			}
20253 
20254 			if (crl->Serial != NULL && crl->Serial->size >= 1)
20255 			{
20256 				wchar_t tmp[MAX_SIZE];
20257 				char str[MAX_SIZE];
20258 
20259 				BinToStrEx(str, sizeof(str), crl->Serial->data, crl->Serial->size);
20260 				StrToUni(tmp, sizeof(tmp), str);
20261 
20262 				CtInsert(ct, _UU("CMD_CrlGet_SERI"), tmp);
20263 			}
20264 
20265 			if (IsZero(crl->DigestMD5, MD5_SIZE) == false)
20266 			{
20267 				wchar_t tmp[MAX_SIZE];
20268 				char str[MAX_SIZE];
20269 
20270 				BinToStrEx(str, sizeof(str), crl->DigestMD5, MD5_SIZE);
20271 				StrToUni(tmp, sizeof(tmp), str);
20272 
20273 				CtInsert(ct, _UU("CMD_CrlGet_MD5_HASH"), tmp);
20274 			}
20275 
20276 			if (IsZero(crl->DigestSHA1, SHA1_SIZE) == false)
20277 			{
20278 				wchar_t tmp[MAX_SIZE];
20279 				char str[MAX_SIZE];
20280 
20281 				BinToStrEx(str, sizeof(str), crl->DigestSHA1, SHA1_SIZE);
20282 				StrToUni(tmp, sizeof(tmp), str);
20283 
20284 				CtInsert(ct, _UU("CMD_CrlGet_SHA1_HASH"), tmp);
20285 			}
20286 		}
20287 		CtFree(ct, c);
20288 	}
20289 
20290 	FreeRpcCrl(&t);
20291 
20292 	FreeParamValueList(o);
20293 
20294 	return 0;
20295 }
20296 
20297 // Get the rules of IP access control list
PsAcList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20298 UINT PsAcList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20299 {
20300 	LIST *o;
20301 	PS *ps = (PS *)param;
20302 	UINT ret = 0;
20303 	RPC_AC_LIST t;
20304 
20305 	// If virtual HUB is not selected, it's an error
20306 	if (ps->HubName == NULL)
20307 	{
20308 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20309 		return ERR_INVALID_PARAMETER;
20310 	}
20311 
20312 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
20313 	if (o == NULL)
20314 	{
20315 		return ERR_INVALID_PARAMETER;
20316 	}
20317 
20318 	Zero(&t, sizeof(t));
20319 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20320 
20321 	// RPC call
20322 	ret = ScGetAcList(ps->Rpc, &t);
20323 
20324 	if (ret != ERR_NO_ERROR)
20325 	{
20326 		// An error has occured
20327 		CmdPrintError(c, ret);
20328 		FreeParamValueList(o);
20329 		return ret;
20330 	}
20331 	else
20332 	{
20333 		UINT i;
20334 		CT *ct;
20335 
20336 		ct = CtNew();
20337 		CtInsertColumn(ct, _UU("SM_AC_COLUMN_1"), true);
20338 		CtInsertColumn(ct, _UU("SM_AC_COLUMN_2"), true);
20339 		CtInsertColumn(ct, _UU("SM_AC_COLUMN_3"), false);
20340 		CtInsertColumn(ct, _UU("SM_AC_COLUMN_4"), false);
20341 
20342 		for (i = 0;i < LIST_NUM(t.o);i++)
20343 		{
20344 			wchar_t tmp1[32], *tmp2, tmp3[MAX_SIZE], tmp4[32];
20345 			char *tmp_str;
20346 			AC *ac = LIST_DATA(t.o, i);
20347 
20348 			UniToStru(tmp1, ac->Id);
20349 			tmp2 = ac->Deny ? _UU("SM_AC_DENY") : _UU("SM_AC_PASS");
20350 			tmp_str = GenerateAcStr(ac);
20351 			StrToUni(tmp3, sizeof(tmp3), tmp_str);
20352 
20353 			Free(tmp_str);
20354 
20355 			UniToStru(tmp4, ac->Priority);
20356 
20357 			CtInsert(ct, tmp1, tmp4, tmp2, tmp3);
20358 		}
20359 
20360 		CtFree(ct, c);
20361 	}
20362 
20363 	FreeRpcAcList(&t);
20364 
20365 	FreeParamValueList(o);
20366 
20367 	return 0;
20368 }
20369 
20370 // Add a rule to the IP access control list (IPv4)
PsAcAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20371 UINT PsAcAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20372 {
20373 	LIST *o;
20374 	PS *ps = (PS *)param;
20375 	UINT ret = 0;
20376 	RPC_AC_LIST t;
20377 	// Parameter list that can be specified
20378 	CMD_EVAL_MIN_MAX mm =
20379 	{
20380 		"CMD_AcAdd_Eval_PRIORITY", 1, 4294967295UL,
20381 	};
20382 	PARAM args[] =
20383 	{
20384 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
20385 		{"[allow|deny]", CmdPrompt, _UU("CMD_AcAdd_Prompt_AD"), CmdEvalNotEmpty, NULL},
20386 		{"PRIORITY", CmdPrompt, _UU("CMD_AcAdd_Prompt_PRIORITY"), CmdEvalMinMax, &mm},
20387 		{"IP", CmdPrompt, _UU("CMD_AcAdd_Prompt_IP"), CmdEvalIpAndMask4, NULL},
20388 	};
20389 
20390 	// If virtual HUB is not selected, it's an error
20391 	if (ps->HubName == NULL)
20392 	{
20393 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20394 		return ERR_INVALID_PARAMETER;
20395 	}
20396 
20397 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20398 	if (o == NULL)
20399 	{
20400 		return ERR_INVALID_PARAMETER;
20401 	}
20402 
20403 	Zero(&t, sizeof(t));
20404 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20405 
20406 	// RPC call
20407 	ret = ScGetAcList(ps->Rpc, &t);
20408 
20409 	if (ret != ERR_NO_ERROR)
20410 	{
20411 		// An error has occured
20412 		CmdPrintError(c, ret);
20413 		FreeParamValueList(o);
20414 		return ret;
20415 	}
20416 	else
20417 	{
20418 		// Add a new item to the list
20419 		AC *ac = ZeroMalloc(sizeof(AC));
20420 		char *test = GetParamStr(o, "[allow|deny]");
20421 		UINT u_ip, u_mask;
20422 
20423 		if (StartWith("deny", test))
20424 		{
20425 			ac->Deny = true;
20426 		}
20427 
20428 		ParseIpAndMask4(GetParamStr(o, "IP"), &u_ip, &u_mask);
20429 		UINTToIP(&ac->IpAddress, u_ip);
20430 
20431 		if (u_mask == 0xffffffff)
20432 		{
20433 			ac->Masked = false;
20434 		}
20435 		else
20436 		{
20437 			ac->Masked = true;
20438 			UINTToIP(&ac->SubnetMask, u_mask);
20439 		}
20440 
20441 		ac->Priority = GetParamInt(o, "PRIORITY");
20442 
20443 		Insert(t.o, ac);
20444 
20445 		ret = ScSetAcList(ps->Rpc, &t);
20446 		if (ret != ERR_NO_ERROR)
20447 		{
20448 			// An error has occured
20449 			CmdPrintError(c, ret);
20450 			FreeParamValueList(o);
20451 			return ret;
20452 		}
20453 	}
20454 
20455 	FreeRpcAcList(&t);
20456 
20457 	FreeParamValueList(o);
20458 
20459 	return 0;
20460 }
20461 
20462 // Add a rule to the IP access control list (IPv6)
PsAcAdd6(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20463 UINT PsAcAdd6(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20464 {
20465 	LIST *o;
20466 	PS *ps = (PS *)param;
20467 	UINT ret = 0;
20468 	RPC_AC_LIST t;
20469 	// Parameter list that can be specified
20470 	CMD_EVAL_MIN_MAX mm =
20471 	{
20472 		"CMD_AcAdd6_Eval_PRIORITY", 1, 4294967295UL,
20473 	};
20474 	PARAM args[] =
20475 	{
20476 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
20477 		{"[allow|deny]", CmdPrompt, _UU("CMD_AcAdd6_Prompt_AD"), CmdEvalNotEmpty, NULL},
20478 		{"PRIORITY", CmdPrompt, _UU("CMD_AcAdd6_Prompt_PRIORITY"), CmdEvalMinMax, &mm},
20479 		{"IP", CmdPrompt, _UU("CMD_AcAdd6_Prompt_IP"), CmdEvalIpAndMask6, NULL},
20480 	};
20481 
20482 	// If virtual HUB is not selected, it's an error
20483 	if (ps->HubName == NULL)
20484 	{
20485 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20486 		return ERR_INVALID_PARAMETER;
20487 	}
20488 
20489 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20490 	if (o == NULL)
20491 	{
20492 		return ERR_INVALID_PARAMETER;
20493 	}
20494 
20495 	Zero(&t, sizeof(t));
20496 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20497 
20498 	// RPC call
20499 	ret = ScGetAcList(ps->Rpc, &t);
20500 
20501 	if (ret != ERR_NO_ERROR)
20502 	{
20503 		// An error has occured
20504 		CmdPrintError(c, ret);
20505 		FreeParamValueList(o);
20506 		return ret;
20507 	}
20508 	else
20509 	{
20510 		// Add a new item to the list
20511 		AC *ac = ZeroMalloc(sizeof(AC));
20512 		char *test = GetParamStr(o, "[allow|deny]");
20513 		IP u_ip, u_mask;
20514 
20515 		if (StartWith("deny", test))
20516 		{
20517 			ac->Deny = true;
20518 		}
20519 
20520 		ParseIpAndMask6(GetParamStr(o, "IP"), &u_ip, &u_mask);
20521 		Copy(&ac->IpAddress, &u_ip, sizeof(IP));
20522 
20523 		if (SubnetMaskToInt6(&u_mask) == 128)
20524 		{
20525 			ac->Masked = false;
20526 		}
20527 		else
20528 		{
20529 			ac->Masked = true;
20530 			Copy(&ac->SubnetMask, &u_mask, sizeof(IP));
20531 		}
20532 
20533 		ac->Priority = GetParamInt(o, "PRIORITY");
20534 
20535 		Insert(t.o, ac);
20536 
20537 		ret = ScSetAcList(ps->Rpc, &t);
20538 		if (ret != ERR_NO_ERROR)
20539 		{
20540 			// An error has occured
20541 			CmdPrintError(c, ret);
20542 			FreeParamValueList(o);
20543 			return ret;
20544 		}
20545 	}
20546 
20547 	FreeRpcAcList(&t);
20548 
20549 	FreeParamValueList(o);
20550 
20551 	return 0;
20552 }
20553 
20554 // Run the debug command
PsDebug(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20555 UINT PsDebug(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20556 {
20557 	LIST *o;
20558 	PS *ps = (PS *)param;
20559 	UINT ret = 0;
20560 	UINT id;
20561 	// Parameter list that can be specified
20562 	PARAM args[] =
20563 	{
20564 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
20565 		{"[id]", NULL, NULL, NULL, NULL},
20566 		{"ARG", NULL, NULL, NULL, NULL},
20567 	};
20568 
20569 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20570 	if (o == NULL)
20571 	{
20572 		return ERR_INVALID_PARAMETER;
20573 	}
20574 
20575 	id = GetParamInt(o, "[id]");
20576 
20577 	if (true)
20578 	{
20579 		RPC_TEST t;
20580 		UINT ret;
20581 
20582 		c->Write(c, _UU("CMD_Debug_Msg1"));
20583 
20584 		Zero(&t, sizeof(t));
20585 
20586 		t.IntValue = id;
20587 		StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "ARG"));
20588 
20589 		ret = ScDebug(ps->Rpc, &t);
20590 
20591 		if (ret != ERR_NO_ERROR)
20592 		{
20593 			// An error has occured
20594 			CmdPrintError(c, ret);
20595 			FreeParamValueList(o);
20596 			return ret;
20597 		}
20598 		else
20599 		{
20600 			wchar_t tmp[sizeof(t.StrValue)];
20601 
20602 			UniFormat(tmp, sizeof(tmp), _UU("CMD_Debug_Msg2"), t.StrValue);
20603 			c->Write(c, tmp);
20604 		}
20605 	}
20606 
20607 	FreeParamValueList(o);
20608 
20609 	return 0;
20610 }
20611 
20612 // Flush the configuration file on the server
PsFlush(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20613 UINT PsFlush(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20614 {
20615 	LIST *o;
20616 	PS *ps = (PS *)param;
20617 	UINT ret = 0;
20618 
20619 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
20620 	if (o == NULL)
20621 	{
20622 		return ERR_INVALID_PARAMETER;
20623 	}
20624 
20625 	if (true)
20626 	{
20627 		RPC_TEST t;
20628 		UINT ret;
20629 		wchar_t tmp[MAX_SIZE];
20630 		char sizestr[MAX_SIZE];
20631 
20632 		c->Write(c, _UU("CMD_Flush_Msg1"));
20633 
20634 		Zero(&t, sizeof(t));
20635 
20636 		ret = ScFlush(ps->Rpc, &t);
20637 
20638 		if (ret != ERR_NO_ERROR)
20639 		{
20640 			// An error has occured
20641 			CmdPrintError(c, ret);
20642 			FreeParamValueList(o);
20643 			return ret;
20644 		}
20645 
20646 		ToStr3(sizestr, sizeof(sizestr), (UINT64)t.IntValue);
20647 		UniFormat(tmp, sizeof(tmp), _UU("CMD_Flush_Msg2"), sizestr);
20648 		c->Write(c, tmp);
20649 	}
20650 
20651 	FreeParamValueList(o);
20652 
20653 	return 0;
20654 }
20655 
20656 // Crash
PsCrash(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20657 UINT PsCrash(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20658 {
20659 	LIST *o;
20660 	PS *ps = (PS *)param;
20661 	UINT ret = 0;
20662 	char *yes;
20663 	// Parameter list that can be specified
20664 	PARAM args[] =
20665 	{
20666 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
20667 		{"[yes]", CmdPrompt, _UU("CMD_Crash_Confirm"), NULL, NULL},
20668 	};
20669 
20670 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20671 	if (o == NULL)
20672 	{
20673 		return ERR_INVALID_PARAMETER;
20674 	}
20675 
20676 	yes = GetParamStr(o, "[yes]");
20677 
20678 	if (StrCmpi(yes, "yes") != 0)
20679 	{
20680 		c->Write(c, _UU("CMD_Crash_Aborted"));
20681 	}
20682 	else
20683 	{
20684 		RPC_TEST t;
20685 		UINT ret;
20686 
20687 		c->Write(c, _UU("CMD_Crash_Msg"));
20688 
20689 		Zero(&t, sizeof(t));
20690 
20691 		ret = ScCrash(ps->Rpc, &t);
20692 
20693 		if (ret != ERR_NO_ERROR)
20694 		{
20695 			// An error has occured
20696 			CmdPrintError(c, ret);
20697 			FreeParamValueList(o);
20698 			return ret;
20699 		}
20700 	}
20701 
20702 	FreeParamValueList(o);
20703 
20704 	return 0;
20705 }
20706 
20707 // Remove a rule in the IP access control list
PsAcDel(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20708 UINT PsAcDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20709 {
20710 	LIST *o;
20711 	PS *ps = (PS *)param;
20712 	UINT ret = 0;
20713 	RPC_AC_LIST t;
20714 	// Parameter list that can be specified
20715 	PARAM args[] =
20716 	{
20717 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
20718 		{"[id]", CmdPrompt, _UU("CMD_AcDel_Prompt_ID"), CmdEvalNotEmpty, NULL},
20719 	};
20720 
20721 	// If virtual HUB is not selected, it's an error
20722 	if (ps->HubName == NULL)
20723 	{
20724 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20725 		return ERR_INVALID_PARAMETER;
20726 	}
20727 
20728 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20729 	if (o == NULL)
20730 	{
20731 		return ERR_INVALID_PARAMETER;
20732 	}
20733 
20734 	Zero(&t, sizeof(t));
20735 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20736 
20737 	// RPC call
20738 	ret = ScGetAcList(ps->Rpc, &t);
20739 
20740 	if (ret != ERR_NO_ERROR)
20741 	{
20742 		// An error has occured
20743 		CmdPrintError(c, ret);
20744 		FreeParamValueList(o);
20745 		return ret;
20746 	}
20747 	else
20748 	{
20749 		// Remove matched ID
20750 		UINT i;
20751 		bool b = false;
20752 
20753 		for (i = 0;i < LIST_NUM(t.o);i++)
20754 		{
20755 			AC *ac = LIST_DATA(t.o, i);
20756 
20757 			if (ac->Id == GetParamInt(o, "[id]"))
20758 			{
20759 				Delete(t.o, ac);
20760 				Free(ac);
20761 				b = true;
20762 				break;
20763 			}
20764 		}
20765 
20766 		if (b == false)
20767 		{
20768 			ret = ERR_OBJECT_NOT_FOUND;
20769 			FreeRpcAcList(&t);
20770 		}
20771 		else
20772 		{
20773 			ret = ScSetAcList(ps->Rpc, &t);
20774 		}
20775 		if (ret != ERR_NO_ERROR)
20776 		{
20777 			// An error has occured
20778 			CmdPrintError(c, ret);
20779 			FreeParamValueList(o);
20780 			return ret;
20781 		}
20782 	}
20783 
20784 	FreeRpcAcList(&t);
20785 	FreeParamValueList(o);
20786 
20787 	return 0;
20788 }
20789 
20790 // Enable / Disable the IPsec VPN server function
PsIPsecEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20791 UINT PsIPsecEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20792 {
20793 	LIST *o;
20794 	PS *ps = (PS *)param;
20795 	UINT ret = 0;
20796 	IPSEC_SERVICES t;
20797 	// Parameter list that can be specified
20798 	PARAM args[] =
20799 	{
20800 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
20801 		{"L2TP", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_L2TP"), CmdEvalNotEmpty, NULL},
20802 		{"L2TPRAW", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_L2TPRAW"), CmdEvalNotEmpty, NULL},
20803 		{"ETHERIP", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_ETHERIP"), CmdEvalNotEmpty, NULL},
20804 		{"PSK", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_PSK"), CmdEvalNotEmpty, NULL},
20805 		{"DEFAULTHUB", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_DEFAULTHUB"), CmdEvalNotEmpty, NULL},
20806 	};
20807 
20808 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20809 	if (o == NULL)
20810 	{
20811 		return ERR_INVALID_PARAMETER;
20812 	}
20813 
20814 	Zero(&t, sizeof(t));
20815 	t.L2TP_IPsec = GetParamYes(o, "L2TP");
20816 	t.L2TP_Raw = GetParamYes(o, "L2TPRAW");
20817 	t.EtherIP_IPsec = GetParamYes(o, "ETHERIP");
20818 	StrCpy(t.IPsec_Secret, sizeof(t.IPsec_Secret), GetParamStr(o, "PSK"));
20819 	StrCpy(t.L2TP_DefaultHub, sizeof(t.L2TP_DefaultHub), GetParamStr(o, "DEFAULTHUB"));
20820 
20821 	// RPC call
20822 	ret = ScSetIPsecServices(ps->Rpc, &t);
20823 
20824 	if (ret != ERR_NO_ERROR)
20825 	{
20826 		// An error has occured
20827 		CmdPrintError(c, ret);
20828 		FreeParamValueList(o);
20829 		return ret;
20830 	}
20831 
20832 	FreeParamValueList(o);
20833 
20834 	return 0;
20835 }
20836 
20837 // Get the current configuration of IPsec VPN server function
PsIPsecGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20838 UINT PsIPsecGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20839 {
20840 	LIST *o;
20841 	PS *ps = (PS *)param;
20842 	UINT ret = 0;
20843 	IPSEC_SERVICES t;
20844 
20845 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
20846 	if (o == NULL)
20847 	{
20848 		return ERR_INVALID_PARAMETER;
20849 	}
20850 
20851 	Zero(&t, sizeof(t));
20852 
20853 	// RPC call
20854 	ret = ScGetIPsecServices(ps->Rpc, &t);
20855 
20856 	if (ret != ERR_NO_ERROR)
20857 	{
20858 		// An error has occured
20859 		CmdPrintError(c, ret);
20860 		FreeParamValueList(o);
20861 		return ret;
20862 	}
20863 	else
20864 	{
20865 		wchar_t tmp[MAX_PATH];
20866 		CT *ct = CtNewStandard();
20867 
20868 		CtInsert(ct, _UU("CMD_IPsecGet_PRINT_L2TP"), _UU(t.L2TP_IPsec ? "SEC_YES" : "SEC_NO"));
20869 		CtInsert(ct, _UU("CMD_IPsecGet_PRINT_L2TPRAW"), _UU(t.L2TP_Raw ? "SEC_YES" : "SEC_NO"));
20870 		CtInsert(ct, _UU("CMD_IPsecGet_PRINT_ETHERIP"), _UU(t.EtherIP_IPsec ? "SEC_YES" : "SEC_NO"));
20871 
20872 		StrToUni(tmp, sizeof(tmp), t.IPsec_Secret);
20873 		CtInsert(ct, _UU("CMD_IPsecGet_PRINT_PSK"), tmp);
20874 
20875 		StrToUni(tmp, sizeof(tmp), t.L2TP_DefaultHub);
20876 		CtInsert(ct, _UU("CMD_IPsecGet_PRINT_DEFAULTHUB"), tmp);
20877 
20878 		CtFree(ct, c);
20879 	}
20880 
20881 	FreeParamValueList(o);
20882 
20883 	return 0;
20884 }
20885 
20886 // Add connection settings for accepting connections from client devices of EtherIP / L2TPv3 over IPsec server function
PsEtherIpClientAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20887 UINT PsEtherIpClientAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20888 {
20889 	LIST *o;
20890 	PS *ps = (PS *)param;
20891 	UINT ret = 0;
20892 	ETHERIP_ID t;
20893 	// Parameter list that can be specified
20894 	PARAM args[] =
20895 	{
20896 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
20897 		{"[ID]", CmdPrompt, _UU("CMD_EtherIpClientAdd_Prompt_ID"), CmdEvalNotEmpty, NULL},
20898 		{"HUB", CmdPrompt, _UU("CMD_EtherIpClientAdd_Prompt_HUB"), CmdEvalNotEmpty, NULL},
20899 		{"USERNAME", CmdPrompt, _UU("CMD_EtherIpClientAdd_Prompt_USERNAME"), CmdEvalNotEmpty, NULL},
20900 		{"PASSWORD", CmdPrompt, _UU("CMD_EtherIpClientAdd_Prompt_PASSWORD"), CmdEvalNotEmpty, NULL},
20901 	};
20902 
20903 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20904 	if (o == NULL)
20905 	{
20906 		return ERR_INVALID_PARAMETER;
20907 	}
20908 
20909 	Zero(&t, sizeof(t));
20910 	StrCpy(t.Id, sizeof(t.Id), GetParamStr(o, "[ID]"));
20911 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "HUB"));
20912 	StrCpy(t.UserName, sizeof(t.UserName), GetParamStr(o, "USERNAME"));
20913 	StrCpy(t.Password, sizeof(t.Password), GetParamStr(o, "PASSWORD"));
20914 
20915 	// RPC call
20916 	ret = ScAddEtherIpId(ps->Rpc, &t);
20917 
20918 	if (ret != ERR_NO_ERROR)
20919 	{
20920 		// An error has occured
20921 		CmdPrintError(c, ret);
20922 		FreeParamValueList(o);
20923 		return ret;
20924 	}
20925 
20926 	FreeParamValueList(o);
20927 
20928 	return 0;
20929 }
20930 
20931 // Delete the connection settings for accepting connections from client devices of EtherIP / L2TPv3 over IPsec server function
PsEtherIpClientDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20932 UINT PsEtherIpClientDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20933 {
20934 	LIST *o;
20935 	PS *ps = (PS *)param;
20936 	UINT ret = 0;
20937 	ETHERIP_ID t;
20938 	// Parameter list that can be specified
20939 	PARAM args[] =
20940 	{
20941 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
20942 		{"[ID]", CmdPrompt, _UU("CMD_EtherIpClientDelete_Prompt_ID"), CmdEvalNotEmpty, NULL},
20943 	};
20944 
20945 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20946 	if (o == NULL)
20947 	{
20948 		return ERR_INVALID_PARAMETER;
20949 	}
20950 
20951 	Zero(&t, sizeof(t));
20952 	StrCpy(t.Id, sizeof(t.Id), GetParamStr(o, "[ID]"));
20953 
20954 	// RPC call
20955 	ret = ScDeleteEtherIpId(ps->Rpc, &t);
20956 
20957 	if (ret != ERR_NO_ERROR)
20958 	{
20959 		// An error has occured
20960 		CmdPrintError(c, ret);
20961 		FreeParamValueList(o);
20962 		return ret;
20963 	}
20964 
20965 	FreeParamValueList(o);
20966 
20967 	return 0;
20968 }
20969 
20970 // Show the list of connection settings for accepting connections from client devices of EtherIP / L2TPv3 over IPsec server function
PsEtherIpClientList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20971 UINT PsEtherIpClientList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20972 {
20973 	LIST *o;
20974 	PS *ps = (PS *)param;
20975 	UINT ret = 0;
20976 	RPC_ENUM_ETHERIP_ID t;
20977 	UINT i;
20978 	CT *b;
20979 
20980 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
20981 	if (o == NULL)
20982 	{
20983 		return ERR_INVALID_PARAMETER;
20984 	}
20985 
20986 	Zero(&t, sizeof(t));
20987 
20988 	// RPC call
20989 	ret = ScEnumEtherIpId(ps->Rpc, &t);
20990 
20991 	if (ret != ERR_NO_ERROR)
20992 	{
20993 		// An error has occured
20994 		CmdPrintError(c, ret);
20995 		FreeParamValueList(o);
20996 		return ret;
20997 	}
20998 	else
20999 	{
21000 		b = CtNew();
21001 
21002 		CtInsertColumn(b, _UU("SM_ETHERIP_COLUMN_0"), false);
21003 		CtInsertColumn(b, _UU("SM_ETHERIP_COLUMN_1"), false);
21004 		CtInsertColumn(b, _UU("SM_ETHERIP_COLUMN_2"), false);
21005 
21006 		for (i = 0;i < t.NumItem;i++)
21007 		{
21008 			ETHERIP_ID *d = &t.IdList[i];
21009 			wchar_t id[MAX_SIZE], hubname[MAX_SIZE], username[MAX_SIZE];
21010 
21011 			StrToUni(id, sizeof(id), d->Id);
21012 			StrToUni(hubname, sizeof(hubname), d->HubName);
21013 			StrToUni(username, sizeof(username), d->UserName);
21014 
21015 			CtInsert(b, id, hubname, username);
21016 		}
21017 
21018 		CtFree(b, c);
21019 
21020 		FreeRpcEnumEtherIpId(&t);
21021 	}
21022 
21023 	FreeParamValueList(o);
21024 
21025 	return 0;
21026 }
21027 
21028 // Enable / disable the OpenVPN compatible server function
PsOpenVpnEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21029 UINT PsOpenVpnEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21030 {
21031 	LIST *o;
21032 	PS *ps = (PS *)param;
21033 	UINT ret = 0;
21034 	OPENVPN_SSTP_CONFIG t;
21035 	// Parameter list that can be specified
21036 	PARAM args[] =
21037 	{
21038 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21039 		{"[yes|no]", CmdPrompt, _UU("CMD_OpenVpnEnable_Prompt_[yes|no]"), CmdEvalNotEmpty, NULL},
21040 		{"PORTS", CmdPrompt, _UU("CMD_OpenVpnEnable_Prompt_PORTS"), CmdEvalNotEmpty, NULL},
21041 	};
21042 
21043 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21044 	if (o == NULL)
21045 	{
21046 		return ERR_INVALID_PARAMETER;
21047 	}
21048 
21049 	Zero(&t, sizeof(t));
21050 
21051 	// RPC call
21052 	ret = ScGetOpenVpnSstpConfig(ps->Rpc, &t);
21053 
21054 	if (ret != ERR_NO_ERROR)
21055 	{
21056 		// An error has occured
21057 		CmdPrintError(c, ret);
21058 		FreeParamValueList(o);
21059 		return ret;
21060 	}
21061 
21062 	t.EnableOpenVPN = GetParamYes(o, "[yes|no]");
21063 	StrCpy(t.OpenVPNPortList, sizeof(t.OpenVPNPortList), GetParamStr(o, "PORTS"));
21064 
21065 	// RPC call
21066 	ret = ScSetOpenVpnSstpConfig(ps->Rpc, &t);
21067 
21068 	if (ret != ERR_NO_ERROR)
21069 	{
21070 		// An error has occured
21071 		CmdPrintError(c, ret);
21072 		FreeParamValueList(o);
21073 		return ret;
21074 	}
21075 
21076 	FreeParamValueList(o);
21077 
21078 	return 0;
21079 }
21080 
21081 // Get the current settings for the OpenVPN compatible server function
PsOpenVpnGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21082 UINT PsOpenVpnGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21083 {
21084 	LIST *o;
21085 	PS *ps = (PS *)param;
21086 	UINT ret = 0;
21087 	OPENVPN_SSTP_CONFIG t;
21088 
21089 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
21090 	if (o == NULL)
21091 	{
21092 		return ERR_INVALID_PARAMETER;
21093 	}
21094 
21095 	Zero(&t, sizeof(t));
21096 
21097 	// RPC call
21098 	ret = ScGetOpenVpnSstpConfig(ps->Rpc, &t);
21099 
21100 	if (ret != ERR_NO_ERROR)
21101 	{
21102 		// An error has occured
21103 		CmdPrintError(c, ret);
21104 		FreeParamValueList(o);
21105 		return ret;
21106 	}
21107 	else
21108 	{
21109 		wchar_t tmp[MAX_PATH];
21110 		CT *ct = CtNewStandard();
21111 
21112 		CtInsert(ct, _UU("CMD_OpenVpnGet_PRINT_Enabled"), _UU(t.EnableOpenVPN ? "SEC_YES" : "SEC_NO"));
21113 
21114 		StrToUni(tmp, sizeof(tmp), t.OpenVPNPortList);
21115 		CtInsert(ct, _UU("CMD_OpenVpnGet_PRINT_Ports"), tmp);
21116 
21117 		CtFree(ct, c);
21118 	}
21119 
21120 	FreeParamValueList(o);
21121 
21122 	return 0;
21123 }
21124 
21125 // Generate a OpenVPN sample configuration file that can connect to the OpenVPN compatible server function
PsOpenVpnMakeConfig(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21126 UINT PsOpenVpnMakeConfig(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21127 {
21128 	LIST *o;
21129 	PS *ps = (PS *)param;
21130 	UINT ret = 0;
21131 	RPC_READ_LOG_FILE t;
21132 	// Parameter list that can be specified
21133 	PARAM args[] =
21134 	{
21135 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21136 		{"[ZIP_FileName]", CmdPrompt, _UU("CMD_OpenVpnMakeConfig_Prompt_ZIP"), CmdEvalNotEmpty, NULL},
21137 	};
21138 
21139 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21140 	if (o == NULL)
21141 	{
21142 		return ERR_INVALID_PARAMETER;
21143 	}
21144 
21145 	Zero(&t, sizeof(t));
21146 
21147 	// RPC call
21148 	ret = ScMakeOpenVpnConfigFile(ps->Rpc, &t);
21149 
21150 	if (ret != ERR_NO_ERROR)
21151 	{
21152 		// An error has occured
21153 		CmdPrintError(c, ret);
21154 		FreeParamValueList(o);
21155 		return ret;
21156 	}
21157 	else
21158 	{
21159 		// Determine the file name to save
21160 		wchar_t filename[MAX_SIZE];
21161 		wchar_t tmp[MAX_SIZE];
21162 
21163 		UniStrCpy(filename, sizeof(filename), GetParamUniStr(o, "[ZIP_FileName]"));
21164 
21165 		if (UniEndWith(filename, L".zip") == false)
21166 		{
21167 			UniStrCat(filename, sizeof(filename), L".zip");
21168 		}
21169 
21170 		if (DumpBufW(t.Buffer, filename) == false)
21171 		{
21172 			ret = ERR_INTERNAL_ERROR;
21173 
21174 			UniFormat(tmp, sizeof(tmp), _UU("CMD_OpenVpnMakeConfig_ERROR"), filename);
21175 		}
21176 		else
21177 		{
21178 			UniFormat(tmp, sizeof(tmp), _UU("CMD_OpenVpnMakeConfig_OK"), filename);
21179 		}
21180 
21181 		c->Write(c, tmp);
21182 
21183 		FreeRpcReadLogFile(&t);
21184 	}
21185 
21186 	FreeParamValueList(o);
21187 
21188 	return ret;
21189 }
21190 
21191 // Enable / disable the Microsoft SSTP VPN compatible server function
PsSstpEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21192 UINT PsSstpEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21193 {
21194 	LIST *o;
21195 	PS *ps = (PS *)param;
21196 	UINT ret = 0;
21197 	OPENVPN_SSTP_CONFIG t;
21198 	// Parameter list that can be specified
21199 	PARAM args[] =
21200 	{
21201 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21202 		{"[yes|no]", CmdPrompt, _UU("CMD_SstpEnable_Prompt_[yes|no]"), CmdEvalNotEmpty, NULL},
21203 	};
21204 
21205 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21206 	if (o == NULL)
21207 	{
21208 		return ERR_INVALID_PARAMETER;
21209 	}
21210 
21211 	Zero(&t, sizeof(t));
21212 
21213 	// RPC call
21214 	ret = ScGetOpenVpnSstpConfig(ps->Rpc, &t);
21215 
21216 	if (ret != ERR_NO_ERROR)
21217 	{
21218 		// An error has occured
21219 		CmdPrintError(c, ret);
21220 		FreeParamValueList(o);
21221 		return ret;
21222 	}
21223 
21224 	t.EnableSSTP = GetParamYes(o, "[yes|no]");
21225 
21226 	// RPC call
21227 	ret = ScSetOpenVpnSstpConfig(ps->Rpc, &t);
21228 
21229 	if (ret != ERR_NO_ERROR)
21230 	{
21231 		// An error has occured
21232 		CmdPrintError(c, ret);
21233 		FreeParamValueList(o);
21234 		return ret;
21235 	}
21236 
21237 	FreeParamValueList(o);
21238 
21239 	return 0;
21240 }
21241 
21242 // Get the current settings for the Microsoft SSTP VPN compatible server function
PsSstpGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21243 UINT PsSstpGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21244 {
21245 	LIST *o;
21246 	PS *ps = (PS *)param;
21247 	UINT ret = 0;
21248 	OPENVPN_SSTP_CONFIG t;
21249 
21250 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
21251 	if (o == NULL)
21252 	{
21253 		return ERR_INVALID_PARAMETER;
21254 	}
21255 
21256 	Zero(&t, sizeof(t));
21257 
21258 	// RPC call
21259 	ret = ScGetOpenVpnSstpConfig(ps->Rpc, &t);
21260 
21261 	if (ret != ERR_NO_ERROR)
21262 	{
21263 		// An error has occured
21264 		CmdPrintError(c, ret);
21265 		FreeParamValueList(o);
21266 		return ret;
21267 	}
21268 	else
21269 	{
21270 		CT *ct = CtNewStandard();
21271 
21272 		CtInsert(ct, _UU("CMD_SstpEnable_PRINT_Enabled"), _UU(t.EnableSSTP ? "SEC_YES" : "SEC_NO"));
21273 
21274 		CtFree(ct, c);
21275 	}
21276 
21277 	FreeParamValueList(o);
21278 
21279 	return 0;
21280 }
21281 
21282 // Register to the VPN Server by creating a new self-signed certificate with the specified CN (Common Name)
PsServerCertRegenerate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21283 UINT PsServerCertRegenerate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21284 {
21285 	LIST *o;
21286 	PS *ps = (PS *)param;
21287 	UINT ret = 0;
21288 	RPC_TEST t;
21289 	// Parameter list that can be specified
21290 	PARAM args[] =
21291 	{
21292 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21293 		{"[CN]", CmdPrompt, _UU("CMD_ServerCertRegenerate_Prompt_CN"), CmdEvalNotEmpty, NULL},
21294 	};
21295 
21296 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21297 	if (o == NULL)
21298 	{
21299 		return ERR_INVALID_PARAMETER;
21300 	}
21301 
21302 	Zero(&t, sizeof(t));
21303 	StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "[CN]"));
21304 
21305 	// RPC call
21306 	ret = ScRegenerateServerCert(ps->Rpc, &t);
21307 
21308 	if (ret != ERR_NO_ERROR)
21309 	{
21310 		// An error has occured
21311 		CmdPrintError(c, ret);
21312 		FreeParamValueList(o);
21313 		return ret;
21314 	}
21315 
21316 	c->Write(c, L"");
21317 	c->Write(c, _UU("CM_CERT_SET_MSG"));
21318 	c->Write(c, L"");
21319 
21320 	FreeParamValueList(o);
21321 
21322 	return 0;
21323 }
21324 
21325 // Enable / disable the VPN over ICMP / VPN over DNS server function
PsVpnOverIcmpDnsEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21326 UINT PsVpnOverIcmpDnsEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21327 {
21328 	LIST *o;
21329 	PS *ps = (PS *)param;
21330 	UINT ret = 0;
21331 	RPC_SPECIAL_LISTENER t;
21332 	// Parameter list that can be specified
21333 	PARAM args[] =
21334 	{
21335 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21336 		{"ICMP", CmdPrompt, _UU("CMD_VpnOverIcmpDnsEnable_Prompt_ICMP"), CmdEvalNotEmpty, NULL},
21337 		{"DNS", CmdPrompt, _UU("CMD_VpnOverIcmpDnsEnable_Prompt_DNS"), CmdEvalNotEmpty, NULL},
21338 	};
21339 
21340 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21341 	if (o == NULL)
21342 	{
21343 		return ERR_INVALID_PARAMETER;
21344 	}
21345 
21346 	Zero(&t, sizeof(t));
21347 	t.VpnOverIcmpListener = GetParamYes(o, "ICMP");
21348 	t.VpnOverDnsListener = GetParamYes(o, "DNS");
21349 
21350 	// RPC call
21351 	ret = ScSetSpecialListener(ps->Rpc, &t);
21352 
21353 	if (ret != ERR_NO_ERROR)
21354 	{
21355 		// An error has occured
21356 		CmdPrintError(c, ret);
21357 		FreeParamValueList(o);
21358 		return ret;
21359 	}
21360 
21361 	FreeParamValueList(o);
21362 
21363 	return 0;
21364 }
21365 
21366 // Get current settings of VPN over ICMP / VPN over DNS server function
PsVpnOverIcmpDnsGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21367 UINT PsVpnOverIcmpDnsGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21368 {
21369 	LIST *o;
21370 	PS *ps = (PS *)param;
21371 	UINT ret = 0;
21372 	RPC_SPECIAL_LISTENER t;
21373 
21374 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
21375 	if (o == NULL)
21376 	{
21377 		return ERR_INVALID_PARAMETER;
21378 	}
21379 
21380 	Zero(&t, sizeof(t));
21381 
21382 	// RPC call
21383 	ret = ScGetSpecialListener(ps->Rpc, &t);
21384 
21385 	if (ret != ERR_NO_ERROR)
21386 	{
21387 		// An error has occured
21388 		CmdPrintError(c, ret);
21389 		FreeParamValueList(o);
21390 		return ret;
21391 	}
21392 	else
21393 	{
21394 		CT *ct = CtNewStandard();
21395 
21396 		CtInsert(ct, _UU("CMD_VpnOverIcmpDnsGet_PRINT_ICMP"), _UU(t.VpnOverIcmpListener ? "SEC_YES" : "SEC_NO"));
21397 		CtInsert(ct, _UU("CMD_VpnOverIcmpDnsGet_PRINT_DNS"), _UU(t.VpnOverDnsListener ? "SEC_YES" : "SEC_NO"));
21398 
21399 		CtFree(ct, c);
21400 	}
21401 
21402 	FreeParamValueList(o);
21403 
21404 	return 0;
21405 }
21406 
21407 // Enable / disable the VPN Azure function
PsVpnAzureSetEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21408 UINT PsVpnAzureSetEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21409 {
21410 	LIST *o;
21411 	PS *ps = (PS *)param;
21412 	UINT ret = 0;
21413 	RPC_AZURE_STATUS t;
21414 	// Parameter list that can be specified
21415 	PARAM args[] =
21416 	{
21417 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21418 		{"[yes|no]", CmdPrompt, _UU("VpnAzureSetEnable_PROMPT"), CmdEvalNotEmpty, NULL},
21419 	};
21420 
21421 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21422 	if (o == NULL)
21423 	{
21424 		return ERR_INVALID_PARAMETER;
21425 	}
21426 
21427 	Zero(&t, sizeof(t));
21428 	t.IsEnabled = GetParamYes(o, "[yes|no]");
21429 
21430 	// RPC call
21431 	ret = ScSetAzureStatus(ps->Rpc, &t);
21432 
21433 	if (ret != ERR_NO_ERROR)
21434 	{
21435 		// An error has occured
21436 		CmdPrintError(c, ret);
21437 		FreeParamValueList(o);
21438 		return ret;
21439 	}
21440 
21441 	FreeParamValueList(o);
21442 
21443 	return 0;
21444 }
21445 
21446 // Get the current state of the VPN Azure function
PsVpnAzureGetStatus(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21447 UINT PsVpnAzureGetStatus(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21448 {
21449 	LIST *o;
21450 	PS *ps = (PS *)param;
21451 	UINT ret = 0;
21452 	RPC_AZURE_STATUS t;
21453 	DDNS_CLIENT_STATUS t2;
21454 
21455 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
21456 	if (o == NULL)
21457 	{
21458 		return ERR_INVALID_PARAMETER;
21459 	}
21460 
21461 	Zero(&t, sizeof(t));
21462 	Zero(&t2, sizeof(t2));
21463 
21464 	// RPC call
21465 	ret = ScGetAzureStatus(ps->Rpc, &t);
21466 
21467 	if (ret == ERR_NO_ERROR)
21468 	{
21469 		ret = ScGetDDnsClientStatus(ps->Rpc, &t2);
21470 	}
21471 
21472 	if (ret != ERR_NO_ERROR)
21473 	{
21474 		// An error has occured
21475 		CmdPrintError(c, ret);
21476 		FreeParamValueList(o);
21477 		return ret;
21478 	}
21479 	else
21480 	{
21481 		CT *ct = CtNewStandard();
21482 
21483 		CtInsert(ct, _UU("CMD_VpnAzureGetStatus_PRINT_ENABLED"), _UU(t.IsEnabled ? "SEC_YES" : "SEC_NO"));
21484 
21485 		if (t.IsEnabled)
21486 		{
21487 			wchar_t tmp[MAX_SIZE];
21488 
21489 			UniFormat(tmp, sizeof(tmp), L"%S%S", t2.CurrentHostName, AZURE_DOMAIN_SUFFIX);
21490 
21491 			CtInsert(ct, _UU("CMD_VpnAzureGetStatus_PRINT_CONNECTED"), _UU(t.IsConnected ? "SEC_YES" : "SEC_NO"));
21492 			CtInsert(ct, _UU("CMD_VpnAzureGetStatus_PRINT_HOSTNAME"), tmp);
21493 		}
21494 
21495 		CtFree(ct, c);
21496 	}
21497 
21498 	FreeParamValueList(o);
21499 
21500 	return 0;
21501 }
21502 
21503 // Get the current state of the dynamic DNS function
PsDynamicDnsGetStatus(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21504 UINT PsDynamicDnsGetStatus(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21505 {
21506 	LIST *o;
21507 	PS *ps = (PS *)param;
21508 	UINT ret = 0;
21509 	DDNS_CLIENT_STATUS t;
21510 
21511 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
21512 	if (o == NULL)
21513 	{
21514 		return ERR_INVALID_PARAMETER;
21515 	}
21516 
21517 	Zero(&t, sizeof(t));
21518 
21519 	// RPC call
21520 	ret = ScGetDDnsClientStatus(ps->Rpc, &t);
21521 
21522 	if (ret != ERR_NO_ERROR)
21523 	{
21524 		// An error has occured
21525 		CmdPrintError(c, ret);
21526 		FreeParamValueList(o);
21527 		return ret;
21528 	}
21529 	else
21530 	{
21531 		CT *ct = CtNewStandard();
21532 		wchar_t tmp[MAX_SIZE];
21533 
21534 		// FQDN
21535 		if (IsEmptyStr(t.CurrentFqdn) == false)
21536 		{
21537 			StrToUni(tmp, sizeof(tmp), t.CurrentFqdn);
21538 		}
21539 		else
21540 		{
21541 			UniStrCpy(tmp, sizeof(tmp), _UU("SM_DDNS_FQDN_EMPTY"));
21542 		}
21543 		CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_FQDN"), tmp);
21544 
21545 		// Hostname
21546 		if (IsEmptyStr(t.CurrentHostName) == false)
21547 		{
21548 			StrToUni(tmp, sizeof(tmp), t.CurrentHostName);
21549 		}
21550 		else
21551 		{
21552 			UniStrCpy(tmp, sizeof(tmp), _UU("SM_DDNS_FQDN_EMPTY"));
21553 		}
21554 		CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_HOSTNAME"), tmp);
21555 
21556 		// Suffix
21557 		if (IsEmptyStr(t.DnsSuffix) == false)
21558 		{
21559 			StrToUni(tmp, sizeof(tmp), t.DnsSuffix);
21560 		}
21561 		else
21562 		{
21563 			UniStrCpy(tmp, sizeof(tmp), _UU("SM_DDNS_FQDN_EMPTY"));
21564 		}
21565 		CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_SUFFIX"), tmp);
21566 
21567 		// IPv4
21568 		if (t.Err_IPv4 == ERR_NO_ERROR)
21569 		{
21570 			StrToUni(tmp, sizeof(tmp), t.CurrentIPv4);
21571 		}
21572 		else
21573 		{
21574 			UniStrCpy(tmp, sizeof(tmp), _E(t.Err_IPv4));
21575 		}
21576 		CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_IPv4"), tmp);
21577 
21578 		// IPv6
21579 		if (t.Err_IPv6 == ERR_NO_ERROR)
21580 		{
21581 			StrToUni(tmp, sizeof(tmp), t.CurrentIPv6);
21582 		}
21583 		else
21584 		{
21585 			UniStrCpy(tmp, sizeof(tmp), _E(t.Err_IPv6));
21586 		}
21587 		CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_IPv6"), tmp);
21588 
21589 		CtFree(ct, c);
21590 	}
21591 
21592 	FreeParamValueList(o);
21593 
21594 	return 0;
21595 }
21596 
21597 // Configure the dynamic DNS host name
PsDynamicDnsSetHostname(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21598 UINT PsDynamicDnsSetHostname(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21599 {
21600 	LIST *o;
21601 	PS *ps = (PS *)param;
21602 	UINT ret = 0;
21603 	RPC_TEST t;
21604 	// Parameter list that can be specified
21605 	PARAM args[] =
21606 	{
21607 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21608 		{"[hostname]", CmdPrompt, _UU("CMD_DynamicDnsSetHostname_Prompt_hostname"), CmdEvalNotEmpty, NULL},
21609 	};
21610 
21611 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21612 	if (o == NULL)
21613 	{
21614 		return ERR_INVALID_PARAMETER;
21615 	}
21616 
21617 	Zero(&t, sizeof(t));
21618 	StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "[hostname]"));
21619 
21620 	// RPC call
21621 	ret = ScChangeDDnsClientHostname(ps->Rpc, &t);
21622 
21623 	if (ret != ERR_NO_ERROR)
21624 	{
21625 		// An error has occured
21626 		CmdPrintError(c, ret);
21627 		FreeParamValueList(o);
21628 		return ret;
21629 	}
21630 
21631 	FreeParamValueList(o);
21632 
21633 	return 0;
21634 }
21635 
21636 // Register a new license key
PsLicenseAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21637 UINT PsLicenseAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21638 {
21639 	LIST *o;
21640 	PS *ps = (PS *)param;
21641 	UINT ret = 0;
21642 	RPC_TEST t;
21643 	// Parameter list that can be specified
21644 	PARAM args[] =
21645 	{
21646 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21647 		{"[key]", CmdPrompt, _UU("CMD_LicenseAdd_Prompt_Key"), CmdEvalNotEmpty, NULL},
21648 	};
21649 
21650 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21651 	if (o == NULL)
21652 	{
21653 		return ERR_INVALID_PARAMETER;
21654 	}
21655 
21656 	Zero(&t, sizeof(t));
21657 	StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "[key]"));
21658 
21659 	// RPC call
21660 	ret = ScAddLicenseKey(ps->Rpc, &t);
21661 
21662 	if (ret != ERR_NO_ERROR)
21663 	{
21664 		// An error has occured
21665 		CmdPrintError(c, ret);
21666 		FreeParamValueList(o);
21667 		return ret;
21668 	}
21669 
21670 	FreeParamValueList(o);
21671 
21672 	c->Write(c, _UU("SM_LICENSE_WARNING"));
21673 	c->Write(c, L"\n");
21674 
21675 	return 0;
21676 }
21677 
21678 // Delete the registered license
PsLicenseDel(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21679 UINT PsLicenseDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21680 {
21681 	LIST *o;
21682 	PS *ps = (PS *)param;
21683 	UINT ret = 0;
21684 	RPC_TEST t;
21685 	// Parameter list that can be specified
21686 	PARAM args[] =
21687 	{
21688 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21689 		{"[id]", CmdPrompt, _UU("CMD_LicenseDel_Prompt_ID"), CmdEvalNotEmpty, NULL},
21690 	};
21691 
21692 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21693 	if (o == NULL)
21694 	{
21695 		return ERR_INVALID_PARAMETER;
21696 	}
21697 
21698 	Zero(&t, sizeof(t));
21699 	t.IntValue = GetParamInt(o, "[id]");
21700 
21701 	// RPC call
21702 	ret = ScDelLicenseKey(ps->Rpc, &t);
21703 
21704 	if (ret != ERR_NO_ERROR)
21705 	{
21706 		// An error has occured
21707 		CmdPrintError(c, ret);
21708 		FreeParamValueList(o);
21709 		return ret;
21710 	}
21711 
21712 	FreeParamValueList(o);
21713 
21714 	return 0;
21715 }
21716 
21717 
21718 
21719 // Get the registered license list
PsLicenseList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21720 UINT PsLicenseList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21721 {
21722 	LIST *o;
21723 	PS *ps = (PS *)param;
21724 	UINT ret = 0;
21725 	RPC_ENUM_LICENSE_KEY t;
21726 	CT *ct;
21727 	UINT i;
21728 
21729 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
21730 	if (o == NULL)
21731 	{
21732 		return ERR_INVALID_PARAMETER;
21733 	}
21734 
21735 	Zero(&t, sizeof(t));
21736 
21737 	// RPC call
21738 	ret = ScEnumLicenseKey(ps->Rpc, &t);
21739 
21740 	if (ret != ERR_NO_ERROR)
21741 	{
21742 		// An error has occured
21743 		CmdPrintError(c, ret);
21744 		FreeParamValueList(o);
21745 		return ret;
21746 	}
21747 
21748 	ct = CtNew();
21749 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_1"), false);
21750 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_2"), false);
21751 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_3"), false);
21752 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_4"), false);
21753 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_5"), false);
21754 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_6"), false);
21755 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_7"), false);
21756 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_8"), false);
21757 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_9"), false);
21758 
21759 	for (i = 0;i < t.NumItem;i++)
21760 	{
21761 		wchar_t tmp1[32], tmp2[LICENSE_KEYSTR_LEN + 1], tmp3[LICENSE_MAX_PRODUCT_NAME_LEN + 1],
21762 			*tmp4, tmp5[128], tmp6[LICENSE_LICENSEID_STR_LEN + 1], tmp7[64],
21763 			tmp8[64], tmp9[64];
21764 		RPC_ENUM_LICENSE_KEY_ITEM *e = &t.Items[i];
21765 
21766 		UniToStru(tmp1, e->Id);
21767 		StrToUni(tmp2, sizeof(tmp2), e->LicenseKey);
21768 		StrToUni(tmp3, sizeof(tmp3), e->LicenseName);
21769 		tmp4 = LiGetLicenseStatusStr(e->Status);
21770 		if (e->Expires == 0)
21771 		{
21772 			UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_LICENSE_NO_EXPIRES"));
21773 		}
21774 		else
21775 		{
21776 			GetDateStrEx64(tmp5, sizeof(tmp5), e->Expires, NULL);
21777 		}
21778 		StrToUni(tmp6, sizeof(tmp6), e->LicenseId);
21779 		UniToStru(tmp7, e->ProductId);
21780 		UniFormat(tmp8, sizeof(tmp8), L"%I64u", e->SystemId);
21781 		UniToStru(tmp9, e->SerialId);
21782 
21783 		CtInsert(ct,
21784 			tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9);
21785 	}
21786 
21787 	CtFreeEx(ct, c, true);
21788 
21789 	FreeRpcEnumLicenseKey(&t);
21790 
21791 	FreeParamValueList(o);
21792 
21793 	return 0;
21794 }
21795 
21796 // Get the license status of the current VPN Server
PsLicenseStatus(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21797 UINT PsLicenseStatus(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21798 {
21799 	LIST *o;
21800 	PS *ps = (PS *)param;
21801 	UINT ret = 0;
21802 	RPC_LICENSE_STATUS st;
21803 	CT *ct;
21804 	wchar_t tmp[MAX_SIZE];
21805 
21806 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
21807 	if (o == NULL)
21808 	{
21809 		return ERR_INVALID_PARAMETER;
21810 	}
21811 
21812 	Zero(&st, sizeof(st));
21813 
21814 	// RPC call
21815 	ret = ScGetLicenseStatus(ps->Rpc, &st);
21816 
21817 	if (ret != ERR_NO_ERROR)
21818 	{
21819 		// An error has occured
21820 		CmdPrintError(c, ret);
21821 		FreeParamValueList(o);
21822 		return ret;
21823 	}
21824 
21825 	ct = CtNewStandard();
21826 
21827 	if (st.EditionId == LICENSE_EDITION_VPN3_NO_LICENSE)
21828 	{
21829 		CtInsert(ct, _UU("SM_NO_LICENSE_COLUMN"), _UU("SM_NO_LICENSE"));
21830 	}
21831 	else
21832 	{
21833 		// Product edition name
21834 		StrToUni(tmp, sizeof(tmp), st.EditionStr);
21835 		CtInsert(ct, _UU("SM_LICENSE_STATUS_EDITION"), tmp);
21836 
21837 		// Release date
21838 		if (st.ReleaseDate != 0)
21839 		{
21840 			GetDateStrEx64(tmp, sizeof(tmp), st.ReleaseDate, NULL);
21841 			CtInsert(ct, _UU("SM_LICENSE_STATUS_RELEASE"), tmp);
21842 		}
21843 
21844 		// Current system ID
21845 		UniFormat(tmp, sizeof(tmp), L"%I64u", st.SystemId);
21846 		CtInsert(ct, _UU("SM_LICENSE_STATUS_SYSTEM_ID"), tmp);
21847 
21848 		// Expiration date of the current license product
21849 		if (st.SystemExpires == 0)
21850 		{
21851 			UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_NO_EXPIRES"));
21852 		}
21853 		else
21854 		{
21855 			GetDateStrEx64(tmp, sizeof(tmp), st.SystemExpires, NULL);
21856 		}
21857 		CtInsert(ct,  _UU("SM_LICENSE_STATUS_EXPIRES"), tmp);
21858 
21859 		// Subscription (support) contract
21860 		if (st.NeedSubscription == false)
21861 		{
21862 			UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_STATUS_SUBSCRIPTION_NONEED"));
21863 		}
21864 		else
21865 		{
21866 			if (st.SubscriptionExpires == 0)
21867 			{
21868 				UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_STATUS_SUBSCRIPTION_NONE"));
21869 			}
21870 			else
21871 			{
21872 				wchar_t dtstr[MAX_PATH];
21873 
21874 				GetDateStrEx64(dtstr, sizeof(dtstr), st.SubscriptionExpires, NULL);
21875 
21876 				UniFormat(tmp, sizeof(tmp),
21877 					st.IsSubscriptionExpired ? _UU("SM_LICENSE_STATUS_SUBSCRIPTION_EXPIRED") :  _UU("SM_LICENSE_STATUS_SUBSCRIPTION_VALID"),
21878 					dtstr);
21879 			}
21880 		}
21881 		CtInsert(ct, _UU("SM_LICENSE_STATUS_SUBSCRIPTION"), tmp);
21882 
21883 		if (st.NeedSubscription == false && st.SubscriptionExpires != 0)
21884 		{
21885 			wchar_t dtstr[MAX_PATH];
21886 
21887 			GetDateStrEx64(dtstr, sizeof(dtstr), st.SubscriptionExpires, NULL);
21888 
21889 			CtInsert(ct, _UU("SM_LICENSE_STATUS_SUBSCRIPTION_BUILD_STR"), tmp);
21890 		}
21891 
21892 		if (GetCapsBool(ps->CapsList, "b_vpn3"))
21893 		{
21894 			// Maximum creatable number of users
21895 			if (st.NumClientConnectLicense == INFINITE)
21896 			{
21897 				UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_INFINITE"));
21898 			}
21899 			else
21900 			{
21901 				UniToStru(tmp, st.NumClientConnectLicense);
21902 			}
21903 			CtInsert(ct, _UU("SM_LICENSE_NUM_CLIENT"), tmp);
21904 		}
21905 
21906 		// Available number of concurrent client connections
21907 		if (st.NumBridgeConnectLicense == INFINITE)
21908 		{
21909 			UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_INFINITE"));
21910 		}
21911 		else
21912 		{
21913 			UniToStru(tmp, st.NumBridgeConnectLicense);
21914 		}
21915 		CtInsert(ct, _UU("SM_LICENSE_NUM_BRIDGE"), tmp);
21916 
21917 		// Availability of enterprise features
21918 		CtInsert(ct, _UU("SM_LICENSE_STATUS_ENTERPRISE"),
21919 			st.AllowEnterpriseFunction ? _UU("SM_LICENSE_STATUS_ENTERPRISE_YES") : _UU("SM_LICENSE_STATUS_ENTERPRISE_NO"));
21920 	}
21921 
21922 	CtFreeEx(ct, c, false);
21923 
21924 	FreeParamValueList(o);
21925 
21926 	return 0;
21927 }
21928 
21929 
21930 // Get the cluster configuration
PsClusterSettingGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21931 UINT PsClusterSettingGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21932 {
21933 	LIST *o;
21934 	PS *ps = (PS *)param;
21935 	UINT ret;
21936 	RPC_FARM t;
21937 	CT *ct;
21938 
21939 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
21940 	if (o == NULL)
21941 	{
21942 		return ERR_INVALID_PARAMETER;
21943 	}
21944 
21945 	Zero(&t, sizeof(t));
21946 
21947 	ret = ScGetFarmSetting(ps->Rpc, &t);
21948 
21949 	if (ret != ERR_NO_ERROR)
21950 	{
21951 		CmdPrintError(c, ret);
21952 		FreeParamValueList(o);
21953 		return ret;
21954 	}
21955 
21956 	if (t.Weight == 0)
21957 	{
21958 		t.Weight = FARM_DEFAULT_WEIGHT;
21959 	}
21960 
21961 	// Show the cluster configuration
21962 	ct = CtNewStandard();
21963 
21964 	CtInsert(ct, _UU("CMD_ClusterSettingGet_Current"),
21965 		GetServerTypeStr(t.ServerType));
21966 
21967 	if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
21968 	{
21969 		CtInsert(ct, _UU("CMD_ClusterSettingGet_ControllerOnly"), t.ControllerOnly ? _UU("SEC_YES") : _UU("SEC_NO"));
21970 	}
21971 
21972 	if (t.ServerType != SERVER_TYPE_STANDALONE)
21973 	{
21974 		wchar_t tmp[MAX_SIZE];
21975 
21976 		UniToStru(tmp, t.Weight);
21977 
21978 		CtInsert(ct, _UU("CMD_ClusterSettingGet_Weight"), tmp);
21979 	}
21980 
21981 	if (t.ServerType == SERVER_TYPE_FARM_MEMBER)
21982 	{
21983 		wchar_t tmp[MAX_SIZE];
21984 		UINT i;
21985 
21986 		// Public IP address
21987 		if (t.PublicIp != 0)
21988 		{
21989 			IPToUniStr32(tmp, sizeof(tmp), t.PublicIp);
21990 		}
21991 		else
21992 		{
21993 			UniStrCpy(tmp, sizeof(tmp), _UU("CMD_ClusterSettingGet_None"));
21994 		}
21995 
21996 		CtInsert(ct, _UU("CMD_ClusterSettingGet_PublicIp"), tmp);
21997 
21998 		// Public port list
21999 		tmp[0] = 0;
22000 		for (i = 0;i < t.NumPort;i++)
22001 		{
22002 			wchar_t tmp2[64];
22003 
22004 			UniFormat(tmp2, sizeof(tmp2), L"%u, ", t.Ports[i]);
22005 
22006 			UniStrCat(tmp, sizeof(tmp), tmp2);
22007 		}
22008 
22009 		if (UniEndWith(tmp, L", "))
22010 		{
22011 			tmp[UniStrLen(tmp) - 2] = 0;
22012 		}
22013 
22014 		CtInsert(ct, _UU("CMD_ClusterSettingGet_PublicPorts"), tmp);
22015 
22016 		// Controller to connect
22017 		UniFormat(tmp, sizeof(tmp), L"%S:%u", t.ControllerName, t.ControllerPort);
22018 		CtInsert(ct, _UU("CMD_ClusterSettingGet_Controller"), tmp);
22019 	}
22020 
22021 	CtFree(ct, c);
22022 
22023 	FreeRpcFarm(&t);
22024 	FreeParamValueList(o);
22025 
22026 	return 0;
22027 }
22028 
22029 // Set the server password
PsServerPasswordSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22030 UINT PsServerPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22031 {
22032 	LIST *o;
22033 	PS *ps = (PS *)param;
22034 	UINT ret;
22035 	RPC_SET_PASSWORD t;
22036 	char *pw;
22037 	PARAM args[] =
22038 	{
22039 		{"[password]", CmdPromptChoosePassword, NULL, NULL, NULL},
22040 	};
22041 
22042 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
22043 	if (o == NULL)
22044 	{
22045 		return ERR_INVALID_PARAMETER;
22046 	}
22047 
22048 	pw = GetParamStr(o, "[password]");
22049 
22050 	Zero(&t, sizeof(t));
22051 	Hash(t.HashedPassword, pw, StrLen(pw), true);
22052 
22053 	ret = ScSetServerPassword(ps->Rpc, &t);
22054 
22055 	if (ret != ERR_NO_ERROR)
22056 	{
22057 		CmdPrintError(c, ret);
22058 		FreeParamValueList(o);
22059 		return ret;
22060 	}
22061 
22062 	FreeParamValueList(o);
22063 
22064 	return 0;
22065 }
22066 
22067 // Password decision prompt (for Prompt function)
CmdPromptChoosePassword(CONSOLE * c,void * param)22068 wchar_t *CmdPromptChoosePassword(CONSOLE *c, void *param)
22069 {
22070 	char *s;
22071 	// Validate arguments
22072 	if (c == NULL)
22073 	{
22074 		return NULL;
22075 	}
22076 
22077 	s = CmdPasswordPrompt(c);
22078 
22079 	if (s == NULL)
22080 	{
22081 		return NULL;
22082 	}
22083 	else
22084 	{
22085 		wchar_t *ret = CopyStrToUni(s);
22086 
22087 		Free(s);
22088 
22089 		return ret;
22090 	}
22091 }
22092 
22093 // Password input prompt (general-purpose)
CmdPasswordPrompt(CONSOLE * c)22094 char *CmdPasswordPrompt(CONSOLE *c)
22095 {
22096 	char *pw1, *pw2;
22097 	// Validate arguments
22098 	if (c == NULL)
22099 	{
22100 		return NULL;
22101 	}
22102 
22103 	c->Write(c, _UU("CMD_VPNCMD_PWPROMPT_0"));
22104 
22105 RETRY:
22106 	c->Write(c, L"");
22107 
22108 
22109 	pw1 = c->ReadPassword(c, _UU("CMD_VPNCMD_PWPROMPT_1"));
22110 	if (pw1 == NULL)
22111 	{
22112 		return NULL;
22113 	}
22114 
22115 	pw2 = c->ReadPassword(c, _UU("CMD_VPNCMD_PWPROMPT_2"));
22116 	if (pw2 == NULL)
22117 	{
22118 		Free(pw1);
22119 		return NULL;
22120 	}
22121 
22122 	c->Write(c, L"");
22123 
22124 	if (StrCmp(pw1, pw2) != 0)
22125 	{
22126 		Free(pw1);
22127 		Free(pw2);
22128 		c->Write(c, _UU("CMD_VPNCMD_PWPROMPT_3"));
22129 		goto RETRY;
22130 	}
22131 
22132 	Free(pw1);
22133 
22134 	return pw2;
22135 }
22136 
22137 // Disable the listener
PsListenerDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22138 UINT PsListenerDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22139 {
22140 	LIST *o;
22141 	PS *ps = (PS *)param;
22142 	UINT ret;
22143 	RPC_LISTENER t;
22144 	PARAM args[] =
22145 	{
22146 		{"[port]", CmdPromptPort, _UU("CMD_ListenerDisable_PortPrompt"), CmdEvalPort, NULL},
22147 	};
22148 
22149 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
22150 	if (o == NULL)
22151 	{
22152 		return ERR_INVALID_PARAMETER;
22153 	}
22154 
22155 	Zero(&t, sizeof(t));
22156 	t.Enable = false;
22157 	t.Port = ToInt(GetParamStr(o, "[port]"));
22158 
22159 	ret = ScEnableListener(ps->Rpc, &t);
22160 
22161 	if (ret != ERR_NO_ERROR)
22162 	{
22163 		CmdPrintError(c, ret);
22164 		FreeParamValueList(o);
22165 		return ret;
22166 	}
22167 
22168 	FreeParamValueList(o);
22169 
22170 	return 0;
22171 }
22172 
22173 // Enable the listener
PsListenerEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22174 UINT PsListenerEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22175 {
22176 	LIST *o;
22177 	PS *ps = (PS *)param;
22178 	UINT ret;
22179 	RPC_LISTENER t;
22180 	PARAM args[] =
22181 	{
22182 		{"[port]", CmdPromptPort, _UU("CMD_ListenerEnable_PortPrompt"), CmdEvalPort, NULL},
22183 	};
22184 
22185 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
22186 	if (o == NULL)
22187 	{
22188 		return ERR_INVALID_PARAMETER;
22189 	}
22190 
22191 	Zero(&t, sizeof(t));
22192 	t.Enable = true;
22193 	t.Port = ToInt(GetParamStr(o, "[port]"));
22194 
22195 	ret = ScEnableListener(ps->Rpc, &t);
22196 
22197 	if (ret != ERR_NO_ERROR)
22198 	{
22199 		CmdPrintError(c, ret);
22200 		FreeParamValueList(o);
22201 		return ret;
22202 	}
22203 
22204 	FreeParamValueList(o);
22205 
22206 	return 0;
22207 }
22208 
22209 // Draw a row of console table
CtPrintRow(CONSOLE * c,UINT num,UINT * widths,wchar_t ** strings,bool * rights,char separate_char)22210 void CtPrintRow(CONSOLE *c, UINT num, UINT *widths, wchar_t **strings, bool *rights, char separate_char)
22211 {
22212 	UINT i;
22213 	wchar_t *buf;
22214 	UINT buf_size;
22215 	bool is_sep_line = true;
22216 	// Validate arguments
22217 	if (c == NULL || num == 0 || widths == NULL || strings == NULL || rights == NULL)
22218 	{
22219 		return;
22220 	}
22221 
22222 	buf_size = 32;
22223 	for (i = 0;i < num;i++)
22224 	{
22225 		buf_size += sizeof(wchar_t) * widths[i] + 6;
22226 	}
22227 
22228 	buf = ZeroMalloc(buf_size);
22229 
22230 	for (i = 0;i < num;i++)
22231 	{
22232 		char *tmp;
22233 		wchar_t *space_string;
22234 		UINT w;
22235 		UINT space = 0;
22236 		wchar_t *string = strings[i];
22237 		wchar_t *tmp_line = NULL;
22238 
22239 		if (UniStrCmpi(string, L"---") == 0)
22240 		{
22241 			char *s = MakeCharArray('-', widths[i]);
22242 			tmp_line = string = CopyStrToUni(s);
22243 
22244 			Free(s);
22245 		}
22246 		else
22247 		{
22248 			is_sep_line = false;
22249 		}
22250 
22251 		w = UniStrWidth(string);
22252 
22253 		if (widths[i] >= w)
22254 		{
22255 			space = widths[i] - w;
22256 		}
22257 
22258 		tmp = MakeCharArray(' ', space);
22259 		space_string = CopyStrToUni(tmp);
22260 
22261 		if (rights[i] != false)
22262 		{
22263 			UniStrCat(buf, buf_size, space_string);
22264 		}
22265 
22266 		UniStrCat(buf, buf_size, string);
22267 
22268 		if (rights[i] == false)
22269 		{
22270 			UniStrCat(buf, buf_size, space_string);
22271 		}
22272 
22273 		Free(space_string);
22274 		Free(tmp);
22275 
22276 		if (i < (num - 1))
22277 		{
22278 			wchar_t tmp[4];
22279 			char str[2];
22280 
22281 			if (UniStrCmpi(strings[i], L"---") == 0)
22282 			{
22283 				str[0] = '+';
22284 			}
22285 			else
22286 			{
22287 				str[0] = separate_char;
22288 			}
22289 			str[1] = 0;
22290 
22291 			StrToUni(tmp, sizeof(tmp), str);
22292 
22293 			UniStrCat(buf, buf_size, tmp);
22294 		}
22295 
22296 		if (tmp_line != NULL)
22297 		{
22298 			Free(tmp_line);
22299 		}
22300 	}
22301 
22302 	UniTrimRight(buf);
22303 
22304 	if (is_sep_line)
22305 	{
22306 		if (UniStrLen(buf) > (c->GetWidth(c) - 1))
22307 		{
22308 			buf[c->GetWidth(c) - 1] = 0;
22309 		}
22310 	}
22311 
22312 	c->Write(c, buf);
22313 
22314 	Free(buf);
22315 }
22316 
22317 // Draw the console table in standard format
CtPrintStandard(CT * ct,CONSOLE * c)22318 void CtPrintStandard(CT *ct, CONSOLE *c)
22319 {
22320 	CT *t;
22321 	UINT i, j;
22322 	// Validate arguments
22323 	if (ct == NULL || c == NULL)
22324 	{
22325 		return;
22326 	}
22327 
22328 	t = CtNewStandard();
22329 	for (i = 0;i < LIST_NUM(ct->Rows);i++)
22330 	{
22331 		CTR *row = LIST_DATA(ct->Rows, i);
22332 
22333 		for (j = 0;j < LIST_NUM(ct->Columns);j++)
22334 		{
22335 			CTC *column = LIST_DATA(ct->Columns, j);
22336 
22337 			CtInsert(t, column->String, row->Strings[j]);
22338 		}
22339 
22340 		if (i != (LIST_NUM(ct->Rows) - 1))
22341 		{
22342 			CtInsert(t, L"---", L"---");
22343 		}
22344 	}
22345 
22346 	CtFree(t, c);
22347 }
22348 
22349 // Draw the console table
CtPrint(CT * ct,CONSOLE * c)22350 void CtPrint(CT *ct, CONSOLE *c)
22351 {
22352 	UINT *widths;
22353 	UINT num;
22354 	UINT i, j;
22355 	wchar_t **header_strings;
22356 	bool *rights;
22357 	// Validate arguments
22358 	if (ct == NULL || c == NULL)
22359 	{
22360 		return;
22361 	}
22362 
22363 	num = LIST_NUM(ct->Columns);
22364 	widths = ZeroMalloc(sizeof(UINT) * num);
22365 
22366 	// Calculate the maximum character width of each column
22367 	for (i = 0;i < num;i++)
22368 	{
22369 		CTC *ctc = LIST_DATA(ct->Columns, i);
22370 		UINT w;
22371 
22372 		w = UniStrWidth(ctc->String);
22373 		widths[i] = MAX(widths[i], w);
22374 	}
22375 	for (j = 0;j < LIST_NUM(ct->Rows);j++)
22376 	{
22377 		CTR *ctr = LIST_DATA(ct->Rows, j);
22378 
22379 		for (i = 0;i < num;i++)
22380 		{
22381 			UINT w;
22382 
22383 			w = UniStrWidth(ctr->Strings[i]);
22384 			widths[i] = MAX(widths[i], w);
22385 		}
22386 	}
22387 
22388 	// Display the header part
22389 	header_strings = ZeroMalloc(sizeof(wchar_t *) * num);
22390 	rights = ZeroMalloc(sizeof(bool) * num);
22391 
22392 	for (i = 0;i < num;i++)
22393 	{
22394 		CTC *ctc = LIST_DATA(ct->Columns, i);
22395 
22396 		header_strings[i] = ctc->String;
22397 		rights[i] = ctc->Right;
22398 	}
22399 
22400 	CtPrintRow(c, num, widths, header_strings, rights, '|');
22401 
22402 	for (i = 0;i < num;i++)
22403 	{
22404 		char *s;
22405 
22406 		s = MakeCharArray('-', widths[i]);
22407 		header_strings[i] = CopyStrToUni(s);
22408 		Free(s);
22409 	}
22410 
22411 	CtPrintRow(c, num, widths, header_strings, rights, '+');
22412 
22413 	for (i = 0;i < num;i++)
22414 	{
22415 		Free(header_strings[i]);
22416 	}
22417 
22418 	// Display the data part
22419 	for (j = 0;j < LIST_NUM(ct->Rows);j++)
22420 	{
22421 		CTR *ctr = LIST_DATA(ct->Rows, j);
22422 
22423 		CtPrintRow(c, num, widths, ctr->Strings, rights, '|');
22424 	}
22425 
22426 	Free(rights);
22427 	Free(header_strings);
22428 	Free(widths);
22429 }
22430 
22431 // Escape the meta-characters in CSV
CtEscapeCsv(wchar_t * dst,UINT size,wchar_t * src)22432 void CtEscapeCsv(wchar_t *dst, UINT size, wchar_t *src){
22433 	UINT i;
22434 	UINT len = UniStrLen(src);
22435 	UINT idx;
22436 	BOOL need_to_escape = false;
22437 	wchar_t tmp[2]=L"*";
22438 
22439 	// Check the input value
22440 	if (src==NULL || dst==NULL)
22441 	{
22442 		return;
22443 	}
22444 
22445 	// If there is no character that need to be escaped in the input characters, copy it to the output
22446 	len = UniStrLen(src);
22447 	for (i=0; i<len; i++)
22448 	{
22449 		tmp[0] = src[i];
22450 		if (tmp[0] == L","[0] || tmp[0] == L"\n"[0] || tmp[0] == L"\""[0])
22451 		{
22452 			need_to_escape = true;
22453 		}
22454 	}
22455 	if (need_to_escape == false)
22456 	{
22457 		UniStrCpy(dst,size,src);
22458 		return;
22459 	}
22460 
22461 	// If it contains meta characters (newline, comma, double quote), enclose with "
22462 	UniStrCpy(dst, size, L"\"");
22463 	idx = UniStrLen(dst);
22464 	if(idx<size-1)
22465 	{
22466 		for (i=0; i<len; i++)
22467 		{
22468 			tmp[0] = src[i];
22469 			// Convert " to "" in contents(MS-Excel method)
22470 			if (tmp[0] == L"\""[0])
22471 			{
22472 				UniStrCat(dst, size, tmp);
22473 			}
22474 			UniStrCat(dst, size, tmp);
22475 		}
22476 	}
22477 	UniStrCat(dst, size, L"\"");
22478 	return;
22479 }
22480 
22481 // Show a CSV format of console table
CtPrintCsv(CT * ct,CONSOLE * c)22482 void CtPrintCsv(CT *ct, CONSOLE *c)
22483 {
22484 	UINT i, j;
22485 	UINT num_columns = LIST_NUM(ct->Columns);
22486 	wchar_t buf[MAX_SIZE*4];
22487 	wchar_t fmtbuf[MAX_SIZE*4];
22488 
22489 	// Show the heading row
22490 	buf[0] = 0;
22491 	for(i=0; i<num_columns; i++)
22492 	{
22493 		CTC *ctc = LIST_DATA(ct->Columns, i);
22494 		CtEscapeCsv(fmtbuf, sizeof(fmtbuf), ctc->String);
22495 		UniStrCat(buf, sizeof(buf), fmtbuf);
22496 		if(i != num_columns-1)
22497 			UniStrCat(buf, sizeof(buf), L",");
22498 	}
22499 	c->Write(c, buf);
22500 
22501 	// Show the table body
22502 	for(j=0; j<LIST_NUM(ct->Rows); j++)
22503 	{
22504 		CTR *ctr = LIST_DATA(ct->Rows, j);
22505 		buf[0] = 0;
22506 		for(i=0; i<num_columns; i++)
22507 		{
22508 			CtEscapeCsv(fmtbuf, sizeof(fmtbuf), ctr->Strings[i]);
22509 			UniStrCat(buf, sizeof(buf), fmtbuf);
22510 			if(i != num_columns-1)
22511 				UniStrCat(buf, sizeof(buf), L",");
22512 		}
22513 		c->Write(c, buf);
22514 	}
22515 }
22516 
22517 // Delete the console table
CtFreeEx(CT * ct,CONSOLE * c,bool standard_view)22518 void CtFreeEx(CT *ct, CONSOLE *c, bool standard_view)
22519 {
22520 	UINT i, num;
22521 	// Validate arguments
22522 	if (ct == NULL)
22523 	{
22524 		return;
22525 	}
22526 
22527 	if (c != NULL)
22528 	{
22529 		if (c->ConsoleType == CONSOLE_CSV)
22530 		{
22531 			CtPrintCsv(ct, c);
22532 		}
22533 		else
22534 		{
22535 			if (standard_view == false)
22536 			{
22537 				CtPrint(ct, c);
22538 			}
22539 			else
22540 			{
22541 				CtPrintStandard(ct, c);
22542 			}
22543 		}
22544 	}
22545 
22546 	num = LIST_NUM(ct->Columns);
22547 
22548 	for (i = 0;i < LIST_NUM(ct->Rows);i++)
22549 	{
22550 		UINT j;
22551 		CTR *ctr = LIST_DATA(ct->Rows, i);
22552 
22553 		for (j = 0;j < num;j++)
22554 		{
22555 			Free(ctr->Strings[j]);
22556 		}
22557 
22558 		Free(ctr->Strings);
22559 		Free(ctr);
22560 	}
22561 
22562 	for (i = 0;i < LIST_NUM(ct->Columns);i++)
22563 	{
22564 		CTC *ctc = LIST_DATA(ct->Columns, i);
22565 
22566 		Free(ctc->String);
22567 		Free(ctc);
22568 	}
22569 
22570 	ReleaseList(ct->Columns);
22571 	ReleaseList(ct->Rows);
22572 
22573 	Free(ct);
22574 }
CtFree(CT * ct,CONSOLE * c)22575 void CtFree(CT *ct, CONSOLE *c)
22576 {
22577 	CtFreeEx(ct, c, false);
22578 }
22579 
22580 // Add a row to the table
CtInsert(CT * ct,...)22581 void CtInsert(CT *ct, ...)
22582 {
22583 	CTR *ctr;
22584 	UINT num, i;
22585 	va_list va;
22586 	// Validate arguments
22587 	if (ct == NULL)
22588 	{
22589 		return;
22590 	}
22591 
22592 	num = LIST_NUM(ct->Columns);
22593 
22594 	va_start(va, ct);
22595 
22596 	ctr = ZeroMalloc(sizeof(CTR));
22597 	ctr->Strings = ZeroMalloc(sizeof(wchar_t *) * num);
22598 
22599 	for (i = 0;i < num;i++)
22600 	{
22601 		wchar_t *s = va_arg(va, wchar_t *);
22602 
22603 		ctr->Strings[i] = CopyUniStr(s);
22604 	}
22605 
22606 	va_end(va);
22607 
22608 	Insert(ct->Rows, ctr);
22609 }
22610 
22611 // Add a column to the table
CtInsertColumn(CT * ct,wchar_t * str,bool right)22612 void CtInsertColumn(CT *ct, wchar_t *str, bool right)
22613 {
22614 	CTC *ctc;
22615 	// Validate arguments
22616 	if (ct == NULL)
22617 	{
22618 		return;
22619 	}
22620 	if (str == NULL)
22621 	{
22622 		str = L"";
22623 	}
22624 
22625 	ctc = ZeroMalloc(sizeof(CTC));
22626 	ctc->String = CopyUniStr(str);
22627 	ctc->Right = right;
22628 
22629 	Insert(ct->Columns, ctc);
22630 }
22631 
22632 // Create a new console table
CtNew()22633 CT *CtNew()
22634 {
22635 	CT *ct;
22636 
22637 	ct = ZeroMalloc(sizeof(CT));
22638 	ct->Columns = NewList(NULL);
22639 	ct->Rows = NewList(NULL);
22640 
22641 	return ct;
22642 }
22643 
22644 // Add a standard column to a column in a table
CtNewStandard()22645 CT *CtNewStandard()
22646 {
22647 	CT *ct = CtNew();
22648 
22649 	CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_1"), false);
22650 	CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_2"), false);
22651 
22652 	return ct;
22653 }
CtNewStandardEx()22654 CT *CtNewStandardEx()
22655 {
22656 	CT *ct = CtNew();
22657 
22658 	CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_1"), false);
22659 	CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_2"), false);
22660 	CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_3"), false);
22661 
22662 	return ct;
22663 }
22664 
22665 // Get the TCP listener list
PsListenerList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22666 UINT PsListenerList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22667 {
22668 	LIST *o;
22669 	PS *ps = (PS *)param;
22670 	UINT ret;
22671 	RPC_LISTENER_LIST t;
22672 	UINT i;
22673 	CT *ct;
22674 
22675 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
22676 	if (o == NULL)
22677 	{
22678 		return ERR_INVALID_PARAMETER;
22679 	}
22680 
22681 	Zero(&t, sizeof(t));
22682 
22683 	ret = ScEnumListener(ps->Rpc, &t);
22684 
22685 	if (ret != ERR_NO_ERROR)
22686 	{
22687 		CmdPrintError(c, ret);
22688 		FreeParamValueList(o);
22689 		return ret;
22690 	}
22691 
22692 	ct = CtNew();
22693 
22694 	CtInsertColumn(ct, _UU("CM_LISTENER_COLUMN_1"), false);
22695 	CtInsertColumn(ct, _UU("CM_LISTENER_COLUMN_2"), false);
22696 
22697 	for (i = 0;i < t.NumPort;i++)
22698 	{
22699 		wchar_t *status = _UU("CM_LISTENER_OFFLINE");
22700 		wchar_t tmp[128];
22701 
22702 		if (t.Errors[i])
22703 		{
22704 			status = _UU("CM_LISTENER_ERROR");
22705 		}
22706 		else if (t.Enables[i])
22707 		{
22708 			status = _UU("CM_LISTENER_ONLINE");
22709 		}
22710 
22711 		UniFormat(tmp, sizeof(tmp), _UU("CM_LISTENER_TCP_PORT"), t.Ports[i]);
22712 
22713 		CtInsert(ct, tmp, status);
22714 	}
22715 
22716 	CtFree(ct, c);
22717 
22718 	FreeRpcListenerList(&t);
22719 
22720 	FreeParamValueList(o);
22721 
22722 	return 0;
22723 }
22724 
22725 // Delete the TCP listener
PsListenerDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22726 UINT PsListenerDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22727 {
22728 	LIST *o;
22729 	PS *ps = (PS *)param;
22730 	UINT ret;
22731 	RPC_LISTENER t;
22732 	PARAM args[] =
22733 	{
22734 		{"[port]", CmdPromptPort, _UU("CMD_ListenerDelete_PortPrompt"), CmdEvalPort, NULL},
22735 	};
22736 
22737 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
22738 	if (o == NULL)
22739 	{
22740 		return ERR_INVALID_PARAMETER;
22741 	}
22742 
22743 	Zero(&t, sizeof(t));
22744 	t.Enable = true;
22745 	t.Port = ToInt(GetParamStr(o, "[port]"));
22746 
22747 	ret = ScDeleteListener(ps->Rpc, &t);
22748 
22749 	if (ret != ERR_NO_ERROR)
22750 	{
22751 		CmdPrintError(c, ret);
22752 		FreeParamValueList(o);
22753 		return ret;
22754 	}
22755 
22756 	FreeParamValueList(o);
22757 
22758 	return 0;
22759 }
22760 
22761 // Draw a row
CmdPrintRow(CONSOLE * c,wchar_t * title,wchar_t * tag,...)22762 void CmdPrintRow(CONSOLE *c, wchar_t *title, wchar_t *tag, ...)
22763 {
22764 	wchar_t buf[MAX_SIZE * 2];
22765 	wchar_t buf2[MAX_SIZE * 2];
22766 	va_list args;
22767 	// Validate arguments
22768 	if (title == NULL || c == NULL || tag == NULL)
22769 	{
22770 		return;
22771 	}
22772 
22773 	va_start(args, tag);
22774 	UniFormatArgs(buf, sizeof(buf), tag, args);
22775 
22776 	UniFormat(buf2, sizeof(buf2), L"[%s] %s", title, buf);
22777 
22778 	va_end(args);
22779 
22780 	c->Write(c, buf2);
22781 }
22782 
22783 // ServerInfoGet command
PsServerInfoGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22784 UINT PsServerInfoGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22785 {
22786 	LIST *o;
22787 	PS *ps = (PS *)param;
22788 	UINT ret;
22789 	RPC_SERVER_INFO t;
22790 	CT *ct;
22791 	wchar_t tmp[MAX_SIZE];
22792 
22793 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
22794 	if (o == NULL)
22795 	{
22796 		return ERR_INVALID_PARAMETER;
22797 	}
22798 
22799 	Zero(&t, sizeof(t));
22800 	ret = ScGetServerInfo(ps->Rpc, &t);
22801 	if (ret != ERR_NO_ERROR)
22802 	{
22803 		CmdPrintError(c, ret);
22804 		FreeParamValueList(o);
22805 		return ret;
22806 	}
22807 
22808 	ct = CtNew();
22809 
22810 	CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_1"), false);
22811 	CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_2"), false);
22812 
22813 	// Product name
22814 	StrToUni(tmp, sizeof(tmp), t.ServerProductName);
22815 	CtInsert(ct, _UU("SM_INFO_PRODUCT_NAME"), tmp);
22816 
22817 	// Version
22818 	StrToUni(tmp, sizeof(tmp), t.ServerVersionString);
22819 	CtInsert(ct, _UU("SM_INFO_VERSION"), tmp);
22820 
22821 	// Build
22822 	StrToUni(tmp, sizeof(tmp), t.ServerBuildInfoString);
22823 	CtInsert(ct, _UU("SM_INFO_BUILD"), tmp);
22824 
22825 	// Host name
22826 	StrToUni(tmp, sizeof(tmp), t.ServerHostName);
22827 	CtInsert(ct, _UU("SM_INFO_HOSTNAME"), tmp);
22828 
22829 	// Type
22830 	CtInsert(ct, _UU("SM_ST_SERVER_TYPE"), GetServerTypeStr(t.ServerType));
22831 
22832 	// OS
22833 	StrToUni(tmp, sizeof(tmp), t.OsInfo.OsSystemName);
22834 	CtInsert(ct, _UU("SM_OS_SYSTEM_NAME"), tmp);
22835 
22836 	StrToUni(tmp, sizeof(tmp), t.OsInfo.OsProductName);
22837 	CtInsert(ct, _UU("SM_OS_PRODUCT_NAME"), tmp);
22838 
22839 	if (t.OsInfo.OsServicePack != 0)
22840 	{
22841 		UniFormat(tmp, sizeof(tmp), _UU("SM_OS_SP_TAG"), t.OsInfo.OsServicePack);
22842 		CtInsert(ct, _UU("SM_OS_SERVICE_PACK"), tmp);
22843 	}
22844 
22845 	StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVendorName);
22846 	CtInsert(ct, _UU("SM_OS_VENDER_NAME"), tmp);
22847 
22848 	StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVersion);
22849 	CtInsert(ct, _UU("SM_OS_VERSION"), tmp);
22850 
22851 	StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelName);
22852 	CtInsert(ct, _UU("SM_OS_KERNEL_NAME"), tmp);
22853 
22854 	StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelVersion);
22855 	CtInsert(ct, _UU("SM_OS_KERNEL_VERSION"), tmp);
22856 
22857 	CtFree(ct, c);
22858 
22859 	FreeRpcServerInfo(&t);
22860 
22861 	FreeParamValueList(o);
22862 
22863 	return 0;
22864 }
22865 
22866 // Get the string for type of the HUB
GetHubTypeStr(UINT type)22867 wchar_t *GetHubTypeStr(UINT type)
22868 {
22869 	if (type == HUB_TYPE_FARM_STATIC)
22870 	{
22871 		return _UU("SM_HUB_STATIC");
22872 	}
22873 	else if (type == HUB_TYPE_FARM_DYNAMIC)
22874 	{
22875 		return _UU("SM_HUB_DYNAMIC");
22876 	}
22877 	return _UU("SM_HUB_STANDALONE");
22878 }
22879 
22880 // Get a string of the type of server
GetServerTypeStr(UINT type)22881 wchar_t *GetServerTypeStr(UINT type)
22882 {
22883 	if (type == SERVER_TYPE_FARM_CONTROLLER)
22884 	{
22885 		return _UU("SM_FARM_CONTROLLER");
22886 	}
22887 	else if (type == SERVER_TYPE_FARM_MEMBER)
22888 	{
22889 		return _UU("SM_FARM_MEMBER");
22890 	}
22891 	return _UU("SM_SERVER_STANDALONE");
22892 }
22893 
22894 // ServerStatusGet command
PsServerStatusGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22895 UINT PsServerStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22896 {
22897 	LIST *o;
22898 	PS *ps = (PS *)param;
22899 	UINT ret;
22900 	RPC_SERVER_STATUS t;
22901 	wchar_t tmp[MAX_PATH];
22902 	char tmp2[MAX_PATH];
22903 	CT *ct;
22904 
22905 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
22906 	if (o == NULL)
22907 	{
22908 		return ERR_INVALID_PARAMETER;
22909 	}
22910 
22911 	Zero(&t, sizeof(t));
22912 	ret = ScGetServerStatus(ps->Rpc, &t);
22913 	if (ret != ERR_NO_ERROR)
22914 	{
22915 		CmdPrintError(c, ret);
22916 		FreeParamValueList(o);
22917 		return ret;
22918 	}
22919 
22920 	ct = CtNew();
22921 
22922 	CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_1"), false);
22923 	CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_2"), false);
22924 
22925 	// Type of server
22926 	CtInsert(ct, _UU("SM_ST_SERVER_TYPE"),
22927 		t.ServerType == SERVER_TYPE_STANDALONE ? _UU("SM_SERVER_STANDALONE") :
22928 		t.ServerType == SERVER_TYPE_FARM_MEMBER ? _UU("SM_FARM_MEMBER") : _UU("SM_FARM_CONTROLLER"));
22929 
22930 	// Number of TCP connections
22931 	UniToStru(tmp, t.NumTcpConnections);
22932 	CtInsert(ct, _UU("SM_ST_NUM_TCP"), tmp);
22933 
22934 	if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
22935 	{
22936 		// Number of local TCP connections
22937 		UniToStru(tmp, t.NumTcpConnectionsLocal);
22938 		CtInsert(ct, _UU("SM_ST_NUM_TCP_LOCAL"), tmp);
22939 
22940 		// Number of remote TCP connections
22941 		UniToStru(tmp, t.NumTcpConnectionsRemote);
22942 		CtInsert(ct, _UU("SM_ST_NUM_TCP_REMOTE"), tmp);
22943 	}
22944 
22945 	// Number of Virtual HUBs
22946 	UniToStru(tmp, t.NumHubTotal);
22947 	CtInsert(ct, _UU("SM_ST_NUM_HUB_TOTAL"), tmp);
22948 
22949 	if (t.ServerType != SERVER_TYPE_STANDALONE)
22950 	{
22951 		// Number of static HUBs
22952 		UniToStru(tmp, t.NumHubStatic);
22953 		CtInsert(ct, _UU("SM_ST_NUM_HUB_STATIC"), tmp);
22954 
22955 		// Number of dynamic HUBs
22956 		UniToStru(tmp, t.NumHubDynamic);
22957 		CtInsert(ct, _UU("SM_ST_NUM_HUB_DYNAMIC"), tmp);
22958 	}
22959 
22960 	// Number of sessions
22961 	UniToStru(tmp, t.NumSessionsTotal);
22962 	CtInsert(ct, _UU("SM_ST_NUM_SESSION_TOTAL"), tmp);
22963 
22964 	if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
22965 	{
22966 		// Number of local sessions
22967 		UniToStru(tmp, t.NumSessionsLocal);
22968 		CtInsert(ct, _UU("SM_ST_NUM_SESSION_LOCAL"), tmp);
22969 
22970 		// Number of remote sessions
22971 		UniToStru(tmp, t.NumSessionsRemote);
22972 		CtInsert(ct, _UU("SM_ST_NUM_SESSION_REMOTE"), tmp);
22973 	}
22974 
22975 	// Number of MAC tables
22976 	UniToStru(tmp, t.NumMacTables);
22977 	CtInsert(ct, _UU("SM_ST_NUM_MAC_TABLE"), tmp);
22978 
22979 	// Number of IP tables
22980 	UniToStru(tmp, t.NumIpTables);
22981 	CtInsert(ct, _UU("SM_ST_NUM_IP_TABLE"), tmp);
22982 
22983 	// Number of users
22984 	UniToStru(tmp, t.NumUsers);
22985 	CtInsert(ct, _UU("SM_ST_NUM_USERS"), tmp);
22986 
22987 	// Number of groups
22988 	UniToStru(tmp, t.NumGroups);
22989 	CtInsert(ct, _UU("SM_ST_NUM_GROUPS"), tmp);
22990 
22991 	// Number of assigned licenses
22992 	UniToStru(tmp, t.AssignedClientLicenses);
22993 	CtInsert(ct, _UU("SM_ST_CLIENT_LICENSE"), tmp);
22994 
22995 	UniToStru(tmp, t.AssignedBridgeLicenses);
22996 	CtInsert(ct, _UU("SM_ST_BRIDGE_LICENSE"), tmp);
22997 
22998 	if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
22999 	{
23000 		UniToStru(tmp, t.AssignedClientLicensesTotal);
23001 		CtInsert(ct, _UU("SM_ST_CLIENT_LICENSE_EX"), tmp);
23002 
23003 		UniToStru(tmp, t.AssignedBridgeLicensesTotal);
23004 		CtInsert(ct, _UU("SM_ST_BRIDGE_LICENSE_EX"), tmp);
23005 	}
23006 
23007 	// Traffic
23008 	CmdInsertTrafficInfo(ct, &t.Traffic);
23009 
23010 	// Server start-up time
23011 	GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.StartTime), NULL);
23012 	CtInsert(ct, _UU("SM_ST_START_TIME"), tmp);
23013 
23014 	// Current time
23015 	GetDateTimeStrMilli64(tmp2, sizeof(tmp2), SystemToLocal64(t.CurrentTime));
23016 	StrToUni(tmp, sizeof(tmp), tmp2);
23017 	CtInsert(ct, _UU("SM_ST_CURRENT_TIME"), tmp);
23018 
23019 	// Tick value
23020 	UniFormat(tmp, sizeof(tmp), L"%I64u", t.CurrentTick);
23021 	CtInsert(ct, _UU("SM_ST_CURRENT_TICK"), tmp);
23022 
23023 	// Memory information
23024 	if (t.MemInfo.TotalMemory != 0)
23025 	{
23026 		char vv[128];
23027 
23028 		ToStr3(vv, sizeof(vv), t.MemInfo.TotalMemory);
23029 		UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
23030 		CtInsert(ct, _UU("SM_ST_TOTAL_MEMORY"), tmp);
23031 
23032 		ToStr3(vv, sizeof(vv), t.MemInfo.UsedMemory);
23033 		UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
23034 		CtInsert(ct, _UU("SM_ST_USED_MEMORY"), tmp);
23035 
23036 		ToStr3(vv, sizeof(vv), t.MemInfo.FreeMemory);
23037 		UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
23038 		CtInsert(ct, _UU("SM_ST_FREE_MEMORY"), tmp);
23039 
23040 		ToStr3(vv, sizeof(vv), t.MemInfo.TotalPhys);
23041 		UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
23042 		CtInsert(ct, _UU("SM_ST_TOTAL_PHYS"), tmp);
23043 
23044 		ToStr3(vv, sizeof(vv), t.MemInfo.UsedPhys);
23045 		UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
23046 		CtInsert(ct, _UU("SM_ST_USED_PHYS"), tmp);
23047 
23048 		ToStr3(vv, sizeof(vv), t.MemInfo.FreePhys);
23049 		UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
23050 		CtInsert(ct, _UU("SM_ST_FREE_PHYS"), tmp);
23051 	}
23052 
23053 	CtFree(ct, c);
23054 
23055 	FreeParamValueList(o);
23056 
23057 	return 0;
23058 }
23059 
23060 // Add traffic information to LVB
CmdInsertTrafficInfo(CT * ct,TRAFFIC * t)23061 void CmdInsertTrafficInfo(CT *ct, TRAFFIC *t)
23062 {
23063 	wchar_t tmp[MAX_SIZE];
23064 	char vv[128];
23065 	// Validate arguments
23066 	if (ct == NULL || t == NULL)
23067 	{
23068 		return;
23069 	}
23070 
23071 	// Transmission information
23072 	ToStr3(vv, sizeof(vv), t->Send.UnicastCount);
23073 	UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);
23074 	CtInsert(ct, _UU("SM_ST_SEND_UCAST_NUM"), tmp);
23075 
23076 	ToStr3(vv, sizeof(vv), t->Send.UnicastBytes);
23077 	UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);
23078 	CtInsert(ct, _UU("SM_ST_SEND_UCAST_SIZE"), tmp);
23079 
23080 	ToStr3(vv, sizeof(vv), t->Send.BroadcastCount);
23081 	UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);
23082 	CtInsert(ct, _UU("SM_ST_SEND_BCAST_NUM"), tmp);
23083 
23084 	ToStr3(vv, sizeof(vv), t->Send.BroadcastBytes);
23085 	UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);
23086 	CtInsert(ct, _UU("SM_ST_SEND_BCAST_SIZE"), tmp);
23087 
23088 	// Reception information
23089 	ToStr3(vv, sizeof(vv), t->Recv.UnicastCount);
23090 	UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);
23091 	CtInsert(ct, _UU("SM_ST_RECV_UCAST_NUM"), tmp);
23092 
23093 	ToStr3(vv, sizeof(vv), t->Recv.UnicastBytes);
23094 	UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);
23095 	CtInsert(ct, _UU("SM_ST_RECV_UCAST_SIZE"), tmp);
23096 
23097 	ToStr3(vv, sizeof(vv), t->Recv.BroadcastCount);
23098 	UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);
23099 	CtInsert(ct, _UU("SM_ST_RECV_BCAST_NUM"), tmp);
23100 
23101 	ToStr3(vv, sizeof(vv), t->Recv.BroadcastBytes);
23102 	UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);
23103 	CtInsert(ct, _UU("SM_ST_RECV_BCAST_SIZE"), tmp);
23104 }
23105 
23106 // Input a port number
CmdPromptPort(CONSOLE * c,void * param)23107 wchar_t *CmdPromptPort(CONSOLE *c, void *param)
23108 {
23109 	wchar_t *prompt_str;
23110 
23111 	if (param != NULL)
23112 	{
23113 		prompt_str = (wchar_t *)param;
23114 	}
23115 	else
23116 	{
23117 		prompt_str = _UU("CMD_PROPMT_PORT");
23118 	}
23119 
23120 	return c->ReadLine(c, prompt_str, true);
23121 }
23122 
23123 // Verify the port number
CmdEvalPort(CONSOLE * c,wchar_t * str,void * param)23124 bool CmdEvalPort(CONSOLE *c, wchar_t *str, void *param)
23125 {
23126 	UINT i;
23127 	// Validate arguments
23128 	if (c == NULL || str == NULL)
23129 	{
23130 		return false;
23131 	}
23132 
23133 	i = UniToInt(str);
23134 
23135 	if (i >= 1 && i <= 65535)
23136 	{
23137 		return true;
23138 	}
23139 
23140 	c->Write(c, _UU("CMD_EVAL_PORT"));
23141 
23142 	return false;
23143 }
23144 
23145 // ListenerCreate command
PsListenerCreate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)23146 UINT PsListenerCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
23147 {
23148 	LIST *o;
23149 	PS *ps = (PS *)param;
23150 	UINT ret;
23151 	RPC_LISTENER t;
23152 	PARAM args[] =
23153 	{
23154 		{"[port]", CmdPromptPort, _UU("CMD_ListenerCreate_PortPrompt"), CmdEvalPort, NULL},
23155 	};
23156 
23157 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
23158 	if (o == NULL)
23159 	{
23160 		return ERR_INVALID_PARAMETER;
23161 	}
23162 
23163 	Zero(&t, sizeof(t));
23164 	t.Enable = true;
23165 	t.Port = ToInt(GetParamStr(o, "[port]"));
23166 
23167 	ret = ScCreateListener(ps->Rpc, &t);
23168 
23169 	if (ret != ERR_NO_ERROR)
23170 	{
23171 		CmdPrintError(c, ret);
23172 		FreeParamValueList(o);
23173 		return ret;
23174 	}
23175 
23176 	FreeParamValueList(o);
23177 
23178 	return 0;
23179 }
23180 
23181 // About command
PsAbout(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)23182 UINT PsAbout(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
23183 {
23184 	LIST *o;
23185 	BUF *b;
23186 
23187 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
23188 	if (o == NULL)
23189 	{
23190 		return ERR_INVALID_PARAMETER;
23191 	}
23192 
23193 	b = ReadDump("|legal.txt");
23194 
23195 	CmdPrintAbout(c);
23196 	c->Write(c, L"\r\n");
23197 
23198 	if (b != NULL)
23199 	{
23200 		wchar_t *s;
23201 
23202 		SeekBufToEnd(b);
23203 		WriteBufChar(b, 13);
23204 		WriteBufChar(b, 10);
23205 		WriteBufChar(b, 0);
23206 
23207 		s = CopyUtfToUni(b->Buf);
23208 
23209 		c->Write(c, s);
23210 
23211 		Free(s);
23212 	}
23213 
23214 	// Display the version information
23215 	c->Write(c, _UU("D_ABOUT@S_INFO3"));
23216 	c->Write(c, L"\r\n");
23217 	c->Write(c, _UU("D_ABOUT@S_INFO4"));
23218 	c->Write(c, L"\r\n");
23219 	CmdPrintAbout(c);
23220 	c->Write(c, L"\r\n");
23221 
23222 	FreeParamValueList(o);
23223 
23224 	FreeBuf(b);
23225 
23226 	return 0;
23227 }
23228 
23229 // Creat a new server management context
NewPs(CONSOLE * c,RPC * rpc,char * servername,UINT serverport,char * hubname,char * adminhub,wchar_t * cmdline)23230 PS *NewPs(CONSOLE *c, RPC *rpc, char *servername, UINT serverport, char *hubname, char *adminhub, wchar_t *cmdline)
23231 {
23232 	PS *ps;
23233 	// Validate arguments
23234 	if (c == NULL || rpc == NULL || servername == NULL)
23235 	{
23236 		return NULL;
23237 	}
23238 
23239 	if (IsEmptyStr(hubname))
23240 	{
23241 		hubname = NULL;
23242 	}
23243 	if (IsEmptyStr(adminhub))
23244 	{
23245 		adminhub = NULL;
23246 	}
23247 	if (UniIsEmptyStr(cmdline))
23248 	{
23249 		cmdline = NULL;
23250 	}
23251 
23252 	ps = ZeroMalloc(sizeof(PS));
23253 	ps->ConsoleForServer = true;
23254 	ps->ServerPort = serverport;
23255 	ps->ServerName = CopyStr(servername);
23256 	ps->Console = c;
23257 	ps->Rpc = rpc;
23258 	ps->HubName = CopyStr(hubname);
23259 	ps->LastError = 0;
23260 	ps->AdminHub = CopyStr(adminhub);
23261 	ps->CmdLine = CopyUniStr(cmdline);
23262 
23263 	return ps;
23264 }
23265 
23266 // Release the server management context
FreePs(PS * ps)23267 void FreePs(PS *ps)
23268 {
23269 	// Validate arguments
23270 	if (ps == NULL)
23271 	{
23272 		return;
23273 	}
23274 
23275 	Free(ps->HubName);
23276 	Free(ps->AdminHub);
23277 	Free(ps->CmdLine);
23278 	Free(ps->ServerName);
23279 
23280 	Free(ps);
23281 }
23282 
23283 // Server Administration Tool
PsConnect(CONSOLE * c,char * host,UINT port,char * hub,char * adminhub,wchar_t * cmdline,char * password)23284 UINT PsConnect(CONSOLE *c, char *host, UINT port, char *hub, char *adminhub, wchar_t *cmdline, char *password)
23285 {
23286 	UINT retcode = 0;
23287 	RPC *rpc = NULL;
23288 	CEDAR *cedar;
23289 	CLIENT_OPTION o;
23290 	UCHAR hashed_password[SHA1_SIZE];
23291 	bool b = false;
23292 	// Validate arguments
23293 	if (c == NULL || host == NULL)
23294 	{
23295 		return ERR_INVALID_PARAMETER;
23296 	}
23297 	if (port == 0)
23298 	{
23299 		port = 443;
23300 	}
23301 	if (hub != NULL)
23302 	{
23303 		adminhub = NULL;
23304 	}
23305 
23306 	cedar = NewCedar(NULL, NULL);
23307 
23308 	Zero(&o, sizeof(o));
23309 	UniStrCpy(o.AccountName, sizeof(o.AccountName), L"VPNCMD");
23310 	StrCpy(o.Hostname, sizeof(o.Hostname), host);
23311 	o.Port = port;
23312 	o.ProxyType = PROXY_DIRECT;
23313 
23314 	Hash(hashed_password, password, StrLen(password), true);
23315 
23316 	if (IsEmptyStr(password) == false)
23317 	{
23318 		b = true;
23319 	}
23320 
23321 	// Connect
23322 	while (true)
23323 	{
23324 		UINT err;
23325 
23326 		rpc = AdminConnectEx(cedar, &o, hub, hashed_password, &err, CEDAR_CUI_STR);
23327 		if (rpc == NULL)
23328 		{
23329 			// Failure
23330 			retcode = err;
23331 
23332 			if (err == ERR_ACCESS_DENIED && c->ProgrammingMode == false)
23333 			{
23334 				char *pass;
23335 				// Password is incorrect
23336 				if (b)
23337 				{
23338 					// Input the password
23339 					c->Write(c, _UU("CMD_VPNCMD_PASSWORD_1"));
23340 				}
23341 
23342 				b = true;
23343 
23344 				pass = c->ReadPassword(c, _UU("CMD_VPNCMD_PASSWORD_2"));
23345 				c->Write(c, L"");
23346 
23347 				if (pass != NULL)
23348 				{
23349 					Hash(hashed_password, pass, StrLen(pass), true);
23350 					Free(pass);
23351 				}
23352 				else
23353 				{
23354 					break;
23355 				}
23356 			}
23357 			else
23358 			{
23359 				// Other errors
23360 				CmdPrintError(c, err);
23361 				break;
23362 			}
23363 		}
23364 		else
23365 		{
23366 			PS *ps;
23367 
23368 			// Success
23369 			ps = NewPs(c, rpc, host, port, hub, adminhub, cmdline);
23370 			PsMain(ps);
23371 			retcode = ps->LastError;
23372 			FreePs(ps);
23373 			AdminDisconnect(rpc);
23374 			break;
23375 		}
23376 	}
23377 
23378 	ReleaseCedar(cedar);
23379 
23380 	return retcode;
23381 }
23382 
23383 // Display the error
CmdPrintError(CONSOLE * c,UINT err)23384 void CmdPrintError(CONSOLE *c, UINT err)
23385 {
23386 	wchar_t tmp[MAX_SIZE];
23387 	// Validate arguments
23388 	if (c == NULL)
23389 	{
23390 		return;
23391 	}
23392 
23393 	UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_ERROR"),
23394 		err, GetUniErrorStr(err));
23395 	c->Write(c, tmp);
23396 
23397 	if (err == ERR_DISCONNECTED)
23398 	{
23399 		c->Write(c, _UU("CMD_DISCONNECTED_MSG"));
23400 	}
23401 }
23402 
23403 // Display the version information
CmdPrintAbout(CONSOLE * c)23404 void CmdPrintAbout(CONSOLE *c)
23405 {
23406 	CEDAR *cedar;
23407 	wchar_t tmp[MAX_SIZE];
23408 	char exe[MAX_PATH];
23409 	// Validate arguments
23410 	if (c == NULL)
23411 	{
23412 		return;
23413 	}
23414 
23415 	cedar = NewCedar(NULL, NULL);
23416 
23417 	GetExeName(exe, sizeof(exe));
23418 
23419 	UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_ABOUT"),
23420 		cedar->VerString, cedar->BuildInfo);
23421 
23422 	c->Write(c, tmp);
23423 
23424 	ReleaseCedar(cedar);
23425 }
23426 
23427 // Parse the host name and port number (Separated by @)
ParseHostPortAtmark(char * src,char ** host,UINT * port,UINT default_port)23428 bool ParseHostPortAtmark(char *src, char **host, UINT *port, UINT default_port)
23429 {
23430 	TOKEN_LIST *t;
23431 	bool ret = false;
23432 	// Validate arguments
23433 	if (src == NULL)
23434 	{
23435 		return false;
23436 	}
23437 
23438 	t = ParseToken(src, "@");
23439 	if (t == NULL)
23440 	{
23441 		return false;
23442 	}
23443 
23444 	if (port != NULL)
23445 	{
23446 		*port = 0;
23447 	}
23448 
23449 	if (default_port == 0)
23450 	{
23451 		if (t->NumTokens < 2)
23452 		{
23453 			FreeToken(t);
23454 			return false;
23455 		}
23456 
23457 		if (ToInt(t->Token[1]) == 0)
23458 		{
23459 			FreeToken(t);
23460 			return false;
23461 		}
23462 	}
23463 
23464 	if (t->NumTokens >= 2 && ToInt(t->Token[1]) == 0)
23465 	{
23466 		FreeToken(t);
23467 		return false;
23468 	}
23469 
23470 	if (t->NumTokens >= 1 && IsEmptyStr(t->Token[0]) == false)
23471 	{
23472 		ret = true;
23473 
23474 		if (host != NULL)
23475 		{
23476 			*host = CopyStr(t->Token[0]);
23477 			Trim(*host);
23478 		}
23479 
23480 		if (t->NumTokens >= 2)
23481 		{
23482 			if (port != NULL)
23483 			{
23484 				*port = ToInt(t->Token[1]);
23485 			}
23486 		}
23487 	}
23488 
23489 	if (port != NULL)
23490 	{
23491 		if (*port == 0)
23492 		{
23493 			*port = default_port;
23494 		}
23495 	}
23496 
23497 	FreeToken(t);
23498 
23499 	return ret;
23500 }
23501 
23502 // Parse the host name and port number
ParseHostPort(char * src,char ** host,UINT * port,UINT default_port)23503 bool ParseHostPort(char *src, char **host, UINT *port, UINT default_port)
23504 {
23505 	TOKEN_LIST *t;
23506 	bool ret = false;
23507 	// Validate arguments
23508 	if (src == NULL)
23509 	{
23510 		return false;
23511 	}
23512 
23513 	if (StartWith(src, "["))
23514 	{
23515 		if (InStr(src, "]"))
23516 		{
23517 			// Format of [target]:port
23518 			UINT i, n;
23519 			char tmp[MAX_SIZE];
23520 
23521 			StrCpy(tmp, sizeof(tmp), src);
23522 
23523 			n = SearchStrEx(tmp, "]", 0, false);
23524 			if (n != INFINITE)
23525 			{
23526 				UINT len = StrLen(tmp);
23527 
23528 				for (i = n;i < len;i++)
23529 				{
23530 					if (tmp[i] == ':')
23531 					{
23532 						tmp[i] = '@';
23533 					}
23534 				}
23535 			}
23536 
23537 			return ParseHostPortAtmark(tmp, host, port, default_port);
23538 		}
23539 	}
23540 
23541 	if (InStr(src, "@"))
23542 	{
23543 		// It is separated by @
23544 		return ParseHostPortAtmark(src, host, port, default_port);
23545 	}
23546 
23547 	t = ParseToken(src, ":");
23548 	if (t == NULL)
23549 	{
23550 		return false;
23551 	}
23552 
23553 	if (port != NULL)
23554 	{
23555 		*port = 0;
23556 	}
23557 
23558 	if (default_port == 0)
23559 	{
23560 		if (t->NumTokens < 2)
23561 		{
23562 			FreeToken(t);
23563 			return false;
23564 		}
23565 
23566 		if (ToInt(t->Token[1]) == 0)
23567 		{
23568 			FreeToken(t);
23569 			return false;
23570 		}
23571 	}
23572 
23573 	if (t->NumTokens >= 2 && ToInt(t->Token[1]) == 0)
23574 	{
23575 		FreeToken(t);
23576 		return false;
23577 	}
23578 
23579 	if (t->NumTokens >= 1 && IsEmptyStr(t->Token[0]) == false)
23580 	{
23581 		ret = true;
23582 
23583 		if (host != NULL)
23584 		{
23585 			*host = CopyStr(t->Token[0]);
23586 			Trim(*host);
23587 		}
23588 
23589 		if (t->NumTokens >= 2)
23590 		{
23591 			if (port != NULL)
23592 			{
23593 				*port = ToInt(t->Token[1]);
23594 			}
23595 		}
23596 	}
23597 
23598 	if (port != NULL)
23599 	{
23600 		if (*port == 0)
23601 		{
23602 			*port = default_port;
23603 		}
23604 	}
23605 
23606 	FreeToken(t);
23607 
23608 	return ret;
23609 }
23610 
23611 // Vpncmd command procedure
VpnCmdProc(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)23612 UINT VpnCmdProc(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
23613 {
23614 	LIST *o;
23615 	char *target;
23616 	bool server = false;
23617 	bool client = false;
23618 	bool tools = false;
23619 	char *hostname = NULL;
23620 	char *password;
23621 	wchar_t *cmdline;
23622 	bool host_inputted = false;
23623 	UINT port = 0;
23624 	UINT retcode = 0;
23625 	PARAM args[] =
23626 	{
23627 		{"[host:port]", NULL, NULL, NULL, NULL},
23628 		{"CLIENT", NULL, NULL, NULL, NULL},
23629 		{"SERVER", NULL, NULL, NULL, NULL},
23630 		{"TOOLS", NULL, NULL, NULL, NULL},
23631 		{"HUB", NULL, NULL, NULL, NULL},
23632 		{"ADMINHUB", NULL, NULL, NULL, NULL},
23633 		{"PASSWORD", NULL, NULL, NULL, NULL},
23634 		{"IN", NULL, NULL, NULL, NULL},
23635 		{"OUT", NULL, NULL, NULL, NULL},
23636 		{"CMD", NULL, NULL, NULL, NULL},
23637 		{"CSV", NULL, NULL, NULL, NULL},
23638 		{"PROGRAMMING", NULL, NULL, NULL, NULL},
23639 	};
23640 
23641 #ifdef	OS_WIN32
23642 	if (UniStrCmpi(str, L"/debug") == 0)
23643 	{
23644 		// Debug information write mode
23645 		Win32CmdDebug(false);
23646 		return 0;
23647 	}
23648 	if (UniStrCmpi(str, L"/debug_uac") == 0)
23649 	{
23650 		// Debug information write mode
23651 		Win32CmdDebug(true);
23652 		return 0;
23653 	}
23654 #endif	// OS_WIN32
23655 
23656 	if (c->ConsoleType == CONSOLE_LOCAL)
23657 	{
23658 		// Initialize the execute path information
23659 		VpnCmdInitBootPath();
23660 	}
23661 
23662 	if(c->ConsoleType != CONSOLE_CSV)
23663 	{
23664 		CmdPrintAbout(c);
23665 		c->Write(c, L"");
23666 	}
23667 
23668 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
23669 
23670 	if (o == NULL)
23671 	{
23672 		return ERR_INVALID_PARAMETER;
23673 	}
23674 
23675 	// Specification of the mode of Tools or Server or Client
23676 	if ((GetParamStr(o, "CLIENT") == NULL && GetParamStr(o, "SERVER") == NULL && GetParamStr(o, "TOOLS") == NULL) ||
23677 		(GetParamStr(o, "CLIENT") != NULL && GetParamStr(o, "SERVER") != NULL && GetParamStr(o, "TOOLS") != NULL))
23678 	{
23679 		wchar_t *ret;
23680 		UINT code;
23681 		// The mode of Tools or Server or Client is not specified
23682 		c->Write(c, _UU("CMD_VPNCMD_CS_1"));
23683 
23684 		ret = c->ReadLine(c, _UU("CMD_VPNCMD_CS_2"), true);
23685 
23686 		code = UniToInt(ret);
23687 		Free(ret);
23688 
23689 		switch (code)
23690 		{
23691 		case 1:
23692 			// Server
23693 			server = true;
23694 			break;
23695 
23696 		case 2:
23697 			// Client
23698 			client = true;
23699 			break;
23700 
23701 		case 3:
23702 			// Tools
23703 			tools = true;
23704 			break;
23705 
23706 		default:
23707 			// Unspecified
23708 			FreeParamValueList(o);
23709 			return ERR_USER_CANCEL;
23710 		}
23711 
23712 		c->Write(c, L"");
23713 	}
23714 	else
23715 	{
23716 		if (GetParamStr(o, "SERVER") != NULL)
23717 		{
23718 			server = true;
23719 		}
23720 		else if (GetParamStr(o, "CLIENT") != NULL)
23721 		{
23722 			client = true;
23723 		}
23724 		else
23725 		{
23726 			tools = true;
23727 		}
23728 	}
23729 
23730 	// Destination host name
23731 	target = CopyStr(GetParamStr(o, "[host:port]"));
23732 
23733 	if (target == NULL && tools == false)
23734 	{
23735 		wchar_t *str;
23736 		// Input a host name
23737 		if (server)
23738 		{
23739 			c->Write(c, _UU("CMD_VPNCMD_HOST_1"));
23740 		}
23741 		else if (client)
23742 		{
23743 			c->Write(c, _UU("CMD_VPNCMD_HOST_2"));
23744 		}
23745 
23746 		str = c->ReadLine(c, _UU("CMD_VPNCMD_HOST_3"), true);
23747 		c->Write(c, L"");
23748 		target = CopyUniToStr(str);
23749 		Free(str);
23750 
23751 		if (target == NULL)
23752 		{
23753 			// Cancel
23754 			FreeParamValueList(o);
23755 			return ERR_USER_CANCEL;
23756 		}
23757 
23758 		if (IsEmptyStr(target))
23759 		{
23760 			Free(target);
23761 			target = CopyStr("localhost");
23762 		}
23763 	}
23764 	else
23765 	{
23766 		// User specifies a host name
23767 		host_inputted = true;
23768 	}
23769 
23770 	if (tools == false)
23771 	{
23772 		if (ParseHostPort(target, &hostname, &port, 443) == false)
23773 		{
23774 			c->Write(c, _UU("CMD_MSG_INVALID_HOSTNAME"));
23775 			Free(target);
23776 			FreeParamValueList(o);
23777 			return ERR_INVALID_PARAMETER;
23778 		}
23779 	}
23780 
23781 	// Password
23782 	password = GetParamStr(o, "PASSWORD");
23783 	if (password == NULL)
23784 	{
23785 		password = "";
23786 	}
23787 
23788 	// Command line
23789 	cmdline = GetParamUniStr(o, "CMD");
23790 
23791 	if (server)
23792 	{
23793 		// Process as the server
23794 		char *hub;
23795 		char *adminhub = NULL;
23796 
23797 		hub = CopyStr(GetParamStr(o, "HUB"));
23798 		adminhub = GetParamStr(o, "ADMINHUB");
23799 
23800 		// Decide the Virtual HUB to be specified in the Virtual HUB management mode
23801 		if (hub == NULL)
23802 		{
23803 			if (host_inputted == false)
23804 			{
23805 				wchar_t *s;
23806 				// If the user does not specify a host name on the command line,
23807 				// get also a Virtual HUB name by displaying the prompt
23808 				c->Write(c, _UU("CMD_VPNCMD_HUB_1"));
23809 
23810 				s = c->ReadLine(c, _UU("CMD_VPNCMD_HUB_2"), true);
23811 
23812 				hub = CopyUniToStr(s);
23813 				Free(s);
23814 			}
23815 		}
23816 
23817 		if (IsEmptyStr(hub))
23818 		{
23819 			Free(hub);
23820 			hub = NULL;
23821 		}
23822 		if (IsEmptyStr(adminhub))
23823 		{
23824 			adminhub = NULL;
23825 		}
23826 
23827 		retcode = PsConnect(c, hostname, port, hub, adminhub, cmdline, password);
23828 
23829 		Free(hub);
23830 	}
23831 	else if (client)
23832 	{
23833 		// Treated as a client
23834 		Trim(target);
23835 
23836 		retcode = PcConnect(c, target, cmdline, password);
23837 	}
23838 	else if (tools)
23839 	{
23840 		// Treated as a VPN Tools
23841 		retcode = PtConnect(c, cmdline);
23842 	}
23843 
23844 	Free(hostname);
23845 	Free(target);
23846 	FreeParamValueList(o);
23847 
23848 	return retcode;
23849 }
23850 
23851 // Entry point of vpncmd
CommandMain(wchar_t * command_line)23852 UINT CommandMain(wchar_t *command_line)
23853 {
23854 	UINT ret = 0;
23855 	wchar_t *infile, *outfile;
23856 	char *a_infile, *a_outfile;
23857 	wchar_t *csvmode;
23858 	wchar_t *programming_mode;
23859 	CONSOLE *c;
23860 
23861 	// Validate arguments
23862 	if (command_line == NULL)
23863 	{
23864 		return ERR_INVALID_PARAMETER;
23865 	}
23866 
23867 	// Look ahead only items of /in and /out
23868 	infile = ParseCommand(command_line, L"in");
23869 	outfile = ParseCommand(command_line, L"out");
23870 	if (UniIsEmptyStr(infile))
23871 	{
23872 		Free(infile);
23873 		infile = NULL;
23874 	}
23875 	if (UniIsEmptyStr(outfile))
23876 	{
23877 		Free(outfile);
23878 		outfile = NULL;
23879 	}
23880 
23881 	a_infile = CopyUniToStr(infile);
23882 	a_outfile = CopyUniToStr(outfile);
23883 
23884 	// Allocate the local console
23885 	c = NewLocalConsole(infile, outfile);
23886 	if (c != NULL)
23887 	{
23888 		// Definition of commands of vpncmd
23889 		CMD cmd[] =
23890 		{
23891 			{"vpncmd", VpnCmdProc},
23892 		};
23893 
23894 		// Read ahead to check the CSV mode
23895 		csvmode = ParseCommand(command_line, L"csv");
23896 		if(csvmode != NULL)
23897 		{
23898 			Free(csvmode);
23899 			c->ConsoleType = CONSOLE_CSV;
23900 		}
23901 
23902 		programming_mode = ParseCommand(command_line, L"programming");
23903 		if (programming_mode != NULL)
23904 		{
23905 			Free(programming_mode);
23906 			c->ProgrammingMode = true;
23907 		}
23908 
23909 		if (DispatchNextCmdEx(c, command_line, ">", cmd, sizeof(cmd) / sizeof(cmd[0]), NULL) == false)
23910 		{
23911 			ret = ERR_INVALID_PARAMETER;
23912 		}
23913 		else
23914 		{
23915 			ret = c->RetCode;
23916 		}
23917 
23918 		// Release the local console
23919 		c->Free(c);
23920 	}
23921 	else
23922 	{
23923 		Print("Error: Couldn't open local console.\n");
23924 	}
23925 
23926 	Free(a_infile);
23927 	Free(a_outfile);
23928 	Free(infile);
23929 	Free(outfile);
23930 
23931 	return ret;
23932 }
23933 
23934 #ifdef	OS_WIN32
23935 // Debug information write mode
Win32CmdDebug(bool is_uac)23936 void Win32CmdDebug(bool is_uac)
23937 {
23938 	wchar_t *dst;
23939 	wchar_t def_filename[MAX_SIZE];
23940 	SYSTEMTIME st;
23941 
23942 	InitWinUi(_UU("CMD_DEBUG_SOFTNAME"), NULL, 0);
23943 
23944 	UniPrint(_UU("CMD_DEBUG_PRINT"));
23945 
23946 	if (MsIsWin2000OrGreater() == false)
23947 	{
23948 		MsgBox(NULL, 0x00000040L, _UU("CMD_DEBUG_NOT_2000"));
23949 		goto LABEL_CLEANUP;
23950 	}
23951 
23952 	if ((MsIsVista() == false || is_uac) && MsIsAdmin() == false)
23953 	{
23954 		MsgBox(NULL, 0x00000040L, _UU("CMD_DEBUG_NOT_ADMIN"));
23955 		goto LABEL_CLEANUP;
23956 	}
23957 
23958 	if (MsIsVista() && MsIsAdmin() == false)
23959 	{
23960 		void *process_handle = NULL;
23961 
23962 		// Launch myself using the UAC
23963 		if (MsExecuteEx2W(MsGetExeFileNameW(), L"/debug_uac", &process_handle, true) == false)
23964 		{
23965 			MsgBox(NULL, 0x00000030L, _UU("CMD_DEBUG_UAC_FAILED"));
23966 			return;
23967 		}
23968 
23969 		MsCloseHandle(process_handle);
23970 		goto LABEL_CLEANUP;
23971 	}
23972 
23973 	LocalTime(&st);
23974 
23975 	UniFormat(def_filename, sizeof(def_filename), L"vpn_debuginfo_%04u%02u%02u_%02u%02u%02u.zip",
23976 		st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
23977 
23978 	// Specify the destination
23979 	dst = SaveDlg(NULL, _UU("DLG_ZIP_FILER"), _UU("CMD_DEBUG_SAVE_TITLE"), def_filename, L".zip");
23980 	if (dst != NULL)
23981 	{
23982 		if (MsSaveSystemInfo(dst) == false)
23983 		{
23984 			// Failure
23985 			MsgBoxEx(NULL, 0x00000030L, _UU("CMD_DEBUG_NG"), dst);
23986 		}
23987 		else
23988 		{
23989 			// Success
23990 			MsgBoxEx(NULL, 0x00000040L, _UU("CMD_DEBUG_OK"), dst);
23991 		}
23992 
23993 		Free(dst);
23994 	}
23995 
23996 LABEL_CLEANUP:
23997 	FreeWinUi();
23998 }
23999 
24000 #endif	// OS_WIN32
24001 
24002