1
0
mirror of https://github.com/SoftEtherVPN/SoftEtherVPN.git synced 2024-11-22 09:29:52 +03:00
SoftEtherVPN/src/Cedar/Command.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