mirror of
https://github.com/SoftEtherVPN/SoftEtherVPN.git
synced 2024-11-22 09:29:52 +03:00
25099 lines
561 KiB
C
25099 lines
561 KiB
C
// SoftEther VPN Source Code - Developer Edition Master Branch
|
|
// Cedar Communication Module
|
|
// © 2020 Nokia
|
|
|
|
// Command.c
|
|
// vpncmd Command Line Management Utility
|
|
|
|
#include "Command.h"
|
|
|
|
#include "Admin.h"
|
|
#include "AzureClient.h"
|
|
#include "Connection.h"
|
|
#include "Console.h"
|
|
#include "Database.h"
|
|
#include "DDNS.h"
|
|
#include "Layer3.h"
|
|
#include "Nat.h"
|
|
#include "Proto_IPsec.h"
|
|
#include "Proto_WireGuard.h"
|
|
#include "Radius.h"
|
|
#include "Server.h"
|
|
#include "Virtual.h"
|
|
#include "WinUi.h"
|
|
|
|
#include "Mayaqua/Cfg.h"
|
|
#include "Mayaqua/FileIO.h"
|
|
#include "Mayaqua/Internat.h"
|
|
#include "Mayaqua/Kernel.h"
|
|
#include "Mayaqua/Memory.h"
|
|
#include "Mayaqua/Microsoft.h"
|
|
#include "Mayaqua/Network.h"
|
|
#include "Mayaqua/Object.h"
|
|
#include "Mayaqua/OS.h"
|
|
#include "Mayaqua/Pack.h"
|
|
#include "Mayaqua/Secure.h"
|
|
#include "Mayaqua/Str.h"
|
|
#include "Mayaqua/Table.h"
|
|
#include "Mayaqua/Tick64.h"
|
|
#include "Mayaqua/Unix.h"
|
|
|
|
#include "Mayaqua/Crypto/Key.h"
|
|
|
|
#include <stdlib.h>
|
|
|
|
#ifdef OS_UNIX
|
|
#include <signal.h>
|
|
#include <sys/wait.h>
|
|
#endif
|
|
|
|
// System checker definition
|
|
typedef bool (CHECKER_PROC_DEF)();
|
|
typedef struct CHECKER_PROC
|
|
{
|
|
char *Title;
|
|
CHECKER_PROC_DEF *Proc;
|
|
} CHECKER_PROC;
|
|
|
|
static CHECKER_PROC checker_procs[] =
|
|
{
|
|
{"CHECK_PROC_KERNEL", CheckKernel},
|
|
{"CHECK_PROC_MEMORY", CheckMemory},
|
|
{"CHECK_PROC_STRINGS", CheckStrings},
|
|
{"CHECK_PROC_FILESYSTEM", CheckFileSystem},
|
|
{"CHECK_PROC_THREAD", CheckThread},
|
|
{"CHECK_PROC_NETWORK", CheckNetwork},
|
|
};
|
|
|
|
typedef struct CHECK_NETWORK_1
|
|
{
|
|
SOCK *ListenSocket;
|
|
} CHECK_NETWORK_1;
|
|
|
|
typedef struct CHECK_NETWORK_2
|
|
{
|
|
SOCK *s;
|
|
X *x;
|
|
K *k;
|
|
} CHECK_NETWORK_2;
|
|
|
|
|
|
// Accept thread
|
|
void CheckNetworkAcceptThread(THREAD *thread, void *param)
|
|
{
|
|
CHECK_NETWORK_2 *c = (CHECK_NETWORK_2 *)param;
|
|
SOCK *s = c->s;
|
|
UINT i = 0;
|
|
|
|
if (StartSSL(s, c->x, c->k))
|
|
{
|
|
while (true)
|
|
{
|
|
i++;
|
|
if (Send(s, &i, sizeof(UINT), true) == 0)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
Disconnect(s);
|
|
ReleaseSock(s);
|
|
}
|
|
|
|
|
|
// Listen thread
|
|
void CheckNetworkListenThread(THREAD *thread, void *param)
|
|
{
|
|
CHECK_NETWORK_1 *c = (CHECK_NETWORK_1 *)param;
|
|
SOCK *s;
|
|
UINT i, rsa_bits = 1024;
|
|
K *pub, *pri;
|
|
X *x;
|
|
LIST *o = NewList(NULL);
|
|
NAME *name = NewName(L"Test", L"Test", L"Test", L"JP", L"Ibaraki", L"Tsukuba");
|
|
|
|
// Set RSA bits considering OpenSSL security Level
|
|
// Security level 4 needs 7680 bits
|
|
switch (GetOSSecurityLevel())
|
|
{
|
|
case 2:
|
|
rsa_bits = 2048;
|
|
break;
|
|
case 3:
|
|
rsa_bits = 4096;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
RsaGen(&pri, &pub, rsa_bits);
|
|
x = NewRootX(pub, pri, name, 1000, NULL);
|
|
|
|
FreeName(name);
|
|
|
|
for (i = 1025;;i++)
|
|
{
|
|
s = Listen(i);
|
|
if (s != NULL)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
c->ListenSocket = s;
|
|
AddRef(s->ref);
|
|
|
|
NoticeThreadInit(thread);
|
|
|
|
while (true)
|
|
{
|
|
SOCK *new_sock = Accept(s);
|
|
|
|
if (new_sock == NULL)
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
CHECK_NETWORK_2 c;
|
|
THREAD *t;
|
|
|
|
Zero(&c, sizeof(c));
|
|
c.s = new_sock;
|
|
c.k = pri;
|
|
c.x = x;
|
|
|
|
t = NewThread(CheckNetworkAcceptThread, &c);
|
|
Insert(o, t);
|
|
}
|
|
}
|
|
|
|
for (i = 0;i < LIST_NUM(o);i++)
|
|
{
|
|
THREAD *t = LIST_DATA(o, i);
|
|
WaitThread(t, INFINITE);
|
|
ReleaseThread(t);
|
|
}
|
|
|
|
FreeK(pri);
|
|
FreeK(pub);
|
|
|
|
FreeX(x);
|
|
|
|
ReleaseSock(s);
|
|
ReleaseList(o);
|
|
}
|
|
|
|
// Network function check
|
|
bool CheckNetwork()
|
|
{
|
|
CHECK_NETWORK_1 c;
|
|
THREAD *t;
|
|
SOCK *listen_socket;
|
|
UINT port;
|
|
UINT i, num;
|
|
bool ok = true;
|
|
SOCK **socks;
|
|
SOCK_EVENT *se = NewSockEvent();
|
|
|
|
Zero(&c, sizeof(c));
|
|
t = NewThread(CheckNetworkListenThread, &c);
|
|
WaitThreadInit(t);
|
|
|
|
listen_socket = c.ListenSocket;
|
|
|
|
port = listen_socket->LocalPort;
|
|
|
|
num = 8;
|
|
socks = ZeroMalloc(sizeof(SOCK *) * num);
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
socks[i] = Connect("localhost", port);
|
|
if (socks[i] == NULL)
|
|
{
|
|
Print("Connect Failed. (%u)\n", i);
|
|
ok = false;
|
|
num = i;
|
|
break;
|
|
}
|
|
if (StartSSL(socks[i], NULL, NULL) == false)
|
|
{
|
|
ReleaseSock(socks[i]);
|
|
Print("Connect Failed. (%u)\n", i);
|
|
ok = false;
|
|
num = i;
|
|
break;
|
|
}
|
|
|
|
JoinSockToSockEvent(socks[i], se);
|
|
}
|
|
|
|
if (ok)
|
|
{
|
|
while (true)
|
|
{
|
|
UINT i;
|
|
bool end = false;
|
|
bool all_blocked = true;
|
|
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
UINT n;
|
|
UINT ret;
|
|
|
|
n = 0;
|
|
ret = Recv(socks[i], &n, sizeof(UINT), true);
|
|
if (ret == 0)
|
|
{
|
|
Print("Recv Failed (Disconnected).\n", ret);
|
|
end = true;
|
|
ok = false;
|
|
}
|
|
if (ret != SOCK_LATER)
|
|
{
|
|
all_blocked = false;
|
|
}
|
|
|
|
if (n >= 128)
|
|
{
|
|
end = true;
|
|
}
|
|
}
|
|
|
|
if (end)
|
|
{
|
|
break;
|
|
}
|
|
|
|
if (all_blocked)
|
|
{
|
|
WaitSockEvent(se, INFINITE);
|
|
}
|
|
}
|
|
}
|
|
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
Disconnect(socks[i]);
|
|
ReleaseSock(socks[i]);
|
|
}
|
|
Free(socks);
|
|
|
|
Disconnect(listen_socket);
|
|
|
|
WaitThread(t, INFINITE);
|
|
ReleaseThread(t);
|
|
|
|
ReleaseSock(listen_socket);
|
|
|
|
ReleaseSockEvent(se);
|
|
|
|
return ok;
|
|
}
|
|
|
|
typedef struct CHECK_THREAD_1
|
|
{
|
|
UINT num;
|
|
LOCK *lock;
|
|
THREAD *wait_thread;
|
|
} CHECK_THREAD_1;
|
|
|
|
static UINT check_thread_global_1 = 0;
|
|
|
|
#define CHECK_THREAD_INCREMENT_COUNT 32
|
|
|
|
// Test thread 1
|
|
void CheckThread1(THREAD *thread, void *param)
|
|
{
|
|
CHECK_THREAD_1 *ct1 = (CHECK_THREAD_1 *)param;
|
|
UINT i;
|
|
UINT num = CHECK_THREAD_INCREMENT_COUNT;
|
|
|
|
WaitThread(ct1->wait_thread, INFINITE);
|
|
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
Lock(ct1->lock);
|
|
check_thread_global_1 = ct1->num;
|
|
InputToNull((void *)check_thread_global_1);
|
|
check_thread_global_1 = check_thread_global_1 + 1 + RetZero();
|
|
ct1->num = check_thread_global_1;
|
|
Unlock(ct1->lock);
|
|
}
|
|
}
|
|
|
|
// Test thread 2
|
|
void CheckThread2(THREAD *thread, void *param)
|
|
{
|
|
EVENT *e = (EVENT *)param;
|
|
Wait(e, INFINITE);
|
|
}
|
|
|
|
typedef struct CHECK_THREAD_3
|
|
{
|
|
UINT num, a;
|
|
} CHECK_THREAD_3;
|
|
|
|
// Test thread 3
|
|
void CheckThread3(THREAD *thread, void *param)
|
|
{
|
|
CHECK_THREAD_3 *c = (CHECK_THREAD_3 *)param;
|
|
THREAD *t;
|
|
|
|
if (c->num == 0)
|
|
{
|
|
return;
|
|
}
|
|
c->num--;
|
|
c->a++;
|
|
|
|
t = NewThread(CheckThread3, c);
|
|
WaitThread(t, INFINITE);
|
|
ReleaseThread(t);
|
|
}
|
|
|
|
// Thread check
|
|
bool CheckThread()
|
|
{
|
|
bool ok = true;
|
|
CHECK_THREAD_1 ct1;
|
|
UINT num = 32;
|
|
UINT i;
|
|
THREAD **threads;
|
|
EVENT *e;
|
|
THREAD *t2;
|
|
THREAD *t;
|
|
CHECK_THREAD_3 c;
|
|
|
|
e = NewEvent();
|
|
|
|
Zero(&ct1, sizeof(ct1));
|
|
ct1.lock = NewLock();
|
|
|
|
t2 = NewThread(CheckThread2, e);
|
|
ct1.wait_thread = t2;
|
|
|
|
threads = ZeroMalloc(sizeof(THREAD *) * num);
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
threads[i] = NewThread(CheckThread1, &ct1);
|
|
if (threads[i] == NULL)
|
|
{
|
|
Print("Thread %u Create Failed.\n", i);
|
|
ok = false;
|
|
}
|
|
}
|
|
|
|
Set(e);
|
|
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
WaitThread(threads[i], INFINITE);
|
|
ReleaseThread(threads[i]);
|
|
}
|
|
|
|
Free(threads);
|
|
|
|
if (ct1.num != (num * CHECK_THREAD_INCREMENT_COUNT))
|
|
{
|
|
Print("Threading: %u != %u\n", ct1.num, num * CHECK_THREAD_INCREMENT_COUNT);
|
|
ok = false;
|
|
}
|
|
|
|
DeleteLock(ct1.lock);
|
|
|
|
WaitThread(t2, INFINITE);
|
|
ReleaseThread(t2);
|
|
|
|
ReleaseEvent(e);
|
|
|
|
num = 32;
|
|
|
|
Zero(&c, sizeof(c));
|
|
c.num = num;
|
|
t = NewThread(CheckThread3, &c);
|
|
WaitThread(t, INFINITE);
|
|
ReleaseThread(t);
|
|
|
|
if (c.a != num)
|
|
{
|
|
Print("Threading: %u != %u\n", c.a, num);
|
|
ok = false;
|
|
}
|
|
|
|
return ok;
|
|
}
|
|
|
|
// File system check
|
|
bool CheckFileSystem()
|
|
{
|
|
bool ok = false;
|
|
char exe[MAX_PATH];
|
|
char exe_dir[MAX_PATH];
|
|
DIRLIST *dirs;
|
|
UINT i;
|
|
|
|
GetExeName(exe, sizeof(exe));
|
|
GetExeDir(exe_dir, sizeof(exe_dir));
|
|
|
|
dirs = EnumDir(exe_dir);
|
|
for (i = 0;i < dirs->NumFiles;i++)
|
|
{
|
|
if (EndWith(exe, dirs->File[i]->FileName))
|
|
{
|
|
ok = true;
|
|
break;
|
|
}
|
|
}
|
|
FreeDir(dirs);
|
|
|
|
if (ok == false)
|
|
{
|
|
Print("EnumDir Failed.\n");
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
UINT size = 1234567;
|
|
UCHAR *buf;
|
|
IO *io;
|
|
#ifndef OS_WIN32
|
|
wchar_t *filename = L"/tmp/vpn_checker_tmp";
|
|
#else // OS_WIN32
|
|
wchar_t filename[MAX_PATH];
|
|
CombinePathW(filename, sizeof(filename), MsGetMyTempDirW(), L"vpn_checker_tmp");
|
|
#endif // OS_WIN32
|
|
|
|
buf = Malloc(size);
|
|
for (i = 0;i < size;i++)
|
|
{
|
|
buf[i] = i % 256;
|
|
}
|
|
|
|
io = FileCreateW(filename);
|
|
if (io == NULL)
|
|
{
|
|
Print("FileCreate Failed.\n");
|
|
Free(buf);
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
FileWrite(io, buf, size);
|
|
Free(buf);
|
|
FileClose(io);
|
|
|
|
io = FileOpenW(filename, false);
|
|
if (FileSize(io) != 1234567)
|
|
{
|
|
Print("FileSize Failed.\n");
|
|
FileClose(io);
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
BUF *b;
|
|
|
|
FileClose(io);
|
|
b = ReadDumpW(filename);
|
|
if(b == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
for (i = 0;i < b->Size;i++)
|
|
{
|
|
UCHAR c = ((UCHAR *)b->Buf)[i];
|
|
|
|
if (c != (i % 256))
|
|
{
|
|
Print("FileToBuf Failed.\n");
|
|
FreeBuf(b);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
FreeBuf(b);
|
|
}
|
|
}
|
|
|
|
FileDeleteW(filename);
|
|
}
|
|
|
|
return ok;
|
|
}
|
|
|
|
// String check
|
|
bool CheckStrings()
|
|
{
|
|
wchar_t *numstr = _UU("CHECK_TEST_123456789");
|
|
char tmp[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
UINT i;
|
|
UINT sum, sum2;
|
|
UNI_TOKEN_LIST *t;
|
|
|
|
UniStrCpy(tmp2, sizeof(tmp2), L"");
|
|
|
|
sum2 = 0;
|
|
for (i = 0;i < 64;i++)
|
|
{
|
|
sum2 += i;
|
|
UniFormat(tmp2, sizeof(tmp2), L"%s,%u", tmp2, i);
|
|
}
|
|
|
|
t = UniParseToken(tmp2, L",");
|
|
|
|
sum = 0;
|
|
|
|
for (i = 0;i < t->NumTokens;i++)
|
|
{
|
|
wchar_t *s = t->Token[i];
|
|
UINT n = UniToInt(s);
|
|
|
|
sum += n;
|
|
}
|
|
|
|
UniFreeToken(t);
|
|
|
|
if (sum != sum2)
|
|
{
|
|
Print("UniParseToken Failed.\n");
|
|
return false;
|
|
}
|
|
|
|
if (UniToInt(numstr) != 123456789)
|
|
{
|
|
Print("UniToInt Failed.\n");
|
|
return false;
|
|
}
|
|
|
|
UniToStr(tmp, sizeof(tmp), numstr);
|
|
if (ToInt(tmp) != 123456789)
|
|
{
|
|
Print("UniToStr Failed.\n");
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Memory check
|
|
bool CheckMemory()
|
|
{
|
|
UINT i, num, size, j;
|
|
void **pp;
|
|
bool ok = true;
|
|
UINT old_size;
|
|
|
|
num = 2000;
|
|
size = 1000;
|
|
pp = ZeroMalloc(sizeof(void *) * num);
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
pp[i] = ZeroMalloc(size);
|
|
InputToNull(pp[i]);
|
|
for (j = 0;j < size;j++)
|
|
{
|
|
((UCHAR *)pp[i])[j] = j % 256;
|
|
}
|
|
}
|
|
old_size = size;
|
|
size = size * 3;
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
pp[i] = ReAlloc(pp[i], size);
|
|
for (j = old_size;j < size;j++)
|
|
{
|
|
InputToNull((void *)(UINT)(((UCHAR *)pp[i])[j] = j % 256));
|
|
}
|
|
}
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
for (j = 0;j < size;j++)
|
|
{
|
|
if (((UCHAR *)pp[i])[j] != (j % 256))
|
|
{
|
|
ok = false;
|
|
}
|
|
}
|
|
Free(pp[i]);
|
|
}
|
|
Free(pp);
|
|
|
|
return ok;
|
|
}
|
|
|
|
// Function that do not do anything
|
|
void InputToNull(void *p)
|
|
{
|
|
if (RetZero() == 1)
|
|
{
|
|
UCHAR *c = (UCHAR *)p;
|
|
c[0] = 0x32;
|
|
}
|
|
}
|
|
|
|
// Function that returns 0
|
|
UINT RetZero()
|
|
{
|
|
if (g_debug == 0x123455)
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
// Kernel check
|
|
bool CheckKernel()
|
|
{
|
|
UINT num = 10, i;
|
|
UINT64 s = Tick64();
|
|
UINT64 t = Tick64();
|
|
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
UINT64 q = Tick64();
|
|
if (t > q)
|
|
{
|
|
Print("Tick64 #1 Failed.\n");
|
|
return false;
|
|
}
|
|
|
|
t = q;
|
|
|
|
SleepThread(100);
|
|
}
|
|
|
|
t = (Tick64() - s);
|
|
if (t <= 500 || t >= 2000)
|
|
{
|
|
Print("Tick64 #2 Failed.\n");
|
|
return false;
|
|
}
|
|
else if (false)
|
|
{
|
|
UINT64 tick1 = Tick64();
|
|
UINT64 time1;
|
|
UINT64 time2;
|
|
|
|
SleepThread(1000);
|
|
|
|
time2 = LocalTime64();
|
|
time1 = SystemToLocal64(TickToTime(tick1));
|
|
|
|
if (time2 > time1)
|
|
{
|
|
s = time2 - time1;
|
|
}
|
|
else
|
|
{
|
|
s = time1 - time2;
|
|
}
|
|
|
|
if (s <= 500 || s >= 2000)
|
|
{
|
|
Print("TickToTime Failed.\n");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
#ifdef OS_UNIX
|
|
{
|
|
// Test of child process
|
|
UINT pid;
|
|
char exe[MAX_SIZE];
|
|
|
|
GetExeName(exe, sizeof(exe));
|
|
|
|
pid = fork();
|
|
|
|
if (pid == -1)
|
|
{
|
|
Print("fork Failed.\n");
|
|
return false;
|
|
}
|
|
|
|
if (pid == 0)
|
|
{
|
|
char *param = UNIX_ARG_EXIT;
|
|
char **args;
|
|
|
|
args = ZeroMalloc(sizeof(char *) * 3);
|
|
args[0] = exe;
|
|
args[1] = param;
|
|
args[2] = NULL;
|
|
|
|
setsid();
|
|
|
|
// Close the standard I/O
|
|
UnixCloseIO();
|
|
|
|
// Stop unwanted signals
|
|
signal(SIGHUP, SIG_IGN);
|
|
|
|
execvp(exe, args);
|
|
AbortExit();
|
|
}
|
|
else
|
|
{
|
|
int status = 0, ret;
|
|
|
|
// Wait for the termination of the child process
|
|
ret = waitpid(pid, &status, 0);
|
|
|
|
if (WIFEXITED(status) == 0)
|
|
{
|
|
// Aborted
|
|
Print("waitpid Failed: 0x%x\n", ret);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
#endif // OS_UNIX
|
|
|
|
return true;
|
|
}
|
|
|
|
// System checker
|
|
bool SystemCheck()
|
|
{
|
|
UINT i;
|
|
bool ng = false;
|
|
|
|
UniPrint(_UU("CHECK_TITLE"));
|
|
UniPrint(_UU("CHECK_NOTE"));
|
|
for (i = 0;i < sizeof(checker_procs) / sizeof(checker_procs[0]);i++)
|
|
{
|
|
wchar_t *title;
|
|
bool ret = false;
|
|
CHECKER_PROC *p = &checker_procs[i];
|
|
|
|
title = _UU(p->Title);
|
|
|
|
UniPrint(_UU("CHECK_EXEC_TAG"), title);
|
|
|
|
ret = p->Proc();
|
|
|
|
if (ret == false)
|
|
{
|
|
ng = true;
|
|
}
|
|
|
|
UniPrint(L" %s\n", ret ? _UU("CHECK_PASS") : _UU("CHECK_FAIL"));
|
|
}
|
|
|
|
UniPrint(L"\n");
|
|
if (ng == false)
|
|
{
|
|
UniPrint(L"%s\n\n", _UU("CHECK_RESULT_1"));
|
|
}
|
|
else
|
|
{
|
|
UniPrint(L"%s\n\n", _UU("CHECK_RESULT_2"));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
// Behavior checker
|
|
UINT PtCheck(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
UINT ret = ERR_NO_ERROR;
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (SystemCheck() == false)
|
|
{
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// VPN Tools main function
|
|
void PtMain(PT *pt)
|
|
{
|
|
char prompt[MAX_SIZE];
|
|
wchar_t tmp[MAX_SIZE];
|
|
// Validate arguments
|
|
if (pt == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Display a message that start-up is complete
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_TOOLS_CONNECTED"));
|
|
pt->Console->Write(pt->Console, tmp);
|
|
pt->Console->Write(pt->Console, L"");
|
|
|
|
while (true)
|
|
{
|
|
// Definition of command
|
|
CMD cmd[] =
|
|
{
|
|
{"About", PsAbout},
|
|
{"GenX25519", PtGenX25519},
|
|
{"GetPublicX25519", PtGetPublicX25519},
|
|
{"MakeCert", PtMakeCert},
|
|
{"MakeCert2048", PtMakeCert2048},
|
|
{"TrafficClient", PtTrafficClient},
|
|
{"TrafficServer", PtTrafficServer},
|
|
{"Check", PtCheck},
|
|
};
|
|
|
|
// Generate a prompt
|
|
StrCpy(prompt, sizeof(prompt), "VPN Tools>");
|
|
|
|
if (DispatchNextCmdEx(pt->Console, pt->CmdLine, prompt, cmd, sizeof(cmd) / sizeof(cmd[0]), pt) == false)
|
|
{
|
|
break;
|
|
}
|
|
pt->LastError = pt->Console->RetCode;
|
|
|
|
if (pt->LastError == ERR_NO_ERROR && pt->Console->ConsoleType != CONSOLE_CSV)
|
|
{
|
|
pt->Console->Write(pt->Console, _UU("CMD_MSG_OK"));
|
|
pt->Console->Write(pt->Console, L"");
|
|
}
|
|
|
|
if (pt->CmdLine != NULL)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Create a VPN Tools context
|
|
PT *NewPt(CONSOLE *c, wchar_t *cmdline)
|
|
{
|
|
PT *pt;
|
|
// Validate arguments
|
|
if (c == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
if (UniIsEmptyStr(cmdline))
|
|
{
|
|
cmdline = NULL;
|
|
}
|
|
|
|
pt = ZeroMalloc(sizeof(PT));
|
|
pt->Console = c;
|
|
pt->CmdLine = CopyUniStr(cmdline);
|
|
|
|
return pt;
|
|
}
|
|
|
|
// Release the VPN Tools context
|
|
void FreePt(PT *pt)
|
|
{
|
|
// Validate arguments
|
|
if (pt == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Free(pt->CmdLine);
|
|
Free(pt);
|
|
}
|
|
|
|
// Start VPN Tools
|
|
UINT PtConnect(CONSOLE *c, wchar_t *cmdline)
|
|
{
|
|
PT *pt;
|
|
UINT ret = 0;
|
|
// Validate arguments
|
|
if (c == NULL)
|
|
{
|
|
return ERR_INTERNAL_ERROR;
|
|
}
|
|
|
|
pt = NewPt(c, cmdline);
|
|
|
|
PtMain(pt);
|
|
|
|
ret = pt->LastError;
|
|
|
|
FreePt(pt);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Initialize the execution path information of vpncmd command
|
|
void VpnCmdInitBootPath()
|
|
{
|
|
#ifdef OS_WIN32
|
|
char exe_path[MAX_PATH];
|
|
char tmp[MAX_PATH];
|
|
GetExeName(exe_path, sizeof(exe_path));
|
|
|
|
if (SearchStrEx(exe_path, "ham.exe", 0, false) != INFINITE)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (MsIsAdmin())
|
|
{
|
|
UINT current_ver;
|
|
|
|
// Get the version of vpncmd that is currently installed
|
|
current_ver = MsRegReadInt(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER);
|
|
|
|
if ((CEDAR_VERSION_BUILD >= current_ver) ||
|
|
MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)
|
|
{
|
|
bool b = false;
|
|
// Copy the vpncmdsys.exe to system32
|
|
Format(tmp, sizeof(tmp), "%s\\vpncmd.exe", MsGetSystem32Dir());
|
|
|
|
if (MsIs64BitWindows() == false || Is64())
|
|
{
|
|
if (IsFile(tmp) == false || (CEDAR_VERSION_BUILD > current_ver) || MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)
|
|
{
|
|
b = FileCopy(VPNCMD_BOOTSTRAP_FILENAME, tmp);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
void *wow = MsDisableWow64FileSystemRedirection();
|
|
|
|
if (IsFile(tmp) == false || (CEDAR_VERSION_BUILD > current_ver) || MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)
|
|
{
|
|
b = FileCopy(VPNCMD_BOOTSTRAP_FILENAME, tmp);
|
|
}
|
|
|
|
MsRestoreWow64FileSystemRedirection(wow);
|
|
|
|
if (IsFile(tmp) == false || (CEDAR_VERSION_BUILD > current_ver) || MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)
|
|
{
|
|
b = FileCopy(VPNCMD_BOOTSTRAP_FILENAME, tmp);
|
|
}
|
|
}
|
|
|
|
// Because the currently running prompt is newer version, overwrite the registry
|
|
if (MsIs64BitWindows() == false)
|
|
{
|
|
MsRegWriteStr(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH, exe_path);
|
|
MsRegWriteInt(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER, CEDAR_VERSION_BUILD);
|
|
}
|
|
else
|
|
{
|
|
MsRegWriteStrEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH, exe_path, true, false);
|
|
MsRegWriteIntEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER, CEDAR_VERSION_BUILD, true, false);
|
|
|
|
MsRegWriteStrEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH, exe_path, false, true);
|
|
MsRegWriteIntEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER, CEDAR_VERSION_BUILD, false, true);
|
|
}
|
|
}
|
|
}
|
|
#endif // OS_WIN32
|
|
}
|
|
|
|
// Show the string
|
|
void TtPrint(void *param, TT_PRINT_PROC *print_proc, wchar_t *str)
|
|
{
|
|
// Validate arguments
|
|
if (print_proc == NULL || str == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
print_proc(param, str);
|
|
}
|
|
|
|
// Generate new random data
|
|
void TtGenerateRandomData(UCHAR **buf, UINT *size)
|
|
{
|
|
UCHAR *tmp;
|
|
UINT sz;
|
|
UINT i;
|
|
// Validate arguments
|
|
if (buf == NULL || size == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
sz = TRAFFIC_BUF_SIZE;
|
|
tmp = Malloc(sz);
|
|
for (i = 0;i < sz;i++)
|
|
{
|
|
tmp[i] = rand() % 256;
|
|
|
|
if (tmp[i] == '!')
|
|
{
|
|
tmp[i] = '_';
|
|
}
|
|
}
|
|
|
|
*buf = tmp;
|
|
*size = sz;
|
|
}
|
|
|
|
// Communication throughput measurement server worker thread
|
|
void TtsWorkerThread(THREAD *thread, void *param)
|
|
{
|
|
TTS *tts;
|
|
TTS_WORKER *w;
|
|
UINT buf_size;
|
|
UCHAR *send_buf_data, *recv_buf_data;
|
|
bool all_sockets_blocked = false;
|
|
UINT64 tmp64;
|
|
LIST *o;
|
|
UINT i;
|
|
wchar_t tmp[MAX_SIZE];
|
|
bool dont_block_next_time = false;
|
|
char *ver_str = TRAFFIC_VER_STR;
|
|
// Validate arguments
|
|
if (thread == NULL || param == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Allocate the data area
|
|
TtGenerateRandomData(&send_buf_data, &buf_size);
|
|
TtGenerateRandomData(&recv_buf_data, &buf_size);
|
|
|
|
w = (TTS_WORKER *)param;
|
|
tts = (TTS *)w->Tts;
|
|
|
|
// Preparation of socket events
|
|
w->SockEvent = NewSockEvent();
|
|
AddRef(w->SockEvent->ref);
|
|
|
|
// Preparing the Server socket list
|
|
w->TtsSockList = NewList(NULL);
|
|
|
|
// Notify completion of preparation to parent thread
|
|
NoticeThreadInit(thread);
|
|
|
|
o = NewList(NULL);
|
|
|
|
while (tts->Halt == false)
|
|
{
|
|
UINT64 now = Tick64();
|
|
|
|
// Wait for all sockets
|
|
if (dont_block_next_time == false)
|
|
{
|
|
WaitSockEvent(w->SockEvent, 50);
|
|
}
|
|
dont_block_next_time = false;
|
|
|
|
// Process for sockets that are currently registered
|
|
LockList(w->TtsSockList);
|
|
{
|
|
UINT i;
|
|
|
|
all_sockets_blocked = false;
|
|
|
|
// Continue to send and receive data
|
|
// until all sockets become block state
|
|
while (all_sockets_blocked == false)
|
|
{
|
|
all_sockets_blocked = true;
|
|
|
|
for (i = 0;i < LIST_NUM(w->TtsSockList);i++)
|
|
{
|
|
UINT ret = SOCK_LATER;
|
|
UCHAR *send_data = NULL, *recv_data = NULL;
|
|
UINT send_size = 0, recv_size = 0;
|
|
TTS_SOCK *ts = LIST_DATA(w->TtsSockList, i);
|
|
bool blocked_for_this_socket = false;
|
|
|
|
if (ts->SockJoined == false)
|
|
{
|
|
JoinSockToSockEvent(ts->Sock, w->SockEvent);
|
|
ts->SockJoined = true;
|
|
}
|
|
|
|
switch (ts->State)
|
|
{
|
|
case 0:
|
|
// Return the version string
|
|
ret = Send(ts->Sock, ver_str, TRAFFIC_VER_STR_SIZE, false);
|
|
if (ret != 0 && ret != SOCK_LATER)
|
|
{
|
|
ts->State = 5;
|
|
ts->LastCommTime = now;
|
|
}
|
|
break;
|
|
|
|
case 5:
|
|
// Receive the direction from the client
|
|
ret = Recv(ts->Sock, recv_buf_data, buf_size, false);
|
|
if (ret != 0 && ret != SOCK_LATER)
|
|
{
|
|
UCHAR c;
|
|
|
|
ts->LastCommTime = now;
|
|
|
|
// Direction of the data is in the first byte that is received
|
|
c = recv_buf_data[0];
|
|
|
|
if (c == 0)
|
|
{
|
|
// In the case of 0, Client -> Server
|
|
ts->State = 1;
|
|
}
|
|
else
|
|
{
|
|
// Otherwise Server -> Client
|
|
ts->State = 2;
|
|
}
|
|
|
|
if (ret >= (sizeof(UINT64) + sizeof(UINT64) + 1))
|
|
{
|
|
// Session ID
|
|
ts->SessionId = READ_UINT64(recv_buf_data + 1);
|
|
|
|
// Span
|
|
ts->Span = READ_UINT64(recv_buf_data + sizeof(UINT64) + 1);
|
|
|
|
ts->GiveupSpan = ts->Span * 3ULL + 180000ULL;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 1:
|
|
// Client -> Server
|
|
ret = Recv(ts->Sock, recv_buf_data, buf_size, false);
|
|
|
|
if (ret != 0 && ret != SOCK_LATER)
|
|
{
|
|
// Checking the first byte of received
|
|
UCHAR c = recv_buf_data[0];
|
|
|
|
ts->LastCommTime = now;
|
|
|
|
if (ts->FirstRecvTick == 0)
|
|
{
|
|
// Record the time at which the data has been received for the first
|
|
ts->FirstRecvTick = now;
|
|
}
|
|
else
|
|
{
|
|
// Check whether the span didn't finish yet
|
|
if (ts->FirstRecvTick <= now)
|
|
{
|
|
if (ts->Span != 0)
|
|
{
|
|
UINT64 giveup_tick = ts->FirstRecvTick + ts->Span;
|
|
|
|
if (now > giveup_tick)
|
|
{
|
|
// Span has expired
|
|
c = '!';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (c == '!')
|
|
{
|
|
// Notice the size information from the server to the client
|
|
ts->State = 3;
|
|
Debug("!");
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
// Server -> Client
|
|
if (ts->NoMoreSendData == false)
|
|
{
|
|
ret = Send(ts->Sock, send_buf_data, buf_size, false);
|
|
|
|
if (ret != 0 && ret != SOCK_LATER)
|
|
{
|
|
ts->LastCommTime = now;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ret = Recv(ts->Sock, recv_buf_data, buf_size, false);
|
|
|
|
if (ret != 0 && ret != SOCK_LATER)
|
|
{
|
|
ts->LastCommTime = now;
|
|
}
|
|
}
|
|
|
|
if (ts->FirstSendTick == 0)
|
|
{
|
|
ts->FirstSendTick = now;
|
|
}
|
|
else
|
|
{
|
|
if (ts->FirstSendTick <= now)
|
|
{
|
|
if (ts->Span != 0)
|
|
{
|
|
UINT64 giveup_tick = ts->FirstSendTick + ts->Span * 3ULL + 180000ULL;
|
|
|
|
if (now > giveup_tick)
|
|
{
|
|
ret = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case 3:
|
|
// Notice the size information from the server to the client
|
|
tmp64 = Endian64(ts->NumBytes);
|
|
|
|
(void)Recv(ts->Sock, recv_buf_data, buf_size, false);
|
|
|
|
if (ts->LastWaitTick == 0 || ts->LastWaitTick <= Tick64())
|
|
{
|
|
ret = Send(ts->Sock, &tmp64, sizeof(tmp64), false);
|
|
|
|
if (ret != 0 && ret != SOCK_LATER)
|
|
{
|
|
ts->LastCommTime = now;
|
|
}
|
|
|
|
if (ret != SOCK_LATER)
|
|
{
|
|
UINT j;
|
|
|
|
ts->LastWaitTick = Tick64() + 100;
|
|
|
|
if (ts->SessionId != 0)
|
|
{
|
|
// Not to send more data to the socket of the
|
|
// transmission direction in the same session ID
|
|
for (j = 0;j < LIST_NUM(w->TtsSockList);j++)
|
|
{
|
|
TTS_SOCK *ts2 = LIST_DATA(w->TtsSockList, j);
|
|
|
|
if (ts2->SessionId == ts->SessionId &&
|
|
ts2 != ts)
|
|
{
|
|
ts2->NoMoreSendData = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (now > (ts->LastCommTime + ts->GiveupSpan))
|
|
{
|
|
// Timeout: disconnect orphan sessions
|
|
ret = 0;
|
|
}
|
|
|
|
if (ret == 0)
|
|
{
|
|
// Mark as deleting the socket because it is disconnected
|
|
Insert(o, ts);
|
|
}
|
|
else if (ret == SOCK_LATER)
|
|
{
|
|
// Delay has occurred
|
|
blocked_for_this_socket = true;
|
|
dont_block_next_time = false;
|
|
}
|
|
else
|
|
{
|
|
if (ts->State == 1)
|
|
{
|
|
ts->NumBytes += (UINT64)ret;
|
|
}
|
|
}
|
|
|
|
if (blocked_for_this_socket == false)
|
|
{
|
|
all_sockets_blocked = false;
|
|
}
|
|
}
|
|
|
|
if (LIST_NUM(o) != 0)
|
|
{
|
|
UINT i;
|
|
// One or more sockets is disconnected
|
|
for (i = 0;i < LIST_NUM(o);i++)
|
|
{
|
|
TTS_SOCK *ts = LIST_DATA(o, i);
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("TTS_DISCONNECTED"), ts->Id, ts->Sock->RemoteHostname);
|
|
TtPrint(tts->Param, tts->Print, tmp);
|
|
|
|
Disconnect(ts->Sock);
|
|
ReleaseSock(ts->Sock);
|
|
|
|
Delete(w->TtsSockList, ts);
|
|
|
|
Free(ts);
|
|
}
|
|
|
|
DeleteAll(o);
|
|
}
|
|
|
|
if (w->NewSocketArrived || tts->Halt)
|
|
{
|
|
w->NewSocketArrived = false;
|
|
all_sockets_blocked = true;
|
|
dont_block_next_time = true;
|
|
}
|
|
}
|
|
}
|
|
UnlockList(w->TtsSockList);
|
|
}
|
|
|
|
LockList(w->TtsSockList);
|
|
{
|
|
// Release the sockets of all remaining
|
|
for (i = 0;i < LIST_NUM(w->TtsSockList);i++)
|
|
{
|
|
TTS_SOCK *ts = LIST_DATA(w->TtsSockList, i);
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("TTS_DISCONNECT"), ts->Id, ts->Sock->RemoteHostname);
|
|
TtPrint(tts->Param, tts->Print, tmp);
|
|
|
|
Disconnect(ts->Sock);
|
|
ReleaseSock(ts->Sock);
|
|
|
|
Free(ts);
|
|
}
|
|
}
|
|
UnlockList(w->TtsSockList);
|
|
|
|
// Cleanup
|
|
ReleaseList(o);
|
|
ReleaseList(w->TtsSockList);
|
|
ReleaseSockEvent(w->SockEvent);
|
|
Free(send_buf_data);
|
|
Free(recv_buf_data);
|
|
}
|
|
|
|
// Accept thread for IPv6
|
|
void TtsIPv6AcceptThread(THREAD *thread, void *param)
|
|
{
|
|
TTS *tts = (TTS *)param;
|
|
// Validate arguments
|
|
if (tts == NULL || param == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
TtsAcceptProc(tts, tts->ListenSocketV6);
|
|
}
|
|
|
|
// Accept procedure
|
|
void TtsAcceptProc(TTS *tts, SOCK *listen_socket)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
UINT seed = 0;
|
|
// Validate arguments
|
|
if (tts == NULL || listen_socket == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
while (tts->Halt == false)
|
|
{
|
|
SOCK *s;
|
|
// Accept
|
|
s = Accept(listen_socket);
|
|
|
|
if (s == NULL)
|
|
{
|
|
if (tts->Halt == false)
|
|
{
|
|
SleepThread(10);
|
|
}
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
UINT num, i;
|
|
TTS_WORKER *w;
|
|
|
|
// Connected from the client
|
|
AcceptInitEx(s, true);
|
|
|
|
// Choose a worker thread
|
|
num = LIST_NUM(tts->WorkerList);
|
|
|
|
i = seed % num;
|
|
|
|
seed++;
|
|
|
|
w = LIST_DATA(tts->WorkerList, i);
|
|
|
|
w->NewSocketArrived = true;
|
|
LockList(w->TtsSockList);
|
|
{
|
|
TTS_SOCK *ts = ZeroMalloc(sizeof(TTS_SOCK));
|
|
|
|
ts->Id = (++tts->IdSeed);
|
|
ts->Sock = s;
|
|
|
|
ts->GiveupSpan = (UINT64)(10 * 60 * 1000);
|
|
ts->LastCommTime = Tick64();
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("TTS_ACCEPTED"), ts->Id,
|
|
s->RemoteHostname, s->RemotePort);
|
|
TtPrint(tts->Param, tts->Print, tmp);
|
|
|
|
Insert(w->TtsSockList, ts);
|
|
w->NewSocketArrived = true;
|
|
}
|
|
UnlockList(w->TtsSockList);
|
|
|
|
SetSockEvent(w->SockEvent);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Communication throughput measurement server wait thread
|
|
void TtsListenThread(THREAD *thread, void *param)
|
|
{
|
|
TTS *tts;
|
|
wchar_t tmp[MAX_SIZE];
|
|
// Validate arguments
|
|
if (thread == NULL || param == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
tts = (TTS *)param;
|
|
|
|
tts->ListenSocket = NULL;
|
|
tts->ListenSocket = ListenEx(tts->Port, false);
|
|
tts->ListenSocketV6 = ListenEx6(tts->Port, false);
|
|
|
|
if (tts->ListenSocket == NULL && tts->ListenSocketV6 == NULL)
|
|
{
|
|
// Failed to Listen
|
|
UniFormat(tmp, sizeof(tmp), _UU("TT_LISTEN_FAILED"), tts->Port);
|
|
TtPrint(tts->Param, tts->Print, tmp);
|
|
|
|
// Notify completion of preparation to parent thread
|
|
NoticeThreadInit(thread);
|
|
|
|
tts->ErrorCode = ERR_INTERNAL_ERROR;
|
|
}
|
|
else
|
|
{
|
|
UINT i, num_worker_threads;
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("TTS_LISTEN_STARTED"), tts->Port);
|
|
TtPrint(tts->Param, tts->Print, tmp);
|
|
|
|
if (tts->ListenSocketV6 != NULL)
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("TTS_LISTEN_STARTED_V6"), tts->Port);
|
|
TtPrint(tts->Param, tts->Print, tmp);
|
|
}
|
|
else
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("TTS_LISTEN_FAILED_V6"), tts->Port);
|
|
TtPrint(tts->Param, tts->Print, tmp);
|
|
}
|
|
|
|
if (tts->ListenSocket != NULL)
|
|
{
|
|
AddRef(tts->ListenSocket->ref);
|
|
}
|
|
if (tts->ListenSocketV6 != NULL)
|
|
{
|
|
AddRef(tts->ListenSocketV6->ref);
|
|
}
|
|
|
|
num_worker_threads = GetNumberOfCpu();
|
|
|
|
// Start the worker threads
|
|
for (i = 0;i < num_worker_threads;i++)
|
|
{
|
|
TTS_WORKER *w = ZeroMalloc(sizeof(TTS_WORKER));
|
|
|
|
w->Tts = tts;
|
|
w->WorkThread = NewThread(TtsWorkerThread, w);
|
|
WaitThreadInit(w->WorkThread);
|
|
|
|
Add(tts->WorkerList, w);
|
|
}
|
|
|
|
// Notify completion of preparation to parent thread
|
|
NoticeThreadInit(thread);
|
|
|
|
// Prepare for IPv6 Accept thread
|
|
tts->IPv6AcceptThread = NULL;
|
|
if (tts->ListenSocketV6 != NULL)
|
|
{
|
|
tts->IPv6AcceptThread = NewThread(TtsIPv6AcceptThread, tts);
|
|
}
|
|
|
|
TtsAcceptProc(tts, tts->ListenSocket);
|
|
|
|
if (tts->IPv6AcceptThread != NULL)
|
|
{
|
|
WaitThread(tts->IPv6AcceptThread, INFINITE);
|
|
ReleaseThread(tts->IPv6AcceptThread);
|
|
}
|
|
|
|
TtPrint(tts->Param, tts->Print, _UU("TTS_LISTEN_STOP"));
|
|
|
|
ReleaseSock(tts->ListenSocket);
|
|
ReleaseSock(tts->ListenSocketV6);
|
|
|
|
for (i = 0;i < LIST_NUM(tts->WorkerList);i++)
|
|
{
|
|
TTS_WORKER *w = LIST_DATA(tts->WorkerList, i);
|
|
|
|
SetSockEvent(w->SockEvent);
|
|
|
|
// Wait for stopping the worker thread
|
|
WaitThread(w->WorkThread, INFINITE);
|
|
ReleaseThread(w->WorkThread);
|
|
ReleaseSockEvent(w->SockEvent);
|
|
|
|
Free(w);
|
|
}
|
|
}
|
|
}
|
|
|
|
// String of the direction in which data flows
|
|
wchar_t *GetTtcTypeStr(UINT type)
|
|
{
|
|
switch (type)
|
|
{
|
|
case TRAFFIC_TYPE_DOWNLOAD:
|
|
return _UU("TTC_TYPE_DOWNLOAD");
|
|
|
|
case TRAFFIC_TYPE_UPLOAD:
|
|
return _UU("TTC_TYPE_UPLOAD");
|
|
|
|
default:
|
|
return _UU("TTC_TYPE_FULL");
|
|
}
|
|
}
|
|
|
|
// Show a Summary
|
|
void TtcPrintSummary(TTC *ttc)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
wchar_t *tag = L"%-35s %s";
|
|
// Validate arguments
|
|
if (ttc == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
TtPrint(ttc->Param, ttc->Print, L"");
|
|
TtPrint(ttc->Param, ttc->Print, _UU("TTC_SUMMARY_BAR"));
|
|
TtPrint(ttc->Param, ttc->Print, _UU("TTC_SUMMARY_TITLE"));
|
|
TtPrint(ttc->Param, ttc->Print, L"");
|
|
|
|
// Destination host name
|
|
StrToUni(tmp2, sizeof(tmp2), ttc->Host);
|
|
UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_HOST"), tmp2);
|
|
TtPrint(ttc->Param, ttc->Print, tmp);
|
|
|
|
// Destination TCP port number
|
|
UniToStru(tmp2, ttc->Port);
|
|
UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_PORT"), tmp2);
|
|
TtPrint(ttc->Param, ttc->Print, tmp);
|
|
|
|
// Number of TCP connections to establish
|
|
UniToStru(tmp2, ttc->NumTcp);
|
|
UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_NUMTCP"), tmp2);
|
|
TtPrint(ttc->Param, ttc->Print, tmp);
|
|
|
|
// Data transmission direction
|
|
UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_TYPE"), GetTtcTypeStr(ttc->Type));
|
|
TtPrint(ttc->Param, ttc->Print, tmp);
|
|
|
|
// Data transmission span
|
|
UniFormat(tmp2, sizeof(tmp2), _UU("TTC_SPAN_STR"), (double)(ttc->Span) / 1000.0);
|
|
UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_SPAN"), tmp2);
|
|
TtPrint(ttc->Param, ttc->Print, tmp);
|
|
|
|
// Correct the data for Ethernet frame
|
|
UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_ETHER"), ttc->Raw ? _UU("SEC_NO") : _UU("SEC_YES"));
|
|
TtPrint(ttc->Param, ttc->Print, tmp);
|
|
|
|
// Measure the total amount of input and output throughput of relay equipment
|
|
UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_DOUBLE"), ttc->Double ? _UU("SEC_YES") : _UU("SEC_NO"));
|
|
TtPrint(ttc->Param, ttc->Print, tmp);
|
|
|
|
TtPrint(ttc->Param, ttc->Print, _UU("TTC_SUMMARY_BAR"));
|
|
TtPrint(ttc->Param, ttc->Print, L"");
|
|
}
|
|
|
|
// Stop the communication throughput measurement client
|
|
void StopTtc(TTC *ttc)
|
|
{
|
|
// Validate arguments
|
|
if (ttc == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
TtPrint(ttc->Param, ttc->Print, _UU("TTC_STOPPING"));
|
|
|
|
ttc->Halt = true;
|
|
}
|
|
|
|
// Generate a result
|
|
void TtcGenerateResult(TTC *ttc)
|
|
{
|
|
TT_RESULT *res;
|
|
UINT i;
|
|
// Validate arguments
|
|
if (ttc == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
res = &ttc->Result;
|
|
|
|
Zero(res, sizeof(TT_RESULT));
|
|
|
|
res->Raw = ttc->Raw;
|
|
res->Double = ttc->Double;
|
|
res->Span = ttc->RealSpan;
|
|
|
|
for (i = 0;i < LIST_NUM(ttc->ItcSockList);i++)
|
|
{
|
|
TTC_SOCK *ts = LIST_DATA(ttc->ItcSockList, i);
|
|
|
|
if (ts->Download == false)
|
|
{
|
|
// Upload
|
|
res->NumBytesUpload += ts->NumBytes;
|
|
}
|
|
else
|
|
{
|
|
// Download
|
|
res->NumBytesDownload += ts->NumBytes;
|
|
}
|
|
}
|
|
|
|
if (res->Raw == false)
|
|
{
|
|
// Correct to match the Ethernet
|
|
res->NumBytesDownload = (UINT64)((double)res->NumBytesDownload * 1514.0 / 1460.0);
|
|
res->NumBytesUpload = (UINT64)((double)res->NumBytesUpload * 1514.0 / 1460.0);
|
|
}
|
|
|
|
res->NumBytesTotal = res->NumBytesDownload + res->NumBytesUpload;
|
|
|
|
// Measure the throughput
|
|
if (res->Span != 0)
|
|
{
|
|
res->BpsUpload = (UINT64)((double)res->NumBytesUpload * 8.0 / ((double)res->Span / 1000.0));
|
|
res->BpsDownload = (UINT64)((double)res->NumBytesDownload * 8.0 / ((double)res->Span / 1000.0));
|
|
}
|
|
|
|
if (res->Double)
|
|
{
|
|
res->BpsUpload *= 2ULL;
|
|
res->BpsDownload *= 2ULL;
|
|
}
|
|
|
|
res->BpsTotal = res->BpsUpload + res->BpsDownload;
|
|
}
|
|
|
|
// Client worker thread
|
|
void TtcWorkerThread(THREAD *thread, void *param)
|
|
{
|
|
TTC_WORKER *w;
|
|
TTC *ttc;
|
|
bool dont_block_next_time = false;
|
|
bool halting = false;
|
|
UINT64 halt_timeout = 0;
|
|
bool all_sockets_blocked;
|
|
wchar_t tmp[MAX_SIZE];
|
|
UCHAR *send_buf_data, *recv_buf_data;
|
|
UINT buf_size;
|
|
UINT64 tmp64;
|
|
|
|
if (thread == NULL || param == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
w = (TTC_WORKER *)param;
|
|
ttc = w->Ttc;
|
|
|
|
// Allocate the data area
|
|
TtGenerateRandomData(&send_buf_data, &buf_size);
|
|
TtGenerateRandomData(&recv_buf_data, &buf_size);
|
|
|
|
NoticeThreadInit(thread);
|
|
|
|
// Wait for start
|
|
Wait(w->StartEvent, INFINITE);
|
|
|
|
// Main loop
|
|
while (true)
|
|
{
|
|
UINT i;
|
|
|
|
if (dont_block_next_time == false)
|
|
{
|
|
WaitSockEvent(w->SockEvent, 50);
|
|
}
|
|
|
|
dont_block_next_time = false;
|
|
|
|
if (ttc->AbnormalTerminated)
|
|
{
|
|
// Abnormal termination occured
|
|
break;
|
|
}
|
|
|
|
if (ttc->Halt || ttc->end_tick <= Tick64() || (ttc->Cancel != NULL && (*ttc->Cancel)))
|
|
{
|
|
// End measurement
|
|
if (halting == false)
|
|
{
|
|
if (ttc->Halt || (ttc->Cancel != NULL && (*ttc->Cancel)))
|
|
{
|
|
if ((ttc->flag1++) == 0)
|
|
{
|
|
// User cancel
|
|
TtPrint(ttc->Param, ttc->Print, _UU("TTC_COMM_USER_CANCEL"));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Time elapsed
|
|
if ((ttc->flag2++) == 0)
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("TTC_COMM_END"),
|
|
(double)ttc->Span / 1000.0);
|
|
TtPrint(ttc->Param, ttc->Print, tmp);
|
|
}
|
|
}
|
|
|
|
if (ttc->RealSpan == 0)
|
|
{
|
|
ttc->RealSpan = Tick64() - ttc->start_tick;
|
|
}
|
|
|
|
halting = true;
|
|
|
|
// Wait for reporting data from the server
|
|
halt_timeout = Tick64() + 60000ULL;
|
|
}
|
|
}
|
|
|
|
if (halt_timeout != 0)
|
|
{
|
|
bool ok = true;
|
|
|
|
// Wait that all TCP connections to finish processing
|
|
for (i = 0;i < LIST_NUM(w->SockList);i++)
|
|
{
|
|
TTC_SOCK *ts = LIST_DATA(w->SockList, i);
|
|
|
|
if (ts->Download == false)
|
|
{
|
|
if (ts->ServerUploadReportReceived == false)
|
|
{
|
|
ok = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (ok)
|
|
{
|
|
// Measurement completed
|
|
w->Ok = true;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if (halt_timeout <= Tick64())
|
|
{
|
|
// An error occured
|
|
ttc->AbnormalTerminated = true;
|
|
ttc->ErrorCode = ERR_PROTOCOL_ERROR;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
all_sockets_blocked = false;
|
|
|
|
// Continue to send and receive data
|
|
// until all sockets become block state
|
|
while (all_sockets_blocked == false)
|
|
{
|
|
all_sockets_blocked = true;
|
|
|
|
for (i = 0;i < LIST_NUM(w->SockList);i++)
|
|
{
|
|
UINT ret = SOCK_LATER;
|
|
TTC_SOCK *ts = LIST_DATA(w->SockList, i);
|
|
bool blocked_for_this_socket = false;
|
|
UCHAR c = 0;
|
|
UCHAR c_and_session_id[1 + sizeof(UINT64) + sizeof(UINT64)];
|
|
|
|
if (halt_timeout != 0)
|
|
{
|
|
if (ts->State != 3 && ts->State != 4)
|
|
{
|
|
if (ts->Download == false)
|
|
{
|
|
if (ts->State != 0)
|
|
{
|
|
ts->State = 3;
|
|
}
|
|
else
|
|
{
|
|
ts->ServerUploadReportReceived = true;
|
|
ts->State = 4;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ts->State = 4;
|
|
}
|
|
}
|
|
}
|
|
|
|
switch (ts->State)
|
|
{
|
|
case 0:
|
|
// Initial state: Specify the direction of
|
|
// the data flow between client-server
|
|
if (ts->Download)
|
|
{
|
|
c = 1;
|
|
}
|
|
else
|
|
{
|
|
c = 0;
|
|
}
|
|
|
|
c_and_session_id[0] = c;
|
|
WRITE_UINT64(c_and_session_id + 1, ttc->session_id);
|
|
WRITE_UINT64(c_and_session_id + sizeof(UINT64) + 1, ttc->Span);
|
|
|
|
ret = Send(ts->Sock, c_and_session_id, 1 + sizeof(UINT64) + sizeof(UINT64), false);
|
|
|
|
if (ret != 0 && ret != SOCK_LATER)
|
|
{
|
|
if (ts->Download)
|
|
{
|
|
ts->State = 1;
|
|
}
|
|
else
|
|
{
|
|
ts->State = 2;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 1:
|
|
// Server -> Client (download)
|
|
ret = Recv(ts->Sock, recv_buf_data, buf_size, false);
|
|
break;
|
|
|
|
case 2:
|
|
// Client -> Server (upload)
|
|
ret = Send(ts->Sock, send_buf_data, buf_size, false);
|
|
break;
|
|
|
|
case 3:
|
|
// Transmission completion client -> server (upload)
|
|
// Request the data size
|
|
if (ts->NextSendRequestReportTick == 0 ||
|
|
(Tick64() >= ts->NextSendRequestReportTick))
|
|
{
|
|
UCHAR suprise[MAX_SIZE];
|
|
UINT i;
|
|
|
|
ts->NextSendRequestReportTick = Tick64() + 200ULL;
|
|
|
|
for (i = 0;i < sizeof(suprise);i++)
|
|
{
|
|
suprise[i] = '!';
|
|
}
|
|
|
|
(void)Send(ts->Sock, suprise, sizeof(suprise), false);
|
|
}
|
|
|
|
ret = Recv(ts->Sock, &tmp64, sizeof(tmp64), false);
|
|
if (ret != 0 && ret != SOCK_LATER && ret == sizeof(tmp64))
|
|
{
|
|
ts->NumBytes = Endian64(tmp64);
|
|
|
|
ts->ServerUploadReportReceived = true;
|
|
|
|
ts->State = 4;
|
|
}
|
|
break;
|
|
|
|
case 4:
|
|
// Do Nothing
|
|
if (Recv(ts->Sock, recv_buf_data, buf_size, false) == SOCK_LATER)
|
|
{
|
|
ret = SOCK_LATER;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (ret == 0)
|
|
{
|
|
// The socket is disconnected
|
|
ttc->AbnormalTerminated = true;
|
|
ttc->ErrorCode = ERR_PROTOCOL_ERROR;
|
|
blocked_for_this_socket = true;
|
|
dont_block_next_time = false;
|
|
|
|
if (ts->HideErrMsg == false)
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("TTC_COMM_DISCONNECTED"), ts->Id);
|
|
TtPrint(ttc->Param, ttc->Print, tmp);
|
|
ts->HideErrMsg = true;
|
|
}
|
|
}
|
|
else if (ret == SOCK_LATER)
|
|
{
|
|
// Delay has occurred
|
|
blocked_for_this_socket = true;
|
|
dont_block_next_time = false;
|
|
}
|
|
else
|
|
{
|
|
if (ts->Download)
|
|
{
|
|
ts->NumBytes += (UINT64)ret;
|
|
}
|
|
}
|
|
|
|
if (blocked_for_this_socket == false)
|
|
{
|
|
all_sockets_blocked = false;
|
|
}
|
|
}
|
|
|
|
if (ttc->Halt || (ttc->Cancel != NULL && (*ttc->Cancel)))
|
|
{
|
|
all_sockets_blocked = true;
|
|
dont_block_next_time = true;
|
|
}
|
|
|
|
if (ttc->end_tick <= Tick64())
|
|
{
|
|
all_sockets_blocked = true;
|
|
dont_block_next_time = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
Free(send_buf_data);
|
|
Free(recv_buf_data);
|
|
}
|
|
|
|
// Client thread
|
|
void TtcThread(THREAD *thread, void *param)
|
|
{
|
|
TTC *ttc;
|
|
UINT i;
|
|
wchar_t tmp[MAX_SIZE];
|
|
bool ok = false;
|
|
IP ip_ret;
|
|
// Validate arguments
|
|
if (thread == NULL || param == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
ttc = (TTC *)param;
|
|
|
|
// Ready
|
|
NoticeThreadInit(thread);
|
|
|
|
TtcPrintSummary(ttc);
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_START"),
|
|
ttc->Host, ttc->Port, ttc->NumTcp);
|
|
TtPrint(ttc->Param, ttc->Print, tmp);
|
|
|
|
// Establish all connections to the client
|
|
ttc->ItcSockList = NewList(NULL);
|
|
|
|
ok = true;
|
|
|
|
Zero(&ip_ret, sizeof(ip_ret));
|
|
|
|
for (i = 0;i < ttc->NumTcp;i++)
|
|
{
|
|
SOCK *s;
|
|
TTC_SOCK *ts = ZeroMalloc(sizeof(TTC_SOCK));
|
|
char target_host[MAX_SIZE];
|
|
|
|
ts->Id = i + 1;
|
|
|
|
if (ttc->Type == TRAFFIC_TYPE_DOWNLOAD)
|
|
{
|
|
ts->Download = true;
|
|
}
|
|
else if (ttc->Type == TRAFFIC_TYPE_UPLOAD)
|
|
{
|
|
ts->Download = false;
|
|
}
|
|
else
|
|
{
|
|
ts->Download = ((i % 2) == 0) ? true : false;
|
|
}
|
|
|
|
StrCpy(target_host, sizeof(target_host), ttc->Host);
|
|
|
|
if (IsZeroIp(&ip_ret) == false)
|
|
{
|
|
IPToStr(target_host, sizeof(target_host), &ip_ret);
|
|
}
|
|
|
|
s = ConnectEx4(target_host, ttc->Port, 0, ttc->Cancel, NULL, NULL, false, true, &ip_ret);
|
|
|
|
if (s == NULL)
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_FAILED"), i + 1);
|
|
TtPrint(ttc->Param, ttc->Print, tmp);
|
|
ok = false;
|
|
Free(ts);
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
char buffer[TRAFFIC_VER_STR_SIZE];
|
|
|
|
SetTimeout(s, 5000);
|
|
|
|
Zero(buffer, sizeof(buffer));
|
|
if (Recv(s, buffer, sizeof(buffer), false) != sizeof(buffer) || Cmp(buffer, TRAFFIC_VER_STR, TRAFFIC_VER_STR_SIZE) != 0)
|
|
{
|
|
TtPrint(ttc->Param, ttc->Print, _UU("TTC_CONNECT_NOT_SERVER"));
|
|
ok = false;
|
|
ReleaseSock(s);
|
|
Free(ts);
|
|
break;
|
|
}
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_OK"), i + 1);
|
|
TtPrint(ttc->Param, ttc->Print, tmp);
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_OK_2"), GetTtcTypeStr(ts->Download ? TRAFFIC_TYPE_DOWNLOAD : TRAFFIC_TYPE_UPLOAD));
|
|
TtPrint(ttc->Param, ttc->Print, tmp);
|
|
|
|
ts->Sock = s;
|
|
|
|
SetTimeout(s, TIMEOUT_INFINITE);
|
|
}
|
|
|
|
Insert(ttc->ItcSockList, ts);
|
|
}
|
|
|
|
Set(ttc->InitedEvent);
|
|
|
|
if (ttc->StartEvent != NULL)
|
|
{
|
|
Wait(ttc->StartEvent, INFINITE);
|
|
SleepThread(500);
|
|
}
|
|
|
|
if (ok)
|
|
{
|
|
UINT64 start_tick, end_tick;
|
|
wchar_t tmp1[MAX_SIZE], tmp2[MAX_SIZE];
|
|
UINT64 session_id = Rand64();
|
|
UINT i, num_cpu;
|
|
bool all_ok = false;
|
|
|
|
ttc->session_id = session_id;
|
|
|
|
num_cpu = GetNumberOfCpu();
|
|
|
|
ttc->WorkerThreadList = NewList(NULL);
|
|
|
|
for (i = 0;i < num_cpu;i++)
|
|
{
|
|
TTC_WORKER *w = ZeroMalloc(sizeof(TTC_WORKER));
|
|
|
|
w->Ttc = ttc;
|
|
w->SockList = NewList(NULL);
|
|
w->StartEvent = NewEvent();
|
|
w->SockEvent = NewSockEvent();
|
|
|
|
w->WorkerThread = NewThread(TtcWorkerThread, w);
|
|
|
|
WaitThreadInit(w->WorkerThread);
|
|
|
|
Add(ttc->WorkerThreadList, w);
|
|
}
|
|
|
|
// Assign each of sockets to each of worker threads
|
|
for (i = 0;i < LIST_NUM(ttc->ItcSockList);i++)
|
|
{
|
|
TTC_SOCK *ts = LIST_DATA(ttc->ItcSockList, i);
|
|
UINT num = LIST_NUM(ttc->WorkerThreadList);
|
|
UINT j = i % num;
|
|
TTC_WORKER *w = LIST_DATA(ttc->WorkerThreadList, j);
|
|
|
|
Add(w->SockList, ts);
|
|
|
|
JoinSockToSockEvent(ts->Sock, w->SockEvent);
|
|
}
|
|
|
|
// Record the current time
|
|
start_tick = Tick64();
|
|
end_tick = start_tick + ttc->Span;
|
|
|
|
ttc->start_tick = start_tick;
|
|
ttc->end_tick = end_tick;
|
|
|
|
// Set the start event for all worker threads
|
|
for (i = 0;i < LIST_NUM(ttc->WorkerThreadList);i++)
|
|
{
|
|
TTC_WORKER *w = LIST_DATA(ttc->WorkerThreadList, i);
|
|
|
|
Set(w->StartEvent);
|
|
}
|
|
|
|
// Show start message
|
|
GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(TickToTime(start_tick)), NULL);
|
|
GetDateTimeStrEx64(tmp2, sizeof(tmp2), SystemToLocal64(TickToTime(end_tick)), NULL);
|
|
UniFormat(tmp, sizeof(tmp), _UU("TTC_COMM_START"), tmp1, tmp2);
|
|
TtPrint(ttc->Param, ttc->Print, tmp);
|
|
|
|
// Wait for all worker threads finish
|
|
all_ok = true;
|
|
for (i = 0;i < LIST_NUM(ttc->WorkerThreadList);i++)
|
|
{
|
|
TTC_WORKER *w = LIST_DATA(ttc->WorkerThreadList, i);
|
|
|
|
WaitThread(w->WorkerThread, INFINITE);
|
|
|
|
if (w->Ok == false)
|
|
{
|
|
all_ok = false;
|
|
}
|
|
}
|
|
|
|
if (all_ok)
|
|
{
|
|
// Measurement completed
|
|
// Show the result
|
|
TtcGenerateResult(ttc);
|
|
}
|
|
|
|
// Release worker threads
|
|
for (i = 0;i < LIST_NUM(ttc->WorkerThreadList);i++)
|
|
{
|
|
TTC_WORKER *w = LIST_DATA(ttc->WorkerThreadList, i);
|
|
|
|
ReleaseThread(w->WorkerThread);
|
|
|
|
ReleaseEvent(w->StartEvent);
|
|
ReleaseList(w->SockList);
|
|
|
|
ReleaseSockEvent(w->SockEvent);
|
|
|
|
Free(w);
|
|
}
|
|
|
|
ReleaseList(ttc->WorkerThreadList);
|
|
ttc->WorkerThreadList = NULL;
|
|
}
|
|
else
|
|
{
|
|
// Abort
|
|
TtPrint(ttc->Param, ttc->Print, _UU("TTC_ERROR_ABORTED"));
|
|
ttc->ErrorCode = ERR_CONNECT_FAILED;
|
|
}
|
|
|
|
// Cleanup
|
|
for (i = 0;i < LIST_NUM(ttc->ItcSockList);i++)
|
|
{
|
|
TTC_SOCK *ts = LIST_DATA(ttc->ItcSockList, i);
|
|
|
|
Disconnect(ts->Sock);
|
|
ReleaseSock(ts->Sock);
|
|
Free(ts);
|
|
}
|
|
|
|
ReleaseList(ttc->ItcSockList);
|
|
}
|
|
|
|
// Start the communication throughput measurement client
|
|
TTC *NewTtc(char *host, UINT port, UINT numtcp, UINT type, UINT64 span, bool dbl, bool raw, TT_PRINT_PROC *print_proc, void *param)
|
|
{
|
|
return NewTtcEx(host, port, numtcp, type, span, dbl, raw, print_proc, param, NULL, NULL);
|
|
}
|
|
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)
|
|
{
|
|
TTC *ttc;
|
|
|
|
ttc = ZeroMalloc(sizeof(TTC));
|
|
ttc->InitedEvent = NewEvent();
|
|
ttc->Port = port;
|
|
StrCpy(ttc->Host, sizeof(ttc->Host), host);
|
|
ttc->NumTcp = numtcp;
|
|
ttc->Type = type;
|
|
ttc->Span = span;
|
|
ttc->Double = dbl;
|
|
ttc->Raw = raw;
|
|
ttc->StartEvent = start_event;
|
|
ttc->Cancel = cancel;
|
|
|
|
if (ttc->Type == TRAFFIC_TYPE_FULL && ttc->NumTcp < 2)
|
|
{
|
|
ttc->NumTcp = 2;
|
|
}
|
|
|
|
ttc->Print = print_proc;
|
|
ttc->Param = param;
|
|
ttc->ErrorCode = ERR_NO_ERROR;
|
|
|
|
TtPrint(ttc->Param, ttc->Print, _UU("TTC_INIT"));
|
|
|
|
ttc->Thread = NewThread(TtcThread, ttc);
|
|
WaitThreadInit(ttc->Thread);
|
|
|
|
return ttc;
|
|
}
|
|
|
|
// Wait for stopping the communication throughput measurement client
|
|
UINT FreeTtc(TTC *ttc, TT_RESULT *result)
|
|
{
|
|
UINT ret;
|
|
// Validate arguments
|
|
if (ttc == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
WaitThread(ttc->Thread, INFINITE);
|
|
ReleaseThread(ttc->Thread);
|
|
|
|
TtPrint(ttc->Param, ttc->Print, _UU("TTC_FREE"));
|
|
|
|
ret = ttc->ErrorCode;
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
if (result != NULL)
|
|
{
|
|
Copy(result, &ttc->Result, sizeof(TT_RESULT));
|
|
}
|
|
}
|
|
|
|
ReleaseEvent(ttc->InitedEvent);
|
|
|
|
Free(ttc);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Start the communication throughput measurement server
|
|
TTS *NewTts(UINT port, void *param, TT_PRINT_PROC *print_proc)
|
|
{
|
|
TTS *tts;
|
|
THREAD *t;
|
|
|
|
tts = ZeroMalloc(sizeof(TTS));
|
|
tts->Port = port;
|
|
tts->Param = param;
|
|
tts->Print = print_proc;
|
|
|
|
TtPrint(param, print_proc, _UU("TTS_INIT"));
|
|
|
|
tts->WorkerList = NewList(NULL);
|
|
|
|
// Creating a thread
|
|
t = NewThread(TtsListenThread, tts);
|
|
WaitThreadInit(t);
|
|
|
|
tts->Thread = t;
|
|
|
|
return tts;
|
|
}
|
|
|
|
// Wait for stopping the communication throughput measurement server
|
|
UINT FreeTts(TTS *tts)
|
|
{
|
|
UINT ret;
|
|
// Validate arguments
|
|
if (tts == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
TtPrint(tts->Param, tts->Print, _UU("TTS_STOP_INIT"));
|
|
|
|
tts->Halt = true;
|
|
Disconnect(tts->ListenSocket);
|
|
ReleaseSock(tts->ListenSocket);
|
|
Disconnect(tts->ListenSocketV6);
|
|
ReleaseSock(tts->ListenSocketV6);
|
|
|
|
// Wait for the termination of the thread
|
|
WaitThread(tts->Thread, INFINITE);
|
|
|
|
ReleaseThread(tts->Thread);
|
|
|
|
TtPrint(tts->Param, tts->Print, _UU("TTS_STOP_FINISHED"));
|
|
|
|
ret = tts->ErrorCode;
|
|
|
|
ReleaseList(tts->WorkerList);
|
|
|
|
Free(tts);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Show the measurement tools prompt
|
|
void PtTrafficPrintProc(void *param, wchar_t *str)
|
|
{
|
|
CONSOLE *c;
|
|
// Validate arguments
|
|
if (param == NULL || str == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
c = (CONSOLE *)param;
|
|
|
|
if (c->ConsoleType == CONSOLE_LOCAL)
|
|
{
|
|
Lock(c->OutputLock);
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
// Display only if the local console
|
|
// (Can not be displayed because threads aren't synchronized otherwise?)
|
|
UniStrCpy(tmp, sizeof(tmp), str);
|
|
if (UniEndWith(str, L"\n") == false)
|
|
{
|
|
UniStrCat(tmp, sizeof(tmp), L"\n");
|
|
}
|
|
UniPrint(L"%s", tmp);
|
|
}
|
|
Unlock(c->OutputLock);
|
|
}
|
|
}
|
|
|
|
// Display the communication throughput results
|
|
void TtcPrintResult(CONSOLE *c, TT_RESULT *res)
|
|
{
|
|
CT *ct;
|
|
wchar_t tmp[MAX_SIZE];
|
|
wchar_t tmp1[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
char str[MAX_SIZE];
|
|
// Validate arguments
|
|
if (c == NULL || res == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
c->Write(c, _UU("TTC_RES_TITLE"));
|
|
|
|
ct = CtNew();
|
|
CtInsertColumn(ct, _UU("TTC_RES_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("TTC_RES_COLUMN_2"), true);
|
|
CtInsertColumn(ct, _UU("TTC_RES_COLUMN_3"), true);
|
|
|
|
// Time that was used to measure
|
|
GetSpanStrMilli(str, sizeof(str), res->Span);
|
|
StrToUni(tmp, sizeof(tmp), str);
|
|
CtInsert(ct, _UU("TTC_RES_SPAN"), tmp, L"");
|
|
|
|
// Correct the data for Ethernet frame
|
|
CtInsert(ct, _UU("TTC_RES_ETHER"), res->Raw ? _UU("SEC_NO") : _UU("SEC_YES"), L"");
|
|
|
|
// Amount of communication data of download direction
|
|
ToStr3(str, sizeof(str), res->NumBytesDownload);
|
|
UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);
|
|
ToStrByte1000(str, sizeof(str), res->NumBytesDownload);
|
|
StrToUni(tmp2, sizeof(tmp2), str);
|
|
CtInsert(ct, _UU("TTC_RES_BYTES_DOWNLOAD"), tmp1, tmp2);
|
|
|
|
// Amount of communication data of upload direction
|
|
ToStr3(str, sizeof(str), res->NumBytesUpload);
|
|
UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);
|
|
ToStrByte1000(str, sizeof(str), res->NumBytesUpload);
|
|
StrToUni(tmp2, sizeof(tmp2), str);
|
|
CtInsert(ct, _UU("TTC_RES_BYTES_UPLOAD"), tmp1, tmp2);
|
|
|
|
// Total amount of communication data
|
|
ToStr3(str, sizeof(str), res->NumBytesTotal);
|
|
UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);
|
|
ToStrByte1000(str, sizeof(str), res->NumBytesTotal);
|
|
StrToUni(tmp2, sizeof(tmp2), str);
|
|
CtInsert(ct, _UU("TTC_RES_BYTES_TOTAL"), tmp1, tmp2);
|
|
|
|
// Calculate the total throughput of input and output of the relay equipment
|
|
CtInsert(ct, _UU("TTC_RES_DOUBLE"), (res->Double == false) ? _UU("SEC_NO") : _UU("SEC_YES"), L"");
|
|
|
|
// Average throughput of download direction
|
|
ToStr3(str, sizeof(str), res->BpsDownload);
|
|
UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);
|
|
ToStrByte1000(str, sizeof(str), res->BpsDownload);
|
|
ReplaceStr(str, sizeof(str), str, "Bytes", "bps");
|
|
StrToUni(tmp2, sizeof(tmp2), str);
|
|
CtInsert(ct, _UU("TTC_RES_BPS_DOWNLOAD"), tmp1, tmp2);
|
|
|
|
// Average throughput of upload direction
|
|
ToStr3(str, sizeof(str), res->BpsUpload);
|
|
UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);
|
|
ToStrByte1000(str, sizeof(str), res->BpsUpload);
|
|
ReplaceStr(str, sizeof(str), str, "Bytes", "bps");
|
|
StrToUni(tmp2, sizeof(tmp2), str);
|
|
CtInsert(ct, _UU("TTC_RES_BPS_UPLOAD"), tmp1, tmp2);
|
|
|
|
// Total average throughput
|
|
ToStr3(str, sizeof(str), res->BpsTotal);
|
|
UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);
|
|
ToStrByte1000(str, sizeof(str), res->BpsTotal);
|
|
ReplaceStr(str, sizeof(str), str, "Bytes", "bps");
|
|
StrToUni(tmp2, sizeof(tmp2), str);
|
|
CtInsert(ct, _UU("TTC_RES_BPS_TOTAL"), tmp1, tmp2);
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
// Execute the communication throughput measurement tool server
|
|
UINT PtTrafficServer(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
UINT ret = ERR_NO_ERROR;
|
|
UINT port;
|
|
bool nohup;
|
|
TTS *tts;
|
|
PARAM args[] =
|
|
{
|
|
{"[port]", NULL, NULL, NULL, NULL},
|
|
{"NOHUP", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
port = GetParamInt(o, "[port]");
|
|
if (port == 0)
|
|
{
|
|
port = TRAFFIC_DEFAULT_PORT;
|
|
}
|
|
|
|
nohup = GetParamYes(o, "nohup");
|
|
|
|
tts = NewTts(port, c, PtTrafficPrintProc);
|
|
|
|
if (nohup)
|
|
{
|
|
while (true)
|
|
{
|
|
SleepThread(10000);
|
|
}
|
|
}
|
|
|
|
c->Write(c, _UU("TTS_ENTER_TO_EXIT"));
|
|
|
|
Free(c->ReadLine(c, L"", true));
|
|
|
|
ret = tts->ErrorCode;
|
|
|
|
FreeTts(tts);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Execute the communication throughput measurement tool client
|
|
UINT PtTrafficClient(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
TTC *ttc;
|
|
LIST *o;
|
|
UINT ret = ERR_NO_ERROR;
|
|
char *host = NULL;
|
|
UINT port;
|
|
UINT num, type;
|
|
bool dbl = false, raw = false;
|
|
UINT64 span;
|
|
// Parameter list that can be specified
|
|
CMD_EVAL_MIN_MAX minmax =
|
|
{
|
|
"CMD_TrafficClient_EVAL_NUMTCP",
|
|
0, TRAFFIC_NUMTCP_MAX,
|
|
};
|
|
PARAM args[] =
|
|
{
|
|
{"[host:port]", CmdPrompt, _UU("CMD_TrafficClient_PROMPT_HOST"), CmdEvalNotEmpty, NULL},
|
|
{"NUMTCP", NULL, NULL, CmdEvalMinMax, &minmax},
|
|
{"TYPE", NULL, NULL, NULL, NULL},
|
|
{"SPAN", NULL, NULL, NULL, NULL},
|
|
{"DOUBLE", NULL, NULL, NULL, NULL},
|
|
{"RAW", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (ParseHostPort(GetParamStr(o, "[host:port]"), &host, &port, TRAFFIC_DEFAULT_PORT) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_TrafficClient_ERROR_HOSTPORT"));
|
|
ret = ERR_INVALID_PARAMETER;
|
|
}
|
|
else
|
|
{
|
|
char *s;
|
|
UINT i;
|
|
|
|
Trim(host);
|
|
|
|
num = GetParamInt(o, "NUMTCP");
|
|
if (num == 0)
|
|
{
|
|
num = TRAFFIC_NUMTCP_DEFAULT;
|
|
}
|
|
s = GetParamStr(o, "TYPE");
|
|
|
|
if (StartWith("download", s))
|
|
{
|
|
type = TRAFFIC_TYPE_DOWNLOAD;
|
|
}
|
|
else if (StartWith("upload", s))
|
|
{
|
|
type = TRAFFIC_TYPE_UPLOAD;
|
|
}
|
|
else
|
|
{
|
|
type = TRAFFIC_TYPE_FULL;
|
|
}
|
|
|
|
i = GetParamInt(o, "SPAN");
|
|
|
|
if (i == 0)
|
|
{
|
|
i = TRAFFIC_SPAN_DEFAULT;
|
|
}
|
|
|
|
span = (UINT64)i * 1000ULL;
|
|
|
|
dbl = GetParamYes(o, "DOUBLE");
|
|
raw = GetParamYes(o, "RAW");
|
|
|
|
if (type == TRAFFIC_TYPE_FULL)
|
|
{
|
|
if ((num % 2) != 0)
|
|
{
|
|
ret = ERR_INVALID_PARAMETER;
|
|
c->Write(c, _UU("CMD_TrafficClient_ERROR_NUMTCP"));
|
|
}
|
|
}
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
TT_RESULT result;
|
|
ttc = NewTtc(host, port, num, type, span, dbl, raw, PtTrafficPrintProc, c);
|
|
|
|
if (c->ConsoleType == CONSOLE_LOCAL)
|
|
{
|
|
if (c->Param != NULL && (((LOCAL_CONSOLE_PARAM *)c->Param)->InBuf == NULL))
|
|
{
|
|
// c->Write(c, _UU("TTC_ENTER_TO_EXIT"));
|
|
// GetLine(NULL, 0);
|
|
// StopTtc(ttc);
|
|
}
|
|
}
|
|
|
|
|
|
Zero(&result, sizeof(result));
|
|
ret = FreeTtc(ttc, &result);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
TtcPrintResult(c, &result);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
Free(host);
|
|
|
|
return ret;
|
|
}
|
|
|
|
UINT PtGenX25519(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
UINT ret = ERR_INTERNAL_ERROR;
|
|
|
|
LIST *o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
EVP_PKEY *opaque = CryptoKeyOpaqueNew(KEY_X25519);
|
|
|
|
CRYPTO_KEY_RAW *private = NULL, *public = NULL;
|
|
const bool ok = CryptoKeyOpaqueToRaw(opaque, &private, &public);
|
|
CryptoKeyOpaqueFree(opaque);
|
|
|
|
if (ok == false)
|
|
{
|
|
goto FINAL;
|
|
}
|
|
|
|
char *base64 = Base64FromBin(NULL, private->Data, private->Size);
|
|
if (base64 == NULL)
|
|
{
|
|
goto FINAL;
|
|
}
|
|
|
|
wchar_t buf[MAX_SIZE];
|
|
UniFormat(buf, sizeof(buf), L"\n%s%S", _UU("CMD_GenX25519_PRIVATE_KEY"), base64);
|
|
Free(base64);
|
|
|
|
c->Write(c, buf);
|
|
|
|
base64 = Base64FromBin(NULL, public->Data, public->Size);
|
|
if (base64 == NULL)
|
|
{
|
|
goto FINAL;
|
|
}
|
|
|
|
UniFormat(buf, sizeof(buf), L"%s%S\n\n", _UU("CMD_GenX25519_PUBLIC_KEY"), base64);
|
|
Free(base64);
|
|
|
|
c->Write(c, buf);
|
|
|
|
ret = ERR_NO_ERROR;
|
|
FINAL:
|
|
CryptoKeyRawFree(private);
|
|
CryptoKeyRawFree(public);
|
|
FreeParamValueList(o);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
UINT PtGetPublicX25519(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
const PARAM args[] =
|
|
{
|
|
{"[private]", CmdPrompt, _UU("CMD_GetPublicX25519_PRIVATE_KEY"), CmdEvalNotEmpty, NULL}
|
|
};
|
|
|
|
LIST *o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
UINT ret = ERR_INVALID_PARAMETER;
|
|
|
|
UINT size;
|
|
char *base64 = GetParamStr(o, "[private]");
|
|
void *bin = Base64ToBin(&size, base64, StrLen(base64));
|
|
if (bin == NULL)
|
|
{
|
|
goto FINAL;
|
|
}
|
|
|
|
CRYPTO_KEY_RAW *private = CryptoKeyRawNew(bin, size, KEY_X25519);
|
|
Free(bin);
|
|
|
|
if (private == NULL)
|
|
{
|
|
goto FINAL;
|
|
}
|
|
|
|
ret = ERR_INTERNAL_ERROR;
|
|
|
|
CRYPTO_KEY_RAW *public = CryptoKeyRawPublic(private);
|
|
CryptoKeyRawFree(private);
|
|
|
|
if (public == NULL)
|
|
{
|
|
goto FINAL;
|
|
}
|
|
|
|
base64 = Base64FromBin(NULL, public->Data, public->Size);
|
|
CryptoKeyRawFree(public);
|
|
|
|
if (base64 == NULL)
|
|
{
|
|
goto FINAL;
|
|
}
|
|
|
|
wchar_t buf[MAX_SIZE];
|
|
UniFormat(buf, sizeof(buf), L"\n%s%S\n\n", _UU("CMD_GetPublicX25519_PUBLIC_KEY"), base64);
|
|
Free(base64);
|
|
|
|
c->Write(c, buf);
|
|
|
|
ret = ERR_NO_ERROR;
|
|
FINAL:
|
|
FreeParamValueList(o);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Certificate easy creation tool (1024 bit)
|
|
UINT PtMakeCert(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
UINT ret = ERR_NO_ERROR;
|
|
X *x = NULL;
|
|
K *pub = NULL;
|
|
K *pri = NULL;
|
|
NAME *n;
|
|
X_SERIAL *x_serial = NULL;
|
|
BUF *buf;
|
|
UINT days;
|
|
X *root_x = NULL;
|
|
K *root_k = NULL;
|
|
// Parameter list that can be specified
|
|
CMD_EVAL_MIN_MAX minmax =
|
|
{
|
|
"CMD_MakeCert_EVAL_EXPIRES",
|
|
0,
|
|
10950,
|
|
};
|
|
PARAM args[] =
|
|
{
|
|
{"CN", CmdPrompt, _UU("CMD_MakeCert_PROMPT_CN"), NULL, NULL},
|
|
{"O", CmdPrompt, _UU("CMD_MakeCert_PROMPT_O"), NULL, NULL},
|
|
{"OU", CmdPrompt, _UU("CMD_MakeCert_PROMPT_OU"), NULL, NULL},
|
|
{"C", CmdPrompt, _UU("CMD_MakeCert_PROMPT_C"), NULL, NULL},
|
|
{"ST", CmdPrompt, _UU("CMD_MakeCert_PROMPT_ST"), NULL, NULL},
|
|
{"L", CmdPrompt, _UU("CMD_MakeCert_PROMPT_L"), NULL, NULL},
|
|
{"SERIAL", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SERIAL"), NULL, NULL},
|
|
{"EXPIRES", CmdPrompt, _UU("CMD_MakeCert_PROMPT_EXPIRES"), CmdEvalMinMax, &minmax},
|
|
{"SIGNCERT", NULL, NULL, CmdEvalIsFile, NULL},
|
|
{"SIGNKEY", NULL, NULL, CmdEvalIsFile, NULL},
|
|
{"SAVECERT", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},
|
|
{"SAVEKEY", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVEKEY"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (IsEmptyStr(GetParamStr(o, "SIGNCERT")) == false && IsEmptyStr(GetParamStr(o, "SIGNKEY")) == false)
|
|
{
|
|
root_x = FileToXW(GetParamUniStr(o, "SIGNCERT"));
|
|
root_k = FileToKW(GetParamUniStr(o, "SIGNKEY"), true, NULL);
|
|
|
|
if (root_x == NULL || root_k == NULL || CheckXandK(root_x, root_k) == false)
|
|
{
|
|
ret = ERR_INTERNAL_ERROR;
|
|
|
|
c->Write(c, _UU("CMD_MakeCert_ERROR_SIGNKEY"));
|
|
}
|
|
}
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
buf = StrToBin(GetParamStr(o, "SERIAL"));
|
|
if (buf != NULL && buf->Size >= 1)
|
|
{
|
|
x_serial = NewXSerial(buf->Buf, buf->Size);
|
|
}
|
|
FreeBuf(buf);
|
|
|
|
n = NewName(GetParamUniStr(o, "CN"), GetParamUniStr(o, "O"), GetParamUniStr(o, "OU"),
|
|
GetParamUniStr(o, "C"), GetParamUniStr(o, "ST"), GetParamUniStr(o, "L"));
|
|
|
|
days = GetParamInt(o, "EXPIRES");
|
|
if (days == 0)
|
|
{
|
|
days = 3650;
|
|
}
|
|
|
|
RsaGen(&pri, &pub, 1024);
|
|
|
|
if (root_x == NULL)
|
|
{
|
|
x = NewRootX(pub, pri, n, days, x_serial);
|
|
}
|
|
else
|
|
{
|
|
x = NewX(pub, root_k, root_x, n, days, x_serial);
|
|
}
|
|
|
|
FreeXSerial(x_serial);
|
|
FreeName(n);
|
|
|
|
if (x == NULL)
|
|
{
|
|
ret = ERR_INTERNAL_ERROR;
|
|
c->Write(c, _UU("CMD_MakeCert_ERROR_GEN_FAILED"));
|
|
}
|
|
else
|
|
{
|
|
if (XToFileW(x, GetParamUniStr(o, "SAVECERT"), true) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_SAVECERT_FAILED"));
|
|
}
|
|
else if (KToFileW(pri, GetParamUniStr(o, "SAVEKEY"), true, NULL) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_SAVEKEY_FAILED"));
|
|
}
|
|
}
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
FreeX(root_x);
|
|
FreeK(root_k);
|
|
|
|
FreeX(x);
|
|
FreeK(pri);
|
|
FreeK(pub);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Certificate easy creation tool (2048 bit)
|
|
UINT PtMakeCert2048(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
UINT ret = ERR_NO_ERROR;
|
|
X *x = NULL;
|
|
K *pub = NULL;
|
|
K *pri = NULL;
|
|
NAME *n;
|
|
X_SERIAL *x_serial = NULL;
|
|
BUF *buf;
|
|
UINT days;
|
|
X *root_x = NULL;
|
|
K *root_k = NULL;
|
|
// Parameter list that can be specified
|
|
CMD_EVAL_MIN_MAX minmax =
|
|
{
|
|
"CMD_MakeCert_EVAL_EXPIRES",
|
|
0,
|
|
10950,
|
|
};
|
|
PARAM args[] =
|
|
{
|
|
{"CN", CmdPrompt, _UU("CMD_MakeCert_PROMPT_CN"), NULL, NULL},
|
|
{"O", CmdPrompt, _UU("CMD_MakeCert_PROMPT_O"), NULL, NULL},
|
|
{"OU", CmdPrompt, _UU("CMD_MakeCert_PROMPT_OU"), NULL, NULL},
|
|
{"C", CmdPrompt, _UU("CMD_MakeCert_PROMPT_C"), NULL, NULL},
|
|
{"ST", CmdPrompt, _UU("CMD_MakeCert_PROMPT_ST"), NULL, NULL},
|
|
{"L", CmdPrompt, _UU("CMD_MakeCert_PROMPT_L"), NULL, NULL},
|
|
{"SERIAL", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SERIAL"), NULL, NULL},
|
|
{"EXPIRES", CmdPrompt, _UU("CMD_MakeCert_PROMPT_EXPIRES"), CmdEvalMinMax, &minmax},
|
|
{"SIGNCERT", NULL, NULL, CmdEvalIsFile, NULL},
|
|
{"SIGNKEY", NULL, NULL, CmdEvalIsFile, NULL},
|
|
{"SAVECERT", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},
|
|
{"SAVEKEY", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVEKEY"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (IsEmptyStr(GetParamStr(o, "SIGNCERT")) == false && IsEmptyStr(GetParamStr(o, "SIGNKEY")) == false)
|
|
{
|
|
root_x = FileToXW(GetParamUniStr(o, "SIGNCERT"));
|
|
root_k = FileToKW(GetParamUniStr(o, "SIGNKEY"), true, NULL);
|
|
|
|
if (root_x == NULL || root_k == NULL || CheckXandK(root_x, root_k) == false)
|
|
{
|
|
ret = ERR_INTERNAL_ERROR;
|
|
|
|
c->Write(c, _UU("CMD_MakeCert_ERROR_SIGNKEY"));
|
|
}
|
|
}
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
buf = StrToBin(GetParamStr(o, "SERIAL"));
|
|
if (buf != NULL && buf->Size >= 1)
|
|
{
|
|
x_serial = NewXSerial(buf->Buf, buf->Size);
|
|
}
|
|
FreeBuf(buf);
|
|
|
|
n = NewName(GetParamUniStr(o, "CN"), GetParamUniStr(o, "O"), GetParamUniStr(o, "OU"),
|
|
GetParamUniStr(o, "C"), GetParamUniStr(o, "ST"), GetParamUniStr(o, "L"));
|
|
|
|
days = GetParamInt(o, "EXPIRES");
|
|
if (days == 0)
|
|
{
|
|
days = 3650;
|
|
}
|
|
|
|
RsaGen(&pri, &pub, 2048);
|
|
|
|
if (root_x == NULL)
|
|
{
|
|
x = NewRootX(pub, pri, n, days, x_serial);
|
|
}
|
|
else
|
|
{
|
|
x = NewX(pub, root_k, root_x, n, days, x_serial);
|
|
}
|
|
|
|
FreeXSerial(x_serial);
|
|
FreeName(n);
|
|
|
|
if (x == NULL)
|
|
{
|
|
ret = ERR_INTERNAL_ERROR;
|
|
c->Write(c, _UU("CMD_MakeCert_ERROR_GEN_FAILED"));
|
|
}
|
|
else
|
|
{
|
|
if (XToFileW(x, GetParamUniStr(o, "SAVECERT"), true) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_SAVECERT_FAILED"));
|
|
}
|
|
else if (KToFileW(pri, GetParamUniStr(o, "SAVEKEY"), true, NULL) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_SAVEKEY_FAILED"));
|
|
}
|
|
}
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
FreeX(root_x);
|
|
FreeK(root_k);
|
|
|
|
FreeX(x);
|
|
FreeK(pri);
|
|
FreeK(pub);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Client management tool main
|
|
void PcMain(PC *pc)
|
|
{
|
|
char prompt[MAX_SIZE];
|
|
wchar_t tmp[MAX_SIZE];
|
|
// Validate arguments
|
|
if (pc == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Display a message that the connection has been made
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_CLIENT_CONNECTED"),
|
|
pc->ServerName);
|
|
pc->Console->Write(pc->Console, tmp);
|
|
pc->Console->Write(pc->Console, L"");
|
|
|
|
while (true)
|
|
{
|
|
// Definition of command
|
|
CMD cmd[] =
|
|
{
|
|
{"About", PsAbout},
|
|
{"Check", PtCheck},
|
|
{"VersionGet", PcVersionGet},
|
|
{"PasswordSet", PcPasswordSet},
|
|
{"PasswordGet", PcPasswordGet},
|
|
{"CertList", PcCertList},
|
|
{"CertAdd", PcCertAdd},
|
|
{"CertDelete", PcCertDelete},
|
|
{"CertGet", PcCertGet},
|
|
{"SecureList", PcSecureList},
|
|
{"SecureSelect", PcSecureSelect},
|
|
{"SecureGet", PcSecureGet},
|
|
{"NicCreate", PcNicCreate},
|
|
{"NicDelete", PcNicDelete},
|
|
{"NicUpgrade", PcNicUpgrade},
|
|
{"NicGetSetting", PcNicGetSetting},
|
|
{"NicSetSetting", PcNicSetSetting},
|
|
{"NicEnable", PcNicEnable},
|
|
{"NicDisable", PcNicDisable},
|
|
{"NicList", PcNicList},
|
|
{"AccountList", PcAccountList},
|
|
{"AccountCreate", PcAccountCreate},
|
|
{"AccountSet", PcAccountSet},
|
|
{"AccountGet", PcAccountGet},
|
|
{"AccountDelete", PcAccountDelete},
|
|
{"AccountUsernameSet", PcAccountUsernameSet},
|
|
{"AccountAnonymousSet", PcAccountAnonymousSet},
|
|
{"AccountPasswordSet", PcAccountPasswordSet},
|
|
{"AccountCertSet", PcAccountCertSet},
|
|
{"AccountCertGet", PcAccountCertGet},
|
|
{"AccountEncryptDisable", PcAccountEncryptDisable},
|
|
{"AccountEncryptEnable", PcAccountEncryptEnable},
|
|
{"AccountCompressEnable", PcAccountCompressEnable},
|
|
{"AccountCompressDisable", PcAccountCompressDisable},
|
|
{"AccountHttpHeaderAdd", PcAccountHttpHeaderAdd},
|
|
{"AccountHttpHeaderDelete", PcAccountHttpHeaderDelete},
|
|
{"AccountHttpHeaderGet", PcAccountHttpHeaderGet},
|
|
{"AccountProxyNone", PcAccountProxyNone},
|
|
{"AccountProxyHttp", PcAccountProxyHttp},
|
|
{"AccountProxySocks", PcAccountProxySocks},
|
|
{"AccountProxySocks5", PcAccountProxySocks5},
|
|
{"AccountServerCertEnable", PcAccountServerCertEnable},
|
|
{"AccountServerCertDisable", PcAccountServerCertDisable},
|
|
{"AccountRetryOnServerCertEnable", PcAccountRetryOnServerCertEnable},
|
|
{"AccountRetryOnServerCertDisable", PcAccountRetryOnServerCertDisable},
|
|
{"AccountDefaultCAEnable", PcAccountDefaultCAEnable},
|
|
{"AccountDefaultCADisable", PcAccountDefaultCADisable},
|
|
{"AccountServerCertSet", PcAccountServerCertSet},
|
|
{"AccountServerCertDelete", PcAccountServerCertDelete},
|
|
{"AccountServerCertGet", PcAccountServerCertGet},
|
|
{"AccountDetailSet", PcAccountDetailSet},
|
|
{"AccountRename", PcAccountRename},
|
|
{"AccountConnect", PcAccountConnect},
|
|
{"AccountDisconnect", PcAccountDisconnect},
|
|
{"AccountStatusGet", PcAccountStatusGet},
|
|
{"AccountNicSet", PcAccountNicSet},
|
|
{"AccountStatusShow", PcAccountStatusShow},
|
|
{"AccountStatusHide", PcAccountStatusHide},
|
|
{"AccountSecureCertSet", PcAccountSecureCertSet},
|
|
{"AccountOpensslEngineCertSet", PcAccountOpensslEngineCertSet},
|
|
{"AccountRetrySet", PcAccountRetrySet},
|
|
{"AccountStartupSet", PcAccountStartupSet},
|
|
{"AccountStartupRemove", PcAccountStartupRemove},
|
|
{"AccountExport", PcAccountExport},
|
|
{"AccountImport", PcAccountImport},
|
|
{"RemoteEnable", PcRemoteEnable},
|
|
{"RemoteDisable", PcRemoteDisable},
|
|
{"KeepEnable", PcKeepEnable},
|
|
{"KeepDisable", PcKeepDisable},
|
|
{"KeepSet", PcKeepSet},
|
|
{"KeepGet", PcKeepGet},
|
|
{"MakeCert", PtMakeCert},
|
|
{"MakeCert2048", PtMakeCert2048},
|
|
{"TrafficClient", PtTrafficClient},
|
|
{"TrafficServer", PtTrafficServer},
|
|
};
|
|
|
|
// Generate a prompt
|
|
StrCpy(prompt, sizeof(prompt), "VPN Client>");
|
|
|
|
if (DispatchNextCmdEx(pc->Console, pc->CmdLine, prompt, cmd, sizeof(cmd) / sizeof(cmd[0]), pc) == false)
|
|
{
|
|
break;
|
|
}
|
|
pc->LastError = pc->Console->RetCode;
|
|
|
|
if (pc->LastError == ERR_NO_ERROR && pc->Console->ConsoleType != CONSOLE_CSV)
|
|
{
|
|
pc->Console->Write(pc->Console, _UU("CMD_MSG_OK"));
|
|
pc->Console->Write(pc->Console, L"");
|
|
}
|
|
|
|
if (pc->CmdLine != NULL)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Retrieve the version information of VPN Client service
|
|
UINT PcVersionGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_VERSION t;
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = CcGetClientVersion(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
CT *ct;
|
|
|
|
// Success
|
|
ct = CtNewStandard();
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.ClientProductName);
|
|
CtInsert(ct, _UU("CMD_VersionGet_1"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.ClientVersionString);
|
|
CtInsert(ct, _UU("CMD_VersionGet_2"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.ClientBuildInfoString);
|
|
CtInsert(ct, _UU("CMD_VersionGet_3"), tmp);
|
|
|
|
UniToStru(tmp, t.ProcessId);
|
|
CtInsert(ct, _UU("CMD_VersionGet_4"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), OsTypeToStr(t.OsType));
|
|
CtInsert(ct, _UU("CMD_VersionGet_5"), tmp);
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set a password to connect to the VPN Client Service
|
|
UINT PcPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_PASSWORD t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[password]", CmdPromptChoosePassword, NULL, NULL, NULL},
|
|
{"REMOTEONLY", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.Password, sizeof(t.Password), GetParamStr(o, "[password]"));
|
|
t.PasswordRemoteOnly = GetParamYes(o, "REMOTEONLY");
|
|
|
|
ret = CcSetPassword(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get the settings of the password to connect to the VPN Client service
|
|
UINT PcPasswordGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_PASSWORD_SETTING t;
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = CcGetPasswordSetting(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
CT *ct = CtNewStandard();
|
|
|
|
CtInsert(ct, _UU("CMD_PasswordGet_1"),
|
|
t.IsPasswordPresented ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
CtInsert(ct, _UU("CMD_PasswordGet_2"),
|
|
t.PasswordRemoteOnly ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get the list of certificates of the trusted certification authority
|
|
UINT PcCertList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_ENUM_CA t;
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = CcEnumCa(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
UINT i;
|
|
CT *ct = CtNewStandard();
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
wchar_t tmp2[64];
|
|
RPC_CLIENT_ENUM_CA_ITEM *e = t.Items[i];
|
|
|
|
GetDateStrEx64(tmp, sizeof(tmp), SystemToLocal64(e->Expires), NULL);
|
|
|
|
UniToStru(tmp2, e->Key);
|
|
|
|
CtInsert(ct, _UU("CMD_CAList_COLUMN_ID"), tmp2);
|
|
CtInsert(ct, _UU("CM_CERT_COLUMN_1"), e->SubjectName);
|
|
CtInsert(ct, _UU("CM_CERT_COLUMN_2"), e->IssuerName);
|
|
CtInsert(ct, _UU("CM_CERT_COLUMN_3"), tmp);
|
|
|
|
if (i != (t.NumItem - 1))
|
|
{
|
|
CtInsert(ct, L"---", L"---");
|
|
}
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
|
|
CiFreeClientEnumCa(&t);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Add a certificate of the trusted certification authority
|
|
UINT PcCertAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CERT t;
|
|
X *x;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[path]", CmdPrompt, _UU("CMD_CAAdd_PROMPT_PATH"), CmdEvalIsFile, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
|
|
x = FileToXW(GetParamUniStr(o, "[path]"));
|
|
|
|
if (x == NULL)
|
|
{
|
|
FreeParamValueList(o);
|
|
c->Write(c, _UU("CMD_MSG_LOAD_CERT_FAILED"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
t.x = x;
|
|
|
|
ret = CcAddCa(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
FreeX(x);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Delete the certificate of the trusted certification authority
|
|
UINT PcCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_DELETE_CA t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[id]", CmdPrompt, _UU("CMD_CADelete_PROMPT_ID"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
t.Key = GetParamInt(o, "[id]");
|
|
|
|
ret = CcDeleteCa(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get the certificate of the trusted certification authority
|
|
UINT PcCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_GET_CA t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[id]", CmdPrompt, _UU("CMD_CAGet_PROMPT_ID"), CmdEvalNotEmpty, NULL},
|
|
{"SAVECERT", CmdPrompt, _UU("CMD_CAGet_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
t.Key = GetParamInt(o, "[id]");
|
|
|
|
ret = CcGetCa(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
if (XToFileW(t.x, GetParamUniStr(o, "SAVECERT"), true))
|
|
{
|
|
// Success
|
|
}
|
|
else
|
|
{
|
|
// Failure
|
|
ret = ERR_INTERNAL_ERROR;
|
|
c->Write(c, _UU("CMD_MSG_SAVE_CERT_FAILED"));
|
|
}
|
|
|
|
CiFreeGetCa(&t);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get the list of the type of smart card that can be used
|
|
UINT PcSecureList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_ENUM_SECURE t;
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = CcEnumSecure(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
CT *ct;
|
|
UINT i;
|
|
wchar_t tmp1[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
wchar_t tmp4[MAX_SIZE];
|
|
wchar_t *tmp3;
|
|
|
|
// Success
|
|
ct = CtNew();
|
|
CtInsertColumn(ct, _UU("SEC_COLUMN1"), false);
|
|
CtInsertColumn(ct, _UU("SEC_COLUMN2"), false);
|
|
CtInsertColumn(ct, _UU("SEC_COLUMN3"), false);
|
|
CtInsertColumn(ct, _UU("SEC_COLUMN4"), false);
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
RPC_CLIENT_ENUM_SECURE_ITEM *e = t.Items[i];
|
|
|
|
// ID
|
|
UniToStru(tmp1, e->DeviceId);
|
|
|
|
// Device name
|
|
StrToUni(tmp2, sizeof(tmp2), e->DeviceName);
|
|
|
|
// Type
|
|
tmp3 = (e->Type == SECURE_IC_CARD) ? _UU("SEC_SMART_CARD") : _UU("SEC_USB_TOKEN");
|
|
|
|
// Manufacturer
|
|
StrToUni(tmp4, sizeof(tmp4), e->Manufacturer);
|
|
|
|
CtInsert(ct, tmp1, tmp2, tmp3, tmp4);
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
|
|
CiFreeClientEnumSecure(&t);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Select the type of smart card to be used
|
|
UINT PcSecureSelect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_USE_SECURE t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[id]", CmdPrompt, _UU("CMD_SecureSelect_PROMPT_ID"), NULL, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
t.DeviceId = GetParamInt(o, "[id]");
|
|
|
|
ret = CcUseSecure(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get the type ID of smart card to be used
|
|
UINT PcSecureGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_USE_SECURE t;
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = CcGetUseSecure(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
if (t.DeviceId != 0)
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_SecureGet_Print"), t.DeviceId);
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("CMD_SecureGet_NoPrint"));
|
|
}
|
|
c->Write(c, tmp);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Create a new virtual LAN card
|
|
UINT PcNicCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_CREATE_VLAN t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
|
|
|
|
ret = CcCreateVLan(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Delete the virtual LAN card
|
|
UINT PcNicDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_CREATE_VLAN t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
|
|
|
|
ret = CcDeleteVLan(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Upgrading the device driver of the virtual LAN card
|
|
UINT PcNicUpgrade(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_CREATE_VLAN t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
|
|
|
|
ret = CcUpgradeVLan(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get the settings of the virtual LAN card
|
|
UINT PcNicGetSetting(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_VLAN t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
|
|
|
|
ret = CcGetVLan(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
CT *ct = CtNewStandard();
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.DeviceName);
|
|
CtInsert(ct, _UU("CMD_NicGetSetting_1"), tmp);
|
|
|
|
CtInsert(ct, _UU("CMD_NicGetSetting_2"), t.Enabled ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.MacAddress);
|
|
CtInsert(ct, _UU("CMD_NicGetSetting_3"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.Version);
|
|
CtInsert(ct, _UU("CMD_NicGetSetting_4"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.FileName);
|
|
CtInsert(ct, _UU("CMD_NicGetSetting_5"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.Guid);
|
|
CtInsert(ct, _UU("CMD_NicGetSetting_6"), tmp);
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Change the settings for the virtual LAN card
|
|
UINT PcNicSetSetting(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_SET_VLAN t;
|
|
UCHAR mac_address[6];
|
|
BUF *b;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"MAC", CmdPrompt, _UU("CMD_NicSetSetting_PROMPT_MAC"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Inspect the MAC address
|
|
Zero(mac_address, sizeof(mac_address));
|
|
b = StrToBin(GetParamStr(o, "MAC"));
|
|
if (b != NULL && b->Size == 6)
|
|
{
|
|
Copy(mac_address, b->Buf, 6);
|
|
}
|
|
FreeBuf(b);
|
|
|
|
if (IsZero(mac_address, 6))
|
|
{
|
|
// MAC address is invalid
|
|
FreeParamValueList(o);
|
|
|
|
CmdPrintError(c, ERR_INVALID_PARAMETER);
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
|
|
NormalizeMacAddress(t.MacAddress, sizeof(t.MacAddress), GetParamStr(o, "MAC"));
|
|
|
|
ret = CcSetVLan(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Enable the virtual LAN card
|
|
UINT PcNicEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_CREATE_VLAN t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
|
|
|
|
ret = CcEnableVLan(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Disable the virtual LAN card
|
|
UINT PcNicDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_CREATE_VLAN t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));
|
|
|
|
ret = CcDisableVLan(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get the Virtual LAN card list
|
|
UINT PcNicList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_ENUM_VLAN t;
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = CcEnumVLan(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
CT *ct;
|
|
UINT i;
|
|
|
|
// Success
|
|
ct = CtNew();
|
|
CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_2"), false);
|
|
CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_3"), false);
|
|
CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_4"), false);
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
wchar_t name[MAX_SIZE];
|
|
wchar_t mac[MAX_SIZE];
|
|
wchar_t ver[MAX_SIZE];
|
|
wchar_t *status;
|
|
RPC_CLIENT_ENUM_VLAN_ITEM *v = t.Items[i];
|
|
|
|
// Device name
|
|
StrToUni(name, sizeof(name), v->DeviceName);
|
|
|
|
// State
|
|
status = v->Enabled ? _UU("CM_VLAN_ENABLED") : _UU("CM_VLAN_DISABLED");
|
|
|
|
// MAC address
|
|
StrToUni(mac, sizeof(mac), v->MacAddress);
|
|
|
|
// Version
|
|
StrToUni(ver, sizeof(ver), v->Version);
|
|
|
|
CtInsert(ct,
|
|
name, status, mac, ver);
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientEnumVLan(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get the protocol name string from ID
|
|
wchar_t *GetProtocolName(UINT n)
|
|
{
|
|
switch (n)
|
|
{
|
|
case PROXY_DIRECT:
|
|
return _UU("PROTO_DIRECT_TCP");
|
|
case PROXY_HTTP:
|
|
return _UU("PROTO_HTTP_PROXY");
|
|
case PROXY_SOCKS:
|
|
return _UU("PROTO_SOCKS_PROXY");
|
|
case PROXY_SOCKS5:
|
|
return _UU("PROTO_SOCKS5_PROXY");
|
|
}
|
|
|
|
return _UU("PROTO_UNKNOWN");
|
|
}
|
|
|
|
// Get the connection settings list
|
|
UINT PcAccountList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_ENUM_ACCOUNT t;
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = CcEnumAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
UINT i;
|
|
CT *ct;
|
|
|
|
// Success
|
|
ct = CtNew();
|
|
CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_2"), false);
|
|
CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_3"), false);
|
|
CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_3_2"), false);
|
|
CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_4"), false);
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
RPC_CLIENT_ENUM_ACCOUNT_ITEM *e = t.Items[i];
|
|
wchar_t tmp[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
wchar_t tmp4[MAX_SIZE];
|
|
IP ip;
|
|
char ip_str[MAX_SIZE];
|
|
|
|
// Special treatment for IPv6 addresses
|
|
if (StrToIP6(&ip, e->ServerName) && StartWith(e->ServerName, "[") == false)
|
|
{
|
|
Format(ip_str, sizeof(ip_str),
|
|
"[%s]", e->ServerName);
|
|
}
|
|
else
|
|
{
|
|
StrCpy(ip_str, sizeof(ip_str), e->ServerName);
|
|
}
|
|
|
|
if (e->Port == 0)
|
|
{
|
|
// Port number unknown
|
|
UniFormat(tmp2, sizeof(tmp2), L"%S (%s)", ip_str, GetProtocolName(e->ProxyType));
|
|
}
|
|
else
|
|
{
|
|
// Port number are also shown
|
|
UniFormat(tmp2, sizeof(tmp2), L"%S:%u (%s)", ip_str, e->Port, GetProtocolName(e->ProxyType));
|
|
}
|
|
|
|
// Virtual HUB name
|
|
StrToUni(tmp4, sizeof(tmp4), e->HubName);
|
|
|
|
// Add
|
|
StrToUni(tmp, sizeof(tmp), e->DeviceName);
|
|
|
|
CtInsert(ct,
|
|
e->AccountName,
|
|
e->Active == false ? _UU("CM_ACCOUNT_OFFLINE") :
|
|
(e->Connected ? _UU("CM_ACCOUNT_ONLINE") : _UU("CM_ACCOUNT_CONNECTING")),
|
|
tmp2, tmp4,
|
|
tmp);
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
}
|
|
|
|
CiFreeClientEnumAccount(&t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Create new connection settings
|
|
UINT PcAccountCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_CREATE_ACCOUNT t;
|
|
UINT port = 443;
|
|
char *host = NULL;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"SERVER", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},
|
|
{"HUB", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Hub"), CmdEvalSafe, NULL},
|
|
{"USERNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},
|
|
{"NICNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Nicname"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
t.ClientOption->Port = port;
|
|
StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);
|
|
StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));
|
|
t.ClientOption->NumRetry = INFINITE;
|
|
t.ClientOption->RetryInterval = 15;
|
|
t.ClientOption->MaxConnection = 1;
|
|
t.ClientOption->UseEncrypt = true;
|
|
t.ClientOption->AdditionalConnectionInterval = 1;
|
|
StrCpy(t.ClientOption->DeviceName, sizeof(t.ClientOption->DeviceName), GetParamStr(o, "NICNAME"));
|
|
|
|
t.ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));
|
|
t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
|
|
StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username), GetParamStr(o, "USERNAME"));
|
|
|
|
Free(host);
|
|
|
|
ret = CcCreateAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
CiFreeClientCreateAccount(&t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Setup a RPC_CLIENT_CREATE_ACCOUNT from a RPC_CLIENT_GET_ACCOUNT
|
|
void SetRpcClientCreateAccountFromGetAccount(RPC_CLIENT_CREATE_ACCOUNT *c, RPC_CLIENT_GET_ACCOUNT *t)
|
|
{
|
|
if (c == NULL || t == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Zero(c, sizeof(RPC_CLIENT_CREATE_ACCOUNT));
|
|
|
|
// Copy reference
|
|
c->ClientAuth = t->ClientAuth;
|
|
c->ClientOption = t->ClientOption;
|
|
c->CheckServerCert = t->CheckServerCert;
|
|
c->RetryOnServerCert = t->RetryOnServerCert;
|
|
c->AddDefaultCA = t->AddDefaultCA;
|
|
c->ServerCert = t->ServerCert;
|
|
c->StartupAccount = t->StartupAccount;
|
|
}
|
|
|
|
// Set the destination of the connection settings
|
|
UINT PcAccountSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
char *host = NULL;
|
|
UINT port = 443;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"SERVER", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},
|
|
{"HUB", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Hub"), CmdEvalSafe, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);
|
|
|
|
Zero(&t, sizeof(t));
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT c;
|
|
// Success
|
|
t.ClientOption->Port = port;
|
|
StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);
|
|
t.ClientOption->HintStr[0] = 0;
|
|
StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&c, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &c);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
Free(host);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get the configuration of the connection settings
|
|
UINT PcAccountGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Show the contents of the connection settings
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
CT *ct = CtNewStandard();
|
|
|
|
// Connection settings name
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NAME"), t.ClientOption->AccountName);
|
|
|
|
// Host name of the destination VPN Server
|
|
if (IsEmptyStr(t.ClientOption->HintStr))
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), t.ClientOption->Hostname);
|
|
}
|
|
else
|
|
{
|
|
char hostname[MAX_SIZE];
|
|
StrCpy(hostname, sizeof(hostname), t.ClientOption->Hostname);
|
|
StrCat(hostname, sizeof(hostname), "/");
|
|
StrCat(hostname, sizeof(hostname), t.ClientOption->HintStr);
|
|
StrToUni(tmp, sizeof(tmp), hostname);
|
|
}
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HOSTNAME"), tmp);
|
|
|
|
// The port number to connect to VPN Server
|
|
UniToStru(tmp, t.ClientOption->Port);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PORT"), tmp);
|
|
|
|
// Virtual HUB name of the destination VPN Server
|
|
StrToUni(tmp, sizeof(tmp), t.ClientOption->HubName);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HUBNAME"), tmp);
|
|
|
|
// Type of proxy server to go through
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_TYPE"), GetProxyTypeStr(t.ClientOption->ProxyType));
|
|
|
|
if (t.ClientOption->ProxyType != PROXY_DIRECT)
|
|
{
|
|
// Host name of the proxy server
|
|
StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyName);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_HOSTNAME"), tmp);
|
|
|
|
// Port number of the proxy server
|
|
UniToStru(tmp, t.ClientOption->ProxyPort);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_PORT"), tmp);
|
|
|
|
// User name of the proxy server
|
|
StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyUsername);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_USERNAME"), tmp);
|
|
}
|
|
|
|
// Verify the server certificate
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_USE"),
|
|
t.CheckServerCert ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
// Registered specific certificate
|
|
if (t.ServerCert != NULL)
|
|
{
|
|
GetAllNameFromX(tmp, sizeof(tmp), t.ServerCert);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_NAME"), tmp);
|
|
}
|
|
|
|
if (t.CheckServerCert)
|
|
{
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_RETRY_ON_SERVER_CERT"),
|
|
t.RetryOnServerCert ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_ADD_DEFAULT_CA"),
|
|
t.AddDefaultCA ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
}
|
|
|
|
// Device name to be used for the connection
|
|
StrToUni(tmp, sizeof(tmp), t.ClientOption->DeviceName);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_DEVICE_NAME"), tmp);
|
|
|
|
// Authentication type
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_TYPE"), GetClientAuthTypeStr(t.ClientAuth->AuthType));
|
|
|
|
// User name
|
|
StrToUni(tmp, sizeof(tmp), t.ClientAuth->Username);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_USERNAME"), tmp);
|
|
|
|
if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_CERT)
|
|
{
|
|
if (t.ClientAuth->ClientX != NULL)
|
|
{
|
|
// Client certificate name
|
|
GetAllNameFromX(tmp, sizeof(tmp), t.ClientAuth->ClientX);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_CERT_NAME"), tmp);
|
|
}
|
|
}
|
|
|
|
// Number of TCP connections to be used for VPN communication
|
|
UniToStru(tmp, t.ClientOption->MaxConnection);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NUMTCP"), tmp);
|
|
|
|
// Establishment interval of each TCP connection
|
|
UniToStru(tmp, t.ClientOption->AdditionalConnectionInterval);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_INTERVAL"), tmp);
|
|
|
|
// Life span of each TCP connection
|
|
if (t.ClientOption->ConnectionDisconnectSpan != 0)
|
|
{
|
|
UniToStru(tmp, t.ClientOption->ConnectionDisconnectSpan);
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("CMD_MSG_INFINITE"));
|
|
}
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_TTL"), tmp);
|
|
|
|
// Use of half-duplex mode
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_HALF"),
|
|
t.ClientOption->HalfConnection ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
// Encryption by SSL
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_ENCRYPT"),
|
|
t.ClientOption->UseEncrypt ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
// Data compression
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_COMPRESS"),
|
|
t.ClientOption->UseCompress ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
// Connect in bridge / router mode
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_BRIDGE_ROUTER"),
|
|
t.ClientOption->RequireBridgeRoutingMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
// Connect in monitoring mode
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_MONITOR"),
|
|
t.ClientOption->RequireMonitorMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
// Not to rewrite the routing table
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NO_TRACKING"),
|
|
t.ClientOption->NoRoutingTracking ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
// Disable the QoS control
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_QOS_DISABLE"),
|
|
t.ClientOption->DisableQoS ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
// Disable UDP Acceleration
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_DISABLEUDP"),
|
|
t.ClientOption->NoUdpAcceleration ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Delete the connection settings
|
|
UINT PcAccountDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_DELETE_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcDeleteAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the user name used to connect with connection settings
|
|
UINT PcAccountUsernameSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"USERNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username), GetParamStr(o, "USERNAME"));
|
|
|
|
if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_PASSWORD)
|
|
{
|
|
c->Write(c, _UU("CMD_AccountUsername_Notice"));
|
|
}
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the type of user authentication of connection settings to anonymous authentication
|
|
UINT PcAccountAnonymousSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the type of user authentication of connection settings to the password authentication
|
|
UINT PcAccountPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
|
|
{"TYPE", CmdPrompt, _UU("CMD_CascadePasswordSet_Prompt_Type"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
char *typestr = GetParamStr(o, "TYPE");
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
|
|
// Change the settings
|
|
if (StartWith("standard", typestr))
|
|
{
|
|
t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PASSWORD;
|
|
HashPassword(t.ClientAuth->HashedPassword, t.ClientAuth->Username,
|
|
GetParamStr(o, "PASSWORD"));
|
|
}
|
|
else if (StartWith("radius", typestr) || StartWith("ntdomain", typestr))
|
|
{
|
|
t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PLAIN_PASSWORD;
|
|
|
|
StrCpy(t.ClientAuth->PlainPassword, sizeof(t.ClientAuth->PlainPassword),
|
|
GetParamStr(o, "PASSWORD"));
|
|
}
|
|
else
|
|
{
|
|
// Error has occured
|
|
c->Write(c, _UU("CMD_CascadePasswordSet_Type_Invalid"));
|
|
ret = ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the type of user authentication of connection settings to the client certificate authentication
|
|
UINT PcAccountCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
X *x;
|
|
K *k;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
|
|
{"LOADKEY", CmdPrompt, _UU("CMD_LOADKEYPATH"), CmdEvalIsFile, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (CmdLoadCertAndKey(c, &x, &k, GetParamUniStr(o, "LOADCERT"), GetParamUniStr(o, "LOADKEY")) == false)
|
|
{
|
|
return ERR_INTERNAL_ERROR;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
|
|
t.ClientAuth->AuthType = CLIENT_AUTHTYPE_CERT;
|
|
if (t.ClientAuth->ClientX != NULL)
|
|
{
|
|
FreeX(t.ClientAuth->ClientX);
|
|
}
|
|
if (t.ClientAuth->ClientK != NULL)
|
|
{
|
|
FreeK(t.ClientAuth->ClientK);
|
|
}
|
|
|
|
t.ClientAuth->ClientX = CloneX(x);
|
|
t.ClientAuth->ClientK = CloneK(k);
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
FreeX(x);
|
|
FreeK(k);
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get the client certificate to be used for the connection settings
|
|
UINT PcAccountCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
if (t.ClientAuth->AuthType != CLIENT_AUTHTYPE_CERT && t.ClientAuth->AuthType != CLIENT_AUTHTYPE_OPENSSLENGINE)
|
|
{
|
|
c->Write(c, _UU("CMD_CascadeCertSet_Not_Auth_Cert"));
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
else if (t.ClientAuth->ClientX == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_CascadeCertSet_Cert_Not_Exists"));
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
else
|
|
{
|
|
XToFileW(t.ClientAuth->ClientX, GetParamUniStr(o, "SAVECERT"), true);
|
|
}
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Disable communication encryption with the connection settings
|
|
UINT PcAccountEncryptDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.ClientOption->UseEncrypt = false;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Enable communication encryption with the connection settings
|
|
UINT PcAccountEncryptEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.ClientOption->UseEncrypt = true;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Enable communication data compression with the connection settings
|
|
UINT PcAccountCompressEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.ClientOption->UseCompress = true;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Disable communication data compression with the connection settings
|
|
UINT PcAccountCompressDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.ClientOption->UseCompress = false;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
UINT PcAccountHttpHeaderAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"NAME", CmdPrompt, _UU("CMD_AccountHttpHeader_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"DATA", CmdPrompt, _UU("CMD_AccountHttpHeader_Prompt_Data"), NULL, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
UINT i = 0;
|
|
TOKEN_LIST *tokens = NULL;
|
|
HTTP_HEADER *header = NULL;
|
|
char *name = GetParamStr(o, "NAME");
|
|
|
|
Trim(name);
|
|
|
|
header = NewHttpHeader("", "", "");
|
|
|
|
tokens = ParseToken(t.ClientOption->CustomHttpHeader, "\r\n");
|
|
for (i = 0; i < tokens->NumTokens; i++)
|
|
{
|
|
AddHttpValueStr(header, tokens->Token[i]);
|
|
}
|
|
FreeToken(tokens);
|
|
|
|
if (GetHttpValue(header, name) == NULL)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
char s[HTTP_CUSTOM_HEADER_MAX_SIZE];
|
|
|
|
Format(s, sizeof(s), "%s: %s\r\n", name, GetParamStr(o, "DATA"));
|
|
EnSafeHttpHeaderValueStr(s, ' ');
|
|
|
|
if ((StrLen(s) + StrLen(t.ClientOption->CustomHttpHeader)) < sizeof(t.ClientOption->CustomHttpHeader)) {
|
|
StrCat(t.ClientOption->CustomHttpHeader, sizeof(s), s);
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
else
|
|
{
|
|
// Error has occurred
|
|
ret = ERR_TOO_MANT_ITEMS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Error has occurred
|
|
ret = ERR_OBJECT_EXISTS;
|
|
}
|
|
|
|
FreeHttpHeader(header);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
UINT PcAccountHttpHeaderDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"NAME", CmdPrompt, _UU("CMD_AccountHttpHeader_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
LIST *o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
UINT i = 0;
|
|
TOKEN_LIST *tokens = NULL;
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
char *value = GetParamStr(o, "NAME");
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
Zero(z.ClientOption->CustomHttpHeader, sizeof(z.ClientOption->CustomHttpHeader));
|
|
|
|
tokens = ParseToken(t.ClientOption->CustomHttpHeader, "\r\n");
|
|
|
|
for (i = 0; i < tokens->NumTokens; i++)
|
|
{
|
|
if (StartWith(tokens->Token[i], value) == false)
|
|
{
|
|
StrCat(z.ClientOption->CustomHttpHeader, sizeof(z.ClientOption->CustomHttpHeader), tokens->Token[i]);
|
|
StrCat(z.ClientOption->CustomHttpHeader, 1, "\r\n");
|
|
}
|
|
}
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
else
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
UINT PcAccountHttpHeaderGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
LIST *o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
wchar_t unistr[HTTP_CUSTOM_HEADER_MAX_SIZE];
|
|
TOKEN_LIST *tokens = NULL;
|
|
UINT i = 0;
|
|
CT *ct = CtNew();
|
|
CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_1"), false);
|
|
|
|
tokens = ParseToken(t.ClientOption->CustomHttpHeader, "\r\n");
|
|
|
|
for (i = 0; i < tokens->NumTokens; i++)
|
|
{
|
|
StrToUni(unistr, sizeof(unistr), tokens->Token[i]);
|
|
CtInsert(ct, unistr);
|
|
}
|
|
|
|
CtFreeEx(ct, c, false);
|
|
}
|
|
else
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the connection method of the connection settings to the direct TCP/IP connection
|
|
UINT PcAccountProxyNone(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.ClientOption->ProxyType = PROXY_DIRECT;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the connection method of the connection settings to the HTTP proxy server connection
|
|
UINT PcAccountProxyHttp(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"SERVER", CmdPrompt, _UU("CMD_AccountProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
|
|
{"USERNAME", NULL, NULL, NULL, NULL},
|
|
{"PASSWORD", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
char *host;
|
|
UINT port;
|
|
|
|
// Data change
|
|
if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))
|
|
{
|
|
t.ClientOption->ProxyType = PROXY_HTTP;
|
|
StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
|
|
t.ClientOption->ProxyPort = port;
|
|
StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
|
|
StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
|
|
Free(host);
|
|
}
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the connection method of the connection settings to the SOCKS4 proxy server connection
|
|
UINT PcAccountProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"SERVER", CmdPrompt, _UU("CMD_AccountProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
|
|
{"USERNAME", NULL, NULL, NULL, NULL},
|
|
{"PASSWORD", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
char *host;
|
|
UINT port;
|
|
|
|
// Data change
|
|
if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 1080))
|
|
{
|
|
t.ClientOption->ProxyType = PROXY_SOCKS;
|
|
StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
|
|
t.ClientOption->ProxyPort = port;
|
|
StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
|
|
StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
|
|
Free(host);
|
|
}
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the connection method of the connection settings to the SOCKS5 proxy server connection
|
|
UINT PcAccountProxySocks5(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"SERVER", CmdPrompt, _UU("CMD_AccountProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
|
|
{"USERNAME", CmdPrompt, NULL, NULL, NULL},
|
|
{"PASSWORD", CmdPrompt, NULL, NULL, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
char *host;
|
|
UINT port;
|
|
|
|
// Data change
|
|
if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 1080))
|
|
{
|
|
t.ClientOption->ProxyType = PROXY_SOCKS5;
|
|
StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
|
|
t.ClientOption->ProxyPort = port;
|
|
StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
|
|
StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
|
|
Free(host);
|
|
}
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Enable validation option for server certificate of connection settings
|
|
UINT PcAccountServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.CheckServerCert = true;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Disable validation option of the server certificate of connection settings
|
|
UINT PcAccountServerCertDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.CheckServerCert = false;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Enable retry option of the invalid server certificate of connection settings
|
|
UINT PcAccountRetryOnServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.RetryOnServerCert = true;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Disable retry option of the invalid server certificate of connection settings
|
|
UINT PcAccountRetryOnServerCertDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.RetryOnServerCert = false;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Enable trusting default CA list
|
|
UINT PcAccountDefaultCAEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.AddDefaultCA = true;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Disable trusting default CA list
|
|
UINT PcAccountDefaultCADisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.AddDefaultCA = false;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the server-specific certificate of connection settings
|
|
UINT PcAccountServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
X *x;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
x = FileToXW(GetParamUniStr(o, "LOADCERT"));
|
|
if (x == NULL)
|
|
{
|
|
FreeParamValueList(o);
|
|
c->Write(c, _UU("CMD_LOADCERT_FAILED"));
|
|
return ERR_INTERNAL_ERROR;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
if (t.ServerCert != NULL)
|
|
{
|
|
FreeX(t.ServerCert);
|
|
}
|
|
t.ServerCert = CloneX(x);
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
FreeX(x);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Delete a server-specific certificate of connection settings
|
|
UINT PcAccountServerCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
if (t.ServerCert != NULL)
|
|
{
|
|
FreeX(t.ServerCert);
|
|
}
|
|
t.ServerCert = NULL;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get a server-specific certificate of connection settings
|
|
UINT PcAccountServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Save the certificate
|
|
if (t.ServerCert == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_CERT_NOT_EXISTS"));
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
else
|
|
{
|
|
if (XToFileW(t.ServerCert, GetParamUniStr(o, "SAVECERT"), true) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_SAVECERT_FAILED"));
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the advanced settings of connection settings
|
|
UINT PcAccountDetailSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
CMD_EVAL_MIN_MAX mm_maxtcp =
|
|
{
|
|
"CMD_CascadeDetailSet_Eval_MaxTcp", 1, 32
|
|
};
|
|
CMD_EVAL_MIN_MAX mm_interval =
|
|
{
|
|
"CMD_CascadeDetailSet_Eval_Interval", 1, 4294967295UL
|
|
};
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"MAXTCP", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_MaxTcp"), CmdEvalMinMax, &mm_maxtcp},
|
|
{"INTERVAL", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_Interval"), CmdEvalMinMax, &mm_interval},
|
|
{"TTL", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_TTL"), NULL, NULL},
|
|
{"HALF", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_HALF"), NULL, NULL},
|
|
{"BRIDGE", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_BRIDGE"), NULL, NULL},
|
|
{"MONITOR", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_MONITOR"), NULL, NULL},
|
|
{"NOTRACK", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_NOTRACK"), NULL, NULL},
|
|
{"NOQOS", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_NOQOS"), NULL, NULL},
|
|
{"DISABLEUDP", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_DISABLEUDP"), NULL, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Data change
|
|
t.ClientOption->MaxConnection = GetParamInt(o, "MAXTCP");
|
|
t.ClientOption->AdditionalConnectionInterval = GetParamInt(o, "INTERVAL");
|
|
t.ClientOption->ConnectionDisconnectSpan = GetParamInt(o, "TTL");
|
|
t.ClientOption->HalfConnection = GetParamYes(o, "HALF");
|
|
t.ClientOption->RequireBridgeRoutingMode = GetParamYes(o, "BRIDGE");
|
|
t.ClientOption->RequireMonitorMode = GetParamYes(o, "MONITOR");
|
|
t.ClientOption->NoRoutingTracking = GetParamYes(o, "NOTRACK");
|
|
t.ClientOption->DisableQoS = GetParamYes(o, "NOQOS");
|
|
t.ClientOption->NoUdpAcceleration = GetParamYes(o, "DISABLEUDP");
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Change the name of the connection settings
|
|
UINT PcAccountRename(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_RENAME_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountRename_PROMPT_OLD"), CmdEvalNotEmpty, NULL},
|
|
{"NEW", CmdPrompt, _UU("CMD_AccountRename_PROMPT_NEW"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
UniStrCpy(t.NewName, sizeof(t.NewName), GetParamUniStr(o, "NEW"));
|
|
UniStrCpy(t.OldName, sizeof(t.OldName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcRenameAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Start to connect to the VPN Server using the connection settings
|
|
UINT PcAccountConnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_CONNECT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcConnect(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Disconnect the connection settings of connected
|
|
UINT PcAccountDisconnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_CONNECT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcDisconnect(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get the current state of the connection settings
|
|
UINT PcAccountStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_CONNECTION_STATUS t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccountStatus(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
if (t.Active == false)
|
|
{
|
|
// Has been disconnected
|
|
ret = ERR_ACCOUNT_INACTIVE;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNewStandard();
|
|
|
|
CmdPrintStatusToListView(ct, &t);
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetConnectionStatus(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set a virtual LAN card to be used in the connection settings
|
|
UINT PcAccountNicSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"NICNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Nicname"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
Zero(&t, sizeof(t));
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT c;
|
|
// Success
|
|
StrCpy(t.ClientOption->DeviceName, sizeof(t.ClientOption->DeviceName),
|
|
GetParamStr(o, "NICNAME"));
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&c, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &c);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set to display error screens and connection status while connecting to the VPN Server
|
|
UINT PcAccountStatusShow(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.ClientOption->HideStatusWindow = false;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Configure not to display error screens and connection status while connecting to the VPN Server
|
|
UINT PcAccountStatusHide(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.ClientOption->HideStatusWindow = true;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the type of user authentication of connection settings to the smart card authentication
|
|
UINT PcAccountSecureCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"CERTNAME", CmdPrompt, _UU("CMD_AccountSecureCertSet_PROMPT_CERTNAME"), CmdEvalNotEmpty, NULL},
|
|
{"KEYNAME", CmdPrompt, _UU("CMD_AccountSecureCertSet_PROMPT_KEYNAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.ClientAuth->AuthType = CLIENT_AUTHTYPE_SECURE;
|
|
StrCpy(t.ClientAuth->SecurePublicCertName, sizeof(t.ClientAuth->SecurePublicCertName),
|
|
GetParamStr(o, "CERTNAME"));
|
|
StrCpy(t.ClientAuth->SecurePrivateKeyName, sizeof(t.ClientAuth->SecurePrivateKeyName),
|
|
GetParamStr(o, "KEYNAME"));
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
UINT PcAccountOpensslEngineCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
|
|
{"KEYNAME", CmdPrompt, _UU("CMD_AccountOpensslCertSet_PROMPT_KEYNAME"), CmdEvalNotEmpty, NULL},
|
|
{"ENGINENAME", CmdPrompt, _UU("CMD_AccountOpensslCertSet_PROMPT_ENGINENAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
t.ClientAuth->AuthType = CLIENT_AUTHTYPE_OPENSSLENGINE;
|
|
X *x;
|
|
x = FileToXW(GetParamUniStr(o, "LOADCERT"));
|
|
if (x == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_LOADCERT_FAILED"));
|
|
}
|
|
StrCpy(t.ClientAuth->OpensslEnginePrivateKeyName, sizeof(t.ClientAuth->OpensslEnginePrivateKeyName),
|
|
GetParamStr(o, "KEYNAME"));
|
|
StrCpy(t.ClientAuth->OpensslEngineName, sizeof(t.ClientAuth->OpensslEngineName),
|
|
GetParamStr(o, "ENGINENAME"));
|
|
t.ClientAuth->ClientX = CloneX(x);
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
// Set the retry interval and number of retries when disconnect or connection failure of connection settings
|
|
UINT PcAccountRetrySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
CMD_EVAL_MIN_MAX minmax =
|
|
{
|
|
"CMD_AccountRetrySet_EVAL_INTERVAL",
|
|
5,
|
|
4294967295UL,
|
|
};
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"NUM", CmdPrompt, _UU("CMD_AccountRetrySet_PROMPT_NUM"), CmdEvalNotEmpty, NULL},
|
|
{"INTERVAL", CmdPrompt, _UU("CMD_AccountRetrySet_PROMPT_INTERVAL"), CmdEvalMinMax, &minmax},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
UINT num = GetParamInt(o, "NUM");
|
|
UINT interval = GetParamInt(o, "INTERVAL");
|
|
|
|
t.ClientOption->NumRetry = (num == 999) ? INFINITE : num;
|
|
t.ClientOption->RetryInterval = interval;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
// Set to start-up connection the connection settings
|
|
UINT PcAccountStartupSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.StartupAccount = true;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Unset the start-up connection of the connection settings
|
|
UINT PcAccountStartupRemove(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
// Change the settings
|
|
t.StartupAccount = false;
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
ret = CcSetAccount(pc->RemoteClient, &z);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Export the connection settings
|
|
UINT PcAccountExport(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CLIENT_GET_ACCOUNT t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"SAVEPATH", CmdPrompt, _UU("CMD_AccountExport_PROMPT_SAVEPATH"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = CcGetAccount(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT z;
|
|
BUF *b;
|
|
BUF *b2;
|
|
char tmp[MAX_SIZE];
|
|
UCHAR *buf;
|
|
UINT buf_size;
|
|
UCHAR bom[] = {0xef, 0xbb, 0xbf, };
|
|
|
|
SetRpcClientCreateAccountFromGetAccount(&z, &t);
|
|
|
|
b = CiAccountToCfg(&z);
|
|
|
|
StrCpy(tmp, sizeof(tmp), GetParamStr(o, "SAVEPATH"));
|
|
b2 = NewBuf();
|
|
|
|
WriteBuf(b2, bom, sizeof(bom));
|
|
|
|
// Add the header part
|
|
buf_size = CalcUniToUtf8(_UU("CM_ACCOUNT_FILE_BANNER"));
|
|
buf = ZeroMalloc(buf_size + 32);
|
|
UniToUtf8(buf, buf_size, _UU("CM_ACCOUNT_FILE_BANNER"));
|
|
|
|
WriteBuf(b2, buf, StrLen((char *)buf));
|
|
WriteBuf(b2, b->Buf, b->Size);
|
|
SeekBuf(b2, 0, 0);
|
|
|
|
FreeBuf(b);
|
|
|
|
if (DumpBuf(b2, tmp) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_SAVEFILE_FAILED"));
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
|
|
FreeBuf(b2);
|
|
Free(buf);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
CiFreeClientGetAccount(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Check whether the specified account name exists
|
|
bool CmdIsAccountName(REMOTE_CLIENT *r, wchar_t *name)
|
|
{
|
|
UINT i;
|
|
RPC_CLIENT_ENUM_ACCOUNT t;
|
|
wchar_t tmp[MAX_SIZE];
|
|
bool b = false;
|
|
// Validate arguments
|
|
if (r == NULL || name == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (CcEnumAccount(r, &t) != ERR_NO_ERROR)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
UniStrCpy(tmp, sizeof(tmp), name);
|
|
UniTrim(tmp);
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
if (UniStrCmpi(t.Items[i]->AccountName, tmp) == 0)
|
|
{
|
|
b = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
CiFreeClientEnumAccount(&t);
|
|
|
|
return b;
|
|
}
|
|
|
|
// Generate an import name
|
|
void CmdGenerateImportName(REMOTE_CLIENT *r, wchar_t *name, UINT size, wchar_t *old_name)
|
|
{
|
|
UINT i;
|
|
// Validate arguments
|
|
if (r == NULL || name == NULL || old_name == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
for (i = 1;;i++)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
if (i == 1)
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_IMPORT_NAME_1"), old_name);
|
|
}
|
|
else
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_IMPORT_NAME_2"), old_name, i);
|
|
}
|
|
|
|
if (CmdIsAccountName(r, tmp) == false)
|
|
{
|
|
UniStrCpy(name, size, tmp);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Import a connection setting
|
|
UINT PcAccountImport(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
BUF *b;
|
|
wchar_t name[MAX_SIZE];
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[path]", CmdPrompt, _UU("CMD_AccountImport_PROMPT_PATH"), CmdEvalIsFile, NULL},
|
|
};
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Read the file
|
|
b = ReadDumpW(GetParamUniStr(o, "[path]"));
|
|
|
|
if (b == NULL)
|
|
{
|
|
// Read failure
|
|
c->Write(c, _UU("CMD_LOADFILE_FAILED"));
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
else
|
|
{
|
|
RPC_CLIENT_CREATE_ACCOUNT *t;
|
|
|
|
t = CiCfgToAccount(b);
|
|
|
|
if (t == NULL)
|
|
{
|
|
// Failed to parse
|
|
c->Write(c, _UU("CMD_AccountImport_FAILED_PARSE"));
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
else
|
|
{
|
|
CmdGenerateImportName(pc->RemoteClient, name, sizeof(name), t->ClientOption->AccountName);
|
|
UniStrCpy(t->ClientOption->AccountName, sizeof(t->ClientOption->AccountName), name);
|
|
|
|
ret = CcCreateAccount(pc->RemoteClient, t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_AccountImport_OK"), name);
|
|
c->Write(c, tmp);
|
|
}
|
|
|
|
CiFreeClientCreateAccount(t);
|
|
Free(t);
|
|
}
|
|
|
|
FreeBuf(b);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Allow remote management of the VPN Client Service
|
|
UINT PcRemoteEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
CLIENT_CONFIG t;
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = CcGetClientConfig(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
t.AllowRemoteConfig = true;
|
|
ret = CcSetClientConfig(pc->RemoteClient, &t);
|
|
}
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Prohibit remote management of the VPN Client Service
|
|
UINT PcRemoteDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
CLIENT_CONFIG t;
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = CcGetClientConfig(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
t.AllowRemoteConfig = false;
|
|
ret = CcSetClientConfig(pc->RemoteClient, &t);
|
|
}
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Enable the maintenance function of the Internet connection
|
|
UINT PcKeepEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
CLIENT_CONFIG t;
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = CcGetClientConfig(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Change the settings
|
|
t.UseKeepConnect = true;
|
|
ret = CcSetClientConfig(pc->RemoteClient, &t);
|
|
}
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Disable the maintenance function of the Internet connection
|
|
UINT PcKeepDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
CLIENT_CONFIG t;
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = CcGetClientConfig(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Change the settings
|
|
t.UseKeepConnect = false;
|
|
ret = CcSetClientConfig(pc->RemoteClient, &t);
|
|
}
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the maintenance function of the Internet connection
|
|
UINT PcKeepSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
CLIENT_CONFIG t;
|
|
char *host;
|
|
UINT port;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"HOST", CmdPrompt, _UU("CMD_KeepSet_PROMPT_HOST"), CmdEvalHostAndPort, NULL},
|
|
{"PROTOCOL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_PROTOCOL"), CmdEvalTcpOrUdp, NULL},
|
|
{"INTERVAL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_INTERVAL"), NULL, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = CcGetClientConfig(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
if (ParseHostPort(GetParamStr(o, "HOST"), &host, &port, 0))
|
|
{
|
|
StrCpy(t.KeepConnectHost, sizeof(t.KeepConnectHost), host);
|
|
t.KeepConnectPort = port;
|
|
t.KeepConnectInterval = GetParamInt(o, "INTERVAL");
|
|
t.KeepConnectProtocol = (StrCmpi(GetParamStr(o, "PROTOCOL"), "tcp") == 0) ? 0 : 1;
|
|
Free(host);
|
|
|
|
ret = CcSetClientConfig(pc->RemoteClient, &t);
|
|
}
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get the maintenance function of the Internet connection
|
|
UINT PcKeepGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PC *pc = (PC *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
CLIENT_CONFIG t;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = CcGetClientConfig(pc->RemoteClient, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
CT *ct = CtNewStandard();
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.KeepConnectHost);
|
|
CtInsert(ct, _UU("CMD_KeepGet_COLUMN_1"), tmp);
|
|
|
|
UniToStru(tmp, t.KeepConnectPort);
|
|
CtInsert(ct, _UU("CMD_KeepGet_COLUMN_2"), tmp);
|
|
|
|
UniToStru(tmp, t.KeepConnectInterval);
|
|
CtInsert(ct, _UU("CMD_KeepGet_COLUMN_3"), tmp);
|
|
|
|
CtInsert(ct, _UU("CMD_KeepGet_COLUMN_4"),
|
|
t.KeepConnectProtocol == 0 ? L"TCP/IP" : L"UDP/IP");
|
|
|
|
CtInsert(ct, _UU("CMD_KeepGet_COLUMN_5"),
|
|
t.UseKeepConnect ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"));
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
// Creat a new client management tool context
|
|
PC *NewPc(CONSOLE *c, REMOTE_CLIENT *remote_client, char *servername, wchar_t *cmdline)
|
|
{
|
|
PC *pc;
|
|
// Validate arguments
|
|
if (c == NULL || remote_client == NULL || servername == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
if (UniIsEmptyStr(cmdline))
|
|
{
|
|
cmdline = NULL;
|
|
}
|
|
|
|
pc = ZeroMalloc(sizeof(PC));
|
|
pc->ConsoleForServer = false;
|
|
pc->ServerName = CopyStr(servername);
|
|
pc->Console = c;
|
|
pc->LastError = 0;
|
|
pc->RemoteClient = remote_client;
|
|
pc->CmdLine = CopyUniStr(cmdline);
|
|
|
|
return pc;
|
|
}
|
|
|
|
// Release the client management tools context
|
|
void FreePc(PC *pc)
|
|
{
|
|
// Validate arguments
|
|
if (pc == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Free(pc->ServerName);
|
|
Free(pc->CmdLine);
|
|
Free(pc);
|
|
}
|
|
|
|
// Client management tool
|
|
UINT PcConnect(CONSOLE *c, char *target, wchar_t *cmdline, char *password)
|
|
{
|
|
CEDAR *cedar;
|
|
REMOTE_CLIENT *client;
|
|
bool bad_pass;
|
|
bool no_remote;
|
|
char pass[MAX_SIZE];
|
|
UINT ret = 0;
|
|
// Validate arguments
|
|
if (c == NULL || target == NULL)
|
|
{
|
|
return ERR_INTERNAL_ERROR;
|
|
}
|
|
|
|
StrCpy(pass, sizeof(pass), password);
|
|
|
|
cedar = NewCedar(NULL, NULL);
|
|
|
|
RETRY:
|
|
client = CcConnectRpc(target, pass, &bad_pass, &no_remote, 0);
|
|
|
|
if (client == NULL)
|
|
{
|
|
if (no_remote)
|
|
{
|
|
// Remote connection refusal
|
|
c->Write(c, _UU("CMD_VPNCMD_CLIENT_NO_REMODE"));
|
|
ReleaseCedar(cedar);
|
|
return ERR_INTERNAL_ERROR;
|
|
}
|
|
else if (bad_pass)
|
|
{
|
|
char *tmp;
|
|
// Password is different
|
|
c->Write(c, _UU("CMD_VPNCMD_PASSWORD_1"));
|
|
tmp = c->ReadPassword(c, _UU("CMD_VPNCMD_PASSWORD_2"));
|
|
c->Write(c, L"");
|
|
|
|
if (tmp == NULL)
|
|
{
|
|
// Cancel
|
|
ReleaseCedar(cedar);
|
|
return ERR_ACCESS_DENIED;
|
|
}
|
|
else
|
|
{
|
|
StrCpy(pass, sizeof(pass), tmp);
|
|
Free(tmp);
|
|
}
|
|
|
|
goto RETRY;
|
|
}
|
|
else
|
|
{
|
|
// Connection failure
|
|
CmdPrintError(c, ERR_CONNECT_FAILED);
|
|
ReleaseCedar(cedar);
|
|
return ERR_CONNECT_FAILED;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Connection complete
|
|
PC *pc = NewPc(c, client, target, cmdline);
|
|
PcMain(pc);
|
|
ret = pc->LastError;
|
|
FreePc(pc);
|
|
}
|
|
|
|
CcDisconnectRpc(client);
|
|
|
|
ReleaseCedar(cedar);
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
// Server Administration Tool Processor Main
|
|
void PsMain(PS *ps)
|
|
{
|
|
char prompt[MAX_SIZE];
|
|
wchar_t tmp[MAX_SIZE];
|
|
// Validate arguments
|
|
if (ps == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// If it's not in CSV mode, to display a message that the connection has been made
|
|
if(ps->Console->ConsoleType != CONSOLE_CSV)
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_SERVER_CONNECTED"),
|
|
ps->ServerName, ps->ServerPort);
|
|
ps->Console->Write(ps->Console, tmp);
|
|
ps->Console->Write(ps->Console, L"");
|
|
|
|
if (ps->HubName == NULL)
|
|
{
|
|
// Server management mode
|
|
ps->Console->Write(ps->Console, _UU("CMD_VPNCMD_SERVER_CONNECTED_1"));
|
|
}
|
|
else
|
|
{
|
|
// Virtual HUB management mode
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_SERVER_CONNECTED_2"),
|
|
ps->HubName);
|
|
ps->Console->Write(ps->Console, tmp);
|
|
}
|
|
ps->Console->Write(ps->Console, L"");
|
|
}
|
|
|
|
// Get the Caps
|
|
ps->CapsList = ScGetCapsEx(ps->Rpc);
|
|
|
|
if (ps->AdminHub != NULL)
|
|
{
|
|
RPC_HUB_STATUS t;
|
|
UINT ret;
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
// Choose the Virtual HUB that is specified in the ADMINHUB
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->AdminHub);
|
|
|
|
ret = ScGetHubStatus(ps->Rpc, &t);
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// Success
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_Hub_Selected"), t.HubName);
|
|
|
|
if (ps->HubName != NULL)
|
|
{
|
|
Free(ps->HubName);
|
|
}
|
|
ps->HubName = CopyStr(t.HubName);
|
|
|
|
if( ps->Console->ConsoleType != CONSOLE_CSV)
|
|
{
|
|
ps->Console->Write(ps->Console, tmp);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Failure
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_Hub_Select_Failed"), ps->AdminHub);
|
|
|
|
ps->Console->Write(ps->Console, tmp);
|
|
CmdPrintError(ps->Console, ret);
|
|
}
|
|
}
|
|
|
|
if (ps->HubName == NULL)
|
|
{
|
|
RPC_KEY_PAIR t;
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
if (ScGetServerCert(ps->Rpc, &t) == ERR_NO_ERROR)
|
|
{
|
|
if (t.Cert != NULL && t.Cert->has_basic_constraints == false)
|
|
{
|
|
if (t.Cert->root_cert)
|
|
{
|
|
ps->Console->Write(ps->Console, L"");
|
|
ps->Console->Write(ps->Console, _UU("SM_CERT_MESSAGE_CLI"));
|
|
ps->Console->Write(ps->Console, L"");
|
|
}
|
|
}
|
|
|
|
FreeRpcKeyPair(&t);
|
|
}
|
|
}
|
|
|
|
while (true)
|
|
{
|
|
// Definition of command
|
|
CMD cmd[] =
|
|
{
|
|
{"About", PsAbout},
|
|
{"Check", PtCheck},
|
|
{"Crash", PsCrash},
|
|
{"Flush", PsFlush},
|
|
{"Debug", PsDebug},
|
|
{"ServerInfoGet", PsServerInfoGet},
|
|
{"ServerStatusGet", PsServerStatusGet},
|
|
{"ListenerCreate", PsListenerCreate},
|
|
{"ListenerDelete", PsListenerDelete},
|
|
{"ListenerList", PsListenerList},
|
|
{"ListenerEnable", PsListenerEnable},
|
|
{"ListenerDisable", PsListenerDisable},
|
|
{"PortsUDPGet", PsPortsUDPGet},
|
|
{"PortsUDPSet", PsPortsUDPSet},
|
|
{"ProtoOptionsGet", PsProtoOptionsGet},
|
|
{"ProtoOptionsSet", PsProtoOptionsSet},
|
|
{"ServerPasswordSet", PsServerPasswordSet},
|
|
{"ClusterSettingGet", PsClusterSettingGet},
|
|
{"ClusterSettingStandalone", PsClusterSettingStandalone},
|
|
{"ClusterSettingController", PsClusterSettingController},
|
|
{"ClusterSettingMember", PsClusterSettingMember},
|
|
{"ClusterMemberList", PsClusterMemberList},
|
|
{"ClusterMemberInfoGet", PsClusterMemberInfoGet},
|
|
{"ClusterMemberCertGet", PsClusterMemberCertGet},
|
|
{"ClusterConnectionStatusGet", PsClusterConnectionStatusGet},
|
|
{"ServerCertGet", PsServerCertGet},
|
|
{"ServerKeyGet", PsServerKeyGet},
|
|
{"ServerCertSet", PsServerCertSet},
|
|
{"ServerCipherGet", PsServerCipherGet},
|
|
{"ServerCipherSet", PsServerCipherSet},
|
|
{"KeepEnable", PsKeepEnable},
|
|
{"KeepDisable", PsKeepDisable},
|
|
{"KeepSet", PsKeepSet},
|
|
{"KeepGet", PsKeepGet},
|
|
{"SyslogGet", PsSyslogGet},
|
|
{"SyslogDisable", PsSyslogDisable},
|
|
{"SyslogEnable", PsSyslogEnable},
|
|
{"ConnectionList", PsConnectionList},
|
|
{"ConnectionGet", PsConnectionGet},
|
|
{"ConnectionDisconnect", PsConnectionDisconnect},
|
|
{"BridgeDeviceList", PsBridgeDeviceList},
|
|
{"BridgeList", PsBridgeList},
|
|
{"BridgeCreate", PsBridgeCreate},
|
|
{"BridgeDelete", PsBridgeDelete},
|
|
{"Caps", PsCaps},
|
|
{"Reboot", PsReboot},
|
|
{"ConfigGet", PsConfigGet},
|
|
{"ConfigSet", PsConfigSet},
|
|
{"RouterList", PsRouterList},
|
|
{"RouterAdd", PsRouterAdd},
|
|
{"RouterDelete", PsRouterDelete},
|
|
{"RouterStart", PsRouterStart},
|
|
{"RouterStop", PsRouterStop},
|
|
{"RouterIfList", PsRouterIfList},
|
|
{"RouterIfAdd", PsRouterIfAdd},
|
|
{"RouterIfDel", PsRouterIfDel},
|
|
{"RouterTableList", PsRouterTableList},
|
|
{"RouterTableAdd", PsRouterTableAdd},
|
|
{"RouterTableDel", PsRouterTableDel},
|
|
{"LogFileList", PsLogFileList},
|
|
{"LogFileGet", PsLogFileGet},
|
|
{"WgkAdd", PsWgkAdd},
|
|
{"WgkDelete", PsWgkDelete},
|
|
{"WgkEnum", PsWgkEnum},
|
|
{"HubCreate", PsHubCreate},
|
|
{"HubCreateDynamic", PsHubCreateDynamic},
|
|
{"HubCreateStatic", PsHubCreateStatic},
|
|
{"HubDelete", PsHubDelete},
|
|
{"HubSetStatic", PsHubSetStatic},
|
|
{"HubSetDynamic", PsHubSetDynamic},
|
|
{"HubList", PsHubList},
|
|
{"Hub", PsHub},
|
|
{"Online", PsOnline},
|
|
{"Offline", PsOffline},
|
|
{"SetStaticNetwork", PsSetStaticNetwork},
|
|
{"SetMaxSession", PsSetMaxSession},
|
|
{"SetHubPassword", PsSetHubPassword},
|
|
{"SetEnumAllow", PsSetEnumAllow},
|
|
{"SetEnumDeny", PsSetEnumDeny},
|
|
{"OptionsGet", PsOptionsGet},
|
|
{"RadiusServerSet", PsRadiusServerSet},
|
|
{"RadiusServerDelete", PsRadiusServerDelete},
|
|
{"RadiusServerGet", PsRadiusServerGet},
|
|
{"StatusGet", PsStatusGet},
|
|
{"LogGet", PsLogGet},
|
|
{"LogEnable", PsLogEnable},
|
|
{"LogDisable", PsLogDisable},
|
|
{"LogSwitchSet", PsLogSwitchSet},
|
|
{"LogPacketSaveType", PsLogPacketSaveType},
|
|
{"CAList", PsCAList},
|
|
{"CAAdd", PsCAAdd},
|
|
{"CADelete", PsCADelete},
|
|
{"CAGet", PsCAGet},
|
|
{"CascadeList", PsCascadeList},
|
|
{"CascadeCreate", PsCascadeCreate},
|
|
{"CascadeSet", PsCascadeSet},
|
|
{"CascadeGet", PsCascadeGet},
|
|
{"CascadeDelete", PsCascadeDelete},
|
|
{"CascadeUsernameSet", PsCascadeUsernameSet},
|
|
{"CascadeAnonymousSet", PsCascadeAnonymousSet},
|
|
{"CascadePasswordSet", PsCascadePasswordSet},
|
|
{"CascadeCertSet", PsCascadeCertSet},
|
|
{"CascadeCertGet", PsCascadeCertGet},
|
|
{"CascadeEncryptEnable", PsCascadeEncryptEnable},
|
|
{"CascadeEncryptDisable", PsCascadeEncryptDisable},
|
|
{"CascadeCompressEnable", PsCascadeCompressEnable},
|
|
{"CascadeCompressDisable", PsCascadeCompressDisable},
|
|
{"CascadeProxyNone", PsCascadeProxyNone},
|
|
{"CascadeHttpHeaderAdd", PsCascadeHttpHeaderAdd},
|
|
{"CascadeHttpHeaderDelete", PsCascadeHttpHeaderDelete},
|
|
{"CascadeHttpHeaderGet", PsCascadeHttpHeaderGet},
|
|
{"CascadeProxyHttp", PsCascadeProxyHttp},
|
|
{"CascadeProxySocks", PsCascadeProxySocks},
|
|
{"CascadeProxySocks5", PsCascadeProxySocks5},
|
|
{"CascadeServerCertEnable", PsCascadeServerCertEnable},
|
|
{"CascadeServerCertDisable", PsCascadeServerCertDisable},
|
|
{"CascadeDefaultCAEnable", PsCascadeDefaultCAEnable},
|
|
{"CascadeDefaultCADisable", PsCascadeDefaultCADisable},
|
|
{"CascadeServerCertSet", PsCascadeServerCertSet},
|
|
{"CascadeServerCertDelete", PsCascadeServerCertDelete},
|
|
{"CascadeServerCertGet", PsCascadeServerCertGet},
|
|
{"CascadeDetailSet", PsCascadeDetailSet},
|
|
{"CascadePolicySet", PsCascadePolicySet},
|
|
{"PolicyList", PsPolicyList},
|
|
{"CascadeStatusGet", PsCascadeStatusGet},
|
|
{"CascadeRename", PsCascadeRename},
|
|
{"CascadeOnline", PsCascadeOnline},
|
|
{"CascadeOffline", PsCascadeOffline},
|
|
{"AccessAdd", PsAccessAdd},
|
|
{"AccessAddEx", PsAccessAddEx},
|
|
{"AccessAdd6", PsAccessAdd6},
|
|
{"AccessAddEx6", PsAccessAddEx6},
|
|
{"AccessList", PsAccessList},
|
|
{"AccessDelete", PsAccessDelete},
|
|
{"AccessEnable", PsAccessEnable},
|
|
{"AccessDisable", PsAccessDisable},
|
|
{"UserList", PsUserList},
|
|
{"UserCreate", PsUserCreate},
|
|
{"UserSet", PsUserSet},
|
|
{"UserDelete", PsUserDelete},
|
|
{"UserGet", PsUserGet},
|
|
{"UserAnonymousSet", PsUserAnonymousSet},
|
|
{"UserPasswordSet", PsUserPasswordSet},
|
|
{"UserCertSet", PsUserCertSet},
|
|
{"UserCertGet", PsUserCertGet},
|
|
{"UserSignedSet", PsUserSignedSet},
|
|
{"UserRadiusSet", PsUserRadiusSet},
|
|
{"UserNTLMSet", PsUserNTLMSet},
|
|
{"UserPolicyRemove", PsUserPolicyRemove},
|
|
{"UserPolicySet", PsUserPolicySet},
|
|
{"UserExpiresSet", PsUserExpiresSet},
|
|
{"GroupList", PsGroupList},
|
|
{"GroupCreate", PsGroupCreate},
|
|
{"GroupSet", PsGroupSet},
|
|
{"GroupDelete", PsGroupDelete},
|
|
{"GroupGet", PsGroupGet},
|
|
{"GroupJoin", PsGroupJoin},
|
|
{"GroupUnjoin", PsGroupUnjoin},
|
|
{"GroupPolicyRemove", PsGroupPolicyRemove},
|
|
{"GroupPolicySet", PsGroupPolicySet},
|
|
{"SessionList", PsSessionList},
|
|
{"SessionGet", PsSessionGet},
|
|
{"SessionDisconnect", PsSessionDisconnect},
|
|
{"MacTable", PsMacTable},
|
|
{"MacDelete", PsMacDelete},
|
|
{"IpTable", PsIpTable},
|
|
{"IpDelete", PsIpDelete},
|
|
{"SecureNatEnable", PsSecureNatEnable},
|
|
{"SecureNatDisable", PsSecureNatDisable},
|
|
{"SecureNatStatusGet", PsSecureNatStatusGet},
|
|
{"SecureNatHostGet", PsSecureNatHostGet},
|
|
{"SecureNatHostSet", PsSecureNatHostSet},
|
|
{"NatGet", PsNatGet},
|
|
{"NatEnable", PsNatEnable},
|
|
{"NatDisable", PsNatDisable},
|
|
{"NatSet", PsNatSet},
|
|
{"NatTable", PsNatTable},
|
|
{"DhcpGet", PsDhcpGet},
|
|
{"DhcpEnable", PsDhcpEnable},
|
|
{"DhcpDisable", PsDhcpDisable},
|
|
{"DhcpSet", PsDhcpSet},
|
|
{"DhcpTable", PsDhcpTable},
|
|
{"AdminOptionList", PsAdminOptionList},
|
|
{"AdminOptionSet", PsAdminOptionSet},
|
|
{"ExtOptionList", PsExtOptionList},
|
|
{"ExtOptionSet", PsExtOptionSet},
|
|
{"CrlList", PsCrlList},
|
|
{"CrlAdd", PsCrlAdd},
|
|
{"CrlDel", PsCrlDel},
|
|
{"CrlGet", PsCrlGet},
|
|
{"AcList", PsAcList},
|
|
{"AcAdd", PsAcAdd},
|
|
{"AcAdd6", PsAcAdd6},
|
|
{"AcDel", PsAcDel},
|
|
{"MakeCert", PtMakeCert},
|
|
{"MakeCert2048", PtMakeCert2048},
|
|
{"TrafficClient", PtTrafficClient},
|
|
{"TrafficServer", PtTrafficServer},
|
|
{"LicenseAdd", PsLicenseAdd},
|
|
{"LicenseDel", PsLicenseDel},
|
|
{"LicenseList", PsLicenseList},
|
|
{"LicenseStatus", PsLicenseStatus},
|
|
{"IPsecEnable", PsIPsecEnable},
|
|
{"IPsecGet", PsIPsecGet},
|
|
{"EtherIpClientAdd", PsEtherIpClientAdd},
|
|
{"EtherIpClientDelete", PsEtherIpClientDelete},
|
|
{"EtherIpClientList", PsEtherIpClientList},
|
|
{"OpenVpnMakeConfig", PsOpenVpnMakeConfig},
|
|
{"ServerCertRegenerate", PsServerCertRegenerate},
|
|
{"VpnOverIcmpDnsEnable", PsVpnOverIcmpDnsEnable},
|
|
{"VpnOverIcmpDnsGet", PsVpnOverIcmpDnsGet},
|
|
{"DynamicDnsGetStatus", PsDynamicDnsGetStatus},
|
|
{"DynamicDnsSetHostname", PsDynamicDnsSetHostname},
|
|
{"VpnAzureGetStatus", PsVpnAzureGetStatus},
|
|
{"VpnAzureSetEnable", PsVpnAzureSetEnable},
|
|
};
|
|
|
|
// Generate a prompt
|
|
if (ps->HubName == NULL)
|
|
{
|
|
Format(prompt, sizeof(prompt), "VPN Server>");
|
|
}
|
|
else
|
|
{
|
|
Format(prompt, sizeof(prompt), "VPN Server/%s>", ps->HubName);
|
|
}
|
|
|
|
if (DispatchNextCmdEx(ps->Console, ps->CmdLine, prompt, cmd, sizeof(cmd) / sizeof(cmd[0]), ps) == false)
|
|
{
|
|
break;
|
|
}
|
|
ps->LastError = ps->Console->RetCode;
|
|
|
|
if (ps->LastError == ERR_NO_ERROR && ps->Console->ConsoleType != CONSOLE_CSV)
|
|
{
|
|
ps->Console->Write(ps->Console, _UU("CMD_MSG_OK"));
|
|
ps->Console->Write(ps->Console, L"");
|
|
}
|
|
|
|
if (ps->CmdLine != NULL)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Release the Caps
|
|
FreeCapsList(ps->CapsList);
|
|
ps->CapsList = NULL;
|
|
}
|
|
|
|
// A template for a new command function
|
|
UINT PsXxx(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret;
|
|
RPC_LISTENER t;
|
|
PARAM args[] =
|
|
{
|
|
{"[port]", CmdPromptPort, _UU("CMD_ListenerCreate_PortPrompt"), CmdEvalPort, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.Enable = true;
|
|
t.Port = ToInt(GetParamStr(o, "[port]"));
|
|
|
|
ret = ScCreateListener(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set to the stand-alone mode
|
|
UINT PsClusterSettingStandalone(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_FARM t;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.ServerType = SERVER_TYPE_STANDALONE;
|
|
|
|
// RPC call
|
|
ret = ScSetFarmSetting(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set to the cluster controller mode
|
|
UINT PsClusterSettingController(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_FARM t;
|
|
UINT weight;
|
|
PARAM args[] =
|
|
{
|
|
{"WEIGHT", NULL, NULL, NULL, NULL},
|
|
{"ONLY", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
weight = GetParamInt(o, "WEIGHT");
|
|
if (weight == 0)
|
|
{
|
|
weight = FARM_DEFAULT_WEIGHT;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.ServerType = SERVER_TYPE_FARM_CONTROLLER;
|
|
t.Weight = weight;
|
|
t.ControllerOnly = GetParamYes(o, "ONLY");
|
|
|
|
// RPC call
|
|
ret = ScSetFarmSetting(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Evaluate the IP address
|
|
bool CmdEvalIp(CONSOLE *c, wchar_t *str, void *param)
|
|
{
|
|
// Validate arguments
|
|
if (c == NULL || str == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (UniIsEmptyStr(str))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
if (UniStrToIP32(str) == 0 && UniStrCmpi(str, L"0.0.0.0") != 0)
|
|
{
|
|
wchar_t *msg = (param == NULL) ? _UU("CMD_IP_EVAL_FAILED") : (wchar_t *)param;
|
|
c->Write(c, msg);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Convert a string to port list
|
|
LIST *StrToPortList(char *str, bool limit_range)
|
|
{
|
|
LIST *o;
|
|
TOKEN_LIST *t;
|
|
UINT i;
|
|
if (str == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
// Convert to token
|
|
t = ParseToken(str, ", ");
|
|
if (t == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
if (t->NumTokens == 0)
|
|
{
|
|
FreeToken(t);
|
|
return NULL;
|
|
}
|
|
|
|
o = NewListFast(NULL);
|
|
|
|
for (i = 0;i < t->NumTokens;i++)
|
|
{
|
|
char *s = t->Token[i];
|
|
UINT n;
|
|
if (IsNum(s) == false)
|
|
{
|
|
ReleaseList(o);
|
|
FreeToken(t);
|
|
return NULL;
|
|
}
|
|
n = ToInt(s);
|
|
if (limit_range && (n == 0 || n >= 65536))
|
|
{
|
|
ReleaseList(o);
|
|
FreeToken(t);
|
|
return NULL;
|
|
}
|
|
if (IsInList(o, (void *)n))
|
|
{
|
|
ReleaseList(o);
|
|
FreeToken(t);
|
|
return NULL;
|
|
}
|
|
Add(o, (void *)n);
|
|
}
|
|
|
|
FreeToken(t);
|
|
|
|
if (LIST_NUM(o) > MAX_PUBLIC_PORT_NUM)
|
|
{
|
|
ReleaseList(o);
|
|
return NULL;
|
|
}
|
|
|
|
return o;
|
|
}
|
|
|
|
// Set to the cluster member mode
|
|
UINT PsClusterSettingMember(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_FARM t;
|
|
char *host_and_port;
|
|
char *host;
|
|
UINT port;
|
|
UINT weight;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[server:port]", CmdPrompt, _UU("CMD_ClusterSettingMember_Prompt_HOST_1"), CmdEvalHostAndPort, NULL},
|
|
{"IP", PsClusterSettingMemberPromptIp, NULL, CmdEvalIp, NULL},
|
|
{"PORTS", PsClusterSettingMemberPromptPorts, NULL, CmdEvalPortList, (void *)true},
|
|
{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
|
|
{"WEIGHT", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
weight = GetParamInt(o, "WEIGHT");
|
|
|
|
if (weight == 0)
|
|
{
|
|
weight = FARM_DEFAULT_WEIGHT;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
host_and_port = GetParamStr(o, "[server:port]");
|
|
if (ParseHostPort(host_and_port, &host, &port, 0))
|
|
{
|
|
char *pw;
|
|
char *ports_str;
|
|
LIST *ports;
|
|
UINT i;
|
|
|
|
StrCpy(t.ControllerName, sizeof(t.ControllerName), host);
|
|
t.ControllerPort = port;
|
|
Free(host);
|
|
|
|
pw = GetParamStr(o, "PASSWORD");
|
|
|
|
Sha0(t.MemberPassword, pw, StrLen(pw));
|
|
t.PublicIp = StrToIP32(GetParamStr(o, "IP"));
|
|
t.ServerType = SERVER_TYPE_FARM_MEMBER;
|
|
|
|
ports_str = GetParamStr(o, "PORTS");
|
|
|
|
ports = StrToPortList(ports_str, true);
|
|
|
|
t.NumPort = LIST_NUM(ports);
|
|
t.Ports = ZeroMalloc(sizeof(UINT) * t.NumPort);
|
|
|
|
for (i = 0;i < t.NumPort;i++)
|
|
{
|
|
t.Ports[i] = (UINT)LIST_DATA(ports, i);
|
|
}
|
|
|
|
t.Weight = weight;
|
|
|
|
ReleaseList(ports);
|
|
|
|
// RPC call
|
|
ret = ScSetFarmSetting(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcFarm(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Evaluate the port list
|
|
bool CmdEvalPortList(CONSOLE *c, wchar_t *str, void *param)
|
|
{
|
|
char *s;
|
|
bool ret = false;
|
|
LIST *o;
|
|
// Validate arguments
|
|
if (c == NULL || str == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
s = CopyUniToStr(str);
|
|
|
|
o = StrToPortList(s, (bool)param);
|
|
|
|
if (o != NULL)
|
|
{
|
|
ret = true;
|
|
}
|
|
|
|
ReleaseList(o);
|
|
|
|
Free(s);
|
|
|
|
if (ret == false)
|
|
{
|
|
c->Write(c, _UU("CMD_PORTLIST_EVAL_FAILED"));
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Check the string of the form of the host name and port number
|
|
bool CmdEvalHostAndPort(CONSOLE *c, wchar_t *str, void *param)
|
|
{
|
|
char *tmp;
|
|
bool ret = false;
|
|
// Validate arguments
|
|
if (c == NULL || str == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
tmp = CopyUniToStr(str);
|
|
|
|
ret = ParseHostPort(tmp, NULL, NULL, (UINT)param);
|
|
|
|
if (ret == false)
|
|
{
|
|
c->Write(c, param == NULL ? _UU("CMD_HOSTPORT_EVAL_FAILED") : (wchar_t *)param);
|
|
}
|
|
|
|
Free(tmp);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Input the public port number
|
|
wchar_t *PsClusterSettingMemberPromptPorts(CONSOLE *c, void *param)
|
|
{
|
|
wchar_t *ret;
|
|
// Validate arguments
|
|
if (c == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
c->Write(c, _UU("CMD_ClusterSettingMember_Prompt_PORT_1"));
|
|
c->Write(c, L"");
|
|
|
|
ret = c->ReadLine(c, _UU("CMD_ClusterSettingMember_Prompt_PORT_2"), true);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Input the public IP address
|
|
wchar_t *PsClusterSettingMemberPromptIp(CONSOLE *c, void *param)
|
|
{
|
|
wchar_t *ret;
|
|
// Validate arguments
|
|
if (c == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
c->Write(c, _UU("CMD_ClusterSettingMember_Prompt_IP_1"));
|
|
c->Write(c, L"");
|
|
|
|
ret = c->ReadLine(c, _UU("CMD_ClusterSettingMember_Prompt_IP_2"), true);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Show the cluster members list
|
|
UINT PsClusterMemberList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_FARM t;
|
|
CT *ct;
|
|
UINT i;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScEnumFarmMember(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
ct = CtNew();
|
|
|
|
CtInsertColumn(ct, _UU("CMD_ID"), true);
|
|
CtInsertColumn(ct, _UU("SM_FM_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("SM_FM_COLUMN_2"), false);
|
|
CtInsertColumn(ct, _UU("SM_FM_COLUMN_3"), false);
|
|
CtInsertColumn(ct, _UU("SM_FM_COLUMN_4"), true);
|
|
CtInsertColumn(ct, _UU("SM_FM_COLUMN_5"), true);
|
|
CtInsertColumn(ct, _UU("SM_FM_COLUMN_6"), true);
|
|
CtInsertColumn(ct, _UU("SM_FM_COLUMN_7"), true);
|
|
CtInsertColumn(ct, _UU("SM_FM_COLUMN_8"), true);
|
|
CtInsertColumn(ct, _UU("SM_FM_COLUMN_9"), true);
|
|
|
|
for (i = 0;i < t.NumFarm;i++)
|
|
{
|
|
RPC_ENUM_FARM_ITEM *e = &t.Farms[i];
|
|
wchar_t tmp0[64];
|
|
wchar_t tmp1[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
wchar_t tmp3[64];
|
|
wchar_t tmp4[64];
|
|
wchar_t tmp5[64];
|
|
wchar_t tmp6[64];
|
|
wchar_t tmp7[64];
|
|
wchar_t tmp8[64];
|
|
|
|
GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->ConnectedTime), NULL);
|
|
StrToUni(tmp2, sizeof(tmp2), e->Hostname);
|
|
UniToStru(tmp3, e->Point);
|
|
UniToStru(tmp4, e->NumSessions);
|
|
UniToStru(tmp5, e->NumTcpConnections);
|
|
UniToStru(tmp6, e->NumHubs);
|
|
UniToStru(tmp7, e->AssignedClientLicense);
|
|
UniToStru(tmp8, e->AssignedBridgeLicense);
|
|
|
|
UniToStru(tmp0, e->Id);
|
|
|
|
CtInsert(ct, tmp0,
|
|
e->Controller ? _UU("SM_FM_CONTROLLER") : _UU("SM_FM_MEMBER"),
|
|
tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
|
|
FreeRpcEnumFarm(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get information of cluster members
|
|
UINT PsClusterMemberInfoGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_FARM_INFO t;
|
|
CT *ct;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[id]", CmdPrompt, _UU("CMD_ClusterMemberInfoGet_PROMPT_ID"), NULL, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.Id = UniToInt(GetParamUniStr(o, "[id]"));
|
|
|
|
// RPC call
|
|
ret = ScGetFarmInfo(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
ct = CtNewStandard();
|
|
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
char str[MAX_SIZE];
|
|
UINT i;
|
|
|
|
CtInsert(ct, _UU("SM_FMINFO_TYPE"),
|
|
t.Controller ? _UU("SM_FARM_CONTROLLER") : _UU("SM_FARM_MEMBER"));
|
|
|
|
GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ConnectedTime), NULL);
|
|
CtInsert(ct, _UU("SM_FMINFO_CONNECT_TIME"), tmp);
|
|
|
|
IPToStr32(str, sizeof(str), t.Ip);
|
|
StrToUni(tmp, sizeof(tmp), str);
|
|
CtInsert(ct, _UU("SM_FMINFO_IP"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.Hostname);
|
|
CtInsert(ct, _UU("SM_FMINFO_HOSTNAME"), tmp);
|
|
|
|
UniToStru(tmp, t.Point);
|
|
CtInsert(ct, _UU("SM_FMINFO_POINT"), tmp);
|
|
|
|
UniToStru(tmp, t.Weight);
|
|
CtInsert(ct, _UU("SM_FMINFO_WEIGHT"), tmp);
|
|
|
|
UniToStru(tmp, t.NumPort);
|
|
CtInsert(ct, _UU("SM_FMINFO_NUM_PORT"), tmp);
|
|
|
|
for (i = 0;i < t.NumPort;i++)
|
|
{
|
|
wchar_t tmp2[MAX_SIZE];
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_FMINFO_PORT"), i + 1);
|
|
UniToStru(tmp2, t.Ports[i]);
|
|
CtInsert(ct, tmp, tmp2);
|
|
}
|
|
|
|
UniToStru(tmp, t.NumFarmHub);
|
|
CtInsert(ct, _UU("SM_FMINFO_NUM_HUB"), tmp);
|
|
|
|
for (i = 0;i < t.NumFarmHub;i++)
|
|
{
|
|
wchar_t tmp2[MAX_SIZE];
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_FMINFO_HUB"), i + 1);
|
|
UniFormat(tmp2, sizeof(tmp2),
|
|
t.FarmHubs[i].DynamicHub ? _UU("SM_FMINFO_HUB_TAG_2") : _UU("SM_FMINFO_HUB_TAG_1"),
|
|
t.FarmHubs[i].HubName);
|
|
CtInsert(ct, tmp, tmp2);
|
|
}
|
|
|
|
UniToStru(tmp, t.NumSessions);
|
|
CtInsert(ct, _UU("SM_FMINFO_NUM_SESSION"), tmp);
|
|
|
|
UniToStru(tmp, t.NumTcpConnections);
|
|
CtInsert(ct, _UU("SM_FMINFO_NUN_CONNECTION"), tmp);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
|
|
FreeRpcFarmInfo(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get certificates of cluster members
|
|
UINT PsClusterMemberCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_FARM_INFO t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[id]", CmdPrompt, _UU("CMD_ClusterMemberCertGet_PROMPT_ID"), NULL, NULL},
|
|
{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
t.Id = UniToInt(GetParamUniStr(o, "[id]"));
|
|
|
|
// RPC call
|
|
ret = ScGetFarmInfo(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
X *x = t.ServerCert;
|
|
wchar_t *filename = GetParamUniStr(o, "SAVECERT");
|
|
|
|
if (XToFileW(x, filename, true) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_SAVECERT_FAILED"));
|
|
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
}
|
|
|
|
FreeRpcFarmInfo(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get the status of the connection to the cluster controller
|
|
UINT PsClusterConnectionStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_FARM_CONNECTION_STATUS t;
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScGetFarmConnectionStatus(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNewStandard();
|
|
char str[MAX_SIZE];
|
|
|
|
if (t.Online == false)
|
|
{
|
|
CtInsert(ct, _UU("SM_FC_IP"), _UU("SM_FC_NOT_CONNECTED"));
|
|
|
|
CtInsert(ct, _UU("SM_FC_PORT"), _UU("SM_FC_NOT_CONNECTED"));
|
|
}
|
|
else
|
|
{
|
|
IPToStr32(str, sizeof(str), t.Ip);
|
|
StrToUni(tmp, sizeof(tmp), str);
|
|
CtInsert(ct, _UU("SM_FC_IP"), tmp);
|
|
|
|
UniToStru(tmp, t.Port);
|
|
CtInsert(ct, _UU("SM_FC_PORT"), tmp);
|
|
}
|
|
|
|
CtInsert(ct,
|
|
_UU("SM_FC_STATUS"),
|
|
t.Online ? _UU("SM_FC_ONLINE") : _UU("SM_FC_OFFLINE"));
|
|
|
|
if (t.Online == false)
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_FC_ERROR_TAG"), _E(t.LastError), t.LastError);
|
|
CtInsert(ct,
|
|
_UU("SM_FC_LAST_ERROR"), tmp);
|
|
}
|
|
|
|
GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.StartedTime), NULL);
|
|
CtInsert(ct, _UU("SM_FC_START_TIME"), tmp);
|
|
|
|
GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.FirstConnectedTime), NULL);
|
|
CtInsert(ct, _UU("SM_FC_FIRST_TIME"), tmp);
|
|
|
|
//if (t.Online == false)
|
|
{
|
|
GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.CurrentConnectedTime), NULL);
|
|
CtInsert(ct, _UU("SM_FC_CURRENT_TIME"), tmp);
|
|
}
|
|
|
|
UniToStru(tmp, t.NumTry);
|
|
CtInsert(ct, _UU("SM_FC_NUM_TRY"), tmp);
|
|
|
|
UniToStru(tmp, t.NumConnected);
|
|
CtInsert(ct, _UU("SM_FC_NUM_CONNECTED"), tmp);
|
|
|
|
UniToStru(tmp, t.NumFailed);
|
|
CtInsert(ct, _UU("SM_FC_NUM_FAILED"), tmp);
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the SSL certificate of the VPN Server
|
|
UINT PsServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_KEY_PAIR t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[cert]", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScGetServerCert(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
if (XToFileW(t.Cert, GetParamUniStr(o, "[cert]"), true) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_SAVECERT_FAILED"));
|
|
}
|
|
|
|
FreeRpcKeyPair(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the private key of the SSL certificate of the VPN Server
|
|
UINT PsServerKeyGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_KEY_PAIR t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[key]", CmdPrompt, _UU("CMD_SAVEKEYPATH"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScGetServerCert(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
if (t.Key != NULL)
|
|
{
|
|
if (KToFileW(t.Key, GetParamUniStr(o, "[key]"), true, NULL) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_SAVEKEY_FAILED"));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ret = ERR_NOT_ENOUGH_RIGHT;
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
FreeRpcKeyPair(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Read the certificate and the private key
|
|
bool CmdLoadCertAndKey(CONSOLE *c, X **xx, K **kk, wchar_t *cert_filename, wchar_t *key_filename)
|
|
{
|
|
return CmdLoadCertChainAndKey(c, xx, kk, NULL, cert_filename, key_filename);
|
|
}
|
|
bool CmdLoadCertChainAndKey(CONSOLE *c, X **xx, K **kk, LIST **cc, wchar_t *cert_filename, wchar_t *key_filename)
|
|
{
|
|
X *x = NULL;
|
|
K *k;
|
|
LIST *chain = NULL;
|
|
// Validate arguments
|
|
if (c == NULL || cert_filename == NULL || key_filename == NULL || xx == NULL || kk == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
BUF *b = ReadDumpW(cert_filename);
|
|
if (b == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_LOADCERT_FAILED"));
|
|
return false;
|
|
}
|
|
|
|
// DER-encoded X509 files can't hold multiple certificates
|
|
if (cc == NULL || IsBase64(b) == false)
|
|
{
|
|
x = BufToX(b, IsBase64(b));
|
|
}
|
|
else
|
|
{
|
|
chain = BufToXList(b, true);
|
|
if (LIST_NUM(chain) > 0)
|
|
{
|
|
x = LIST_DATA(chain, 0);
|
|
Delete(chain, x);
|
|
|
|
if (LIST_NUM(chain) == 0)
|
|
{
|
|
ReleaseList(chain);
|
|
chain = NULL;
|
|
}
|
|
}
|
|
}
|
|
FreeBuf(b);
|
|
if (x == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_LOADCERT_FAILED"));
|
|
FreeXList(chain);
|
|
return false;
|
|
}
|
|
|
|
k = CmdLoadKey(c, key_filename);
|
|
if (k == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_LOADKEY_FAILED"));
|
|
FreeX(x);
|
|
FreeXList(chain);
|
|
return false;
|
|
}
|
|
|
|
if (CheckXandK(x, k) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_KEYPAIR_FAILED"));
|
|
FreeX(x);
|
|
FreeK(k);
|
|
FreeXList(chain);
|
|
|
|
return false;
|
|
}
|
|
|
|
*xx = x;
|
|
*kk = k;
|
|
if (cc != NULL)
|
|
{
|
|
*cc = chain;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Read the secret key
|
|
K *CmdLoadKey(CONSOLE *c, wchar_t *filename)
|
|
{
|
|
BUF *b;
|
|
// Validate arguments
|
|
if (c == NULL || filename == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
b = ReadDumpW(filename);
|
|
if (b == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_LOADCERT_FAILED"));
|
|
return NULL;
|
|
}
|
|
else
|
|
{
|
|
K *key;
|
|
if (IsEncryptedK(b, true) == false)
|
|
{
|
|
key = BufToK(b, true, IsBase64(b), NULL);
|
|
}
|
|
else
|
|
{
|
|
c->Write(c, _UU("CMD_LOADKEY_ENCRYPTED_1"));
|
|
|
|
while (true)
|
|
{
|
|
char *pass = c->ReadPassword(c, _UU("CMD_LOADKEY_ENCRYPTED_2"));
|
|
|
|
if (pass == NULL)
|
|
{
|
|
FreeBuf(b);
|
|
return NULL;
|
|
}
|
|
|
|
key = BufToK(b, true, IsBase64(b), pass);
|
|
Free(pass);
|
|
|
|
if (key != NULL)
|
|
{
|
|
break;
|
|
}
|
|
|
|
c->Write(c, _UU("CMD_LOADKEY_ENCRYPTED_3"));
|
|
}
|
|
}
|
|
|
|
FreeBuf(b);
|
|
|
|
return key;
|
|
}
|
|
}
|
|
|
|
// Set the SSL certificate and the private key of the VPN Server
|
|
UINT PsServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_KEY_PAIR t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
|
|
{"LOADKEY", CmdPrompt, _UU("CMD_LOADKEYPATH"), CmdEvalIsFile, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
if (CmdLoadCertChainAndKey(c, &t.Cert, &t.Key, &t.Chain,
|
|
GetParamUniStr(o, "LOADCERT"),
|
|
GetParamUniStr(o, "LOADKEY")))
|
|
{
|
|
// RPC call
|
|
ret = ScSetServerCert(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
if (t.Flag1 == 0)
|
|
{
|
|
// Show the warning message
|
|
c->Write(c, L"");
|
|
c->Write(c, _UU("SM_CERT_NEED_ROOT"));
|
|
c->Write(c, L"");
|
|
}
|
|
|
|
FreeRpcKeyPair(&t);
|
|
}
|
|
else
|
|
{
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get the encryption algorithm used for the VPN communication
|
|
UINT PsServerCipherGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_STR t;
|
|
TOKEN_LIST *ciphers;
|
|
UINT i;
|
|
wchar_t tmp[4096];
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScGetServerCipher(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
UniFormat(tmp, sizeof(tmp), L" %S", t.String);
|
|
FreeRpcStr(&t);
|
|
Zero(&t, sizeof(RPC_STR));
|
|
|
|
c->Write(c, _UU("CMD_ServerCipherGet_SERVER"));
|
|
c->Write(c, tmp);
|
|
|
|
ret = ScGetServerCipherList(ps->Rpc, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
ciphers = ParseToken(t.String, ";");
|
|
|
|
FreeRpcStr(&t);
|
|
|
|
c->Write(c, L"");
|
|
c->Write(c, _UU("CMD_ServerCipherGet_CIPHERS"));
|
|
|
|
for (i = 0; i < ciphers->NumTokens; i++)
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), L" %S", ciphers->Token[i]);
|
|
c->Write(c, tmp);
|
|
}
|
|
|
|
FreeToken(ciphers);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the encryption algorithm used for the VPN communication
|
|
UINT PsServerCipherSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_STR t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_ServerCipherSet_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.String = CopyStr(GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScSetServerCipher(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcStr(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Enabling the maintenance function of the Internet connection
|
|
UINT PsKeepEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_KEEP t;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScGetKeep(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
t.UseKeepConnect = true;
|
|
|
|
ret = ScSetKeep(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Disabling the maintenance function of the Internet connection
|
|
UINT PsKeepDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_KEEP t;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScGetKeep(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
t.UseKeepConnect = false;
|
|
|
|
ret = ScSetKeep(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Evaluate the UDP or the TCP
|
|
bool CmdEvalTcpOrUdp(CONSOLE *c, wchar_t *str, void *param)
|
|
{
|
|
// Validate arguments
|
|
if (c == NULL || str == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (UniStrCmpi(str, L"tcp") == 0 || UniStrCmpi(str, L"udp") == 0)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
c->Write(c, _UU("CMD_KeepSet_EVAL_TCP_UDP"));
|
|
|
|
return false;
|
|
}
|
|
|
|
// Enable the syslog configuration
|
|
UINT PsSyslogEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
SYSLOG_SETTING t;
|
|
CMD_EVAL_MIN_MAX minmax = {"CMD_SyslogEnable_MINMAX", 1, 3};
|
|
char *host;
|
|
UINT port;
|
|
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[1|2|3]", CmdPrompt, _UU("CMD_SyslogEnable_Prompt_123"), CmdEvalMinMax, &minmax},
|
|
{"HOST", CmdPrompt, _UU("CMD_SyslogEnable_Prompt_HOST"), CmdEvalHostAndPort, (void *)SYSLOG_PORT},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
if (ParseHostPort(GetParamStr(o, "HOST"), &host, &port, SYSLOG_PORT))
|
|
{
|
|
StrCpy(t.Hostname, sizeof(t.Hostname), host);
|
|
t.Port = port;
|
|
t.SaveType = GetParamInt(o, "[1|2|3]");
|
|
|
|
Free(host);
|
|
|
|
// RPC call
|
|
ret = ScSetSysLog(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Disable the syslog configuration
|
|
UINT PsSyslogDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
SYSLOG_SETTING t;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScGetSysLog(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
t.SaveType = SYSLOG_NONE;
|
|
|
|
// RPC call
|
|
ret = ScSetSysLog(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the syslog configuration
|
|
UINT PsSyslogGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
SYSLOG_SETTING t;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScGetSysLog(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
CT *ct = CtNewStandard();
|
|
|
|
CtInsert(ct, _UU("CMD_SyslogGet_COLUMN_1"), GetSyslogSettingName(t.SaveType));
|
|
|
|
if (t.SaveType != SYSLOG_NONE)
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), t.Hostname);
|
|
CtInsert(ct, _UU("CMD_SyslogGet_COLUMN_2"), tmp);
|
|
|
|
UniToStru(tmp, t.Port);
|
|
CtInsert(ct, _UU("CMD_SyslogGet_COLUMN_3"), tmp);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the syslog configuration name
|
|
wchar_t *GetSyslogSettingName(UINT n)
|
|
{
|
|
char tmp[MAX_PATH];
|
|
|
|
Format(tmp, sizeof(tmp), "SM_SYSLOG_%u", n);
|
|
|
|
return _UU(tmp);
|
|
}
|
|
|
|
// Setting of maintenance function of the Internet connection
|
|
UINT PsKeepSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_KEEP t;
|
|
char *host;
|
|
UINT port;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"HOST", CmdPrompt, _UU("CMD_KeepSet_PROMPT_HOST"), CmdEvalHostAndPort, NULL},
|
|
{"PROTOCOL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_PROTOCOL"), CmdEvalTcpOrUdp, NULL},
|
|
{"INTERVAL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_INTERVAL"), NULL, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScGetKeep(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
if (ParseHostPort(GetParamStr(o, "HOST"), &host, &port, 0))
|
|
{
|
|
StrCpy(t.KeepConnectHost, sizeof(t.KeepConnectHost), host);
|
|
t.KeepConnectPort = port;
|
|
t.KeepConnectInterval = GetParamInt(o, "INTERVAL");
|
|
t.KeepConnectProtocol = (StrCmpi(GetParamStr(o, "PROTOCOL"), "tcp") == 0) ? 0 : 1;
|
|
Free(host);
|
|
|
|
// RPC call
|
|
ret = ScSetKeep(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the maintenance function of the Internet connection
|
|
UINT PsKeepGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_KEEP t;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScGetKeep(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
CT *ct = CtNewStandard();
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.KeepConnectHost);
|
|
CtInsert(ct, _UU("CMD_KeepGet_COLUMN_1"), tmp);
|
|
|
|
UniToStru(tmp, t.KeepConnectPort);
|
|
CtInsert(ct, _UU("CMD_KeepGet_COLUMN_2"), tmp);
|
|
|
|
UniToStru(tmp, t.KeepConnectInterval);
|
|
CtInsert(ct, _UU("CMD_KeepGet_COLUMN_3"), tmp);
|
|
|
|
CtInsert(ct, _UU("CMD_KeepGet_COLUMN_4"),
|
|
t.KeepConnectProtocol == 0 ? L"TCP/IP" : L"UDP/IP");
|
|
|
|
CtInsert(ct, _UU("CMD_KeepGet_COLUMN_5"),
|
|
t.UseKeepConnect ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"));
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the connection type string
|
|
wchar_t *GetConnectionTypeStr(UINT type)
|
|
{
|
|
char tmp[MAX_SIZE];
|
|
Format(tmp, sizeof(tmp), "SM_CONNECTION_TYPE_%u", type);
|
|
|
|
return _UU(tmp);
|
|
}
|
|
|
|
// Get the list of TCP connections connected to VPN Server
|
|
UINT PsConnectionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_CONNECTION t;
|
|
UINT i;
|
|
CT *ct;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScEnumConnection(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
ct = CtNew();
|
|
CtInsertColumn(ct, _UU("SM_CONN_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("SM_CONN_COLUMN_2"), false);
|
|
CtInsertColumn(ct, _UU("SM_CONN_COLUMN_3"), false);
|
|
CtInsertColumn(ct, _UU("SM_CONN_COLUMN_4"), false);
|
|
|
|
for (i = 0;i < t.NumConnection;i++)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
wchar_t name[MAX_SIZE];
|
|
wchar_t datetime[MAX_SIZE];
|
|
RPC_ENUM_CONNECTION_ITEM *e = &t.Connections[i];
|
|
|
|
StrToUni(name, sizeof(name), e->Name);
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_HOSTNAME_AND_PORT"), e->Hostname, e->Port);
|
|
GetDateTimeStrEx64(datetime, sizeof(datetime), SystemToLocal64(e->ConnectedTime), NULL);
|
|
|
|
CtInsert(ct, name, tmp, datetime,
|
|
GetConnectionTypeStr(e->Type));
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
|
|
FreeRpcEnumConnection(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the TCP connection information currently connected to the VPN Server
|
|
UINT PsConnectionGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CONNECTION_INFO t;
|
|
CT *ct;
|
|
wchar_t tmp[MAX_SIZE];
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_ConnectionGet_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetConnectionInfo(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
ct = CtNewStandard();
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.Name);
|
|
CtInsert(ct, _UU("SM_CONNINFO_NAME"), tmp);
|
|
|
|
CtInsert(ct, _UU("SM_CONNINFO_TYPE"), GetConnectionTypeStr(t.Type));
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.Hostname);
|
|
CtInsert(ct, _UU("SM_CONNINFO_HOSTNAME"), tmp);
|
|
|
|
UniToStru(tmp, t.Port);
|
|
CtInsert(ct, _UU("SM_CONNINFO_PORT"), tmp);
|
|
|
|
GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ConnectedTime), NULL);
|
|
CtInsert(ct, _UU("SM_CONNINFO_TIME"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.ServerStr);
|
|
CtInsert(ct, _UU("SM_CONNINFO_SERVER_STR"), tmp);
|
|
|
|
UniFormat(tmp, sizeof(tmp), L"%u.%02u", t.ServerVer / 100, t.ServerVer % 100);
|
|
CtInsert(ct, _UU("SM_CONNINFO_SERVER_VER"), tmp);
|
|
|
|
UniToStru(tmp, t.ServerBuild);
|
|
CtInsert(ct, _UU("SM_CONNINFO_SERVER_BUILD"), tmp);
|
|
|
|
if (StrLen(t.ClientStr) != 0)
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), t.ClientStr);
|
|
CtInsert(ct, _UU("SM_CONNINFO_CLIENT_STR"), tmp);
|
|
|
|
UniFormat(tmp, sizeof(tmp), L"%u.%02u", t.ClientVer / 100, t.ClientVer % 100);
|
|
CtInsert(ct, _UU("SM_CONNINFO_CLIENT_VER"), tmp);
|
|
|
|
UniToStru(tmp, t.ClientBuild);
|
|
CtInsert(ct, _UU("SM_CONNINFO_CLIENT_BUILD"), tmp);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Disconnect the TCP connection connected to the VPN Server
|
|
UINT PsConnectionDisconnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_DISCONNECT_CONNECTION t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_ConnectionDisconnect_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScDisconnectConnection(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the LAN card list that can be used for local bridge
|
|
UINT PsBridgeDeviceList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_ETH t;
|
|
UINT i;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScEnumEthernet(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
RPC_ENUM_ETH_ITEM *item = &t.Items[i];
|
|
wchar_t tmp[MAX_SIZE * 2];
|
|
|
|
StrToUni(tmp, sizeof(tmp), item->DeviceName);
|
|
c->Write(c, tmp);
|
|
}
|
|
|
|
FreeRpcEnumEth(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the list of local bridge connection
|
|
UINT PsBridgeList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_LOCALBRIDGE t;
|
|
UINT i;
|
|
CT *ct;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScEnumLocalBridge(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
ct = CtNew();
|
|
|
|
CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_2"), false);
|
|
CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_3"), false);
|
|
CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_4"), false);
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
RPC_LOCALBRIDGE *e = &t.Items[i];
|
|
wchar_t name[MAX_SIZE];
|
|
wchar_t nic[MAX_SIZE];
|
|
wchar_t hub[MAX_SIZE];
|
|
wchar_t *status = _UU("SM_BRIDGE_OFFLINE");
|
|
|
|
UniToStru(name, i + 1);
|
|
StrToUni(nic, sizeof(nic), e->DeviceName);
|
|
StrToUni(hub, sizeof(hub), e->HubName);
|
|
|
|
if (e->Online)
|
|
{
|
|
status = e->Active ? _UU("SM_BRIDGE_ONLINE") : _UU("SM_BRIDGE_ERROR");
|
|
}
|
|
|
|
CtInsert(ct, name, hub, nic, status);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
|
|
FreeRpcEnumLocalBridge(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Create a local bridge connection
|
|
UINT PsBridgeCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_LOCALBRIDGE t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[hubname]", CmdPrompt, _UU("CMD_BridgeCreate_PROMPT_HUBNAME"), CmdEvalNotEmpty, NULL},
|
|
{"DEVICE", CmdPrompt, _UU("CMD_BridgeCreate_PROMPT_DEVICE"), CmdEvalNotEmpty, NULL},
|
|
{"TAP", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
t.Active = true;
|
|
StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "DEVICE"));
|
|
StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[hubname]"));
|
|
t.Online = true;
|
|
t.TapMode = GetParamYes(o, "TAP");
|
|
|
|
// RPC call
|
|
ret = ScAddLocalBridge(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
c->Write(c, _UU("SM_BRIDGE_INTEL"));
|
|
c->Write(c, L"");
|
|
|
|
if (GetCapsBool(ps->CapsList, "b_is_in_vm"))
|
|
{
|
|
// Message in the case of operating in a VM
|
|
c->Write(c, _UU("D_SM_VMBRIDGE@CAPTION"));
|
|
c->Write(c, _UU("D_SM_VMBRIDGE@S_1"));
|
|
c->Write(c, _UU("D_SM_VMBRIDGE@S_2"));
|
|
c->Write(c, L"");
|
|
}
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the local bridge connection
|
|
UINT PsBridgeDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_LOCALBRIDGE t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[hubname]", CmdPrompt, _UU("CMD_BridgeDelete_PROMPT_HUBNAME"), CmdEvalNotEmpty, NULL},
|
|
{"DEVICE", CmdPrompt, _UU("CMD_BridgeDelete_PROMPT_DEVICE"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "DEVICE"));
|
|
StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[hubname]"));
|
|
|
|
// RPC call
|
|
ret = ScDeleteLocalBridge(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the list of features and capabilities of the server
|
|
UINT PsCaps(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
CAPSLIST *t;
|
|
UINT i;
|
|
CT *ct;
|
|
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
t = ScGetCapsEx(ps->Rpc);
|
|
|
|
ct = CtNewStandard();
|
|
|
|
for (i = 0;i < LIST_NUM(t->CapsList);i++)
|
|
{
|
|
CAPS *c = LIST_DATA(t->CapsList, i);
|
|
wchar_t title[MAX_SIZE];
|
|
char name[256];
|
|
|
|
Format(name, sizeof(name), "CT_%s", c->Name);
|
|
|
|
UniStrCpy(title, sizeof(title), _UU(name));
|
|
|
|
if (UniIsEmptyStr(title))
|
|
{
|
|
UniFormat(title, sizeof(title), L"%S", (StrLen(c->Name) >= 2) ? c->Name + 2 : c->Name);
|
|
}
|
|
|
|
if (StartWith(c->Name, "b_"))
|
|
{
|
|
bool icon_pass = c->Value == 0 ? false : true;
|
|
if (StrCmpi(c->Name, "b_must_install_pcap") == 0)
|
|
{
|
|
// Reverse only item of WinPcap
|
|
icon_pass = !icon_pass;
|
|
}
|
|
CtInsert(ct, title, c->Value == 0 ? _UU("CAPS_NO") : _UU("CAPS_YES"));
|
|
}
|
|
else
|
|
{
|
|
wchar_t str[64];
|
|
UniToStru(str, c->Value);
|
|
CtInsert(ct, title, str);
|
|
}
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
|
|
FreeCapsList(t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Restart the VPN Server service
|
|
UINT PsReboot(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_TEST t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"RESETCONFIG", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
t.IntValue = GetParamYes(o, "RESETCONFIG") ? 1 : 0;
|
|
|
|
// RPC call
|
|
ret = ScRebootServer(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcTest(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the current configuration of the VPN Server
|
|
UINT PsConfigGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CONFIG t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[path]", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScGetConfig(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
wchar_t *filename = GetParamUniStr(o, "[path]");
|
|
|
|
if (IsEmptyUniStr(filename))
|
|
{
|
|
// Display on the screen
|
|
wchar_t tmp[MAX_SIZE];
|
|
UINT buf_size;
|
|
wchar_t *buf;
|
|
UNI_TOKEN_LIST *lines;
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_ConfigGet_FILENAME"), t.FileName,
|
|
StrLen(t.FileData));
|
|
c->Write(c, tmp);
|
|
c->Write(c, L"");
|
|
|
|
buf_size = CalcUtf8ToUni((BYTE *)t.FileData, StrLen(t.FileData));
|
|
buf = ZeroMalloc(buf_size + 32);
|
|
|
|
Utf8ToUni(buf, buf_size, (BYTE *)t.FileData, StrLen(t.FileData));
|
|
|
|
lines = UniGetLines(buf);
|
|
if (lines != NULL)
|
|
{
|
|
UINT i;
|
|
|
|
for (i = 0;i < lines->NumTokens;i++)
|
|
{
|
|
c->Write(c, lines->Token[i]);
|
|
}
|
|
|
|
UniFreeToken(lines);
|
|
}
|
|
|
|
c->Write(c, L"");
|
|
|
|
Free(buf);
|
|
}
|
|
else
|
|
{
|
|
// Save to the file
|
|
IO *io = FileCreateW(filename);
|
|
|
|
if (io == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_ConfigGet_FILE_SAVE_FAILED"));
|
|
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
else
|
|
{
|
|
FileWrite(io, t.FileData, StrLen(t.FileData));
|
|
FileClose(io);
|
|
}
|
|
}
|
|
}
|
|
|
|
FreeRpcConfig(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Write the configuration to the VPN Server
|
|
UINT PsConfigSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CONFIG t;
|
|
wchar_t *filename;
|
|
BUF *buf;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[path]", CmdPrompt, _UU("CMD_ConfigSet_PROMPT_PATH"), CmdEvalIsFile, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
filename = GetParamUniStr(o, "[path]");
|
|
|
|
buf = ReadDumpW(filename);
|
|
if (buf == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_ConfigSet_FILE_LOAD_FAILED"));
|
|
}
|
|
else
|
|
{
|
|
Zero(&t, sizeof(t));
|
|
|
|
t.FileData = ZeroMalloc(buf->Size + 1);
|
|
Copy(t.FileData, buf->Buf, buf->Size);
|
|
FreeBuf(buf);
|
|
|
|
// RPC call
|
|
ret = ScSetConfig(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcConfig(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the Virtual Layer 3 switch list
|
|
UINT PsRouterList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_L3SW t;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScEnumL3Switch(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNew();
|
|
UINT i;
|
|
|
|
CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN1"), false);
|
|
CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN2"), false);
|
|
CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN3"), true);
|
|
CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN4"), true);
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
RPC_ENUM_L3SW_ITEM *e = &t.Items[i];
|
|
wchar_t tmp1[MAX_SIZE], *tmp2, tmp3[64], tmp4[64];
|
|
|
|
StrToUni(tmp1, sizeof(tmp1), e->Name);
|
|
if (e->Active == false)
|
|
{
|
|
tmp2 = _UU("SM_L3_SW_ST_F_F");
|
|
}
|
|
else if (e->Online == false)
|
|
{
|
|
tmp2 = _UU("SM_L3_SW_ST_T_F");
|
|
}
|
|
else
|
|
{
|
|
tmp2 = _UU("SM_L3_SW_ST_T_T");
|
|
}
|
|
UniToStru(tmp3, e->NumInterfaces);
|
|
UniToStru(tmp4, e->NumTables);
|
|
|
|
CtInsert(ct,
|
|
tmp1, tmp2, tmp3, tmp4);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeRpcEnumL3Sw(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Define a new virtual layer 3 switch
|
|
UINT PsRouterAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_L3SW t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_RouterAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScAddL3Switch(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the Virtual Layer 3 Switch
|
|
UINT PsRouterDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_L3SW t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_RouterDelete_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScDelL3Switch(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Start the Virtual Layer 3 Switch
|
|
UINT PsRouterStart(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_L3SW t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_RouterStart_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScStartL3Switch(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Stop the Virtual Layer 3 Switch
|
|
UINT PsRouterStop(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_L3SW t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_RouterStop_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScStopL3Switch(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the interface list registered on Virtual Layer 3 Switch
|
|
UINT PsRouterIfList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_L3IF t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_RouterIfList_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScEnumL3If(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
UINT i;
|
|
wchar_t tmp1[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
wchar_t tmp3[MAX_SIZE];
|
|
CT *ct = CtNew();
|
|
|
|
CtInsertColumn(ct, _UU("SM_L3_SW_IF_COLUMN1"), false);
|
|
CtInsertColumn(ct, _UU("SM_L3_SW_IF_COLUMN2"), false);
|
|
CtInsertColumn(ct, _UU("SM_L3_SW_IF_COLUMN3"), false);
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
RPC_L3IF *e = &t.Items[i];
|
|
|
|
IPToUniStr32(tmp1, sizeof(tmp1), e->IpAddress);
|
|
IPToUniStr32(tmp2, sizeof(tmp2), e->SubnetMask);
|
|
StrToUni(tmp3, sizeof(tmp3), e->HubName);
|
|
|
|
CtInsert(ct, tmp1, tmp2, tmp3);
|
|
}
|
|
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeRpcEnumL3If(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Evaluate the IP address and mask
|
|
bool CmdEvalIpAndMask4(CONSOLE *c, wchar_t *str, void *param)
|
|
{
|
|
char tmp[MAX_SIZE];
|
|
UINT ip, mask;
|
|
// Validate arguments
|
|
if (c == NULL || str == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
UniToStr(tmp, sizeof(tmp), str);
|
|
|
|
if (ParseIpAndMask4(tmp, &ip, &mask) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_PARSE_IP_MASK_ERROR_1"));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
bool CmdEvalIpAndMask6(CONSOLE *c, wchar_t *str, void *param)
|
|
{
|
|
char tmp[MAX_SIZE];
|
|
IP ip, mask;
|
|
// Validate arguments
|
|
if (c == NULL || str == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
UniToStr(tmp, sizeof(tmp), str);
|
|
|
|
if (ParseIpAndMask6(tmp, &ip, &mask) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_PARSE_IP_MASK_ERROR_1_6"));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Evaluate the network address and the subnet mask
|
|
bool CmdEvalNetworkAndSubnetMask4(CONSOLE *c, wchar_t *str, void *param)
|
|
{
|
|
char tmp[MAX_SIZE];
|
|
UINT ip, mask;
|
|
// Validate arguments
|
|
if (c == NULL || str == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
UniToStr(tmp, sizeof(tmp), str);
|
|
|
|
if (ParseIpAndSubnetMask4(tmp, &ip, &mask) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_1"));
|
|
return false;
|
|
}
|
|
|
|
if (IsNetworkAddress32(ip, mask) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_2"));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Evaluate the IP address and subnet mask
|
|
bool CmdEvalHostAndSubnetMask4(CONSOLE *c, wchar_t *str, void *param)
|
|
{
|
|
char tmp[MAX_SIZE];
|
|
// Validate arguments
|
|
if (c == NULL || str == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
UniToStr(tmp, sizeof(tmp), str);
|
|
|
|
if (ParseIpAndSubnetMask4(tmp, NULL, NULL) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_1"));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Add a virtual interface to the virtual layer 3 switch
|
|
UINT PsRouterIfAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_L3IF t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"HUB", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_HUB"), CmdEvalNotEmpty, NULL},
|
|
{"IP", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_IP"), CmdEvalHostAndSubnetMask4, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
ParseIpAndSubnetMask4(GetParamStr(o, "IP"), &t.IpAddress, &t.SubnetMask);
|
|
StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "HUB"));
|
|
|
|
// RPC call
|
|
ret = ScAddL3If(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the virtual interface of the virtual layer 3 switch
|
|
UINT PsRouterIfDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_L3IF t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"HUB", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_HUB"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "HUB"));
|
|
|
|
// RPC call
|
|
ret = ScDelL3If(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the routing table of the Virtual Layer 3 Switch
|
|
UINT PsRouterTableList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_L3TABLE t;
|
|
CT *ct;
|
|
wchar_t tmp1[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
wchar_t tmp3[MAX_SIZE];
|
|
wchar_t tmp4[MAX_SIZE];
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_RouterTableList_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScEnumL3Table(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
UINT i;
|
|
|
|
ct = CtNew();
|
|
|
|
CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN1"), false);
|
|
CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN2"), false);
|
|
CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN3"), false);
|
|
CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN4"), true);
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
RPC_L3TABLE *e = &t.Items[i];
|
|
|
|
IPToUniStr32(tmp1, sizeof(tmp1), e->NetworkAddress);
|
|
IPToUniStr32(tmp2, sizeof(tmp2), e->SubnetMask);
|
|
IPToUniStr32(tmp3, sizeof(tmp3), e->GatewayAddress);
|
|
UniToStru(tmp4, e->Metric);
|
|
|
|
CtInsert(ct, tmp1, tmp2, tmp3, tmp4);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeRpcEnumL3Table(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Add a routing table entry to the Virtual Layer 3 Switch
|
|
UINT PsRouterTableAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_L3TABLE t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"NETWORK", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NETWORK"), CmdEvalNetworkAndSubnetMask4, NULL},
|
|
{"GATEWAY", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_GATEWAY"), CmdEvalIp, NULL},
|
|
{"METRIC", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_METRIC"), CmdEvalInt1, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
ParseIpAndSubnetMask4(GetParamStr(o, "NETWORK"), &t.NetworkAddress, &t.SubnetMask);
|
|
t.Metric = GetParamInt(o, "METRIC");
|
|
t.GatewayAddress = StrToIP32(GetParamStr(o, "GATEWAY"));
|
|
|
|
// RPC call
|
|
ret = ScAddL3Table(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the routing table entry of the Virtual Layer 3 Switch
|
|
UINT PsRouterTableDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_L3TABLE t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"NETWORK", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NETWORK"), CmdEvalNetworkAndSubnetMask4, NULL},
|
|
{"GATEWAY", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_GATEWAY"), CmdEvalIp, NULL},
|
|
{"METRIC", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_METRIC"), CmdEvalInt1, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
ParseIpAndSubnetMask4(GetParamStr(o, "NETWORK"), &t.NetworkAddress, &t.SubnetMask);
|
|
t.Metric = GetParamInt(o, "METRIC");
|
|
t.GatewayAddress = StrToIP32(GetParamStr(o, "GATEWAY"));
|
|
|
|
// RPC call
|
|
ret = ScDelL3Table(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the log files list
|
|
UINT PsLogFileList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_LOG_FILE t;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
c->Write(c, _UU("CMD_LogFileList_START"));
|
|
c->Write(c, L"");
|
|
|
|
// RPC call
|
|
ret = ScEnumLogFile(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
UINT i;
|
|
wchar_t tmp[MAX_SIZE];
|
|
CT *ct;
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_LogFileList_NUM_LOGS"), t.NumItem);
|
|
c->Write(c, tmp);
|
|
|
|
ct = CtNew();
|
|
|
|
CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_2"), true);
|
|
CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_3"), false);
|
|
CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_4"), false);
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
RPC_ENUM_LOG_FILE_ITEM *e = &t.Items[i];
|
|
wchar_t tmp1[MAX_PATH], tmp2[128], tmp3[128], tmp4[MAX_HOST_NAME_LEN + 1];
|
|
char tmp[MAX_SIZE];
|
|
|
|
StrToUni(tmp1, sizeof(tmp1), e->FilePath);
|
|
|
|
ToStrByte(tmp, sizeof(tmp), e->FileSize);
|
|
StrToUni(tmp2, sizeof(tmp2), tmp);
|
|
|
|
GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->UpdatedTime));
|
|
|
|
StrToUni(tmp4, sizeof(tmp4), e->ServerName);
|
|
|
|
CtInsert(ct, tmp1, tmp2, tmp3, tmp4);
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
}
|
|
|
|
FreeRpcEnumLogFile(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Download a log file
|
|
UINT PsLogFileGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
BUF *buf;
|
|
char *filename = NULL;
|
|
char *server_name;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_LogFileGet_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"SERVER", NULL, NULL, NULL, NULL},
|
|
{"SAVEPATH", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
filename = GetParamStr(o, "SAVE");
|
|
if (IsEmptyStr(filename))
|
|
{
|
|
filename = GetParamStr(o, "SAVEPATH");
|
|
}
|
|
|
|
c->Write(c, _UU("CMD_LogFileGet_START"));
|
|
|
|
server_name = GetParamStr(o, "SERVER");
|
|
|
|
buf = DownloadFileFromServer(ps->Rpc, server_name,
|
|
GetParamStr(o, "[name]"), 0, NULL, NULL);
|
|
|
|
if (buf == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_LogFileGet_FAILED"));
|
|
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
else
|
|
{
|
|
if (IsEmptyStr(filename) == false)
|
|
{
|
|
// Save to the file
|
|
if (DumpBuf(buf, filename) == false)
|
|
{
|
|
ret = ERR_INTERNAL_ERROR;
|
|
c->Write(c, _UU("CMD_LogFileGet_SAVE_FAILED"));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Display on the screen
|
|
wchar_t tmp[MAX_SIZE];
|
|
UINT buf_size;
|
|
wchar_t *uni_buf;
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_LogFileGet_FILESIZE"),
|
|
buf->Size);
|
|
c->Write(c, tmp);
|
|
c->Write(c, L"");
|
|
|
|
buf_size = CalcUtf8ToUni((BYTE *)buf->Buf, buf->Size);
|
|
uni_buf = ZeroMalloc(buf_size + 32);
|
|
|
|
Utf8ToUni(uni_buf, buf_size, (BYTE *)buf->Buf, buf->Size);
|
|
|
|
c->Write(c, uni_buf);
|
|
c->Write(c, L"");
|
|
|
|
Free(uni_buf);
|
|
}
|
|
|
|
FreeBuf(buf);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Add a WireGuard key (TODO: ability add multiple keys in a single call)
|
|
UINT PsWgkAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
PS *ps = (PS *)param;
|
|
RPC_WGK t;
|
|
UINT ret;
|
|
LIST *o;
|
|
PARAM args[] =
|
|
{
|
|
{"[key]", CmdPrompt, _UU("CMD_WgkAdd_Prompt_[key]"), CmdEvalNotEmpty, NULL},
|
|
{"HUB", CmdPrompt, _UU("CMD_WgkAdd_Prompt_HUB"), NULL, NULL},
|
|
{"USER", CmdPrompt, _UU("CMD_WgkAdd_Prompt_USER"), NULL, NULL}
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.Num = 1;
|
|
t.Wgks = ZeroMalloc(sizeof(WGK));
|
|
|
|
StrCpy(t.Wgks[0].Key, sizeof(t.Wgks[0].Key), GetParamStr(o, "[key]"));
|
|
StrCpy(t.Wgks[0].Hub, sizeof(t.Wgks[0].Hub), GetParamStr(o, "HUB"));
|
|
StrCpy(t.Wgks[0].User, sizeof(t.Wgks[0].User), GetParamStr(o, "USER"));
|
|
|
|
FreeParamValueList(o);
|
|
|
|
ret = ScAddWgk(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
FreeRpcWgk(&t);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Delete a WireGuard key (TODO: ability to delete multiple keys in a single call)
|
|
UINT PsWgkDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
PS *ps = (PS *)param;
|
|
RPC_WGK t;
|
|
UINT ret;
|
|
LIST *o;
|
|
PARAM args[] =
|
|
{
|
|
{"[key]", CmdPrompt, _UU("CMD_WgkDelete_Prompt_[key]"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.Num = 1;
|
|
t.Wgks = ZeroMalloc(sizeof(WGK));
|
|
|
|
StrCpy(t.Wgks[0].Key, sizeof(t.Wgks[0].Key), GetParamStr(o, "[key]"));
|
|
|
|
FreeParamValueList(o);
|
|
|
|
ret = ScDeleteWgk(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
FreeRpcWgk(&t);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// List the WireGuard keys
|
|
UINT PsWgkEnum(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
UINT ret = ERR_NO_ERROR;
|
|
PS *ps = (PS *)param;
|
|
RPC_WGK t;
|
|
LIST *o;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = ScEnumWgk(ps->Rpc, &t);
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
UINT i;
|
|
CT *ct = CtNew();
|
|
CtInsertColumn(ct, _UU("CMD_WgkEnum_Column_Key"), false);
|
|
CtInsertColumn(ct, _UU("CMD_WgkEnum_Column_Hub"), false);
|
|
CtInsertColumn(ct, _UU("CMD_WgkEnum_Column_User"), false);
|
|
|
|
for (i = 0; i < t.Num; ++i)
|
|
{
|
|
const WGK *wgk = &t.Wgks[i];
|
|
wchar_t *key, *hub, *user;
|
|
|
|
key = CopyStrToUni(wgk->Key);
|
|
hub = CopyStrToUni(wgk->Hub);
|
|
user = CopyStrToUni(wgk->User);
|
|
|
|
CtInsert(ct, key, hub, user);
|
|
|
|
Free(key);
|
|
Free(hub);
|
|
Free(user);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
else
|
|
{
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
FreeRpcWgk(&t);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Create a New Virtual HUB
|
|
UINT PsHubCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_HUB t;
|
|
char *pass = "";
|
|
UINT hub_type = HUB_TYPE_STANDALONE;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_HubCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
else
|
|
{
|
|
RPC_SERVER_INFO t;
|
|
Zero(&t, sizeof(t));
|
|
if (ScGetServerInfo(ps->Rpc, &t) == ERR_NO_ERROR)
|
|
{
|
|
if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
|
|
{
|
|
hub_type = HUB_TYPE_FARM_DYNAMIC;
|
|
}
|
|
FreeRpcServerInfo(&t);
|
|
}
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
|
|
t.HubType = hub_type;
|
|
|
|
if (IsEmptyStr(GetParamStr(o, "PASSWORD")) == false)
|
|
{
|
|
pass = GetParamStr(o, "PASSWORD");
|
|
}
|
|
|
|
Sha0(t.HashedPassword, pass, StrLen(pass));
|
|
HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pass);
|
|
t.Online = true;
|
|
|
|
// RPC call
|
|
ret = ScCreateHub(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Create a New Virtual HUB (dynamic mode)
|
|
UINT PsHubCreateDynamic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_HUB t;
|
|
char *pass = "";
|
|
UINT hub_type = HUB_TYPE_FARM_DYNAMIC;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_HubCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
|
|
t.HubType = hub_type;
|
|
|
|
if (IsEmptyStr(GetParamStr(o, "PASSWORD")) == false)
|
|
{
|
|
pass = GetParamStr(o, "PASSWORD");
|
|
}
|
|
|
|
Sha0(t.HashedPassword, pass, StrLen(pass));
|
|
HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pass);
|
|
t.Online = true;
|
|
|
|
// RPC call
|
|
ret = ScCreateHub(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Create a New Virtual HUB (static mode)
|
|
UINT PsHubCreateStatic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_HUB t;
|
|
char *pass = "";
|
|
UINT hub_type = HUB_TYPE_FARM_STATIC;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_HubCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
|
|
t.HubType = hub_type;
|
|
|
|
if (IsEmptyStr(GetParamStr(o, "PASSWORD")) == false)
|
|
{
|
|
pass = GetParamStr(o, "PASSWORD");
|
|
}
|
|
|
|
Sha0(t.HashedPassword, pass, StrLen(pass));
|
|
HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pass);
|
|
t.Online = true;
|
|
|
|
// RPC call
|
|
ret = ScCreateHub(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete a Virtual HUB
|
|
UINT PsHubDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_DELETE_HUB t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_HubDelete_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScDeleteHub(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the Virtual HUB to static
|
|
UINT PsHubSetStatic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_HUB t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_HubChange_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
|
|
|
|
// Retrieve the current setting first
|
|
ret = ScGetHub(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
// Change the settings
|
|
StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
|
|
t.HubType = HUB_TYPE_FARM_STATIC;
|
|
|
|
// Write
|
|
ret = ScSetHub(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Change the type of Virtual HUB to dynamic Virtual HUB
|
|
UINT PsHubSetDynamic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_HUB t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_HubChange_PROMPT_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
|
|
|
|
// Retrieve the current setting first
|
|
ret = ScGetHub(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
// Change the settings
|
|
StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
|
|
t.HubType = HUB_TYPE_FARM_DYNAMIC;
|
|
|
|
// Write
|
|
ret = ScSetHub(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the list of Virtual HUB
|
|
UINT PsHubList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_HUB t;
|
|
UINT i;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScEnumHub(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNew();
|
|
|
|
CtInsertColumn(ct, _UU("SM_HUB_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("SM_HUB_COLUMN_2"), false);
|
|
CtInsertColumn(ct, _UU("SM_HUB_COLUMN_3"), false);
|
|
CtInsertColumn(ct, _UU("SM_HUB_COLUMN_4"), false);
|
|
CtInsertColumn(ct, _UU("SM_HUB_COLUMN_5"), false);
|
|
CtInsertColumn(ct, _UU("SM_HUB_COLUMN_6"), false);
|
|
CtInsertColumn(ct, _UU("SM_HUB_COLUMN_7"), false);
|
|
CtInsertColumn(ct, _UU("SM_HUB_COLUMN_8"), false);
|
|
CtInsertColumn(ct, _UU("SM_HUB_COLUMN_9"), false);
|
|
CtInsertColumn(ct, _UU("SM_HUB_COLUMN_10"), false);
|
|
CtInsertColumn(ct, _UU("SM_HUB_COLUMN_11"), false);
|
|
CtInsertColumn(ct, _UU("SM_SESS_COLUMN_6"), false);
|
|
CtInsertColumn(ct, _UU("SM_SESS_COLUMN_7"), false);
|
|
|
|
for (i = 0;i < t.NumHub;i++)
|
|
{
|
|
RPC_ENUM_HUB_ITEM *e = &t.Hubs[i];
|
|
wchar_t name[MAX_HUBNAME_LEN + 1];
|
|
wchar_t s1[64], s2[64], s3[64], s4[64], s5[64];
|
|
wchar_t s6[64], s7[128], s8[128];
|
|
wchar_t s9[64], s10[64];
|
|
|
|
UniToStru(s1, e->NumUsers);
|
|
UniToStru(s2, e->NumGroups);
|
|
UniToStru(s3, e->NumSessions);
|
|
UniToStru(s4, e->NumMacTables);
|
|
UniToStru(s5, e->NumIpTables);
|
|
|
|
UniToStru(s6, e->NumLogin);
|
|
|
|
if (e->LastLoginTime != 0)
|
|
{
|
|
GetDateTimeStr64Uni(s7, sizeof(s7), SystemToLocal64(e->LastLoginTime));
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(s7, sizeof(s7), _UU("COMMON_UNKNOWN"));
|
|
}
|
|
|
|
if (e->LastCommTime != 0)
|
|
{
|
|
GetDateTimeStr64Uni(s8, sizeof(s8), SystemToLocal64(e->LastCommTime));
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(s8, sizeof(s8), _UU("COMMON_UNKNOWN"));
|
|
}
|
|
|
|
if (e->IsTrafficFilled == false)
|
|
{
|
|
UniStrCpy(s9, sizeof(s9), _UU("CM_ST_NONE"));
|
|
UniStrCpy(s10, sizeof(s10), _UU("CM_ST_NONE"));
|
|
}
|
|
else
|
|
{
|
|
UniToStr3(s9, sizeof(s9),
|
|
e->Traffic.Recv.BroadcastBytes + e->Traffic.Recv.UnicastBytes +
|
|
e->Traffic.Send.BroadcastBytes + e->Traffic.Send.UnicastBytes);
|
|
|
|
UniToStr3(s10, sizeof(s10),
|
|
e->Traffic.Recv.BroadcastCount + e->Traffic.Recv.UnicastCount +
|
|
e->Traffic.Send.BroadcastCount + e->Traffic.Send.UnicastCount);
|
|
}
|
|
|
|
StrToUni(name, sizeof(name), e->HubName);
|
|
|
|
CtInsert(ct,
|
|
name,
|
|
e->Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"),
|
|
GetHubTypeStr(e->HubType),
|
|
s1, s2, s3, s4, s5, s6, s7, s8, s9, s10);
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
}
|
|
|
|
FreeRpcEnumHub(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Select a Virtual HUB to manage
|
|
UINT PsHub(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_HUB_STATUS t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (IsEmptyStr(GetParamStr(o, "[name]")) == false)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
Zero(&t, sizeof(t));
|
|
|
|
// Examine whether the specified Virtual HUB is accessible
|
|
StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetHubStatus(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
// Change the selection
|
|
if (ps->HubName != NULL)
|
|
{
|
|
Free(ps->HubName);
|
|
}
|
|
ps->HubName = CopyStr(t.HubName);
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_Hub_Selected"), t.HubName);
|
|
c->Write(c, tmp);
|
|
}
|
|
else
|
|
{
|
|
// Deselect
|
|
if (ps->HubName != NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Unselected"));
|
|
Free(ps->HubName);
|
|
}
|
|
ps->HubName = NULL;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the Virtual HUB to online
|
|
UINT PsOnline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_HUB_ONLINE t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.Online = true;
|
|
|
|
// RPC call
|
|
ret = ScSetHubOnline(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the Virtual HUB to offline
|
|
UINT PsOffline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_HUB_ONLINE t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.Online = false;
|
|
|
|
// RPC call
|
|
ret = ScSetHubOnline(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the static IPv4 network parameters for the Virtual HUB
|
|
UINT PsSetStaticNetwork(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_HUB t;
|
|
PARAM args[] =
|
|
{
|
|
{"GATEWAY", CmdPrompt, _UU("CMD_SetStaticNetwork_Prompt_GATEWAY"), CmdEvalIp, NULL},
|
|
{"SUBNET", CmdPrompt, _UU("CMD_SetStaticNetwork_Prompt_SUBNET"), CmdEvalIp, NULL}
|
|
};
|
|
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
ret = ScGetHub(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
goto FINAL;
|
|
}
|
|
|
|
t.HubOption.DefaultGateway = StrToIP32(GetParamStr(o, "GATEWAY"));
|
|
t.HubOption.DefaultSubnet = StrToIP32(GetParamStr(o, "SUBNET"));
|
|
|
|
ret = ScSetHub(ps->Rpc, &t);
|
|
FINAL:
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
// Set the maximum number of concurrent connecting sessions of the Virtual HUB
|
|
UINT PsSetMaxSession(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_HUB t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[max_session]", CmdPrompt, _UU("CMD_SetMaxSession_Prompt"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Get current settings of Virtual HUB
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
ret = ScGetHub(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
t.HubOption.MaxSession = GetParamInt(o, "[max_session]");
|
|
|
|
// Write the configuration of Virtual HUB
|
|
ret = ScSetHub(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the administrative password of the Virtual HUB
|
|
UINT PsSetHubPassword(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_HUB t;
|
|
char *pw;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[password]", CmdPromptChoosePassword, NULL, NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Get current settings of Virtual HUB
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
ret = ScGetHub(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
// Change the settings
|
|
pw = GetParamStr(o, "[password]");
|
|
HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pw);
|
|
Sha0(t.HashedPassword, pw, StrLen(pw));
|
|
|
|
// Write the configuration of Virtual HUB
|
|
ret = ScSetHub(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the Virtual HUB to permit to be enumerated for anonymous users
|
|
UINT PsSetEnumAllow(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_HUB t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Get current settings of Virtual HUB
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
ret = ScGetHub(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
t.HubOption.NoEnum = false;
|
|
|
|
// Write the configuration of Virtual HUB
|
|
ret = ScSetHub(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the Virtual HUB to deny to be enumerated for anonymous users
|
|
UINT PsSetEnumDeny(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_HUB t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Get current settings of Virtual HUB
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
ret = ScGetHub(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
t.HubOption.NoEnum = true;
|
|
|
|
// Write the configuration of Virtual HUB
|
|
ret = ScSetHub(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the option settings for the virtual HUB
|
|
UINT PsOptionsGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_HUB t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetHub(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct;
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_OptionsGet_TITLE"), ps->HubName);
|
|
c->Write(c, tmp);
|
|
|
|
// Display settings
|
|
ct = CtNewStandard();
|
|
|
|
CtInsert(ct, _UU("CMD_OptionsGet_ENUM"),
|
|
t.HubOption.NoEnum ? _UU("CMD_MSG_DENY") : _UU("CMD_MSG_ALLOW"));
|
|
|
|
if (t.HubOption.MaxSession == 0)
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("CMD_MSG_INFINITE"));
|
|
}
|
|
else
|
|
{
|
|
UniToStru(tmp, t.HubOption.MaxSession);
|
|
}
|
|
CtInsert(ct, _UU("CMD_OptionsGet_MAXSESSIONS"), tmp);
|
|
|
|
CtInsert(ct, _UU("CMD_OptionsGet_STATUS"), t.Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"));
|
|
|
|
CtInsert(ct, _UU("CMD_OptionsGet_TYPE"), GetHubTypeStr(t.HubType));
|
|
|
|
IPToUniStr32(tmp, sizeof(tmp), t.HubOption.DefaultGateway);
|
|
CtInsert(ct, _UU("CMD_OptionsGet_GATEWAY"), tmp);
|
|
|
|
IPToUniStr32(tmp, sizeof(tmp), t.HubOption.DefaultSubnet);
|
|
CtInsert(ct, _UU("CMD_OptionsGet_SUBNET"), tmp);
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Setting the Radius server to use for user authentication
|
|
UINT PsRadiusServerSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_RADIUS t;
|
|
char *host;
|
|
UINT port;
|
|
// Parameter list that can be specified
|
|
CMD_EVAL_MIN_MAX minmax =
|
|
{
|
|
"CMD_RadiusServerSet_EVAL_NUMINTERVAL", RADIUS_RETRY_INTERVAL, RADIUS_RETRY_TIMEOUT,
|
|
};
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[server_name:port]", CmdPrompt, _UU("CMD_RadiusServerSet_Prompt_Host"), CmdEvalNotEmpty, NULL},
|
|
{"SECRET", CmdPromptChoosePassword, _UU("CMD_RadiusServerSet_Prompt_Secret"), NULL, NULL},
|
|
{"RETRY_INTERVAL", CmdPrompt, _UU("CMD_RadiusServerSet_Prompt_RetryInterval"), CmdEvalMinMax, &minmax},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (ParseHostPort(GetParamStr(o, "[server_name:port]"), &host, &port, 1812))
|
|
{
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.RadiusPort = port;
|
|
StrCpy(t.RadiusServerName, sizeof(t.RadiusServerName), host);
|
|
StrCpy(t.RadiusSecret, sizeof(t.RadiusSecret), GetParamStr(o, "SECRET"));
|
|
t.RadiusRetryInterval = GetParamInt(o, "RETRY_INTERVAL");
|
|
|
|
Free(host);
|
|
|
|
// RPC call
|
|
ret = ScSetHubRadius(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the Radius server configuration to be used for user authentication
|
|
UINT PsRadiusServerDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_RADIUS t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.RadiusPort = 1812;
|
|
|
|
// RPC call
|
|
ret = ScSetHubRadius(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the Radius server settings to use for user authentication
|
|
UINT PsRadiusServerGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_RADIUS t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetHubRadius(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct;
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
ct = CtNewStandard();
|
|
|
|
if (IsEmptyStr(t.RadiusServerName))
|
|
{
|
|
CtInsert(ct, _UU("CMD_RadiusServerGet_STATUS"), _UU("CMD_MSG_DISABLE"));
|
|
}
|
|
else
|
|
{
|
|
CtInsert(ct, _UU("CMD_RadiusServerGet_STATUS"), _UU("CMD_MSG_ENABLE"));
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.RadiusServerName);
|
|
CtInsert(ct, _UU("CMD_RadiusServerGet_HOST"), tmp);
|
|
|
|
UniToStri(tmp, t.RadiusPort);
|
|
CtInsert(ct, _UU("CMD_RadiusServerGet_PORT"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.RadiusSecret);
|
|
CtInsert(ct, _UU("CMD_RadiusServerGet_SECRET"), tmp);
|
|
|
|
UniToStri(tmp, t.RadiusRetryInterval);
|
|
CtInsert(ct, _UU("CMD_RadiusServerGet_RetryInterval"), tmp);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the current status of the Virtual HUB
|
|
UINT PsStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_HUB_STATUS t;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetHubStatus(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNewStandard();
|
|
wchar_t *s;
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
// HUB name
|
|
s = CopyStrToUni(t.HubName);
|
|
CtInsert(ct, _UU("SM_HUB_STATUS_HUBNAME"), s);
|
|
Free(s);
|
|
|
|
// Online
|
|
CtInsert(ct, _UU("SM_HUB_STATUS_ONLINE"),
|
|
t.Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"));
|
|
|
|
// Type of HUB
|
|
CtInsert(ct, _UU("SM_HUB_TYPE"),
|
|
GetHubTypeStr(t.HubType));
|
|
|
|
if (t.HubType == HUB_TYPE_STANDALONE)
|
|
{
|
|
// Enable / Disable the SecureNAT
|
|
CtInsert(ct, _UU("SM_HUB_SECURE_NAT"),
|
|
t.SecureNATEnabled ? _UU("SM_HUB_SECURE_NAT_YES") : _UU("SM_HUB_SECURE_NAT_NO"));
|
|
}
|
|
|
|
// Other values
|
|
UniToStru(tmp, t.NumSessions);
|
|
CtInsert(ct, _UU("SM_HUB_NUM_SESSIONS"), tmp);
|
|
|
|
if (t.NumSessionsClient != 0 || t.NumSessionsBridge != 0)
|
|
{
|
|
UniToStru(tmp, t.NumSessionsClient);
|
|
CtInsert(ct, _UU("SM_HUB_NUM_SESSIONS_CLIENT"), tmp);
|
|
UniToStru(tmp, t.NumSessionsBridge);
|
|
CtInsert(ct, _UU("SM_HUB_NUM_SESSIONS_BRIDGE"), tmp);
|
|
}
|
|
|
|
UniToStru(tmp, t.NumAccessLists);
|
|
CtInsert(ct, _UU("SM_HUB_NUM_ACCESSES"), tmp);
|
|
|
|
UniToStru(tmp, t.NumUsers);
|
|
CtInsert(ct, _UU("SM_HUB_NUM_USERS"), tmp);
|
|
UniToStru(tmp, t.NumGroups);
|
|
CtInsert(ct, _UU("SM_HUB_NUM_GROUPS"), tmp);
|
|
|
|
UniToStru(tmp, t.NumMacTables);
|
|
CtInsert(ct, _UU("SM_HUB_NUM_MAC_TABLES"), tmp);
|
|
UniToStru(tmp, t.NumIpTables);
|
|
CtInsert(ct, _UU("SM_HUB_NUM_IP_TABLES"), tmp);
|
|
|
|
// Usage status
|
|
UniToStru(tmp, t.NumLogin);
|
|
CtInsert(ct, _UU("SM_HUB_NUM_LOGIN"), tmp);
|
|
|
|
if (t.LastLoginTime != 0)
|
|
{
|
|
GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.LastLoginTime));
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));
|
|
}
|
|
CtInsert(ct, _UU("SM_HUB_LAST_LOGIN_TIME"), tmp);
|
|
|
|
if (t.LastCommTime != 0)
|
|
{
|
|
GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.LastCommTime));
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));
|
|
}
|
|
CtInsert(ct, _UU("SM_HUB_LAST_COMM_TIME"), tmp);
|
|
|
|
if (t.CreatedTime != 0)
|
|
{
|
|
GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.CreatedTime));
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));
|
|
}
|
|
CtInsert(ct, _UU("SM_HUB_CREATED_TIME"), tmp);
|
|
|
|
// Traffic information
|
|
CmdInsertTrafficInfo(ct, &t.Traffic);
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the log switching string
|
|
wchar_t *GetLogSwitchStr(UINT i)
|
|
{
|
|
char tmp[64];
|
|
|
|
Format(tmp, sizeof(tmp), "SM_LOG_SWITCH_%u", i);
|
|
|
|
return _UU(tmp);
|
|
}
|
|
|
|
// Get the packet log name string
|
|
wchar_t *GetPacketLogNameStr(UINT i)
|
|
{
|
|
char tmp[64];
|
|
|
|
Format(tmp, sizeof(tmp), "CMD_Log_%u", i);
|
|
|
|
return _UU(tmp);
|
|
}
|
|
|
|
// Get the log storage settings for the virtual HUB
|
|
UINT PsLogGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_HUB_LOG t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetHubLog(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNewStandard();
|
|
|
|
CtInsert(ct, _UU("CMD_Log_SecurityLog"),
|
|
t.LogSetting.SaveSecurityLog ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
if (t.LogSetting.SaveSecurityLog)
|
|
{
|
|
CtInsert(ct, _UU("CMD_Log_SwitchType"), GetLogSwitchStr(t.LogSetting.SecurityLogSwitchType));
|
|
}
|
|
|
|
CtInsert(ct, L"", L"");
|
|
|
|
CtInsert(ct, _UU("CMD_Log_PacketLog"),
|
|
t.LogSetting.SavePacketLog ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
if (t.LogSetting.SavePacketLog)
|
|
{
|
|
UINT i;
|
|
|
|
CtInsert(ct, _UU("CMD_Log_SwitchType"), GetLogSwitchStr(t.LogSetting.PacketLogSwitchType));
|
|
|
|
for (i = 0;i <= 7;i++)
|
|
{
|
|
wchar_t *tmp = NULL;
|
|
|
|
switch (t.LogSetting.PacketLogConfig[i])
|
|
{
|
|
case PACKET_LOG_NONE:
|
|
tmp = _UU("D_SM_LOG@B_PACKET_0_0");
|
|
break;
|
|
|
|
case PACKET_LOG_HEADER:
|
|
tmp = _UU("D_SM_LOG@B_PACKET_0_1");
|
|
break;
|
|
|
|
case PACKET_LOG_ALL:
|
|
tmp = _UU("D_SM_LOG@B_PACKET_0_2");
|
|
break;
|
|
}
|
|
|
|
CtInsert(ct, GetPacketLogNameStr(i),
|
|
tmp);
|
|
}
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// LogEnable command
|
|
UINT PsLogEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_HUB_LOG t;
|
|
bool packet_log = false;
|
|
char *tmp;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[security|packet]", CmdPrompt, _UU("CMD_LogEnable_Prompt"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
tmp = GetParamStr(o, "[security|packet]");
|
|
|
|
if (StartWith(tmp, "p"))
|
|
{
|
|
packet_log = true;
|
|
}
|
|
else if (StartWith(tmp, "s") == false)
|
|
{
|
|
c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetHubLog(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
if (packet_log == false)
|
|
{
|
|
t.LogSetting.SaveSecurityLog = true;
|
|
}
|
|
else
|
|
{
|
|
t.LogSetting.SavePacketLog = true;
|
|
}
|
|
|
|
// RPC call
|
|
ret = ScSetHubLog(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Disable the packet log or the security log
|
|
UINT PsLogDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_HUB_LOG t;
|
|
bool packet_log = false;
|
|
char *tmp;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[security|packet]", CmdPrompt, _UU("CMD_LogEnable_Prompt"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
tmp = GetParamStr(o, "[security|packet]");
|
|
|
|
if (StartWith(tmp, "p"))
|
|
{
|
|
packet_log = true;
|
|
}
|
|
else if (StartWith(tmp, "s") == false)
|
|
{
|
|
c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
|
|
FreeParamValueList(o);
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetHubLog(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
if (packet_log == false)
|
|
{
|
|
t.LogSetting.SaveSecurityLog = false;
|
|
}
|
|
else
|
|
{
|
|
t.LogSetting.SavePacketLog = false;
|
|
}
|
|
|
|
// RPC call
|
|
ret = ScSetHubLog(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Convert the string to log switching type
|
|
UINT StrToLogSwitchType(char *str)
|
|
{
|
|
UINT ret = INFINITE;
|
|
// Validate arguments
|
|
if (str == NULL)
|
|
{
|
|
return INFINITE;
|
|
}
|
|
|
|
if (IsEmptyStr(str) || StartWith("none", str))
|
|
{
|
|
ret = LOG_SWITCH_NO;
|
|
}
|
|
else if (StartWith("second", str))
|
|
{
|
|
ret = LOG_SWITCH_SECOND;
|
|
}
|
|
else if (StartWith("minute", str))
|
|
{
|
|
ret = LOG_SWITCH_MINUTE;
|
|
}
|
|
else if (StartWith("hour", str))
|
|
{
|
|
ret = LOG_SWITCH_HOUR;
|
|
}
|
|
else if (StartWith("day", str))
|
|
{
|
|
ret = LOG_SWITCH_DAY;
|
|
}
|
|
else if (StartWith("month", str))
|
|
{
|
|
ret = LOG_SWITCH_MONTH;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the switching period of the log file
|
|
UINT PsLogSwitchSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_HUB_LOG t;
|
|
bool packet_log = false;
|
|
char *tmp;
|
|
UINT new_switch_type = 0;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[security|packet]", CmdPrompt, _UU("CMD_LogEnable_Prompt"), CmdEvalNotEmpty, NULL},
|
|
{"SWITCH", CmdPrompt, _UU("CMD_LogSwitchSet_Prompt"), NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
tmp = GetParamStr(o, "[security|packet]");
|
|
|
|
if (StartWith(tmp, "p"))
|
|
{
|
|
packet_log = true;
|
|
}
|
|
else if (StartWith(tmp, "s") == false)
|
|
{
|
|
c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
|
|
FreeParamValueList(o);
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
new_switch_type = StrToLogSwitchType(GetParamStr(o, "SWITCH"));
|
|
|
|
if (new_switch_type == INFINITE)
|
|
{
|
|
c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
|
|
FreeParamValueList(o);
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetHubLog(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
if (packet_log == false)
|
|
{
|
|
t.LogSetting.SecurityLogSwitchType = new_switch_type;
|
|
}
|
|
else
|
|
{
|
|
t.LogSetting.PacketLogSwitchType = new_switch_type;
|
|
}
|
|
|
|
// RPC call
|
|
ret = ScSetHubLog(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Convert the type string of the packet log contents to an integer
|
|
UINT StrToPacketLogSaveInfoType(char *str)
|
|
{
|
|
UINT ret = INFINITE;
|
|
if (str == NULL)
|
|
{
|
|
return INFINITE;
|
|
}
|
|
|
|
if (StartWith("none", str) || IsEmptyStr(str))
|
|
{
|
|
ret = PACKET_LOG_NONE;
|
|
}
|
|
else if (StartWith("header", str))
|
|
{
|
|
ret = PACKET_LOG_HEADER;
|
|
}
|
|
else if (StartWith("full", str) || StartWith("all", str))
|
|
{
|
|
ret = PACKET_LOG_ALL;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Convert a packet type string of the packet log to an integer
|
|
UINT StrToPacketLogType(char *str)
|
|
{
|
|
UINT ret = INFINITE;
|
|
if (str == NULL || IsEmptyStr(str))
|
|
{
|
|
return INFINITE;
|
|
}
|
|
|
|
if (StartWith("tcpconn", str))
|
|
{
|
|
ret = PACKET_LOG_TCP_CONN;
|
|
}
|
|
else if (StartWith("tcpdata", str))
|
|
{
|
|
ret = PACKET_LOG_TCP;
|
|
}
|
|
else if (StartWith("dhcp", str))
|
|
{
|
|
ret = PACKET_LOG_DHCP;
|
|
}
|
|
else if (StartWith("udp", str))
|
|
{
|
|
ret = PACKET_LOG_UDP;
|
|
}
|
|
else if (StartWith("icmp", str))
|
|
{
|
|
ret = PACKET_LOG_ICMP;
|
|
}
|
|
else if (StartWith("ip", str))
|
|
{
|
|
ret = PACKET_LOG_IP;
|
|
}
|
|
else if (StartWith("arp", str))
|
|
{
|
|
ret = PACKET_LOG_ARP;
|
|
}
|
|
else if (StartWith("ethernet", str))
|
|
{
|
|
ret = PACKET_LOG_ETHERNET;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the detail level and type of packet to be stored in the packet log
|
|
UINT PsLogPacketSaveType(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_HUB_LOG t;
|
|
UINT packet_type = INFINITE;
|
|
UINT packet_save_info_type = INFINITE;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"TYPE", CmdPrompt, _UU("CMD_LogPacketSaveType_Prompt_TYPE"), NULL, NULL},
|
|
{"SAVE", CmdPrompt, _UU("CMD_LogPacketSaveType_Prompt_SAVE"), NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
packet_type = StrToPacketLogType(GetParamStr(o, "TYPE"));
|
|
packet_save_info_type = StrToPacketLogSaveInfoType(GetParamStr(o, "SAVE"));
|
|
|
|
if (packet_type == INFINITE || packet_save_info_type == INFINITE)
|
|
{
|
|
c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));
|
|
FreeParamValueList(o);
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetHubLog(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
t.LogSetting.PacketLogConfig[packet_type] = packet_save_info_type;
|
|
|
|
// RPC call
|
|
ret = ScSetHubLog(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the list of certificates of the trusted certification authority
|
|
UINT PsCAList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_HUB_ENUM_CA t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScEnumCa(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
UINT i;
|
|
CT *ct = CtNewStandard();
|
|
|
|
for (i = 0;i < t.NumCa;i++)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
wchar_t tmp2[64];
|
|
RPC_HUB_ENUM_CA_ITEM *e = &t.Ca[i];
|
|
|
|
GetDateStrEx64(tmp, sizeof(tmp), SystemToLocal64(e->Expires), NULL);
|
|
|
|
UniToStru(tmp2, e->Key);
|
|
|
|
CtInsert(ct, _UU("CMD_CAList_COLUMN_ID"), tmp2);
|
|
CtInsert(ct, _UU("CM_CERT_COLUMN_1"), e->SubjectName);
|
|
CtInsert(ct, _UU("CM_CERT_COLUMN_2"), e->IssuerName);
|
|
CtInsert(ct, _UU("CM_CERT_COLUMN_3"), tmp);
|
|
|
|
if (i != (t.NumCa - 1))
|
|
{
|
|
CtInsert(ct, L"---", L"---");
|
|
}
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeRpcHubEnumCa(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Add a certificate to the trusted certification authority
|
|
UINT PsCAAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_HUB_ADD_CA t;
|
|
X *x;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[path]", CmdPrompt, _UU("CMD_CAAdd_PROMPT_PATH"), CmdEvalIsFile, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
x = FileToXW(GetParamUniStr(o, "[path]"));
|
|
|
|
if (x == NULL)
|
|
{
|
|
FreeParamValueList(o);
|
|
c->Write(c, _UU("CMD_MSG_LOAD_CERT_FAILED"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.Cert = x;
|
|
|
|
// RPC call
|
|
ret = ScAddCa(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcHubAddCa(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the certificate of the trusted certification authority
|
|
UINT PsCADelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_HUB_DELETE_CA t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[id]", CmdPrompt, _UU("CMD_CADelete_PROMPT_ID"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.Key = GetParamInt(o, "[id]");
|
|
|
|
// RPC call
|
|
ret = ScDeleteCa(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the certificate of the trusted certification authority
|
|
UINT PsCAGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_HUB_GET_CA t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[id]", CmdPrompt, _UU("CMD_CAGet_PROMPT_ID"), CmdEvalNotEmpty, NULL},
|
|
{"SAVECERT", CmdPrompt, _UU("CMD_CAGet_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.Key = GetParamInt(o, "[id]");
|
|
|
|
// RPC call
|
|
ret = ScGetCa(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
if (XToFileW(t.Cert, GetParamUniStr(o, "SAVECERT"), true))
|
|
{
|
|
// Success
|
|
}
|
|
else
|
|
{
|
|
ret = ERR_INTERNAL_ERROR;
|
|
c->Write(c, _UU("CMD_MSG_SAVE_CERT_FAILED"));
|
|
}
|
|
}
|
|
|
|
FreeRpcHubGetCa(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get the cascade connection list
|
|
UINT PsCascadeList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_LINK t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScEnumLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNew();
|
|
UINT i;
|
|
|
|
CtInsertColumn(ct, _UU("SM_LINK_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("SM_LINK_COLUMN_2"), false);
|
|
CtInsertColumn(ct, _UU("SM_LINK_COLUMN_3"), false);
|
|
CtInsertColumn(ct, _UU("SM_LINK_COLUMN_4"), false);
|
|
CtInsertColumn(ct, _UU("SM_LINK_COLUMN_5"), false);
|
|
|
|
for (i = 0;i < t.NumLink;i++)
|
|
{
|
|
RPC_ENUM_LINK_ITEM *e = &t.Links[i];
|
|
wchar_t tmp1[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
wchar_t tmp3[MAX_SIZE];
|
|
wchar_t tmp4[MAX_SIZE];
|
|
|
|
GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->ConnectedTime), NULL);
|
|
StrToUni(tmp2, sizeof(tmp2), e->Hostname);
|
|
StrToUni(tmp3, sizeof(tmp3), e->HubName);
|
|
|
|
if (e->Online == false)
|
|
{
|
|
UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_OFFLINE"));
|
|
}
|
|
else
|
|
{
|
|
if (e->Connected)
|
|
{
|
|
UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_ONLINE"));
|
|
}
|
|
else
|
|
{
|
|
if (e->LastError != 0)
|
|
{
|
|
UniFormat(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_ERROR"), e->LastError, _E(e->LastError));
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_CONNECTING"));
|
|
}
|
|
}
|
|
}
|
|
|
|
CtInsert(ct, e->AccountName, tmp4, tmp1, tmp2, tmp3);
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
}
|
|
|
|
FreeRpcEnumLink(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Creat a new cascade
|
|
UINT PsCascadeCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
char *host = NULL;
|
|
UINT port = 443;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"SERVER", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},
|
|
{"HUB", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Hub"), CmdEvalSafe, NULL},
|
|
{"USERNAME", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
t.Online = false;
|
|
|
|
Copy(&t.Policy, GetDefaultPolicy(), sizeof(POLICY));
|
|
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
t.ClientOption->Port = port;
|
|
StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);
|
|
StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));
|
|
t.ClientOption->NumRetry = INFINITE;
|
|
t.ClientOption->RetryInterval = 15;
|
|
t.ClientOption->MaxConnection = 8;
|
|
t.ClientOption->UseEncrypt = true;
|
|
t.ClientOption->AdditionalConnectionInterval = 1;
|
|
t.ClientOption->RequireBridgeRoutingMode = true;
|
|
|
|
t.ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));
|
|
t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
|
|
StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username), GetParamStr(o, "USERNAME"));
|
|
|
|
Free(host);
|
|
|
|
// RPC call
|
|
ret = ScCreateLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the user name and destination of the cascade connection
|
|
UINT PsCascadeSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
char *host = NULL;
|
|
UINT port = 443;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"SERVER", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},
|
|
{"HUB", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Hub"), CmdEvalSafe, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
Free(host);
|
|
return ret;
|
|
}
|
|
|
|
t.ClientOption->Port = port;
|
|
StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);
|
|
t.ClientOption->HintStr[0] = 0;
|
|
StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));
|
|
|
|
Free(host);
|
|
|
|
// RPC call
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the type string of proxy
|
|
wchar_t *GetProxyTypeStr(UINT i)
|
|
{
|
|
switch (i)
|
|
{
|
|
case PROXY_DIRECT:
|
|
|
|
return _UU("PROTO_DIRECT_TCP");
|
|
|
|
case PROXY_HTTP:
|
|
return _UU("PROTO_HTTP_PROXY");
|
|
|
|
case PROXY_SOCKS:
|
|
return _UU("PROTO_SOCKS_PROXY");
|
|
|
|
default:
|
|
return _UU("PROTO_UNKNOWN");
|
|
}
|
|
}
|
|
|
|
// Get type string in user authentication for client
|
|
wchar_t *GetClientAuthTypeStr(UINT i)
|
|
{
|
|
char tmp[MAX_SIZE];
|
|
|
|
Format(tmp, sizeof(tmp), "PW_TYPE_%u", i);
|
|
|
|
return _UU(tmp);
|
|
}
|
|
|
|
// Get the setting of cascade connection
|
|
UINT PsCascadeGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName),
|
|
GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Show the contents of the connection settings
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
CT *ct = CtNewStandard();
|
|
|
|
// Connection settings name
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NAME"), t.ClientOption->AccountName);
|
|
|
|
// Host name of the destination VPN Server
|
|
if (IsEmptyStr(t.ClientOption->HintStr))
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), t.ClientOption->Hostname);
|
|
}
|
|
else
|
|
{
|
|
char hostname[MAX_SIZE];
|
|
StrCpy(hostname, sizeof(hostname), t.ClientOption->Hostname);
|
|
StrCat(hostname, sizeof(hostname), "/");
|
|
StrCat(hostname, sizeof(hostname), t.ClientOption->HintStr);
|
|
StrToUni(tmp, sizeof(tmp), hostname);
|
|
}
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HOSTNAME"), tmp);
|
|
|
|
// The port number to connect to VPN Server
|
|
UniToStru(tmp, t.ClientOption->Port);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PORT"), tmp);
|
|
|
|
// Virtual HUB name of the destination VPN Server
|
|
StrToUni(tmp, sizeof(tmp), t.ClientOption->HubName);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HUBNAME"), tmp);
|
|
|
|
// Type of proxy server to go through
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_TYPE"), GetProxyTypeStr(t.ClientOption->ProxyType));
|
|
|
|
if (t.ClientOption->ProxyType != PROXY_DIRECT)
|
|
{
|
|
// Host name of the proxy server
|
|
StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyName);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_HOSTNAME"), tmp);
|
|
|
|
// Port number of the proxy server
|
|
UniToStru(tmp, t.ClientOption->ProxyPort);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_PORT"), tmp);
|
|
|
|
// User name of the proxy server
|
|
StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyUsername);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_USERNAME"), tmp);
|
|
}
|
|
|
|
// To verify the server certificate
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_USE"),
|
|
t.CheckServerCert ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
// Registered specific certificate
|
|
if (t.ServerCert != NULL)
|
|
{
|
|
GetAllNameFromX(tmp, sizeof(tmp), t.ServerCert);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_NAME"), tmp);
|
|
}
|
|
|
|
if (t.CheckServerCert)
|
|
{
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_ADD_DEFAULT_CA"),
|
|
t.AddDefaultCA ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
}
|
|
|
|
// Device name to be used for the connection
|
|
StrToUni(tmp, sizeof(tmp), t.ClientOption->DeviceName);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_DEVICE_NAME"), tmp);
|
|
|
|
// Authentication type
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_TYPE"), GetClientAuthTypeStr(t.ClientAuth->AuthType));
|
|
|
|
// User name
|
|
StrToUni(tmp, sizeof(tmp), t.ClientAuth->Username);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_USERNAME"), tmp);
|
|
|
|
if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_CERT)
|
|
{
|
|
if (t.ClientAuth->ClientX != NULL)
|
|
{
|
|
// Client certificate name
|
|
GetAllNameFromX(tmp, sizeof(tmp), t.ClientAuth->ClientX);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_CERT_NAME"), tmp);
|
|
}
|
|
}
|
|
|
|
// Number of TCP connections to be used for VPN communication
|
|
UniToStru(tmp, t.ClientOption->MaxConnection);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NUMTCP"), tmp);
|
|
|
|
// Establishment interval of each TCP connection
|
|
UniToStru(tmp, t.ClientOption->AdditionalConnectionInterval);
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_INTERVAL"), tmp);
|
|
|
|
// Life span of each TCP connection
|
|
if (t.ClientOption->ConnectionDisconnectSpan != 0)
|
|
{
|
|
UniToStru(tmp, t.ClientOption->ConnectionDisconnectSpan);
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("CMD_MSG_INFINITE"));
|
|
}
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_TTL"), tmp);
|
|
|
|
// Use of half-duplex mode
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_HALF"),
|
|
t.ClientOption->HalfConnection ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
// Encryption by SSL
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_ENCRYPT"),
|
|
t.ClientOption->UseEncrypt ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
// Data compression
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_COMPRESS"),
|
|
t.ClientOption->UseCompress ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
// Connect in bridge / router mode
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_BRIDGE_ROUTER"),
|
|
t.ClientOption->RequireBridgeRoutingMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
// Connect in monitoring mode
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_MONITOR"),
|
|
t.ClientOption->RequireMonitorMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
// Not to rewrite the routing table
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NO_TRACKING"),
|
|
t.ClientOption->NoRoutingTracking ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
// Disable the QoS control
|
|
CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_QOS_DISABLE"),
|
|
t.ClientOption->DisableQoS ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));
|
|
|
|
CtFree(ct, c);
|
|
|
|
// Security policy
|
|
c->Write(c, L"");
|
|
c->Write(c, _UU("CMD_CascadeGet_Policy"));
|
|
PrintPolicy(c, &t.Policy, true);
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the cascade connection
|
|
UINT PsCascadeDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScDeleteLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the user name to use for the cascade connection
|
|
UINT PsCascadeUsernameSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"USERNAME", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Change the settings for the cascade connection
|
|
StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username),
|
|
GetParamStr(o, "USERNAME"));
|
|
|
|
if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_PASSWORD)
|
|
{
|
|
c->Write(c, _UU("CMD_CascadeUsername_Notice"));
|
|
}
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
//Set the type of user authentication of cascade connection to the anonymous authentication
|
|
UINT PsCascadeAnonymousSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Change the settings for the cascade connection
|
|
t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the type of user authentication of cascade connection to the password authentication
|
|
UINT PsCascadePasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
|
|
{"TYPE", CmdPrompt, _UU("CMD_CascadePasswordSet_Prompt_Type"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Change the settings for the cascade connection
|
|
char *typestr = GetParamStr(o, "TYPE");
|
|
|
|
if (StartWith("standard", typestr))
|
|
{
|
|
t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PASSWORD;
|
|
HashPassword(t.ClientAuth->HashedPassword, t.ClientAuth->Username,
|
|
GetParamStr(o, "PASSWORD"));
|
|
}
|
|
else if (StartWith("radius", typestr) || StartWith("ntdomain", typestr))
|
|
{
|
|
t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PLAIN_PASSWORD;
|
|
|
|
StrCpy(t.ClientAuth->PlainPassword, sizeof(t.ClientAuth->PlainPassword),
|
|
GetParamStr(o, "PASSWORD"));
|
|
}
|
|
else
|
|
{
|
|
// An error has occured
|
|
c->Write(c, _UU("CMD_CascadePasswordSet_Type_Invalid"));
|
|
FreeRpcCreateLink(&t);
|
|
ret = ERR_INVALID_PARAMETER;
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ERR_INTERNAL_ERROR;
|
|
}
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the type of user authentication of cascade connection to the client certificate authentication
|
|
UINT PsCascadeCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
X *x;
|
|
K *k;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
|
|
{"LOADKEY", CmdPrompt, _UU("CMD_LOADKEYPATH"), CmdEvalIsFile, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (CmdLoadCertAndKey(c, &x, &k, GetParamUniStr(o, "LOADCERT"), GetParamUniStr(o, "LOADKEY")) == false)
|
|
{
|
|
return ERR_INTERNAL_ERROR;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
FreeX(x);
|
|
FreeK(k);
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Change authentication data
|
|
t.ClientAuth->AuthType = CLIENT_AUTHTYPE_CERT;
|
|
if (t.ClientAuth->ClientX != NULL)
|
|
{
|
|
FreeX(t.ClientAuth->ClientX);
|
|
}
|
|
if (t.ClientAuth->ClientK != NULL)
|
|
{
|
|
FreeK(t.ClientAuth->ClientK);
|
|
}
|
|
|
|
t.ClientAuth->ClientX = x;
|
|
t.ClientAuth->ClientK = k;
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the client certificate to be used in the cascade connection
|
|
UINT PsCascadeCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
if (t.ClientAuth->AuthType != CLIENT_AUTHTYPE_CERT)
|
|
{
|
|
c->Write(c, _UU("CMD_CascadeCertSet_Not_Auth_Cert"));
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
else if (t.ClientAuth->ClientX == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_CascadeCertSet_Cert_Not_Exists"));
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
else
|
|
{
|
|
XToFileW(t.ClientAuth->ClientX, GetParamUniStr(o, "SAVECERT"), true);
|
|
}
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Enable encryption of communication at the time of the cascade connection
|
|
UINT PsCascadeEncryptEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Data change
|
|
t.ClientOption->UseEncrypt = true;
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Disable encryption of communication at the time of the cascade connection
|
|
UINT PsCascadeEncryptDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Data change
|
|
t.ClientOption->UseEncrypt = false;
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Enable data compression at the time of communication of the cascade connection
|
|
UINT PsCascadeCompressEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Data change
|
|
t.ClientOption->UseCompress = true;
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Disable data compression at the time of communication of the cascade connection
|
|
UINT PsCascadeCompressDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Data change
|
|
t.ClientOption->UseCompress = false;
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
UINT PsCascadeHttpHeaderAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CREATE_LINK t;
|
|
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"NAME", CmdPrompt, _UU("CMD_CascadeHttpHeader_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"DATA", CmdPrompt, _UU("CMD_CascadeHttpHeader_Prompt_Data"), NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
UINT i = 0;
|
|
TOKEN_LIST *tokens = NULL;
|
|
HTTP_HEADER *header = NULL;
|
|
char *name = GetParamStr(o, "NAME");
|
|
|
|
Trim(name);
|
|
|
|
header = NewHttpHeader("", "", "");
|
|
|
|
tokens = ParseToken(t.ClientOption->CustomHttpHeader, "\r\n");
|
|
for (i = 0; i < tokens->NumTokens; i++)
|
|
{
|
|
AddHttpValueStr(header, tokens->Token[i]);
|
|
}
|
|
FreeToken(tokens);
|
|
|
|
if (GetHttpValue(header, name) == NULL)
|
|
{
|
|
char s[HTTP_CUSTOM_HEADER_MAX_SIZE];
|
|
Format(s, sizeof(s), "%s: %s\r\n", name, GetParamStr(o, "DATA"));
|
|
EnSafeHttpHeaderValueStr(s, ' ');
|
|
|
|
if ((StrLen(s) + StrLen(t.ClientOption->CustomHttpHeader)) < sizeof(t.ClientOption->CustomHttpHeader)) {
|
|
StrCat(t.ClientOption->CustomHttpHeader, sizeof(s), s);
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
}
|
|
else
|
|
{
|
|
// Error has occurred
|
|
ret = ERR_TOO_MANT_ITEMS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Error has occurred
|
|
ret = ERR_OBJECT_EXISTS;
|
|
}
|
|
|
|
FreeHttpHeader(header);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
UINT PsCascadeHttpHeaderDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CREATE_LINK t;
|
|
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"NAME", CmdPrompt, _UU("CMD_CascadeHttpHeader_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
UINT i = 0;
|
|
TOKEN_LIST *tokens = NULL;
|
|
char *value = GetParamStr(o, "NAME");
|
|
|
|
Zero(t.ClientOption->CustomHttpHeader, sizeof(t.ClientOption->CustomHttpHeader));
|
|
|
|
tokens = ParseToken(t.ClientOption->CustomHttpHeader, "\r\n");
|
|
|
|
for (i = 0; i < tokens->NumTokens; i++)
|
|
{
|
|
if (StartWith(tokens->Token[i], value) == false)
|
|
{
|
|
StrCat(t.ClientOption->CustomHttpHeader, sizeof(t.ClientOption->CustomHttpHeader), tokens->Token[i]);
|
|
StrCat(t.ClientOption->CustomHttpHeader, 1, "\r\n");
|
|
}
|
|
}
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
}
|
|
else
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
UINT PsCascadeHttpHeaderGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = ERR_NO_ERROR;
|
|
RPC_CREATE_LINK t;
|
|
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Get the parameter list
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// RPC call
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
// Release of the parameter list
|
|
FreeParamValueList(o);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
wchar_t unistr[HTTP_CUSTOM_HEADER_MAX_SIZE];
|
|
TOKEN_LIST *tokens = NULL;
|
|
UINT i = 0;
|
|
CT *ct = CtNew();
|
|
CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_1"), false);
|
|
|
|
tokens = ParseToken(t.ClientOption->CustomHttpHeader, "\r\n");
|
|
|
|
for (i = 0; i < tokens->NumTokens; i++)
|
|
{
|
|
StrToUni(unistr, sizeof(unistr), tokens->Token[i]);
|
|
CtInsert(ct, unistr);
|
|
}
|
|
|
|
CtFreeEx(ct, c, false);
|
|
}
|
|
else
|
|
{
|
|
// Error has occurred
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the cascade connection method to the TCP/IP direct connection mode
|
|
UINT PsCascadeProxyNone(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Data change
|
|
t.ClientOption->ProxyType = PROXY_DIRECT;
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the cascade connection method as the mode via HTTP proxy server
|
|
UINT PsCascadeProxyHttp(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"SERVER", CmdPrompt, _UU("CMD_CascadeProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
|
|
{"USERNAME", NULL, NULL, NULL, NULL},
|
|
{"PASSWORD", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
char *host;
|
|
UINT port;
|
|
|
|
// Data change
|
|
if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))
|
|
{
|
|
t.ClientOption->ProxyType = PROXY_HTTP;
|
|
StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
|
|
t.ClientOption->ProxyPort = port;
|
|
StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
|
|
StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
|
|
Free(host);
|
|
}
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the cascade connection method as the mode via SOCKS4 proxy server
|
|
UINT PsCascadeProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"SERVER", CmdPrompt, _UU("CMD_CascadeProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
|
|
{"USERNAME", NULL, NULL, NULL, NULL},
|
|
{"PASSWORD", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
char *host;
|
|
UINT port;
|
|
|
|
// Data change
|
|
if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 1080))
|
|
{
|
|
t.ClientOption->ProxyType = PROXY_SOCKS;
|
|
StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
|
|
t.ClientOption->ProxyPort = port;
|
|
StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
|
|
StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
|
|
Free(host);
|
|
}
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the cascade connection method as the mode via SOCKS5 proxy server
|
|
UINT PsCascadeProxySocks5(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"SERVER", CmdPrompt, _UU("CMD_CascadeProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},
|
|
{"USERNAME", NULL, NULL, NULL, NULL},
|
|
{"PASSWORD", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
char *host;
|
|
UINT port;
|
|
|
|
// Data change
|
|
if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 1080))
|
|
{
|
|
t.ClientOption->ProxyType = PROXY_SOCKS5;
|
|
StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);
|
|
t.ClientOption->ProxyPort = port;
|
|
StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));
|
|
StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));
|
|
Free(host);
|
|
}
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Enable the validation options for the server certificate of cascade connection
|
|
UINT PsCascadeServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Data change
|
|
t.CheckServerCert = true;
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Disable the validation options for the server certificate of cascade connection
|
|
UINT PsCascadeServerCertDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Data change
|
|
t.CheckServerCert = false;
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Enable trusting default CA list for cascade connection
|
|
UINT PsCascadeDefaultCAEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Data change
|
|
t.AddDefaultCA = true;
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Disable trusting default CA list for cascade connection
|
|
UINT PsCascadeDefaultCADisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Data change
|
|
t.AddDefaultCA = false;
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Server-specific certificate settings of cascade connection
|
|
UINT PsCascadeServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
X *x;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
x = FileToXW(GetParamUniStr(o, "LOADCERT"));
|
|
if (x == NULL)
|
|
{
|
|
FreeParamValueList(o);
|
|
c->Write(c, _UU("CMD_LOADCERT_FAILED"));
|
|
return ERR_INTERNAL_ERROR;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
FreeX(x);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Data change
|
|
if (t.ServerCert != NULL)
|
|
{
|
|
FreeX(t.ServerCert);
|
|
}
|
|
t.ServerCert = x;
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the server-specific certificate of cascade connection
|
|
UINT PsCascadeServerCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Data change
|
|
if (t.ServerCert != NULL)
|
|
{
|
|
FreeX(t.ServerCert);
|
|
}
|
|
t.ServerCert = NULL;
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the server-specific certificate of cascade connection
|
|
UINT PsCascadeServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Save the certificate
|
|
if (t.ServerCert == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_CERT_NOT_EXISTS"));
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
else
|
|
{
|
|
if (XToFileW(t.ServerCert, GetParamUniStr(o, "SAVECERT"), true) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_SAVECERT_FAILED"));
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the advanced settings of the cascade connection
|
|
UINT PsCascadeDetailSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
CMD_EVAL_MIN_MAX mm_maxtcp =
|
|
{
|
|
"CMD_CascadeDetailSet_Eval_MaxTcp", 1, 32
|
|
};
|
|
CMD_EVAL_MIN_MAX mm_interval =
|
|
{
|
|
"CMD_CascadeDetailSet_Eval_Interval", 1, 4294967295UL
|
|
};
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"MAXTCP", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_MaxTcp"), CmdEvalMinMax, &mm_maxtcp},
|
|
{"INTERVAL", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_Interval"), CmdEvalMinMax, &mm_interval},
|
|
{"TTL", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_TTL"), NULL, NULL},
|
|
{"HALF", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_HALF"), NULL, NULL},
|
|
{"NOQOS", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_NOQOS"), NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Data change
|
|
t.ClientOption->MaxConnection = GetParamInt(o, "MAXTCP");
|
|
t.ClientOption->AdditionalConnectionInterval = GetParamInt(o, "INTERVAL");
|
|
t.ClientOption->ConnectionDisconnectSpan = GetParamInt(o, "TTL");
|
|
t.ClientOption->HalfConnection = GetParamYes(o, "HALF");
|
|
t.ClientOption->DisableQoS = GetParamYes(o, "NOQOS");
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Show a security policy
|
|
void PrintPolicy(CONSOLE *c, POLICY *pol, bool cascade_mode)
|
|
{
|
|
UINT i;
|
|
CT *ct;
|
|
PACK *p;
|
|
// Validate arguments
|
|
if (c == NULL || pol == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
ct = CtNew();
|
|
CtInsertColumn(ct, _UU("CMD_PolicyList_Column_1"), false);
|
|
CtInsertColumn(ct, _UU("CMD_PolicyList_Column_2"), false);
|
|
CtInsertColumn(ct, _UU("CMD_PolicyList_Column_3"), false);
|
|
|
|
p = NewPack();
|
|
OutRpcPolicy(p, pol);
|
|
|
|
// Show the list of all policies
|
|
for (i = 0; i < PolicyNum();i++)
|
|
{
|
|
char name[64];
|
|
wchar_t *tmp;
|
|
|
|
if (cascade_mode == false || PolicyIsSupportedForCascade(i))
|
|
{
|
|
wchar_t value_str[256];
|
|
UINT value;
|
|
char tmp2[256];
|
|
|
|
Format(tmp2, sizeof(tmp2), "policy:%s", PolicyIdToStr(i));
|
|
value = PackGetInt(p, tmp2);
|
|
|
|
tmp = CopyStrToUni(PolicyIdToStr(i));
|
|
|
|
FormatPolicyValue(value_str, sizeof(value_str),
|
|
i, value);
|
|
|
|
Format(name, sizeof(name), "POL_%u", i);
|
|
CtInsert(ct, tmp, _UU(name), value_str);
|
|
|
|
Free(tmp);
|
|
}
|
|
}
|
|
|
|
FreePack(p);
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
// Show the security policy list
|
|
void PrintPolicyList(CONSOLE *c, char *name)
|
|
{
|
|
UINT id;
|
|
// Validate arguments
|
|
if (c == NULL)
|
|
{
|
|
return;
|
|
}
|
|
if (IsEmptyStr(name))
|
|
{
|
|
name = NULL;
|
|
}
|
|
|
|
if (name != NULL)
|
|
{
|
|
id = PolicyStrToId(name);
|
|
if (id == INFINITE)
|
|
{
|
|
// Invalid ID
|
|
c->Write(c, _UU("CMD_PolicyList_Invalid_Name"));
|
|
}
|
|
else
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
char name1[64], name2[64];
|
|
wchar_t *title, *descript;
|
|
wchar_t policy_name[MAX_SIZE];
|
|
|
|
Format(name1, sizeof(name1), "POL_%u", id);
|
|
Format(name2, sizeof(name2), "POL_EX_%u", id);
|
|
|
|
title = _UU(name1);
|
|
descript = _UU(name2);
|
|
|
|
StrToUni(policy_name, sizeof(policy_name), PolicyIdToStr(id));
|
|
|
|
// Policy name
|
|
c->Write(c, _UU("CMD_PolicyList_Help_1"));
|
|
UniFormat(tmp2, sizeof(tmp2), L" %s", policy_name);
|
|
c->Write(c, tmp2);
|
|
c->Write(c, L"");
|
|
|
|
// Simple description of the policy
|
|
c->Write(c, _UU("CMD_PolicyList_Help_2"));
|
|
UniFormat(tmp2, sizeof(tmp2), L" %s", title);
|
|
c->Write(c, tmp2);
|
|
c->Write(c, L"");
|
|
|
|
// Range of the value that can be set
|
|
GetPolicyValueRangeStr(tmp, sizeof(tmp), id);
|
|
c->Write(c, _UU("CMD_PolicyList_Help_3"));
|
|
UniFormat(tmp2, sizeof(tmp2), L" %s", tmp);
|
|
c->Write(c, tmp2);
|
|
c->Write(c, L"");
|
|
|
|
// Default value
|
|
FormatPolicyValue(tmp, sizeof(tmp), id, GetPolicyItem(id)->DefaultValue);
|
|
c->Write(c, _UU("CMD_PolicyList_Help_4"));
|
|
UniFormat(tmp2, sizeof(tmp2), L" %s", tmp);
|
|
c->Write(c, tmp2);
|
|
c->Write(c, L"");
|
|
|
|
// Detailed description of the policy
|
|
c->Write(c, _UU("CMD_PolicyList_Help_5"));
|
|
c->Write(c, descript);
|
|
c->Write(c, L"");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
UINT i;
|
|
CT *ct = CtNew();
|
|
CtInsertColumn(ct, _UU("CMD_PolicyList_Column_1"), false);
|
|
CtInsertColumn(ct, _UU("CMD_PolicyList_Column_2"), false);
|
|
|
|
// Show the list of all policies
|
|
for (i = 0; i < PolicyNum();i++)
|
|
{
|
|
char name[64];
|
|
wchar_t *tmp;
|
|
|
|
tmp = CopyStrToUni(PolicyIdToStr(i));
|
|
|
|
Format(name, sizeof(name), "POL_%u", i);
|
|
CtInsert(ct, tmp, _UU(name));
|
|
|
|
Free(tmp);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
}
|
|
|
|
// Editing the contents of the policy
|
|
bool EditPolicy(CONSOLE *c, POLICY *pol, char *name, char *value, bool cascade_mode)
|
|
{
|
|
PACK *p;
|
|
ELEMENT *e;
|
|
POLICY_ITEM *item;
|
|
UINT id;
|
|
wchar_t tmp[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
char pack_name[128];
|
|
// Validate arguments
|
|
if (c == NULL || pol == NULL || name == NULL || value == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
p = NewPack();
|
|
|
|
OutRpcPolicy(p, pol);
|
|
|
|
Format(pack_name, sizeof(pack_name), "policy:%s", PolicyIdToStr(PolicyStrToId(name)));
|
|
|
|
if ((e = GetElement(p, pack_name, VALUE_INT)) == NULL || (id = PolicyStrToId(name)) == INFINITE)
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_CascadePolicySet_Invalid_Name"), name);
|
|
c->Write(c, tmp);
|
|
FreePack(p);
|
|
return false;
|
|
}
|
|
|
|
if (cascade_mode && (PolicyIsSupportedForCascade(id) == false))
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_CascadePolicySet_Invalid_Name_For_Cascade"), name);
|
|
c->Write(c, tmp);
|
|
FreePack(p);
|
|
return false;
|
|
}
|
|
|
|
item = GetPolicyItem(id);
|
|
|
|
if (item->TypeInt == false)
|
|
{
|
|
// bool type
|
|
e->values[0]->IntValue = (
|
|
StartWith(value, "y") || StartWith(value, "t") ||
|
|
ToInt(value) != 0) ? 1 : 0;
|
|
}
|
|
else
|
|
{
|
|
UINT n = ToInt(value);
|
|
bool b = true;
|
|
|
|
// int type
|
|
GetPolicyValueRangeStr(tmp, sizeof(tmp), id);
|
|
|
|
if (item->AllowZero == false)
|
|
{
|
|
if (n == 0)
|
|
{
|
|
b = false;
|
|
}
|
|
}
|
|
|
|
if (n != 0 && (n < item->MinValue || n > item->MaxValue))
|
|
{
|
|
b = false;
|
|
}
|
|
|
|
if (b == false)
|
|
{
|
|
UniFormat(tmp2, sizeof(tmp2), _UU("CMD_CascadePolicySet_Invalid_Range"), PolicyIdToStr(id), tmp);
|
|
c->Write(c, tmp2);
|
|
FreePack(p);
|
|
return false;
|
|
}
|
|
|
|
e->values[0]->IntValue = n;
|
|
}
|
|
|
|
Zero(pol, sizeof(POLICY));
|
|
|
|
InRpcPolicy(pol, p);
|
|
|
|
FreePack(p);
|
|
|
|
return true;
|
|
}
|
|
|
|
// Show the list of the type of security policy and possible values
|
|
UINT PsPolicyList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", NULL, NULL, NULL, NULL}
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
PrintPolicyList(c, GetParamStr(o, "[name]"));
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return ERR_NO_ERROR;
|
|
}
|
|
|
|
// Set the security policy of the cascade session
|
|
UINT PsCascadePolicySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CREATE_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
{"NAME", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLNAME"), CmdEvalNotEmpty, NULL},
|
|
{"VALUE", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLVALUE"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
|
|
UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
if (EditPolicy(c, &t.Policy, GetParamStr(o, "NAME"), GetParamStr(o, "VALUE"), true) == false)
|
|
{
|
|
// An error has occured
|
|
FreeRpcCreateLink(&t);
|
|
FreeParamValueList(o);
|
|
return ERR_INTERNAL_ERROR;
|
|
}
|
|
|
|
ret = ScSetLink(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCreateLink(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Display the status information of the session
|
|
void CmdPrintStatusToListView(CT *ct, RPC_CLIENT_GET_CONNECTION_STATUS *s)
|
|
{
|
|
CmdPrintStatusToListViewEx(ct, s, false);
|
|
}
|
|
void CmdPrintStatusToListViewEx(CT *ct, RPC_CLIENT_GET_CONNECTION_STATUS *s, bool server_mode)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
char str[MAX_SIZE];
|
|
char vv[128];
|
|
// Validate arguments
|
|
if (s == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (server_mode == false)
|
|
{
|
|
CtInsert(ct, _UU("CM_ST_ACCOUNT_NAME"), s->AccountName);
|
|
|
|
if (s->Connected == false)
|
|
{
|
|
wchar_t *st = _UU("CM_ST_CONNECTED_FALSE");
|
|
switch (s->SessionStatus)
|
|
{
|
|
case CLIENT_STATUS_CONNECTING:
|
|
st = _UU("CM_ST_CONNECTING");
|
|
break;
|
|
case CLIENT_STATUS_NEGOTIATION:
|
|
st = _UU("CM_ST_NEGOTIATION");
|
|
break;
|
|
case CLIENT_STATUS_AUTH:
|
|
st = _UU("CM_ST_AUTH");
|
|
break;
|
|
case CLIENT_STATUS_ESTABLISHED:
|
|
st = _UU("CM_ST_ESTABLISHED");
|
|
break;
|
|
case CLIENT_STATUS_RETRY:
|
|
st = _UU("CM_ST_RETRY");
|
|
break;
|
|
case CLIENT_STATUS_IDLE:
|
|
st = _UU("CM_ST_IDLE");
|
|
break;
|
|
}
|
|
CtInsert(ct, _UU("CM_ST_CONNECTED"), st);
|
|
}
|
|
else
|
|
{
|
|
CtInsert(ct, _UU("CM_ST_CONNECTED"), _UU("CM_ST_CONNECTED_TRUE"));
|
|
}
|
|
}
|
|
|
|
if (s->Connected)
|
|
{
|
|
if (s->VLanId == 0)
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_NO_VLAN"));
|
|
}
|
|
else
|
|
{
|
|
UniToStru(tmp, s->VLanId);
|
|
}
|
|
|
|
CtInsert(ct, _UU("CM_ST_VLAN_ID"), tmp);
|
|
|
|
if (server_mode == false)
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), s->ServerName);
|
|
CtInsert(ct, _UU("CM_ST_SERVER_NAME"), tmp);
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_ST_PORT_TCP"), s->ServerPort);
|
|
CtInsert(ct, _UU("CM_ST_SERVER_PORT"), tmp);
|
|
}
|
|
|
|
StrToUni(tmp, sizeof(tmp), s->ServerProductName);
|
|
CtInsert(ct, _UU("CM_ST_SERVER_P_NAME"), tmp);
|
|
|
|
UniFormat(tmp, sizeof(tmp), L"%u.%02u", s->ServerProductVer / 100, s->ServerProductVer % 100);
|
|
CtInsert(ct, _UU("CM_ST_SERVER_P_VER"), tmp);
|
|
UniFormat(tmp, sizeof(tmp), L"Build %u", s->ServerProductBuild);
|
|
CtInsert(ct, _UU("CM_ST_SERVER_P_BUILD"), tmp);
|
|
}
|
|
|
|
GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->StartTime), NULL);
|
|
CtInsert(ct, _UU("CM_ST_START_TIME"), tmp);
|
|
/* !!! Do not correct the spelling to keep the backward protocol compatibility !!! */
|
|
GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->FirstConnectionEstablisiedTime), NULL);
|
|
/* !!! Do not correct the spelling to keep the backward protocol compatibility !!! */
|
|
CtInsert(ct, _UU("CM_ST_FIRST_ESTAB_TIME"), s->FirstConnectionEstablisiedTime == 0 ? _UU("CM_ST_NONE") : tmp);
|
|
|
|
if (s->Connected)
|
|
{
|
|
GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->CurrentConnectionEstablishTime), NULL);
|
|
CtInsert(ct, _UU("CM_ST_CURR_ESTAB_TIME"), tmp);
|
|
}
|
|
|
|
if (server_mode == false)
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_STR"), s->NumConnectionsEstablished);
|
|
CtInsert(ct, _UU("CM_ST_NUM_ESTABLISHED"), tmp);
|
|
}
|
|
|
|
if (s->Connected)
|
|
{
|
|
CtInsert(ct, _UU("CM_ST_HALF_CONNECTION"), s->HalfConnection ? _UU("CM_ST_HALF_TRUE") : _UU("CM_ST_HALF_FALSE"));
|
|
|
|
CtInsert(ct, _UU("CM_ST_QOS"), s->QoS ? _UU("CM_ST_QOS_TRUE") : _UU("CM_ST_QOS_FALSE"));
|
|
|
|
UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnections);
|
|
CtInsert(ct, _UU("CM_ST_NUM_TCP"), tmp);
|
|
|
|
if (s->HalfConnection)
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnectionsUpload);
|
|
CtInsert(ct, _UU("CM_ST_NUM_TCP_UPLOAD"), tmp);
|
|
UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnectionsDownload);
|
|
CtInsert(ct, _UU("CM_ST_NUM_TCP_DOWNLOAD"), tmp);
|
|
}
|
|
|
|
UniFormat(tmp, sizeof(tmp), L"%u", s->MaxTcpConnections);
|
|
CtInsert(ct, _UU("CM_ST_MAX_TCP"), tmp);
|
|
|
|
if (s->UseEncrypt == false)
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_FALSE"));
|
|
}
|
|
else
|
|
{
|
|
if (StrLen(s->CipherName) != 0 && StrLen(s->ProtocolName) != 0)
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_TRUE3"), s->ProtocolName, s->CipherName);
|
|
}
|
|
else if (StrLen(s->CipherName) != 0)
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_TRUE"), s->CipherName);
|
|
}
|
|
else
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_TRUE2"));
|
|
}
|
|
}
|
|
CtInsert(ct, _UU("CM_ST_USE_ENCRYPT"), tmp);
|
|
|
|
if (s->UseCompress)
|
|
{
|
|
UINT percent = 0;
|
|
if ((s->TotalRecvSize + s->TotalSendSize) > 0)
|
|
{
|
|
percent = (UINT)((UINT64)100 - (UINT64)(s->TotalRecvSizeReal + s->TotalSendSizeReal) * (UINT64)100 /
|
|
(s->TotalRecvSize + s->TotalSendSize));
|
|
percent = MAKESURE(percent, 0, 100);
|
|
}
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_ST_COMPRESS_TRUE"), percent);
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_COMPRESS_FALSE"));
|
|
}
|
|
CtInsert(ct, _UU("CM_ST_USE_COMPRESS"), tmp);
|
|
|
|
if (IsEmptyStr(s->UnderlayProtocol) == false)
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), s->UnderlayProtocol);
|
|
CtInsert(ct, _UU("CM_ST_UNDERLAY_PROTOCOL"), tmp);
|
|
}
|
|
|
|
if (IsEmptyStr(s->ProtocolDetails) == false)
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), s->ProtocolDetails);
|
|
CtInsert(ct, _UU("CM_ST_PROTOCOL_DETAILS"), tmp);
|
|
}
|
|
|
|
CtInsert(ct, _UU("CM_ST_UDP_ACCEL_ENABLED"), (s->IsUdpAccelerationEnabled ? _UU("CM_ST_YES") : _UU("CM_ST_NO")));
|
|
CtInsert(ct, _UU("CM_ST_UDP_ACCEL_USING"), (s->IsUsingUdpAcceleration ? _UU("CM_ST_YES") : _UU("CM_ST_NO")));
|
|
|
|
StrToUni(tmp, sizeof(tmp), s->SessionName);
|
|
CtInsert(ct, _UU("CM_ST_SESSION_NAME"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), s->ConnectionName);
|
|
if (UniStrCmpi(tmp, L"INITING") != 0)
|
|
{
|
|
CtInsert(ct, _UU("CM_ST_CONNECTION_NAME"), tmp);
|
|
}
|
|
|
|
BinToStr(str, sizeof(str), s->SessionKey, sizeof(s->SessionKey));
|
|
StrToUni(tmp, sizeof(tmp), str);
|
|
CtInsert(ct, _UU("CM_ST_SESSION_KEY"), tmp);
|
|
|
|
CtInsert(ct, _UU("CM_ST_BRIDGE_MODE"), s->IsBridgeMode ? _UU("CM_ST_YES") : _UU("CM_ST_NO"));
|
|
|
|
CtInsert(ct, _UU("CM_ST_MONITOR_MODE"), s->IsMonitorMode ? _UU("CM_ST_YES") : _UU("CM_ST_NO"));
|
|
|
|
ToStr3(vv, sizeof(vv), s->TotalSendSize);
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
|
|
CtInsert(ct, _UU("CM_ST_SEND_SIZE"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), s->TotalRecvSize);
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
|
|
CtInsert(ct, _UU("CM_ST_RECV_SIZE"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), s->Traffic.Send.UnicastCount);
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
|
|
CtInsert(ct, _UU("CM_ST_SEND_UCAST_NUM"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), s->Traffic.Send.UnicastBytes);
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
|
|
CtInsert(ct, _UU("CM_ST_SEND_UCAST_SIZE"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), s->Traffic.Send.BroadcastCount);
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
|
|
CtInsert(ct, _UU("CM_ST_SEND_BCAST_NUM"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), s->Traffic.Send.BroadcastBytes);
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
|
|
CtInsert(ct, _UU("CM_ST_SEND_BCAST_SIZE"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), s->Traffic.Recv.UnicastCount);
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
|
|
CtInsert(ct, _UU("CM_ST_RECV_UCAST_NUM"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), s->Traffic.Recv.UnicastBytes);
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
|
|
CtInsert(ct, _UU("CM_ST_RECV_UCAST_SIZE"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), s->Traffic.Recv.BroadcastCount);
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);
|
|
CtInsert(ct, _UU("CM_ST_RECV_BCAST_NUM"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), s->Traffic.Recv.BroadcastBytes);
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);
|
|
CtInsert(ct, _UU("CM_ST_RECV_BCAST_SIZE"), tmp);
|
|
}
|
|
}
|
|
|
|
// Get the current state of the cascade connection
|
|
UINT PsCascadeStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_LINK_STATUS t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetLinkStatus(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Get the cascade connection state
|
|
CT *ct = CtNewStandard();
|
|
|
|
CmdPrintStatusToListView(ct, &t.Status);
|
|
|
|
CtFree(ct, c);
|
|
|
|
FreeRpcLinkStatus(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Rename the cascade connection
|
|
UINT PsCascadeRename(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_RENAME_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeRename_PROMPT_OLD"), CmdEvalNotEmpty, NULL},
|
|
{"NEW", CmdPrompt, _UU("CMD_CascadeRename_PROMPT_NEW"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
UniStrCpy(t.NewAccountName, sizeof(t.NewAccountName), GetParamUniStr(o, "NEW"));
|
|
UniStrCpy(t.OldAccountName, sizeof(t.OldAccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScRenameLink(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the cascade connection to on-line state
|
|
UINT PsCascadeOnline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScSetLinkOnline(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the cascade connection to the off-line state
|
|
UINT PsCascadeOffline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_LINK t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScSetLinkOffline(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Convert the string to pass / discard flag
|
|
bool StrToPassOrDiscard(char *str)
|
|
{
|
|
// Validate arguments
|
|
if (str == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (ToInt(str) != 0)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
if (StartWith(str, "p") || StartWith(str, "y") || StartWith(str, "t"))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// Convert the string to the protocol
|
|
UINT StrToProtocol(char *str)
|
|
{
|
|
if (IsEmptyStr(str))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if (StartWith("ip", str))
|
|
{
|
|
return 0;
|
|
}
|
|
else if (StartWith("tcp", str))
|
|
{
|
|
return IP_PROTO_TCP;
|
|
}
|
|
else if (StartWith("udp", str))
|
|
{
|
|
return IP_PROTO_UDP;
|
|
}
|
|
else if (StartWith("icmpv4", str))
|
|
{
|
|
return IP_PROTO_ICMPV4;
|
|
}
|
|
else if (StartWith("icmpv6", str))
|
|
{
|
|
return IP_PROTO_ICMPV6;
|
|
}
|
|
|
|
if (ToInt(str) == 0)
|
|
{
|
|
if (StrCmpi(str, "0") == 0)
|
|
{
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
return INFINITE;
|
|
}
|
|
}
|
|
|
|
if (ToInt(str) >= 256)
|
|
{
|
|
return INFINITE;
|
|
}
|
|
|
|
return ToInt(str);
|
|
}
|
|
|
|
// Check the protocol name
|
|
bool CmdEvalProtocol(CONSOLE *c, wchar_t *str, void *param)
|
|
{
|
|
char tmp[64];
|
|
// Validate arguments
|
|
if (c == NULL || str == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
UniToStr(tmp, sizeof(tmp), str);
|
|
|
|
if (StrToProtocol(tmp) == INFINITE)
|
|
{
|
|
c->Write(c, _UU("CMD_PROTOCOL_EVAL_FAILED"));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Parse the port range
|
|
bool ParsePortRange(char *str, UINT *start, UINT *end)
|
|
{
|
|
UINT a = 0, b = 0;
|
|
TOKEN_LIST *t;
|
|
// Validate arguments
|
|
if (str == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (IsEmptyStr(str) == false)
|
|
{
|
|
|
|
t = ParseToken(str, "\t -");
|
|
|
|
if (t->NumTokens == 1)
|
|
{
|
|
a = b = ToInt(t->Token[0]);
|
|
}
|
|
else if (t->NumTokens == 2)
|
|
{
|
|
a = ToInt(t->Token[0]);
|
|
b = ToInt(t->Token[1]);
|
|
}
|
|
|
|
FreeToken(t);
|
|
|
|
if (a > b)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (a >= 65536 || b >= 65536)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (a == 0 && b != 0)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (start != NULL)
|
|
{
|
|
*start = a;
|
|
}
|
|
if (end != NULL)
|
|
{
|
|
*end = b;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Check the port range
|
|
bool CmdEvalPortRange(CONSOLE *c, wchar_t *str, void *param)
|
|
{
|
|
char tmp[64];
|
|
// Validate arguments
|
|
if (c == NULL || str == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
UniToStr(tmp, sizeof(tmp), str);
|
|
|
|
if (ParsePortRange(tmp, NULL, NULL) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_PORT_RANGE_EVAL_FAILED"));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Parse the MAC address and the mask
|
|
bool ParseMacAddressAndMask(char *src, bool *check_mac, UCHAR *mac_bin, UCHAR *mask_bin)
|
|
{
|
|
TOKEN_LIST *t;
|
|
char *macstr, *maskstr;
|
|
UCHAR mac[6], mask[6];
|
|
bool ok = false;
|
|
|
|
// Validate arguments
|
|
if (src == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//Zero(mac, sizeof(mac));
|
|
//Zero(mask, sizeof(mask));
|
|
|
|
if(check_mac != NULL && mac_bin != NULL && mask_bin != NULL)
|
|
{
|
|
ok = true;
|
|
}
|
|
if(IsEmptyStr(src) != false)
|
|
{
|
|
if(ok != false)
|
|
{
|
|
*check_mac = false;
|
|
Zero(mac_bin, 6);
|
|
Zero(mask_bin, 6);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
t = ParseToken(src, "/");
|
|
if(t->NumTokens != 2)
|
|
{
|
|
FreeToken(t);
|
|
return false;
|
|
}
|
|
|
|
macstr = t->Token[0];
|
|
maskstr = t->Token[1];
|
|
|
|
Trim(macstr);
|
|
Trim(maskstr);
|
|
|
|
if(StrToMac(mac, macstr) == false || StrToMac(mask, maskstr) == false)
|
|
{
|
|
FreeToken(t);
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
if(ok != false)
|
|
{
|
|
Copy(mac_bin, mac, 6);
|
|
Copy(mask_bin, mask, 6);
|
|
*check_mac = true;
|
|
}
|
|
}
|
|
FreeToken(t);
|
|
|
|
return true;
|
|
}
|
|
|
|
// Check the MAC address and mask
|
|
bool CmdEvalMacAddressAndMask(CONSOLE *c, wchar_t *str, void *param)
|
|
{
|
|
char tmp[64];
|
|
// Validate arguments
|
|
if(c == NULL || str == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
UniToStr(tmp, sizeof(tmp), str);
|
|
|
|
|
|
if(ParseMacAddressAndMask(tmp, NULL, NULL, NULL) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_MAC_ADDRESS_AND_MASK_EVAL_FAILED"));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
// Parse the status of TCP connection
|
|
bool ParseTcpState(char *src, bool *check_tcp_state, bool *established)
|
|
{
|
|
bool ok = false;
|
|
// Validate arguments
|
|
if(src == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if(check_tcp_state != NULL && established != NULL)
|
|
{
|
|
ok = true;
|
|
}
|
|
|
|
if (IsEmptyStr(src) == false)
|
|
{
|
|
if (StartWith("Established", src) == 0)
|
|
{
|
|
if(ok != false)
|
|
{
|
|
*check_tcp_state = true;
|
|
*established = true;
|
|
}
|
|
}
|
|
else if (StartWith("Unestablished", src) == 0)
|
|
{
|
|
if(ok != false)
|
|
{
|
|
*check_tcp_state = true;
|
|
*established = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Illegal string
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(ok != false)
|
|
{
|
|
*check_tcp_state = false;
|
|
*established = false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
// Check the status of the TCP connection
|
|
bool CmdEvalTcpState(CONSOLE *c, wchar_t *str, void *param)
|
|
{
|
|
char tmp[64];
|
|
// Validate arguments
|
|
if(c == NULL || str == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
UniToStr(tmp, sizeof(tmp), str);
|
|
|
|
if(ParseTcpState(tmp, NULL, NULL) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_TCP_CONNECTION_STATE_EVAL_FAILED"));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Adding a rule to the access list (Standard, IPv4)
|
|
UINT PsAccessAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ADD_ACCESS t;
|
|
ACCESS *a;
|
|
// Parameter list that can be specified
|
|
CMD_EVAL_MIN_MAX minmax =
|
|
{
|
|
"CMD_AccessAdd_Eval_PRIORITY", 1, 4294967295UL,
|
|
};
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TYPE"), CmdEvalNotEmpty, NULL},
|
|
{"MEMO", CmdPrompt, _UU("CMD_AccessAdd_Prompt_MEMO"), NULL, NULL},
|
|
{"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},
|
|
{"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCUSERNAME"), NULL, NULL},
|
|
{"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTUSERNAME"), NULL, NULL},
|
|
{"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},
|
|
{"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},
|
|
{"SRCIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCIP"), CmdEvalIpAndMask4, NULL},
|
|
{"DESTIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTIP"), CmdEvalIpAndMask4, NULL},
|
|
{"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},
|
|
{"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCPORT"), CmdEvalPortRange, NULL},
|
|
{"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTPORT"), CmdEvalPortRange, NULL},
|
|
{"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
a = &t.Access;
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));
|
|
a->Active = true;
|
|
a->Priority = GetParamInt(o, "PRIORITY");
|
|
a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;
|
|
StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));
|
|
StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));
|
|
ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);
|
|
ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);
|
|
ParseIpAndMask4(GetParamStr(o, "SRCIP"), &a->SrcIpAddress, &a->SrcSubnetMask);
|
|
ParseIpAndMask4(GetParamStr(o, "DESTIP"), &a->DestIpAddress, &a->DestSubnetMask);
|
|
a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));
|
|
ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);
|
|
ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);
|
|
ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);
|
|
|
|
// RPC call
|
|
ret = ScAddAccess(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Adding a rule to the access list (Extended, IPv4)
|
|
UINT PsAccessAddEx(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ADD_ACCESS t;
|
|
ACCESS *a;
|
|
// Parameter list that can be specified
|
|
CMD_EVAL_MIN_MAX minmax =
|
|
{
|
|
"CMD_AccessAdd_Eval_PRIORITY", 1, 4294967295UL,
|
|
};
|
|
CMD_EVAL_MIN_MAX minmax_delay =
|
|
{
|
|
"CMD_AccessAddEx_Eval_DELAY", 0, HUB_ACCESSLIST_DELAY_MAX,
|
|
};
|
|
CMD_EVAL_MIN_MAX minmax_jitter =
|
|
{
|
|
"CMD_AccessAddEx_Eval_JITTER", 0, HUB_ACCESSLIST_JITTER_MAX,
|
|
};
|
|
CMD_EVAL_MIN_MAX minmax_loss =
|
|
{
|
|
"CMD_AccessAddEx_Eval_LOSS", 0, HUB_ACCESSLIST_LOSS_MAX,
|
|
};
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TYPE"), CmdEvalNotEmpty, NULL},
|
|
{"MEMO", CmdPrompt, _UU("CMD_AccessAdd_Prompt_MEMO"), NULL, NULL},
|
|
{"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},
|
|
{"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCUSERNAME"), NULL, NULL},
|
|
{"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTUSERNAME"), NULL, NULL},
|
|
{"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},
|
|
{"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},
|
|
{"SRCIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCIP"), CmdEvalIpAndMask4, NULL},
|
|
{"DESTIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTIP"), CmdEvalIpAndMask4, NULL},
|
|
{"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},
|
|
{"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCPORT"), CmdEvalPortRange, NULL},
|
|
{"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTPORT"), CmdEvalPortRange, NULL},
|
|
{"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},
|
|
{"DELAY", CmdPrompt, _UU("CMD_AccessAddEx_Prompt_DELAY"), CmdEvalMinMax, &minmax_delay},
|
|
{"JITTER", CmdPrompt, _UU("CMD_AccessAddEx_Prompt_JITTER"), CmdEvalMinMax, &minmax_jitter},
|
|
{"LOSS", CmdPrompt, _UU("CMD_AccessAddEx_Prompt_LOSS"), CmdEvalMinMax, &minmax_loss},
|
|
{"REDIRECTURL", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Check whether it is supported
|
|
if (GetCapsBool(ps->CapsList, "b_support_ex_acl") == false)
|
|
{
|
|
c->Write(c, _E(ERR_NOT_SUPPORTED));
|
|
return ERR_NOT_SUPPORTED;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
a = &t.Access;
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));
|
|
a->Active = true;
|
|
a->Priority = GetParamInt(o, "PRIORITY");
|
|
a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;
|
|
StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));
|
|
StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));
|
|
ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);
|
|
ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);
|
|
ParseIpAndMask4(GetParamStr(o, "SRCIP"), &a->SrcIpAddress, &a->SrcSubnetMask);
|
|
ParseIpAndMask4(GetParamStr(o, "DESTIP"), &a->DestIpAddress, &a->DestSubnetMask);
|
|
a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));
|
|
ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);
|
|
ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);
|
|
ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);
|
|
a->Delay = GetParamInt(o, "DELAY");
|
|
a->Jitter = GetParamInt(o, "JITTER");
|
|
a->Loss = GetParamInt(o, "LOSS");
|
|
StrCpy(a->RedirectUrl, sizeof(a->RedirectUrl), GetParamStr(o, "REDIRECTURL"));
|
|
|
|
// RPC call
|
|
ret = ScAddAccess(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Adding a rule to the access list (Standard, IPv6)
|
|
UINT PsAccessAdd6(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ADD_ACCESS t;
|
|
ACCESS *a;
|
|
IP ip, mask;
|
|
// Parameter list that can be specified
|
|
CMD_EVAL_MIN_MAX minmax =
|
|
{
|
|
"CMD_AccessAdd6_Eval_PRIORITY", 1, 4294967295UL,
|
|
};
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TYPE"), CmdEvalNotEmpty, NULL},
|
|
{"MEMO", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_MEMO"), NULL, NULL},
|
|
{"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},
|
|
{"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCUSERNAME"), NULL, NULL},
|
|
{"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTUSERNAME"), NULL, NULL},
|
|
{"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},
|
|
{"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},
|
|
{"SRCIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCIP"), CmdEvalIpAndMask6, NULL},
|
|
{"DESTIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTIP"), CmdEvalIpAndMask6, NULL},
|
|
{"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},
|
|
{"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCPORT"), CmdEvalPortRange, NULL},
|
|
{"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTPORT"), CmdEvalPortRange, NULL},
|
|
{"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Check whether it is supported
|
|
if (GetCapsBool(ps->CapsList, "b_support_ex_acl") == false)
|
|
{
|
|
c->Write(c, _E(ERR_NOT_SUPPORTED));
|
|
return ERR_NOT_SUPPORTED;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
a = &t.Access;
|
|
|
|
a->IsIPv6 = true;
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));
|
|
a->Active = true;
|
|
a->Priority = GetParamInt(o, "PRIORITY");
|
|
a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;
|
|
StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));
|
|
StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));
|
|
ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);
|
|
ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);
|
|
|
|
Zero(&ip, sizeof(ip));
|
|
Zero(&mask, sizeof(mask));
|
|
|
|
ParseIpAndMask6(GetParamStr(o, "SRCIP"), &ip, &mask);
|
|
IPToIPv6Addr(&a->SrcIpAddress6, &ip);
|
|
IPToIPv6Addr(&a->SrcSubnetMask6, &mask);
|
|
|
|
ParseIpAndMask6(GetParamStr(o, "DESTIP"), &ip, &mask);
|
|
IPToIPv6Addr(&a->DestIpAddress6, &ip);
|
|
IPToIPv6Addr(&a->DestSubnetMask6, &mask);
|
|
|
|
a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));
|
|
ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);
|
|
ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);
|
|
ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);
|
|
|
|
// RPC call
|
|
ret = ScAddAccess(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Adding a rule to the access list (Extended, IPv6)
|
|
UINT PsAccessAddEx6(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ADD_ACCESS t;
|
|
ACCESS *a;
|
|
IP ip, mask;
|
|
// Parameter list that can be specified
|
|
CMD_EVAL_MIN_MAX minmax =
|
|
{
|
|
"CMD_AccessAdd6_Eval_PRIORITY", 1, 4294967295UL,
|
|
};
|
|
CMD_EVAL_MIN_MAX minmax_delay =
|
|
{
|
|
"CMD_AccessAddEx6_Eval_DELAY", 0, HUB_ACCESSLIST_DELAY_MAX,
|
|
};
|
|
CMD_EVAL_MIN_MAX minmax_jitter =
|
|
{
|
|
"CMD_AccessAddEx6_Eval_JITTER", 0, HUB_ACCESSLIST_JITTER_MAX,
|
|
};
|
|
CMD_EVAL_MIN_MAX minmax_loss =
|
|
{
|
|
"CMD_AccessAddEx6_Eval_LOSS", 0, HUB_ACCESSLIST_LOSS_MAX,
|
|
};
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TYPE"), CmdEvalNotEmpty, NULL},
|
|
{"MEMO", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_MEMO"), NULL, NULL},
|
|
{"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},
|
|
{"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCUSERNAME"), NULL, NULL},
|
|
{"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTUSERNAME"), NULL, NULL},
|
|
{"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},
|
|
{"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},
|
|
{"SRCIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCIP"), CmdEvalIpAndMask6, NULL},
|
|
{"DESTIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTIP"), CmdEvalIpAndMask6, NULL},
|
|
{"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},
|
|
{"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCPORT"), CmdEvalPortRange, NULL},
|
|
{"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTPORT"), CmdEvalPortRange, NULL},
|
|
{"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},
|
|
{"DELAY", CmdPrompt, _UU("CMD_AccessAddEx6_Prompt_DELAY"), CmdEvalMinMax, &minmax_delay},
|
|
{"JITTER", CmdPrompt, _UU("CMD_AccessAddEx6_Prompt_JITTER"), CmdEvalMinMax, &minmax_jitter},
|
|
{"LOSS", CmdPrompt, _UU("CMD_AccessAddEx6_Prompt_LOSS"), CmdEvalMinMax, &minmax_loss},
|
|
{"REDIRECTURL", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Check whether it is supported
|
|
if (GetCapsBool(ps->CapsList, "b_support_ex_acl") == false)
|
|
{
|
|
c->Write(c, _E(ERR_NOT_SUPPORTED));
|
|
return ERR_NOT_SUPPORTED;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
a = &t.Access;
|
|
|
|
a->IsIPv6 = true;
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));
|
|
a->Active = true;
|
|
a->Priority = GetParamInt(o, "PRIORITY");
|
|
a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;
|
|
StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));
|
|
StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));
|
|
ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);
|
|
ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);
|
|
|
|
Zero(&ip, sizeof(ip));
|
|
Zero(&mask, sizeof(mask));
|
|
|
|
ParseIpAndMask6(GetParamStr(o, "SRCIP"), &ip, &mask);
|
|
IPToIPv6Addr(&a->SrcIpAddress6, &ip);
|
|
IPToIPv6Addr(&a->SrcSubnetMask6, &mask);
|
|
|
|
ParseIpAndMask6(GetParamStr(o, "DESTIP"), &ip, &mask);
|
|
IPToIPv6Addr(&a->DestIpAddress6, &ip);
|
|
IPToIPv6Addr(&a->DestSubnetMask6, &mask);
|
|
|
|
a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));
|
|
ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);
|
|
ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);
|
|
ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);
|
|
a->Delay = GetParamInt(o, "DELAY");
|
|
a->Jitter = GetParamInt(o, "JITTER");
|
|
a->Loss = GetParamInt(o, "LOSS");
|
|
StrCpy(a->RedirectUrl, sizeof(a->RedirectUrl), GetParamStr(o, "REDIRECTURL"));
|
|
|
|
// RPC call
|
|
ret = ScAddAccess(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
// Get the list of rules in the access list
|
|
UINT PsAccessList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_ACCESS_LIST t;
|
|
CT *ct;
|
|
UINT i;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScEnumAccess(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
ct = CtNew();
|
|
CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_0"), true);
|
|
CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_1"), true);
|
|
CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_2"), true);
|
|
CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_3"), true);
|
|
CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_6"), true);
|
|
CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_5"), false);
|
|
CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_4"), false);
|
|
|
|
for (i = 0;i < t.NumAccess;i++)
|
|
{
|
|
ACCESS *a = &t.Accesses[i];
|
|
char tmp[MAX_SIZE];
|
|
wchar_t tmp3[MAX_SIZE];
|
|
wchar_t tmp1[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
wchar_t tmp4[MAX_SIZE];
|
|
|
|
GetAccessListStr(tmp, sizeof(tmp), a);
|
|
UniToStru(tmp1, a->Priority);
|
|
StrToUni(tmp2, sizeof(tmp2), tmp);
|
|
UniToStru(tmp4, a->UniqueId);
|
|
if (a->UniqueId == 0)
|
|
{
|
|
UniStrCpy(tmp4, sizeof(tmp4), _UU("SEC_NONE"));
|
|
}
|
|
|
|
UniToStru(tmp3, a->Id);
|
|
|
|
CtInsert(ct,
|
|
tmp3,
|
|
a->Discard ? _UU("SM_ACCESS_DISCARD") : _UU("SM_ACCESS_PASS"),
|
|
a->Active ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"),
|
|
tmp1,
|
|
tmp4,
|
|
tmp2,
|
|
a->Note);
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
|
|
FreeRpcEnumAccessList(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Remove a rule from the access list
|
|
UINT PsAccessDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_DELETE_ACCESS t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[id]", CmdPrompt, _UU("CMD_Access_Prompt_ID"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.Id = GetParamInt(o, "[id]");
|
|
|
|
// RPC call
|
|
ret = ScDeleteAccess(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Enable the rule of access list
|
|
UINT PsAccessEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_ACCESS_LIST t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[id]", CmdPrompt, _UU("CMD_Access_Prompt_ID"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScEnumAccess(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
UINT i;
|
|
bool b = false;
|
|
for (i = 0;i < t.NumAccess;i++)
|
|
{
|
|
ACCESS *a = &t.Accesses[i];
|
|
|
|
if (a->Id == GetParamInt(o, "[id]"))
|
|
{
|
|
b = true;
|
|
|
|
a->Active = true;
|
|
}
|
|
}
|
|
|
|
if (b == false)
|
|
{
|
|
// The specified ID is not found
|
|
ret = ERR_OBJECT_NOT_FOUND;
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
FreeRpcEnumAccessList(&t);
|
|
return ret;
|
|
}
|
|
|
|
ret = ScSetAccessList(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcEnumAccessList(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Disable the rule of access list
|
|
UINT PsAccessDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_ACCESS_LIST t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[id]", CmdPrompt, _UU("CMD_Access_Prompt_ID"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScEnumAccess(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
UINT i;
|
|
bool b = false;
|
|
for (i = 0;i < t.NumAccess;i++)
|
|
{
|
|
ACCESS *a = &t.Accesses[i];
|
|
|
|
if (a->Id == GetParamInt(o, "[id]"))
|
|
{
|
|
b = true;
|
|
|
|
a->Active = false;
|
|
}
|
|
}
|
|
|
|
if (b == false)
|
|
{
|
|
// The specified ID is not found
|
|
ret = ERR_OBJECT_NOT_FOUND;
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
FreeRpcEnumAccessList(&t);
|
|
return ret;
|
|
}
|
|
|
|
ret = ScSetAccessList(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcEnumAccessList(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Get the user list
|
|
UINT PsUserList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_USER t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScEnumUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
UINT i;
|
|
CT *ct = CtNew();
|
|
|
|
CtInsertColumn(ct, _UU("SM_USER_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("SM_USER_COLUMN_2"), false);
|
|
CtInsertColumn(ct, _UU("SM_USER_COLUMN_3"), false);
|
|
CtInsertColumn(ct, _UU("SM_USER_COLUMN_4"), false);
|
|
CtInsertColumn(ct, _UU("SM_USER_COLUMN_5"), false);
|
|
CtInsertColumn(ct, _UU("SM_USER_COLUMN_6"), false);
|
|
CtInsertColumn(ct, _UU("SM_USER_COLUMN_7"), false);
|
|
CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_5"), false);
|
|
CtInsertColumn(ct, _UU("SM_SESS_COLUMN_6"), false);
|
|
CtInsertColumn(ct, _UU("SM_SESS_COLUMN_7"), false);
|
|
|
|
for (i = 0;i < t.NumUser;i++)
|
|
{
|
|
RPC_ENUM_USER_ITEM *e = &t.Users[i];
|
|
wchar_t name[MAX_SIZE];
|
|
wchar_t group[MAX_SIZE];
|
|
wchar_t num[MAX_SIZE];
|
|
wchar_t time[MAX_SIZE];
|
|
wchar_t exp[MAX_SIZE];
|
|
wchar_t num1[64], num2[64];
|
|
|
|
StrToUni(name, sizeof(name), e->Name);
|
|
|
|
if (StrLen(e->GroupName) != 0)
|
|
{
|
|
StrToUni(group, sizeof(group), e->GroupName);
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(group, sizeof(group), _UU("SM_NO_GROUP"));
|
|
}
|
|
|
|
UniToStru(num, e->NumLogin);
|
|
|
|
GetDateTimeStrEx64(time, sizeof(time), SystemToLocal64(e->LastLoginTime), NULL);
|
|
|
|
if (e->IsExpiresFilled == false)
|
|
{
|
|
UniStrCpy(exp, sizeof(exp), _UU("CM_ST_NONE"));
|
|
}
|
|
else
|
|
{
|
|
if (e->Expires == 0)
|
|
{
|
|
UniStrCpy(exp, sizeof(exp), _UU("SM_LICENSE_NO_EXPIRES"));
|
|
}
|
|
else
|
|
{
|
|
GetDateTimeStrEx64(exp, sizeof(exp), SystemToLocal64(e->Expires), NULL);
|
|
}
|
|
}
|
|
|
|
if (e->IsTrafficFilled == false)
|
|
{
|
|
UniStrCpy(num1, sizeof(num1), _UU("CM_ST_NONE"));
|
|
UniStrCpy(num2, sizeof(num2), _UU("CM_ST_NONE"));
|
|
}
|
|
else
|
|
{
|
|
UniToStr3(num1, sizeof(num1),
|
|
e->Traffic.Recv.BroadcastBytes + e->Traffic.Recv.UnicastBytes +
|
|
e->Traffic.Send.BroadcastBytes + e->Traffic.Send.UnicastBytes);
|
|
|
|
UniToStr3(num2, sizeof(num2),
|
|
e->Traffic.Recv.BroadcastCount + e->Traffic.Recv.UnicastCount +
|
|
e->Traffic.Send.BroadcastBytes + e->Traffic.Send.UnicastCount);
|
|
}
|
|
|
|
CtInsert(ct,
|
|
name, e->Realname, group, e->Note, GetAuthTypeStr(e->AuthType),
|
|
num, time, exp, num1, num2);
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
}
|
|
|
|
FreeRpcEnumUser(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get a string of user authentication method
|
|
wchar_t *GetAuthTypeStr(UINT id)
|
|
{
|
|
char tmp[MAX_SIZE];
|
|
Format(tmp, sizeof(tmp), "SM_AUTHTYPE_%u", id);
|
|
|
|
return _UU(tmp);
|
|
}
|
|
|
|
// Creating a user
|
|
UINT PsUserCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_USER t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"GROUP", CmdPrompt, _UU("CMD_UserCreate_Prompt_GROUP"), NULL, NULL},
|
|
{"REALNAME", CmdPrompt, _UU("CMD_UserCreate_Prompt_REALNAME"), NULL, NULL},
|
|
{"NOTE", CmdPrompt, _UU("CMD_UserCreate_Prompt_NOTE"), NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
StrCpy(t.GroupName, sizeof(t.GroupName), GetParamStr(o, "GROUP"));
|
|
UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));
|
|
UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));
|
|
|
|
Trim(t.Name);
|
|
if (StrCmpi(t.Name, "*") == 0)
|
|
{
|
|
t.AuthType = AUTHTYPE_RADIUS;
|
|
t.AuthData = NewRadiusAuthData(NULL);
|
|
}
|
|
else
|
|
{
|
|
UCHAR random_pass[SHA1_SIZE];
|
|
UCHAR random_pass2[MD5_SIZE];
|
|
|
|
Rand(random_pass, sizeof(random_pass));
|
|
Rand(random_pass2, sizeof(random_pass2));
|
|
t.AuthType = AUTHTYPE_PASSWORD;
|
|
t.AuthData = NewPasswordAuthDataRaw(random_pass, random_pass2);
|
|
}
|
|
|
|
// RPC call
|
|
ret = ScCreateUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcSetUser(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Change the user information
|
|
UINT PsUserSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_USER t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"GROUP", CmdPrompt, _UU("CMD_UserCreate_Prompt_GROUP"), NULL, NULL},
|
|
{"REALNAME", CmdPrompt, _UU("CMD_UserCreate_Prompt_REALNAME"), NULL, NULL},
|
|
{"NOTE", CmdPrompt, _UU("CMD_UserCreate_Prompt_NOTE"), NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
// Get the user object
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
ret = ScGetUser(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
// Update the information
|
|
StrCpy(t.GroupName, sizeof(t.GroupName), GetParamStr(o, "GROUP"));
|
|
UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));
|
|
UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));
|
|
|
|
// Write the user object
|
|
ret = ScSetUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcSetUser(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the user
|
|
UINT PsUserDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_DELETE_USER t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScDeleteUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the user information
|
|
UINT PsUserGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_USER t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
// Get the user object
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
ret = ScGetUser(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
CT *ct;
|
|
|
|
// Display the user's data
|
|
ct = CtNewStandard();
|
|
|
|
// User name
|
|
StrToUni(tmp, sizeof(tmp), t.Name);
|
|
CtInsert(ct, _UU("CMD_UserGet_Column_Name"), tmp);
|
|
|
|
// Real name
|
|
CtInsert(ct, _UU("CMD_UserGet_Column_RealName"), t.Realname);
|
|
|
|
// Description
|
|
CtInsert(ct, _UU("CMD_UserGet_Column_Note"), t.Note);
|
|
|
|
// Group name
|
|
if (IsEmptyStr(t.GroupName) == false)
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), t.GroupName);
|
|
CtInsert(ct, _UU("CMD_UserGet_Column_Group"), tmp);
|
|
}
|
|
|
|
// Expiration date
|
|
GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ExpireTime), NULL);
|
|
CtInsert(ct, _UU("CMD_UserGet_Column_Expires"), tmp);
|
|
|
|
// Authentication method
|
|
CtInsert(ct, _UU("CMD_UserGet_Column_AuthType"), GetAuthTypeStr(t.AuthType));
|
|
|
|
switch (t.AuthType)
|
|
{
|
|
case AUTHTYPE_USERCERT:
|
|
if (t.AuthData != NULL)
|
|
{
|
|
AUTHUSERCERT *auc = (AUTHUSERCERT *)t.AuthData;
|
|
|
|
if (auc != NULL && auc->UserX != NULL)
|
|
{
|
|
// Registered user-specific certificate
|
|
GetAllNameFromX(tmp, sizeof(tmp), auc->UserX);
|
|
CtInsert(ct, _UU("CMD_UserGet_Column_UserCert"), tmp);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case AUTHTYPE_ROOTCERT:
|
|
if (t.AuthData != NULL)
|
|
{
|
|
AUTHROOTCERT *arc = (AUTHROOTCERT *)t.AuthData;
|
|
|
|
if (IsEmptyUniStr(arc->CommonName) == false)
|
|
{
|
|
// Limitation the value of the certificate's CN
|
|
CtInsert(ct, _UU("CMD_UserGet_Column_RootCert_CN"), arc->CommonName);
|
|
}
|
|
|
|
if (arc->Serial != NULL && arc->Serial->size >= 1)
|
|
{
|
|
char tmp2[MAX_SIZE];
|
|
|
|
// Limitation the serial number of the certificate
|
|
BinToStrEx(tmp2, sizeof(tmp2), arc->Serial->data, arc->Serial->size);
|
|
StrToUni(tmp, sizeof(tmp), tmp2);
|
|
CtInsert(ct, _UU("CMD_UserGet_Column_RootCert_SERIAL"), tmp);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case AUTHTYPE_RADIUS:
|
|
case AUTHTYPE_NT:
|
|
if (t.AuthData != NULL)
|
|
{
|
|
AUTHRADIUS *ar = (AUTHRADIUS *)t.AuthData;
|
|
|
|
// Authentication user name of the external authentication server
|
|
if (IsEmptyUniStr(ar->RadiusUsername) == false)
|
|
{
|
|
CtInsert(ct, _UU("CMD_UserGet_Column_RadiusAlias"), ar->RadiusUsername);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
CtInsert(ct, L"---", L"---");
|
|
|
|
GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.CreatedTime), NULL);
|
|
CtInsert(ct, _UU("SM_USERINFO_CREATE"), tmp);
|
|
|
|
GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.UpdatedTime), NULL);
|
|
CtInsert(ct, _UU("SM_USERINFO_UPDATE"), tmp);
|
|
|
|
CmdInsertTrafficInfo(ct, &t.Traffic);
|
|
|
|
UniToStru(tmp, t.NumLogin);
|
|
CtInsert(ct, _UU("SM_USERINFO_NUMLOGIN"), tmp);
|
|
|
|
|
|
CtFree(ct, c);
|
|
|
|
if (t.Policy != NULL)
|
|
{
|
|
c->Write(c, L"");
|
|
c->Write(c, _UU("CMD_UserGet_Policy"));
|
|
PrintPolicy(c, t.Policy, false);
|
|
}
|
|
}
|
|
|
|
FreeRpcSetUser(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the authentication method for the user to the anonymous authentication
|
|
UINT PsUserAnonymousSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_USER t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
// Get the user object
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
ret = ScGetUser(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
// Update the information
|
|
FreeAuthData(t.AuthType, t.AuthData);
|
|
|
|
// Set to anonymous authentication
|
|
t.AuthType = AUTHTYPE_ANONYMOUS;
|
|
t.AuthData = NULL;
|
|
|
|
// Write the user object
|
|
ret = ScSetUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcSetUser(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the authentication method for the user to the password authentication and set a password
|
|
UINT PsUserPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_USER t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
// Get the user object
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
ret = ScGetUser(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
// Update the information
|
|
FreeAuthData(t.AuthType, t.AuthData);
|
|
|
|
{
|
|
AUTHPASSWORD *pw;
|
|
|
|
pw = NewPasswordAuthData(t.Name, GetParamStr(o, "PASSWORD"));
|
|
|
|
// Set to the password authentication
|
|
t.AuthType = AUTHTYPE_PASSWORD;
|
|
t.AuthData = pw;
|
|
}
|
|
|
|
// Write the user object
|
|
ret = ScSetUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcSetUser(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the authentication method for the user to the specific certificate authentication and set a certificate
|
|
UINT PsUserCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_USER t;
|
|
X *x;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Read the certificate
|
|
x = FileToXW(GetParamUniStr(o, "LOADCERT"));
|
|
if (x == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_LOADCERT_FAILED"));
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return ERR_INTERNAL_ERROR;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
// Get the user object
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
ret = ScGetUser(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
FreeX(x);
|
|
return ret;
|
|
}
|
|
|
|
// Update the information
|
|
FreeAuthData(t.AuthType, t.AuthData);
|
|
|
|
{
|
|
AUTHUSERCERT *c;
|
|
|
|
c = NewUserCertAuthData(x);
|
|
|
|
FreeX(x);
|
|
|
|
// Set to the password authentication
|
|
t.AuthType = AUTHTYPE_USERCERT;
|
|
t.AuthData = c;
|
|
}
|
|
|
|
// Write the user object
|
|
ret = ScSetUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcSetUser(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get certificates that are registered in the user which uses certificate authentication
|
|
UINT PsUserCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_USER t;
|
|
AUTHUSERCERT *a;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
// Get the user object
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
ret = ScGetUser(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
a = (AUTHUSERCERT *)t.AuthData;
|
|
|
|
if (t.AuthType != AUTHTYPE_USERCERT || a == NULL || a->UserX == NULL)
|
|
{
|
|
// The user is not using specific certificate authentication
|
|
ret = ERR_INVALID_PARAMETER;
|
|
|
|
c->Write(c, _UU("CMD_UserCertGet_Not_Cert"));
|
|
}
|
|
else
|
|
{
|
|
if (XToFileW(a->UserX, GetParamUniStr(o, "SAVECERT"), true) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_SAVECERT_FAILED"));
|
|
}
|
|
}
|
|
|
|
FreeRpcSetUser(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Set the authentication method for the user to the signed certificate authentication
|
|
UINT PsUserSignedSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_USER t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"CN", CmdPrompt, _UU("CMD_UserSignedSet_Prompt_CN"), NULL, NULL},
|
|
{"SERIAL", CmdPrompt, _UU("CMD_UserSignedSet_Prompt_SERIAL"), NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
// Get the user object
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
ret = ScGetUser(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
// Update the information
|
|
FreeAuthData(t.AuthType, t.AuthData);
|
|
|
|
{
|
|
AUTHROOTCERT *c;
|
|
BUF *b;
|
|
X_SERIAL *serial = NULL;
|
|
|
|
b = StrToBin(GetParamStr(o, "SERIAL"));
|
|
|
|
if (b != NULL && b->Size >= 1)
|
|
{
|
|
serial = NewXSerial(b->Buf, b->Size);
|
|
}
|
|
|
|
FreeBuf(b);
|
|
|
|
c = NewRootCertAuthData(serial, GetParamUniStr(o, "CN"));
|
|
|
|
FreeXSerial(serial);
|
|
|
|
// Set to the signed certificate authentication
|
|
t.AuthType = AUTHTYPE_ROOTCERT;
|
|
t.AuthData = c;
|
|
}
|
|
|
|
// Write the user object
|
|
ret = ScSetUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcSetUser(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the authentication method for the user to the Radius authentication
|
|
UINT PsUserRadiusSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_USER t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"ALIAS", CmdPrompt, _UU("CMD_UserRadiusSet_Prompt_ALIAS"), NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
// Get the user object
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
ret = ScGetUser(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
// Update the information
|
|
FreeAuthData(t.AuthType, t.AuthData);
|
|
|
|
{
|
|
AUTHRADIUS *a;
|
|
|
|
a = NewRadiusAuthData(GetParamUniStr(o, "ALIAS"));
|
|
|
|
// Set to Radius authentication
|
|
t.AuthType = AUTHTYPE_RADIUS;
|
|
t.AuthData = a;
|
|
}
|
|
|
|
// Write the user object
|
|
ret = ScSetUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcSetUser(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the authentication method for the user to the NT domain authentication
|
|
UINT PsUserNTLMSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_USER t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"ALIAS", CmdPrompt, _UU("CMD_UserRadiusSet_Prompt_ALIAS"), NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
// Get the user object
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
ret = ScGetUser(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
// Update the information
|
|
FreeAuthData(t.AuthType, t.AuthData);
|
|
|
|
{
|
|
AUTHRADIUS *a;
|
|
|
|
a = NewRadiusAuthData(GetParamUniStr(o, "ALIAS"));
|
|
|
|
// Set to the NT domain authentication
|
|
t.AuthType = AUTHTYPE_NT;
|
|
t.AuthData = a;
|
|
}
|
|
|
|
// Write the user object
|
|
ret = ScSetUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcSetUser(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the security policy of the user
|
|
UINT PsUserPolicyRemove(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_USER t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
// Get the user object
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
ret = ScGetUser(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
// Update
|
|
if (t.Policy != NULL)
|
|
{
|
|
Free(t.Policy);
|
|
t.Policy = NULL;
|
|
}
|
|
|
|
// Write the user object
|
|
ret = ScSetUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcSetUser(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set a security policy of the user
|
|
UINT PsUserPolicySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_USER t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"NAME", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLNAME"), CmdEvalNotEmpty, NULL},
|
|
{"VALUE", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLVALUE"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
// Get the user object
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
ret = ScGetUser(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
// Update
|
|
if (t.Policy == NULL)
|
|
{
|
|
t.Policy = ClonePolicy(GetDefaultPolicy());
|
|
}
|
|
|
|
// Edit
|
|
if (EditPolicy(c, t.Policy, GetParamStr(o, "NAME"), GetParamStr(o, "VALUE"), false) == false)
|
|
{
|
|
ret = ERR_INVALID_PARAMETER;
|
|
}
|
|
else
|
|
{
|
|
// Write the user object
|
|
ret = ScSetUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeRpcSetUser(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Convert the string to a date and time
|
|
UINT64 StrToDateTime64(char *str)
|
|
{
|
|
UINT64 ret = 0;
|
|
TOKEN_LIST *t;
|
|
UINT a, b, c, d, e, f;
|
|
// Validate arguments
|
|
if (str == NULL)
|
|
{
|
|
return INFINITE;
|
|
}
|
|
|
|
if (IsEmptyStr(str) || StrCmpi(str, "none") == 0)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
t = ParseToken(str, ":/,. \"");
|
|
if (t->NumTokens != 6)
|
|
{
|
|
FreeToken(t);
|
|
return INFINITE;
|
|
}
|
|
|
|
a = ToInt(t->Token[0]);
|
|
b = ToInt(t->Token[1]);
|
|
c = ToInt(t->Token[2]);
|
|
d = ToInt(t->Token[3]);
|
|
e = ToInt(t->Token[4]);
|
|
f = ToInt(t->Token[5]);
|
|
|
|
ret = INFINITE;
|
|
|
|
if (a >= 1000 && a <= 9999 && b >= 1 && b <= 12 && c >= 1 && c <= 31 &&
|
|
d <= 23 && e <= 59 && f <= 59)
|
|
{
|
|
SYSTEMTIME t;
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.wYear = a;
|
|
t.wMonth = b;
|
|
t.wDay = c;
|
|
t.wHour = d;
|
|
t.wMinute = e;
|
|
t.wSecond = f;
|
|
|
|
ret = SystemToUINT64(&t);
|
|
}
|
|
|
|
FreeToken(t);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Evaluate the date and time string
|
|
bool CmdEvalDateTime(CONSOLE *c, wchar_t *str, void *param)
|
|
{
|
|
UINT64 ret;
|
|
char tmp[MAX_SIZE];
|
|
// Validate arguments
|
|
if (c == NULL || str == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
UniToStr(tmp, sizeof(tmp), str);
|
|
|
|
ret = StrToDateTime64(tmp);
|
|
|
|
if (ret == INFINITE)
|
|
{
|
|
c->Write(c, _UU("CMD_EVAL_DATE_TIME_FAILED"));
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Set the expiration date of the user
|
|
UINT PsUserExpiresSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_USER t;
|
|
UINT64 expires;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"EXPIRES", CmdPrompt, _UU("CMD_UserExpiresSet_Prompt_EXPIRES"), CmdEvalDateTime, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
// Get the user object
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
ret = ScGetUser(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
// Update the information
|
|
expires = StrToDateTime64(GetParamStr(o, "EXPIRES"));
|
|
|
|
if (expires != 0)
|
|
{
|
|
expires = LocalToSystem64(expires);
|
|
}
|
|
|
|
t.ExpireTime = expires;
|
|
|
|
// Write the user object
|
|
ret = ScSetUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcSetUser(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the group list
|
|
UINT PsGroupList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_GROUP t;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScEnumGroup(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNew();
|
|
UINT i;
|
|
|
|
CtInsertColumn(ct, _UU("SM_GROUPLIST_NAME"), false);
|
|
CtInsertColumn(ct, _UU("SM_GROUPLIST_REALNAME"), false);
|
|
CtInsertColumn(ct, _UU("SM_GROUPLIST_NOTE"), false);
|
|
CtInsertColumn(ct, _UU("SM_GROUPLIST_NUMUSERS"), false);
|
|
|
|
for (i = 0;i < t.NumGroup;i++)
|
|
{
|
|
wchar_t tmp1[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
RPC_ENUM_GROUP_ITEM *e = &t.Groups[i];
|
|
|
|
StrToUni(tmp1, sizeof(tmp1), e->Name);
|
|
UniToStru(tmp2, e->NumUsers);
|
|
|
|
CtInsert(ct, tmp1, e->Realname, e->Note, tmp2);
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
}
|
|
|
|
FreeRpcEnumGroup(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Create a group
|
|
UINT PsGroupCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_GROUP t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"REALNAME", CmdPrompt, _UU("CMD_GroupCreate_Prompt_REALNAME"), NULL, NULL},
|
|
{"NOTE", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NOTE"), NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));
|
|
UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));
|
|
|
|
// RPC call
|
|
ret = ScCreateGroup(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcSetGroup(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the group information
|
|
UINT PsGroupSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_GROUP t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"REALNAME", CmdPrompt, _UU("CMD_GroupCreate_Prompt_REALNAME"), NULL, NULL},
|
|
{"NOTE", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NOTE"), NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetGroup(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
// Information update
|
|
UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));
|
|
UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));
|
|
|
|
// RPC call
|
|
ret = ScSetGroup(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcSetGroup(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete a group
|
|
UINT PsGroupDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_DELETE_USER t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScDeleteGroup(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the group information and the list of users who belong to the group
|
|
UINT PsGroupGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_GROUP t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetGroup(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
char groupname[MAX_USERNAME_LEN + 1];
|
|
CT *ct = CtNewStandard();
|
|
|
|
StrCpy(groupname, sizeof(groupname), t.Name);
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.Name);
|
|
CtInsert(ct, _UU("CMD_GroupGet_Column_NAME"), tmp);
|
|
CtInsert(ct, _UU("CMD_GroupGet_Column_REALNAME"), t.Realname);
|
|
CtInsert(ct, _UU("CMD_GroupGet_Column_NOTE"), t.Note);
|
|
|
|
CtFree(ct, c);
|
|
|
|
if (t.Policy != NULL)
|
|
{
|
|
c->Write(c, L"");
|
|
c->Write(c, _UU("CMD_GroupGet_Column_POLICY"));
|
|
|
|
PrintPolicy(c, t.Policy, false);
|
|
}
|
|
|
|
{
|
|
RPC_ENUM_USER t;
|
|
bool b = false;
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
if (ScEnumUser(ps->Rpc, &t) == ERR_NO_ERROR)
|
|
{
|
|
UINT i;
|
|
|
|
for (i = 0;i < t.NumUser;i++)
|
|
{
|
|
RPC_ENUM_USER_ITEM *u = &t.Users[i];
|
|
|
|
if (StrCmpi(u->GroupName, groupname) == 0)
|
|
{
|
|
if (b == false)
|
|
{
|
|
b = true;
|
|
c->Write(c, L"");
|
|
c->Write(c, _UU("CMD_GroupGet_Column_MEMBERS"));
|
|
}
|
|
|
|
UniFormat(tmp, sizeof(tmp), L" %S", u->Name);
|
|
c->Write(c, tmp);
|
|
}
|
|
}
|
|
FreeRpcEnumUser(&t);
|
|
|
|
if (b)
|
|
{
|
|
c->Write(c, L"");
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
FreeRpcSetGroup(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Add an user to the group
|
|
UINT PsGroupJoin(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_USER t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"USERNAME", CmdPrompt, _UU("CMD_GroupJoin_Prompt_USERNAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "USERNAME"));
|
|
|
|
// RPC call
|
|
ret = ScGetUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Update the Group
|
|
StrCpy(t.GroupName, sizeof(t.GroupName), GetParamStr(o, "[name]"));
|
|
|
|
ret = ScSetUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeRpcSetUser(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the user from a group
|
|
UINT PsGroupUnjoin(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_USER t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_GroupUnjoin_Prompt_name"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Update the Group
|
|
StrCpy(t.GroupName, sizeof(t.GroupName), "");
|
|
|
|
ret = ScSetUser(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeRpcSetUser(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the security policy of the group
|
|
UINT PsGroupPolicyRemove(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_GROUP t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetGroup(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Update
|
|
if (t.Policy != NULL)
|
|
{
|
|
Free(t.Policy);
|
|
t.Policy = NULL;
|
|
}
|
|
|
|
ret = ScSetGroup(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeRpcSetGroup(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set a security policy to a group
|
|
UINT PsGroupPolicySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SET_GROUP t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"NAME", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLNAME"), CmdEvalNotEmpty, NULL},
|
|
{"VALUE", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLVALUE"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetGroup(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Update
|
|
if (t.Policy == NULL)
|
|
{
|
|
t.Policy = ClonePolicy(GetDefaultPolicy());
|
|
}
|
|
|
|
if (EditPolicy(c, t.Policy, GetParamStr(o, "NAME"), GetParamStr(o, "VALUE"), false) == false)
|
|
{
|
|
// An error has occured
|
|
FreeRpcSetGroup(&t);
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ERR_INTERNAL_ERROR;
|
|
}
|
|
|
|
ret = ScSetGroup(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeRpcSetGroup(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the connected session list
|
|
UINT PsSessionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_SESSION t;
|
|
UINT server_type = 0;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
{
|
|
// Get the server type
|
|
RPC_SERVER_INFO t;
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
if (ScGetServerInfo(ps->Rpc, &t) == ERR_NO_ERROR)
|
|
{
|
|
server_type = t.ServerType;
|
|
|
|
FreeRpcServerInfo(&t);
|
|
}
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScEnumSession(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNew();
|
|
UINT i;
|
|
|
|
CtInsertColumn(ct, _UU("SM_SESS_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("SM_SESS_COLUMN_8"), false);
|
|
CtInsertColumn(ct, _UU("SM_SESS_COLUMN_2"), false);
|
|
CtInsertColumn(ct, _UU("SM_SESS_COLUMN_3"), false);
|
|
CtInsertColumn(ct, _UU("SM_SESS_COLUMN_4"), false);
|
|
CtInsertColumn(ct, _UU("SM_SESS_COLUMN_5"), true);
|
|
CtInsertColumn(ct, _UU("SM_SESS_COLUMN_6"), true);
|
|
CtInsertColumn(ct, _UU("SM_SESS_COLUMN_7"), true);
|
|
|
|
for (i = 0;i < t.NumSession;i++)
|
|
{
|
|
RPC_ENUM_SESSION_ITEM *e = &t.Sessions[i];
|
|
wchar_t tmp1[MAX_SIZE];
|
|
wchar_t *tmp2;
|
|
wchar_t tmp3[MAX_SIZE];
|
|
wchar_t tmp4[MAX_SIZE];
|
|
wchar_t tmp5[MAX_SIZE];
|
|
wchar_t tmp6[MAX_SIZE];
|
|
wchar_t tmp7[MAX_SIZE];
|
|
wchar_t tmp8[MAX_SIZE];
|
|
bool free_tmp2 = false;
|
|
|
|
StrToUni(tmp1, sizeof(tmp1), e->Name);
|
|
|
|
tmp2 = _UU("SM_SESS_NORMAL");
|
|
if (server_type != SERVER_TYPE_STANDALONE)
|
|
{
|
|
if (e->RemoteSession)
|
|
{
|
|
tmp2 = ZeroMalloc(MAX_SIZE);
|
|
UniFormat(tmp2, MAX_SIZE, _UU("SM_SESS_REMOTE"), e->RemoteHostname);
|
|
free_tmp2 = true;
|
|
}
|
|
else
|
|
{
|
|
if (StrLen(e->RemoteHostname) == 0)
|
|
{
|
|
tmp2 = _UU("SM_SESS_LOCAL");
|
|
}
|
|
else
|
|
{
|
|
tmp2 = ZeroMalloc(MAX_SIZE);
|
|
UniFormat(tmp2, MAX_SIZE, _UU("SM_SESS_LOCAL_2"), e->RemoteHostname);
|
|
free_tmp2 = true;
|
|
}
|
|
}
|
|
}
|
|
if (e->LinkMode)
|
|
{
|
|
if (free_tmp2)
|
|
{
|
|
Free(tmp2);
|
|
free_tmp2 = false;
|
|
}
|
|
tmp2 = _UU("SM_SESS_LINK");
|
|
}
|
|
else if (e->SecureNATMode)
|
|
{
|
|
/*if (free_tmp2)
|
|
{
|
|
Free(tmp2);
|
|
free_tmp2 = false;
|
|
}*/
|
|
tmp2 = _UU("SM_SESS_SNAT");
|
|
}
|
|
|
|
StrToUni(tmp3, sizeof(tmp3), e->Username);
|
|
|
|
StrToUni(tmp4, sizeof(tmp4), e->Hostname);
|
|
if (e->LinkMode)
|
|
{
|
|
UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_LINK_HOSTNAME"));
|
|
}
|
|
else if (e->SecureNATMode)
|
|
{
|
|
UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_SNAT_HOSTNAME"));
|
|
}
|
|
else if (e->BridgeMode)
|
|
{
|
|
UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_BRIDGE_HOSTNAME"));
|
|
}
|
|
else if (StartWith(e->Username, L3_USERNAME))
|
|
{
|
|
UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_LAYER3_HOSTNAME"));
|
|
}
|
|
|
|
UniFormat(tmp5, sizeof(tmp5), L"%u / %u", e->CurrentNumTcp, e->MaxNumTcp);
|
|
if (e->LinkMode)
|
|
{
|
|
UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_LINK_TCP"));
|
|
}
|
|
else if (e->SecureNATMode)
|
|
{
|
|
UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_SNAT_TCP"));
|
|
}
|
|
else if (e->BridgeMode)
|
|
{
|
|
UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_BRIDGE_TCP"));
|
|
}
|
|
|
|
UniToStr3(tmp6, sizeof(tmp6), e->PacketSize);
|
|
UniToStr3(tmp7, sizeof(tmp7), e->PacketNum);
|
|
|
|
if (e->VLanId == 0)
|
|
{
|
|
UniStrCpy(tmp8, sizeof(tmp8), _UU("CM_ST_NO_VLAN"));
|
|
}
|
|
else
|
|
{
|
|
UniToStru(tmp8, e->VLanId);
|
|
}
|
|
|
|
CtInsert(ct, tmp1, tmp8, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);
|
|
|
|
if (free_tmp2)
|
|
{
|
|
Free(tmp2);
|
|
}
|
|
}
|
|
|
|
|
|
CtFreeEx(ct, c, true);
|
|
}
|
|
|
|
FreeRpcEnumSession(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Display the NODE_INFO
|
|
void CmdPrintNodeInfo(CT *ct, NODE_INFO *info)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
char str[MAX_SIZE];
|
|
// Validate arguments
|
|
if (ct == NULL || info == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
StrToUni(tmp, sizeof(tmp), info->ClientProductName);
|
|
CtInsert(ct, _UU("SM_NODE_CLIENT_NAME"), tmp);
|
|
|
|
UniFormat(tmp, sizeof(tmp), L"%u.%02u", Endian32(info->ClientProductVer) / 100, Endian32(info->ClientProductVer) % 100);
|
|
CtInsert(ct, _UU("SM_NODE_CLIENT_VER"), tmp);
|
|
|
|
UniFormat(tmp, sizeof(tmp), L"Build %u", Endian32(info->ClientProductBuild));
|
|
CtInsert(ct, _UU("SM_NODE_CLIENT_BUILD"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), info->ClientOsName);
|
|
CtInsert(ct, _UU("SM_NODE_CLIENT_OS_NAME"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), info->ClientOsVer);
|
|
CtInsert(ct, _UU("SM_NODE_CLIENT_OS_VER"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), info->ClientOsProductId);
|
|
CtInsert(ct, _UU("SM_NODE_CLIENT_OS_PID"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), info->ClientHostname);
|
|
CtInsert(ct, _UU("SM_NODE_CLIENT_HOST"), tmp);
|
|
|
|
IPToStr4or6(str, sizeof(str), info->ClientIpAddress, info->ClientIpAddress6);
|
|
StrToUni(tmp, sizeof(tmp), str);
|
|
CtInsert(ct, _UU("SM_NODE_CLIENT_IP"), tmp);
|
|
|
|
UniToStru(tmp, Endian32(info->ClientPort));
|
|
CtInsert(ct, _UU("SM_NODE_CLIENT_PORT"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), info->ServerHostname);
|
|
CtInsert(ct, _UU("SM_NODE_SERVER_HOST"), tmp);
|
|
|
|
IPToStr4or6(str, sizeof(str), info->ServerIpAddress, info->ServerIpAddress6);
|
|
StrToUni(tmp, sizeof(tmp), str);
|
|
CtInsert(ct, _UU("SM_NODE_SERVER_IP"), tmp);
|
|
|
|
UniToStru(tmp, Endian32(info->ServerPort));
|
|
CtInsert(ct, _UU("SM_NODE_SERVER_PORT"), tmp);
|
|
|
|
if (StrLen(info->ProxyHostname) != 0)
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), info->ProxyHostname);
|
|
CtInsert(ct, _UU("SM_NODE_PROXY_HOSTNAME"), tmp);
|
|
|
|
IPToStr4or6(str, sizeof(str), info->ProxyIpAddress, info->ProxyIpAddress6);
|
|
StrToUni(tmp, sizeof(tmp), str);
|
|
CtInsert(ct, _UU("SM_NODE_PROXY_IP"), tmp);
|
|
|
|
UniToStru(tmp, Endian32(info->ProxyPort));
|
|
CtInsert(ct, _UU("SM_NODE_PROXY_PORT"), tmp);
|
|
}
|
|
}
|
|
|
|
// Get the session information
|
|
UINT PsSessionGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SESSION_STATUS t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_SessionGet_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScGetSessionStatus(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
char str[MAX_SIZE];
|
|
CT *ct = CtNewStandard();
|
|
|
|
if (t.ClientIp != 0 || IsZero(t.ClientIp6, sizeof(t.ClientIp6)) == false)
|
|
{
|
|
IPToStr4or6(str, sizeof(str), t.ClientIp, t.ClientIp6);
|
|
StrToUni(tmp, sizeof(tmp), str);
|
|
CtInsert(ct, _UU("SM_CLIENT_IP"), tmp);
|
|
}
|
|
|
|
if (StrLen(t.ClientHostName) != 0)
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), t.ClientHostName);
|
|
CtInsert(ct, _UU("SM_CLIENT_HOSTNAME"), tmp);
|
|
}
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.Username);
|
|
CtInsert(ct, _UU("SM_SESS_STATUS_USERNAME"), tmp);
|
|
|
|
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)
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), t.RealUsername);
|
|
CtInsert(ct, _UU("SM_SESS_STATUS_REALUSER"), tmp);
|
|
}
|
|
|
|
if (IsEmptyStr(t.GroupName) == false)
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), t.GroupName);
|
|
CtInsert(ct, _UU("SM_SESS_STATUS_GROUPNAME"), tmp);
|
|
}
|
|
|
|
|
|
CmdPrintStatusToListViewEx(ct, &t.Status, true);
|
|
|
|
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 &&
|
|
StartWith(t.Username, L3_USERNAME) == false)
|
|
{
|
|
CmdPrintNodeInfo(ct, &t.NodeInfo);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeRpcSessionStatus(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Disconnect the session
|
|
UINT PsSessionDisconnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_DELETE_SESSION t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_SessionGet_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));
|
|
|
|
// RPC call
|
|
ret = ScDeleteSession(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the MAC address table database
|
|
UINT PsMacTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_MAC_TABLE t;
|
|
UINT i;
|
|
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[session_name]", NULL, NULL, NULL, NULL,}
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScEnumMacTable(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNew();
|
|
char *session_name = GetParamStr(o, "[session_name]");
|
|
|
|
if (IsEmptyStr(session_name))
|
|
{
|
|
session_name = NULL;
|
|
}
|
|
|
|
CtInsertColumn(ct, _UU("CMD_ID"), false);
|
|
CtInsertColumn(ct, _UU("SM_MAC_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("SM_MAC_COLUMN_1A"), false);
|
|
CtInsertColumn(ct, _UU("SM_MAC_COLUMN_2"), false);
|
|
CtInsertColumn(ct, _UU("SM_MAC_COLUMN_3"), false);
|
|
CtInsertColumn(ct, _UU("SM_MAC_COLUMN_4"), false);
|
|
CtInsertColumn(ct, _UU("SM_MAC_COLUMN_5"), false);
|
|
|
|
for (i = 0;i < t.NumMacTable;i++)
|
|
{
|
|
char str[MAX_SIZE];
|
|
wchar_t tmp0[128];
|
|
wchar_t tmp1[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
wchar_t tmp3[MAX_SIZE];
|
|
wchar_t tmp4[MAX_SIZE];
|
|
wchar_t tmp5[MAX_SIZE];
|
|
wchar_t tmp6[MAX_SIZE];
|
|
|
|
RPC_ENUM_MAC_TABLE_ITEM *e = &t.MacTables[i];
|
|
|
|
if (session_name == NULL || StrCmpi(e->SessionName, session_name) == 0)
|
|
{
|
|
UniToStru(tmp0, e->Key);
|
|
|
|
StrToUni(tmp1, sizeof(tmp1), e->SessionName);
|
|
|
|
MacToStr(str, sizeof(str), e->MacAddress);
|
|
StrToUni(tmp2, sizeof(tmp2), str);
|
|
|
|
GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->CreatedTime));
|
|
|
|
GetDateTimeStr64Uni(tmp4, sizeof(tmp4), SystemToLocal64(e->UpdatedTime));
|
|
|
|
if (StrLen(e->RemoteHostname) == 0)
|
|
{
|
|
UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_MACIP_LOCAL"));
|
|
}
|
|
else
|
|
{
|
|
UniFormat(tmp5, sizeof(tmp5), _UU("SM_MACIP_SERVER"), e->RemoteHostname);
|
|
}
|
|
|
|
UniToStru(tmp6, e->VlanId);
|
|
if (e->VlanId == 0)
|
|
{
|
|
UniStrCpy(tmp6, sizeof(tmp6), _UU("CM_ST_NONE"));
|
|
}
|
|
|
|
CtInsert(ct,
|
|
tmp0, tmp1, tmp6, tmp2, tmp3, tmp4, tmp5);
|
|
}
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
}
|
|
|
|
FreeRpcEnumMacTable(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete a MAC address table entry
|
|
UINT PsMacDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_DELETE_TABLE t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[id]", CmdPrompt, _UU("CMD_MacDelete_Prompt"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.Key = GetParamInt(o, "[id]");
|
|
|
|
// RPC call
|
|
ret = ScDeleteMacTable(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the IP address table database
|
|
UINT PsIpTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_IP_TABLE t;
|
|
UINT i;
|
|
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[session_name]", NULL, NULL, NULL, NULL,}
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScEnumIpTable(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNew();
|
|
char *session_name = GetParamStr(o, "[session_name]");
|
|
|
|
if (IsEmptyStr(session_name))
|
|
{
|
|
session_name = NULL;
|
|
}
|
|
|
|
CtInsertColumn(ct, _UU("CMD_ID"), false);
|
|
CtInsertColumn(ct, _UU("SM_IP_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("SM_IP_COLUMN_2"), false);
|
|
CtInsertColumn(ct, _UU("SM_IP_COLUMN_3"), false);
|
|
CtInsertColumn(ct, _UU("SM_IP_COLUMN_4"), false);
|
|
CtInsertColumn(ct, _UU("SM_IP_COLUMN_5"), false);
|
|
|
|
for (i = 0;i < t.NumIpTable;i++)
|
|
{
|
|
char str[MAX_SIZE];
|
|
wchar_t tmp0[128];
|
|
wchar_t tmp1[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
wchar_t tmp3[MAX_SIZE];
|
|
wchar_t tmp4[MAX_SIZE];
|
|
wchar_t tmp5[MAX_SIZE];
|
|
RPC_ENUM_IP_TABLE_ITEM *e = &t.IpTables[i];
|
|
|
|
if (session_name == NULL || StrCmpi(e->SessionName, session_name) == 0)
|
|
{
|
|
UniToStru(tmp0, e->Key);
|
|
|
|
StrToUni(tmp1, sizeof(tmp1), e->SessionName);
|
|
|
|
if (e->DhcpAllocated == false)
|
|
{
|
|
IPToStr(str, sizeof(str), &e->IpV6);
|
|
StrToUni(tmp2, sizeof(tmp2), str);
|
|
}
|
|
else
|
|
{
|
|
IPToStr(str, sizeof(str), &e->IpV6);
|
|
UniFormat(tmp2, sizeof(tmp2), _UU("SM_MAC_IP_DHCP"), str);
|
|
}
|
|
|
|
GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->CreatedTime));
|
|
|
|
GetDateTimeStr64Uni(tmp4, sizeof(tmp4), SystemToLocal64(e->UpdatedTime));
|
|
|
|
if (StrLen(e->RemoteHostname) == 0)
|
|
{
|
|
UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_MACIP_LOCAL"));
|
|
}
|
|
else
|
|
{
|
|
UniFormat(tmp5, sizeof(tmp5), _UU("SM_MACIP_SERVER"), e->RemoteHostname);
|
|
}
|
|
|
|
CtInsert(ct,
|
|
tmp0, tmp1, tmp2, tmp3, tmp4, tmp5);
|
|
}
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
}
|
|
|
|
FreeRpcEnumIpTable(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the IP address table entry
|
|
UINT PsIpDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_DELETE_TABLE t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[id]", CmdPrompt, _UU("CMD_MacDelete_Prompt"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.Key = GetParamInt(o, "[id]");
|
|
|
|
// RPC call
|
|
ret = ScDeleteIpTable(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Enable the DHCP server function and the virtual NAT (SecureNAT function)
|
|
UINT PsSecureNatEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_HUB t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScEnableSecureNAT(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Disable the DHCP server function and the virtual NAT (SecureNAT function)
|
|
UINT PsSecureNatDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_HUB t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScDisableSecureNAT(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the operating status of the DHCP server function and the virtual NAT (SecureNAT function)
|
|
UINT PsSecureNatStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_NAT_STATUS t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetSecureNATStatus(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
CT *ct = CtNewStandard();
|
|
|
|
StrToUni(tmp, sizeof(tmp), ps->HubName);
|
|
CtInsert(ct, _UU("SM_HUB_COLUMN_1"), tmp);
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumTcpSessions);
|
|
CtInsert(ct, _UU("NM_STATUS_TCP"), tmp);
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumUdpSessions);
|
|
CtInsert(ct, _UU("NM_STATUS_UDP"), tmp);
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumIcmpSessions);
|
|
CtInsert(ct, _UU("NM_STATUS_ICMP"), tmp);
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumDnsSessions);
|
|
CtInsert(ct, _UU("NM_STATUS_DNS"), tmp);
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_CLIENT"), t.NumDhcpClients);
|
|
CtInsert(ct, _UU("NM_STATUS_DHCP"), tmp);
|
|
|
|
CtInsert(ct, _UU("SM_SNAT_IS_KERNEL"), t.IsKernelMode ? _UU("SEC_YES") : _UU("SEC_NO"));
|
|
CtInsert(ct, _UU("SM_SNAT_IS_RAW"), t.IsRawIpMode ? _UU("SEC_YES") : _UU("SEC_NO"));
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeRpcNatStatus(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the network interface settings for a virtual host of SecureNAT function
|
|
UINT PsSecureNatHostGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
VH_OPTION t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
char str[MAX_SIZE];
|
|
CT *ct = CtNewStandard();
|
|
|
|
// Flags
|
|
// MAC Address
|
|
MacToStr(str, sizeof(str), t.MacAddress);
|
|
StrToUni(tmp, sizeof(tmp), str);
|
|
CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_MAC"), tmp);
|
|
|
|
// IP address
|
|
IPToUniStr(tmp, sizeof(tmp), &t.Ip);
|
|
CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_IP"), tmp);
|
|
|
|
// Subnet mask
|
|
IPToUniStr(tmp, sizeof(tmp), &t.Mask);
|
|
CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_MASK"), tmp);
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Change the network interface settings for a virtual host of SecureNAT function
|
|
UINT PsSecureNatHostSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
VH_OPTION t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"MAC", CmdPrompt, _UU("CMD_SecureNatHostSet_Prompt_MAC"), NULL, NULL},
|
|
{"IP", CmdPrompt, _UU("CMD_SecureNatHostSet_Prompt_IP"), CmdEvalIp, NULL},
|
|
{"MASK", CmdPrompt, _UU("CMD_SecureNatHostSet_Prompt_MASK"), CmdEvalIp, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
char *mac, *ip, *mask;
|
|
bool ok = true;
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
mac = GetParamStr(o, "MAC");
|
|
ip = GetParamStr(o, "IP");
|
|
mask = GetParamStr(o, "MASK");
|
|
|
|
if (IsEmptyStr(mac) == false)
|
|
{
|
|
BUF *b = StrToBin(mac);
|
|
|
|
if (b == NULL || b->Size != 6)
|
|
{
|
|
ok = false;
|
|
}
|
|
else
|
|
{
|
|
Copy(t.MacAddress, b->Buf, 6);
|
|
}
|
|
|
|
FreeBuf(b);
|
|
}
|
|
|
|
if (IsEmptyStr(ip) == false)
|
|
{
|
|
if (IsIpStr4(ip) == false)
|
|
{
|
|
ok = false;
|
|
}
|
|
else
|
|
{
|
|
UINT u = StrToIP32(ip);
|
|
|
|
if (u == 0 || u == 0xffffffff)
|
|
{
|
|
ok = false;
|
|
}
|
|
else
|
|
{
|
|
UINTToIP(&t.Ip, u);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (IsEmptyStr(mask) == false)
|
|
{
|
|
if (IsIpStr4(mask) == false)
|
|
{
|
|
ok = false;
|
|
}
|
|
else
|
|
{
|
|
StrToIP(&t.Mask, mask);
|
|
}
|
|
}
|
|
|
|
if (ok == false)
|
|
{
|
|
// Parameter is invalid
|
|
ret = ERR_INVALID_PARAMETER;
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
ret = ScSetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the settings for the virtual NAT function of the SecureNAT function
|
|
UINT PsNatGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
VH_OPTION t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
CT *ct = CtNewStandard();
|
|
|
|
// Use the virtual NAT function
|
|
CtInsert(ct, _UU("CMD_NatGet_Column_USE"), t.UseNat ? _UU("SEC_YES") : _UU("SEC_NO"));
|
|
|
|
// MTU value
|
|
UniToStru(tmp, t.Mtu);
|
|
CtInsert(ct, _UU("CMD_NetGet_Column_MTU"), tmp);
|
|
|
|
// TCP session timeout (in seconds)
|
|
UniToStru(tmp, t.NatTcpTimeout);
|
|
CtInsert(ct, _UU("CMD_NatGet_Column_TCP"), tmp);
|
|
|
|
// UDP session timeout (in seconds)
|
|
UniToStru(tmp, t.NatUdpTimeout);
|
|
CtInsert(ct, _UU("CMD_NatGet_Column_UDP"), tmp);
|
|
|
|
// To save the log
|
|
CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_LOG"), t.SaveLog ? _UU("SEC_YES") : _UU("SEC_NO"));
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Enable the virtual NAT function of the SecureNAT function
|
|
UINT PsNatEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
VH_OPTION t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
t.UseNat = true;
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
ret = ScSetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Disable the virtual NAT function of the SecureNAT function
|
|
UINT PsNatDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
VH_OPTION t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
t.UseNat = false;
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
ret = ScSetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Change the settings for the virtual NAT function of the SecureNAT function
|
|
UINT PsNatSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
VH_OPTION t;
|
|
// Parameter list that can be specified
|
|
CMD_EVAL_MIN_MAX mtu_mm =
|
|
{
|
|
"CMD_NatSet_Eval_MTU", TCP_HEADER_SIZE + IP_HEADER_SIZE + MAC_HEADER_SIZE + 8, MAX_L3_DATA_SIZE,
|
|
};
|
|
CMD_EVAL_MIN_MAX tcp_mm =
|
|
{
|
|
"CMD_NatSet_Eval_TCP", NAT_TCP_MIN_TIMEOUT / 1000, NAT_TCP_MAX_TIMEOUT / 1000,
|
|
};
|
|
CMD_EVAL_MIN_MAX udp_mm =
|
|
{
|
|
"CMD_NatSet_Eval_UDP", NAT_UDP_MIN_TIMEOUT / 1000, NAT_UDP_MAX_TIMEOUT / 1000,
|
|
};
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"MTU", CmdPrompt, _UU("CMD_NatSet_Prompt_MTU"), CmdEvalMinMax, &mtu_mm},
|
|
{"TCPTIMEOUT", CmdPrompt, _UU("CMD_NatSet_Prompt_TCPTIMEOUT"), CmdEvalMinMax, &tcp_mm},
|
|
{"UDPTIMEOUT", CmdPrompt, _UU("CMD_NatSet_Prompt_UDPTIMEOUT"), CmdEvalMinMax, &udp_mm},
|
|
{"LOG", CmdPrompt, _UU("CMD_NatSet_Prompt_LOG"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
t.Mtu = GetParamInt(o, "MTU");
|
|
t.NatTcpTimeout = GetParamInt(o, "TCPTIMEOUT");
|
|
t.NatUdpTimeout = GetParamInt(o, "UDPTIMEOUT");
|
|
t.SaveLog = GetParamYes(o, "LOG");
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
ret = ScSetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the session table of the virtual NAT function of the SecureNAT function
|
|
UINT PsNatTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_NAT t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScEnumNAT(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNew();
|
|
UINT i;
|
|
|
|
CtInsertColumn(ct, _UU("NM_NAT_ID"), false);
|
|
CtInsertColumn(ct, _UU("NM_NAT_PROTOCOL"), false);
|
|
CtInsertColumn(ct, _UU("NM_NAT_SRC_HOST"), false);
|
|
CtInsertColumn(ct, _UU("NM_NAT_SRC_PORT"), false);
|
|
CtInsertColumn(ct, _UU("NM_NAT_DST_HOST"), false);
|
|
CtInsertColumn(ct, _UU("NM_NAT_DST_PORT"), false);
|
|
CtInsertColumn(ct, _UU("NM_NAT_CREATED"), false);
|
|
CtInsertColumn(ct, _UU("NM_NAT_LAST_COMM"), false);
|
|
CtInsertColumn(ct, _UU("NM_NAT_SIZE"), false);
|
|
CtInsertColumn(ct, _UU("NM_NAT_TCP_STATUS"), false);
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
RPC_ENUM_NAT_ITEM *e = &t.Items[i];
|
|
wchar_t tmp0[MAX_SIZE];
|
|
wchar_t *tmp1 = L"";
|
|
wchar_t tmp2[MAX_SIZE];
|
|
wchar_t tmp3[MAX_SIZE];
|
|
wchar_t tmp4[MAX_SIZE];
|
|
wchar_t tmp5[MAX_SIZE];
|
|
wchar_t tmp6[MAX_SIZE];
|
|
wchar_t tmp7[MAX_SIZE];
|
|
wchar_t tmp8[MAX_SIZE];
|
|
wchar_t *tmp9 = L"";
|
|
char v1[128], v2[128];
|
|
|
|
// ID
|
|
UniToStru(tmp0, e->Id);
|
|
|
|
// Protocol
|
|
switch (e->Protocol)
|
|
{
|
|
case NAT_TCP:
|
|
tmp1 = _UU("NM_NAT_PROTO_TCP");
|
|
break;
|
|
case NAT_UDP:
|
|
tmp1 = _UU("NM_NAT_PROTO_UDP");
|
|
break;
|
|
case NAT_DNS:
|
|
tmp1 = _UU("NM_NAT_PROTO_DNS");
|
|
break;
|
|
case NAT_ICMP:
|
|
tmp1 = _UU("NM_NAT_PROTO_ICMP");
|
|
break;
|
|
}
|
|
|
|
// Source host
|
|
StrToUni(tmp2, sizeof(tmp2), e->SrcHost);
|
|
|
|
// Source port
|
|
UniToStru(tmp3, e->SrcPort);
|
|
|
|
// Destination host
|
|
StrToUni(tmp4, sizeof(tmp4), e->DestHost);
|
|
|
|
// Destination port
|
|
UniToStru(tmp5, e->DestPort);
|
|
|
|
// Creation date and time of the session
|
|
GetDateTimeStrEx64(tmp6, sizeof(tmp6), SystemToLocal64(e->CreatedTime), NULL);
|
|
|
|
// Last communication date and time
|
|
GetDateTimeStrEx64(tmp7, sizeof(tmp7), SystemToLocal64(e->LastCommTime), NULL);
|
|
|
|
// Communication amount
|
|
ToStr3(v1, sizeof(v1), e->RecvSize);
|
|
ToStr3(v2, sizeof(v2), e->SendSize);
|
|
UniFormat(tmp8, sizeof(tmp8), L"%S / %S", v1, v2);
|
|
|
|
// TCP state
|
|
if (e->Protocol == NAT_TCP)
|
|
{
|
|
switch (e->TcpStatus)
|
|
{
|
|
case NAT_TCP_CONNECTING:
|
|
tmp9 = _UU("NAT_TCP_CONNECTING");
|
|
break;
|
|
case NAT_TCP_SEND_RESET:
|
|
tmp9 = _UU("NAT_TCP_SEND_RESET");
|
|
break;
|
|
case NAT_TCP_CONNECTED:
|
|
tmp9 = _UU("NAT_TCP_CONNECTED");
|
|
break;
|
|
case NAT_TCP_ESTABLISHED:
|
|
tmp9 = _UU("NAT_TCP_ESTABLISHED");
|
|
break;
|
|
case NAT_TCP_WAIT_DISCONNECT:
|
|
tmp9 = _UU("NAT_TCP_WAIT_DISCONNECT");
|
|
break;
|
|
}
|
|
}
|
|
|
|
CtInsert(ct,
|
|
tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9);
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
}
|
|
|
|
FreeRpcEnumNat(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the settings for a virtual DHCP server function of the SecureNAT function
|
|
UINT PsDhcpGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
VH_OPTION t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
CT *ct = CtNewStandard();
|
|
|
|
// To use the virtual DHCP function
|
|
CtInsert(ct, _UU("CMD_DhcpGet_Column_USE"), t.UseDhcp ? _UU("SEC_YES") : _UU("SEC_NO"));
|
|
|
|
// Start address of the distributing address zone
|
|
IPToUniStr(tmp, sizeof(tmp), &t.DhcpLeaseIPStart);
|
|
CtInsert(ct, _UU("CMD_DhcpGet_Column_IP1"), tmp);
|
|
|
|
// End address of the distributing address zone
|
|
IPToUniStr(tmp, sizeof(tmp), &t.DhcpLeaseIPEnd);
|
|
CtInsert(ct, _UU("CMD_DhcpGet_Column_IP2"), tmp);
|
|
|
|
// Subnet mask
|
|
IPToUniStr(tmp, sizeof(tmp), &t.DhcpSubnetMask);
|
|
CtInsert(ct, _UU("CMD_DhcpGet_Column_MASK"), tmp);
|
|
|
|
// Lease time (in seconds)
|
|
UniToStru(tmp, t.DhcpExpireTimeSpan);
|
|
CtInsert(ct, _UU("CMD_DhcpGet_Column_LEASE"), tmp);
|
|
|
|
// Default gateway address
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("SEC_NONE"));
|
|
if (IPToUINT(&t.DhcpGatewayAddress) != 0)
|
|
{
|
|
IPToUniStr(tmp, sizeof(tmp), &t.DhcpGatewayAddress);
|
|
}
|
|
CtInsert(ct, _UU("CMD_DhcpGet_Column_GW"), tmp);
|
|
|
|
// DNS server address 1
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("SEC_NONE"));
|
|
if (IPToUINT(&t.DhcpDnsServerAddress) != 0)
|
|
{
|
|
IPToUniStr(tmp, sizeof(tmp), &t.DhcpDnsServerAddress);
|
|
}
|
|
CtInsert(ct, _UU("CMD_DhcpGet_Column_DNS"), tmp);
|
|
|
|
// DNS server address 2
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("SEC_NONE"));
|
|
if (IPToUINT(&t.DhcpDnsServerAddress2) != 0)
|
|
{
|
|
IPToUniStr(tmp, sizeof(tmp), &t.DhcpDnsServerAddress2);
|
|
}
|
|
CtInsert(ct, _UU("CMD_DhcpGet_Column_DNS2"), tmp);
|
|
|
|
// Domain name
|
|
StrToUni(tmp, sizeof(tmp), t.DhcpDomainName);
|
|
CtInsert(ct, _UU("CMD_DhcpGet_Column_DOMAIN"), tmp);
|
|
|
|
// To save the log
|
|
CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_LOG"), t.SaveLog ? _UU("SEC_YES") : _UU("SEC_NO"));
|
|
|
|
// Push routing table
|
|
if (t.ApplyDhcpPushRoutes)
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), t.DhcpPushRoutes);
|
|
CtInsert(ct, _UU("CMD_DhcpGet_Column_PUSHROUTE"), tmp);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Enable the Virtual DHCP server function of SecureNAT function
|
|
UINT PsDhcpEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
VH_OPTION t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
t.UseDhcp = true;
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
ret = ScSetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Disable the virtual DHCP server function of SecureNAT function
|
|
UINT PsDhcpDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
VH_OPTION t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
t.UseDhcp = false;
|
|
|
|
ret = ScSetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Change the settings for a virtual DHCP server function of the SecureNAT function
|
|
UINT PsDhcpSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
VH_OPTION t;
|
|
// Parameter list that can be specified
|
|
CMD_EVAL_MIN_MAX mm =
|
|
{
|
|
"CMD_NatSet_Eval_UDP", NAT_UDP_MIN_TIMEOUT / 1000, NAT_UDP_MAX_TIMEOUT / 1000,
|
|
};
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"START", CmdPrompt, _UU("CMD_DhcpSet_Prompt_START"), CmdEvalIp, NULL},
|
|
{"END", CmdPrompt, _UU("CMD_DhcpSet_Prompt_END"), CmdEvalIp, NULL},
|
|
{"MASK", CmdPrompt, _UU("CMD_DhcpSet_Prompt_MASK"), CmdEvalIp, NULL},
|
|
{"EXPIRE", CmdPrompt, _UU("CMD_DhcpSet_Prompt_EXPIRE"), CmdEvalMinMax, &mm},
|
|
{"GW", CmdPrompt, _UU("CMD_DhcpSet_Prompt_GW"), CmdEvalIp, NULL},
|
|
{"DNS", CmdPrompt, _UU("CMD_DhcpSet_Prompt_DNS"), CmdEvalIp, NULL},
|
|
{"DNS2", CmdPrompt, _UU("CMD_DhcpSet_Prompt_DNS2"), CmdEvalIp, NULL},
|
|
{"DOMAIN", CmdPrompt, _UU("CMD_DhcpSet_Prompt_DOMAIN"), NULL, NULL},
|
|
{"LOG", CmdPrompt, _UU("CMD_NatSet_Prompt_LOG"), CmdEvalNotEmpty, NULL},
|
|
{"PUSHROUTE", NULL, _UU("CMD_DhcpSet_PUSHROUTE"), NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
|
|
StrToIP(&t.DhcpLeaseIPStart, GetParamStr(o, "START"));
|
|
StrToIP(&t.DhcpLeaseIPEnd, GetParamStr(o, "END"));
|
|
StrToIP(&t.DhcpSubnetMask, GetParamStr(o, "MASK"));
|
|
t.DhcpExpireTimeSpan = GetParamInt(o, "EXPIRE");
|
|
StrToIP(&t.DhcpGatewayAddress, GetParamStr(o, "GW"));
|
|
StrToIP(&t.DhcpDnsServerAddress, GetParamStr(o, "DNS"));
|
|
StrToIP(&t.DhcpDnsServerAddress2, GetParamStr(o, "DNS2"));
|
|
StrCpy(t.DhcpDomainName, sizeof(t.DhcpDomainName), GetParamStr(o, "DOMAIN"));
|
|
t.SaveLog = GetParamYes(o, "LOG");
|
|
|
|
StrCpy(t.DhcpPushRoutes, sizeof(t.DhcpPushRoutes), GetParamStr(o, "PUSHROUTE"));
|
|
t.ApplyDhcpPushRoutes = true;
|
|
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
ret = ScSetSecureNATOption(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
if (IsEmptyStr(GetParamStr(o, "PUSHROUTE")) == false)
|
|
{
|
|
if (GetCapsBool(ps->CapsList, "b_suppport_push_route") == false &&
|
|
GetCapsBool(ps->CapsList, "b_suppport_push_route_config"))
|
|
{
|
|
CmdPrintError(c, ERR_NOT_SUPPORTED_FUNCTION_ON_OPENSOURCE);
|
|
}
|
|
}
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the lease table of virtual DHCP server function of the SecureNAT function
|
|
UINT PsDhcpTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_DHCP t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScEnumDHCP(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNew();
|
|
UINT i;
|
|
|
|
CtInsertColumn(ct, _UU("DHCP_DHCP_ID"), false);
|
|
CtInsertColumn(ct, _UU("DHCP_LEASED_TIME"), false);
|
|
CtInsertColumn(ct, _UU("DHCP_EXPIRE_TIME"), false);
|
|
CtInsertColumn(ct, _UU("DHCP_MAC_ADDRESS"), false);
|
|
CtInsertColumn(ct, _UU("DHCP_IP_ADDRESS"), false);
|
|
CtInsertColumn(ct, _UU("DHCP_HOSTNAME"), false);
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
RPC_ENUM_DHCP_ITEM *e = &t.Items[i];
|
|
wchar_t tmp0[MAX_SIZE];
|
|
wchar_t tmp1[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
wchar_t tmp3[MAX_SIZE];
|
|
wchar_t tmp4[MAX_SIZE];
|
|
wchar_t tmp5[MAX_SIZE];
|
|
char str[MAX_SIZE];
|
|
|
|
// ID
|
|
UniToStru(tmp0, e->Id);
|
|
|
|
// Time
|
|
GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->LeasedTime), NULL);
|
|
GetDateTimeStrEx64(tmp2, sizeof(tmp2), SystemToLocal64(e->ExpireTime), NULL);
|
|
|
|
MacToStr(str, sizeof(str), e->MacAddress);
|
|
StrToUni(tmp3, sizeof(tmp3), str);
|
|
|
|
IPToStr32(str, sizeof(str), e->IpAddress);
|
|
StrToUni(tmp4, sizeof(tmp4), str);
|
|
|
|
StrToUni(tmp5, sizeof(tmp5), e->Hostname);
|
|
|
|
CtInsert(ct,
|
|
tmp0, tmp1, tmp2, tmp3, tmp4, tmp5);
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
}
|
|
|
|
FreeRpcEnumDhcp(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the list of Virtual HUB management options
|
|
UINT PsAdminOptionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ADMIN_OPTION t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetHubAdminOptions(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNewStandardEx();
|
|
UINT i;
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
ADMIN_OPTION *e = &t.Items[i];
|
|
wchar_t tmp1[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
|
|
StrToUni(tmp1, sizeof(tmp1), e->Name);
|
|
UniToStru(tmp2, e->Value);
|
|
|
|
CtInsert(ct, tmp1, tmp2, GetHubAdminOptionHelpString(e->Name));
|
|
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
}
|
|
|
|
FreeRpcAdminOption(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the value of a Virtual HUB management option
|
|
UINT PsAdminOptionSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ADMIN_OPTION t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_name"), CmdEvalNotEmpty, NULL},
|
|
{"VALUE", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_VALUE"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetHubAdminOptions(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
UINT i;
|
|
bool b = false;
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
if (StrCmpi(t.Items[i].Name, GetParamStr(o, "[name]")) == 0)
|
|
{
|
|
t.Items[i].Value = GetParamInt(o, "VALUE");
|
|
b = true;
|
|
}
|
|
}
|
|
|
|
if (b == false)
|
|
{
|
|
// An error has occured
|
|
ret = ERR_OBJECT_NOT_FOUND;
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
FreeRpcAdminOption(&t);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
ret = ScSetHubAdminOptions(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
}
|
|
|
|
FreeRpcAdminOption(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the list of Virtual HUB extended options
|
|
UINT PsExtOptionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ADMIN_OPTION t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetHubExtOptions(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNewStandardEx();
|
|
UINT i;
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
ADMIN_OPTION *e = &t.Items[i];
|
|
wchar_t tmp1[MAX_SIZE];
|
|
wchar_t tmp2[MAX_SIZE];
|
|
|
|
StrToUni(tmp1, sizeof(tmp1), e->Name);
|
|
UniToStru(tmp2, e->Value);
|
|
|
|
CtInsert(ct, tmp1, tmp2, GetHubAdminOptionHelpString(e->Name));
|
|
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
}
|
|
|
|
FreeRpcAdminOption(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the value of a Virtual HUB extended option
|
|
UINT PsExtOptionSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ADMIN_OPTION t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[name]", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_name"), CmdEvalNotEmpty, NULL},
|
|
{"VALUE", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_VALUE"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetHubExtOptions(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
UINT i;
|
|
bool b = false;
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
if (StrCmpi(t.Items[i].Name, GetParamStr(o, "[name]")) == 0)
|
|
{
|
|
t.Items[i].Value = GetParamInt(o, "VALUE");
|
|
b = true;
|
|
}
|
|
}
|
|
|
|
if (b == false)
|
|
{
|
|
// An error has occured
|
|
ret = ERR_OBJECT_NOT_FOUND;
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
FreeRpcAdminOption(&t);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
ret = ScSetHubExtOptions(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
}
|
|
|
|
FreeRpcAdminOption(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the list of revoked certificate list
|
|
UINT PsCrlList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_CRL t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScEnumCrl(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
UINT i;
|
|
CT *ct = CtNew();
|
|
|
|
CtInsertColumn(ct, _UU("CMD_ID"), false);
|
|
CtInsertColumn(ct, _UU("SM_CRL_COLUMN_1"), false);
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
wchar_t tmp[64];
|
|
RPC_ENUM_CRL_ITEM *e = &t.Items[i];
|
|
|
|
UniToStru(tmp, e->Key);
|
|
CtInsert(ct, tmp, e->CrlInfo);
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
}
|
|
|
|
FreeRpcEnumCrl(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Add a revoked certificate
|
|
UINT PsCrlAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CRL t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
{"SERIAL", NULL, NULL, NULL, NULL},
|
|
{"MD5", NULL, NULL, NULL, NULL},
|
|
{"SHA1", NULL, NULL, NULL, NULL},
|
|
{"CN", NULL, NULL, NULL, NULL},
|
|
{"O", NULL, NULL, NULL, NULL},
|
|
{"OU", NULL, NULL, NULL, NULL},
|
|
{"C", NULL, NULL, NULL, NULL},
|
|
{"ST", NULL, NULL, NULL, NULL},
|
|
{"L", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
{
|
|
bool param_exists = false;
|
|
CRL *crl = ZeroMalloc(sizeof(CRL));
|
|
NAME *n;
|
|
n = crl->Name = ZeroMalloc(sizeof(NAME));
|
|
|
|
if (IsEmptyStr(GetParamStr(o, "CN")) == false)
|
|
{
|
|
n->CommonName = CopyUniStr(GetParamUniStr(o, "CN"));
|
|
param_exists = true;
|
|
}
|
|
|
|
if (IsEmptyStr(GetParamStr(o, "O")) == false)
|
|
{
|
|
n->CommonName = CopyUniStr(GetParamUniStr(o, "O"));
|
|
param_exists = true;
|
|
}
|
|
|
|
if (IsEmptyStr(GetParamStr(o, "OU")) == false)
|
|
{
|
|
n->CommonName = CopyUniStr(GetParamUniStr(o, "OU"));
|
|
param_exists = true;
|
|
}
|
|
|
|
if (IsEmptyStr(GetParamStr(o, "C")) == false)
|
|
{
|
|
n->CommonName = CopyUniStr(GetParamUniStr(o, "C"));
|
|
param_exists = true;
|
|
}
|
|
|
|
if (IsEmptyStr(GetParamStr(o, "ST")) == false)
|
|
{
|
|
n->CommonName = CopyUniStr(GetParamUniStr(o, "ST"));
|
|
param_exists = true;
|
|
}
|
|
|
|
if (IsEmptyStr(GetParamStr(o, "L")) == false)
|
|
{
|
|
n->CommonName = CopyUniStr(GetParamUniStr(o, "L"));
|
|
param_exists = true;
|
|
}
|
|
|
|
if (IsEmptyStr(GetParamStr(o, "SERIAL")) == false)
|
|
{
|
|
BUF *b;
|
|
|
|
b = StrToBin(GetParamStr(o, "SERIAL"));
|
|
|
|
if (b != NULL && b->Size >= 1)
|
|
{
|
|
crl->Serial = NewXSerial(b->Buf, b->Size);
|
|
param_exists = true;
|
|
}
|
|
|
|
FreeBuf(b);
|
|
}
|
|
|
|
if (IsEmptyStr(GetParamStr(o, "MD5")) == false)
|
|
{
|
|
BUF *b;
|
|
|
|
b = StrToBin(GetParamStr(o, "MD5"));
|
|
|
|
if (b != NULL && b->Size == MD5_SIZE)
|
|
{
|
|
Copy(crl->DigestMD5, b->Buf, MD5_SIZE);
|
|
param_exists = true;
|
|
}
|
|
|
|
FreeBuf(b);
|
|
}
|
|
|
|
if (IsEmptyStr(GetParamStr(o, "SHA1")) == false)
|
|
{
|
|
BUF *b;
|
|
|
|
b = StrToBin(GetParamStr(o, "SHA1"));
|
|
|
|
if (b != NULL && b->Size == SHA1_SIZE)
|
|
{
|
|
Copy(crl->DigestSHA1, b->Buf, SHA1_SIZE);
|
|
param_exists = true;
|
|
}
|
|
|
|
FreeBuf(b);
|
|
}
|
|
|
|
t.Crl = crl;
|
|
|
|
if (param_exists == false)
|
|
{
|
|
FreeRpcCrl(&t);
|
|
ret = ERR_INVALID_PARAMETER;
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
// RPC call
|
|
ret = ScAddCrl(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCrl(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the revoked certificate
|
|
UINT PsCrlDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CRL t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[id]", CmdPrompt, _UU("CMD_CrlDel_Prompt_ID"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.Key = GetParamInt(o, "[id]");
|
|
|
|
// RPC call
|
|
ret = ScDelCrl(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeRpcCrl(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the revoked certificate
|
|
UINT PsCrlGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_CRL t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[id]", CmdPrompt, _UU("CMD_CrlGet_Prompt_ID"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
t.Key = GetParamInt(o, "[id]");
|
|
|
|
// RPC call
|
|
ret = ScGetCrl(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Show contents
|
|
CT *ct = CtNewStandard();
|
|
CRL *crl = t.Crl;
|
|
NAME *n;
|
|
|
|
if (crl != NULL)
|
|
{
|
|
n = crl->Name;
|
|
|
|
if (n != NULL)
|
|
{
|
|
if (UniIsEmptyStr(n->CommonName) == false)
|
|
{
|
|
CtInsert(ct, _UU("CMD_CrlGet_CN"), n->CommonName);
|
|
}
|
|
if (UniIsEmptyStr(n->Organization) == false)
|
|
{
|
|
CtInsert(ct, _UU("CMD_CrlGet_O"), n->Organization);
|
|
}
|
|
if (UniIsEmptyStr(n->Unit) == false)
|
|
{
|
|
CtInsert(ct, _UU("CMD_CrlGet_OU"), n->Unit);
|
|
}
|
|
if (UniIsEmptyStr(n->Country) == false)
|
|
{
|
|
CtInsert(ct, _UU("CMD_CrlGet_C"), n->Country);
|
|
}
|
|
if (UniIsEmptyStr(n->State) == false)
|
|
{
|
|
CtInsert(ct, _UU("CMD_CrlGet_ST"), n->State);
|
|
}
|
|
if (UniIsEmptyStr(n->Local) == false)
|
|
{
|
|
CtInsert(ct, _UU("CMD_CrlGet_L"), n->Local);
|
|
}
|
|
}
|
|
|
|
if (crl->Serial != NULL && crl->Serial->size >= 1)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
char str[MAX_SIZE];
|
|
|
|
BinToStrEx(str, sizeof(str), crl->Serial->data, crl->Serial->size);
|
|
StrToUni(tmp, sizeof(tmp), str);
|
|
|
|
CtInsert(ct, _UU("CMD_CrlGet_SERI"), tmp);
|
|
}
|
|
|
|
if (IsZero(crl->DigestMD5, MD5_SIZE) == false)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
char str[MAX_SIZE];
|
|
|
|
BinToStrEx(str, sizeof(str), crl->DigestMD5, MD5_SIZE);
|
|
StrToUni(tmp, sizeof(tmp), str);
|
|
|
|
CtInsert(ct, _UU("CMD_CrlGet_MD5_HASH"), tmp);
|
|
}
|
|
|
|
if (IsZero(crl->DigestSHA1, SHA1_SIZE) == false)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
char str[MAX_SIZE];
|
|
|
|
BinToStrEx(str, sizeof(str), crl->DigestSHA1, SHA1_SIZE);
|
|
StrToUni(tmp, sizeof(tmp), str);
|
|
|
|
CtInsert(ct, _UU("CMD_CrlGet_SHA1_HASH"), tmp);
|
|
}
|
|
}
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeRpcCrl(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the rules of IP access control list
|
|
UINT PsAcList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_AC_LIST t;
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetAcList(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
UINT i;
|
|
CT *ct;
|
|
|
|
ct = CtNew();
|
|
CtInsertColumn(ct, _UU("SM_AC_COLUMN_1"), true);
|
|
CtInsertColumn(ct, _UU("SM_AC_COLUMN_2"), true);
|
|
CtInsertColumn(ct, _UU("SM_AC_COLUMN_3"), false);
|
|
CtInsertColumn(ct, _UU("SM_AC_COLUMN_4"), false);
|
|
|
|
for (i = 0;i < LIST_NUM(t.o);i++)
|
|
{
|
|
wchar_t tmp1[32], *tmp2, tmp3[MAX_SIZE], tmp4[32];
|
|
char *tmp_str;
|
|
AC *ac = LIST_DATA(t.o, i);
|
|
|
|
UniToStru(tmp1, ac->Id);
|
|
tmp2 = ac->Deny ? _UU("SM_AC_DENY") : _UU("SM_AC_PASS");
|
|
tmp_str = GenerateAcStr(ac);
|
|
StrToUni(tmp3, sizeof(tmp3), tmp_str);
|
|
|
|
Free(tmp_str);
|
|
|
|
UniToStru(tmp4, ac->Priority);
|
|
|
|
CtInsert(ct, tmp1, tmp4, tmp2, tmp3);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeRpcAcList(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Add a rule to the IP access control list (IPv4)
|
|
UINT PsAcAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_AC_LIST t;
|
|
// Parameter list that can be specified
|
|
CMD_EVAL_MIN_MAX mm =
|
|
{
|
|
"CMD_AcAdd_Eval_PRIORITY", 1, 4294967295UL,
|
|
};
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[allow|deny]", CmdPrompt, _UU("CMD_AcAdd_Prompt_AD"), CmdEvalNotEmpty, NULL},
|
|
{"PRIORITY", CmdPrompt, _UU("CMD_AcAdd_Prompt_PRIORITY"), CmdEvalMinMax, &mm},
|
|
{"IP", CmdPrompt, _UU("CMD_AcAdd_Prompt_IP"), CmdEvalIpAndMask4, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetAcList(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Add a new item to the list
|
|
AC *ac = ZeroMalloc(sizeof(AC));
|
|
char *test = GetParamStr(o, "[allow|deny]");
|
|
UINT u_ip, u_mask;
|
|
|
|
if (StartWith("deny", test))
|
|
{
|
|
ac->Deny = true;
|
|
}
|
|
|
|
ParseIpAndMask4(GetParamStr(o, "IP"), &u_ip, &u_mask);
|
|
UINTToIP(&ac->IpAddress, u_ip);
|
|
|
|
if (u_mask == 0xffffffff)
|
|
{
|
|
ac->Masked = false;
|
|
}
|
|
else
|
|
{
|
|
ac->Masked = true;
|
|
UINTToIP(&ac->SubnetMask, u_mask);
|
|
}
|
|
|
|
ac->Priority = GetParamInt(o, "PRIORITY");
|
|
|
|
Insert(t.o, ac);
|
|
|
|
ret = ScSetAcList(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeRpcAcList(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Add a rule to the IP access control list (IPv6)
|
|
UINT PsAcAdd6(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_AC_LIST t;
|
|
// Parameter list that can be specified
|
|
CMD_EVAL_MIN_MAX mm =
|
|
{
|
|
"CMD_AcAdd6_Eval_PRIORITY", 1, 4294967295UL,
|
|
};
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[allow|deny]", CmdPrompt, _UU("CMD_AcAdd6_Prompt_AD"), CmdEvalNotEmpty, NULL},
|
|
{"PRIORITY", CmdPrompt, _UU("CMD_AcAdd6_Prompt_PRIORITY"), CmdEvalMinMax, &mm},
|
|
{"IP", CmdPrompt, _UU("CMD_AcAdd6_Prompt_IP"), CmdEvalIpAndMask6, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetAcList(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Add a new item to the list
|
|
AC *ac = ZeroMalloc(sizeof(AC));
|
|
char *test = GetParamStr(o, "[allow|deny]");
|
|
IP u_ip, u_mask;
|
|
|
|
if (StartWith("deny", test))
|
|
{
|
|
ac->Deny = true;
|
|
}
|
|
|
|
ParseIpAndMask6(GetParamStr(o, "IP"), &u_ip, &u_mask);
|
|
Copy(&ac->IpAddress, &u_ip, sizeof(IP));
|
|
|
|
if (SubnetMaskToInt6(&u_mask) == 128)
|
|
{
|
|
ac->Masked = false;
|
|
}
|
|
else
|
|
{
|
|
ac->Masked = true;
|
|
Copy(&ac->SubnetMask, &u_mask, sizeof(IP));
|
|
}
|
|
|
|
ac->Priority = GetParamInt(o, "PRIORITY");
|
|
|
|
Insert(t.o, ac);
|
|
|
|
ret = ScSetAcList(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeRpcAcList(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Run the debug command
|
|
UINT PsDebug(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT id;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[id]", NULL, NULL, NULL, NULL},
|
|
{"ARG", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
id = GetParamInt(o, "[id]");
|
|
|
|
if (true)
|
|
{
|
|
RPC_TEST t;
|
|
UINT ret;
|
|
|
|
c->Write(c, _UU("CMD_Debug_Msg1"));
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
t.IntValue = id;
|
|
StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "ARG"));
|
|
|
|
ret = ScDebug(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
wchar_t tmp[sizeof(t.StrValue)];
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_Debug_Msg2"), t.StrValue);
|
|
c->Write(c, tmp);
|
|
}
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Flush the configuration file on the server
|
|
UINT PsFlush(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (true)
|
|
{
|
|
RPC_TEST t;
|
|
UINT ret;
|
|
wchar_t tmp[MAX_SIZE];
|
|
char sizestr[MAX_SIZE];
|
|
|
|
c->Write(c, _UU("CMD_Flush_Msg1"));
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = ScFlush(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
ToStr3(sizestr, sizeof(sizestr), (UINT64)t.IntValue);
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_Flush_Msg2"), sizestr);
|
|
c->Write(c, tmp);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Crash
|
|
UINT PsCrash(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
char *yes;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[yes]", CmdPrompt, _UU("CMD_Crash_Confirm"), NULL, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
yes = GetParamStr(o, "[yes]");
|
|
|
|
if (StrCmpi(yes, "yes") != 0)
|
|
{
|
|
c->Write(c, _UU("CMD_Crash_Aborted"));
|
|
}
|
|
else
|
|
{
|
|
RPC_TEST t;
|
|
UINT ret;
|
|
|
|
c->Write(c, _UU("CMD_Crash_Msg"));
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = ScCrash(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Remove a rule in the IP access control list
|
|
UINT PsAcDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_AC_LIST t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[id]", CmdPrompt, _UU("CMD_AcDel_Prompt_ID"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
// If virtual HUB is not selected, it's an error
|
|
if (ps->HubName == NULL)
|
|
{
|
|
c->Write(c, _UU("CMD_Hub_Not_Selected"));
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);
|
|
|
|
// RPC call
|
|
ret = ScGetAcList(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Remove matched ID
|
|
UINT i;
|
|
bool b = false;
|
|
|
|
for (i = 0;i < LIST_NUM(t.o);i++)
|
|
{
|
|
AC *ac = LIST_DATA(t.o, i);
|
|
|
|
if (ac->Id == GetParamInt(o, "[id]"))
|
|
{
|
|
Delete(t.o, ac);
|
|
Free(ac);
|
|
b = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (b == false)
|
|
{
|
|
ret = ERR_OBJECT_NOT_FOUND;
|
|
FreeRpcAcList(&t);
|
|
}
|
|
else
|
|
{
|
|
ret = ScSetAcList(ps->Rpc, &t);
|
|
}
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
FreeRpcAcList(&t);
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Enable / Disable the IPsec VPN server function
|
|
UINT PsIPsecEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
IPSEC_SERVICES t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"L2TP", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_L2TP"), CmdEvalNotEmpty, NULL},
|
|
{"L2TPRAW", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_L2TPRAW"), CmdEvalNotEmpty, NULL},
|
|
{"ETHERIP", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_ETHERIP"), CmdEvalNotEmpty, NULL},
|
|
{"PSK", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_PSK"), CmdEvalNotEmpty, NULL},
|
|
{"DEFAULTHUB", CmdPrompt, _UU("CMD_IPsecEnable_Prompt_DEFAULTHUB"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.L2TP_IPsec = GetParamYes(o, "L2TP");
|
|
t.L2TP_Raw = GetParamYes(o, "L2TPRAW");
|
|
t.EtherIP_IPsec = GetParamYes(o, "ETHERIP");
|
|
StrCpy(t.IPsec_Secret, sizeof(t.IPsec_Secret), GetParamStr(o, "PSK"));
|
|
StrCpy(t.L2TP_DefaultHub, sizeof(t.L2TP_DefaultHub), GetParamStr(o, "DEFAULTHUB"));
|
|
|
|
// RPC call
|
|
ret = ScSetIPsecServices(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the current configuration of IPsec VPN server function
|
|
UINT PsIPsecGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
IPSEC_SERVICES t;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScGetIPsecServices(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
wchar_t tmp[MAX_PATH];
|
|
CT *ct = CtNewStandard();
|
|
|
|
CtInsert(ct, _UU("CMD_IPsecGet_PRINT_L2TP"), _UU(t.L2TP_IPsec ? "SEC_YES" : "SEC_NO"));
|
|
CtInsert(ct, _UU("CMD_IPsecGet_PRINT_L2TPRAW"), _UU(t.L2TP_Raw ? "SEC_YES" : "SEC_NO"));
|
|
CtInsert(ct, _UU("CMD_IPsecGet_PRINT_ETHERIP"), _UU(t.EtherIP_IPsec ? "SEC_YES" : "SEC_NO"));
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.IPsec_Secret);
|
|
CtInsert(ct, _UU("CMD_IPsecGet_PRINT_PSK"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.L2TP_DefaultHub);
|
|
CtInsert(ct, _UU("CMD_IPsecGet_PRINT_DEFAULTHUB"), tmp);
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Add connection settings for accepting connections from client devices of EtherIP / L2TPv3 over IPsec server function
|
|
UINT PsEtherIpClientAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
ETHERIP_ID t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[ID]", CmdPrompt, _UU("CMD_EtherIpClientAdd_Prompt_ID"), CmdEvalNotEmpty, NULL},
|
|
{"HUB", CmdPrompt, _UU("CMD_EtherIpClientAdd_Prompt_HUB"), CmdEvalNotEmpty, NULL},
|
|
{"USERNAME", CmdPrompt, _UU("CMD_EtherIpClientAdd_Prompt_USERNAME"), CmdEvalNotEmpty, NULL},
|
|
{"PASSWORD", CmdPrompt, _UU("CMD_EtherIpClientAdd_Prompt_PASSWORD"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.Id, sizeof(t.Id), GetParamStr(o, "[ID]"));
|
|
StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "HUB"));
|
|
StrCpy(t.UserName, sizeof(t.UserName), GetParamStr(o, "USERNAME"));
|
|
StrCpy(t.Password, sizeof(t.Password), GetParamStr(o, "PASSWORD"));
|
|
|
|
// RPC call
|
|
ret = ScAddEtherIpId(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the connection settings for accepting connections from client devices of EtherIP / L2TPv3 over IPsec server function
|
|
UINT PsEtherIpClientDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
ETHERIP_ID t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[ID]", CmdPrompt, _UU("CMD_EtherIpClientDelete_Prompt_ID"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.Id, sizeof(t.Id), GetParamStr(o, "[ID]"));
|
|
|
|
// RPC call
|
|
ret = ScDeleteEtherIpId(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Show the list of connection settings for accepting connections from client devices of EtherIP / L2TPv3 over IPsec server function
|
|
UINT PsEtherIpClientList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_ETHERIP_ID t;
|
|
UINT i;
|
|
CT *b;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScEnumEtherIpId(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
b = CtNew();
|
|
|
|
CtInsertColumn(b, _UU("SM_ETHERIP_COLUMN_0"), false);
|
|
CtInsertColumn(b, _UU("SM_ETHERIP_COLUMN_1"), false);
|
|
CtInsertColumn(b, _UU("SM_ETHERIP_COLUMN_2"), false);
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
ETHERIP_ID *d = &t.IdList[i];
|
|
wchar_t id[MAX_SIZE], hubname[MAX_SIZE], username[MAX_SIZE];
|
|
|
|
StrToUni(id, sizeof(id), d->Id);
|
|
StrToUni(hubname, sizeof(hubname), d->HubName);
|
|
StrToUni(username, sizeof(username), d->UserName);
|
|
|
|
CtInsert(b, id, hubname, username);
|
|
}
|
|
|
|
CtFree(b, c);
|
|
|
|
FreeRpcEnumEtherIpId(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Generate a OpenVPN sample configuration file that can connect to the OpenVPN compatible server function
|
|
UINT PsOpenVpnMakeConfig(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_READ_LOG_FILE t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[ZIP_FileName]", CmdPrompt, _UU("CMD_OpenVpnMakeConfig_Prompt_ZIP"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScMakeOpenVpnConfigFile(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
// Determine the file name to save
|
|
wchar_t filename[MAX_SIZE];
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
UniStrCpy(filename, sizeof(filename), GetParamUniStr(o, "[ZIP_FileName]"));
|
|
|
|
if (UniEndWith(filename, L".zip") == false)
|
|
{
|
|
UniStrCat(filename, sizeof(filename), L".zip");
|
|
}
|
|
|
|
if (DumpBufW(t.Buffer, filename) == false)
|
|
{
|
|
ret = ERR_INTERNAL_ERROR;
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_OpenVpnMakeConfig_ERROR"), filename);
|
|
}
|
|
else
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_OpenVpnMakeConfig_OK"), filename);
|
|
}
|
|
|
|
c->Write(c, tmp);
|
|
|
|
FreeRpcReadLogFile(&t);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Register to the VPN Server by creating a new self-signed certificate with the specified CN (Common Name)
|
|
UINT PsServerCertRegenerate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_TEST t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[CN]", CmdPrompt, _UU("CMD_ServerCertRegenerate_Prompt_CN"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "[CN]"));
|
|
|
|
// RPC call
|
|
ret = ScRegenerateServerCert(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
c->Write(c, L"");
|
|
c->Write(c, _UU("CM_CERT_SET_MSG"));
|
|
c->Write(c, L"");
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Enable / disable the VPN over ICMP / VPN over DNS server function
|
|
UINT PsVpnOverIcmpDnsEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SPECIAL_LISTENER t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"ICMP", CmdPrompt, _UU("CMD_VpnOverIcmpDnsEnable_Prompt_ICMP"), CmdEvalNotEmpty, NULL},
|
|
{"DNS", CmdPrompt, _UU("CMD_VpnOverIcmpDnsEnable_Prompt_DNS"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.VpnOverIcmpListener = GetParamYes(o, "ICMP");
|
|
t.VpnOverDnsListener = GetParamYes(o, "DNS");
|
|
|
|
// RPC call
|
|
ret = ScSetSpecialListener(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get current settings of VPN over ICMP / VPN over DNS server function
|
|
UINT PsVpnOverIcmpDnsGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_SPECIAL_LISTENER t;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScGetSpecialListener(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNewStandard();
|
|
|
|
CtInsert(ct, _UU("CMD_VpnOverIcmpDnsGet_PRINT_ICMP"), _UU(t.VpnOverIcmpListener ? "SEC_YES" : "SEC_NO"));
|
|
CtInsert(ct, _UU("CMD_VpnOverIcmpDnsGet_PRINT_DNS"), _UU(t.VpnOverDnsListener ? "SEC_YES" : "SEC_NO"));
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Enable / disable the VPN Azure function
|
|
UINT PsVpnAzureSetEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_AZURE_STATUS t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[yes|no]", CmdPrompt, _UU("VpnAzureSetEnable_PROMPT"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.IsEnabled = GetParamYes(o, "[yes|no]");
|
|
|
|
// RPC call
|
|
ret = ScSetAzureStatus(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the current state of the VPN Azure function
|
|
UINT PsVpnAzureGetStatus(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_AZURE_STATUS t;
|
|
DDNS_CLIENT_STATUS t2;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
Zero(&t2, sizeof(t2));
|
|
|
|
// RPC call
|
|
ret = ScGetAzureStatus(ps->Rpc, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
ret = ScGetDDnsClientStatus(ps->Rpc, &t2);
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNewStandard();
|
|
|
|
CtInsert(ct, _UU("CMD_VpnAzureGetStatus_PRINT_ENABLED"), _UU(t.IsEnabled ? "SEC_YES" : "SEC_NO"));
|
|
|
|
if (t.IsEnabled)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
UniFormat(tmp, sizeof(tmp), L"%S%S", t2.CurrentHostName, AZURE_DOMAIN_SUFFIX);
|
|
|
|
CtInsert(ct, _UU("CMD_VpnAzureGetStatus_PRINT_CONNECTED"), _UU(t.IsConnected ? "SEC_YES" : "SEC_NO"));
|
|
CtInsert(ct, _UU("CMD_VpnAzureGetStatus_PRINT_HOSTNAME"), tmp);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the current state of the dynamic DNS function
|
|
UINT PsDynamicDnsGetStatus(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
DDNS_CLIENT_STATUS t;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScGetDDnsClientStatus(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
else
|
|
{
|
|
CT *ct = CtNewStandard();
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
// FQDN
|
|
if (IsEmptyStr(t.CurrentFqdn) == false)
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), t.CurrentFqdn);
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("SM_DDNS_FQDN_EMPTY"));
|
|
}
|
|
CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_FQDN"), tmp);
|
|
|
|
// Hostname
|
|
if (IsEmptyStr(t.CurrentHostName) == false)
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), t.CurrentHostName);
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("SM_DDNS_FQDN_EMPTY"));
|
|
}
|
|
CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_HOSTNAME"), tmp);
|
|
|
|
// Suffix
|
|
if (IsEmptyStr(t.DnsSuffix) == false)
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), t.DnsSuffix);
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("SM_DDNS_FQDN_EMPTY"));
|
|
}
|
|
CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_SUFFIX"), tmp);
|
|
|
|
// IPv4
|
|
if (t.Err_IPv4 == ERR_NO_ERROR)
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), t.CurrentIPv4);
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _E(t.Err_IPv4));
|
|
}
|
|
CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_IPv4"), tmp);
|
|
|
|
// IPv6
|
|
if (t.Err_IPv6 == ERR_NO_ERROR)
|
|
{
|
|
StrToUni(tmp, sizeof(tmp), t.CurrentIPv6);
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _E(t.Err_IPv6));
|
|
}
|
|
CtInsert(ct, _UU("CMD_DynamicDnsGetStatus_PRINT_IPv6"), tmp);
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Configure the dynamic DNS host name
|
|
UINT PsDynamicDnsSetHostname(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_TEST t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[hostname]", CmdPrompt, _UU("CMD_DynamicDnsSetHostname_Prompt_hostname"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "[hostname]"));
|
|
|
|
// RPC call
|
|
ret = ScChangeDDnsClientHostname(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Register a new license key
|
|
UINT PsLicenseAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_TEST t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[key]", CmdPrompt, _UU("CMD_LicenseAdd_Prompt_Key"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "[key]"));
|
|
|
|
// RPC call
|
|
ret = ScAddLicenseKey(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the registered license
|
|
UINT PsLicenseDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_TEST t;
|
|
// Parameter list that can be specified
|
|
PARAM args[] =
|
|
{
|
|
// "name", prompt_proc, prompt_param, eval_proc, eval_param
|
|
{"[id]", CmdPrompt, _UU("CMD_LicenseDel_Prompt_ID"), CmdEvalNotEmpty, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.IntValue = GetParamInt(o, "[id]");
|
|
|
|
// RPC call
|
|
ret = ScDelLicenseKey(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
// Get the registered license list
|
|
UINT PsLicenseList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_ENUM_LICENSE_KEY t;
|
|
CT *ct;
|
|
UINT i;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
// RPC call
|
|
ret = ScEnumLicenseKey(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
ct = CtNew();
|
|
CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_2"), false);
|
|
CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_3"), false);
|
|
CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_4"), false);
|
|
CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_5"), false);
|
|
CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_6"), false);
|
|
CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_7"), false);
|
|
CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_8"), false);
|
|
CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_9"), false);
|
|
|
|
for (i = 0;i < t.NumItem;i++)
|
|
{
|
|
wchar_t tmp1[32], tmp2[LICENSE_KEYSTR_LEN + 1], tmp3[LICENSE_MAX_PRODUCT_NAME_LEN + 1],
|
|
*tmp4, tmp5[128], tmp6[LICENSE_LICENSEID_STR_LEN + 1], tmp7[64],
|
|
tmp8[64], tmp9[64];
|
|
RPC_ENUM_LICENSE_KEY_ITEM *e = &t.Items[i];
|
|
|
|
UniToStru(tmp1, e->Id);
|
|
StrToUni(tmp2, sizeof(tmp2), e->LicenseKey);
|
|
StrToUni(tmp3, sizeof(tmp3), e->LicenseName);
|
|
tmp4 = LiGetLicenseStatusStr(e->Status);
|
|
if (e->Expires == 0)
|
|
{
|
|
UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_LICENSE_NO_EXPIRES"));
|
|
}
|
|
else
|
|
{
|
|
GetDateStrEx64(tmp5, sizeof(tmp5), e->Expires, NULL);
|
|
}
|
|
StrToUni(tmp6, sizeof(tmp6), e->LicenseId);
|
|
UniToStru(tmp7, e->ProductId);
|
|
UniFormat(tmp8, sizeof(tmp8), L"%I64u", e->SystemId);
|
|
UniToStru(tmp9, e->SerialId);
|
|
|
|
CtInsert(ct,
|
|
tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9);
|
|
}
|
|
|
|
CtFreeEx(ct, c, true);
|
|
|
|
FreeRpcEnumLicenseKey(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the license status of the current VPN Server
|
|
UINT PsLicenseStatus(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret = 0;
|
|
RPC_LICENSE_STATUS st;
|
|
CT *ct;
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&st, sizeof(st));
|
|
|
|
// RPC call
|
|
ret = ScGetLicenseStatus(ps->Rpc, &st);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
// An error has occured
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
ct = CtNewStandard();
|
|
|
|
if (st.EditionId == LICENSE_EDITION_VPN3_NO_LICENSE)
|
|
{
|
|
CtInsert(ct, _UU("SM_NO_LICENSE_COLUMN"), _UU("SM_NO_LICENSE"));
|
|
}
|
|
else
|
|
{
|
|
// Product edition name
|
|
StrToUni(tmp, sizeof(tmp), st.EditionStr);
|
|
CtInsert(ct, _UU("SM_LICENSE_STATUS_EDITION"), tmp);
|
|
|
|
// Release date
|
|
if (st.ReleaseDate != 0)
|
|
{
|
|
GetDateStrEx64(tmp, sizeof(tmp), st.ReleaseDate, NULL);
|
|
CtInsert(ct, _UU("SM_LICENSE_STATUS_RELEASE"), tmp);
|
|
}
|
|
|
|
// Current system ID
|
|
UniFormat(tmp, sizeof(tmp), L"%I64u", st.SystemId);
|
|
CtInsert(ct, _UU("SM_LICENSE_STATUS_SYSTEM_ID"), tmp);
|
|
|
|
// Expiration date of the current license product
|
|
if (st.SystemExpires == 0)
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_NO_EXPIRES"));
|
|
}
|
|
else
|
|
{
|
|
GetDateStrEx64(tmp, sizeof(tmp), st.SystemExpires, NULL);
|
|
}
|
|
CtInsert(ct, _UU("SM_LICENSE_STATUS_EXPIRES"), tmp);
|
|
|
|
// Subscription (support) contract
|
|
if (st.NeedSubscription == false)
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_STATUS_SUBSCRIPTION_NONEED"));
|
|
}
|
|
else
|
|
{
|
|
if (st.SubscriptionExpires == 0)
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_STATUS_SUBSCRIPTION_NONE"));
|
|
}
|
|
else
|
|
{
|
|
wchar_t dtstr[MAX_PATH];
|
|
|
|
GetDateStrEx64(dtstr, sizeof(dtstr), st.SubscriptionExpires, NULL);
|
|
|
|
UniFormat(tmp, sizeof(tmp),
|
|
st.IsSubscriptionExpired ? _UU("SM_LICENSE_STATUS_SUBSCRIPTION_EXPIRED") : _UU("SM_LICENSE_STATUS_SUBSCRIPTION_VALID"),
|
|
dtstr);
|
|
}
|
|
}
|
|
CtInsert(ct, _UU("SM_LICENSE_STATUS_SUBSCRIPTION"), tmp);
|
|
|
|
if (st.NeedSubscription == false && st.SubscriptionExpires != 0)
|
|
{
|
|
wchar_t dtstr[MAX_PATH];
|
|
|
|
GetDateStrEx64(dtstr, sizeof(dtstr), st.SubscriptionExpires, NULL);
|
|
|
|
CtInsert(ct, _UU("SM_LICENSE_STATUS_SUBSCRIPTION_BUILD_STR"), tmp);
|
|
}
|
|
|
|
if (GetCapsBool(ps->CapsList, "b_vpn3"))
|
|
{
|
|
// Maximum creatable number of users
|
|
if (st.NumClientConnectLicense == INFINITE)
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_INFINITE"));
|
|
}
|
|
else
|
|
{
|
|
UniToStru(tmp, st.NumClientConnectLicense);
|
|
}
|
|
CtInsert(ct, _UU("SM_LICENSE_NUM_CLIENT"), tmp);
|
|
}
|
|
|
|
// Available number of concurrent client connections
|
|
if (st.NumBridgeConnectLicense == INFINITE)
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_INFINITE"));
|
|
}
|
|
else
|
|
{
|
|
UniToStru(tmp, st.NumBridgeConnectLicense);
|
|
}
|
|
CtInsert(ct, _UU("SM_LICENSE_NUM_BRIDGE"), tmp);
|
|
|
|
// Availability of enterprise features
|
|
CtInsert(ct, _UU("SM_LICENSE_STATUS_ENTERPRISE"),
|
|
st.AllowEnterpriseFunction ? _UU("SM_LICENSE_STATUS_ENTERPRISE_YES") : _UU("SM_LICENSE_STATUS_ENTERPRISE_NO"));
|
|
}
|
|
|
|
CtFreeEx(ct, c, false);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
// Get the cluster configuration
|
|
UINT PsClusterSettingGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret;
|
|
RPC_FARM t;
|
|
CT *ct;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = ScGetFarmSetting(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
if (t.Weight == 0)
|
|
{
|
|
t.Weight = FARM_DEFAULT_WEIGHT;
|
|
}
|
|
|
|
// Show the cluster configuration
|
|
ct = CtNewStandard();
|
|
|
|
CtInsert(ct, _UU("CMD_ClusterSettingGet_Current"),
|
|
GetServerTypeStr(t.ServerType));
|
|
|
|
if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
|
|
{
|
|
CtInsert(ct, _UU("CMD_ClusterSettingGet_ControllerOnly"), t.ControllerOnly ? _UU("SEC_YES") : _UU("SEC_NO"));
|
|
}
|
|
|
|
if (t.ServerType != SERVER_TYPE_STANDALONE)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
UniToStru(tmp, t.Weight);
|
|
|
|
CtInsert(ct, _UU("CMD_ClusterSettingGet_Weight"), tmp);
|
|
}
|
|
|
|
if (t.ServerType == SERVER_TYPE_FARM_MEMBER)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
UINT i;
|
|
|
|
// Public IP address
|
|
if (t.PublicIp != 0)
|
|
{
|
|
IPToUniStr32(tmp, sizeof(tmp), t.PublicIp);
|
|
}
|
|
else
|
|
{
|
|
UniStrCpy(tmp, sizeof(tmp), _UU("CMD_ClusterSettingGet_None"));
|
|
}
|
|
|
|
CtInsert(ct, _UU("CMD_ClusterSettingGet_PublicIp"), tmp);
|
|
|
|
// Public port list
|
|
tmp[0] = 0;
|
|
for (i = 0;i < t.NumPort;i++)
|
|
{
|
|
wchar_t tmp2[64];
|
|
|
|
UniFormat(tmp2, sizeof(tmp2), L"%u, ", t.Ports[i]);
|
|
|
|
UniStrCat(tmp, sizeof(tmp), tmp2);
|
|
}
|
|
|
|
if (UniEndWith(tmp, L", "))
|
|
{
|
|
tmp[UniStrLen(tmp) - 2] = 0;
|
|
}
|
|
|
|
CtInsert(ct, _UU("CMD_ClusterSettingGet_PublicPorts"), tmp);
|
|
|
|
// Controller to connect
|
|
UniFormat(tmp, sizeof(tmp), L"%S:%u", t.ControllerName, t.ControllerPort);
|
|
CtInsert(ct, _UU("CMD_ClusterSettingGet_Controller"), tmp);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
|
|
FreeRpcFarm(&t);
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set the server password
|
|
UINT PsServerPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret;
|
|
RPC_SET_PASSWORD t;
|
|
char *pw;
|
|
PARAM args[] =
|
|
{
|
|
{"[password]", CmdPromptChoosePassword, NULL, NULL, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
pw = GetParamStr(o, "[password]");
|
|
|
|
Zero(&t, sizeof(t));
|
|
Sha0(t.HashedPassword, pw, StrLen(pw));
|
|
|
|
ret = ScSetServerPassword(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Password decision prompt (for Prompt function)
|
|
wchar_t *CmdPromptChoosePassword(CONSOLE *c, void *param)
|
|
{
|
|
char *s;
|
|
// Validate arguments
|
|
if (c == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
s = CmdPasswordPrompt(c);
|
|
|
|
if (s == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
else
|
|
{
|
|
wchar_t *ret = CopyStrToUni(s);
|
|
|
|
Free(s);
|
|
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
// Password input prompt (general-purpose)
|
|
char *CmdPasswordPrompt(CONSOLE *c)
|
|
{
|
|
char *pw1, *pw2;
|
|
// Validate arguments
|
|
if (c == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
c->Write(c, _UU("CMD_VPNCMD_PWPROMPT_0"));
|
|
|
|
RETRY:
|
|
c->Write(c, L"");
|
|
|
|
|
|
pw1 = c->ReadPassword(c, _UU("CMD_VPNCMD_PWPROMPT_1"));
|
|
if (pw1 == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
pw2 = c->ReadPassword(c, _UU("CMD_VPNCMD_PWPROMPT_2"));
|
|
if (pw2 == NULL)
|
|
{
|
|
Free(pw1);
|
|
return NULL;
|
|
}
|
|
|
|
c->Write(c, L"");
|
|
|
|
if (StrCmp(pw1, pw2) != 0)
|
|
{
|
|
Free(pw1);
|
|
Free(pw2);
|
|
c->Write(c, _UU("CMD_VPNCMD_PWPROMPT_3"));
|
|
goto RETRY;
|
|
}
|
|
|
|
Free(pw1);
|
|
|
|
return pw2;
|
|
}
|
|
|
|
// Disable the listener
|
|
UINT PsListenerDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret;
|
|
RPC_LISTENER t;
|
|
PARAM args[] =
|
|
{
|
|
{"[port]", CmdPromptPort, _UU("CMD_ListenerDisable_PortPrompt"), CmdEvalPort, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.Enable = false;
|
|
t.Port = ToInt(GetParamStr(o, "[port]"));
|
|
|
|
ret = ScEnableListener(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Enable the listener
|
|
UINT PsListenerEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret;
|
|
RPC_LISTENER t;
|
|
PARAM args[] =
|
|
{
|
|
{"[port]", CmdPromptPort, _UU("CMD_ListenerEnable_PortPrompt"), CmdEvalPort, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.Enable = true;
|
|
t.Port = ToInt(GetParamStr(o, "[port]"));
|
|
|
|
ret = ScEnableListener(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Set UDP ports the server should listen on
|
|
UINT PsPortsUDPSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o, *ports;
|
|
PS *ps = (PS *)param;
|
|
UINT ret;
|
|
RPC_PORTS t;
|
|
PARAM args[] =
|
|
{
|
|
{"[ports]", CmdPrompt, _UU("CMD_PortsUDPSet_[ports]"), CmdEvalPortList, (void *)false}
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
ports = StrToPortList(GetParamStr(o, "[ports]"), false);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
t.Num = LIST_NUM(ports);
|
|
if (t.Num > 0)
|
|
{
|
|
UINT i;
|
|
t.Ports = Malloc(sizeof(UINT) * t.Num);
|
|
|
|
for (i = 0; i < t.Num; ++i)
|
|
{
|
|
t.Ports[i] = (UINT)LIST_DATA(ports, i);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
t.Ports = NULL;
|
|
}
|
|
|
|
ReleaseList(ports);
|
|
|
|
ret = ScSetPortsUDP(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
Free(t.Ports);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// List UDP ports the server is listening on
|
|
UINT PsPortsUDPGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret;
|
|
RPC_PORTS t;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = ScGetPortsUDP(ps->Rpc, &t);
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
wchar_t str[MAX_SIZE];
|
|
CT *ct = CtNewStandard();
|
|
|
|
Zero(str, sizeof(str));
|
|
|
|
if (t.Num > 0)
|
|
{
|
|
UINT i;
|
|
wchar_t buf[MAX_SIZE];
|
|
|
|
UniFormat(buf, sizeof(buf), L"%u", t.Ports[0]);
|
|
UniStrCat(str, sizeof(str), buf);
|
|
|
|
for (i = 1; i < t.Num; ++i)
|
|
{
|
|
UniFormat(buf, sizeof(buf), L", %u", t.Ports[i]);
|
|
UniStrCat(str, sizeof(str), buf);
|
|
}
|
|
}
|
|
|
|
CtInsert(ct, _UU("CMD_PortsUDPGet_Ports"), str);
|
|
CtFree(ct, c);
|
|
}
|
|
else
|
|
{
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
FreeRpcPorts(&t);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Configure an option for the specified protocol (TODO: ability to set multiple options in a single call)
|
|
UINT PsProtoOptionsSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret;
|
|
RPC_PROTO_OPTIONS t;
|
|
PARAM args[] =
|
|
{
|
|
{"[protocol]", CmdPrompt, _UU("CMD_ProtoOptionsSet_Prompt_[protocol]"), CmdEvalNotEmpty, NULL},
|
|
{"NAME", CmdPrompt, _UU("CMD_ProtoOptionsSet_Prompt_NAME"), CmdEvalNotEmpty, NULL},
|
|
{"VALUE", CmdPrompt, _UU("CMD_ProtoOptionsSet_Prompt_VALUE"), NULL, NULL}
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.Protocol = CopyStr(GetParamStr(o, "[protocol]"));
|
|
|
|
ret = ScGetProtoOptions(ps->Rpc, &t);
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
UINT i;
|
|
bool found = false;
|
|
|
|
for (i = 0; i < t.Num; ++i)
|
|
{
|
|
PROTO_OPTION *option = &t.Options[i];
|
|
if (StrCmpi(option->Name, GetParamStr(o, "NAME")) != 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
found = true;
|
|
|
|
switch (option->Type)
|
|
{
|
|
case PROTO_OPTION_STRING:
|
|
Free(option->String);
|
|
option->String = CopyStr(GetParamStr(o, "VALUE"));
|
|
break;
|
|
case PROTO_OPTION_BOOL:
|
|
option->Bool = GetParamYes(o, "VALUE");
|
|
break;
|
|
case PROTO_OPTION_UINT32:
|
|
option->UInt32 = GetParamInt(o, "VALUE");
|
|
break;
|
|
default:
|
|
ret = ERR_INTERNAL_ERROR;
|
|
}
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
ret = ScSetProtoOptions(ps->Rpc, &t);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
if (found == false)
|
|
{
|
|
ret = ERR_OBJECT_NOT_FOUND;
|
|
}
|
|
}
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
FreeRpcProtoOptions(&t);
|
|
FreeParamValueList(o);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// List available options for the specified protocol
|
|
UINT PsProtoOptionsGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret;
|
|
RPC_PROTO_OPTIONS t;
|
|
PARAM args[] =
|
|
{
|
|
{"[protocol]", CmdPrompt, _UU("CMD_ProtoOptionsGet_Prompt_[protocol]"), CmdEvalNotEmpty, NULL}
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.Protocol = CopyStr(GetParamStr(o, "[protocol]"));
|
|
|
|
FreeParamValueList(o);
|
|
|
|
ret = ScGetProtoOptions(ps->Rpc, &t);
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
UINT i;
|
|
CT *ct = CtNew();
|
|
CtInsertColumn(ct, _UU("CMD_ProtoOptionsGet_Column_Name"), false);
|
|
CtInsertColumn(ct, _UU("CMD_ProtoOptionsGet_Column_Type"), false);
|
|
CtInsertColumn(ct, _UU("CMD_ProtoOptionsGet_Column_Value"), false);
|
|
CtInsertColumn(ct, _UU("CMD_ProtoOptionsGet_Column_Description"), false);
|
|
|
|
for (i = 0; i < t.Num; ++i)
|
|
{
|
|
char description_str_key[MAX_SIZE];
|
|
const PROTO_OPTION *option = &t.Options[i];
|
|
wchar_t *value, *type, *name = CopyStrToUni(option->Name);
|
|
|
|
switch (option->Type)
|
|
{
|
|
case PROTO_OPTION_STRING:
|
|
type = L"String";
|
|
value = CopyStrToUni(option->String);
|
|
break;
|
|
case PROTO_OPTION_BOOL:
|
|
type = L"Boolean";
|
|
value = option->Bool ? L"True" : L"False";
|
|
break;
|
|
case PROTO_OPTION_UINT32:
|
|
type = L"32 bit unsigned integer";
|
|
char tmp[MAX_SIZE];
|
|
Format(tmp, sizeof(tmp), "%u", option->UInt32);
|
|
value = CopyStrToUni(tmp);
|
|
break;
|
|
default:
|
|
Debug("StGetProtoOptions(): unhandled option type %u!\n", option->Type);
|
|
Free(name);
|
|
continue;
|
|
}
|
|
|
|
Format(description_str_key, sizeof(description_str_key), "CMD_ProtoOptions_Description_%s_%s", t.Protocol, option->Name);
|
|
|
|
CtInsert(ct, name, type, value, _UU(description_str_key));
|
|
|
|
if (option->Type != PROTO_OPTION_BOOL)
|
|
{
|
|
Free(value);
|
|
}
|
|
|
|
Free(name);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
}
|
|
else
|
|
{
|
|
CmdPrintError(c, ret);
|
|
}
|
|
|
|
FreeRpcProtoOptions(&t);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Draw a row of console table
|
|
void CtPrintRow(CONSOLE *c, UINT num, UINT *widths, wchar_t **strings, bool *rights, char separate_char)
|
|
{
|
|
UINT i;
|
|
wchar_t *buf;
|
|
UINT buf_size;
|
|
bool is_sep_line = true;
|
|
// Validate arguments
|
|
if (c == NULL || num == 0 || widths == NULL || strings == NULL || rights == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
buf_size = 32;
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
buf_size += sizeof(wchar_t) * widths[i] + 6;
|
|
}
|
|
|
|
buf = ZeroMalloc(buf_size);
|
|
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
char *tmp;
|
|
wchar_t *space_string;
|
|
UINT w;
|
|
UINT space = 0;
|
|
wchar_t *string = strings[i];
|
|
wchar_t *tmp_line = NULL;
|
|
|
|
if (UniStrCmpi(string, L"---") == 0)
|
|
{
|
|
char *s = MakeCharArray('-', widths[i]);
|
|
tmp_line = string = CopyStrToUni(s);
|
|
|
|
Free(s);
|
|
}
|
|
else
|
|
{
|
|
is_sep_line = false;
|
|
}
|
|
|
|
w = UniStrWidth(string);
|
|
|
|
if (widths[i] >= w)
|
|
{
|
|
space = widths[i] - w;
|
|
}
|
|
|
|
tmp = MakeCharArray(' ', space);
|
|
space_string = CopyStrToUni(tmp);
|
|
|
|
if (rights[i] != false)
|
|
{
|
|
UniStrCat(buf, buf_size, space_string);
|
|
}
|
|
|
|
UniStrCat(buf, buf_size, string);
|
|
|
|
if (rights[i] == false)
|
|
{
|
|
UniStrCat(buf, buf_size, space_string);
|
|
}
|
|
|
|
Free(space_string);
|
|
Free(tmp);
|
|
|
|
if (i < (num - 1))
|
|
{
|
|
wchar_t tmp[4];
|
|
char str[2];
|
|
|
|
if (UniStrCmpi(strings[i], L"---") == 0)
|
|
{
|
|
str[0] = '+';
|
|
}
|
|
else
|
|
{
|
|
str[0] = separate_char;
|
|
}
|
|
str[1] = 0;
|
|
|
|
StrToUni(tmp, sizeof(tmp), str);
|
|
|
|
UniStrCat(buf, buf_size, tmp);
|
|
}
|
|
|
|
if (tmp_line != NULL)
|
|
{
|
|
Free(tmp_line);
|
|
}
|
|
}
|
|
|
|
UniTrimRight(buf);
|
|
|
|
if (is_sep_line)
|
|
{
|
|
if (UniStrLen(buf) > (c->GetWidth(c) - 1))
|
|
{
|
|
buf[c->GetWidth(c) - 1] = 0;
|
|
}
|
|
}
|
|
|
|
c->Write(c, buf);
|
|
|
|
Free(buf);
|
|
}
|
|
|
|
// Draw the console table in standard format
|
|
void CtPrintStandard(CT *ct, CONSOLE *c)
|
|
{
|
|
CT *t;
|
|
UINT i, j;
|
|
// Validate arguments
|
|
if (ct == NULL || c == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
t = CtNewStandard();
|
|
for (i = 0;i < LIST_NUM(ct->Rows);i++)
|
|
{
|
|
CTR *row = LIST_DATA(ct->Rows, i);
|
|
|
|
for (j = 0;j < LIST_NUM(ct->Columns);j++)
|
|
{
|
|
CTC *column = LIST_DATA(ct->Columns, j);
|
|
|
|
CtInsert(t, column->String, row->Strings[j]);
|
|
}
|
|
|
|
if (i != (LIST_NUM(ct->Rows) - 1))
|
|
{
|
|
CtInsert(t, L"---", L"---");
|
|
}
|
|
}
|
|
|
|
CtFree(t, c);
|
|
}
|
|
|
|
// Draw the console table
|
|
void CtPrint(CT *ct, CONSOLE *c)
|
|
{
|
|
UINT *widths;
|
|
UINT num;
|
|
UINT i, j;
|
|
wchar_t **header_strings;
|
|
bool *rights;
|
|
// Validate arguments
|
|
if (ct == NULL || c == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
num = LIST_NUM(ct->Columns);
|
|
widths = ZeroMalloc(sizeof(UINT) * num);
|
|
|
|
// Calculate the maximum character width of each column
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
CTC *ctc = LIST_DATA(ct->Columns, i);
|
|
UINT w;
|
|
|
|
w = UniStrWidth(ctc->String);
|
|
widths[i] = MAX(widths[i], w);
|
|
}
|
|
for (j = 0;j < LIST_NUM(ct->Rows);j++)
|
|
{
|
|
CTR *ctr = LIST_DATA(ct->Rows, j);
|
|
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
UINT w;
|
|
|
|
w = UniStrWidth(ctr->Strings[i]);
|
|
widths[i] = MAX(widths[i], w);
|
|
}
|
|
}
|
|
|
|
// Display the header part
|
|
header_strings = ZeroMalloc(sizeof(wchar_t *) * num);
|
|
rights = ZeroMalloc(sizeof(bool) * num);
|
|
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
CTC *ctc = LIST_DATA(ct->Columns, i);
|
|
|
|
header_strings[i] = ctc->String;
|
|
rights[i] = ctc->Right;
|
|
}
|
|
|
|
CtPrintRow(c, num, widths, header_strings, rights, '|');
|
|
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
char *s;
|
|
|
|
s = MakeCharArray('-', widths[i]);
|
|
header_strings[i] = CopyStrToUni(s);
|
|
Free(s);
|
|
}
|
|
|
|
CtPrintRow(c, num, widths, header_strings, rights, '+');
|
|
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
Free(header_strings[i]);
|
|
}
|
|
|
|
// Display the data part
|
|
for (j = 0;j < LIST_NUM(ct->Rows);j++)
|
|
{
|
|
CTR *ctr = LIST_DATA(ct->Rows, j);
|
|
|
|
CtPrintRow(c, num, widths, ctr->Strings, rights, '|');
|
|
}
|
|
|
|
Free(rights);
|
|
Free(header_strings);
|
|
Free(widths);
|
|
}
|
|
|
|
// Escape the meta-characters in CSV
|
|
void CtEscapeCsv(wchar_t *dst, UINT size, wchar_t *src){
|
|
UINT i;
|
|
UINT len = UniStrLen(src);
|
|
UINT idx;
|
|
bool need_to_escape = false;
|
|
wchar_t tmp[2]=L"*";
|
|
|
|
// Check the input value
|
|
if (src==NULL || dst==NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// If there is no character that need to be escaped in the input characters, copy it to the output
|
|
for (i=0; i<len; i++)
|
|
{
|
|
tmp[0] = src[i];
|
|
if (tmp[0] == L","[0] || tmp[0] == L"\n"[0] || tmp[0] == L"\""[0])
|
|
{
|
|
need_to_escape = true;
|
|
}
|
|
}
|
|
if (need_to_escape == false)
|
|
{
|
|
UniStrCpy(dst,size,src);
|
|
return;
|
|
}
|
|
|
|
// If it contains meta characters (newline, comma, double quote), enclose with "
|
|
UniStrCpy(dst, size, L"\"");
|
|
idx = UniStrLen(dst);
|
|
if(idx<size-1)
|
|
{
|
|
for (i=0; i<len; i++)
|
|
{
|
|
tmp[0] = src[i];
|
|
// Convert " to "" in contents(MS-Excel method)
|
|
if (tmp[0] == L"\""[0])
|
|
{
|
|
UniStrCat(dst, size, tmp);
|
|
}
|
|
UniStrCat(dst, size, tmp);
|
|
}
|
|
}
|
|
UniStrCat(dst, size, L"\"");
|
|
return;
|
|
}
|
|
|
|
// Show a CSV format of console table
|
|
void CtPrintCsv(CT *ct, CONSOLE *c)
|
|
{
|
|
UINT i, j;
|
|
UINT num_columns = LIST_NUM(ct->Columns);
|
|
wchar_t buf[MAX_SIZE*4];
|
|
wchar_t fmtbuf[MAX_SIZE*4];
|
|
|
|
// Show the heading row
|
|
buf[0] = 0;
|
|
for(i=0; i<num_columns; i++)
|
|
{
|
|
CTC *ctc = LIST_DATA(ct->Columns, i);
|
|
CtEscapeCsv(fmtbuf, sizeof(fmtbuf), ctc->String);
|
|
UniStrCat(buf, sizeof(buf), fmtbuf);
|
|
if(i != num_columns-1)
|
|
UniStrCat(buf, sizeof(buf), L",");
|
|
}
|
|
c->Write(c, buf);
|
|
|
|
// Show the table body
|
|
for(j=0; j<LIST_NUM(ct->Rows); j++)
|
|
{
|
|
CTR *ctr = LIST_DATA(ct->Rows, j);
|
|
buf[0] = 0;
|
|
for(i=0; i<num_columns; i++)
|
|
{
|
|
CtEscapeCsv(fmtbuf, sizeof(fmtbuf), ctr->Strings[i]);
|
|
UniStrCat(buf, sizeof(buf), fmtbuf);
|
|
if(i != num_columns-1)
|
|
UniStrCat(buf, sizeof(buf), L",");
|
|
}
|
|
c->Write(c, buf);
|
|
}
|
|
}
|
|
|
|
// Delete the console table
|
|
void CtFreeEx(CT *ct, CONSOLE *c, bool standard_view)
|
|
{
|
|
UINT i, num;
|
|
// Validate arguments
|
|
if (ct == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (c != NULL)
|
|
{
|
|
if (c->ConsoleType == CONSOLE_CSV)
|
|
{
|
|
CtPrintCsv(ct, c);
|
|
}
|
|
else
|
|
{
|
|
if (standard_view == false)
|
|
{
|
|
CtPrint(ct, c);
|
|
}
|
|
else
|
|
{
|
|
CtPrintStandard(ct, c);
|
|
}
|
|
}
|
|
}
|
|
|
|
num = LIST_NUM(ct->Columns);
|
|
|
|
for (i = 0;i < LIST_NUM(ct->Rows);i++)
|
|
{
|
|
UINT j;
|
|
CTR *ctr = LIST_DATA(ct->Rows, i);
|
|
|
|
for (j = 0;j < num;j++)
|
|
{
|
|
Free(ctr->Strings[j]);
|
|
}
|
|
|
|
Free(ctr->Strings);
|
|
Free(ctr);
|
|
}
|
|
|
|
for (i = 0;i < LIST_NUM(ct->Columns);i++)
|
|
{
|
|
CTC *ctc = LIST_DATA(ct->Columns, i);
|
|
|
|
Free(ctc->String);
|
|
Free(ctc);
|
|
}
|
|
|
|
ReleaseList(ct->Columns);
|
|
ReleaseList(ct->Rows);
|
|
|
|
Free(ct);
|
|
}
|
|
void CtFree(CT *ct, CONSOLE *c)
|
|
{
|
|
CtFreeEx(ct, c, false);
|
|
}
|
|
|
|
// Add a row to the table
|
|
void CtInsert(CT *ct, ...)
|
|
{
|
|
CTR *ctr;
|
|
UINT num, i;
|
|
va_list va;
|
|
// Validate arguments
|
|
if (ct == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
num = LIST_NUM(ct->Columns);
|
|
|
|
va_start(va, ct);
|
|
|
|
ctr = ZeroMalloc(sizeof(CTR));
|
|
ctr->Strings = ZeroMalloc(sizeof(wchar_t *) * num);
|
|
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
wchar_t *s = va_arg(va, wchar_t *);
|
|
|
|
ctr->Strings[i] = CopyUniStr(s);
|
|
}
|
|
|
|
va_end(va);
|
|
|
|
Insert(ct->Rows, ctr);
|
|
}
|
|
|
|
// Add a column to the table
|
|
void CtInsertColumn(CT *ct, wchar_t *str, bool right)
|
|
{
|
|
CTC *ctc;
|
|
// Validate arguments
|
|
if (ct == NULL)
|
|
{
|
|
return;
|
|
}
|
|
if (str == NULL)
|
|
{
|
|
str = L"";
|
|
}
|
|
|
|
ctc = ZeroMalloc(sizeof(CTC));
|
|
ctc->String = CopyUniStr(str);
|
|
ctc->Right = right;
|
|
|
|
Insert(ct->Columns, ctc);
|
|
}
|
|
|
|
// Create a new console table
|
|
CT *CtNew()
|
|
{
|
|
CT *ct;
|
|
|
|
ct = ZeroMalloc(sizeof(CT));
|
|
ct->Columns = NewList(NULL);
|
|
ct->Rows = NewList(NULL);
|
|
|
|
return ct;
|
|
}
|
|
|
|
// Add a standard column to a column in a table
|
|
CT *CtNewStandard()
|
|
{
|
|
CT *ct = CtNew();
|
|
|
|
CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_2"), false);
|
|
|
|
return ct;
|
|
}
|
|
CT *CtNewStandardEx()
|
|
{
|
|
CT *ct = CtNew();
|
|
|
|
CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_2"), false);
|
|
CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_3"), false);
|
|
|
|
return ct;
|
|
}
|
|
|
|
// Get the TCP listener list
|
|
UINT PsListenerList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret;
|
|
RPC_LISTENER_LIST t;
|
|
UINT i;
|
|
CT *ct;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
|
|
ret = ScEnumListener(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
ct = CtNew();
|
|
|
|
CtInsertColumn(ct, _UU("CM_LISTENER_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("CM_LISTENER_COLUMN_2"), false);
|
|
|
|
for (i = 0;i < t.NumPort;i++)
|
|
{
|
|
wchar_t *status = _UU("CM_LISTENER_OFFLINE");
|
|
wchar_t tmp[128];
|
|
|
|
if (t.Errors[i])
|
|
{
|
|
status = _UU("CM_LISTENER_ERROR");
|
|
}
|
|
else if (t.Enables[i])
|
|
{
|
|
status = _UU("CM_LISTENER_ONLINE");
|
|
}
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("CM_LISTENER_TCP_PORT"), t.Ports[i]);
|
|
|
|
CtInsert(ct, tmp, status);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
|
|
FreeRpcListenerList(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Delete the TCP listener
|
|
UINT PsListenerDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret;
|
|
RPC_LISTENER t;
|
|
PARAM args[] =
|
|
{
|
|
{"[port]", CmdPromptPort, _UU("CMD_ListenerDelete_PortPrompt"), CmdEvalPort, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.Enable = true;
|
|
t.Port = ToInt(GetParamStr(o, "[port]"));
|
|
|
|
ret = ScDeleteListener(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// ServerInfoGet command
|
|
UINT PsServerInfoGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret;
|
|
RPC_SERVER_INFO t;
|
|
CT *ct;
|
|
wchar_t tmp[MAX_SIZE];
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
ret = ScGetServerInfo(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
ct = CtNew();
|
|
|
|
CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_2"), false);
|
|
|
|
// Product name
|
|
StrToUni(tmp, sizeof(tmp), t.ServerProductName);
|
|
CtInsert(ct, _UU("SM_INFO_PRODUCT_NAME"), tmp);
|
|
|
|
// Version
|
|
StrToUni(tmp, sizeof(tmp), t.ServerVersionString);
|
|
CtInsert(ct, _UU("SM_INFO_VERSION"), tmp);
|
|
|
|
// Build
|
|
StrToUni(tmp, sizeof(tmp), t.ServerBuildInfoString);
|
|
CtInsert(ct, _UU("SM_INFO_BUILD"), tmp);
|
|
|
|
// Host name
|
|
StrToUni(tmp, sizeof(tmp), t.ServerHostName);
|
|
CtInsert(ct, _UU("SM_INFO_HOSTNAME"), tmp);
|
|
|
|
// Type
|
|
CtInsert(ct, _UU("SM_ST_SERVER_TYPE"), GetServerTypeStr(t.ServerType));
|
|
|
|
// OS
|
|
StrToUni(tmp, sizeof(tmp), t.OsInfo.OsSystemName);
|
|
CtInsert(ct, _UU("SM_OS_SYSTEM_NAME"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.OsInfo.OsProductName);
|
|
CtInsert(ct, _UU("SM_OS_PRODUCT_NAME"), tmp);
|
|
|
|
if (t.OsInfo.OsServicePack != 0)
|
|
{
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_OS_SP_TAG"), t.OsInfo.OsServicePack);
|
|
CtInsert(ct, _UU("SM_OS_SERVICE_PACK"), tmp);
|
|
}
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVendorName);
|
|
CtInsert(ct, _UU("SM_OS_VENDER_NAME"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVersion);
|
|
CtInsert(ct, _UU("SM_OS_VERSION"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelName);
|
|
CtInsert(ct, _UU("SM_OS_KERNEL_NAME"), tmp);
|
|
|
|
StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelVersion);
|
|
CtInsert(ct, _UU("SM_OS_KERNEL_VERSION"), tmp);
|
|
|
|
CtFree(ct, c);
|
|
|
|
FreeRpcServerInfo(&t);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Get the string for type of the HUB
|
|
wchar_t *GetHubTypeStr(UINT type)
|
|
{
|
|
if (type == HUB_TYPE_FARM_STATIC)
|
|
{
|
|
return _UU("SM_HUB_STATIC");
|
|
}
|
|
else if (type == HUB_TYPE_FARM_DYNAMIC)
|
|
{
|
|
return _UU("SM_HUB_DYNAMIC");
|
|
}
|
|
return _UU("SM_HUB_STANDALONE");
|
|
}
|
|
|
|
// Get a string of the type of server
|
|
wchar_t *GetServerTypeStr(UINT type)
|
|
{
|
|
if (type == SERVER_TYPE_FARM_CONTROLLER)
|
|
{
|
|
return _UU("SM_FARM_CONTROLLER");
|
|
}
|
|
else if (type == SERVER_TYPE_FARM_MEMBER)
|
|
{
|
|
return _UU("SM_FARM_MEMBER");
|
|
}
|
|
return _UU("SM_SERVER_STANDALONE");
|
|
}
|
|
|
|
// ServerStatusGet command
|
|
UINT PsServerStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret;
|
|
RPC_SERVER_STATUS t;
|
|
wchar_t tmp[MAX_PATH];
|
|
char tmp2[MAX_PATH];
|
|
CT *ct;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
ret = ScGetServerStatus(ps->Rpc, &t);
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
ct = CtNew();
|
|
|
|
CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_1"), false);
|
|
CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_2"), false);
|
|
|
|
// Type of server
|
|
CtInsert(ct, _UU("SM_ST_SERVER_TYPE"),
|
|
t.ServerType == SERVER_TYPE_STANDALONE ? _UU("SM_SERVER_STANDALONE") :
|
|
t.ServerType == SERVER_TYPE_FARM_MEMBER ? _UU("SM_FARM_MEMBER") : _UU("SM_FARM_CONTROLLER"));
|
|
|
|
// Number of TCP connections
|
|
UniToStru(tmp, t.NumTcpConnections);
|
|
CtInsert(ct, _UU("SM_ST_NUM_TCP"), tmp);
|
|
|
|
if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
|
|
{
|
|
// Number of local TCP connections
|
|
UniToStru(tmp, t.NumTcpConnectionsLocal);
|
|
CtInsert(ct, _UU("SM_ST_NUM_TCP_LOCAL"), tmp);
|
|
|
|
// Number of remote TCP connections
|
|
UniToStru(tmp, t.NumTcpConnectionsRemote);
|
|
CtInsert(ct, _UU("SM_ST_NUM_TCP_REMOTE"), tmp);
|
|
}
|
|
|
|
// Number of Virtual HUBs
|
|
UniToStru(tmp, t.NumHubTotal);
|
|
CtInsert(ct, _UU("SM_ST_NUM_HUB_TOTAL"), tmp);
|
|
|
|
if (t.ServerType != SERVER_TYPE_STANDALONE)
|
|
{
|
|
// Number of static HUBs
|
|
UniToStru(tmp, t.NumHubStatic);
|
|
CtInsert(ct, _UU("SM_ST_NUM_HUB_STATIC"), tmp);
|
|
|
|
// Number of dynamic HUBs
|
|
UniToStru(tmp, t.NumHubDynamic);
|
|
CtInsert(ct, _UU("SM_ST_NUM_HUB_DYNAMIC"), tmp);
|
|
}
|
|
|
|
// Number of sessions
|
|
UniToStru(tmp, t.NumSessionsTotal);
|
|
CtInsert(ct, _UU("SM_ST_NUM_SESSION_TOTAL"), tmp);
|
|
|
|
if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
|
|
{
|
|
// Number of local sessions
|
|
UniToStru(tmp, t.NumSessionsLocal);
|
|
CtInsert(ct, _UU("SM_ST_NUM_SESSION_LOCAL"), tmp);
|
|
|
|
// Number of remote sessions
|
|
UniToStru(tmp, t.NumSessionsRemote);
|
|
CtInsert(ct, _UU("SM_ST_NUM_SESSION_REMOTE"), tmp);
|
|
}
|
|
|
|
// Number of MAC tables
|
|
UniToStru(tmp, t.NumMacTables);
|
|
CtInsert(ct, _UU("SM_ST_NUM_MAC_TABLE"), tmp);
|
|
|
|
// Number of IP tables
|
|
UniToStru(tmp, t.NumIpTables);
|
|
CtInsert(ct, _UU("SM_ST_NUM_IP_TABLE"), tmp);
|
|
|
|
// Number of users
|
|
UniToStru(tmp, t.NumUsers);
|
|
CtInsert(ct, _UU("SM_ST_NUM_USERS"), tmp);
|
|
|
|
// Number of groups
|
|
UniToStru(tmp, t.NumGroups);
|
|
CtInsert(ct, _UU("SM_ST_NUM_GROUPS"), tmp);
|
|
|
|
// Number of assigned licenses
|
|
UniToStru(tmp, t.AssignedClientLicenses);
|
|
CtInsert(ct, _UU("SM_ST_CLIENT_LICENSE"), tmp);
|
|
|
|
UniToStru(tmp, t.AssignedBridgeLicenses);
|
|
CtInsert(ct, _UU("SM_ST_BRIDGE_LICENSE"), tmp);
|
|
|
|
if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)
|
|
{
|
|
UniToStru(tmp, t.AssignedClientLicensesTotal);
|
|
CtInsert(ct, _UU("SM_ST_CLIENT_LICENSE_EX"), tmp);
|
|
|
|
UniToStru(tmp, t.AssignedBridgeLicensesTotal);
|
|
CtInsert(ct, _UU("SM_ST_BRIDGE_LICENSE_EX"), tmp);
|
|
}
|
|
|
|
// Traffic
|
|
CmdInsertTrafficInfo(ct, &t.Traffic);
|
|
|
|
// Server start-up time
|
|
GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.StartTime), NULL);
|
|
CtInsert(ct, _UU("SM_ST_START_TIME"), tmp);
|
|
|
|
// Current time
|
|
GetDateTimeStrMilli64(tmp2, sizeof(tmp2), SystemToLocal64(t.CurrentTime));
|
|
StrToUni(tmp, sizeof(tmp), tmp2);
|
|
CtInsert(ct, _UU("SM_ST_CURRENT_TIME"), tmp);
|
|
|
|
// Tick value
|
|
UniFormat(tmp, sizeof(tmp), L"%I64u", t.CurrentTick);
|
|
CtInsert(ct, _UU("SM_ST_CURRENT_TICK"), tmp);
|
|
|
|
// Memory information
|
|
if (t.MemInfo.TotalMemory != 0)
|
|
{
|
|
char vv[128];
|
|
|
|
ToStr3(vv, sizeof(vv), t.MemInfo.TotalMemory);
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
|
|
CtInsert(ct, _UU("SM_ST_TOTAL_MEMORY"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), t.MemInfo.UsedMemory);
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
|
|
CtInsert(ct, _UU("SM_ST_USED_MEMORY"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), t.MemInfo.FreeMemory);
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
|
|
CtInsert(ct, _UU("SM_ST_FREE_MEMORY"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), t.MemInfo.TotalPhys);
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
|
|
CtInsert(ct, _UU("SM_ST_TOTAL_PHYS"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), t.MemInfo.UsedPhys);
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
|
|
CtInsert(ct, _UU("SM_ST_USED_PHYS"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), t.MemInfo.FreePhys);
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);
|
|
CtInsert(ct, _UU("SM_ST_FREE_PHYS"), tmp);
|
|
}
|
|
|
|
CtFree(ct, c);
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Add traffic information to LVB
|
|
void CmdInsertTrafficInfo(CT *ct, TRAFFIC *t)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
char vv[128];
|
|
// Validate arguments
|
|
if (ct == NULL || t == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Transmission information
|
|
ToStr3(vv, sizeof(vv), t->Send.UnicastCount);
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);
|
|
CtInsert(ct, _UU("SM_ST_SEND_UCAST_NUM"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), t->Send.UnicastBytes);
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);
|
|
CtInsert(ct, _UU("SM_ST_SEND_UCAST_SIZE"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), t->Send.BroadcastCount);
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);
|
|
CtInsert(ct, _UU("SM_ST_SEND_BCAST_NUM"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), t->Send.BroadcastBytes);
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);
|
|
CtInsert(ct, _UU("SM_ST_SEND_BCAST_SIZE"), tmp);
|
|
|
|
// Reception information
|
|
ToStr3(vv, sizeof(vv), t->Recv.UnicastCount);
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);
|
|
CtInsert(ct, _UU("SM_ST_RECV_UCAST_NUM"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), t->Recv.UnicastBytes);
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);
|
|
CtInsert(ct, _UU("SM_ST_RECV_UCAST_SIZE"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), t->Recv.BroadcastCount);
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);
|
|
CtInsert(ct, _UU("SM_ST_RECV_BCAST_NUM"), tmp);
|
|
|
|
ToStr3(vv, sizeof(vv), t->Recv.BroadcastBytes);
|
|
UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);
|
|
CtInsert(ct, _UU("SM_ST_RECV_BCAST_SIZE"), tmp);
|
|
}
|
|
|
|
// Input a port number
|
|
wchar_t *CmdPromptPort(CONSOLE *c, void *param)
|
|
{
|
|
wchar_t *prompt_str;
|
|
|
|
if (param != NULL)
|
|
{
|
|
prompt_str = (wchar_t *)param;
|
|
}
|
|
else
|
|
{
|
|
prompt_str = _UU("CMD_PROMPT_PORT");
|
|
}
|
|
|
|
return c->ReadLine(c, prompt_str, true);
|
|
}
|
|
|
|
// Verify the port number
|
|
bool CmdEvalPort(CONSOLE *c, wchar_t *str, void *param)
|
|
{
|
|
UINT i;
|
|
// Validate arguments
|
|
if (c == NULL || str == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
i = UniToInt(str);
|
|
|
|
if (i >= 1 && i <= 65535)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
c->Write(c, _UU("CMD_EVAL_PORT"));
|
|
|
|
return false;
|
|
}
|
|
|
|
// ListenerCreate command
|
|
UINT PsListenerCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
PS *ps = (PS *)param;
|
|
UINT ret;
|
|
RPC_LISTENER t;
|
|
PARAM args[] =
|
|
{
|
|
{"[port]", CmdPromptPort, _UU("CMD_ListenerCreate_PortPrompt"), CmdEvalPort, NULL},
|
|
};
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
Zero(&t, sizeof(t));
|
|
t.Enable = true;
|
|
t.Port = ToInt(GetParamStr(o, "[port]"));
|
|
|
|
ret = ScCreateListener(ps->Rpc, &t);
|
|
|
|
if (ret != ERR_NO_ERROR)
|
|
{
|
|
CmdPrintError(c, ret);
|
|
FreeParamValueList(o);
|
|
return ret;
|
|
}
|
|
|
|
FreeParamValueList(o);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// About command
|
|
UINT PsAbout(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
BUF *b;
|
|
|
|
o = ParseCommandList(c, cmd_name, str, NULL, 0);
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
b = ReadDump("|legal.txt");
|
|
|
|
CmdPrintAbout(c);
|
|
c->Write(c, L"\r\n");
|
|
|
|
if (b != NULL)
|
|
{
|
|
wchar_t *s;
|
|
|
|
SeekBufToEnd(b);
|
|
WriteBufChar(b, 13);
|
|
WriteBufChar(b, 10);
|
|
WriteBufChar(b, 0);
|
|
|
|
s = CopyUtfToUni(b->Buf);
|
|
|
|
c->Write(c, s);
|
|
|
|
Free(s);
|
|
}
|
|
|
|
// Display the version information
|
|
c->Write(c, _UU("D_ABOUT@S_INFO3"));
|
|
c->Write(c, L"\r\n");
|
|
c->Write(c, _UU("D_ABOUT@S_INFO4"));
|
|
c->Write(c, L"\r\n");
|
|
CmdPrintAbout(c);
|
|
c->Write(c, L"\r\n");
|
|
|
|
FreeParamValueList(o);
|
|
|
|
FreeBuf(b);
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Creat a new server management context
|
|
PS *NewPs(CONSOLE *c, RPC *rpc, char *servername, UINT serverport, char *hubname, char *adminhub, wchar_t *cmdline)
|
|
{
|
|
PS *ps;
|
|
// Validate arguments
|
|
if (c == NULL || rpc == NULL || servername == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
if (IsEmptyStr(hubname))
|
|
{
|
|
hubname = NULL;
|
|
}
|
|
if (IsEmptyStr(adminhub))
|
|
{
|
|
adminhub = NULL;
|
|
}
|
|
if (UniIsEmptyStr(cmdline))
|
|
{
|
|
cmdline = NULL;
|
|
}
|
|
|
|
ps = ZeroMalloc(sizeof(PS));
|
|
ps->ConsoleForServer = true;
|
|
ps->ServerPort = serverport;
|
|
ps->ServerName = CopyStr(servername);
|
|
ps->Console = c;
|
|
ps->Rpc = rpc;
|
|
ps->HubName = CopyStr(hubname);
|
|
ps->LastError = 0;
|
|
ps->AdminHub = CopyStr(adminhub);
|
|
ps->CmdLine = CopyUniStr(cmdline);
|
|
|
|
return ps;
|
|
}
|
|
|
|
// Release the server management context
|
|
void FreePs(PS *ps)
|
|
{
|
|
// Validate arguments
|
|
if (ps == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Free(ps->HubName);
|
|
Free(ps->AdminHub);
|
|
Free(ps->CmdLine);
|
|
Free(ps->ServerName);
|
|
|
|
Free(ps);
|
|
}
|
|
|
|
// Server Administration Tool
|
|
UINT PsConnect(CONSOLE *c, char *host, UINT port, char *hub, char *adminhub, wchar_t *cmdline, char *password)
|
|
{
|
|
UINT retcode = 0;
|
|
RPC *rpc = NULL;
|
|
CEDAR *cedar;
|
|
CLIENT_OPTION o;
|
|
UCHAR hashed_password[SHA1_SIZE];
|
|
bool b = false;
|
|
// Validate arguments
|
|
if (c == NULL || host == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
if (port == 0)
|
|
{
|
|
port = 443;
|
|
}
|
|
if (hub != NULL)
|
|
{
|
|
adminhub = NULL;
|
|
}
|
|
|
|
cedar = NewCedar(NULL, NULL);
|
|
|
|
Zero(&o, sizeof(o));
|
|
UniStrCpy(o.AccountName, sizeof(o.AccountName), L"VPNCMD");
|
|
StrCpy(o.Hostname, sizeof(o.Hostname), host);
|
|
UINT i = SearchStrEx(o.Hostname, "/", 0, false);
|
|
if (i != INFINITE)
|
|
{
|
|
StrCpy(o.HintStr, sizeof(o.HintStr), o.Hostname + i + 1);
|
|
o.Hostname[i] = 0;
|
|
}
|
|
o.Port = port;
|
|
o.ProxyType = PROXY_DIRECT;
|
|
|
|
Sha0(hashed_password, password, StrLen(password));
|
|
|
|
if (IsEmptyStr(password) == false)
|
|
{
|
|
b = true;
|
|
}
|
|
|
|
// Connect
|
|
while (true)
|
|
{
|
|
UINT err;
|
|
|
|
rpc = AdminConnectEx(cedar, &o, hub, hashed_password, &err, CEDAR_CUI_STR);
|
|
if (rpc == NULL)
|
|
{
|
|
// Failure
|
|
retcode = err;
|
|
|
|
if (err == ERR_ACCESS_DENIED && c->ProgrammingMode == false)
|
|
{
|
|
char *pass;
|
|
// Password is incorrect
|
|
if (b)
|
|
{
|
|
// Input the password
|
|
c->Write(c, _UU("CMD_VPNCMD_PASSWORD_1"));
|
|
}
|
|
|
|
b = true;
|
|
|
|
pass = c->ReadPassword(c, _UU("CMD_VPNCMD_PASSWORD_2"));
|
|
c->Write(c, L"");
|
|
|
|
if (pass != NULL)
|
|
{
|
|
Sha0(hashed_password, pass, StrLen(pass));
|
|
Free(pass);
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Other errors
|
|
CmdPrintError(c, err);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
PS *ps;
|
|
|
|
// Success
|
|
ps = NewPs(c, rpc, o.Hostname, port, hub, adminhub, cmdline);
|
|
PsMain(ps);
|
|
retcode = ps->LastError;
|
|
FreePs(ps);
|
|
AdminDisconnect(rpc);
|
|
break;
|
|
}
|
|
}
|
|
|
|
ReleaseCedar(cedar);
|
|
|
|
return retcode;
|
|
}
|
|
|
|
// Display the error
|
|
void CmdPrintError(CONSOLE *c, UINT err)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
// Validate arguments
|
|
if (c == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_ERROR"),
|
|
err, GetUniErrorStr(err));
|
|
c->Write(c, tmp);
|
|
|
|
if (err == ERR_DISCONNECTED)
|
|
{
|
|
c->Write(c, _UU("CMD_DISCONNECTED_MSG"));
|
|
}
|
|
}
|
|
|
|
// Display the version information
|
|
void CmdPrintAbout(CONSOLE *c)
|
|
{
|
|
CEDAR *cedar;
|
|
wchar_t tmp[MAX_SIZE];
|
|
char exe[MAX_PATH];
|
|
// Validate arguments
|
|
if (c == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
cedar = NewCedar(NULL, NULL);
|
|
|
|
GetExeName(exe, sizeof(exe));
|
|
|
|
UniFormat(tmp, sizeof(tmp), _UU("CMD_VPNCMD_ABOUT"),
|
|
cedar->VerString, cedar->BuildInfo);
|
|
|
|
c->Write(c, tmp);
|
|
|
|
// Showing an explanation of the purpose of the Developer Edition and the difference from the Stable Editon by Daiyuu Nobori
|
|
/*
|
|
* Welcome to the Developer Edition of SoftEther VPN.
|
|
|
|
Please note: SoftEther VPN Developer Edition (Version 5.x) has accepted
|
|
great code contributions on GitHub from many excellent open source
|
|
developers. This edition contains some very bright experimental code.
|
|
The experimental code in this Developer Edition has *NOT* been fully
|
|
reviewed by Daiyuu Nobori (the first original author of SoftEther VPN)
|
|
and has not been endorsed by him for stability and quality. It is his
|
|
policy to encourage many developers to contribute code with their
|
|
creative minds and ambitions. The succession of low-level system
|
|
software and network developers is of critical importance worldwide,
|
|
and SoftEther VPN Developer Edition is very important to increase
|
|
the number of such great developers.
|
|
- If you are a programmer of VPN software, or if you want a variety of
|
|
experimental code, this edition is very suitable for you.
|
|
- On the other hand, if you are building VPNs for mission-critical
|
|
business systems that require stability and security,
|
|
Stable Edition (Version 4.x) is highly recommended.
|
|
- All code in Stable Edition is reviewed by Daiyuu Nobori. He is also
|
|
responsible for porting features from the Developer Edition
|
|
to the Stable Edition.
|
|
- SoftEther VPN Stable Edition can be downloaded at:
|
|
https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/
|
|
*/
|
|
c->Write(c, L"\nWelcome to the Developer Edition of SoftEther VPN.\n\nPlease note: SoftEther VPN Developer Edition (Version 5.x) has accepted\ngreat code contributions on GitHub from many excellent open source\ndevelopers. This edition contains some very bright experimental code.\n The experimental code in this Developer Edition has *NOT* been fully\nreviewed by Daiyuu Nobori (the first original author of SoftEther VPN)\nand has not been endorsed by him for stability and quality. It is his\npolicy to encourage many developers to contribute code with their\ncreative minds and ambitions. The succession of low-level system\nsoftware and network developers is of critical importance worldwide,\nand SoftEther VPN Developer Edition is very important to increase\nthe number of such great developers.\n- If you are a programmer of VPN software, or if you want a variety of\n experimental code, this edition is very suitable for you.\n- On the other hand, if you are building VPNs for mission-critical\n business systems that require stability and security,\n Stable Edition (Version 4.x) is highly recommended.\n- All code in Stable Edition is reviewed by Daiyuu Nobori. He is also\n responsible for porting features from the Developer Edition\n to the Stable Edition.\n- SoftEther VPN Stable Edition can be downloaded at:\n https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/\n\n");
|
|
|
|
ReleaseCedar(cedar);
|
|
}
|
|
|
|
// Parse the host name and port number (Separated by @)
|
|
bool ParseHostPortAtmark(char *src, char **host, UINT *port, UINT default_port)
|
|
{
|
|
TOKEN_LIST *t;
|
|
bool ret = false;
|
|
// Validate arguments
|
|
if (src == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
t = ParseToken(src, "@");
|
|
if (t == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (port != NULL)
|
|
{
|
|
*port = 0;
|
|
}
|
|
|
|
if (default_port == 0)
|
|
{
|
|
if (t->NumTokens < 2)
|
|
{
|
|
FreeToken(t);
|
|
return false;
|
|
}
|
|
|
|
if (ToInt(t->Token[1]) == 0)
|
|
{
|
|
FreeToken(t);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (t->NumTokens >= 2 && ToInt(t->Token[1]) == 0)
|
|
{
|
|
FreeToken(t);
|
|
return false;
|
|
}
|
|
|
|
if (t->NumTokens >= 1 && IsEmptyStr(t->Token[0]) == false)
|
|
{
|
|
ret = true;
|
|
|
|
if (host != NULL)
|
|
{
|
|
*host = CopyStr(t->Token[0]);
|
|
Trim(*host);
|
|
}
|
|
|
|
if (t->NumTokens >= 2)
|
|
{
|
|
if (port != NULL)
|
|
{
|
|
*port = ToInt(t->Token[1]);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (port != NULL)
|
|
{
|
|
if (*port == 0)
|
|
{
|
|
*port = default_port;
|
|
}
|
|
}
|
|
|
|
FreeToken(t);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Parse the host name and port number
|
|
bool ParseHostPort(char *src, char **host, UINT *port, UINT default_port)
|
|
{
|
|
TOKEN_LIST *t;
|
|
bool ret = false;
|
|
// Validate arguments
|
|
if (src == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (StartWith(src, "["))
|
|
{
|
|
if (InStr(src, "]"))
|
|
{
|
|
// Format of [target]:port
|
|
UINT i, n;
|
|
char tmp[MAX_SIZE];
|
|
|
|
StrCpy(tmp, sizeof(tmp), src);
|
|
|
|
n = SearchStrEx(tmp, "]", 0, false);
|
|
if (n != INFINITE)
|
|
{
|
|
UINT len = StrLen(tmp);
|
|
|
|
for (i = n;i < len;i++)
|
|
{
|
|
if (tmp[i] == ':')
|
|
{
|
|
tmp[i] = '@';
|
|
}
|
|
}
|
|
}
|
|
|
|
return ParseHostPortAtmark(tmp, host, port, default_port);
|
|
}
|
|
}
|
|
|
|
if (InStr(src, "@"))
|
|
{
|
|
// It is separated by @
|
|
return ParseHostPortAtmark(src, host, port, default_port);
|
|
}
|
|
|
|
t = ParseToken(src, ":");
|
|
if (t == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (port != NULL)
|
|
{
|
|
*port = 0;
|
|
}
|
|
|
|
if (default_port == 0)
|
|
{
|
|
if (t->NumTokens < 2)
|
|
{
|
|
FreeToken(t);
|
|
return false;
|
|
}
|
|
|
|
if (ToInt(t->Token[1]) == 0)
|
|
{
|
|
FreeToken(t);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (t->NumTokens >= 2 && ToInt(t->Token[1]) == 0)
|
|
{
|
|
FreeToken(t);
|
|
return false;
|
|
}
|
|
|
|
if (t->NumTokens >= 1 && IsEmptyStr(t->Token[0]) == false)
|
|
{
|
|
ret = true;
|
|
|
|
if (host != NULL)
|
|
{
|
|
*host = CopyStr(t->Token[0]);
|
|
Trim(*host);
|
|
}
|
|
|
|
if (t->NumTokens >= 2)
|
|
{
|
|
if (port != NULL)
|
|
{
|
|
*port = ToInt(t->Token[1]);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (port != NULL)
|
|
{
|
|
if (*port == 0)
|
|
{
|
|
*port = default_port;
|
|
}
|
|
}
|
|
|
|
FreeToken(t);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// Vpncmd command procedure
|
|
UINT VpnCmdProc(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)
|
|
{
|
|
LIST *o;
|
|
char *target;
|
|
bool server = false;
|
|
bool client = false;
|
|
bool tools = false;
|
|
char *hostname = NULL;
|
|
char *password;
|
|
wchar_t *cmdline;
|
|
bool host_inputted = false;
|
|
UINT port = 0;
|
|
UINT retcode = 0;
|
|
PARAM args[] =
|
|
{
|
|
{"[host:port]", NULL, NULL, NULL, NULL},
|
|
{"CLIENT", NULL, NULL, NULL, NULL},
|
|
{"SERVER", NULL, NULL, NULL, NULL},
|
|
{"TOOLS", NULL, NULL, NULL, NULL},
|
|
{"HUB", NULL, NULL, NULL, NULL},
|
|
{"ADMINHUB", NULL, NULL, NULL, NULL},
|
|
{"PASSWORD", NULL, NULL, NULL, NULL},
|
|
{"IN", NULL, NULL, NULL, NULL},
|
|
{"OUT", NULL, NULL, NULL, NULL},
|
|
{"CMD", NULL, NULL, NULL, NULL},
|
|
{"CSV", NULL, NULL, NULL, NULL},
|
|
{"PROGRAMMING", NULL, NULL, NULL, NULL},
|
|
};
|
|
|
|
#ifdef OS_WIN32
|
|
if (UniStrCmpi(str, L"/debug") == 0)
|
|
{
|
|
// Debug information write mode
|
|
Win32CmdDebug(false);
|
|
return 0;
|
|
}
|
|
if (UniStrCmpi(str, L"/debug_uac") == 0)
|
|
{
|
|
// Debug information write mode
|
|
Win32CmdDebug(true);
|
|
return 0;
|
|
}
|
|
#endif // OS_WIN32
|
|
|
|
if (c->ConsoleType == CONSOLE_LOCAL)
|
|
{
|
|
// Initialize the execute path information
|
|
VpnCmdInitBootPath();
|
|
}
|
|
|
|
if(c->ConsoleType != CONSOLE_CSV)
|
|
{
|
|
CmdPrintAbout(c);
|
|
c->Write(c, L"");
|
|
}
|
|
|
|
o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));
|
|
|
|
if (o == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Specification of the mode of Tools or Server or Client
|
|
if ((GetParamStr(o, "CLIENT") == NULL && GetParamStr(o, "SERVER") == NULL && GetParamStr(o, "TOOLS") == NULL) ||
|
|
(GetParamStr(o, "CLIENT") != NULL && GetParamStr(o, "SERVER") != NULL && GetParamStr(o, "TOOLS") != NULL))
|
|
{
|
|
wchar_t *ret;
|
|
UINT code;
|
|
// The mode of Tools or Server or Client is not specified
|
|
c->Write(c, _UU("CMD_VPNCMD_CS_1"));
|
|
|
|
ret = c->ReadLine(c, _UU("CMD_VPNCMD_CS_2"), true);
|
|
|
|
code = UniToInt(ret);
|
|
Free(ret);
|
|
|
|
switch (code)
|
|
{
|
|
case 1:
|
|
// Server
|
|
server = true;
|
|
break;
|
|
|
|
case 2:
|
|
// Client
|
|
client = true;
|
|
break;
|
|
|
|
case 3:
|
|
// Tools
|
|
tools = true;
|
|
break;
|
|
|
|
default:
|
|
// Unspecified
|
|
FreeParamValueList(o);
|
|
return ERR_USER_CANCEL;
|
|
}
|
|
|
|
c->Write(c, L"");
|
|
}
|
|
else
|
|
{
|
|
if (GetParamStr(o, "SERVER") != NULL)
|
|
{
|
|
server = true;
|
|
}
|
|
else if (GetParamStr(o, "CLIENT") != NULL)
|
|
{
|
|
client = true;
|
|
}
|
|
else
|
|
{
|
|
tools = true;
|
|
}
|
|
}
|
|
|
|
// Destination host name
|
|
target = CopyStr(GetParamStr(o, "[host:port]"));
|
|
|
|
if (target == NULL && tools == false)
|
|
{
|
|
wchar_t *str;
|
|
// Input a host name
|
|
if (server)
|
|
{
|
|
c->Write(c, _UU("CMD_VPNCMD_HOST_1"));
|
|
}
|
|
else if (client)
|
|
{
|
|
c->Write(c, _UU("CMD_VPNCMD_HOST_2"));
|
|
}
|
|
|
|
str = c->ReadLine(c, _UU("CMD_VPNCMD_HOST_3"), true);
|
|
c->Write(c, L"");
|
|
target = CopyUniToStr(str);
|
|
Free(str);
|
|
|
|
if (target == NULL)
|
|
{
|
|
// Cancel
|
|
FreeParamValueList(o);
|
|
return ERR_USER_CANCEL;
|
|
}
|
|
|
|
if (IsEmptyStr(target))
|
|
{
|
|
Free(target);
|
|
target = CopyStr("localhost");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// User specifies a host name
|
|
host_inputted = true;
|
|
}
|
|
|
|
if (tools == false)
|
|
{
|
|
if (ParseHostPort(target, &hostname, &port, 443) == false)
|
|
{
|
|
c->Write(c, _UU("CMD_MSG_INVALID_HOSTNAME"));
|
|
Free(target);
|
|
FreeParamValueList(o);
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
}
|
|
|
|
// Password
|
|
password = GetParamStr(o, "PASSWORD");
|
|
if (password == NULL)
|
|
{
|
|
password = "";
|
|
}
|
|
|
|
// Command line
|
|
cmdline = GetParamUniStr(o, "CMD");
|
|
|
|
if (server)
|
|
{
|
|
// Process as the server
|
|
char *hub;
|
|
char *adminhub = NULL;
|
|
|
|
hub = CopyStr(GetParamStr(o, "HUB"));
|
|
adminhub = GetParamStr(o, "ADMINHUB");
|
|
|
|
// Decide the Virtual HUB to be specified in the Virtual HUB management mode
|
|
if (hub == NULL)
|
|
{
|
|
if (host_inputted == false)
|
|
{
|
|
wchar_t *s;
|
|
// If the user does not specify a host name on the command line,
|
|
// get also a Virtual HUB name by displaying the prompt
|
|
c->Write(c, _UU("CMD_VPNCMD_HUB_1"));
|
|
|
|
s = c->ReadLine(c, _UU("CMD_VPNCMD_HUB_2"), true);
|
|
|
|
hub = CopyUniToStr(s);
|
|
Free(s);
|
|
}
|
|
}
|
|
|
|
if (IsEmptyStr(hub))
|
|
{
|
|
Free(hub);
|
|
hub = NULL;
|
|
}
|
|
if (IsEmptyStr(adminhub))
|
|
{
|
|
adminhub = NULL;
|
|
}
|
|
|
|
retcode = PsConnect(c, hostname, port, hub, adminhub, cmdline, password);
|
|
|
|
Free(hub);
|
|
}
|
|
else if (client)
|
|
{
|
|
// Treated as a client
|
|
Trim(target);
|
|
|
|
retcode = PcConnect(c, target, cmdline, password);
|
|
}
|
|
else if (tools)
|
|
{
|
|
// Treated as a VPN Tools
|
|
retcode = PtConnect(c, cmdline);
|
|
}
|
|
|
|
Free(hostname);
|
|
Free(target);
|
|
FreeParamValueList(o);
|
|
|
|
return retcode;
|
|
}
|
|
|
|
// Entry point of vpncmd
|
|
UINT CommandMain(wchar_t *command_line)
|
|
{
|
|
UINT ret = 0;
|
|
wchar_t *infile, *outfile;
|
|
char *a_infile, *a_outfile;
|
|
wchar_t *csvmode;
|
|
wchar_t *programming_mode;
|
|
CONSOLE *c;
|
|
|
|
// Validate arguments
|
|
if (command_line == NULL)
|
|
{
|
|
return ERR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// Look ahead only items of /in and /out
|
|
infile = ParseCommand(command_line, L"in");
|
|
outfile = ParseCommand(command_line, L"out");
|
|
if (UniIsEmptyStr(infile))
|
|
{
|
|
Free(infile);
|
|
infile = NULL;
|
|
}
|
|
if (UniIsEmptyStr(outfile))
|
|
{
|
|
Free(outfile);
|
|
outfile = NULL;
|
|
}
|
|
|
|
a_infile = CopyUniToStr(infile);
|
|
a_outfile = CopyUniToStr(outfile);
|
|
|
|
// Allocate the local console
|
|
c = NewLocalConsole(infile, outfile);
|
|
if (c != NULL)
|
|
{
|
|
// Definition of commands of vpncmd
|
|
CMD cmd[] =
|
|
{
|
|
{"vpncmd", VpnCmdProc},
|
|
};
|
|
|
|
// Read ahead to check the CSV mode
|
|
csvmode = ParseCommand(command_line, L"csv");
|
|
if(csvmode != NULL)
|
|
{
|
|
Free(csvmode);
|
|
c->ConsoleType = CONSOLE_CSV;
|
|
}
|
|
|
|
programming_mode = ParseCommand(command_line, L"programming");
|
|
if (programming_mode != NULL)
|
|
{
|
|
Free(programming_mode);
|
|
c->ProgrammingMode = true;
|
|
}
|
|
|
|
if (DispatchNextCmdEx(c, command_line, ">", cmd, sizeof(cmd) / sizeof(cmd[0]), NULL) == false)
|
|
{
|
|
ret = ERR_INVALID_PARAMETER;
|
|
}
|
|
else
|
|
{
|
|
ret = c->RetCode;
|
|
}
|
|
|
|
// Release the local console
|
|
c->Free(c);
|
|
}
|
|
else
|
|
{
|
|
Print("Error: Couldn't open local console.\n");
|
|
}
|
|
|
|
Free(a_infile);
|
|
Free(a_outfile);
|
|
Free(infile);
|
|
Free(outfile);
|
|
|
|
return ret;
|
|
}
|
|
|
|
#ifdef OS_WIN32
|
|
// Debug information write mode
|
|
void Win32CmdDebug(bool is_uac)
|
|
{
|
|
wchar_t *dst;
|
|
wchar_t def_filename[MAX_SIZE];
|
|
SYSTEMTIME st;
|
|
|
|
InitWinUi(_UU("CMD_DEBUG_SOFTNAME"), NULL, 0);
|
|
|
|
UniPrint(_UU("CMD_DEBUG_PRINT"));
|
|
|
|
if (is_uac && MsIsAdmin() == false)
|
|
{
|
|
MsgBox(NULL, 0x00000040L, _UU("CMD_DEBUG_NOT_ADMIN"));
|
|
goto LABEL_CLEANUP;
|
|
}
|
|
|
|
if (MsIsAdmin() == false)
|
|
{
|
|
void *process_handle = NULL;
|
|
|
|
// Launch myself using the UAC
|
|
if (MsExecuteEx2W(MsGetExeFileNameW(), L"/debug_uac", &process_handle, true) == false)
|
|
{
|
|
MsgBox(NULL, 0x00000030L, _UU("CMD_DEBUG_UAC_FAILED"));
|
|
return;
|
|
}
|
|
|
|
MsCloseHandle(process_handle);
|
|
goto LABEL_CLEANUP;
|
|
}
|
|
|
|
LocalTime(&st);
|
|
|
|
UniFormat(def_filename, sizeof(def_filename), L"vpn_debuginfo_%04u%02u%02u_%02u%02u%02u.zip",
|
|
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
|
|
|
|
// Specify the destination
|
|
dst = SaveDlg(NULL, _UU("DLG_ZIP_FILER"), _UU("CMD_DEBUG_SAVE_TITLE"), def_filename, L".zip");
|
|
if (dst != NULL)
|
|
{
|
|
if (MsSaveSystemInfo(dst) == false)
|
|
{
|
|
// Failure
|
|
MsgBoxEx(NULL, 0x00000030L, _UU("CMD_DEBUG_NG"), dst);
|
|
}
|
|
else
|
|
{
|
|
// Success
|
|
MsgBoxEx(NULL, 0x00000040L, _UU("CMD_DEBUG_OK"), dst);
|
|
}
|
|
|
|
Free(dst);
|
|
}
|
|
|
|
LABEL_CLEANUP:
|
|
FreeWinUi();
|
|
}
|
|
|
|
#endif // OS_WIN32
|
|
|