1 // SoftEther VPN Source Code - Developer Edition Master Branch
2 // Cedar Communication Module
3 // © 2020 Nokia
4 
5 // Command.c
6 // vpncmd Command Line Management Utility
7 
8 #include "Command.h"
9 
10 #include "Admin.h"
11 #include "AzureClient.h"
12 #include "Connection.h"
13 #include "Console.h"
14 #include "Database.h"
15 #include "DDNS.h"
16 #include "Layer3.h"
17 #include "Nat.h"
18 #include "Proto_IPsec.h"
19 #include "Proto_WireGuard.h"
20 #include "Radius.h"
21 #include "Server.h"
22 #include "Virtual.h"
23 #include "WinUi.h"
24 
25 #include "Mayaqua/Cfg.h"
26 #include "Mayaqua/FileIO.h"
27 #include "Mayaqua/Internat.h"
28 #include "Mayaqua/Kernel.h"
29 #include "Mayaqua/Memory.h"
30 #include "Mayaqua/Microsoft.h"
31 #include "Mayaqua/Network.h"
32 #include "Mayaqua/Object.h"
33 #include "Mayaqua/OS.h"
34 #include "Mayaqua/Pack.h"
35 #include "Mayaqua/Secure.h"
36 #include "Mayaqua/Str.h"
37 #include "Mayaqua/Table.h"
38 #include "Mayaqua/Tick64.h"
39 #include "Mayaqua/Unix.h"
40 
41 #include <stdlib.h>
42 
43 #ifdef OS_UNIX
44 #include <signal.h>
45 #include <sys/wait.h>
46 #endif
47 
48 // System checker definition
49 typedef bool (CHECKER_PROC_DEF)();
50 typedef struct CHECKER_PROC
51 {
52 	char *Title;
53 	CHECKER_PROC_DEF *Proc;
54 } CHECKER_PROC;
55 
56 static CHECKER_PROC checker_procs[] =
57 {
58 	{"CHECK_PROC_KERNEL", CheckKernel},
59 	{"CHECK_PROC_MEMORY", CheckMemory},
60 	{"CHECK_PROC_STRINGS", CheckStrings},
61 	{"CHECK_PROC_FILESYSTEM", CheckFileSystem},
62 	{"CHECK_PROC_THREAD", CheckThread},
63 	{"CHECK_PROC_NETWORK", CheckNetwork},
64 };
65 
66 typedef struct CHECK_NETWORK_1
67 {
68 	SOCK *ListenSocket;
69 } CHECK_NETWORK_1;
70 
71 typedef struct CHECK_NETWORK_2
72 {
73 	SOCK *s;
74 	X *x;
75 	K *k;
76 } CHECK_NETWORK_2;
77 
78 
79 // Accept thread
CheckNetworkAcceptThread(THREAD * thread,void * param)80 void CheckNetworkAcceptThread(THREAD *thread, void *param)
81 {
82 	CHECK_NETWORK_2 *c = (CHECK_NETWORK_2 *)param;
83 	SOCK *s = c->s;
84 	UINT i = 0;
85 
86 	if (StartSSL(s, c->x, c->k))
87 	{
88 		while (true)
89 		{
90 			i++;
91 			if (Send(s, &i, sizeof(UINT), true) == 0)
92 			{
93 				break;
94 			}
95 		}
96 	}
97 
98 	Disconnect(s);
99 	ReleaseSock(s);
100 }
101 
102 
103 // Listen thread
CheckNetworkListenThread(THREAD * thread,void * param)104 void CheckNetworkListenThread(THREAD *thread, void *param)
105 {
106 	CHECK_NETWORK_1 *c = (CHECK_NETWORK_1 *)param;
107 	SOCK *s;
108 	UINT i, rsa_bits = 1024;
109 	K *pub, *pri;
110 	X *x;
111 	LIST *o = NewList(NULL);
112 	NAME *name = NewName(L"Test", L"Test", L"Test", L"JP", L"Ibaraki", L"Tsukuba");
113 
114 	// Set RSA bits considering OpenSSL security Level
115 	// Security level 4 needs 7680 bits
116 	switch (GetOSSecurityLevel())
117 	{
118 	case 2:
119 		rsa_bits = 2048;
120 		break;
121 	case 3:
122 		rsa_bits = 4096;
123 		break;
124 	default:
125 		break;
126 	}
127 	RsaGen(&pri, &pub, rsa_bits);
128 	x = NewRootX(pub, pri, name, 1000, NULL);
129 
130 	FreeName(name);
131 
132 	for (i = 1025;;i++)
133 	{
134 		s = Listen(i);
135 		if (s != NULL)
136 		{
137 			break;
138 		}
139 	}
140 
141 	c->ListenSocket = s;
142 	AddRef(s->ref);
143 
144 	NoticeThreadInit(thread);
145 
146 	while (true)
147 	{
148 		SOCK *new_sock = Accept(s);
149 
150 		if (new_sock == NULL)
151 		{
152 			break;
153 		}
154 		else
155 		{
156 			CHECK_NETWORK_2 c;
157 			THREAD *t;
158 
159 			Zero(&c, sizeof(c));
160 			c.s = new_sock;
161 			c.k = pri;
162 			c.x = x;
163 
164 			t = NewThread(CheckNetworkAcceptThread, &c);
165 			Insert(o, t);
166 		}
167 	}
168 
169 	for (i = 0;i < LIST_NUM(o);i++)
170 	{
171 		THREAD *t = LIST_DATA(o, i);
172 		WaitThread(t, INFINITE);
173 		ReleaseThread(t);
174 	}
175 
176 	FreeK(pri);
177 	FreeK(pub);
178 
179 	FreeX(x);
180 
181 	ReleaseSock(s);
182 	ReleaseList(o);
183 }
184 
185 // Network function check
CheckNetwork()186 bool CheckNetwork()
187 {
188 	CHECK_NETWORK_1 c;
189 	THREAD *t;
190 	SOCK *listen_socket;
191 	UINT port;
192 	UINT i, num;
193 	bool ok = true;
194 	SOCK **socks;
195 	SOCK_EVENT *se = NewSockEvent();
196 
197 	Zero(&c, sizeof(c));
198 	t = NewThread(CheckNetworkListenThread, &c);
199 	WaitThreadInit(t);
200 
201 	listen_socket = c.ListenSocket;
202 
203 	port = listen_socket->LocalPort;
204 
205 	num = 8;
206 	socks = ZeroMalloc(sizeof(SOCK *) * num);
207 	for (i = 0;i < num;i++)
208 	{
209 		socks[i] = Connect("localhost", port);
210 		if (socks[i] == NULL)
211 		{
212 			Print("Connect Failed. (%u)\n", i);
213 			ok = false;
214 			num = i;
215 			break;
216 		}
217 		if (StartSSL(socks[i], NULL, NULL) == false)
218 		{
219 			ReleaseSock(socks[i]);
220 			Print("Connect Failed. (%u)\n", i);
221 			ok = false;
222 			num = i;
223 			break;
224 		}
225 
226 		JoinSockToSockEvent(socks[i], se);
227 	}
228 
229 	if (ok)
230 	{
231 		while (true)
232 		{
233 			UINT i;
234 			bool end = false;
235 			bool all_blocked = true;
236 
237 			for (i = 0;i < num;i++)
238 			{
239 				UINT n;
240 				UINT ret;
241 
242 				n = 0;
243 				ret = Recv(socks[i], &n, sizeof(UINT), true);
244 				if (ret == 0)
245 				{
246 					Print("Recv Failed (Disconnected).\n", ret);
247 					end = true;
248 					ok = false;
249 				}
250 				if (ret != SOCK_LATER)
251 				{
252 					all_blocked = false;
253 				}
254 
255 				if (n >= 128)
256 				{
257 					end = true;
258 				}
259 			}
260 
261 			if (end)
262 			{
263 				break;
264 			}
265 
266 			if (all_blocked)
267 			{
268 				WaitSockEvent(se, INFINITE);
269 			}
270 		}
271 	}
272 
273 	for (i = 0;i < num;i++)
274 	{
275 		Disconnect(socks[i]);
276 		ReleaseSock(socks[i]);
277 	}
278 	Free(socks);
279 
280 	Disconnect(listen_socket);
281 
282 	WaitThread(t, INFINITE);
283 	ReleaseThread(t);
284 
285 	ReleaseSock(listen_socket);
286 
287 	ReleaseSockEvent(se);
288 
289 	return ok;
290 }
291 
292 typedef struct CHECK_THREAD_1
293 {
294 	UINT num;
295 	LOCK *lock;
296 	THREAD *wait_thread;
297 } CHECK_THREAD_1;
298 
299 static UINT check_thread_global_1 = 0;
300 
301 #define	CHECK_THREAD_INCREMENT_COUNT		32
302 
303 // Test thread 1
CheckThread1(THREAD * thread,void * param)304 void CheckThread1(THREAD *thread, void *param)
305 {
306 	CHECK_THREAD_1 *ct1 = (CHECK_THREAD_1 *)param;
307 	UINT i;
308 	UINT num = CHECK_THREAD_INCREMENT_COUNT;
309 
310 	WaitThread(ct1->wait_thread, INFINITE);
311 
312 	for (i = 0;i < num;i++)
313 	{
314 		Lock(ct1->lock);
315 		check_thread_global_1 = ct1->num;
316 		InputToNull((void *)check_thread_global_1);
317 		check_thread_global_1 = check_thread_global_1 + 1 + RetZero();
318 		ct1->num = check_thread_global_1;
319 		Unlock(ct1->lock);
320 	}
321 }
322 
323 // Test thread 2
CheckThread2(THREAD * thread,void * param)324 void CheckThread2(THREAD *thread, void *param)
325 {
326 	EVENT *e = (EVENT *)param;
327 	Wait(e, INFINITE);
328 }
329 
330 typedef struct CHECK_THREAD_3
331 {
332 	UINT num, a;
333 } CHECK_THREAD_3;
334 
335 // Test thread 3
CheckThread3(THREAD * thread,void * param)336 void CheckThread3(THREAD *thread, void *param)
337 {
338 	CHECK_THREAD_3 *c = (CHECK_THREAD_3 *)param;
339 	THREAD *t;
340 
341 	if (c->num == 0)
342 	{
343 		return;
344 	}
345 	c->num--;
346 	c->a++;
347 
348 	t = NewThread(CheckThread3, c);
349 	WaitThread(t, INFINITE);
350 	ReleaseThread(t);
351 }
352 
353 // Thread check
CheckThread()354 bool CheckThread()
355 {
356 	bool ok = true;
357 	CHECK_THREAD_1 ct1;
358 	UINT num = 32;
359 	UINT i;
360 	THREAD **threads;
361 	EVENT *e;
362 	THREAD *t2;
363 	THREAD *t;
364 	CHECK_THREAD_3 c;
365 
366 	e = NewEvent();
367 
368 	Zero(&ct1, sizeof(ct1));
369 	ct1.lock = NewLock();
370 
371 	t2 = NewThread(CheckThread2, e);
372 	ct1.wait_thread = t2;
373 
374 	threads = ZeroMalloc(sizeof(THREAD *) * num);
375 	for (i = 0;i < num;i++)
376 	{
377 		threads[i] = NewThread(CheckThread1, &ct1);
378 		if (threads[i] == NULL)
379 		{
380 			Print("Thread %u Create Failed.\n", i);
381 			ok = false;
382 		}
383 	}
384 
385 	Set(e);
386 
387 	for (i = 0;i < num;i++)
388 	{
389 		WaitThread(threads[i], INFINITE);
390 		ReleaseThread(threads[i]);
391 	}
392 
393 	Free(threads);
394 
395 	if (ct1.num != (num * CHECK_THREAD_INCREMENT_COUNT))
396 	{
397 		Print("Threading: %u != %u\n", ct1.num, num * CHECK_THREAD_INCREMENT_COUNT);
398 		ok = false;
399 	}
400 
401 	DeleteLock(ct1.lock);
402 
403 	WaitThread(t2, INFINITE);
404 	ReleaseThread(t2);
405 
406 	ReleaseEvent(e);
407 
408 	num = 32;
409 
410 	Zero(&c, sizeof(c));
411 	c.num = num;
412 	t = NewThread(CheckThread3, &c);
413 	WaitThread(t, INFINITE);
414 	ReleaseThread(t);
415 
416 	if (c.a != num)
417 	{
418 		Print("Threading: %u != %u\n", c.a, num);
419 		ok = false;
420 	}
421 
422 	return ok;
423 }
424 
425 // File system check
CheckFileSystem()426 bool CheckFileSystem()
427 {
428 	bool ok = false;
429 	char exe[MAX_PATH];
430 	char exe_dir[MAX_PATH];
431 	DIRLIST *dirs;
432 	UINT i;
433 
434 	GetExeName(exe, sizeof(exe));
435 	GetExeDir(exe_dir, sizeof(exe_dir));
436 
437 	dirs = EnumDir(exe_dir);
438 	for (i = 0;i < dirs->NumFiles;i++)
439 	{
440 		if (EndWith(exe, dirs->File[i]->FileName))
441 		{
442 			ok = true;
443 			break;
444 		}
445 	}
446 	FreeDir(dirs);
447 
448 	if (ok == false)
449 	{
450 		Print("EnumDir Failed.\n");
451 		return false;
452 	}
453 	else
454 	{
455 		UINT size = 1234567;
456 		UCHAR *buf;
457 		IO *io;
458 #ifndef	OS_WIN32
459 		wchar_t *filename = L"/tmp/vpn_checker_tmp";
460 #else	// OS_WIN32
461 		wchar_t filename[MAX_PATH];
462 		CombinePathW(filename, sizeof(filename), MsGetMyTempDirW(), L"vpn_checker_tmp");
463 #endif	// OS_WIN32
464 
465 		buf = Malloc(size);
466 		for (i = 0;i < size;i++)
467 		{
468 			buf[i] = i % 256;
469 		}
470 
471 		io = FileCreateW(filename);
472 		if (io == NULL)
473 		{
474 			Print("FileCreate Failed.\n");
475 			Free(buf);
476 			return false;
477 		}
478 		else
479 		{
480 			FileWrite(io, buf, size);
481 			Free(buf);
482 			FileClose(io);
483 
484 			io = FileOpenW(filename, false);
485 			if (FileSize(io) != 1234567)
486 			{
487 				Print("FileSize Failed.\n");
488 				FileClose(io);
489 				return false;
490 			}
491 			else
492 			{
493 				BUF *b;
494 
495 				FileClose(io);
496 				b = ReadDumpW(filename);
497 				if(b == NULL)
498 				{
499 					return false;
500 				}
501 
502 				for (i = 0;i < b->Size;i++)
503 				{
504 					UCHAR c = ((UCHAR *)b->Buf)[i];
505 
506 					if (c != (i % 256))
507 					{
508 						Print("FileToBuf Failed.\n");
509 						FreeBuf(b);
510 						return false;
511 					}
512 				}
513 
514 				FreeBuf(b);
515 			}
516 		}
517 
518 		FileDeleteW(filename);
519 	}
520 
521 	return ok;
522 }
523 
524 // String check
CheckStrings()525 bool CheckStrings()
526 {
527 	wchar_t *numstr = _UU("CHECK_TEST_123456789");
528 	char tmp[MAX_SIZE];
529 	wchar_t tmp2[MAX_SIZE];
530 	UINT i;
531 	UINT sum, sum2;
532 	UNI_TOKEN_LIST *t;
533 
534 	UniStrCpy(tmp2, sizeof(tmp2), L"");
535 
536 	sum2 = 0;
537 	for (i = 0;i < 64;i++)
538 	{
539 		sum2 += i;
540 		UniFormat(tmp2, sizeof(tmp2), L"%s,%u", tmp2, i);
541 	}
542 
543 	t = UniParseToken(tmp2, L",");
544 
545 	sum = 0;
546 
547 	for (i = 0;i < t->NumTokens;i++)
548 	{
549 		wchar_t *s = t->Token[i];
550 		UINT n = UniToInt(s);
551 
552 		sum += n;
553 	}
554 
555 	UniFreeToken(t);
556 
557 	if (sum != sum2)
558 	{
559 		Print("UniParseToken Failed.\n");
560 		return false;
561 	}
562 
563 	if (UniToInt(numstr) != 123456789)
564 	{
565 		Print("UniToInt Failed.\n");
566 		return false;
567 	}
568 
569 	UniToStr(tmp, sizeof(tmp), numstr);
570 	if (ToInt(tmp) != 123456789)
571 	{
572 		Print("UniToStr Failed.\n");
573 		return false;
574 	}
575 
576 	return true;
577 }
578 
579 // Memory check
CheckMemory()580 bool CheckMemory()
581 {
582 	UINT i, num, size, j;
583 	void **pp;
584 	bool ok = true;
585 	UINT old_size;
586 
587 	num = 2000;
588 	size = 1000;
589 	pp = ZeroMalloc(sizeof(void *) * num);
590 	for (i = 0;i < num;i++)
591 	{
592 		pp[i] = ZeroMalloc(size);
593 		InputToNull(pp[i]);
594 		for (j = 0;j < size;j++)
595 		{
596 			((UCHAR *)pp[i])[j] = j % 256;
597 		}
598 	}
599 	old_size = size;
600 	size = size * 3;
601 	for (i = 0;i < num;i++)
602 	{
603 		pp[i] = ReAlloc(pp[i], size);
604 		for (j = old_size;j < size;j++)
605 		{
606 			InputToNull((void *)(UINT)(((UCHAR *)pp[i])[j] = j % 256));
607 		}
608 	}
609 	for (i = 0;i < num;i++)
610 	{
611 		for (j = 0;j < size;j++)
612 		{
613 			if (((UCHAR *)pp[i])[j] != (j % 256))
614 			{
615 				ok = false;
616 			}
617 		}
618 		Free(pp[i]);
619 	}
620 	Free(pp);
621 
622 	return ok;
623 }
624 
625 // Function that do not do anything
InputToNull(void * p)626 void InputToNull(void *p)
627 {
628 	if (RetZero() == 1)
629 	{
630 		UCHAR *c = (UCHAR *)p;
631 		c[0] = 0x32;
632 	}
633 }
634 
635 // Function that returns 0
RetZero()636 UINT RetZero()
637 {
638 	if (g_debug == 0x123455)
639 	{
640 		return 1;
641 	}
642 	else
643 	{
644 		return 0;
645 	}
646 }
647 
648 
649 // Kernel check
CheckKernel()650 bool CheckKernel()
651 {
652 	UINT num = 10, i;
653 	UINT64 s = Tick64();
654 	UINT64 t = Tick64();
655 
656 	for (i = 0;i < num;i++)
657 	{
658 		UINT64 q = Tick64();
659 		if (t > q)
660 		{
661 			Print("Tick64 #1 Failed.\n");
662 			return false;
663 		}
664 
665 		t = q;
666 
667 		SleepThread(100);
668 	}
669 
670 	t = (Tick64() - s);
671 	if (t <= 500 || t >= 2000)
672 	{
673 		Print("Tick64 #2 Failed.\n");
674 		return false;
675 	}
676 	else if (false)
677 	{
678 		UINT64 tick1 = Tick64();
679 		UINT64 time1;
680 		UINT64 time2;
681 
682 		SleepThread(1000);
683 
684 		time2 = LocalTime64();
685 		time1 = SystemToLocal64(TickToTime(tick1));
686 
687 		if (time2 > time1)
688 		{
689 			s = time2 - time1;
690 		}
691 		else
692 		{
693 			s = time1 - time2;
694 		}
695 
696 		if (s <= 500 || s >= 2000)
697 		{
698 			Print("TickToTime Failed.\n");
699 			return false;
700 		}
701 	}
702 
703 #ifdef	OS_UNIX
704 	{
705 		// Test of child process
706 		UINT pid;
707 		char exe[MAX_SIZE];
708 
709 		GetExeName(exe, sizeof(exe));
710 
711 		pid = fork();
712 
713 		if (pid == -1)
714 		{
715 			Print("fork Failed.\n");
716 			return false;
717 		}
718 
719 		if (pid == 0)
720 		{
721 			char *param = UNIX_ARG_EXIT;
722 			char **args;
723 
724 			args = ZeroMalloc(sizeof(char *) * 3);
725 			args[0] = exe;
726 			args[1] = param;
727 			args[2] = NULL;
728 
729 			setsid();
730 
731 			// Close the standard I/O
732 			UnixCloseIO();
733 
734 			// Stop unwanted signals
735 			signal(SIGHUP, SIG_IGN);
736 
737 			execvp(exe, args);
738 			AbortExit();
739 		}
740 		else
741 		{
742 			int status = 0, ret;
743 
744 			// Wait for the termination of the child process
745 			ret = waitpid(pid, &status, 0);
746 
747 			if (WIFEXITED(status) == 0)
748 			{
749 				// Aborted
750 				Print("waitpid Failed: 0x%x\n", ret);
751 				return false;
752 			}
753 		}
754 	}
755 #endif	// OS_UNIX
756 
757 	return true;
758 }
759 
760 // System checker
SystemCheck()761 bool SystemCheck()
762 {
763 	UINT i;
764 	bool ng = false;
765 
766 	UniPrint(_UU("CHECK_TITLE"));
767 	UniPrint(_UU("CHECK_NOTE"));
768 	for (i = 0;i < sizeof(checker_procs) / sizeof(checker_procs[0]);i++)
769 	{
770 		wchar_t *title;
771 		bool ret = false;
772 		CHECKER_PROC *p = &checker_procs[i];
773 
774 		title = _UU(p->Title);
775 
776 		UniPrint(_UU("CHECK_EXEC_TAG"), title);
777 
778 		ret = p->Proc();
779 
780 		if (ret == false)
781 		{
782 			ng = true;
783 		}
784 
785 		UniPrint(L"              %s\n", ret ? _UU("CHECK_PASS") : _UU("CHECK_FAIL"));
786 	}
787 
788 	UniPrint(L"\n");
789 	if (ng == false)
790 	{
791 		UniPrint(L"%s\n\n", _UU("CHECK_RESULT_1"));
792 	}
793 	else
794 	{
795 		UniPrint(L"%s\n\n", _UU("CHECK_RESULT_2"));
796 	}
797 
798 	return true;
799 }
800 
801 
802 // Behavior checker
PtCheck(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)803 UINT PtCheck(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
804 {
805 	LIST *o;
806 	UINT ret = ERR_NO_ERROR;
807 	// Get the parameter list
808 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
809 	if (o == NULL)
810 	{
811 		return ERR_INVALID_PARAMETER;
812 	}
813 
814 	if (SystemCheck() == false)
815 	{
816 		ret = ERR_INTERNAL_ERROR;
817 	}
818 
819 	FreeParamValueList(o);
820 
821 	return ret;
822 }
823 
824 // VPN Tools main function
PtMain(PT * pt)825 void PtMain(PT *pt)
826 {
827 	char prompt[MAX_SIZE];
828 	wchar_t tmp[MAX_SIZE];
829 	// Validate arguments
830 	if (pt == NULL)
831 	{
832 		return;
833 	}
834 
835 	// Display a message that start-up is complete
836 	UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_TOOLS_CONNECTED"));
837 	pt->Console->Write(pt->Console, tmp);
838 	pt->Console->Write(pt->Console, L"");
839 
840 	while (true)
841 	{
842 		// Definition of command
843 		CMD cmd[] =
844 		{
845 			{"About", PsAbout},
846 			{"MakeCert", PtMakeCert},
847 			{"MakeCert2048", PtMakeCert2048},
848 			{"TrafficClient", PtTrafficClient},
849 			{"TrafficServer", PtTrafficServer},
850 			{"Check", PtCheck},
851 		};
852 
853 		// Generate a prompt
854 		StrCpy(prompt, sizeof(prompt), "VPN Tools>");
855 
856 		if (DispatchNextCmdEx(pt->Console, pt->CmdLine, prompt, cmd, sizeof(cmd) / sizeof(cmd[0]), pt) == false)
857 		{
858 			break;
859 		}
860 		pt->LastError = pt->Console->RetCode;
861 
862 		if (pt->LastError == ERR_NO_ERROR && pt->Console->ConsoleType != CONSOLE_CSV)
863 		{
864 			pt->Console->Write(pt->Console, _UU("CMD_MSG_OK"));
865 			pt->Console->Write(pt->Console, L"");
866 		}
867 
868 		if (pt->CmdLine != NULL)
869 		{
870 			break;
871 		}
872 	}
873 }
874 
875 // Create a VPN Tools context
NewPt(CONSOLE * c,wchar_t * cmdline)876 PT *NewPt(CONSOLE *c, wchar_t *cmdline)
877 {
878 	PT *pt;
879 	// Validate arguments
880 	if (c == NULL)
881 	{
882 		return NULL;
883 	}
884 
885 	if (UniIsEmptyStr(cmdline))
886 	{
887 		cmdline = NULL;
888 	}
889 
890 	pt = ZeroMalloc(sizeof(PT));
891 	pt->Console = c;
892 	pt->CmdLine = CopyUniStr(cmdline);
893 
894 	return pt;
895 }
896 
897 // Release the VPN Tools context
FreePt(PT * pt)898 void FreePt(PT *pt)
899 {
900 	// Validate arguments
901 	if (pt == NULL)
902 	{
903 		return;
904 	}
905 
906 	Free(pt->CmdLine);
907 	Free(pt);
908 }
909 
910 // Start VPN Tools
PtConnect(CONSOLE * c,wchar_t * cmdline)911 UINT PtConnect(CONSOLE *c, wchar_t *cmdline)
912 {
913 	PT *pt;
914 	UINT ret = 0;
915 	// Validate arguments
916 	if (c == NULL)
917 	{
918 		return ERR_INTERNAL_ERROR;
919 	}
920 
921 	pt = NewPt(c, cmdline);
922 
923 	PtMain(pt);
924 
925 	ret = pt->LastError;
926 
927 	FreePt(pt);
928 
929 	return ret;
930 }
931 
932 // Initialize the execution path information of vpncmd command
VpnCmdInitBootPath()933 void VpnCmdInitBootPath()
934 {
935 #ifdef	OS_WIN32
936 	char exe_path[MAX_PATH];
937 	char tmp[MAX_PATH];
938 	GetExeName(exe_path, sizeof(exe_path));
939 
940 	if (SearchStrEx(exe_path, "ham.exe", 0, false) != INFINITE)
941 	{
942 		return;
943 	}
944 
945 	if (MsIsAdmin())
946 	{
947 		UINT current_ver;
948 
949 		// Get the version of vpncmd that is currently installed
950 		current_ver = MsRegReadInt(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER);
951 
952 		if ((CEDAR_VERSION_BUILD >= current_ver) ||
953 			MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)
954 		{
955 			bool b = false;
956 			// Copy the vpncmdsys.exe to system32
957 			Format(tmp, sizeof(tmp), "%s\\vpncmd.exe", MsGetSystem32Dir());
958 
959 			if (MsIs64BitWindows() == false || Is64())
960 			{
961 				if (IsFile(tmp) == false || (CEDAR_VERSION_BUILD > current_ver) || MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)
962 				{
963 					b = FileCopy(VPNCMD_BOOTSTRAP_FILENAME, tmp);
964 				}
965 			}
966 			else
967 			{
968 				void *wow = MsDisableWow64FileSystemRedirection();
969 
970 				if (IsFile(tmp) == false || (CEDAR_VERSION_BUILD > current_ver) || MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)
971 				{
972 					b = FileCopy(VPNCMD_BOOTSTRAP_FILENAME, tmp);
973 				}
974 
975 				MsRestoreWow64FileSystemRedirection(wow);
976 
977 				if (IsFile(tmp) == false || (CEDAR_VERSION_BUILD > current_ver) || MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)
978 				{
979 					b = FileCopy(VPNCMD_BOOTSTRAP_FILENAME, tmp);
980 				}
981 			}
982 
983 			// Because the currently running prompt is newer version, overwrite the registry
984 			if (MsIs64BitWindows() == false)
985 			{
986 				MsRegWriteStr(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH, exe_path);
987 				MsRegWriteInt(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER, CEDAR_VERSION_BUILD);
988 			}
989 			else
990 			{
991 				MsRegWriteStrEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH, exe_path, true, false);
992 				MsRegWriteIntEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER, CEDAR_VERSION_BUILD, true, false);
993 
994 				MsRegWriteStrEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH, exe_path, false, true);
995 				MsRegWriteIntEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER, CEDAR_VERSION_BUILD, false, true);
996 			}
997 		}
998 	}
999 #endif	// OS_WIN32
1000 }
1001 
1002 // Show the string
TtPrint(void * param,TT_PRINT_PROC * print_proc,wchar_t * str)1003 void TtPrint(void *param, TT_PRINT_PROC *print_proc, wchar_t *str)
1004 {
1005 	// Validate arguments
1006 	if (print_proc == NULL || str == NULL)
1007 	{
1008 		return;
1009 	}
1010 
1011 	print_proc(param, str);
1012 }
1013 
1014 // Generate new random data
TtGenerateRandomData(UCHAR ** buf,UINT * size)1015 void TtGenerateRandomData(UCHAR **buf, UINT *size)
1016 {
1017 	UCHAR *tmp;
1018 	UINT sz;
1019 	UINT i;
1020 	// Validate arguments
1021 	if (buf == NULL || size == NULL)
1022 	{
1023 		return;
1024 	}
1025 
1026 	sz = TRAFFIC_BUF_SIZE;
1027 	tmp = Malloc(sz);
1028 	for (i = 0;i < sz;i++)
1029 	{
1030 		tmp[i] = rand() % 256;
1031 
1032 		if (tmp[i] == '!')
1033 		{
1034 			tmp[i] = '_';
1035 		}
1036 	}
1037 
1038 	*buf = tmp;
1039 	*size = sz;
1040 }
1041 
1042 // Communication throughput measurement server worker thread
TtsWorkerThread(THREAD * thread,void * param)1043 void TtsWorkerThread(THREAD *thread, void *param)
1044 {
1045 	TTS *tts;
1046 	TTS_WORKER *w;
1047 	UINT buf_size;
1048 	UCHAR *send_buf_data, *recv_buf_data;
1049 	bool all_sockets_blocked = false;
1050 	UINT64 tmp64;
1051 	LIST *o;
1052 	UINT i;
1053 	wchar_t tmp[MAX_SIZE];
1054 	bool dont_block_next_time = false;
1055 	char *ver_str = TRAFFIC_VER_STR;
1056 	// Validate arguments
1057 	if (thread == NULL || param == NULL)
1058 	{
1059 		return;
1060 	}
1061 
1062 	// Allocate the data area
1063 	TtGenerateRandomData(&send_buf_data, &buf_size);
1064 	TtGenerateRandomData(&recv_buf_data, &buf_size);
1065 
1066 	w = (TTS_WORKER *)param;
1067 	tts = (TTS *)w->Tts;
1068 
1069 	// Preparation of socket events
1070 	w->SockEvent = NewSockEvent();
1071 	AddRef(w->SockEvent->ref);
1072 
1073 	// Preparing the Server socket list
1074 	w->TtsSockList = NewList(NULL);
1075 
1076 	// Notify completion of preparation to parent thread
1077 	NoticeThreadInit(thread);
1078 
1079 	o = NewList(NULL);
1080 
1081 	while (tts->Halt == false)
1082 	{
1083 		UINT64 now = Tick64();
1084 
1085 		// Wait for all sockets
1086 		if (dont_block_next_time == false)
1087 		{
1088 			WaitSockEvent(w->SockEvent, 50);
1089 		}
1090 		dont_block_next_time = false;
1091 
1092 		// Process for sockets that are currently registered
1093 		LockList(w->TtsSockList);
1094 		{
1095 			UINT i;
1096 
1097 			all_sockets_blocked = false;
1098 
1099 			// Continue to send and receive data
1100 			// until all sockets become block state
1101 			while (all_sockets_blocked == false)
1102 			{
1103 				all_sockets_blocked = true;
1104 
1105 				for (i = 0;i < LIST_NUM(w->TtsSockList);i++)
1106 				{
1107 					UINT ret = SOCK_LATER;
1108 					UCHAR *send_data = NULL, *recv_data = NULL;
1109 					UINT send_size = 0, recv_size = 0;
1110 					TTS_SOCK *ts = LIST_DATA(w->TtsSockList, i);
1111 					bool blocked_for_this_socket = false;
1112 
1113 					if (ts->SockJoined == false)
1114 					{
1115 						JoinSockToSockEvent(ts->Sock, w->SockEvent);
1116 						ts->SockJoined = true;
1117 					}
1118 
1119 					switch (ts->State)
1120 					{
1121 					case 0:
1122 						// Return the version string
1123 						ret = Send(ts->Sock, ver_str, TRAFFIC_VER_STR_SIZE, false);
1124 						if (ret != 0 && ret != SOCK_LATER)
1125 						{
1126 							ts->State = 5;
1127 							ts->LastCommTime = now;
1128 						}
1129 						break;
1130 
1131 					case 5:
1132 						// Receive the direction from the client
1133 						ret = Recv(ts->Sock, recv_buf_data, buf_size, false);
1134 						if (ret != 0 && ret != SOCK_LATER)
1135 						{
1136 							UCHAR c;
1137 
1138 							ts->LastCommTime = now;
1139 
1140 							// Direction of the data is in the first byte that is received
1141 							c = recv_buf_data[0];
1142 
1143 							if (c == 0)
1144 							{
1145 								// In the case of 0, Client -> Server
1146 								ts->State = 1;
1147 							}
1148 							else
1149 							{
1150 								// Otherwise Server -> Client
1151 								ts->State = 2;
1152 							}
1153 
1154 							if (ret >= (sizeof(UINT64) + sizeof(UINT64) + 1))
1155 							{
1156 								// Session ID
1157 								ts->SessionId = READ_UINT64(recv_buf_data + 1);
1158 
1159 								// Span
1160 								ts->Span = READ_UINT64(recv_buf_data + sizeof(UINT64) + 1);
1161 
1162 								ts->GiveupSpan = ts->Span * 3ULL + 180000ULL;
1163 							}
1164 						}
1165 						break;
1166 
1167 					case 1:
1168 						// Client -> Server
1169 						ret = Recv(ts->Sock, recv_buf_data, buf_size, false);
1170 
1171 						if (ret != 0 && ret != SOCK_LATER)
1172 						{
1173 							// Checking the first byte of received
1174 							UCHAR c = recv_buf_data[0];
1175 
1176 							ts->LastCommTime = now;
1177 
1178 							if (ts->FirstRecvTick == 0)
1179 							{
1180 								// Record the time at which the data has been received for the first
1181 								ts->FirstRecvTick = now;
1182 							}
1183 							else
1184 							{
1185 								// Check whether the span didn't finish yet
1186 								if (ts->FirstRecvTick <= now)
1187 								{
1188 									if (ts->Span != 0)
1189 									{
1190 										UINT64 giveup_tick = ts->FirstRecvTick + ts->Span;
1191 
1192 										if (now > giveup_tick)
1193 										{
1194 											// Span has expired
1195 											c = '!';
1196 										}
1197 									}
1198 								}
1199 							}
1200 
1201 							if (c == '!')
1202 							{
1203 								// Notice the size information from the server to the client
1204 								ts->State = 3;
1205 								Debug("!");
1206 							}
1207 						}
1208 						break;
1209 
1210 					case 2:
1211 						// Server -> Client
1212 						if (ts->NoMoreSendData == false)
1213 						{
1214 							ret = Send(ts->Sock, send_buf_data, buf_size, false);
1215 
1216 							if (ret != 0 && ret != SOCK_LATER)
1217 							{
1218 								ts->LastCommTime = now;
1219 							}
1220 						}
1221 						else
1222 						{
1223 							ret = Recv(ts->Sock, recv_buf_data, buf_size, false);
1224 
1225 							if (ret != 0 && ret != SOCK_LATER)
1226 							{
1227 								ts->LastCommTime = now;
1228 							}
1229 						}
1230 
1231 						if (ts->FirstSendTick == 0)
1232 						{
1233 							ts->FirstSendTick = now;
1234 						}
1235 						else
1236 						{
1237 							if (ts->FirstSendTick <= now)
1238 							{
1239 								if (ts->Span != 0)
1240 								{
1241 									UINT64 giveup_tick = ts->FirstSendTick + ts->Span * 3ULL + 180000ULL;
1242 
1243 									if (now > giveup_tick)
1244 									{
1245 										ret = 0;
1246 									}
1247 								}
1248 							}
1249 						}
1250 
1251 						break;
1252 
1253 					case 3:
1254 						// Notice the size information from the server to the client
1255 						tmp64 = Endian64(ts->NumBytes);
1256 
1257 						(void)Recv(ts->Sock, recv_buf_data, buf_size, false);
1258 
1259 						if (ts->LastWaitTick == 0 || ts->LastWaitTick <= Tick64())
1260 						{
1261 							ret = Send(ts->Sock, &tmp64, sizeof(tmp64), false);
1262 
1263 							if (ret != 0 && ret != SOCK_LATER)
1264 							{
1265 								ts->LastCommTime = now;
1266 							}
1267 
1268 							if (ret != SOCK_LATER)
1269 							{
1270 								UINT j;
1271 
1272 								ts->LastWaitTick = Tick64() + 100;
1273 
1274 								if (ts->SessionId != 0)
1275 								{
1276 									// Not to send more data to the socket of the
1277 									// transmission direction in the same session ID
1278 									for (j = 0;j < LIST_NUM(w->TtsSockList);j++)
1279 									{
1280 										TTS_SOCK *ts2 = LIST_DATA(w->TtsSockList, j);
1281 
1282 										if (ts2->SessionId == ts->SessionId &&
1283 											ts2 != ts)
1284 										{
1285 											ts2->NoMoreSendData = true;
1286 										}
1287 									}
1288 								}
1289 							}
1290 						}
1291 						break;
1292 					}
1293 
1294 					if (now > (ts->LastCommTime + ts->GiveupSpan))
1295 					{
1296 						// Timeout: disconnect orphan sessions
1297 						ret = 0;
1298 					}
1299 
1300 					if (ret == 0)
1301 					{
1302 						// Mark as deleting the socket because it is disconnected
1303 						Insert(o, ts);
1304 					}
1305 					else if (ret == SOCK_LATER)
1306 					{
1307 						// Delay has occurred
1308 						blocked_for_this_socket = true;
1309 						dont_block_next_time = false;
1310 					}
1311 					else
1312 					{
1313 						if (ts->State == 1)
1314 						{
1315 							ts->NumBytes += (UINT64)ret;
1316 						}
1317 					}
1318 
1319 					if (blocked_for_this_socket == false)
1320 					{
1321 						all_sockets_blocked = false;
1322 					}
1323 				}
1324 
1325 				if (LIST_NUM(o) != 0)
1326 				{
1327 					UINT i;
1328 					// One or more sockets is disconnected
1329 					for (i = 0;i < LIST_NUM(o);i++)
1330 					{
1331 						TTS_SOCK *ts = LIST_DATA(o, i);
1332 
1333 						UniFormat(tmp, sizeof(tmp), _UU("TTS_DISCONNECTED"), ts->Id, ts->Sock->RemoteHostname);
1334 						TtPrint(tts->Param, tts->Print, tmp);
1335 
1336 						Disconnect(ts->Sock);
1337 						ReleaseSock(ts->Sock);
1338 
1339 						Delete(w->TtsSockList, ts);
1340 
1341 						Free(ts);
1342 					}
1343 
1344 					DeleteAll(o);
1345 				}
1346 
1347 				if (w->NewSocketArrived || tts->Halt)
1348 				{
1349 					w->NewSocketArrived = false;
1350 					all_sockets_blocked = true;
1351 					dont_block_next_time = true;
1352 				}
1353 			}
1354 		}
1355 		UnlockList(w->TtsSockList);
1356 	}
1357 
1358 	LockList(w->TtsSockList);
1359 	{
1360 		// Release the sockets of all remaining
1361 		for (i = 0;i < LIST_NUM(w->TtsSockList);i++)
1362 		{
1363 			TTS_SOCK *ts = LIST_DATA(w->TtsSockList, i);
1364 
1365 			UniFormat(tmp, sizeof(tmp), _UU("TTS_DISCONNECT"), ts->Id, ts->Sock->RemoteHostname);
1366 			TtPrint(tts->Param, tts->Print, tmp);
1367 
1368 			Disconnect(ts->Sock);
1369 			ReleaseSock(ts->Sock);
1370 
1371 			Free(ts);
1372 		}
1373 	}
1374 	UnlockList(w->TtsSockList);
1375 
1376 	// Cleanup
1377 	ReleaseList(o);
1378 	ReleaseList(w->TtsSockList);
1379 	ReleaseSockEvent(w->SockEvent);
1380 	Free(send_buf_data);
1381 	Free(recv_buf_data);
1382 }
1383 
1384 // Accept thread for IPv6
TtsIPv6AcceptThread(THREAD * thread,void * param)1385 void TtsIPv6AcceptThread(THREAD *thread, void *param)
1386 {
1387 	TTS *tts = (TTS *)param;
1388 	// Validate arguments
1389 	if (tts == NULL || param == NULL)
1390 	{
1391 		return;
1392 	}
1393 
1394 	TtsAcceptProc(tts, tts->ListenSocketV6);
1395 }
1396 
1397 // Accept procedure
TtsAcceptProc(TTS * tts,SOCK * listen_socket)1398 void TtsAcceptProc(TTS *tts, SOCK *listen_socket)
1399 {
1400 	wchar_t tmp[MAX_SIZE];
1401 	UINT seed = 0;
1402 	// Validate arguments
1403 	if (tts == NULL || listen_socket == NULL)
1404 	{
1405 		return;
1406 	}
1407 
1408 	while (tts->Halt == false)
1409 	{
1410 		SOCK *s;
1411 		// Accept
1412 		s = Accept(listen_socket);
1413 
1414 		if (s == NULL)
1415 		{
1416 			if (tts->Halt == false)
1417 			{
1418 				SleepThread(10);
1419 			}
1420 			continue;
1421 		}
1422 		else
1423 		{
1424 			UINT num, i;
1425 			TTS_WORKER *w;
1426 
1427 			// Connected from the client
1428 			AcceptInitEx(s, true);
1429 
1430 			// Choose a worker thread
1431 			num = LIST_NUM(tts->WorkerList);
1432 
1433 			i = seed % num;
1434 
1435 			seed++;
1436 
1437 			w = LIST_DATA(tts->WorkerList, i);
1438 
1439 			w->NewSocketArrived = true;
1440 			LockList(w->TtsSockList);
1441 			{
1442 				TTS_SOCK *ts = ZeroMalloc(sizeof(TTS_SOCK));
1443 
1444 				ts->Id = (++tts->IdSeed);
1445 				ts->Sock = s;
1446 
1447 				ts->GiveupSpan = (UINT64)(10 * 60 * 1000);
1448 				ts->LastCommTime = Tick64();
1449 
1450 				UniFormat(tmp, sizeof(tmp), _UU("TTS_ACCEPTED"), ts->Id,
1451 					s->RemoteHostname, s->RemotePort);
1452 				TtPrint(tts->Param, tts->Print, tmp);
1453 
1454 				Insert(w->TtsSockList, ts);
1455 				w->NewSocketArrived = true;
1456 			}
1457 			UnlockList(w->TtsSockList);
1458 
1459 			SetSockEvent(w->SockEvent);
1460 		}
1461 	}
1462 }
1463 
1464 // Communication throughput measurement server wait thread
TtsListenThread(THREAD * thread,void * param)1465 void TtsListenThread(THREAD *thread, void *param)
1466 {
1467 	TTS *tts;
1468 	wchar_t tmp[MAX_SIZE];
1469 	// Validate arguments
1470 	if (thread == NULL || param == NULL)
1471 	{
1472 		return;
1473 	}
1474 
1475 	tts = (TTS *)param;
1476 
1477 	tts->ListenSocket = NULL;
1478 	tts->ListenSocket = ListenEx(tts->Port, false);
1479 	tts->ListenSocketV6 = ListenEx6(tts->Port, false);
1480 
1481 	if (tts->ListenSocket == NULL && tts->ListenSocketV6 == NULL)
1482 	{
1483 		// Failed to Listen
1484 		UniFormat(tmp, sizeof(tmp), _UU("TT_LISTEN_FAILED"), tts->Port);
1485 		TtPrint(tts->Param, tts->Print, tmp);
1486 
1487 		// Notify completion of preparation to parent thread
1488 		NoticeThreadInit(thread);
1489 
1490 		tts->ErrorCode = ERR_INTERNAL_ERROR;
1491 	}
1492 	else
1493 	{
1494 		UINT i, num_worker_threads;
1495 
1496 		UniFormat(tmp, sizeof(tmp), _UU("TTS_LISTEN_STARTED"), tts->Port);
1497 		TtPrint(tts->Param, tts->Print, tmp);
1498 
1499 		if (tts->ListenSocketV6 != NULL)
1500 		{
1501 			UniFormat(tmp, sizeof(tmp), _UU("TTS_LISTEN_STARTED_V6"), tts->Port);
1502 			TtPrint(tts->Param, tts->Print, tmp);
1503 		}
1504 		else
1505 		{
1506 			UniFormat(tmp, sizeof(tmp), _UU("TTS_LISTEN_FAILED_V6"), tts->Port);
1507 			TtPrint(tts->Param, tts->Print, tmp);
1508 		}
1509 
1510 		if (tts->ListenSocket != NULL)
1511 		{
1512 			AddRef(tts->ListenSocket->ref);
1513 		}
1514 		if (tts->ListenSocketV6 != NULL)
1515 		{
1516 			AddRef(tts->ListenSocketV6->ref);
1517 		}
1518 
1519 		num_worker_threads = GetNumberOfCpu();
1520 
1521 		// Start the worker threads
1522 		for (i = 0;i < num_worker_threads;i++)
1523 		{
1524 			TTS_WORKER *w = ZeroMalloc(sizeof(TTS_WORKER));
1525 
1526 			w->Tts = tts;
1527 			w->WorkThread = NewThread(TtsWorkerThread, w);
1528 			WaitThreadInit(w->WorkThread);
1529 
1530 			Add(tts->WorkerList, w);
1531 		}
1532 
1533 		// Notify completion of preparation to parent thread
1534 		NoticeThreadInit(thread);
1535 
1536 		// Prepare for IPv6 Accept thread
1537 		tts->IPv6AcceptThread = NULL;
1538 		if (tts->ListenSocketV6 != NULL)
1539 		{
1540 			tts->IPv6AcceptThread = NewThread(TtsIPv6AcceptThread, tts);
1541 		}
1542 
1543 		TtsAcceptProc(tts, tts->ListenSocket);
1544 
1545 		if (tts->IPv6AcceptThread != NULL)
1546 		{
1547 			WaitThread(tts->IPv6AcceptThread, INFINITE);
1548 			ReleaseThread(tts->IPv6AcceptThread);
1549 		}
1550 
1551 		TtPrint(tts->Param, tts->Print, _UU("TTS_LISTEN_STOP"));
1552 
1553 		ReleaseSock(tts->ListenSocket);
1554 		ReleaseSock(tts->ListenSocketV6);
1555 
1556 		for (i = 0;i < LIST_NUM(tts->WorkerList);i++)
1557 		{
1558 			TTS_WORKER *w = LIST_DATA(tts->WorkerList, i);
1559 
1560 			SetSockEvent(w->SockEvent);
1561 
1562 			// Wait for stopping the worker thread
1563 			WaitThread(w->WorkThread, INFINITE);
1564 			ReleaseThread(w->WorkThread);
1565 			ReleaseSockEvent(w->SockEvent);
1566 
1567 			Free(w);
1568 		}
1569 	}
1570 }
1571 
1572 // String of the direction in which data flows
GetTtcTypeStr(UINT type)1573 wchar_t *GetTtcTypeStr(UINT type)
1574 {
1575 	switch (type)
1576 	{
1577 	case TRAFFIC_TYPE_DOWNLOAD:
1578 		return _UU("TTC_TYPE_DOWNLOAD");
1579 
1580 	case TRAFFIC_TYPE_UPLOAD:
1581 		return _UU("TTC_TYPE_UPLOAD");
1582 
1583 	default:
1584 		return _UU("TTC_TYPE_FULL");
1585 	}
1586 }
1587 
1588 // Show a Summary
TtcPrintSummary(TTC * ttc)1589 void TtcPrintSummary(TTC *ttc)
1590 {
1591 	wchar_t tmp[MAX_SIZE];
1592 	wchar_t tmp2[MAX_SIZE];
1593 	wchar_t *tag = L"%-35s %s";
1594 	// Validate arguments
1595 	if (ttc == NULL)
1596 	{
1597 		return;
1598 	}
1599 
1600 	TtPrint(ttc->Param, ttc->Print, L"");
1601 	TtPrint(ttc->Param, ttc->Print, _UU("TTC_SUMMARY_BAR"));
1602 	TtPrint(ttc->Param, ttc->Print, _UU("TTC_SUMMARY_TITLE"));
1603 	TtPrint(ttc->Param, ttc->Print, L"");
1604 
1605 	// Destination host name
1606 	StrToUni(tmp2, sizeof(tmp2), ttc->Host);
1607 	UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_HOST"), tmp2);
1608 	TtPrint(ttc->Param, ttc->Print, tmp);
1609 
1610 	// Destination TCP port number
1611 	UniToStru(tmp2, ttc->Port);
1612 	UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_PORT"), tmp2);
1613 	TtPrint(ttc->Param, ttc->Print, tmp);
1614 
1615 	// Number of TCP connections to establish
1616 	UniToStru(tmp2, ttc->NumTcp);
1617 	UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_NUMTCP"), tmp2);
1618 	TtPrint(ttc->Param, ttc->Print, tmp);
1619 
1620 	// Data transmission direction
1621 	UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_TYPE"), GetTtcTypeStr(ttc->Type));
1622 	TtPrint(ttc->Param, ttc->Print, tmp);
1623 
1624 	// Data transmission span
1625 	UniFormat(tmp2, sizeof(tmp2), _UU("TTC_SPAN_STR"), (double)(ttc->Span) / 1000.0);
1626 	UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_SPAN"), tmp2);
1627 	TtPrint(ttc->Param, ttc->Print, tmp);
1628 
1629 	// Correct the data for Ethernet frame
1630 	UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_ETHER"), ttc->Raw ? _UU("SEC_NO") : _UU("SEC_YES"));
1631 	TtPrint(ttc->Param, ttc->Print, tmp);
1632 
1633 	// Measure the total amount of input and output throughput of relay equipment
1634 	UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_DOUBLE"), ttc->Double ? _UU("SEC_YES") : _UU("SEC_NO"));
1635 	TtPrint(ttc->Param, ttc->Print, tmp);
1636 
1637 	TtPrint(ttc->Param, ttc->Print, _UU("TTC_SUMMARY_BAR"));
1638 	TtPrint(ttc->Param, ttc->Print, L"");
1639 }
1640 
1641 // Stop the communication throughput measurement client
StopTtc(TTC * ttc)1642 void StopTtc(TTC *ttc)
1643 {
1644 	// Validate arguments
1645 	if (ttc == NULL)
1646 	{
1647 		return;
1648 	}
1649 
1650 	TtPrint(ttc->Param, ttc->Print, _UU("TTC_STOPPING"));
1651 
1652 	ttc->Halt = true;
1653 }
1654 
1655 // Generate a result
TtcGenerateResult(TTC * ttc)1656 void TtcGenerateResult(TTC *ttc)
1657 {
1658 	TT_RESULT *res;
1659 	UINT i;
1660 	// Validate arguments
1661 	if (ttc == NULL)
1662 	{
1663 		return;
1664 	}
1665 
1666 	res = &ttc->Result;
1667 
1668 	Zero(res, sizeof(TT_RESULT));
1669 
1670 	res->Raw = ttc->Raw;
1671 	res->Double = ttc->Double;
1672 	res->Span = ttc->RealSpan;
1673 
1674 	for (i = 0;i < LIST_NUM(ttc->ItcSockList);i++)
1675 	{
1676 		TTC_SOCK *ts = LIST_DATA(ttc->ItcSockList, i);
1677 
1678 		if (ts->Download == false)
1679 		{
1680 			// Upload
1681 			res->NumBytesUpload += ts->NumBytes;
1682 		}
1683 		else
1684 		{
1685 			// Download
1686 			res->NumBytesDownload += ts->NumBytes;
1687 		}
1688 	}
1689 
1690 	if (res->Raw == false)
1691 	{
1692 		// Correct to match the Ethernet
1693 		res->NumBytesDownload = (UINT64)((double)res->NumBytesDownload * 1514.0 / 1460.0);
1694 		res->NumBytesUpload = (UINT64)((double)res->NumBytesUpload * 1514.0 / 1460.0);
1695 	}
1696 
1697 	res->NumBytesTotal = res->NumBytesDownload + res->NumBytesUpload;
1698 
1699 	// Measure the throughput
1700 	if (res->Span != 0)
1701 	{
1702 		res->BpsUpload = (UINT64)((double)res->NumBytesUpload * 8.0 / ((double)res->Span / 1000.0));
1703 		res->BpsDownload = (UINT64)((double)res->NumBytesDownload * 8.0 / ((double)res->Span / 1000.0));
1704 	}
1705 
1706 	if (res->Double)
1707 	{
1708 		res->BpsUpload *= 2ULL;
1709 		res->BpsDownload *= 2ULL;
1710 	}
1711 
1712 	res->BpsTotal = res->BpsUpload + res->BpsDownload;
1713 }
1714 
1715 // Client worker thread
TtcWorkerThread(THREAD * thread,void * param)1716 void TtcWorkerThread(THREAD *thread, void *param)
1717 {
1718 	TTC_WORKER *w;
1719 	TTC *ttc;
1720 	bool dont_block_next_time = false;
1721 	bool halting = false;
1722 	UINT64 halt_timeout = 0;
1723 	bool all_sockets_blocked;
1724 	wchar_t tmp[MAX_SIZE];
1725 	UCHAR *send_buf_data, *recv_buf_data;
1726 	UINT buf_size;
1727 	UINT64 tmp64;
1728 
1729 	if (thread == NULL || param == NULL)
1730 	{
1731 		return;
1732 	}
1733 
1734 	w = (TTC_WORKER *)param;
1735 	ttc = w->Ttc;
1736 
1737 	// Allocate the data area
1738 	TtGenerateRandomData(&send_buf_data, &buf_size);
1739 	TtGenerateRandomData(&recv_buf_data, &buf_size);
1740 
1741 	NoticeThreadInit(thread);
1742 
1743 	// Wait for start
1744 	Wait(w->StartEvent, INFINITE);
1745 
1746 	// Main loop
1747 	while (true)
1748 	{
1749 		UINT i;
1750 
1751 		if (dont_block_next_time == false)
1752 		{
1753 			WaitSockEvent(w->SockEvent, 50);
1754 		}
1755 
1756 		dont_block_next_time = false;
1757 
1758 		if (ttc->AbnormalTerminated)
1759 		{
1760 			// Abnormal termination occured
1761 			break;
1762 		}
1763 
1764 		if (ttc->Halt || ttc->end_tick <= Tick64() || (ttc->Cancel != NULL && (*ttc->Cancel)))
1765 		{
1766 			// End measurement
1767 			if (halting == false)
1768 			{
1769 				if (ttc->Halt || (ttc->Cancel != NULL && (*ttc->Cancel)))
1770 				{
1771 					if ((ttc->flag1++) == 0)
1772 					{
1773 						// User cancel
1774 						TtPrint(ttc->Param, ttc->Print, _UU("TTC_COMM_USER_CANCEL"));
1775 					}
1776 				}
1777 				else
1778 				{
1779 					// Time elapsed
1780 					if ((ttc->flag2++) == 0)
1781 					{
1782 						UniFormat(tmp, sizeof(tmp), _UU("TTC_COMM_END"),
1783 							(double)ttc->Span / 1000.0);
1784 						TtPrint(ttc->Param, ttc->Print, tmp);
1785 					}
1786 				}
1787 
1788 				if (ttc->RealSpan == 0)
1789 				{
1790 					ttc->RealSpan = Tick64() - ttc->start_tick;
1791 				}
1792 
1793 				halting = true;
1794 
1795 				// Wait for reporting data from the server
1796 				halt_timeout = Tick64() + 60000ULL;
1797 			}
1798 		}
1799 
1800 		if (halt_timeout != 0)
1801 		{
1802 			bool ok = true;
1803 
1804 			// Wait that all TCP connections to finish processing
1805 			for (i = 0;i < LIST_NUM(w->SockList);i++)
1806 			{
1807 				TTC_SOCK *ts = LIST_DATA(w->SockList, i);
1808 
1809 				if (ts->Download == false)
1810 				{
1811 					if (ts->ServerUploadReportReceived == false)
1812 					{
1813 						ok = false;
1814 					}
1815 				}
1816 			}
1817 
1818 			if (ok)
1819 			{
1820 				// Measurement completed
1821 				w->Ok = true;
1822 				break;
1823 			}
1824 			else
1825 			{
1826 				if (halt_timeout <= Tick64())
1827 				{
1828 					// An error occured
1829 					ttc->AbnormalTerminated = true;
1830 					ttc->ErrorCode = ERR_PROTOCOL_ERROR;
1831 					break;
1832 				}
1833 			}
1834 		}
1835 
1836 		all_sockets_blocked = false;
1837 
1838 		// Continue to send and receive data
1839 		// until all sockets become block state
1840 		while (all_sockets_blocked == false)
1841 		{
1842 			all_sockets_blocked = true;
1843 
1844 			for (i = 0;i < LIST_NUM(w->SockList);i++)
1845 			{
1846 				UINT ret = SOCK_LATER;
1847 				TTC_SOCK *ts = LIST_DATA(w->SockList, i);
1848 				bool blocked_for_this_socket = false;
1849 				UCHAR c = 0;
1850 				UCHAR c_and_session_id[1 + sizeof(UINT64) + sizeof(UINT64)];
1851 
1852 				if (halt_timeout != 0)
1853 				{
1854 					if (ts->State != 3 && ts->State != 4)
1855 					{
1856 						if (ts->Download == false)
1857 						{
1858 							if (ts->State != 0)
1859 							{
1860 								ts->State = 3;
1861 							}
1862 							else
1863 							{
1864 								ts->ServerUploadReportReceived = true;
1865 								ts->State = 4;
1866 							}
1867 						}
1868 						else
1869 						{
1870 							ts->State = 4;
1871 						}
1872 					}
1873 				}
1874 
1875 				switch (ts->State)
1876 				{
1877 				case 0:
1878 					// Initial state: Specify the direction of
1879 					// the data flow between client-server
1880 					if (ts->Download)
1881 					{
1882 						c = 1;
1883 					}
1884 					else
1885 					{
1886 						c = 0;
1887 					}
1888 
1889 					c_and_session_id[0] = c;
1890 					WRITE_UINT64(c_and_session_id + 1, ttc->session_id);
1891 					WRITE_UINT64(c_and_session_id + sizeof(UINT64) + 1, ttc->Span);
1892 
1893 					ret = Send(ts->Sock, c_and_session_id, 1 + sizeof(UINT64) + sizeof(UINT64), false);
1894 
1895 					if (ret != 0 && ret != SOCK_LATER)
1896 					{
1897 						if (ts->Download)
1898 						{
1899 							ts->State = 1;
1900 						}
1901 						else
1902 						{
1903 							ts->State = 2;
1904 						}
1905 					}
1906 					break;
1907 
1908 				case 1:
1909 					// Server -> Client (download)
1910 					ret = Recv(ts->Sock, recv_buf_data, buf_size, false);
1911 					break;
1912 
1913 				case 2:
1914 					// Client -> Server (upload)
1915 					ret = Send(ts->Sock, send_buf_data, buf_size, false);
1916 					break;
1917 
1918 				case 3:
1919 					// Transmission completion client -> server (upload)
1920 					// Request the data size
1921 					if (ts->NextSendRequestReportTick == 0 ||
1922 						(Tick64() >= ts->NextSendRequestReportTick))
1923 					{
1924 						UCHAR suprise[MAX_SIZE];
1925 						UINT i;
1926 
1927 						ts->NextSendRequestReportTick = Tick64() + 200ULL;
1928 
1929 						for (i = 0;i < sizeof(suprise);i++)
1930 						{
1931 							suprise[i] = '!';
1932 						}
1933 
1934 						(void)Send(ts->Sock, suprise, sizeof(suprise), false);
1935 					}
1936 
1937 					ret = Recv(ts->Sock, &tmp64, sizeof(tmp64), false);
1938 					if (ret != 0 && ret != SOCK_LATER && ret == sizeof(tmp64))
1939 					{
1940 						ts->NumBytes = Endian64(tmp64);
1941 
1942 						ts->ServerUploadReportReceived = true;
1943 
1944 						ts->State = 4;
1945 					}
1946 					break;
1947 
1948 				case 4:
1949 					// Do Nothing
1950 					if (Recv(ts->Sock, recv_buf_data, buf_size, false) == SOCK_LATER)
1951 					{
1952 						ret = SOCK_LATER;
1953 					}
1954 					break;
1955 				}
1956 
1957 				if (ret == 0)
1958 				{
1959 					// The socket is disconnected
1960 					ttc->AbnormalTerminated = true;
1961 					ttc->ErrorCode = ERR_PROTOCOL_ERROR;
1962 					blocked_for_this_socket = true;
1963 					dont_block_next_time = false;
1964 
1965 					if (ts->HideErrMsg == false)
1966 					{
1967 						UniFormat(tmp, sizeof(tmp), _UU("TTC_COMM_DISCONNECTED"), ts->Id);
1968 						TtPrint(ttc->Param, ttc->Print, tmp);
1969 						ts->HideErrMsg = true;
1970 					}
1971 				}
1972 				else if (ret == SOCK_LATER)
1973 				{
1974 					// Delay has occurred
1975 					blocked_for_this_socket = true;
1976 					dont_block_next_time = false;
1977 				}
1978 				else
1979 				{
1980 					if (ts->Download)
1981 					{
1982 						ts->NumBytes += (UINT64)ret;
1983 					}
1984 				}
1985 
1986 				if (blocked_for_this_socket == false)
1987 				{
1988 					all_sockets_blocked = false;
1989 				}
1990 			}
1991 
1992 			if (ttc->Halt || (ttc->Cancel != NULL && (*ttc->Cancel)))
1993 			{
1994 				all_sockets_blocked = true;
1995 				dont_block_next_time = true;
1996 			}
1997 
1998 			if (ttc->end_tick <= Tick64())
1999 			{
2000 				all_sockets_blocked = true;
2001 				dont_block_next_time = true;
2002 			}
2003 		}
2004 	}
2005 
2006 	Free(send_buf_data);
2007 	Free(recv_buf_data);
2008 }
2009 
2010 // Client thread
TtcThread(THREAD * thread,void * param)2011 void TtcThread(THREAD *thread, void *param)
2012 {
2013 	TTC *ttc;
2014 	UINT i;
2015 	wchar_t tmp[MAX_SIZE];
2016 	bool ok = false;
2017 	IP ip_ret;
2018 	// Validate arguments
2019 	if (thread == NULL || param == NULL)
2020 	{
2021 		return;
2022 	}
2023 
2024 	ttc = (TTC *)param;
2025 
2026 	// Ready
2027 	NoticeThreadInit(thread);
2028 
2029 	TtcPrintSummary(ttc);
2030 
2031 	UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_START"),
2032 		ttc->Host, ttc->Port, ttc->NumTcp);
2033 	TtPrint(ttc->Param, ttc->Print, tmp);
2034 
2035 	// Establish all connections to the client
2036 	ttc->ItcSockList = NewList(NULL);
2037 
2038 	ok = true;
2039 
2040 	Zero(&ip_ret, sizeof(ip_ret));
2041 
2042 	for (i = 0;i < ttc->NumTcp;i++)
2043 	{
2044 		SOCK *s;
2045 		TTC_SOCK *ts = ZeroMalloc(sizeof(TTC_SOCK));
2046 		char target_host[MAX_SIZE];
2047 
2048 		ts->Id = i + 1;
2049 
2050 		if (ttc->Type == TRAFFIC_TYPE_DOWNLOAD)
2051 		{
2052 			ts->Download = true;
2053 		}
2054 		else if (ttc->Type == TRAFFIC_TYPE_UPLOAD)
2055 		{
2056 			ts->Download = false;
2057 		}
2058 		else
2059 		{
2060 			ts->Download = ((i % 2) == 0) ? true : false;
2061 		}
2062 
2063 		StrCpy(target_host, sizeof(target_host), ttc->Host);
2064 
2065 		if (IsZeroIp(&ip_ret) == false)
2066 		{
2067 			IPToStr(target_host, sizeof(target_host), &ip_ret);
2068 		}
2069 
2070 		s = ConnectEx4(target_host, ttc->Port, 0, ttc->Cancel, NULL, NULL, false, true, &ip_ret);
2071 
2072 		if (s == NULL)
2073 		{
2074 			UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_FAILED"), i + 1);
2075 			TtPrint(ttc->Param, ttc->Print, tmp);
2076 			ok = false;
2077 			Free(ts);
2078 			break;
2079 		}
2080 		else
2081 		{
2082 			char buffer[TRAFFIC_VER_STR_SIZE];
2083 
2084 			SetTimeout(s, 5000);
2085 
2086 			Zero(buffer, sizeof(buffer));
2087 			if (Recv(s, buffer, sizeof(buffer), false) != sizeof(buffer) || Cmp(buffer, TRAFFIC_VER_STR, TRAFFIC_VER_STR_SIZE) != 0)
2088 			{
2089 				TtPrint(ttc->Param, ttc->Print, _UU("TTC_CONNECT_NOT_SERVER"));
2090 				ok = false;
2091 				ReleaseSock(s);
2092 				Free(ts);
2093 				break;
2094 			}
2095 
2096 			UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_OK"), i + 1);
2097 			TtPrint(ttc->Param, ttc->Print, tmp);
2098 
2099 			UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_OK_2"), GetTtcTypeStr(ts->Download ? TRAFFIC_TYPE_DOWNLOAD : TRAFFIC_TYPE_UPLOAD));
2100 			TtPrint(ttc->Param, ttc->Print, tmp);
2101 
2102 			ts->Sock = s;
2103 
2104 			SetTimeout(s, TIMEOUT_INFINITE);
2105 		}
2106 
2107 		Insert(ttc->ItcSockList, ts);
2108 	}
2109 
2110 	Set(ttc->InitedEvent);
2111 
2112 	if (ttc->StartEvent != NULL)
2113 	{
2114 		Wait(ttc->StartEvent, INFINITE);
2115 		SleepThread(500);
2116 	}
2117 
2118 	if (ok)
2119 	{
2120 		UINT64 start_tick, end_tick;
2121 		wchar_t tmp1[MAX_SIZE], tmp2[MAX_SIZE];
2122 		UINT64 session_id = Rand64();
2123 		UINT i, num_cpu;
2124 		bool all_ok = false;
2125 
2126 		ttc->session_id = session_id;
2127 
2128 		num_cpu = GetNumberOfCpu();
2129 
2130 		ttc->WorkerThreadList = NewList(NULL);
2131 
2132 		for (i = 0;i < num_cpu;i++)
2133 		{
2134 			TTC_WORKER *w = ZeroMalloc(sizeof(TTC_WORKER));
2135 
2136 			w->Ttc = ttc;
2137 			w->SockList = NewList(NULL);
2138 			w->StartEvent = NewEvent();
2139 			w->SockEvent = NewSockEvent();
2140 
2141 			w->WorkerThread = NewThread(TtcWorkerThread, w);
2142 
2143 			WaitThreadInit(w->WorkerThread);
2144 
2145 			Add(ttc->WorkerThreadList, w);
2146 		}
2147 
2148 		// Assign each of sockets to each of worker threads
2149 		for (i = 0;i < LIST_NUM(ttc->ItcSockList);i++)
2150 		{
2151 			TTC_SOCK *ts = LIST_DATA(ttc->ItcSockList, i);
2152 			UINT num = LIST_NUM(ttc->WorkerThreadList);
2153 			UINT j = i % num;
2154 			TTC_WORKER *w = LIST_DATA(ttc->WorkerThreadList, j);
2155 
2156 			Add(w->SockList, ts);
2157 
2158 			JoinSockToSockEvent(ts->Sock, w->SockEvent);
2159 		}
2160 
2161 		// Record the current time
2162 		start_tick = Tick64();
2163 		end_tick = start_tick + ttc->Span;
2164 
2165 		ttc->start_tick = start_tick;
2166 		ttc->end_tick = end_tick;
2167 
2168 		// Set the start event for all worker threads
2169 		for (i = 0;i < LIST_NUM(ttc->WorkerThreadList);i++)
2170 		{
2171 			TTC_WORKER *w = LIST_DATA(ttc->WorkerThreadList, i);
2172 
2173 			Set(w->StartEvent);
2174 		}
2175 
2176 		// Show start message
2177 		GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(TickToTime(start_tick)), NULL);
2178 		GetDateTimeStrEx64(tmp2, sizeof(tmp2), SystemToLocal64(TickToTime(end_tick)), NULL);
2179 		UniFormat(tmp, sizeof(tmp), _UU("TTC_COMM_START"), tmp1, tmp2);
2180 		TtPrint(ttc->Param, ttc->Print, tmp);
2181 
2182 		// Wait for all worker threads finish
2183 		all_ok = true;
2184 		for (i = 0;i < LIST_NUM(ttc->WorkerThreadList);i++)
2185 		{
2186 			TTC_WORKER *w = LIST_DATA(ttc->WorkerThreadList, i);
2187 
2188 			WaitThread(w->WorkerThread, INFINITE);
2189 
2190 			if (w->Ok == false)
2191 			{
2192 				all_ok = false;
2193 			}
2194 		}
2195 
2196 		if (all_ok)
2197 		{
2198 			// Measurement completed
2199 			// Show the result
2200 			TtcGenerateResult(ttc);
2201 		}
2202 
2203 		// Release worker threads
2204 		for (i = 0;i < LIST_NUM(ttc->WorkerThreadList);i++)
2205 		{
2206 			TTC_WORKER *w = LIST_DATA(ttc->WorkerThreadList, i);
2207 
2208 			ReleaseThread(w->WorkerThread);
2209 
2210 			ReleaseEvent(w->StartEvent);
2211 			ReleaseList(w->SockList);
2212 
2213 			ReleaseSockEvent(w->SockEvent);
2214 
2215 			Free(w);
2216 		}
2217 
2218 		ReleaseList(ttc->WorkerThreadList);
2219 		ttc->WorkerThreadList = NULL;
2220 	}
2221 	else
2222 	{
2223 		// Abort
2224 		TtPrint(ttc->Param, ttc->Print, _UU("TTC_ERROR_ABORTED"));
2225 		ttc->ErrorCode = ERR_CONNECT_FAILED;
2226 	}
2227 
2228 	// Cleanup
2229 	for (i = 0;i < LIST_NUM(ttc->ItcSockList);i++)
2230 	{
2231 		TTC_SOCK *ts = LIST_DATA(ttc->ItcSockList, i);
2232 
2233 		Disconnect(ts->Sock);
2234 		ReleaseSock(ts->Sock);
2235 		Free(ts);
2236 	}
2237 
2238 	ReleaseList(ttc->ItcSockList);
2239 }
2240 
2241 // 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)2242 TTC *NewTtc(char *host, UINT port, UINT numtcp, UINT type, UINT64 span, bool dbl, bool raw, TT_PRINT_PROC *print_proc, void *param)
2243 {
2244 	return NewTtcEx(host, port, numtcp, type, span, dbl, raw, print_proc, param, NULL, NULL);
2245 }
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)2246 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)
2247 {
2248 	TTC *ttc;
2249 
2250 	ttc = ZeroMalloc(sizeof(TTC));
2251 	ttc->InitedEvent = NewEvent();
2252 	ttc->Port = port;
2253 	StrCpy(ttc->Host, sizeof(ttc->Host), host);
2254 	ttc->NumTcp = numtcp;
2255 	ttc->Type = type;
2256 	ttc->Span = span;
2257 	ttc->Double = dbl;
2258 	ttc->Raw = raw;
2259 	ttc->StartEvent = start_event;
2260 	ttc->Cancel = cancel;
2261 
2262 	if (ttc->Type == TRAFFIC_TYPE_FULL && ttc->NumTcp < 2)
2263 	{
2264 		ttc->NumTcp = 2;
2265 	}
2266 
2267 	ttc->Print = print_proc;
2268 	ttc->Param = param;
2269 	ttc->ErrorCode = ERR_NO_ERROR;
2270 
2271 	TtPrint(ttc->Param, ttc->Print, _UU("TTC_INIT"));
2272 
2273 	ttc->Thread = NewThread(TtcThread, ttc);
2274 	WaitThreadInit(ttc->Thread);
2275 
2276 	return ttc;
2277 }
2278 
2279 // Wait for stopping the communication throughput measurement client
FreeTtc(TTC * ttc,TT_RESULT * result)2280 UINT FreeTtc(TTC *ttc, TT_RESULT *result)
2281 {
2282 	UINT ret;
2283 	// Validate arguments
2284 	if (ttc == NULL)
2285 	{
2286 		return ERR_INVALID_PARAMETER;
2287 	}
2288 
2289 	WaitThread(ttc->Thread, INFINITE);
2290 	ReleaseThread(ttc->Thread);
2291 
2292 	TtPrint(ttc->Param, ttc->Print, _UU("TTC_FREE"));
2293 
2294 	ret = ttc->ErrorCode;
2295 
2296 	if (ret == ERR_NO_ERROR)
2297 	{
2298 		if (result != NULL)
2299 		{
2300 			Copy(result, &ttc->Result, sizeof(TT_RESULT));
2301 		}
2302 	}
2303 
2304 	ReleaseEvent(ttc->InitedEvent);
2305 
2306 	Free(ttc);
2307 
2308 	return ret;
2309 }
2310 
2311 // Start the communication throughput measurement server
NewTts(UINT port,void * param,TT_PRINT_PROC * print_proc)2312 TTS *NewTts(UINT port, void *param, TT_PRINT_PROC *print_proc)
2313 {
2314 	TTS *tts;
2315 	THREAD *t;
2316 
2317 	tts = ZeroMalloc(sizeof(TTS));
2318 	tts->Port = port;
2319 	tts->Param = param;
2320 	tts->Print = print_proc;
2321 
2322 	TtPrint(param, print_proc, _UU("TTS_INIT"));
2323 
2324 	tts->WorkerList = NewList(NULL);
2325 
2326 	// Creating a thread
2327 	t = NewThread(TtsListenThread, tts);
2328 	WaitThreadInit(t);
2329 
2330 	tts->Thread = t;
2331 
2332 	return tts;
2333 }
2334 
2335 // Wait for stopping the communication throughput measurement server
FreeTts(TTS * tts)2336 UINT FreeTts(TTS *tts)
2337 {
2338 	UINT ret;
2339 	// Validate arguments
2340 	if (tts == NULL)
2341 	{
2342 		return ERR_INVALID_PARAMETER;
2343 	}
2344 
2345 	TtPrint(tts->Param, tts->Print, _UU("TTS_STOP_INIT"));
2346 
2347 	tts->Halt = true;
2348 	Disconnect(tts->ListenSocket);
2349 	ReleaseSock(tts->ListenSocket);
2350 	Disconnect(tts->ListenSocketV6);
2351 	ReleaseSock(tts->ListenSocketV6);
2352 
2353 	// Wait for the termination of the thread
2354 	WaitThread(tts->Thread, INFINITE);
2355 
2356 	ReleaseThread(tts->Thread);
2357 
2358 	TtPrint(tts->Param, tts->Print, _UU("TTS_STOP_FINISHED"));
2359 
2360 	ret = tts->ErrorCode;
2361 
2362 	ReleaseList(tts->WorkerList);
2363 
2364 	Free(tts);
2365 
2366 	return ret;
2367 }
2368 
2369 // Show the measurement tools prompt
PtTrafficPrintProc(void * param,wchar_t * str)2370 void PtTrafficPrintProc(void *param, wchar_t *str)
2371 {
2372 	CONSOLE *c;
2373 	// Validate arguments
2374 	if (param == NULL || str == NULL)
2375 	{
2376 		return;
2377 	}
2378 
2379 	c = (CONSOLE *)param;
2380 
2381 	if (c->ConsoleType == CONSOLE_LOCAL)
2382 	{
2383 		Lock(c->OutputLock);
2384 		{
2385 			wchar_t tmp[MAX_SIZE];
2386 
2387 			// Display only if the local console
2388 			// (Can not be displayed because threads aren't synchronized otherwise?)
2389 			UniStrCpy(tmp, sizeof(tmp), str);
2390 			if (UniEndWith(str, L"\n") == false)
2391 			{
2392 				UniStrCat(tmp, sizeof(tmp), L"\n");
2393 			}
2394 			UniPrint(L"%s", tmp);
2395 		}
2396 		Unlock(c->OutputLock);
2397 	}
2398 }
2399 
2400 // Display the communication throughput results
TtcPrintResult(CONSOLE * c,TT_RESULT * res)2401 void TtcPrintResult(CONSOLE *c, TT_RESULT *res)
2402 {
2403 	CT *ct;
2404 	wchar_t tmp[MAX_SIZE];
2405 	wchar_t tmp1[MAX_SIZE];
2406 	wchar_t tmp2[MAX_SIZE];
2407 	char str[MAX_SIZE];
2408 	// Validate arguments
2409 	if (c == NULL || res == NULL)
2410 	{
2411 		return;
2412 	}
2413 
2414 	c->Write(c, _UU("TTC_RES_TITLE"));
2415 
2416 	ct = CtNew();
2417 	CtInsertColumn(ct, _UU("TTC_RES_COLUMN_1"), false);
2418 	CtInsertColumn(ct, _UU("TTC_RES_COLUMN_2"), true);
2419 	CtInsertColumn(ct, _UU("TTC_RES_COLUMN_3"), true);
2420 
2421 	// Time that was used to measure
2422 	GetSpanStrMilli(str, sizeof(str), res->Span);
2423 	StrToUni(tmp, sizeof(tmp), str);
2424 	CtInsert(ct, _UU("TTC_RES_SPAN"), tmp, L"");
2425 
2426 	// Correct the data for Ethernet frame
2427 	CtInsert(ct, _UU("TTC_RES_ETHER"), res->Raw ? _UU("SEC_NO") : _UU("SEC_YES"), L"");
2428 
2429 	// Amount of communication data of download direction
2430 	ToStr3(str, sizeof(str), res->NumBytesDownload);
2431 	UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);
2432 	ToStrByte1000(str, sizeof(str), res->NumBytesDownload);
2433 	StrToUni(tmp2, sizeof(tmp2), str);
2434 	CtInsert(ct, _UU("TTC_RES_BYTES_DOWNLOAD"), tmp1, tmp2);
2435 
2436 	// Amount of communication data of upload direction
2437 	ToStr3(str, sizeof(str), res->NumBytesUpload);
2438 	UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);
2439 	ToStrByte1000(str, sizeof(str), res->NumBytesUpload);
2440 	StrToUni(tmp2, sizeof(tmp2), str);
2441 	CtInsert(ct, _UU("TTC_RES_BYTES_UPLOAD"), tmp1, tmp2);
2442 
2443 	// Total amount of communication data
2444 	ToStr3(str, sizeof(str), res->NumBytesTotal);
2445 	UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);
2446 	ToStrByte1000(str, sizeof(str), res->NumBytesTotal);
2447 	StrToUni(tmp2, sizeof(tmp2), str);
2448 	CtInsert(ct, _UU("TTC_RES_BYTES_TOTAL"), tmp1, tmp2);
2449 
2450 	// Calculate the total throughput of input and output of the relay equipment
2451 	CtInsert(ct, _UU("TTC_RES_DOUBLE"), (res->Double == false) ? _UU("SEC_NO") : _UU("SEC_YES"), L"");
2452 
2453 	// Average throughput of download direction
2454 	ToStr3(str, sizeof(str), res->BpsDownload);
2455 	UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);
2456 	ToStrByte1000(str, sizeof(str), res->BpsDownload);
2457 	ReplaceStr(str, sizeof(str), str, "Bytes", "bps");
2458 	StrToUni(tmp2, sizeof(tmp2), str);
2459 	CtInsert(ct, _UU("TTC_RES_BPS_DOWNLOAD"), tmp1, tmp2);
2460 
2461 	// Average throughput of upload direction
2462 	ToStr3(str, sizeof(str), res->BpsUpload);
2463 	UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);
2464 	ToStrByte1000(str, sizeof(str), res->BpsUpload);
2465 	ReplaceStr(str, sizeof(str), str, "Bytes", "bps");
2466 	StrToUni(tmp2, sizeof(tmp2), str);
2467 	CtInsert(ct, _UU("TTC_RES_BPS_UPLOAD"), tmp1, tmp2);
2468 
2469 	// Total average throughput
2470 	ToStr3(str, sizeof(str), res->BpsTotal);
2471 	UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);
2472 	ToStrByte1000(str, sizeof(str), res->BpsTotal);
2473 	ReplaceStr(str, sizeof(str), str, "Bytes", "bps");
2474 	StrToUni(tmp2, sizeof(tmp2), str);
2475 	CtInsert(ct, _UU("TTC_RES_BPS_TOTAL"), tmp1, tmp2);
2476 
2477 	CtFree(ct, c);
2478 }
2479 
2480 // Execute the communication throughput measurement tool server
PtTrafficServer(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)2481 UINT PtTrafficServer(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
2482 {
2483 	LIST *o;
2484 	UINT ret = ERR_NO_ERROR;
2485 	UINT port;
2486 	bool nohup;
2487 	TTS *tts;
2488 	PARAM args[] =
2489 	{
2490 		{"[port]", NULL, NULL, NULL, NULL},
2491 		{"NOHUP", NULL, NULL, NULL, NULL},
2492 	};
2493 
2494 	// Get the parameter list
2495 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
2496 	if (o == NULL)
2497 	{
2498 		return ERR_INVALID_PARAMETER;
2499 	}
2500 
2501 	port = GetParamInt(o, "[port]");
2502 	if (port == 0)
2503 	{
2504 		port = TRAFFIC_DEFAULT_PORT;
2505 	}
2506 
2507 	nohup = GetParamYes(o, "nohup");
2508 
2509 	tts = NewTts(port, c, PtTrafficPrintProc);
2510 
2511 	if (nohup)
2512 	{
2513 		while (true)
2514 		{
2515 			SleepThread(10000);
2516 		}
2517 	}
2518 
2519 	c->Write(c, _UU("TTS_ENTER_TO_EXIT"));
2520 
2521 	Free(c->ReadLine(c, L"", true));
2522 
2523 	ret = tts->ErrorCode;
2524 
2525 	FreeTts(tts);
2526 
2527 	if (ret != ERR_NO_ERROR)
2528 	{
2529 		CmdPrintError(c, ret);
2530 	}
2531 
2532 	// Release of the parameter list
2533 	FreeParamValueList(o);
2534 
2535 	return ret;
2536 }
2537 
2538 // Execute the communication throughput measurement tool client
PtTrafficClient(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)2539 UINT PtTrafficClient(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
2540 {
2541 	TTC *ttc;
2542 	LIST *o;
2543 	UINT ret = ERR_NO_ERROR;
2544 	char *host = NULL;
2545 	UINT port;
2546 	UINT num, type;
2547 	bool dbl = false, raw = false;
2548 	UINT64 span;
2549 	// Parameter list that can be specified
2550 	CMD_EVAL_MIN_MAX minmax =
2551 	{
2552 		"CMD_TrafficClient_EVAL_NUMTCP",
2553 		0, TRAFFIC_NUMTCP_MAX,
2554 	};
2555 	PARAM args[] =
2556 	{
2557 		{"[host:port]", CmdPrompt, _UU("CMD_TrafficClient_PROMPT_HOST"), CmdEvalNotEmpty, NULL},
2558 		{"NUMTCP", NULL, NULL, CmdEvalMinMax, &minmax},
2559 		{"TYPE", NULL, NULL, NULL, NULL},
2560 		{"SPAN", NULL, NULL, NULL, NULL},
2561 		{"DOUBLE", NULL, NULL, NULL, NULL},
2562 		{"RAW", NULL, NULL, NULL, NULL},
2563 	};
2564 
2565 	// Get the parameter list
2566 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
2567 	if (o == NULL)
2568 	{
2569 		return ERR_INVALID_PARAMETER;
2570 	}
2571 
2572 	if (ParseHostPort(GetParamStr(o, "[host:port]"), &host, &port, TRAFFIC_DEFAULT_PORT) == false)
2573 	{
2574 		c->Write(c, _UU("CMD_TrafficClient_ERROR_HOSTPORT"));
2575 		ret = ERR_INVALID_PARAMETER;
2576 	}
2577 	else
2578 	{
2579 		char *s;
2580 		UINT i;
2581 
2582 		Trim(host);
2583 
2584 		num = GetParamInt(o, "NUMTCP");
2585 		if (num == 0)
2586 		{
2587 			num = TRAFFIC_NUMTCP_DEFAULT;
2588 		}
2589 		s = GetParamStr(o, "TYPE");
2590 
2591 		if (StartWith("download", s))
2592 		{
2593 			type = TRAFFIC_TYPE_DOWNLOAD;
2594 		}
2595 		else if (StartWith("upload", s))
2596 		{
2597 			type = TRAFFIC_TYPE_UPLOAD;
2598 		}
2599 		else
2600 		{
2601 			type = TRAFFIC_TYPE_FULL;
2602 		}
2603 
2604 		i = GetParamInt(o, "SPAN");
2605 
2606 		if (i == 0)
2607 		{
2608 			i = TRAFFIC_SPAN_DEFAULT;
2609 		}
2610 
2611 		span = (UINT64)i * 1000ULL;
2612 
2613 		dbl = GetParamYes(o, "DOUBLE");
2614 		raw = GetParamYes(o, "RAW");
2615 
2616 		if (type == TRAFFIC_TYPE_FULL)
2617 		{
2618 			if ((num % 2) != 0)
2619 			{
2620 				ret = ERR_INVALID_PARAMETER;
2621 				c->Write(c, _UU("CMD_TrafficClient_ERROR_NUMTCP"));
2622 			}
2623 		}
2624 
2625 		if (ret == ERR_NO_ERROR)
2626 		{
2627 			TT_RESULT result;
2628 			ttc = NewTtc(host, port, num, type, span, dbl, raw, PtTrafficPrintProc, c);
2629 
2630 			if (c->ConsoleType == CONSOLE_LOCAL)
2631 			{
2632 				if (c->Param != NULL && (((LOCAL_CONSOLE_PARAM *)c->Param)->InBuf == NULL))
2633 				{
2634 //					c->Write(c, _UU("TTC_ENTER_TO_EXIT"));
2635 //					GetLine(NULL, 0);
2636 //					StopTtc(ttc);
2637 				}
2638 			}
2639 
2640 
2641 			Zero(&result, sizeof(result));
2642 			ret = FreeTtc(ttc, &result);
2643 
2644 			if (ret == ERR_NO_ERROR)
2645 			{
2646 				TtcPrintResult(c, &result);
2647 			}
2648 		}
2649 	}
2650 
2651 	if (ret != ERR_NO_ERROR)
2652 	{
2653 		CmdPrintError(c, ret);
2654 	}
2655 
2656 	// Release of the parameter list
2657 	FreeParamValueList(o);
2658 
2659 	Free(host);
2660 
2661 	return ret;
2662 }
2663 
2664 // Certificate easy creation tool (1024 bit)
PtMakeCert(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)2665 UINT PtMakeCert(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
2666 {
2667 	LIST *o;
2668 	UINT ret = ERR_NO_ERROR;
2669 	X *x = NULL;
2670 	K *pub = NULL;
2671 	K *pri = NULL;
2672 	NAME *n;
2673 	X_SERIAL *x_serial = NULL;
2674 	BUF *buf;
2675 	UINT days;
2676 	X *root_x = NULL;
2677 	K *root_k = NULL;
2678 	// Parameter list that can be specified
2679 	CMD_EVAL_MIN_MAX minmax =
2680 	{
2681 		"CMD_MakeCert_EVAL_EXPIRES",
2682 		0,
2683 		10950,
2684 	};
2685 	PARAM args[] =
2686 	{
2687 		{"CN", CmdPrompt, _UU("CMD_MakeCert_PROMPT_CN"), NULL, NULL},
2688 		{"O", CmdPrompt, _UU("CMD_MakeCert_PROMPT_O"), NULL, NULL},
2689 		{"OU", CmdPrompt, _UU("CMD_MakeCert_PROMPT_OU"), NULL, NULL},
2690 		{"C", CmdPrompt, _UU("CMD_MakeCert_PROMPT_C"), NULL, NULL},
2691 		{"ST", CmdPrompt, _UU("CMD_MakeCert_PROMPT_ST"), NULL, NULL},
2692 		{"L", CmdPrompt, _UU("CMD_MakeCert_PROMPT_L"), NULL, NULL},
2693 		{"SERIAL", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SERIAL"), NULL, NULL},
2694 		{"EXPIRES", CmdPrompt, _UU("CMD_MakeCert_PROMPT_EXPIRES"), CmdEvalMinMax, &minmax},
2695 		{"SIGNCERT", NULL, NULL, CmdEvalIsFile, NULL},
2696 		{"SIGNKEY", NULL, NULL, CmdEvalIsFile, NULL},
2697 		{"SAVECERT", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},
2698 		{"SAVEKEY", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVEKEY"), CmdEvalNotEmpty, NULL},
2699 	};
2700 
2701 	// Get the parameter list
2702 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
2703 	if (o == NULL)
2704 	{
2705 		return ERR_INVALID_PARAMETER;
2706 	}
2707 
2708 	if (IsEmptyStr(GetParamStr(o, "SIGNCERT")) == false && IsEmptyStr(GetParamStr(o, "SIGNKEY")) == false)
2709 	{
2710 		root_x = FileToXW(GetParamUniStr(o, "SIGNCERT"));
2711 		root_k = FileToKW(GetParamUniStr(o, "SIGNKEY"), true, NULL);
2712 
2713 		if (root_x == NULL || root_k == NULL || CheckXandK(root_x, root_k) == false)
2714 		{
2715 			ret = ERR_INTERNAL_ERROR;
2716 
2717 			c->Write(c, _UU("CMD_MakeCert_ERROR_SIGNKEY"));
2718 		}
2719 	}
2720 
2721 	if (ret == ERR_NO_ERROR)
2722 	{
2723 		buf = StrToBin(GetParamStr(o, "SERIAL"));
2724 		if (buf != NULL && buf->Size >= 1)
2725 		{
2726 			x_serial = NewXSerial(buf->Buf, buf->Size);
2727 		}
2728 		FreeBuf(buf);
2729 
2730 		n = NewName(GetParamUniStr(o, "CN"), GetParamUniStr(o, "O"), GetParamUniStr(o, "OU"),
2731 			GetParamUniStr(o, "C"), GetParamUniStr(o, "ST"), GetParamUniStr(o, "L"));
2732 
2733 		days = GetParamInt(o, "EXPIRES");
2734 		if (days == 0)
2735 		{
2736 			days = 3650;
2737 		}
2738 
2739 		RsaGen(&pri, &pub, 1024);
2740 
2741 		if (root_x == NULL)
2742 		{
2743 			x = NewRootX(pub, pri, n, days, x_serial);
2744 		}
2745 		else
2746 		{
2747 			x = NewX(pub, root_k, root_x, n, days, x_serial);
2748 		}
2749 
2750 		FreeXSerial(x_serial);
2751 		FreeName(n);
2752 
2753 		if (x == NULL)
2754 		{
2755 			ret = ERR_INTERNAL_ERROR;
2756 			c->Write(c, _UU("CMD_MakeCert_ERROR_GEN_FAILED"));
2757 		}
2758 		else
2759 		{
2760 			if (XToFileW(x, GetParamUniStr(o, "SAVECERT"), true) == false)
2761 			{
2762 				c->Write(c, _UU("CMD_SAVECERT_FAILED"));
2763 			}
2764 			else if (KToFileW(pri, GetParamUniStr(o, "SAVEKEY"), true, NULL) == false)
2765 			{
2766 				c->Write(c, _UU("CMD_SAVEKEY_FAILED"));
2767 			}
2768 		}
2769 	}
2770 
2771 	if (ret != ERR_NO_ERROR)
2772 	{
2773 		// Error has occurred
2774 		CmdPrintError(c, ret);
2775 	}
2776 
2777 	// Release of the parameter list
2778 	FreeParamValueList(o);
2779 
2780 	FreeX(root_x);
2781 	FreeK(root_k);
2782 
2783 	FreeX(x);
2784 	FreeK(pri);
2785 	FreeK(pub);
2786 
2787 	return ret;
2788 }
2789 
2790 // Certificate easy creation tool (2048 bit)
PtMakeCert2048(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)2791 UINT PtMakeCert2048(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
2792 {
2793 	LIST *o;
2794 	UINT ret = ERR_NO_ERROR;
2795 	X *x = NULL;
2796 	K *pub = NULL;
2797 	K *pri = NULL;
2798 	NAME *n;
2799 	X_SERIAL *x_serial = NULL;
2800 	BUF *buf;
2801 	UINT days;
2802 	X *root_x = NULL;
2803 	K *root_k = NULL;
2804 	// Parameter list that can be specified
2805 	CMD_EVAL_MIN_MAX minmax =
2806 	{
2807 		"CMD_MakeCert_EVAL_EXPIRES",
2808 		0,
2809 		10950,
2810 	};
2811 	PARAM args[] =
2812 	{
2813 		{"CN", CmdPrompt, _UU("CMD_MakeCert_PROMPT_CN"), NULL, NULL},
2814 		{"O", CmdPrompt, _UU("CMD_MakeCert_PROMPT_O"), NULL, NULL},
2815 		{"OU", CmdPrompt, _UU("CMD_MakeCert_PROMPT_OU"), NULL, NULL},
2816 		{"C", CmdPrompt, _UU("CMD_MakeCert_PROMPT_C"), NULL, NULL},
2817 		{"ST", CmdPrompt, _UU("CMD_MakeCert_PROMPT_ST"), NULL, NULL},
2818 		{"L", CmdPrompt, _UU("CMD_MakeCert_PROMPT_L"), NULL, NULL},
2819 		{"SERIAL", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SERIAL"), NULL, NULL},
2820 		{"EXPIRES", CmdPrompt, _UU("CMD_MakeCert_PROMPT_EXPIRES"), CmdEvalMinMax, &minmax},
2821 		{"SIGNCERT", NULL, NULL, CmdEvalIsFile, NULL},
2822 		{"SIGNKEY", NULL, NULL, CmdEvalIsFile, NULL},
2823 		{"SAVECERT", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},
2824 		{"SAVEKEY", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVEKEY"), CmdEvalNotEmpty, NULL},
2825 	};
2826 
2827 	// Get the parameter list
2828 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
2829 	if (o == NULL)
2830 	{
2831 		return ERR_INVALID_PARAMETER;
2832 	}
2833 
2834 	if (IsEmptyStr(GetParamStr(o, "SIGNCERT")) == false && IsEmptyStr(GetParamStr(o, "SIGNKEY")) == false)
2835 	{
2836 		root_x = FileToXW(GetParamUniStr(o, "SIGNCERT"));
2837 		root_k = FileToKW(GetParamUniStr(o, "SIGNKEY"), true, NULL);
2838 
2839 		if (root_x == NULL || root_k == NULL || CheckXandK(root_x, root_k) == false)
2840 		{
2841 			ret = ERR_INTERNAL_ERROR;
2842 
2843 			c->Write(c, _UU("CMD_MakeCert_ERROR_SIGNKEY"));
2844 		}
2845 	}
2846 
2847 	if (ret == ERR_NO_ERROR)
2848 	{
2849 		buf = StrToBin(GetParamStr(o, "SERIAL"));
2850 		if (buf != NULL && buf->Size >= 1)
2851 		{
2852 			x_serial = NewXSerial(buf->Buf, buf->Size);
2853 		}
2854 		FreeBuf(buf);
2855 
2856 		n = NewName(GetParamUniStr(o, "CN"), GetParamUniStr(o, "O"), GetParamUniStr(o, "OU"),
2857 			GetParamUniStr(o, "C"), GetParamUniStr(o, "ST"), GetParamUniStr(o, "L"));
2858 
2859 		days = GetParamInt(o, "EXPIRES");
2860 		if (days == 0)
2861 		{
2862 			days = 3650;
2863 		}
2864 
2865 		RsaGen(&pri, &pub, 2048);
2866 
2867 		if (root_x == NULL)
2868 		{
2869 			x = NewRootX(pub, pri, n, days, x_serial);
2870 		}
2871 		else
2872 		{
2873 			x = NewX(pub, root_k, root_x, n, days, x_serial);
2874 		}
2875 
2876 		FreeXSerial(x_serial);
2877 		FreeName(n);
2878 
2879 		if (x == NULL)
2880 		{
2881 			ret = ERR_INTERNAL_ERROR;
2882 			c->Write(c, _UU("CMD_MakeCert_ERROR_GEN_FAILED"));
2883 		}
2884 		else
2885 		{
2886 			if (XToFileW(x, GetParamUniStr(o, "SAVECERT"), true) == false)
2887 			{
2888 				c->Write(c, _UU("CMD_SAVECERT_FAILED"));
2889 			}
2890 			else if (KToFileW(pri, GetParamUniStr(o, "SAVEKEY"), true, NULL) == false)
2891 			{
2892 				c->Write(c, _UU("CMD_SAVEKEY_FAILED"));
2893 			}
2894 		}
2895 	}
2896 
2897 	if (ret != ERR_NO_ERROR)
2898 	{
2899 		// Error has occurred
2900 		CmdPrintError(c, ret);
2901 	}
2902 
2903 	// Release of the parameter list
2904 	FreeParamValueList(o);
2905 
2906 	FreeX(root_x);
2907 	FreeK(root_k);
2908 
2909 	FreeX(x);
2910 	FreeK(pri);
2911 	FreeK(pub);
2912 
2913 	return ret;
2914 }
2915 
2916 // Client management tool main
PcMain(PC * pc)2917 void PcMain(PC *pc)
2918 {
2919 	char prompt[MAX_SIZE];
2920 	wchar_t tmp[MAX_SIZE];
2921 	// Validate arguments
2922 	if (pc == NULL)
2923 	{
2924 		return;
2925 	}
2926 
2927 	// Display a message that the connection has been made
2928 	UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_CLIENT_CONNECTED"),
2929 		pc->ServerName);
2930 	pc->Console->Write(pc->Console, tmp);
2931 	pc->Console->Write(pc->Console, L"");
2932 
2933 	while (true)
2934 	{
2935 		// Definition of command
2936 		CMD cmd[] =
2937 		{
2938 			{"About", PsAbout},
2939 			{"Check", PtCheck},
2940 			{"VersionGet", PcVersionGet},
2941 			{"PasswordSet", PcPasswordSet},
2942 			{"PasswordGet", PcPasswordGet},
2943 			{"CertList", PcCertList},
2944 			{"CertAdd", PcCertAdd},
2945 			{"CertDelete", PcCertDelete},
2946 			{"CertGet", PcCertGet},
2947 			{"SecureList", PcSecureList},
2948 			{"SecureSelect", PcSecureSelect},
2949 			{"SecureGet", PcSecureGet},
2950 			{"NicCreate", PcNicCreate},
2951 			{"NicDelete", PcNicDelete},
2952 			{"NicUpgrade", PcNicUpgrade},
2953 			{"NicGetSetting", PcNicGetSetting},
2954 			{"NicSetSetting", PcNicSetSetting},
2955 			{"NicEnable", PcNicEnable},
2956 			{"NicDisable", PcNicDisable},
2957 			{"NicList", PcNicList},
2958 			{"AccountList", PcAccountList},
2959 			{"AccountCreate", PcAccountCreate},
2960 			{"AccountSet", PcAccountSet},
2961 			{"AccountGet", PcAccountGet},
2962 			{"AccountDelete", PcAccountDelete},
2963 			{"AccountUsernameSet", PcAccountUsernameSet},
2964 			{"AccountAnonymousSet", PcAccountAnonymousSet},
2965 			{"AccountPasswordSet", PcAccountPasswordSet},
2966 			{"AccountCertSet", PcAccountCertSet},
2967 			{"AccountCertGet", PcAccountCertGet},
2968 			{"AccountEncryptDisable", PcAccountEncryptDisable},
2969 			{"AccountEncryptEnable", PcAccountEncryptEnable},
2970 			{"AccountCompressEnable", PcAccountCompressEnable},
2971 			{"AccountCompressDisable", PcAccountCompressDisable},
2972 			{"AccountHttpHeaderAdd", PcAccountHttpHeaderAdd},
2973 			{"AccountHttpHeaderDelete", PcAccountHttpHeaderDelete},
2974 			{"AccountHttpHeaderGet", PcAccountHttpHeaderGet},
2975 			{"AccountProxyNone", PcAccountProxyNone},
2976 			{"AccountProxyHttp", PcAccountProxyHttp},
2977 			{"AccountProxySocks", PcAccountProxySocks},
2978 			{"AccountProxySocks5", PcAccountProxySocks5},
2979 			{"AccountServerCertEnable", PcAccountServerCertEnable},
2980 			{"AccountServerCertDisable", PcAccountServerCertDisable},
2981 			{"AccountRetryOnServerCertEnable", PcAccountRetryOnServerCertEnable},
2982 			{"AccountRetryOnServerCertDisable", PcAccountRetryOnServerCertDisable},
2983 			{"AccountServerCertSet", PcAccountServerCertSet},
2984 			{"AccountServerCertDelete", PcAccountServerCertDelete},
2985 			{"AccountServerCertGet", PcAccountServerCertGet},
2986 			{"AccountDetailSet", PcAccountDetailSet},
2987 			{"AccountRename", PcAccountRename},
2988 			{"AccountConnect", PcAccountConnect},
2989 			{"AccountDisconnect", PcAccountDisconnect},
2990 			{"AccountStatusGet", PcAccountStatusGet},
2991 			{"AccountNicSet", PcAccountNicSet},
2992 			{"AccountStatusShow", PcAccountStatusShow},
2993 			{"AccountStatusHide", PcAccountStatusHide},
2994 			{"AccountSecureCertSet", PcAccountSecureCertSet},
2995 			{"AccountOpensslEngineCertSet", PcAccountOpensslEngineCertSet},
2996 			{"AccountRetrySet", PcAccountRetrySet},
2997 			{"AccountStartupSet", PcAccountStartupSet},
2998 			{"AccountStartupRemove", PcAccountStartupRemove},
2999 			{"AccountExport", PcAccountExport},
3000 			{"AccountImport", PcAccountImport},
3001 			{"RemoteEnable", PcRemoteEnable},
3002 			{"RemoteDisable", PcRemoteDisable},
3003 			{"KeepEnable", PcKeepEnable},
3004 			{"KeepDisable", PcKeepDisable},
3005 			{"KeepSet", PcKeepSet},
3006 			{"KeepGet", PcKeepGet},
3007 			{"MakeCert", PtMakeCert},
3008 			{"MakeCert2048", PtMakeCert2048},
3009 			{"TrafficClient", PtTrafficClient},
3010 			{"TrafficServer", PtTrafficServer},
3011 		};
3012 
3013 		// Generate a prompt
3014 		StrCpy(prompt, sizeof(prompt), "VPN Client>");
3015 
3016 		if (DispatchNextCmdEx(pc->Console, pc->CmdLine, prompt, cmd, sizeof(cmd) / sizeof(cmd[0]), pc) == false)
3017 		{
3018 			break;
3019 		}
3020 		pc->LastError = pc->Console->RetCode;
3021 
3022 		if (pc->LastError == ERR_NO_ERROR && pc->Console->ConsoleType != CONSOLE_CSV)
3023 		{
3024 			pc->Console->Write(pc->Console, _UU("CMD_MSG_OK"));
3025 			pc->Console->Write(pc->Console, L"");
3026 		}
3027 
3028 		if (pc->CmdLine != NULL)
3029 		{
3030 			break;
3031 		}
3032 	}
3033 }
3034 
3035 // Retrieve the version information of VPN Client service
PcVersionGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3036 UINT PcVersionGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3037 {
3038 	LIST *o;
3039 	PC *pc = (PC *)param;
3040 	UINT ret = ERR_NO_ERROR;
3041 	RPC_CLIENT_VERSION t;
3042 
3043 	// Get the parameter list
3044 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
3045 	if (o == NULL)
3046 	{
3047 		return ERR_INVALID_PARAMETER;
3048 	}
3049 
3050 	// RPC call
3051 	Zero(&t, sizeof(t));
3052 
3053 	ret = CcGetClientVersion(pc->RemoteClient, &t);
3054 
3055 	if (ret == ERR_NO_ERROR)
3056 	{
3057 		wchar_t tmp[MAX_SIZE];
3058 		CT *ct;
3059 
3060 		// Success
3061 		ct = CtNewStandard();
3062 
3063 		StrToUni(tmp, sizeof(tmp), t.ClientProductName);
3064 		CtInsert(ct, _UU("CMD_VersionGet_1"), tmp);
3065 
3066 		StrToUni(tmp, sizeof(tmp), t.ClientVersionString);
3067 		CtInsert(ct, _UU("CMD_VersionGet_2"), tmp);
3068 
3069 		StrToUni(tmp, sizeof(tmp), t.ClientBuildInfoString);
3070 		CtInsert(ct, _UU("CMD_VersionGet_3"), tmp);
3071 
3072 		UniToStru(tmp, t.ProcessId);
3073 		CtInsert(ct, _UU("CMD_VersionGet_4"), tmp);
3074 
3075 		StrToUni(tmp, sizeof(tmp), OsTypeToStr(t.OsType));
3076 		CtInsert(ct, _UU("CMD_VersionGet_5"), tmp);
3077 
3078 		CtFree(ct, c);
3079 	}
3080 
3081 	if (ret != ERR_NO_ERROR)
3082 	{
3083 		// Error has occurred
3084 		CmdPrintError(c, ret);
3085 	}
3086 
3087 	// Release the parameter list
3088 	FreeParamValueList(o);
3089 
3090 	return ret;
3091 }
3092 
3093 // Set a password to connect to the VPN Client Service
PcPasswordSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3094 UINT PcPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3095 {
3096 	LIST *o;
3097 	PC *pc = (PC *)param;
3098 	UINT ret = ERR_NO_ERROR;
3099 	RPC_CLIENT_PASSWORD t;
3100 	// Parameter list that can be specified
3101 	PARAM args[] =
3102 	{
3103 		{"[password]", CmdPromptChoosePassword, NULL, NULL, NULL},
3104 		{"REMOTEONLY", NULL, NULL, NULL, NULL},
3105 	};
3106 
3107 	// Get the parameter list
3108 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3109 	if (o == NULL)
3110 	{
3111 		return ERR_INVALID_PARAMETER;
3112 	}
3113 
3114 	// RPC call
3115 	Zero(&t, sizeof(t));
3116 	StrCpy(t.Password, sizeof(t.Password), GetParamStr(o, "[password]"));
3117 	t.PasswordRemoteOnly = GetParamYes(o, "REMOTEONLY");
3118 
3119 	ret = CcSetPassword(pc->RemoteClient, &t);
3120 
3121 	if (ret == ERR_NO_ERROR)
3122 	{
3123 		// Success
3124 	}
3125 
3126 	if (ret != ERR_NO_ERROR)
3127 	{
3128 		// Error has occurred
3129 		CmdPrintError(c, ret);
3130 	}
3131 
3132 	// Release of the parameter list
3133 	FreeParamValueList(o);
3134 
3135 	return ret;
3136 }
3137 
3138 // Get the settings of the password to connect to the VPN Client service
PcPasswordGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3139 UINT PcPasswordGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3140 {
3141 	LIST *o;
3142 	PC *pc = (PC *)param;
3143 	UINT ret = ERR_NO_ERROR;
3144 	RPC_CLIENT_PASSWORD_SETTING t;
3145 
3146 	// Get the parameter list
3147 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
3148 	if (o == NULL)
3149 	{
3150 		return ERR_INVALID_PARAMETER;
3151 	}
3152 
3153 	// RPC call
3154 	Zero(&t, sizeof(t));
3155 
3156 	ret = CcGetPasswordSetting(pc->RemoteClient, &t);
3157 
3158 	if (ret == ERR_NO_ERROR)
3159 	{
3160 		// Success
3161 		CT *ct = CtNewStandard();
3162 
3163 		CtInsert(ct, _UU("CMD_PasswordGet_1"),
3164 			t.IsPasswordPresented ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
3165 
3166 		CtInsert(ct, _UU("CMD_PasswordGet_2"),
3167 			t.PasswordRemoteOnly ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
3168 
3169 		CtFree(ct, c);
3170 	}
3171 
3172 	if (ret != ERR_NO_ERROR)
3173 	{
3174 		// Error has occurred
3175 		CmdPrintError(c, ret);
3176 	}
3177 
3178 	// Release the parameter list
3179 	FreeParamValueList(o);
3180 
3181 	return ret;
3182 }
3183 
3184 // Get the list of certificates of the trusted certification authority
PcCertList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3185 UINT PcCertList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3186 {
3187 	LIST *o;
3188 	PC *pc = (PC *)param;
3189 	UINT ret = ERR_NO_ERROR;
3190 	RPC_CLIENT_ENUM_CA t;
3191 
3192 	// Get the parameter list
3193 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
3194 	if (o == NULL)
3195 	{
3196 		return ERR_INVALID_PARAMETER;
3197 	}
3198 
3199 	// RPC call
3200 	Zero(&t, sizeof(t));
3201 
3202 	ret = CcEnumCa(pc->RemoteClient, &t);
3203 
3204 	if (ret == ERR_NO_ERROR)
3205 	{
3206 		// Success
3207 		UINT i;
3208 		CT *ct = CtNewStandard();
3209 
3210 		for (i = 0;i < t.NumItem;i++)
3211 		{
3212 			wchar_t tmp[MAX_SIZE];
3213 			wchar_t tmp2[64];
3214 			RPC_CLIENT_ENUM_CA_ITEM *e = t.Items[i];
3215 
3216 			GetDateStrEx64(tmp, sizeof(tmp), SystemToLocal64(e->Expires), NULL);
3217 
3218 			UniToStru(tmp2, e->Key);
3219 
3220 			CtInsert(ct, _UU("CMD_CAList_COLUMN_ID"), tmp2);
3221 			CtInsert(ct, _UU("CM_CERT_COLUMN_1"), e->SubjectName);
3222 			CtInsert(ct, _UU("CM_CERT_COLUMN_2"), e->IssuerName);
3223 			CtInsert(ct, _UU("CM_CERT_COLUMN_3"), tmp);
3224 
3225 			if (i != (t.NumItem - 1))
3226 			{
3227 				CtInsert(ct, L"---", L"---");
3228 			}
3229 		}
3230 
3231 		CtFree(ct, c);
3232 
3233 		CiFreeClientEnumCa(&t);
3234 	}
3235 
3236 	if (ret != ERR_NO_ERROR)
3237 	{
3238 		// Error has occurred
3239 		CmdPrintError(c, ret);
3240 	}
3241 
3242 
3243 	// Release of the parameter list
3244 	FreeParamValueList(o);
3245 
3246 	return ret;
3247 }
3248 
3249 // Add a certificate of the trusted certification authority
PcCertAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3250 UINT PcCertAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3251 {
3252 	LIST *o;
3253 	PC *pc = (PC *)param;
3254 	UINT ret = ERR_NO_ERROR;
3255 	RPC_CERT t;
3256 	X *x;
3257 	// Parameter list that can be specified
3258 	PARAM args[] =
3259 	{
3260 		{"[path]", CmdPrompt, _UU("CMD_CAAdd_PROMPT_PATH"), CmdEvalIsFile, NULL},
3261 	};
3262 
3263 	// Get the parameter list
3264 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3265 	if (o == NULL)
3266 	{
3267 		return ERR_INVALID_PARAMETER;
3268 	}
3269 
3270 
3271 	x = FileToXW(GetParamUniStr(o, "[path]"));
3272 
3273 	if (x == NULL)
3274 	{
3275 		FreeParamValueList(o);
3276 		c->Write(c, _UU("CMD_MSG_LOAD_CERT_FAILED"));
3277 		return ERR_INVALID_PARAMETER;
3278 	}
3279 
3280 	// RPC call
3281 	Zero(&t, sizeof(t));
3282 	t.x = x;
3283 
3284 	ret = CcAddCa(pc->RemoteClient, &t);
3285 
3286 	if (ret == ERR_NO_ERROR)
3287 	{
3288 		// Success
3289 	}
3290 
3291 	if (ret != ERR_NO_ERROR)
3292 	{
3293 		// Error has occurred
3294 		CmdPrintError(c, ret);
3295 	}
3296 
3297 	FreeX(x);
3298 
3299 	// Release of the parameter list
3300 	FreeParamValueList(o);
3301 
3302 	return ret;
3303 }
3304 
3305 // Delete the certificate of the trusted certification authority
PcCertDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3306 UINT PcCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3307 {
3308 	LIST *o;
3309 	PC *pc = (PC *)param;
3310 	UINT ret = ERR_NO_ERROR;
3311 	RPC_CLIENT_DELETE_CA t;
3312 	// Parameter list that can be specified
3313 	PARAM args[] =
3314 	{
3315 		{"[id]", CmdPrompt, _UU("CMD_CADelete_PROMPT_ID"), CmdEvalNotEmpty, NULL},
3316 	};
3317 
3318 	// Get the parameter list
3319 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3320 	if (o == NULL)
3321 	{
3322 		return ERR_INVALID_PARAMETER;
3323 	}
3324 
3325 	// RPC call
3326 	Zero(&t, sizeof(t));
3327 	t.Key = GetParamInt(o, "[id]");
3328 
3329 	ret = CcDeleteCa(pc->RemoteClient, &t);
3330 
3331 	if (ret == ERR_NO_ERROR)
3332 	{
3333 		// Success
3334 	}
3335 
3336 	if (ret != ERR_NO_ERROR)
3337 	{
3338 		// Error has occurred
3339 		CmdPrintError(c, ret);
3340 	}
3341 
3342 	// Release of the parameter list
3343 	FreeParamValueList(o);
3344 
3345 	return ret;
3346 }
3347 
3348 // Get the certificate of the trusted certification authority
PcCertGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3349 UINT PcCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3350 {
3351 	LIST *o;
3352 	PC *pc = (PC *)param;
3353 	UINT ret = ERR_NO_ERROR;
3354 	RPC_GET_CA t;
3355 	// Parameter list that can be specified
3356 	PARAM args[] =
3357 	{
3358 		{"[id]", CmdPrompt, _UU("CMD_CAGet_PROMPT_ID"), CmdEvalNotEmpty, NULL},
3359 		{"SAVECERT", CmdPrompt, _UU("CMD_CAGet_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},
3360 	};
3361 
3362 	// Get the parameter list
3363 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3364 	if (o == NULL)
3365 	{
3366 		return ERR_INVALID_PARAMETER;
3367 	}
3368 
3369 	// RPC call
3370 	Zero(&t, sizeof(t));
3371 	t.Key = GetParamInt(o, "[id]");
3372 
3373 	ret = CcGetCa(pc->RemoteClient, &t);
3374 
3375 	if (ret == ERR_NO_ERROR)
3376 	{
3377 		// Success
3378 		if (XToFileW(t.x, GetParamUniStr(o, "SAVECERT"), true))
3379 		{
3380 			// Success
3381 		}
3382 		else
3383 		{
3384 			// Failure
3385 			ret = ERR_INTERNAL_ERROR;
3386 			c->Write(c, _UU("CMD_MSG_SAVE_CERT_FAILED"));
3387 		}
3388 
3389 		CiFreeGetCa(&t);
3390 	}
3391 
3392 	if (ret != ERR_NO_ERROR)
3393 	{
3394 		// Error has occurred
3395 		CmdPrintError(c, ret);
3396 	}
3397 
3398 	// Release of the parameter list
3399 	FreeParamValueList(o);
3400 
3401 	return ret;
3402 }
3403 
3404 // Get the list of the type of smart card that can be used
PcSecureList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3405 UINT PcSecureList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3406 {
3407 	LIST *o;
3408 	PC *pc = (PC *)param;
3409 	UINT ret = ERR_NO_ERROR;
3410 	RPC_CLIENT_ENUM_SECURE t;
3411 
3412 	// Get the parameter list
3413 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
3414 	if (o == NULL)
3415 	{
3416 		return ERR_INVALID_PARAMETER;
3417 	}
3418 
3419 	// RPC call
3420 	Zero(&t, sizeof(t));
3421 
3422 	ret = CcEnumSecure(pc->RemoteClient, &t);
3423 
3424 	if (ret == ERR_NO_ERROR)
3425 	{
3426 		CT *ct;
3427 		UINT i;
3428 		wchar_t tmp1[MAX_SIZE];
3429 		wchar_t tmp2[MAX_SIZE];
3430 		wchar_t tmp4[MAX_SIZE];
3431 		wchar_t *tmp3;
3432 
3433 		// Success
3434 		ct = CtNew();
3435 		CtInsertColumn(ct, _UU("SEC_COLUMN1"), false);
3436 		CtInsertColumn(ct, _UU("SEC_COLUMN2"), false);
3437 		CtInsertColumn(ct, _UU("SEC_COLUMN3"), false);
3438 		CtInsertColumn(ct, _UU("SEC_COLUMN4"), false);
3439 
3440 		for (i = 0;i < t.NumItem;i++)
3441 		{
3442 			RPC_CLIENT_ENUM_SECURE_ITEM *e = t.Items[i];
3443 
3444 			// ID
3445 			UniToStru(tmp1, e->DeviceId);
3446 
3447 			// Device name
3448 			StrToUni(tmp2, sizeof(tmp2), e->DeviceName);
3449 
3450 			// Type
3451 			tmp3 = (e->Type == SECURE_IC_CARD) ? _UU("SEC_SMART_CARD") : _UU("SEC_USB_TOKEN");
3452 
3453 			// Manufacturer
3454 			StrToUni(tmp4, sizeof(tmp4), e->Manufacturer);
3455 
3456 			CtInsert(ct, tmp1, tmp2, tmp3, tmp4);
3457 		}
3458 
3459 		CtFreeEx(ct, c, true);
3460 
3461 		CiFreeClientEnumSecure(&t);
3462 	}
3463 
3464 	if (ret != ERR_NO_ERROR)
3465 	{
3466 		// Error has occurred
3467 		CmdPrintError(c, ret);
3468 	}
3469 
3470 	// Release of the parameter list
3471 	FreeParamValueList(o);
3472 
3473 	return ret;
3474 }
3475 
3476 // Select the type of smart card to be used
PcSecureSelect(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3477 UINT PcSecureSelect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3478 {
3479 	LIST *o;
3480 	PC *pc = (PC *)param;
3481 	UINT ret = ERR_NO_ERROR;
3482 	RPC_USE_SECURE t;
3483 	// Parameter list that can be specified
3484 	PARAM args[] =
3485 	{
3486 		{"[id]", CmdPrompt, _UU("CMD_SecureSelect_PROMPT_ID"), NULL, NULL},
3487 	};
3488 
3489 	// Get the parameter list
3490 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3491 	if (o == NULL)
3492 	{
3493 		return ERR_INVALID_PARAMETER;
3494 	}
3495 
3496 	// RPC call
3497 	Zero(&t, sizeof(t));
3498 	t.DeviceId = GetParamInt(o, "[id]");
3499 
3500 	ret = CcUseSecure(pc->RemoteClient, &t);
3501 
3502 	if (ret == ERR_NO_ERROR)
3503 	{
3504 		// Success
3505 	}
3506 
3507 	if (ret != ERR_NO_ERROR)
3508 	{
3509 		// Error has occurred
3510 		CmdPrintError(c, ret);
3511 	}
3512 
3513 	// Release of the parameter list
3514 	FreeParamValueList(o);
3515 
3516 	return ret;
3517 }
3518 
3519 // Get the type ID of smart card to be used
PcSecureGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3520 UINT PcSecureGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3521 {
3522 	LIST *o;
3523 	PC *pc = (PC *)param;
3524 	UINT ret = ERR_NO_ERROR;
3525 	RPC_USE_SECURE t;
3526 
3527 	// Get the parameter list
3528 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
3529 	if (o == NULL)
3530 	{
3531 		return ERR_INVALID_PARAMETER;
3532 	}
3533 
3534 	// RPC call
3535 	Zero(&t, sizeof(t));
3536 
3537 	ret = CcGetUseSecure(pc->RemoteClient, &t);
3538 
3539 	if (ret == ERR_NO_ERROR)
3540 	{
3541 		// Success
3542 		wchar_t tmp[MAX_SIZE];
3543 
3544 		if (t.DeviceId != 0)
3545 		{
3546 			UniFormat(tmp, sizeof(tmp), _UU("CMD_SecureGet_Print"), t.DeviceId);
3547 		}
3548 		else
3549 		{
3550 			UniStrCpy(tmp, sizeof(tmp), _UU("CMD_SecureGet_NoPrint"));
3551 		}
3552 		c->Write(c, tmp);
3553 	}
3554 
3555 	if (ret != ERR_NO_ERROR)
3556 	{
3557 		// Error has occurred
3558 		CmdPrintError(c, ret);
3559 	}
3560 
3561 	// Release of the parameter list
3562 	FreeParamValueList(o);
3563 
3564 	return ret;
3565 }
3566 
3567 // Create a new virtual LAN card
PcNicCreate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3568 UINT PcNicCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3569 {
3570 	LIST *o;
3571 	PC *pc = (PC *)param;
3572 	UINT ret = ERR_NO_ERROR;
3573 	RPC_CLIENT_CREATE_VLAN t;
3574 	// Parameter list that can be specified
3575 	PARAM args[] =
3576 	{
3577 		{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
3578 	};
3579 
3580 	// Get the parameter list
3581 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3582 	if (o == NULL)
3583 	{
3584 		return ERR_INVALID_PARAMETER;
3585 	}
3586 
3587 	// RPC call
3588 	Zero(&t, sizeof(t));
3589 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
3590 
3591 	ret = CcCreateVLan(pc->RemoteClient, &t);
3592 
3593 	if (ret == ERR_NO_ERROR)
3594 	{
3595 		// Success
3596 	}
3597 
3598 	if (ret != ERR_NO_ERROR)
3599 	{
3600 		// Error has occurred
3601 		CmdPrintError(c, ret);
3602 	}
3603 
3604 	// Release of the parameter list
3605 	FreeParamValueList(o);
3606 
3607 	return ret;
3608 }
3609 
3610 // Delete the virtual LAN card
PcNicDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3611 UINT PcNicDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3612 {
3613 	LIST *o;
3614 	PC *pc = (PC *)param;
3615 	UINT ret = ERR_NO_ERROR;
3616 	RPC_CLIENT_CREATE_VLAN t;
3617 	// Parameter list that can be specified
3618 	PARAM args[] =
3619 	{
3620 		{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
3621 	};
3622 
3623 	// Get the parameter list
3624 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3625 	if (o == NULL)
3626 	{
3627 		return ERR_INVALID_PARAMETER;
3628 	}
3629 
3630 	// RPC call
3631 	Zero(&t, sizeof(t));
3632 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
3633 
3634 	ret = CcDeleteVLan(pc->RemoteClient, &t);
3635 
3636 	if (ret == ERR_NO_ERROR)
3637 	{
3638 		// Success
3639 	}
3640 
3641 	if (ret != ERR_NO_ERROR)
3642 	{
3643 		// Error has occurred
3644 		CmdPrintError(c, ret);
3645 	}
3646 
3647 	// Release of the parameter list
3648 	FreeParamValueList(o);
3649 
3650 	return ret;
3651 }
3652 
3653 // Upgrading the device driver of the virtual LAN card
PcNicUpgrade(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3654 UINT PcNicUpgrade(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3655 {
3656 	LIST *o;
3657 	PC *pc = (PC *)param;
3658 	UINT ret = ERR_NO_ERROR;
3659 	RPC_CLIENT_CREATE_VLAN t;
3660 	// Parameter list that can be specified
3661 	PARAM args[] =
3662 	{
3663 		{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
3664 	};
3665 
3666 	// Get the parameter list
3667 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3668 	if (o == NULL)
3669 	{
3670 		return ERR_INVALID_PARAMETER;
3671 	}
3672 
3673 	// RPC call
3674 	Zero(&t, sizeof(t));
3675 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
3676 
3677 	ret = CcUpgradeVLan(pc->RemoteClient, &t);
3678 
3679 	if (ret == ERR_NO_ERROR)
3680 	{
3681 		// Success
3682 	}
3683 
3684 	if (ret != ERR_NO_ERROR)
3685 	{
3686 		// Error has occurred
3687 		CmdPrintError(c, ret);
3688 	}
3689 
3690 	// Release of the parameter list
3691 	FreeParamValueList(o);
3692 
3693 	return ret;
3694 }
3695 
3696 // Get the settings of the virtual LAN card
PcNicGetSetting(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3697 UINT PcNicGetSetting(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3698 {
3699 	LIST *o;
3700 	PC *pc = (PC *)param;
3701 	UINT ret = ERR_NO_ERROR;
3702 	RPC_CLIENT_GET_VLAN t;
3703 	// Parameter list that can be specified
3704 	PARAM args[] =
3705 	{
3706 		{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
3707 	};
3708 
3709 	// Get the parameter list
3710 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3711 	if (o == NULL)
3712 	{
3713 		return ERR_INVALID_PARAMETER;
3714 	}
3715 
3716 	// RPC call
3717 	Zero(&t, sizeof(t));
3718 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
3719 
3720 	ret = CcGetVLan(pc->RemoteClient, &t);
3721 
3722 	if (ret == ERR_NO_ERROR)
3723 	{
3724 		// Success
3725 		CT *ct = CtNewStandard();
3726 		wchar_t tmp[MAX_SIZE];
3727 
3728 		StrToUni(tmp, sizeof(tmp), t.DeviceName);
3729 		CtInsert(ct, _UU("CMD_NicGetSetting_1"), tmp);
3730 
3731 		CtInsert(ct, _UU("CMD_NicGetSetting_2"), t.Enabled ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
3732 
3733 		StrToUni(tmp, sizeof(tmp), t.MacAddress);
3734 		CtInsert(ct, _UU("CMD_NicGetSetting_3"), tmp);
3735 
3736 		StrToUni(tmp, sizeof(tmp), t.Version);
3737 		CtInsert(ct, _UU("CMD_NicGetSetting_4"), tmp);
3738 
3739 		StrToUni(tmp, sizeof(tmp), t.FileName);
3740 		CtInsert(ct, _UU("CMD_NicGetSetting_5"), tmp);
3741 
3742 		StrToUni(tmp, sizeof(tmp), t.Guid);
3743 		CtInsert(ct, _UU("CMD_NicGetSetting_6"), tmp);
3744 
3745 		CtFree(ct, c);
3746 	}
3747 
3748 	if (ret != ERR_NO_ERROR)
3749 	{
3750 		// Error has occurred
3751 		CmdPrintError(c, ret);
3752 	}
3753 
3754 	// Release of the parameter list
3755 	FreeParamValueList(o);
3756 
3757 	return ret;
3758 }
3759 
3760 // Change the settings for the virtual LAN card
PcNicSetSetting(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3761 UINT PcNicSetSetting(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3762 {
3763 	LIST *o;
3764 	PC *pc = (PC *)param;
3765 	UINT ret = ERR_NO_ERROR;
3766 	RPC_CLIENT_SET_VLAN t;
3767 	UCHAR mac_address[6];
3768 	BUF *b;
3769 	// Parameter list that can be specified
3770 	PARAM args[] =
3771 	{
3772 		{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
3773 		{"MAC", CmdPrompt, _UU("CMD_NicSetSetting_PROMPT_MAC"), CmdEvalNotEmpty, NULL},
3774 	};
3775 
3776 	// Get the parameter list
3777 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3778 	if (o == NULL)
3779 	{
3780 		return ERR_INVALID_PARAMETER;
3781 	}
3782 
3783 	// Inspect the MAC address
3784 	Zero(mac_address, sizeof(mac_address));
3785 	b = StrToBin(GetParamStr(o, "MAC"));
3786 	if (b != NULL && b->Size == 6)
3787 	{
3788 		Copy(mac_address, b->Buf, 6);
3789 	}
3790 	FreeBuf(b);
3791 
3792 	if (IsZero(mac_address, 6))
3793 	{
3794 		// MAC address is invalid
3795 		FreeParamValueList(o);
3796 
3797 		CmdPrintError(c, ERR_INVALID_PARAMETER);
3798 		return ERR_INVALID_PARAMETER;
3799 	}
3800 
3801 	// RPC call
3802 	Zero(&t, sizeof(t));
3803 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
3804 	NormalizeMacAddress(t.MacAddress, sizeof(t.MacAddress), GetParamStr(o, "MAC"));
3805 
3806 	ret = CcSetVLan(pc->RemoteClient, &t);
3807 
3808 	if (ret == ERR_NO_ERROR)
3809 	{
3810 		// Success
3811 	}
3812 
3813 	if (ret != ERR_NO_ERROR)
3814 	{
3815 		// Error has occurred
3816 		CmdPrintError(c, ret);
3817 	}
3818 
3819 	// Release of the parameter list
3820 	FreeParamValueList(o);
3821 
3822 	return ret;
3823 }
3824 
3825 // Enable the virtual LAN card
PcNicEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3826 UINT PcNicEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3827 {
3828 	LIST *o;
3829 	PC *pc = (PC *)param;
3830 	UINT ret = ERR_NO_ERROR;
3831 	RPC_CLIENT_CREATE_VLAN t;
3832 	// Parameter list that can be specified
3833 	PARAM args[] =
3834 	{
3835 		{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
3836 	};
3837 
3838 	// Get the parameter list
3839 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3840 	if (o == NULL)
3841 	{
3842 		return ERR_INVALID_PARAMETER;
3843 	}
3844 
3845 	// RPC call
3846 	Zero(&t, sizeof(t));
3847 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
3848 
3849 	ret = CcEnableVLan(pc->RemoteClient, &t);
3850 
3851 	if (ret == ERR_NO_ERROR)
3852 	{
3853 		// Success
3854 	}
3855 
3856 	if (ret != ERR_NO_ERROR)
3857 	{
3858 		// Error has occurred
3859 		CmdPrintError(c, ret);
3860 	}
3861 
3862 	// Release of the parameter list
3863 	FreeParamValueList(o);
3864 
3865 	return ret;
3866 }
3867 
3868 // Disable the virtual LAN card
PcNicDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3869 UINT PcNicDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3870 {
3871 	LIST *o;
3872 	PC *pc = (PC *)param;
3873 	UINT ret = ERR_NO_ERROR;
3874 	RPC_CLIENT_CREATE_VLAN t;
3875 	// Parameter list that can be specified
3876 	PARAM args[] =
3877 	{
3878 		{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
3879 	};
3880 
3881 	// Get the parameter list
3882 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
3883 	if (o == NULL)
3884 	{
3885 		return ERR_INVALID_PARAMETER;
3886 	}
3887 
3888 	// RPC call
3889 	Zero(&t, sizeof(t));
3890 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
3891 
3892 	ret = CcDisableVLan(pc->RemoteClient, &t);
3893 
3894 	if (ret == ERR_NO_ERROR)
3895 	{
3896 		// Success
3897 	}
3898 
3899 	if (ret != ERR_NO_ERROR)
3900 	{
3901 		// Error has occurred
3902 		CmdPrintError(c, ret);
3903 	}
3904 
3905 	// Release of the parameter list
3906 	FreeParamValueList(o);
3907 
3908 	return ret;
3909 }
3910 
3911 // Get the Virtual LAN card list
PcNicList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)3912 UINT PcNicList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
3913 {
3914 	LIST *o;
3915 	PC *pc = (PC *)param;
3916 	UINT ret = ERR_NO_ERROR;
3917 	RPC_CLIENT_ENUM_VLAN t;
3918 
3919 	// Get the parameter list
3920 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
3921 	if (o == NULL)
3922 	{
3923 		return ERR_INVALID_PARAMETER;
3924 	}
3925 
3926 	// RPC call
3927 	Zero(&t, sizeof(t));
3928 
3929 	ret = CcEnumVLan(pc->RemoteClient, &t);
3930 
3931 	if (ret == ERR_NO_ERROR)
3932 	{
3933 		CT *ct;
3934 		UINT i;
3935 
3936 		// Success
3937 		ct = CtNew();
3938 		CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_1"), false);
3939 		CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_2"), false);
3940 		CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_3"), false);
3941 		CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_4"), false);
3942 
3943 		for (i = 0;i < t.NumItem;i++)
3944 		{
3945 			wchar_t name[MAX_SIZE];
3946 			wchar_t mac[MAX_SIZE];
3947 			wchar_t ver[MAX_SIZE];
3948 			wchar_t *status;
3949 			RPC_CLIENT_ENUM_VLAN_ITEM *v = t.Items[i];
3950 
3951 			// Device name
3952 			StrToUni(name, sizeof(name), v->DeviceName);
3953 
3954 			// State
3955 			status = v->Enabled ? _UU("CM_VLAN_ENABLED") : _UU("CM_VLAN_DISABLED");
3956 
3957 			// MAC address
3958 			StrToUni(mac, sizeof(mac), v->MacAddress);
3959 
3960 			// Version
3961 			StrToUni(ver, sizeof(ver), v->Version);
3962 
3963 			CtInsert(ct,
3964 				name, status, mac, ver);
3965 		}
3966 
3967 		CtFreeEx(ct, c, true);
3968 	}
3969 
3970 	if (ret != ERR_NO_ERROR)
3971 	{
3972 		// Error has occurred
3973 		CmdPrintError(c, ret);
3974 	}
3975 
3976 	CiFreeClientEnumVLan(&t);
3977 
3978 	// Release of the parameter list
3979 	FreeParamValueList(o);
3980 
3981 	return ret;
3982 }
3983 
3984 // Get the protocol name string from ID
GetProtocolName(UINT n)3985 wchar_t *GetProtocolName(UINT n)
3986 {
3987 	switch (n)
3988 	{
3989 	case PROXY_DIRECT:
3990 		return _UU("PROTO_DIRECT_TCP");
3991 	case PROXY_HTTP:
3992 		return _UU("PROTO_HTTP_PROXY");
3993 	case PROXY_SOCKS:
3994 		return _UU("PROTO_SOCKS_PROXY");
3995 	case PROXY_SOCKS5:
3996 		return _UU("PROTO_SOCKS5_PROXY");
3997 	}
3998 
3999 	return _UU("PROTO_UNKNOWN");
4000 }
4001 
4002 // Get the connection settings list
PcAccountList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4003 UINT PcAccountList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4004 {
4005 	LIST *o;
4006 	PC *pc = (PC *)param;
4007 	UINT ret = ERR_NO_ERROR;
4008 	RPC_CLIENT_ENUM_ACCOUNT t;
4009 
4010 	// Get the parameter list
4011 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
4012 	if (o == NULL)
4013 	{
4014 		return ERR_INVALID_PARAMETER;
4015 	}
4016 
4017 	// RPC call
4018 	Zero(&t, sizeof(t));
4019 
4020 	ret = CcEnumAccount(pc->RemoteClient, &t);
4021 
4022 	if (ret == ERR_NO_ERROR)
4023 	{
4024 		UINT i;
4025 		CT *ct;
4026 
4027 		// Success
4028 		ct = CtNew();
4029 		CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_1"), false);
4030 		CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_2"), false);
4031 		CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_3"), false);
4032 		CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_3_2"), false);
4033 		CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_4"), false);
4034 
4035 		for (i = 0;i < t.NumItem;i++)
4036 		{
4037 			RPC_CLIENT_ENUM_ACCOUNT_ITEM *e = t.Items[i];
4038 			wchar_t tmp[MAX_SIZE];
4039 			wchar_t tmp2[MAX_SIZE];
4040 			wchar_t tmp4[MAX_SIZE];
4041 			IP ip;
4042 			char ip_str[MAX_SIZE];
4043 
4044 			// Special treatment for IPv6 addresses
4045 			if (StrToIP6(&ip, e->ServerName) && StartWith(e->ServerName, "[") == false)
4046 			{
4047 				Format(ip_str, sizeof(ip_str),
4048 					"[%s]", e->ServerName);
4049 			}
4050 			else
4051 			{
4052 				StrCpy(ip_str, sizeof(ip_str), e->ServerName);
4053 			}
4054 
4055 			if (e->Port == 0)
4056 			{
4057 				// Port number unknown
4058 				UniFormat(tmp2, sizeof(tmp2), L"%S (%s)", ip_str, GetProtocolName(e->ProxyType));
4059 			}
4060 			else
4061 			{
4062 				// Port number are also shown
4063 				UniFormat(tmp2, sizeof(tmp2), L"%S:%u (%s)", ip_str, e->Port, GetProtocolName(e->ProxyType));
4064 			}
4065 
4066 			// Virtual HUB name
4067 			StrToUni(tmp4, sizeof(tmp4), e->HubName);
4068 
4069 			// Add
4070 			StrToUni(tmp, sizeof(tmp), e->DeviceName);
4071 
4072 			CtInsert(ct,
4073 				e->AccountName,
4074 				e->Active == false ? _UU("CM_ACCOUNT_OFFLINE") :
4075 				(e->Connected ? _UU("CM_ACCOUNT_ONLINE") : _UU("CM_ACCOUNT_CONNECTING")),
4076 				tmp2, tmp4,
4077 				tmp);
4078 		}
4079 
4080 		CtFreeEx(ct, c, true);
4081 	}
4082 
4083 	CiFreeClientEnumAccount(&t);
4084 
4085 	if (ret != ERR_NO_ERROR)
4086 	{
4087 		// Error has occurred
4088 		CmdPrintError(c, ret);
4089 	}
4090 
4091 	// Release of the parameter list
4092 	FreeParamValueList(o);
4093 
4094 	return ret;
4095 }
4096 
4097 // Create new connection settings
PcAccountCreate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4098 UINT PcAccountCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4099 {
4100 	LIST *o;
4101 	PC *pc = (PC *)param;
4102 	UINT ret = ERR_NO_ERROR;
4103 	RPC_CLIENT_CREATE_ACCOUNT t;
4104 	UINT port = 443;
4105 	char *host = NULL;
4106 	// Parameter list that can be specified
4107 	PARAM args[] =
4108 	{
4109 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4110 		{"SERVER", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},
4111 		{"HUB", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Hub"), CmdEvalSafe, NULL},
4112 		{"USERNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},
4113 		{"NICNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Nicname"), CmdEvalNotEmpty, NULL},
4114 	};
4115 
4116 	// Get the parameter list
4117 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4118 	if (o == NULL)
4119 	{
4120 		return ERR_INVALID_PARAMETER;
4121 	}
4122 
4123 	ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);
4124 
4125 	// RPC call
4126 	Zero(&t, sizeof(t));
4127 
4128 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
4129 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
4130 	t.ClientOption->Port = port;
4131 	StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);
4132 	StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));
4133 	t.ClientOption->NumRetry = INFINITE;
4134 	t.ClientOption->RetryInterval = 15;
4135 	t.ClientOption->MaxConnection = 1;
4136 	t.ClientOption->UseEncrypt = true;
4137 	t.ClientOption->AdditionalConnectionInterval = 1;
4138 	StrCpy(t.ClientOption->DeviceName, sizeof(t.ClientOption->DeviceName), GetParamStr(o, "NICNAME"));
4139 
4140 	t.ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));
4141 	t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
4142 	StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username), GetParamStr(o, "USERNAME"));
4143 
4144 	Free(host);
4145 
4146 	ret = CcCreateAccount(pc->RemoteClient, &t);
4147 
4148 	if (ret == ERR_NO_ERROR)
4149 	{
4150 		// Success
4151 	}
4152 
4153 	CiFreeClientCreateAccount(&t);
4154 
4155 	if (ret != ERR_NO_ERROR)
4156 	{
4157 		// Error has occurred
4158 		CmdPrintError(c, ret);
4159 	}
4160 
4161 	// Release of the parameter list
4162 	FreeParamValueList(o);
4163 
4164 	return ret;
4165 }
4166 
4167 // Set the destination of the connection settings
PcAccountSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4168 UINT PcAccountSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4169 {
4170 	LIST *o;
4171 	PC *pc = (PC *)param;
4172 	UINT ret = ERR_NO_ERROR;
4173 	RPC_CLIENT_GET_ACCOUNT t;
4174 	char *host = NULL;
4175 	UINT port = 443;
4176 	// Parameter list that can be specified
4177 	PARAM args[] =
4178 	{
4179 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4180 		{"SERVER", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},
4181 		{"HUB", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Hub"), CmdEvalSafe, NULL},
4182 	};
4183 
4184 	// Get the parameter list
4185 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4186 	if (o == NULL)
4187 	{
4188 		return ERR_INVALID_PARAMETER;
4189 	}
4190 
4191 	// RPC call
4192 	Zero(&t, sizeof(t));
4193 
4194 	ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);
4195 
4196 	Zero(&t, sizeof(t));
4197 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4198 
4199 	ret = CcGetAccount(pc->RemoteClient, &t);
4200 
4201 	if (ret == ERR_NO_ERROR)
4202 	{
4203 		RPC_CLIENT_CREATE_ACCOUNT c;
4204 		// Success
4205 		t.ClientOption->Port = port;
4206 		StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);
4207 		StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));
4208 
4209 		Zero(&c, sizeof(c));
4210 
4211 		c.ClientAuth = t.ClientAuth;
4212 		c.ClientOption = t.ClientOption;
4213 		c.CheckServerCert = t.CheckServerCert;
4214 		c.RetryOnServerCert = t.RetryOnServerCert;
4215 		c.ServerCert = t.ServerCert;
4216 		c.StartupAccount = t.StartupAccount;
4217 
4218 		ret = CcSetAccount(pc->RemoteClient, &c);
4219 	}
4220 
4221 	if (ret != ERR_NO_ERROR)
4222 	{
4223 		// Error has occurred
4224 		CmdPrintError(c, ret);
4225 	}
4226 
4227 	CiFreeClientGetAccount(&t);
4228 
4229 	// Release of the parameter list
4230 	FreeParamValueList(o);
4231 
4232 	Free(host);
4233 
4234 	return ret;
4235 }
4236 
4237 // Get the configuration of the connection settings
PcAccountGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4238 UINT PcAccountGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4239 {
4240 	LIST *o;
4241 	PC *pc = (PC *)param;
4242 	UINT ret = ERR_NO_ERROR;
4243 	RPC_CLIENT_GET_ACCOUNT t;
4244 	// Parameter list that can be specified
4245 	PARAM args[] =
4246 	{
4247 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4248 	};
4249 
4250 	// Get the parameter list
4251 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4252 	if (o == NULL)
4253 	{
4254 		return ERR_INVALID_PARAMETER;
4255 	}
4256 
4257 	// RPC call
4258 	Zero(&t, sizeof(t));
4259 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4260 
4261 	ret = CcGetAccount(pc->RemoteClient, &t);
4262 
4263 	if (ret == ERR_NO_ERROR)
4264 	{
4265 		// Show the contents of the connection settings
4266 		wchar_t tmp[MAX_SIZE];
4267 
4268 		CT *ct = CtNewStandard();
4269 
4270 		// Connection settings name
4271 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NAME"), t.ClientOption->AccountName);
4272 
4273 		// Host name of the destination VPN Server
4274 		StrToUni(tmp, sizeof(tmp), t.ClientOption->Hostname);
4275 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HOSTNAME"), tmp);
4276 
4277 		// The port number to connect to VPN Server
4278 		UniToStru(tmp, t.ClientOption->Port);
4279 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PORT"), tmp);
4280 
4281 		// Virtual HUB name of the destination VPN Server
4282 		StrToUni(tmp, sizeof(tmp), t.ClientOption->HubName);
4283 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HUBNAME"), tmp);
4284 
4285 		// Type of proxy server to go through
4286 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_TYPE"), GetProxyTypeStr(t.ClientOption->ProxyType));
4287 
4288 		if (t.ClientOption->ProxyType != PROXY_DIRECT)
4289 		{
4290 			// Host name of the proxy server
4291 			StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyName);
4292 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_HOSTNAME"), tmp);
4293 
4294 			// Port number of the proxy server
4295 			UniToStru(tmp, t.ClientOption->ProxyPort);
4296 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_PORT"), tmp);
4297 
4298 			// User name of the proxy server
4299 			StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyUsername);
4300 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_USERNAME"), tmp);
4301 		}
4302 
4303 		// Verify the server certificate
4304 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_USE"),
4305 			t.CheckServerCert ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4306 
4307 		// Registered specific certificate
4308 		if (t.ServerCert != NULL)
4309 		{
4310 			GetAllNameFromX(tmp, sizeof(tmp), t.ServerCert);
4311 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_NAME"), tmp);
4312 		}
4313 
4314 		if (t.CheckServerCert)
4315 		{
4316 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_RETRY_ON_SERVER_CERT"),
4317 				t.RetryOnServerCert ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4318 		}
4319 
4320 		// Device name to be used for the connection
4321 		StrToUni(tmp, sizeof(tmp), t.ClientOption->DeviceName);
4322 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_DEVICE_NAME"), tmp);
4323 
4324 		// Authentication type
4325 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_TYPE"), GetClientAuthTypeStr(t.ClientAuth->AuthType));
4326 
4327 		// User name
4328 		StrToUni(tmp, sizeof(tmp), t.ClientAuth->Username);
4329 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_USERNAME"), tmp);
4330 
4331 		if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_CERT)
4332 		{
4333 			if (t.ClientAuth->ClientX != NULL)
4334 			{
4335 				// Client certificate name
4336 				GetAllNameFromX(tmp, sizeof(tmp), t.ClientAuth->ClientX);
4337 				CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_CERT_NAME"), tmp);
4338 			}
4339 		}
4340 
4341 		// Number of TCP connections to be used for VPN communication
4342 		UniToStru(tmp, t.ClientOption->MaxConnection);
4343 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NUMTCP"), tmp);
4344 
4345 		// Establishment interval of each TCP connection
4346 		UniToStru(tmp, t.ClientOption->AdditionalConnectionInterval);
4347 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_INTERVAL"), tmp);
4348 
4349 		// Life span of each TCP connection
4350 		if (t.ClientOption->ConnectionDisconnectSpan != 0)
4351 		{
4352 			UniToStru(tmp, t.ClientOption->ConnectionDisconnectSpan);
4353 		}
4354 		else
4355 		{
4356 			UniStrCpy(tmp, sizeof(tmp), _UU("CMD_MSG_INFINITE"));
4357 		}
4358 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_TTL"), tmp);
4359 
4360 		// Use of half-duplex mode
4361 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_HALF"),
4362 			t.ClientOption->HalfConnection ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4363 
4364 		// Encryption by SSL
4365 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_ENCRYPT"),
4366 			t.ClientOption->UseEncrypt ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4367 
4368 		// Data compression
4369 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_COMPRESS"),
4370 			t.ClientOption->UseCompress ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4371 
4372 		// Connect in bridge / router mode
4373 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_BRIDGE_ROUTER"),
4374 			t.ClientOption->RequireBridgeRoutingMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4375 
4376 		// Connect in monitoring mode
4377 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_MONITOR"),
4378 			t.ClientOption->RequireMonitorMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4379 
4380 		// Not to rewrite the routing table
4381 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NO_TRACKING"),
4382 			t.ClientOption->NoRoutingTracking ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4383 
4384 		// Disable the QoS control
4385 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_QOS_DISABLE"),
4386 			t.ClientOption->DisableQoS ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4387 
4388 		// Disable UDP Acceleration
4389 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_DISABLEUDP"),
4390 			t.ClientOption->NoUdpAcceleration ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
4391 
4392 		CtFree(ct, c);
4393 	}
4394 
4395 	if (ret != ERR_NO_ERROR)
4396 	{
4397 		// Error has occurred
4398 		CmdPrintError(c, ret);
4399 	}
4400 
4401 	CiFreeClientGetAccount(&t);
4402 
4403 	// Release of the parameter list
4404 	FreeParamValueList(o);
4405 
4406 	return ret;
4407 }
4408 
4409 // Delete the connection settings
PcAccountDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4410 UINT PcAccountDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4411 {
4412 	LIST *o;
4413 	PC *pc = (PC *)param;
4414 	UINT ret = ERR_NO_ERROR;
4415 	RPC_CLIENT_DELETE_ACCOUNT t;
4416 	// Parameter list that can be specified
4417 	PARAM args[] =
4418 	{
4419 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4420 	};
4421 
4422 	// Get the parameter list
4423 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4424 	if (o == NULL)
4425 	{
4426 		return ERR_INVALID_PARAMETER;
4427 	}
4428 
4429 	// RPC call
4430 	Zero(&t, sizeof(t));
4431 
4432 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4433 
4434 	ret = CcDeleteAccount(pc->RemoteClient, &t);
4435 
4436 	if (ret == ERR_NO_ERROR)
4437 	{
4438 		// Success
4439 	}
4440 
4441 	if (ret != ERR_NO_ERROR)
4442 	{
4443 		// Error has occurred
4444 		CmdPrintError(c, ret);
4445 	}
4446 
4447 	// Release of the parameter list
4448 	FreeParamValueList(o);
4449 
4450 	return ret;
4451 }
4452 
4453 // Set the user name used to connect with connection settings
PcAccountUsernameSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4454 UINT PcAccountUsernameSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4455 {
4456 	LIST *o;
4457 	PC *pc = (PC *)param;
4458 	UINT ret = ERR_NO_ERROR;
4459 	RPC_CLIENT_GET_ACCOUNT t;
4460 	// Parameter list that can be specified
4461 	PARAM args[] =
4462 	{
4463 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4464 		{"USERNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},
4465 	};
4466 
4467 	// Get the parameter list
4468 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4469 	if (o == NULL)
4470 	{
4471 		return ERR_INVALID_PARAMETER;
4472 	}
4473 
4474 	// RPC call
4475 	Zero(&t, sizeof(t));
4476 
4477 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4478 
4479 	ret = CcGetAccount(pc->RemoteClient, &t);
4480 
4481 	if (ret == ERR_NO_ERROR)
4482 	{
4483 		RPC_CLIENT_CREATE_ACCOUNT z;
4484 		// Change the settings
4485 		StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username), GetParamStr(o, "USERNAME"));
4486 
4487 		if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_PASSWORD)
4488 		{
4489 			c->Write(c, _UU("CMD_AccountUsername_Notice"));
4490 		}
4491 
4492 		Zero(&z, sizeof(z));
4493 		z.CheckServerCert = t.CheckServerCert;
4494 		z.RetryOnServerCert = t.RetryOnServerCert;
4495 		z.ClientAuth = t.ClientAuth;
4496 		z.ClientOption = t.ClientOption;
4497 		z.ServerCert = t.ServerCert;
4498 		z.StartupAccount = t.StartupAccount;
4499 
4500 		ret = CcSetAccount(pc->RemoteClient, &z);
4501 	}
4502 
4503 	if (ret != ERR_NO_ERROR)
4504 	{
4505 		// Error has occurred
4506 		CmdPrintError(c, ret);
4507 	}
4508 
4509 	CiFreeClientGetAccount(&t);
4510 
4511 	// Release of the parameter list
4512 	FreeParamValueList(o);
4513 
4514 	return ret;
4515 }
4516 
4517 // Set the type of user authentication of connection settings to anonymous authentication
PcAccountAnonymousSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4518 UINT PcAccountAnonymousSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4519 {
4520 	LIST *o;
4521 	PC *pc = (PC *)param;
4522 	UINT ret = ERR_NO_ERROR;
4523 	RPC_CLIENT_GET_ACCOUNT t;
4524 	// Parameter list that can be specified
4525 	PARAM args[] =
4526 	{
4527 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4528 	};
4529 
4530 	// Get the parameter list
4531 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4532 	if (o == NULL)
4533 	{
4534 		return ERR_INVALID_PARAMETER;
4535 	}
4536 
4537 	// RPC call
4538 	Zero(&t, sizeof(t));
4539 
4540 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4541 
4542 	ret = CcGetAccount(pc->RemoteClient, &t);
4543 
4544 	if (ret == ERR_NO_ERROR)
4545 	{
4546 		RPC_CLIENT_CREATE_ACCOUNT z;
4547 		// Change the settings
4548 		t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
4549 
4550 		Zero(&z, sizeof(z));
4551 		z.CheckServerCert = t.CheckServerCert;
4552 		z.RetryOnServerCert = t.RetryOnServerCert;
4553 		z.ClientAuth = t.ClientAuth;
4554 		z.ClientOption = t.ClientOption;
4555 		z.ServerCert = t.ServerCert;
4556 		z.StartupAccount = t.StartupAccount;
4557 
4558 		ret = CcSetAccount(pc->RemoteClient, &z);
4559 	}
4560 
4561 	if (ret != ERR_NO_ERROR)
4562 	{
4563 		// Error has occurred
4564 		CmdPrintError(c, ret);
4565 	}
4566 
4567 	CiFreeClientGetAccount(&t);
4568 
4569 	// Release of the parameter list
4570 	FreeParamValueList(o);
4571 
4572 	return ret;
4573 }
4574 
4575 // Set the type of user authentication of connection settings to the password authentication
PcAccountPasswordSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4576 UINT PcAccountPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4577 {
4578 	LIST *o;
4579 	PC *pc = (PC *)param;
4580 	UINT ret = ERR_NO_ERROR;
4581 	RPC_CLIENT_GET_ACCOUNT t;
4582 	// Parameter list that can be specified
4583 	PARAM args[] =
4584 	{
4585 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4586 		{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
4587 		{"TYPE", CmdPrompt, _UU("CMD_CascadePasswordSet_Prompt_Type"), CmdEvalNotEmpty, NULL},
4588 	};
4589 
4590 	// Get the parameter list
4591 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4592 	if (o == NULL)
4593 	{
4594 		return ERR_INVALID_PARAMETER;
4595 	}
4596 
4597 	// RPC call
4598 	Zero(&t, sizeof(t));
4599 
4600 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4601 
4602 	ret = CcGetAccount(pc->RemoteClient, &t);
4603 
4604 	if (ret == ERR_NO_ERROR)
4605 	{
4606 		char *typestr = GetParamStr(o, "TYPE");
4607 		RPC_CLIENT_CREATE_ACCOUNT z;
4608 
4609 		// Change the settings
4610 		if (StartWith("standard", typestr))
4611 		{
4612 			t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PASSWORD;
4613 			HashPassword(t.ClientAuth->HashedPassword, t.ClientAuth->Username,
4614 				GetParamStr(o, "PASSWORD"));
4615 		}
4616 		else if (StartWith("radius", typestr) || StartWith("ntdomain", typestr))
4617 		{
4618 			t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PLAIN_PASSWORD;
4619 
4620 			StrCpy(t.ClientAuth->PlainPassword, sizeof(t.ClientAuth->PlainPassword),
4621 				GetParamStr(o, "PASSWORD"));
4622 		}
4623 		else
4624 		{
4625 			// Error has occured
4626 			c->Write(c, _UU("CMD_CascadePasswordSet_Type_Invalid"));
4627 			ret = ERR_INVALID_PARAMETER;
4628 		}
4629 
4630 		if (ret == ERR_NO_ERROR)
4631 		{
4632 			Zero(&z, sizeof(z));
4633 			z.CheckServerCert = t.CheckServerCert;
4634 			z.RetryOnServerCert = t.RetryOnServerCert;
4635 			z.ClientAuth = t.ClientAuth;
4636 			z.ClientOption = t.ClientOption;
4637 			z.ServerCert = t.ServerCert;
4638 			z.StartupAccount = t.StartupAccount;
4639 
4640 			ret = CcSetAccount(pc->RemoteClient, &z);
4641 		}
4642 	}
4643 
4644 	if (ret != ERR_NO_ERROR)
4645 	{
4646 		// Error has occurred
4647 		CmdPrintError(c, ret);
4648 	}
4649 
4650 	CiFreeClientGetAccount(&t);
4651 
4652 	// Release of the parameter list
4653 	FreeParamValueList(o);
4654 
4655 	return ret;
4656 }
4657 
4658 // 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)4659 UINT PcAccountCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4660 {
4661 	LIST *o;
4662 	PC *pc = (PC *)param;
4663 	UINT ret = ERR_NO_ERROR;
4664 	RPC_CLIENT_GET_ACCOUNT t;
4665 	X *x;
4666 	K *k;
4667 	// Parameter list that can be specified
4668 	PARAM args[] =
4669 	{
4670 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4671 		{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
4672 		{"LOADKEY", CmdPrompt, _UU("CMD_LOADKEYPATH"), CmdEvalIsFile, NULL},
4673 	};
4674 
4675 	// Get the parameter list
4676 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4677 	if (o == NULL)
4678 	{
4679 		return ERR_INVALID_PARAMETER;
4680 	}
4681 
4682 	if (CmdLoadCertAndKey(c, &x, &k, GetParamUniStr(o, "LOADCERT"), GetParamUniStr(o, "LOADKEY")) == false)
4683 	{
4684 		return ERR_INTERNAL_ERROR;
4685 	}
4686 
4687 	// RPC call
4688 	Zero(&t, sizeof(t));
4689 
4690 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4691 
4692 	ret = CcGetAccount(pc->RemoteClient, &t);
4693 
4694 	if (ret == ERR_NO_ERROR)
4695 	{
4696 		RPC_CLIENT_CREATE_ACCOUNT z;
4697 
4698 		t.ClientAuth->AuthType = CLIENT_AUTHTYPE_CERT;
4699 		if (t.ClientAuth->ClientX != NULL)
4700 		{
4701 			FreeX(t.ClientAuth->ClientX);
4702 		}
4703 		if (t.ClientAuth->ClientK != NULL)
4704 		{
4705 			FreeK(t.ClientAuth->ClientK);
4706 		}
4707 
4708 		t.ClientAuth->ClientX = CloneX(x);
4709 		t.ClientAuth->ClientK = CloneK(k);
4710 
4711 		Zero(&z, sizeof(z));
4712 		z.CheckServerCert = t.CheckServerCert;
4713 		z.RetryOnServerCert = t.RetryOnServerCert;
4714 		z.ClientAuth = t.ClientAuth;
4715 		z.ClientOption = t.ClientOption;
4716 		z.ServerCert = t.ServerCert;
4717 		z.StartupAccount = t.StartupAccount;
4718 
4719 		ret = CcSetAccount(pc->RemoteClient, &z);
4720 	}
4721 
4722 	if (ret != ERR_NO_ERROR)
4723 	{
4724 		// Error has occurred
4725 		CmdPrintError(c, ret);
4726 	}
4727 
4728 	FreeX(x);
4729 	FreeK(k);
4730 
4731 	CiFreeClientGetAccount(&t);
4732 
4733 	// Release of the parameter list
4734 	FreeParamValueList(o);
4735 
4736 	return ret;
4737 }
4738 
4739 // Get the client certificate to be used for the connection settings
PcAccountCertGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4740 UINT PcAccountCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4741 {
4742 	LIST *o;
4743 	PC *pc = (PC *)param;
4744 	UINT ret = ERR_NO_ERROR;
4745 	RPC_CLIENT_GET_ACCOUNT t;
4746 	// Parameter list that can be specified
4747 	PARAM args[] =
4748 	{
4749 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4750 		{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
4751 	};
4752 
4753 	// Get the parameter list
4754 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4755 	if (o == NULL)
4756 	{
4757 		return ERR_INVALID_PARAMETER;
4758 	}
4759 
4760 	// RPC call
4761 	Zero(&t, sizeof(t));
4762 
4763 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4764 
4765 	ret = CcGetAccount(pc->RemoteClient, &t);
4766 
4767 	if (ret == ERR_NO_ERROR)
4768 	{
4769 		if (t.ClientAuth->AuthType != CLIENT_AUTHTYPE_CERT && t.ClientAuth->AuthType != CLIENT_AUTHTYPE_OPENSSLENGINE)
4770 		{
4771 			c->Write(c, _UU("CMD_CascadeCertSet_Not_Auth_Cert"));
4772 			ret = ERR_INTERNAL_ERROR;
4773 		}
4774 		else if (t.ClientAuth->ClientX == NULL)
4775 		{
4776 			c->Write(c, _UU("CMD_CascadeCertSet_Cert_Not_Exists"));
4777 			ret = ERR_INTERNAL_ERROR;
4778 		}
4779 		else
4780 		{
4781 			XToFileW(t.ClientAuth->ClientX, GetParamUniStr(o, "SAVECERT"), true);
4782 		}
4783 	}
4784 
4785 	CiFreeClientGetAccount(&t);
4786 
4787 	if (ret != ERR_NO_ERROR)
4788 	{
4789 		// Error has occurred
4790 		CmdPrintError(c, ret);
4791 	}
4792 
4793 	// Release of the parameter list
4794 	FreeParamValueList(o);
4795 
4796 	return ret;
4797 }
4798 
4799 // Disable communication encryption with the connection settings
PcAccountEncryptDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4800 UINT PcAccountEncryptDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4801 {
4802 	LIST *o;
4803 	PC *pc = (PC *)param;
4804 	UINT ret = ERR_NO_ERROR;
4805 	RPC_CLIENT_GET_ACCOUNT t;
4806 	// Parameter list that can be specified
4807 	PARAM args[] =
4808 	{
4809 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4810 	};
4811 
4812 	// Get the parameter list
4813 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4814 	if (o == NULL)
4815 	{
4816 		return ERR_INVALID_PARAMETER;
4817 	}
4818 
4819 	// RPC call
4820 	Zero(&t, sizeof(t));
4821 
4822 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4823 
4824 	ret = CcGetAccount(pc->RemoteClient, &t);
4825 
4826 	if (ret == ERR_NO_ERROR)
4827 	{
4828 		RPC_CLIENT_CREATE_ACCOUNT z;
4829 		// Change the settings
4830 		t.ClientOption->UseEncrypt = false;
4831 
4832 		Zero(&z, sizeof(z));
4833 		z.CheckServerCert = t.CheckServerCert;
4834 		z.RetryOnServerCert = t.RetryOnServerCert;
4835 		z.ClientAuth = t.ClientAuth;
4836 		z.ClientOption = t.ClientOption;
4837 		z.ServerCert = t.ServerCert;
4838 		z.StartupAccount = t.StartupAccount;
4839 
4840 		ret = CcSetAccount(pc->RemoteClient, &z);
4841 	}
4842 
4843 	if (ret != ERR_NO_ERROR)
4844 	{
4845 		// Error has occurred
4846 		CmdPrintError(c, ret);
4847 	}
4848 
4849 	CiFreeClientGetAccount(&t);
4850 
4851 	// Release of the parameter list
4852 	FreeParamValueList(o);
4853 
4854 	return ret;
4855 }
4856 
4857 // Enable communication encryption with the connection settings
PcAccountEncryptEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4858 UINT PcAccountEncryptEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4859 {
4860 	LIST *o;
4861 	PC *pc = (PC *)param;
4862 	UINT ret = ERR_NO_ERROR;
4863 	RPC_CLIENT_GET_ACCOUNT t;
4864 	// Parameter list that can be specified
4865 	PARAM args[] =
4866 	{
4867 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4868 	};
4869 
4870 	// Get the parameter list
4871 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4872 	if (o == NULL)
4873 	{
4874 		return ERR_INVALID_PARAMETER;
4875 	}
4876 
4877 	// RPC call
4878 	Zero(&t, sizeof(t));
4879 
4880 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4881 
4882 	ret = CcGetAccount(pc->RemoteClient, &t);
4883 
4884 	if (ret == ERR_NO_ERROR)
4885 	{
4886 		RPC_CLIENT_CREATE_ACCOUNT z;
4887 		// Change the settings
4888 		t.ClientOption->UseEncrypt = true;
4889 
4890 		Zero(&z, sizeof(z));
4891 		z.CheckServerCert = t.CheckServerCert;
4892 		z.RetryOnServerCert = t.RetryOnServerCert;
4893 		z.ClientAuth = t.ClientAuth;
4894 		z.ClientOption = t.ClientOption;
4895 		z.ServerCert = t.ServerCert;
4896 		z.StartupAccount = t.StartupAccount;
4897 
4898 		ret = CcSetAccount(pc->RemoteClient, &z);
4899 	}
4900 
4901 	if (ret != ERR_NO_ERROR)
4902 	{
4903 		// Error has occurred
4904 		CmdPrintError(c, ret);
4905 	}
4906 
4907 	CiFreeClientGetAccount(&t);
4908 
4909 	// Release of the parameter list
4910 	FreeParamValueList(o);
4911 
4912 	return ret;
4913 }
4914 
4915 // Enable communication data compression with the connection settings
PcAccountCompressEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4916 UINT PcAccountCompressEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4917 {
4918 	LIST *o;
4919 	PC *pc = (PC *)param;
4920 	UINT ret = ERR_NO_ERROR;
4921 	RPC_CLIENT_GET_ACCOUNT t;
4922 	// Parameter list that can be specified
4923 	PARAM args[] =
4924 	{
4925 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4926 	};
4927 
4928 	// Get the parameter list
4929 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4930 	if (o == NULL)
4931 	{
4932 		return ERR_INVALID_PARAMETER;
4933 	}
4934 
4935 	// RPC call
4936 	Zero(&t, sizeof(t));
4937 
4938 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4939 
4940 	ret = CcGetAccount(pc->RemoteClient, &t);
4941 
4942 	if (ret == ERR_NO_ERROR)
4943 	{
4944 		RPC_CLIENT_CREATE_ACCOUNT z;
4945 		// Change the settings
4946 		t.ClientOption->UseCompress = true;
4947 
4948 		Zero(&z, sizeof(z));
4949 		z.CheckServerCert = t.CheckServerCert;
4950 		z.RetryOnServerCert = t.RetryOnServerCert;
4951 		z.ClientAuth = t.ClientAuth;
4952 		z.ClientOption = t.ClientOption;
4953 		z.ServerCert = t.ServerCert;
4954 		z.StartupAccount = t.StartupAccount;
4955 
4956 		ret = CcSetAccount(pc->RemoteClient, &z);
4957 	}
4958 
4959 	if (ret != ERR_NO_ERROR)
4960 	{
4961 		// Error has occurred
4962 		CmdPrintError(c, ret);
4963 	}
4964 
4965 	CiFreeClientGetAccount(&t);
4966 
4967 	// Release of the parameter list
4968 	FreeParamValueList(o);
4969 
4970 	return ret;
4971 }
4972 
4973 // Disable communication data compression with the connection settings
PcAccountCompressDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)4974 UINT PcAccountCompressDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
4975 {
4976 	LIST *o;
4977 	PC *pc = (PC *)param;
4978 	UINT ret = ERR_NO_ERROR;
4979 	RPC_CLIENT_GET_ACCOUNT t;
4980 	// Parameter list that can be specified
4981 	PARAM args[] =
4982 	{
4983 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
4984 	};
4985 
4986 	// Get the parameter list
4987 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
4988 	if (o == NULL)
4989 	{
4990 		return ERR_INVALID_PARAMETER;
4991 	}
4992 
4993 	// RPC call
4994 	Zero(&t, sizeof(t));
4995 
4996 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
4997 
4998 	ret = CcGetAccount(pc->RemoteClient, &t);
4999 
5000 	if (ret == ERR_NO_ERROR)
5001 	{
5002 		RPC_CLIENT_CREATE_ACCOUNT z;
5003 		// Change the settings
5004 		t.ClientOption->UseCompress = false;
5005 
5006 		Zero(&z, sizeof(z));
5007 		z.CheckServerCert = t.CheckServerCert;
5008 		z.RetryOnServerCert = t.RetryOnServerCert;
5009 		z.ClientAuth = t.ClientAuth;
5010 		z.ClientOption = t.ClientOption;
5011 		z.ServerCert = t.ServerCert;
5012 		z.StartupAccount = t.StartupAccount;
5013 
5014 		ret = CcSetAccount(pc->RemoteClient, &z);
5015 	}
5016 
5017 	if (ret != ERR_NO_ERROR)
5018 	{
5019 		// Error has occurred
5020 		CmdPrintError(c, ret);
5021 	}
5022 
5023 	CiFreeClientGetAccount(&t);
5024 
5025 	// Release of the parameter list
5026 	FreeParamValueList(o);
5027 
5028 	return ret;
5029 }
5030 
PcAccountHttpHeaderAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5031 UINT PcAccountHttpHeaderAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5032 {
5033 	LIST *o;
5034 	PC *pc = (PC *)param;
5035 	UINT ret = ERR_NO_ERROR;
5036 	RPC_CLIENT_GET_ACCOUNT t;
5037 
5038 	// Parameter list that can be specified
5039 	PARAM args[] =
5040 	{
5041 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5042 		{"NAME", CmdPrompt, _UU("CMD_AccountHttpHeader_Prompt_Name"), CmdEvalNotEmpty, NULL},
5043 		{"DATA", CmdPrompt, _UU("CMD_AccountHttpHeader_Prompt_Data"), NULL, NULL},
5044 	};
5045 
5046 	// Get the parameter list
5047 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5048 	if (o == NULL)
5049 	{
5050 		return ERR_INVALID_PARAMETER;
5051 	}
5052 
5053 	// RPC call
5054 	Zero(&t, sizeof(t));
5055 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5056 	ret = CcGetAccount(pc->RemoteClient, &t);
5057 
5058 	if (ret == ERR_NO_ERROR)
5059 	{
5060 		UINT i = 0;
5061 		TOKEN_LIST *tokens = NULL;
5062 		HTTP_HEADER *header = NULL;
5063 		char *name = GetParamStr(o, "NAME");
5064 
5065 		Trim(name);
5066 
5067 		header = NewHttpHeader("", "", "");
5068 
5069 		tokens = ParseToken(t.ClientOption->CustomHttpHeader, "\r\n");
5070 		for (i = 0; i < tokens->NumTokens; i++)
5071 		{
5072 			AddHttpValueStr(header, tokens->Token[i]);
5073 		}
5074 		FreeToken(tokens);
5075 
5076 		if (GetHttpValue(header, name) == NULL)
5077 		{
5078 			RPC_CLIENT_CREATE_ACCOUNT z;
5079 			char s[HTTP_CUSTOM_HEADER_MAX_SIZE];
5080 
5081 			Format(s, sizeof(s), "%s: %s\r\n", name, GetParamStr(o, "DATA"));
5082 			EnSafeHttpHeaderValueStr(s, ' ');
5083 
5084 			if ((StrLen(s) + StrLen(t.ClientOption->CustomHttpHeader)) < sizeof(t.ClientOption->CustomHttpHeader)) {
5085 				StrCat(t.ClientOption->CustomHttpHeader, sizeof(s), s);
5086 
5087 				Zero(&z, sizeof(z));
5088 				z.CheckServerCert = t.CheckServerCert;
5089 				z.RetryOnServerCert = t.RetryOnServerCert;
5090 				z.ClientAuth = t.ClientAuth;
5091 				z.ClientOption = t.ClientOption;
5092 				z.ServerCert = t.ServerCert;
5093 				z.StartupAccount = t.StartupAccount;
5094 
5095 				ret = CcSetAccount(pc->RemoteClient, &z);
5096 			}
5097 			else
5098 			{
5099 				// Error has occurred
5100 				ret = ERR_TOO_MANT_ITEMS;
5101 			}
5102 		}
5103 		else
5104 		{
5105 			// Error has occurred
5106 			ret = ERR_OBJECT_EXISTS;
5107 		}
5108 
5109 		FreeHttpHeader(header);
5110 	}
5111 
5112 	if (ret != ERR_NO_ERROR)
5113 	{
5114 		// Error has occurred
5115 		CmdPrintError(c, ret);
5116 	}
5117 
5118 	CiFreeClientGetAccount(&t);
5119 
5120 	// Release of the parameter list
5121 	FreeParamValueList(o);
5122 
5123 	return ret;
5124 }
5125 
PcAccountHttpHeaderDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5126 UINT PcAccountHttpHeaderDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5127 {
5128 	PC *pc = (PC *)param;
5129 	UINT ret = ERR_NO_ERROR;
5130 	RPC_CLIENT_GET_ACCOUNT t;
5131 
5132 	// Parameter list that can be specified
5133 	PARAM args[] =
5134 	{
5135 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5136 		{"NAME", CmdPrompt, _UU("CMD_AccountHttpHeader_Prompt_Name"), CmdEvalNotEmpty, NULL},
5137 	};
5138 
5139 	// Get the parameter list
5140 	LIST *o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5141 	if (o == NULL)
5142 	{
5143 		return ERR_INVALID_PARAMETER;
5144 	}
5145 
5146 	// RPC call
5147 	Zero(&t, sizeof(t));
5148 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5149 	ret = CcGetAccount(pc->RemoteClient, &t);
5150 
5151 	if (ret == ERR_NO_ERROR)
5152 	{
5153 		UINT i = 0;
5154 		TOKEN_LIST *tokens = NULL;
5155 		RPC_CLIENT_CREATE_ACCOUNT z;
5156 		char *value = GetParamStr(o, "NAME");
5157 
5158 		Zero(&z, sizeof(z));
5159 		z.CheckServerCert = t.CheckServerCert;
5160 		z.RetryOnServerCert = t.RetryOnServerCert;
5161 		z.ClientAuth = t.ClientAuth;
5162 		z.ClientOption = t.ClientOption;
5163 		z.ServerCert = t.ServerCert;
5164 		z.StartupAccount = t.StartupAccount;
5165 
5166 		Zero(z.ClientOption->CustomHttpHeader, sizeof(z.ClientOption->CustomHttpHeader));
5167 
5168 		tokens = ParseToken(t.ClientOption->CustomHttpHeader, "\r\n");
5169 
5170 		for (i = 0; i < tokens->NumTokens; i++)
5171 		{
5172 			if (StartWith(tokens->Token[i], value) == false)
5173 			{
5174 				StrCat(z.ClientOption->CustomHttpHeader, sizeof(z.ClientOption->CustomHttpHeader), tokens->Token[i]);
5175 				StrCat(z.ClientOption->CustomHttpHeader, 1, "\r\n");
5176 			}
5177 		}
5178 
5179 		ret = CcSetAccount(pc->RemoteClient, &z);
5180 	}
5181 	else
5182 	{
5183 		// Error has occurred
5184 		CmdPrintError(c, ret);
5185 	}
5186 
5187 	CiFreeClientGetAccount(&t);
5188 
5189 	// Release of the parameter list
5190 	FreeParamValueList(o);
5191 
5192 	return ret;
5193 }
5194 
PcAccountHttpHeaderGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5195 UINT PcAccountHttpHeaderGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5196 {
5197 	PC *pc = (PC *)param;
5198 	UINT ret = ERR_NO_ERROR;
5199 	RPC_CLIENT_GET_ACCOUNT t;
5200 
5201 	// Parameter list that can be specified
5202 	PARAM args[] =
5203 	{
5204 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5205 	};
5206 
5207 	// Get the parameter list
5208 	LIST *o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5209 	if (o == NULL)
5210 	{
5211 		return ERR_INVALID_PARAMETER;
5212 	}
5213 
5214 	// RPC call
5215 	Zero(&t, sizeof(t));
5216 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5217 	ret = CcGetAccount(pc->RemoteClient, &t);
5218 
5219 	// Release of the parameter list
5220 	FreeParamValueList(o);
5221 
5222 	if (ret == ERR_NO_ERROR)
5223 	{
5224 		wchar_t unistr[HTTP_CUSTOM_HEADER_MAX_SIZE];
5225 		TOKEN_LIST *tokens = NULL;
5226 		UINT i = 0;
5227 		CT *ct = CtNew();
5228 		CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_1"), false);
5229 
5230 		tokens = ParseToken(t.ClientOption->CustomHttpHeader, "\r\n");
5231 
5232 		for (i = 0; i < tokens->NumTokens; i++)
5233 		{
5234 			StrToUni(unistr, sizeof(unistr), tokens->Token[i]);
5235 			CtInsert(ct, unistr);
5236 		}
5237 
5238 		CtFreeEx(ct, c, false);
5239 	}
5240 	else
5241 	{
5242 		// Error has occurred
5243 		CmdPrintError(c, ret);
5244 	}
5245 
5246 	CiFreeClientGetAccount(&t);
5247 
5248 	return ret;
5249 }
5250 
5251 // 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)5252 UINT PcAccountProxyNone(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5253 {
5254 	LIST *o;
5255 	PC *pc = (PC *)param;
5256 	UINT ret = ERR_NO_ERROR;
5257 	RPC_CLIENT_GET_ACCOUNT t;
5258 	// Parameter list that can be specified
5259 	PARAM args[] =
5260 	{
5261 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5262 	};
5263 
5264 	// Get the parameter list
5265 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5266 	if (o == NULL)
5267 	{
5268 		return ERR_INVALID_PARAMETER;
5269 	}
5270 
5271 	// RPC call
5272 	Zero(&t, sizeof(t));
5273 
5274 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5275 
5276 	ret = CcGetAccount(pc->RemoteClient, &t);
5277 
5278 	if (ret == ERR_NO_ERROR)
5279 	{
5280 		RPC_CLIENT_CREATE_ACCOUNT z;
5281 		// Change the settings
5282 		t.ClientOption->ProxyType = PROXY_DIRECT;
5283 
5284 		Zero(&z, sizeof(z));
5285 		z.CheckServerCert = t.CheckServerCert;
5286 		z.RetryOnServerCert = t.RetryOnServerCert;
5287 		z.ClientAuth = t.ClientAuth;
5288 		z.ClientOption = t.ClientOption;
5289 		z.ServerCert = t.ServerCert;
5290 		z.StartupAccount = t.StartupAccount;
5291 
5292 		ret = CcSetAccount(pc->RemoteClient, &z);
5293 	}
5294 
5295 	if (ret != ERR_NO_ERROR)
5296 	{
5297 		// Error has occurred
5298 		CmdPrintError(c, ret);
5299 	}
5300 
5301 	CiFreeClientGetAccount(&t);
5302 
5303 	// Release of the parameter list
5304 	FreeParamValueList(o);
5305 
5306 	return ret;
5307 }
5308 
5309 // 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)5310 UINT PcAccountProxyHttp(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5311 {
5312 	LIST *o;
5313 	PC *pc = (PC *)param;
5314 	UINT ret = ERR_NO_ERROR;
5315 	RPC_CLIENT_GET_ACCOUNT t;
5316 	// Parameter list that can be specified
5317 	PARAM args[] =
5318 	{
5319 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5320 		{"SERVER", CmdPrompt, _UU("CMD_AccountProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
5321 		{"USERNAME", NULL, NULL, NULL, NULL},
5322 		{"PASSWORD", NULL, NULL, NULL, NULL},
5323 	};
5324 
5325 	// Get the parameter list
5326 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5327 	if (o == NULL)
5328 	{
5329 		return ERR_INVALID_PARAMETER;
5330 	}
5331 
5332 	// RPC call
5333 	Zero(&t, sizeof(t));
5334 
5335 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5336 
5337 	ret = CcGetAccount(pc->RemoteClient, &t);
5338 
5339 	if (ret == ERR_NO_ERROR)
5340 	{
5341 		RPC_CLIENT_CREATE_ACCOUNT z;
5342 		char *host;
5343 		UINT port;
5344 
5345 		// Data change
5346 		if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))
5347 		{
5348 			t.ClientOption->ProxyType = PROXY_HTTP;
5349 			StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
5350 			t.ClientOption->ProxyPort = port;
5351 			StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
5352 			StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
5353 			Free(host);
5354 		}
5355 
5356 		Zero(&z, sizeof(z));
5357 		z.CheckServerCert = t.CheckServerCert;
5358 		z.RetryOnServerCert = t.RetryOnServerCert;
5359 		z.ClientAuth = t.ClientAuth;
5360 		z.ClientOption = t.ClientOption;
5361 		z.ServerCert = t.ServerCert;
5362 		z.StartupAccount = t.StartupAccount;
5363 
5364 		ret = CcSetAccount(pc->RemoteClient, &z);
5365 	}
5366 
5367 	if (ret != ERR_NO_ERROR)
5368 	{
5369 		// Error has occurred
5370 		CmdPrintError(c, ret);
5371 	}
5372 
5373 	CiFreeClientGetAccount(&t);
5374 
5375 	// Release of the parameter list
5376 	FreeParamValueList(o);
5377 
5378 	return ret;
5379 }
5380 
5381 // Set the connection method of the connection settings to the SOCKS4 proxy server connection
PcAccountProxySocks(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5382 UINT PcAccountProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5383 {
5384 	LIST *o;
5385 	PC *pc = (PC *)param;
5386 	UINT ret = ERR_NO_ERROR;
5387 	RPC_CLIENT_GET_ACCOUNT t;
5388 	// Parameter list that can be specified
5389 	PARAM args[] =
5390 	{
5391 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5392 		{"SERVER", CmdPrompt, _UU("CMD_AccountProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
5393 		{"USERNAME", NULL, NULL, NULL, NULL},
5394 		{"PASSWORD", NULL, NULL, NULL, 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 		char *host;
5415 		UINT port;
5416 
5417 		// Data change
5418 		if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 1080))
5419 		{
5420 			t.ClientOption->ProxyType = PROXY_SOCKS;
5421 			StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
5422 			t.ClientOption->ProxyPort = port;
5423 			StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
5424 			StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
5425 			Free(host);
5426 		}
5427 
5428 		Zero(&z, sizeof(z));
5429 		z.CheckServerCert = t.CheckServerCert;
5430 		z.RetryOnServerCert = t.RetryOnServerCert;
5431 		z.ClientAuth = t.ClientAuth;
5432 		z.ClientOption = t.ClientOption;
5433 		z.ServerCert = t.ServerCert;
5434 		z.StartupAccount = t.StartupAccount;
5435 
5436 		ret = CcSetAccount(pc->RemoteClient, &z);
5437 	}
5438 
5439 	if (ret != ERR_NO_ERROR)
5440 	{
5441 		// Error has occurred
5442 		CmdPrintError(c, ret);
5443 	}
5444 
5445 	CiFreeClientGetAccount(&t);
5446 
5447 	// Release of the parameter list
5448 	FreeParamValueList(o);
5449 
5450 	return ret;
5451 }
5452 
5453 // Set the connection method of the connection settings to the SOCKS5 proxy server connection
PcAccountProxySocks5(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5454 UINT PcAccountProxySocks5(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5455 {
5456 	LIST *o;
5457 	PC *pc = (PC *)param;
5458 	UINT ret = ERR_NO_ERROR;
5459 	RPC_CLIENT_GET_ACCOUNT t;
5460 	// Parameter list that can be specified
5461 	PARAM args[] =
5462 	{
5463 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5464 		{"SERVER", CmdPrompt, _UU("CMD_AccountProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
5465 		{"USERNAME", CmdPrompt, NULL, NULL, NULL},
5466 		{"PASSWORD", CmdPrompt, NULL, NULL, NULL},
5467 	};
5468 
5469 	// Get the parameter list
5470 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5471 	if (o == NULL)
5472 	{
5473 		return ERR_INVALID_PARAMETER;
5474 	}
5475 
5476 	// RPC call
5477 	Zero(&t, sizeof(t));
5478 
5479 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5480 
5481 	ret = CcGetAccount(pc->RemoteClient, &t);
5482 
5483 	if (ret == ERR_NO_ERROR)
5484 	{
5485 		RPC_CLIENT_CREATE_ACCOUNT z;
5486 		char *host;
5487 		UINT port;
5488 
5489 		// Data change
5490 		if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 1080))
5491 		{
5492 			t.ClientOption->ProxyType = PROXY_SOCKS5;
5493 			StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
5494 			t.ClientOption->ProxyPort = port;
5495 			StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
5496 			StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
5497 			Free(host);
5498 		}
5499 
5500 		Zero(&z, sizeof(z));
5501 		z.CheckServerCert = t.CheckServerCert;
5502 		z.RetryOnServerCert = t.RetryOnServerCert;
5503 		z.ClientAuth = t.ClientAuth;
5504 		z.ClientOption = t.ClientOption;
5505 		z.ServerCert = t.ServerCert;
5506 		z.StartupAccount = t.StartupAccount;
5507 
5508 		ret = CcSetAccount(pc->RemoteClient, &z);
5509 	}
5510 
5511 	if (ret != ERR_NO_ERROR)
5512 	{
5513 		// Error has occurred
5514 		CmdPrintError(c, ret);
5515 	}
5516 
5517 	CiFreeClientGetAccount(&t);
5518 
5519 	// Release of the parameter list
5520 	FreeParamValueList(o);
5521 
5522 	return ret;
5523 }
5524 
5525 // Enable validation option for server certificate of connection settings
PcAccountServerCertEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5526 UINT PcAccountServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5527 {
5528 	LIST *o;
5529 	PC *pc = (PC *)param;
5530 	UINT ret = ERR_NO_ERROR;
5531 	RPC_CLIENT_GET_ACCOUNT t;
5532 	// Parameter list that can be specified
5533 	PARAM args[] =
5534 	{
5535 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5536 	};
5537 
5538 	// Get the parameter list
5539 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5540 	if (o == NULL)
5541 	{
5542 		return ERR_INVALID_PARAMETER;
5543 	}
5544 
5545 	// RPC call
5546 	Zero(&t, sizeof(t));
5547 
5548 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5549 
5550 	ret = CcGetAccount(pc->RemoteClient, &t);
5551 
5552 	if (ret == ERR_NO_ERROR)
5553 	{
5554 		RPC_CLIENT_CREATE_ACCOUNT z;
5555 		// Change the settings
5556 		t.CheckServerCert = true;
5557 
5558 		Zero(&z, sizeof(z));
5559 		z.CheckServerCert = t.CheckServerCert;
5560 		z.RetryOnServerCert = t.RetryOnServerCert;
5561 		z.ClientAuth = t.ClientAuth;
5562 		z.ClientOption = t.ClientOption;
5563 		z.ServerCert = t.ServerCert;
5564 		z.StartupAccount = t.StartupAccount;
5565 
5566 		ret = CcSetAccount(pc->RemoteClient, &z);
5567 	}
5568 
5569 	if (ret != ERR_NO_ERROR)
5570 	{
5571 		// Error has occurred
5572 		CmdPrintError(c, ret);
5573 	}
5574 
5575 	CiFreeClientGetAccount(&t);
5576 
5577 	// Release of the parameter list
5578 	FreeParamValueList(o);
5579 
5580 	return ret;
5581 }
5582 
5583 // Disable validation option of the server certificate of connection settings
PcAccountServerCertDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5584 UINT PcAccountServerCertDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5585 {
5586 	LIST *o;
5587 	PC *pc = (PC *)param;
5588 	UINT ret = ERR_NO_ERROR;
5589 	RPC_CLIENT_GET_ACCOUNT t;
5590 	// Parameter list that can be specified
5591 	PARAM args[] =
5592 	{
5593 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5594 	};
5595 
5596 	// Get the parameter list
5597 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5598 	if (o == NULL)
5599 	{
5600 		return ERR_INVALID_PARAMETER;
5601 	}
5602 
5603 	// RPC call
5604 	Zero(&t, sizeof(t));
5605 
5606 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5607 
5608 	ret = CcGetAccount(pc->RemoteClient, &t);
5609 
5610 	if (ret == ERR_NO_ERROR)
5611 	{
5612 		RPC_CLIENT_CREATE_ACCOUNT z;
5613 		// Change the settings
5614 		t.CheckServerCert = false;
5615 
5616 		Zero(&z, sizeof(z));
5617 		z.CheckServerCert = t.CheckServerCert;
5618 		z.RetryOnServerCert = t.RetryOnServerCert;
5619 		z.ClientAuth = t.ClientAuth;
5620 		z.ClientOption = t.ClientOption;
5621 		z.ServerCert = t.ServerCert;
5622 		z.StartupAccount = t.StartupAccount;
5623 
5624 		ret = CcSetAccount(pc->RemoteClient, &z);
5625 	}
5626 
5627 	if (ret != ERR_NO_ERROR)
5628 	{
5629 		// Error has occurred
5630 		CmdPrintError(c, ret);
5631 	}
5632 
5633 	CiFreeClientGetAccount(&t);
5634 
5635 	// Release of the parameter list
5636 	FreeParamValueList(o);
5637 
5638 	return ret;
5639 }
5640 
5641 // Enable retry option of the invalid server certificate of connection settings
PcAccountRetryOnServerCertEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5642 UINT PcAccountRetryOnServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5643 {
5644 	LIST *o;
5645 	PC *pc = (PC *)param;
5646 	UINT ret = ERR_NO_ERROR;
5647 	RPC_CLIENT_GET_ACCOUNT t;
5648 	// Parameter list that can be specified
5649 	PARAM args[] =
5650 	{
5651 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5652 	};
5653 
5654 	// Get the parameter list
5655 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5656 	if (o == NULL)
5657 	{
5658 		return ERR_INVALID_PARAMETER;
5659 	}
5660 
5661 	// RPC call
5662 	Zero(&t, sizeof(t));
5663 
5664 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5665 
5666 	ret = CcGetAccount(pc->RemoteClient, &t);
5667 
5668 	if (ret == ERR_NO_ERROR)
5669 	{
5670 		RPC_CLIENT_CREATE_ACCOUNT z;
5671 		// Change the settings
5672 		t.RetryOnServerCert = true;
5673 
5674 		Zero(&z, sizeof(z));
5675 		z.CheckServerCert = t.CheckServerCert;
5676 		z.RetryOnServerCert = t.RetryOnServerCert;
5677 		z.ClientAuth = t.ClientAuth;
5678 		z.ClientOption = t.ClientOption;
5679 		z.ServerCert = t.ServerCert;
5680 		z.StartupAccount = t.StartupAccount;
5681 
5682 		ret = CcSetAccount(pc->RemoteClient, &z);
5683 	}
5684 
5685 	if (ret != ERR_NO_ERROR)
5686 	{
5687 		// Error has occurred
5688 		CmdPrintError(c, ret);
5689 	}
5690 
5691 	CiFreeClientGetAccount(&t);
5692 
5693 	// Release of the parameter list
5694 	FreeParamValueList(o);
5695 
5696 	return ret;
5697 }
5698 
5699 // Disable retry option of the invalid server certificate of connection settings
PcAccountRetryOnServerCertDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5700 UINT PcAccountRetryOnServerCertDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5701 {
5702 	LIST *o;
5703 	PC *pc = (PC *)param;
5704 	UINT ret = ERR_NO_ERROR;
5705 	RPC_CLIENT_GET_ACCOUNT t;
5706 	// Parameter list that can be specified
5707 	PARAM args[] =
5708 	{
5709 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5710 	};
5711 
5712 	// Get the parameter list
5713 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5714 	if (o == NULL)
5715 	{
5716 		return ERR_INVALID_PARAMETER;
5717 	}
5718 
5719 	// RPC call
5720 	Zero(&t, sizeof(t));
5721 
5722 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5723 
5724 	ret = CcGetAccount(pc->RemoteClient, &t);
5725 
5726 	if (ret == ERR_NO_ERROR)
5727 	{
5728 		RPC_CLIENT_CREATE_ACCOUNT z;
5729 		// Change the settings
5730 		t.RetryOnServerCert = false;
5731 
5732 		Zero(&z, sizeof(z));
5733 		z.CheckServerCert = t.CheckServerCert;
5734 		z.RetryOnServerCert = t.RetryOnServerCert;
5735 		z.ClientAuth = t.ClientAuth;
5736 		z.ClientOption = t.ClientOption;
5737 		z.ServerCert = t.ServerCert;
5738 		z.StartupAccount = t.StartupAccount;
5739 
5740 		ret = CcSetAccount(pc->RemoteClient, &z);
5741 	}
5742 
5743 	if (ret != ERR_NO_ERROR)
5744 	{
5745 		// Error has occurred
5746 		CmdPrintError(c, ret);
5747 	}
5748 
5749 	CiFreeClientGetAccount(&t);
5750 
5751 	// Release of the parameter list
5752 	FreeParamValueList(o);
5753 
5754 	return ret;
5755 }
5756 
5757 // Set the server-specific certificate of connection settings
PcAccountServerCertSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5758 UINT PcAccountServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5759 {
5760 	LIST *o;
5761 	PC *pc = (PC *)param;
5762 	UINT ret = ERR_NO_ERROR;
5763 	RPC_CLIENT_GET_ACCOUNT t;
5764 	X *x;
5765 	// Parameter list that can be specified
5766 	PARAM args[] =
5767 	{
5768 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5769 		{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
5770 	};
5771 
5772 	// Get the parameter list
5773 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5774 	if (o == NULL)
5775 	{
5776 		return ERR_INVALID_PARAMETER;
5777 	}
5778 
5779 	x = FileToXW(GetParamUniStr(o, "LOADCERT"));
5780 	if (x == NULL)
5781 	{
5782 		FreeParamValueList(o);
5783 		c->Write(c, _UU("CMD_LOADCERT_FAILED"));
5784 		return ERR_INTERNAL_ERROR;
5785 	}
5786 
5787 	// RPC call
5788 	Zero(&t, sizeof(t));
5789 
5790 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5791 
5792 	ret = CcGetAccount(pc->RemoteClient, &t);
5793 
5794 	if (ret == ERR_NO_ERROR)
5795 	{
5796 		RPC_CLIENT_CREATE_ACCOUNT z;
5797 		// Change the settings
5798 		if (t.ServerCert != NULL)
5799 		{
5800 			FreeX(t.ServerCert);
5801 		}
5802 		t.ServerCert = CloneX(x);
5803 
5804 		Zero(&z, sizeof(z));
5805 		z.CheckServerCert = t.CheckServerCert;
5806 		z.RetryOnServerCert = t.RetryOnServerCert;
5807 		z.ClientAuth = t.ClientAuth;
5808 		z.ClientOption = t.ClientOption;
5809 		z.ServerCert = t.ServerCert;
5810 		z.StartupAccount = t.StartupAccount;
5811 
5812 		ret = CcSetAccount(pc->RemoteClient, &z);
5813 	}
5814 
5815 	if (ret != ERR_NO_ERROR)
5816 	{
5817 		// Error has occurred
5818 		CmdPrintError(c, ret);
5819 	}
5820 
5821 	CiFreeClientGetAccount(&t);
5822 
5823 	// Release of the parameter list
5824 	FreeParamValueList(o);
5825 
5826 	FreeX(x);
5827 
5828 	return ret;
5829 }
5830 
5831 // Delete a server-specific certificate of connection settings
PcAccountServerCertDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5832 UINT PcAccountServerCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5833 {
5834 	LIST *o;
5835 	PC *pc = (PC *)param;
5836 	UINT ret = ERR_NO_ERROR;
5837 	RPC_CLIENT_GET_ACCOUNT t;
5838 	// Parameter list that can be specified
5839 	PARAM args[] =
5840 	{
5841 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5842 	};
5843 
5844 	// Get the parameter list
5845 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5846 	if (o == NULL)
5847 	{
5848 		return ERR_INVALID_PARAMETER;
5849 	}
5850 
5851 	// RPC call
5852 	Zero(&t, sizeof(t));
5853 
5854 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5855 
5856 	ret = CcGetAccount(pc->RemoteClient, &t);
5857 
5858 	if (ret == ERR_NO_ERROR)
5859 	{
5860 		RPC_CLIENT_CREATE_ACCOUNT z;
5861 		// Change the settings
5862 		if (t.ServerCert != NULL)
5863 		{
5864 			FreeX(t.ServerCert);
5865 		}
5866 		t.ServerCert = NULL;
5867 
5868 		Zero(&z, sizeof(z));
5869 		z.CheckServerCert = t.CheckServerCert;
5870 		z.RetryOnServerCert = t.RetryOnServerCert;
5871 		z.ClientAuth = t.ClientAuth;
5872 		z.ClientOption = t.ClientOption;
5873 		z.ServerCert = t.ServerCert;
5874 		z.StartupAccount = t.StartupAccount;
5875 
5876 		ret = CcSetAccount(pc->RemoteClient, &z);
5877 	}
5878 
5879 	if (ret != ERR_NO_ERROR)
5880 	{
5881 		// Error has occurred
5882 		CmdPrintError(c, ret);
5883 	}
5884 
5885 	CiFreeClientGetAccount(&t);
5886 
5887 	// Release of the parameter list
5888 	FreeParamValueList(o);
5889 
5890 	return ret;
5891 }
5892 
5893 // Get a server-specific certificate of connection settings
PcAccountServerCertGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5894 UINT PcAccountServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5895 {
5896 	LIST *o;
5897 	PC *pc = (PC *)param;
5898 	UINT ret = ERR_NO_ERROR;
5899 	RPC_CLIENT_GET_ACCOUNT t;
5900 	// Parameter list that can be specified
5901 	PARAM args[] =
5902 	{
5903 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5904 		{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
5905 	};
5906 
5907 	// Get the parameter list
5908 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5909 	if (o == NULL)
5910 	{
5911 		return ERR_INVALID_PARAMETER;
5912 	}
5913 
5914 	// RPC call
5915 	Zero(&t, sizeof(t));
5916 
5917 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5918 
5919 	ret = CcGetAccount(pc->RemoteClient, &t);
5920 
5921 	if (ret == ERR_NO_ERROR)
5922 	{
5923 		RPC_CLIENT_CREATE_ACCOUNT z;
5924 		// Change the settings
5925 		if (t.ServerCert != NULL)
5926 		{
5927 			FreeX(t.ServerCert);
5928 		}
5929 		t.ServerCert = NULL;
5930 
5931 		Zero(&z, sizeof(z));
5932 		z.CheckServerCert = t.CheckServerCert;
5933 		z.RetryOnServerCert = t.RetryOnServerCert;
5934 		z.ClientAuth = t.ClientAuth;
5935 		z.ClientOption = t.ClientOption;
5936 		z.ServerCert = t.ServerCert;
5937 		z.StartupAccount = t.StartupAccount;
5938 
5939 		ret = CcSetAccount(pc->RemoteClient, &z);
5940 	}
5941 
5942 	if (ret != ERR_NO_ERROR)
5943 	{
5944 		// Error has occurred
5945 		CmdPrintError(c, ret);
5946 	}
5947 
5948 	CiFreeClientGetAccount(&t);
5949 
5950 	// Release of the parameter list
5951 	FreeParamValueList(o);
5952 
5953 	return ret;
5954 }
5955 
5956 // Set the advanced settings of connection settings
PcAccountDetailSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)5957 UINT PcAccountDetailSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
5958 {
5959 	LIST *o;
5960 	PC *pc = (PC *)param;
5961 	UINT ret = ERR_NO_ERROR;
5962 	RPC_CLIENT_GET_ACCOUNT t;
5963 	CMD_EVAL_MIN_MAX mm_maxtcp =
5964 	{
5965 		"CMD_CascadeDetailSet_Eval_MaxTcp", 1, 32
5966 	};
5967 	CMD_EVAL_MIN_MAX mm_interval =
5968 	{
5969 		"CMD_CascadeDetailSet_Eval_Interval", 1, 4294967295UL
5970 	};
5971 	// Parameter list that can be specified
5972 	PARAM args[] =
5973 	{
5974 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
5975 		{"MAXTCP", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_MaxTcp"), CmdEvalMinMax, &mm_maxtcp},
5976 		{"INTERVAL", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_Interval"), CmdEvalMinMax, &mm_interval},
5977 		{"TTL", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_TTL"), NULL, NULL},
5978 		{"HALF", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_HALF"), NULL, NULL},
5979 		{"BRIDGE", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_BRIDGE"), NULL, NULL},
5980 		{"MONITOR", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_MONITOR"), NULL, NULL},
5981 		{"NOTRACK", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_NOTRACK"), NULL, NULL},
5982 		{"NOQOS", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_NOQOS"), NULL, NULL},
5983 		{"DISABLEUDP", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_DISABLEUDP"), NULL, NULL},
5984 	};
5985 
5986 	// Get the parameter list
5987 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
5988 	if (o == NULL)
5989 	{
5990 		return ERR_INVALID_PARAMETER;
5991 	}
5992 
5993 	// RPC call
5994 	Zero(&t, sizeof(t));
5995 
5996 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
5997 
5998 	ret = CcGetAccount(pc->RemoteClient, &t);
5999 
6000 	if (ret == ERR_NO_ERROR)
6001 	{
6002 		RPC_CLIENT_CREATE_ACCOUNT z;
6003 		// Data change
6004 		t.ClientOption->MaxConnection = GetParamInt(o, "MAXTCP");
6005 		t.ClientOption->AdditionalConnectionInterval = GetParamInt(o, "INTERVAL");
6006 		t.ClientOption->ConnectionDisconnectSpan = GetParamInt(o, "TTL");
6007 		t.ClientOption->HalfConnection = GetParamYes(o, "HALF");
6008 		t.ClientOption->RequireBridgeRoutingMode = GetParamYes(o, "BRIDGE");
6009 		t.ClientOption->RequireMonitorMode = GetParamYes(o, "MONITOR");
6010 		t.ClientOption->NoRoutingTracking = GetParamYes(o, "NOTRACK");
6011 		t.ClientOption->DisableQoS = GetParamYes(o, "NOQOS");
6012 		t.ClientOption->NoUdpAcceleration = GetParamYes(o, "DISABLEUDP");
6013 
6014 		Zero(&z, sizeof(z));
6015 		z.CheckServerCert = t.CheckServerCert;
6016 		z.ClientAuth = t.ClientAuth;
6017 		z.ClientOption = t.ClientOption;
6018 		z.ServerCert = t.ServerCert;
6019 		z.StartupAccount = t.StartupAccount;
6020 
6021 		ret = CcSetAccount(pc->RemoteClient, &z);
6022 	}
6023 
6024 	if (ret != ERR_NO_ERROR)
6025 	{
6026 		// Error has occurred
6027 		CmdPrintError(c, ret);
6028 	}
6029 
6030 	CiFreeClientGetAccount(&t);
6031 
6032 	// Release of the parameter list
6033 	FreeParamValueList(o);
6034 
6035 	return ret;
6036 }
6037 
6038 // Change the name of the connection settings
PcAccountRename(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6039 UINT PcAccountRename(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6040 {
6041 	LIST *o;
6042 	PC *pc = (PC *)param;
6043 	UINT ret = ERR_NO_ERROR;
6044 	RPC_RENAME_ACCOUNT t;
6045 	// Parameter list that can be specified
6046 	PARAM args[] =
6047 	{
6048 		{"[name]", CmdPrompt, _UU("CMD_AccountRename_PROMPT_OLD"), CmdEvalNotEmpty, NULL},
6049 		{"NEW", CmdPrompt, _UU("CMD_AccountRename_PROMPT_NEW"), CmdEvalNotEmpty, NULL},
6050 	};
6051 
6052 	// Get the parameter list
6053 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6054 	if (o == NULL)
6055 	{
6056 		return ERR_INVALID_PARAMETER;
6057 	}
6058 
6059 	// RPC call
6060 	Zero(&t, sizeof(t));
6061 	UniStrCpy(t.NewName, sizeof(t.NewName), GetParamUniStr(o, "NEW"));
6062 	UniStrCpy(t.OldName, sizeof(t.OldName), GetParamUniStr(o, "[name]"));
6063 
6064 	ret = CcRenameAccount(pc->RemoteClient, &t);
6065 
6066 	if (ret == ERR_NO_ERROR)
6067 	{
6068 		// Success
6069 	}
6070 
6071 	if (ret != ERR_NO_ERROR)
6072 	{
6073 		// Error has occurred
6074 		CmdPrintError(c, ret);
6075 	}
6076 
6077 	// Release of the parameter list
6078 	FreeParamValueList(o);
6079 
6080 	return ret;
6081 }
6082 
6083 // Start to connect to the VPN Server using the connection settings
PcAccountConnect(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6084 UINT PcAccountConnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6085 {
6086 	LIST *o;
6087 	PC *pc = (PC *)param;
6088 	UINT ret = ERR_NO_ERROR;
6089 	RPC_CLIENT_CONNECT t;
6090 	// Parameter list that can be specified
6091 	PARAM args[] =
6092 	{
6093 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6094 	};
6095 
6096 	// Get the parameter list
6097 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6098 	if (o == NULL)
6099 	{
6100 		return ERR_INVALID_PARAMETER;
6101 	}
6102 
6103 	// RPC call
6104 	Zero(&t, sizeof(t));
6105 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6106 
6107 	ret = CcConnect(pc->RemoteClient, &t);
6108 
6109 	if (ret == ERR_NO_ERROR)
6110 	{
6111 		// Success
6112 	}
6113 
6114 	if (ret != ERR_NO_ERROR)
6115 	{
6116 		// Error has occurred
6117 		CmdPrintError(c, ret);
6118 	}
6119 
6120 	// Release of the parameter list
6121 	FreeParamValueList(o);
6122 
6123 	return ret;
6124 }
6125 
6126 // Disconnect the connection settings of connected
PcAccountDisconnect(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6127 UINT PcAccountDisconnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6128 {
6129 	LIST *o;
6130 	PC *pc = (PC *)param;
6131 	UINT ret = ERR_NO_ERROR;
6132 	RPC_CLIENT_CONNECT t;
6133 	// Parameter list that can be specified
6134 	PARAM args[] =
6135 	{
6136 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6137 	};
6138 
6139 	// Get the parameter list
6140 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6141 	if (o == NULL)
6142 	{
6143 		return ERR_INVALID_PARAMETER;
6144 	}
6145 
6146 	// RPC call
6147 	Zero(&t, sizeof(t));
6148 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6149 
6150 	ret = CcDisconnect(pc->RemoteClient, &t);
6151 
6152 	if (ret == ERR_NO_ERROR)
6153 	{
6154 		// Success
6155 	}
6156 
6157 	if (ret != ERR_NO_ERROR)
6158 	{
6159 		// Error has occurred
6160 		CmdPrintError(c, ret);
6161 	}
6162 
6163 	// Release of the parameter list
6164 	FreeParamValueList(o);
6165 
6166 	return ret;
6167 }
6168 
6169 // Get the current state of the connection settings
PcAccountStatusGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6170 UINT PcAccountStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6171 {
6172 	LIST *o;
6173 	PC *pc = (PC *)param;
6174 	UINT ret = ERR_NO_ERROR;
6175 	RPC_CLIENT_GET_CONNECTION_STATUS t;
6176 	// Parameter list that can be specified
6177 	PARAM args[] =
6178 	{
6179 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6180 	};
6181 
6182 	// Get the parameter list
6183 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6184 	if (o == NULL)
6185 	{
6186 		return ERR_INVALID_PARAMETER;
6187 	}
6188 
6189 	// RPC call
6190 	Zero(&t, sizeof(t));
6191 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6192 
6193 	ret = CcGetAccountStatus(pc->RemoteClient, &t);
6194 
6195 	if (ret == ERR_NO_ERROR)
6196 	{
6197 		if (t.Active == false)
6198 		{
6199 			// Has been disconnected
6200 			ret = ERR_ACCOUNT_INACTIVE;
6201 		}
6202 		else
6203 		{
6204 			CT *ct = CtNewStandard();
6205 
6206 			CmdPrintStatusToListView(ct, &t);
6207 
6208 			CtFree(ct, c);
6209 		}
6210 	}
6211 
6212 	if (ret != ERR_NO_ERROR)
6213 	{
6214 		// Error has occurred
6215 		CmdPrintError(c, ret);
6216 	}
6217 
6218 	CiFreeClientGetConnectionStatus(&t);
6219 
6220 	// Release of the parameter list
6221 	FreeParamValueList(o);
6222 
6223 	return ret;
6224 }
6225 
6226 // Set a virtual LAN card to be used in the connection settings
PcAccountNicSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6227 UINT PcAccountNicSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6228 {
6229 	LIST *o;
6230 	PC *pc = (PC *)param;
6231 	UINT ret = ERR_NO_ERROR;
6232 	RPC_CLIENT_GET_ACCOUNT t;
6233 	// Parameter list that can be specified
6234 	PARAM args[] =
6235 	{
6236 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6237 		{"NICNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Nicname"), CmdEvalNotEmpty, NULL},
6238 	};
6239 
6240 	// Get the parameter list
6241 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6242 	if (o == NULL)
6243 	{
6244 		return ERR_INVALID_PARAMETER;
6245 	}
6246 
6247 	// RPC call
6248 	Zero(&t, sizeof(t));
6249 
6250 	Zero(&t, sizeof(t));
6251 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6252 
6253 	ret = CcGetAccount(pc->RemoteClient, &t);
6254 
6255 	if (ret == ERR_NO_ERROR)
6256 	{
6257 		RPC_CLIENT_CREATE_ACCOUNT c;
6258 		// Success
6259 		StrCpy(t.ClientOption->DeviceName, sizeof(t.ClientOption->DeviceName),
6260 			GetParamStr(o, "NICNAME"));
6261 
6262 		Zero(&c, sizeof(c));
6263 
6264 		c.ClientAuth = t.ClientAuth;
6265 		c.ClientOption = t.ClientOption;
6266 		c.CheckServerCert = t.CheckServerCert;
6267 		c.RetryOnServerCert = t.RetryOnServerCert;
6268 		c.ServerCert = t.ServerCert;
6269 		c.StartupAccount = t.StartupAccount;
6270 
6271 		ret = CcSetAccount(pc->RemoteClient, &c);
6272 	}
6273 
6274 	if (ret != ERR_NO_ERROR)
6275 	{
6276 		// Error has occurred
6277 		CmdPrintError(c, ret);
6278 	}
6279 
6280 	CiFreeClientGetAccount(&t);
6281 
6282 	// Release of the parameter list
6283 	FreeParamValueList(o);
6284 
6285 	return ret;
6286 }
6287 
6288 // 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)6289 UINT PcAccountStatusShow(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6290 {
6291 	LIST *o;
6292 	PC *pc = (PC *)param;
6293 	UINT ret = ERR_NO_ERROR;
6294 	RPC_CLIENT_GET_ACCOUNT t;
6295 	// Parameter list that can be specified
6296 	PARAM args[] =
6297 	{
6298 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6299 	};
6300 
6301 	// Get the parameter list
6302 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6303 	if (o == NULL)
6304 	{
6305 		return ERR_INVALID_PARAMETER;
6306 	}
6307 
6308 	// RPC call
6309 	Zero(&t, sizeof(t));
6310 
6311 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6312 
6313 	ret = CcGetAccount(pc->RemoteClient, &t);
6314 
6315 	if (ret == ERR_NO_ERROR)
6316 	{
6317 		RPC_CLIENT_CREATE_ACCOUNT z;
6318 		// Change the settings
6319 		t.ClientOption->HideStatusWindow = false;
6320 
6321 		Zero(&z, sizeof(z));
6322 		z.CheckServerCert = t.CheckServerCert;
6323 		z.RetryOnServerCert = t.RetryOnServerCert;
6324 		z.ClientAuth = t.ClientAuth;
6325 		z.ClientOption = t.ClientOption;
6326 		z.ServerCert = t.ServerCert;
6327 		z.StartupAccount = t.StartupAccount;
6328 
6329 		ret = CcSetAccount(pc->RemoteClient, &z);
6330 	}
6331 
6332 	if (ret != ERR_NO_ERROR)
6333 	{
6334 		// Error has occurred
6335 		CmdPrintError(c, ret);
6336 	}
6337 
6338 	CiFreeClientGetAccount(&t);
6339 
6340 	// Release of the parameter list
6341 	FreeParamValueList(o);
6342 
6343 	return ret;
6344 }
6345 
6346 // 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)6347 UINT PcAccountStatusHide(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6348 {
6349 	LIST *o;
6350 	PC *pc = (PC *)param;
6351 	UINT ret = ERR_NO_ERROR;
6352 	RPC_CLIENT_GET_ACCOUNT t;
6353 	// Parameter list that can be specified
6354 	PARAM args[] =
6355 	{
6356 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6357 	};
6358 
6359 	// Get the parameter list
6360 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6361 	if (o == NULL)
6362 	{
6363 		return ERR_INVALID_PARAMETER;
6364 	}
6365 
6366 	// RPC call
6367 	Zero(&t, sizeof(t));
6368 
6369 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6370 
6371 	ret = CcGetAccount(pc->RemoteClient, &t);
6372 
6373 	if (ret == ERR_NO_ERROR)
6374 	{
6375 		RPC_CLIENT_CREATE_ACCOUNT z;
6376 		// Change the settings
6377 		t.ClientOption->HideStatusWindow = true;
6378 
6379 		Zero(&z, sizeof(z));
6380 		z.CheckServerCert = t.CheckServerCert;
6381 		z.RetryOnServerCert = t.RetryOnServerCert;
6382 		z.ClientAuth = t.ClientAuth;
6383 		z.ClientOption = t.ClientOption;
6384 		z.ServerCert = t.ServerCert;
6385 		z.StartupAccount = t.StartupAccount;
6386 
6387 		ret = CcSetAccount(pc->RemoteClient, &z);
6388 	}
6389 
6390 	if (ret != ERR_NO_ERROR)
6391 	{
6392 		// Error has occurred
6393 		CmdPrintError(c, ret);
6394 	}
6395 
6396 	CiFreeClientGetAccount(&t);
6397 
6398 	// Release of the parameter list
6399 	FreeParamValueList(o);
6400 
6401 	return ret;
6402 }
6403 
6404 // 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)6405 UINT PcAccountSecureCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6406 {
6407 	LIST *o;
6408 	PC *pc = (PC *)param;
6409 	UINT ret = ERR_NO_ERROR;
6410 	RPC_CLIENT_GET_ACCOUNT t;
6411 	// Parameter list that can be specified
6412 	PARAM args[] =
6413 	{
6414 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6415 		{"CERTNAME", CmdPrompt, _UU("CMD_AccountSecureCertSet_PROMPT_CERTNAME"), CmdEvalNotEmpty, NULL},
6416 		{"KEYNAME", CmdPrompt, _UU("CMD_AccountSecureCertSet_PROMPT_KEYNAME"), CmdEvalNotEmpty, NULL},
6417 	};
6418 
6419 	// Get the parameter list
6420 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6421 	if (o == NULL)
6422 	{
6423 		return ERR_INVALID_PARAMETER;
6424 	}
6425 
6426 	// RPC call
6427 	Zero(&t, sizeof(t));
6428 
6429 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6430 
6431 	ret = CcGetAccount(pc->RemoteClient, &t);
6432 
6433 	if (ret == ERR_NO_ERROR)
6434 	{
6435 		RPC_CLIENT_CREATE_ACCOUNT z;
6436 		// Change the settings
6437 		t.ClientAuth->AuthType = CLIENT_AUTHTYPE_SECURE;
6438 		StrCpy(t.ClientAuth->SecurePublicCertName, sizeof(t.ClientAuth->SecurePublicCertName),
6439 			GetParamStr(o, "CERTNAME"));
6440 		StrCpy(t.ClientAuth->SecurePrivateKeyName, sizeof(t.ClientAuth->SecurePrivateKeyName),
6441 			GetParamStr(o, "KEYNAME"));
6442 
6443 		Zero(&z, sizeof(z));
6444 		z.CheckServerCert = t.CheckServerCert;
6445 		z.RetryOnServerCert = t.RetryOnServerCert;
6446 		z.ClientAuth = t.ClientAuth;
6447 		z.ClientOption = t.ClientOption;
6448 		z.ServerCert = t.ServerCert;
6449 		z.StartupAccount = t.StartupAccount;
6450 
6451 		ret = CcSetAccount(pc->RemoteClient, &z);
6452 	}
6453 
6454 	if (ret != ERR_NO_ERROR)
6455 	{
6456 		// Error has occurred
6457 		CmdPrintError(c, ret);
6458 	}
6459 
6460 	CiFreeClientGetAccount(&t);
6461 
6462 	// Release of the parameter list
6463 	FreeParamValueList(o);
6464 
6465 	return ret;
6466 }
6467 
PcAccountOpensslEngineCertSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6468 UINT PcAccountOpensslEngineCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6469 {
6470 	LIST *o;
6471 	PC *pc = (PC *)param;
6472 	UINT ret = ERR_NO_ERROR;
6473 	RPC_CLIENT_GET_ACCOUNT t;
6474 	// Parameter list that can be specified
6475 	PARAM args[] =
6476 	{
6477 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6478 		{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
6479 		{"KEYNAME", CmdPrompt, _UU("CMD_AccountOpensslCertSet_PROMPT_KEYNAME"), CmdEvalNotEmpty, NULL},
6480 		{"ENGINENAME", CmdPrompt, _UU("CMD_AccountOpensslCertSet_PROMPT_ENGINENAME"), CmdEvalNotEmpty, NULL},
6481 	};
6482 
6483 	// Get the parameter list
6484 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6485 	if (o == NULL)
6486 	{
6487 		return ERR_INVALID_PARAMETER;
6488 	}
6489 
6490 	// RPC call
6491 	Zero(&t, sizeof(t));
6492 
6493 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6494 
6495 	ret = CcGetAccount(pc->RemoteClient, &t);
6496 
6497 	if (ret == ERR_NO_ERROR)
6498 	{
6499 		RPC_CLIENT_CREATE_ACCOUNT z;
6500 		t.ClientAuth->AuthType = CLIENT_AUTHTYPE_OPENSSLENGINE;
6501     X *x;
6502 	  x = FileToXW(GetParamUniStr(o, "LOADCERT"));
6503     if (x == NULL)
6504     {
6505 			c->Write(c, _UU("CMD_LOADCERT_FAILED"));
6506     }
6507 		StrCpy(t.ClientAuth->OpensslEnginePrivateKeyName, sizeof(t.ClientAuth->OpensslEnginePrivateKeyName),
6508 					 GetParamStr(o, "KEYNAME"));
6509 		StrCpy(t.ClientAuth->OpensslEngineName, sizeof(t.ClientAuth->OpensslEngineName),
6510 					 GetParamStr(o, "ENGINENAME"));
6511 		t.ClientAuth->ClientX = CloneX(x);
6512 		Zero(&z, sizeof(z));
6513 		z.CheckServerCert = t.CheckServerCert;
6514 		z.RetryOnServerCert = t.RetryOnServerCert;
6515 		z.ClientAuth = t.ClientAuth;
6516 		z.ClientOption = t.ClientOption;
6517 		z.ServerCert = t.ServerCert;
6518 		z.StartupAccount = t.StartupAccount;
6519 
6520 		ret = CcSetAccount(pc->RemoteClient, &z);
6521 	}
6522 
6523 	if (ret != ERR_NO_ERROR)
6524 	{
6525 		// Error has occurred
6526 		CmdPrintError(c, ret);
6527 	}
6528 
6529 	CiFreeClientGetAccount(&t);
6530 
6531 	// Release of the parameter list
6532 	FreeParamValueList(o);
6533 
6534 	return ret;
6535 }
6536 
6537 
6538 // 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)6539 UINT PcAccountRetrySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6540 {
6541 	LIST *o;
6542 	PC *pc = (PC *)param;
6543 	UINT ret = ERR_NO_ERROR;
6544 	RPC_CLIENT_GET_ACCOUNT t;
6545 	// Parameter list that can be specified
6546 	CMD_EVAL_MIN_MAX minmax =
6547 	{
6548 		"CMD_AccountRetrySet_EVAL_INTERVAL",
6549 		5,
6550 		4294967295UL,
6551 	};
6552 	PARAM args[] =
6553 	{
6554 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6555 		{"NUM", CmdPrompt, _UU("CMD_AccountRetrySet_PROMPT_NUM"), CmdEvalNotEmpty, NULL},
6556 		{"INTERVAL", CmdPrompt, _UU("CMD_AccountRetrySet_PROMPT_INTERVAL"), CmdEvalMinMax, &minmax},
6557 	};
6558 
6559 	// Get the parameter list
6560 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6561 	if (o == NULL)
6562 	{
6563 		return ERR_INVALID_PARAMETER;
6564 	}
6565 
6566 	// RPC call
6567 	Zero(&t, sizeof(t));
6568 
6569 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6570 
6571 	ret = CcGetAccount(pc->RemoteClient, &t);
6572 
6573 	if (ret == ERR_NO_ERROR)
6574 	{
6575 		RPC_CLIENT_CREATE_ACCOUNT z;
6576 		// Change the settings
6577 		UINT num = GetParamInt(o, "NUM");
6578 		UINT interval = GetParamInt(o, "INTERVAL");
6579 
6580 		t.ClientOption->NumRetry = (num == 999) ? INFINITE : num;
6581 		t.ClientOption->RetryInterval = interval;
6582 
6583 		Zero(&z, sizeof(z));
6584 		z.CheckServerCert = t.CheckServerCert;
6585 		z.RetryOnServerCert = t.RetryOnServerCert;
6586 		z.ClientAuth = t.ClientAuth;
6587 		z.ClientOption = t.ClientOption;
6588 		z.ServerCert = t.ServerCert;
6589 		z.StartupAccount = t.StartupAccount;
6590 
6591 		ret = CcSetAccount(pc->RemoteClient, &z);
6592 	}
6593 
6594 	if (ret != ERR_NO_ERROR)
6595 	{
6596 		// Error has occurred
6597 		CmdPrintError(c, ret);
6598 	}
6599 
6600 	CiFreeClientGetAccount(&t);
6601 
6602 	// Release of the parameter list
6603 	FreeParamValueList(o);
6604 
6605 	return ret;
6606 }
6607 
6608 
6609 // Set to start-up connection the connection settings
PcAccountStartupSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6610 UINT PcAccountStartupSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6611 {
6612 	LIST *o;
6613 	PC *pc = (PC *)param;
6614 	UINT ret = ERR_NO_ERROR;
6615 	RPC_CLIENT_GET_ACCOUNT t;
6616 	// Parameter list that can be specified
6617 	PARAM args[] =
6618 	{
6619 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6620 	};
6621 
6622 	// Get the parameter list
6623 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6624 	if (o == NULL)
6625 	{
6626 		return ERR_INVALID_PARAMETER;
6627 	}
6628 
6629 	// RPC call
6630 	Zero(&t, sizeof(t));
6631 
6632 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6633 
6634 	ret = CcGetAccount(pc->RemoteClient, &t);
6635 
6636 	if (ret == ERR_NO_ERROR)
6637 	{
6638 		RPC_CLIENT_CREATE_ACCOUNT z;
6639 		// Change the settings
6640 		t.StartupAccount = true;
6641 
6642 		Zero(&z, sizeof(z));
6643 		z.CheckServerCert = t.CheckServerCert;
6644 		z.RetryOnServerCert = t.RetryOnServerCert;
6645 		z.ClientAuth = t.ClientAuth;
6646 		z.ClientOption = t.ClientOption;
6647 		z.ServerCert = t.ServerCert;
6648 		z.StartupAccount = t.StartupAccount;
6649 
6650 		ret = CcSetAccount(pc->RemoteClient, &z);
6651 	}
6652 
6653 	if (ret != ERR_NO_ERROR)
6654 	{
6655 		// Error has occurred
6656 		CmdPrintError(c, ret);
6657 	}
6658 
6659 	CiFreeClientGetAccount(&t);
6660 
6661 	// Release of the parameter list
6662 	FreeParamValueList(o);
6663 
6664 	return ret;
6665 }
6666 
6667 // Unset the start-up connection of the connection settings
PcAccountStartupRemove(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6668 UINT PcAccountStartupRemove(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6669 {
6670 	LIST *o;
6671 	PC *pc = (PC *)param;
6672 	UINT ret = ERR_NO_ERROR;
6673 	RPC_CLIENT_GET_ACCOUNT t;
6674 	// Parameter list that can be specified
6675 	PARAM args[] =
6676 	{
6677 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6678 	};
6679 
6680 	// Get the parameter list
6681 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6682 	if (o == NULL)
6683 	{
6684 		return ERR_INVALID_PARAMETER;
6685 	}
6686 
6687 	// RPC call
6688 	Zero(&t, sizeof(t));
6689 
6690 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6691 
6692 	ret = CcGetAccount(pc->RemoteClient, &t);
6693 
6694 	if (ret == ERR_NO_ERROR)
6695 	{
6696 		RPC_CLIENT_CREATE_ACCOUNT z;
6697 		// Change the settings
6698 		t.StartupAccount = false;
6699 
6700 		Zero(&z, sizeof(z));
6701 		z.CheckServerCert = t.CheckServerCert;
6702 		z.RetryOnServerCert = t.RetryOnServerCert;
6703 		z.ClientAuth = t.ClientAuth;
6704 		z.ClientOption = t.ClientOption;
6705 		z.ServerCert = t.ServerCert;
6706 		z.StartupAccount = t.StartupAccount;
6707 
6708 		ret = CcSetAccount(pc->RemoteClient, &z);
6709 	}
6710 
6711 	if (ret != ERR_NO_ERROR)
6712 	{
6713 		// Error has occurred
6714 		CmdPrintError(c, ret);
6715 	}
6716 
6717 	CiFreeClientGetAccount(&t);
6718 
6719 	// Release of the parameter list
6720 	FreeParamValueList(o);
6721 
6722 	return ret;
6723 }
6724 
6725 // Export the connection settings
PcAccountExport(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6726 UINT PcAccountExport(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6727 {
6728 	LIST *o;
6729 	PC *pc = (PC *)param;
6730 	UINT ret = ERR_NO_ERROR;
6731 	RPC_CLIENT_GET_ACCOUNT t;
6732 	// Parameter list that can be specified
6733 	PARAM args[] =
6734 	{
6735 		{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
6736 		{"SAVEPATH", CmdPrompt, _UU("CMD_AccountExport_PROMPT_SAVEPATH"), CmdEvalNotEmpty, NULL},
6737 	};
6738 
6739 	// Get the parameter list
6740 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6741 	if (o == NULL)
6742 	{
6743 		return ERR_INVALID_PARAMETER;
6744 	}
6745 
6746 	// RPC call
6747 	Zero(&t, sizeof(t));
6748 
6749 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
6750 
6751 	ret = CcGetAccount(pc->RemoteClient, &t);
6752 
6753 	if (ret == ERR_NO_ERROR)
6754 	{
6755 		RPC_CLIENT_CREATE_ACCOUNT z;
6756 		BUF *b;
6757 		BUF *b2;
6758 		char tmp[MAX_SIZE];
6759 		UCHAR *buf;
6760 		UINT buf_size;
6761 		UCHAR bom[] = {0xef, 0xbb, 0xbf, };
6762 
6763 		Zero(&z, sizeof(z));
6764 		z.CheckServerCert = t.CheckServerCert;
6765 		z.ClientAuth = t.ClientAuth;
6766 		z.ClientOption = t.ClientOption;
6767 		z.ServerCert = t.ServerCert;
6768 		z.StartupAccount = t.StartupAccount;
6769 
6770 		b = CiAccountToCfg(&z);
6771 
6772 		StrCpy(tmp, sizeof(tmp), GetParamStr(o, "SAVEPATH"));
6773 		b2 = NewBuf();
6774 
6775 		WriteBuf(b2, bom, sizeof(bom));
6776 
6777 		// Add the header part
6778 		buf_size = CalcUniToUtf8(_UU("CM_ACCOUNT_FILE_BANNER"));
6779 		buf = ZeroMalloc(buf_size + 32);
6780 		UniToUtf8(buf, buf_size, _UU("CM_ACCOUNT_FILE_BANNER"));
6781 
6782 		WriteBuf(b2, buf, StrLen((char *)buf));
6783 		WriteBuf(b2, b->Buf, b->Size);
6784 		SeekBuf(b2, 0, 0);
6785 
6786 		FreeBuf(b);
6787 
6788 		if (DumpBuf(b2, tmp) == false)
6789 		{
6790 			c->Write(c, _UU("CMD_SAVEFILE_FAILED"));
6791 			ret = ERR_INTERNAL_ERROR;
6792 		}
6793 
6794 		FreeBuf(b2);
6795 		Free(buf);
6796 	}
6797 
6798 	if (ret != ERR_NO_ERROR)
6799 	{
6800 		// Error has occurred
6801 		CmdPrintError(c, ret);
6802 	}
6803 
6804 	CiFreeClientGetAccount(&t);
6805 
6806 	// Release of the parameter list
6807 	FreeParamValueList(o);
6808 
6809 	return ret;
6810 }
6811 
6812 // Check whether the specified account name exists
CmdIsAccountName(REMOTE_CLIENT * r,wchar_t * name)6813 bool CmdIsAccountName(REMOTE_CLIENT *r, wchar_t *name)
6814 {
6815 	UINT i;
6816 	RPC_CLIENT_ENUM_ACCOUNT t;
6817 	wchar_t tmp[MAX_SIZE];
6818 	bool b = false;
6819 	// Validate arguments
6820 	if (r == NULL || name == NULL)
6821 	{
6822 		return false;
6823 	}
6824 
6825 	if (CcEnumAccount(r, &t) != ERR_NO_ERROR)
6826 	{
6827 		return false;
6828 	}
6829 
6830 	UniStrCpy(tmp, sizeof(tmp), name);
6831 	UniTrim(tmp);
6832 
6833 	for (i = 0;i < t.NumItem;i++)
6834 	{
6835 		if (UniStrCmpi(t.Items[i]->AccountName, tmp) == 0)
6836 		{
6837 			b = true;
6838 			break;
6839 		}
6840 	}
6841 
6842 	CiFreeClientEnumAccount(&t);
6843 
6844 	return b;
6845 }
6846 
6847 // Generate an import name
CmdGenerateImportName(REMOTE_CLIENT * r,wchar_t * name,UINT size,wchar_t * old_name)6848 void CmdGenerateImportName(REMOTE_CLIENT *r, wchar_t *name, UINT size, wchar_t *old_name)
6849 {
6850 	UINT i;
6851 	// Validate arguments
6852 	if (r == NULL || name == NULL || old_name == NULL)
6853 	{
6854 		return;
6855 	}
6856 
6857 	for (i = 1;;i++)
6858 	{
6859 		wchar_t tmp[MAX_SIZE];
6860 		if (i == 1)
6861 		{
6862 			UniFormat(tmp, sizeof(tmp), _UU("CM_IMPORT_NAME_1"), old_name);
6863 		}
6864 		else
6865 		{
6866 			UniFormat(tmp, sizeof(tmp), _UU("CM_IMPORT_NAME_2"), old_name, i);
6867 		}
6868 
6869 		if (CmdIsAccountName(r, tmp) == false)
6870 		{
6871 			UniStrCpy(name, size, tmp);
6872 			return;
6873 		}
6874 	}
6875 }
6876 
6877 // Import a connection setting
PcAccountImport(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6878 UINT PcAccountImport(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6879 {
6880 	LIST *o;
6881 	PC *pc = (PC *)param;
6882 	UINT ret = ERR_NO_ERROR;
6883 	BUF *b;
6884 	wchar_t name[MAX_SIZE];
6885 	// Parameter list that can be specified
6886 	PARAM args[] =
6887 	{
6888 		{"[path]", CmdPrompt, _UU("CMD_AccountImport_PROMPT_PATH"), CmdEvalIsFile, NULL},
6889 	};
6890 
6891 	// Get the parameter list
6892 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
6893 	if (o == NULL)
6894 	{
6895 		return ERR_INVALID_PARAMETER;
6896 	}
6897 
6898 	// Read the file
6899 	b = ReadDumpW(GetParamUniStr(o, "[path]"));
6900 
6901 	if (b == NULL)
6902 	{
6903 		// Read failure
6904 		c->Write(c, _UU("CMD_LOADFILE_FAILED"));
6905 		ret = ERR_INTERNAL_ERROR;
6906 	}
6907 	else
6908 	{
6909 		RPC_CLIENT_CREATE_ACCOUNT *t;
6910 
6911 		t = CiCfgToAccount(b);
6912 
6913 		if (t == NULL)
6914 		{
6915 			// Failed to parse
6916 			c->Write(c, _UU("CMD_AccountImport_FAILED_PARSE"));
6917 			ret = ERR_INTERNAL_ERROR;
6918 		}
6919 		else
6920 		{
6921 			CmdGenerateImportName(pc->RemoteClient, name, sizeof(name), t->ClientOption->AccountName);
6922 			UniStrCpy(t->ClientOption->AccountName, sizeof(t->ClientOption->AccountName), name);
6923 
6924 			ret = CcCreateAccount(pc->RemoteClient, t);
6925 
6926 			if (ret == ERR_NO_ERROR)
6927 			{
6928 				wchar_t tmp[MAX_SIZE];
6929 
6930 				UniFormat(tmp, sizeof(tmp), _UU("CMD_AccountImport_OK"), name);
6931 				c->Write(c, tmp);
6932 			}
6933 
6934 			CiFreeClientCreateAccount(t);
6935 			Free(t);
6936 		}
6937 
6938 		FreeBuf(b);
6939 	}
6940 
6941 	if (ret != ERR_NO_ERROR)
6942 	{
6943 		// Error has occurred
6944 		CmdPrintError(c, ret);
6945 	}
6946 
6947 	// Release of the parameter list
6948 	FreeParamValueList(o);
6949 
6950 	return ret;
6951 }
6952 
6953 // Allow remote management of the VPN Client Service
PcRemoteEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6954 UINT PcRemoteEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6955 {
6956 	LIST *o;
6957 	PC *pc = (PC *)param;
6958 	UINT ret = ERR_NO_ERROR;
6959 	CLIENT_CONFIG t;
6960 
6961 	// Get the parameter list
6962 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
6963 	if (o == NULL)
6964 	{
6965 		return ERR_INVALID_PARAMETER;
6966 	}
6967 
6968 	// RPC call
6969 	Zero(&t, sizeof(t));
6970 
6971 	ret = CcGetClientConfig(pc->RemoteClient, &t);
6972 
6973 	if (ret == ERR_NO_ERROR)
6974 	{
6975 		t.AllowRemoteConfig = true;
6976 		ret = CcSetClientConfig(pc->RemoteClient, &t);
6977 	}
6978 
6979 	if (ret == ERR_NO_ERROR)
6980 	{
6981 		// Success
6982 	}
6983 
6984 	if (ret != ERR_NO_ERROR)
6985 	{
6986 		// Error has occurred
6987 		CmdPrintError(c, ret);
6988 	}
6989 
6990 	// Release of the parameter list
6991 	FreeParamValueList(o);
6992 
6993 	return ret;
6994 }
6995 
6996 // Prohibit remote management of the VPN Client Service
PcRemoteDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)6997 UINT PcRemoteDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
6998 {
6999 	LIST *o;
7000 	PC *pc = (PC *)param;
7001 	UINT ret = ERR_NO_ERROR;
7002 	CLIENT_CONFIG t;
7003 
7004 	// Get the parameter list
7005 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
7006 	if (o == NULL)
7007 	{
7008 		return ERR_INVALID_PARAMETER;
7009 	}
7010 
7011 	// RPC call
7012 	Zero(&t, sizeof(t));
7013 
7014 	ret = CcGetClientConfig(pc->RemoteClient, &t);
7015 
7016 	if (ret == ERR_NO_ERROR)
7017 	{
7018 		t.AllowRemoteConfig = false;
7019 		ret = CcSetClientConfig(pc->RemoteClient, &t);
7020 	}
7021 
7022 	if (ret == ERR_NO_ERROR)
7023 	{
7024 		// Success
7025 	}
7026 
7027 	if (ret != ERR_NO_ERROR)
7028 	{
7029 		// Error has occurred
7030 		CmdPrintError(c, ret);
7031 	}
7032 
7033 	// Release of the parameter list
7034 	FreeParamValueList(o);
7035 
7036 	return ret;
7037 }
7038 
7039 // Enable the maintenance function of the Internet connection
PcKeepEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)7040 UINT PcKeepEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
7041 {
7042 	LIST *o;
7043 	PC *pc = (PC *)param;
7044 	UINT ret = ERR_NO_ERROR;
7045 	CLIENT_CONFIG t;
7046 
7047 	// Get the parameter list
7048 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
7049 	if (o == NULL)
7050 	{
7051 		return ERR_INVALID_PARAMETER;
7052 	}
7053 
7054 	// RPC call
7055 	Zero(&t, sizeof(t));
7056 
7057 	ret = CcGetClientConfig(pc->RemoteClient, &t);
7058 
7059 	if (ret == ERR_NO_ERROR)
7060 	{
7061 		// Change the settings
7062 		t.UseKeepConnect = true;
7063 		ret = CcSetClientConfig(pc->RemoteClient, &t);
7064 	}
7065 
7066 	if (ret == ERR_NO_ERROR)
7067 	{
7068 		// Success
7069 	}
7070 
7071 	if (ret != ERR_NO_ERROR)
7072 	{
7073 		// Error has occurred
7074 		CmdPrintError(c, ret);
7075 	}
7076 
7077 	// Release of the parameter list
7078 	FreeParamValueList(o);
7079 
7080 	return ret;
7081 }
7082 
7083 // Disable the maintenance function of the Internet connection
PcKeepDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)7084 UINT PcKeepDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
7085 {
7086 	LIST *o;
7087 	PC *pc = (PC *)param;
7088 	UINT ret = ERR_NO_ERROR;
7089 	CLIENT_CONFIG t;
7090 
7091 	// Get the parameter list
7092 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
7093 	if (o == NULL)
7094 	{
7095 		return ERR_INVALID_PARAMETER;
7096 	}
7097 
7098 	// RPC call
7099 	Zero(&t, sizeof(t));
7100 
7101 	ret = CcGetClientConfig(pc->RemoteClient, &t);
7102 
7103 	if (ret == ERR_NO_ERROR)
7104 	{
7105 		// Change the settings
7106 		t.UseKeepConnect = false;
7107 		ret = CcSetClientConfig(pc->RemoteClient, &t);
7108 	}
7109 
7110 	if (ret == ERR_NO_ERROR)
7111 	{
7112 		// Success
7113 	}
7114 
7115 	if (ret != ERR_NO_ERROR)
7116 	{
7117 		// Error has occurred
7118 		CmdPrintError(c, ret);
7119 	}
7120 
7121 	// Release of the parameter list
7122 	FreeParamValueList(o);
7123 
7124 	return ret;
7125 }
7126 
7127 // Set the maintenance function of the Internet connection
PcKeepSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)7128 UINT PcKeepSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
7129 {
7130 	LIST *o;
7131 	PC *pc = (PC *)param;
7132 	UINT ret = ERR_NO_ERROR;
7133 	CLIENT_CONFIG t;
7134 	char *host;
7135 	UINT port;
7136 	// Parameter list that can be specified
7137 	PARAM args[] =
7138 	{
7139 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
7140 		{"HOST", CmdPrompt, _UU("CMD_KeepSet_PROMPT_HOST"), CmdEvalHostAndPort, NULL},
7141 		{"PROTOCOL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_PROTOCOL"), CmdEvalTcpOrUdp, NULL},
7142 		{"INTERVAL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_INTERVAL"), NULL, NULL},
7143 	};
7144 
7145 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
7146 	if (o == NULL)
7147 	{
7148 		return ERR_INVALID_PARAMETER;
7149 	}
7150 
7151 	// RPC call
7152 	Zero(&t, sizeof(t));
7153 
7154 	ret = CcGetClientConfig(pc->RemoteClient, &t);
7155 
7156 	if (ret == ERR_NO_ERROR)
7157 	{
7158 		if (ParseHostPort(GetParamStr(o, "HOST"), &host, &port, 0))
7159 		{
7160 			StrCpy(t.KeepConnectHost, sizeof(t.KeepConnectHost), host);
7161 			t.KeepConnectPort = port;
7162 			t.KeepConnectInterval = GetParamInt(o, "INTERVAL");
7163 			t.KeepConnectProtocol = (StrCmpi(GetParamStr(o, "PROTOCOL"), "tcp") == 0) ? 0 : 1;
7164 			Free(host);
7165 
7166 			ret = CcSetClientConfig(pc->RemoteClient, &t);
7167 		}
7168 	}
7169 
7170 	if (ret != ERR_NO_ERROR)
7171 	{
7172 		// Error has occurred
7173 		CmdPrintError(c, ret);
7174 	}
7175 
7176 	// Release of the parameter list
7177 	FreeParamValueList(o);
7178 
7179 	return ret;
7180 }
7181 
7182 // Get the maintenance function of the Internet connection
PcKeepGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)7183 UINT PcKeepGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
7184 {
7185 	LIST *o;
7186 	PC *pc = (PC *)param;
7187 	UINT ret = ERR_NO_ERROR;
7188 	CLIENT_CONFIG t;
7189 
7190 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
7191 	if (o == NULL)
7192 	{
7193 		return ERR_INVALID_PARAMETER;
7194 	}
7195 
7196 	// RPC call
7197 	Zero(&t, sizeof(t));
7198 
7199 	ret = CcGetClientConfig(pc->RemoteClient, &t);
7200 
7201 	if (ret == ERR_NO_ERROR)
7202 	{
7203 		wchar_t tmp[MAX_SIZE];
7204 		CT *ct = CtNewStandard();
7205 
7206 		StrToUni(tmp, sizeof(tmp), t.KeepConnectHost);
7207 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_1"), tmp);
7208 
7209 		UniToStru(tmp, t.KeepConnectPort);
7210 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_2"), tmp);
7211 
7212 		UniToStru(tmp, t.KeepConnectInterval);
7213 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_3"), tmp);
7214 
7215 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_4"),
7216 			t.KeepConnectProtocol == 0 ? L"TCP/IP" : L"UDP/IP");
7217 
7218 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_5"),
7219 			t.UseKeepConnect ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"));
7220 
7221 		CtFree(ct, c);
7222 	}
7223 
7224 	if (ret != ERR_NO_ERROR)
7225 	{
7226 		// Error has occurred
7227 		CmdPrintError(c, ret);
7228 	}
7229 
7230 	// Release of the parameter list
7231 	FreeParamValueList(o);
7232 
7233 	return ret;
7234 }
7235 
7236 
7237 // Creat a new client management tool context
NewPc(CONSOLE * c,REMOTE_CLIENT * remote_client,char * servername,wchar_t * cmdline)7238 PC *NewPc(CONSOLE *c, REMOTE_CLIENT *remote_client, char *servername, wchar_t *cmdline)
7239 {
7240 	PC *pc;
7241 	// Validate arguments
7242 	if (c == NULL || remote_client == NULL || servername == NULL)
7243 	{
7244 		return NULL;
7245 	}
7246 	if (UniIsEmptyStr(cmdline))
7247 	{
7248 		cmdline = NULL;
7249 	}
7250 
7251 	pc = ZeroMalloc(sizeof(PC));
7252 	pc->ConsoleForServer = false;
7253 	pc->ServerName = CopyStr(servername);
7254 	pc->Console = c;
7255 	pc->LastError = 0;
7256 	pc->RemoteClient = remote_client;
7257 	pc->CmdLine = CopyUniStr(cmdline);
7258 
7259 	return pc;
7260 }
7261 
7262 // Release the client management tools context
FreePc(PC * pc)7263 void FreePc(PC *pc)
7264 {
7265 	// Validate arguments
7266 	if (pc == NULL)
7267 	{
7268 		return;
7269 	}
7270 
7271 	Free(pc->ServerName);
7272 	Free(pc->CmdLine);
7273 	Free(pc);
7274 }
7275 
7276 // Client management tool
PcConnect(CONSOLE * c,char * target,wchar_t * cmdline,char * password)7277 UINT PcConnect(CONSOLE *c, char *target, wchar_t *cmdline, char *password)
7278 {
7279 	CEDAR *cedar;
7280 	REMOTE_CLIENT *client;
7281 	bool bad_pass;
7282 	bool no_remote;
7283 	char pass[MAX_SIZE];
7284 	UINT ret = 0;
7285 	// Validate arguments
7286 	if (c == NULL || target == NULL)
7287 	{
7288 		return ERR_INTERNAL_ERROR;
7289 	}
7290 
7291 	StrCpy(pass, sizeof(pass), password);
7292 
7293 	cedar = NewCedar(NULL, NULL);
7294 
7295 RETRY:
7296 	client = CcConnectRpc(target, pass, &bad_pass, &no_remote, 0);
7297 
7298 	if (client == NULL)
7299 	{
7300 		if (no_remote)
7301 		{
7302 			// Remote connection refusal
7303 			c->Write(c, _UU("CMD_VPNCMD_CLIENT_NO_REMODE"));
7304 			ReleaseCedar(cedar);
7305 			return ERR_INTERNAL_ERROR;
7306 		}
7307 		else if (bad_pass)
7308 		{
7309 			char *tmp;
7310 			// Password is different
7311 			c->Write(c, _UU("CMD_VPNCMD_PASSWORD_1"));
7312 			tmp = c->ReadPassword(c, _UU("CMD_VPNCMD_PASSWORD_2"));
7313 			c->Write(c, L"");
7314 
7315 			if (tmp == NULL)
7316 			{
7317 				// Cancel
7318 				ReleaseCedar(cedar);
7319 				return ERR_ACCESS_DENIED;
7320 			}
7321 			else
7322 			{
7323 				StrCpy(pass, sizeof(pass), tmp);
7324 				Free(tmp);
7325 			}
7326 
7327 			goto RETRY;
7328 		}
7329 		else
7330 		{
7331 			// Connection failure
7332 			CmdPrintError(c, ERR_CONNECT_FAILED);
7333 			ReleaseCedar(cedar);
7334 			return ERR_CONNECT_FAILED;
7335 		}
7336 	}
7337 	else
7338 	{
7339 		// Connection complete
7340 		PC *pc = NewPc(c, client, target, cmdline);
7341 		PcMain(pc);
7342 		ret = pc->LastError;
7343 		FreePc(pc);
7344 	}
7345 
7346 	CcDisconnectRpc(client);
7347 
7348 	ReleaseCedar(cedar);
7349 
7350 	return ret;
7351 }
7352 
7353 
7354 // Server Administration Tool Processor Main
PsMain(PS * ps)7355 void PsMain(PS *ps)
7356 {
7357 	char prompt[MAX_SIZE];
7358 	wchar_t tmp[MAX_SIZE];
7359 	// Validate arguments
7360 	if (ps == NULL)
7361 	{
7362 		return;
7363 	}
7364 
7365 	// If it's not in CSV mode, to display a message that the connection has been made
7366 	if(ps->Console->ConsoleType != CONSOLE_CSV)
7367 	{
7368 		UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_SERVER_CONNECTED"),
7369 			ps->ServerName, ps->ServerPort);
7370 		ps->Console->Write(ps->Console, tmp);
7371 		ps->Console->Write(ps->Console, L"");
7372 
7373 		if (ps->HubName == NULL)
7374 		{
7375 			// Server management mode
7376 			ps->Console->Write(ps->Console, _UU("CMD_VPNCMD_SERVER_CONNECTED_1"));
7377 		}
7378 		else
7379 		{
7380 			// Virtual HUB management mode
7381 			UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_SERVER_CONNECTED_2"),
7382 				ps->HubName);
7383 			ps->Console->Write(ps->Console, tmp);
7384 		}
7385 		ps->Console->Write(ps->Console, L"");
7386 	}
7387 
7388 	// Get the Caps
7389 	ps->CapsList = ScGetCapsEx(ps->Rpc);
7390 
7391 	if (ps->AdminHub != NULL)
7392 	{
7393 		RPC_HUB_STATUS t;
7394 		UINT ret;
7395 		wchar_t tmp[MAX_SIZE];
7396 
7397 		// Choose the Virtual HUB that is specified in the ADMINHUB
7398 		Zero(&t, sizeof(t));
7399 
7400 		StrCpy(t.HubName, sizeof(t.HubName), ps->AdminHub);
7401 
7402 		ret = ScGetHubStatus(ps->Rpc, &t);
7403 		if (ret == ERR_NO_ERROR)
7404 		{
7405 			// Success
7406 			UniFormat(tmp, sizeof(tmp), _UU("CMD_Hub_Selected"), t.HubName);
7407 
7408 			if (ps->HubName != NULL)
7409 			{
7410 				Free(ps->HubName);
7411 			}
7412 			ps->HubName = CopyStr(t.HubName);
7413 
7414 			if( ps->Console->ConsoleType != CONSOLE_CSV)
7415 			{
7416 				ps->Console->Write(ps->Console, tmp);
7417 			}
7418 		}
7419 		else
7420 		{
7421 			// Failure
7422 			UniFormat(tmp, sizeof(tmp), _UU("CMD_Hub_Select_Failed"), ps->AdminHub);
7423 
7424 			ps->Console->Write(ps->Console, tmp);
7425 			CmdPrintError(ps->Console, ret);
7426 		}
7427 	}
7428 
7429 	if (ps->HubName == NULL)
7430 	{
7431 		RPC_KEY_PAIR t;
7432 
7433 		Zero(&t, sizeof(t));
7434 
7435 		if (ScGetServerCert(ps->Rpc, &t) == ERR_NO_ERROR)
7436 		{
7437 			if (t.Cert != NULL && t.Cert->has_basic_constraints == false)
7438 			{
7439 				if (t.Cert->root_cert)
7440 				{
7441 					ps->Console->Write(ps->Console, L"");
7442 					ps->Console->Write(ps->Console, _UU("SM_CERT_MESSAGE_CLI"));
7443 					ps->Console->Write(ps->Console, L"");
7444 				}
7445 			}
7446 
7447 			FreeRpcKeyPair(&t);
7448 		}
7449 	}
7450 
7451 	while (true)
7452 	{
7453 		// Definition of command
7454 		CMD cmd[] =
7455 		{
7456 			{"About", PsAbout},
7457 			{"Check", PtCheck},
7458 			{"Crash", PsCrash},
7459 			{"Flush", PsFlush},
7460 			{"Debug", PsDebug},
7461 			{"ServerInfoGet", PsServerInfoGet},
7462 			{"ServerStatusGet", PsServerStatusGet},
7463 			{"ListenerCreate", PsListenerCreate},
7464 			{"ListenerDelete", PsListenerDelete},
7465 			{"ListenerList", PsListenerList},
7466 			{"ListenerEnable", PsListenerEnable},
7467 			{"ListenerDisable", PsListenerDisable},
7468 			{"PortsUDPGet", PsPortsUDPGet},
7469 			{"PortsUDPSet", PsPortsUDPSet},
7470 			{"ProtoOptionsGet", PsProtoOptionsGet},
7471 			{"ProtoOptionsSet", PsProtoOptionsSet},
7472 			{"ServerPasswordSet", PsServerPasswordSet},
7473 			{"ClusterSettingGet", PsClusterSettingGet},
7474 			{"ClusterSettingStandalone", PsClusterSettingStandalone},
7475 			{"ClusterSettingController", PsClusterSettingController},
7476 			{"ClusterSettingMember", PsClusterSettingMember},
7477 			{"ClusterMemberList", PsClusterMemberList},
7478 			{"ClusterMemberInfoGet", PsClusterMemberInfoGet},
7479 			{"ClusterMemberCertGet", PsClusterMemberCertGet},
7480 			{"ClusterConnectionStatusGet", PsClusterConnectionStatusGet},
7481 			{"ServerCertGet", PsServerCertGet},
7482 			{"ServerKeyGet", PsServerKeyGet},
7483 			{"ServerCertSet", PsServerCertSet},
7484 			{"ServerCipherGet", PsServerCipherGet},
7485 			{"ServerCipherSet", PsServerCipherSet},
7486 			{"KeepEnable", PsKeepEnable},
7487 			{"KeepDisable", PsKeepDisable},
7488 			{"KeepSet", PsKeepSet},
7489 			{"KeepGet", PsKeepGet},
7490 			{"SyslogGet", PsSyslogGet},
7491 			{"SyslogDisable", PsSyslogDisable},
7492 			{"SyslogEnable", PsSyslogEnable},
7493 			{"ConnectionList", PsConnectionList},
7494 			{"ConnectionGet", PsConnectionGet},
7495 			{"ConnectionDisconnect", PsConnectionDisconnect},
7496 			{"BridgeDeviceList", PsBridgeDeviceList},
7497 			{"BridgeList", PsBridgeList},
7498 			{"BridgeCreate", PsBridgeCreate},
7499 			{"BridgeDelete", PsBridgeDelete},
7500 			{"Caps", PsCaps},
7501 			{"Reboot", PsReboot},
7502 			{"ConfigGet", PsConfigGet},
7503 			{"ConfigSet", PsConfigSet},
7504 			{"RouterList", PsRouterList},
7505 			{"RouterAdd", PsRouterAdd},
7506 			{"RouterDelete", PsRouterDelete},
7507 			{"RouterStart", PsRouterStart},
7508 			{"RouterStop", PsRouterStop},
7509 			{"RouterIfList", PsRouterIfList},
7510 			{"RouterIfAdd", PsRouterIfAdd},
7511 			{"RouterIfDel", PsRouterIfDel},
7512 			{"RouterTableList", PsRouterTableList},
7513 			{"RouterTableAdd", PsRouterTableAdd},
7514 			{"RouterTableDel", PsRouterTableDel},
7515 			{"LogFileList", PsLogFileList},
7516 			{"LogFileGet", PsLogFileGet},
7517 			{"WgkAdd", PsWgkAdd},
7518 			{"WgkDelete", PsWgkDelete},
7519 			{"WgkEnum", PsWgkEnum},
7520 			{"HubCreate", PsHubCreate},
7521 			{"HubCreateDynamic", PsHubCreateDynamic},
7522 			{"HubCreateStatic", PsHubCreateStatic},
7523 			{"HubDelete", PsHubDelete},
7524 			{"HubSetStatic", PsHubSetStatic},
7525 			{"HubSetDynamic", PsHubSetDynamic},
7526 			{"HubList", PsHubList},
7527 			{"Hub", PsHub},
7528 			{"Online", PsOnline},
7529 			{"Offline", PsOffline},
7530 			{"SetStaticNetwork", PsSetStaticNetwork},
7531 			{"SetMaxSession", PsSetMaxSession},
7532 			{"SetHubPassword", PsSetHubPassword},
7533 			{"SetEnumAllow", PsSetEnumAllow},
7534 			{"SetEnumDeny", PsSetEnumDeny},
7535 			{"OptionsGet", PsOptionsGet},
7536 			{"RadiusServerSet", PsRadiusServerSet},
7537 			{"RadiusServerDelete", PsRadiusServerDelete},
7538 			{"RadiusServerGet", PsRadiusServerGet},
7539 			{"StatusGet", PsStatusGet},
7540 			{"LogGet", PsLogGet},
7541 			{"LogEnable", PsLogEnable},
7542 			{"LogDisable", PsLogDisable},
7543 			{"LogSwitchSet", PsLogSwitchSet},
7544 			{"LogPacketSaveType", PsLogPacketSaveType},
7545 			{"CAList", PsCAList},
7546 			{"CAAdd", PsCAAdd},
7547 			{"CADelete", PsCADelete},
7548 			{"CAGet", PsCAGet},
7549 			{"CascadeList", PsCascadeList},
7550 			{"CascadeCreate", PsCascadeCreate},
7551 			{"CascadeSet", PsCascadeSet},
7552 			{"CascadeGet", PsCascadeGet},
7553 			{"CascadeDelete", PsCascadeDelete},
7554 			{"CascadeUsernameSet", PsCascadeUsernameSet},
7555 			{"CascadeAnonymousSet", PsCascadeAnonymousSet},
7556 			{"CascadePasswordSet", PsCascadePasswordSet},
7557 			{"CascadeCertSet", PsCascadeCertSet},
7558 			{"CascadeCertGet", PsCascadeCertGet},
7559 			{"CascadeEncryptEnable", PsCascadeEncryptEnable},
7560 			{"CascadeEncryptDisable", PsCascadeEncryptDisable},
7561 			{"CascadeCompressEnable", PsCascadeCompressEnable},
7562 			{"CascadeCompressDisable", PsCascadeCompressDisable},
7563 			{"CascadeProxyNone", PsCascadeProxyNone},
7564 			{"CascadeHttpHeaderAdd", PsCascadeHttpHeaderAdd},
7565 			{"CascadeHttpHeaderDelete", PsCascadeHttpHeaderDelete},
7566 			{"CascadeHttpHeaderGet", PsCascadeHttpHeaderGet},
7567 			{"CascadeProxyHttp", PsCascadeProxyHttp},
7568 			{"CascadeProxySocks", PsCascadeProxySocks},
7569 			{"CascadeProxySocks5", PsCascadeProxySocks5},
7570 			{"CascadeServerCertEnable", PsCascadeServerCertEnable},
7571 			{"CascadeServerCertDisable", PsCascadeServerCertDisable},
7572 			{"CascadeServerCertSet", PsCascadeServerCertSet},
7573 			{"CascadeServerCertDelete", PsCascadeServerCertDelete},
7574 			{"CascadeServerCertGet", PsCascadeServerCertGet},
7575 			{"CascadeDetailSet", PsCascadeDetailSet},
7576 			{"CascadePolicySet", PsCascadePolicySet},
7577 			{"PolicyList", PsPolicyList},
7578 			{"CascadeStatusGet", PsCascadeStatusGet},
7579 			{"CascadeRename", PsCascadeRename},
7580 			{"CascadeOnline", PsCascadeOnline},
7581 			{"CascadeOffline", PsCascadeOffline},
7582 			{"AccessAdd", PsAccessAdd},
7583 			{"AccessAddEx", PsAccessAddEx},
7584 			{"AccessAdd6", PsAccessAdd6},
7585 			{"AccessAddEx6", PsAccessAddEx6},
7586 			{"AccessList", PsAccessList},
7587 			{"AccessDelete", PsAccessDelete},
7588 			{"AccessEnable", PsAccessEnable},
7589 			{"AccessDisable", PsAccessDisable},
7590 			{"UserList", PsUserList},
7591 			{"UserCreate", PsUserCreate},
7592 			{"UserSet", PsUserSet},
7593 			{"UserDelete", PsUserDelete},
7594 			{"UserGet", PsUserGet},
7595 			{"UserAnonymousSet", PsUserAnonymousSet},
7596 			{"UserPasswordSet", PsUserPasswordSet},
7597 			{"UserCertSet", PsUserCertSet},
7598 			{"UserCertGet", PsUserCertGet},
7599 			{"UserSignedSet", PsUserSignedSet},
7600 			{"UserRadiusSet", PsUserRadiusSet},
7601 			{"UserNTLMSet", PsUserNTLMSet},
7602 			{"UserPolicyRemove", PsUserPolicyRemove},
7603 			{"UserPolicySet", PsUserPolicySet},
7604 			{"UserExpiresSet", PsUserExpiresSet},
7605 			{"GroupList", PsGroupList},
7606 			{"GroupCreate", PsGroupCreate},
7607 			{"GroupSet", PsGroupSet},
7608 			{"GroupDelete", PsGroupDelete},
7609 			{"GroupGet", PsGroupGet},
7610 			{"GroupJoin", PsGroupJoin},
7611 			{"GroupUnjoin", PsGroupUnjoin},
7612 			{"GroupPolicyRemove", PsGroupPolicyRemove},
7613 			{"GroupPolicySet", PsGroupPolicySet},
7614 			{"SessionList", PsSessionList},
7615 			{"SessionGet", PsSessionGet},
7616 			{"SessionDisconnect", PsSessionDisconnect},
7617 			{"MacTable", PsMacTable},
7618 			{"MacDelete", PsMacDelete},
7619 			{"IpTable", PsIpTable},
7620 			{"IpDelete", PsIpDelete},
7621 			{"SecureNatEnable", PsSecureNatEnable},
7622 			{"SecureNatDisable", PsSecureNatDisable},
7623 			{"SecureNatStatusGet", PsSecureNatStatusGet},
7624 			{"SecureNatHostGet", PsSecureNatHostGet},
7625 			{"SecureNatHostSet", PsSecureNatHostSet},
7626 			{"NatGet", PsNatGet},
7627 			{"NatEnable", PsNatEnable},
7628 			{"NatDisable", PsNatDisable},
7629 			{"NatSet", PsNatSet},
7630 			{"NatTable", PsNatTable},
7631 			{"DhcpGet", PsDhcpGet},
7632 			{"DhcpEnable", PsDhcpEnable},
7633 			{"DhcpDisable", PsDhcpDisable},
7634 			{"DhcpSet", PsDhcpSet},
7635 			{"DhcpTable", PsDhcpTable},
7636 			{"AdminOptionList", PsAdminOptionList},
7637 			{"AdminOptionSet", PsAdminOptionSet},
7638 			{"ExtOptionList", PsExtOptionList},
7639 			{"ExtOptionSet", PsExtOptionSet},
7640 			{"CrlList", PsCrlList},
7641 			{"CrlAdd", PsCrlAdd},
7642 			{"CrlDel", PsCrlDel},
7643 			{"CrlGet", PsCrlGet},
7644 			{"AcList", PsAcList},
7645 			{"AcAdd", PsAcAdd},
7646 			{"AcAdd6", PsAcAdd6},
7647 			{"AcDel", PsAcDel},
7648 			{"MakeCert", PtMakeCert},
7649 			{"MakeCert2048", PtMakeCert2048},
7650 			{"TrafficClient", PtTrafficClient},
7651 			{"TrafficServer", PtTrafficServer},
7652 			{"LicenseAdd", PsLicenseAdd},
7653 			{"LicenseDel", PsLicenseDel},
7654 			{"LicenseList", PsLicenseList},
7655 			{"LicenseStatus", PsLicenseStatus},
7656 			{"IPsecEnable", PsIPsecEnable},
7657 			{"IPsecGet", PsIPsecGet},
7658 			{"EtherIpClientAdd", PsEtherIpClientAdd},
7659 			{"EtherIpClientDelete", PsEtherIpClientDelete},
7660 			{"EtherIpClientList", PsEtherIpClientList},
7661 			{"OpenVpnMakeConfig", PsOpenVpnMakeConfig},
7662 			{"ServerCertRegenerate", PsServerCertRegenerate},
7663 			{"VpnOverIcmpDnsEnable", PsVpnOverIcmpDnsEnable},
7664 			{"VpnOverIcmpDnsGet", PsVpnOverIcmpDnsGet},
7665 			{"DynamicDnsGetStatus", PsDynamicDnsGetStatus},
7666 			{"DynamicDnsSetHostname", PsDynamicDnsSetHostname},
7667 			{"VpnAzureGetStatus", PsVpnAzureGetStatus},
7668 			{"VpnAzureSetEnable", PsVpnAzureSetEnable},
7669 		};
7670 
7671 		// Generate a prompt
7672 		if (ps->HubName == NULL)
7673 		{
7674 			Format(prompt, sizeof(prompt), "VPN Server>");
7675 		}
7676 		else
7677 		{
7678 			Format(prompt, sizeof(prompt), "VPN Server/%s>", ps->HubName);
7679 		}
7680 
7681 		if (DispatchNextCmdEx(ps->Console, ps->CmdLine, prompt, cmd, sizeof(cmd) / sizeof(cmd[0]), ps) == false)
7682 		{
7683 			break;
7684 		}
7685 		ps->LastError = ps->Console->RetCode;
7686 
7687 		if (ps->LastError == ERR_NO_ERROR && ps->Console->ConsoleType != CONSOLE_CSV)
7688 		{
7689 			ps->Console->Write(ps->Console, _UU("CMD_MSG_OK"));
7690 			ps->Console->Write(ps->Console, L"");
7691 		}
7692 
7693 		if (ps->CmdLine != NULL)
7694 		{
7695 			break;
7696 		}
7697 	}
7698 
7699 	// Release the Caps
7700 	FreeCapsList(ps->CapsList);
7701 	ps->CapsList = NULL;
7702 }
7703 
7704 // A template for a new command function
PsXxx(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)7705 UINT PsXxx(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
7706 {
7707 	LIST *o;
7708 	PS *ps = (PS *)param;
7709 	UINT ret;
7710 	RPC_LISTENER t;
7711 	PARAM args[] =
7712 	{
7713 		{"[port]", CmdPromptPort, _UU("CMD_ListenerCreate_PortPrompt"), CmdEvalPort, NULL},
7714 	};
7715 
7716 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
7717 	if (o == NULL)
7718 	{
7719 		return ERR_INVALID_PARAMETER;
7720 	}
7721 
7722 	Zero(&t, sizeof(t));
7723 	t.Enable = true;
7724 	t.Port = ToInt(GetParamStr(o, "[port]"));
7725 
7726 	ret = ScCreateListener(ps->Rpc, &t);
7727 
7728 	if (ret != ERR_NO_ERROR)
7729 	{
7730 		CmdPrintError(c, ret);
7731 		FreeParamValueList(o);
7732 		return ret;
7733 	}
7734 
7735 	FreeParamValueList(o);
7736 
7737 	return 0;
7738 }
7739 
7740 // Set to the stand-alone mode
PsClusterSettingStandalone(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)7741 UINT PsClusterSettingStandalone(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
7742 {
7743 	LIST *o;
7744 	PS *ps = (PS *)param;
7745 	UINT ret = 0;
7746 	RPC_FARM t;
7747 
7748 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
7749 	if (o == NULL)
7750 	{
7751 		return ERR_INVALID_PARAMETER;
7752 	}
7753 
7754 	Zero(&t, sizeof(t));
7755 	t.ServerType = SERVER_TYPE_STANDALONE;
7756 
7757 	// RPC call
7758 	ret = ScSetFarmSetting(ps->Rpc, &t);
7759 
7760 	if (ret != ERR_NO_ERROR)
7761 	{
7762 		// An error has occured
7763 		CmdPrintError(c, ret);
7764 		FreeParamValueList(o);
7765 		return ret;
7766 	}
7767 
7768 	FreeParamValueList(o);
7769 
7770 	return 0;
7771 }
7772 
7773 // Set to the cluster controller mode
PsClusterSettingController(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)7774 UINT PsClusterSettingController(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
7775 {
7776 	LIST *o;
7777 	PS *ps = (PS *)param;
7778 	UINT ret = 0;
7779 	RPC_FARM t;
7780 	UINT weight;
7781 	PARAM args[] =
7782 	{
7783 		{"WEIGHT", NULL, NULL, NULL, NULL},
7784 		{"ONLY", NULL, NULL, NULL, NULL},
7785 	};
7786 
7787 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
7788 	if (o == NULL)
7789 	{
7790 		return ERR_INVALID_PARAMETER;
7791 	}
7792 
7793 	weight = GetParamInt(o, "WEIGHT");
7794 	if (weight == 0)
7795 	{
7796 		weight = FARM_DEFAULT_WEIGHT;
7797 	}
7798 
7799 	Zero(&t, sizeof(t));
7800 	t.ServerType = SERVER_TYPE_FARM_CONTROLLER;
7801 	t.Weight = weight;
7802 	t.ControllerOnly = GetParamYes(o, "ONLY");
7803 
7804 	// RPC call
7805 	ret = ScSetFarmSetting(ps->Rpc, &t);
7806 
7807 	if (ret != ERR_NO_ERROR)
7808 	{
7809 		// An error has occured
7810 		CmdPrintError(c, ret);
7811 		FreeParamValueList(o);
7812 		return ret;
7813 	}
7814 
7815 	FreeParamValueList(o);
7816 
7817 	return 0;
7818 }
7819 
7820 // Evaluate the IP address
CmdEvalIp(CONSOLE * c,wchar_t * str,void * param)7821 bool CmdEvalIp(CONSOLE *c, wchar_t *str, void *param)
7822 {
7823 	// Validate arguments
7824 	if (c == NULL || str == NULL)
7825 	{
7826 		return false;
7827 	}
7828 
7829 	if (UniIsEmptyStr(str))
7830 	{
7831 		return true;
7832 	}
7833 
7834 	if (UniStrToIP32(str) == 0 && UniStrCmpi(str, L"0.0.0.0") != 0)
7835 	{
7836 		wchar_t *msg = (param == NULL) ? _UU("CMD_IP_EVAL_FAILED") : (wchar_t *)param;
7837 		c->Write(c, msg);
7838 		return false;
7839 	}
7840 
7841 	return true;
7842 }
7843 
7844 // Convert a string to port list
StrToPortList(char * str,bool limit_range)7845 LIST *StrToPortList(char *str, bool limit_range)
7846 {
7847 	LIST *o;
7848 	TOKEN_LIST *t;
7849 	UINT i;
7850 	if (str == NULL)
7851 	{
7852 		return NULL;
7853 	}
7854 
7855 	// Convert to token
7856 	t = ParseToken(str, ", ");
7857 	if (t == NULL)
7858 	{
7859 		return NULL;
7860 	}
7861 	if (t->NumTokens == 0)
7862 	{
7863 		FreeToken(t);
7864 		return NULL;
7865 	}
7866 
7867 	o = NewListFast(NULL);
7868 
7869 	for (i = 0;i < t->NumTokens;i++)
7870 	{
7871 		char *s = t->Token[i];
7872 		UINT n;
7873 		if (IsNum(s) == false)
7874 		{
7875 			ReleaseList(o);
7876 			FreeToken(t);
7877 			return NULL;
7878 		}
7879 		n = ToInt(s);
7880 		if (limit_range && (n == 0 || n >= 65536))
7881 		{
7882 			ReleaseList(o);
7883 			FreeToken(t);
7884 			return NULL;
7885 		}
7886 		if (IsInList(o, (void *)n))
7887 		{
7888 			ReleaseList(o);
7889 			FreeToken(t);
7890 			return NULL;
7891 		}
7892 		Add(o, (void *)n);
7893 	}
7894 
7895 	FreeToken(t);
7896 
7897 	if (LIST_NUM(o) > MAX_PUBLIC_PORT_NUM)
7898 	{
7899 		ReleaseList(o);
7900 		return NULL;
7901 	}
7902 
7903 	return o;
7904 }
7905 
7906 // Set to the cluster member mode
PsClusterSettingMember(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)7907 UINT PsClusterSettingMember(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
7908 {
7909 	LIST *o;
7910 	PS *ps = (PS *)param;
7911 	UINT ret = 0;
7912 	RPC_FARM t;
7913 	char *host_and_port;
7914 	char *host;
7915 	UINT port;
7916 	UINT weight;
7917 	// Parameter list that can be specified
7918 	PARAM args[] =
7919 	{
7920 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
7921 		{"[server:port]", CmdPrompt, _UU("CMD_ClusterSettingMember_Prompt_HOST_1"), CmdEvalHostAndPort, NULL},
7922 		{"IP", PsClusterSettingMemberPromptIp, NULL, CmdEvalIp, NULL},
7923 		{"PORTS", PsClusterSettingMemberPromptPorts, NULL, CmdEvalPortList, (void *)true},
7924 		{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
7925 		{"WEIGHT", NULL, NULL, NULL, NULL},
7926 	};
7927 
7928 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
7929 	if (o == NULL)
7930 	{
7931 		return ERR_INVALID_PARAMETER;
7932 	}
7933 
7934 	weight = GetParamInt(o, "WEIGHT");
7935 
7936 	if (weight == 0)
7937 	{
7938 		weight = FARM_DEFAULT_WEIGHT;
7939 	}
7940 
7941 	Zero(&t, sizeof(t));
7942 	host_and_port = GetParamStr(o, "[server:port]");
7943 	if (ParseHostPort(host_and_port, &host, &port, 0))
7944 	{
7945 		char *pw;
7946 		char *ports_str;
7947 		LIST *ports;
7948 		UINT i;
7949 
7950 		StrCpy(t.ControllerName, sizeof(t.ControllerName), host);
7951 		t.ControllerPort = port;
7952 		Free(host);
7953 
7954 		pw = GetParamStr(o, "PASSWORD");
7955 
7956 		Sha0(t.MemberPassword, pw, StrLen(pw));
7957 		t.PublicIp = StrToIP32(GetParamStr(o, "IP"));
7958 		t.ServerType = SERVER_TYPE_FARM_MEMBER;
7959 
7960 		ports_str = GetParamStr(o, "PORTS");
7961 
7962 		ports = StrToPortList(ports_str, true);
7963 
7964 		t.NumPort = LIST_NUM(ports);
7965 		t.Ports = ZeroMalloc(sizeof(UINT) * t.NumPort);
7966 
7967 		for (i = 0;i < t.NumPort;i++)
7968 		{
7969 			t.Ports[i] = (UINT)LIST_DATA(ports, i);
7970 		}
7971 
7972 		t.Weight = weight;
7973 
7974 		ReleaseList(ports);
7975 
7976 		// RPC call
7977 		ret = ScSetFarmSetting(ps->Rpc, &t);
7978 
7979 		if (ret != ERR_NO_ERROR)
7980 		{
7981 			// An error has occured
7982 			CmdPrintError(c, ret);
7983 			FreeParamValueList(o);
7984 			return ret;
7985 		}
7986 
7987 		FreeRpcFarm(&t);
7988 	}
7989 
7990 	FreeParamValueList(o);
7991 
7992 	return 0;
7993 }
7994 
7995 // Evaluate the port list
CmdEvalPortList(CONSOLE * c,wchar_t * str,void * param)7996 bool CmdEvalPortList(CONSOLE *c, wchar_t *str, void *param)
7997 {
7998 	char *s;
7999 	bool ret = false;
8000 	LIST *o;
8001 	// Validate arguments
8002 	if (c == NULL || str == NULL)
8003 	{
8004 		return false;
8005 	}
8006 
8007 	s = CopyUniToStr(str);
8008 
8009 	o = StrToPortList(s, (bool)param);
8010 
8011 	if (o != NULL)
8012 	{
8013 		ret = true;
8014 	}
8015 
8016 	ReleaseList(o);
8017 
8018 	Free(s);
8019 
8020 	if (ret == false)
8021 	{
8022 		c->Write(c, _UU("CMD_PORTLIST_EVAL_FAILED"));
8023 	}
8024 
8025 	return ret;
8026 }
8027 
8028 // Check the string of the form of the host name and port number
CmdEvalHostAndPort(CONSOLE * c,wchar_t * str,void * param)8029 bool CmdEvalHostAndPort(CONSOLE *c, wchar_t *str, void *param)
8030 {
8031 	char *tmp;
8032 	bool ret = false;
8033 	// Validate arguments
8034 	if (c == NULL || str == NULL)
8035 	{
8036 		return false;
8037 	}
8038 
8039 	tmp = CopyUniToStr(str);
8040 
8041 	ret = ParseHostPort(tmp, NULL, NULL, (UINT)param);
8042 
8043 	if (ret == false)
8044 	{
8045 		c->Write(c, param == NULL ? _UU("CMD_HOSTPORT_EVAL_FAILED") : (wchar_t *)param);
8046 	}
8047 
8048 	Free(tmp);
8049 
8050 	return ret;
8051 }
8052 
8053 // Input the public port number
PsClusterSettingMemberPromptPorts(CONSOLE * c,void * param)8054 wchar_t *PsClusterSettingMemberPromptPorts(CONSOLE *c, void *param)
8055 {
8056 	wchar_t *ret;
8057 	// Validate arguments
8058 	if (c == NULL)
8059 	{
8060 		return NULL;
8061 	}
8062 
8063 	c->Write(c, _UU("CMD_ClusterSettingMember_Prompt_PORT_1"));
8064 	c->Write(c, L"");
8065 
8066 	ret = c->ReadLine(c, _UU("CMD_ClusterSettingMember_Prompt_PORT_2"), true);
8067 
8068 	return ret;
8069 }
8070 
8071 // Input the public IP address
PsClusterSettingMemberPromptIp(CONSOLE * c,void * param)8072 wchar_t *PsClusterSettingMemberPromptIp(CONSOLE *c, void *param)
8073 {
8074 	wchar_t *ret;
8075 	// Validate arguments
8076 	if (c == NULL)
8077 	{
8078 		return NULL;
8079 	}
8080 
8081 	c->Write(c, _UU("CMD_ClusterSettingMember_Prompt_IP_1"));
8082 	c->Write(c, L"");
8083 
8084 	ret = c->ReadLine(c, _UU("CMD_ClusterSettingMember_Prompt_IP_2"), true);
8085 
8086 	return ret;
8087 }
8088 
8089 // Show the cluster members list
PsClusterMemberList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8090 UINT PsClusterMemberList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8091 {
8092 	LIST *o;
8093 	PS *ps = (PS *)param;
8094 	UINT ret = 0;
8095 	RPC_ENUM_FARM t;
8096 	CT *ct;
8097 	UINT i;
8098 
8099 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
8100 	if (o == NULL)
8101 	{
8102 		return ERR_INVALID_PARAMETER;
8103 	}
8104 
8105 	Zero(&t, sizeof(t));
8106 
8107 	// RPC call
8108 	ret = ScEnumFarmMember(ps->Rpc, &t);
8109 
8110 	if (ret != ERR_NO_ERROR)
8111 	{
8112 		// An error has occured
8113 		CmdPrintError(c, ret);
8114 		FreeParamValueList(o);
8115 		return ret;
8116 	}
8117 
8118 	ct = CtNew();
8119 
8120 	CtInsertColumn(ct, _UU("CMD_ID"), true);
8121 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_1"), false);
8122 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_2"), false);
8123 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_3"), false);
8124 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_4"), true);
8125 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_5"), true);
8126 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_6"), true);
8127 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_7"), true);
8128 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_8"), true);
8129 	CtInsertColumn(ct, _UU("SM_FM_COLUMN_9"), true);
8130 
8131 	for (i = 0;i < t.NumFarm;i++)
8132 	{
8133 		RPC_ENUM_FARM_ITEM *e = &t.Farms[i];
8134 		wchar_t tmp0[64];
8135 		wchar_t tmp1[MAX_SIZE];
8136 		wchar_t tmp2[MAX_SIZE];
8137 		wchar_t tmp3[64];
8138 		wchar_t tmp4[64];
8139 		wchar_t tmp5[64];
8140 		wchar_t tmp6[64];
8141 		wchar_t tmp7[64];
8142 		wchar_t tmp8[64];
8143 
8144 		GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->ConnectedTime), NULL);
8145 		StrToUni(tmp2, sizeof(tmp2), e->Hostname);
8146 		UniToStru(tmp3, e->Point);
8147 		UniToStru(tmp4, e->NumSessions);
8148 		UniToStru(tmp5, e->NumTcpConnections);
8149 		UniToStru(tmp6, e->NumHubs);
8150 		UniToStru(tmp7, e->AssignedClientLicense);
8151 		UniToStru(tmp8, e->AssignedBridgeLicense);
8152 
8153 		UniToStru(tmp0, e->Id);
8154 
8155 		CtInsert(ct, tmp0,
8156 			e->Controller ? _UU("SM_FM_CONTROLLER") : _UU("SM_FM_MEMBER"),
8157 			tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8);
8158 	}
8159 
8160 	CtFree(ct, c);
8161 
8162 	FreeRpcEnumFarm(&t);
8163 
8164 	FreeParamValueList(o);
8165 
8166 	return 0;
8167 }
8168 
8169 // Get information of cluster members
PsClusterMemberInfoGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8170 UINT PsClusterMemberInfoGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8171 {
8172 	LIST *o;
8173 	PS *ps = (PS *)param;
8174 	UINT ret = 0;
8175 	RPC_FARM_INFO t;
8176 	CT *ct;
8177 	// Parameter list that can be specified
8178 	PARAM args[] =
8179 	{
8180 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
8181 		{"[id]", CmdPrompt, _UU("CMD_ClusterMemberInfoGet_PROMPT_ID"), NULL, NULL},
8182 	};
8183 
8184 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
8185 	if (o == NULL)
8186 	{
8187 		return ERR_INVALID_PARAMETER;
8188 	}
8189 
8190 	Zero(&t, sizeof(t));
8191 	t.Id = UniToInt(GetParamUniStr(o, "[id]"));
8192 
8193 	// RPC call
8194 	ret = ScGetFarmInfo(ps->Rpc, &t);
8195 
8196 	if (ret != ERR_NO_ERROR)
8197 	{
8198 		// An error has occured
8199 		CmdPrintError(c, ret);
8200 		FreeParamValueList(o);
8201 		return ret;
8202 	}
8203 
8204 	ct = CtNewStandard();
8205 
8206 	{
8207 		wchar_t tmp[MAX_SIZE];
8208 		char str[MAX_SIZE];
8209 		UINT i;
8210 
8211 		CtInsert(ct, _UU("SM_FMINFO_TYPE"),
8212 			t.Controller ? _UU("SM_FARM_CONTROLLER") : _UU("SM_FARM_MEMBER"));
8213 
8214 		GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ConnectedTime), NULL);
8215 		CtInsert(ct, _UU("SM_FMINFO_CONNECT_TIME"), tmp);
8216 
8217 		IPToStr32(str, sizeof(str), t.Ip);
8218 		StrToUni(tmp, sizeof(tmp), str);
8219 		CtInsert(ct, _UU("SM_FMINFO_IP"), tmp);
8220 
8221 		StrToUni(tmp, sizeof(tmp), t.Hostname);
8222 		CtInsert(ct, _UU("SM_FMINFO_HOSTNAME"), tmp);
8223 
8224 		UniToStru(tmp, t.Point);
8225 		CtInsert(ct, _UU("SM_FMINFO_POINT"), tmp);
8226 
8227 		UniToStru(tmp, t.Weight);
8228 		CtInsert(ct, _UU("SM_FMINFO_WEIGHT"), tmp);
8229 
8230 		UniToStru(tmp, t.NumPort);
8231 		CtInsert(ct, _UU("SM_FMINFO_NUM_PORT"), tmp);
8232 
8233 		for (i = 0;i < t.NumPort;i++)
8234 		{
8235 			wchar_t tmp2[MAX_SIZE];
8236 			UniFormat(tmp, sizeof(tmp), _UU("SM_FMINFO_PORT"), i + 1);
8237 			UniToStru(tmp2, t.Ports[i]);
8238 			CtInsert(ct, tmp, tmp2);
8239 		}
8240 
8241 		UniToStru(tmp, t.NumFarmHub);
8242 		CtInsert(ct, _UU("SM_FMINFO_NUM_HUB"), tmp);
8243 
8244 		for (i = 0;i < t.NumFarmHub;i++)
8245 		{
8246 			wchar_t tmp2[MAX_SIZE];
8247 			UniFormat(tmp, sizeof(tmp), _UU("SM_FMINFO_HUB"), i + 1);
8248 			UniFormat(tmp2, sizeof(tmp2),
8249 				t.FarmHubs[i].DynamicHub ? _UU("SM_FMINFO_HUB_TAG_2") : _UU("SM_FMINFO_HUB_TAG_1"),
8250 				t.FarmHubs[i].HubName);
8251 			CtInsert(ct, tmp, tmp2);
8252 		}
8253 
8254 		UniToStru(tmp, t.NumSessions);
8255 		CtInsert(ct, _UU("SM_FMINFO_NUM_SESSION"), tmp);
8256 
8257 		UniToStru(tmp, t.NumTcpConnections);
8258 		CtInsert(ct, _UU("SM_FMINFO_NUN_CONNECTION"), tmp);
8259 	}
8260 
8261 	CtFree(ct, c);
8262 
8263 	FreeRpcFarmInfo(&t);
8264 
8265 	FreeParamValueList(o);
8266 
8267 	return 0;
8268 }
8269 
8270 // Get certificates of cluster members
PsClusterMemberCertGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8271 UINT PsClusterMemberCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8272 {
8273 	LIST *o;
8274 	PS *ps = (PS *)param;
8275 	UINT ret = 0;
8276 	RPC_FARM_INFO t;
8277 	// Parameter list that can be specified
8278 	PARAM args[] =
8279 	{
8280 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
8281 		{"[id]", CmdPrompt, _UU("CMD_ClusterMemberCertGet_PROMPT_ID"), NULL, NULL},
8282 		{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
8283 	};
8284 
8285 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
8286 	if (o == NULL)
8287 	{
8288 		return ERR_INVALID_PARAMETER;
8289 	}
8290 
8291 	Zero(&t, sizeof(t));
8292 
8293 	t.Id = UniToInt(GetParamUniStr(o, "[id]"));
8294 
8295 	// RPC call
8296 	ret = ScGetFarmInfo(ps->Rpc, &t);
8297 
8298 	if (ret != ERR_NO_ERROR)
8299 	{
8300 		// An error has occured
8301 		CmdPrintError(c, ret);
8302 		FreeParamValueList(o);
8303 		return ret;
8304 	}
8305 	else
8306 	{
8307 		X *x = t.ServerCert;
8308 		wchar_t *filename = GetParamUniStr(o, "SAVECERT");
8309 
8310 		if (XToFileW(x, filename, true) == false)
8311 		{
8312 			c->Write(c, _UU("CMD_SAVECERT_FAILED"));
8313 
8314 			ret = ERR_INTERNAL_ERROR;
8315 		}
8316 	}
8317 
8318 	FreeRpcFarmInfo(&t);
8319 
8320 	FreeParamValueList(o);
8321 
8322 	return ret;
8323 }
8324 
8325 // Get the status of the connection to the cluster controller
PsClusterConnectionStatusGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8326 UINT PsClusterConnectionStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8327 {
8328 	LIST *o;
8329 	PS *ps = (PS *)param;
8330 	UINT ret = 0;
8331 	RPC_FARM_CONNECTION_STATUS t;
8332 	wchar_t tmp[MAX_SIZE];
8333 
8334 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
8335 	if (o == NULL)
8336 	{
8337 		return ERR_INVALID_PARAMETER;
8338 	}
8339 
8340 	Zero(&t, sizeof(t));
8341 
8342 	// RPC call
8343 	ret = ScGetFarmConnectionStatus(ps->Rpc, &t);
8344 
8345 	if (ret != ERR_NO_ERROR)
8346 	{
8347 		// An error has occured
8348 		CmdPrintError(c, ret);
8349 		FreeParamValueList(o);
8350 		return ret;
8351 	}
8352 	else
8353 	{
8354 		CT *ct = CtNewStandard();
8355 		char str[MAX_SIZE];
8356 
8357 		if (t.Online == false)
8358 		{
8359 			CtInsert(ct, _UU("SM_FC_IP"), _UU("SM_FC_NOT_CONNECTED"));
8360 
8361 			CtInsert(ct, _UU("SM_FC_PORT"), _UU("SM_FC_NOT_CONNECTED"));
8362 		}
8363 		else
8364 		{
8365 			IPToStr32(str, sizeof(str), t.Ip);
8366 			StrToUni(tmp, sizeof(tmp), str);
8367 			CtInsert(ct, _UU("SM_FC_IP"), tmp);
8368 
8369 			UniToStru(tmp, t.Port);
8370 			CtInsert(ct, _UU("SM_FC_PORT"), tmp);
8371 		}
8372 
8373 		CtInsert(ct,
8374 			_UU("SM_FC_STATUS"),
8375 			t.Online ? _UU("SM_FC_ONLINE") : _UU("SM_FC_OFFLINE"));
8376 
8377 		if (t.Online == false)
8378 		{
8379 			UniFormat(tmp, sizeof(tmp), _UU("SM_FC_ERROR_TAG"), _E(t.LastError), t.LastError);
8380 			CtInsert(ct,
8381 				_UU("SM_FC_LAST_ERROR"), tmp);
8382 		}
8383 
8384 		GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.StartedTime), NULL);
8385 		CtInsert(ct, _UU("SM_FC_START_TIME"), tmp);
8386 
8387 		GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.FirstConnectedTime), NULL);
8388 		CtInsert(ct, _UU("SM_FC_FIRST_TIME"), tmp);
8389 
8390 		//if (t.Online == false)
8391 		{
8392 			GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.CurrentConnectedTime), NULL);
8393 			CtInsert(ct, _UU("SM_FC_CURRENT_TIME"), tmp);
8394 		}
8395 
8396 		UniToStru(tmp, t.NumTry);
8397 		CtInsert(ct, _UU("SM_FC_NUM_TRY"), tmp);
8398 
8399 		UniToStru(tmp, t.NumConnected);
8400 		CtInsert(ct, _UU("SM_FC_NUM_CONNECTED"), tmp);
8401 
8402 		UniToStru(tmp, t.NumFailed);
8403 		CtInsert(ct, _UU("SM_FC_NUM_FAILED"), tmp);
8404 
8405 		CtFree(ct, c);
8406 	}
8407 
8408 	FreeParamValueList(o);
8409 
8410 	return 0;
8411 }
8412 
8413 // Get the SSL certificate of the VPN Server
PsServerCertGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8414 UINT PsServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8415 {
8416 	LIST *o;
8417 	PS *ps = (PS *)param;
8418 	UINT ret = 0;
8419 	RPC_KEY_PAIR t;
8420 	// Parameter list that can be specified
8421 	PARAM args[] =
8422 	{
8423 		{"[cert]", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
8424 	};
8425 
8426 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
8427 	if (o == NULL)
8428 	{
8429 		return ERR_INVALID_PARAMETER;
8430 	}
8431 
8432 	Zero(&t, sizeof(t));
8433 
8434 	// RPC call
8435 	ret = ScGetServerCert(ps->Rpc, &t);
8436 
8437 	if (ret != ERR_NO_ERROR)
8438 	{
8439 		// An error has occured
8440 		CmdPrintError(c, ret);
8441 		FreeParamValueList(o);
8442 		return ret;
8443 	}
8444 
8445 	if (XToFileW(t.Cert, GetParamUniStr(o, "[cert]"), true) == false)
8446 	{
8447 		c->Write(c, _UU("CMD_SAVECERT_FAILED"));
8448 	}
8449 
8450 	FreeRpcKeyPair(&t);
8451 
8452 	FreeParamValueList(o);
8453 
8454 	return 0;
8455 }
8456 
8457 // Get the private key of the SSL certificate of the VPN Server
PsServerKeyGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8458 UINT PsServerKeyGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8459 {
8460 	LIST *o;
8461 	PS *ps = (PS *)param;
8462 	UINT ret = 0;
8463 	RPC_KEY_PAIR t;
8464 	// Parameter list that can be specified
8465 	PARAM args[] =
8466 	{
8467 		{"[key]", CmdPrompt, _UU("CMD_SAVEKEYPATH"), CmdEvalNotEmpty, NULL},
8468 	};
8469 
8470 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
8471 	if (o == NULL)
8472 	{
8473 		return ERR_INVALID_PARAMETER;
8474 	}
8475 
8476 	Zero(&t, sizeof(t));
8477 
8478 	// RPC call
8479 	ret = ScGetServerCert(ps->Rpc, &t);
8480 
8481 	if (ret != ERR_NO_ERROR)
8482 	{
8483 		// An error has occured
8484 		CmdPrintError(c, ret);
8485 		FreeParamValueList(o);
8486 		return ret;
8487 	}
8488 
8489 	if (t.Key != NULL)
8490 	{
8491 		if (KToFileW(t.Key, GetParamUniStr(o, "[key]"), true, NULL) == false)
8492 		{
8493 			c->Write(c, _UU("CMD_SAVEKEY_FAILED"));
8494 		}
8495 	}
8496 	else
8497 	{
8498 		ret = ERR_NOT_ENOUGH_RIGHT;
8499 		CmdPrintError(c, ret);
8500 	}
8501 
8502 	FreeRpcKeyPair(&t);
8503 
8504 	FreeParamValueList(o);
8505 
8506 	return ret;
8507 }
8508 
8509 // Read the certificate and the private key
CmdLoadCertAndKey(CONSOLE * c,X ** xx,K ** kk,wchar_t * cert_filename,wchar_t * key_filename)8510 bool CmdLoadCertAndKey(CONSOLE *c, X **xx, K **kk, wchar_t *cert_filename, wchar_t *key_filename)
8511 {
8512 	X *x;
8513 	K *k;
8514 	// Validate arguments
8515 	if (c == NULL || cert_filename == NULL || key_filename == NULL || xx == NULL || kk == NULL)
8516 	{
8517 		return false;
8518 	}
8519 
8520 	x = FileToXW(cert_filename);
8521 	if (x == NULL)
8522 	{
8523 		c->Write(c, _UU("CMD_LOADCERT_FAILED"));
8524 		return false;
8525 	}
8526 
8527 	k = CmdLoadKey(c, key_filename);
8528 	if (k == NULL)
8529 	{
8530 		c->Write(c, _UU("CMD_LOADKEY_FAILED"));
8531 		FreeX(x);
8532 		return false;
8533 	}
8534 
8535 	if (CheckXandK(x, k) == false)
8536 	{
8537 		c->Write(c, _UU("CMD_KEYPAIR_FAILED"));
8538 		FreeX(x);
8539 		FreeK(k);
8540 
8541 		return false;
8542 	}
8543 
8544 	*xx = x;
8545 	*kk = k;
8546 
8547 	return true;
8548 }
8549 
8550 // Read the secret key
CmdLoadKey(CONSOLE * c,wchar_t * filename)8551 K *CmdLoadKey(CONSOLE *c, wchar_t *filename)
8552 {
8553 	BUF *b;
8554 	// Validate arguments
8555 	if (c == NULL || filename == NULL)
8556 	{
8557 		return NULL;
8558 	}
8559 
8560 	b = ReadDumpW(filename);
8561 	if (b == NULL)
8562 	{
8563 		c->Write(c, _UU("CMD_LOADCERT_FAILED"));
8564 		return NULL;
8565 	}
8566 	else
8567 	{
8568 		K *key;
8569 		if (IsEncryptedK(b, true) == false)
8570 		{
8571 			key = BufToK(b, true, IsBase64(b), NULL);
8572 		}
8573 		else
8574 		{
8575 			c->Write(c, _UU("CMD_LOADKEY_ENCRYPTED_1"));
8576 
8577 			while (true)
8578 			{
8579 				char *pass = c->ReadPassword(c, _UU("CMD_LOADKEY_ENCRYPTED_2"));
8580 
8581 				if (pass == NULL)
8582 				{
8583 					FreeBuf(b);
8584 					return NULL;
8585 				}
8586 
8587 				key = BufToK(b, true, IsBase64(b), pass);
8588 				Free(pass);
8589 
8590 				if (key != NULL)
8591 				{
8592 					break;
8593 				}
8594 
8595 				c->Write(c, _UU("CMD_LOADKEY_ENCRYPTED_3"));
8596 			}
8597 		}
8598 
8599 		FreeBuf(b);
8600 
8601 		return key;
8602 	}
8603 }
8604 
8605 // Set the SSL certificate and the private key of the VPN Server
PsServerCertSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8606 UINT PsServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8607 {
8608 	LIST *o;
8609 	PS *ps = (PS *)param;
8610 	UINT ret = 0;
8611 	RPC_KEY_PAIR t;
8612 	// Parameter list that can be specified
8613 	PARAM args[] =
8614 	{
8615 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
8616 		{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
8617 		{"LOADKEY", CmdPrompt, _UU("CMD_LOADKEYPATH"), CmdEvalIsFile, NULL},
8618 	};
8619 
8620 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
8621 	if (o == NULL)
8622 	{
8623 		return ERR_INVALID_PARAMETER;
8624 	}
8625 
8626 	Zero(&t, sizeof(t));
8627 
8628 	if (CmdLoadCertAndKey(c, &t.Cert, &t.Key,
8629 		GetParamUniStr(o, "LOADCERT"),
8630 		GetParamUniStr(o, "LOADKEY")))
8631 	{
8632 		// RPC call
8633 		ret = ScSetServerCert(ps->Rpc, &t);
8634 
8635 		if (ret != ERR_NO_ERROR)
8636 		{
8637 			// An error has occured
8638 			CmdPrintError(c, ret);
8639 			FreeParamValueList(o);
8640 			return ret;
8641 		}
8642 
8643 		if (t.Flag1 == 0)
8644 		{
8645 			// Show the warning message
8646 			c->Write(c, L"");
8647 			c->Write(c, _UU("SM_CERT_NEED_ROOT"));
8648 			c->Write(c, L"");
8649 		}
8650 
8651 		FreeRpcKeyPair(&t);
8652 	}
8653 	else
8654 	{
8655 		ret = ERR_INTERNAL_ERROR;
8656 	}
8657 
8658 	FreeParamValueList(o);
8659 
8660 	return ret;
8661 }
8662 
8663 // Get the encryption algorithm used for the VPN communication
PsServerCipherGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8664 UINT PsServerCipherGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8665 {
8666 	LIST *o;
8667 	PS *ps = (PS *)param;
8668 	UINT ret = 0;
8669 	RPC_STR t;
8670 	TOKEN_LIST *ciphers;
8671 	UINT i;
8672 	wchar_t tmp[4096];
8673 
8674 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
8675 	if (o == NULL)
8676 	{
8677 		return ERR_INVALID_PARAMETER;
8678 	}
8679 
8680 	Zero(&t, sizeof(t));
8681 
8682 	// RPC call
8683 	ret = ScGetServerCipher(ps->Rpc, &t);
8684 
8685 	if (ret != ERR_NO_ERROR)
8686 	{
8687 		// An error has occured
8688 		CmdPrintError(c, ret);
8689 		FreeParamValueList(o);
8690 		return ret;
8691 	}
8692 
8693 	UniFormat(tmp, sizeof(tmp), L" %S", t.String);
8694 	FreeRpcStr(&t);
8695 	Zero(&t, sizeof(RPC_STR));
8696 
8697 	c->Write(c, _UU("CMD_ServerCipherGet_SERVER"));
8698 	c->Write(c, tmp);
8699 
8700 	ret = ScGetServerCipherList(ps->Rpc, &t);
8701 
8702 	if (ret == ERR_NO_ERROR)
8703 	{
8704 		ciphers = ParseToken(t.String, ";");
8705 
8706 		FreeRpcStr(&t);
8707 
8708 		c->Write(c, L"");
8709 		c->Write(c, _UU("CMD_ServerCipherGet_CIPHERS"));
8710 
8711 		for (i = 0; i < ciphers->NumTokens; i++)
8712 		{
8713 			UniFormat(tmp, sizeof(tmp), L" %S", ciphers->Token[i]);
8714 			c->Write(c, tmp);
8715 		}
8716 
8717 		FreeToken(ciphers);
8718 	}
8719 
8720 	FreeParamValueList(o);
8721 
8722 	return 0;
8723 }
8724 
8725 // Set the encryption algorithm used for the VPN communication
PsServerCipherSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8726 UINT PsServerCipherSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8727 {
8728 	LIST *o;
8729 	PS *ps = (PS *)param;
8730 	UINT ret = 0;
8731 	RPC_STR t;
8732 	// Parameter list that can be specified
8733 	PARAM args[] =
8734 	{
8735 		{"[name]", CmdPrompt, _UU("CMD_ServerCipherSet_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
8736 	};
8737 
8738 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
8739 	if (o == NULL)
8740 	{
8741 		return ERR_INVALID_PARAMETER;
8742 	}
8743 
8744 	Zero(&t, sizeof(t));
8745 	t.String = CopyStr(GetParamStr(o, "[name]"));
8746 
8747 	// RPC call
8748 	ret = ScSetServerCipher(ps->Rpc, &t);
8749 
8750 	if (ret != ERR_NO_ERROR)
8751 	{
8752 		// An error has occured
8753 		CmdPrintError(c, ret);
8754 		FreeParamValueList(o);
8755 		return ret;
8756 	}
8757 
8758 	FreeRpcStr(&t);
8759 
8760 	FreeParamValueList(o);
8761 
8762 	return 0;
8763 }
8764 
8765 // Enabling the maintenance function of the Internet connection
PsKeepEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8766 UINT PsKeepEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8767 {
8768 	LIST *o;
8769 	PS *ps = (PS *)param;
8770 	UINT ret = 0;
8771 	RPC_KEEP t;
8772 
8773 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
8774 	if (o == NULL)
8775 	{
8776 		return ERR_INVALID_PARAMETER;
8777 	}
8778 
8779 	Zero(&t, sizeof(t));
8780 
8781 	// RPC call
8782 	ret = ScGetKeep(ps->Rpc, &t);
8783 
8784 	if (ret != ERR_NO_ERROR)
8785 	{
8786 		// An error has occured
8787 		CmdPrintError(c, ret);
8788 		FreeParamValueList(o);
8789 		return ret;
8790 	}
8791 
8792 	t.UseKeepConnect = true;
8793 
8794 	ret = ScSetKeep(ps->Rpc, &t);
8795 
8796 	if (ret != ERR_NO_ERROR)
8797 	{
8798 		// An error has occured
8799 		CmdPrintError(c, ret);
8800 		FreeParamValueList(o);
8801 		return ret;
8802 	}
8803 
8804 	FreeParamValueList(o);
8805 
8806 	return 0;
8807 }
8808 
8809 // Disabling the maintenance function of the Internet connection
PsKeepDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8810 UINT PsKeepDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8811 {
8812 	LIST *o;
8813 	PS *ps = (PS *)param;
8814 	UINT ret = 0;
8815 	RPC_KEEP t;
8816 
8817 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
8818 	if (o == NULL)
8819 	{
8820 		return ERR_INVALID_PARAMETER;
8821 	}
8822 
8823 	Zero(&t, sizeof(t));
8824 
8825 	// RPC call
8826 	ret = ScGetKeep(ps->Rpc, &t);
8827 
8828 	if (ret != ERR_NO_ERROR)
8829 	{
8830 		// An error has occured
8831 		CmdPrintError(c, ret);
8832 		FreeParamValueList(o);
8833 		return ret;
8834 	}
8835 
8836 	t.UseKeepConnect = false;
8837 
8838 	ret = ScSetKeep(ps->Rpc, &t);
8839 
8840 	if (ret != ERR_NO_ERROR)
8841 	{
8842 		// An error has occured
8843 		CmdPrintError(c, ret);
8844 		FreeParamValueList(o);
8845 		return ret;
8846 	}
8847 
8848 	FreeParamValueList(o);
8849 
8850 	return 0;
8851 }
8852 
8853 // Evaluate the UDP or the TCP
CmdEvalTcpOrUdp(CONSOLE * c,wchar_t * str,void * param)8854 bool CmdEvalTcpOrUdp(CONSOLE *c, wchar_t *str, void *param)
8855 {
8856 	// Validate arguments
8857 	if (c == NULL || str == NULL)
8858 	{
8859 		return false;
8860 	}
8861 
8862 	if (UniStrCmpi(str, L"tcp") == 0 || UniStrCmpi(str, L"udp") == 0)
8863 	{
8864 		return true;
8865 	}
8866 
8867 	c->Write(c, _UU("CMD_KeepSet_EVAL_TCP_UDP"));
8868 
8869 	return false;
8870 }
8871 
8872 // Enable the syslog configuration
PsSyslogEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8873 UINT PsSyslogEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8874 {
8875 	LIST *o;
8876 	PS *ps = (PS *)param;
8877 	UINT ret = 0;
8878 	SYSLOG_SETTING t;
8879 	CMD_EVAL_MIN_MAX minmax = {"CMD_SyslogEnable_MINMAX", 1, 3};
8880 	char *host;
8881 	UINT port;
8882 
8883 	// Parameter list that can be specified
8884 	PARAM args[] =
8885 	{
8886 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
8887 		{"[1|2|3]", CmdPrompt, _UU("CMD_SyslogEnable_Prompt_123"), CmdEvalMinMax, &minmax},
8888 		{"HOST", CmdPrompt, _UU("CMD_SyslogEnable_Prompt_HOST"), CmdEvalHostAndPort, (void *)SYSLOG_PORT},
8889 	};
8890 
8891 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
8892 	if (o == NULL)
8893 	{
8894 		return ERR_INVALID_PARAMETER;
8895 	}
8896 
8897 	Zero(&t, sizeof(t));
8898 
8899 	if (ParseHostPort(GetParamStr(o, "HOST"), &host, &port, SYSLOG_PORT))
8900 	{
8901 		StrCpy(t.Hostname, sizeof(t.Hostname), host);
8902 		t.Port = port;
8903 		t.SaveType = GetParamInt(o, "[1|2|3]");
8904 
8905 		Free(host);
8906 
8907 		// RPC call
8908 		ret = ScSetSysLog(ps->Rpc, &t);
8909 
8910 		if (ret != ERR_NO_ERROR)
8911 		{
8912 			// An error has occured
8913 			CmdPrintError(c, ret);
8914 			FreeParamValueList(o);
8915 			return ret;
8916 		}
8917 	}
8918 
8919 	FreeParamValueList(o);
8920 
8921 	return 0;
8922 }
8923 
8924 // Disable the syslog configuration
PsSyslogDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8925 UINT PsSyslogDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8926 {
8927 	LIST *o;
8928 	PS *ps = (PS *)param;
8929 	UINT ret = 0;
8930 	SYSLOG_SETTING t;
8931 
8932 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
8933 	if (o == NULL)
8934 	{
8935 		return ERR_INVALID_PARAMETER;
8936 	}
8937 
8938 	Zero(&t, sizeof(t));
8939 
8940 	// RPC call
8941 	ret = ScGetSysLog(ps->Rpc, &t);
8942 
8943 	if (ret != ERR_NO_ERROR)
8944 	{
8945 		// An error has occured
8946 		CmdPrintError(c, ret);
8947 		FreeParamValueList(o);
8948 		return ret;
8949 	}
8950 
8951 	t.SaveType = SYSLOG_NONE;
8952 
8953 	// RPC call
8954 	ret = ScSetSysLog(ps->Rpc, &t);
8955 
8956 	if (ret != ERR_NO_ERROR)
8957 	{
8958 		// An error has occured
8959 		CmdPrintError(c, ret);
8960 		FreeParamValueList(o);
8961 		return ret;
8962 	}
8963 
8964 	FreeParamValueList(o);
8965 
8966 	return 0;
8967 }
8968 
8969 // Get the syslog configuration
PsSyslogGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)8970 UINT PsSyslogGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
8971 {
8972 	LIST *o;
8973 	PS *ps = (PS *)param;
8974 	UINT ret = 0;
8975 	SYSLOG_SETTING t;
8976 
8977 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
8978 	if (o == NULL)
8979 	{
8980 		return ERR_INVALID_PARAMETER;
8981 	}
8982 
8983 	Zero(&t, sizeof(t));
8984 
8985 	// RPC call
8986 	ret = ScGetSysLog(ps->Rpc, &t);
8987 
8988 	if (ret != ERR_NO_ERROR)
8989 	{
8990 		// An error has occured
8991 		CmdPrintError(c, ret);
8992 		FreeParamValueList(o);
8993 		return ret;
8994 	}
8995 	else
8996 	{
8997 		wchar_t tmp[MAX_SIZE];
8998 		CT *ct = CtNewStandard();
8999 
9000 		CtInsert(ct, _UU("CMD_SyslogGet_COLUMN_1"), GetSyslogSettingName(t.SaveType));
9001 
9002 		if (t.SaveType != SYSLOG_NONE)
9003 		{
9004 			StrToUni(tmp, sizeof(tmp), t.Hostname);
9005 			CtInsert(ct, _UU("CMD_SyslogGet_COLUMN_2"), tmp);
9006 
9007 			UniToStru(tmp, t.Port);
9008 			CtInsert(ct, _UU("CMD_SyslogGet_COLUMN_3"), tmp);
9009 		}
9010 
9011 		CtFree(ct, c);
9012 	}
9013 
9014 	FreeParamValueList(o);
9015 
9016 	return 0;
9017 }
9018 
9019 // Get the syslog configuration name
GetSyslogSettingName(UINT n)9020 wchar_t *GetSyslogSettingName(UINT n)
9021 {
9022 	char tmp[MAX_PATH];
9023 
9024 	Format(tmp, sizeof(tmp), "SM_SYSLOG_%u", n);
9025 
9026 	return _UU(tmp);
9027 }
9028 
9029 // Setting of maintenance function of the Internet connection
PsKeepSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9030 UINT PsKeepSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9031 {
9032 	LIST *o;
9033 	PS *ps = (PS *)param;
9034 	UINT ret = 0;
9035 	RPC_KEEP t;
9036 	char *host;
9037 	UINT port;
9038 	// Parameter list that can be specified
9039 	PARAM args[] =
9040 	{
9041 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9042 		{"HOST", CmdPrompt, _UU("CMD_KeepSet_PROMPT_HOST"), CmdEvalHostAndPort, NULL},
9043 		{"PROTOCOL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_PROTOCOL"), CmdEvalTcpOrUdp, NULL},
9044 		{"INTERVAL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_INTERVAL"), NULL, NULL},
9045 	};
9046 
9047 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9048 	if (o == NULL)
9049 	{
9050 		return ERR_INVALID_PARAMETER;
9051 	}
9052 
9053 	Zero(&t, sizeof(t));
9054 
9055 	// RPC call
9056 	ret = ScGetKeep(ps->Rpc, &t);
9057 
9058 	if (ret != ERR_NO_ERROR)
9059 	{
9060 		// An error has occured
9061 		CmdPrintError(c, ret);
9062 		FreeParamValueList(o);
9063 		return ret;
9064 	}
9065 
9066 	if (ParseHostPort(GetParamStr(o, "HOST"), &host, &port, 0))
9067 	{
9068 		StrCpy(t.KeepConnectHost, sizeof(t.KeepConnectHost), host);
9069 		t.KeepConnectPort = port;
9070 		t.KeepConnectInterval = GetParamInt(o, "INTERVAL");
9071 		t.KeepConnectProtocol = (StrCmpi(GetParamStr(o, "PROTOCOL"), "tcp") == 0) ? 0 : 1;
9072 		Free(host);
9073 
9074 		// RPC call
9075 		ret = ScSetKeep(ps->Rpc, &t);
9076 
9077 		if (ret != ERR_NO_ERROR)
9078 		{
9079 			// An error has occured
9080 			CmdPrintError(c, ret);
9081 			FreeParamValueList(o);
9082 			return ret;
9083 		}
9084 	}
9085 
9086 	FreeParamValueList(o);
9087 
9088 	return 0;
9089 }
9090 
9091 // Get the maintenance function of the Internet connection
PsKeepGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9092 UINT PsKeepGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9093 {
9094 	LIST *o;
9095 	PS *ps = (PS *)param;
9096 	UINT ret = 0;
9097 	RPC_KEEP t;
9098 
9099 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
9100 	if (o == NULL)
9101 	{
9102 		return ERR_INVALID_PARAMETER;
9103 	}
9104 
9105 	Zero(&t, sizeof(t));
9106 
9107 	// RPC call
9108 	ret = ScGetKeep(ps->Rpc, &t);
9109 
9110 	if (ret != ERR_NO_ERROR)
9111 	{
9112 		// An error has occured
9113 		CmdPrintError(c, ret);
9114 		FreeParamValueList(o);
9115 		return ret;
9116 	}
9117 	else
9118 	{
9119 		wchar_t tmp[MAX_SIZE];
9120 		CT *ct = CtNewStandard();
9121 
9122 		StrToUni(tmp, sizeof(tmp), t.KeepConnectHost);
9123 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_1"), tmp);
9124 
9125 		UniToStru(tmp, t.KeepConnectPort);
9126 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_2"), tmp);
9127 
9128 		UniToStru(tmp, t.KeepConnectInterval);
9129 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_3"), tmp);
9130 
9131 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_4"),
9132 			t.KeepConnectProtocol == 0 ? L"TCP/IP" : L"UDP/IP");
9133 
9134 		CtInsert(ct, _UU("CMD_KeepGet_COLUMN_5"),
9135 			t.UseKeepConnect ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"));
9136 
9137 		CtFree(ct, c);
9138 	}
9139 
9140 	FreeParamValueList(o);
9141 
9142 	return 0;
9143 }
9144 
9145 // Get the connection type string
GetConnectionTypeStr(UINT type)9146 wchar_t *GetConnectionTypeStr(UINT type)
9147 {
9148 	char tmp[MAX_SIZE];
9149 	Format(tmp, sizeof(tmp), "SM_CONNECTION_TYPE_%u", type);
9150 
9151 	return _UU(tmp);
9152 }
9153 
9154 // Get the list of TCP connections connected to VPN Server
PsConnectionList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9155 UINT PsConnectionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9156 {
9157 	LIST *o;
9158 	PS *ps = (PS *)param;
9159 	UINT ret = 0;
9160 	RPC_ENUM_CONNECTION t;
9161 	UINT i;
9162 	CT *ct;
9163 
9164 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
9165 	if (o == NULL)
9166 	{
9167 		return ERR_INVALID_PARAMETER;
9168 	}
9169 
9170 	Zero(&t, sizeof(t));
9171 
9172 	// RPC call
9173 	ret = ScEnumConnection(ps->Rpc, &t);
9174 
9175 	if (ret != ERR_NO_ERROR)
9176 	{
9177 		// An error has occured
9178 		CmdPrintError(c, ret);
9179 		FreeParamValueList(o);
9180 		return ret;
9181 	}
9182 
9183 	ct = CtNew();
9184 	CtInsertColumn(ct, _UU("SM_CONN_COLUMN_1"), false);
9185 	CtInsertColumn(ct, _UU("SM_CONN_COLUMN_2"), false);
9186 	CtInsertColumn(ct, _UU("SM_CONN_COLUMN_3"), false);
9187 	CtInsertColumn(ct, _UU("SM_CONN_COLUMN_4"), false);
9188 
9189 	for (i = 0;i < t.NumConnection;i++)
9190 	{
9191 		wchar_t tmp[MAX_SIZE];
9192 		wchar_t name[MAX_SIZE];
9193 		wchar_t datetime[MAX_SIZE];
9194 		RPC_ENUM_CONNECTION_ITEM *e = &t.Connections[i];
9195 
9196 		StrToUni(name, sizeof(name), e->Name);
9197 		UniFormat(tmp, sizeof(tmp), _UU("SM_HOSTNAME_AND_PORT"), e->Hostname, e->Port);
9198 		GetDateTimeStrEx64(datetime, sizeof(datetime), SystemToLocal64(e->ConnectedTime), NULL);
9199 
9200 		CtInsert(ct, name, tmp, datetime,
9201 			GetConnectionTypeStr(e->Type));
9202 	}
9203 
9204 	CtFree(ct, c);
9205 
9206 	FreeRpcEnumConnection(&t);
9207 
9208 	FreeParamValueList(o);
9209 
9210 	return 0;
9211 }
9212 
9213 // Get the TCP connection information currently connected to the VPN Server
PsConnectionGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9214 UINT PsConnectionGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9215 {
9216 	LIST *o;
9217 	PS *ps = (PS *)param;
9218 	UINT ret = 0;
9219 	RPC_CONNECTION_INFO t;
9220 	CT *ct;
9221 	wchar_t tmp[MAX_SIZE];
9222 	// Parameter list that can be specified
9223 	PARAM args[] =
9224 	{
9225 		{"[name]", CmdPrompt, _UU("CMD_ConnectionGet_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
9226 	};
9227 
9228 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9229 	if (o == NULL)
9230 	{
9231 		return ERR_INVALID_PARAMETER;
9232 	}
9233 
9234 	Zero(&t, sizeof(t));
9235 
9236 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
9237 
9238 	// RPC call
9239 	ret = ScGetConnectionInfo(ps->Rpc, &t);
9240 
9241 	if (ret != ERR_NO_ERROR)
9242 	{
9243 		// An error has occured
9244 		CmdPrintError(c, ret);
9245 		FreeParamValueList(o);
9246 		return ret;
9247 	}
9248 	else
9249 	{
9250 		ct = CtNewStandard();
9251 
9252 		StrToUni(tmp, sizeof(tmp), t.Name);
9253 		CtInsert(ct, _UU("SM_CONNINFO_NAME"), tmp);
9254 
9255 		CtInsert(ct, _UU("SM_CONNINFO_TYPE"), GetConnectionTypeStr(t.Type));
9256 
9257 		StrToUni(tmp, sizeof(tmp), t.Hostname);
9258 		CtInsert(ct, _UU("SM_CONNINFO_HOSTNAME"), tmp);
9259 
9260 		UniToStru(tmp, t.Port);
9261 		CtInsert(ct, _UU("SM_CONNINFO_PORT"), tmp);
9262 
9263 		GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ConnectedTime), NULL);
9264 		CtInsert(ct, _UU("SM_CONNINFO_TIME"), tmp);
9265 
9266 		StrToUni(tmp, sizeof(tmp), t.ServerStr);
9267 		CtInsert(ct, _UU("SM_CONNINFO_SERVER_STR"), tmp);
9268 
9269 		UniFormat(tmp, sizeof(tmp), L"%u.%02u", t.ServerVer / 100, t.ServerVer % 100);
9270 		CtInsert(ct, _UU("SM_CONNINFO_SERVER_VER"), tmp);
9271 
9272 		UniToStru(tmp, t.ServerBuild);
9273 		CtInsert(ct, _UU("SM_CONNINFO_SERVER_BUILD"), tmp);
9274 
9275 		if (StrLen(t.ClientStr) != 0)
9276 		{
9277 			StrToUni(tmp, sizeof(tmp), t.ClientStr);
9278 			CtInsert(ct, _UU("SM_CONNINFO_CLIENT_STR"), tmp);
9279 
9280 			UniFormat(tmp, sizeof(tmp), L"%u.%02u", t.ClientVer / 100, t.ClientVer % 100);
9281 			CtInsert(ct, _UU("SM_CONNINFO_CLIENT_VER"), tmp);
9282 
9283 			UniToStru(tmp, t.ClientBuild);
9284 			CtInsert(ct, _UU("SM_CONNINFO_CLIENT_BUILD"), tmp);
9285 		}
9286 
9287 		CtFree(ct, c);
9288 	}
9289 
9290 	FreeParamValueList(o);
9291 
9292 	return 0;
9293 }
9294 
9295 // Disconnect the TCP connection connected to the VPN Server
PsConnectionDisconnect(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9296 UINT PsConnectionDisconnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9297 {
9298 	LIST *o;
9299 	PS *ps = (PS *)param;
9300 	UINT ret = 0;
9301 	RPC_DISCONNECT_CONNECTION t;
9302 	// Parameter list that can be specified
9303 	PARAM args[] =
9304 	{
9305 		{"[name]", CmdPrompt, _UU("CMD_ConnectionDisconnect_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
9306 	};
9307 
9308 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9309 	if (o == NULL)
9310 	{
9311 		return ERR_INVALID_PARAMETER;
9312 	}
9313 
9314 	Zero(&t, sizeof(t));
9315 
9316 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
9317 
9318 	// RPC call
9319 	ret = ScDisconnectConnection(ps->Rpc, &t);
9320 
9321 	if (ret != ERR_NO_ERROR)
9322 	{
9323 		// An error has occured
9324 		CmdPrintError(c, ret);
9325 		FreeParamValueList(o);
9326 		return ret;
9327 	}
9328 
9329 	FreeParamValueList(o);
9330 
9331 	return 0;
9332 }
9333 
9334 // Get the LAN card list that can be used for local bridge
PsBridgeDeviceList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9335 UINT PsBridgeDeviceList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9336 {
9337 	LIST *o;
9338 	PS *ps = (PS *)param;
9339 	UINT ret = 0;
9340 	RPC_ENUM_ETH t;
9341 	UINT i;
9342 
9343 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
9344 	if (o == NULL)
9345 	{
9346 		return ERR_INVALID_PARAMETER;
9347 	}
9348 
9349 	Zero(&t, sizeof(t));
9350 
9351 	// RPC call
9352 	ret = ScEnumEthernet(ps->Rpc, &t);
9353 
9354 	if (ret != ERR_NO_ERROR)
9355 	{
9356 		// An error has occured
9357 		CmdPrintError(c, ret);
9358 		FreeParamValueList(o);
9359 		return ret;
9360 	}
9361 
9362 	for (i = 0;i < t.NumItem;i++)
9363 	{
9364 		RPC_ENUM_ETH_ITEM *item = &t.Items[i];
9365 		wchar_t tmp[MAX_SIZE * 2];
9366 
9367 		StrToUni(tmp, sizeof(tmp), item->DeviceName);
9368 		c->Write(c, tmp);
9369 	}
9370 
9371 	FreeRpcEnumEth(&t);
9372 
9373 	FreeParamValueList(o);
9374 
9375 	return 0;
9376 }
9377 
9378 // Get the list of local bridge connection
PsBridgeList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9379 UINT PsBridgeList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9380 {
9381 	LIST *o;
9382 	PS *ps = (PS *)param;
9383 	UINT ret = 0;
9384 	RPC_ENUM_LOCALBRIDGE t;
9385 	UINT i;
9386 	CT *ct;
9387 
9388 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
9389 	if (o == NULL)
9390 	{
9391 		return ERR_INVALID_PARAMETER;
9392 	}
9393 
9394 	Zero(&t, sizeof(t));
9395 
9396 	// RPC call
9397 	ret = ScEnumLocalBridge(ps->Rpc, &t);
9398 
9399 	if (ret != ERR_NO_ERROR)
9400 	{
9401 		// An error has occured
9402 		CmdPrintError(c, ret);
9403 		FreeParamValueList(o);
9404 		return ret;
9405 	}
9406 
9407 	ct = CtNew();
9408 
9409 	CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_1"), false);
9410 	CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_2"), false);
9411 	CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_3"), false);
9412 	CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_4"), false);
9413 
9414 	for (i = 0;i < t.NumItem;i++)
9415 	{
9416 		RPC_LOCALBRIDGE *e = &t.Items[i];
9417 		wchar_t name[MAX_SIZE];
9418 		wchar_t nic[MAX_SIZE];
9419 		wchar_t hub[MAX_SIZE];
9420 		wchar_t *status = _UU("SM_BRIDGE_OFFLINE");
9421 
9422 		UniToStru(name, i + 1);
9423 		StrToUni(nic, sizeof(nic), e->DeviceName);
9424 		StrToUni(hub, sizeof(hub), e->HubName);
9425 
9426 		if (e->Online)
9427 		{
9428 			status = e->Active ? _UU("SM_BRIDGE_ONLINE") : _UU("SM_BRIDGE_ERROR");
9429 		}
9430 
9431 		CtInsert(ct, name, hub, nic, status);
9432 	}
9433 
9434 	CtFree(ct, c);
9435 
9436 	FreeRpcEnumLocalBridge(&t);
9437 
9438 	FreeParamValueList(o);
9439 
9440 	return 0;
9441 }
9442 
9443 // Create a local bridge connection
PsBridgeCreate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9444 UINT PsBridgeCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9445 {
9446 	LIST *o;
9447 	PS *ps = (PS *)param;
9448 	UINT ret = 0;
9449 	RPC_LOCALBRIDGE t;
9450 	// Parameter list that can be specified
9451 	PARAM args[] =
9452 	{
9453 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9454 		{"[hubname]", CmdPrompt, _UU("CMD_BridgeCreate_PROMPT_HUBNAME"), CmdEvalNotEmpty, NULL},
9455 		{"DEVICE", CmdPrompt, _UU("CMD_BridgeCreate_PROMPT_DEVICE"), CmdEvalNotEmpty, NULL},
9456 		{"TAP", NULL, NULL, NULL, NULL},
9457 	};
9458 
9459 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9460 	if (o == NULL)
9461 	{
9462 		return ERR_INVALID_PARAMETER;
9463 	}
9464 
9465 	Zero(&t, sizeof(t));
9466 
9467 	t.Active = true;
9468 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "DEVICE"));
9469 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[hubname]"));
9470 	t.Online = true;
9471 	t.TapMode = GetParamYes(o, "TAP");
9472 
9473 	// RPC call
9474 	ret = ScAddLocalBridge(ps->Rpc, &t);
9475 
9476 	if (ret != ERR_NO_ERROR)
9477 	{
9478 		// An error has occured
9479 		CmdPrintError(c, ret);
9480 		FreeParamValueList(o);
9481 		return ret;
9482 	}
9483 	else
9484 	{
9485 		c->Write(c, _UU("SM_BRIDGE_INTEL"));
9486 		c->Write(c, L"");
9487 
9488 		if (GetCapsBool(ps->CapsList, "b_is_in_vm"))
9489 		{
9490 			// Message in the case of operating in a VM
9491 			c->Write(c, _UU("D_SM_VMBRIDGE@CAPTION"));
9492 			c->Write(c, _UU("D_SM_VMBRIDGE@S_1"));
9493 			c->Write(c, _UU("D_SM_VMBRIDGE@S_2"));
9494 			c->Write(c, L"");
9495 		}
9496 	}
9497 
9498 	FreeParamValueList(o);
9499 
9500 	return 0;
9501 }
9502 
9503 // Delete the local bridge connection
PsBridgeDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9504 UINT PsBridgeDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9505 {
9506 	LIST *o;
9507 	PS *ps = (PS *)param;
9508 	UINT ret = 0;
9509 	RPC_LOCALBRIDGE t;
9510 	// Parameter list that can be specified
9511 	PARAM args[] =
9512 	{
9513 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9514 		{"[hubname]", CmdPrompt, _UU("CMD_BridgeDelete_PROMPT_HUBNAME"), CmdEvalNotEmpty, NULL},
9515 		{"DEVICE", CmdPrompt, _UU("CMD_BridgeDelete_PROMPT_DEVICE"), CmdEvalNotEmpty, NULL},
9516 	};
9517 
9518 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9519 	if (o == NULL)
9520 	{
9521 		return ERR_INVALID_PARAMETER;
9522 	}
9523 
9524 	Zero(&t, sizeof(t));
9525 
9526 	StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "DEVICE"));
9527 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[hubname]"));
9528 
9529 	// RPC call
9530 	ret = ScDeleteLocalBridge(ps->Rpc, &t);
9531 
9532 	if (ret != ERR_NO_ERROR)
9533 	{
9534 		// An error has occured
9535 		CmdPrintError(c, ret);
9536 		FreeParamValueList(o);
9537 		return ret;
9538 	}
9539 
9540 	FreeParamValueList(o);
9541 
9542 	return 0;
9543 }
9544 
9545 // Get the list of features and capabilities of the server
PsCaps(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9546 UINT PsCaps(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9547 {
9548 	LIST *o;
9549 	PS *ps = (PS *)param;
9550 	CAPSLIST *t;
9551 	UINT i;
9552 	CT *ct;
9553 
9554 
9555 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
9556 	if (o == NULL)
9557 	{
9558 		return ERR_INVALID_PARAMETER;
9559 	}
9560 
9561 	// RPC call
9562 	t = ScGetCapsEx(ps->Rpc);
9563 
9564 	ct = CtNewStandard();
9565 
9566 	for (i = 0;i < LIST_NUM(t->CapsList);i++)
9567 	{
9568 		CAPS *c = LIST_DATA(t->CapsList, i);
9569 		wchar_t title[MAX_SIZE];
9570 		char name[256];
9571 
9572 		Format(name, sizeof(name), "CT_%s", c->Name);
9573 
9574 		UniStrCpy(title, sizeof(title), _UU(name));
9575 
9576 		if (UniIsEmptyStr(title))
9577 		{
9578 			UniFormat(title, sizeof(title), L"%S", (StrLen(c->Name) >= 2) ? c->Name + 2 : c->Name);
9579 		}
9580 
9581 		if (StartWith(c->Name, "b_"))
9582 		{
9583 			bool icon_pass = c->Value == 0 ? false : true;
9584 			if (StrCmpi(c->Name, "b_must_install_pcap") == 0)
9585 			{
9586 				// Reverse only item of WinPcap
9587 				icon_pass = !icon_pass;
9588 			}
9589 			CtInsert(ct, title, c->Value == 0 ? _UU("CAPS_NO") : _UU("CAPS_YES"));
9590 		}
9591 		else
9592 		{
9593 			wchar_t str[64];
9594 			UniToStru(str, c->Value);
9595 			CtInsert(ct, title, str);
9596 		}
9597 	}
9598 
9599 	CtFree(ct, c);
9600 
9601 	FreeCapsList(t);
9602 
9603 	FreeParamValueList(o);
9604 
9605 	return 0;
9606 }
9607 
9608 // Restart the VPN Server service
PsReboot(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9609 UINT PsReboot(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9610 {
9611 	LIST *o;
9612 	PS *ps = (PS *)param;
9613 	UINT ret = 0;
9614 	RPC_TEST t;
9615 	// Parameter list that can be specified
9616 	PARAM args[] =
9617 	{
9618 		{"RESETCONFIG", NULL, NULL, NULL, NULL},
9619 	};
9620 
9621 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9622 	if (o == NULL)
9623 	{
9624 		return ERR_INVALID_PARAMETER;
9625 	}
9626 
9627 	Zero(&t, sizeof(t));
9628 
9629 	t.IntValue = GetParamYes(o, "RESETCONFIG") ? 1 : 0;
9630 
9631 	// RPC call
9632 	ret = ScRebootServer(ps->Rpc, &t);
9633 
9634 	if (ret != ERR_NO_ERROR)
9635 	{
9636 		// An error has occured
9637 		CmdPrintError(c, ret);
9638 		FreeParamValueList(o);
9639 		return ret;
9640 	}
9641 
9642 	FreeRpcTest(&t);
9643 
9644 	FreeParamValueList(o);
9645 
9646 	return 0;
9647 }
9648 
9649 // Get the current configuration of the VPN Server
PsConfigGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9650 UINT PsConfigGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9651 {
9652 	LIST *o;
9653 	PS *ps = (PS *)param;
9654 	UINT ret = 0;
9655 	RPC_CONFIG t;
9656 	// Parameter list that can be specified
9657 	PARAM args[] =
9658 	{
9659 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9660 		{"[path]", NULL, NULL, NULL, NULL},
9661 	};
9662 
9663 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9664 	if (o == NULL)
9665 	{
9666 		return ERR_INVALID_PARAMETER;
9667 	}
9668 
9669 	Zero(&t, sizeof(t));
9670 
9671 	// RPC call
9672 	ret = ScGetConfig(ps->Rpc, &t);
9673 
9674 	if (ret != ERR_NO_ERROR)
9675 	{
9676 		// An error has occured
9677 		CmdPrintError(c, ret);
9678 		FreeParamValueList(o);
9679 		return ret;
9680 	}
9681 	else
9682 	{
9683 		wchar_t *filename = GetParamUniStr(o, "[path]");
9684 
9685 		if (IsEmptyUniStr(filename))
9686 		{
9687 			// Display on the screen
9688 			wchar_t tmp[MAX_SIZE];
9689 			UINT buf_size;
9690 			wchar_t *buf;
9691 			UNI_TOKEN_LIST *lines;
9692 
9693 			UniFormat(tmp, sizeof(tmp), _UU("CMD_ConfigGet_FILENAME"), t.FileName,
9694 				StrLen(t.FileData));
9695 			c->Write(c, tmp);
9696 			c->Write(c, L"");
9697 
9698 			buf_size = CalcUtf8ToUni((BYTE *)t.FileData, StrLen(t.FileData));
9699 			buf = ZeroMalloc(buf_size + 32);
9700 
9701 			Utf8ToUni(buf, buf_size, (BYTE *)t.FileData, StrLen(t.FileData));
9702 
9703 			lines = UniGetLines(buf);
9704 			if (lines != NULL)
9705 			{
9706 				UINT i;
9707 
9708 				for (i = 0;i < lines->NumTokens;i++)
9709 				{
9710 					c->Write(c, lines->Token[i]);
9711 				}
9712 
9713 				UniFreeToken(lines);
9714 			}
9715 
9716 			c->Write(c, L"");
9717 
9718 			Free(buf);
9719 		}
9720 		else
9721 		{
9722 			// Save to the file
9723 			IO *io = FileCreateW(filename);
9724 
9725 			if (io == NULL)
9726 			{
9727 				c->Write(c, _UU("CMD_ConfigGet_FILE_SAVE_FAILED"));
9728 
9729 				ret = ERR_INTERNAL_ERROR;
9730 			}
9731 			else
9732 			{
9733 				FileWrite(io, t.FileData, StrLen(t.FileData));
9734 				FileClose(io);
9735 			}
9736 		}
9737 	}
9738 
9739 	FreeRpcConfig(&t);
9740 
9741 	FreeParamValueList(o);
9742 
9743 	return ret;
9744 }
9745 
9746 // Write the configuration to the VPN Server
PsConfigSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9747 UINT PsConfigSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9748 {
9749 	LIST *o;
9750 	PS *ps = (PS *)param;
9751 	UINT ret = 0;
9752 	RPC_CONFIG t;
9753 	wchar_t *filename;
9754 	BUF *buf;
9755 	// Parameter list that can be specified
9756 	PARAM args[] =
9757 	{
9758 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9759 		{"[path]", CmdPrompt, _UU("CMD_ConfigSet_PROMPT_PATH"), CmdEvalIsFile, NULL},
9760 	};
9761 
9762 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9763 	if (o == NULL)
9764 	{
9765 		return ERR_INVALID_PARAMETER;
9766 	}
9767 
9768 	filename = GetParamUniStr(o, "[path]");
9769 
9770 	buf = ReadDumpW(filename);
9771 	if (buf == NULL)
9772 	{
9773 		c->Write(c, _UU("CMD_ConfigSet_FILE_LOAD_FAILED"));
9774 	}
9775 	else
9776 	{
9777 		Zero(&t, sizeof(t));
9778 
9779 		t.FileData = ZeroMalloc(buf->Size + 1);
9780 		Copy(t.FileData, buf->Buf, buf->Size);
9781 		FreeBuf(buf);
9782 
9783 		// RPC call
9784 		ret = ScSetConfig(ps->Rpc, &t);
9785 
9786 		if (ret != ERR_NO_ERROR)
9787 		{
9788 			// An error has occured
9789 			CmdPrintError(c, ret);
9790 			FreeParamValueList(o);
9791 			return ret;
9792 		}
9793 
9794 		FreeRpcConfig(&t);
9795 	}
9796 
9797 	FreeParamValueList(o);
9798 
9799 	return 0;
9800 }
9801 
9802 // Get the Virtual Layer 3 switch list
PsRouterList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9803 UINT PsRouterList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9804 {
9805 	LIST *o;
9806 	PS *ps = (PS *)param;
9807 	UINT ret = 0;
9808 	RPC_ENUM_L3SW t;
9809 
9810 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
9811 	if (o == NULL)
9812 	{
9813 		return ERR_INVALID_PARAMETER;
9814 	}
9815 
9816 	Zero(&t, sizeof(t));
9817 
9818 	// RPC call
9819 	ret = ScEnumL3Switch(ps->Rpc, &t);
9820 
9821 	if (ret != ERR_NO_ERROR)
9822 	{
9823 		// An error has occured
9824 		CmdPrintError(c, ret);
9825 		FreeParamValueList(o);
9826 		return ret;
9827 	}
9828 	else
9829 	{
9830 		CT *ct = CtNew();
9831 		UINT i;
9832 
9833 		CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN1"), false);
9834 		CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN2"), false);
9835 		CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN3"), true);
9836 		CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN4"), true);
9837 
9838 		for (i = 0;i < t.NumItem;i++)
9839 		{
9840 			RPC_ENUM_L3SW_ITEM *e = &t.Items[i];
9841 			wchar_t tmp1[MAX_SIZE], *tmp2, tmp3[64], tmp4[64];
9842 
9843 			StrToUni(tmp1, sizeof(tmp1), e->Name);
9844 			if (e->Active == false)
9845 			{
9846 				tmp2 = _UU("SM_L3_SW_ST_F_F");
9847 			}
9848 			else if (e->Online == false)
9849 			{
9850 				tmp2 = _UU("SM_L3_SW_ST_T_F");
9851 			}
9852 			else
9853 			{
9854 				tmp2 = _UU("SM_L3_SW_ST_T_T");
9855 			}
9856 			UniToStru(tmp3, e->NumInterfaces);
9857 			UniToStru(tmp4, e->NumTables);
9858 
9859 			CtInsert(ct,
9860 				tmp1, tmp2, tmp3, tmp4);
9861 		}
9862 
9863 		CtFree(ct, c);
9864 	}
9865 
9866 	FreeRpcEnumL3Sw(&t);
9867 
9868 	FreeParamValueList(o);
9869 
9870 	return 0;
9871 }
9872 
9873 // Define a new virtual layer 3 switch
PsRouterAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9874 UINT PsRouterAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9875 {
9876 	LIST *o;
9877 	PS *ps = (PS *)param;
9878 	UINT ret = 0;
9879 	RPC_L3SW t;
9880 	// Parameter list that can be specified
9881 	PARAM args[] =
9882 	{
9883 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9884 		{"[name]", CmdPrompt, _UU("CMD_RouterAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
9885 	};
9886 
9887 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9888 	if (o == NULL)
9889 	{
9890 		return ERR_INVALID_PARAMETER;
9891 	}
9892 
9893 	Zero(&t, sizeof(t));
9894 
9895 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
9896 
9897 	// RPC call
9898 	ret = ScAddL3Switch(ps->Rpc, &t);
9899 
9900 	if (ret != ERR_NO_ERROR)
9901 	{
9902 		// An error has occured
9903 		CmdPrintError(c, ret);
9904 		FreeParamValueList(o);
9905 		return ret;
9906 	}
9907 
9908 	FreeParamValueList(o);
9909 
9910 	return 0;
9911 }
9912 
9913 // Delete the Virtual Layer 3 Switch
PsRouterDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9914 UINT PsRouterDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9915 {
9916 	LIST *o;
9917 	PS *ps = (PS *)param;
9918 	UINT ret = 0;
9919 	RPC_L3SW t;
9920 	// Parameter list that can be specified
9921 	PARAM args[] =
9922 	{
9923 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9924 		{"[name]", CmdPrompt, _UU("CMD_RouterDelete_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
9925 	};
9926 
9927 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9928 	if (o == NULL)
9929 	{
9930 		return ERR_INVALID_PARAMETER;
9931 	}
9932 
9933 	Zero(&t, sizeof(t));
9934 
9935 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
9936 
9937 	// RPC call
9938 	ret = ScDelL3Switch(ps->Rpc, &t);
9939 
9940 	if (ret != ERR_NO_ERROR)
9941 	{
9942 		// An error has occured
9943 		CmdPrintError(c, ret);
9944 		FreeParamValueList(o);
9945 		return ret;
9946 	}
9947 
9948 	FreeParamValueList(o);
9949 
9950 	return 0;
9951 }
9952 
9953 // Start the Virtual Layer 3 Switch
PsRouterStart(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9954 UINT PsRouterStart(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9955 {
9956 	LIST *o;
9957 	PS *ps = (PS *)param;
9958 	UINT ret = 0;
9959 	RPC_L3SW t;
9960 	// Parameter list that can be specified
9961 	PARAM args[] =
9962 	{
9963 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
9964 		{"[name]", CmdPrompt, _UU("CMD_RouterStart_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
9965 	};
9966 
9967 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
9968 	if (o == NULL)
9969 	{
9970 		return ERR_INVALID_PARAMETER;
9971 	}
9972 
9973 	Zero(&t, sizeof(t));
9974 
9975 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
9976 
9977 	// RPC call
9978 	ret = ScStartL3Switch(ps->Rpc, &t);
9979 
9980 	if (ret != ERR_NO_ERROR)
9981 	{
9982 		// An error has occured
9983 		CmdPrintError(c, ret);
9984 		FreeParamValueList(o);
9985 		return ret;
9986 	}
9987 
9988 	FreeParamValueList(o);
9989 
9990 	return 0;
9991 }
9992 
9993 // Stop the Virtual Layer 3 Switch
PsRouterStop(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)9994 UINT PsRouterStop(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
9995 {
9996 	LIST *o;
9997 	PS *ps = (PS *)param;
9998 	UINT ret = 0;
9999 	RPC_L3SW t;
10000 	// Parameter list that can be specified
10001 	PARAM args[] =
10002 	{
10003 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
10004 		{"[name]", CmdPrompt, _UU("CMD_RouterStop_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10005 	};
10006 
10007 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10008 	if (o == NULL)
10009 	{
10010 		return ERR_INVALID_PARAMETER;
10011 	}
10012 
10013 	Zero(&t, sizeof(t));
10014 
10015 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
10016 
10017 	// RPC call
10018 	ret = ScStopL3Switch(ps->Rpc, &t);
10019 
10020 	if (ret != ERR_NO_ERROR)
10021 	{
10022 		// An error has occured
10023 		CmdPrintError(c, ret);
10024 		FreeParamValueList(o);
10025 		return ret;
10026 	}
10027 
10028 	FreeParamValueList(o);
10029 
10030 	return 0;
10031 }
10032 
10033 // Get the interface list registered on Virtual Layer 3 Switch
PsRouterIfList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10034 UINT PsRouterIfList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10035 {
10036 	LIST *o;
10037 	PS *ps = (PS *)param;
10038 	UINT ret = 0;
10039 	RPC_ENUM_L3IF t;
10040 	// Parameter list that can be specified
10041 	PARAM args[] =
10042 	{
10043 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
10044 		{"[name]", CmdPrompt, _UU("CMD_RouterIfList_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10045 	};
10046 
10047 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10048 	if (o == NULL)
10049 	{
10050 		return ERR_INVALID_PARAMETER;
10051 	}
10052 
10053 	Zero(&t, sizeof(t));
10054 
10055 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
10056 
10057 	// RPC call
10058 	ret = ScEnumL3If(ps->Rpc, &t);
10059 
10060 	if (ret != ERR_NO_ERROR)
10061 	{
10062 		// An error has occured
10063 		CmdPrintError(c, ret);
10064 		FreeParamValueList(o);
10065 		return ret;
10066 	}
10067 	else
10068 	{
10069 		UINT i;
10070 		wchar_t tmp1[MAX_SIZE];
10071 		wchar_t tmp2[MAX_SIZE];
10072 		wchar_t tmp3[MAX_SIZE];
10073 		CT *ct = CtNew();
10074 
10075 		CtInsertColumn(ct, _UU("SM_L3_SW_IF_COLUMN1"), false);
10076 		CtInsertColumn(ct, _UU("SM_L3_SW_IF_COLUMN2"), false);
10077 		CtInsertColumn(ct, _UU("SM_L3_SW_IF_COLUMN3"), false);
10078 
10079 		for (i = 0;i < t.NumItem;i++)
10080 		{
10081 			RPC_L3IF *e = &t.Items[i];
10082 
10083 			IPToUniStr32(tmp1, sizeof(tmp1), e->IpAddress);
10084 			IPToUniStr32(tmp2, sizeof(tmp2), e->SubnetMask);
10085 			StrToUni(tmp3, sizeof(tmp3), e->HubName);
10086 
10087 			CtInsert(ct, tmp1, tmp2, tmp3);
10088 		}
10089 
10090 
10091 		CtFree(ct, c);
10092 	}
10093 
10094 	FreeRpcEnumL3If(&t);
10095 
10096 	FreeParamValueList(o);
10097 
10098 	return 0;
10099 }
10100 
10101 // Evaluate the IP address and mask
CmdEvalIpAndMask4(CONSOLE * c,wchar_t * str,void * param)10102 bool CmdEvalIpAndMask4(CONSOLE *c, wchar_t *str, void *param)
10103 {
10104 	char tmp[MAX_SIZE];
10105 	UINT ip, mask;
10106 	// Validate arguments
10107 	if (c == NULL || str == NULL)
10108 	{
10109 		return false;
10110 	}
10111 
10112 	UniToStr(tmp, sizeof(tmp), str);
10113 
10114 	if (ParseIpAndMask4(tmp, &ip, &mask) == false)
10115 	{
10116 		c->Write(c, _UU("CMD_PARSE_IP_MASK_ERROR_1"));
10117 		return false;
10118 	}
10119 
10120 	return true;
10121 }
CmdEvalIpAndMask6(CONSOLE * c,wchar_t * str,void * param)10122 bool CmdEvalIpAndMask6(CONSOLE *c, wchar_t *str, void *param)
10123 {
10124 	char tmp[MAX_SIZE];
10125 	IP ip, mask;
10126 	// Validate arguments
10127 	if (c == NULL || str == NULL)
10128 	{
10129 		return false;
10130 	}
10131 
10132 	UniToStr(tmp, sizeof(tmp), str);
10133 
10134 	if (ParseIpAndMask6(tmp, &ip, &mask) == false)
10135 	{
10136 		c->Write(c, _UU("CMD_PARSE_IP_MASK_ERROR_1_6"));
10137 		return false;
10138 	}
10139 
10140 	return true;
10141 }
10142 
10143 // Evaluate the network address and the subnet mask
CmdEvalNetworkAndSubnetMask4(CONSOLE * c,wchar_t * str,void * param)10144 bool CmdEvalNetworkAndSubnetMask4(CONSOLE *c, wchar_t *str, void *param)
10145 {
10146 	char tmp[MAX_SIZE];
10147 	UINT ip, mask;
10148 	// Validate arguments
10149 	if (c == NULL || str == NULL)
10150 	{
10151 		return false;
10152 	}
10153 
10154 	UniToStr(tmp, sizeof(tmp), str);
10155 
10156 	if (ParseIpAndSubnetMask4(tmp, &ip, &mask) == false)
10157 	{
10158 		c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_1"));
10159 		return false;
10160 	}
10161 
10162 	if (IsNetworkAddress32(ip, mask) == false)
10163 	{
10164 		c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_2"));
10165 		return false;
10166 	}
10167 
10168 	return true;
10169 }
10170 
10171 // Evaluate the IP address and subnet mask
CmdEvalHostAndSubnetMask4(CONSOLE * c,wchar_t * str,void * param)10172 bool CmdEvalHostAndSubnetMask4(CONSOLE *c, wchar_t *str, void *param)
10173 {
10174 	char tmp[MAX_SIZE];
10175 	// Validate arguments
10176 	if (c == NULL || str == NULL)
10177 	{
10178 		return false;
10179 	}
10180 
10181 	UniToStr(tmp, sizeof(tmp), str);
10182 
10183 	if (ParseIpAndSubnetMask4(tmp, NULL, NULL) == false)
10184 	{
10185 		c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_1"));
10186 		return false;
10187 	}
10188 
10189 	return true;
10190 }
10191 
10192 // Add a virtual interface to the virtual layer 3 switch
PsRouterIfAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10193 UINT PsRouterIfAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10194 {
10195 	LIST *o;
10196 	PS *ps = (PS *)param;
10197 	UINT ret = 0;
10198 	RPC_L3IF t;
10199 	// Parameter list that can be specified
10200 	PARAM args[] =
10201 	{
10202 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
10203 		{"[name]", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10204 		{"HUB", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_HUB"), CmdEvalNotEmpty, NULL},
10205 		{"IP", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_IP"), CmdEvalHostAndSubnetMask4, NULL},
10206 	};
10207 
10208 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10209 	if (o == NULL)
10210 	{
10211 		return ERR_INVALID_PARAMETER;
10212 	}
10213 
10214 	Zero(&t, sizeof(t));
10215 
10216 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
10217 	ParseIpAndSubnetMask4(GetParamStr(o, "IP"), &t.IpAddress, &t.SubnetMask);
10218 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "HUB"));
10219 
10220 	// RPC call
10221 	ret = ScAddL3If(ps->Rpc, &t);
10222 
10223 	if (ret != ERR_NO_ERROR)
10224 	{
10225 		// An error has occured
10226 		CmdPrintError(c, ret);
10227 		FreeParamValueList(o);
10228 		return ret;
10229 	}
10230 
10231 	FreeParamValueList(o);
10232 
10233 	return 0;
10234 }
10235 
10236 // Delete the virtual interface of the virtual layer 3 switch
PsRouterIfDel(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10237 UINT PsRouterIfDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10238 {
10239 	LIST *o;
10240 	PS *ps = (PS *)param;
10241 	UINT ret = 0;
10242 	RPC_L3IF t;
10243 	// Parameter list that can be specified
10244 	PARAM args[] =
10245 	{
10246 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
10247 		{"[name]", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10248 		{"HUB", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_HUB"), CmdEvalNotEmpty, NULL},
10249 	};
10250 
10251 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10252 	if (o == NULL)
10253 	{
10254 		return ERR_INVALID_PARAMETER;
10255 	}
10256 
10257 	Zero(&t, sizeof(t));
10258 
10259 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
10260 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "HUB"));
10261 
10262 	// RPC call
10263 	ret = ScDelL3If(ps->Rpc, &t);
10264 
10265 	if (ret != ERR_NO_ERROR)
10266 	{
10267 		// An error has occured
10268 		CmdPrintError(c, ret);
10269 		FreeParamValueList(o);
10270 		return ret;
10271 	}
10272 
10273 	FreeParamValueList(o);
10274 
10275 	return 0;
10276 }
10277 
10278 // Get the routing table of the Virtual Layer 3 Switch
PsRouterTableList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10279 UINT PsRouterTableList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10280 {
10281 	LIST *o;
10282 	PS *ps = (PS *)param;
10283 	UINT ret = 0;
10284 	RPC_ENUM_L3TABLE t;
10285 	CT *ct;
10286 	wchar_t tmp1[MAX_SIZE];
10287 	wchar_t tmp2[MAX_SIZE];
10288 	wchar_t tmp3[MAX_SIZE];
10289 	wchar_t tmp4[MAX_SIZE];
10290 	// Parameter list that can be specified
10291 	PARAM args[] =
10292 	{
10293 		{"[name]", CmdPrompt, _UU("CMD_RouterTableList_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10294 	};
10295 
10296 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10297 	if (o == NULL)
10298 	{
10299 		return ERR_INVALID_PARAMETER;
10300 	}
10301 
10302 	Zero(&t, sizeof(t));
10303 
10304 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
10305 
10306 	// RPC call
10307 	ret = ScEnumL3Table(ps->Rpc, &t);
10308 
10309 	if (ret != ERR_NO_ERROR)
10310 	{
10311 		// An error has occured
10312 		CmdPrintError(c, ret);
10313 		FreeParamValueList(o);
10314 		return ret;
10315 	}
10316 	else
10317 	{
10318 		UINT i;
10319 
10320 		ct = CtNew();
10321 
10322 		CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN1"), false);
10323 		CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN2"), false);
10324 		CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN3"), false);
10325 		CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN4"), true);
10326 
10327 		for (i = 0;i < t.NumItem;i++)
10328 		{
10329 			RPC_L3TABLE *e = &t.Items[i];
10330 
10331 			IPToUniStr32(tmp1, sizeof(tmp1), e->NetworkAddress);
10332 			IPToUniStr32(tmp2, sizeof(tmp2), e->SubnetMask);
10333 			IPToUniStr32(tmp3, sizeof(tmp3), e->GatewayAddress);
10334 			UniToStru(tmp4, e->Metric);
10335 
10336 			CtInsert(ct, tmp1, tmp2, tmp3, tmp4);
10337 		}
10338 
10339 		CtFree(ct, c);
10340 	}
10341 
10342 	FreeRpcEnumL3Table(&t);
10343 
10344 	FreeParamValueList(o);
10345 
10346 	return 0;
10347 }
10348 
10349 // Add a routing table entry to the Virtual Layer 3 Switch
PsRouterTableAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10350 UINT PsRouterTableAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10351 {
10352 	LIST *o;
10353 	PS *ps = (PS *)param;
10354 	UINT ret = 0;
10355 	RPC_L3TABLE t;
10356 	// Parameter list that can be specified
10357 	PARAM args[] =
10358 	{
10359 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
10360 		{"[name]", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10361 		{"NETWORK", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NETWORK"), CmdEvalNetworkAndSubnetMask4, NULL},
10362 		{"GATEWAY", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_GATEWAY"), CmdEvalIp, NULL},
10363 		{"METRIC", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_METRIC"), CmdEvalInt1, NULL},
10364 	};
10365 
10366 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10367 	if (o == NULL)
10368 	{
10369 		return ERR_INVALID_PARAMETER;
10370 	}
10371 
10372 	Zero(&t, sizeof(t));
10373 
10374 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
10375 	ParseIpAndSubnetMask4(GetParamStr(o, "NETWORK"), &t.NetworkAddress, &t.SubnetMask);
10376 	t.Metric = GetParamInt(o, "METRIC");
10377 	t.GatewayAddress = StrToIP32(GetParamStr(o, "GATEWAY"));
10378 
10379 	// RPC call
10380 	ret = ScAddL3Table(ps->Rpc, &t);
10381 
10382 	if (ret != ERR_NO_ERROR)
10383 	{
10384 		// An error has occured
10385 		CmdPrintError(c, ret);
10386 		FreeParamValueList(o);
10387 		return ret;
10388 	}
10389 
10390 	FreeParamValueList(o);
10391 
10392 	return 0;
10393 }
10394 
10395 // Delete the routing table entry of the Virtual Layer 3 Switch
PsRouterTableDel(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10396 UINT PsRouterTableDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10397 {
10398 	LIST *o;
10399 	PS *ps = (PS *)param;
10400 	UINT ret = 0;
10401 	RPC_L3TABLE t;
10402 	// Parameter list that can be specified
10403 	PARAM args[] =
10404 	{
10405 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
10406 		{"[name]", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10407 		{"NETWORK", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NETWORK"), CmdEvalNetworkAndSubnetMask4, NULL},
10408 		{"GATEWAY", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_GATEWAY"), CmdEvalIp, NULL},
10409 		{"METRIC", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_METRIC"), CmdEvalInt1, NULL},
10410 	};
10411 
10412 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10413 	if (o == NULL)
10414 	{
10415 		return ERR_INVALID_PARAMETER;
10416 	}
10417 
10418 	Zero(&t, sizeof(t));
10419 
10420 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
10421 	ParseIpAndSubnetMask4(GetParamStr(o, "NETWORK"), &t.NetworkAddress, &t.SubnetMask);
10422 	t.Metric = GetParamInt(o, "METRIC");
10423 	t.GatewayAddress = StrToIP32(GetParamStr(o, "GATEWAY"));
10424 
10425 	// RPC call
10426 	ret = ScDelL3Table(ps->Rpc, &t);
10427 
10428 	if (ret != ERR_NO_ERROR)
10429 	{
10430 		// An error has occured
10431 		CmdPrintError(c, ret);
10432 		FreeParamValueList(o);
10433 		return ret;
10434 	}
10435 
10436 	FreeParamValueList(o);
10437 
10438 	return 0;
10439 }
10440 
10441 // Get the log files list
PsLogFileList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10442 UINT PsLogFileList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10443 {
10444 	LIST *o;
10445 	PS *ps = (PS *)param;
10446 	UINT ret = 0;
10447 	RPC_ENUM_LOG_FILE t;
10448 
10449 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
10450 	if (o == NULL)
10451 	{
10452 		return ERR_INVALID_PARAMETER;
10453 	}
10454 
10455 	Zero(&t, sizeof(t));
10456 
10457 	c->Write(c, _UU("CMD_LogFileList_START"));
10458 	c->Write(c, L"");
10459 
10460 	// RPC call
10461 	ret = ScEnumLogFile(ps->Rpc, &t);
10462 
10463 	if (ret != ERR_NO_ERROR)
10464 	{
10465 		// An error has occured
10466 		CmdPrintError(c, ret);
10467 		FreeParamValueList(o);
10468 		return ret;
10469 	}
10470 	else
10471 	{
10472 		UINT i;
10473 		wchar_t tmp[MAX_SIZE];
10474 		CT *ct;
10475 
10476 		UniFormat(tmp, sizeof(tmp), _UU("CMD_LogFileList_NUM_LOGS"), t.NumItem);
10477 		c->Write(c, tmp);
10478 
10479 		ct = CtNew();
10480 
10481 		CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_1"), false);
10482 		CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_2"), true);
10483 		CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_3"), false);
10484 		CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_4"), false);
10485 
10486 		for (i = 0;i < t.NumItem;i++)
10487 		{
10488 			RPC_ENUM_LOG_FILE_ITEM *e = &t.Items[i];
10489 			wchar_t tmp1[MAX_PATH], tmp2[128], tmp3[128], tmp4[MAX_HOST_NAME_LEN + 1];
10490 			char tmp[MAX_SIZE];
10491 
10492 			StrToUni(tmp1, sizeof(tmp1), e->FilePath);
10493 
10494 			ToStrByte(tmp, sizeof(tmp), e->FileSize);
10495 			StrToUni(tmp2, sizeof(tmp2), tmp);
10496 
10497 			GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->UpdatedTime));
10498 
10499 			StrToUni(tmp4, sizeof(tmp4), e->ServerName);
10500 
10501 			CtInsert(ct, tmp1, tmp2, tmp3, tmp4);
10502 		}
10503 
10504 		CtFreeEx(ct, c, true);
10505 	}
10506 
10507 	FreeRpcEnumLogFile(&t);
10508 
10509 	FreeParamValueList(o);
10510 
10511 	return 0;
10512 }
10513 
10514 // Download a log file
PsLogFileGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10515 UINT PsLogFileGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10516 {
10517 	LIST *o;
10518 	PS *ps = (PS *)param;
10519 	UINT ret = 0;
10520 	BUF *buf;
10521 	char *filename = NULL;
10522 	char *server_name;
10523 	// Parameter list that can be specified
10524 	PARAM args[] =
10525 	{
10526 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
10527 		{"[name]", CmdPrompt, _UU("CMD_LogFileGet_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10528 		{"SERVER", NULL, NULL, NULL, NULL},
10529 		{"SAVEPATH", NULL, NULL, NULL, NULL},
10530 	};
10531 
10532 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10533 	if (o == NULL)
10534 	{
10535 		return ERR_INVALID_PARAMETER;
10536 	}
10537 
10538 	filename = GetParamStr(o, "SAVE");
10539 	if (IsEmptyStr(filename))
10540 	{
10541 		filename = GetParamStr(o, "SAVEPATH");
10542 	}
10543 
10544 	c->Write(c, _UU("CMD_LogFileGet_START"));
10545 
10546 	server_name = GetParamStr(o, "SERVER");
10547 
10548 	buf = DownloadFileFromServer(ps->Rpc, server_name,
10549 		GetParamStr(o, "[name]"), 0, NULL, NULL);
10550 
10551 	if (buf == NULL)
10552 	{
10553 		c->Write(c, _UU("CMD_LogFileGet_FAILED"));
10554 
10555 		ret = ERR_INTERNAL_ERROR;
10556 	}
10557 	else
10558 	{
10559 		if (IsEmptyStr(filename) == false)
10560 		{
10561 			// Save to the file
10562 			if (DumpBuf(buf, filename) == false)
10563 			{
10564 				ret = ERR_INTERNAL_ERROR;
10565 				c->Write(c, _UU("CMD_LogFileGet_SAVE_FAILED"));
10566 			}
10567 		}
10568 		else
10569 		{
10570 			// Display on the screen
10571 			wchar_t tmp[MAX_SIZE];
10572 			UINT buf_size;
10573 			wchar_t *uni_buf;
10574 
10575 			UniFormat(tmp, sizeof(tmp), _UU("CMD_LogFileGet_FILESIZE"),
10576 				buf->Size);
10577 			c->Write(c, tmp);
10578 			c->Write(c, L"");
10579 
10580 			buf_size = CalcUtf8ToUni((BYTE *)buf->Buf, buf->Size);
10581 			uni_buf = ZeroMalloc(buf_size + 32);
10582 
10583 			Utf8ToUni(uni_buf, buf_size, (BYTE *)buf->Buf, buf->Size);
10584 
10585 			c->Write(c, uni_buf);
10586 			c->Write(c, L"");
10587 
10588 			Free(uni_buf);
10589 		}
10590 
10591 		FreeBuf(buf);
10592 	}
10593 
10594 	FreeParamValueList(o);
10595 
10596 	return ret;
10597 }
10598 
10599 // Add a WireGuard key (TODO: ability add multiple keys in a single call)
PsWgkAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10600 UINT PsWgkAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10601 {
10602 	PS *ps = (PS *)param;
10603 	RPC_WGK t;
10604 	UINT ret;
10605 	LIST *o;
10606 	PARAM args[] =
10607 	{
10608 		{"[key]", CmdPrompt, _UU("CMD_WgkAdd_Prompt_[key]"), CmdEvalNotEmpty, NULL},
10609 		{"HUB", CmdPrompt, _UU("CMD_WgkAdd_Prompt_HUB"), NULL, NULL},
10610 		{"USER", CmdPrompt, _UU("CMD_WgkAdd_Prompt_USER"), NULL, NULL}
10611 	};
10612 
10613 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10614 	if (o == NULL)
10615 	{
10616 		return ERR_INVALID_PARAMETER;
10617 	}
10618 
10619 	Zero(&t, sizeof(t));
10620 	t.Num = 1;
10621 	t.Wgks = ZeroMalloc(sizeof(WGK));
10622 
10623 	StrCpy(t.Wgks[0].Key, sizeof(t.Wgks[0].Key), GetParamStr(o, "[key]"));
10624 	StrCpy(t.Wgks[0].Hub, sizeof(t.Wgks[0].Hub), GetParamStr(o, "HUB"));
10625 	StrCpy(t.Wgks[0].User, sizeof(t.Wgks[0].User), GetParamStr(o, "USER"));
10626 
10627 	FreeParamValueList(o);
10628 
10629 	ret = ScAddWgk(ps->Rpc, &t);
10630 	if (ret != ERR_NO_ERROR)
10631 	{
10632 		CmdPrintError(c, ret);
10633 	}
10634 
10635 	FreeRpcWgk(&t);
10636 
10637 	return ret;
10638 }
10639 
10640 // Delete a WireGuard key (TODO: ability to delete multiple keys in a single call)
PsWgkDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10641 UINT PsWgkDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10642 {
10643 	PS *ps = (PS *)param;
10644 	RPC_WGK t;
10645 	UINT ret;
10646 	LIST *o;
10647 	PARAM args[] =
10648 	{
10649 		{"[key]", CmdPrompt, _UU("CMD_WgkDelete_Prompt_[key]"), CmdEvalNotEmpty, NULL},
10650 	};
10651 
10652 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10653 	if (o == NULL)
10654 	{
10655 		return ERR_INVALID_PARAMETER;
10656 	}
10657 
10658 	Zero(&t, sizeof(t));
10659 	t.Num = 1;
10660 	t.Wgks = ZeroMalloc(sizeof(WGK));
10661 
10662 	StrCpy(t.Wgks[0].Key, sizeof(t.Wgks[0].Key), GetParamStr(o, "[key]"));
10663 
10664 	FreeParamValueList(o);
10665 
10666 	ret = ScDeleteWgk(ps->Rpc, &t);
10667 	if (ret != ERR_NO_ERROR)
10668 	{
10669 		CmdPrintError(c, ret);
10670 	}
10671 
10672 	FreeRpcWgk(&t);
10673 
10674 	return ret;
10675 }
10676 
10677 // List the WireGuard keys
PsWgkEnum(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10678 UINT PsWgkEnum(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10679 {
10680 	UINT ret = ERR_NO_ERROR;
10681 	PS *ps = (PS *)param;
10682 	RPC_WGK t;
10683 	LIST *o;
10684 
10685 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
10686 	if (o == NULL)
10687 	{
10688 		return ERR_INVALID_PARAMETER;
10689 	}
10690 
10691 	Zero(&t, sizeof(t));
10692 
10693 	ret = ScEnumWgk(ps->Rpc, &t);
10694 	if (ret == ERR_NO_ERROR)
10695 	{
10696 		UINT i;
10697 		CT *ct = CtNew();
10698 		CtInsertColumn(ct, _UU("CMD_WgkEnum_Column_Key"), false);
10699 		CtInsertColumn(ct, _UU("CMD_WgkEnum_Column_Hub"), false);
10700 		CtInsertColumn(ct, _UU("CMD_WgkEnum_Column_User"), false);
10701 
10702 		for (i = 0; i < t.Num; ++i)
10703 		{
10704 			const WGK *wgk = &t.Wgks[i];
10705 			wchar_t *key, *hub, *user;
10706 
10707 			key = CopyStrToUni(wgk->Key);
10708 			hub = CopyStrToUni(wgk->Hub);
10709 			user = CopyStrToUni(wgk->User);
10710 
10711 			CtInsert(ct, key, hub, user);
10712 
10713 			Free(key);
10714 			Free(hub);
10715 			Free(user);
10716 		}
10717 
10718 		CtFree(ct, c);
10719 	}
10720 	else
10721 	{
10722 		CmdPrintError(c, ret);
10723 	}
10724 
10725 	FreeRpcWgk(&t);
10726 
10727 	return ret;
10728 }
10729 
10730 // Create a New Virtual HUB
PsHubCreate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10731 UINT PsHubCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10732 {
10733 	LIST *o;
10734 	PS *ps = (PS *)param;
10735 	UINT ret = 0;
10736 	RPC_CREATE_HUB t;
10737 	char *pass = "";
10738 	UINT hub_type = HUB_TYPE_STANDALONE;
10739 	// Parameter list that can be specified
10740 	PARAM args[] =
10741 	{
10742 		{"[name]", CmdPrompt, _UU("CMD_HubCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10743 		{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
10744 	};
10745 
10746 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10747 	if (o == NULL)
10748 	{
10749 		return ERR_INVALID_PARAMETER;
10750 	}
10751 	else
10752 	{
10753 		RPC_SERVER_INFO t;
10754 		Zero(&t, sizeof(t));
10755 		if (ScGetServerInfo(ps->Rpc, &t) == ERR_NO_ERROR)
10756 		{
10757 			if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
10758 			{
10759 				hub_type = HUB_TYPE_FARM_DYNAMIC;
10760 			}
10761 			FreeRpcServerInfo(&t);
10762 		}
10763 	}
10764 
10765 	Zero(&t, sizeof(t));
10766 
10767 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
10768 	t.HubType = hub_type;
10769 
10770 	if (IsEmptyStr(GetParamStr(o, "PASSWORD")) == false)
10771 	{
10772 		pass = GetParamStr(o, "PASSWORD");
10773 	}
10774 
10775 	Sha0(t.HashedPassword, pass, StrLen(pass));
10776 	HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pass);
10777 	t.Online = true;
10778 
10779 	// RPC call
10780 	ret = ScCreateHub(ps->Rpc, &t);
10781 
10782 	if (ret != ERR_NO_ERROR)
10783 	{
10784 		// An error has occured
10785 		CmdPrintError(c, ret);
10786 		FreeParamValueList(o);
10787 		return ret;
10788 	}
10789 
10790 	FreeParamValueList(o);
10791 
10792 	return 0;
10793 }
10794 
10795 // Create a New Virtual HUB (dynamic mode)
PsHubCreateDynamic(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10796 UINT PsHubCreateDynamic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10797 {
10798 	LIST *o;
10799 	PS *ps = (PS *)param;
10800 	UINT ret = 0;
10801 	RPC_CREATE_HUB t;
10802 	char *pass = "";
10803 	UINT hub_type = HUB_TYPE_FARM_DYNAMIC;
10804 	// Parameter list that can be specified
10805 	PARAM args[] =
10806 	{
10807 		{"[name]", CmdPrompt, _UU("CMD_HubCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10808 		{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
10809 	};
10810 
10811 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10812 	if (o == NULL)
10813 	{
10814 		return ERR_INVALID_PARAMETER;
10815 	}
10816 
10817 	Zero(&t, sizeof(t));
10818 
10819 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
10820 	t.HubType = hub_type;
10821 
10822 	if (IsEmptyStr(GetParamStr(o, "PASSWORD")) == false)
10823 	{
10824 		pass = GetParamStr(o, "PASSWORD");
10825 	}
10826 
10827 	Sha0(t.HashedPassword, pass, StrLen(pass));
10828 	HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pass);
10829 	t.Online = true;
10830 
10831 	// RPC call
10832 	ret = ScCreateHub(ps->Rpc, &t);
10833 
10834 	if (ret != ERR_NO_ERROR)
10835 	{
10836 		// An error has occured
10837 		CmdPrintError(c, ret);
10838 		FreeParamValueList(o);
10839 		return ret;
10840 	}
10841 
10842 	FreeParamValueList(o);
10843 
10844 	return 0;
10845 }
10846 
10847 // Create a New Virtual HUB (static mode)
PsHubCreateStatic(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10848 UINT PsHubCreateStatic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10849 {
10850 	LIST *o;
10851 	PS *ps = (PS *)param;
10852 	UINT ret = 0;
10853 	RPC_CREATE_HUB t;
10854 	char *pass = "";
10855 	UINT hub_type = HUB_TYPE_FARM_STATIC;
10856 	// Parameter list that can be specified
10857 	PARAM args[] =
10858 	{
10859 		{"[name]", CmdPrompt, _UU("CMD_HubCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10860 		{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
10861 	};
10862 
10863 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10864 	if (o == NULL)
10865 	{
10866 		return ERR_INVALID_PARAMETER;
10867 	}
10868 
10869 	Zero(&t, sizeof(t));
10870 
10871 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
10872 	t.HubType = hub_type;
10873 
10874 	if (IsEmptyStr(GetParamStr(o, "PASSWORD")) == false)
10875 	{
10876 		pass = GetParamStr(o, "PASSWORD");
10877 	}
10878 
10879 	Sha0(t.HashedPassword, pass, StrLen(pass));
10880 	HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pass);
10881 	t.Online = true;
10882 
10883 	// RPC call
10884 	ret = ScCreateHub(ps->Rpc, &t);
10885 
10886 	if (ret != ERR_NO_ERROR)
10887 	{
10888 		// An error has occured
10889 		CmdPrintError(c, ret);
10890 		FreeParamValueList(o);
10891 		return ret;
10892 	}
10893 
10894 	FreeParamValueList(o);
10895 
10896 	return 0;
10897 }
10898 
10899 // Delete a Virtual HUB
PsHubDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10900 UINT PsHubDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10901 {
10902 	LIST *o;
10903 	PS *ps = (PS *)param;
10904 	UINT ret = 0;
10905 	RPC_DELETE_HUB t;
10906 	// Parameter list that can be specified
10907 	PARAM args[] =
10908 	{
10909 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
10910 		{"[name]", CmdPrompt, _UU("CMD_HubDelete_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10911 	};
10912 
10913 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10914 	if (o == NULL)
10915 	{
10916 		return ERR_INVALID_PARAMETER;
10917 	}
10918 
10919 	Zero(&t, sizeof(t));
10920 
10921 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
10922 
10923 	// RPC call
10924 	ret = ScDeleteHub(ps->Rpc, &t);
10925 
10926 	if (ret != ERR_NO_ERROR)
10927 	{
10928 		// An error has occured
10929 		CmdPrintError(c, ret);
10930 		FreeParamValueList(o);
10931 		return ret;
10932 	}
10933 
10934 	FreeParamValueList(o);
10935 
10936 	return 0;
10937 }
10938 
10939 // Set the Virtual HUB to static
PsHubSetStatic(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10940 UINT PsHubSetStatic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10941 {
10942 	LIST *o;
10943 	PS *ps = (PS *)param;
10944 	UINT ret = 0;
10945 	RPC_CREATE_HUB t;
10946 	// Parameter list that can be specified
10947 	PARAM args[] =
10948 	{
10949 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
10950 		{"[name]", CmdPrompt, _UU("CMD_HubChange_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
10951 	};
10952 
10953 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
10954 	if (o == NULL)
10955 	{
10956 		return ERR_INVALID_PARAMETER;
10957 	}
10958 
10959 	Zero(&t, sizeof(t));
10960 
10961 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
10962 
10963 	// Retrieve the current setting first
10964 	ret = ScGetHub(ps->Rpc, &t);
10965 
10966 	if (ret != ERR_NO_ERROR)
10967 	{
10968 		// An error has occured
10969 		CmdPrintError(c, ret);
10970 		FreeParamValueList(o);
10971 		return ret;
10972 	}
10973 
10974 	// Change the settings
10975 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
10976 	t.HubType = HUB_TYPE_FARM_STATIC;
10977 
10978 	// Write
10979 	ret = ScSetHub(ps->Rpc, &t);
10980 
10981 	if (ret != ERR_NO_ERROR)
10982 	{
10983 		// An error has occured
10984 		CmdPrintError(c, ret);
10985 		FreeParamValueList(o);
10986 		return ret;
10987 	}
10988 
10989 	FreeParamValueList(o);
10990 
10991 	return 0;
10992 }
10993 
10994 // Change the type of Virtual HUB to dynamic Virtual HUB
PsHubSetDynamic(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)10995 UINT PsHubSetDynamic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
10996 {
10997 	LIST *o;
10998 	PS *ps = (PS *)param;
10999 	UINT ret = 0;
11000 	RPC_CREATE_HUB t;
11001 	// Parameter list that can be specified
11002 	PARAM args[] =
11003 	{
11004 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
11005 		{"[name]", CmdPrompt, _UU("CMD_HubChange_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
11006 	};
11007 
11008 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
11009 	if (o == NULL)
11010 	{
11011 		return ERR_INVALID_PARAMETER;
11012 	}
11013 
11014 	Zero(&t, sizeof(t));
11015 
11016 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
11017 
11018 	// Retrieve the current setting first
11019 	ret = ScGetHub(ps->Rpc, &t);
11020 
11021 	if (ret != ERR_NO_ERROR)
11022 	{
11023 		// An error has occured
11024 		CmdPrintError(c, ret);
11025 		FreeParamValueList(o);
11026 		return ret;
11027 	}
11028 
11029 	// Change the settings
11030 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
11031 	t.HubType = HUB_TYPE_FARM_DYNAMIC;
11032 
11033 	// Write
11034 	ret = ScSetHub(ps->Rpc, &t);
11035 
11036 	if (ret != ERR_NO_ERROR)
11037 	{
11038 		// An error has occured
11039 		CmdPrintError(c, ret);
11040 		FreeParamValueList(o);
11041 		return ret;
11042 	}
11043 
11044 	FreeParamValueList(o);
11045 
11046 	return 0;
11047 }
11048 
11049 // Get the list of Virtual HUB
PsHubList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11050 UINT PsHubList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11051 {
11052 	LIST *o;
11053 	PS *ps = (PS *)param;
11054 	UINT ret = 0;
11055 	RPC_ENUM_HUB t;
11056 	UINT i;
11057 
11058 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
11059 	if (o == NULL)
11060 	{
11061 		return ERR_INVALID_PARAMETER;
11062 	}
11063 
11064 	Zero(&t, sizeof(t));
11065 
11066 	// RPC call
11067 	ret = ScEnumHub(ps->Rpc, &t);
11068 
11069 	if (ret != ERR_NO_ERROR)
11070 	{
11071 		// An error has occured
11072 		CmdPrintError(c, ret);
11073 		FreeParamValueList(o);
11074 		return ret;
11075 	}
11076 	else
11077 	{
11078 		CT *ct = CtNew();
11079 
11080 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_1"), false);
11081 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_2"), false);
11082 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_3"), false);
11083 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_4"), false);
11084 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_5"), false);
11085 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_6"), false);
11086 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_7"), false);
11087 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_8"), false);
11088 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_9"), false);
11089 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_10"), false);
11090 		CtInsertColumn(ct, _UU("SM_HUB_COLUMN_11"), false);
11091 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_6"), false);
11092 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_7"), false);
11093 
11094 		for (i = 0;i < t.NumHub;i++)
11095 		{
11096 			RPC_ENUM_HUB_ITEM *e = &t.Hubs[i];
11097 			wchar_t name[MAX_HUBNAME_LEN + 1];
11098 			wchar_t s1[64], s2[64], s3[64], s4[64], s5[64];
11099 			wchar_t s6[64], s7[128], s8[128];
11100 			wchar_t s9[64], s10[64];
11101 
11102 			UniToStru(s1, e->NumUsers);
11103 			UniToStru(s2, e->NumGroups);
11104 			UniToStru(s3, e->NumSessions);
11105 			UniToStru(s4, e->NumMacTables);
11106 			UniToStru(s5, e->NumIpTables);
11107 
11108 			UniToStru(s6, e->NumLogin);
11109 
11110 			if (e->LastLoginTime != 0)
11111 			{
11112 				GetDateTimeStr64Uni(s7, sizeof(s7), SystemToLocal64(e->LastLoginTime));
11113 			}
11114 			else
11115 			{
11116 				UniStrCpy(s7, sizeof(s7), _UU("COMMON_UNKNOWN"));
11117 			}
11118 
11119 			if (e->LastCommTime != 0)
11120 			{
11121 				GetDateTimeStr64Uni(s8, sizeof(s8), SystemToLocal64(e->LastCommTime));
11122 			}
11123 			else
11124 			{
11125 				UniStrCpy(s8, sizeof(s8), _UU("COMMON_UNKNOWN"));
11126 			}
11127 
11128 			if (e->IsTrafficFilled == false)
11129 			{
11130 				UniStrCpy(s9, sizeof(s9), _UU("CM_ST_NONE"));
11131 				UniStrCpy(s10, sizeof(s10), _UU("CM_ST_NONE"));
11132 			}
11133 			else
11134 			{
11135 				UniToStr3(s9, sizeof(s9),
11136 					e->Traffic.Recv.BroadcastBytes + e->Traffic.Recv.UnicastBytes +
11137 					e->Traffic.Send.BroadcastBytes + e->Traffic.Send.UnicastBytes);
11138 
11139 				UniToStr3(s10, sizeof(s10),
11140 					e->Traffic.Recv.BroadcastCount + e->Traffic.Recv.UnicastCount +
11141 					e->Traffic.Send.BroadcastCount + e->Traffic.Send.UnicastCount);
11142 			}
11143 
11144 			StrToUni(name, sizeof(name), e->HubName);
11145 
11146 			CtInsert(ct,
11147 				name,
11148 				e->Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"),
11149 				GetHubTypeStr(e->HubType),
11150 				s1, s2, s3, s4, s5, s6, s7, s8, s9, s10);
11151 		}
11152 
11153 		CtFreeEx(ct, c, true);
11154 	}
11155 
11156 	FreeRpcEnumHub(&t);
11157 
11158 	FreeParamValueList(o);
11159 
11160 	return 0;
11161 }
11162 
11163 // Select a Virtual HUB to manage
PsHub(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11164 UINT PsHub(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11165 {
11166 	LIST *o;
11167 	PS *ps = (PS *)param;
11168 	UINT ret = 0;
11169 	RPC_HUB_STATUS t;
11170 	// Parameter list that can be specified
11171 	PARAM args[] =
11172 	{
11173 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
11174 		{"[name]", NULL, NULL, NULL, NULL},
11175 	};
11176 
11177 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
11178 	if (o == NULL)
11179 	{
11180 		return ERR_INVALID_PARAMETER;
11181 	}
11182 
11183 	if (IsEmptyStr(GetParamStr(o, "[name]")) == false)
11184 	{
11185 		wchar_t tmp[MAX_SIZE];
11186 		Zero(&t, sizeof(t));
11187 
11188 		// Examine whether the specified Virtual HUB is accessible
11189 		StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
11190 
11191 		// RPC call
11192 		ret = ScGetHubStatus(ps->Rpc, &t);
11193 
11194 		if (ret != ERR_NO_ERROR)
11195 		{
11196 			// An error has occured
11197 			CmdPrintError(c, ret);
11198 			FreeParamValueList(o);
11199 			return ret;
11200 		}
11201 
11202 		// Change the selection
11203 		if (ps->HubName != NULL)
11204 		{
11205 			Free(ps->HubName);
11206 		}
11207 		ps->HubName = CopyStr(t.HubName);
11208 
11209 		UniFormat(tmp, sizeof(tmp), _UU("CMD_Hub_Selected"), t.HubName);
11210 		c->Write(c, tmp);
11211 	}
11212 	else
11213 	{
11214 		// Deselect
11215 		if (ps->HubName != NULL)
11216 		{
11217 			c->Write(c, _UU("CMD_Hub_Unselected"));
11218 			Free(ps->HubName);
11219 		}
11220 		ps->HubName = NULL;
11221 	}
11222 
11223 	FreeParamValueList(o);
11224 
11225 	return 0;
11226 }
11227 
11228 // Set the Virtual HUB to online
PsOnline(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11229 UINT PsOnline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11230 {
11231 	LIST *o;
11232 	PS *ps = (PS *)param;
11233 	UINT ret = 0;
11234 	RPC_SET_HUB_ONLINE t;
11235 
11236 	// If virtual HUB is not selected, it's an error
11237 	if (ps->HubName == NULL)
11238 	{
11239 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11240 		return ERR_INVALID_PARAMETER;
11241 	}
11242 
11243 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
11244 	if (o == NULL)
11245 	{
11246 		return ERR_INVALID_PARAMETER;
11247 	}
11248 
11249 	Zero(&t, sizeof(t));
11250 
11251 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11252 	t.Online = true;
11253 
11254 	// RPC call
11255 	ret = ScSetHubOnline(ps->Rpc, &t);
11256 
11257 	if (ret != ERR_NO_ERROR)
11258 	{
11259 		// An error has occured
11260 		CmdPrintError(c, ret);
11261 		FreeParamValueList(o);
11262 		return ret;
11263 	}
11264 
11265 	FreeParamValueList(o);
11266 
11267 	return 0;
11268 }
11269 
11270 // Set the Virtual HUB to offline
PsOffline(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11271 UINT PsOffline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11272 {
11273 	LIST *o;
11274 	PS *ps = (PS *)param;
11275 	UINT ret = 0;
11276 	RPC_SET_HUB_ONLINE t;
11277 
11278 	// If virtual HUB is not selected, it's an error
11279 	if (ps->HubName == NULL)
11280 	{
11281 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11282 		return ERR_INVALID_PARAMETER;
11283 	}
11284 
11285 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
11286 	if (o == NULL)
11287 	{
11288 		return ERR_INVALID_PARAMETER;
11289 	}
11290 
11291 	Zero(&t, sizeof(t));
11292 
11293 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11294 	t.Online = false;
11295 
11296 	// RPC call
11297 	ret = ScSetHubOnline(ps->Rpc, &t);
11298 
11299 	if (ret != ERR_NO_ERROR)
11300 	{
11301 		// An error has occured
11302 		CmdPrintError(c, ret);
11303 		FreeParamValueList(o);
11304 		return ret;
11305 	}
11306 
11307 	FreeParamValueList(o);
11308 
11309 	return 0;
11310 }
11311 
11312 // Set the static IPv4 network parameters for the Virtual HUB
PsSetStaticNetwork(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11313 UINT PsSetStaticNetwork(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11314 {
11315 	LIST *o;
11316 	PS *ps = (PS *)param;
11317 	UINT ret = 0;
11318 	RPC_CREATE_HUB t;
11319 	PARAM args[] =
11320 	{
11321 		{"GATEWAY", CmdPrompt, _UU("CMD_SetStaticNetwork_Prompt_GATEWAY"), CmdEvalIp, NULL},
11322 		{"SUBNET", CmdPrompt, _UU("CMD_SetStaticNetwork_Prompt_SUBNET"), CmdEvalIp, NULL}
11323 	};
11324 
11325 	if (ps->HubName == NULL)
11326 	{
11327 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11328 		return ERR_INVALID_PARAMETER;
11329 	}
11330 
11331 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
11332 	if (o == NULL)
11333 	{
11334 		return ERR_INVALID_PARAMETER;
11335 	}
11336 
11337 	Zero(&t, sizeof(t));
11338 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11339 	ret = ScGetHub(ps->Rpc, &t);
11340 	if (ret != ERR_NO_ERROR)
11341 	{
11342 		goto FINAL;
11343 	}
11344 
11345 	t.HubOption.DefaultGateway = StrToIP32(GetParamStr(o, "GATEWAY"));
11346 	t.HubOption.DefaultSubnet = StrToIP32(GetParamStr(o, "SUBNET"));
11347 
11348 	ret = ScSetHub(ps->Rpc, &t);
11349 FINAL:
11350 	if (ret != ERR_NO_ERROR)
11351 	{
11352 		CmdPrintError(c, ret);
11353 	}
11354 
11355 	FreeParamValueList(o);
11356 	return ret;
11357 }
11358 
11359 // Set the maximum number of concurrent connecting sessions of the Virtual HUB
PsSetMaxSession(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11360 UINT PsSetMaxSession(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11361 {
11362 	LIST *o;
11363 	PS *ps = (PS *)param;
11364 	UINT ret = 0;
11365 	RPC_CREATE_HUB t;
11366 	// Parameter list that can be specified
11367 	PARAM args[] =
11368 	{
11369 		{"[max_session]", CmdPrompt, _UU("CMD_SetMaxSession_Prompt"), CmdEvalNotEmpty, NULL},
11370 	};
11371 
11372 	// If virtual HUB is not selected, it's an error
11373 	if (ps->HubName == NULL)
11374 	{
11375 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11376 		return ERR_INVALID_PARAMETER;
11377 	}
11378 
11379 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
11380 	if (o == NULL)
11381 	{
11382 		return ERR_INVALID_PARAMETER;
11383 	}
11384 
11385 	// Get current settings of Virtual HUB
11386 	Zero(&t, sizeof(t));
11387 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11388 	ret = ScGetHub(ps->Rpc, &t);
11389 	if (ret != ERR_NO_ERROR)
11390 	{
11391 		// An error has occured
11392 		CmdPrintError(c, ret);
11393 		FreeParamValueList(o);
11394 		return ret;
11395 	}
11396 
11397 	t.HubOption.MaxSession = GetParamInt(o, "[max_session]");
11398 
11399 	// Write the configuration of Virtual HUB
11400 	ret = ScSetHub(ps->Rpc, &t);
11401 	if (ret != ERR_NO_ERROR)
11402 	{
11403 		// An error has occured
11404 		CmdPrintError(c, ret);
11405 		FreeParamValueList(o);
11406 		return ret;
11407 	}
11408 
11409 	FreeParamValueList(o);
11410 
11411 	return 0;
11412 }
11413 
11414 // Set the administrative password of the Virtual HUB
PsSetHubPassword(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11415 UINT PsSetHubPassword(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11416 {
11417 	LIST *o;
11418 	PS *ps = (PS *)param;
11419 	UINT ret = 0;
11420 	RPC_CREATE_HUB t;
11421 	char *pw;
11422 	// Parameter list that can be specified
11423 	PARAM args[] =
11424 	{
11425 		{"[password]", CmdPromptChoosePassword, NULL, NULL, NULL},
11426 	};
11427 
11428 	// If virtual HUB is not selected, it's an error
11429 	if (ps->HubName == NULL)
11430 	{
11431 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11432 		return ERR_INVALID_PARAMETER;
11433 	}
11434 
11435 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
11436 	if (o == NULL)
11437 	{
11438 		return ERR_INVALID_PARAMETER;
11439 	}
11440 
11441 	// Get current settings of Virtual HUB
11442 	Zero(&t, sizeof(t));
11443 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11444 	ret = ScGetHub(ps->Rpc, &t);
11445 	if (ret != ERR_NO_ERROR)
11446 	{
11447 		// An error has occured
11448 		CmdPrintError(c, ret);
11449 		FreeParamValueList(o);
11450 		return ret;
11451 	}
11452 
11453 	// Change the settings
11454 	pw = GetParamStr(o, "[password]");
11455 	HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pw);
11456 	Sha0(t.HashedPassword, pw, StrLen(pw));
11457 
11458 	// Write the configuration of Virtual HUB
11459 	ret = ScSetHub(ps->Rpc, &t);
11460 	if (ret != ERR_NO_ERROR)
11461 	{
11462 		// An error has occured
11463 		CmdPrintError(c, ret);
11464 		FreeParamValueList(o);
11465 		return ret;
11466 	}
11467 
11468 	FreeParamValueList(o);
11469 
11470 	return 0;
11471 }
11472 
11473 // Set the Virtual HUB to permit to be enumerated for anonymous users
PsSetEnumAllow(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11474 UINT PsSetEnumAllow(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11475 {
11476 	LIST *o;
11477 	PS *ps = (PS *)param;
11478 	UINT ret = 0;
11479 	RPC_CREATE_HUB t;
11480 
11481 	// If virtual HUB is not selected, it's an error
11482 	if (ps->HubName == NULL)
11483 	{
11484 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11485 		return ERR_INVALID_PARAMETER;
11486 	}
11487 
11488 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
11489 	if (o == NULL)
11490 	{
11491 		return ERR_INVALID_PARAMETER;
11492 	}
11493 
11494 	// Get current settings of Virtual HUB
11495 	Zero(&t, sizeof(t));
11496 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11497 	ret = ScGetHub(ps->Rpc, &t);
11498 	if (ret != ERR_NO_ERROR)
11499 	{
11500 		// An error has occured
11501 		CmdPrintError(c, ret);
11502 		FreeParamValueList(o);
11503 		return ret;
11504 	}
11505 
11506 	t.HubOption.NoEnum = false;
11507 
11508 	// Write the configuration of Virtual HUB
11509 	ret = ScSetHub(ps->Rpc, &t);
11510 	if (ret != ERR_NO_ERROR)
11511 	{
11512 		// An error has occured
11513 		CmdPrintError(c, ret);
11514 		FreeParamValueList(o);
11515 		return ret;
11516 	}
11517 
11518 	FreeParamValueList(o);
11519 
11520 	return 0;
11521 }
11522 
11523 // Set the Virtual HUB to deny to be enumerated for anonymous users
PsSetEnumDeny(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11524 UINT PsSetEnumDeny(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11525 {
11526 	LIST *o;
11527 	PS *ps = (PS *)param;
11528 	UINT ret = 0;
11529 	RPC_CREATE_HUB t;
11530 
11531 	// If virtual HUB is not selected, it's an error
11532 	if (ps->HubName == NULL)
11533 	{
11534 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11535 		return ERR_INVALID_PARAMETER;
11536 	}
11537 
11538 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
11539 	if (o == NULL)
11540 	{
11541 		return ERR_INVALID_PARAMETER;
11542 	}
11543 
11544 	// Get current settings of Virtual HUB
11545 	Zero(&t, sizeof(t));
11546 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11547 	ret = ScGetHub(ps->Rpc, &t);
11548 	if (ret != ERR_NO_ERROR)
11549 	{
11550 		// An error has occured
11551 		CmdPrintError(c, ret);
11552 		FreeParamValueList(o);
11553 		return ret;
11554 	}
11555 
11556 	t.HubOption.NoEnum = true;
11557 
11558 	// Write the configuration of Virtual HUB
11559 	ret = ScSetHub(ps->Rpc, &t);
11560 	if (ret != ERR_NO_ERROR)
11561 	{
11562 		// An error has occured
11563 		CmdPrintError(c, ret);
11564 		FreeParamValueList(o);
11565 		return ret;
11566 	}
11567 
11568 	FreeParamValueList(o);
11569 
11570 	return 0;
11571 }
11572 
11573 // Get the option settings for the virtual HUB
PsOptionsGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11574 UINT PsOptionsGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11575 {
11576 	LIST *o;
11577 	PS *ps = (PS *)param;
11578 	UINT ret = 0;
11579 	RPC_CREATE_HUB t;
11580 
11581 	// If virtual HUB is not selected, it's an error
11582 	if (ps->HubName == NULL)
11583 	{
11584 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11585 		return ERR_INVALID_PARAMETER;
11586 	}
11587 
11588 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
11589 	if (o == NULL)
11590 	{
11591 		return ERR_INVALID_PARAMETER;
11592 	}
11593 
11594 	Zero(&t, sizeof(t));
11595 
11596 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11597 
11598 	// RPC call
11599 	ret = ScGetHub(ps->Rpc, &t);
11600 
11601 	if (ret != ERR_NO_ERROR)
11602 	{
11603 		// An error has occured
11604 		CmdPrintError(c, ret);
11605 		FreeParamValueList(o);
11606 		return ret;
11607 	}
11608 	else
11609 	{
11610 		CT *ct;
11611 		wchar_t tmp[MAX_SIZE];
11612 
11613 		UniFormat(tmp, sizeof(tmp), _UU("CMD_OptionsGet_TITLE"), ps->HubName);
11614 		c->Write(c, tmp);
11615 
11616 		// Display settings
11617 		ct = CtNewStandard();
11618 
11619 		CtInsert(ct, _UU("CMD_OptionsGet_ENUM"),
11620 			t.HubOption.NoEnum ? _UU("CMD_MSG_DENY") : _UU("CMD_MSG_ALLOW"));
11621 
11622 		if (t.HubOption.MaxSession == 0)
11623 		{
11624 			UniStrCpy(tmp, sizeof(tmp), _UU("CMD_MSG_INFINITE"));
11625 		}
11626 		else
11627 		{
11628 			UniToStru(tmp, t.HubOption.MaxSession);
11629 		}
11630 		CtInsert(ct, _UU("CMD_OptionsGet_MAXSESSIONS"), tmp);
11631 
11632 		CtInsert(ct, _UU("CMD_OptionsGet_STATUS"), t.Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"));
11633 
11634 		CtInsert(ct, _UU("CMD_OptionsGet_TYPE"), GetHubTypeStr(t.HubType));
11635 
11636 		IPToUniStr32(tmp, sizeof(tmp), t.HubOption.DefaultGateway);
11637 		CtInsert(ct, _UU("CMD_OptionsGet_GATEWAY"), tmp);
11638 
11639 		IPToUniStr32(tmp, sizeof(tmp), t.HubOption.DefaultSubnet);
11640 		CtInsert(ct, _UU("CMD_OptionsGet_SUBNET"), tmp);
11641 
11642 		CtFree(ct, c);
11643 	}
11644 
11645 	FreeParamValueList(o);
11646 
11647 	return 0;
11648 }
11649 
11650 // Setting the Radius server to use for user authentication
PsRadiusServerSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11651 UINT PsRadiusServerSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11652 {
11653 	LIST *o;
11654 	PS *ps = (PS *)param;
11655 	UINT ret = 0;
11656 	RPC_RADIUS t;
11657 	char *host;
11658 	UINT port;
11659 	// Parameter list that can be specified
11660 	CMD_EVAL_MIN_MAX minmax =
11661 	{
11662 		"CMD_RadiusServerSet_EVAL_NUMINTERVAL", RADIUS_RETRY_INTERVAL, RADIUS_RETRY_TIMEOUT,
11663 	};
11664 	PARAM args[] =
11665 	{
11666 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
11667 		{"[server_name:port]", CmdPrompt, _UU("CMD_RadiusServerSet_Prompt_Host"), CmdEvalNotEmpty, NULL},
11668 		{"SECRET", CmdPromptChoosePassword, _UU("CMD_RadiusServerSet_Prompt_Secret"), NULL, NULL},
11669 		{"RETRY_INTERVAL", CmdPrompt, _UU("CMD_RadiusServerSet_Prompt_RetryInterval"), CmdEvalMinMax, &minmax},
11670 	};
11671 
11672 	// If virtual HUB is not selected, it's an error
11673 	if (ps->HubName == NULL)
11674 	{
11675 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11676 		return ERR_INVALID_PARAMETER;
11677 	}
11678 
11679 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
11680 	if (o == NULL)
11681 	{
11682 		return ERR_INVALID_PARAMETER;
11683 	}
11684 
11685 	if (ParseHostPort(GetParamStr(o, "[server_name:port]"), &host, &port, 1812))
11686 	{
11687 		Zero(&t, sizeof(t));
11688 
11689 		StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11690 		t.RadiusPort = port;
11691 		StrCpy(t.RadiusServerName, sizeof(t.RadiusServerName), host);
11692 		StrCpy(t.RadiusSecret, sizeof(t.RadiusSecret), GetParamStr(o, "SECRET"));
11693 		t.RadiusRetryInterval = GetParamInt(o, "RETRY_INTERVAL");
11694 
11695 		Free(host);
11696 
11697 		// RPC call
11698 		ret = ScSetHubRadius(ps->Rpc, &t);
11699 
11700 		if (ret != ERR_NO_ERROR)
11701 		{
11702 			// An error has occured
11703 			CmdPrintError(c, ret);
11704 			FreeParamValueList(o);
11705 			return ret;
11706 		}
11707 	}
11708 
11709 	FreeParamValueList(o);
11710 
11711 	return 0;
11712 }
11713 
11714 // Delete the Radius server configuration to be used for user authentication
PsRadiusServerDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11715 UINT PsRadiusServerDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11716 {
11717 	LIST *o;
11718 	PS *ps = (PS *)param;
11719 	UINT ret = 0;
11720 	RPC_RADIUS t;
11721 
11722 	// If virtual HUB is not selected, it's an error
11723 	if (ps->HubName == NULL)
11724 	{
11725 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11726 		return ERR_INVALID_PARAMETER;
11727 	}
11728 
11729 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
11730 	if (o == NULL)
11731 	{
11732 		return ERR_INVALID_PARAMETER;
11733 	}
11734 
11735 	Zero(&t, sizeof(t));
11736 
11737 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11738 	t.RadiusPort = 1812;
11739 
11740 	// RPC call
11741 	ret = ScSetHubRadius(ps->Rpc, &t);
11742 
11743 	if (ret != ERR_NO_ERROR)
11744 	{
11745 		// An error has occured
11746 		CmdPrintError(c, ret);
11747 		FreeParamValueList(o);
11748 		return ret;
11749 	}
11750 
11751 	FreeParamValueList(o);
11752 
11753 	return 0;
11754 }
11755 
11756 // Get the Radius server settings to use for user authentication
PsRadiusServerGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11757 UINT PsRadiusServerGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11758 {
11759 	LIST *o;
11760 	PS *ps = (PS *)param;
11761 	UINT ret = 0;
11762 	RPC_RADIUS t;
11763 
11764 	// If virtual HUB is not selected, it's an error
11765 	if (ps->HubName == NULL)
11766 	{
11767 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11768 		return ERR_INVALID_PARAMETER;
11769 	}
11770 
11771 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
11772 	if (o == NULL)
11773 	{
11774 		return ERR_INVALID_PARAMETER;
11775 	}
11776 
11777 	Zero(&t, sizeof(t));
11778 
11779 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11780 
11781 	// RPC call
11782 	ret = ScGetHubRadius(ps->Rpc, &t);
11783 
11784 	if (ret != ERR_NO_ERROR)
11785 	{
11786 		// An error has occured
11787 		CmdPrintError(c, ret);
11788 		FreeParamValueList(o);
11789 		return ret;
11790 	}
11791 	else
11792 	{
11793 		CT *ct;
11794 		wchar_t tmp[MAX_SIZE];
11795 
11796 		ct = CtNewStandard();
11797 
11798 		if (IsEmptyStr(t.RadiusServerName))
11799 		{
11800 			CtInsert(ct, _UU("CMD_RadiusServerGet_STATUS"), _UU("CMD_MSG_DISABLE"));
11801 		}
11802 		else
11803 		{
11804 			CtInsert(ct, _UU("CMD_RadiusServerGet_STATUS"), _UU("CMD_MSG_ENABLE"));
11805 
11806 			StrToUni(tmp, sizeof(tmp), t.RadiusServerName);
11807 			CtInsert(ct, _UU("CMD_RadiusServerGet_HOST"), tmp);
11808 
11809 			UniToStri(tmp, t.RadiusPort);
11810 			CtInsert(ct, _UU("CMD_RadiusServerGet_PORT"), tmp);
11811 
11812 			StrToUni(tmp, sizeof(tmp), t.RadiusSecret);
11813 			CtInsert(ct, _UU("CMD_RadiusServerGet_SECRET"), tmp);
11814 
11815 			UniToStri(tmp, t.RadiusRetryInterval);
11816 			CtInsert(ct, _UU("CMD_RadiusServerGet_RetryInterval"), tmp);
11817 		}
11818 
11819 		CtFree(ct, c);
11820 	}
11821 
11822 	FreeParamValueList(o);
11823 
11824 	return 0;
11825 }
11826 
11827 // Get the current status of the Virtual HUB
PsStatusGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11828 UINT PsStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11829 {
11830 	LIST *o;
11831 	PS *ps = (PS *)param;
11832 	UINT ret = 0;
11833 	RPC_HUB_STATUS t;
11834 
11835 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
11836 	if (o == NULL)
11837 	{
11838 		return ERR_INVALID_PARAMETER;
11839 	}
11840 
11841 	// If virtual HUB is not selected, it's an error
11842 	if (ps->HubName == NULL)
11843 	{
11844 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11845 		return ERR_INVALID_PARAMETER;
11846 	}
11847 
11848 	Zero(&t, sizeof(t));
11849 
11850 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
11851 
11852 	// RPC call
11853 	ret = ScGetHubStatus(ps->Rpc, &t);
11854 
11855 	if (ret != ERR_NO_ERROR)
11856 	{
11857 		// An error has occured
11858 		CmdPrintError(c, ret);
11859 		FreeParamValueList(o);
11860 		return ret;
11861 	}
11862 	else
11863 	{
11864 		CT *ct = CtNewStandard();
11865 		wchar_t *s;
11866 		wchar_t tmp[MAX_SIZE];
11867 
11868 		// HUB name
11869 		s = CopyStrToUni(t.HubName);
11870 		CtInsert(ct, _UU("SM_HUB_STATUS_HUBNAME"), s);
11871 		Free(s);
11872 
11873 		// Online
11874 		CtInsert(ct, _UU("SM_HUB_STATUS_ONLINE"),
11875 			t.Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"));
11876 
11877 		// Type of HUB
11878 		CtInsert(ct, _UU("SM_HUB_TYPE"),
11879 			GetHubTypeStr(t.HubType));
11880 
11881 		if (t.HubType == HUB_TYPE_STANDALONE)
11882 		{
11883 			// Enable / Disable the SecureNAT
11884 			CtInsert(ct, _UU("SM_HUB_SECURE_NAT"),
11885 				t.SecureNATEnabled ? _UU("SM_HUB_SECURE_NAT_YES") : _UU("SM_HUB_SECURE_NAT_NO"));
11886 		}
11887 
11888 		// Other values
11889 		UniToStru(tmp, t.NumSessions);
11890 		CtInsert(ct, _UU("SM_HUB_NUM_SESSIONS"), tmp);
11891 
11892 		if (t.NumSessionsClient != 0 || t.NumSessionsBridge != 0)
11893 		{
11894 			UniToStru(tmp, t.NumSessionsClient);
11895 			CtInsert(ct, _UU("SM_HUB_NUM_SESSIONS_CLIENT"), tmp);
11896 			UniToStru(tmp, t.NumSessionsBridge);
11897 			CtInsert(ct, _UU("SM_HUB_NUM_SESSIONS_BRIDGE"), tmp);
11898 		}
11899 
11900 		UniToStru(tmp, t.NumAccessLists);
11901 		CtInsert(ct, _UU("SM_HUB_NUM_ACCESSES"), tmp);
11902 
11903 		UniToStru(tmp, t.NumUsers);
11904 		CtInsert(ct, _UU("SM_HUB_NUM_USERS"), tmp);
11905 		UniToStru(tmp, t.NumGroups);
11906 		CtInsert(ct, _UU("SM_HUB_NUM_GROUPS"), tmp);
11907 
11908 		UniToStru(tmp, t.NumMacTables);
11909 		CtInsert(ct, _UU("SM_HUB_NUM_MAC_TABLES"), tmp);
11910 		UniToStru(tmp, t.NumIpTables);
11911 		CtInsert(ct, _UU("SM_HUB_NUM_IP_TABLES"), tmp);
11912 
11913 		// Usage status
11914 		UniToStru(tmp, t.NumLogin);
11915 		CtInsert(ct, _UU("SM_HUB_NUM_LOGIN"), tmp);
11916 
11917 		if (t.LastLoginTime != 0)
11918 		{
11919 			GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.LastLoginTime));
11920 		}
11921 		else
11922 		{
11923 			UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));
11924 		}
11925 		CtInsert(ct, _UU("SM_HUB_LAST_LOGIN_TIME"), tmp);
11926 
11927 		if (t.LastCommTime != 0)
11928 		{
11929 			GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.LastCommTime));
11930 		}
11931 		else
11932 		{
11933 			UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));
11934 		}
11935 		CtInsert(ct, _UU("SM_HUB_LAST_COMM_TIME"), tmp);
11936 
11937 		if (t.CreatedTime != 0)
11938 		{
11939 			GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.CreatedTime));
11940 		}
11941 		else
11942 		{
11943 			UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));
11944 		}
11945 		CtInsert(ct, _UU("SM_HUB_CREATED_TIME"), tmp);
11946 
11947 		// Traffic information
11948 		CmdInsertTrafficInfo(ct, &t.Traffic);
11949 
11950 		CtFree(ct, c);
11951 	}
11952 
11953 	FreeParamValueList(o);
11954 
11955 	return 0;
11956 }
11957 
11958 // Get the log switching string
GetLogSwitchStr(UINT i)11959 wchar_t *GetLogSwitchStr(UINT i)
11960 {
11961 	char tmp[64];
11962 
11963 	Format(tmp, sizeof(tmp), "SM_LOG_SWITCH_%u", i);
11964 
11965 	return _UU(tmp);
11966 }
11967 
11968 // Get the packet log name string
GetPacketLogNameStr(UINT i)11969 wchar_t *GetPacketLogNameStr(UINT i)
11970 {
11971 	char tmp[64];
11972 
11973 	Format(tmp, sizeof(tmp), "CMD_Log_%u", i);
11974 
11975 	return _UU(tmp);
11976 }
11977 
11978 // Get the log storage settings for the virtual HUB
PsLogGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)11979 UINT PsLogGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
11980 {
11981 	LIST *o;
11982 	PS *ps = (PS *)param;
11983 	UINT ret = 0;
11984 	RPC_HUB_LOG t;
11985 
11986 	// If virtual HUB is not selected, it's an error
11987 	if (ps->HubName == NULL)
11988 	{
11989 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
11990 		return ERR_INVALID_PARAMETER;
11991 	}
11992 
11993 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
11994 	if (o == NULL)
11995 	{
11996 		return ERR_INVALID_PARAMETER;
11997 	}
11998 
11999 	Zero(&t, sizeof(t));
12000 
12001 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12002 
12003 	// RPC call
12004 	ret = ScGetHubLog(ps->Rpc, &t);
12005 
12006 	if (ret != ERR_NO_ERROR)
12007 	{
12008 		// An error has occured
12009 		CmdPrintError(c, ret);
12010 		FreeParamValueList(o);
12011 		return ret;
12012 	}
12013 	else
12014 	{
12015 		CT *ct = CtNewStandard();
12016 
12017 		CtInsert(ct, _UU("CMD_Log_SecurityLog"),
12018 			t.LogSetting.SaveSecurityLog ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
12019 		if (t.LogSetting.SaveSecurityLog)
12020 		{
12021 			CtInsert(ct, _UU("CMD_Log_SwitchType"), GetLogSwitchStr(t.LogSetting.SecurityLogSwitchType));
12022 		}
12023 
12024 		CtInsert(ct, L"", L"");
12025 
12026 		CtInsert(ct, _UU("CMD_Log_PacketLog"),
12027 			t.LogSetting.SavePacketLog ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
12028 		if (t.LogSetting.SavePacketLog)
12029 		{
12030 			UINT i;
12031 
12032 			CtInsert(ct, _UU("CMD_Log_SwitchType"), GetLogSwitchStr(t.LogSetting.PacketLogSwitchType));
12033 
12034 			for (i = 0;i <= 7;i++)
12035 			{
12036 				wchar_t *tmp = NULL;
12037 
12038 				switch (t.LogSetting.PacketLogConfig[i])
12039 				{
12040 				case PACKET_LOG_NONE:
12041 					tmp = _UU("D_SM_LOG@B_PACKET_0_0");
12042 					break;
12043 
12044 				case PACKET_LOG_HEADER:
12045 					tmp = _UU("D_SM_LOG@B_PACKET_0_1");
12046 					break;
12047 
12048 				case PACKET_LOG_ALL:
12049 					tmp = _UU("D_SM_LOG@B_PACKET_0_2");
12050 					break;
12051 				}
12052 
12053 				CtInsert(ct, GetPacketLogNameStr(i),
12054 					tmp);
12055 			}
12056 		}
12057 
12058 		CtFree(ct, c);
12059 	}
12060 
12061 	FreeParamValueList(o);
12062 
12063 	return 0;
12064 }
12065 
12066 // LogEnable command
PsLogEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12067 UINT PsLogEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12068 {
12069 	LIST *o;
12070 	PS *ps = (PS *)param;
12071 	UINT ret = 0;
12072 	RPC_HUB_LOG t;
12073 	bool packet_log = false;
12074 	char *tmp;
12075 	// Parameter list that can be specified
12076 	PARAM args[] =
12077 	{
12078 		{"[security|packet]", CmdPrompt, _UU("CMD_LogEnable_Prompt"), CmdEvalNotEmpty, NULL},
12079 	};
12080 
12081 	// If virtual HUB is not selected, it's an error
12082 	if (ps->HubName == NULL)
12083 	{
12084 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12085 		return ERR_INVALID_PARAMETER;
12086 	}
12087 
12088 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12089 	if (o == NULL)
12090 	{
12091 		return ERR_INVALID_PARAMETER;
12092 	}
12093 
12094 	tmp = GetParamStr(o, "[security|packet]");
12095 
12096 	if (StartWith(tmp, "p"))
12097 	{
12098 		packet_log = true;
12099 	}
12100 	else if (StartWith(tmp, "s") == false)
12101 	{
12102 		c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
12103 		FreeParamValueList(o);
12104 		return ret;
12105 	}
12106 
12107 	Zero(&t, sizeof(t));
12108 
12109 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12110 
12111 	// RPC call
12112 	ret = ScGetHubLog(ps->Rpc, &t);
12113 	if (ret != ERR_NO_ERROR)
12114 	{
12115 		// An error has occured
12116 		CmdPrintError(c, ret);
12117 		FreeParamValueList(o);
12118 		return ret;
12119 	}
12120 
12121 	if (packet_log == false)
12122 	{
12123 		t.LogSetting.SaveSecurityLog = true;
12124 	}
12125 	else
12126 	{
12127 		t.LogSetting.SavePacketLog = true;
12128 	}
12129 
12130 	// RPC call
12131 	ret = ScSetHubLog(ps->Rpc, &t);
12132 	if (ret != ERR_NO_ERROR)
12133 	{
12134 		// An error has occured
12135 		CmdPrintError(c, ret);
12136 		FreeParamValueList(o);
12137 		return ret;
12138 	}
12139 
12140 	FreeParamValueList(o);
12141 
12142 	return 0;
12143 }
12144 
12145 // Disable the packet log or the security log
PsLogDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12146 UINT PsLogDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12147 {
12148 	LIST *o;
12149 	PS *ps = (PS *)param;
12150 	UINT ret = 0;
12151 	RPC_HUB_LOG t;
12152 	bool packet_log = false;
12153 	char *tmp;
12154 	// Parameter list that can be specified
12155 	PARAM args[] =
12156 	{
12157 		{"[security|packet]", CmdPrompt, _UU("CMD_LogEnable_Prompt"), CmdEvalNotEmpty, NULL},
12158 	};
12159 
12160 	// If virtual HUB is not selected, it's an error
12161 	if (ps->HubName == NULL)
12162 	{
12163 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12164 		return ERR_INVALID_PARAMETER;
12165 	}
12166 
12167 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12168 	if (o == NULL)
12169 	{
12170 		return ERR_INVALID_PARAMETER;
12171 	}
12172 
12173 	tmp = GetParamStr(o, "[security|packet]");
12174 
12175 	if (StartWith(tmp, "p"))
12176 	{
12177 		packet_log = true;
12178 	}
12179 	else if (StartWith(tmp, "s") == false)
12180 	{
12181 		c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
12182 		FreeParamValueList(o);
12183 		return ERR_INVALID_PARAMETER;
12184 	}
12185 
12186 	Zero(&t, sizeof(t));
12187 
12188 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12189 
12190 	// RPC call
12191 	ret = ScGetHubLog(ps->Rpc, &t);
12192 	if (ret != ERR_NO_ERROR)
12193 	{
12194 		// An error has occured
12195 		CmdPrintError(c, ret);
12196 		FreeParamValueList(o);
12197 		return ret;
12198 	}
12199 
12200 	if (packet_log == false)
12201 	{
12202 		t.LogSetting.SaveSecurityLog = false;
12203 	}
12204 	else
12205 	{
12206 		t.LogSetting.SavePacketLog = false;
12207 	}
12208 
12209 	// RPC call
12210 	ret = ScSetHubLog(ps->Rpc, &t);
12211 	if (ret != ERR_NO_ERROR)
12212 	{
12213 		// An error has occured
12214 		CmdPrintError(c, ret);
12215 		FreeParamValueList(o);
12216 		return ret;
12217 	}
12218 
12219 	FreeParamValueList(o);
12220 
12221 	return 0;
12222 }
12223 
12224 // Convert the string to log switching type
StrToLogSwitchType(char * str)12225 UINT StrToLogSwitchType(char *str)
12226 {
12227 	UINT ret = INFINITE;
12228 	// Validate arguments
12229 	if (str == NULL)
12230 	{
12231 		return INFINITE;
12232 	}
12233 
12234 	if (IsEmptyStr(str) || StartWith("none", str))
12235 	{
12236 		ret = LOG_SWITCH_NO;
12237 	}
12238 	else if (StartWith("second", str))
12239 	{
12240 		ret = LOG_SWITCH_SECOND;
12241 	}
12242 	else if (StartWith("minute", str))
12243 	{
12244 		ret = LOG_SWITCH_MINUTE;
12245 	}
12246 	else if (StartWith("hour", str))
12247 	{
12248 		ret = LOG_SWITCH_HOUR;
12249 	}
12250 	else if (StartWith("day", str))
12251 	{
12252 		ret = LOG_SWITCH_DAY;
12253 	}
12254 	else if (StartWith("month", str))
12255 	{
12256 		ret = LOG_SWITCH_MONTH;
12257 	}
12258 
12259 	return ret;
12260 }
12261 
12262 // Set the switching period of the log file
PsLogSwitchSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12263 UINT PsLogSwitchSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12264 {
12265 	LIST *o;
12266 	PS *ps = (PS *)param;
12267 	UINT ret = 0;
12268 	RPC_HUB_LOG t;
12269 	bool packet_log = false;
12270 	char *tmp;
12271 	UINT new_switch_type = 0;
12272 	// Parameter list that can be specified
12273 	PARAM args[] =
12274 	{
12275 		{"[security|packet]", CmdPrompt, _UU("CMD_LogEnable_Prompt"), CmdEvalNotEmpty, NULL},
12276 		{"SWITCH", CmdPrompt, _UU("CMD_LogSwitchSet_Prompt"), NULL, NULL},
12277 	};
12278 
12279 	// If virtual HUB is not selected, it's an error
12280 	if (ps->HubName == NULL)
12281 	{
12282 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12283 		return ERR_INVALID_PARAMETER;
12284 	}
12285 
12286 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12287 	if (o == NULL)
12288 	{
12289 		return ERR_INVALID_PARAMETER;
12290 	}
12291 
12292 	tmp = GetParamStr(o, "[security|packet]");
12293 
12294 	if (StartWith(tmp, "p"))
12295 	{
12296 		packet_log = true;
12297 	}
12298 	else if (StartWith(tmp, "s") == false)
12299 	{
12300 		c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
12301 		FreeParamValueList(o);
12302 		return ERR_INVALID_PARAMETER;
12303 	}
12304 
12305 	new_switch_type = StrToLogSwitchType(GetParamStr(o, "SWITCH"));
12306 
12307 	if (new_switch_type == INFINITE)
12308 	{
12309 		c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
12310 		FreeParamValueList(o);
12311 		return ERR_INVALID_PARAMETER;
12312 	}
12313 
12314 	Zero(&t, sizeof(t));
12315 
12316 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12317 
12318 	// RPC call
12319 	ret = ScGetHubLog(ps->Rpc, &t);
12320 	if (ret != ERR_NO_ERROR)
12321 	{
12322 		// An error has occured
12323 		CmdPrintError(c, ret);
12324 		FreeParamValueList(o);
12325 		return ret;
12326 	}
12327 
12328 	if (packet_log == false)
12329 	{
12330 		t.LogSetting.SecurityLogSwitchType = new_switch_type;
12331 	}
12332 	else
12333 	{
12334 		t.LogSetting.PacketLogSwitchType = new_switch_type;
12335 	}
12336 
12337 	// RPC call
12338 	ret = ScSetHubLog(ps->Rpc, &t);
12339 	if (ret != ERR_NO_ERROR)
12340 	{
12341 		// An error has occured
12342 		CmdPrintError(c, ret);
12343 		FreeParamValueList(o);
12344 		return ret;
12345 	}
12346 
12347 	FreeParamValueList(o);
12348 
12349 	return 0;
12350 }
12351 
12352 // Convert the type string of the packet log contents to an integer
StrToPacketLogSaveInfoType(char * str)12353 UINT StrToPacketLogSaveInfoType(char *str)
12354 {
12355 	UINT ret = INFINITE;
12356 	if (str == NULL)
12357 	{
12358 		return INFINITE;
12359 	}
12360 
12361 	if (StartWith("none", str) || IsEmptyStr(str))
12362 	{
12363 		ret = PACKET_LOG_NONE;
12364 	}
12365 	else if (StartWith("header", str))
12366 	{
12367 		ret = PACKET_LOG_HEADER;
12368 	}
12369 	else if (StartWith("full", str) || StartWith("all", str))
12370 	{
12371 		ret = PACKET_LOG_ALL;
12372 	}
12373 
12374 	return ret;
12375 }
12376 
12377 // Convert a packet type string of the packet log to an integer
StrToPacketLogType(char * str)12378 UINT StrToPacketLogType(char *str)
12379 {
12380 	UINT ret = INFINITE;
12381 	if (str == NULL || IsEmptyStr(str))
12382 	{
12383 		return INFINITE;
12384 	}
12385 
12386 	if (StartWith("tcpconn", str))
12387 	{
12388 		ret = PACKET_LOG_TCP_CONN;
12389 	}
12390 	else if (StartWith("tcpdata", str))
12391 	{
12392 		ret = PACKET_LOG_TCP;
12393 	}
12394 	else if (StartWith("dhcp", str))
12395 	{
12396 		ret = PACKET_LOG_DHCP;
12397 	}
12398 	else if (StartWith("udp", str))
12399 	{
12400 		ret = PACKET_LOG_UDP;
12401 	}
12402 	else if (StartWith("icmp", str))
12403 	{
12404 		ret = PACKET_LOG_ICMP;
12405 	}
12406 	else if (StartWith("ip", str))
12407 	{
12408 		ret = PACKET_LOG_IP;
12409 	}
12410 	else if (StartWith("arp", str))
12411 	{
12412 		ret = PACKET_LOG_ARP;
12413 	}
12414 	else if (StartWith("ethernet", str))
12415 	{
12416 		ret = PACKET_LOG_ETHERNET;
12417 	}
12418 
12419 	return ret;
12420 }
12421 
12422 // 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)12423 UINT PsLogPacketSaveType(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12424 {
12425 	LIST *o;
12426 	PS *ps = (PS *)param;
12427 	UINT ret = 0;
12428 	RPC_HUB_LOG t;
12429 	UINT packet_type = INFINITE;
12430 	UINT packet_save_info_type = INFINITE;
12431 	// Parameter list that can be specified
12432 	PARAM args[] =
12433 	{
12434 		{"TYPE", CmdPrompt, _UU("CMD_LogPacketSaveType_Prompt_TYPE"), NULL, NULL},
12435 		{"SAVE", CmdPrompt, _UU("CMD_LogPacketSaveType_Prompt_SAVE"), NULL, NULL},
12436 	};
12437 
12438 	// If virtual HUB is not selected, it's an error
12439 	if (ps->HubName == NULL)
12440 	{
12441 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12442 		return ERR_INVALID_PARAMETER;
12443 	}
12444 
12445 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12446 	if (o == NULL)
12447 	{
12448 		return ERR_INVALID_PARAMETER;
12449 	}
12450 
12451 	packet_type = StrToPacketLogType(GetParamStr(o, "TYPE"));
12452 	packet_save_info_type = StrToPacketLogSaveInfoType(GetParamStr(o, "SAVE"));
12453 
12454 	if (packet_type == INFINITE || packet_save_info_type == INFINITE)
12455 	{
12456 		c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
12457 		FreeParamValueList(o);
12458 		return ERR_INVALID_PARAMETER;
12459 	}
12460 
12461 	Zero(&t, sizeof(t));
12462 
12463 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12464 
12465 	// RPC call
12466 	ret = ScGetHubLog(ps->Rpc, &t);
12467 	if (ret != ERR_NO_ERROR)
12468 	{
12469 		// An error has occured
12470 		CmdPrintError(c, ret);
12471 		FreeParamValueList(o);
12472 		return ret;
12473 	}
12474 
12475 	t.LogSetting.PacketLogConfig[packet_type] = packet_save_info_type;
12476 
12477 	// RPC call
12478 	ret = ScSetHubLog(ps->Rpc, &t);
12479 	if (ret != ERR_NO_ERROR)
12480 	{
12481 		// An error has occured
12482 		CmdPrintError(c, ret);
12483 		FreeParamValueList(o);
12484 		return ret;
12485 	}
12486 
12487 	FreeParamValueList(o);
12488 
12489 	return 0;
12490 }
12491 
12492 // Get the list of certificates of the trusted certification authority
PsCAList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12493 UINT PsCAList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12494 {
12495 	LIST *o;
12496 	PS *ps = (PS *)param;
12497 	UINT ret = 0;
12498 	RPC_HUB_ENUM_CA t;
12499 
12500 	// If virtual HUB is not selected, it's an error
12501 	if (ps->HubName == NULL)
12502 	{
12503 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12504 		return ERR_INVALID_PARAMETER;
12505 	}
12506 
12507 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
12508 	if (o == NULL)
12509 	{
12510 		return ERR_INVALID_PARAMETER;
12511 	}
12512 
12513 	Zero(&t, sizeof(t));
12514 
12515 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12516 
12517 	// RPC call
12518 	ret = ScEnumCa(ps->Rpc, &t);
12519 
12520 	if (ret != ERR_NO_ERROR)
12521 	{
12522 		// An error has occured
12523 		CmdPrintError(c, ret);
12524 		FreeParamValueList(o);
12525 		return ret;
12526 	}
12527 	else
12528 	{
12529 		UINT i;
12530 		CT *ct = CtNewStandard();
12531 
12532 		for (i = 0;i < t.NumCa;i++)
12533 		{
12534 			wchar_t tmp[MAX_SIZE];
12535 			wchar_t tmp2[64];
12536 			RPC_HUB_ENUM_CA_ITEM *e = &t.Ca[i];
12537 
12538 			GetDateStrEx64(tmp, sizeof(tmp), SystemToLocal64(e->Expires), NULL);
12539 
12540 			UniToStru(tmp2, e->Key);
12541 
12542 			CtInsert(ct, _UU("CMD_CAList_COLUMN_ID"), tmp2);
12543 			CtInsert(ct, _UU("CM_CERT_COLUMN_1"), e->SubjectName);
12544 			CtInsert(ct, _UU("CM_CERT_COLUMN_2"), e->IssuerName);
12545 			CtInsert(ct, _UU("CM_CERT_COLUMN_3"), tmp);
12546 
12547 			if (i != (t.NumCa - 1))
12548 			{
12549 				CtInsert(ct, L"---", L"---");
12550 			}
12551 		}
12552 
12553 		CtFree(ct, c);
12554 	}
12555 
12556 	FreeRpcHubEnumCa(&t);
12557 
12558 	FreeParamValueList(o);
12559 
12560 	return 0;
12561 }
12562 
12563 // Add a certificate to the trusted certification authority
PsCAAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12564 UINT PsCAAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12565 {
12566 	LIST *o;
12567 	PS *ps = (PS *)param;
12568 	UINT ret = 0;
12569 	RPC_HUB_ADD_CA t;
12570 	X *x;
12571 	// Parameter list that can be specified
12572 	PARAM args[] =
12573 	{
12574 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
12575 		{"[path]", CmdPrompt, _UU("CMD_CAAdd_PROMPT_PATH"), CmdEvalIsFile, NULL},
12576 	};
12577 
12578 	// If virtual HUB is not selected, it's an error
12579 	if (ps->HubName == NULL)
12580 	{
12581 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12582 		return ERR_INVALID_PARAMETER;
12583 	}
12584 
12585 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12586 	if (o == NULL)
12587 	{
12588 		return ERR_INVALID_PARAMETER;
12589 	}
12590 
12591 	x = FileToXW(GetParamUniStr(o, "[path]"));
12592 
12593 	if (x == NULL)
12594 	{
12595 		FreeParamValueList(o);
12596 		c->Write(c, _UU("CMD_MSG_LOAD_CERT_FAILED"));
12597 		return ERR_INVALID_PARAMETER;
12598 	}
12599 
12600 	Zero(&t, sizeof(t));
12601 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12602 	t.Cert = x;
12603 
12604 	// RPC call
12605 	ret = ScAddCa(ps->Rpc, &t);
12606 
12607 	if (ret != ERR_NO_ERROR)
12608 	{
12609 		// An error has occured
12610 		CmdPrintError(c, ret);
12611 		FreeParamValueList(o);
12612 		return ret;
12613 	}
12614 
12615 	FreeRpcHubAddCa(&t);
12616 
12617 	FreeParamValueList(o);
12618 
12619 	return 0;
12620 }
12621 
12622 // Delete the certificate of the trusted certification authority
PsCADelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12623 UINT PsCADelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12624 {
12625 	LIST *o;
12626 	PS *ps = (PS *)param;
12627 	UINT ret = 0;
12628 	RPC_HUB_DELETE_CA t;
12629 	// Parameter list that can be specified
12630 	PARAM args[] =
12631 	{
12632 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
12633 		{"[id]", CmdPrompt, _UU("CMD_CADelete_PROMPT_ID"), CmdEvalNotEmpty, NULL},
12634 	};
12635 
12636 	// If virtual HUB is not selected, it's an error
12637 	if (ps->HubName == NULL)
12638 	{
12639 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12640 		return ERR_INVALID_PARAMETER;
12641 	}
12642 
12643 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12644 	if (o == NULL)
12645 	{
12646 		return ERR_INVALID_PARAMETER;
12647 	}
12648 
12649 	Zero(&t, sizeof(t));
12650 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12651 	t.Key = GetParamInt(o, "[id]");
12652 
12653 	// RPC call
12654 	ret = ScDeleteCa(ps->Rpc, &t);
12655 
12656 	if (ret != ERR_NO_ERROR)
12657 	{
12658 		// An error has occured
12659 		CmdPrintError(c, ret);
12660 		FreeParamValueList(o);
12661 		return ret;
12662 	}
12663 
12664 	FreeParamValueList(o);
12665 
12666 	return 0;
12667 }
12668 
12669 // Get the certificate of the trusted certification authority
PsCAGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12670 UINT PsCAGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12671 {
12672 	LIST *o;
12673 	PS *ps = (PS *)param;
12674 	UINT ret = 0;
12675 	RPC_HUB_GET_CA t;
12676 	// Parameter list that can be specified
12677 	PARAM args[] =
12678 	{
12679 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
12680 		{"[id]", CmdPrompt, _UU("CMD_CAGet_PROMPT_ID"), CmdEvalNotEmpty, NULL},
12681 		{"SAVECERT", CmdPrompt, _UU("CMD_CAGet_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},
12682 	};
12683 
12684 	// If virtual HUB is not selected, it's an error
12685 	if (ps->HubName == NULL)
12686 	{
12687 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12688 		return ERR_INVALID_PARAMETER;
12689 	}
12690 
12691 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12692 	if (o == NULL)
12693 	{
12694 		return ERR_INVALID_PARAMETER;
12695 	}
12696 
12697 	Zero(&t, sizeof(t));
12698 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12699 	t.Key = GetParamInt(o, "[id]");
12700 
12701 	// RPC call
12702 	ret = ScGetCa(ps->Rpc, &t);
12703 
12704 	if (ret != ERR_NO_ERROR)
12705 	{
12706 		// An error has occured
12707 		CmdPrintError(c, ret);
12708 		FreeParamValueList(o);
12709 		return ret;
12710 	}
12711 	else
12712 	{
12713 		if (XToFileW(t.Cert, GetParamUniStr(o, "SAVECERT"), true))
12714 		{
12715 			// Success
12716 		}
12717 		else
12718 		{
12719 			ret = ERR_INTERNAL_ERROR;
12720 			c->Write(c, _UU("CMD_MSG_SAVE_CERT_FAILED"));
12721 		}
12722 	}
12723 
12724 	FreeRpcHubGetCa(&t);
12725 
12726 	FreeParamValueList(o);
12727 
12728 	return ret;
12729 }
12730 
12731 // Get the cascade connection list
PsCascadeList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12732 UINT PsCascadeList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12733 {
12734 	LIST *o;
12735 	PS *ps = (PS *)param;
12736 	UINT ret = 0;
12737 	RPC_ENUM_LINK t;
12738 
12739 	// If virtual HUB is not selected, it's an error
12740 	if (ps->HubName == NULL)
12741 	{
12742 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12743 		return ERR_INVALID_PARAMETER;
12744 	}
12745 
12746 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
12747 	if (o == NULL)
12748 	{
12749 		return ERR_INVALID_PARAMETER;
12750 	}
12751 
12752 	Zero(&t, sizeof(t));
12753 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12754 
12755 	// RPC call
12756 	ret = ScEnumLink(ps->Rpc, &t);
12757 
12758 	if (ret != ERR_NO_ERROR)
12759 	{
12760 		// An error has occured
12761 		CmdPrintError(c, ret);
12762 		FreeParamValueList(o);
12763 		return ret;
12764 	}
12765 	else
12766 	{
12767 		CT *ct = CtNew();
12768 		UINT i;
12769 
12770 		CtInsertColumn(ct, _UU("SM_LINK_COLUMN_1"), false);
12771 		CtInsertColumn(ct, _UU("SM_LINK_COLUMN_2"), false);
12772 		CtInsertColumn(ct, _UU("SM_LINK_COLUMN_3"), false);
12773 		CtInsertColumn(ct, _UU("SM_LINK_COLUMN_4"), false);
12774 		CtInsertColumn(ct, _UU("SM_LINK_COLUMN_5"), false);
12775 
12776 		for (i = 0;i < t.NumLink;i++)
12777 		{
12778 			RPC_ENUM_LINK_ITEM *e = &t.Links[i];
12779 			wchar_t tmp1[MAX_SIZE];
12780 			wchar_t tmp2[MAX_SIZE];
12781 			wchar_t tmp3[MAX_SIZE];
12782 			wchar_t tmp4[MAX_SIZE];
12783 
12784 			GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->ConnectedTime), NULL);
12785 			StrToUni(tmp2, sizeof(tmp2), e->Hostname);
12786 			StrToUni(tmp3, sizeof(tmp3), e->HubName);
12787 
12788 			if (e->Online == false)
12789 			{
12790 				UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_OFFLINE"));
12791 			}
12792 			else
12793 			{
12794 				if (e->Connected)
12795 				{
12796 					UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_ONLINE"));
12797 				}
12798 				else
12799 				{
12800 					if (e->LastError != 0)
12801 					{
12802 						UniFormat(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_ERROR"), e->LastError, _E(e->LastError));
12803 					}
12804 					else
12805 					{
12806 						UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_CONNECTING"));
12807 					}
12808 				}
12809 			}
12810 
12811 			CtInsert(ct, e->AccountName, tmp4, tmp1, tmp2, tmp3);
12812 		}
12813 
12814 		CtFreeEx(ct, c, true);
12815 	}
12816 
12817 	FreeRpcEnumLink(&t);
12818 
12819 	FreeParamValueList(o);
12820 
12821 	return 0;
12822 }
12823 
12824 // Creat a new cascade
PsCascadeCreate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12825 UINT PsCascadeCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12826 {
12827 	LIST *o;
12828 	PS *ps = (PS *)param;
12829 	UINT ret = 0;
12830 	RPC_CREATE_LINK t;
12831 	char *host = NULL;
12832 	UINT port = 443;
12833 	// Parameter list that can be specified
12834 	PARAM args[] =
12835 	{
12836 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
12837 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
12838 		{"SERVER", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},
12839 		{"HUB", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Hub"), CmdEvalSafe, NULL},
12840 		{"USERNAME", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},
12841 	};
12842 
12843 	// If virtual HUB is not selected, it's an error
12844 	if (ps->HubName == NULL)
12845 	{
12846 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12847 		return ERR_INVALID_PARAMETER;
12848 	}
12849 
12850 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12851 	if (o == NULL)
12852 	{
12853 		return ERR_INVALID_PARAMETER;
12854 	}
12855 
12856 	ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);
12857 
12858 	Zero(&t, sizeof(t));
12859 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12860 
12861 	t.Online = false;
12862 
12863 	Copy(&t.Policy, GetDefaultPolicy(), sizeof(POLICY));
12864 
12865 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
12866 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
12867 	t.ClientOption->Port = port;
12868 	StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);
12869 	StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));
12870 	t.ClientOption->NumRetry = INFINITE;
12871 	t.ClientOption->RetryInterval = 15;
12872 	t.ClientOption->MaxConnection = 8;
12873 	t.ClientOption->UseEncrypt = true;
12874 	t.ClientOption->AdditionalConnectionInterval = 1;
12875 	t.ClientOption->RequireBridgeRoutingMode = true;
12876 
12877 	t.ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));
12878 	t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
12879 	StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username), GetParamStr(o, "USERNAME"));
12880 
12881 	Free(host);
12882 
12883 	// RPC call
12884 	ret = ScCreateLink(ps->Rpc, &t);
12885 
12886 	if (ret != ERR_NO_ERROR)
12887 	{
12888 		// An error has occured
12889 		CmdPrintError(c, ret);
12890 		FreeParamValueList(o);
12891 		return ret;
12892 	}
12893 
12894 	FreeRpcCreateLink(&t);
12895 
12896 	FreeParamValueList(o);
12897 
12898 	return 0;
12899 }
12900 
12901 // Set the user name and destination of the cascade connection
PsCascadeSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)12902 UINT PsCascadeSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
12903 {
12904 	LIST *o;
12905 	PS *ps = (PS *)param;
12906 	UINT ret = 0;
12907 	RPC_CREATE_LINK t;
12908 	char *host = NULL;
12909 	UINT port = 443;
12910 	// Parameter list that can be specified
12911 	PARAM args[] =
12912 	{
12913 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
12914 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
12915 		{"SERVER", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},
12916 		{"HUB", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Hub"), CmdEvalSafe, NULL},
12917 	};
12918 
12919 	// If virtual HUB is not selected, it's an error
12920 	if (ps->HubName == NULL)
12921 	{
12922 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
12923 		return ERR_INVALID_PARAMETER;
12924 	}
12925 
12926 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
12927 	if (o == NULL)
12928 	{
12929 		return ERR_INVALID_PARAMETER;
12930 	}
12931 
12932 	ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);
12933 
12934 	Zero(&t, sizeof(t));
12935 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
12936 
12937 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
12938 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
12939 
12940 	ret = ScGetLink(ps->Rpc, &t);
12941 	if (ret != ERR_NO_ERROR)
12942 	{
12943 		// An error has occured
12944 		CmdPrintError(c, ret);
12945 		FreeParamValueList(o);
12946 		Free(host);
12947 		return ret;
12948 	}
12949 
12950 	t.ClientOption->Port = port;
12951 	StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);
12952 	StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));
12953 
12954 	Free(host);
12955 
12956 	// RPC call
12957 	ret = ScSetLink(ps->Rpc, &t);
12958 
12959 	if (ret != ERR_NO_ERROR)
12960 	{
12961 		// An error has occured
12962 		CmdPrintError(c, ret);
12963 		FreeParamValueList(o);
12964 		return ret;
12965 	}
12966 
12967 	FreeRpcCreateLink(&t);
12968 
12969 	FreeParamValueList(o);
12970 
12971 	return 0;
12972 }
12973 
12974 // Get the type string of proxy
GetProxyTypeStr(UINT i)12975 wchar_t *GetProxyTypeStr(UINT i)
12976 {
12977 	switch (i)
12978 	{
12979 	case PROXY_DIRECT:
12980 
12981 		return _UU("PROTO_DIRECT_TCP");
12982 
12983 	case PROXY_HTTP:
12984 		return _UU("PROTO_HTTP_PROXY");
12985 
12986 	case PROXY_SOCKS:
12987 		return _UU("PROTO_SOCKS_PROXY");
12988 
12989 	default:
12990 		return _UU("PROTO_UNKNOWN");
12991 	}
12992 }
12993 
12994 // Get type string in user authentication for client
GetClientAuthTypeStr(UINT i)12995 wchar_t *GetClientAuthTypeStr(UINT i)
12996 {
12997 	char tmp[MAX_SIZE];
12998 
12999 	Format(tmp, sizeof(tmp), "PW_TYPE_%u", i);
13000 
13001 	return _UU(tmp);
13002 }
13003 
13004 // Get the setting of cascade connection
PsCascadeGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13005 UINT PsCascadeGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13006 {
13007 	LIST *o;
13008 	PS *ps = (PS *)param;
13009 	UINT ret = 0;
13010 	RPC_CREATE_LINK t;
13011 	// Parameter list that can be specified
13012 	PARAM args[] =
13013 	{
13014 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13015 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13016 	};
13017 
13018 	// If virtual HUB is not selected, it's an error
13019 	if (ps->HubName == NULL)
13020 	{
13021 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13022 		return ERR_INVALID_PARAMETER;
13023 	}
13024 
13025 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13026 	if (o == NULL)
13027 	{
13028 		return ERR_INVALID_PARAMETER;
13029 	}
13030 
13031 	Zero(&t, sizeof(t));
13032 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13033 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13034 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName),
13035 		GetParamUniStr(o, "[name]"));
13036 
13037 	// RPC call
13038 	ret = ScGetLink(ps->Rpc, &t);
13039 
13040 	if (ret != ERR_NO_ERROR)
13041 	{
13042 		// An error has occured
13043 		CmdPrintError(c, ret);
13044 		FreeParamValueList(o);
13045 		return ret;
13046 	}
13047 	else
13048 	{
13049 		// Show the contents of the connection settings
13050 		wchar_t tmp[MAX_SIZE];
13051 
13052 		CT *ct = CtNewStandard();
13053 
13054 		// Connection settings name
13055 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NAME"), t.ClientOption->AccountName);
13056 
13057 		// Host name of the destination VPN Server
13058 		StrToUni(tmp, sizeof(tmp), t.ClientOption->Hostname);
13059 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HOSTNAME"), tmp);
13060 
13061 		// The port number to connect to VPN Server
13062 		UniToStru(tmp, t.ClientOption->Port);
13063 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PORT"), tmp);
13064 
13065 		// Virtual HUB name of the destination VPN Server
13066 		StrToUni(tmp, sizeof(tmp), t.ClientOption->HubName);
13067 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HUBNAME"), tmp);
13068 
13069 		// Type of proxy server to go through
13070 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_TYPE"), GetProxyTypeStr(t.ClientOption->ProxyType));
13071 
13072 		if (t.ClientOption->ProxyType != PROXY_DIRECT)
13073 		{
13074 			// Host name of the proxy server
13075 			StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyName);
13076 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_HOSTNAME"), tmp);
13077 
13078 			// Port number of the proxy server
13079 			UniToStru(tmp, t.ClientOption->ProxyPort);
13080 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_PORT"), tmp);
13081 
13082 			// User name of the proxy server
13083 			StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyUsername);
13084 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_USERNAME"), tmp);
13085 		}
13086 
13087 		// To verify the server certificate
13088 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_USE"),
13089 			t.CheckServerCert ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
13090 
13091 		// Registered specific certificate
13092 		if (t.ServerCert != NULL)
13093 		{
13094 			GetAllNameFromX(tmp, sizeof(tmp), t.ServerCert);
13095 			CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_NAME"), tmp);
13096 		}
13097 
13098 		// Device name to be used for the connection
13099 		StrToUni(tmp, sizeof(tmp), t.ClientOption->DeviceName);
13100 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_DEVICE_NAME"), tmp);
13101 
13102 		// Authentication type
13103 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_TYPE"), GetClientAuthTypeStr(t.ClientAuth->AuthType));
13104 
13105 		// User name
13106 		StrToUni(tmp, sizeof(tmp), t.ClientAuth->Username);
13107 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_USERNAME"), tmp);
13108 
13109 		if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_CERT)
13110 		{
13111 			if (t.ClientAuth->ClientX != NULL)
13112 			{
13113 				// Client certificate name
13114 				GetAllNameFromX(tmp, sizeof(tmp), t.ClientAuth->ClientX);
13115 				CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_CERT_NAME"), tmp);
13116 			}
13117 		}
13118 
13119 		// Number of TCP connections to be used for VPN communication
13120 		UniToStru(tmp, t.ClientOption->MaxConnection);
13121 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NUMTCP"), tmp);
13122 
13123 		// Establishment interval of each TCP connection
13124 		UniToStru(tmp, t.ClientOption->AdditionalConnectionInterval);
13125 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_INTERVAL"), tmp);
13126 
13127 		// Life span of each TCP connection
13128 		if (t.ClientOption->ConnectionDisconnectSpan != 0)
13129 		{
13130 			UniToStru(tmp, t.ClientOption->ConnectionDisconnectSpan);
13131 		}
13132 		else
13133 		{
13134 			UniStrCpy(tmp, sizeof(tmp), _UU("CMD_MSG_INFINITE"));
13135 		}
13136 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_TTL"), tmp);
13137 
13138 		// Use of half-duplex mode
13139 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_HALF"),
13140 			t.ClientOption->HalfConnection ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
13141 
13142 		// Encryption by SSL
13143 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_ENCRYPT"),
13144 			t.ClientOption->UseEncrypt ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
13145 
13146 		// Data compression
13147 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_COMPRESS"),
13148 			t.ClientOption->UseCompress ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
13149 
13150 		// Connect in bridge / router mode
13151 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_BRIDGE_ROUTER"),
13152 			t.ClientOption->RequireBridgeRoutingMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
13153 
13154 		// Connect in monitoring mode
13155 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_MONITOR"),
13156 			t.ClientOption->RequireMonitorMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
13157 
13158 		// Not to rewrite the routing table
13159 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NO_TRACKING"),
13160 			t.ClientOption->NoRoutingTracking ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
13161 
13162 		// Disable the QoS control
13163 		CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_QOS_DISABLE"),
13164 			t.ClientOption->DisableQoS ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
13165 
13166 		CtFree(ct, c);
13167 
13168 		// Security policy
13169 		c->Write(c, L"");
13170 		c->Write(c, _UU("CMD_CascadeGet_Policy"));
13171 		PrintPolicy(c, &t.Policy, true);
13172 	}
13173 
13174 	FreeRpcCreateLink(&t);
13175 
13176 	FreeParamValueList(o);
13177 
13178 	return 0;
13179 }
13180 
13181 // Delete the cascade connection
PsCascadeDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13182 UINT PsCascadeDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13183 {
13184 	LIST *o;
13185 	PS *ps = (PS *)param;
13186 	UINT ret = 0;
13187 	RPC_LINK t;
13188 	// Parameter list that can be specified
13189 	PARAM args[] =
13190 	{
13191 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13192 	};
13193 
13194 	// If virtual HUB is not selected, it's an error
13195 	if (ps->HubName == NULL)
13196 	{
13197 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13198 		return ERR_INVALID_PARAMETER;
13199 	}
13200 
13201 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13202 	if (o == NULL)
13203 	{
13204 		return ERR_INVALID_PARAMETER;
13205 	}
13206 
13207 	Zero(&t, sizeof(t));
13208 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
13209 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13210 
13211 	// RPC call
13212 	ret = ScDeleteLink(ps->Rpc, &t);
13213 
13214 	if (ret != ERR_NO_ERROR)
13215 	{
13216 		// An error has occured
13217 		CmdPrintError(c, ret);
13218 		FreeParamValueList(o);
13219 		return ret;
13220 	}
13221 
13222 	FreeParamValueList(o);
13223 
13224 	return 0;
13225 }
13226 
13227 // Set the user name to use for the cascade connection
PsCascadeUsernameSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13228 UINT PsCascadeUsernameSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13229 {
13230 	LIST *o;
13231 	PS *ps = (PS *)param;
13232 	UINT ret = 0;
13233 	RPC_CREATE_LINK t;
13234 	// Parameter list that can be specified
13235 	PARAM args[] =
13236 	{
13237 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13238 		{"USERNAME", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},
13239 	};
13240 
13241 	// If virtual HUB is not selected, it's an error
13242 	if (ps->HubName == NULL)
13243 	{
13244 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13245 		return ERR_INVALID_PARAMETER;
13246 	}
13247 
13248 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13249 	if (o == NULL)
13250 	{
13251 		return ERR_INVALID_PARAMETER;
13252 	}
13253 
13254 	Zero(&t, sizeof(t));
13255 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13256 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13257 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13258 
13259 	// RPC call
13260 	ret = ScGetLink(ps->Rpc, &t);
13261 
13262 	if (ret != ERR_NO_ERROR)
13263 	{
13264 		// An error has occured
13265 		CmdPrintError(c, ret);
13266 		FreeParamValueList(o);
13267 		return ret;
13268 	}
13269 	else
13270 	{
13271 		// Change the settings for the cascade connection
13272 		StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username),
13273 			GetParamStr(o, "USERNAME"));
13274 
13275 		if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_PASSWORD)
13276 		{
13277 			c->Write(c, _UU("CMD_CascadeUsername_Notice"));
13278 		}
13279 
13280 		ret = ScSetLink(ps->Rpc, &t);
13281 		if (ret != ERR_NO_ERROR)
13282 		{
13283 			// An error has occured
13284 			CmdPrintError(c, ret);
13285 			FreeParamValueList(o);
13286 			return ret;
13287 		}
13288 
13289 		FreeRpcCreateLink(&t);
13290 	}
13291 
13292 	FreeParamValueList(o);
13293 
13294 	return 0;
13295 }
13296 
13297 //Set the type of user authentication of cascade connection to the anonymous authentication
PsCascadeAnonymousSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13298 UINT PsCascadeAnonymousSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13299 {
13300 	LIST *o;
13301 	PS *ps = (PS *)param;
13302 	UINT ret = 0;
13303 	RPC_CREATE_LINK t;
13304 	// Parameter list that can be specified
13305 	PARAM args[] =
13306 	{
13307 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13308 	};
13309 
13310 	// If virtual HUB is not selected, it's an error
13311 	if (ps->HubName == NULL)
13312 	{
13313 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13314 		return ERR_INVALID_PARAMETER;
13315 	}
13316 
13317 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13318 	if (o == NULL)
13319 	{
13320 		return ERR_INVALID_PARAMETER;
13321 	}
13322 
13323 	Zero(&t, sizeof(t));
13324 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13325 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13326 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13327 
13328 	// RPC call
13329 	ret = ScGetLink(ps->Rpc, &t);
13330 
13331 	if (ret != ERR_NO_ERROR)
13332 	{
13333 		// An error has occured
13334 		CmdPrintError(c, ret);
13335 		FreeParamValueList(o);
13336 		return ret;
13337 	}
13338 	else
13339 	{
13340 		// Change the settings for the cascade connection
13341 		t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
13342 
13343 		ret = ScSetLink(ps->Rpc, &t);
13344 		if (ret != ERR_NO_ERROR)
13345 		{
13346 			// An error has occured
13347 			CmdPrintError(c, ret);
13348 			FreeParamValueList(o);
13349 			return ret;
13350 		}
13351 
13352 		FreeRpcCreateLink(&t);
13353 	}
13354 
13355 	FreeParamValueList(o);
13356 
13357 	return 0;
13358 }
13359 
13360 // Set the type of user authentication of cascade connection to the password authentication
PsCascadePasswordSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13361 UINT PsCascadePasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13362 {
13363 	LIST *o;
13364 	PS *ps = (PS *)param;
13365 	UINT ret = 0;
13366 	RPC_CREATE_LINK t;
13367 	// Parameter list that can be specified
13368 	PARAM args[] =
13369 	{
13370 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13371 		{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
13372 		{"TYPE", CmdPrompt, _UU("CMD_CascadePasswordSet_Prompt_Type"), CmdEvalNotEmpty, NULL},
13373 	};
13374 
13375 	// If virtual HUB is not selected, it's an error
13376 	if (ps->HubName == NULL)
13377 	{
13378 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13379 		return ERR_INVALID_PARAMETER;
13380 	}
13381 
13382 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13383 	if (o == NULL)
13384 	{
13385 		return ERR_INVALID_PARAMETER;
13386 	}
13387 
13388 	Zero(&t, sizeof(t));
13389 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13390 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13391 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13392 
13393 	// RPC call
13394 	ret = ScGetLink(ps->Rpc, &t);
13395 
13396 	if (ret != ERR_NO_ERROR)
13397 	{
13398 		// An error has occured
13399 		CmdPrintError(c, ret);
13400 		FreeParamValueList(o);
13401 		return ret;
13402 	}
13403 	else
13404 	{
13405 		// Change the settings for the cascade connection
13406 		char *typestr = GetParamStr(o, "TYPE");
13407 
13408 		if (StartWith("standard", typestr))
13409 		{
13410 			t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PASSWORD;
13411 			HashPassword(t.ClientAuth->HashedPassword, t.ClientAuth->Username,
13412 				GetParamStr(o, "PASSWORD"));
13413 		}
13414 		else if (StartWith("radius", typestr) || StartWith("ntdomain", typestr))
13415 		{
13416 			t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PLAIN_PASSWORD;
13417 
13418 			StrCpy(t.ClientAuth->PlainPassword, sizeof(t.ClientAuth->PlainPassword),
13419 				GetParamStr(o, "PASSWORD"));
13420 		}
13421 		else
13422 		{
13423 			// An error has occured
13424 			c->Write(c, _UU("CMD_CascadePasswordSet_Type_Invalid"));
13425 			FreeRpcCreateLink(&t);
13426 			ret = ERR_INVALID_PARAMETER;
13427 			CmdPrintError(c, ret);
13428 			FreeParamValueList(o);
13429 			return ERR_INTERNAL_ERROR;
13430 		}
13431 
13432 		ret = ScSetLink(ps->Rpc, &t);
13433 		if (ret != ERR_NO_ERROR)
13434 		{
13435 			// An error has occured
13436 			CmdPrintError(c, ret);
13437 			FreeParamValueList(o);
13438 			return ret;
13439 		}
13440 
13441 		FreeRpcCreateLink(&t);
13442 	}
13443 
13444 	FreeParamValueList(o);
13445 
13446 	return 0;
13447 }
13448 
13449 // 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)13450 UINT PsCascadeCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13451 {
13452 	LIST *o;
13453 	PS *ps = (PS *)param;
13454 	UINT ret = 0;
13455 	RPC_CREATE_LINK t;
13456 	X *x;
13457 	K *k;
13458 	// Parameter list that can be specified
13459 	PARAM args[] =
13460 	{
13461 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13462 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13463 		{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
13464 		{"LOADKEY", CmdPrompt, _UU("CMD_LOADKEYPATH"), CmdEvalIsFile, NULL},
13465 	};
13466 
13467 	// If virtual HUB is not selected, it's an error
13468 	if (ps->HubName == NULL)
13469 	{
13470 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13471 		return ERR_INVALID_PARAMETER;
13472 	}
13473 
13474 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13475 	if (o == NULL)
13476 	{
13477 		return ERR_INVALID_PARAMETER;
13478 	}
13479 
13480 	if (CmdLoadCertAndKey(c, &x, &k, GetParamUniStr(o, "LOADCERT"), GetParamUniStr(o, "LOADKEY")) == false)
13481 	{
13482 		return ERR_INTERNAL_ERROR;
13483 	}
13484 
13485 	Zero(&t, sizeof(t));
13486 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13487 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13488 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13489 
13490 	// RPC call
13491 	ret = ScGetLink(ps->Rpc, &t);
13492 
13493 	if (ret != ERR_NO_ERROR)
13494 	{
13495 		// An error has occured
13496 		FreeX(x);
13497 		FreeK(k);
13498 		CmdPrintError(c, ret);
13499 		FreeParamValueList(o);
13500 		return ret;
13501 	}
13502 	else
13503 	{
13504 		// Change authentication data
13505 		t.ClientAuth->AuthType = CLIENT_AUTHTYPE_CERT;
13506 		if (t.ClientAuth->ClientX != NULL)
13507 		{
13508 			FreeX(t.ClientAuth->ClientX);
13509 		}
13510 		if (t.ClientAuth->ClientK != NULL)
13511 		{
13512 			FreeK(t.ClientAuth->ClientK);
13513 		}
13514 
13515 		t.ClientAuth->ClientX = x;
13516 		t.ClientAuth->ClientK = k;
13517 
13518 		ret = ScSetLink(ps->Rpc, &t);
13519 		if (ret != ERR_NO_ERROR)
13520 		{
13521 			// An error has occured
13522 			CmdPrintError(c, ret);
13523 			FreeParamValueList(o);
13524 			return ret;
13525 		}
13526 
13527 		FreeRpcCreateLink(&t);
13528 	}
13529 
13530 	FreeParamValueList(o);
13531 
13532 	return 0;
13533 }
13534 
13535 // Get the client certificate to be used in the cascade connection
PsCascadeCertGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13536 UINT PsCascadeCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13537 {
13538 	LIST *o;
13539 	PS *ps = (PS *)param;
13540 	UINT ret = 0;
13541 	RPC_CREATE_LINK t;
13542 	// Parameter list that can be specified
13543 	PARAM args[] =
13544 	{
13545 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13546 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13547 		{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
13548 	};
13549 
13550 	// If virtual HUB is not selected, it's an error
13551 	if (ps->HubName == NULL)
13552 	{
13553 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13554 		return ERR_INVALID_PARAMETER;
13555 	}
13556 
13557 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13558 	if (o == NULL)
13559 	{
13560 		return ERR_INVALID_PARAMETER;
13561 	}
13562 
13563 	Zero(&t, sizeof(t));
13564 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13565 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13566 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13567 
13568 	// RPC call
13569 	ret = ScGetLink(ps->Rpc, &t);
13570 
13571 	if (ret != ERR_NO_ERROR)
13572 	{
13573 		// An error has occured
13574 		CmdPrintError(c, ret);
13575 		FreeParamValueList(o);
13576 		return ret;
13577 	}
13578 	else
13579 	{
13580 		if (t.ClientAuth->AuthType != CLIENT_AUTHTYPE_CERT)
13581 		{
13582 			c->Write(c, _UU("CMD_CascadeCertSet_Not_Auth_Cert"));
13583 			ret = ERR_INTERNAL_ERROR;
13584 		}
13585 		else if (t.ClientAuth->ClientX == NULL)
13586 		{
13587 			c->Write(c, _UU("CMD_CascadeCertSet_Cert_Not_Exists"));
13588 			ret = ERR_INTERNAL_ERROR;
13589 		}
13590 		else
13591 		{
13592 			XToFileW(t.ClientAuth->ClientX, GetParamUniStr(o, "SAVECERT"), true);
13593 		}
13594 		FreeRpcCreateLink(&t);
13595 	}
13596 
13597 	FreeParamValueList(o);
13598 
13599 	return ret;
13600 }
13601 
13602 // Enable encryption of communication at the time of the cascade connection
PsCascadeEncryptEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13603 UINT PsCascadeEncryptEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13604 {
13605 	LIST *o;
13606 	PS *ps = (PS *)param;
13607 	UINT ret = 0;
13608 	RPC_CREATE_LINK t;
13609 	// Parameter list that can be specified
13610 	PARAM args[] =
13611 	{
13612 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13613 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13614 	};
13615 
13616 	// If virtual HUB is not selected, it's an error
13617 	if (ps->HubName == NULL)
13618 	{
13619 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13620 		return ERR_INVALID_PARAMETER;
13621 	}
13622 
13623 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13624 	if (o == NULL)
13625 	{
13626 		return ERR_INVALID_PARAMETER;
13627 	}
13628 
13629 	Zero(&t, sizeof(t));
13630 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13631 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13632 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13633 
13634 	// RPC call
13635 	ret = ScGetLink(ps->Rpc, &t);
13636 
13637 	if (ret != ERR_NO_ERROR)
13638 	{
13639 		// An error has occured
13640 		CmdPrintError(c, ret);
13641 		FreeParamValueList(o);
13642 		return ret;
13643 	}
13644 	else
13645 	{
13646 		// Data change
13647 		t.ClientOption->UseEncrypt = true;
13648 
13649 		ret = ScSetLink(ps->Rpc, &t);
13650 		if (ret != ERR_NO_ERROR)
13651 		{
13652 			// An error has occured
13653 			CmdPrintError(c, ret);
13654 			FreeParamValueList(o);
13655 			return ret;
13656 		}
13657 
13658 		FreeRpcCreateLink(&t);
13659 	}
13660 
13661 	FreeParamValueList(o);
13662 
13663 	return 0;
13664 }
13665 
13666 // Disable encryption of communication at the time of the cascade connection
PsCascadeEncryptDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13667 UINT PsCascadeEncryptDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13668 {
13669 	LIST *o;
13670 	PS *ps = (PS *)param;
13671 	UINT ret = 0;
13672 	RPC_CREATE_LINK t;
13673 	// Parameter list that can be specified
13674 	PARAM args[] =
13675 	{
13676 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13677 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13678 	};
13679 
13680 	// If virtual HUB is not selected, it's an error
13681 	if (ps->HubName == NULL)
13682 	{
13683 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13684 		return ERR_INVALID_PARAMETER;
13685 	}
13686 
13687 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13688 	if (o == NULL)
13689 	{
13690 		return ERR_INVALID_PARAMETER;
13691 	}
13692 
13693 	Zero(&t, sizeof(t));
13694 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13695 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13696 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13697 
13698 	// RPC call
13699 	ret = ScGetLink(ps->Rpc, &t);
13700 
13701 	if (ret != ERR_NO_ERROR)
13702 	{
13703 		// An error has occured
13704 		CmdPrintError(c, ret);
13705 		FreeParamValueList(o);
13706 		return ret;
13707 	}
13708 	else
13709 	{
13710 		// Data change
13711 		t.ClientOption->UseEncrypt = false;
13712 
13713 		ret = ScSetLink(ps->Rpc, &t);
13714 		if (ret != ERR_NO_ERROR)
13715 		{
13716 			// An error has occured
13717 			CmdPrintError(c, ret);
13718 			FreeParamValueList(o);
13719 			return ret;
13720 		}
13721 
13722 		FreeRpcCreateLink(&t);
13723 	}
13724 
13725 	FreeParamValueList(o);
13726 
13727 	return 0;
13728 }
13729 
13730 // Enable data compression at the time of communication of the cascade connection
PsCascadeCompressEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13731 UINT PsCascadeCompressEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13732 {
13733 	LIST *o;
13734 	PS *ps = (PS *)param;
13735 	UINT ret = 0;
13736 	RPC_CREATE_LINK t;
13737 	// Parameter list that can be specified
13738 	PARAM args[] =
13739 	{
13740 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13741 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13742 	};
13743 
13744 	// If virtual HUB is not selected, it's an error
13745 	if (ps->HubName == NULL)
13746 	{
13747 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13748 		return ERR_INVALID_PARAMETER;
13749 	}
13750 
13751 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13752 	if (o == NULL)
13753 	{
13754 		return ERR_INVALID_PARAMETER;
13755 	}
13756 
13757 	Zero(&t, sizeof(t));
13758 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13759 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13760 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13761 
13762 	// RPC call
13763 	ret = ScGetLink(ps->Rpc, &t);
13764 
13765 	if (ret != ERR_NO_ERROR)
13766 	{
13767 		// An error has occured
13768 		CmdPrintError(c, ret);
13769 		FreeParamValueList(o);
13770 		return ret;
13771 	}
13772 	else
13773 	{
13774 		// Data change
13775 		t.ClientOption->UseCompress = true;
13776 
13777 		ret = ScSetLink(ps->Rpc, &t);
13778 		if (ret != ERR_NO_ERROR)
13779 		{
13780 			// An error has occured
13781 			CmdPrintError(c, ret);
13782 			FreeParamValueList(o);
13783 			return ret;
13784 		}
13785 
13786 		FreeRpcCreateLink(&t);
13787 	}
13788 
13789 	FreeParamValueList(o);
13790 
13791 	return 0;
13792 }
13793 
13794 // Disable data compression at the time of communication of the cascade connection
PsCascadeCompressDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13795 UINT PsCascadeCompressDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13796 {
13797 	LIST *o;
13798 	PS *ps = (PS *)param;
13799 	UINT ret = 0;
13800 	RPC_CREATE_LINK t;
13801 	// Parameter list that can be specified
13802 	PARAM args[] =
13803 	{
13804 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13805 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13806 	};
13807 
13808 	// If virtual HUB is not selected, it's an error
13809 	if (ps->HubName == NULL)
13810 	{
13811 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13812 		return ERR_INVALID_PARAMETER;
13813 	}
13814 
13815 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13816 	if (o == NULL)
13817 	{
13818 		return ERR_INVALID_PARAMETER;
13819 	}
13820 
13821 	Zero(&t, sizeof(t));
13822 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13823 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13824 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13825 
13826 	// RPC call
13827 	ret = ScGetLink(ps->Rpc, &t);
13828 
13829 	if (ret != ERR_NO_ERROR)
13830 	{
13831 		// An error has occured
13832 		CmdPrintError(c, ret);
13833 		FreeParamValueList(o);
13834 		return ret;
13835 	}
13836 	else
13837 	{
13838 		// Data change
13839 		t.ClientOption->UseCompress = false;
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 
PsCascadeHttpHeaderAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13858 UINT PsCascadeHttpHeaderAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13859 {
13860 	LIST *o;
13861 	PS *ps = (PS *)param;
13862 	UINT ret = ERR_NO_ERROR;
13863 	RPC_CREATE_LINK t;
13864 
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 		{"NAME", CmdPrompt, _UU("CMD_CascadeHttpHeader_Prompt_Name"), CmdEvalNotEmpty, NULL},
13871 		{"DATA", CmdPrompt, _UU("CMD_CascadeHttpHeader_Prompt_Data"), NULL, NULL},
13872 	};
13873 
13874 	// If virtual HUB is not selected, it's an error
13875 	if (ps->HubName == NULL)
13876 	{
13877 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13878 		return ERR_INVALID_PARAMETER;
13879 	}
13880 
13881 	// Get the parameter list
13882 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13883 	if (o == NULL)
13884 	{
13885 		return ERR_INVALID_PARAMETER;
13886 	}
13887 
13888 	// RPC call
13889 	Zero(&t, sizeof(t));
13890 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13891 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13892 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13893 	ret = ScGetLink(ps->Rpc, &t);
13894 
13895 	if (ret == ERR_NO_ERROR)
13896 	{
13897 		UINT i = 0;
13898 		TOKEN_LIST *tokens = NULL;
13899 		HTTP_HEADER *header = NULL;
13900 		char *name = GetParamStr(o, "NAME");
13901 
13902 		Trim(name);
13903 
13904 		header = NewHttpHeader("", "", "");
13905 
13906 		tokens = ParseToken(t.ClientOption->CustomHttpHeader, "\r\n");
13907 		for (i = 0; i < tokens->NumTokens; i++)
13908 		{
13909 			AddHttpValueStr(header, tokens->Token[i]);
13910 		}
13911 		FreeToken(tokens);
13912 
13913 		if (GetHttpValue(header, name) == NULL)
13914 		{
13915 			char s[HTTP_CUSTOM_HEADER_MAX_SIZE];
13916 			Format(s, sizeof(s), "%s: %s\r\n", name, GetParamStr(o, "DATA"));
13917 			EnSafeHttpHeaderValueStr(s, ' ');
13918 
13919 			if ((StrLen(s) + StrLen(t.ClientOption->CustomHttpHeader)) < sizeof(t.ClientOption->CustomHttpHeader)) {
13920 				StrCat(t.ClientOption->CustomHttpHeader, sizeof(s), s);
13921 				ret = ScSetLink(ps->Rpc, &t);
13922 			}
13923 			else
13924 			{
13925 				// Error has occurred
13926 				ret = ERR_TOO_MANT_ITEMS;
13927 			}
13928 		}
13929 		else
13930 		{
13931 			// Error has occurred
13932 			ret = ERR_OBJECT_EXISTS;
13933 		}
13934 
13935 		FreeHttpHeader(header);
13936 	}
13937 
13938 	if (ret != ERR_NO_ERROR)
13939 	{
13940 		// Error has occurred
13941 		CmdPrintError(c, ret);
13942 	}
13943 
13944 	FreeRpcCreateLink(&t);
13945 
13946 	// Release of the parameter list
13947 	FreeParamValueList(o);
13948 
13949 	return ret;
13950 }
13951 
PsCascadeHttpHeaderDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)13952 UINT PsCascadeHttpHeaderDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
13953 {
13954 	LIST *o;
13955 	PS *ps = (PS *)param;
13956 	UINT ret = ERR_NO_ERROR;
13957 	RPC_CREATE_LINK t;
13958 
13959 	// Parameter list that can be specified
13960 	PARAM args[] =
13961 	{
13962 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
13963 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
13964 		{"NAME", CmdPrompt, _UU("CMD_CascadeHttpHeader_Prompt_Name"), CmdEvalNotEmpty, NULL},
13965 	};
13966 
13967 	// If virtual HUB is not selected, it's an error
13968 	if (ps->HubName == NULL)
13969 	{
13970 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
13971 		return ERR_INVALID_PARAMETER;
13972 	}
13973 
13974 	// Get the parameter list
13975 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
13976 	if (o == NULL)
13977 	{
13978 		return ERR_INVALID_PARAMETER;
13979 	}
13980 
13981 	// RPC call
13982 	Zero(&t, sizeof(t));
13983 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
13984 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
13985 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
13986 	ret = ScGetLink(ps->Rpc, &t);
13987 
13988 	if (ret == ERR_NO_ERROR)
13989 	{
13990 		UINT i = 0;
13991 		TOKEN_LIST *tokens = NULL;
13992 		char *value = GetParamStr(o, "NAME");
13993 
13994 		Zero(t.ClientOption->CustomHttpHeader, sizeof(t.ClientOption->CustomHttpHeader));
13995 
13996 		tokens = ParseToken(t.ClientOption->CustomHttpHeader, "\r\n");
13997 
13998 		for (i = 0; i < tokens->NumTokens; i++)
13999 		{
14000 			if (StartWith(tokens->Token[i], value) == false)
14001 			{
14002 				StrCat(t.ClientOption->CustomHttpHeader, sizeof(t.ClientOption->CustomHttpHeader), tokens->Token[i]);
14003 				StrCat(t.ClientOption->CustomHttpHeader, 1, "\r\n");
14004 			}
14005 		}
14006 
14007 		ret = ScSetLink(ps->Rpc, &t);
14008 	}
14009 	else
14010 	{
14011 		// Error has occurred
14012 		CmdPrintError(c, ret);
14013 	}
14014 
14015 	FreeRpcCreateLink(&t);
14016 
14017 	// Release of the parameter list
14018 	FreeParamValueList(o);
14019 
14020 	return ret;
14021 }
14022 
PsCascadeHttpHeaderGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14023 UINT PsCascadeHttpHeaderGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14024 {
14025 	LIST *o;
14026 	PS *ps = (PS *)param;
14027 	UINT ret = ERR_NO_ERROR;
14028 	RPC_CREATE_LINK t;
14029 
14030 	// Parameter list that can be specified
14031 	PARAM args[] =
14032 	{
14033 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14034 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
14035 	};
14036 
14037 	// If virtual HUB is not selected, it's an error
14038 	if (ps->HubName == NULL)
14039 	{
14040 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
14041 		return ERR_INVALID_PARAMETER;
14042 	}
14043 
14044 	// Get the parameter list
14045 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14046 	if (o == NULL)
14047 	{
14048 		return ERR_INVALID_PARAMETER;
14049 	}
14050 
14051 	// RPC call
14052 	Zero(&t, sizeof(t));
14053 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
14054 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
14055 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
14056 	ret = ScGetLink(ps->Rpc, &t);
14057 
14058 	// Release of the parameter list
14059 	FreeParamValueList(o);
14060 
14061 	if (ret == ERR_NO_ERROR)
14062 	{
14063 		wchar_t unistr[HTTP_CUSTOM_HEADER_MAX_SIZE];
14064 		TOKEN_LIST *tokens = NULL;
14065 		UINT i = 0;
14066 		CT *ct = CtNew();
14067 		CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_1"), false);
14068 
14069 		tokens = ParseToken(t.ClientOption->CustomHttpHeader, "\r\n");
14070 
14071 		for (i = 0; i < tokens->NumTokens; i++)
14072 		{
14073 			StrToUni(unistr, sizeof(unistr), tokens->Token[i]);
14074 			CtInsert(ct, unistr);
14075 		}
14076 
14077 		CtFreeEx(ct, c, false);
14078 	}
14079 	else
14080 	{
14081 		// Error has occurred
14082 		CmdPrintError(c, ret);
14083 	}
14084 
14085 	FreeRpcCreateLink(&t);
14086 
14087 	return ret;
14088 }
14089 
14090 // Set the cascade connection method to the TCP/IP direct connection mode
PsCascadeProxyNone(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14091 UINT PsCascadeProxyNone(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14092 {
14093 	LIST *o;
14094 	PS *ps = (PS *)param;
14095 	UINT ret = 0;
14096 	RPC_CREATE_LINK t;
14097 	// Parameter list that can be specified
14098 	PARAM args[] =
14099 	{
14100 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14101 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
14102 	};
14103 
14104 	// If virtual HUB is not selected, it's an error
14105 	if (ps->HubName == NULL)
14106 	{
14107 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
14108 		return ERR_INVALID_PARAMETER;
14109 	}
14110 
14111 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14112 	if (o == NULL)
14113 	{
14114 		return ERR_INVALID_PARAMETER;
14115 	}
14116 
14117 	Zero(&t, sizeof(t));
14118 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
14119 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
14120 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
14121 
14122 	// RPC call
14123 	ret = ScGetLink(ps->Rpc, &t);
14124 
14125 	if (ret != ERR_NO_ERROR)
14126 	{
14127 		// An error has occured
14128 		CmdPrintError(c, ret);
14129 		FreeParamValueList(o);
14130 		return ret;
14131 	}
14132 	else
14133 	{
14134 		// Data change
14135 		t.ClientOption->ProxyType = PROXY_DIRECT;
14136 
14137 		ret = ScSetLink(ps->Rpc, &t);
14138 		if (ret != ERR_NO_ERROR)
14139 		{
14140 			// An error has occured
14141 			CmdPrintError(c, ret);
14142 			FreeParamValueList(o);
14143 			return ret;
14144 		}
14145 
14146 		FreeRpcCreateLink(&t);
14147 	}
14148 
14149 	FreeParamValueList(o);
14150 
14151 	return 0;
14152 }
14153 
14154 // Set the cascade connection method as the mode via HTTP proxy server
PsCascadeProxyHttp(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14155 UINT PsCascadeProxyHttp(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14156 {
14157 	LIST *o;
14158 	PS *ps = (PS *)param;
14159 	UINT ret = 0;
14160 	RPC_CREATE_LINK t;
14161 	// Parameter list that can be specified
14162 	PARAM args[] =
14163 	{
14164 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14165 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
14166 		{"SERVER", CmdPrompt, _UU("CMD_CascadeProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
14167 		{"USERNAME", NULL, NULL, NULL, NULL},
14168 		{"PASSWORD", NULL, NULL, NULL, NULL},
14169 	};
14170 
14171 	// If virtual HUB is not selected, it's an error
14172 	if (ps->HubName == NULL)
14173 	{
14174 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
14175 		return ERR_INVALID_PARAMETER;
14176 	}
14177 
14178 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14179 	if (o == NULL)
14180 	{
14181 		return ERR_INVALID_PARAMETER;
14182 	}
14183 
14184 	Zero(&t, sizeof(t));
14185 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
14186 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
14187 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
14188 
14189 	// RPC call
14190 	ret = ScGetLink(ps->Rpc, &t);
14191 
14192 	if (ret != ERR_NO_ERROR)
14193 	{
14194 		// An error has occured
14195 		CmdPrintError(c, ret);
14196 		FreeParamValueList(o);
14197 		return ret;
14198 	}
14199 	else
14200 	{
14201 		char *host;
14202 		UINT port;
14203 
14204 		// Data change
14205 		if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))
14206 		{
14207 			t.ClientOption->ProxyType = PROXY_HTTP;
14208 			StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
14209 			t.ClientOption->ProxyPort = port;
14210 			StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
14211 			StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
14212 			Free(host);
14213 		}
14214 
14215 		ret = ScSetLink(ps->Rpc, &t);
14216 		if (ret != ERR_NO_ERROR)
14217 		{
14218 			// An error has occured
14219 			CmdPrintError(c, ret);
14220 			FreeParamValueList(o);
14221 			return ret;
14222 		}
14223 
14224 		FreeRpcCreateLink(&t);
14225 	}
14226 
14227 	FreeParamValueList(o);
14228 
14229 	return 0;
14230 }
14231 
14232 // Set the cascade connection method as the mode via SOCKS4 proxy server
PsCascadeProxySocks(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14233 UINT PsCascadeProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14234 {
14235 	LIST *o;
14236 	PS *ps = (PS *)param;
14237 	UINT ret = 0;
14238 	RPC_CREATE_LINK t;
14239 	// Parameter list that can be specified
14240 	PARAM args[] =
14241 	{
14242 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14243 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
14244 		{"SERVER", CmdPrompt, _UU("CMD_CascadeProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
14245 		{"USERNAME", NULL, NULL, NULL, NULL},
14246 		{"PASSWORD", NULL, NULL, NULL, NULL},
14247 	};
14248 
14249 	// If virtual HUB is not selected, it's an error
14250 	if (ps->HubName == NULL)
14251 	{
14252 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
14253 		return ERR_INVALID_PARAMETER;
14254 	}
14255 
14256 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14257 	if (o == NULL)
14258 	{
14259 		return ERR_INVALID_PARAMETER;
14260 	}
14261 
14262 	Zero(&t, sizeof(t));
14263 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
14264 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
14265 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
14266 
14267 	// RPC call
14268 	ret = ScGetLink(ps->Rpc, &t);
14269 
14270 	if (ret != ERR_NO_ERROR)
14271 	{
14272 		// An error has occured
14273 		CmdPrintError(c, ret);
14274 		FreeParamValueList(o);
14275 		return ret;
14276 	}
14277 	else
14278 	{
14279 		char *host;
14280 		UINT port;
14281 
14282 		// Data change
14283 		if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 1080))
14284 		{
14285 			t.ClientOption->ProxyType = PROXY_SOCKS;
14286 			StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
14287 			t.ClientOption->ProxyPort = port;
14288 			StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
14289 			StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
14290 			Free(host);
14291 		}
14292 
14293 		ret = ScSetLink(ps->Rpc, &t);
14294 		if (ret != ERR_NO_ERROR)
14295 		{
14296 			// An error has occured
14297 			CmdPrintError(c, ret);
14298 			FreeParamValueList(o);
14299 			return ret;
14300 		}
14301 
14302 		FreeRpcCreateLink(&t);
14303 	}
14304 
14305 	FreeParamValueList(o);
14306 
14307 	return 0;
14308 }
14309 
14310 // Set the cascade connection method as the mode via SOCKS5 proxy server
PsCascadeProxySocks5(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14311 UINT PsCascadeProxySocks5(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14312 {
14313 	LIST *o;
14314 	PS *ps = (PS *)param;
14315 	UINT ret = 0;
14316 	RPC_CREATE_LINK t;
14317 	// Parameter list that can be specified
14318 	PARAM args[] =
14319 	{
14320 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14321 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
14322 		{"SERVER", CmdPrompt, _UU("CMD_CascadeProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
14323 		{"USERNAME", NULL, NULL, NULL, NULL},
14324 		{"PASSWORD", NULL, NULL, NULL, NULL},
14325 	};
14326 
14327 	// If virtual HUB is not selected, it's an error
14328 	if (ps->HubName == NULL)
14329 	{
14330 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
14331 		return ERR_INVALID_PARAMETER;
14332 	}
14333 
14334 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14335 	if (o == NULL)
14336 	{
14337 		return ERR_INVALID_PARAMETER;
14338 	}
14339 
14340 	Zero(&t, sizeof(t));
14341 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
14342 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
14343 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
14344 
14345 	// RPC call
14346 	ret = ScGetLink(ps->Rpc, &t);
14347 
14348 	if (ret != ERR_NO_ERROR)
14349 	{
14350 		// An error has occured
14351 		CmdPrintError(c, ret);
14352 		FreeParamValueList(o);
14353 		return ret;
14354 	}
14355 	else
14356 	{
14357 		char *host;
14358 		UINT port;
14359 
14360 		// Data change
14361 		if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 1080))
14362 		{
14363 			t.ClientOption->ProxyType = PROXY_SOCKS5;
14364 			StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
14365 			t.ClientOption->ProxyPort = port;
14366 			StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
14367 			StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
14368 			Free(host);
14369 		}
14370 
14371 		ret = ScSetLink(ps->Rpc, &t);
14372 		if (ret != ERR_NO_ERROR)
14373 		{
14374 			// An error has occured
14375 			CmdPrintError(c, ret);
14376 			FreeParamValueList(o);
14377 			return ret;
14378 		}
14379 
14380 		FreeRpcCreateLink(&t);
14381 	}
14382 
14383 	FreeParamValueList(o);
14384 
14385 	return 0;
14386 }
14387 
14388 // Enable the validation options for the server certificate of cascade connection
PsCascadeServerCertEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14389 UINT PsCascadeServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14390 {
14391 	LIST *o;
14392 	PS *ps = (PS *)param;
14393 	UINT ret = 0;
14394 	RPC_CREATE_LINK t;
14395 	// Parameter list that can be specified
14396 	PARAM args[] =
14397 	{
14398 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14399 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
14400 	};
14401 
14402 	// If virtual HUB is not selected, it's an error
14403 	if (ps->HubName == NULL)
14404 	{
14405 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
14406 		return ERR_INVALID_PARAMETER;
14407 	}
14408 
14409 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14410 	if (o == NULL)
14411 	{
14412 		return ERR_INVALID_PARAMETER;
14413 	}
14414 
14415 	Zero(&t, sizeof(t));
14416 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
14417 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
14418 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
14419 
14420 	// RPC call
14421 	ret = ScGetLink(ps->Rpc, &t);
14422 
14423 	if (ret != ERR_NO_ERROR)
14424 	{
14425 		// An error has occured
14426 		CmdPrintError(c, ret);
14427 		FreeParamValueList(o);
14428 		return ret;
14429 	}
14430 	else
14431 	{
14432 		// Data change
14433 		t.CheckServerCert = true;
14434 
14435 		ret = ScSetLink(ps->Rpc, &t);
14436 		if (ret != ERR_NO_ERROR)
14437 		{
14438 			// An error has occured
14439 			CmdPrintError(c, ret);
14440 			FreeParamValueList(o);
14441 			return ret;
14442 		}
14443 
14444 		FreeRpcCreateLink(&t);
14445 	}
14446 
14447 	FreeParamValueList(o);
14448 
14449 	return 0;
14450 }
14451 
14452 // Disable the validation options for the server certificate of cascade connection
PsCascadeServerCertDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14453 UINT PsCascadeServerCertDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14454 {
14455 	LIST *o;
14456 	PS *ps = (PS *)param;
14457 	UINT ret = 0;
14458 	RPC_CREATE_LINK t;
14459 	// Parameter list that can be specified
14460 	PARAM args[] =
14461 	{
14462 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14463 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
14464 	};
14465 
14466 	// If virtual HUB is not selected, it's an error
14467 	if (ps->HubName == NULL)
14468 	{
14469 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
14470 		return ERR_INVALID_PARAMETER;
14471 	}
14472 
14473 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14474 	if (o == NULL)
14475 	{
14476 		return ERR_INVALID_PARAMETER;
14477 	}
14478 
14479 	Zero(&t, sizeof(t));
14480 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
14481 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
14482 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
14483 
14484 	// RPC call
14485 	ret = ScGetLink(ps->Rpc, &t);
14486 
14487 	if (ret != ERR_NO_ERROR)
14488 	{
14489 		// An error has occured
14490 		CmdPrintError(c, ret);
14491 		FreeParamValueList(o);
14492 		return ret;
14493 	}
14494 	else
14495 	{
14496 		// Data change
14497 		t.CheckServerCert = false;
14498 
14499 		ret = ScSetLink(ps->Rpc, &t);
14500 		if (ret != ERR_NO_ERROR)
14501 		{
14502 			// An error has occured
14503 			CmdPrintError(c, ret);
14504 			FreeParamValueList(o);
14505 			return ret;
14506 		}
14507 
14508 		FreeRpcCreateLink(&t);
14509 	}
14510 
14511 	FreeParamValueList(o);
14512 
14513 	return 0;
14514 }
14515 
14516 // Server-specific certificate settings of cascade connection
PsCascadeServerCertSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14517 UINT PsCascadeServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14518 {
14519 	LIST *o;
14520 	PS *ps = (PS *)param;
14521 	UINT ret = 0;
14522 	RPC_CREATE_LINK t;
14523 	X *x;
14524 	// Parameter list that can be specified
14525 	PARAM args[] =
14526 	{
14527 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14528 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
14529 		{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
14530 	};
14531 
14532 	// If virtual HUB is not selected, it's an error
14533 	if (ps->HubName == NULL)
14534 	{
14535 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
14536 		return ERR_INVALID_PARAMETER;
14537 	}
14538 
14539 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14540 	if (o == NULL)
14541 	{
14542 		return ERR_INVALID_PARAMETER;
14543 	}
14544 
14545 	x = FileToXW(GetParamUniStr(o, "LOADCERT"));
14546 	if (x == NULL)
14547 	{
14548 		FreeParamValueList(o);
14549 		c->Write(c, _UU("CMD_LOADCERT_FAILED"));
14550 		return ERR_INTERNAL_ERROR;
14551 	}
14552 
14553 	Zero(&t, sizeof(t));
14554 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
14555 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
14556 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
14557 
14558 	// RPC call
14559 	ret = ScGetLink(ps->Rpc, &t);
14560 
14561 	if (ret != ERR_NO_ERROR)
14562 	{
14563 		// An error has occured
14564 		CmdPrintError(c, ret);
14565 		FreeParamValueList(o);
14566 		FreeX(x);
14567 		return ret;
14568 	}
14569 	else
14570 	{
14571 		// Data change
14572 		if (t.ServerCert != NULL)
14573 		{
14574 			FreeX(t.ServerCert);
14575 		}
14576 		t.ServerCert = x;
14577 
14578 		ret = ScSetLink(ps->Rpc, &t);
14579 		if (ret != ERR_NO_ERROR)
14580 		{
14581 			// An error has occured
14582 			CmdPrintError(c, ret);
14583 			FreeParamValueList(o);
14584 			return ret;
14585 		}
14586 
14587 		FreeRpcCreateLink(&t);
14588 	}
14589 
14590 	FreeParamValueList(o);
14591 
14592 	return 0;
14593 }
14594 
14595 // Delete the server-specific certificate of cascade connection
PsCascadeServerCertDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14596 UINT PsCascadeServerCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14597 {
14598 	LIST *o;
14599 	PS *ps = (PS *)param;
14600 	UINT ret = 0;
14601 	RPC_CREATE_LINK t;
14602 	// Parameter list that can be specified
14603 	PARAM args[] =
14604 	{
14605 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14606 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
14607 	};
14608 
14609 	// If virtual HUB is not selected, it's an error
14610 	if (ps->HubName == NULL)
14611 	{
14612 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
14613 		return ERR_INVALID_PARAMETER;
14614 	}
14615 
14616 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14617 	if (o == NULL)
14618 	{
14619 		return ERR_INVALID_PARAMETER;
14620 	}
14621 
14622 	Zero(&t, sizeof(t));
14623 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
14624 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
14625 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
14626 
14627 	// RPC call
14628 	ret = ScGetLink(ps->Rpc, &t);
14629 
14630 	if (ret != ERR_NO_ERROR)
14631 	{
14632 		// An error has occured
14633 		CmdPrintError(c, ret);
14634 		FreeParamValueList(o);
14635 		return ret;
14636 	}
14637 	else
14638 	{
14639 		// Data change
14640 		if (t.ServerCert != NULL)
14641 		{
14642 			FreeX(t.ServerCert);
14643 		}
14644 		t.ServerCert = NULL;
14645 
14646 		ret = ScSetLink(ps->Rpc, &t);
14647 		if (ret != ERR_NO_ERROR)
14648 		{
14649 			// An error has occured
14650 			CmdPrintError(c, ret);
14651 			FreeParamValueList(o);
14652 			return ret;
14653 		}
14654 
14655 		FreeRpcCreateLink(&t);
14656 	}
14657 
14658 	FreeParamValueList(o);
14659 
14660 	return 0;
14661 }
14662 
14663 // Get the server-specific certificate of cascade connection
PsCascadeServerCertGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14664 UINT PsCascadeServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14665 {
14666 	LIST *o;
14667 	PS *ps = (PS *)param;
14668 	UINT ret = 0;
14669 	RPC_CREATE_LINK t;
14670 	// Parameter list that can be specified
14671 	PARAM args[] =
14672 	{
14673 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14674 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
14675 		{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
14676 	};
14677 
14678 	// If virtual HUB is not selected, it's an error
14679 	if (ps->HubName == NULL)
14680 	{
14681 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
14682 		return ERR_INVALID_PARAMETER;
14683 	}
14684 
14685 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14686 	if (o == NULL)
14687 	{
14688 		return ERR_INVALID_PARAMETER;
14689 	}
14690 
14691 	Zero(&t, sizeof(t));
14692 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
14693 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
14694 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
14695 
14696 	// RPC call
14697 	ret = ScGetLink(ps->Rpc, &t);
14698 
14699 	if (ret != ERR_NO_ERROR)
14700 	{
14701 		// An error has occured
14702 		CmdPrintError(c, ret);
14703 		FreeParamValueList(o);
14704 		return ret;
14705 	}
14706 	else
14707 	{
14708 		// Save the certificate
14709 		if (t.ServerCert == NULL)
14710 		{
14711 			c->Write(c, _UU("CMD_CERT_NOT_EXISTS"));
14712 			ret = ERR_INTERNAL_ERROR;
14713 		}
14714 		else
14715 		{
14716 			if (XToFileW(t.ServerCert, GetParamUniStr(o, "SAVECERT"), true) == false)
14717 			{
14718 				c->Write(c, _UU("CMD_SAVECERT_FAILED"));
14719 				ret = ERR_INTERNAL_ERROR;
14720 			}
14721 		}
14722 
14723 		FreeRpcCreateLink(&t);
14724 	}
14725 
14726 	FreeParamValueList(o);
14727 
14728 	return ret;
14729 }
14730 
14731 // Set the advanced settings of the cascade connection
PsCascadeDetailSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)14732 UINT PsCascadeDetailSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
14733 {
14734 	LIST *o;
14735 	PS *ps = (PS *)param;
14736 	UINT ret = 0;
14737 	RPC_CREATE_LINK t;
14738 	CMD_EVAL_MIN_MAX mm_maxtcp =
14739 	{
14740 		"CMD_CascadeDetailSet_Eval_MaxTcp", 1, 32
14741 	};
14742 	CMD_EVAL_MIN_MAX mm_interval =
14743 	{
14744 		"CMD_CascadeDetailSet_Eval_Interval", 1, 4294967295UL
14745 	};
14746 	// Parameter list that can be specified
14747 	PARAM args[] =
14748 	{
14749 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
14750 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
14751 		{"MAXTCP", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_MaxTcp"), CmdEvalMinMax, &mm_maxtcp},
14752 		{"INTERVAL", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_Interval"), CmdEvalMinMax, &mm_interval},
14753 		{"TTL", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_TTL"), NULL, NULL},
14754 		{"HALF", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_HALF"), NULL, NULL},
14755 		{"NOQOS", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_NOQOS"), NULL, NULL},
14756 	};
14757 
14758 	// If virtual HUB is not selected, it's an error
14759 	if (ps->HubName == NULL)
14760 	{
14761 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
14762 		return ERR_INVALID_PARAMETER;
14763 	}
14764 
14765 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
14766 	if (o == NULL)
14767 	{
14768 		return ERR_INVALID_PARAMETER;
14769 	}
14770 
14771 	Zero(&t, sizeof(t));
14772 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
14773 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
14774 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
14775 
14776 	// RPC call
14777 	ret = ScGetLink(ps->Rpc, &t);
14778 
14779 	if (ret != ERR_NO_ERROR)
14780 	{
14781 		// An error has occured
14782 		CmdPrintError(c, ret);
14783 		FreeParamValueList(o);
14784 		return ret;
14785 	}
14786 	else
14787 	{
14788 		// Data change
14789 		t.ClientOption->MaxConnection = GetParamInt(o, "MAXTCP");
14790 		t.ClientOption->AdditionalConnectionInterval = GetParamInt(o, "INTERVAL");
14791 		t.ClientOption->ConnectionDisconnectSpan = GetParamInt(o, "TTL");
14792 		t.ClientOption->HalfConnection = GetParamYes(o, "HALF");
14793 		t.ClientOption->DisableQoS = GetParamYes(o, "NOQOS");
14794 
14795 		ret = ScSetLink(ps->Rpc, &t);
14796 		if (ret != ERR_NO_ERROR)
14797 		{
14798 			// An error has occured
14799 			CmdPrintError(c, ret);
14800 			FreeParamValueList(o);
14801 			return ret;
14802 		}
14803 
14804 		FreeRpcCreateLink(&t);
14805 	}
14806 
14807 	FreeParamValueList(o);
14808 
14809 	return 0;
14810 }
14811 
14812 // Show a security policy
PrintPolicy(CONSOLE * c,POLICY * pol,bool cascade_mode)14813 void PrintPolicy(CONSOLE *c, POLICY *pol, bool cascade_mode)
14814 {
14815 	UINT i;
14816 	CT *ct;
14817 	PACK *p;
14818 	// Validate arguments
14819 	if (c == NULL || pol == NULL)
14820 	{
14821 		return;
14822 	}
14823 
14824 	ct = CtNew();
14825 	CtInsertColumn(ct, _UU("CMD_PolicyList_Column_1"), false);
14826 	CtInsertColumn(ct, _UU("CMD_PolicyList_Column_2"), false);
14827 	CtInsertColumn(ct, _UU("CMD_PolicyList_Column_3"), false);
14828 
14829 	p = NewPack();
14830 	OutRpcPolicy(p, pol);
14831 
14832 	// Show the list of all policies
14833 	for (i = 0; i < PolicyNum();i++)
14834 	{
14835 		char name[64];
14836 		wchar_t *tmp;
14837 
14838 		if (cascade_mode == false || PolicyIsSupportedForCascade(i))
14839 		{
14840 			wchar_t value_str[256];
14841 			UINT value;
14842 			char tmp2[256];
14843 
14844 			Format(tmp2, sizeof(tmp2), "policy:%s", PolicyIdToStr(i));
14845 			value = PackGetInt(p, tmp2);
14846 
14847 			tmp = CopyStrToUni(PolicyIdToStr(i));
14848 
14849 			FormatPolicyValue(value_str, sizeof(value_str),
14850 				i, value);
14851 
14852 			Format(name, sizeof(name), "POL_%u", i);
14853 			CtInsert(ct, tmp, _UU(name), value_str);
14854 
14855 			Free(tmp);
14856 		}
14857 	}
14858 
14859 	FreePack(p);
14860 
14861 	CtFree(ct, c);
14862 }
14863 
14864 // Show the security policy list
PrintPolicyList(CONSOLE * c,char * name)14865 void PrintPolicyList(CONSOLE *c, char *name)
14866 {
14867 	UINT id;
14868 	// Validate arguments
14869 	if (c == NULL)
14870 	{
14871 		return;
14872 	}
14873 	if (IsEmptyStr(name))
14874 	{
14875 		name = NULL;
14876 	}
14877 
14878 	if (name != NULL)
14879 	{
14880 		id = PolicyStrToId(name);
14881 		if (id == INFINITE)
14882 		{
14883 			// Invalid ID
14884 			c->Write(c, _UU("CMD_PolicyList_Invalid_Name"));
14885 		}
14886 		else
14887 		{
14888 			wchar_t tmp[MAX_SIZE];
14889 			wchar_t tmp2[MAX_SIZE];
14890 			char name1[64], name2[64];
14891 			wchar_t *title, *descript;
14892 			wchar_t policy_name[MAX_SIZE];
14893 
14894 			Format(name1, sizeof(name1), "POL_%u", id);
14895 			Format(name2, sizeof(name2), "POL_EX_%u", id);
14896 
14897 			title = _UU(name1);
14898 			descript = _UU(name2);
14899 
14900 			StrToUni(policy_name, sizeof(policy_name), PolicyIdToStr(id));
14901 
14902 			// Policy name
14903 			c->Write(c, _UU("CMD_PolicyList_Help_1"));
14904 			UniFormat(tmp2, sizeof(tmp2), L" %s", policy_name);
14905 			c->Write(c, tmp2);
14906 			c->Write(c, L"");
14907 
14908 			// Simple description of the policy
14909 			c->Write(c, _UU("CMD_PolicyList_Help_2"));
14910 			UniFormat(tmp2, sizeof(tmp2), L" %s", title);
14911 			c->Write(c, tmp2);
14912 			c->Write(c, L"");
14913 
14914 			// Range of the value that can be set
14915 			GetPolicyValueRangeStr(tmp, sizeof(tmp), id);
14916 			c->Write(c, _UU("CMD_PolicyList_Help_3"));
14917 			UniFormat(tmp2, sizeof(tmp2), L" %s", tmp);
14918 			c->Write(c, tmp2);
14919 			c->Write(c, L"");
14920 
14921 			// Default value
14922 			FormatPolicyValue(tmp, sizeof(tmp), id, GetPolicyItem(id)->DefaultValue);
14923 			c->Write(c, _UU("CMD_PolicyList_Help_4"));
14924 			UniFormat(tmp2, sizeof(tmp2), L" %s", tmp);
14925 			c->Write(c, tmp2);
14926 			c->Write(c, L"");
14927 
14928 			// Detailed description of the policy
14929 			c->Write(c, _UU("CMD_PolicyList_Help_5"));
14930 			c->Write(c, descript);
14931 			c->Write(c, L"");
14932 		}
14933 	}
14934 	else
14935 	{
14936 		UINT i;
14937 		CT *ct = CtNew();
14938 		CtInsertColumn(ct, _UU("CMD_PolicyList_Column_1"), false);
14939 		CtInsertColumn(ct, _UU("CMD_PolicyList_Column_2"), false);
14940 
14941 		// Show the list of all policies
14942 		for (i = 0; i < PolicyNum();i++)
14943 		{
14944 			char name[64];
14945 			wchar_t *tmp;
14946 
14947 			tmp = CopyStrToUni(PolicyIdToStr(i));
14948 
14949 			Format(name, sizeof(name), "POL_%u", i);
14950 			CtInsert(ct, tmp, _UU(name));
14951 
14952 			Free(tmp);
14953 		}
14954 
14955 		CtFree(ct, c);
14956 	}
14957 }
14958 
14959 // Editing the contents of the policy
EditPolicy(CONSOLE * c,POLICY * pol,char * name,char * value,bool cascade_mode)14960 bool EditPolicy(CONSOLE *c, POLICY *pol, char *name, char *value, bool cascade_mode)
14961 {
14962 	PACK *p;
14963 	ELEMENT *e;
14964 	POLICY_ITEM *item;
14965 	UINT id;
14966 	wchar_t tmp[MAX_SIZE];
14967 	wchar_t tmp2[MAX_SIZE];
14968 	char pack_name[128];
14969 	// Validate arguments
14970 	if (c == NULL || pol == NULL || name == NULL || value == NULL)
14971 	{
14972 		return false;
14973 	}
14974 
14975 	p = NewPack();
14976 
14977 	OutRpcPolicy(p, pol);
14978 
14979 	Format(pack_name, sizeof(pack_name), "policy:%s", PolicyIdToStr(PolicyStrToId(name)));
14980 
14981 	if ((e = GetElement(p, pack_name, VALUE_INT)) == NULL || (id = PolicyStrToId(name)) == INFINITE)
14982 	{
14983 		UniFormat(tmp, sizeof(tmp), _UU("CMD_CascadePolicySet_Invalid_Name"), name);
14984 		c->Write(c, tmp);
14985 		FreePack(p);
14986 		return false;
14987 	}
14988 
14989 	if (cascade_mode && (PolicyIsSupportedForCascade(id) == false))
14990 	{
14991 		UniFormat(tmp, sizeof(tmp), _UU("CMD_CascadePolicySet_Invalid_Name_For_Cascade"), name);
14992 		c->Write(c, tmp);
14993 		FreePack(p);
14994 		return false;
14995 	}
14996 
14997 	item = GetPolicyItem(id);
14998 
14999 	if (item->TypeInt == false)
15000 	{
15001 		// bool type
15002 		e->values[0]->IntValue = (
15003 			StartWith(value, "y") || StartWith(value, "t") ||
15004 			ToInt(value) != 0) ? 1 : 0;
15005 	}
15006 	else
15007 	{
15008 		UINT n = ToInt(value);
15009 		bool b = true;
15010 
15011 		// int type
15012 		GetPolicyValueRangeStr(tmp, sizeof(tmp), id);
15013 
15014 		if (item->AllowZero == false)
15015 		{
15016 			if (n == 0)
15017 			{
15018 				b = false;
15019 			}
15020 		}
15021 
15022 		if (n != 0 && (n < item->MinValue || n > item->MaxValue))
15023 		{
15024 			b = false;
15025 		}
15026 
15027 		if (b == false)
15028 		{
15029 			UniFormat(tmp2, sizeof(tmp2), _UU("CMD_CascadePolicySet_Invalid_Range"), PolicyIdToStr(id), tmp);
15030 			c->Write(c, tmp2);
15031 			FreePack(p);
15032 			return false;
15033 		}
15034 
15035 		e->values[0]->IntValue = n;
15036 	}
15037 
15038 	Zero(pol, sizeof(POLICY));
15039 
15040 	InRpcPolicy(pol, p);
15041 
15042 	FreePack(p);
15043 
15044 	return true;
15045 }
15046 
15047 // Show the list of the type of security policy and possible values
PsPolicyList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15048 UINT PsPolicyList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15049 {
15050 	LIST *o;
15051 	PARAM args[] =
15052 	{
15053 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
15054 		{"[name]", NULL, NULL, NULL, NULL}
15055 	};
15056 
15057 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
15058 	if (o == NULL)
15059 	{
15060 		return ERR_INVALID_PARAMETER;
15061 	}
15062 
15063 	PrintPolicyList(c, GetParamStr(o, "[name]"));
15064 
15065 	FreeParamValueList(o);
15066 
15067 	return ERR_NO_ERROR;
15068 }
15069 
15070 // Set the security policy of the cascade session
PsCascadePolicySet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15071 UINT PsCascadePolicySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15072 {
15073 	LIST *o;
15074 	PS *ps = (PS *)param;
15075 	UINT ret = 0;
15076 	RPC_CREATE_LINK t;
15077 	// Parameter list that can be specified
15078 	PARAM args[] =
15079 	{
15080 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
15081 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
15082 		{"NAME", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLNAME"), CmdEvalNotEmpty, NULL},
15083 		{"VALUE", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLVALUE"), CmdEvalNotEmpty, NULL},
15084 	};
15085 
15086 	// If virtual HUB is not selected, it's an error
15087 	if (ps->HubName == NULL)
15088 	{
15089 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
15090 		return ERR_INVALID_PARAMETER;
15091 	}
15092 
15093 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
15094 	if (o == NULL)
15095 	{
15096 		return ERR_INVALID_PARAMETER;
15097 	}
15098 
15099 	Zero(&t, sizeof(t));
15100 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
15101 	t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
15102 	UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
15103 
15104 	// RPC call
15105 	ret = ScGetLink(ps->Rpc, &t);
15106 
15107 	if (ret != ERR_NO_ERROR)
15108 	{
15109 		// An error has occured
15110 		CmdPrintError(c, ret);
15111 		FreeParamValueList(o);
15112 		return ret;
15113 	}
15114 	else
15115 	{
15116 		if (EditPolicy(c, &t.Policy, GetParamStr(o, "NAME"), GetParamStr(o, "VALUE"), true) == false)
15117 		{
15118 			// An error has occured
15119 			FreeRpcCreateLink(&t);
15120 			FreeParamValueList(o);
15121 			return ERR_INTERNAL_ERROR;
15122 		}
15123 
15124 		ret = ScSetLink(ps->Rpc, &t);
15125 		if (ret != ERR_NO_ERROR)
15126 		{
15127 			// An error has occured
15128 			CmdPrintError(c, ret);
15129 			FreeParamValueList(o);
15130 			return ret;
15131 		}
15132 
15133 		FreeRpcCreateLink(&t);
15134 	}
15135 
15136 	FreeParamValueList(o);
15137 
15138 	return 0;
15139 }
15140 
15141 // Display the status information of the session
CmdPrintStatusToListView(CT * ct,RPC_CLIENT_GET_CONNECTION_STATUS * s)15142 void CmdPrintStatusToListView(CT *ct, RPC_CLIENT_GET_CONNECTION_STATUS *s)
15143 {
15144 	CmdPrintStatusToListViewEx(ct, s, false);
15145 }
CmdPrintStatusToListViewEx(CT * ct,RPC_CLIENT_GET_CONNECTION_STATUS * s,bool server_mode)15146 void CmdPrintStatusToListViewEx(CT *ct, RPC_CLIENT_GET_CONNECTION_STATUS *s, bool server_mode)
15147 {
15148 	wchar_t tmp[MAX_SIZE];
15149 	char str[MAX_SIZE];
15150 	char vv[128];
15151 	// Validate arguments
15152 	if (s == NULL)
15153 	{
15154 		return;
15155 	}
15156 
15157 	if (server_mode == false)
15158 	{
15159 		CtInsert(ct, _UU("CM_ST_ACCOUNT_NAME"), s->AccountName);
15160 
15161 		if (s->Connected == false)
15162 		{
15163 			wchar_t *st = _UU("CM_ST_CONNECTED_FALSE");
15164 			switch (s->SessionStatus)
15165 			{
15166 			case CLIENT_STATUS_CONNECTING:
15167 				st = _UU("CM_ST_CONNECTING");
15168 				break;
15169 			case CLIENT_STATUS_NEGOTIATION:
15170 				st = _UU("CM_ST_NEGOTIATION");
15171 				break;
15172 			case CLIENT_STATUS_AUTH:
15173 				st = _UU("CM_ST_AUTH");
15174 				break;
15175 			case CLIENT_STATUS_ESTABLISHED:
15176 				st = _UU("CM_ST_ESTABLISHED");
15177 				break;
15178 			case CLIENT_STATUS_RETRY:
15179 				st = _UU("CM_ST_RETRY");
15180 				break;
15181 			case CLIENT_STATUS_IDLE:
15182 				st = _UU("CM_ST_IDLE");
15183 				break;
15184 			}
15185 			CtInsert(ct, _UU("CM_ST_CONNECTED"), st);
15186 		}
15187 		else
15188 		{
15189 			CtInsert(ct, _UU("CM_ST_CONNECTED"), _UU("CM_ST_CONNECTED_TRUE"));
15190 		}
15191 	}
15192 
15193 	if (s->Connected)
15194 	{
15195 		if (s->VLanId == 0)
15196 		{
15197 			UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_NO_VLAN"));
15198 		}
15199 		else
15200 		{
15201 			UniToStru(tmp, s->VLanId);
15202 		}
15203 
15204 		CtInsert(ct, _UU("CM_ST_VLAN_ID"), tmp);
15205 
15206 		if (server_mode == false)
15207 		{
15208 			StrToUni(tmp, sizeof(tmp), s->ServerName);
15209 			CtInsert(ct, _UU("CM_ST_SERVER_NAME"), tmp);
15210 
15211 			UniFormat(tmp, sizeof(tmp), _UU("CM_ST_PORT_TCP"), s->ServerPort);
15212 			CtInsert(ct, _UU("CM_ST_SERVER_PORT"), tmp);
15213 		}
15214 
15215 		StrToUni(tmp, sizeof(tmp), s->ServerProductName);
15216 		CtInsert(ct, _UU("CM_ST_SERVER_P_NAME"), tmp);
15217 
15218 		UniFormat(tmp, sizeof(tmp), L"%u.%02u", s->ServerProductVer / 100, s->ServerProductVer % 100);
15219 		CtInsert(ct, _UU("CM_ST_SERVER_P_VER"), tmp);
15220 		UniFormat(tmp, sizeof(tmp), L"Build %u", s->ServerProductBuild);
15221 		CtInsert(ct, _UU("CM_ST_SERVER_P_BUILD"), tmp);
15222 	}
15223 
15224 	GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->StartTime), NULL);
15225 	CtInsert(ct, _UU("CM_ST_START_TIME"), tmp);
15226 	/* !!! Do not correct the spelling to keep the backward protocol compatibility !!!  */
15227 	GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->FirstConnectionEstablisiedTime), NULL);
15228 	/* !!! Do not correct the spelling to keep the backward protocol compatibility !!!  */
15229 	CtInsert(ct, _UU("CM_ST_FIRST_ESTAB_TIME"), s->FirstConnectionEstablisiedTime == 0 ? _UU("CM_ST_NONE") : tmp);
15230 
15231 	if (s->Connected)
15232 	{
15233 		GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->CurrentConnectionEstablishTime), NULL);
15234 		CtInsert(ct, _UU("CM_ST_CURR_ESTAB_TIME"), tmp);
15235 	}
15236 
15237 	if (server_mode == false)
15238 	{
15239 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_STR"), s->NumConnectionsEstablished);
15240 		CtInsert(ct, _UU("CM_ST_NUM_ESTABLISHED"), tmp);
15241 	}
15242 
15243 	if (s->Connected)
15244 	{
15245 		CtInsert(ct, _UU("CM_ST_HALF_CONNECTION"), s->HalfConnection ? _UU("CM_ST_HALF_TRUE") : _UU("CM_ST_HALF_FALSE"));
15246 
15247 		CtInsert(ct, _UU("CM_ST_QOS"), s->QoS ? _UU("CM_ST_QOS_TRUE") : _UU("CM_ST_QOS_FALSE"));
15248 
15249 		UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnections);
15250 		CtInsert(ct, _UU("CM_ST_NUM_TCP"), tmp);
15251 
15252 		if (s->HalfConnection)
15253 		{
15254 			UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnectionsUpload);
15255 			CtInsert(ct, _UU("CM_ST_NUM_TCP_UPLOAD"), tmp);
15256 			UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnectionsDownload);
15257 			CtInsert(ct, _UU("CM_ST_NUM_TCP_DOWNLOAD"), tmp);
15258 		}
15259 
15260 		UniFormat(tmp, sizeof(tmp), L"%u", s->MaxTcpConnections);
15261 		CtInsert(ct, _UU("CM_ST_MAX_TCP"), tmp);
15262 
15263 		if (s->UseEncrypt == false)
15264 		{
15265 			UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_FALSE"));
15266 		}
15267 		else
15268 		{
15269 			if (StrLen(s->CipherName) != 0)
15270 			{
15271 				UniFormat(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_TRUE"), s->CipherName);
15272 			}
15273 			else
15274 			{
15275 				UniFormat(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_TRUE2"));
15276 			}
15277 		}
15278 		CtInsert(ct, _UU("CM_ST_USE_ENCRYPT"), tmp);
15279 
15280 		if (s->UseCompress)
15281 		{
15282 			UINT percent = 0;
15283 			if ((s->TotalRecvSize + s->TotalSendSize) > 0)
15284 			{
15285 				percent = (UINT)((UINT64)100 - (UINT64)(s->TotalRecvSizeReal + s->TotalSendSizeReal) * (UINT64)100 /
15286 					(s->TotalRecvSize + s->TotalSendSize));
15287 				percent = MAKESURE(percent, 0, 100);
15288 			}
15289 
15290 			UniFormat(tmp, sizeof(tmp), _UU("CM_ST_COMPRESS_TRUE"), percent);
15291 		}
15292 		else
15293 		{
15294 			UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_COMPRESS_FALSE"));
15295 		}
15296 		CtInsert(ct, _UU("CM_ST_USE_COMPRESS"), tmp);
15297 
15298 		if (IsEmptyStr(s->UnderlayProtocol) == false)
15299 		{
15300 			StrToUni(tmp, sizeof(tmp), s->UnderlayProtocol);
15301 			CtInsert(ct, _UU("CM_ST_UNDERLAY_PROTOCOL"), tmp);
15302 		}
15303 
15304 		if (IsEmptyStr(s->ProtocolDetails) == false)
15305 		{
15306 			StrToUni(tmp, sizeof(tmp), s->ProtocolDetails);
15307 			CtInsert(ct, _UU("CM_ST_PROTOCOL_DETAILS"), tmp);
15308 		}
15309 
15310 		CtInsert(ct, _UU("CM_ST_UDP_ACCEL_ENABLED"), (s->IsUdpAccelerationEnabled ? _UU("CM_ST_YES") : _UU("CM_ST_NO")));
15311 		CtInsert(ct, _UU("CM_ST_UDP_ACCEL_USING"), (s->IsUsingUdpAcceleration ? _UU("CM_ST_YES") : _UU("CM_ST_NO")));
15312 
15313 		StrToUni(tmp, sizeof(tmp), s->SessionName);
15314 		CtInsert(ct, _UU("CM_ST_SESSION_NAME"), tmp);
15315 
15316 		StrToUni(tmp, sizeof(tmp), s->ConnectionName);
15317 		if (UniStrCmpi(tmp, L"INITING") != 0)
15318 		{
15319 			CtInsert(ct, _UU("CM_ST_CONNECTION_NAME"), tmp);
15320 		}
15321 
15322 		BinToStr(str, sizeof(str), s->SessionKey, sizeof(s->SessionKey));
15323 		StrToUni(tmp, sizeof(tmp), str);
15324 		CtInsert(ct, _UU("CM_ST_SESSION_KEY"), tmp);
15325 
15326 		CtInsert(ct, _UU("CM_ST_BRIDGE_MODE"), s->IsBridgeMode ? _UU("CM_ST_YES") : _UU("CM_ST_NO"));
15327 
15328 		CtInsert(ct, _UU("CM_ST_MONITOR_MODE"), s->IsMonitorMode ? _UU("CM_ST_YES") : _UU("CM_ST_NO"));
15329 
15330 		ToStr3(vv, sizeof(vv), s->TotalSendSize);
15331 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
15332 		CtInsert(ct, _UU("CM_ST_SEND_SIZE"), tmp);
15333 
15334 		ToStr3(vv, sizeof(vv), s->TotalRecvSize);
15335 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
15336 		CtInsert(ct, _UU("CM_ST_RECV_SIZE"), tmp);
15337 
15338 		ToStr3(vv, sizeof(vv), s->Traffic.Send.UnicastCount);
15339 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
15340 		CtInsert(ct, _UU("CM_ST_SEND_UCAST_NUM"), tmp);
15341 
15342 		ToStr3(vv, sizeof(vv), s->Traffic.Send.UnicastBytes);
15343 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
15344 		CtInsert(ct, _UU("CM_ST_SEND_UCAST_SIZE"), tmp);
15345 
15346 		ToStr3(vv, sizeof(vv), s->Traffic.Send.BroadcastCount);
15347 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
15348 		CtInsert(ct, _UU("CM_ST_SEND_BCAST_NUM"), tmp);
15349 
15350 		ToStr3(vv, sizeof(vv), s->Traffic.Send.BroadcastBytes);
15351 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
15352 		CtInsert(ct, _UU("CM_ST_SEND_BCAST_SIZE"), tmp);
15353 
15354 		ToStr3(vv, sizeof(vv), s->Traffic.Recv.UnicastCount);
15355 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
15356 		CtInsert(ct, _UU("CM_ST_RECV_UCAST_NUM"), tmp);
15357 
15358 		ToStr3(vv, sizeof(vv), s->Traffic.Recv.UnicastBytes);
15359 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
15360 		CtInsert(ct, _UU("CM_ST_RECV_UCAST_SIZE"), tmp);
15361 
15362 		ToStr3(vv, sizeof(vv), s->Traffic.Recv.BroadcastCount);
15363 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
15364 		CtInsert(ct, _UU("CM_ST_RECV_BCAST_NUM"), tmp);
15365 
15366 		ToStr3(vv, sizeof(vv), s->Traffic.Recv.BroadcastBytes);
15367 		UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
15368 		CtInsert(ct, _UU("CM_ST_RECV_BCAST_SIZE"), tmp);
15369 	}
15370 }
15371 
15372 // Get the current state of the cascade connection
PsCascadeStatusGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15373 UINT PsCascadeStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15374 {
15375 	LIST *o;
15376 	PS *ps = (PS *)param;
15377 	UINT ret = 0;
15378 	RPC_LINK_STATUS t;
15379 	// Parameter list that can be specified
15380 	PARAM args[] =
15381 	{
15382 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
15383 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
15384 	};
15385 
15386 	// If virtual HUB is not selected, it's an error
15387 	if (ps->HubName == NULL)
15388 	{
15389 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
15390 		return ERR_INVALID_PARAMETER;
15391 	}
15392 
15393 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
15394 	if (o == NULL)
15395 	{
15396 		return ERR_INVALID_PARAMETER;
15397 	}
15398 
15399 	Zero(&t, sizeof(t));
15400 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
15401 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
15402 
15403 	// RPC call
15404 	ret = ScGetLinkStatus(ps->Rpc, &t);
15405 
15406 	if (ret != ERR_NO_ERROR)
15407 	{
15408 		// An error has occured
15409 		CmdPrintError(c, ret);
15410 		FreeParamValueList(o);
15411 		return ret;
15412 	}
15413 	else
15414 	{
15415 		// Get the cascade connection state
15416 		CT *ct = CtNewStandard();
15417 
15418 		CmdPrintStatusToListView(ct, &t.Status);
15419 
15420 		CtFree(ct, c);
15421 
15422 		FreeRpcLinkStatus(&t);
15423 	}
15424 
15425 	FreeParamValueList(o);
15426 
15427 	return 0;
15428 }
15429 
15430 // Rename the cascade connection
PsCascadeRename(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15431 UINT PsCascadeRename(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15432 {
15433 	LIST *o;
15434 	PS *ps = (PS *)param;
15435 	UINT ret = 0;
15436 	RPC_RENAME_LINK t;
15437 	// Parameter list that can be specified
15438 	PARAM args[] =
15439 	{
15440 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
15441 		{"[name]", CmdPrompt, _UU("CMD_CascadeRename_PROMPT_OLD"), CmdEvalNotEmpty, NULL},
15442 		{"NEW", CmdPrompt, _UU("CMD_CascadeRename_PROMPT_NEW"), CmdEvalNotEmpty, NULL},
15443 	};
15444 
15445 	// If virtual HUB is not selected, it's an error
15446 	if (ps->HubName == NULL)
15447 	{
15448 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
15449 		return ERR_INVALID_PARAMETER;
15450 	}
15451 
15452 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
15453 	if (o == NULL)
15454 	{
15455 		return ERR_INVALID_PARAMETER;
15456 	}
15457 
15458 	Zero(&t, sizeof(t));
15459 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
15460 
15461 	UniStrCpy(t.NewAccountName, sizeof(t.NewAccountName), GetParamUniStr(o, "NEW"));
15462 	UniStrCpy(t.OldAccountName, sizeof(t.OldAccountName), GetParamUniStr(o, "[name]"));
15463 
15464 	// RPC call
15465 	ret = ScRenameLink(ps->Rpc, &t);
15466 
15467 	if (ret != ERR_NO_ERROR)
15468 	{
15469 		// An error has occured
15470 		CmdPrintError(c, ret);
15471 		FreeParamValueList(o);
15472 		return ret;
15473 	}
15474 
15475 	FreeParamValueList(o);
15476 
15477 	return 0;
15478 }
15479 
15480 // Set the cascade connection to on-line state
PsCascadeOnline(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15481 UINT PsCascadeOnline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15482 {
15483 	LIST *o;
15484 	PS *ps = (PS *)param;
15485 	UINT ret = 0;
15486 	RPC_LINK t;
15487 	// Parameter list that can be specified
15488 	PARAM args[] =
15489 	{
15490 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
15491 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
15492 	};
15493 
15494 	// If virtual HUB is not selected, it's an error
15495 	if (ps->HubName == NULL)
15496 	{
15497 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
15498 		return ERR_INVALID_PARAMETER;
15499 	}
15500 
15501 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
15502 	if (o == NULL)
15503 	{
15504 		return ERR_INVALID_PARAMETER;
15505 	}
15506 
15507 	Zero(&t, sizeof(t));
15508 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
15509 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
15510 
15511 	// RPC call
15512 	ret = ScSetLinkOnline(ps->Rpc, &t);
15513 
15514 	if (ret != ERR_NO_ERROR)
15515 	{
15516 		// An error has occured
15517 		CmdPrintError(c, ret);
15518 		FreeParamValueList(o);
15519 		return ret;
15520 	}
15521 
15522 	FreeParamValueList(o);
15523 
15524 	return 0;
15525 }
15526 
15527 // Set the cascade connection to the off-line state
PsCascadeOffline(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15528 UINT PsCascadeOffline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15529 {
15530 	LIST *o;
15531 	PS *ps = (PS *)param;
15532 	UINT ret = 0;
15533 	RPC_LINK t;
15534 	// Parameter list that can be specified
15535 	PARAM args[] =
15536 	{
15537 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
15538 		{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
15539 	};
15540 
15541 	// If virtual HUB is not selected, it's an error
15542 	if (ps->HubName == NULL)
15543 	{
15544 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
15545 		return ERR_INVALID_PARAMETER;
15546 	}
15547 
15548 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
15549 	if (o == NULL)
15550 	{
15551 		return ERR_INVALID_PARAMETER;
15552 	}
15553 
15554 	Zero(&t, sizeof(t));
15555 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
15556 	UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
15557 
15558 	// RPC call
15559 	ret = ScSetLinkOffline(ps->Rpc, &t);
15560 
15561 	if (ret != ERR_NO_ERROR)
15562 	{
15563 		// An error has occured
15564 		CmdPrintError(c, ret);
15565 		FreeParamValueList(o);
15566 		return ret;
15567 	}
15568 
15569 	FreeParamValueList(o);
15570 
15571 	return 0;
15572 }
15573 
15574 // Convert the string to pass / discard flag
StrToPassOrDiscard(char * str)15575 bool StrToPassOrDiscard(char *str)
15576 {
15577 	// Validate arguments
15578 	if (str == NULL)
15579 	{
15580 		return false;
15581 	}
15582 
15583 	if (ToInt(str) != 0)
15584 	{
15585 		return true;
15586 	}
15587 
15588 	if (StartWith(str, "p") || StartWith(str, "y") || StartWith(str, "t"))
15589 	{
15590 		return true;
15591 	}
15592 
15593 	return false;
15594 }
15595 
15596 // Convert the string to the protocol
StrToProtocol(char * str)15597 UINT StrToProtocol(char *str)
15598 {
15599 	if (IsEmptyStr(str))
15600 	{
15601 		return 0;
15602 	}
15603 
15604 	if (StartWith("ip", str))
15605 	{
15606 		return 0;
15607 	}
15608 	else if (StartWith("tcp", str))
15609 	{
15610 		return IP_PROTO_TCP;
15611 	}
15612 	else if (StartWith("udp", str))
15613 	{
15614 		return IP_PROTO_UDP;
15615 	}
15616 	else if (StartWith("icmpv4", str))
15617 	{
15618 		return IP_PROTO_ICMPV4;
15619 	}
15620 	else if (StartWith("icmpv6", str))
15621 	{
15622 		return IP_PROTO_ICMPV6;
15623 	}
15624 
15625 	if (ToInt(str) == 0)
15626 	{
15627 		if (StrCmpi(str, "0") == 0)
15628 		{
15629 			return 0;
15630 		}
15631 		else
15632 		{
15633 			return INFINITE;
15634 		}
15635 	}
15636 
15637 	if (ToInt(str) >= 256)
15638 	{
15639 		return INFINITE;
15640 	}
15641 
15642 	return ToInt(str);
15643 }
15644 
15645 // Check the protocol name
CmdEvalProtocol(CONSOLE * c,wchar_t * str,void * param)15646 bool CmdEvalProtocol(CONSOLE *c, wchar_t *str, void *param)
15647 {
15648 	char tmp[64];
15649 	// Validate arguments
15650 	if (c == NULL || str == NULL)
15651 	{
15652 		return false;
15653 	}
15654 
15655 	UniToStr(tmp, sizeof(tmp), str);
15656 
15657 	if (StrToProtocol(tmp) == INFINITE)
15658 	{
15659 		c->Write(c, _UU("CMD_PROTOCOL_EVAL_FAILED"));
15660 		return false;
15661 	}
15662 
15663 	return true;
15664 }
15665 
15666 // Parse the port range
ParsePortRange(char * str,UINT * start,UINT * end)15667 bool ParsePortRange(char *str, UINT *start, UINT *end)
15668 {
15669 	UINT a = 0, b = 0;
15670 	TOKEN_LIST *t;
15671 	// Validate arguments
15672 	if (str == NULL)
15673 	{
15674 		return false;
15675 	}
15676 
15677 	if (IsEmptyStr(str) == false)
15678 	{
15679 
15680 		t = ParseToken(str, "\t -");
15681 
15682 		if (t->NumTokens == 1)
15683 		{
15684 			a = b = ToInt(t->Token[0]);
15685 		}
15686 		else if (t->NumTokens == 2)
15687 		{
15688 			a = ToInt(t->Token[0]);
15689 			b = ToInt(t->Token[1]);
15690 		}
15691 
15692 		FreeToken(t);
15693 
15694 		if (a > b)
15695 		{
15696 			return false;
15697 		}
15698 
15699 		if (a >= 65536 || b >= 65536)
15700 		{
15701 			return false;
15702 		}
15703 
15704 		if (a == 0 && b != 0)
15705 		{
15706 			return false;
15707 		}
15708 	}
15709 
15710 	if (start != NULL)
15711 	{
15712 		*start = a;
15713 	}
15714 	if (end != NULL)
15715 	{
15716 		*end = b;
15717 	}
15718 
15719 	return true;
15720 }
15721 
15722 // Check the port range
CmdEvalPortRange(CONSOLE * c,wchar_t * str,void * param)15723 bool CmdEvalPortRange(CONSOLE *c, wchar_t *str, void *param)
15724 {
15725 	char tmp[64];
15726 	// Validate arguments
15727 	if (c == NULL || str == NULL)
15728 	{
15729 		return false;
15730 	}
15731 
15732 	UniToStr(tmp, sizeof(tmp), str);
15733 
15734 	if (ParsePortRange(tmp, NULL, NULL) == false)
15735 	{
15736 		c->Write(c, _UU("CMD_PORT_RANGE_EVAL_FAILED"));
15737 		return false;
15738 	}
15739 
15740 	return true;
15741 }
15742 
15743 // Parse the MAC address and the mask
ParseMacAddressAndMask(char * src,bool * check_mac,UCHAR * mac_bin,UCHAR * mask_bin)15744 bool ParseMacAddressAndMask(char *src, bool *check_mac, UCHAR *mac_bin, UCHAR *mask_bin)
15745 {
15746 	TOKEN_LIST *t;
15747 	char *macstr, *maskstr;
15748 	UCHAR mac[6], mask[6];
15749 	bool ok = false;
15750 
15751 	// Validate arguments
15752 	if (src == NULL)
15753 	{
15754 		return false;
15755 	}
15756 
15757 	//Zero(mac, sizeof(mac));
15758 	//Zero(mask, sizeof(mask));
15759 
15760 	if(check_mac != NULL && mac_bin != NULL && mask_bin != NULL)
15761 	{
15762 		ok = true;
15763 	}
15764 	if(IsEmptyStr(src) != false)
15765 	{
15766 		if(ok != false)
15767 		{
15768 			*check_mac = false;
15769 			Zero(mac_bin, 6);
15770 			Zero(mask_bin, 6);
15771 		}
15772 		return true;
15773 	}
15774 
15775 	t = ParseToken(src, "/");
15776 	if(t->NumTokens != 2)
15777 	{
15778 		FreeToken(t);
15779 		return false;
15780 	}
15781 
15782 	macstr = t->Token[0];
15783 	maskstr = t->Token[1];
15784 
15785 	Trim(macstr);
15786 	Trim(maskstr);
15787 
15788 	if(StrToMac(mac, macstr) == false || StrToMac(mask, maskstr) == false)
15789 	{
15790 		FreeToken(t);
15791 		return false;
15792 	}
15793 	else
15794 	{
15795 		if(ok != false)
15796 		{
15797 			Copy(mac_bin, mac, 6);
15798 			Copy(mask_bin, mask, 6);
15799 			*check_mac = true;
15800 		}
15801 	}
15802 	FreeToken(t);
15803 
15804 	return true;
15805 }
15806 
15807 // Check the MAC address and mask
CmdEvalMacAddressAndMask(CONSOLE * c,wchar_t * str,void * param)15808 bool CmdEvalMacAddressAndMask(CONSOLE *c, wchar_t *str, void *param)
15809 {
15810 	char tmp[64];
15811 	// Validate arguments
15812 	if(c == NULL || str == NULL)
15813 	{
15814 		return false;
15815 	}
15816 
15817 	UniToStr(tmp, sizeof(tmp), str);
15818 
15819 
15820 	if(ParseMacAddressAndMask(tmp, NULL, NULL, NULL) == false)
15821 	{
15822 		c->Write(c, _UU("CMD_MAC_ADDRESS_AND_MASK_EVAL_FAILED"));
15823 		return false;
15824 	}
15825 
15826 	return true;
15827 }
15828 // Parse the status of TCP connection
ParseTcpState(char * src,bool * check_tcp_state,bool * established)15829 bool ParseTcpState(char *src, bool *check_tcp_state, bool *established)
15830 {
15831 	bool ok = false;
15832 	// Validate arguments
15833 	if(src == NULL)
15834 	{
15835 		return false;
15836 	}
15837 
15838 	if(check_tcp_state != NULL && established != NULL)
15839 	{
15840 		ok = true;
15841 	}
15842 
15843 	if (IsEmptyStr(src) == false)
15844 	{
15845 		if (StartWith("Established", src) == 0)
15846 		{
15847 			if(ok != false)
15848 			{
15849 				*check_tcp_state = true;
15850 				*established = true;
15851 			}
15852 		}
15853 		else if (StartWith("Unestablished", src) == 0)
15854 		{
15855 			if(ok != false)
15856 			{
15857 				*check_tcp_state = true;
15858 				*established = false;
15859 			}
15860 		}
15861 		else
15862 		{
15863 			// Illegal string
15864 			return false;
15865 		}
15866 	}
15867 	else
15868 	{
15869 		if(ok != false)
15870 		{
15871 			*check_tcp_state = false;
15872 			*established = false;
15873 		}
15874 	}
15875 
15876 	return true;
15877 }
15878 // Check the status of the TCP connection
CmdEvalTcpState(CONSOLE * c,wchar_t * str,void * param)15879 bool CmdEvalTcpState(CONSOLE *c, wchar_t *str, void *param)
15880 {
15881 	char tmp[64];
15882 	// Validate arguments
15883 	if(c == NULL || str == NULL)
15884 	{
15885 		return false;
15886 	}
15887 
15888 	UniToStr(tmp, sizeof(tmp), str);
15889 
15890 	if(ParseTcpState(tmp, NULL, NULL) == false)
15891 	{
15892 		c->Write(c, _UU("CMD_TCP_CONNECTION_STATE_EVAL_FAILED"));
15893 		return false;
15894 	}
15895 
15896 	return true;
15897 }
15898 
15899 // Adding a rule to the access list (Standard, IPv4)
PsAccessAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15900 UINT PsAccessAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15901 {
15902 	LIST *o;
15903 	PS *ps = (PS *)param;
15904 	UINT ret = 0;
15905 	RPC_ADD_ACCESS t;
15906 	ACCESS *a;
15907 	// Parameter list that can be specified
15908 	CMD_EVAL_MIN_MAX minmax =
15909 	{
15910 		"CMD_AccessAdd_Eval_PRIORITY", 1, 4294967295UL,
15911 	};
15912 	PARAM args[] =
15913 	{
15914 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
15915 		{"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TYPE"), CmdEvalNotEmpty, NULL},
15916 		{"MEMO", CmdPrompt, _UU("CMD_AccessAdd_Prompt_MEMO"), NULL, NULL},
15917 		{"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},
15918 		{"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCUSERNAME"), NULL, NULL},
15919 		{"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTUSERNAME"), NULL, NULL},
15920 		{"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},
15921 		{"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},
15922 		{"SRCIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCIP"), CmdEvalIpAndMask4, NULL},
15923 		{"DESTIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTIP"), CmdEvalIpAndMask4, NULL},
15924 		{"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},
15925 		{"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCPORT"), CmdEvalPortRange, NULL},
15926 		{"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTPORT"), CmdEvalPortRange, NULL},
15927 		{"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},
15928 	};
15929 
15930 	// If virtual HUB is not selected, it's an error
15931 	if (ps->HubName == NULL)
15932 	{
15933 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
15934 		return ERR_INVALID_PARAMETER;
15935 	}
15936 
15937 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
15938 	if (o == NULL)
15939 	{
15940 		return ERR_INVALID_PARAMETER;
15941 	}
15942 
15943 	Zero(&t, sizeof(t));
15944 	a = &t.Access;
15945 
15946 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
15947 	UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));
15948 	a->Active = true;
15949 	a->Priority = GetParamInt(o, "PRIORITY");
15950 	a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;
15951 	StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));
15952 	StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));
15953 	ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);
15954 	ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);
15955 	ParseIpAndMask4(GetParamStr(o, "SRCIP"), &a->SrcIpAddress, &a->SrcSubnetMask);
15956 	ParseIpAndMask4(GetParamStr(o, "DESTIP"), &a->DestIpAddress, &a->DestSubnetMask);
15957 	a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));
15958 	ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);
15959 	ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);
15960 	ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);
15961 
15962 	// RPC call
15963 	ret = ScAddAccess(ps->Rpc, &t);
15964 
15965 	if (ret != ERR_NO_ERROR)
15966 	{
15967 		// An error has occured
15968 		CmdPrintError(c, ret);
15969 		FreeParamValueList(o);
15970 		return ret;
15971 	}
15972 
15973 	FreeParamValueList(o);
15974 
15975 	return 0;
15976 }
15977 
15978 // Adding a rule to the access list (Extended, IPv4)
PsAccessAddEx(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)15979 UINT PsAccessAddEx(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
15980 {
15981 	LIST *o;
15982 	PS *ps = (PS *)param;
15983 	UINT ret = 0;
15984 	RPC_ADD_ACCESS t;
15985 	ACCESS *a;
15986 	// Parameter list that can be specified
15987 	CMD_EVAL_MIN_MAX minmax =
15988 	{
15989 		"CMD_AccessAdd_Eval_PRIORITY", 1, 4294967295UL,
15990 	};
15991 	CMD_EVAL_MIN_MAX minmax_delay =
15992 	{
15993 		"CMD_AccessAddEx_Eval_DELAY", 0, HUB_ACCESSLIST_DELAY_MAX,
15994 	};
15995 	CMD_EVAL_MIN_MAX minmax_jitter =
15996 	{
15997 		"CMD_AccessAddEx_Eval_JITTER", 0, HUB_ACCESSLIST_JITTER_MAX,
15998 	};
15999 	CMD_EVAL_MIN_MAX minmax_loss =
16000 	{
16001 		"CMD_AccessAddEx_Eval_LOSS", 0, HUB_ACCESSLIST_LOSS_MAX,
16002 	};
16003 	PARAM args[] =
16004 	{
16005 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16006 		{"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TYPE"), CmdEvalNotEmpty, NULL},
16007 		{"MEMO", CmdPrompt, _UU("CMD_AccessAdd_Prompt_MEMO"), NULL, NULL},
16008 		{"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},
16009 		{"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCUSERNAME"), NULL, NULL},
16010 		{"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTUSERNAME"), NULL, NULL},
16011 		{"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},
16012 		{"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},
16013 		{"SRCIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCIP"), CmdEvalIpAndMask4, NULL},
16014 		{"DESTIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTIP"), CmdEvalIpAndMask4, NULL},
16015 		{"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},
16016 		{"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCPORT"), CmdEvalPortRange, NULL},
16017 		{"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTPORT"), CmdEvalPortRange, NULL},
16018 		{"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},
16019 		{"DELAY", CmdPrompt, _UU("CMD_AccessAddEx_Prompt_DELAY"), CmdEvalMinMax, &minmax_delay},
16020 		{"JITTER", CmdPrompt, _UU("CMD_AccessAddEx_Prompt_JITTER"), CmdEvalMinMax, &minmax_jitter},
16021 		{"LOSS", CmdPrompt, _UU("CMD_AccessAddEx_Prompt_LOSS"), CmdEvalMinMax, &minmax_loss},
16022 		{"REDIRECTURL", NULL, NULL, NULL, NULL},
16023 	};
16024 
16025 	// If virtual HUB is not selected, it's an error
16026 	if (ps->HubName == NULL)
16027 	{
16028 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16029 		return ERR_INVALID_PARAMETER;
16030 	}
16031 
16032 	// Check whether it is supported
16033 	if (GetCapsBool(ps->CapsList, "b_support_ex_acl") == false)
16034 	{
16035 		c->Write(c, _E(ERR_NOT_SUPPORTED));
16036 		return ERR_NOT_SUPPORTED;
16037 	}
16038 
16039 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16040 	if (o == NULL)
16041 	{
16042 		return ERR_INVALID_PARAMETER;
16043 	}
16044 
16045 	Zero(&t, sizeof(t));
16046 	a = &t.Access;
16047 
16048 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16049 	UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));
16050 	a->Active = true;
16051 	a->Priority = GetParamInt(o, "PRIORITY");
16052 	a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;
16053 	StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));
16054 	StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));
16055 	ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);
16056 	ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);
16057 	ParseIpAndMask4(GetParamStr(o, "SRCIP"), &a->SrcIpAddress, &a->SrcSubnetMask);
16058 	ParseIpAndMask4(GetParamStr(o, "DESTIP"), &a->DestIpAddress, &a->DestSubnetMask);
16059 	a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));
16060 	ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);
16061 	ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);
16062 	ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);
16063 	a->Delay = GetParamInt(o, "DELAY");
16064 	a->Jitter = GetParamInt(o, "JITTER");
16065 	a->Loss = GetParamInt(o, "LOSS");
16066 	StrCpy(a->RedirectUrl, sizeof(a->RedirectUrl), GetParamStr(o, "REDIRECTURL"));
16067 
16068 	// RPC call
16069 	ret = ScAddAccess(ps->Rpc, &t);
16070 
16071 	if (ret != ERR_NO_ERROR)
16072 	{
16073 		// An error has occured
16074 		CmdPrintError(c, ret);
16075 		FreeParamValueList(o);
16076 		return ret;
16077 	}
16078 
16079 	FreeParamValueList(o);
16080 
16081 	return 0;
16082 }
16083 
16084 // Adding a rule to the access list (Standard, IPv6)
PsAccessAdd6(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16085 UINT PsAccessAdd6(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16086 {
16087 	LIST *o;
16088 	PS *ps = (PS *)param;
16089 	UINT ret = 0;
16090 	RPC_ADD_ACCESS t;
16091 	ACCESS *a;
16092 	IP ip, mask;
16093 	// Parameter list that can be specified
16094 	CMD_EVAL_MIN_MAX minmax =
16095 	{
16096 		"CMD_AccessAdd6_Eval_PRIORITY", 1, 4294967295UL,
16097 	};
16098 	PARAM args[] =
16099 	{
16100 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16101 		{"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TYPE"), CmdEvalNotEmpty, NULL},
16102 		{"MEMO", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_MEMO"), NULL, NULL},
16103 		{"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},
16104 		{"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCUSERNAME"), NULL, NULL},
16105 		{"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTUSERNAME"), NULL, NULL},
16106 		{"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},
16107 		{"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},
16108 		{"SRCIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCIP"), CmdEvalIpAndMask6, NULL},
16109 		{"DESTIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTIP"), CmdEvalIpAndMask6, NULL},
16110 		{"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},
16111 		{"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCPORT"), CmdEvalPortRange, NULL},
16112 		{"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTPORT"), CmdEvalPortRange, NULL},
16113 		{"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},
16114 	};
16115 
16116 	// If virtual HUB is not selected, it's an error
16117 	if (ps->HubName == NULL)
16118 	{
16119 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16120 		return ERR_INVALID_PARAMETER;
16121 	}
16122 
16123 	// Check whether it is supported
16124 	if (GetCapsBool(ps->CapsList, "b_support_ex_acl") == false)
16125 	{
16126 		c->Write(c, _E(ERR_NOT_SUPPORTED));
16127 		return ERR_NOT_SUPPORTED;
16128 	}
16129 
16130 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16131 	if (o == NULL)
16132 	{
16133 		return ERR_INVALID_PARAMETER;
16134 	}
16135 
16136 	Zero(&t, sizeof(t));
16137 	a = &t.Access;
16138 
16139 	a->IsIPv6 = true;
16140 
16141 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16142 	UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));
16143 	a->Active = true;
16144 	a->Priority = GetParamInt(o, "PRIORITY");
16145 	a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;
16146 	StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));
16147 	StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));
16148 	ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);
16149 	ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);
16150 
16151 	Zero(&ip, sizeof(ip));
16152 	Zero(&mask, sizeof(mask));
16153 
16154 	ParseIpAndMask6(GetParamStr(o, "SRCIP"), &ip, &mask);
16155 	IPToIPv6Addr(&a->SrcIpAddress6, &ip);
16156 	IPToIPv6Addr(&a->SrcSubnetMask6, &mask);
16157 
16158 	ParseIpAndMask6(GetParamStr(o, "DESTIP"), &ip, &mask);
16159 	IPToIPv6Addr(&a->DestIpAddress6, &ip);
16160 	IPToIPv6Addr(&a->DestSubnetMask6, &mask);
16161 
16162 	a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));
16163 	ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);
16164 	ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);
16165 	ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);
16166 
16167 	// RPC call
16168 	ret = ScAddAccess(ps->Rpc, &t);
16169 
16170 	if (ret != ERR_NO_ERROR)
16171 	{
16172 		// An error has occured
16173 		CmdPrintError(c, ret);
16174 		FreeParamValueList(o);
16175 		return ret;
16176 	}
16177 
16178 	FreeParamValueList(o);
16179 
16180 	return 0;
16181 }
16182 
16183 // Adding a rule to the access list (Extended, IPv6)
PsAccessAddEx6(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16184 UINT PsAccessAddEx6(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16185 {
16186 	LIST *o;
16187 	PS *ps = (PS *)param;
16188 	UINT ret = 0;
16189 	RPC_ADD_ACCESS t;
16190 	ACCESS *a;
16191 	IP ip, mask;
16192 	// Parameter list that can be specified
16193 	CMD_EVAL_MIN_MAX minmax =
16194 	{
16195 		"CMD_AccessAdd6_Eval_PRIORITY", 1, 4294967295UL,
16196 	};
16197 	CMD_EVAL_MIN_MAX minmax_delay =
16198 	{
16199 		"CMD_AccessAddEx6_Eval_DELAY", 0, HUB_ACCESSLIST_DELAY_MAX,
16200 	};
16201 	CMD_EVAL_MIN_MAX minmax_jitter =
16202 	{
16203 		"CMD_AccessAddEx6_Eval_JITTER", 0, HUB_ACCESSLIST_JITTER_MAX,
16204 	};
16205 	CMD_EVAL_MIN_MAX minmax_loss =
16206 	{
16207 		"CMD_AccessAddEx6_Eval_LOSS", 0, HUB_ACCESSLIST_LOSS_MAX,
16208 	};
16209 	PARAM args[] =
16210 	{
16211 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16212 		{"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TYPE"), CmdEvalNotEmpty, NULL},
16213 		{"MEMO", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_MEMO"), NULL, NULL},
16214 		{"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},
16215 		{"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCUSERNAME"), NULL, NULL},
16216 		{"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTUSERNAME"), NULL, NULL},
16217 		{"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},
16218 		{"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},
16219 		{"SRCIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCIP"), CmdEvalIpAndMask6, NULL},
16220 		{"DESTIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTIP"), CmdEvalIpAndMask6, NULL},
16221 		{"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},
16222 		{"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCPORT"), CmdEvalPortRange, NULL},
16223 		{"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTPORT"), CmdEvalPortRange, NULL},
16224 		{"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},
16225 		{"DELAY", CmdPrompt, _UU("CMD_AccessAddEx6_Prompt_DELAY"), CmdEvalMinMax, &minmax_delay},
16226 		{"JITTER", CmdPrompt, _UU("CMD_AccessAddEx6_Prompt_JITTER"), CmdEvalMinMax, &minmax_jitter},
16227 		{"LOSS", CmdPrompt, _UU("CMD_AccessAddEx6_Prompt_LOSS"), CmdEvalMinMax, &minmax_loss},
16228 		{"REDIRECTURL", NULL, NULL, NULL, NULL},
16229 	};
16230 
16231 	// If virtual HUB is not selected, it's an error
16232 	if (ps->HubName == NULL)
16233 	{
16234 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16235 		return ERR_INVALID_PARAMETER;
16236 	}
16237 
16238 	// Check whether it is supported
16239 	if (GetCapsBool(ps->CapsList, "b_support_ex_acl") == false)
16240 	{
16241 		c->Write(c, _E(ERR_NOT_SUPPORTED));
16242 		return ERR_NOT_SUPPORTED;
16243 	}
16244 
16245 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16246 	if (o == NULL)
16247 	{
16248 		return ERR_INVALID_PARAMETER;
16249 	}
16250 
16251 	Zero(&t, sizeof(t));
16252 	a = &t.Access;
16253 
16254 	a->IsIPv6 = true;
16255 
16256 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16257 	UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));
16258 	a->Active = true;
16259 	a->Priority = GetParamInt(o, "PRIORITY");
16260 	a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;
16261 	StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));
16262 	StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));
16263 	ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);
16264 	ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);
16265 
16266 	Zero(&ip, sizeof(ip));
16267 	Zero(&mask, sizeof(mask));
16268 
16269 	ParseIpAndMask6(GetParamStr(o, "SRCIP"), &ip, &mask);
16270 	IPToIPv6Addr(&a->SrcIpAddress6, &ip);
16271 	IPToIPv6Addr(&a->SrcSubnetMask6, &mask);
16272 
16273 	ParseIpAndMask6(GetParamStr(o, "DESTIP"), &ip, &mask);
16274 	IPToIPv6Addr(&a->DestIpAddress6, &ip);
16275 	IPToIPv6Addr(&a->DestSubnetMask6, &mask);
16276 
16277 	a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));
16278 	ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);
16279 	ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);
16280 	ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);
16281 	a->Delay = GetParamInt(o, "DELAY");
16282 	a->Jitter = GetParamInt(o, "JITTER");
16283 	a->Loss = GetParamInt(o, "LOSS");
16284 	StrCpy(a->RedirectUrl, sizeof(a->RedirectUrl), GetParamStr(o, "REDIRECTURL"));
16285 
16286 	// RPC call
16287 	ret = ScAddAccess(ps->Rpc, &t);
16288 
16289 	if (ret != ERR_NO_ERROR)
16290 	{
16291 		// An error has occured
16292 		CmdPrintError(c, ret);
16293 		FreeParamValueList(o);
16294 		return ret;
16295 	}
16296 
16297 	FreeParamValueList(o);
16298 
16299 	return 0;
16300 }
16301 
16302 
16303 // Get the list of rules in the access list
PsAccessList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16304 UINT PsAccessList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16305 {
16306 	LIST *o;
16307 	PS *ps = (PS *)param;
16308 	UINT ret = 0;
16309 	RPC_ENUM_ACCESS_LIST t;
16310 	CT *ct;
16311 	UINT i;
16312 
16313 	// If virtual HUB is not selected, it's an error
16314 	if (ps->HubName == NULL)
16315 	{
16316 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16317 		return ERR_INVALID_PARAMETER;
16318 	}
16319 
16320 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
16321 	if (o == NULL)
16322 	{
16323 		return ERR_INVALID_PARAMETER;
16324 	}
16325 
16326 	Zero(&t, sizeof(t));
16327 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16328 
16329 	// RPC call
16330 	ret = ScEnumAccess(ps->Rpc, &t);
16331 
16332 	if (ret != ERR_NO_ERROR)
16333 	{
16334 		// An error has occured
16335 		CmdPrintError(c, ret);
16336 		FreeParamValueList(o);
16337 		return ret;
16338 	}
16339 
16340 	ct = CtNew();
16341 	CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_0"), true);
16342 	CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_1"), true);
16343 	CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_2"), true);
16344 	CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_3"), true);
16345 	CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_6"), true);
16346 	CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_5"), false);
16347 	CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_4"), false);
16348 
16349 	for (i = 0;i < t.NumAccess;i++)
16350 	{
16351 		ACCESS *a = &t.Accesses[i];
16352 		char tmp[MAX_SIZE];
16353 		wchar_t tmp3[MAX_SIZE];
16354 		wchar_t tmp1[MAX_SIZE];
16355 		wchar_t tmp2[MAX_SIZE];
16356 		wchar_t tmp4[MAX_SIZE];
16357 
16358 		GetAccessListStr(tmp, sizeof(tmp), a);
16359 		UniToStru(tmp1, a->Priority);
16360 		StrToUni(tmp2, sizeof(tmp2), tmp);
16361 		UniToStru(tmp4, a->UniqueId);
16362 		if (a->UniqueId == 0)
16363 		{
16364 			UniStrCpy(tmp4, sizeof(tmp4), _UU("SEC_NONE"));
16365 		}
16366 
16367 		UniToStru(tmp3, a->Id);
16368 
16369 		CtInsert(ct,
16370 			tmp3,
16371 			a->Discard ? _UU("SM_ACCESS_DISCARD") : _UU("SM_ACCESS_PASS"),
16372 			a->Active ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"),
16373 			tmp1,
16374 			tmp4,
16375 			tmp2,
16376 			a->Note);
16377 	}
16378 
16379 	CtFreeEx(ct, c, true);
16380 
16381 	FreeRpcEnumAccessList(&t);
16382 
16383 	FreeParamValueList(o);
16384 
16385 	return 0;
16386 }
16387 
16388 // Remove a rule from the access list
PsAccessDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16389 UINT PsAccessDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16390 {
16391 	LIST *o;
16392 	PS *ps = (PS *)param;
16393 	UINT ret = 0;
16394 	RPC_DELETE_ACCESS t;
16395 	// Parameter list that can be specified
16396 	PARAM args[] =
16397 	{
16398 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16399 		{"[id]", CmdPrompt, _UU("CMD_Access_Prompt_ID"), CmdEvalNotEmpty, NULL},
16400 	};
16401 
16402 	// If virtual HUB is not selected, it's an error
16403 	if (ps->HubName == NULL)
16404 	{
16405 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16406 		return ERR_INVALID_PARAMETER;
16407 	}
16408 
16409 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16410 	if (o == NULL)
16411 	{
16412 		return ERR_INVALID_PARAMETER;
16413 	}
16414 
16415 	Zero(&t, sizeof(t));
16416 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16417 	t.Id = GetParamInt(o, "[id]");
16418 
16419 	// RPC call
16420 	ret = ScDeleteAccess(ps->Rpc, &t);
16421 
16422 	if (ret != ERR_NO_ERROR)
16423 	{
16424 		// An error has occured
16425 		CmdPrintError(c, ret);
16426 		FreeParamValueList(o);
16427 		return ret;
16428 	}
16429 
16430 	FreeParamValueList(o);
16431 
16432 	return 0;
16433 }
16434 
16435 // Enable the rule of access list
PsAccessEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16436 UINT PsAccessEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16437 {
16438 	LIST *o;
16439 	PS *ps = (PS *)param;
16440 	UINT ret = 0;
16441 	RPC_ENUM_ACCESS_LIST t;
16442 	// Parameter list that can be specified
16443 	PARAM args[] =
16444 	{
16445 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16446 		{"[id]", CmdPrompt, _UU("CMD_Access_Prompt_ID"), CmdEvalNotEmpty, NULL},
16447 	};
16448 
16449 	// If virtual HUB is not selected, it's an error
16450 	if (ps->HubName == NULL)
16451 	{
16452 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16453 		return ERR_INVALID_PARAMETER;
16454 	}
16455 
16456 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16457 	if (o == NULL)
16458 	{
16459 		return ERR_INVALID_PARAMETER;
16460 	}
16461 
16462 	Zero(&t, sizeof(t));
16463 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16464 
16465 	// RPC call
16466 	ret = ScEnumAccess(ps->Rpc, &t);
16467 
16468 	if (ret != ERR_NO_ERROR)
16469 	{
16470 		// An error has occured
16471 		CmdPrintError(c, ret);
16472 		FreeParamValueList(o);
16473 		return ret;
16474 	}
16475 	else
16476 	{
16477 		UINT i;
16478 		bool b = false;
16479 		for (i = 0;i < t.NumAccess;i++)
16480 		{
16481 			ACCESS *a = &t.Accesses[i];
16482 
16483 			if (a->Id == GetParamInt(o, "[id]"))
16484 			{
16485 				b = true;
16486 
16487 				a->Active = true;
16488 			}
16489 		}
16490 
16491 		if (b == false)
16492 		{
16493 			// The specified ID is not found
16494 			ret = ERR_OBJECT_NOT_FOUND;
16495 			CmdPrintError(c, ret);
16496 			FreeParamValueList(o);
16497 			FreeRpcEnumAccessList(&t);
16498 			return ret;
16499 		}
16500 
16501 		ret = ScSetAccessList(ps->Rpc, &t);
16502 		if (ret != ERR_NO_ERROR)
16503 		{
16504 			// An error has occured
16505 			CmdPrintError(c, ret);
16506 			FreeParamValueList(o);
16507 			return ret;
16508 		}
16509 
16510 		FreeRpcEnumAccessList(&t);
16511 	}
16512 
16513 	FreeParamValueList(o);
16514 
16515 	return ret;
16516 }
16517 
16518 // Disable the rule of access list
PsAccessDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16519 UINT PsAccessDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16520 {
16521 	LIST *o;
16522 	PS *ps = (PS *)param;
16523 	UINT ret = 0;
16524 	RPC_ENUM_ACCESS_LIST t;
16525 	// Parameter list that can be specified
16526 	PARAM args[] =
16527 	{
16528 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16529 		{"[id]", CmdPrompt, _UU("CMD_Access_Prompt_ID"), CmdEvalNotEmpty, NULL},
16530 	};
16531 
16532 	// If virtual HUB is not selected, it's an error
16533 	if (ps->HubName == NULL)
16534 	{
16535 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16536 		return ERR_INVALID_PARAMETER;
16537 	}
16538 
16539 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16540 	if (o == NULL)
16541 	{
16542 		return ERR_INVALID_PARAMETER;
16543 	}
16544 
16545 	Zero(&t, sizeof(t));
16546 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16547 
16548 	// RPC call
16549 	ret = ScEnumAccess(ps->Rpc, &t);
16550 
16551 	if (ret != ERR_NO_ERROR)
16552 	{
16553 		// An error has occured
16554 		CmdPrintError(c, ret);
16555 		FreeParamValueList(o);
16556 		return ret;
16557 	}
16558 	else
16559 	{
16560 		UINT i;
16561 		bool b = false;
16562 		for (i = 0;i < t.NumAccess;i++)
16563 		{
16564 			ACCESS *a = &t.Accesses[i];
16565 
16566 			if (a->Id == GetParamInt(o, "[id]"))
16567 			{
16568 				b = true;
16569 
16570 				a->Active = false;
16571 			}
16572 		}
16573 
16574 		if (b == false)
16575 		{
16576 			// The specified ID is not found
16577 			ret = ERR_OBJECT_NOT_FOUND;
16578 			CmdPrintError(c, ret);
16579 			FreeParamValueList(o);
16580 			FreeRpcEnumAccessList(&t);
16581 			return ret;
16582 		}
16583 
16584 		ret = ScSetAccessList(ps->Rpc, &t);
16585 		if (ret != ERR_NO_ERROR)
16586 		{
16587 			// An error has occured
16588 			CmdPrintError(c, ret);
16589 			FreeParamValueList(o);
16590 			return ret;
16591 		}
16592 
16593 		FreeRpcEnumAccessList(&t);
16594 	}
16595 
16596 	FreeParamValueList(o);
16597 
16598 	return ret;
16599 }
16600 
16601 // Get the user list
PsUserList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16602 UINT PsUserList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16603 {
16604 	LIST *o;
16605 	PS *ps = (PS *)param;
16606 	UINT ret = 0;
16607 	RPC_ENUM_USER t;
16608 
16609 	// If virtual HUB is not selected, it's an error
16610 	if (ps->HubName == NULL)
16611 	{
16612 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16613 		return ERR_INVALID_PARAMETER;
16614 	}
16615 
16616 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
16617 	if (o == NULL)
16618 	{
16619 		return ERR_INVALID_PARAMETER;
16620 	}
16621 
16622 	Zero(&t, sizeof(t));
16623 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16624 
16625 	// RPC call
16626 	ret = ScEnumUser(ps->Rpc, &t);
16627 
16628 	if (ret != ERR_NO_ERROR)
16629 	{
16630 		// An error has occured
16631 		CmdPrintError(c, ret);
16632 		FreeParamValueList(o);
16633 		return ret;
16634 	}
16635 	else
16636 	{
16637 		UINT i;
16638 		CT *ct = CtNew();
16639 
16640 		CtInsertColumn(ct, _UU("SM_USER_COLUMN_1"), false);
16641 		CtInsertColumn(ct, _UU("SM_USER_COLUMN_2"), false);
16642 		CtInsertColumn(ct, _UU("SM_USER_COLUMN_3"), false);
16643 		CtInsertColumn(ct, _UU("SM_USER_COLUMN_4"), false);
16644 		CtInsertColumn(ct, _UU("SM_USER_COLUMN_5"), false);
16645 		CtInsertColumn(ct, _UU("SM_USER_COLUMN_6"), false);
16646 		CtInsertColumn(ct, _UU("SM_USER_COLUMN_7"), false);
16647 		CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_5"), false);
16648 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_6"), false);
16649 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_7"), false);
16650 
16651 		for (i = 0;i < t.NumUser;i++)
16652 		{
16653 			RPC_ENUM_USER_ITEM *e = &t.Users[i];
16654 			wchar_t name[MAX_SIZE];
16655 			wchar_t group[MAX_SIZE];
16656 			wchar_t num[MAX_SIZE];
16657 			wchar_t time[MAX_SIZE];
16658 			wchar_t exp[MAX_SIZE];
16659 			wchar_t num1[64], num2[64];
16660 
16661 			StrToUni(name, sizeof(name), e->Name);
16662 
16663 			if (StrLen(e->GroupName) != 0)
16664 			{
16665 				StrToUni(group, sizeof(group), e->GroupName);
16666 			}
16667 			else
16668 			{
16669 				UniStrCpy(group, sizeof(group), _UU("SM_NO_GROUP"));
16670 			}
16671 
16672 			UniToStru(num, e->NumLogin);
16673 
16674 			GetDateTimeStrEx64(time, sizeof(time), SystemToLocal64(e->LastLoginTime), NULL);
16675 
16676 			if (e->IsExpiresFilled == false)
16677 			{
16678 				UniStrCpy(exp, sizeof(exp), _UU("CM_ST_NONE"));
16679 			}
16680 			else
16681 			{
16682 				if (e->Expires == 0)
16683 				{
16684 					UniStrCpy(exp, sizeof(exp), _UU("SM_LICENSE_NO_EXPIRES"));
16685 				}
16686 				else
16687 				{
16688 					GetDateTimeStrEx64(exp, sizeof(exp), SystemToLocal64(e->Expires), NULL);
16689 				}
16690 			}
16691 
16692 			if (e->IsTrafficFilled == false)
16693 			{
16694 				UniStrCpy(num1, sizeof(num1), _UU("CM_ST_NONE"));
16695 				UniStrCpy(num2, sizeof(num2), _UU("CM_ST_NONE"));
16696 			}
16697 			else
16698 			{
16699 				UniToStr3(num1, sizeof(num1),
16700 					e->Traffic.Recv.BroadcastBytes + e->Traffic.Recv.UnicastBytes +
16701 					e->Traffic.Send.BroadcastBytes + e->Traffic.Send.UnicastBytes);
16702 
16703 				UniToStr3(num2, sizeof(num2),
16704 					e->Traffic.Recv.BroadcastCount + e->Traffic.Recv.UnicastCount +
16705 					e->Traffic.Send.BroadcastBytes + e->Traffic.Send.UnicastCount);
16706 			}
16707 
16708 			CtInsert(ct,
16709 				name, e->Realname, group, e->Note, GetAuthTypeStr(e->AuthType),
16710 				num, time, exp, num1, num2);
16711 		}
16712 
16713 		CtFreeEx(ct, c, true);
16714 	}
16715 
16716 	FreeRpcEnumUser(&t);
16717 
16718 	FreeParamValueList(o);
16719 
16720 	return 0;
16721 }
16722 
16723 // Get a string of user authentication method
GetAuthTypeStr(UINT id)16724 wchar_t *GetAuthTypeStr(UINT id)
16725 {
16726 	char tmp[MAX_SIZE];
16727 	Format(tmp, sizeof(tmp), "SM_AUTHTYPE_%u", id);
16728 
16729 	return _UU(tmp);
16730 }
16731 
16732 // Creating a user
PsUserCreate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16733 UINT PsUserCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16734 {
16735 	LIST *o;
16736 	PS *ps = (PS *)param;
16737 	UINT ret = 0;
16738 	RPC_SET_USER t;
16739 	// Parameter list that can be specified
16740 	PARAM args[] =
16741 	{
16742 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16743 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
16744 		{"GROUP", CmdPrompt, _UU("CMD_UserCreate_Prompt_GROUP"), NULL, NULL},
16745 		{"REALNAME", CmdPrompt, _UU("CMD_UserCreate_Prompt_REALNAME"), NULL, NULL},
16746 		{"NOTE", CmdPrompt, _UU("CMD_UserCreate_Prompt_NOTE"), NULL, NULL},
16747 	};
16748 
16749 	// If virtual HUB is not selected, it's an error
16750 	if (ps->HubName == NULL)
16751 	{
16752 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16753 		return ERR_INVALID_PARAMETER;
16754 	}
16755 
16756 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16757 	if (o == NULL)
16758 	{
16759 		return ERR_INVALID_PARAMETER;
16760 	}
16761 
16762 	Zero(&t, sizeof(t));
16763 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16764 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
16765 	StrCpy(t.GroupName, sizeof(t.GroupName), GetParamStr(o, "GROUP"));
16766 	UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));
16767 	UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));
16768 
16769 	Trim(t.Name);
16770 	if (StrCmpi(t.Name, "*") == 0)
16771 	{
16772 		t.AuthType = AUTHTYPE_RADIUS;
16773 		t.AuthData = NewRadiusAuthData(NULL);
16774 	}
16775 	else
16776 	{
16777 		UCHAR random_pass[SHA1_SIZE];
16778 		UCHAR random_pass2[MD5_SIZE];
16779 
16780 		Rand(random_pass, sizeof(random_pass));
16781 		Rand(random_pass2, sizeof(random_pass2));
16782 		t.AuthType = AUTHTYPE_PASSWORD;
16783 		t.AuthData = NewPasswordAuthDataRaw(random_pass, random_pass2);
16784 	}
16785 
16786 	// RPC call
16787 	ret = ScCreateUser(ps->Rpc, &t);
16788 
16789 	if (ret != ERR_NO_ERROR)
16790 	{
16791 		// An error has occured
16792 		CmdPrintError(c, ret);
16793 		FreeParamValueList(o);
16794 		return ret;
16795 	}
16796 
16797 	FreeRpcSetUser(&t);
16798 
16799 	FreeParamValueList(o);
16800 
16801 	return 0;
16802 }
16803 
16804 // Change the user information
PsUserSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16805 UINT PsUserSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16806 {
16807 	LIST *o;
16808 	PS *ps = (PS *)param;
16809 	UINT ret = 0;
16810 	RPC_SET_USER t;
16811 	// Parameter list that can be specified
16812 	PARAM args[] =
16813 	{
16814 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16815 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
16816 		{"GROUP", CmdPrompt, _UU("CMD_UserCreate_Prompt_GROUP"), NULL, NULL},
16817 		{"REALNAME", CmdPrompt, _UU("CMD_UserCreate_Prompt_REALNAME"), NULL, NULL},
16818 		{"NOTE", CmdPrompt, _UU("CMD_UserCreate_Prompt_NOTE"), NULL, NULL},
16819 	};
16820 
16821 	// If virtual HUB is not selected, it's an error
16822 	if (ps->HubName == NULL)
16823 	{
16824 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16825 		return ERR_INVALID_PARAMETER;
16826 	}
16827 
16828 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16829 	if (o == NULL)
16830 	{
16831 		return ERR_INVALID_PARAMETER;
16832 	}
16833 
16834 	Zero(&t, sizeof(t));
16835 	// Get the user object
16836 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16837 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
16838 
16839 	ret = ScGetUser(ps->Rpc, &t);
16840 	if (ret != ERR_NO_ERROR)
16841 	{
16842 		// An error has occured
16843 		CmdPrintError(c, ret);
16844 		FreeParamValueList(o);
16845 		return ret;
16846 	}
16847 
16848 	// Update the information
16849 	StrCpy(t.GroupName, sizeof(t.GroupName), GetParamStr(o, "GROUP"));
16850 	UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));
16851 	UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));
16852 
16853 	// Write the user object
16854 	ret = ScSetUser(ps->Rpc, &t);
16855 
16856 	if (ret != ERR_NO_ERROR)
16857 	{
16858 		// An error has occured
16859 		CmdPrintError(c, ret);
16860 		FreeParamValueList(o);
16861 		return ret;
16862 	}
16863 
16864 	FreeRpcSetUser(&t);
16865 
16866 	FreeParamValueList(o);
16867 
16868 	return 0;
16869 }
16870 
16871 // Delete the user
PsUserDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16872 UINT PsUserDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16873 {
16874 	LIST *o;
16875 	PS *ps = (PS *)param;
16876 	UINT ret = 0;
16877 	RPC_DELETE_USER t;
16878 	// Parameter list that can be specified
16879 	PARAM args[] =
16880 	{
16881 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
16882 	};
16883 
16884 	// If virtual HUB is not selected, it's an error
16885 	if (ps->HubName == NULL)
16886 	{
16887 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16888 		return ERR_INVALID_PARAMETER;
16889 	}
16890 
16891 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16892 	if (o == NULL)
16893 	{
16894 		return ERR_INVALID_PARAMETER;
16895 	}
16896 
16897 	Zero(&t, sizeof(t));
16898 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16899 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
16900 
16901 	// RPC call
16902 	ret = ScDeleteUser(ps->Rpc, &t);
16903 
16904 	if (ret != ERR_NO_ERROR)
16905 	{
16906 		// An error has occured
16907 		CmdPrintError(c, ret);
16908 		FreeParamValueList(o);
16909 		return ret;
16910 	}
16911 
16912 	FreeParamValueList(o);
16913 
16914 	return 0;
16915 }
16916 
16917 // Get the user information
PsUserGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)16918 UINT PsUserGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
16919 {
16920 	LIST *o;
16921 	PS *ps = (PS *)param;
16922 	UINT ret = 0;
16923 	RPC_SET_USER t;
16924 	// Parameter list that can be specified
16925 	PARAM args[] =
16926 	{
16927 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
16928 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
16929 	};
16930 
16931 	// If virtual HUB is not selected, it's an error
16932 	if (ps->HubName == NULL)
16933 	{
16934 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
16935 		return ERR_INVALID_PARAMETER;
16936 	}
16937 
16938 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
16939 	if (o == NULL)
16940 	{
16941 		return ERR_INVALID_PARAMETER;
16942 	}
16943 
16944 	Zero(&t, sizeof(t));
16945 	// Get the user object
16946 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
16947 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
16948 
16949 	ret = ScGetUser(ps->Rpc, &t);
16950 	if (ret != ERR_NO_ERROR)
16951 	{
16952 		// An error has occured
16953 		CmdPrintError(c, ret);
16954 		FreeParamValueList(o);
16955 		return ret;
16956 	}
16957 	else
16958 	{
16959 		wchar_t tmp[MAX_SIZE];
16960 		CT *ct;
16961 
16962 		// Display the user's data
16963 		ct = CtNewStandard();
16964 
16965 		// User name
16966 		StrToUni(tmp, sizeof(tmp), t.Name);
16967 		CtInsert(ct, _UU("CMD_UserGet_Column_Name"), tmp);
16968 
16969 		// Real name
16970 		CtInsert(ct, _UU("CMD_UserGet_Column_RealName"), t.Realname);
16971 
16972 		// Description
16973 		CtInsert(ct, _UU("CMD_UserGet_Column_Note"), t.Note);
16974 
16975 		// Group name
16976 		if (IsEmptyStr(t.GroupName) == false)
16977 		{
16978 			StrToUni(tmp, sizeof(tmp), t.GroupName);
16979 			CtInsert(ct, _UU("CMD_UserGet_Column_Group"), tmp);
16980 		}
16981 
16982 		// Expiration date
16983 		GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ExpireTime), NULL);
16984 		CtInsert(ct, _UU("CMD_UserGet_Column_Expires"), tmp);
16985 
16986 		// Authentication method
16987 		CtInsert(ct, _UU("CMD_UserGet_Column_AuthType"), GetAuthTypeStr(t.AuthType));
16988 
16989 		switch (t.AuthType)
16990 		{
16991 		case AUTHTYPE_USERCERT:
16992 			if (t.AuthData != NULL)
16993 			{
16994 				AUTHUSERCERT *auc = (AUTHUSERCERT *)t.AuthData;
16995 
16996 				if (auc != NULL && auc->UserX != NULL)
16997 				{
16998 					// Registered user-specific certificate
16999 					GetAllNameFromX(tmp, sizeof(tmp), auc->UserX);
17000 					CtInsert(ct, _UU("CMD_UserGet_Column_UserCert"), tmp);
17001 				}
17002 			}
17003 			break;
17004 
17005 		case AUTHTYPE_ROOTCERT:
17006 			if (t.AuthData != NULL)
17007 			{
17008 				AUTHROOTCERT *arc = (AUTHROOTCERT *)t.AuthData;
17009 
17010 				if (IsEmptyUniStr(arc->CommonName) == false)
17011 				{
17012 					// Limitation the value of the certificate's CN
17013 					CtInsert(ct, _UU("CMD_UserGet_Column_RootCert_CN"), arc->CommonName);
17014 				}
17015 
17016 				if (arc->Serial != NULL && arc->Serial->size >= 1)
17017 				{
17018 					char tmp2[MAX_SIZE];
17019 
17020 					// Limitation the serial number of the certificate
17021 					BinToStrEx(tmp2, sizeof(tmp2), arc->Serial->data, arc->Serial->size);
17022 					StrToUni(tmp, sizeof(tmp), tmp2);
17023 					CtInsert(ct, _UU("CMD_UserGet_Column_RootCert_SERIAL"), tmp);
17024 				}
17025 			}
17026 			break;
17027 
17028 		case AUTHTYPE_RADIUS:
17029 		case AUTHTYPE_NT:
17030 			if (t.AuthData != NULL)
17031 			{
17032 				AUTHRADIUS *ar = (AUTHRADIUS *)t.AuthData;
17033 
17034 				// Authentication user name of the external authentication server
17035 				if (IsEmptyUniStr(ar->RadiusUsername) == false)
17036 				{
17037 					CtInsert(ct, _UU("CMD_UserGet_Column_RadiusAlias"), ar->RadiusUsername);
17038 				}
17039 			}
17040 			break;
17041 		}
17042 
17043 		CtInsert(ct, L"---", L"---");
17044 
17045 		GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.CreatedTime), NULL);
17046 		CtInsert(ct, _UU("SM_USERINFO_CREATE"), tmp);
17047 
17048 		GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.UpdatedTime), NULL);
17049 		CtInsert(ct, _UU("SM_USERINFO_UPDATE"), tmp);
17050 
17051 		CmdInsertTrafficInfo(ct, &t.Traffic);
17052 
17053 		UniToStru(tmp, t.NumLogin);
17054 		CtInsert(ct, _UU("SM_USERINFO_NUMLOGIN"), tmp);
17055 
17056 
17057 		CtFree(ct, c);
17058 
17059 		if (t.Policy != NULL)
17060 		{
17061 			c->Write(c, L"");
17062 			c->Write(c, _UU("CMD_UserGet_Policy"));
17063 			PrintPolicy(c, t.Policy, false);
17064 		}
17065 	}
17066 
17067 	FreeRpcSetUser(&t);
17068 
17069 	FreeParamValueList(o);
17070 
17071 	return 0;
17072 }
17073 
17074 // Set the authentication method for the user to the anonymous authentication
PsUserAnonymousSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17075 UINT PsUserAnonymousSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17076 {
17077 	LIST *o;
17078 	PS *ps = (PS *)param;
17079 	UINT ret = 0;
17080 	RPC_SET_USER t;
17081 	// Parameter list that can be specified
17082 	PARAM args[] =
17083 	{
17084 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17085 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17086 	};
17087 
17088 	// If virtual HUB is not selected, it's an error
17089 	if (ps->HubName == NULL)
17090 	{
17091 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17092 		return ERR_INVALID_PARAMETER;
17093 	}
17094 
17095 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17096 	if (o == NULL)
17097 	{
17098 		return ERR_INVALID_PARAMETER;
17099 	}
17100 
17101 	Zero(&t, sizeof(t));
17102 	// Get the user object
17103 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17104 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17105 
17106 	ret = ScGetUser(ps->Rpc, &t);
17107 	if (ret != ERR_NO_ERROR)
17108 	{
17109 		// An error has occured
17110 		CmdPrintError(c, ret);
17111 		FreeParamValueList(o);
17112 		return ret;
17113 	}
17114 
17115 	// Update the information
17116 	FreeAuthData(t.AuthType, t.AuthData);
17117 
17118 	// Set to anonymous authentication
17119 	t.AuthType = AUTHTYPE_ANONYMOUS;
17120 	t.AuthData = NULL;
17121 
17122 	// Write the user object
17123 	ret = ScSetUser(ps->Rpc, &t);
17124 
17125 	if (ret != ERR_NO_ERROR)
17126 	{
17127 		// An error has occured
17128 		CmdPrintError(c, ret);
17129 		FreeParamValueList(o);
17130 		return ret;
17131 	}
17132 
17133 	FreeRpcSetUser(&t);
17134 
17135 	FreeParamValueList(o);
17136 
17137 	return 0;
17138 }
17139 
17140 // 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)17141 UINT PsUserPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17142 {
17143 	LIST *o;
17144 	PS *ps = (PS *)param;
17145 	UINT ret = 0;
17146 	RPC_SET_USER t;
17147 	// Parameter list that can be specified
17148 	PARAM args[] =
17149 	{
17150 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17151 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17152 		{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
17153 	};
17154 
17155 	// If virtual HUB is not selected, it's an error
17156 	if (ps->HubName == NULL)
17157 	{
17158 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17159 		return ERR_INVALID_PARAMETER;
17160 	}
17161 
17162 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17163 	if (o == NULL)
17164 	{
17165 		return ERR_INVALID_PARAMETER;
17166 	}
17167 
17168 	Zero(&t, sizeof(t));
17169 	// Get the user object
17170 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17171 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17172 
17173 	ret = ScGetUser(ps->Rpc, &t);
17174 	if (ret != ERR_NO_ERROR)
17175 	{
17176 		// An error has occured
17177 		CmdPrintError(c, ret);
17178 		FreeParamValueList(o);
17179 		return ret;
17180 	}
17181 
17182 	// Update the information
17183 	FreeAuthData(t.AuthType, t.AuthData);
17184 
17185 	{
17186 		AUTHPASSWORD *pw;
17187 
17188 		pw = NewPasswordAuthData(t.Name, GetParamStr(o, "PASSWORD"));
17189 
17190 		// Set to the password authentication
17191 		t.AuthType = AUTHTYPE_PASSWORD;
17192 		t.AuthData = pw;
17193 	}
17194 
17195 	// Write the user object
17196 	ret = ScSetUser(ps->Rpc, &t);
17197 
17198 	if (ret != ERR_NO_ERROR)
17199 	{
17200 		// An error has occured
17201 		CmdPrintError(c, ret);
17202 		FreeParamValueList(o);
17203 		return ret;
17204 	}
17205 
17206 	FreeRpcSetUser(&t);
17207 
17208 	FreeParamValueList(o);
17209 
17210 	return 0;
17211 }
17212 
17213 // 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)17214 UINT PsUserCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17215 {
17216 	LIST *o;
17217 	PS *ps = (PS *)param;
17218 	UINT ret = 0;
17219 	RPC_SET_USER t;
17220 	X *x;
17221 	// Parameter list that can be specified
17222 	PARAM args[] =
17223 	{
17224 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17225 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17226 		{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
17227 	};
17228 
17229 	// If virtual HUB is not selected, it's an error
17230 	if (ps->HubName == NULL)
17231 	{
17232 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17233 		return ERR_INVALID_PARAMETER;
17234 	}
17235 
17236 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17237 	if (o == NULL)
17238 	{
17239 		return ERR_INVALID_PARAMETER;
17240 	}
17241 
17242 	// Read the certificate
17243 	x = FileToXW(GetParamUniStr(o, "LOADCERT"));
17244 	if (x == NULL)
17245 	{
17246 		c->Write(c, _UU("CMD_LOADCERT_FAILED"));
17247 
17248 		FreeParamValueList(o);
17249 
17250 		return ERR_INTERNAL_ERROR;
17251 	}
17252 
17253 	Zero(&t, sizeof(t));
17254 	// Get the user object
17255 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17256 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17257 
17258 	ret = ScGetUser(ps->Rpc, &t);
17259 	if (ret != ERR_NO_ERROR)
17260 	{
17261 		// An error has occured
17262 		CmdPrintError(c, ret);
17263 		FreeParamValueList(o);
17264 		FreeX(x);
17265 		return ret;
17266 	}
17267 
17268 	// Update the information
17269 	FreeAuthData(t.AuthType, t.AuthData);
17270 
17271 	{
17272 		AUTHUSERCERT *c;
17273 
17274 		c = NewUserCertAuthData(x);
17275 
17276 		FreeX(x);
17277 
17278 		// Set to the password authentication
17279 		t.AuthType = AUTHTYPE_USERCERT;
17280 		t.AuthData = c;
17281 	}
17282 
17283 	// Write the user object
17284 	ret = ScSetUser(ps->Rpc, &t);
17285 
17286 	if (ret != ERR_NO_ERROR)
17287 	{
17288 		// An error has occured
17289 		CmdPrintError(c, ret);
17290 		FreeParamValueList(o);
17291 		return ret;
17292 	}
17293 
17294 	FreeRpcSetUser(&t);
17295 
17296 	FreeParamValueList(o);
17297 
17298 	return 0;
17299 }
17300 
17301 // Get certificates that are registered in the user which uses certificate authentication
PsUserCertGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17302 UINT PsUserCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17303 {
17304 	LIST *o;
17305 	PS *ps = (PS *)param;
17306 	UINT ret = 0;
17307 	RPC_SET_USER t;
17308 	AUTHUSERCERT *a;
17309 	// Parameter list that can be specified
17310 	PARAM args[] =
17311 	{
17312 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17313 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17314 		{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), NULL, NULL},
17315 	};
17316 
17317 	// If virtual HUB is not selected, it's an error
17318 	if (ps->HubName == NULL)
17319 	{
17320 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17321 		return ERR_INVALID_PARAMETER;
17322 	}
17323 
17324 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17325 	if (o == NULL)
17326 	{
17327 		return ERR_INVALID_PARAMETER;
17328 	}
17329 
17330 	Zero(&t, sizeof(t));
17331 	// Get the user object
17332 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17333 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17334 
17335 	ret = ScGetUser(ps->Rpc, &t);
17336 	if (ret != ERR_NO_ERROR)
17337 	{
17338 		// An error has occured
17339 		CmdPrintError(c, ret);
17340 		FreeParamValueList(o);
17341 		return ret;
17342 	}
17343 
17344 	a = (AUTHUSERCERT *)t.AuthData;
17345 
17346 	if (t.AuthType != AUTHTYPE_USERCERT || a == NULL || a->UserX == NULL)
17347 	{
17348 		// The user is not using specific certificate authentication
17349 		ret = ERR_INVALID_PARAMETER;
17350 
17351 		c->Write(c, _UU("CMD_UserCertGet_Not_Cert"));
17352 	}
17353 	else
17354 	{
17355 		if (XToFileW(a->UserX, GetParamUniStr(o, "SAVECERT"), true) == false)
17356 		{
17357 			c->Write(c, _UU("CMD_SAVECERT_FAILED"));
17358 		}
17359 	}
17360 
17361 	FreeRpcSetUser(&t);
17362 
17363 	FreeParamValueList(o);
17364 
17365 	return ret;
17366 }
17367 
17368 // Set the authentication method for the user to the signed certificate authentication
PsUserSignedSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17369 UINT PsUserSignedSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17370 {
17371 	LIST *o;
17372 	PS *ps = (PS *)param;
17373 	UINT ret = 0;
17374 	RPC_SET_USER t;
17375 	// Parameter list that can be specified
17376 	PARAM args[] =
17377 	{
17378 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17379 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17380 		{"CN", CmdPrompt, _UU("CMD_UserSignedSet_Prompt_CN"), NULL, NULL},
17381 		{"SERIAL", CmdPrompt, _UU("CMD_UserSignedSet_Prompt_SERIAL"), NULL, NULL},
17382 	};
17383 
17384 	// If virtual HUB is not selected, it's an error
17385 	if (ps->HubName == NULL)
17386 	{
17387 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17388 		return ERR_INVALID_PARAMETER;
17389 	}
17390 
17391 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17392 	if (o == NULL)
17393 	{
17394 		return ERR_INVALID_PARAMETER;
17395 	}
17396 
17397 	Zero(&t, sizeof(t));
17398 	// Get the user object
17399 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17400 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17401 
17402 	ret = ScGetUser(ps->Rpc, &t);
17403 	if (ret != ERR_NO_ERROR)
17404 	{
17405 		// An error has occured
17406 		CmdPrintError(c, ret);
17407 		FreeParamValueList(o);
17408 		return ret;
17409 	}
17410 
17411 	// Update the information
17412 	FreeAuthData(t.AuthType, t.AuthData);
17413 
17414 	{
17415 		AUTHROOTCERT *c;
17416 		BUF *b;
17417 		X_SERIAL *serial = NULL;
17418 
17419 		b = StrToBin(GetParamStr(o, "SERIAL"));
17420 
17421 		if (b != NULL && b->Size >= 1)
17422 		{
17423 			serial = NewXSerial(b->Buf, b->Size);
17424 		}
17425 
17426 		FreeBuf(b);
17427 
17428 		c = NewRootCertAuthData(serial, GetParamUniStr(o, "CN"));
17429 
17430 		FreeXSerial(serial);
17431 
17432 		// Set to the signed certificate authentication
17433 		t.AuthType = AUTHTYPE_ROOTCERT;
17434 		t.AuthData = c;
17435 	}
17436 
17437 	// Write the user object
17438 	ret = ScSetUser(ps->Rpc, &t);
17439 
17440 	if (ret != ERR_NO_ERROR)
17441 	{
17442 		// An error has occured
17443 		CmdPrintError(c, ret);
17444 		FreeParamValueList(o);
17445 		return ret;
17446 	}
17447 
17448 	FreeRpcSetUser(&t);
17449 
17450 	FreeParamValueList(o);
17451 
17452 	return 0;
17453 }
17454 
17455 // Set the authentication method for the user to the Radius authentication
PsUserRadiusSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17456 UINT PsUserRadiusSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17457 {
17458 	LIST *o;
17459 	PS *ps = (PS *)param;
17460 	UINT ret = 0;
17461 	RPC_SET_USER t;
17462 	// Parameter list that can be specified
17463 	PARAM args[] =
17464 	{
17465 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17466 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17467 		{"ALIAS", CmdPrompt, _UU("CMD_UserRadiusSet_Prompt_ALIAS"), NULL, NULL},
17468 	};
17469 
17470 	// If virtual HUB is not selected, it's an error
17471 	if (ps->HubName == NULL)
17472 	{
17473 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17474 		return ERR_INVALID_PARAMETER;
17475 	}
17476 
17477 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17478 	if (o == NULL)
17479 	{
17480 		return ERR_INVALID_PARAMETER;
17481 	}
17482 
17483 	Zero(&t, sizeof(t));
17484 	// Get the user object
17485 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17486 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17487 
17488 	ret = ScGetUser(ps->Rpc, &t);
17489 	if (ret != ERR_NO_ERROR)
17490 	{
17491 		// An error has occured
17492 		CmdPrintError(c, ret);
17493 		FreeParamValueList(o);
17494 		return ret;
17495 	}
17496 
17497 	// Update the information
17498 	FreeAuthData(t.AuthType, t.AuthData);
17499 
17500 	{
17501 		AUTHRADIUS *a;
17502 
17503 		a = NewRadiusAuthData(GetParamUniStr(o, "ALIAS"));
17504 
17505 		// Set to Radius authentication
17506 		t.AuthType = AUTHTYPE_RADIUS;
17507 		t.AuthData = a;
17508 	}
17509 
17510 	// Write the user object
17511 	ret = ScSetUser(ps->Rpc, &t);
17512 
17513 	if (ret != ERR_NO_ERROR)
17514 	{
17515 		// An error has occured
17516 		CmdPrintError(c, ret);
17517 		FreeParamValueList(o);
17518 		return ret;
17519 	}
17520 
17521 	FreeRpcSetUser(&t);
17522 
17523 	FreeParamValueList(o);
17524 
17525 	return 0;
17526 }
17527 
17528 // Set the authentication method for the user to the NT domain authentication
PsUserNTLMSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17529 UINT PsUserNTLMSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17530 {
17531 	LIST *o;
17532 	PS *ps = (PS *)param;
17533 	UINT ret = 0;
17534 	RPC_SET_USER t;
17535 	// Parameter list that can be specified
17536 	PARAM args[] =
17537 	{
17538 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17539 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17540 		{"ALIAS", CmdPrompt, _UU("CMD_UserRadiusSet_Prompt_ALIAS"), NULL, NULL},
17541 	};
17542 
17543 	// If virtual HUB is not selected, it's an error
17544 	if (ps->HubName == NULL)
17545 	{
17546 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17547 		return ERR_INVALID_PARAMETER;
17548 	}
17549 
17550 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17551 	if (o == NULL)
17552 	{
17553 		return ERR_INVALID_PARAMETER;
17554 	}
17555 
17556 	Zero(&t, sizeof(t));
17557 	// Get the user object
17558 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17559 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17560 
17561 	ret = ScGetUser(ps->Rpc, &t);
17562 	if (ret != ERR_NO_ERROR)
17563 	{
17564 		// An error has occured
17565 		CmdPrintError(c, ret);
17566 		FreeParamValueList(o);
17567 		return ret;
17568 	}
17569 
17570 	// Update the information
17571 	FreeAuthData(t.AuthType, t.AuthData);
17572 
17573 	{
17574 		AUTHRADIUS *a;
17575 
17576 		a = NewRadiusAuthData(GetParamUniStr(o, "ALIAS"));
17577 
17578 		// Set to the NT domain authentication
17579 		t.AuthType = AUTHTYPE_NT;
17580 		t.AuthData = a;
17581 	}
17582 
17583 	// Write the user object
17584 	ret = ScSetUser(ps->Rpc, &t);
17585 
17586 	if (ret != ERR_NO_ERROR)
17587 	{
17588 		// An error has occured
17589 		CmdPrintError(c, ret);
17590 		FreeParamValueList(o);
17591 		return ret;
17592 	}
17593 
17594 	FreeRpcSetUser(&t);
17595 
17596 	FreeParamValueList(o);
17597 
17598 	return 0;
17599 }
17600 
17601 // Delete the security policy of the user
PsUserPolicyRemove(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17602 UINT PsUserPolicyRemove(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17603 {
17604 	LIST *o;
17605 	PS *ps = (PS *)param;
17606 	UINT ret = 0;
17607 	RPC_SET_USER t;
17608 	// Parameter list that can be specified
17609 	PARAM args[] =
17610 	{
17611 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17612 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17613 	};
17614 
17615 	// If virtual HUB is not selected, it's an error
17616 	if (ps->HubName == NULL)
17617 	{
17618 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17619 		return ERR_INVALID_PARAMETER;
17620 	}
17621 
17622 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17623 	if (o == NULL)
17624 	{
17625 		return ERR_INVALID_PARAMETER;
17626 	}
17627 
17628 	Zero(&t, sizeof(t));
17629 	// Get the user object
17630 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17631 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17632 
17633 	ret = ScGetUser(ps->Rpc, &t);
17634 	if (ret != ERR_NO_ERROR)
17635 	{
17636 		// An error has occured
17637 		CmdPrintError(c, ret);
17638 		FreeParamValueList(o);
17639 		return ret;
17640 	}
17641 
17642 	// Update
17643 	if (t.Policy != NULL)
17644 	{
17645 		Free(t.Policy);
17646 		t.Policy = NULL;
17647 	}
17648 
17649 	// Write the user object
17650 	ret = ScSetUser(ps->Rpc, &t);
17651 
17652 	if (ret != ERR_NO_ERROR)
17653 	{
17654 		// An error has occured
17655 		CmdPrintError(c, ret);
17656 		FreeParamValueList(o);
17657 		return ret;
17658 	}
17659 
17660 	FreeRpcSetUser(&t);
17661 
17662 	FreeParamValueList(o);
17663 
17664 	return 0;
17665 }
17666 
17667 // Set a security policy of the user
PsUserPolicySet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17668 UINT PsUserPolicySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17669 {
17670 	LIST *o;
17671 	PS *ps = (PS *)param;
17672 	UINT ret = 0;
17673 	RPC_SET_USER t;
17674 	// Parameter list that can be specified
17675 	PARAM args[] =
17676 	{
17677 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17678 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17679 		{"NAME", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLNAME"), CmdEvalNotEmpty, NULL},
17680 		{"VALUE", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLVALUE"), CmdEvalNotEmpty, NULL},
17681 	};
17682 
17683 	// If virtual HUB is not selected, it's an error
17684 	if (ps->HubName == NULL)
17685 	{
17686 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17687 		return ERR_INVALID_PARAMETER;
17688 	}
17689 
17690 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17691 	if (o == NULL)
17692 	{
17693 		return ERR_INVALID_PARAMETER;
17694 	}
17695 
17696 	Zero(&t, sizeof(t));
17697 	// Get the user object
17698 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17699 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17700 
17701 	ret = ScGetUser(ps->Rpc, &t);
17702 	if (ret != ERR_NO_ERROR)
17703 	{
17704 		// An error has occured
17705 		CmdPrintError(c, ret);
17706 		FreeParamValueList(o);
17707 		return ret;
17708 	}
17709 
17710 	// Update
17711 	if (t.Policy == NULL)
17712 	{
17713 		t.Policy = ClonePolicy(GetDefaultPolicy());
17714 	}
17715 
17716 	// Edit
17717 	if (EditPolicy(c, t.Policy, GetParamStr(o, "NAME"), GetParamStr(o, "VALUE"), false) == false)
17718 	{
17719 		ret = ERR_INVALID_PARAMETER;
17720 	}
17721 	else
17722 	{
17723 		// Write the user object
17724 		ret = ScSetUser(ps->Rpc, &t);
17725 
17726 		if (ret != ERR_NO_ERROR)
17727 		{
17728 			// An error has occured
17729 			CmdPrintError(c, ret);
17730 			FreeParamValueList(o);
17731 			return ret;
17732 		}
17733 	}
17734 
17735 	FreeRpcSetUser(&t);
17736 
17737 	FreeParamValueList(o);
17738 
17739 	return ret;
17740 }
17741 
17742 // Convert the string to a date and time
StrToDateTime64(char * str)17743 UINT64 StrToDateTime64(char *str)
17744 {
17745 	UINT64 ret = 0;
17746 	TOKEN_LIST *t;
17747 	UINT a, b, c, d, e, f;
17748 	// Validate arguments
17749 	if (str == NULL)
17750 	{
17751 		return INFINITE;
17752 	}
17753 
17754 	if (IsEmptyStr(str) || StrCmpi(str, "none") == 0)
17755 	{
17756 		return 0;
17757 	}
17758 
17759 	t = ParseToken(str, ":/,. \"");
17760 	if (t->NumTokens != 6)
17761 	{
17762 		FreeToken(t);
17763 		return INFINITE;
17764 	}
17765 
17766 	a = ToInt(t->Token[0]);
17767 	b = ToInt(t->Token[1]);
17768 	c = ToInt(t->Token[2]);
17769 	d = ToInt(t->Token[3]);
17770 	e = ToInt(t->Token[4]);
17771 	f = ToInt(t->Token[5]);
17772 
17773 	ret = INFINITE;
17774 
17775 	if (a >= 1000 && a <= 9999 && b >= 1 && b <= 12 && c >= 1 && c <= 31 &&
17776 		d <= 23 && e <= 59 && f <= 59)
17777 	{
17778 		SYSTEMTIME t;
17779 
17780 		Zero(&t, sizeof(t));
17781 		t.wYear = a;
17782 		t.wMonth = b;
17783 		t.wDay = c;
17784 		t.wHour = d;
17785 		t.wMinute = e;
17786 		t.wSecond = f;
17787 
17788 		ret = SystemToUINT64(&t);
17789 	}
17790 
17791 	FreeToken(t);
17792 
17793 	return ret;
17794 }
17795 
17796 // Evaluate the date and time string
CmdEvalDateTime(CONSOLE * c,wchar_t * str,void * param)17797 bool CmdEvalDateTime(CONSOLE *c, wchar_t *str, void *param)
17798 {
17799 	UINT64 ret;
17800 	char tmp[MAX_SIZE];
17801 	// Validate arguments
17802 	if (c == NULL || str == NULL)
17803 	{
17804 		return false;
17805 	}
17806 
17807 	UniToStr(tmp, sizeof(tmp), str);
17808 
17809 	ret = StrToDateTime64(tmp);
17810 
17811 	if (ret == INFINITE)
17812 	{
17813 		c->Write(c, _UU("CMD_EVAL_DATE_TIME_FAILED"));
17814 		return false;
17815 	}
17816 
17817 	return true;
17818 }
17819 
17820 // Set the expiration date of the user
PsUserExpiresSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17821 UINT PsUserExpiresSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17822 {
17823 	LIST *o;
17824 	PS *ps = (PS *)param;
17825 	UINT ret = 0;
17826 	RPC_SET_USER t;
17827 	UINT64 expires;
17828 	// Parameter list that can be specified
17829 	PARAM args[] =
17830 	{
17831 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17832 		{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17833 		{"EXPIRES", CmdPrompt, _UU("CMD_UserExpiresSet_Prompt_EXPIRES"), CmdEvalDateTime, NULL},
17834 	};
17835 
17836 	// If virtual HUB is not selected, it's an error
17837 	if (ps->HubName == NULL)
17838 	{
17839 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17840 		return ERR_INVALID_PARAMETER;
17841 	}
17842 
17843 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17844 	if (o == NULL)
17845 	{
17846 		return ERR_INVALID_PARAMETER;
17847 	}
17848 
17849 	Zero(&t, sizeof(t));
17850 	// Get the user object
17851 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17852 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17853 
17854 	ret = ScGetUser(ps->Rpc, &t);
17855 	if (ret != ERR_NO_ERROR)
17856 	{
17857 		// An error has occured
17858 		CmdPrintError(c, ret);
17859 		FreeParamValueList(o);
17860 		return ret;
17861 	}
17862 
17863 	// Update the information
17864 	expires = StrToDateTime64(GetParamStr(o, "EXPIRES"));
17865 
17866 	if (expires != 0)
17867 	{
17868 		expires = LocalToSystem64(expires);
17869 	}
17870 
17871 	t.ExpireTime = expires;
17872 
17873 	// Write the user object
17874 	ret = ScSetUser(ps->Rpc, &t);
17875 
17876 	if (ret != ERR_NO_ERROR)
17877 	{
17878 		// An error has occured
17879 		CmdPrintError(c, ret);
17880 		FreeParamValueList(o);
17881 		return ret;
17882 	}
17883 
17884 	FreeRpcSetUser(&t);
17885 
17886 	FreeParamValueList(o);
17887 
17888 	return 0;
17889 }
17890 
17891 // Get the group list
PsGroupList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17892 UINT PsGroupList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17893 {
17894 	LIST *o;
17895 	PS *ps = (PS *)param;
17896 	UINT ret = 0;
17897 	RPC_ENUM_GROUP t;
17898 
17899 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
17900 	if (o == NULL)
17901 	{
17902 		return ERR_INVALID_PARAMETER;
17903 	}
17904 
17905 	// If virtual HUB is not selected, it's an error
17906 	if (ps->HubName == NULL)
17907 	{
17908 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17909 		return ERR_INVALID_PARAMETER;
17910 	}
17911 
17912 	Zero(&t, sizeof(t));
17913 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17914 
17915 	// RPC call
17916 	ret = ScEnumGroup(ps->Rpc, &t);
17917 
17918 	if (ret != ERR_NO_ERROR)
17919 	{
17920 		// An error has occured
17921 		CmdPrintError(c, ret);
17922 		FreeParamValueList(o);
17923 		return ret;
17924 	}
17925 	else
17926 	{
17927 		CT *ct = CtNew();
17928 		UINT i;
17929 
17930 		CtInsertColumn(ct, _UU("SM_GROUPLIST_NAME"), false);
17931 		CtInsertColumn(ct, _UU("SM_GROUPLIST_REALNAME"), false);
17932 		CtInsertColumn(ct, _UU("SM_GROUPLIST_NOTE"), false);
17933 		CtInsertColumn(ct, _UU("SM_GROUPLIST_NUMUSERS"), false);
17934 
17935 		for (i = 0;i < t.NumGroup;i++)
17936 		{
17937 			wchar_t tmp1[MAX_SIZE];
17938 			wchar_t tmp2[MAX_SIZE];
17939 			RPC_ENUM_GROUP_ITEM *e = &t.Groups[i];
17940 
17941 			StrToUni(tmp1, sizeof(tmp1), e->Name);
17942 			UniToStru(tmp2, e->NumUsers);
17943 
17944 			CtInsert(ct, tmp1, e->Realname, e->Note, tmp2);
17945 		}
17946 
17947 		CtFreeEx(ct, c, true);
17948 	}
17949 
17950 	FreeRpcEnumGroup(&t);
17951 
17952 	FreeParamValueList(o);
17953 
17954 	return 0;
17955 }
17956 
17957 // Create a group
PsGroupCreate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)17958 UINT PsGroupCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
17959 {
17960 	LIST *o;
17961 	PS *ps = (PS *)param;
17962 	UINT ret = 0;
17963 	RPC_SET_GROUP t;
17964 	// Parameter list that can be specified
17965 	PARAM args[] =
17966 	{
17967 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
17968 		{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
17969 		{"REALNAME", CmdPrompt, _UU("CMD_GroupCreate_Prompt_REALNAME"), NULL, NULL},
17970 		{"NOTE", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NOTE"), NULL, NULL},
17971 	};
17972 
17973 	// If virtual HUB is not selected, it's an error
17974 	if (ps->HubName == NULL)
17975 	{
17976 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
17977 		return ERR_INVALID_PARAMETER;
17978 	}
17979 
17980 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
17981 	if (o == NULL)
17982 	{
17983 		return ERR_INVALID_PARAMETER;
17984 	}
17985 
17986 	Zero(&t, sizeof(t));
17987 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
17988 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
17989 	UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));
17990 	UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));
17991 
17992 	// RPC call
17993 	ret = ScCreateGroup(ps->Rpc, &t);
17994 
17995 	if (ret != ERR_NO_ERROR)
17996 	{
17997 		// An error has occured
17998 		CmdPrintError(c, ret);
17999 		FreeParamValueList(o);
18000 		return ret;
18001 	}
18002 
18003 	FreeRpcSetGroup(&t);
18004 
18005 	FreeParamValueList(o);
18006 
18007 	return 0;
18008 }
18009 
18010 // Set the group information
PsGroupSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18011 UINT PsGroupSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18012 {
18013 	LIST *o;
18014 	PS *ps = (PS *)param;
18015 	UINT ret = 0;
18016 	RPC_SET_GROUP t;
18017 	// Parameter list that can be specified
18018 	PARAM args[] =
18019 	{
18020 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18021 		{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
18022 		{"REALNAME", CmdPrompt, _UU("CMD_GroupCreate_Prompt_REALNAME"), NULL, NULL},
18023 		{"NOTE", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NOTE"), NULL, NULL},
18024 	};
18025 
18026 	// If virtual HUB is not selected, it's an error
18027 	if (ps->HubName == NULL)
18028 	{
18029 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18030 		return ERR_INVALID_PARAMETER;
18031 	}
18032 
18033 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18034 	if (o == NULL)
18035 	{
18036 		return ERR_INVALID_PARAMETER;
18037 	}
18038 
18039 	Zero(&t, sizeof(t));
18040 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18041 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
18042 
18043 	// RPC call
18044 	ret = ScGetGroup(ps->Rpc, &t);
18045 
18046 	if (ret != ERR_NO_ERROR)
18047 	{
18048 		// An error has occured
18049 		CmdPrintError(c, ret);
18050 		FreeParamValueList(o);
18051 		return ret;
18052 	}
18053 
18054 	// Information update
18055 	UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));
18056 	UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));
18057 
18058 	// RPC call
18059 	ret = ScSetGroup(ps->Rpc, &t);
18060 
18061 	if (ret != ERR_NO_ERROR)
18062 	{
18063 		// An error has occured
18064 		CmdPrintError(c, ret);
18065 		FreeParamValueList(o);
18066 		return ret;
18067 	}
18068 
18069 	FreeRpcSetGroup(&t);
18070 
18071 	FreeParamValueList(o);
18072 
18073 	return 0;
18074 }
18075 
18076 // Delete a group
PsGroupDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18077 UINT PsGroupDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18078 {
18079 	LIST *o;
18080 	PS *ps = (PS *)param;
18081 	UINT ret = 0;
18082 	RPC_DELETE_USER t;
18083 	// Parameter list that can be specified
18084 	PARAM args[] =
18085 	{
18086 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18087 		{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
18088 	};
18089 
18090 	// If virtual HUB is not selected, it's an error
18091 	if (ps->HubName == NULL)
18092 	{
18093 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18094 		return ERR_INVALID_PARAMETER;
18095 	}
18096 
18097 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18098 	if (o == NULL)
18099 	{
18100 		return ERR_INVALID_PARAMETER;
18101 	}
18102 
18103 	Zero(&t, sizeof(t));
18104 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18105 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
18106 
18107 	// RPC call
18108 	ret = ScDeleteGroup(ps->Rpc, &t);
18109 
18110 	if (ret != ERR_NO_ERROR)
18111 	{
18112 		// An error has occured
18113 		CmdPrintError(c, ret);
18114 		FreeParamValueList(o);
18115 		return ret;
18116 	}
18117 
18118 	FreeParamValueList(o);
18119 
18120 	return 0;
18121 }
18122 
18123 // 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)18124 UINT PsGroupGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18125 {
18126 	LIST *o;
18127 	PS *ps = (PS *)param;
18128 	UINT ret = 0;
18129 	RPC_SET_GROUP t;
18130 	// Parameter list that can be specified
18131 	PARAM args[] =
18132 	{
18133 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18134 		{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
18135 	};
18136 
18137 	// If virtual HUB is not selected, it's an error
18138 	if (ps->HubName == NULL)
18139 	{
18140 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18141 		return ERR_INVALID_PARAMETER;
18142 	}
18143 
18144 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18145 	if (o == NULL)
18146 	{
18147 		return ERR_INVALID_PARAMETER;
18148 	}
18149 
18150 	Zero(&t, sizeof(t));
18151 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18152 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
18153 
18154 	// RPC call
18155 	ret = ScGetGroup(ps->Rpc, &t);
18156 
18157 	if (ret != ERR_NO_ERROR)
18158 	{
18159 		// An error has occured
18160 		CmdPrintError(c, ret);
18161 		FreeParamValueList(o);
18162 		return ret;
18163 	}
18164 	else
18165 	{
18166 		wchar_t tmp[MAX_SIZE];
18167 		char groupname[MAX_USERNAME_LEN + 1];
18168 		CT *ct = CtNewStandard();
18169 
18170 		StrCpy(groupname, sizeof(groupname), t.Name);
18171 
18172 		StrToUni(tmp, sizeof(tmp), t.Name);
18173 		CtInsert(ct, _UU("CMD_GroupGet_Column_NAME"), tmp);
18174 		CtInsert(ct, _UU("CMD_GroupGet_Column_REALNAME"), t.Realname);
18175 		CtInsert(ct, _UU("CMD_GroupGet_Column_NOTE"), t.Note);
18176 
18177 		CtFree(ct, c);
18178 
18179 		if (t.Policy != NULL)
18180 		{
18181 			c->Write(c, L"");
18182 			c->Write(c, _UU("CMD_GroupGet_Column_POLICY"));
18183 
18184 			PrintPolicy(c, t.Policy, false);
18185 		}
18186 
18187 		{
18188 			RPC_ENUM_USER t;
18189 			bool b = false;
18190 
18191 			Zero(&t, sizeof(t));
18192 
18193 			StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18194 
18195 			if (ScEnumUser(ps->Rpc, &t) == ERR_NO_ERROR)
18196 			{
18197 				UINT i;
18198 
18199 				for (i = 0;i < t.NumUser;i++)
18200 				{
18201 					RPC_ENUM_USER_ITEM *u = &t.Users[i];
18202 
18203 					if (StrCmpi(u->GroupName, groupname) == 0)
18204 					{
18205 						if (b == false)
18206 						{
18207 							b = true;
18208 							c->Write(c, L"");
18209 							c->Write(c, _UU("CMD_GroupGet_Column_MEMBERS"));
18210 						}
18211 
18212 						UniFormat(tmp, sizeof(tmp), L" %S", u->Name);
18213 						c->Write(c, tmp);
18214 					}
18215 				}
18216 				FreeRpcEnumUser(&t);
18217 
18218 				if (b)
18219 				{
18220 					c->Write(c, L"");
18221 				}
18222 			}
18223 		}
18224 
18225 	}
18226 
18227 	FreeRpcSetGroup(&t);
18228 
18229 	FreeParamValueList(o);
18230 
18231 	return 0;
18232 }
18233 
18234 // Add an user to the group
PsGroupJoin(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18235 UINT PsGroupJoin(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18236 {
18237 	LIST *o;
18238 	PS *ps = (PS *)param;
18239 	UINT ret = 0;
18240 	RPC_SET_USER t;
18241 	// Parameter list that can be specified
18242 	PARAM args[] =
18243 	{
18244 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18245 		{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
18246 		{"USERNAME", CmdPrompt, _UU("CMD_GroupJoin_Prompt_USERNAME"), CmdEvalNotEmpty, NULL},
18247 	};
18248 
18249 	// If virtual HUB is not selected, it's an error
18250 	if (ps->HubName == NULL)
18251 	{
18252 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18253 		return ERR_INVALID_PARAMETER;
18254 	}
18255 
18256 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18257 	if (o == NULL)
18258 	{
18259 		return ERR_INVALID_PARAMETER;
18260 	}
18261 
18262 	Zero(&t, sizeof(t));
18263 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18264 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "USERNAME"));
18265 
18266 	// RPC call
18267 	ret = ScGetUser(ps->Rpc, &t);
18268 
18269 	if (ret != ERR_NO_ERROR)
18270 	{
18271 		// An error has occured
18272 		CmdPrintError(c, ret);
18273 		FreeParamValueList(o);
18274 		return ret;
18275 	}
18276 	else
18277 	{
18278 		// Update the Group
18279 		StrCpy(t.GroupName, sizeof(t.GroupName), GetParamStr(o, "[name]"));
18280 
18281 		ret = ScSetUser(ps->Rpc, &t);
18282 
18283 		if (ret != ERR_NO_ERROR)
18284 		{
18285 			// An error has occured
18286 			CmdPrintError(c, ret);
18287 			FreeParamValueList(o);
18288 			return ret;
18289 		}
18290 	}
18291 
18292 	FreeRpcSetUser(&t);
18293 
18294 	FreeParamValueList(o);
18295 
18296 	return 0;
18297 }
18298 
18299 // Delete the user from a group
PsGroupUnjoin(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18300 UINT PsGroupUnjoin(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18301 {
18302 	LIST *o;
18303 	PS *ps = (PS *)param;
18304 	UINT ret = 0;
18305 	RPC_SET_USER t;
18306 	// Parameter list that can be specified
18307 	PARAM args[] =
18308 	{
18309 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18310 		{"[name]", CmdPrompt, _UU("CMD_GroupUnjoin_Prompt_name"), CmdEvalNotEmpty, NULL},
18311 	};
18312 
18313 	// If virtual HUB is not selected, it's an error
18314 	if (ps->HubName == NULL)
18315 	{
18316 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18317 		return ERR_INVALID_PARAMETER;
18318 	}
18319 
18320 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18321 	if (o == NULL)
18322 	{
18323 		return ERR_INVALID_PARAMETER;
18324 	}
18325 
18326 	Zero(&t, sizeof(t));
18327 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18328 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
18329 
18330 	// RPC call
18331 	ret = ScGetUser(ps->Rpc, &t);
18332 
18333 	if (ret != ERR_NO_ERROR)
18334 	{
18335 		// An error has occured
18336 		CmdPrintError(c, ret);
18337 		FreeParamValueList(o);
18338 		return ret;
18339 	}
18340 	else
18341 	{
18342 		// Update the Group
18343 		StrCpy(t.GroupName, sizeof(t.GroupName), "");
18344 
18345 		ret = ScSetUser(ps->Rpc, &t);
18346 
18347 		if (ret != ERR_NO_ERROR)
18348 		{
18349 			// An error has occured
18350 			CmdPrintError(c, ret);
18351 			FreeParamValueList(o);
18352 			return ret;
18353 		}
18354 	}
18355 
18356 	FreeRpcSetUser(&t);
18357 
18358 	FreeParamValueList(o);
18359 
18360 	return 0;
18361 }
18362 
18363 // Delete the security policy of the group
PsGroupPolicyRemove(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18364 UINT PsGroupPolicyRemove(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18365 {
18366 	LIST *o;
18367 	PS *ps = (PS *)param;
18368 	UINT ret = 0;
18369 	RPC_SET_GROUP t;
18370 	// Parameter list that can be specified
18371 	PARAM args[] =
18372 	{
18373 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18374 		{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
18375 	};
18376 
18377 	// If virtual HUB is not selected, it's an error
18378 	if (ps->HubName == NULL)
18379 	{
18380 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18381 		return ERR_INVALID_PARAMETER;
18382 	}
18383 
18384 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18385 	if (o == NULL)
18386 	{
18387 		return ERR_INVALID_PARAMETER;
18388 	}
18389 
18390 	Zero(&t, sizeof(t));
18391 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18392 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
18393 
18394 	// RPC call
18395 	ret = ScGetGroup(ps->Rpc, &t);
18396 
18397 	if (ret != ERR_NO_ERROR)
18398 	{
18399 		// An error has occured
18400 		CmdPrintError(c, ret);
18401 		FreeParamValueList(o);
18402 		return ret;
18403 	}
18404 	else
18405 	{
18406 		// Update
18407 		if (t.Policy != NULL)
18408 		{
18409 			Free(t.Policy);
18410 			t.Policy = NULL;
18411 		}
18412 
18413 		ret = ScSetGroup(ps->Rpc, &t);
18414 
18415 		if (ret != ERR_NO_ERROR)
18416 		{
18417 			// An error has occured
18418 			CmdPrintError(c, ret);
18419 			FreeParamValueList(o);
18420 			return ret;
18421 		}
18422 	}
18423 
18424 	FreeRpcSetGroup(&t);
18425 
18426 	FreeParamValueList(o);
18427 
18428 	return 0;
18429 }
18430 
18431 // Set a security policy to a group
PsGroupPolicySet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18432 UINT PsGroupPolicySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18433 {
18434 	LIST *o;
18435 	PS *ps = (PS *)param;
18436 	UINT ret = 0;
18437 	RPC_SET_GROUP t;
18438 	// Parameter list that can be specified
18439 	PARAM args[] =
18440 	{
18441 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18442 		{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
18443 		{"NAME", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLNAME"), CmdEvalNotEmpty, NULL},
18444 		{"VALUE", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLVALUE"), CmdEvalNotEmpty, NULL},
18445 	};
18446 
18447 	// If virtual HUB is not selected, it's an error
18448 	if (ps->HubName == NULL)
18449 	{
18450 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18451 		return ERR_INVALID_PARAMETER;
18452 	}
18453 
18454 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18455 	if (o == NULL)
18456 	{
18457 		return ERR_INVALID_PARAMETER;
18458 	}
18459 
18460 	Zero(&t, sizeof(t));
18461 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18462 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
18463 
18464 	// RPC call
18465 	ret = ScGetGroup(ps->Rpc, &t);
18466 
18467 	if (ret != ERR_NO_ERROR)
18468 	{
18469 		// An error has occured
18470 		CmdPrintError(c, ret);
18471 		FreeParamValueList(o);
18472 		return ret;
18473 	}
18474 	else
18475 	{
18476 		// Update
18477 		if (t.Policy == NULL)
18478 		{
18479 			t.Policy = ClonePolicy(GetDefaultPolicy());
18480 		}
18481 
18482 		if (EditPolicy(c, t.Policy, GetParamStr(o, "NAME"), GetParamStr(o, "VALUE"), false) == false)
18483 		{
18484 			// An error has occured
18485 			FreeRpcSetGroup(&t);
18486 			CmdPrintError(c, ret);
18487 			FreeParamValueList(o);
18488 			return ERR_INTERNAL_ERROR;
18489 		}
18490 
18491 		ret = ScSetGroup(ps->Rpc, &t);
18492 
18493 		if (ret != ERR_NO_ERROR)
18494 		{
18495 			// An error has occured
18496 			CmdPrintError(c, ret);
18497 			FreeParamValueList(o);
18498 			return ret;
18499 		}
18500 	}
18501 
18502 	FreeRpcSetGroup(&t);
18503 
18504 	FreeParamValueList(o);
18505 
18506 	return 0;
18507 }
18508 
18509 // Get the connected session list
PsSessionList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18510 UINT PsSessionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18511 {
18512 	LIST *o;
18513 	PS *ps = (PS *)param;
18514 	UINT ret = 0;
18515 	RPC_ENUM_SESSION t;
18516 	UINT server_type = 0;
18517 
18518 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
18519 	if (o == NULL)
18520 	{
18521 		return ERR_INVALID_PARAMETER;
18522 	}
18523 
18524 	// If virtual HUB is not selected, it's an error
18525 	if (ps->HubName == NULL)
18526 	{
18527 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18528 		return ERR_INVALID_PARAMETER;
18529 	}
18530 
18531 	{
18532 		// Get the server type
18533 		RPC_SERVER_INFO t;
18534 
18535 		Zero(&t, sizeof(t));
18536 
18537 		if (ScGetServerInfo(ps->Rpc, &t) == ERR_NO_ERROR)
18538 		{
18539 			server_type = t.ServerType;
18540 
18541 			FreeRpcServerInfo(&t);
18542 		}
18543 	}
18544 
18545 	Zero(&t, sizeof(t));
18546 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18547 
18548 	// RPC call
18549 	ret = ScEnumSession(ps->Rpc, &t);
18550 
18551 	if (ret != ERR_NO_ERROR)
18552 	{
18553 		// An error has occured
18554 		CmdPrintError(c, ret);
18555 		FreeParamValueList(o);
18556 		return ret;
18557 	}
18558 	else
18559 	{
18560 		CT *ct = CtNew();
18561 		UINT i;
18562 
18563 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_1"), false);
18564 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_8"), false);
18565 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_2"), false);
18566 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_3"), false);
18567 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_4"), false);
18568 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_5"), true);
18569 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_6"), true);
18570 		CtInsertColumn(ct, _UU("SM_SESS_COLUMN_7"), true);
18571 
18572 		for (i = 0;i < t.NumSession;i++)
18573 		{
18574 			RPC_ENUM_SESSION_ITEM *e = &t.Sessions[i];
18575 			wchar_t tmp1[MAX_SIZE];
18576 			wchar_t *tmp2;
18577 			wchar_t tmp3[MAX_SIZE];
18578 			wchar_t tmp4[MAX_SIZE];
18579 			wchar_t tmp5[MAX_SIZE];
18580 			wchar_t tmp6[MAX_SIZE];
18581 			wchar_t tmp7[MAX_SIZE];
18582 			wchar_t tmp8[MAX_SIZE];
18583 			bool free_tmp2 = false;
18584 
18585 			StrToUni(tmp1, sizeof(tmp1), e->Name);
18586 
18587 			tmp2 = _UU("SM_SESS_NORMAL");
18588 			if (server_type != SERVER_TYPE_STANDALONE)
18589 			{
18590 				if (e->RemoteSession)
18591 				{
18592 					tmp2 = ZeroMalloc(MAX_SIZE);
18593 					UniFormat(tmp2, MAX_SIZE, _UU("SM_SESS_REMOTE"), e->RemoteHostname);
18594 					free_tmp2 = true;
18595 				}
18596 				else
18597 				{
18598 					if (StrLen(e->RemoteHostname) == 0)
18599 					{
18600 						tmp2 = _UU("SM_SESS_LOCAL");
18601 					}
18602 					else
18603 					{
18604 						tmp2 = ZeroMalloc(MAX_SIZE);
18605 						UniFormat(tmp2, MAX_SIZE, _UU("SM_SESS_LOCAL_2"), e->RemoteHostname);
18606 						free_tmp2 = true;
18607 					}
18608 				}
18609 			}
18610 			if (e->LinkMode)
18611 			{
18612 				if (free_tmp2)
18613 				{
18614 					Free(tmp2);
18615 					free_tmp2 = false;
18616 				}
18617 				tmp2 = _UU("SM_SESS_LINK");
18618 			}
18619 			else if (e->SecureNATMode)
18620 			{
18621 				/*if (free_tmp2)
18622 				{
18623 					Free(tmp2);
18624 					free_tmp2 = false;
18625 				}*/
18626 				tmp2 = _UU("SM_SESS_SNAT");
18627 			}
18628 
18629 			StrToUni(tmp3, sizeof(tmp3), e->Username);
18630 
18631 			StrToUni(tmp4, sizeof(tmp4), e->Hostname);
18632 			if (e->LinkMode)
18633 			{
18634 				UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_LINK_HOSTNAME"));
18635 			}
18636 			else if (e->SecureNATMode)
18637 			{
18638 				UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_SNAT_HOSTNAME"));
18639 			}
18640 			else if (e->BridgeMode)
18641 			{
18642 				UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_BRIDGE_HOSTNAME"));
18643 			}
18644 			else if (StartWith(e->Username, L3_USERNAME))
18645 			{
18646 				UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_LAYER3_HOSTNAME"));
18647 			}
18648 
18649 			UniFormat(tmp5, sizeof(tmp5), L"%u / %u", e->CurrentNumTcp, e->MaxNumTcp);
18650 			if (e->LinkMode)
18651 			{
18652 				UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_LINK_TCP"));
18653 			}
18654 			else if (e->SecureNATMode)
18655 			{
18656 				UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_SNAT_TCP"));
18657 			}
18658 			else if (e->BridgeMode)
18659 			{
18660 				UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_BRIDGE_TCP"));
18661 			}
18662 
18663 			UniToStr3(tmp6, sizeof(tmp6), e->PacketSize);
18664 			UniToStr3(tmp7, sizeof(tmp7), e->PacketNum);
18665 
18666 			if (e->VLanId == 0)
18667 			{
18668 				UniStrCpy(tmp8, sizeof(tmp8), _UU("CM_ST_NO_VLAN"));
18669 			}
18670 			else
18671 			{
18672 				UniToStru(tmp8, e->VLanId);
18673 			}
18674 
18675 			CtInsert(ct, tmp1, tmp8, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);
18676 
18677 			if (free_tmp2)
18678 			{
18679 				Free(tmp2);
18680 			}
18681 		}
18682 
18683 
18684 		CtFreeEx(ct, c, true);
18685 	}
18686 
18687 	FreeRpcEnumSession(&t);
18688 
18689 	FreeParamValueList(o);
18690 
18691 	return 0;
18692 }
18693 
18694 // Display the NODE_INFO
CmdPrintNodeInfo(CT * ct,NODE_INFO * info)18695 void CmdPrintNodeInfo(CT *ct, NODE_INFO *info)
18696 {
18697 	wchar_t tmp[MAX_SIZE];
18698 	char str[MAX_SIZE];
18699 	// Validate arguments
18700 	if (ct == NULL || info == NULL)
18701 	{
18702 		return;
18703 	}
18704 
18705 	StrToUni(tmp, sizeof(tmp), info->ClientProductName);
18706 	CtInsert(ct, _UU("SM_NODE_CLIENT_NAME"), tmp);
18707 
18708 	UniFormat(tmp, sizeof(tmp), L"%u.%02u", Endian32(info->ClientProductVer) / 100, Endian32(info->ClientProductVer) % 100);
18709 	CtInsert(ct, _UU("SM_NODE_CLIENT_VER"), tmp);
18710 
18711 	UniFormat(tmp, sizeof(tmp), L"Build %u", Endian32(info->ClientProductBuild));
18712 	CtInsert(ct, _UU("SM_NODE_CLIENT_BUILD"), tmp);
18713 
18714 	StrToUni(tmp, sizeof(tmp), info->ClientOsName);
18715 	CtInsert(ct, _UU("SM_NODE_CLIENT_OS_NAME"), tmp);
18716 
18717 	StrToUni(tmp, sizeof(tmp), info->ClientOsVer);
18718 	CtInsert(ct, _UU("SM_NODE_CLIENT_OS_VER"), tmp);
18719 
18720 	StrToUni(tmp, sizeof(tmp), info->ClientOsProductId);
18721 	CtInsert(ct, _UU("SM_NODE_CLIENT_OS_PID"), tmp);
18722 
18723 	StrToUni(tmp, sizeof(tmp), info->ClientHostname);
18724 	CtInsert(ct, _UU("SM_NODE_CLIENT_HOST"), tmp);
18725 
18726 	IPToStr4or6(str, sizeof(str), info->ClientIpAddress, info->ClientIpAddress6);
18727 	StrToUni(tmp, sizeof(tmp), str);
18728 	CtInsert(ct, _UU("SM_NODE_CLIENT_IP"), tmp);
18729 
18730 	UniToStru(tmp, Endian32(info->ClientPort));
18731 	CtInsert(ct, _UU("SM_NODE_CLIENT_PORT"), tmp);
18732 
18733 	StrToUni(tmp, sizeof(tmp), info->ServerHostname);
18734 	CtInsert(ct, _UU("SM_NODE_SERVER_HOST"), tmp);
18735 
18736 	IPToStr4or6(str, sizeof(str), info->ServerIpAddress, info->ServerIpAddress6);
18737 	StrToUni(tmp, sizeof(tmp), str);
18738 	CtInsert(ct, _UU("SM_NODE_SERVER_IP"), tmp);
18739 
18740 	UniToStru(tmp, Endian32(info->ServerPort));
18741 	CtInsert(ct, _UU("SM_NODE_SERVER_PORT"), tmp);
18742 
18743 	if (StrLen(info->ProxyHostname) != 0)
18744 	{
18745 		StrToUni(tmp, sizeof(tmp), info->ProxyHostname);
18746 		CtInsert(ct, _UU("SM_NODE_PROXY_HOSTNAME"), tmp);
18747 
18748 		IPToStr4or6(str, sizeof(str), info->ProxyIpAddress, info->ProxyIpAddress6);
18749 		StrToUni(tmp, sizeof(tmp), str);
18750 		CtInsert(ct, _UU("SM_NODE_PROXY_IP"), tmp);
18751 
18752 		UniToStru(tmp, Endian32(info->ProxyPort));
18753 		CtInsert(ct, _UU("SM_NODE_PROXY_PORT"), tmp);
18754 	}
18755 }
18756 
18757 // Get the session information
PsSessionGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18758 UINT PsSessionGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18759 {
18760 	LIST *o;
18761 	PS *ps = (PS *)param;
18762 	UINT ret = 0;
18763 	RPC_SESSION_STATUS t;
18764 	// Parameter list that can be specified
18765 	PARAM args[] =
18766 	{
18767 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18768 		{"[name]", CmdPrompt, _UU("CMD_SessionGet_Prompt_NAME"), CmdEvalNotEmpty, NULL},
18769 	};
18770 
18771 	// If virtual HUB is not selected, it's an error
18772 	if (ps->HubName == NULL)
18773 	{
18774 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18775 		return ERR_INVALID_PARAMETER;
18776 	}
18777 
18778 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18779 	if (o == NULL)
18780 	{
18781 		return ERR_INVALID_PARAMETER;
18782 	}
18783 
18784 	Zero(&t, sizeof(t));
18785 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18786 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
18787 
18788 	// RPC call
18789 	ret = ScGetSessionStatus(ps->Rpc, &t);
18790 
18791 	if (ret != ERR_NO_ERROR)
18792 	{
18793 		// An error has occured
18794 		CmdPrintError(c, ret);
18795 		FreeParamValueList(o);
18796 		return ret;
18797 	}
18798 	else
18799 	{
18800 		wchar_t tmp[MAX_SIZE];
18801 		char str[MAX_SIZE];
18802 		CT *ct = CtNewStandard();
18803 
18804 		if (t.ClientIp != 0)
18805 		{
18806 			IPToStr4or6(str, sizeof(str), t.ClientIp, t.ClientIp6);
18807 			StrToUni(tmp, sizeof(tmp), str);
18808 			CtInsert(ct, _UU("SM_CLIENT_IP"), tmp);
18809 		}
18810 
18811 		if (StrLen(t.ClientHostName) != 0)
18812 		{
18813 			StrToUni(tmp, sizeof(tmp), t.ClientHostName);
18814 			CtInsert(ct, _UU("SM_CLIENT_HOSTNAME"), tmp);
18815 		}
18816 
18817 		StrToUni(tmp, sizeof(tmp), t.Username);
18818 		CtInsert(ct, _UU("SM_SESS_STATUS_USERNAME"), tmp);
18819 
18820 		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)
18821 		{
18822 			StrToUni(tmp, sizeof(tmp), t.RealUsername);
18823 			CtInsert(ct, _UU("SM_SESS_STATUS_REALUSER"), tmp);
18824 		}
18825 
18826 		if (IsEmptyStr(t.GroupName) == false)
18827 		{
18828 			StrToUni(tmp, sizeof(tmp), t.GroupName);
18829 			CtInsert(ct, _UU("SM_SESS_STATUS_GROUPNAME"), tmp);
18830 		}
18831 
18832 
18833 		CmdPrintStatusToListViewEx(ct, &t.Status, true);
18834 
18835 		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 &&
18836 			StartWith(t.Username, L3_USERNAME) == false)
18837 		{
18838 			CmdPrintNodeInfo(ct, &t.NodeInfo);
18839 		}
18840 
18841 		CtFree(ct, c);
18842 	}
18843 
18844 	FreeRpcSessionStatus(&t);
18845 
18846 	FreeParamValueList(o);
18847 
18848 	return 0;
18849 }
18850 
18851 // Disconnect the session
PsSessionDisconnect(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18852 UINT PsSessionDisconnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18853 {
18854 	LIST *o;
18855 	PS *ps = (PS *)param;
18856 	UINT ret = 0;
18857 	RPC_DELETE_SESSION t;
18858 	// Parameter list that can be specified
18859 	PARAM args[] =
18860 	{
18861 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18862 		{"[name]", CmdPrompt, _UU("CMD_SessionGet_Prompt_NAME"), CmdEvalNotEmpty, NULL},
18863 	};
18864 
18865 	// If virtual HUB is not selected, it's an error
18866 	if (ps->HubName == NULL)
18867 	{
18868 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18869 		return ERR_INVALID_PARAMETER;
18870 	}
18871 
18872 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18873 	if (o == NULL)
18874 	{
18875 		return ERR_INVALID_PARAMETER;
18876 	}
18877 
18878 	Zero(&t, sizeof(t));
18879 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18880 	StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
18881 
18882 	// RPC call
18883 	ret = ScDeleteSession(ps->Rpc, &t);
18884 
18885 	if (ret != ERR_NO_ERROR)
18886 	{
18887 		// An error has occured
18888 		CmdPrintError(c, ret);
18889 		FreeParamValueList(o);
18890 		return ret;
18891 	}
18892 
18893 	FreeParamValueList(o);
18894 
18895 	return 0;
18896 }
18897 
18898 // Get the MAC address table database
PsMacTable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)18899 UINT PsMacTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
18900 {
18901 	LIST *o;
18902 	PS *ps = (PS *)param;
18903 	UINT ret = 0;
18904 	RPC_ENUM_MAC_TABLE t;
18905 	UINT i;
18906 
18907 	// Parameter list that can be specified
18908 	PARAM args[] =
18909 	{
18910 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
18911 		{"[session_name]", NULL, NULL, NULL, NULL,}
18912 	};
18913 
18914 	// If virtual HUB is not selected, it's an error
18915 	if (ps->HubName == NULL)
18916 	{
18917 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
18918 		return ERR_INVALID_PARAMETER;
18919 	}
18920 
18921 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
18922 	if (o == NULL)
18923 	{
18924 		return ERR_INVALID_PARAMETER;
18925 	}
18926 
18927 	Zero(&t, sizeof(t));
18928 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
18929 
18930 	// RPC call
18931 	ret = ScEnumMacTable(ps->Rpc, &t);
18932 
18933 	if (ret != ERR_NO_ERROR)
18934 	{
18935 		// An error has occured
18936 		CmdPrintError(c, ret);
18937 		FreeParamValueList(o);
18938 		return ret;
18939 	}
18940 	else
18941 	{
18942 		CT *ct = CtNew();
18943 		char *session_name = GetParamStr(o, "[session_name]");
18944 
18945 		if (IsEmptyStr(session_name))
18946 		{
18947 			session_name = NULL;
18948 		}
18949 
18950 		CtInsertColumn(ct, _UU("CMD_ID"), false);
18951 		CtInsertColumn(ct, _UU("SM_MAC_COLUMN_1"), false);
18952 		CtInsertColumn(ct, _UU("SM_MAC_COLUMN_1A"), false);
18953 		CtInsertColumn(ct, _UU("SM_MAC_COLUMN_2"), false);
18954 		CtInsertColumn(ct, _UU("SM_MAC_COLUMN_3"), false);
18955 		CtInsertColumn(ct, _UU("SM_MAC_COLUMN_4"), false);
18956 		CtInsertColumn(ct, _UU("SM_MAC_COLUMN_5"), false);
18957 
18958 		for (i = 0;i < t.NumMacTable;i++)
18959 		{
18960 			char str[MAX_SIZE];
18961 			wchar_t tmp0[128];
18962 			wchar_t tmp1[MAX_SIZE];
18963 			wchar_t tmp2[MAX_SIZE];
18964 			wchar_t tmp3[MAX_SIZE];
18965 			wchar_t tmp4[MAX_SIZE];
18966 			wchar_t tmp5[MAX_SIZE];
18967 			wchar_t tmp6[MAX_SIZE];
18968 
18969 			RPC_ENUM_MAC_TABLE_ITEM *e = &t.MacTables[i];
18970 
18971 			if (session_name == NULL || StrCmpi(e->SessionName, session_name) == 0)
18972 			{
18973 				UniToStru(tmp0, e->Key);
18974 
18975 				StrToUni(tmp1, sizeof(tmp1), e->SessionName);
18976 
18977 				MacToStr(str, sizeof(str), e->MacAddress);
18978 				StrToUni(tmp2, sizeof(tmp2), str);
18979 
18980 				GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->CreatedTime));
18981 
18982 				GetDateTimeStr64Uni(tmp4, sizeof(tmp4), SystemToLocal64(e->UpdatedTime));
18983 
18984 				if (StrLen(e->RemoteHostname) == 0)
18985 				{
18986 					UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_MACIP_LOCAL"));
18987 				}
18988 				else
18989 				{
18990 					UniFormat(tmp5, sizeof(tmp5), _UU("SM_MACIP_SERVER"), e->RemoteHostname);
18991 				}
18992 
18993 				UniToStru(tmp6, e->VlanId);
18994 				if (e->VlanId == 0)
18995 				{
18996 					UniStrCpy(tmp6, sizeof(tmp6), _UU("CM_ST_NONE"));
18997 				}
18998 
18999 				CtInsert(ct,
19000 					tmp0, tmp1, tmp6, tmp2, tmp3, tmp4, tmp5);
19001 			}
19002 		}
19003 
19004 		CtFreeEx(ct, c, true);
19005 	}
19006 
19007 	FreeRpcEnumMacTable(&t);
19008 
19009 	FreeParamValueList(o);
19010 
19011 	return 0;
19012 }
19013 
19014 // Delete a MAC address table entry
PsMacDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19015 UINT PsMacDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19016 {
19017 	LIST *o;
19018 	PS *ps = (PS *)param;
19019 	UINT ret = 0;
19020 	RPC_DELETE_TABLE t;
19021 	// Parameter list that can be specified
19022 	PARAM args[] =
19023 	{
19024 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
19025 		{"[id]", CmdPrompt, _UU("CMD_MacDelete_Prompt"), CmdEvalNotEmpty, NULL},
19026 	};
19027 
19028 	// If virtual HUB is not selected, it's an error
19029 	if (ps->HubName == NULL)
19030 	{
19031 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19032 		return ERR_INVALID_PARAMETER;
19033 	}
19034 
19035 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
19036 	if (o == NULL)
19037 	{
19038 		return ERR_INVALID_PARAMETER;
19039 	}
19040 
19041 	Zero(&t, sizeof(t));
19042 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19043 	t.Key = GetParamInt(o, "[id]");
19044 
19045 	// RPC call
19046 	ret = ScDeleteMacTable(ps->Rpc, &t);
19047 
19048 	if (ret != ERR_NO_ERROR)
19049 	{
19050 		// An error has occured
19051 		CmdPrintError(c, ret);
19052 		FreeParamValueList(o);
19053 		return ret;
19054 	}
19055 
19056 	FreeParamValueList(o);
19057 
19058 	return 0;
19059 }
19060 
19061 // Get the IP address table database
PsIpTable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19062 UINT PsIpTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19063 {
19064 	LIST *o;
19065 	PS *ps = (PS *)param;
19066 	UINT ret = 0;
19067 	RPC_ENUM_IP_TABLE t;
19068 	UINT i;
19069 
19070 	// Parameter list that can be specified
19071 	PARAM args[] =
19072 	{
19073 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
19074 		{"[session_name]", NULL, NULL, NULL, NULL,}
19075 	};
19076 
19077 	// If virtual HUB is not selected, it's an error
19078 	if (ps->HubName == NULL)
19079 	{
19080 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19081 		return ERR_INVALID_PARAMETER;
19082 	}
19083 
19084 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
19085 	if (o == NULL)
19086 	{
19087 		return ERR_INVALID_PARAMETER;
19088 	}
19089 
19090 	Zero(&t, sizeof(t));
19091 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19092 
19093 	// RPC call
19094 	ret = ScEnumIpTable(ps->Rpc, &t);
19095 
19096 	if (ret != ERR_NO_ERROR)
19097 	{
19098 		// An error has occured
19099 		CmdPrintError(c, ret);
19100 		FreeParamValueList(o);
19101 		return ret;
19102 	}
19103 	else
19104 	{
19105 		CT *ct = CtNew();
19106 		char *session_name = GetParamStr(o, "[session_name]");
19107 
19108 		if (IsEmptyStr(session_name))
19109 		{
19110 			session_name = NULL;
19111 		}
19112 
19113 		CtInsertColumn(ct, _UU("CMD_ID"), false);
19114 		CtInsertColumn(ct, _UU("SM_IP_COLUMN_1"), false);
19115 		CtInsertColumn(ct, _UU("SM_IP_COLUMN_2"), false);
19116 		CtInsertColumn(ct, _UU("SM_IP_COLUMN_3"), false);
19117 		CtInsertColumn(ct, _UU("SM_IP_COLUMN_4"), false);
19118 		CtInsertColumn(ct, _UU("SM_IP_COLUMN_5"), false);
19119 
19120 		for (i = 0;i < t.NumIpTable;i++)
19121 		{
19122 			char str[MAX_SIZE];
19123 			wchar_t tmp0[128];
19124 			wchar_t tmp1[MAX_SIZE];
19125 			wchar_t tmp2[MAX_SIZE];
19126 			wchar_t tmp3[MAX_SIZE];
19127 			wchar_t tmp4[MAX_SIZE];
19128 			wchar_t tmp5[MAX_SIZE];
19129 			RPC_ENUM_IP_TABLE_ITEM *e = &t.IpTables[i];
19130 
19131 			if (session_name == NULL || StrCmpi(e->SessionName, session_name) == 0)
19132 			{
19133 				UniToStru(tmp0, e->Key);
19134 
19135 				StrToUni(tmp1, sizeof(tmp1), e->SessionName);
19136 
19137 				if (e->DhcpAllocated == false)
19138 				{
19139 					IPToStr(str, sizeof(str), &e->IpV6);
19140 					StrToUni(tmp2, sizeof(tmp2), str);
19141 				}
19142 				else
19143 				{
19144 					IPToStr(str, sizeof(str), &e->IpV6);
19145 					UniFormat(tmp2, sizeof(tmp2), _UU("SM_MAC_IP_DHCP"), str);
19146 				}
19147 
19148 				GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->CreatedTime));
19149 
19150 				GetDateTimeStr64Uni(tmp4, sizeof(tmp4), SystemToLocal64(e->UpdatedTime));
19151 
19152 				if (StrLen(e->RemoteHostname) == 0)
19153 				{
19154 					UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_MACIP_LOCAL"));
19155 				}
19156 				else
19157 				{
19158 					UniFormat(tmp5, sizeof(tmp5), _UU("SM_MACIP_SERVER"), e->RemoteHostname);
19159 				}
19160 
19161 				CtInsert(ct,
19162 					tmp0, tmp1, tmp2, tmp3, tmp4, tmp5);
19163 			}
19164 		}
19165 
19166 		CtFreeEx(ct, c, true);
19167 	}
19168 
19169 	FreeRpcEnumIpTable(&t);
19170 
19171 	FreeParamValueList(o);
19172 
19173 	return 0;
19174 }
19175 
19176 // Delete the IP address table entry
PsIpDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19177 UINT PsIpDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19178 {
19179 	LIST *o;
19180 	PS *ps = (PS *)param;
19181 	UINT ret = 0;
19182 	RPC_DELETE_TABLE t;
19183 	// Parameter list that can be specified
19184 	PARAM args[] =
19185 	{
19186 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
19187 		{"[id]", CmdPrompt, _UU("CMD_MacDelete_Prompt"), CmdEvalNotEmpty, NULL},
19188 	};
19189 
19190 	// If virtual HUB is not selected, it's an error
19191 	if (ps->HubName == NULL)
19192 	{
19193 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19194 		return ERR_INVALID_PARAMETER;
19195 	}
19196 
19197 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
19198 	if (o == NULL)
19199 	{
19200 		return ERR_INVALID_PARAMETER;
19201 	}
19202 
19203 	Zero(&t, sizeof(t));
19204 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19205 	t.Key = GetParamInt(o, "[id]");
19206 
19207 	// RPC call
19208 	ret = ScDeleteIpTable(ps->Rpc, &t);
19209 
19210 	if (ret != ERR_NO_ERROR)
19211 	{
19212 		// An error has occured
19213 		CmdPrintError(c, ret);
19214 		FreeParamValueList(o);
19215 		return ret;
19216 	}
19217 
19218 	FreeParamValueList(o);
19219 
19220 	return 0;
19221 }
19222 
19223 // Enable the DHCP server function and the virtual NAT (SecureNAT function)
PsSecureNatEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19224 UINT PsSecureNatEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19225 {
19226 	LIST *o;
19227 	PS *ps = (PS *)param;
19228 	UINT ret = 0;
19229 	RPC_HUB t;
19230 
19231 	// If virtual HUB is not selected, it's an error
19232 	if (ps->HubName == NULL)
19233 	{
19234 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19235 		return ERR_INVALID_PARAMETER;
19236 	}
19237 
19238 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19239 	if (o == NULL)
19240 	{
19241 		return ERR_INVALID_PARAMETER;
19242 	}
19243 
19244 	Zero(&t, sizeof(t));
19245 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19246 
19247 	// RPC call
19248 	ret = ScEnableSecureNAT(ps->Rpc, &t);
19249 
19250 	if (ret != ERR_NO_ERROR)
19251 	{
19252 		// An error has occured
19253 		CmdPrintError(c, ret);
19254 		FreeParamValueList(o);
19255 		return ret;
19256 	}
19257 
19258 	FreeParamValueList(o);
19259 
19260 	return 0;
19261 }
19262 
19263 // Disable the DHCP server function and the virtual NAT (SecureNAT function)
PsSecureNatDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19264 UINT PsSecureNatDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19265 {
19266 	LIST *o;
19267 	PS *ps = (PS *)param;
19268 	UINT ret = 0;
19269 	RPC_HUB t;
19270 
19271 	// If virtual HUB is not selected, it's an error
19272 	if (ps->HubName == NULL)
19273 	{
19274 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19275 		return ERR_INVALID_PARAMETER;
19276 	}
19277 
19278 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19279 	if (o == NULL)
19280 	{
19281 		return ERR_INVALID_PARAMETER;
19282 	}
19283 
19284 	Zero(&t, sizeof(t));
19285 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19286 
19287 	// RPC call
19288 	ret = ScDisableSecureNAT(ps->Rpc, &t);
19289 
19290 	if (ret != ERR_NO_ERROR)
19291 	{
19292 		// An error has occured
19293 		CmdPrintError(c, ret);
19294 		FreeParamValueList(o);
19295 		return ret;
19296 	}
19297 
19298 	FreeParamValueList(o);
19299 
19300 	return 0;
19301 }
19302 
19303 // 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)19304 UINT PsSecureNatStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19305 {
19306 	LIST *o;
19307 	PS *ps = (PS *)param;
19308 	UINT ret = 0;
19309 	RPC_NAT_STATUS t;
19310 
19311 	// If virtual HUB is not selected, it's an error
19312 	if (ps->HubName == NULL)
19313 	{
19314 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19315 		return ERR_INVALID_PARAMETER;
19316 	}
19317 
19318 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19319 	if (o == NULL)
19320 	{
19321 		return ERR_INVALID_PARAMETER;
19322 	}
19323 
19324 	Zero(&t, sizeof(t));
19325 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19326 
19327 	// RPC call
19328 	ret = ScGetSecureNATStatus(ps->Rpc, &t);
19329 
19330 	if (ret != ERR_NO_ERROR)
19331 	{
19332 		// An error has occured
19333 		CmdPrintError(c, ret);
19334 		FreeParamValueList(o);
19335 		return ret;
19336 	}
19337 	else
19338 	{
19339 		wchar_t tmp[MAX_SIZE];
19340 		CT *ct = CtNewStandard();
19341 
19342 		StrToUni(tmp, sizeof(tmp), ps->HubName);
19343 		CtInsert(ct, _UU("SM_HUB_COLUMN_1"), tmp);
19344 
19345 		UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumTcpSessions);
19346 		CtInsert(ct, _UU("NM_STATUS_TCP"), tmp);
19347 
19348 		UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumUdpSessions);
19349 		CtInsert(ct, _UU("NM_STATUS_UDP"), tmp);
19350 
19351 		UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumIcmpSessions);
19352 		CtInsert(ct, _UU("NM_STATUS_ICMP"), tmp);
19353 
19354 		UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumDnsSessions);
19355 		CtInsert(ct, _UU("NM_STATUS_DNS"), tmp);
19356 
19357 		UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_CLIENT"), t.NumDhcpClients);
19358 		CtInsert(ct, _UU("NM_STATUS_DHCP"), tmp);
19359 
19360 		CtInsert(ct, _UU("SM_SNAT_IS_KERNEL"), t.IsKernelMode ? _UU("SEC_YES") : _UU("SEC_NO"));
19361 		CtInsert(ct, _UU("SM_SNAT_IS_RAW"), t.IsRawIpMode ? _UU("SEC_YES") : _UU("SEC_NO"));
19362 
19363 		CtFree(ct, c);
19364 	}
19365 
19366 	FreeRpcNatStatus(&t);
19367 
19368 	FreeParamValueList(o);
19369 
19370 	return 0;
19371 }
19372 
19373 // Get the network interface settings for a virtual host of SecureNAT function
PsSecureNatHostGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19374 UINT PsSecureNatHostGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19375 {
19376 	LIST *o;
19377 	PS *ps = (PS *)param;
19378 	UINT ret = 0;
19379 	VH_OPTION t;
19380 
19381 	// If virtual HUB is not selected, it's an error
19382 	if (ps->HubName == NULL)
19383 	{
19384 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19385 		return ERR_INVALID_PARAMETER;
19386 	}
19387 
19388 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19389 	if (o == NULL)
19390 	{
19391 		return ERR_INVALID_PARAMETER;
19392 	}
19393 
19394 	Zero(&t, sizeof(t));
19395 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19396 
19397 	// RPC call
19398 	ret = ScGetSecureNATOption(ps->Rpc, &t);
19399 
19400 	if (ret != ERR_NO_ERROR)
19401 	{
19402 		// An error has occured
19403 		CmdPrintError(c, ret);
19404 		FreeParamValueList(o);
19405 		return ret;
19406 	}
19407 	else
19408 	{
19409 		wchar_t tmp[MAX_SIZE];
19410 		char str[MAX_SIZE];
19411 		CT *ct = CtNewStandard();
19412 
19413 		// Flags
19414 		// MAC Address
19415 		MacToStr(str, sizeof(str), t.MacAddress);
19416 		StrToUni(tmp, sizeof(tmp), str);
19417 		CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_MAC"), tmp);
19418 
19419 		// IP address
19420 		IPToUniStr(tmp, sizeof(tmp), &t.Ip);
19421 		CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_IP"), tmp);
19422 
19423 		// Subnet mask
19424 		IPToUniStr(tmp, sizeof(tmp), &t.Mask);
19425 		CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_MASK"), tmp);
19426 
19427 		CtFree(ct, c);
19428 	}
19429 
19430 	FreeParamValueList(o);
19431 
19432 	return 0;
19433 }
19434 
19435 // Change the network interface settings for a virtual host of SecureNAT function
PsSecureNatHostSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19436 UINT PsSecureNatHostSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19437 {
19438 	LIST *o;
19439 	PS *ps = (PS *)param;
19440 	UINT ret = 0;
19441 	VH_OPTION t;
19442 	// Parameter list that can be specified
19443 	PARAM args[] =
19444 	{
19445 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
19446 		{"MAC", CmdPrompt, _UU("CMD_SecureNatHostSet_Prompt_MAC"), NULL, NULL},
19447 		{"IP", CmdPrompt, _UU("CMD_SecureNatHostSet_Prompt_IP"), CmdEvalIp, NULL},
19448 		{"MASK", CmdPrompt, _UU("CMD_SecureNatHostSet_Prompt_MASK"), CmdEvalIp, NULL},
19449 	};
19450 
19451 	// If virtual HUB is not selected, it's an error
19452 	if (ps->HubName == NULL)
19453 	{
19454 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19455 		return ERR_INVALID_PARAMETER;
19456 	}
19457 
19458 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
19459 	if (o == NULL)
19460 	{
19461 		return ERR_INVALID_PARAMETER;
19462 	}
19463 
19464 	Zero(&t, sizeof(t));
19465 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19466 
19467 	// RPC call
19468 	ret = ScGetSecureNATOption(ps->Rpc, &t);
19469 
19470 	if (ret != ERR_NO_ERROR)
19471 	{
19472 		// An error has occured
19473 		CmdPrintError(c, ret);
19474 		FreeParamValueList(o);
19475 		return ret;
19476 	}
19477 	else
19478 	{
19479 		char *mac, *ip, *mask;
19480 		bool ok = true;
19481 
19482 		StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19483 
19484 		mac = GetParamStr(o, "MAC");
19485 		ip = GetParamStr(o, "IP");
19486 		mask = GetParamStr(o, "MASK");
19487 
19488 		if (IsEmptyStr(mac) == false)
19489 		{
19490 			BUF *b = StrToBin(mac);
19491 
19492 			if (b == NULL || b->Size != 6)
19493 			{
19494 				ok = false;
19495 			}
19496 			else
19497 			{
19498 				Copy(t.MacAddress, b->Buf, 6);
19499 			}
19500 
19501 			FreeBuf(b);
19502 		}
19503 
19504 		if (IsEmptyStr(ip) == false)
19505 		{
19506 			if (IsIpStr4(ip) == false)
19507 			{
19508 				ok = false;
19509 			}
19510 			else
19511 			{
19512 				UINT u = StrToIP32(ip);
19513 
19514 				if (u == 0 || u == 0xffffffff)
19515 				{
19516 					ok = false;
19517 				}
19518 				else
19519 				{
19520 					UINTToIP(&t.Ip, u);
19521 				}
19522 			}
19523 		}
19524 
19525 		if (IsEmptyStr(mask) == false)
19526 		{
19527 			if (IsIpStr4(mask) == false)
19528 			{
19529 				ok = false;
19530 			}
19531 			else
19532 			{
19533 				StrToIP(&t.Mask, mask);
19534 			}
19535 		}
19536 
19537 		if (ok == false)
19538 		{
19539 			// Parameter is invalid
19540 			ret = ERR_INVALID_PARAMETER;
19541 			CmdPrintError(c, ret);
19542 			FreeParamValueList(o);
19543 			return ret;
19544 		}
19545 		else
19546 		{
19547 			ret = ScSetSecureNATOption(ps->Rpc, &t);
19548 
19549 			if (ret != ERR_NO_ERROR)
19550 			{
19551 				// An error has occured
19552 				CmdPrintError(c, ret);
19553 				FreeParamValueList(o);
19554 				return ret;
19555 			}
19556 		}
19557 	}
19558 
19559 	FreeParamValueList(o);
19560 
19561 	return 0;
19562 }
19563 
19564 // Get the settings for the virtual NAT function of the SecureNAT function
PsNatGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19565 UINT PsNatGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19566 {
19567 	LIST *o;
19568 	PS *ps = (PS *)param;
19569 	UINT ret = 0;
19570 	VH_OPTION t;
19571 
19572 	// If virtual HUB is not selected, it's an error
19573 	if (ps->HubName == NULL)
19574 	{
19575 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19576 		return ERR_INVALID_PARAMETER;
19577 	}
19578 
19579 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19580 	if (o == NULL)
19581 	{
19582 		return ERR_INVALID_PARAMETER;
19583 	}
19584 
19585 	Zero(&t, sizeof(t));
19586 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19587 
19588 	// RPC call
19589 	ret = ScGetSecureNATOption(ps->Rpc, &t);
19590 
19591 	if (ret != ERR_NO_ERROR)
19592 	{
19593 		// An error has occured
19594 		CmdPrintError(c, ret);
19595 		FreeParamValueList(o);
19596 		return ret;
19597 	}
19598 	else
19599 	{
19600 		wchar_t tmp[MAX_SIZE];
19601 		CT *ct = CtNewStandard();
19602 
19603 		// Use the virtual NAT function
19604 		CtInsert(ct, _UU("CMD_NatGet_Column_USE"), t.UseNat ? _UU("SEC_YES") : _UU("SEC_NO"));
19605 
19606 		// MTU value
19607 		UniToStru(tmp, t.Mtu);
19608 		CtInsert(ct, _UU("CMD_NetGet_Column_MTU"), tmp);
19609 
19610 		// TCP session timeout (in seconds)
19611 		UniToStru(tmp, t.NatTcpTimeout);
19612 		CtInsert(ct, _UU("CMD_NatGet_Column_TCP"), tmp);
19613 
19614 		// UDP session timeout (in seconds)
19615 		UniToStru(tmp, t.NatUdpTimeout);
19616 		CtInsert(ct, _UU("CMD_NatGet_Column_UDP"), tmp);
19617 
19618 		// To save the log
19619 		CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_LOG"), t.SaveLog ? _UU("SEC_YES") : _UU("SEC_NO"));
19620 
19621 		CtFree(ct, c);
19622 	}
19623 
19624 	FreeParamValueList(o);
19625 
19626 	return 0;
19627 }
19628 
19629 // Enable the virtual NAT function of the SecureNAT function
PsNatEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19630 UINT PsNatEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19631 {
19632 	LIST *o;
19633 	PS *ps = (PS *)param;
19634 	UINT ret = 0;
19635 	VH_OPTION t;
19636 
19637 	// If virtual HUB is not selected, it's an error
19638 	if (ps->HubName == NULL)
19639 	{
19640 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19641 		return ERR_INVALID_PARAMETER;
19642 	}
19643 
19644 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19645 	if (o == NULL)
19646 	{
19647 		return ERR_INVALID_PARAMETER;
19648 	}
19649 
19650 	Zero(&t, sizeof(t));
19651 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19652 
19653 	// RPC call
19654 	ret = ScGetSecureNATOption(ps->Rpc, &t);
19655 
19656 	if (ret != ERR_NO_ERROR)
19657 	{
19658 		// An error has occured
19659 		CmdPrintError(c, ret);
19660 		FreeParamValueList(o);
19661 		return ret;
19662 	}
19663 	else
19664 	{
19665 		t.UseNat = true;
19666 
19667 		StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19668 		ret = ScSetSecureNATOption(ps->Rpc, &t);
19669 
19670 		if (ret != ERR_NO_ERROR)
19671 		{
19672 			// An error has occured
19673 			CmdPrintError(c, ret);
19674 			FreeParamValueList(o);
19675 			return ret;
19676 		}
19677 	}
19678 
19679 	FreeParamValueList(o);
19680 
19681 	return 0;
19682 }
19683 
19684 // Disable the virtual NAT function of the SecureNAT function
PsNatDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19685 UINT PsNatDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19686 {
19687 	LIST *o;
19688 	PS *ps = (PS *)param;
19689 	UINT ret = 0;
19690 	VH_OPTION t;
19691 
19692 	// If virtual HUB is not selected, it's an error
19693 	if (ps->HubName == NULL)
19694 	{
19695 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19696 		return ERR_INVALID_PARAMETER;
19697 	}
19698 
19699 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19700 	if (o == NULL)
19701 	{
19702 		return ERR_INVALID_PARAMETER;
19703 	}
19704 
19705 	Zero(&t, sizeof(t));
19706 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19707 
19708 	// RPC call
19709 	ret = ScGetSecureNATOption(ps->Rpc, &t);
19710 
19711 	if (ret != ERR_NO_ERROR)
19712 	{
19713 		// An error has occured
19714 		CmdPrintError(c, ret);
19715 		FreeParamValueList(o);
19716 		return ret;
19717 	}
19718 	else
19719 	{
19720 		t.UseNat = false;
19721 
19722 		StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19723 		ret = ScSetSecureNATOption(ps->Rpc, &t);
19724 
19725 		if (ret != ERR_NO_ERROR)
19726 		{
19727 			// An error has occured
19728 			CmdPrintError(c, ret);
19729 			FreeParamValueList(o);
19730 			return ret;
19731 		}
19732 	}
19733 
19734 	FreeParamValueList(o);
19735 
19736 	return 0;
19737 }
19738 
19739 // Change the settings for the virtual NAT function of the SecureNAT function
PsNatSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19740 UINT PsNatSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19741 {
19742 	LIST *o;
19743 	PS *ps = (PS *)param;
19744 	UINT ret = 0;
19745 	VH_OPTION t;
19746 	// Parameter list that can be specified
19747 	CMD_EVAL_MIN_MAX mtu_mm =
19748 	{
19749 		"CMD_NatSet_Eval_MTU", TCP_HEADER_SIZE + IP_HEADER_SIZE + MAC_HEADER_SIZE + 8, MAX_L3_DATA_SIZE,
19750 	};
19751 	CMD_EVAL_MIN_MAX tcp_mm =
19752 	{
19753 		"CMD_NatSet_Eval_TCP", NAT_TCP_MIN_TIMEOUT / 1000, NAT_TCP_MAX_TIMEOUT / 1000,
19754 	};
19755 	CMD_EVAL_MIN_MAX udp_mm =
19756 	{
19757 		"CMD_NatSet_Eval_UDP", NAT_UDP_MIN_TIMEOUT / 1000, NAT_UDP_MAX_TIMEOUT / 1000,
19758 	};
19759 	PARAM args[] =
19760 	{
19761 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
19762 		{"MTU", CmdPrompt, _UU("CMD_NatSet_Prompt_MTU"), CmdEvalMinMax, &mtu_mm},
19763 		{"TCPTIMEOUT", CmdPrompt, _UU("CMD_NatSet_Prompt_TCPTIMEOUT"), CmdEvalMinMax, &tcp_mm},
19764 		{"UDPTIMEOUT", CmdPrompt, _UU("CMD_NatSet_Prompt_UDPTIMEOUT"), CmdEvalMinMax, &udp_mm},
19765 		{"LOG", CmdPrompt, _UU("CMD_NatSet_Prompt_LOG"), CmdEvalNotEmpty, NULL},
19766 	};
19767 
19768 	// If virtual HUB is not selected, it's an error
19769 	if (ps->HubName == NULL)
19770 	{
19771 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19772 		return ERR_INVALID_PARAMETER;
19773 	}
19774 
19775 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
19776 	if (o == NULL)
19777 	{
19778 		return ERR_INVALID_PARAMETER;
19779 	}
19780 
19781 	Zero(&t, sizeof(t));
19782 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19783 
19784 	// RPC call
19785 	ret = ScGetSecureNATOption(ps->Rpc, &t);
19786 
19787 	if (ret != ERR_NO_ERROR)
19788 	{
19789 		// An error has occured
19790 		CmdPrintError(c, ret);
19791 		FreeParamValueList(o);
19792 		return ret;
19793 	}
19794 	else
19795 	{
19796 		t.Mtu = GetParamInt(o, "MTU");
19797 		t.NatTcpTimeout = GetParamInt(o, "TCPTIMEOUT");
19798 		t.NatUdpTimeout = GetParamInt(o, "UDPTIMEOUT");
19799 		t.SaveLog = GetParamYes(o, "LOG");
19800 
19801 		StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19802 		ret = ScSetSecureNATOption(ps->Rpc, &t);
19803 
19804 		if (ret != ERR_NO_ERROR)
19805 		{
19806 			// An error has occured
19807 			CmdPrintError(c, ret);
19808 			FreeParamValueList(o);
19809 			return ret;
19810 		}
19811 	}
19812 
19813 	FreeParamValueList(o);
19814 
19815 	return 0;
19816 }
19817 
19818 // Get the session table of the virtual NAT function of the SecureNAT function
PsNatTable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19819 UINT PsNatTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19820 {
19821 	LIST *o;
19822 	PS *ps = (PS *)param;
19823 	UINT ret = 0;
19824 	RPC_ENUM_NAT t;
19825 
19826 	// If virtual HUB is not selected, it's an error
19827 	if (ps->HubName == NULL)
19828 	{
19829 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19830 		return ERR_INVALID_PARAMETER;
19831 	}
19832 
19833 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19834 	if (o == NULL)
19835 	{
19836 		return ERR_INVALID_PARAMETER;
19837 	}
19838 
19839 	Zero(&t, sizeof(t));
19840 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19841 
19842 	// RPC call
19843 	ret = ScEnumNAT(ps->Rpc, &t);
19844 
19845 	if (ret != ERR_NO_ERROR)
19846 	{
19847 		// An error has occured
19848 		CmdPrintError(c, ret);
19849 		FreeParamValueList(o);
19850 		return ret;
19851 	}
19852 	else
19853 	{
19854 		CT *ct = CtNew();
19855 		UINT i;
19856 
19857 		CtInsertColumn(ct, _UU("NM_NAT_ID"), false);
19858 		CtInsertColumn(ct, _UU("NM_NAT_PROTOCOL"), false);
19859 		CtInsertColumn(ct, _UU("NM_NAT_SRC_HOST"), false);
19860 		CtInsertColumn(ct, _UU("NM_NAT_SRC_PORT"), false);
19861 		CtInsertColumn(ct, _UU("NM_NAT_DST_HOST"), false);
19862 		CtInsertColumn(ct, _UU("NM_NAT_DST_PORT"), false);
19863 		CtInsertColumn(ct, _UU("NM_NAT_CREATED"), false);
19864 		CtInsertColumn(ct, _UU("NM_NAT_LAST_COMM"), false);
19865 		CtInsertColumn(ct, _UU("NM_NAT_SIZE"), false);
19866 		CtInsertColumn(ct, _UU("NM_NAT_TCP_STATUS"), false);
19867 
19868 		for (i = 0;i < t.NumItem;i++)
19869 		{
19870 			RPC_ENUM_NAT_ITEM *e = &t.Items[i];
19871 			wchar_t tmp0[MAX_SIZE];
19872 			wchar_t *tmp1 = L"";
19873 			wchar_t tmp2[MAX_SIZE];
19874 			wchar_t tmp3[MAX_SIZE];
19875 			wchar_t tmp4[MAX_SIZE];
19876 			wchar_t tmp5[MAX_SIZE];
19877 			wchar_t tmp6[MAX_SIZE];
19878 			wchar_t tmp7[MAX_SIZE];
19879 			wchar_t tmp8[MAX_SIZE];
19880 			wchar_t *tmp9 = L"";
19881 			char v1[128], v2[128];
19882 
19883 			// ID
19884 			UniToStru(tmp0, e->Id);
19885 
19886 			// Protocol
19887 			switch (e->Protocol)
19888 			{
19889 			case NAT_TCP:
19890 				tmp1 = _UU("NM_NAT_PROTO_TCP");
19891 				break;
19892 			case NAT_UDP:
19893 				tmp1 = _UU("NM_NAT_PROTO_UDP");
19894 				break;
19895 			case NAT_DNS:
19896 				tmp1 = _UU("NM_NAT_PROTO_DNS");
19897 				break;
19898 			case NAT_ICMP:
19899 				tmp1 = _UU("NM_NAT_PROTO_ICMP");
19900 				break;
19901 			}
19902 
19903 			// Source host
19904 			StrToUni(tmp2, sizeof(tmp2), e->SrcHost);
19905 
19906 			// Source port
19907 			UniToStru(tmp3, e->SrcPort);
19908 
19909 			// Destination host
19910 			StrToUni(tmp4, sizeof(tmp4), e->DestHost);
19911 
19912 			// Destination port
19913 			UniToStru(tmp5, e->DestPort);
19914 
19915 			// Creation date and time of the session
19916 			GetDateTimeStrEx64(tmp6, sizeof(tmp6), SystemToLocal64(e->CreatedTime), NULL);
19917 
19918 			// Last communication date and time
19919 			GetDateTimeStrEx64(tmp7, sizeof(tmp7), SystemToLocal64(e->LastCommTime), NULL);
19920 
19921 			// Communication amount
19922 			ToStr3(v1, sizeof(v1), e->RecvSize);
19923 			ToStr3(v2, sizeof(v2), e->SendSize);
19924 			UniFormat(tmp8, sizeof(tmp8), L"%S / %S", v1, v2);
19925 
19926 			// TCP state
19927 			if (e->Protocol == NAT_TCP)
19928 			{
19929 				switch (e->TcpStatus)
19930 				{
19931 				case NAT_TCP_CONNECTING:
19932 					tmp9 = _UU("NAT_TCP_CONNECTING");
19933 					break;
19934 				case NAT_TCP_SEND_RESET:
19935 					tmp9 = _UU("NAT_TCP_SEND_RESET");
19936 					break;
19937 				case NAT_TCP_CONNECTED:
19938 					tmp9 = _UU("NAT_TCP_CONNECTED");
19939 					break;
19940 				case NAT_TCP_ESTABLISHED:
19941 					tmp9 = _UU("NAT_TCP_ESTABLISHED");
19942 					break;
19943 				case NAT_TCP_WAIT_DISCONNECT:
19944 					tmp9 = _UU("NAT_TCP_WAIT_DISCONNECT");
19945 					break;
19946 				}
19947 			}
19948 
19949 			CtInsert(ct,
19950 				tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9);
19951 		}
19952 
19953 		CtFreeEx(ct, c, true);
19954 	}
19955 
19956 	FreeRpcEnumNat(&t);
19957 
19958 	FreeParamValueList(o);
19959 
19960 	return 0;
19961 }
19962 
19963 // Get the settings for a virtual DHCP server function of the SecureNAT function
PsDhcpGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)19964 UINT PsDhcpGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
19965 {
19966 	LIST *o;
19967 	PS *ps = (PS *)param;
19968 	UINT ret = 0;
19969 	VH_OPTION t;
19970 
19971 	// If virtual HUB is not selected, it's an error
19972 	if (ps->HubName == NULL)
19973 	{
19974 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
19975 		return ERR_INVALID_PARAMETER;
19976 	}
19977 
19978 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
19979 	if (o == NULL)
19980 	{
19981 		return ERR_INVALID_PARAMETER;
19982 	}
19983 
19984 	Zero(&t, sizeof(t));
19985 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
19986 
19987 	// RPC call
19988 	ret = ScGetSecureNATOption(ps->Rpc, &t);
19989 
19990 	if (ret != ERR_NO_ERROR)
19991 	{
19992 		// An error has occured
19993 		CmdPrintError(c, ret);
19994 		FreeParamValueList(o);
19995 		return ret;
19996 	}
19997 	else
19998 	{
19999 		wchar_t tmp[MAX_SIZE];
20000 		CT *ct = CtNewStandard();
20001 
20002 		// To use the virtual DHCP function
20003 		CtInsert(ct, _UU("CMD_DhcpGet_Column_USE"), t.UseDhcp ? _UU("SEC_YES") : _UU("SEC_NO"));
20004 
20005 		// Start address of the distributing address zone
20006 		IPToUniStr(tmp, sizeof(tmp), &t.DhcpLeaseIPStart);
20007 		CtInsert(ct, _UU("CMD_DhcpGet_Column_IP1"), tmp);
20008 
20009 		// End address of the distributing address zone
20010 		IPToUniStr(tmp, sizeof(tmp), &t.DhcpLeaseIPEnd);
20011 		CtInsert(ct, _UU("CMD_DhcpGet_Column_IP2"), tmp);
20012 
20013 		// Subnet mask
20014 		IPToUniStr(tmp, sizeof(tmp), &t.DhcpSubnetMask);
20015 		CtInsert(ct, _UU("CMD_DhcpGet_Column_MASK"), tmp);
20016 
20017 		// Lease time (in seconds)
20018 		UniToStru(tmp, t.DhcpExpireTimeSpan);
20019 		CtInsert(ct, _UU("CMD_DhcpGet_Column_LEASE"), tmp);
20020 
20021 		// Default gateway address
20022 		UniStrCpy(tmp, sizeof(tmp), _UU("SEC_NONE"));
20023 		if (IPToUINT(&t.DhcpGatewayAddress) != 0)
20024 		{
20025 			IPToUniStr(tmp, sizeof(tmp), &t.DhcpGatewayAddress);
20026 		}
20027 		CtInsert(ct, _UU("CMD_DhcpGet_Column_GW"), tmp);
20028 
20029 		// DNS server address 1
20030 		UniStrCpy(tmp, sizeof(tmp), _UU("SEC_NONE"));
20031 		if (IPToUINT(&t.DhcpDnsServerAddress) != 0)
20032 		{
20033 			IPToUniStr(tmp, sizeof(tmp), &t.DhcpDnsServerAddress);
20034 		}
20035 		CtInsert(ct, _UU("CMD_DhcpGet_Column_DNS"), tmp);
20036 
20037 		// DNS server address 2
20038 		UniStrCpy(tmp, sizeof(tmp), _UU("SEC_NONE"));
20039 		if (IPToUINT(&t.DhcpDnsServerAddress2) != 0)
20040 		{
20041 			IPToUniStr(tmp, sizeof(tmp), &t.DhcpDnsServerAddress2);
20042 		}
20043 		CtInsert(ct, _UU("CMD_DhcpGet_Column_DNS2"), tmp);
20044 
20045 		// Domain name
20046 		StrToUni(tmp, sizeof(tmp), t.DhcpDomainName);
20047 		CtInsert(ct, _UU("CMD_DhcpGet_Column_DOMAIN"), tmp);
20048 
20049 		// To save the log
20050 		CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_LOG"), t.SaveLog ? _UU("SEC_YES") : _UU("SEC_NO"));
20051 
20052 		// Push routing table
20053 		if (t.ApplyDhcpPushRoutes)
20054 		{
20055 			StrToUni(tmp, sizeof(tmp), t.DhcpPushRoutes);
20056 			CtInsert(ct, _UU("CMD_DhcpGet_Column_PUSHROUTE"), tmp);
20057 		}
20058 
20059 		CtFree(ct, c);
20060 	}
20061 
20062 	FreeParamValueList(o);
20063 
20064 	return 0;
20065 }
20066 
20067 // Enable the Virtual DHCP server function of SecureNAT function
PsDhcpEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20068 UINT PsDhcpEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20069 {
20070 	LIST *o;
20071 	PS *ps = (PS *)param;
20072 	UINT ret = 0;
20073 	VH_OPTION t;
20074 
20075 	// If virtual HUB is not selected, it's an error
20076 	if (ps->HubName == NULL)
20077 	{
20078 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20079 		return ERR_INVALID_PARAMETER;
20080 	}
20081 
20082 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
20083 	if (o == NULL)
20084 	{
20085 		return ERR_INVALID_PARAMETER;
20086 	}
20087 
20088 	Zero(&t, sizeof(t));
20089 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20090 
20091 	// RPC call
20092 	ret = ScGetSecureNATOption(ps->Rpc, &t);
20093 
20094 	if (ret != ERR_NO_ERROR)
20095 	{
20096 		// An error has occured
20097 		CmdPrintError(c, ret);
20098 		FreeParamValueList(o);
20099 		return ret;
20100 	}
20101 	else
20102 	{
20103 		t.UseDhcp = true;
20104 
20105 		StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20106 		ret = ScSetSecureNATOption(ps->Rpc, &t);
20107 
20108 		if (ret != ERR_NO_ERROR)
20109 		{
20110 			// An error has occured
20111 			CmdPrintError(c, ret);
20112 			FreeParamValueList(o);
20113 			return ret;
20114 		}
20115 	}
20116 
20117 	FreeParamValueList(o);
20118 
20119 	return 0;
20120 }
20121 
20122 // Disable the virtual DHCP server function of SecureNAT function
PsDhcpDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20123 UINT PsDhcpDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20124 {
20125 	LIST *o;
20126 	PS *ps = (PS *)param;
20127 	UINT ret = 0;
20128 	VH_OPTION t;
20129 
20130 	// If virtual HUB is not selected, it's an error
20131 	if (ps->HubName == NULL)
20132 	{
20133 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20134 		return ERR_INVALID_PARAMETER;
20135 	}
20136 
20137 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
20138 	if (o == NULL)
20139 	{
20140 		return ERR_INVALID_PARAMETER;
20141 	}
20142 
20143 	Zero(&t, sizeof(t));
20144 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20145 
20146 	// RPC call
20147 	ret = ScGetSecureNATOption(ps->Rpc, &t);
20148 
20149 	if (ret != ERR_NO_ERROR)
20150 	{
20151 		// An error has occured
20152 		CmdPrintError(c, ret);
20153 		FreeParamValueList(o);
20154 		return ret;
20155 	}
20156 	else
20157 	{
20158 		t.UseDhcp = false;
20159 
20160 		ret = ScSetSecureNATOption(ps->Rpc, &t);
20161 
20162 		if (ret != ERR_NO_ERROR)
20163 		{
20164 			// An error has occured
20165 			CmdPrintError(c, ret);
20166 			FreeParamValueList(o);
20167 			return ret;
20168 		}
20169 	}
20170 
20171 	FreeParamValueList(o);
20172 
20173 	return 0;
20174 }
20175 
20176 // Change the settings for a virtual DHCP server function of the SecureNAT function
PsDhcpSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20177 UINT PsDhcpSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20178 {
20179 	LIST *o;
20180 	PS *ps = (PS *)param;
20181 	UINT ret = 0;
20182 	VH_OPTION t;
20183 	// Parameter list that can be specified
20184 	CMD_EVAL_MIN_MAX mm =
20185 	{
20186 		"CMD_NatSet_Eval_UDP", NAT_UDP_MIN_TIMEOUT / 1000, NAT_UDP_MAX_TIMEOUT / 1000,
20187 	};
20188 	PARAM args[] =
20189 	{
20190 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
20191 		{"START", CmdPrompt, _UU("CMD_DhcpSet_Prompt_START"), CmdEvalIp, NULL},
20192 		{"END", CmdPrompt, _UU("CMD_DhcpSet_Prompt_END"), CmdEvalIp, NULL},
20193 		{"MASK", CmdPrompt, _UU("CMD_DhcpSet_Prompt_MASK"), CmdEvalIp, NULL},
20194 		{"EXPIRE", CmdPrompt, _UU("CMD_DhcpSet_Prompt_EXPIRE"), CmdEvalMinMax, &mm},
20195 		{"GW", CmdPrompt, _UU("CMD_DhcpSet_Prompt_GW"), CmdEvalIp, NULL},
20196 		{"DNS", CmdPrompt, _UU("CMD_DhcpSet_Prompt_DNS"), CmdEvalIp, NULL},
20197 		{"DNS2", CmdPrompt, _UU("CMD_DhcpSet_Prompt_DNS2"), CmdEvalIp, NULL},
20198 		{"DOMAIN", CmdPrompt, _UU("CMD_DhcpSet_Prompt_DOMAIN"), NULL, NULL},
20199 		{"LOG", CmdPrompt, _UU("CMD_NatSet_Prompt_LOG"), CmdEvalNotEmpty, NULL},
20200 		{"PUSHROUTE", NULL, _UU("CMD_DhcpSet_PUSHROUTE"), NULL, NULL},
20201 	};
20202 
20203 	// If virtual HUB is not selected, it's an error
20204 	if (ps->HubName == NULL)
20205 	{
20206 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20207 		return ERR_INVALID_PARAMETER;
20208 	}
20209 
20210 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20211 	if (o == NULL)
20212 	{
20213 		return ERR_INVALID_PARAMETER;
20214 	}
20215 
20216 	Zero(&t, sizeof(t));
20217 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20218 
20219 	// RPC call
20220 	ret = ScGetSecureNATOption(ps->Rpc, &t);
20221 
20222 	if (ret != ERR_NO_ERROR)
20223 	{
20224 		// An error has occured
20225 		CmdPrintError(c, ret);
20226 		FreeParamValueList(o);
20227 		return ret;
20228 	}
20229 	else
20230 	{
20231 
20232 		StrToIP(&t.DhcpLeaseIPStart, GetParamStr(o, "START"));
20233 		StrToIP(&t.DhcpLeaseIPEnd, GetParamStr(o, "END"));
20234 		StrToIP(&t.DhcpSubnetMask, GetParamStr(o, "MASK"));
20235 		t.DhcpExpireTimeSpan = GetParamInt(o, "EXPIRE");
20236 		StrToIP(&t.DhcpGatewayAddress, GetParamStr(o, "GW"));
20237 		StrToIP(&t.DhcpDnsServerAddress, GetParamStr(o, "DNS"));
20238 		StrToIP(&t.DhcpDnsServerAddress2, GetParamStr(o, "DNS2"));
20239 		StrCpy(t.DhcpDomainName, sizeof(t.DhcpDomainName), GetParamStr(o, "DOMAIN"));
20240 		t.SaveLog = GetParamYes(o, "LOG");
20241 
20242 		StrCpy(t.DhcpPushRoutes, sizeof(t.DhcpPushRoutes), GetParamStr(o, "PUSHROUTE"));
20243 		t.ApplyDhcpPushRoutes = true;
20244 
20245 		StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20246 		ret = ScSetSecureNATOption(ps->Rpc, &t);
20247 
20248 		if (ret != ERR_NO_ERROR)
20249 		{
20250 			// An error has occured
20251 			CmdPrintError(c, ret);
20252 			FreeParamValueList(o);
20253 			return ret;
20254 		}
20255 
20256 		if (IsEmptyStr(GetParamStr(o, "PUSHROUTE")) == false)
20257 		{
20258 			if (GetCapsBool(ps->CapsList, "b_suppport_push_route") == false &&
20259 				GetCapsBool(ps->CapsList, "b_suppport_push_route_config"))
20260 			{
20261 				CmdPrintError(c, ERR_NOT_SUPPORTED_FUNCTION_ON_OPENSOURCE);
20262 			}
20263 		}
20264 	}
20265 
20266 	FreeParamValueList(o);
20267 
20268 	return 0;
20269 }
20270 
20271 // Get the lease table of virtual DHCP server function of the SecureNAT function
PsDhcpTable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20272 UINT PsDhcpTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20273 {
20274 	LIST *o;
20275 	PS *ps = (PS *)param;
20276 	UINT ret = 0;
20277 	RPC_ENUM_DHCP t;
20278 
20279 	// If virtual HUB is not selected, it's an error
20280 	if (ps->HubName == NULL)
20281 	{
20282 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20283 		return ERR_INVALID_PARAMETER;
20284 	}
20285 
20286 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
20287 	if (o == NULL)
20288 	{
20289 		return ERR_INVALID_PARAMETER;
20290 	}
20291 
20292 	Zero(&t, sizeof(t));
20293 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20294 
20295 	// RPC call
20296 	ret = ScEnumDHCP(ps->Rpc, &t);
20297 
20298 	if (ret != ERR_NO_ERROR)
20299 	{
20300 		// An error has occured
20301 		CmdPrintError(c, ret);
20302 		FreeParamValueList(o);
20303 		return ret;
20304 	}
20305 	else
20306 	{
20307 		CT *ct = CtNew();
20308 		UINT i;
20309 
20310 		CtInsertColumn(ct, _UU("DHCP_DHCP_ID"), false);
20311 		CtInsertColumn(ct, _UU("DHCP_LEASED_TIME"), false);
20312 		CtInsertColumn(ct, _UU("DHCP_EXPIRE_TIME"), false);
20313 		CtInsertColumn(ct, _UU("DHCP_MAC_ADDRESS"), false);
20314 		CtInsertColumn(ct, _UU("DHCP_IP_ADDRESS"), false);
20315 		CtInsertColumn(ct, _UU("DHCP_HOSTNAME"), false);
20316 
20317 		for (i = 0;i < t.NumItem;i++)
20318 		{
20319 			RPC_ENUM_DHCP_ITEM *e = &t.Items[i];
20320 			wchar_t tmp0[MAX_SIZE];
20321 			wchar_t tmp1[MAX_SIZE];
20322 			wchar_t tmp2[MAX_SIZE];
20323 			wchar_t tmp3[MAX_SIZE];
20324 			wchar_t tmp4[MAX_SIZE];
20325 			wchar_t tmp5[MAX_SIZE];
20326 			char str[MAX_SIZE];
20327 
20328 			// ID
20329 			UniToStru(tmp0, e->Id);
20330 
20331 			// Time
20332 			GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->LeasedTime), NULL);
20333 			GetDateTimeStrEx64(tmp2, sizeof(tmp2), SystemToLocal64(e->ExpireTime), NULL);
20334 
20335 			MacToStr(str, sizeof(str), e->MacAddress);
20336 			StrToUni(tmp3, sizeof(tmp3), str);
20337 
20338 			IPToStr32(str, sizeof(str), e->IpAddress);
20339 			StrToUni(tmp4, sizeof(tmp4), str);
20340 
20341 			StrToUni(tmp5, sizeof(tmp5), e->Hostname);
20342 
20343 			CtInsert(ct,
20344 				tmp0, tmp1, tmp2, tmp3, tmp4, tmp5);
20345 		}
20346 
20347 		CtFreeEx(ct, c, true);
20348 	}
20349 
20350 	FreeRpcEnumDhcp(&t);
20351 
20352 	FreeParamValueList(o);
20353 
20354 	return 0;
20355 }
20356 
20357 // Get the list of Virtual HUB management options
PsAdminOptionList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20358 UINT PsAdminOptionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20359 {
20360 	LIST *o;
20361 	PS *ps = (PS *)param;
20362 	UINT ret = 0;
20363 	RPC_ADMIN_OPTION t;
20364 
20365 	// If virtual HUB is not selected, it's an error
20366 	if (ps->HubName == NULL)
20367 	{
20368 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20369 		return ERR_INVALID_PARAMETER;
20370 	}
20371 
20372 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
20373 	if (o == NULL)
20374 	{
20375 		return ERR_INVALID_PARAMETER;
20376 	}
20377 
20378 	Zero(&t, sizeof(t));
20379 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20380 
20381 	// RPC call
20382 	ret = ScGetHubAdminOptions(ps->Rpc, &t);
20383 
20384 	if (ret != ERR_NO_ERROR)
20385 	{
20386 		// An error has occured
20387 		CmdPrintError(c, ret);
20388 		FreeParamValueList(o);
20389 		return ret;
20390 	}
20391 	else
20392 	{
20393 		CT *ct = CtNewStandardEx();
20394 		UINT i;
20395 
20396 		for (i = 0;i < t.NumItem;i++)
20397 		{
20398 			ADMIN_OPTION *e = &t.Items[i];
20399 			wchar_t tmp1[MAX_SIZE];
20400 			wchar_t tmp2[MAX_SIZE];
20401 
20402 			StrToUni(tmp1, sizeof(tmp1), e->Name);
20403 			UniToStru(tmp2, e->Value);
20404 
20405 			CtInsert(ct, tmp1, tmp2, GetHubAdminOptionHelpString(e->Name));
20406 
20407 		}
20408 
20409 		CtFreeEx(ct, c, true);
20410 	}
20411 
20412 	FreeRpcAdminOption(&t);
20413 
20414 	FreeParamValueList(o);
20415 
20416 	return 0;
20417 }
20418 
20419 // Set the value of a Virtual HUB management option
PsAdminOptionSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20420 UINT PsAdminOptionSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20421 {
20422 	LIST *o;
20423 	PS *ps = (PS *)param;
20424 	UINT ret = 0;
20425 	RPC_ADMIN_OPTION t;
20426 	// Parameter list that can be specified
20427 	PARAM args[] =
20428 	{
20429 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
20430 		{"[name]", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_name"), CmdEvalNotEmpty, NULL},
20431 		{"VALUE", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_VALUE"), CmdEvalNotEmpty, NULL},
20432 	};
20433 
20434 	// If virtual HUB is not selected, it's an error
20435 	if (ps->HubName == NULL)
20436 	{
20437 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20438 		return ERR_INVALID_PARAMETER;
20439 	}
20440 
20441 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20442 	if (o == NULL)
20443 	{
20444 		return ERR_INVALID_PARAMETER;
20445 	}
20446 
20447 	Zero(&t, sizeof(t));
20448 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20449 
20450 	// RPC call
20451 	ret = ScGetHubAdminOptions(ps->Rpc, &t);
20452 
20453 	if (ret != ERR_NO_ERROR)
20454 	{
20455 		// An error has occured
20456 		CmdPrintError(c, ret);
20457 		FreeParamValueList(o);
20458 		return ret;
20459 	}
20460 	else
20461 	{
20462 		UINT i;
20463 		bool b = false;
20464 
20465 		for (i = 0;i < t.NumItem;i++)
20466 		{
20467 			if (StrCmpi(t.Items[i].Name, GetParamStr(o, "[name]")) == 0)
20468 			{
20469 				t.Items[i].Value = GetParamInt(o, "VALUE");
20470 				b = true;
20471 			}
20472 		}
20473 
20474 		if (b == false)
20475 		{
20476 			// An error has occured
20477 			ret = ERR_OBJECT_NOT_FOUND;
20478 			CmdPrintError(c, ret);
20479 			FreeParamValueList(o);
20480 			FreeRpcAdminOption(&t);
20481 			return ret;
20482 		}
20483 		else
20484 		{
20485 			StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20486 			ret = ScSetHubAdminOptions(ps->Rpc, &t);
20487 
20488 			if (ret != ERR_NO_ERROR)
20489 			{
20490 				// An error has occured
20491 				CmdPrintError(c, ret);
20492 				FreeParamValueList(o);
20493 				return ret;
20494 			}
20495 		}
20496 	}
20497 
20498 	FreeRpcAdminOption(&t);
20499 
20500 	FreeParamValueList(o);
20501 
20502 	return 0;
20503 }
20504 
20505 // Get the list of Virtual HUB extended options
PsExtOptionList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20506 UINT PsExtOptionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20507 {
20508 	LIST *o;
20509 	PS *ps = (PS *)param;
20510 	UINT ret = 0;
20511 	RPC_ADMIN_OPTION t;
20512 
20513 	// If virtual HUB is not selected, it's an error
20514 	if (ps->HubName == NULL)
20515 	{
20516 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20517 		return ERR_INVALID_PARAMETER;
20518 	}
20519 
20520 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
20521 	if (o == NULL)
20522 	{
20523 		return ERR_INVALID_PARAMETER;
20524 	}
20525 
20526 	Zero(&t, sizeof(t));
20527 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20528 
20529 	// RPC call
20530 	ret = ScGetHubExtOptions(ps->Rpc, &t);
20531 
20532 	if (ret != ERR_NO_ERROR)
20533 	{
20534 		// An error has occured
20535 		CmdPrintError(c, ret);
20536 		FreeParamValueList(o);
20537 		return ret;
20538 	}
20539 	else
20540 	{
20541 		CT *ct = CtNewStandardEx();
20542 		UINT i;
20543 
20544 		for (i = 0;i < t.NumItem;i++)
20545 		{
20546 			ADMIN_OPTION *e = &t.Items[i];
20547 			wchar_t tmp1[MAX_SIZE];
20548 			wchar_t tmp2[MAX_SIZE];
20549 
20550 			StrToUni(tmp1, sizeof(tmp1), e->Name);
20551 			UniToStru(tmp2, e->Value);
20552 
20553 			CtInsert(ct, tmp1, tmp2, GetHubAdminOptionHelpString(e->Name));
20554 
20555 		}
20556 
20557 		CtFreeEx(ct, c, true);
20558 	}
20559 
20560 	FreeRpcAdminOption(&t);
20561 
20562 	FreeParamValueList(o);
20563 
20564 	return 0;
20565 }
20566 
20567 // Set the value of a Virtual HUB extended option
PsExtOptionSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20568 UINT PsExtOptionSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20569 {
20570 	LIST *o;
20571 	PS *ps = (PS *)param;
20572 	UINT ret = 0;
20573 	RPC_ADMIN_OPTION t;
20574 	// Parameter list that can be specified
20575 	PARAM args[] =
20576 	{
20577 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
20578 		{"[name]", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_name"), CmdEvalNotEmpty, NULL},
20579 		{"VALUE", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_VALUE"), CmdEvalNotEmpty, NULL},
20580 	};
20581 
20582 	// If virtual HUB is not selected, it's an error
20583 	if (ps->HubName == NULL)
20584 	{
20585 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20586 		return ERR_INVALID_PARAMETER;
20587 	}
20588 
20589 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20590 	if (o == NULL)
20591 	{
20592 		return ERR_INVALID_PARAMETER;
20593 	}
20594 
20595 	Zero(&t, sizeof(t));
20596 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20597 
20598 	// RPC call
20599 	ret = ScGetHubExtOptions(ps->Rpc, &t);
20600 
20601 	if (ret != ERR_NO_ERROR)
20602 	{
20603 		// An error has occured
20604 		CmdPrintError(c, ret);
20605 		FreeParamValueList(o);
20606 		return ret;
20607 	}
20608 	else
20609 	{
20610 		UINT i;
20611 		bool b = false;
20612 
20613 		for (i = 0;i < t.NumItem;i++)
20614 		{
20615 			if (StrCmpi(t.Items[i].Name, GetParamStr(o, "[name]")) == 0)
20616 			{
20617 				t.Items[i].Value = GetParamInt(o, "VALUE");
20618 				b = true;
20619 			}
20620 		}
20621 
20622 		if (b == false)
20623 		{
20624 			// An error has occured
20625 			ret = ERR_OBJECT_NOT_FOUND;
20626 			CmdPrintError(c, ret);
20627 			FreeParamValueList(o);
20628 			FreeRpcAdminOption(&t);
20629 			return ret;
20630 		}
20631 		else
20632 		{
20633 			StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20634 			ret = ScSetHubExtOptions(ps->Rpc, &t);
20635 
20636 			if (ret != ERR_NO_ERROR)
20637 			{
20638 				// An error has occured
20639 				CmdPrintError(c, ret);
20640 				FreeParamValueList(o);
20641 				return ret;
20642 			}
20643 		}
20644 	}
20645 
20646 	FreeRpcAdminOption(&t);
20647 
20648 	FreeParamValueList(o);
20649 
20650 	return 0;
20651 }
20652 
20653 // Get the list of revoked certificate list
PsCrlList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20654 UINT PsCrlList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20655 {
20656 	LIST *o;
20657 	PS *ps = (PS *)param;
20658 	UINT ret = 0;
20659 	RPC_ENUM_CRL t;
20660 
20661 	// If virtual HUB is not selected, it's an error
20662 	if (ps->HubName == NULL)
20663 	{
20664 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20665 		return ERR_INVALID_PARAMETER;
20666 	}
20667 
20668 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
20669 	if (o == NULL)
20670 	{
20671 		return ERR_INVALID_PARAMETER;
20672 	}
20673 
20674 	Zero(&t, sizeof(t));
20675 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20676 
20677 	// RPC call
20678 	ret = ScEnumCrl(ps->Rpc, &t);
20679 
20680 	if (ret != ERR_NO_ERROR)
20681 	{
20682 		// An error has occured
20683 		CmdPrintError(c, ret);
20684 		FreeParamValueList(o);
20685 		return ret;
20686 	}
20687 	else
20688 	{
20689 		UINT i;
20690 		CT *ct = CtNew();
20691 
20692 		CtInsertColumn(ct, _UU("CMD_ID"), false);
20693 		CtInsertColumn(ct, _UU("SM_CRL_COLUMN_1"), false);
20694 
20695 		for (i = 0;i < t.NumItem;i++)
20696 		{
20697 			wchar_t tmp[64];
20698 			RPC_ENUM_CRL_ITEM *e = &t.Items[i];
20699 
20700 			UniToStru(tmp, e->Key);
20701 			CtInsert(ct, tmp, e->CrlInfo);
20702 		}
20703 
20704 		CtFreeEx(ct, c, true);
20705 	}
20706 
20707 	FreeRpcEnumCrl(&t);
20708 
20709 	FreeParamValueList(o);
20710 
20711 	return 0;
20712 }
20713 
20714 // Add a revoked certificate
PsCrlAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20715 UINT PsCrlAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20716 {
20717 	LIST *o;
20718 	PS *ps = (PS *)param;
20719 	UINT ret = 0;
20720 	RPC_CRL t;
20721 	// Parameter list that can be specified
20722 	PARAM args[] =
20723 	{
20724 		{"SERIAL", NULL, NULL, NULL, NULL},
20725 		{"MD5", NULL, NULL, NULL, NULL},
20726 		{"SHA1", NULL, NULL, NULL, NULL},
20727 		{"CN", NULL, NULL, NULL, NULL},
20728 		{"O", NULL, NULL, NULL, NULL},
20729 		{"OU", NULL, NULL, NULL, NULL},
20730 		{"C", NULL, NULL, NULL, NULL},
20731 		{"ST", NULL, NULL, NULL, NULL},
20732 		{"L", NULL, NULL, NULL, NULL},
20733 	};
20734 
20735 	// If virtual HUB is not selected, it's an error
20736 	if (ps->HubName == NULL)
20737 	{
20738 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20739 		return ERR_INVALID_PARAMETER;
20740 	}
20741 
20742 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20743 	if (o == NULL)
20744 	{
20745 		return ERR_INVALID_PARAMETER;
20746 	}
20747 
20748 	Zero(&t, sizeof(t));
20749 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20750 
20751 	{
20752 		bool param_exists = false;
20753 		CRL *crl = ZeroMalloc(sizeof(CRL));
20754 		NAME *n;
20755 		n = crl->Name = ZeroMalloc(sizeof(NAME));
20756 
20757 		if (IsEmptyStr(GetParamStr(o, "CN")) == false)
20758 		{
20759 			n->CommonName = CopyUniStr(GetParamUniStr(o, "CN"));
20760 			param_exists = true;
20761 		}
20762 
20763 		if (IsEmptyStr(GetParamStr(o, "O")) == false)
20764 		{
20765 			n->CommonName = CopyUniStr(GetParamUniStr(o, "O"));
20766 			param_exists = true;
20767 		}
20768 
20769 		if (IsEmptyStr(GetParamStr(o, "OU")) == false)
20770 		{
20771 			n->CommonName = CopyUniStr(GetParamUniStr(o, "OU"));
20772 			param_exists = true;
20773 		}
20774 
20775 		if (IsEmptyStr(GetParamStr(o, "C")) == false)
20776 		{
20777 			n->CommonName = CopyUniStr(GetParamUniStr(o, "C"));
20778 			param_exists = true;
20779 		}
20780 
20781 		if (IsEmptyStr(GetParamStr(o, "ST")) == false)
20782 		{
20783 			n->CommonName = CopyUniStr(GetParamUniStr(o, "ST"));
20784 			param_exists = true;
20785 		}
20786 
20787 		if (IsEmptyStr(GetParamStr(o, "L")) == false)
20788 		{
20789 			n->CommonName = CopyUniStr(GetParamUniStr(o, "L"));
20790 			param_exists = true;
20791 		}
20792 
20793 		if (IsEmptyStr(GetParamStr(o, "SERIAL")) == false)
20794 		{
20795 			BUF *b;
20796 
20797 			b = StrToBin(GetParamStr(o, "SERIAL"));
20798 
20799 			if (b != NULL && b->Size >= 1)
20800 			{
20801 				crl->Serial = NewXSerial(b->Buf, b->Size);
20802 				param_exists = true;
20803 			}
20804 
20805 			FreeBuf(b);
20806 		}
20807 
20808 		if (IsEmptyStr(GetParamStr(o, "MD5")) == false)
20809 		{
20810 			BUF *b;
20811 
20812 			b = StrToBin(GetParamStr(o, "MD5"));
20813 
20814 			if (b != NULL && b->Size == MD5_SIZE)
20815 			{
20816 				Copy(crl->DigestMD5, b->Buf, MD5_SIZE);
20817 				param_exists = true;
20818 			}
20819 
20820 			FreeBuf(b);
20821 		}
20822 
20823 		if (IsEmptyStr(GetParamStr(o, "SHA1")) == false)
20824 		{
20825 			BUF *b;
20826 
20827 			b = StrToBin(GetParamStr(o, "SHA1"));
20828 
20829 			if (b != NULL && b->Size == SHA1_SIZE)
20830 			{
20831 				Copy(crl->DigestSHA1, b->Buf, SHA1_SIZE);
20832 				param_exists = true;
20833 			}
20834 
20835 			FreeBuf(b);
20836 		}
20837 
20838 		t.Crl = crl;
20839 
20840 		if (param_exists == false)
20841 		{
20842 			FreeRpcCrl(&t);
20843 			ret = ERR_INVALID_PARAMETER;
20844 			CmdPrintError(c, ret);
20845 			FreeParamValueList(o);
20846 			return ret;
20847 		}
20848 	}
20849 
20850 	// RPC call
20851 	ret = ScAddCrl(ps->Rpc, &t);
20852 
20853 	if (ret != ERR_NO_ERROR)
20854 	{
20855 		// An error has occured
20856 		CmdPrintError(c, ret);
20857 		FreeParamValueList(o);
20858 		return ret;
20859 	}
20860 
20861 	FreeRpcCrl(&t);
20862 
20863 	FreeParamValueList(o);
20864 
20865 	return 0;
20866 }
20867 
20868 // Delete the revoked certificate
PsCrlDel(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20869 UINT PsCrlDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20870 {
20871 	LIST *o;
20872 	PS *ps = (PS *)param;
20873 	UINT ret = 0;
20874 	RPC_CRL t;
20875 	// Parameter list that can be specified
20876 	PARAM args[] =
20877 	{
20878 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
20879 		{"[id]", CmdPrompt, _UU("CMD_CrlDel_Prompt_ID"), CmdEvalNotEmpty, NULL},
20880 	};
20881 
20882 	// If virtual HUB is not selected, it's an error
20883 	if (ps->HubName == NULL)
20884 	{
20885 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20886 		return ERR_INVALID_PARAMETER;
20887 	}
20888 
20889 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20890 	if (o == NULL)
20891 	{
20892 		return ERR_INVALID_PARAMETER;
20893 	}
20894 
20895 	Zero(&t, sizeof(t));
20896 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20897 	t.Key = GetParamInt(o, "[id]");
20898 
20899 	// RPC call
20900 	ret = ScDelCrl(ps->Rpc, &t);
20901 
20902 	if (ret != ERR_NO_ERROR)
20903 	{
20904 		// An error has occured
20905 		CmdPrintError(c, ret);
20906 		FreeParamValueList(o);
20907 		return ret;
20908 	}
20909 
20910 	FreeRpcCrl(&t);
20911 
20912 	FreeParamValueList(o);
20913 
20914 	return 0;
20915 }
20916 
20917 // Get the revoked certificate
PsCrlGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)20918 UINT PsCrlGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
20919 {
20920 	LIST *o;
20921 	PS *ps = (PS *)param;
20922 	UINT ret = 0;
20923 	RPC_CRL t;
20924 	// Parameter list that can be specified
20925 	PARAM args[] =
20926 	{
20927 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
20928 		{"[id]", CmdPrompt, _UU("CMD_CrlGet_Prompt_ID"), CmdEvalNotEmpty, NULL},
20929 	};
20930 
20931 	// If virtual HUB is not selected, it's an error
20932 	if (ps->HubName == NULL)
20933 	{
20934 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
20935 		return ERR_INVALID_PARAMETER;
20936 	}
20937 
20938 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
20939 	if (o == NULL)
20940 	{
20941 		return ERR_INVALID_PARAMETER;
20942 	}
20943 
20944 	Zero(&t, sizeof(t));
20945 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
20946 	t.Key = GetParamInt(o, "[id]");
20947 
20948 	// RPC call
20949 	ret = ScGetCrl(ps->Rpc, &t);
20950 
20951 	if (ret != ERR_NO_ERROR)
20952 	{
20953 		// An error has occured
20954 		CmdPrintError(c, ret);
20955 		FreeParamValueList(o);
20956 		return ret;
20957 	}
20958 	else
20959 	{
20960 		// Show contents
20961 		CT *ct = CtNewStandard();
20962 		CRL *crl = t.Crl;
20963 		NAME *n;
20964 
20965 		if (crl != NULL)
20966 		{
20967 			n = crl->Name;
20968 
20969 			if (n != NULL)
20970 			{
20971 				if (UniIsEmptyStr(n->CommonName) == false)
20972 				{
20973 					CtInsert(ct, _UU("CMD_CrlGet_CN"), n->CommonName);
20974 				}
20975 				if (UniIsEmptyStr(n->Organization) == false)
20976 				{
20977 					CtInsert(ct, _UU("CMD_CrlGet_O"), n->Organization);
20978 				}
20979 				if (UniIsEmptyStr(n->Unit) == false)
20980 				{
20981 					CtInsert(ct, _UU("CMD_CrlGet_OU"), n->Unit);
20982 				}
20983 				if (UniIsEmptyStr(n->Country) == false)
20984 				{
20985 					CtInsert(ct, _UU("CMD_CrlGet_C"), n->Country);
20986 				}
20987 				if (UniIsEmptyStr(n->State) == false)
20988 				{
20989 					CtInsert(ct, _UU("CMD_CrlGet_ST"), n->State);
20990 				}
20991 				if (UniIsEmptyStr(n->Local) == false)
20992 				{
20993 					CtInsert(ct, _UU("CMD_CrlGet_L"), n->Local);
20994 				}
20995 			}
20996 
20997 			if (crl->Serial != NULL && crl->Serial->size >= 1)
20998 			{
20999 				wchar_t tmp[MAX_SIZE];
21000 				char str[MAX_SIZE];
21001 
21002 				BinToStrEx(str, sizeof(str), crl->Serial->data, crl->Serial->size);
21003 				StrToUni(tmp, sizeof(tmp), str);
21004 
21005 				CtInsert(ct, _UU("CMD_CrlGet_SERI"), tmp);
21006 			}
21007 
21008 			if (IsZero(crl->DigestMD5, MD5_SIZE) == false)
21009 			{
21010 				wchar_t tmp[MAX_SIZE];
21011 				char str[MAX_SIZE];
21012 
21013 				BinToStrEx(str, sizeof(str), crl->DigestMD5, MD5_SIZE);
21014 				StrToUni(tmp, sizeof(tmp), str);
21015 
21016 				CtInsert(ct, _UU("CMD_CrlGet_MD5_HASH"), tmp);
21017 			}
21018 
21019 			if (IsZero(crl->DigestSHA1, SHA1_SIZE) == false)
21020 			{
21021 				wchar_t tmp[MAX_SIZE];
21022 				char str[MAX_SIZE];
21023 
21024 				BinToStrEx(str, sizeof(str), crl->DigestSHA1, SHA1_SIZE);
21025 				StrToUni(tmp, sizeof(tmp), str);
21026 
21027 				CtInsert(ct, _UU("CMD_CrlGet_SHA1_HASH"), tmp);
21028 			}
21029 		}
21030 		CtFree(ct, c);
21031 	}
21032 
21033 	FreeRpcCrl(&t);
21034 
21035 	FreeParamValueList(o);
21036 
21037 	return 0;
21038 }
21039 
21040 // Get the rules of IP access control list
PsAcList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21041 UINT PsAcList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21042 {
21043 	LIST *o;
21044 	PS *ps = (PS *)param;
21045 	UINT ret = 0;
21046 	RPC_AC_LIST t;
21047 
21048 	// If virtual HUB is not selected, it's an error
21049 	if (ps->HubName == NULL)
21050 	{
21051 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
21052 		return ERR_INVALID_PARAMETER;
21053 	}
21054 
21055 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
21056 	if (o == NULL)
21057 	{
21058 		return ERR_INVALID_PARAMETER;
21059 	}
21060 
21061 	Zero(&t, sizeof(t));
21062 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
21063 
21064 	// RPC call
21065 	ret = ScGetAcList(ps->Rpc, &t);
21066 
21067 	if (ret != ERR_NO_ERROR)
21068 	{
21069 		// An error has occured
21070 		CmdPrintError(c, ret);
21071 		FreeParamValueList(o);
21072 		return ret;
21073 	}
21074 	else
21075 	{
21076 		UINT i;
21077 		CT *ct;
21078 
21079 		ct = CtNew();
21080 		CtInsertColumn(ct, _UU("SM_AC_COLUMN_1"), true);
21081 		CtInsertColumn(ct, _UU("SM_AC_COLUMN_2"), true);
21082 		CtInsertColumn(ct, _UU("SM_AC_COLUMN_3"), false);
21083 		CtInsertColumn(ct, _UU("SM_AC_COLUMN_4"), false);
21084 
21085 		for (i = 0;i < LIST_NUM(t.o);i++)
21086 		{
21087 			wchar_t tmp1[32], *tmp2, tmp3[MAX_SIZE], tmp4[32];
21088 			char *tmp_str;
21089 			AC *ac = LIST_DATA(t.o, i);
21090 
21091 			UniToStru(tmp1, ac->Id);
21092 			tmp2 = ac->Deny ? _UU("SM_AC_DENY") : _UU("SM_AC_PASS");
21093 			tmp_str = GenerateAcStr(ac);
21094 			StrToUni(tmp3, sizeof(tmp3), tmp_str);
21095 
21096 			Free(tmp_str);
21097 
21098 			UniToStru(tmp4, ac->Priority);
21099 
21100 			CtInsert(ct, tmp1, tmp4, tmp2, tmp3);
21101 		}
21102 
21103 		CtFree(ct, c);
21104 	}
21105 
21106 	FreeRpcAcList(&t);
21107 
21108 	FreeParamValueList(o);
21109 
21110 	return 0;
21111 }
21112 
21113 // Add a rule to the IP access control list (IPv4)
PsAcAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21114 UINT PsAcAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21115 {
21116 	LIST *o;
21117 	PS *ps = (PS *)param;
21118 	UINT ret = 0;
21119 	RPC_AC_LIST t;
21120 	// Parameter list that can be specified
21121 	CMD_EVAL_MIN_MAX mm =
21122 	{
21123 		"CMD_AcAdd_Eval_PRIORITY", 1, 4294967295UL,
21124 	};
21125 	PARAM args[] =
21126 	{
21127 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21128 		{"[allow|deny]", CmdPrompt, _UU("CMD_AcAdd_Prompt_AD"), CmdEvalNotEmpty, NULL},
21129 		{"PRIORITY", CmdPrompt, _UU("CMD_AcAdd_Prompt_PRIORITY"), CmdEvalMinMax, &mm},
21130 		{"IP", CmdPrompt, _UU("CMD_AcAdd_Prompt_IP"), CmdEvalIpAndMask4, NULL},
21131 	};
21132 
21133 	// If virtual HUB is not selected, it's an error
21134 	if (ps->HubName == NULL)
21135 	{
21136 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
21137 		return ERR_INVALID_PARAMETER;
21138 	}
21139 
21140 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21141 	if (o == NULL)
21142 	{
21143 		return ERR_INVALID_PARAMETER;
21144 	}
21145 
21146 	Zero(&t, sizeof(t));
21147 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
21148 
21149 	// RPC call
21150 	ret = ScGetAcList(ps->Rpc, &t);
21151 
21152 	if (ret != ERR_NO_ERROR)
21153 	{
21154 		// An error has occured
21155 		CmdPrintError(c, ret);
21156 		FreeParamValueList(o);
21157 		return ret;
21158 	}
21159 	else
21160 	{
21161 		// Add a new item to the list
21162 		AC *ac = ZeroMalloc(sizeof(AC));
21163 		char *test = GetParamStr(o, "[allow|deny]");
21164 		UINT u_ip, u_mask;
21165 
21166 		if (StartWith("deny", test))
21167 		{
21168 			ac->Deny = true;
21169 		}
21170 
21171 		ParseIpAndMask4(GetParamStr(o, "IP"), &u_ip, &u_mask);
21172 		UINTToIP(&ac->IpAddress, u_ip);
21173 
21174 		if (u_mask == 0xffffffff)
21175 		{
21176 			ac->Masked = false;
21177 		}
21178 		else
21179 		{
21180 			ac->Masked = true;
21181 			UINTToIP(&ac->SubnetMask, u_mask);
21182 		}
21183 
21184 		ac->Priority = GetParamInt(o, "PRIORITY");
21185 
21186 		Insert(t.o, ac);
21187 
21188 		ret = ScSetAcList(ps->Rpc, &t);
21189 		if (ret != ERR_NO_ERROR)
21190 		{
21191 			// An error has occured
21192 			CmdPrintError(c, ret);
21193 			FreeParamValueList(o);
21194 			return ret;
21195 		}
21196 	}
21197 
21198 	FreeRpcAcList(&t);
21199 
21200 	FreeParamValueList(o);
21201 
21202 	return 0;
21203 }
21204 
21205 // Add a rule to the IP access control list (IPv6)
PsAcAdd6(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21206 UINT PsAcAdd6(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21207 {
21208 	LIST *o;
21209 	PS *ps = (PS *)param;
21210 	UINT ret = 0;
21211 	RPC_AC_LIST t;
21212 	// Parameter list that can be specified
21213 	CMD_EVAL_MIN_MAX mm =
21214 	{
21215 		"CMD_AcAdd6_Eval_PRIORITY", 1, 4294967295UL,
21216 	};
21217 	PARAM args[] =
21218 	{
21219 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21220 		{"[allow|deny]", CmdPrompt, _UU("CMD_AcAdd6_Prompt_AD"), CmdEvalNotEmpty, NULL},
21221 		{"PRIORITY", CmdPrompt, _UU("CMD_AcAdd6_Prompt_PRIORITY"), CmdEvalMinMax, &mm},
21222 		{"IP", CmdPrompt, _UU("CMD_AcAdd6_Prompt_IP"), CmdEvalIpAndMask6, NULL},
21223 	};
21224 
21225 	// If virtual HUB is not selected, it's an error
21226 	if (ps->HubName == NULL)
21227 	{
21228 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
21229 		return ERR_INVALID_PARAMETER;
21230 	}
21231 
21232 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21233 	if (o == NULL)
21234 	{
21235 		return ERR_INVALID_PARAMETER;
21236 	}
21237 
21238 	Zero(&t, sizeof(t));
21239 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
21240 
21241 	// RPC call
21242 	ret = ScGetAcList(ps->Rpc, &t);
21243 
21244 	if (ret != ERR_NO_ERROR)
21245 	{
21246 		// An error has occured
21247 		CmdPrintError(c, ret);
21248 		FreeParamValueList(o);
21249 		return ret;
21250 	}
21251 	else
21252 	{
21253 		// Add a new item to the list
21254 		AC *ac = ZeroMalloc(sizeof(AC));
21255 		char *test = GetParamStr(o, "[allow|deny]");
21256 		IP u_ip, u_mask;
21257 
21258 		if (StartWith("deny", test))
21259 		{
21260 			ac->Deny = true;
21261 		}
21262 
21263 		ParseIpAndMask6(GetParamStr(o, "IP"), &u_ip, &u_mask);
21264 		Copy(&ac->IpAddress, &u_ip, sizeof(IP));
21265 
21266 		if (SubnetMaskToInt6(&u_mask) == 128)
21267 		{
21268 			ac->Masked = false;
21269 		}
21270 		else
21271 		{
21272 			ac->Masked = true;
21273 			Copy(&ac->SubnetMask, &u_mask, sizeof(IP));
21274 		}
21275 
21276 		ac->Priority = GetParamInt(o, "PRIORITY");
21277 
21278 		Insert(t.o, ac);
21279 
21280 		ret = ScSetAcList(ps->Rpc, &t);
21281 		if (ret != ERR_NO_ERROR)
21282 		{
21283 			// An error has occured
21284 			CmdPrintError(c, ret);
21285 			FreeParamValueList(o);
21286 			return ret;
21287 		}
21288 	}
21289 
21290 	FreeRpcAcList(&t);
21291 
21292 	FreeParamValueList(o);
21293 
21294 	return 0;
21295 }
21296 
21297 // Run the debug command
PsDebug(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21298 UINT PsDebug(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21299 {
21300 	LIST *o;
21301 	PS *ps = (PS *)param;
21302 	UINT id;
21303 	// Parameter list that can be specified
21304 	PARAM args[] =
21305 	{
21306 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21307 		{"[id]", NULL, NULL, NULL, NULL},
21308 		{"ARG", NULL, NULL, NULL, NULL},
21309 	};
21310 
21311 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21312 	if (o == NULL)
21313 	{
21314 		return ERR_INVALID_PARAMETER;
21315 	}
21316 
21317 	id = GetParamInt(o, "[id]");
21318 
21319 	if (true)
21320 	{
21321 		RPC_TEST t;
21322 		UINT ret;
21323 
21324 		c->Write(c, _UU("CMD_Debug_Msg1"));
21325 
21326 		Zero(&t, sizeof(t));
21327 
21328 		t.IntValue = id;
21329 		StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "ARG"));
21330 
21331 		ret = ScDebug(ps->Rpc, &t);
21332 
21333 		if (ret != ERR_NO_ERROR)
21334 		{
21335 			// An error has occured
21336 			CmdPrintError(c, ret);
21337 			FreeParamValueList(o);
21338 			return ret;
21339 		}
21340 		else
21341 		{
21342 			wchar_t tmp[sizeof(t.StrValue)];
21343 
21344 			UniFormat(tmp, sizeof(tmp), _UU("CMD_Debug_Msg2"), t.StrValue);
21345 			c->Write(c, tmp);
21346 		}
21347 	}
21348 
21349 	FreeParamValueList(o);
21350 
21351 	return 0;
21352 }
21353 
21354 // Flush the configuration file on the server
PsFlush(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21355 UINT PsFlush(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21356 {
21357 	LIST *o;
21358 	PS *ps = (PS *)param;
21359 
21360 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
21361 	if (o == NULL)
21362 	{
21363 		return ERR_INVALID_PARAMETER;
21364 	}
21365 
21366 	if (true)
21367 	{
21368 		RPC_TEST t;
21369 		UINT ret;
21370 		wchar_t tmp[MAX_SIZE];
21371 		char sizestr[MAX_SIZE];
21372 
21373 		c->Write(c, _UU("CMD_Flush_Msg1"));
21374 
21375 		Zero(&t, sizeof(t));
21376 
21377 		ret = ScFlush(ps->Rpc, &t);
21378 
21379 		if (ret != ERR_NO_ERROR)
21380 		{
21381 			// An error has occured
21382 			CmdPrintError(c, ret);
21383 			FreeParamValueList(o);
21384 			return ret;
21385 		}
21386 
21387 		ToStr3(sizestr, sizeof(sizestr), (UINT64)t.IntValue);
21388 		UniFormat(tmp, sizeof(tmp), _UU("CMD_Flush_Msg2"), sizestr);
21389 		c->Write(c, tmp);
21390 	}
21391 
21392 	FreeParamValueList(o);
21393 
21394 	return 0;
21395 }
21396 
21397 // Crash
PsCrash(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21398 UINT PsCrash(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21399 {
21400 	LIST *o;
21401 	PS *ps = (PS *)param;
21402 	char *yes;
21403 	// Parameter list that can be specified
21404 	PARAM args[] =
21405 	{
21406 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21407 		{"[yes]", CmdPrompt, _UU("CMD_Crash_Confirm"), NULL, NULL},
21408 	};
21409 
21410 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21411 	if (o == NULL)
21412 	{
21413 		return ERR_INVALID_PARAMETER;
21414 	}
21415 
21416 	yes = GetParamStr(o, "[yes]");
21417 
21418 	if (StrCmpi(yes, "yes") != 0)
21419 	{
21420 		c->Write(c, _UU("CMD_Crash_Aborted"));
21421 	}
21422 	else
21423 	{
21424 		RPC_TEST t;
21425 		UINT ret;
21426 
21427 		c->Write(c, _UU("CMD_Crash_Msg"));
21428 
21429 		Zero(&t, sizeof(t));
21430 
21431 		ret = ScCrash(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 
21442 	FreeParamValueList(o);
21443 
21444 	return 0;
21445 }
21446 
21447 // Remove a rule in the IP access control list
PsAcDel(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21448 UINT PsAcDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21449 {
21450 	LIST *o;
21451 	PS *ps = (PS *)param;
21452 	UINT ret = 0;
21453 	RPC_AC_LIST t;
21454 	// Parameter list that can be specified
21455 	PARAM args[] =
21456 	{
21457 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21458 		{"[id]", CmdPrompt, _UU("CMD_AcDel_Prompt_ID"), CmdEvalNotEmpty, NULL},
21459 	};
21460 
21461 	// If virtual HUB is not selected, it's an error
21462 	if (ps->HubName == NULL)
21463 	{
21464 		c->Write(c, _UU("CMD_Hub_Not_Selected"));
21465 		return ERR_INVALID_PARAMETER;
21466 	}
21467 
21468 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21469 	if (o == NULL)
21470 	{
21471 		return ERR_INVALID_PARAMETER;
21472 	}
21473 
21474 	Zero(&t, sizeof(t));
21475 	StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
21476 
21477 	// RPC call
21478 	ret = ScGetAcList(ps->Rpc, &t);
21479 
21480 	if (ret != ERR_NO_ERROR)
21481 	{
21482 		// An error has occured
21483 		CmdPrintError(c, ret);
21484 		FreeParamValueList(o);
21485 		return ret;
21486 	}
21487 	else
21488 	{
21489 		// Remove matched ID
21490 		UINT i;
21491 		bool b = false;
21492 
21493 		for (i = 0;i < LIST_NUM(t.o);i++)
21494 		{
21495 			AC *ac = LIST_DATA(t.o, i);
21496 
21497 			if (ac->Id == GetParamInt(o, "[id]"))
21498 			{
21499 				Delete(t.o, ac);
21500 				Free(ac);
21501 				b = true;
21502 				break;
21503 			}
21504 		}
21505 
21506 		if (b == false)
21507 		{
21508 			ret = ERR_OBJECT_NOT_FOUND;
21509 			FreeRpcAcList(&t);
21510 		}
21511 		else
21512 		{
21513 			ret = ScSetAcList(ps->Rpc, &t);
21514 		}
21515 		if (ret != ERR_NO_ERROR)
21516 		{
21517 			// An error has occured
21518 			CmdPrintError(c, ret);
21519 			FreeParamValueList(o);
21520 			return ret;
21521 		}
21522 	}
21523 
21524 	FreeRpcAcList(&t);
21525 	FreeParamValueList(o);
21526 
21527 	return 0;
21528 }
21529 
21530 // Enable / Disable the IPsec VPN server function
PsIPsecEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21531 UINT PsIPsecEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21532 {
21533 	LIST *o;
21534 	PS *ps = (PS *)param;
21535 	UINT ret = 0;
21536 	IPSEC_SERVICES t;
21537 	// Parameter list that can be specified
21538 	PARAM args[] =
21539 	{
21540 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21541 		{"L2TP", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_L2TP"), CmdEvalNotEmpty, NULL},
21542 		{"L2TPRAW", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_L2TPRAW"), CmdEvalNotEmpty, NULL},
21543 		{"ETHERIP", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_ETHERIP"), CmdEvalNotEmpty, NULL},
21544 		{"PSK", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_PSK"), CmdEvalNotEmpty, NULL},
21545 		{"DEFAULTHUB", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_DEFAULTHUB"), CmdEvalNotEmpty, NULL},
21546 	};
21547 
21548 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21549 	if (o == NULL)
21550 	{
21551 		return ERR_INVALID_PARAMETER;
21552 	}
21553 
21554 	Zero(&t, sizeof(t));
21555 	t.L2TP_IPsec = GetParamYes(o, "L2TP");
21556 	t.L2TP_Raw = GetParamYes(o, "L2TPRAW");
21557 	t.EtherIP_IPsec = GetParamYes(o, "ETHERIP");
21558 	StrCpy(t.IPsec_Secret, sizeof(t.IPsec_Secret), GetParamStr(o, "PSK"));
21559 	StrCpy(t.L2TP_DefaultHub, sizeof(t.L2TP_DefaultHub), GetParamStr(o, "DEFAULTHUB"));
21560 
21561 	// RPC call
21562 	ret = ScSetIPsecServices(ps->Rpc, &t);
21563 
21564 	if (ret != ERR_NO_ERROR)
21565 	{
21566 		// An error has occured
21567 		CmdPrintError(c, ret);
21568 		FreeParamValueList(o);
21569 		return ret;
21570 	}
21571 
21572 	FreeParamValueList(o);
21573 
21574 	return 0;
21575 }
21576 
21577 // Get the current configuration of IPsec VPN server function
PsIPsecGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21578 UINT PsIPsecGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21579 {
21580 	LIST *o;
21581 	PS *ps = (PS *)param;
21582 	UINT ret = 0;
21583 	IPSEC_SERVICES t;
21584 
21585 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
21586 	if (o == NULL)
21587 	{
21588 		return ERR_INVALID_PARAMETER;
21589 	}
21590 
21591 	Zero(&t, sizeof(t));
21592 
21593 	// RPC call
21594 	ret = ScGetIPsecServices(ps->Rpc, &t);
21595 
21596 	if (ret != ERR_NO_ERROR)
21597 	{
21598 		// An error has occured
21599 		CmdPrintError(c, ret);
21600 		FreeParamValueList(o);
21601 		return ret;
21602 	}
21603 	else
21604 	{
21605 		wchar_t tmp[MAX_PATH];
21606 		CT *ct = CtNewStandard();
21607 
21608 		CtInsert(ct, _UU("CMD_IPsecGet_PRINT_L2TP"), _UU(t.L2TP_IPsec ? "SEC_YES" : "SEC_NO"));
21609 		CtInsert(ct, _UU("CMD_IPsecGet_PRINT_L2TPRAW"), _UU(t.L2TP_Raw ? "SEC_YES" : "SEC_NO"));
21610 		CtInsert(ct, _UU("CMD_IPsecGet_PRINT_ETHERIP"), _UU(t.EtherIP_IPsec ? "SEC_YES" : "SEC_NO"));
21611 
21612 		StrToUni(tmp, sizeof(tmp), t.IPsec_Secret);
21613 		CtInsert(ct, _UU("CMD_IPsecGet_PRINT_PSK"), tmp);
21614 
21615 		StrToUni(tmp, sizeof(tmp), t.L2TP_DefaultHub);
21616 		CtInsert(ct, _UU("CMD_IPsecGet_PRINT_DEFAULTHUB"), tmp);
21617 
21618 		CtFree(ct, c);
21619 	}
21620 
21621 	FreeParamValueList(o);
21622 
21623 	return 0;
21624 }
21625 
21626 // 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)21627 UINT PsEtherIpClientAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21628 {
21629 	LIST *o;
21630 	PS *ps = (PS *)param;
21631 	UINT ret = 0;
21632 	ETHERIP_ID t;
21633 	// Parameter list that can be specified
21634 	PARAM args[] =
21635 	{
21636 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21637 		{"[ID]", CmdPrompt, _UU("CMD_EtherIpClientAdd_Prompt_ID"), CmdEvalNotEmpty, NULL},
21638 		{"HUB", CmdPrompt, _UU("CMD_EtherIpClientAdd_Prompt_HUB"), CmdEvalNotEmpty, NULL},
21639 		{"USERNAME", CmdPrompt, _UU("CMD_EtherIpClientAdd_Prompt_USERNAME"), CmdEvalNotEmpty, NULL},
21640 		{"PASSWORD", CmdPrompt, _UU("CMD_EtherIpClientAdd_Prompt_PASSWORD"), CmdEvalNotEmpty, NULL},
21641 	};
21642 
21643 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21644 	if (o == NULL)
21645 	{
21646 		return ERR_INVALID_PARAMETER;
21647 	}
21648 
21649 	Zero(&t, sizeof(t));
21650 	StrCpy(t.Id, sizeof(t.Id), GetParamStr(o, "[ID]"));
21651 	StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "HUB"));
21652 	StrCpy(t.UserName, sizeof(t.UserName), GetParamStr(o, "USERNAME"));
21653 	StrCpy(t.Password, sizeof(t.Password), GetParamStr(o, "PASSWORD"));
21654 
21655 	// RPC call
21656 	ret = ScAddEtherIpId(ps->Rpc, &t);
21657 
21658 	if (ret != ERR_NO_ERROR)
21659 	{
21660 		// An error has occured
21661 		CmdPrintError(c, ret);
21662 		FreeParamValueList(o);
21663 		return ret;
21664 	}
21665 
21666 	FreeParamValueList(o);
21667 
21668 	return 0;
21669 }
21670 
21671 // 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)21672 UINT PsEtherIpClientDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21673 {
21674 	LIST *o;
21675 	PS *ps = (PS *)param;
21676 	UINT ret = 0;
21677 	ETHERIP_ID t;
21678 	// Parameter list that can be specified
21679 	PARAM args[] =
21680 	{
21681 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21682 		{"[ID]", CmdPrompt, _UU("CMD_EtherIpClientDelete_Prompt_ID"), CmdEvalNotEmpty, NULL},
21683 	};
21684 
21685 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21686 	if (o == NULL)
21687 	{
21688 		return ERR_INVALID_PARAMETER;
21689 	}
21690 
21691 	Zero(&t, sizeof(t));
21692 	StrCpy(t.Id, sizeof(t.Id), GetParamStr(o, "[ID]"));
21693 
21694 	// RPC call
21695 	ret = ScDeleteEtherIpId(ps->Rpc, &t);
21696 
21697 	if (ret != ERR_NO_ERROR)
21698 	{
21699 		// An error has occured
21700 		CmdPrintError(c, ret);
21701 		FreeParamValueList(o);
21702 		return ret;
21703 	}
21704 
21705 	FreeParamValueList(o);
21706 
21707 	return 0;
21708 }
21709 
21710 // 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)21711 UINT PsEtherIpClientList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21712 {
21713 	LIST *o;
21714 	PS *ps = (PS *)param;
21715 	UINT ret = 0;
21716 	RPC_ENUM_ETHERIP_ID t;
21717 	UINT i;
21718 	CT *b;
21719 
21720 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
21721 	if (o == NULL)
21722 	{
21723 		return ERR_INVALID_PARAMETER;
21724 	}
21725 
21726 	Zero(&t, sizeof(t));
21727 
21728 	// RPC call
21729 	ret = ScEnumEtherIpId(ps->Rpc, &t);
21730 
21731 	if (ret != ERR_NO_ERROR)
21732 	{
21733 		// An error has occured
21734 		CmdPrintError(c, ret);
21735 		FreeParamValueList(o);
21736 		return ret;
21737 	}
21738 	else
21739 	{
21740 		b = CtNew();
21741 
21742 		CtInsertColumn(b, _UU("SM_ETHERIP_COLUMN_0"), false);
21743 		CtInsertColumn(b, _UU("SM_ETHERIP_COLUMN_1"), false);
21744 		CtInsertColumn(b, _UU("SM_ETHERIP_COLUMN_2"), false);
21745 
21746 		for (i = 0;i < t.NumItem;i++)
21747 		{
21748 			ETHERIP_ID *d = &t.IdList[i];
21749 			wchar_t id[MAX_SIZE], hubname[MAX_SIZE], username[MAX_SIZE];
21750 
21751 			StrToUni(id, sizeof(id), d->Id);
21752 			StrToUni(hubname, sizeof(hubname), d->HubName);
21753 			StrToUni(username, sizeof(username), d->UserName);
21754 
21755 			CtInsert(b, id, hubname, username);
21756 		}
21757 
21758 		CtFree(b, c);
21759 
21760 		FreeRpcEnumEtherIpId(&t);
21761 	}
21762 
21763 	FreeParamValueList(o);
21764 
21765 	return 0;
21766 }
21767 
21768 // 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)21769 UINT PsOpenVpnMakeConfig(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21770 {
21771 	LIST *o;
21772 	PS *ps = (PS *)param;
21773 	UINT ret = 0;
21774 	RPC_READ_LOG_FILE t;
21775 	// Parameter list that can be specified
21776 	PARAM args[] =
21777 	{
21778 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21779 		{"[ZIP_FileName]", CmdPrompt, _UU("CMD_OpenVpnMakeConfig_Prompt_ZIP"), CmdEvalNotEmpty, NULL},
21780 	};
21781 
21782 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21783 	if (o == NULL)
21784 	{
21785 		return ERR_INVALID_PARAMETER;
21786 	}
21787 
21788 	Zero(&t, sizeof(t));
21789 
21790 	// RPC call
21791 	ret = ScMakeOpenVpnConfigFile(ps->Rpc, &t);
21792 
21793 	if (ret != ERR_NO_ERROR)
21794 	{
21795 		// An error has occured
21796 		CmdPrintError(c, ret);
21797 		FreeParamValueList(o);
21798 		return ret;
21799 	}
21800 	else
21801 	{
21802 		// Determine the file name to save
21803 		wchar_t filename[MAX_SIZE];
21804 		wchar_t tmp[MAX_SIZE];
21805 
21806 		UniStrCpy(filename, sizeof(filename), GetParamUniStr(o, "[ZIP_FileName]"));
21807 
21808 		if (UniEndWith(filename, L".zip") == false)
21809 		{
21810 			UniStrCat(filename, sizeof(filename), L".zip");
21811 		}
21812 
21813 		if (DumpBufW(t.Buffer, filename) == false)
21814 		{
21815 			ret = ERR_INTERNAL_ERROR;
21816 
21817 			UniFormat(tmp, sizeof(tmp), _UU("CMD_OpenVpnMakeConfig_ERROR"), filename);
21818 		}
21819 		else
21820 		{
21821 			UniFormat(tmp, sizeof(tmp), _UU("CMD_OpenVpnMakeConfig_OK"), filename);
21822 		}
21823 
21824 		c->Write(c, tmp);
21825 
21826 		FreeRpcReadLogFile(&t);
21827 	}
21828 
21829 	FreeParamValueList(o);
21830 
21831 	return ret;
21832 }
21833 
21834 // 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)21835 UINT PsServerCertRegenerate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21836 {
21837 	LIST *o;
21838 	PS *ps = (PS *)param;
21839 	UINT ret = 0;
21840 	RPC_TEST t;
21841 	// Parameter list that can be specified
21842 	PARAM args[] =
21843 	{
21844 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21845 		{"[CN]", CmdPrompt, _UU("CMD_ServerCertRegenerate_Prompt_CN"), CmdEvalNotEmpty, NULL},
21846 	};
21847 
21848 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21849 	if (o == NULL)
21850 	{
21851 		return ERR_INVALID_PARAMETER;
21852 	}
21853 
21854 	Zero(&t, sizeof(t));
21855 	StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "[CN]"));
21856 
21857 	// RPC call
21858 	ret = ScRegenerateServerCert(ps->Rpc, &t);
21859 
21860 	if (ret != ERR_NO_ERROR)
21861 	{
21862 		// An error has occured
21863 		CmdPrintError(c, ret);
21864 		FreeParamValueList(o);
21865 		return ret;
21866 	}
21867 
21868 	c->Write(c, L"");
21869 	c->Write(c, _UU("CM_CERT_SET_MSG"));
21870 	c->Write(c, L"");
21871 
21872 	FreeParamValueList(o);
21873 
21874 	return 0;
21875 }
21876 
21877 // Enable / disable the VPN over ICMP / VPN over DNS server function
PsVpnOverIcmpDnsEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21878 UINT PsVpnOverIcmpDnsEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21879 {
21880 	LIST *o;
21881 	PS *ps = (PS *)param;
21882 	UINT ret = 0;
21883 	RPC_SPECIAL_LISTENER t;
21884 	// Parameter list that can be specified
21885 	PARAM args[] =
21886 	{
21887 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21888 		{"ICMP", CmdPrompt, _UU("CMD_VpnOverIcmpDnsEnable_Prompt_ICMP"), CmdEvalNotEmpty, NULL},
21889 		{"DNS", CmdPrompt, _UU("CMD_VpnOverIcmpDnsEnable_Prompt_DNS"), CmdEvalNotEmpty, NULL},
21890 	};
21891 
21892 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21893 	if (o == NULL)
21894 	{
21895 		return ERR_INVALID_PARAMETER;
21896 	}
21897 
21898 	Zero(&t, sizeof(t));
21899 	t.VpnOverIcmpListener = GetParamYes(o, "ICMP");
21900 	t.VpnOverDnsListener = GetParamYes(o, "DNS");
21901 
21902 	// RPC call
21903 	ret = ScSetSpecialListener(ps->Rpc, &t);
21904 
21905 	if (ret != ERR_NO_ERROR)
21906 	{
21907 		// An error has occured
21908 		CmdPrintError(c, ret);
21909 		FreeParamValueList(o);
21910 		return ret;
21911 	}
21912 
21913 	FreeParamValueList(o);
21914 
21915 	return 0;
21916 }
21917 
21918 // Get current settings of VPN over ICMP / VPN over DNS server function
PsVpnOverIcmpDnsGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21919 UINT PsVpnOverIcmpDnsGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21920 {
21921 	LIST *o;
21922 	PS *ps = (PS *)param;
21923 	UINT ret = 0;
21924 	RPC_SPECIAL_LISTENER t;
21925 
21926 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
21927 	if (o == NULL)
21928 	{
21929 		return ERR_INVALID_PARAMETER;
21930 	}
21931 
21932 	Zero(&t, sizeof(t));
21933 
21934 	// RPC call
21935 	ret = ScGetSpecialListener(ps->Rpc, &t);
21936 
21937 	if (ret != ERR_NO_ERROR)
21938 	{
21939 		// An error has occured
21940 		CmdPrintError(c, ret);
21941 		FreeParamValueList(o);
21942 		return ret;
21943 	}
21944 	else
21945 	{
21946 		CT *ct = CtNewStandard();
21947 
21948 		CtInsert(ct, _UU("CMD_VpnOverIcmpDnsGet_PRINT_ICMP"), _UU(t.VpnOverIcmpListener ? "SEC_YES" : "SEC_NO"));
21949 		CtInsert(ct, _UU("CMD_VpnOverIcmpDnsGet_PRINT_DNS"), _UU(t.VpnOverDnsListener ? "SEC_YES" : "SEC_NO"));
21950 
21951 		CtFree(ct, c);
21952 	}
21953 
21954 	FreeParamValueList(o);
21955 
21956 	return 0;
21957 }
21958 
21959 // Enable / disable the VPN Azure function
PsVpnAzureSetEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21960 UINT PsVpnAzureSetEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
21961 {
21962 	LIST *o;
21963 	PS *ps = (PS *)param;
21964 	UINT ret = 0;
21965 	RPC_AZURE_STATUS t;
21966 	// Parameter list that can be specified
21967 	PARAM args[] =
21968 	{
21969 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
21970 		{"[yes|no]", CmdPrompt, _UU("VpnAzureSetEnable_PROMPT"), CmdEvalNotEmpty, NULL},
21971 	};
21972 
21973 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
21974 	if (o == NULL)
21975 	{
21976 		return ERR_INVALID_PARAMETER;
21977 	}
21978 
21979 	Zero(&t, sizeof(t));
21980 	t.IsEnabled = GetParamYes(o, "[yes|no]");
21981 
21982 	// RPC call
21983 	ret = ScSetAzureStatus(ps->Rpc, &t);
21984 
21985 	if (ret != ERR_NO_ERROR)
21986 	{
21987 		// An error has occured
21988 		CmdPrintError(c, ret);
21989 		FreeParamValueList(o);
21990 		return ret;
21991 	}
21992 
21993 	FreeParamValueList(o);
21994 
21995 	return 0;
21996 }
21997 
21998 // Get the current state of the VPN Azure function
PsVpnAzureGetStatus(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)21999 UINT PsVpnAzureGetStatus(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22000 {
22001 	LIST *o;
22002 	PS *ps = (PS *)param;
22003 	UINT ret = 0;
22004 	RPC_AZURE_STATUS t;
22005 	DDNS_CLIENT_STATUS t2;
22006 
22007 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
22008 	if (o == NULL)
22009 	{
22010 		return ERR_INVALID_PARAMETER;
22011 	}
22012 
22013 	Zero(&t, sizeof(t));
22014 	Zero(&t2, sizeof(t2));
22015 
22016 	// RPC call
22017 	ret = ScGetAzureStatus(ps->Rpc, &t);
22018 
22019 	if (ret == ERR_NO_ERROR)
22020 	{
22021 		ret = ScGetDDnsClientStatus(ps->Rpc, &t2);
22022 	}
22023 
22024 	if (ret != ERR_NO_ERROR)
22025 	{
22026 		// An error has occured
22027 		CmdPrintError(c, ret);
22028 		FreeParamValueList(o);
22029 		return ret;
22030 	}
22031 	else
22032 	{
22033 		CT *ct = CtNewStandard();
22034 
22035 		CtInsert(ct, _UU("CMD_VpnAzureGetStatus_PRINT_ENABLED"), _UU(t.IsEnabled ? "SEC_YES" : "SEC_NO"));
22036 
22037 		if (t.IsEnabled)
22038 		{
22039 			wchar_t tmp[MAX_SIZE];
22040 
22041 			UniFormat(tmp, sizeof(tmp), L"%S%S", t2.CurrentHostName, AZURE_DOMAIN_SUFFIX);
22042 
22043 			CtInsert(ct, _UU("CMD_VpnAzureGetStatus_PRINT_CONNECTED"), _UU(t.IsConnected ? "SEC_YES" : "SEC_NO"));
22044 			CtInsert(ct, _UU("CMD_VpnAzureGetStatus_PRINT_HOSTNAME"), tmp);
22045 		}
22046 
22047 		CtFree(ct, c);
22048 	}
22049 
22050 	FreeParamValueList(o);
22051 
22052 	return 0;
22053 }
22054 
22055 // Get the current state of the dynamic DNS function
PsDynamicDnsGetStatus(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22056 UINT PsDynamicDnsGetStatus(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22057 {
22058 	LIST *o;
22059 	PS *ps = (PS *)param;
22060 	UINT ret = 0;
22061 	DDNS_CLIENT_STATUS t;
22062 
22063 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
22064 	if (o == NULL)
22065 	{
22066 		return ERR_INVALID_PARAMETER;
22067 	}
22068 
22069 	Zero(&t, sizeof(t));
22070 
22071 	// RPC call
22072 	ret = ScGetDDnsClientStatus(ps->Rpc, &t);
22073 
22074 	if (ret != ERR_NO_ERROR)
22075 	{
22076 		// An error has occured
22077 		CmdPrintError(c, ret);
22078 		FreeParamValueList(o);
22079 		return ret;
22080 	}
22081 	else
22082 	{
22083 		CT *ct = CtNewStandard();
22084 		wchar_t tmp[MAX_SIZE];
22085 
22086 		// FQDN
22087 		if (IsEmptyStr(t.CurrentFqdn) == false)
22088 		{
22089 			StrToUni(tmp, sizeof(tmp), t.CurrentFqdn);
22090 		}
22091 		else
22092 		{
22093 			UniStrCpy(tmp, sizeof(tmp), _UU("SM_DDNS_FQDN_EMPTY"));
22094 		}
22095 		CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_FQDN"), tmp);
22096 
22097 		// Hostname
22098 		if (IsEmptyStr(t.CurrentHostName) == false)
22099 		{
22100 			StrToUni(tmp, sizeof(tmp), t.CurrentHostName);
22101 		}
22102 		else
22103 		{
22104 			UniStrCpy(tmp, sizeof(tmp), _UU("SM_DDNS_FQDN_EMPTY"));
22105 		}
22106 		CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_HOSTNAME"), tmp);
22107 
22108 		// Suffix
22109 		if (IsEmptyStr(t.DnsSuffix) == false)
22110 		{
22111 			StrToUni(tmp, sizeof(tmp), t.DnsSuffix);
22112 		}
22113 		else
22114 		{
22115 			UniStrCpy(tmp, sizeof(tmp), _UU("SM_DDNS_FQDN_EMPTY"));
22116 		}
22117 		CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_SUFFIX"), tmp);
22118 
22119 		// IPv4
22120 		if (t.Err_IPv4 == ERR_NO_ERROR)
22121 		{
22122 			StrToUni(tmp, sizeof(tmp), t.CurrentIPv4);
22123 		}
22124 		else
22125 		{
22126 			UniStrCpy(tmp, sizeof(tmp), _E(t.Err_IPv4));
22127 		}
22128 		CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_IPv4"), tmp);
22129 
22130 		// IPv6
22131 		if (t.Err_IPv6 == ERR_NO_ERROR)
22132 		{
22133 			StrToUni(tmp, sizeof(tmp), t.CurrentIPv6);
22134 		}
22135 		else
22136 		{
22137 			UniStrCpy(tmp, sizeof(tmp), _E(t.Err_IPv6));
22138 		}
22139 		CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_IPv6"), tmp);
22140 
22141 		CtFree(ct, c);
22142 	}
22143 
22144 	FreeParamValueList(o);
22145 
22146 	return 0;
22147 }
22148 
22149 // Configure the dynamic DNS host name
PsDynamicDnsSetHostname(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22150 UINT PsDynamicDnsSetHostname(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22151 {
22152 	LIST *o;
22153 	PS *ps = (PS *)param;
22154 	UINT ret = 0;
22155 	RPC_TEST t;
22156 	// Parameter list that can be specified
22157 	PARAM args[] =
22158 	{
22159 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
22160 		{"[hostname]", CmdPrompt, _UU("CMD_DynamicDnsSetHostname_Prompt_hostname"), CmdEvalNotEmpty, NULL},
22161 	};
22162 
22163 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
22164 	if (o == NULL)
22165 	{
22166 		return ERR_INVALID_PARAMETER;
22167 	}
22168 
22169 	Zero(&t, sizeof(t));
22170 	StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "[hostname]"));
22171 
22172 	// RPC call
22173 	ret = ScChangeDDnsClientHostname(ps->Rpc, &t);
22174 
22175 	if (ret != ERR_NO_ERROR)
22176 	{
22177 		// An error has occured
22178 		CmdPrintError(c, ret);
22179 		FreeParamValueList(o);
22180 		return ret;
22181 	}
22182 
22183 	FreeParamValueList(o);
22184 
22185 	return 0;
22186 }
22187 
22188 // Register a new license key
PsLicenseAdd(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22189 UINT PsLicenseAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22190 {
22191 	LIST *o;
22192 	PS *ps = (PS *)param;
22193 	UINT ret = 0;
22194 	RPC_TEST t;
22195 	// Parameter list that can be specified
22196 	PARAM args[] =
22197 	{
22198 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
22199 		{"[key]", CmdPrompt, _UU("CMD_LicenseAdd_Prompt_Key"), CmdEvalNotEmpty, NULL},
22200 	};
22201 
22202 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
22203 	if (o == NULL)
22204 	{
22205 		return ERR_INVALID_PARAMETER;
22206 	}
22207 
22208 	Zero(&t, sizeof(t));
22209 	StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "[key]"));
22210 
22211 	// RPC call
22212 	ret = ScAddLicenseKey(ps->Rpc, &t);
22213 
22214 	if (ret != ERR_NO_ERROR)
22215 	{
22216 		// An error has occured
22217 		CmdPrintError(c, ret);
22218 		FreeParamValueList(o);
22219 		return ret;
22220 	}
22221 
22222 	FreeParamValueList(o);
22223 
22224 	return 0;
22225 }
22226 
22227 // Delete the registered license
PsLicenseDel(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22228 UINT PsLicenseDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22229 {
22230 	LIST *o;
22231 	PS *ps = (PS *)param;
22232 	UINT ret = 0;
22233 	RPC_TEST t;
22234 	// Parameter list that can be specified
22235 	PARAM args[] =
22236 	{
22237 		// "name", prompt_proc, prompt_param, eval_proc, eval_param
22238 		{"[id]", CmdPrompt, _UU("CMD_LicenseDel_Prompt_ID"), CmdEvalNotEmpty, NULL},
22239 	};
22240 
22241 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
22242 	if (o == NULL)
22243 	{
22244 		return ERR_INVALID_PARAMETER;
22245 	}
22246 
22247 	Zero(&t, sizeof(t));
22248 	t.IntValue = GetParamInt(o, "[id]");
22249 
22250 	// RPC call
22251 	ret = ScDelLicenseKey(ps->Rpc, &t);
22252 
22253 	if (ret != ERR_NO_ERROR)
22254 	{
22255 		// An error has occured
22256 		CmdPrintError(c, ret);
22257 		FreeParamValueList(o);
22258 		return ret;
22259 	}
22260 
22261 	FreeParamValueList(o);
22262 
22263 	return 0;
22264 }
22265 
22266 
22267 
22268 // Get the registered license list
PsLicenseList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22269 UINT PsLicenseList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22270 {
22271 	LIST *o;
22272 	PS *ps = (PS *)param;
22273 	UINT ret = 0;
22274 	RPC_ENUM_LICENSE_KEY t;
22275 	CT *ct;
22276 	UINT i;
22277 
22278 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
22279 	if (o == NULL)
22280 	{
22281 		return ERR_INVALID_PARAMETER;
22282 	}
22283 
22284 	Zero(&t, sizeof(t));
22285 
22286 	// RPC call
22287 	ret = ScEnumLicenseKey(ps->Rpc, &t);
22288 
22289 	if (ret != ERR_NO_ERROR)
22290 	{
22291 		// An error has occured
22292 		CmdPrintError(c, ret);
22293 		FreeParamValueList(o);
22294 		return ret;
22295 	}
22296 
22297 	ct = CtNew();
22298 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_1"), false);
22299 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_2"), false);
22300 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_3"), false);
22301 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_4"), false);
22302 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_5"), false);
22303 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_6"), false);
22304 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_7"), false);
22305 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_8"), false);
22306 	CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_9"), false);
22307 
22308 	for (i = 0;i < t.NumItem;i++)
22309 	{
22310 		wchar_t tmp1[32], tmp2[LICENSE_KEYSTR_LEN + 1], tmp3[LICENSE_MAX_PRODUCT_NAME_LEN + 1],
22311 			*tmp4, tmp5[128], tmp6[LICENSE_LICENSEID_STR_LEN + 1], tmp7[64],
22312 			tmp8[64], tmp9[64];
22313 		RPC_ENUM_LICENSE_KEY_ITEM *e = &t.Items[i];
22314 
22315 		UniToStru(tmp1, e->Id);
22316 		StrToUni(tmp2, sizeof(tmp2), e->LicenseKey);
22317 		StrToUni(tmp3, sizeof(tmp3), e->LicenseName);
22318 		tmp4 = LiGetLicenseStatusStr(e->Status);
22319 		if (e->Expires == 0)
22320 		{
22321 			UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_LICENSE_NO_EXPIRES"));
22322 		}
22323 		else
22324 		{
22325 			GetDateStrEx64(tmp5, sizeof(tmp5), e->Expires, NULL);
22326 		}
22327 		StrToUni(tmp6, sizeof(tmp6), e->LicenseId);
22328 		UniToStru(tmp7, e->ProductId);
22329 		UniFormat(tmp8, sizeof(tmp8), L"%I64u", e->SystemId);
22330 		UniToStru(tmp9, e->SerialId);
22331 
22332 		CtInsert(ct,
22333 			tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9);
22334 	}
22335 
22336 	CtFreeEx(ct, c, true);
22337 
22338 	FreeRpcEnumLicenseKey(&t);
22339 
22340 	FreeParamValueList(o);
22341 
22342 	return 0;
22343 }
22344 
22345 // Get the license status of the current VPN Server
PsLicenseStatus(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22346 UINT PsLicenseStatus(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22347 {
22348 	LIST *o;
22349 	PS *ps = (PS *)param;
22350 	UINT ret = 0;
22351 	RPC_LICENSE_STATUS st;
22352 	CT *ct;
22353 	wchar_t tmp[MAX_SIZE];
22354 
22355 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
22356 	if (o == NULL)
22357 	{
22358 		return ERR_INVALID_PARAMETER;
22359 	}
22360 
22361 	Zero(&st, sizeof(st));
22362 
22363 	// RPC call
22364 	ret = ScGetLicenseStatus(ps->Rpc, &st);
22365 
22366 	if (ret != ERR_NO_ERROR)
22367 	{
22368 		// An error has occured
22369 		CmdPrintError(c, ret);
22370 		FreeParamValueList(o);
22371 		return ret;
22372 	}
22373 
22374 	ct = CtNewStandard();
22375 
22376 	if (st.EditionId == LICENSE_EDITION_VPN3_NO_LICENSE)
22377 	{
22378 		CtInsert(ct, _UU("SM_NO_LICENSE_COLUMN"), _UU("SM_NO_LICENSE"));
22379 	}
22380 	else
22381 	{
22382 		// Product edition name
22383 		StrToUni(tmp, sizeof(tmp), st.EditionStr);
22384 		CtInsert(ct, _UU("SM_LICENSE_STATUS_EDITION"), tmp);
22385 
22386 		// Release date
22387 		if (st.ReleaseDate != 0)
22388 		{
22389 			GetDateStrEx64(tmp, sizeof(tmp), st.ReleaseDate, NULL);
22390 			CtInsert(ct, _UU("SM_LICENSE_STATUS_RELEASE"), tmp);
22391 		}
22392 
22393 		// Current system ID
22394 		UniFormat(tmp, sizeof(tmp), L"%I64u", st.SystemId);
22395 		CtInsert(ct, _UU("SM_LICENSE_STATUS_SYSTEM_ID"), tmp);
22396 
22397 		// Expiration date of the current license product
22398 		if (st.SystemExpires == 0)
22399 		{
22400 			UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_NO_EXPIRES"));
22401 		}
22402 		else
22403 		{
22404 			GetDateStrEx64(tmp, sizeof(tmp), st.SystemExpires, NULL);
22405 		}
22406 		CtInsert(ct,  _UU("SM_LICENSE_STATUS_EXPIRES"), tmp);
22407 
22408 		// Subscription (support) contract
22409 		if (st.NeedSubscription == false)
22410 		{
22411 			UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_STATUS_SUBSCRIPTION_NONEED"));
22412 		}
22413 		else
22414 		{
22415 			if (st.SubscriptionExpires == 0)
22416 			{
22417 				UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_STATUS_SUBSCRIPTION_NONE"));
22418 			}
22419 			else
22420 			{
22421 				wchar_t dtstr[MAX_PATH];
22422 
22423 				GetDateStrEx64(dtstr, sizeof(dtstr), st.SubscriptionExpires, NULL);
22424 
22425 				UniFormat(tmp, sizeof(tmp),
22426 					st.IsSubscriptionExpired ? _UU("SM_LICENSE_STATUS_SUBSCRIPTION_EXPIRED") :  _UU("SM_LICENSE_STATUS_SUBSCRIPTION_VALID"),
22427 					dtstr);
22428 			}
22429 		}
22430 		CtInsert(ct, _UU("SM_LICENSE_STATUS_SUBSCRIPTION"), tmp);
22431 
22432 		if (st.NeedSubscription == false && st.SubscriptionExpires != 0)
22433 		{
22434 			wchar_t dtstr[MAX_PATH];
22435 
22436 			GetDateStrEx64(dtstr, sizeof(dtstr), st.SubscriptionExpires, NULL);
22437 
22438 			CtInsert(ct, _UU("SM_LICENSE_STATUS_SUBSCRIPTION_BUILD_STR"), tmp);
22439 		}
22440 
22441 		if (GetCapsBool(ps->CapsList, "b_vpn3"))
22442 		{
22443 			// Maximum creatable number of users
22444 			if (st.NumClientConnectLicense == INFINITE)
22445 			{
22446 				UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_INFINITE"));
22447 			}
22448 			else
22449 			{
22450 				UniToStru(tmp, st.NumClientConnectLicense);
22451 			}
22452 			CtInsert(ct, _UU("SM_LICENSE_NUM_CLIENT"), tmp);
22453 		}
22454 
22455 		// Available number of concurrent client connections
22456 		if (st.NumBridgeConnectLicense == INFINITE)
22457 		{
22458 			UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_INFINITE"));
22459 		}
22460 		else
22461 		{
22462 			UniToStru(tmp, st.NumBridgeConnectLicense);
22463 		}
22464 		CtInsert(ct, _UU("SM_LICENSE_NUM_BRIDGE"), tmp);
22465 
22466 		// Availability of enterprise features
22467 		CtInsert(ct, _UU("SM_LICENSE_STATUS_ENTERPRISE"),
22468 			st.AllowEnterpriseFunction ? _UU("SM_LICENSE_STATUS_ENTERPRISE_YES") : _UU("SM_LICENSE_STATUS_ENTERPRISE_NO"));
22469 	}
22470 
22471 	CtFreeEx(ct, c, false);
22472 
22473 	FreeParamValueList(o);
22474 
22475 	return 0;
22476 }
22477 
22478 
22479 // Get the cluster configuration
PsClusterSettingGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22480 UINT PsClusterSettingGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22481 {
22482 	LIST *o;
22483 	PS *ps = (PS *)param;
22484 	UINT ret;
22485 	RPC_FARM t;
22486 	CT *ct;
22487 
22488 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
22489 	if (o == NULL)
22490 	{
22491 		return ERR_INVALID_PARAMETER;
22492 	}
22493 
22494 	Zero(&t, sizeof(t));
22495 
22496 	ret = ScGetFarmSetting(ps->Rpc, &t);
22497 
22498 	if (ret != ERR_NO_ERROR)
22499 	{
22500 		CmdPrintError(c, ret);
22501 		FreeParamValueList(o);
22502 		return ret;
22503 	}
22504 
22505 	if (t.Weight == 0)
22506 	{
22507 		t.Weight = FARM_DEFAULT_WEIGHT;
22508 	}
22509 
22510 	// Show the cluster configuration
22511 	ct = CtNewStandard();
22512 
22513 	CtInsert(ct, _UU("CMD_ClusterSettingGet_Current"),
22514 		GetServerTypeStr(t.ServerType));
22515 
22516 	if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
22517 	{
22518 		CtInsert(ct, _UU("CMD_ClusterSettingGet_ControllerOnly"), t.ControllerOnly ? _UU("SEC_YES") : _UU("SEC_NO"));
22519 	}
22520 
22521 	if (t.ServerType != SERVER_TYPE_STANDALONE)
22522 	{
22523 		wchar_t tmp[MAX_SIZE];
22524 
22525 		UniToStru(tmp, t.Weight);
22526 
22527 		CtInsert(ct, _UU("CMD_ClusterSettingGet_Weight"), tmp);
22528 	}
22529 
22530 	if (t.ServerType == SERVER_TYPE_FARM_MEMBER)
22531 	{
22532 		wchar_t tmp[MAX_SIZE];
22533 		UINT i;
22534 
22535 		// Public IP address
22536 		if (t.PublicIp != 0)
22537 		{
22538 			IPToUniStr32(tmp, sizeof(tmp), t.PublicIp);
22539 		}
22540 		else
22541 		{
22542 			UniStrCpy(tmp, sizeof(tmp), _UU("CMD_ClusterSettingGet_None"));
22543 		}
22544 
22545 		CtInsert(ct, _UU("CMD_ClusterSettingGet_PublicIp"), tmp);
22546 
22547 		// Public port list
22548 		tmp[0] = 0;
22549 		for (i = 0;i < t.NumPort;i++)
22550 		{
22551 			wchar_t tmp2[64];
22552 
22553 			UniFormat(tmp2, sizeof(tmp2), L"%u, ", t.Ports[i]);
22554 
22555 			UniStrCat(tmp, sizeof(tmp), tmp2);
22556 		}
22557 
22558 		if (UniEndWith(tmp, L", "))
22559 		{
22560 			tmp[UniStrLen(tmp) - 2] = 0;
22561 		}
22562 
22563 		CtInsert(ct, _UU("CMD_ClusterSettingGet_PublicPorts"), tmp);
22564 
22565 		// Controller to connect
22566 		UniFormat(tmp, sizeof(tmp), L"%S:%u", t.ControllerName, t.ControllerPort);
22567 		CtInsert(ct, _UU("CMD_ClusterSettingGet_Controller"), tmp);
22568 	}
22569 
22570 	CtFree(ct, c);
22571 
22572 	FreeRpcFarm(&t);
22573 	FreeParamValueList(o);
22574 
22575 	return 0;
22576 }
22577 
22578 // Set the server password
PsServerPasswordSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22579 UINT PsServerPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22580 {
22581 	LIST *o;
22582 	PS *ps = (PS *)param;
22583 	UINT ret;
22584 	RPC_SET_PASSWORD t;
22585 	char *pw;
22586 	PARAM args[] =
22587 	{
22588 		{"[password]", CmdPromptChoosePassword, NULL, NULL, NULL},
22589 	};
22590 
22591 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
22592 	if (o == NULL)
22593 	{
22594 		return ERR_INVALID_PARAMETER;
22595 	}
22596 
22597 	pw = GetParamStr(o, "[password]");
22598 
22599 	Zero(&t, sizeof(t));
22600 	Sha0(t.HashedPassword, pw, StrLen(pw));
22601 
22602 	ret = ScSetServerPassword(ps->Rpc, &t);
22603 
22604 	if (ret != ERR_NO_ERROR)
22605 	{
22606 		CmdPrintError(c, ret);
22607 		FreeParamValueList(o);
22608 		return ret;
22609 	}
22610 
22611 	FreeParamValueList(o);
22612 
22613 	return 0;
22614 }
22615 
22616 // Password decision prompt (for Prompt function)
CmdPromptChoosePassword(CONSOLE * c,void * param)22617 wchar_t *CmdPromptChoosePassword(CONSOLE *c, void *param)
22618 {
22619 	char *s;
22620 	// Validate arguments
22621 	if (c == NULL)
22622 	{
22623 		return NULL;
22624 	}
22625 
22626 	s = CmdPasswordPrompt(c);
22627 
22628 	if (s == NULL)
22629 	{
22630 		return NULL;
22631 	}
22632 	else
22633 	{
22634 		wchar_t *ret = CopyStrToUni(s);
22635 
22636 		Free(s);
22637 
22638 		return ret;
22639 	}
22640 }
22641 
22642 // Password input prompt (general-purpose)
CmdPasswordPrompt(CONSOLE * c)22643 char *CmdPasswordPrompt(CONSOLE *c)
22644 {
22645 	char *pw1, *pw2;
22646 	// Validate arguments
22647 	if (c == NULL)
22648 	{
22649 		return NULL;
22650 	}
22651 
22652 	c->Write(c, _UU("CMD_VPNCMD_PWPROMPT_0"));
22653 
22654 RETRY:
22655 	c->Write(c, L"");
22656 
22657 
22658 	pw1 = c->ReadPassword(c, _UU("CMD_VPNCMD_PWPROMPT_1"));
22659 	if (pw1 == NULL)
22660 	{
22661 		return NULL;
22662 	}
22663 
22664 	pw2 = c->ReadPassword(c, _UU("CMD_VPNCMD_PWPROMPT_2"));
22665 	if (pw2 == NULL)
22666 	{
22667 		Free(pw1);
22668 		return NULL;
22669 	}
22670 
22671 	c->Write(c, L"");
22672 
22673 	if (StrCmp(pw1, pw2) != 0)
22674 	{
22675 		Free(pw1);
22676 		Free(pw2);
22677 		c->Write(c, _UU("CMD_VPNCMD_PWPROMPT_3"));
22678 		goto RETRY;
22679 	}
22680 
22681 	Free(pw1);
22682 
22683 	return pw2;
22684 }
22685 
22686 // Disable the listener
PsListenerDisable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22687 UINT PsListenerDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22688 {
22689 	LIST *o;
22690 	PS *ps = (PS *)param;
22691 	UINT ret;
22692 	RPC_LISTENER t;
22693 	PARAM args[] =
22694 	{
22695 		{"[port]", CmdPromptPort, _UU("CMD_ListenerDisable_PortPrompt"), CmdEvalPort, NULL},
22696 	};
22697 
22698 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
22699 	if (o == NULL)
22700 	{
22701 		return ERR_INVALID_PARAMETER;
22702 	}
22703 
22704 	Zero(&t, sizeof(t));
22705 	t.Enable = false;
22706 	t.Port = ToInt(GetParamStr(o, "[port]"));
22707 
22708 	ret = ScEnableListener(ps->Rpc, &t);
22709 
22710 	if (ret != ERR_NO_ERROR)
22711 	{
22712 		CmdPrintError(c, ret);
22713 		FreeParamValueList(o);
22714 		return ret;
22715 	}
22716 
22717 	FreeParamValueList(o);
22718 
22719 	return 0;
22720 }
22721 
22722 // Enable the listener
PsListenerEnable(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22723 UINT PsListenerEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22724 {
22725 	LIST *o;
22726 	PS *ps = (PS *)param;
22727 	UINT ret;
22728 	RPC_LISTENER t;
22729 	PARAM args[] =
22730 	{
22731 		{"[port]", CmdPromptPort, _UU("CMD_ListenerEnable_PortPrompt"), CmdEvalPort, NULL},
22732 	};
22733 
22734 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
22735 	if (o == NULL)
22736 	{
22737 		return ERR_INVALID_PARAMETER;
22738 	}
22739 
22740 	Zero(&t, sizeof(t));
22741 	t.Enable = true;
22742 	t.Port = ToInt(GetParamStr(o, "[port]"));
22743 
22744 	ret = ScEnableListener(ps->Rpc, &t);
22745 
22746 	if (ret != ERR_NO_ERROR)
22747 	{
22748 		CmdPrintError(c, ret);
22749 		FreeParamValueList(o);
22750 		return ret;
22751 	}
22752 
22753 	FreeParamValueList(o);
22754 
22755 	return 0;
22756 }
22757 
22758 // Set UDP ports the server should listen on
PsPortsUDPSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22759 UINT PsPortsUDPSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22760 {
22761 	LIST *o, *ports;
22762 	PS *ps = (PS *)param;
22763 	UINT ret;
22764 	RPC_PORTS t;
22765 	PARAM args[] =
22766 	{
22767 		{"[ports]", CmdPrompt, _UU("CMD_PortsUDPSet_[ports]"), CmdEvalPortList, (void *)false}
22768 	};
22769 
22770 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
22771 	if (o == NULL)
22772 	{
22773 		return ERR_INVALID_PARAMETER;
22774 	}
22775 
22776 	ports = StrToPortList(GetParamStr(o, "[ports]"), false);
22777 
22778 	FreeParamValueList(o);
22779 
22780 	t.Num = LIST_NUM(ports);
22781 	if (t.Num > 0)
22782 	{
22783 		UINT i;
22784 		t.Ports = Malloc(sizeof(UINT) * t.Num);
22785 
22786 		for (i = 0; i < t.Num; ++i)
22787 		{
22788 			t.Ports[i] = (UINT)LIST_DATA(ports, i);
22789 		}
22790 	}
22791 	else
22792 	{
22793 		t.Ports = NULL;
22794 	}
22795 
22796 	ReleaseList(ports);
22797 
22798 	ret = ScSetPortsUDP(ps->Rpc, &t);
22799 	if (ret != ERR_NO_ERROR)
22800 	{
22801 		CmdPrintError(c, ret);
22802 	}
22803 
22804 	Free(t.Ports);
22805 
22806 	return ret;
22807 }
22808 
22809 // List UDP ports the server is listening on
PsPortsUDPGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22810 UINT PsPortsUDPGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22811 {
22812 	LIST *o;
22813 	PS *ps = (PS *)param;
22814 	UINT ret;
22815 	RPC_PORTS t;
22816 
22817 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
22818 	if (o == NULL)
22819 	{
22820 		return ERR_INVALID_PARAMETER;
22821 	}
22822 
22823 	FreeParamValueList(o);
22824 
22825 	Zero(&t, sizeof(t));
22826 
22827 	ret = ScGetPortsUDP(ps->Rpc, &t);
22828 	if (ret == ERR_NO_ERROR)
22829 	{
22830 		wchar_t str[MAX_SIZE];
22831 		CT *ct = CtNewStandard();
22832 
22833 		Zero(str, sizeof(str));
22834 
22835 		if (t.Num > 0)
22836 		{
22837 			UINT i;
22838 			wchar_t buf[MAX_SIZE];
22839 
22840 			UniFormat(buf, sizeof(buf), L"%u", t.Ports[0]);
22841 			UniStrCat(str, sizeof(str), buf);
22842 
22843 			for (i = 1; i < t.Num; ++i)
22844 			{
22845 				UniFormat(buf, sizeof(buf), L", %u", t.Ports[i]);
22846 				UniStrCat(str, sizeof(str), buf);
22847 			}
22848 		}
22849 
22850 		CtInsert(ct, _UU("CMD_PortsUDPGet_Ports"), str);
22851 		CtFree(ct, c);
22852 	}
22853 	else
22854 	{
22855 		CmdPrintError(c, ret);
22856 	}
22857 
22858 	FreeRpcPorts(&t);
22859 
22860 	return ret;
22861 }
22862 
22863 // Configure an option for the specified protocol (TODO: ability to set multiple options in a single call)
PsProtoOptionsSet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22864 UINT PsProtoOptionsSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22865 {
22866 	LIST *o;
22867 	PS *ps = (PS *)param;
22868 	UINT ret;
22869 	RPC_PROTO_OPTIONS t;
22870 	PARAM args[] =
22871 	{
22872 		{"[protocol]", CmdPrompt, _UU("CMD_ProtoOptionsSet_Prompt_[protocol]"), CmdEvalNotEmpty, NULL},
22873 		{"NAME", CmdPrompt, _UU("CMD_ProtoOptionsSet_Prompt_NAME"), CmdEvalNotEmpty, NULL},
22874 		{"VALUE", CmdPrompt, _UU("CMD_ProtoOptionsSet_Prompt_VALUE"), NULL, NULL}
22875 	};
22876 
22877 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
22878 	if (o == NULL)
22879 	{
22880 		return ERR_INVALID_PARAMETER;
22881 	}
22882 
22883 	Zero(&t, sizeof(t));
22884 	t.Protocol = CopyStr(GetParamStr(o, "[protocol]"));
22885 
22886 	ret = ScGetProtoOptions(ps->Rpc, &t);
22887 
22888 	if (ret == ERR_NO_ERROR)
22889 	{
22890 		UINT i;
22891 		bool found = false;
22892 
22893 		for (i = 0; i < t.Num; ++i)
22894 		{
22895 			PROTO_OPTION *option = &t.Options[i];
22896 			if (StrCmpi(option->Name, GetParamStr(o, "NAME")) != 0)
22897 			{
22898 				continue;
22899 			}
22900 
22901 			found = true;
22902 
22903 			switch (option->Type)
22904 			{
22905 			case PROTO_OPTION_STRING:
22906 				Free(option->String);
22907 				option->String = CopyStr(GetParamStr(o, "VALUE"));
22908 				break;
22909 			case PROTO_OPTION_BOOL:
22910 				option->Bool = GetParamYes(o, "VALUE");
22911 				break;
22912 			case PROTO_OPTION_UINT32:
22913 				option->UInt32 = GetParamInt(o, "VALUE");
22914 				break;
22915 			default:
22916 				ret = ERR_INTERNAL_ERROR;
22917 			}
22918 
22919 			if (ret == ERR_NO_ERROR)
22920 			{
22921 				ret = ScSetProtoOptions(ps->Rpc, &t);
22922 			}
22923 
22924 			break;
22925 		}
22926 
22927 		if (found == false)
22928 		{
22929 			ret = ERR_OBJECT_NOT_FOUND;
22930 		}
22931 	}
22932 
22933 	if (ret != ERR_NO_ERROR)
22934 	{
22935 		CmdPrintError(c, ret);
22936 	}
22937 
22938 	FreeRpcProtoOptions(&t);
22939 	FreeParamValueList(o);
22940 
22941 	return ret;
22942 }
22943 
22944 // List available options for the specified protocol
PsProtoOptionsGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)22945 UINT PsProtoOptionsGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
22946 {
22947 	LIST *o;
22948 	PS *ps = (PS *)param;
22949 	UINT ret;
22950 	RPC_PROTO_OPTIONS t;
22951 	PARAM args[] =
22952 	{
22953 		{"[protocol]", CmdPrompt, _UU("CMD_ProtoOptionsGet_Prompt_[protocol]"), CmdEvalNotEmpty, NULL}
22954 	};
22955 
22956 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
22957 	if (o == NULL)
22958 	{
22959 		return ERR_INVALID_PARAMETER;
22960 	}
22961 
22962 	Zero(&t, sizeof(t));
22963 	t.Protocol = CopyStr(GetParamStr(o, "[protocol]"));
22964 
22965 	FreeParamValueList(o);
22966 
22967 	ret = ScGetProtoOptions(ps->Rpc, &t);
22968 	if (ret == ERR_NO_ERROR)
22969 	{
22970 		UINT i;
22971 		CT *ct = CtNew();
22972 		CtInsertColumn(ct, _UU("CMD_ProtoOptionsGet_Column_Name"), false);
22973 		CtInsertColumn(ct, _UU("CMD_ProtoOptionsGet_Column_Type"), false);
22974 		CtInsertColumn(ct, _UU("CMD_ProtoOptionsGet_Column_Value"), false);
22975 		CtInsertColumn(ct, _UU("CMD_ProtoOptionsGet_Column_Description"), false);
22976 
22977 		for (i = 0; i < t.Num; ++i)
22978 		{
22979 			char description_str_key[MAX_SIZE];
22980 			const PROTO_OPTION *option = &t.Options[i];
22981 			wchar_t *value, *type, *name = CopyStrToUni(option->Name);
22982 
22983 			switch (option->Type)
22984 			{
22985 				case PROTO_OPTION_STRING:
22986 					type = L"String";
22987 					value = CopyStrToUni(option->String);
22988 					break;
22989 				case PROTO_OPTION_BOOL:
22990 					type = L"Boolean";
22991 					value = option->Bool ? L"True" : L"False";
22992 					break;
22993 				case PROTO_OPTION_UINT32:
22994 					type = L"32 bit unsigned integer";
22995 					char tmp[MAX_SIZE];
22996 					Format(tmp, sizeof(tmp), "%u", option->UInt32);
22997 					value = CopyStrToUni(tmp);
22998 					break;
22999 				default:
23000 					Debug("StGetProtoOptions(): unhandled option type %u!\n", option->Type);
23001 					Free(name);
23002 					continue;
23003 			}
23004 
23005 			Format(description_str_key, sizeof(description_str_key), "CMD_ProtoOptions_Description_%s_%s", t.Protocol, option->Name);
23006 
23007 			CtInsert(ct, name, type, value, _UU(description_str_key));
23008 
23009 			if (option->Type != PROTO_OPTION_BOOL)
23010 			{
23011 				Free(value);
23012 			}
23013 
23014 			Free(name);
23015 		}
23016 
23017 		CtFree(ct, c);
23018 	}
23019 	else
23020 	{
23021 		CmdPrintError(c, ret);
23022 	}
23023 
23024 	FreeRpcProtoOptions(&t);
23025 
23026 	return ret;
23027 }
23028 
23029 // Draw a row of console table
CtPrintRow(CONSOLE * c,UINT num,UINT * widths,wchar_t ** strings,bool * rights,char separate_char)23030 void CtPrintRow(CONSOLE *c, UINT num, UINT *widths, wchar_t **strings, bool *rights, char separate_char)
23031 {
23032 	UINT i;
23033 	wchar_t *buf;
23034 	UINT buf_size;
23035 	bool is_sep_line = true;
23036 	// Validate arguments
23037 	if (c == NULL || num == 0 || widths == NULL || strings == NULL || rights == NULL)
23038 	{
23039 		return;
23040 	}
23041 
23042 	buf_size = 32;
23043 	for (i = 0;i < num;i++)
23044 	{
23045 		buf_size += sizeof(wchar_t) * widths[i] + 6;
23046 	}
23047 
23048 	buf = ZeroMalloc(buf_size);
23049 
23050 	for (i = 0;i < num;i++)
23051 	{
23052 		char *tmp;
23053 		wchar_t *space_string;
23054 		UINT w;
23055 		UINT space = 0;
23056 		wchar_t *string = strings[i];
23057 		wchar_t *tmp_line = NULL;
23058 
23059 		if (UniStrCmpi(string, L"---") == 0)
23060 		{
23061 			char *s = MakeCharArray('-', widths[i]);
23062 			tmp_line = string = CopyStrToUni(s);
23063 
23064 			Free(s);
23065 		}
23066 		else
23067 		{
23068 			is_sep_line = false;
23069 		}
23070 
23071 		w = UniStrWidth(string);
23072 
23073 		if (widths[i] >= w)
23074 		{
23075 			space = widths[i] - w;
23076 		}
23077 
23078 		tmp = MakeCharArray(' ', space);
23079 		space_string = CopyStrToUni(tmp);
23080 
23081 		if (rights[i] != false)
23082 		{
23083 			UniStrCat(buf, buf_size, space_string);
23084 		}
23085 
23086 		UniStrCat(buf, buf_size, string);
23087 
23088 		if (rights[i] == false)
23089 		{
23090 			UniStrCat(buf, buf_size, space_string);
23091 		}
23092 
23093 		Free(space_string);
23094 		Free(tmp);
23095 
23096 		if (i < (num - 1))
23097 		{
23098 			wchar_t tmp[4];
23099 			char str[2];
23100 
23101 			if (UniStrCmpi(strings[i], L"---") == 0)
23102 			{
23103 				str[0] = '+';
23104 			}
23105 			else
23106 			{
23107 				str[0] = separate_char;
23108 			}
23109 			str[1] = 0;
23110 
23111 			StrToUni(tmp, sizeof(tmp), str);
23112 
23113 			UniStrCat(buf, buf_size, tmp);
23114 		}
23115 
23116 		if (tmp_line != NULL)
23117 		{
23118 			Free(tmp_line);
23119 		}
23120 	}
23121 
23122 	UniTrimRight(buf);
23123 
23124 	if (is_sep_line)
23125 	{
23126 		if (UniStrLen(buf) > (c->GetWidth(c) - 1))
23127 		{
23128 			buf[c->GetWidth(c) - 1] = 0;
23129 		}
23130 	}
23131 
23132 	c->Write(c, buf);
23133 
23134 	Free(buf);
23135 }
23136 
23137 // Draw the console table in standard format
CtPrintStandard(CT * ct,CONSOLE * c)23138 void CtPrintStandard(CT *ct, CONSOLE *c)
23139 {
23140 	CT *t;
23141 	UINT i, j;
23142 	// Validate arguments
23143 	if (ct == NULL || c == NULL)
23144 	{
23145 		return;
23146 	}
23147 
23148 	t = CtNewStandard();
23149 	for (i = 0;i < LIST_NUM(ct->Rows);i++)
23150 	{
23151 		CTR *row = LIST_DATA(ct->Rows, i);
23152 
23153 		for (j = 0;j < LIST_NUM(ct->Columns);j++)
23154 		{
23155 			CTC *column = LIST_DATA(ct->Columns, j);
23156 
23157 			CtInsert(t, column->String, row->Strings[j]);
23158 		}
23159 
23160 		if (i != (LIST_NUM(ct->Rows) - 1))
23161 		{
23162 			CtInsert(t, L"---", L"---");
23163 		}
23164 	}
23165 
23166 	CtFree(t, c);
23167 }
23168 
23169 // Draw the console table
CtPrint(CT * ct,CONSOLE * c)23170 void CtPrint(CT *ct, CONSOLE *c)
23171 {
23172 	UINT *widths;
23173 	UINT num;
23174 	UINT i, j;
23175 	wchar_t **header_strings;
23176 	bool *rights;
23177 	// Validate arguments
23178 	if (ct == NULL || c == NULL)
23179 	{
23180 		return;
23181 	}
23182 
23183 	num = LIST_NUM(ct->Columns);
23184 	widths = ZeroMalloc(sizeof(UINT) * num);
23185 
23186 	// Calculate the maximum character width of each column
23187 	for (i = 0;i < num;i++)
23188 	{
23189 		CTC *ctc = LIST_DATA(ct->Columns, i);
23190 		UINT w;
23191 
23192 		w = UniStrWidth(ctc->String);
23193 		widths[i] = MAX(widths[i], w);
23194 	}
23195 	for (j = 0;j < LIST_NUM(ct->Rows);j++)
23196 	{
23197 		CTR *ctr = LIST_DATA(ct->Rows, j);
23198 
23199 		for (i = 0;i < num;i++)
23200 		{
23201 			UINT w;
23202 
23203 			w = UniStrWidth(ctr->Strings[i]);
23204 			widths[i] = MAX(widths[i], w);
23205 		}
23206 	}
23207 
23208 	// Display the header part
23209 	header_strings = ZeroMalloc(sizeof(wchar_t *) * num);
23210 	rights = ZeroMalloc(sizeof(bool) * num);
23211 
23212 	for (i = 0;i < num;i++)
23213 	{
23214 		CTC *ctc = LIST_DATA(ct->Columns, i);
23215 
23216 		header_strings[i] = ctc->String;
23217 		rights[i] = ctc->Right;
23218 	}
23219 
23220 	CtPrintRow(c, num, widths, header_strings, rights, '|');
23221 
23222 	for (i = 0;i < num;i++)
23223 	{
23224 		char *s;
23225 
23226 		s = MakeCharArray('-', widths[i]);
23227 		header_strings[i] = CopyStrToUni(s);
23228 		Free(s);
23229 	}
23230 
23231 	CtPrintRow(c, num, widths, header_strings, rights, '+');
23232 
23233 	for (i = 0;i < num;i++)
23234 	{
23235 		Free(header_strings[i]);
23236 	}
23237 
23238 	// Display the data part
23239 	for (j = 0;j < LIST_NUM(ct->Rows);j++)
23240 	{
23241 		CTR *ctr = LIST_DATA(ct->Rows, j);
23242 
23243 		CtPrintRow(c, num, widths, ctr->Strings, rights, '|');
23244 	}
23245 
23246 	Free(rights);
23247 	Free(header_strings);
23248 	Free(widths);
23249 }
23250 
23251 // Escape the meta-characters in CSV
CtEscapeCsv(wchar_t * dst,UINT size,wchar_t * src)23252 void CtEscapeCsv(wchar_t *dst, UINT size, wchar_t *src){
23253 	UINT i;
23254 	UINT len = UniStrLen(src);
23255 	UINT idx;
23256 	bool need_to_escape = false;
23257 	wchar_t tmp[2]=L"*";
23258 
23259 	// Check the input value
23260 	if (src==NULL || dst==NULL)
23261 	{
23262 		return;
23263 	}
23264 
23265 	// If there is no character that need to be escaped in the input characters, copy it to the output
23266 	for (i=0; i<len; i++)
23267 	{
23268 		tmp[0] = src[i];
23269 		if (tmp[0] == L","[0] || tmp[0] == L"\n"[0] || tmp[0] == L"\""[0])
23270 		{
23271 			need_to_escape = true;
23272 		}
23273 	}
23274 	if (need_to_escape == false)
23275 	{
23276 		UniStrCpy(dst,size,src);
23277 		return;
23278 	}
23279 
23280 	// If it contains meta characters (newline, comma, double quote), enclose with "
23281 	UniStrCpy(dst, size, L"\"");
23282 	idx = UniStrLen(dst);
23283 	if(idx<size-1)
23284 	{
23285 		for (i=0; i<len; i++)
23286 		{
23287 			tmp[0] = src[i];
23288 			// Convert " to "" in contents(MS-Excel method)
23289 			if (tmp[0] == L"\""[0])
23290 			{
23291 				UniStrCat(dst, size, tmp);
23292 			}
23293 			UniStrCat(dst, size, tmp);
23294 		}
23295 	}
23296 	UniStrCat(dst, size, L"\"");
23297 	return;
23298 }
23299 
23300 // Show a CSV format of console table
CtPrintCsv(CT * ct,CONSOLE * c)23301 void CtPrintCsv(CT *ct, CONSOLE *c)
23302 {
23303 	UINT i, j;
23304 	UINT num_columns = LIST_NUM(ct->Columns);
23305 	wchar_t buf[MAX_SIZE*4];
23306 	wchar_t fmtbuf[MAX_SIZE*4];
23307 
23308 	// Show the heading row
23309 	buf[0] = 0;
23310 	for(i=0; i<num_columns; i++)
23311 	{
23312 		CTC *ctc = LIST_DATA(ct->Columns, i);
23313 		CtEscapeCsv(fmtbuf, sizeof(fmtbuf), ctc->String);
23314 		UniStrCat(buf, sizeof(buf), fmtbuf);
23315 		if(i != num_columns-1)
23316 			UniStrCat(buf, sizeof(buf), L",");
23317 	}
23318 	c->Write(c, buf);
23319 
23320 	// Show the table body
23321 	for(j=0; j<LIST_NUM(ct->Rows); j++)
23322 	{
23323 		CTR *ctr = LIST_DATA(ct->Rows, j);
23324 		buf[0] = 0;
23325 		for(i=0; i<num_columns; i++)
23326 		{
23327 			CtEscapeCsv(fmtbuf, sizeof(fmtbuf), ctr->Strings[i]);
23328 			UniStrCat(buf, sizeof(buf), fmtbuf);
23329 			if(i != num_columns-1)
23330 				UniStrCat(buf, sizeof(buf), L",");
23331 		}
23332 		c->Write(c, buf);
23333 	}
23334 }
23335 
23336 // Delete the console table
CtFreeEx(CT * ct,CONSOLE * c,bool standard_view)23337 void CtFreeEx(CT *ct, CONSOLE *c, bool standard_view)
23338 {
23339 	UINT i, num;
23340 	// Validate arguments
23341 	if (ct == NULL)
23342 	{
23343 		return;
23344 	}
23345 
23346 	if (c != NULL)
23347 	{
23348 		if (c->ConsoleType == CONSOLE_CSV)
23349 		{
23350 			CtPrintCsv(ct, c);
23351 		}
23352 		else
23353 		{
23354 			if (standard_view == false)
23355 			{
23356 				CtPrint(ct, c);
23357 			}
23358 			else
23359 			{
23360 				CtPrintStandard(ct, c);
23361 			}
23362 		}
23363 	}
23364 
23365 	num = LIST_NUM(ct->Columns);
23366 
23367 	for (i = 0;i < LIST_NUM(ct->Rows);i++)
23368 	{
23369 		UINT j;
23370 		CTR *ctr = LIST_DATA(ct->Rows, i);
23371 
23372 		for (j = 0;j < num;j++)
23373 		{
23374 			Free(ctr->Strings[j]);
23375 		}
23376 
23377 		Free(ctr->Strings);
23378 		Free(ctr);
23379 	}
23380 
23381 	for (i = 0;i < LIST_NUM(ct->Columns);i++)
23382 	{
23383 		CTC *ctc = LIST_DATA(ct->Columns, i);
23384 
23385 		Free(ctc->String);
23386 		Free(ctc);
23387 	}
23388 
23389 	ReleaseList(ct->Columns);
23390 	ReleaseList(ct->Rows);
23391 
23392 	Free(ct);
23393 }
CtFree(CT * ct,CONSOLE * c)23394 void CtFree(CT *ct, CONSOLE *c)
23395 {
23396 	CtFreeEx(ct, c, false);
23397 }
23398 
23399 // Add a row to the table
CtInsert(CT * ct,...)23400 void CtInsert(CT *ct, ...)
23401 {
23402 	CTR *ctr;
23403 	UINT num, i;
23404 	va_list va;
23405 	// Validate arguments
23406 	if (ct == NULL)
23407 	{
23408 		return;
23409 	}
23410 
23411 	num = LIST_NUM(ct->Columns);
23412 
23413 	va_start(va, ct);
23414 
23415 	ctr = ZeroMalloc(sizeof(CTR));
23416 	ctr->Strings = ZeroMalloc(sizeof(wchar_t *) * num);
23417 
23418 	for (i = 0;i < num;i++)
23419 	{
23420 		wchar_t *s = va_arg(va, wchar_t *);
23421 
23422 		ctr->Strings[i] = CopyUniStr(s);
23423 	}
23424 
23425 	va_end(va);
23426 
23427 	Insert(ct->Rows, ctr);
23428 }
23429 
23430 // Add a column to the table
CtInsertColumn(CT * ct,wchar_t * str,bool right)23431 void CtInsertColumn(CT *ct, wchar_t *str, bool right)
23432 {
23433 	CTC *ctc;
23434 	// Validate arguments
23435 	if (ct == NULL)
23436 	{
23437 		return;
23438 	}
23439 	if (str == NULL)
23440 	{
23441 		str = L"";
23442 	}
23443 
23444 	ctc = ZeroMalloc(sizeof(CTC));
23445 	ctc->String = CopyUniStr(str);
23446 	ctc->Right = right;
23447 
23448 	Insert(ct->Columns, ctc);
23449 }
23450 
23451 // Create a new console table
CtNew()23452 CT *CtNew()
23453 {
23454 	CT *ct;
23455 
23456 	ct = ZeroMalloc(sizeof(CT));
23457 	ct->Columns = NewList(NULL);
23458 	ct->Rows = NewList(NULL);
23459 
23460 	return ct;
23461 }
23462 
23463 // Add a standard column to a column in a table
CtNewStandard()23464 CT *CtNewStandard()
23465 {
23466 	CT *ct = CtNew();
23467 
23468 	CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_1"), false);
23469 	CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_2"), false);
23470 
23471 	return ct;
23472 }
CtNewStandardEx()23473 CT *CtNewStandardEx()
23474 {
23475 	CT *ct = CtNew();
23476 
23477 	CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_1"), false);
23478 	CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_2"), false);
23479 	CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_3"), false);
23480 
23481 	return ct;
23482 }
23483 
23484 // Get the TCP listener list
PsListenerList(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)23485 UINT PsListenerList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
23486 {
23487 	LIST *o;
23488 	PS *ps = (PS *)param;
23489 	UINT ret;
23490 	RPC_LISTENER_LIST t;
23491 	UINT i;
23492 	CT *ct;
23493 
23494 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
23495 	if (o == NULL)
23496 	{
23497 		return ERR_INVALID_PARAMETER;
23498 	}
23499 
23500 	Zero(&t, sizeof(t));
23501 
23502 	ret = ScEnumListener(ps->Rpc, &t);
23503 
23504 	if (ret != ERR_NO_ERROR)
23505 	{
23506 		CmdPrintError(c, ret);
23507 		FreeParamValueList(o);
23508 		return ret;
23509 	}
23510 
23511 	ct = CtNew();
23512 
23513 	CtInsertColumn(ct, _UU("CM_LISTENER_COLUMN_1"), false);
23514 	CtInsertColumn(ct, _UU("CM_LISTENER_COLUMN_2"), false);
23515 
23516 	for (i = 0;i < t.NumPort;i++)
23517 	{
23518 		wchar_t *status = _UU("CM_LISTENER_OFFLINE");
23519 		wchar_t tmp[128];
23520 
23521 		if (t.Errors[i])
23522 		{
23523 			status = _UU("CM_LISTENER_ERROR");
23524 		}
23525 		else if (t.Enables[i])
23526 		{
23527 			status = _UU("CM_LISTENER_ONLINE");
23528 		}
23529 
23530 		UniFormat(tmp, sizeof(tmp), _UU("CM_LISTENER_TCP_PORT"), t.Ports[i]);
23531 
23532 		CtInsert(ct, tmp, status);
23533 	}
23534 
23535 	CtFree(ct, c);
23536 
23537 	FreeRpcListenerList(&t);
23538 
23539 	FreeParamValueList(o);
23540 
23541 	return 0;
23542 }
23543 
23544 // Delete the TCP listener
PsListenerDelete(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)23545 UINT PsListenerDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
23546 {
23547 	LIST *o;
23548 	PS *ps = (PS *)param;
23549 	UINT ret;
23550 	RPC_LISTENER t;
23551 	PARAM args[] =
23552 	{
23553 		{"[port]", CmdPromptPort, _UU("CMD_ListenerDelete_PortPrompt"), CmdEvalPort, NULL},
23554 	};
23555 
23556 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
23557 	if (o == NULL)
23558 	{
23559 		return ERR_INVALID_PARAMETER;
23560 	}
23561 
23562 	Zero(&t, sizeof(t));
23563 	t.Enable = true;
23564 	t.Port = ToInt(GetParamStr(o, "[port]"));
23565 
23566 	ret = ScDeleteListener(ps->Rpc, &t);
23567 
23568 	if (ret != ERR_NO_ERROR)
23569 	{
23570 		CmdPrintError(c, ret);
23571 		FreeParamValueList(o);
23572 		return ret;
23573 	}
23574 
23575 	FreeParamValueList(o);
23576 
23577 	return 0;
23578 }
23579 
23580 // ServerInfoGet command
PsServerInfoGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)23581 UINT PsServerInfoGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
23582 {
23583 	LIST *o;
23584 	PS *ps = (PS *)param;
23585 	UINT ret;
23586 	RPC_SERVER_INFO t;
23587 	CT *ct;
23588 	wchar_t tmp[MAX_SIZE];
23589 
23590 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
23591 	if (o == NULL)
23592 	{
23593 		return ERR_INVALID_PARAMETER;
23594 	}
23595 
23596 	Zero(&t, sizeof(t));
23597 	ret = ScGetServerInfo(ps->Rpc, &t);
23598 	if (ret != ERR_NO_ERROR)
23599 	{
23600 		CmdPrintError(c, ret);
23601 		FreeParamValueList(o);
23602 		return ret;
23603 	}
23604 
23605 	ct = CtNew();
23606 
23607 	CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_1"), false);
23608 	CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_2"), false);
23609 
23610 	// Product name
23611 	StrToUni(tmp, sizeof(tmp), t.ServerProductName);
23612 	CtInsert(ct, _UU("SM_INFO_PRODUCT_NAME"), tmp);
23613 
23614 	// Version
23615 	StrToUni(tmp, sizeof(tmp), t.ServerVersionString);
23616 	CtInsert(ct, _UU("SM_INFO_VERSION"), tmp);
23617 
23618 	// Build
23619 	StrToUni(tmp, sizeof(tmp), t.ServerBuildInfoString);
23620 	CtInsert(ct, _UU("SM_INFO_BUILD"), tmp);
23621 
23622 	// Host name
23623 	StrToUni(tmp, sizeof(tmp), t.ServerHostName);
23624 	CtInsert(ct, _UU("SM_INFO_HOSTNAME"), tmp);
23625 
23626 	// Type
23627 	CtInsert(ct, _UU("SM_ST_SERVER_TYPE"), GetServerTypeStr(t.ServerType));
23628 
23629 	// OS
23630 	StrToUni(tmp, sizeof(tmp), t.OsInfo.OsSystemName);
23631 	CtInsert(ct, _UU("SM_OS_SYSTEM_NAME"), tmp);
23632 
23633 	StrToUni(tmp, sizeof(tmp), t.OsInfo.OsProductName);
23634 	CtInsert(ct, _UU("SM_OS_PRODUCT_NAME"), tmp);
23635 
23636 	if (t.OsInfo.OsServicePack != 0)
23637 	{
23638 		UniFormat(tmp, sizeof(tmp), _UU("SM_OS_SP_TAG"), t.OsInfo.OsServicePack);
23639 		CtInsert(ct, _UU("SM_OS_SERVICE_PACK"), tmp);
23640 	}
23641 
23642 	StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVendorName);
23643 	CtInsert(ct, _UU("SM_OS_VENDER_NAME"), tmp);
23644 
23645 	StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVersion);
23646 	CtInsert(ct, _UU("SM_OS_VERSION"), tmp);
23647 
23648 	StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelName);
23649 	CtInsert(ct, _UU("SM_OS_KERNEL_NAME"), tmp);
23650 
23651 	StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelVersion);
23652 	CtInsert(ct, _UU("SM_OS_KERNEL_VERSION"), tmp);
23653 
23654 	CtFree(ct, c);
23655 
23656 	FreeRpcServerInfo(&t);
23657 
23658 	FreeParamValueList(o);
23659 
23660 	return 0;
23661 }
23662 
23663 // Get the string for type of the HUB
GetHubTypeStr(UINT type)23664 wchar_t *GetHubTypeStr(UINT type)
23665 {
23666 	if (type == HUB_TYPE_FARM_STATIC)
23667 	{
23668 		return _UU("SM_HUB_STATIC");
23669 	}
23670 	else if (type == HUB_TYPE_FARM_DYNAMIC)
23671 	{
23672 		return _UU("SM_HUB_DYNAMIC");
23673 	}
23674 	return _UU("SM_HUB_STANDALONE");
23675 }
23676 
23677 // Get a string of the type of server
GetServerTypeStr(UINT type)23678 wchar_t *GetServerTypeStr(UINT type)
23679 {
23680 	if (type == SERVER_TYPE_FARM_CONTROLLER)
23681 	{
23682 		return _UU("SM_FARM_CONTROLLER");
23683 	}
23684 	else if (type == SERVER_TYPE_FARM_MEMBER)
23685 	{
23686 		return _UU("SM_FARM_MEMBER");
23687 	}
23688 	return _UU("SM_SERVER_STANDALONE");
23689 }
23690 
23691 // ServerStatusGet command
PsServerStatusGet(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)23692 UINT PsServerStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
23693 {
23694 	LIST *o;
23695 	PS *ps = (PS *)param;
23696 	UINT ret;
23697 	RPC_SERVER_STATUS t;
23698 	wchar_t tmp[MAX_PATH];
23699 	char tmp2[MAX_PATH];
23700 	CT *ct;
23701 
23702 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
23703 	if (o == NULL)
23704 	{
23705 		return ERR_INVALID_PARAMETER;
23706 	}
23707 
23708 	Zero(&t, sizeof(t));
23709 	ret = ScGetServerStatus(ps->Rpc, &t);
23710 	if (ret != ERR_NO_ERROR)
23711 	{
23712 		CmdPrintError(c, ret);
23713 		FreeParamValueList(o);
23714 		return ret;
23715 	}
23716 
23717 	ct = CtNew();
23718 
23719 	CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_1"), false);
23720 	CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_2"), false);
23721 
23722 	// Type of server
23723 	CtInsert(ct, _UU("SM_ST_SERVER_TYPE"),
23724 		t.ServerType == SERVER_TYPE_STANDALONE ? _UU("SM_SERVER_STANDALONE") :
23725 		t.ServerType == SERVER_TYPE_FARM_MEMBER ? _UU("SM_FARM_MEMBER") : _UU("SM_FARM_CONTROLLER"));
23726 
23727 	// Number of TCP connections
23728 	UniToStru(tmp, t.NumTcpConnections);
23729 	CtInsert(ct, _UU("SM_ST_NUM_TCP"), tmp);
23730 
23731 	if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
23732 	{
23733 		// Number of local TCP connections
23734 		UniToStru(tmp, t.NumTcpConnectionsLocal);
23735 		CtInsert(ct, _UU("SM_ST_NUM_TCP_LOCAL"), tmp);
23736 
23737 		// Number of remote TCP connections
23738 		UniToStru(tmp, t.NumTcpConnectionsRemote);
23739 		CtInsert(ct, _UU("SM_ST_NUM_TCP_REMOTE"), tmp);
23740 	}
23741 
23742 	// Number of Virtual HUBs
23743 	UniToStru(tmp, t.NumHubTotal);
23744 	CtInsert(ct, _UU("SM_ST_NUM_HUB_TOTAL"), tmp);
23745 
23746 	if (t.ServerType != SERVER_TYPE_STANDALONE)
23747 	{
23748 		// Number of static HUBs
23749 		UniToStru(tmp, t.NumHubStatic);
23750 		CtInsert(ct, _UU("SM_ST_NUM_HUB_STATIC"), tmp);
23751 
23752 		// Number of dynamic HUBs
23753 		UniToStru(tmp, t.NumHubDynamic);
23754 		CtInsert(ct, _UU("SM_ST_NUM_HUB_DYNAMIC"), tmp);
23755 	}
23756 
23757 	// Number of sessions
23758 	UniToStru(tmp, t.NumSessionsTotal);
23759 	CtInsert(ct, _UU("SM_ST_NUM_SESSION_TOTAL"), tmp);
23760 
23761 	if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
23762 	{
23763 		// Number of local sessions
23764 		UniToStru(tmp, t.NumSessionsLocal);
23765 		CtInsert(ct, _UU("SM_ST_NUM_SESSION_LOCAL"), tmp);
23766 
23767 		// Number of remote sessions
23768 		UniToStru(tmp, t.NumSessionsRemote);
23769 		CtInsert(ct, _UU("SM_ST_NUM_SESSION_REMOTE"), tmp);
23770 	}
23771 
23772 	// Number of MAC tables
23773 	UniToStru(tmp, t.NumMacTables);
23774 	CtInsert(ct, _UU("SM_ST_NUM_MAC_TABLE"), tmp);
23775 
23776 	// Number of IP tables
23777 	UniToStru(tmp, t.NumIpTables);
23778 	CtInsert(ct, _UU("SM_ST_NUM_IP_TABLE"), tmp);
23779 
23780 	// Number of users
23781 	UniToStru(tmp, t.NumUsers);
23782 	CtInsert(ct, _UU("SM_ST_NUM_USERS"), tmp);
23783 
23784 	// Number of groups
23785 	UniToStru(tmp, t.NumGroups);
23786 	CtInsert(ct, _UU("SM_ST_NUM_GROUPS"), tmp);
23787 
23788 	// Number of assigned licenses
23789 	UniToStru(tmp, t.AssignedClientLicenses);
23790 	CtInsert(ct, _UU("SM_ST_CLIENT_LICENSE"), tmp);
23791 
23792 	UniToStru(tmp, t.AssignedBridgeLicenses);
23793 	CtInsert(ct, _UU("SM_ST_BRIDGE_LICENSE"), tmp);
23794 
23795 	if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
23796 	{
23797 		UniToStru(tmp, t.AssignedClientLicensesTotal);
23798 		CtInsert(ct, _UU("SM_ST_CLIENT_LICENSE_EX"), tmp);
23799 
23800 		UniToStru(tmp, t.AssignedBridgeLicensesTotal);
23801 		CtInsert(ct, _UU("SM_ST_BRIDGE_LICENSE_EX"), tmp);
23802 	}
23803 
23804 	// Traffic
23805 	CmdInsertTrafficInfo(ct, &t.Traffic);
23806 
23807 	// Server start-up time
23808 	GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.StartTime), NULL);
23809 	CtInsert(ct, _UU("SM_ST_START_TIME"), tmp);
23810 
23811 	// Current time
23812 	GetDateTimeStrMilli64(tmp2, sizeof(tmp2), SystemToLocal64(t.CurrentTime));
23813 	StrToUni(tmp, sizeof(tmp), tmp2);
23814 	CtInsert(ct, _UU("SM_ST_CURRENT_TIME"), tmp);
23815 
23816 	// Tick value
23817 	UniFormat(tmp, sizeof(tmp), L"%I64u", t.CurrentTick);
23818 	CtInsert(ct, _UU("SM_ST_CURRENT_TICK"), tmp);
23819 
23820 	// Memory information
23821 	if (t.MemInfo.TotalMemory != 0)
23822 	{
23823 		char vv[128];
23824 
23825 		ToStr3(vv, sizeof(vv), t.MemInfo.TotalMemory);
23826 		UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
23827 		CtInsert(ct, _UU("SM_ST_TOTAL_MEMORY"), tmp);
23828 
23829 		ToStr3(vv, sizeof(vv), t.MemInfo.UsedMemory);
23830 		UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
23831 		CtInsert(ct, _UU("SM_ST_USED_MEMORY"), tmp);
23832 
23833 		ToStr3(vv, sizeof(vv), t.MemInfo.FreeMemory);
23834 		UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
23835 		CtInsert(ct, _UU("SM_ST_FREE_MEMORY"), tmp);
23836 
23837 		ToStr3(vv, sizeof(vv), t.MemInfo.TotalPhys);
23838 		UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
23839 		CtInsert(ct, _UU("SM_ST_TOTAL_PHYS"), tmp);
23840 
23841 		ToStr3(vv, sizeof(vv), t.MemInfo.UsedPhys);
23842 		UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
23843 		CtInsert(ct, _UU("SM_ST_USED_PHYS"), tmp);
23844 
23845 		ToStr3(vv, sizeof(vv), t.MemInfo.FreePhys);
23846 		UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
23847 		CtInsert(ct, _UU("SM_ST_FREE_PHYS"), tmp);
23848 	}
23849 
23850 	CtFree(ct, c);
23851 
23852 	FreeParamValueList(o);
23853 
23854 	return 0;
23855 }
23856 
23857 // Add traffic information to LVB
CmdInsertTrafficInfo(CT * ct,TRAFFIC * t)23858 void CmdInsertTrafficInfo(CT *ct, TRAFFIC *t)
23859 {
23860 	wchar_t tmp[MAX_SIZE];
23861 	char vv[128];
23862 	// Validate arguments
23863 	if (ct == NULL || t == NULL)
23864 	{
23865 		return;
23866 	}
23867 
23868 	// Transmission information
23869 	ToStr3(vv, sizeof(vv), t->Send.UnicastCount);
23870 	UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);
23871 	CtInsert(ct, _UU("SM_ST_SEND_UCAST_NUM"), tmp);
23872 
23873 	ToStr3(vv, sizeof(vv), t->Send.UnicastBytes);
23874 	UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);
23875 	CtInsert(ct, _UU("SM_ST_SEND_UCAST_SIZE"), tmp);
23876 
23877 	ToStr3(vv, sizeof(vv), t->Send.BroadcastCount);
23878 	UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);
23879 	CtInsert(ct, _UU("SM_ST_SEND_BCAST_NUM"), tmp);
23880 
23881 	ToStr3(vv, sizeof(vv), t->Send.BroadcastBytes);
23882 	UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);
23883 	CtInsert(ct, _UU("SM_ST_SEND_BCAST_SIZE"), tmp);
23884 
23885 	// Reception information
23886 	ToStr3(vv, sizeof(vv), t->Recv.UnicastCount);
23887 	UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);
23888 	CtInsert(ct, _UU("SM_ST_RECV_UCAST_NUM"), tmp);
23889 
23890 	ToStr3(vv, sizeof(vv), t->Recv.UnicastBytes);
23891 	UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);
23892 	CtInsert(ct, _UU("SM_ST_RECV_UCAST_SIZE"), tmp);
23893 
23894 	ToStr3(vv, sizeof(vv), t->Recv.BroadcastCount);
23895 	UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);
23896 	CtInsert(ct, _UU("SM_ST_RECV_BCAST_NUM"), tmp);
23897 
23898 	ToStr3(vv, sizeof(vv), t->Recv.BroadcastBytes);
23899 	UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);
23900 	CtInsert(ct, _UU("SM_ST_RECV_BCAST_SIZE"), tmp);
23901 }
23902 
23903 // Input a port number
CmdPromptPort(CONSOLE * c,void * param)23904 wchar_t *CmdPromptPort(CONSOLE *c, void *param)
23905 {
23906 	wchar_t *prompt_str;
23907 
23908 	if (param != NULL)
23909 	{
23910 		prompt_str = (wchar_t *)param;
23911 	}
23912 	else
23913 	{
23914 		prompt_str = _UU("CMD_PROMPT_PORT");
23915 	}
23916 
23917 	return c->ReadLine(c, prompt_str, true);
23918 }
23919 
23920 // Verify the port number
CmdEvalPort(CONSOLE * c,wchar_t * str,void * param)23921 bool CmdEvalPort(CONSOLE *c, wchar_t *str, void *param)
23922 {
23923 	UINT i;
23924 	// Validate arguments
23925 	if (c == NULL || str == NULL)
23926 	{
23927 		return false;
23928 	}
23929 
23930 	i = UniToInt(str);
23931 
23932 	if (i >= 1 && i <= 65535)
23933 	{
23934 		return true;
23935 	}
23936 
23937 	c->Write(c, _UU("CMD_EVAL_PORT"));
23938 
23939 	return false;
23940 }
23941 
23942 // ListenerCreate command
PsListenerCreate(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)23943 UINT PsListenerCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
23944 {
23945 	LIST *o;
23946 	PS *ps = (PS *)param;
23947 	UINT ret;
23948 	RPC_LISTENER t;
23949 	PARAM args[] =
23950 	{
23951 		{"[port]", CmdPromptPort, _UU("CMD_ListenerCreate_PortPrompt"), CmdEvalPort, NULL},
23952 	};
23953 
23954 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
23955 	if (o == NULL)
23956 	{
23957 		return ERR_INVALID_PARAMETER;
23958 	}
23959 
23960 	Zero(&t, sizeof(t));
23961 	t.Enable = true;
23962 	t.Port = ToInt(GetParamStr(o, "[port]"));
23963 
23964 	ret = ScCreateListener(ps->Rpc, &t);
23965 
23966 	if (ret != ERR_NO_ERROR)
23967 	{
23968 		CmdPrintError(c, ret);
23969 		FreeParamValueList(o);
23970 		return ret;
23971 	}
23972 
23973 	FreeParamValueList(o);
23974 
23975 	return 0;
23976 }
23977 
23978 // About command
PsAbout(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)23979 UINT PsAbout(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
23980 {
23981 	LIST *o;
23982 	BUF *b;
23983 
23984 	o = ParseCommandList(c, cmd_name, str, NULL, 0);
23985 	if (o == NULL)
23986 	{
23987 		return ERR_INVALID_PARAMETER;
23988 	}
23989 
23990 	b = ReadDump("|legal.txt");
23991 
23992 	CmdPrintAbout(c);
23993 	c->Write(c, L"\r\n");
23994 
23995 	if (b != NULL)
23996 	{
23997 		wchar_t *s;
23998 
23999 		SeekBufToEnd(b);
24000 		WriteBufChar(b, 13);
24001 		WriteBufChar(b, 10);
24002 		WriteBufChar(b, 0);
24003 
24004 		s = CopyUtfToUni(b->Buf);
24005 
24006 		c->Write(c, s);
24007 
24008 		Free(s);
24009 	}
24010 
24011 	// Display the version information
24012 	c->Write(c, _UU("D_ABOUT@S_INFO3"));
24013 	c->Write(c, L"\r\n");
24014 	c->Write(c, _UU("D_ABOUT@S_INFO4"));
24015 	c->Write(c, L"\r\n");
24016 	CmdPrintAbout(c);
24017 	c->Write(c, L"\r\n");
24018 
24019 	FreeParamValueList(o);
24020 
24021 	FreeBuf(b);
24022 
24023 	return 0;
24024 }
24025 
24026 // Creat a new server management context
NewPs(CONSOLE * c,RPC * rpc,char * servername,UINT serverport,char * hubname,char * adminhub,wchar_t * cmdline)24027 PS *NewPs(CONSOLE *c, RPC *rpc, char *servername, UINT serverport, char *hubname, char *adminhub, wchar_t *cmdline)
24028 {
24029 	PS *ps;
24030 	// Validate arguments
24031 	if (c == NULL || rpc == NULL || servername == NULL)
24032 	{
24033 		return NULL;
24034 	}
24035 
24036 	if (IsEmptyStr(hubname))
24037 	{
24038 		hubname = NULL;
24039 	}
24040 	if (IsEmptyStr(adminhub))
24041 	{
24042 		adminhub = NULL;
24043 	}
24044 	if (UniIsEmptyStr(cmdline))
24045 	{
24046 		cmdline = NULL;
24047 	}
24048 
24049 	ps = ZeroMalloc(sizeof(PS));
24050 	ps->ConsoleForServer = true;
24051 	ps->ServerPort = serverport;
24052 	ps->ServerName = CopyStr(servername);
24053 	ps->Console = c;
24054 	ps->Rpc = rpc;
24055 	ps->HubName = CopyStr(hubname);
24056 	ps->LastError = 0;
24057 	ps->AdminHub = CopyStr(adminhub);
24058 	ps->CmdLine = CopyUniStr(cmdline);
24059 
24060 	return ps;
24061 }
24062 
24063 // Release the server management context
FreePs(PS * ps)24064 void FreePs(PS *ps)
24065 {
24066 	// Validate arguments
24067 	if (ps == NULL)
24068 	{
24069 		return;
24070 	}
24071 
24072 	Free(ps->HubName);
24073 	Free(ps->AdminHub);
24074 	Free(ps->CmdLine);
24075 	Free(ps->ServerName);
24076 
24077 	Free(ps);
24078 }
24079 
24080 // Server Administration Tool
PsConnect(CONSOLE * c,char * host,UINT port,char * hub,char * adminhub,wchar_t * cmdline,char * password)24081 UINT PsConnect(CONSOLE *c, char *host, UINT port, char *hub, char *adminhub, wchar_t *cmdline, char *password)
24082 {
24083 	UINT retcode = 0;
24084 	RPC *rpc = NULL;
24085 	CEDAR *cedar;
24086 	CLIENT_OPTION o;
24087 	UCHAR hashed_password[SHA1_SIZE];
24088 	bool b = false;
24089 	// Validate arguments
24090 	if (c == NULL || host == NULL)
24091 	{
24092 		return ERR_INVALID_PARAMETER;
24093 	}
24094 	if (port == 0)
24095 	{
24096 		port = 443;
24097 	}
24098 	if (hub != NULL)
24099 	{
24100 		adminhub = NULL;
24101 	}
24102 
24103 	cedar = NewCedar(NULL, NULL);
24104 
24105 	Zero(&o, sizeof(o));
24106 	UniStrCpy(o.AccountName, sizeof(o.AccountName), L"VPNCMD");
24107 	StrCpy(o.Hostname, sizeof(o.Hostname), host);
24108 	o.Port = port;
24109 	o.ProxyType = PROXY_DIRECT;
24110 
24111 	Sha0(hashed_password, password, StrLen(password));
24112 
24113 	if (IsEmptyStr(password) == false)
24114 	{
24115 		b = true;
24116 	}
24117 
24118 	// Connect
24119 	while (true)
24120 	{
24121 		UINT err;
24122 
24123 		rpc = AdminConnectEx(cedar, &o, hub, hashed_password, &err, CEDAR_CUI_STR);
24124 		if (rpc == NULL)
24125 		{
24126 			// Failure
24127 			retcode = err;
24128 
24129 			if (err == ERR_ACCESS_DENIED && c->ProgrammingMode == false)
24130 			{
24131 				char *pass;
24132 				// Password is incorrect
24133 				if (b)
24134 				{
24135 					// Input the password
24136 					c->Write(c, _UU("CMD_VPNCMD_PASSWORD_1"));
24137 				}
24138 
24139 				b = true;
24140 
24141 				pass = c->ReadPassword(c, _UU("CMD_VPNCMD_PASSWORD_2"));
24142 				c->Write(c, L"");
24143 
24144 				if (pass != NULL)
24145 				{
24146 					Sha0(hashed_password, pass, StrLen(pass));
24147 					Free(pass);
24148 				}
24149 				else
24150 				{
24151 					break;
24152 				}
24153 			}
24154 			else
24155 			{
24156 				// Other errors
24157 				CmdPrintError(c, err);
24158 				break;
24159 			}
24160 		}
24161 		else
24162 		{
24163 			PS *ps;
24164 
24165 			// Success
24166 			ps = NewPs(c, rpc, host, port, hub, adminhub, cmdline);
24167 			PsMain(ps);
24168 			retcode = ps->LastError;
24169 			FreePs(ps);
24170 			AdminDisconnect(rpc);
24171 			break;
24172 		}
24173 	}
24174 
24175 	ReleaseCedar(cedar);
24176 
24177 	return retcode;
24178 }
24179 
24180 // Display the error
CmdPrintError(CONSOLE * c,UINT err)24181 void CmdPrintError(CONSOLE *c, UINT err)
24182 {
24183 	wchar_t tmp[MAX_SIZE];
24184 	// Validate arguments
24185 	if (c == NULL)
24186 	{
24187 		return;
24188 	}
24189 
24190 	UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_ERROR"),
24191 		err, GetUniErrorStr(err));
24192 	c->Write(c, tmp);
24193 
24194 	if (err == ERR_DISCONNECTED)
24195 	{
24196 		c->Write(c, _UU("CMD_DISCONNECTED_MSG"));
24197 	}
24198 }
24199 
24200 // Display the version information
CmdPrintAbout(CONSOLE * c)24201 void CmdPrintAbout(CONSOLE *c)
24202 {
24203 	CEDAR *cedar;
24204 	wchar_t tmp[MAX_SIZE];
24205 	char exe[MAX_PATH];
24206 	// Validate arguments
24207 	if (c == NULL)
24208 	{
24209 		return;
24210 	}
24211 
24212 	cedar = NewCedar(NULL, NULL);
24213 
24214 	GetExeName(exe, sizeof(exe));
24215 
24216 	UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_ABOUT"),
24217 		cedar->VerString, cedar->BuildInfo);
24218 
24219 	c->Write(c, tmp);
24220 
24221 	ReleaseCedar(cedar);
24222 }
24223 
24224 // Parse the host name and port number (Separated by @)
ParseHostPortAtmark(char * src,char ** host,UINT * port,UINT default_port)24225 bool ParseHostPortAtmark(char *src, char **host, UINT *port, UINT default_port)
24226 {
24227 	TOKEN_LIST *t;
24228 	bool ret = false;
24229 	// Validate arguments
24230 	if (src == NULL)
24231 	{
24232 		return false;
24233 	}
24234 
24235 	t = ParseToken(src, "@");
24236 	if (t == NULL)
24237 	{
24238 		return false;
24239 	}
24240 
24241 	if (port != NULL)
24242 	{
24243 		*port = 0;
24244 	}
24245 
24246 	if (default_port == 0)
24247 	{
24248 		if (t->NumTokens < 2)
24249 		{
24250 			FreeToken(t);
24251 			return false;
24252 		}
24253 
24254 		if (ToInt(t->Token[1]) == 0)
24255 		{
24256 			FreeToken(t);
24257 			return false;
24258 		}
24259 	}
24260 
24261 	if (t->NumTokens >= 2 && ToInt(t->Token[1]) == 0)
24262 	{
24263 		FreeToken(t);
24264 		return false;
24265 	}
24266 
24267 	if (t->NumTokens >= 1 && IsEmptyStr(t->Token[0]) == false)
24268 	{
24269 		ret = true;
24270 
24271 		if (host != NULL)
24272 		{
24273 			*host = CopyStr(t->Token[0]);
24274 			Trim(*host);
24275 		}
24276 
24277 		if (t->NumTokens >= 2)
24278 		{
24279 			if (port != NULL)
24280 			{
24281 				*port = ToInt(t->Token[1]);
24282 			}
24283 		}
24284 	}
24285 
24286 	if (port != NULL)
24287 	{
24288 		if (*port == 0)
24289 		{
24290 			*port = default_port;
24291 		}
24292 	}
24293 
24294 	FreeToken(t);
24295 
24296 	return ret;
24297 }
24298 
24299 // Parse the host name and port number
ParseHostPort(char * src,char ** host,UINT * port,UINT default_port)24300 bool ParseHostPort(char *src, char **host, UINT *port, UINT default_port)
24301 {
24302 	TOKEN_LIST *t;
24303 	bool ret = false;
24304 	// Validate arguments
24305 	if (src == NULL)
24306 	{
24307 		return false;
24308 	}
24309 
24310 	if (StartWith(src, "["))
24311 	{
24312 		if (InStr(src, "]"))
24313 		{
24314 			// Format of [target]:port
24315 			UINT i, n;
24316 			char tmp[MAX_SIZE];
24317 
24318 			StrCpy(tmp, sizeof(tmp), src);
24319 
24320 			n = SearchStrEx(tmp, "]", 0, false);
24321 			if (n != INFINITE)
24322 			{
24323 				UINT len = StrLen(tmp);
24324 
24325 				for (i = n;i < len;i++)
24326 				{
24327 					if (tmp[i] == ':')
24328 					{
24329 						tmp[i] = '@';
24330 					}
24331 				}
24332 			}
24333 
24334 			return ParseHostPortAtmark(tmp, host, port, default_port);
24335 		}
24336 	}
24337 
24338 	if (InStr(src, "@"))
24339 	{
24340 		// It is separated by @
24341 		return ParseHostPortAtmark(src, host, port, default_port);
24342 	}
24343 
24344 	t = ParseToken(src, ":");
24345 	if (t == NULL)
24346 	{
24347 		return false;
24348 	}
24349 
24350 	if (port != NULL)
24351 	{
24352 		*port = 0;
24353 	}
24354 
24355 	if (default_port == 0)
24356 	{
24357 		if (t->NumTokens < 2)
24358 		{
24359 			FreeToken(t);
24360 			return false;
24361 		}
24362 
24363 		if (ToInt(t->Token[1]) == 0)
24364 		{
24365 			FreeToken(t);
24366 			return false;
24367 		}
24368 	}
24369 
24370 	if (t->NumTokens >= 2 && ToInt(t->Token[1]) == 0)
24371 	{
24372 		FreeToken(t);
24373 		return false;
24374 	}
24375 
24376 	if (t->NumTokens >= 1 && IsEmptyStr(t->Token[0]) == false)
24377 	{
24378 		ret = true;
24379 
24380 		if (host != NULL)
24381 		{
24382 			*host = CopyStr(t->Token[0]);
24383 			Trim(*host);
24384 		}
24385 
24386 		if (t->NumTokens >= 2)
24387 		{
24388 			if (port != NULL)
24389 			{
24390 				*port = ToInt(t->Token[1]);
24391 			}
24392 		}
24393 	}
24394 
24395 	if (port != NULL)
24396 	{
24397 		if (*port == 0)
24398 		{
24399 			*port = default_port;
24400 		}
24401 	}
24402 
24403 	FreeToken(t);
24404 
24405 	return ret;
24406 }
24407 
24408 // Vpncmd command procedure
VpnCmdProc(CONSOLE * c,char * cmd_name,wchar_t * str,void * param)24409 UINT VpnCmdProc(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
24410 {
24411 	LIST *o;
24412 	char *target;
24413 	bool server = false;
24414 	bool client = false;
24415 	bool tools = false;
24416 	char *hostname = NULL;
24417 	char *password;
24418 	wchar_t *cmdline;
24419 	bool host_inputted = false;
24420 	UINT port = 0;
24421 	UINT retcode = 0;
24422 	PARAM args[] =
24423 	{
24424 		{"[host:port]", NULL, NULL, NULL, NULL},
24425 		{"CLIENT", NULL, NULL, NULL, NULL},
24426 		{"SERVER", NULL, NULL, NULL, NULL},
24427 		{"TOOLS", NULL, NULL, NULL, NULL},
24428 		{"HUB", NULL, NULL, NULL, NULL},
24429 		{"ADMINHUB", NULL, NULL, NULL, NULL},
24430 		{"PASSWORD", NULL, NULL, NULL, NULL},
24431 		{"IN", NULL, NULL, NULL, NULL},
24432 		{"OUT", NULL, NULL, NULL, NULL},
24433 		{"CMD", NULL, NULL, NULL, NULL},
24434 		{"CSV", NULL, NULL, NULL, NULL},
24435 		{"PROGRAMMING", NULL, NULL, NULL, NULL},
24436 	};
24437 
24438 #ifdef	OS_WIN32
24439 	if (UniStrCmpi(str, L"/debug") == 0)
24440 	{
24441 		// Debug information write mode
24442 		Win32CmdDebug(false);
24443 		return 0;
24444 	}
24445 	if (UniStrCmpi(str, L"/debug_uac") == 0)
24446 	{
24447 		// Debug information write mode
24448 		Win32CmdDebug(true);
24449 		return 0;
24450 	}
24451 #endif	// OS_WIN32
24452 
24453 	if (c->ConsoleType == CONSOLE_LOCAL)
24454 	{
24455 		// Initialize the execute path information
24456 		VpnCmdInitBootPath();
24457 	}
24458 
24459 	if(c->ConsoleType != CONSOLE_CSV)
24460 	{
24461 		CmdPrintAbout(c);
24462 		c->Write(c, L"");
24463 	}
24464 
24465 	o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
24466 
24467 	if (o == NULL)
24468 	{
24469 		return ERR_INVALID_PARAMETER;
24470 	}
24471 
24472 	// Specification of the mode of Tools or Server or Client
24473 	if ((GetParamStr(o, "CLIENT") == NULL && GetParamStr(o, "SERVER") == NULL && GetParamStr(o, "TOOLS") == NULL) ||
24474 		(GetParamStr(o, "CLIENT") != NULL && GetParamStr(o, "SERVER") != NULL && GetParamStr(o, "TOOLS") != NULL))
24475 	{
24476 		wchar_t *ret;
24477 		UINT code;
24478 		// The mode of Tools or Server or Client is not specified
24479 		c->Write(c, _UU("CMD_VPNCMD_CS_1"));
24480 
24481 		ret = c->ReadLine(c, _UU("CMD_VPNCMD_CS_2"), true);
24482 
24483 		code = UniToInt(ret);
24484 		Free(ret);
24485 
24486 		switch (code)
24487 		{
24488 		case 1:
24489 			// Server
24490 			server = true;
24491 			break;
24492 
24493 		case 2:
24494 			// Client
24495 			client = true;
24496 			break;
24497 
24498 		case 3:
24499 			// Tools
24500 			tools = true;
24501 			break;
24502 
24503 		default:
24504 			// Unspecified
24505 			FreeParamValueList(o);
24506 			return ERR_USER_CANCEL;
24507 		}
24508 
24509 		c->Write(c, L"");
24510 	}
24511 	else
24512 	{
24513 		if (GetParamStr(o, "SERVER") != NULL)
24514 		{
24515 			server = true;
24516 		}
24517 		else if (GetParamStr(o, "CLIENT") != NULL)
24518 		{
24519 			client = true;
24520 		}
24521 		else
24522 		{
24523 			tools = true;
24524 		}
24525 	}
24526 
24527 	// Destination host name
24528 	target = CopyStr(GetParamStr(o, "[host:port]"));
24529 
24530 	if (target == NULL && tools == false)
24531 	{
24532 		wchar_t *str;
24533 		// Input a host name
24534 		if (server)
24535 		{
24536 			c->Write(c, _UU("CMD_VPNCMD_HOST_1"));
24537 		}
24538 		else if (client)
24539 		{
24540 			c->Write(c, _UU("CMD_VPNCMD_HOST_2"));
24541 		}
24542 
24543 		str = c->ReadLine(c, _UU("CMD_VPNCMD_HOST_3"), true);
24544 		c->Write(c, L"");
24545 		target = CopyUniToStr(str);
24546 		Free(str);
24547 
24548 		if (target == NULL)
24549 		{
24550 			// Cancel
24551 			FreeParamValueList(o);
24552 			return ERR_USER_CANCEL;
24553 		}
24554 
24555 		if (IsEmptyStr(target))
24556 		{
24557 			Free(target);
24558 			target = CopyStr("localhost");
24559 		}
24560 	}
24561 	else
24562 	{
24563 		// User specifies a host name
24564 		host_inputted = true;
24565 	}
24566 
24567 	if (tools == false)
24568 	{
24569 		if (ParseHostPort(target, &hostname, &port, 443) == false)
24570 		{
24571 			c->Write(c, _UU("CMD_MSG_INVALID_HOSTNAME"));
24572 			Free(target);
24573 			FreeParamValueList(o);
24574 			return ERR_INVALID_PARAMETER;
24575 		}
24576 	}
24577 
24578 	// Password
24579 	password = GetParamStr(o, "PASSWORD");
24580 	if (password == NULL)
24581 	{
24582 		password = "";
24583 	}
24584 
24585 	// Command line
24586 	cmdline = GetParamUniStr(o, "CMD");
24587 
24588 	if (server)
24589 	{
24590 		// Process as the server
24591 		char *hub;
24592 		char *adminhub = NULL;
24593 
24594 		hub = CopyStr(GetParamStr(o, "HUB"));
24595 		adminhub = GetParamStr(o, "ADMINHUB");
24596 
24597 		// Decide the Virtual HUB to be specified in the Virtual HUB management mode
24598 		if (hub == NULL)
24599 		{
24600 			if (host_inputted == false)
24601 			{
24602 				wchar_t *s;
24603 				// If the user does not specify a host name on the command line,
24604 				// get also a Virtual HUB name by displaying the prompt
24605 				c->Write(c, _UU("CMD_VPNCMD_HUB_1"));
24606 
24607 				s = c->ReadLine(c, _UU("CMD_VPNCMD_HUB_2"), true);
24608 
24609 				hub = CopyUniToStr(s);
24610 				Free(s);
24611 			}
24612 		}
24613 
24614 		if (IsEmptyStr(hub))
24615 		{
24616 			Free(hub);
24617 			hub = NULL;
24618 		}
24619 		if (IsEmptyStr(adminhub))
24620 		{
24621 			adminhub = NULL;
24622 		}
24623 
24624 		retcode = PsConnect(c, hostname, port, hub, adminhub, cmdline, password);
24625 
24626 		Free(hub);
24627 	}
24628 	else if (client)
24629 	{
24630 		// Treated as a client
24631 		Trim(target);
24632 
24633 		retcode = PcConnect(c, target, cmdline, password);
24634 	}
24635 	else if (tools)
24636 	{
24637 		// Treated as a VPN Tools
24638 		retcode = PtConnect(c, cmdline);
24639 	}
24640 
24641 	Free(hostname);
24642 	Free(target);
24643 	FreeParamValueList(o);
24644 
24645 	return retcode;
24646 }
24647 
24648 // Entry point of vpncmd
CommandMain(wchar_t * command_line)24649 UINT CommandMain(wchar_t *command_line)
24650 {
24651 	UINT ret = 0;
24652 	wchar_t *infile, *outfile;
24653 	char *a_infile, *a_outfile;
24654 	wchar_t *csvmode;
24655 	wchar_t *programming_mode;
24656 	CONSOLE *c;
24657 
24658 	// Validate arguments
24659 	if (command_line == NULL)
24660 	{
24661 		return ERR_INVALID_PARAMETER;
24662 	}
24663 
24664 	// Look ahead only items of /in and /out
24665 	infile = ParseCommand(command_line, L"in");
24666 	outfile = ParseCommand(command_line, L"out");
24667 	if (UniIsEmptyStr(infile))
24668 	{
24669 		Free(infile);
24670 		infile = NULL;
24671 	}
24672 	if (UniIsEmptyStr(outfile))
24673 	{
24674 		Free(outfile);
24675 		outfile = NULL;
24676 	}
24677 
24678 	a_infile = CopyUniToStr(infile);
24679 	a_outfile = CopyUniToStr(outfile);
24680 
24681 	// Allocate the local console
24682 	c = NewLocalConsole(infile, outfile);
24683 	if (c != NULL)
24684 	{
24685 		// Definition of commands of vpncmd
24686 		CMD cmd[] =
24687 		{
24688 			{"vpncmd", VpnCmdProc},
24689 		};
24690 
24691 		// Read ahead to check the CSV mode
24692 		csvmode = ParseCommand(command_line, L"csv");
24693 		if(csvmode != NULL)
24694 		{
24695 			Free(csvmode);
24696 			c->ConsoleType = CONSOLE_CSV;
24697 		}
24698 
24699 		programming_mode = ParseCommand(command_line, L"programming");
24700 		if (programming_mode != NULL)
24701 		{
24702 			Free(programming_mode);
24703 			c->ProgrammingMode = true;
24704 		}
24705 
24706 		if (DispatchNextCmdEx(c, command_line, ">", cmd, sizeof(cmd) / sizeof(cmd[0]), NULL) == false)
24707 		{
24708 			ret = ERR_INVALID_PARAMETER;
24709 		}
24710 		else
24711 		{
24712 			ret = c->RetCode;
24713 		}
24714 
24715 		// Release the local console
24716 		c->Free(c);
24717 	}
24718 	else
24719 	{
24720 		Print("Error: Couldn't open local console.\n");
24721 	}
24722 
24723 	Free(a_infile);
24724 	Free(a_outfile);
24725 	Free(infile);
24726 	Free(outfile);
24727 
24728 	return ret;
24729 }
24730 
24731 #ifdef	OS_WIN32
24732 // Debug information write mode
Win32CmdDebug(bool is_uac)24733 void Win32CmdDebug(bool is_uac)
24734 {
24735 	wchar_t *dst;
24736 	wchar_t def_filename[MAX_SIZE];
24737 	SYSTEMTIME st;
24738 
24739 	InitWinUi(_UU("CMD_DEBUG_SOFTNAME"), NULL, 0);
24740 
24741 	UniPrint(_UU("CMD_DEBUG_PRINT"));
24742 
24743 	if (is_uac && MsIsAdmin() == false)
24744 	{
24745 		MsgBox(NULL, 0x00000040L, _UU("CMD_DEBUG_NOT_ADMIN"));
24746 		goto LABEL_CLEANUP;
24747 	}
24748 
24749 	if (MsIsAdmin() == false)
24750 	{
24751 		void *process_handle = NULL;
24752 
24753 		// Launch myself using the UAC
24754 		if (MsExecuteEx2W(MsGetExeFileNameW(), L"/debug_uac", &process_handle, true) == false)
24755 		{
24756 			MsgBox(NULL, 0x00000030L, _UU("CMD_DEBUG_UAC_FAILED"));
24757 			return;
24758 		}
24759 
24760 		MsCloseHandle(process_handle);
24761 		goto LABEL_CLEANUP;
24762 	}
24763 
24764 	LocalTime(&st);
24765 
24766 	UniFormat(def_filename, sizeof(def_filename), L"vpn_debuginfo_%04u%02u%02u_%02u%02u%02u.zip",
24767 		st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
24768 
24769 	// Specify the destination
24770 	dst = SaveDlg(NULL, _UU("DLG_ZIP_FILER"), _UU("CMD_DEBUG_SAVE_TITLE"), def_filename, L".zip");
24771 	if (dst != NULL)
24772 	{
24773 		if (MsSaveSystemInfo(dst) == false)
24774 		{
24775 			// Failure
24776 			MsgBoxEx(NULL, 0x00000030L, _UU("CMD_DEBUG_NG"), dst);
24777 		}
24778 		else
24779 		{
24780 			// Success
24781 			MsgBoxEx(NULL, 0x00000040L, _UU("CMD_DEBUG_OK"), dst);
24782 		}
24783 
24784 		Free(dst);
24785 	}
24786 
24787 LABEL_CLEANUP:
24788 	FreeWinUi();
24789 }
24790 
24791 #endif	// OS_WIN32
24792 
24793