1
0
mirror of https://github.com/SoftEtherVPN/SoftEtherVPN.git synced 2024-11-25 19:09:52 +03:00
SoftEtherVPN/src/Cedar/Admin.c
Davide Beatrici 233e28f38c Refactor Base64 functions, encode/decode using OpenSSL's EVP interface
Our own implementation works fine, however we should use OpenSSL's one since we already link to the library.

Base64Decode() and Base64Encode() return the required buffer size when "dst" is NULL.

This allows to efficiently allocate a buffer, without wasting memory or risking an overflow.

Base64FromBin() and Base64ToBin() perform all steps, returning a heap-allocated buffer with the data in it.
2021-07-02 09:24:41 +02:00

15695 lines
360 KiB
C

// SoftEther VPN Source Code - Developer Edition Master Branch
// Cedar Communication Module
// Admin.c
// RPC Module for Management
#include "Admin.h"
#include "Account.h"
#include "AzureClient.h"
#include "BridgeUnix.h"
#include "BridgeWin32.h"
#include "Connection.h"
#include "DDNS.h"
#include "Layer3.h"
#include "Link.h"
#include "Listener.h"
#include "Nat.h"
#include "Remote.h"
#include "Proto.h"
#include "Proto_IPsec.h"
#include "Proto_OpenVPN.h"
#include "Proto_PPP.h"
#include "Protocol.h"
#include "Sam.h"
#include "SecureNAT.h"
#include "Server.h"
#include "Session.h"
#include "Virtual.h"
#include "Wpc.h"
#include "Mayaqua/Cfg.h"
#include "Mayaqua/FileIO.h"
#include "Mayaqua/Internat.h"
#include "Mayaqua/HTTP.h"
#include "Mayaqua/Memory.h"
#include "Mayaqua/Microsoft.h"
#include "Mayaqua/Object.h"
#include "Mayaqua/Pack.h"
#include "Mayaqua/Str.h"
#include "Mayaqua/Table.h"
#include "Mayaqua/Tick64.h"
// Macro for RPC function declaration
#define DECLARE_RPC_EX(rpc_name, data_type, function, in_rpc, out_rpc, free_rpc) \
else if (StrCmpi(name, rpc_name) == 0) \
{ \
data_type *t; \
t = ZeroMalloc(sizeof(data_type)); \
in_rpc(t, p); \
err = function(a, t); \
if (err == ERR_NO_ERROR) \
{ \
out_rpc(ret, t); \
} \
free_rpc(t); \
Free(t); \
ok = true; \
}
#define DECLARE_RPC(rpc_name, data_type, function, in_rpc, out_rpc) \
else if (StrCmpi(name, rpc_name) == 0) \
{ \
data_type *t; \
t = ZeroMalloc(sizeof(data_type)); \
in_rpc(t, p); \
err = function(a, t); \
if (err == ERR_NO_ERROR) \
{ \
out_rpc(ret, t); \
} \
Free(t); \
ok = true; \
}
#define DECLARE_SC_EX(rpc_name, data_type, function, in_rpc, out_rpc, free_rpc) \
UINT function(RPC *r, data_type *t) \
{ \
PACK *p, *ret; \
UINT err; \
if (r == NULL || t == NULL) \
{ \
return ERR_INTERNAL_ERROR; \
} \
p = NewPack(); \
out_rpc(p, t); \
free_rpc(t); \
Zero(t, sizeof(data_type)); \
ret = AdminCall(r, rpc_name, p); \
err = GetErrorFromPack(ret); \
if (err == ERR_NO_ERROR) \
{ \
in_rpc(t, ret); \
} \
FreePack(ret); \
return err; \
}
#define DECLARE_SC(rpc_name, data_type, function, in_rpc, out_rpc) \
UINT function(RPC *r, data_type *t) \
{ \
PACK *p, *ret; \
UINT err; \
if (r == NULL || t == NULL) \
{ \
return ERR_INTERNAL_ERROR; \
} \
p = NewPack(); \
out_rpc(p, t); \
ret = AdminCall(r, rpc_name, p); \
err = GetErrorFromPack(ret); \
if (err == ERR_NO_ERROR) \
{ \
in_rpc(t, ret); \
} \
FreePack(ret); \
return err; \
}
#define CHECK_RIGHT \
if (a->ServerAdmin == false && (StrCmpi(a->HubName, t->HubName) != 0)) \
return ERR_NOT_ENOUGH_RIGHT; \
if (IsEmptyStr(t->HubName)) \
return ERR_INVALID_PARAMETER;
#define SERVER_ADMIN_ONLY \
if (a->ServerAdmin == false) \
return ERR_NOT_ENOUGH_RIGHT;
#define NO_SUPPORT_FOR_BRIDGE \
if (a->Server->Cedar->Bridge) \
return ERR_NOT_SUPPORTED;
// Get server Caps (Guessing from the build number if failed to get Caps)
CAPSLIST *ScGetCapsEx(RPC *rpc)
{
RPC_SERVER_INFO info;
CAPSLIST *t;
bool is_bridge = false;
// Validate arguments
if (rpc == NULL)
{
return NULL;
}
Zero(&info, sizeof(info));
ScGetServerInfo(rpc, &info);
t = ZeroMalloc(sizeof(CAPSLIST));
// Try to get Caps by RPC
if (ScGetCaps(rpc, t) != ERR_NO_ERROR)
{
UINT build;
Free(t);
t = NewCapsList();
// Since acquisition of Caps went wrong, get build number
build = info.ServerBuildInt;
is_bridge = (SearchStrEx(info.ServerProductName, "bridge", 0, false) == INFINITE) ? false : true;
AddCapsInt(t, "i_max_packet_size", 1514);
if (is_bridge == false)
{
AddCapsInt(t, "i_max_hubs", 4096);
AddCapsInt(t, "i_max_sessions", 4096);
if (info.ServerType != SERVER_TYPE_FARM_MEMBER)
{
AddCapsInt(t, "i_max_users_per_hub", 10000);
AddCapsInt(t, "i_max_groups_per_hub", 10000);
AddCapsInt(t, "i_max_access_lists", 4096);
}
else
{
AddCapsInt(t, "i_max_users_per_hub", 0);
AddCapsInt(t, "i_max_groups_per_hub", 0);
AddCapsInt(t, "i_max_access_lists", 0);
}
}
else
{
AddCapsInt(t, "i_max_hubs", 0);
AddCapsInt(t, "i_max_sessions", 0);
AddCapsInt(t, "i_max_users_per_hub", 0);
AddCapsInt(t, "i_max_groups_per_hub", 0);
AddCapsInt(t, "i_max_access_lists", 0);
}
AddCapsInt(t, "i_max_mac_tables", 10000);
AddCapsInt(t, "i_max_ip_tables", 10000);
if (info.ServerType == SERVER_TYPE_STANDALONE)
{
AddCapsBool(t, "b_support_securenat", (build >= 3600) ? true : false);
AddCapsInt(t, "i_max_secnat_tables", 4096);
}
else
{
AddCapsBool(t, "b_support_securenat", false);
AddCapsInt(t, "i_max_secnat_tables", 0);
}
if (is_bridge)
{
AddCapsBool(t, "b_bridge", true);
}
else if (info.ServerType == SERVER_TYPE_STANDALONE)
{
AddCapsBool(t, "b_standalone", true);
}
else if (info.ServerType == SERVER_TYPE_FARM_CONTROLLER)
{
AddCapsBool(t, "b_cluster_controller", true);
}
else
{
AddCapsBool(t, "b_cluster_member", true);
}
AddCapsBool(t, "b_support_config_hub", info.ServerType != SERVER_TYPE_FARM_MEMBER &&
is_bridge == false);
AddCapsBool(t, "b_vpn_client_connect", is_bridge == false ? true : false);
AddCapsBool(t, "b_support_radius", info.ServerType != SERVER_TYPE_FARM_MEMBER &&
is_bridge == false);
if (build >= 3600)
{
RPC_BRIDGE_SUPPORT b;
Zero(&b, sizeof(b));
if (ScGetBridgeSupport(rpc, &b) == ERR_NO_ERROR)
{
AddCapsBool(t, "b_local_bridge", b.IsBridgeSupportedOs);
AddCapsBool(t, "b_must_install_pcap", b.IsWinPcapNeeded);
}
else
{
AddCapsBool(t, "b_local_bridge", false);
AddCapsBool(t, "b_must_install_pcap", false);
}
}
else
{
AddCapsBool(t, "b_local_bridge", false);
AddCapsBool(t, "b_must_install_pcap", false);
}
AddCapsBool(t, "b_tap_supported", false);
if (info.ServerType == SERVER_TYPE_STANDALONE)
{
AddCapsBool(t, "b_support_cascade", true);
}
else
{
AddCapsBool(t, "b_support_cascade", false);
}
AddCapsBool(t, "b_support_cascade_cert", false);
AddCapsBool(t, "b_support_config_log", info.ServerType != SERVER_TYPE_FARM_MEMBER);
AddCapsBool(t, "b_support_autodelete", false);
}
if (true)
{
TOKEN_LIST *names;
// Fill items that doesn't exist in server-side as false
names = GetTableNameStartWith("CT_b_");
if (names != NULL)
{
UINT i;
for (i = 0;i < names->NumTokens;i++)
{
char *name = names->Token[i] + 3;
if (GetCaps(t, name) == NULL)
{
AddCapsBool(t, name, false);
}
}
FreeToken(names);
}
}
FreeRpcServerInfo(&info);
return t;
}
// Process server side include
BUF *AdminWebProcessServerSideInclude(BUF *src_txt, char *filename, UINT depth)
{
char *src_str;
UINT src_str_size;
UINT i, len;
BUF *ret = NULL;
UINT pos = 0;
char dirname[MAX_PATH];
if (src_txt == NULL || filename == NULL || depth >= 4)
{
return CloneBuf(src_txt);
}
if (EndWith(filename, ".html") == false)
{
// We process only .html files
return CloneBuf(src_txt);
}
GetDirNameFromFilePath(dirname, sizeof(dirname), filename);
src_str_size = src_txt->Size + 1;
src_str = ZeroMalloc(src_str_size);
Copy(src_str, src_txt->Buf, src_txt->Size);
len = StrLen(src_str);
ret = NewBuf();
for (i = 0;i < len;i++)
{
char *start_tag = "<!--#include file=";
bool is_ssi = false;
if (StartWith(src_str + i, start_tag))
{
UINT a = i + StrLen(start_tag);
if (src_str[a] == '\"' || src_str[a] == '\'')
{
char delimier = src_str[a];
char delimier_str[2];
UINT b;
delimier_str[0] = delimier;
delimier_str[1] = 0;
b = SearchStrEx(src_str, delimier_str, i + StrLen(start_tag) + 1, true);
if ((b != INFINITE) && (b >= i + StrLen(start_tag) + 1) && ((b - (i + StrLen(start_tag) + 1)) < 32))
{
char inc_filename[MAX_PATH];
char *end_tag = "-->";
UINT x;
Zero(inc_filename, sizeof(inc_filename));
StrCpy(inc_filename, sizeof(inc_filename), src_str + i + StrLen(start_tag) + 1);
inc_filename[b - (i + StrLen(start_tag) + 1)] = 0;
x = SearchStrEx(src_str, end_tag, b + 1, true);
if ((x != INFINITE) && (x >= (b + 1)))
{
BUF *inc_buf;
char full_inc_filename[MAX_PATH];
if (StartWith(inc_filename, "/"))
{
Format(full_inc_filename, sizeof(full_inc_filename), "|wwwroot/%s", inc_filename + 1);
}
else
{
StrCpy(full_inc_filename, sizeof(full_inc_filename), dirname);
StrCat(full_inc_filename, sizeof(full_inc_filename), "/");
StrCat(full_inc_filename, sizeof(full_inc_filename), inc_filename);
}
Debug("dirname = %s, full_inc_filename (src) = %s\n\n", dirname, full_inc_filename);
NormalizePath(full_inc_filename, sizeof(full_inc_filename), full_inc_filename);
if (StartWith(full_inc_filename, "|wwwroot/") == false
&& StartWith(full_inc_filename, "|wwwroot\\") == false)
{
char tmp[MAX_PATH];
Format(tmp, sizeof(tmp), "|wwwroot/%s", full_inc_filename);
StrCpy(full_inc_filename, sizeof(full_inc_filename), tmp);
}
Debug("inc_filename = %s\nfull_inc_filename = %s\n\n", inc_filename, full_inc_filename);
inc_buf = ReadDump(full_inc_filename);
if (inc_buf != NULL)
{
BUF *inc_buf2;
inc_buf2 = AdminWebProcessServerSideInclude(inc_buf, full_inc_filename, depth + 1);
BufSkipUtf8Bom(inc_buf2);
WriteBufBufWithOffset(ret, inc_buf2);
FreeBuf(inc_buf);
FreeBuf(inc_buf2);
}
else
{
Debug("Loading SSI '%s' error.\n", inc_buf);
}
i = (x + StrLen(end_tag) - 1);
is_ssi = true;
}
}
}
}
if (is_ssi == false)
{
WriteBufChar(ret, src_str[i]);
}
}
Free(src_str);
return ret;
}
// Handle the file request
bool AdminWebHandleFileRequest(ADMIN *a, CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_src, char *query_string, char *virtual_root_dir, char *physical_root_dir)
{
bool ret = false;
char url[MAX_PATH];
UINT i, len;
if (a == NULL || c == NULL || s == NULL || h == NULL || query_string == NULL ||
virtual_root_dir == NULL || physical_root_dir == NULL)
{
return false;
}
StrCpy(url, sizeof(url), url_src);
len = StrLen(url);
for (i = 0;i < len;i++)
{
if (url[i] == '\\')
{
url[i] = '/';
}
}
// Is dangerous URL?
if (InStr(url, "..") || InStr(url, "//") || InStr(url, "\\\\") || InStr(url, "/\\") || InStr(url, "\\/"))
{
ret = AdminWebSend404Error(s, h);
}
else
{
char filename[MAX_PATH];
bool is_index_file = false;
BUF *b = AdminWebTryFindAndReadFile(virtual_root_dir, physical_root_dir, url,
filename, sizeof(filename), &is_index_file);
if (b == NULL)
{
ret = AdminWebSend404Error(s, h);
}
else
{
if (is_index_file && EndWith(url, "/") == false)
{
char url2[MAX_PATH];
StrCpy(url2, sizeof(url2), url);
StrCat(url2, sizeof(url2), "/");
ret = AdminWebSend302Redirect(s, url2, query_string, h);
}
else if (is_index_file == false && EndWith(url, "/"))
{
char url2[MAX_PATH];
TrimEndWith(url2, sizeof(url2), url, "/");
ret = AdminWebSend302Redirect(s, url2, query_string, h);
}
else
{
BUF *b2 = AdminWebProcessServerSideInclude(b, filename, 0);
char *mime = GetMimeTypeFromFileName(filename);
if (mime == NULL)
{
mime = "application/octet-stream";
}
ret = AdminWebSendBody(s, 200, "OK", b2->Buf, b2->Size, mime, NULL, NULL, h);
FreeBuf(b2);
}
FreeBuf(b);
}
}
return ret;
}
// Try to find a file, and if exists return the file contents
BUF *AdminWebTryFindAndReadFile(char *vroot, char *proot, char *url, char *ret_filename, UINT ret_filename_size, bool *is_index_html)
{
char tmp[MAX_PATH];
char tmp2[MAX_PATH];
UINT vroot_len;
UINT url_len;
char relative_path[MAX_PATH];
BUF *b;
if (vroot == NULL || proot == NULL || url == NULL || ret_filename == NULL || is_index_html == NULL)
{
return NULL;
}
*is_index_html = false;
if (StartWith(url, vroot) == false)
{
return NULL;
}
vroot_len = StrLen(vroot);
url_len = StrLen(url);
StrCpy(relative_path, sizeof(relative_path), url + vroot_len);
if (StartWith(relative_path, "/"))
{
char tmp3[MAX_PATH];
StrCpy(tmp3, sizeof(tmp3), relative_path + 1);
StrCpy(relative_path, sizeof(relative_path), tmp3);
}
CombinePath(tmp, sizeof(tmp), proot, relative_path);
// index.html
CombinePath(tmp2, sizeof(tmp2), tmp, "index.html");
b = AdminWebTryOneFile(tmp2, ret_filename, ret_filename_size);
if (b != NULL)
{
*is_index_html = true;
return b;
}
// dirname/filename
StrCpy(tmp2, sizeof(tmp2), tmp);
b = AdminWebTryOneFile(tmp2, ret_filename, ret_filename_size);
if (b != NULL)
{
return b;
}
return NULL;
}
BUF *AdminWebTryOneFile(char *filename, char *ret_filename, UINT ret_filename_size)
{
BUF *b;
if (filename == NULL || ret_filename == NULL)
{
return NULL;
}
b = ReadDump(filename);
if (b == NULL)
{
return NULL;
}
StrCpy(ret_filename, ret_filename_size, filename);
return b;
}
// Send a 401 Unauthorized error
bool AdminWebSendUnauthorized(SOCK *s, HTTP_HEADER *http_request_headers)
{
char *http_401_str = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n<html><head>\r\n<title>401 Unauthorized</title>\r\n</head><body>\r\n<h1>" CEDAR_SERVER_STR ": Administrative authentication required.</h1>\r\n<p>This VPN Server could not verify that you are authorized to access to the \r\nserver in administrative mode.</p>\r\n<p><strong>For web browser logins:<br></strong>You must supply the HTTP basic \r\nauthentication credential as following.</p>\r\n<ul>\r\n\t<li>To login to the VPN server as the entire server administrator, specify empty or &quot;administrator&quot; as the username field, and specify the server administrative \r\n\tpassword as the password field.<br></li>\r\n\t<li>To login to a particular Virtual Hub as the hub administrator, specify \r\n\tthe hub name as the username field, and specify the hub administrative \r\n\tpassword as the password field.</li>\r\n</ul>\r\n<p><strong>For JSON-RPC client logins:<br></strong>Instead to HTTP basic \r\nauthentication, you can also specify the HTTP header parameters as following.</p>\r\n<ul>\r\n\t<li>X-VPNADMIN-HUBNAME: Empty to login to the VPN Server as the entire \r\n\tserver administrator, or specify the target Virtual Hub name as the hub \r\n\tadministrator.</li>\r\n\t<li>X-VPNADMIN-PASSWORD: Specify the administrative password.</li>\r\n</ul>\r\n</body></html>\r\n";
bool ret;
// Validate arguments
if (s == NULL || http_request_headers == NULL)
{
return false;
}
// Creating a Data
ret = AdminWebSendBody(s, 401, "Unauthorized", http_401_str, StrLen(http_401_str), HTTP_CONTENT_TYPE,
"WWW-Authenticate",
"Basic realm=\"Username 'administrator' for entire VPN Server privilege, or specify Virtual Hub name as the username for specified Virtual Hub administrative privilege.\"",
http_request_headers);
return ret;
}
// Send reply
bool AdminWebSendBody(SOCK *s, UINT status_code, char *status_string, UCHAR *data, UINT data_size, char *content_type, char *add_header_name, char *add_header_value,
HTTP_HEADER *request_headers)
{
HTTP_HEADER *h;
char date_str[MAX_SIZE];
char error_code_str[16];
bool ret = false;
HTTP_VALUE *origin;
if (s == NULL || status_string == NULL || (data_size != 0 && data == NULL) || request_headers == NULL)
{
return false;
}
if (content_type == NULL)
{
content_type = "text/html; charset=utf-8";
}
ToStr(error_code_str, status_code);
GetHttpDateStr(date_str, sizeof(date_str), SystemTime64());
h = NewHttpHeader("HTTP/1.1", error_code_str, status_string);
if (StrCmpi(request_headers->Method, "OPTIONS") == 0)
{
AddHttpValue(h, NewHttpValue("Allow", "OPTIONS, GET, POST"));
}
AddHttpValue(h, NewHttpValue("Cache-Control", "no-cache"));
AddHttpValue(h, NewHttpValue("Content-Type", content_type));
AddHttpValue(h, NewHttpValue("Date", date_str));
AddHttpValue(h, NewHttpValue("Connection", "Keep-Alive"));
AddHttpValue(h, NewHttpValue("Access-Control-Allow-Methods", "OPTIONS,GET,POST"));
AddHttpValue(h, NewHttpValue("Access-Control-Allow-Headers", "X-VPNADMIN-HUBNAME,X-VPNADMIN-PASSWORD"));
AddHttpValue(h, NewHttpValue("Access-Control-Allow-Credentials", "true"));
origin = GetHttpValue(request_headers, "Origin");
if (origin != NULL)
{
AddHttpValue(h, NewHttpValue("Access-Control-Allow-Origin", origin->Data));
}
if (add_header_name != NULL && add_header_value != NULL)
{
AddHttpValue(h, NewHttpValue(add_header_name, add_header_value));
}
ret = PostHttp(s, h, data, data_size);
FreeHttpHeader(h);
return ret;
}
// Send 404 error
bool AdminWebSend404Error(SOCK *s, HTTP_HEADER *request_headers)
{
char *body = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></body></html>\r\n";
if (s == NULL || request_headers == NULL)
{
return false;
}
return AdminWebSendBody(s, 404, "Not Found", body, StrLen(body), NULL, NULL, NULL, request_headers);
}
// Send 302 redirect
bool AdminWebSend302Redirect(SOCK *s, char *url, char *query_string, HTTP_HEADER *request_headers)
{
bool ret = false;
char *txt;
UINT txt_size;
char *url2;
UINT url2_size;
char *body = "<html><head><title>Object moved</title></head><body>\r\n<h2>Object moved to <a href=\"$URL$\">here</a>.</h2>\r\n</body></html>";
if (s == NULL || url == NULL || request_headers == NULL)
{
return false;
}
url2_size = (StrSize(url) + StrSize(query_string) + MAX_SIZE) * 2;
url2 = ZeroMalloc(url2_size);
StrCpy(url2, url2_size, url);
if (IsEmptyStr(query_string) == false)
{
StrCat(url2, url2_size, "?");
StrCat(url2, url2_size, query_string);
}
txt_size = (StrSize(body) + StrSize(url2) + MAX_SIZE) * 2;
txt = ZeroMalloc(txt_size);
ReplaceStrEx(txt, txt_size, body, "$URL$", url2, false);
ret = AdminWebSendBody(s, 302, "Found", txt, StrLen(txt), NULL, "Location", url2, request_headers);
Free(txt);
Free(url2);
return ret;
}
// "/admin" web page POST handler
void AdminWebProcPost(CONNECTION *c, SOCK *s, HTTP_HEADER *h, UINT post_data_size, char *url_target)
{
ADMIN *a;
UCHAR *data;
char url[MAX_PATH];
char query_string[MAX_SIZE];
UINT i;
if (c == NULL || s == NULL || h == NULL || url_target == NULL)
{
return;
}
a = JsonRpcAuthLogin(c->Cedar, s, h);
if (a == NULL)
{
RecvAllWithDiscard(s, post_data_size, s->SecureMode);
AdminWebSendUnauthorized(s, h);
return;
}
if (post_data_size > a->MaxJsonRpcRecvSize)
{
Disconnect(s);
return;
}
data = ZeroMalloc(post_data_size + 1);
if (RecvAll(s, data, post_data_size, s->SecureMode))
{
c->JsonRpcAuthed = true;
#ifndef GC_SOFTETHER_OSS
RemoveDosEntry(c->Listener, s);
#endif // GC_SOFTETHER_OSS
// Divide url_target into URL and query string
StrCpy(url, sizeof(url), url_target);
Zero(query_string, sizeof(query_string));
i = SearchStr(url, "?", 0);
if (i != INFINITE)
{
StrCpy(query_string, sizeof(query_string), url + i + 1);
url[i] = 0;
}
AdminWebHandleFileRequest(a, c, s, h, url, query_string, "/admin", "|wwwroot/admin");
}
Free(data);
Free(a);
}
// "/admin" web page GET handler
void AdminWebProcGet(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target)
{
ADMIN *a;
char url[MAX_PATH];
char query_string[MAX_SIZE];
UINT i;
if (c == NULL || s == NULL || h == NULL || url_target == NULL)
{
return;
}
a = JsonRpcAuthLogin(c->Cedar, s, h);
if (a == NULL)
{
AdminWebSendUnauthorized(s, h);
return;
}
c->JsonRpcAuthed = true;
#ifndef GC_SOFTETHER_OSS
RemoveDosEntry(c->Listener, s);
#endif // GC_SOFTETHER_OSS
// Divide url_target into URL and query string
StrCpy(url, sizeof(url), url_target);
Zero(query_string, sizeof(query_string));
i = SearchStr(url, "?", 0);
if (i != INFINITE)
{
StrCpy(query_string, sizeof(query_string), url + i + 1);
url[i] = 0;
}
AdminWebHandleFileRequest(a, c, s, h, url, query_string, "/admin", "|wwwroot/admin");
Free(a);
}
// New JSON-RPC Result
JSON_VALUE *JsonRpcNewResponse(PACK *p)
{
JSON_VALUE *jv;
JSON_OBJECT *jo;
JSON_VALUE *jv2;
if (p == NULL)
{
return NULL;
}
jv = JsonNewObject();
jo = JsonValueGetObject(jv);
jv2 = PackToJson(p);
JsonSet(jo, "result", jv2);
return jv;
}
// New JSON-RPC Error
JSON_VALUE *JsonRpcNewError(int code, wchar_t *message)
{
wchar_t msg[MAX_PATH];
JSON_VALUE *jv;
JSON_OBJECT *jo;
JSON_VALUE *jv2;
JSON_OBJECT *jo2;
if (UniIsEmptyStr(message))
{
UniFormat(msg, sizeof(msg), L"Error code %u", code);
}
else
{
UniFormat(msg, sizeof(msg), L"Error code %u: %s", code, message);
}
jv = JsonNewObject();
jo = JsonValueGetObject(jv);
jv2 = JsonNewObject();
jo2 = JsonValueGetObject(jv2);
JsonSet(jo, "error", jv2);
JsonSetNumber(jo2, "code", (UINT64)code);
JsonSetUniStr(jo2, "message", msg);
return jv;
}
// JSON-RPC process request object
JSON_VALUE *JsonRpcProcRequestObject(ADMIN *admin, CONNECTION *c, SOCK *s, JSON_VALUE *json_req, char *method_name)
{
PACK *pack_request;
JSON_VALUE *ret = NULL;
if (c == NULL || s == NULL || json_req == NULL || admin == NULL)
{
return NULL;
}
pack_request = JsonToPack(json_req);
PackAddStr(pack_request, "function_name", method_name);
if (pack_request != NULL)
{
RPC *rpc;
PACK *pack_response;
UINT err;
// RPC Server
rpc = StartRpcServer(s, AdminDispatch, admin);
admin->Rpc = rpc;
pack_response = CallRpcDispatcher(rpc, pack_request);
if (pack_response == NULL)
{
pack_response = PackError(ERR_NOT_SUPPORTED);
}
RpcFreeEx(rpc, true);
FreePack(pack_request);
// Construct response object
err = GetErrorFromPack(pack_response);
if (err != 0)
{
// Return the error
ret = JsonRpcNewError(err, _E(err));
}
else
{
// Return the PACK
ret = JsonRpcNewResponse(pack_response);
}
SLog(admin->Server->Cedar, "LS_API_RPC_CALL",
&s->RemoteIP, s->RemotePort, s->RemoteHostname,
method_name, err, _E(err));
FreePack(pack_response);
}
return ret;
}
// JSON-RPC HTTP user authentication
bool HttpParseBasicAuthHeader(HTTP_HEADER *h, char *username, UINT username_size, char *password, UINT password_size)
{
bool ret = false;
HTTP_VALUE *auth_value;
HTTP_VALUE *vpnadmin_hubname;
HTTP_VALUE *vpnadmin_password;
if (h == NULL || username == NULL || password == NULL)
{
return false;
}
auth_value = GetHttpValue(h, "Authorization");
vpnadmin_hubname = GetHttpValue(h, "X-VPNADMIN-HUBNAME");
vpnadmin_password = GetHttpValue(h, "X-VPNADMIN-PASSWORD");
if (vpnadmin_password != NULL)
{
if (vpnadmin_hubname == NULL)
{
StrCpy(username, username_size, "");
}
else
{
StrCpy(username, username_size, vpnadmin_hubname->Data);
}
StrCpy(password, password_size, vpnadmin_password->Data);
ret = true;
}
if (ret == false && auth_value != NULL)
{
char key[32], value[MAX_SIZE];
if (GetKeyAndValue(auth_value->Data, key, sizeof(key), value, sizeof(value), " \t"))
{
if (StrCmpi(key, "Basic") == 0 && IsEmptyStr(value) == false)
{
char *str = Base64ToBin(NULL, value, StrLen(value));
if (str != NULL)
{
if (str[0] == ':')
{
// Empty username
StrCpy(username, username_size, "");
StrCpy(password, password_size, str + 1);
ret = true;
}
else
{
if (GetKeyAndValue(str, username, username_size, password, password_size, ":"))
{
ret = true;
}
}
Free(str);
}
}
}
}
return ret;
}
// JSON-RPC Login
ADMIN *JsonRpcAuthLogin(CEDAR *c, SOCK *sock, HTTP_HEADER *h)
{
ADMIN *a = NULL;
char username[MAX_HUBNAME_LEN + 1];
char password[MAX_PASSWORD_LEN + 1];
SERVER *s;
char empty_pw_hash[SHA1_SIZE];
if (c == NULL || h == NULL || sock == NULL)
{
return NULL;
}
s = c->Server;
HashAdminPassword(empty_pw_hash, "");
Zero(username, sizeof(username));
Zero(password, sizeof(password));
if (HttpParseBasicAuthHeader(h, username, sizeof(username), password, sizeof(password)))
{
char pw_hash[SHA1_SIZE];
bool is_server_admin = false;
bool is_hub_admin = false;
char hub_name[MAX_HUBNAME_LEN + 1];
HashAdminPassword(pw_hash, password);
Zero(hub_name, sizeof(hub_name));
// Check if the server administrator password is empty. If yes, login always success.
if (Cmp(s->HashedPassword, empty_pw_hash, SHA1_SIZE) == 0)
{
is_server_admin = true;
}
else
{
if (IsEmptyStr(username) || StrCmpi(username, ADMINISTRATOR_USERNAME) == 0)
{
// If the username is empty or 'administrator', verify with the server admin password.
if (Cmp(s->HashedPassword, pw_hash, SHA1_SIZE) == 0)
{
is_server_admin = true;
}
}
}
if (is_server_admin == false)
{
HUB *h;
// Hub admin mode
LockHubList(c);
{
h = GetHub(c, username);
}
UnlockHubList(c);
if (h != NULL)
{
Lock(h->lock);
{
if (Cmp(h->HashedPassword, empty_pw_hash, SHA1_SIZE) != 0 && IsZero(h->HashedPassword, sizeof(h->HashedPassword)) == false)
{
if (Cmp(pw_hash, h->HashedPassword, SHA1_SIZE) == 0)
{
is_hub_admin = true;
StrCpy(hub_name, sizeof(hub_name), h->Name);
}
}
}
Unlock(h->lock);
ReleaseHub(h);
}
}
if (is_server_admin || is_hub_admin)
{
if (CheckAdminSourceAddress(sock, hub_name))
{
a = ZeroMalloc(sizeof(ADMIN));
a->Server = s;
a->ServerAdmin = is_server_admin;
a->ClientBuild = c->Build;
if (is_hub_admin)
{
StrCpy(a->dummy1, sizeof(a->dummy1), hub_name);
a->HubName = a->dummy1;
}
}
}
}
if (a != NULL)
{
char admin_mode[256];
if (a->ServerAdmin)
{
a->MaxJsonRpcRecvSize = ADMIN_RPC_MAX_POST_SIZE_BY_SERVER_ADMIN;
}
else
{
a->MaxJsonRpcRecvSize = ADMIN_RPC_MAX_POST_SIZE_BY_HUB_ADMIN;
}
if (IsEmptyStr(a->HubName))
{
StrCpy(admin_mode, sizeof(admin_mode),
"Entire VPN Server Admin Mode");
}
else
{
Format(admin_mode, sizeof(admin_mode),
"Virtual Hub Admin Mode for '%s'",
a->HubName);
}
SLog(s->Cedar, "LS_API_AUTH_OK",
&sock->RemoteIP, sock->RemotePort, sock->RemoteHostname,
admin_mode, username, h->Method, h->Target);
}
else
{
SLog(s->Cedar, "LS_API_AUTH_ERROR",
&sock->RemoteIP, sock->RemotePort, sock->RemoteHostname,
username, h->Method, h->Target);
}
return a;
}
// Query string to JSON list value
JSON_VALUE *QueryStringToJsonListValue(char *qs)
{
TOKEN_LIST *t;
UINT i;
LIST *distinct_list = NULL;
JSON_VALUE *v = NULL;
JSON_OBJECT *o = NULL;
if (qs == NULL)
{
return NULL;
}
t = ParseTokenWithoutNullStr(qs, "&");
if (t == NULL)
{
return NULL;
}
distinct_list = NewStrList();
v = JsonNewObject();
o = JsonValueGetObject(v);
for (i = 0;i < t->NumTokens;i++)
{
char *token = t->Token[i];
UINT pos;
pos = SearchStr(token, "=", 0);
if (pos != INFINITE)
{
char *key_decoded;
char *value_decoded;
char *key = CopyStr(token);
char *value = CopyStr(token + pos + 1);
key[pos] = 0;
key_decoded = UrlDecode(key);
value_decoded = UrlDecode(value);
if (key_decoded != NULL && value_decoded != NULL)
{
if (AddStrToStrListDistinct(distinct_list, key_decoded))
{
JsonSetStr(o, key_decoded, value_decoded);
}
}
Free(value_decoded);
Free(key_decoded);
Free(key);
Free(value);
}
}
FreeToken(t);
FreeStrList(distinct_list);
return v;
}
// Construct new JSON-RPC dummy request
JSON_VALUE *ConstructDummyJsonRpcRequest(char *method_name, JSON_VALUE *p)
{
JSON_VALUE *ret;
JSON_OBJECT *ret_object;
UCHAR rand[16];
char id_str[64];
Rand(rand, sizeof(rand));
BinToStr(id_str, sizeof(id_str), rand, sizeof(rand));
ret = JsonNewObject();
ret_object = JsonObject(ret);
JsonSetStr(ret_object, "jsonrpc", "2.0");
JsonSetStr(ret_object, "method", method_name);
JsonSet(ret_object, "params", p);
JsonSetStr(ret_object, "id", id_str);
return ret;
}
// JSON-RPC Options Dispatch
void JsonRpcProcOptions(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target)
{
if (c == NULL || s == NULL || h == NULL || url_target == NULL)
{
return;
}
c->JsonRpcAuthed = true;
#ifndef GC_SOFTETHER_OSS
RemoveDosEntry(c->Listener, s);
#endif // GC_SOFTETHER_OSS
AdminWebSendBody(s, 200, "OK", NULL, 0, NULL, NULL, NULL, h);
}
// JSON-RPC GET Dispatch
void JsonRpcProcGet(CONNECTION *c, SOCK *s, HTTP_HEADER *h, char *url_target)
{
ADMIN *a;
char url[MAX_PATH];
char query_string[MAX_SIZE];
UINT i;
bool reply_sent = false;
if (c == NULL || s == NULL || h == NULL || url_target == NULL)
{
return;
}
a = JsonRpcAuthLogin(c->Cedar, s, h);
if (a == NULL)
{
AdminWebSendUnauthorized(s, h);
return;
}
c->JsonRpcAuthed = true;
#ifndef GC_SOFTETHER_OSS
RemoveDosEntry(c->Listener, s);
#endif // GC_SOFTETHER_OSS
// Divide url_target into URL and query string
StrCpy(url, sizeof(url), url_target);
Zero(query_string, sizeof(query_string));
i = SearchStr(url, "?", 0);
if (i != INFINITE)
{
StrCpy(query_string, sizeof(query_string), url + i + 1);
url[i] = 0;
}
if (StartWith(url, "/api/"))
{
// Call a method
JSON_VALUE *params_value = NULL;
JSON_OBJECT *params_object = NULL;
UINT i;
char method_name[MAX_PATH];
StrCpy(method_name, sizeof(method_name), url + 5);
i = SearchStr(method_name, "/", 0);
if (i != INFINITE)
{
method_name[i] = 0;
}
if (IsEmptyStr(method_name) == false)
{
// Call a method
params_value = QueryStringToJsonListValue(query_string);
if (params_value != NULL)
{
JSON_VALUE *json_ret = NULL;
char id[96];
char *ret_str = NULL;
GetDateTimeStrMilli64(id, sizeof(id), LocalTime64());
params_object = JsonObject(params_value);
// Process the request
json_ret = JsonRpcProcRequestObject(a, c, s, params_value, method_name);
if (json_ret == NULL)
{
json_ret = JsonRpcNewError(ERR_INTERNAL_ERROR, L"Internal error");
}
JsonSetStr(JsonObject(json_ret), "jsonrpc", "2.0");
JsonSetStr(JsonObject(json_ret), "id", id);
ret_str = JsonToStr(json_ret);
AdminWebSendBody(s, 200, "OK", ret_str, StrLen(ret_str), "text/plain; charset=UTF-8", NULL, NULL, h);
Free(ret_str);
JsonFree(json_ret);
JsonFree(params_value);
}
}
}
if (reply_sent == false)
{
BUF *html_buf = ReadDump("|vpnserver_api_doc.html");
if (html_buf != NULL)
{
AdminWebSendBody(s, 200, "OK", html_buf->Buf, html_buf->Size, "text/html; charset=UTF-8", NULL, NULL, h);
FreeBuf(html_buf);
}
else
{
AdminWebSend404Error(s, h);
}
}
if (a->LogFileList != NULL)
{
FreeEnumLogFile(a->LogFileList);
}
Free(a);
}
// JSON-RPC POST Dispatch
void JsonRpcProcPost(CONNECTION *c, SOCK *s, HTTP_HEADER *h, UINT post_data_size)
{
ADMIN *a;
UCHAR *data;
if (c == NULL || s == NULL || h == NULL)
{
return;
}
a = JsonRpcAuthLogin(c->Cedar, s, h);
if (a == NULL)
{
RecvAllWithDiscard(s, post_data_size, s->SecureMode);
AdminWebSendUnauthorized(s, h);
return;
}
if (post_data_size > a->MaxJsonRpcRecvSize)
{
Disconnect(s);
return;
}
data = ZeroMalloc(post_data_size + 1);
if (RecvAll(s, data, post_data_size, s->SecureMode))
{
// Parse JSON
JSON_VALUE *json_req = StrToJson(data);
JSON_OBJECT *json_req_object = JsonObject(json_req);
JSON_VALUE *json_ret = NULL;
char *res = NULL;
char *request_id = NULL;
char *method_name = NULL;
c->JsonRpcAuthed = true;
#ifndef GC_SOFTETHER_OSS
RemoveDosEntry(c->Listener, s);
#endif // GC_SOFTETHER_OSS
if (json_req == NULL || json_req_object == NULL)
{
// Parse error
json_ret = JsonRpcNewError(ERR_INVALID_PARAMETER, L"Parameter is invalid: JSON-RPC Parse Error");
}
else
{
// check the JSON-RPC version
char *ver_str = JsonGetStr(json_req_object, "jsonrpc");
if (StrCmpi(ver_str, "2.0") != 0)
{
// Invalid version
json_ret = JsonRpcNewError(ERR_INVALID_PARAMETER, L"JSON-RPC version is invalid");
}
else
{
JSON_VALUE *params_value = NULL;
JSON_OBJECT *params_object = NULL;
// Get Request ID
request_id = JsonGetStr(json_req_object, "id");
// Get method name
method_name = JsonGetStr(json_req_object, "method");
// Get parameters
params_value = JsonGet(json_req_object, "params");
params_object = JsonObject(params_value);
if (IsEmptyStr(method_name))
{
// method is empty
json_ret = JsonRpcNewError(ERR_INVALID_PARAMETER, L"JSON-RPC method name is empty");
}
else if (params_value == NULL || params_object == NULL)
{
// params is empty
json_ret = JsonRpcNewError(ERR_INVALID_PARAMETER, L"JSON-RPC parameter is empty");
}
else
{
// Process the request
json_ret = JsonRpcProcRequestObject(a, c, s, params_value, method_name);
}
}
}
if (json_ret == NULL)
{
json_ret = JsonRpcNewError(ERR_INTERNAL_ERROR, L"Internal error");
}
JsonSetStr(JsonObject(json_ret), "jsonrpc", "2.0");
if (request_id == NULL)
{
request_id = "0";
}
JsonSetStr(JsonObject(json_ret), "id", request_id);
res = JsonToStr(json_ret);
AdminWebSendBody(s, 200, "OK", res, StrLen(res), "application/json", NULL, NULL, h);
Free(res);
JsonFree(json_ret);
JsonFree(json_req);
}
Free(data);
if (a->LogFileList != NULL)
{
FreeEnumLogFile(a->LogFileList);
}
Free(a);
}
// Dispatch routine for Administration RPC
PACK *AdminDispatch(RPC *rpc, char *name, PACK *p)
{
ADMIN *a;
PACK *ret;
UINT err;
SERVER *server = NULL;
CEDAR *cedar = NULL;
bool ok = false;
// Validate arguments
if (rpc == NULL || name == NULL || p == NULL)
{
return NULL;
}
ret = NewPack();
err = ERR_NO_ERROR;
// Administration structure
a = (ADMIN *)rpc->Param;
if (a == NULL)
{
FreePack(ret);
return NULL;
}
server = a->Server;
if (server == NULL)
{
return NULL;
}
cedar = server->Cedar;
Lock(cedar->CedarSuperLock);
if (true)
{
char tmp[MAX_PATH];
char ip[MAX_PATH];
UINT rpc_id = 0;
StrCpy(ip, sizeof(ip), "Unknown");
if (rpc->Sock != NULL)
{
IPToStr(ip, sizeof(ip), &rpc->Sock->RemoteIP);
rpc_id = rpc->Sock->socket;
}
Format(tmp, sizeof(tmp), "RPC: RPC-%u (%s): Entering RPC [%s]...",
rpc_id, ip, name);
SiDebugLog(a->Server, tmp);
}
if (0) {}
// RPC function declaration: from here
DECLARE_RPC_EX("Test", RPC_TEST, StTest, InRpcTest, OutRpcTest, FreeRpcTest)
DECLARE_RPC_EX("GetServerInfo", RPC_SERVER_INFO, StGetServerInfo, InRpcServerInfo, OutRpcServerInfo, FreeRpcServerInfo)
DECLARE_RPC("GetServerStatus", RPC_SERVER_STATUS, StGetServerStatus, InRpcServerStatus, OutRpcServerStatus)
DECLARE_RPC("CreateListener", RPC_LISTENER, StCreateListener, InRpcListener, OutRpcListener)
DECLARE_RPC_EX("EnumListener", RPC_LISTENER_LIST, StEnumListener, InRpcListenerList, OutRpcListenerList, FreeRpcListenerList)
DECLARE_RPC("DeleteListener", RPC_LISTENER, StDeleteListener, InRpcListener, OutRpcListener)
DECLARE_RPC("EnableListener", RPC_LISTENER, StEnableListener, InRpcListener, OutRpcListener)
DECLARE_RPC_EX("SetPortsUDP", RPC_PORTS, StSetPortsUDP, InRpcPorts, OutRpcPorts, FreeRpcPorts)
DECLARE_RPC_EX("GetPortsUDP", RPC_PORTS, StGetPortsUDP, InRpcPorts, OutRpcPorts, FreeRpcPorts)
DECLARE_RPC_EX("SetProtoOptions", RPC_PROTO_OPTIONS, StSetProtoOptions, InRpcProtoOptions, OutRpcProtoOptions, FreeRpcProtoOptions)
DECLARE_RPC_EX("GetProtoOptions", RPC_PROTO_OPTIONS, StGetProtoOptions, InRpcProtoOptions, OutRpcProtoOptions, FreeRpcProtoOptions)
DECLARE_RPC("SetServerPassword", RPC_SET_PASSWORD, StSetServerPassword, InRpcSetPassword, OutRpcSetPassword)
DECLARE_RPC_EX("SetFarmSetting", RPC_FARM, StSetFarmSetting, InRpcFarm, OutRpcFarm, FreeRpcFarm)
DECLARE_RPC_EX("GetFarmSetting", RPC_FARM, StGetFarmSetting, InRpcFarm, OutRpcFarm, FreeRpcFarm)
DECLARE_RPC_EX("GetFarmInfo", RPC_FARM_INFO, StGetFarmInfo, InRpcFarmInfo, OutRpcFarmInfo, FreeRpcFarmInfo)
DECLARE_RPC_EX("EnumFarmMember", RPC_ENUM_FARM, StEnumFarmMember, InRpcEnumFarm, OutRpcEnumFarm, FreeRpcEnumFarm)
DECLARE_RPC("GetFarmConnectionStatus", RPC_FARM_CONNECTION_STATUS, StGetFarmConnectionStatus, InRpcFarmConnectionStatus, OutRpcFarmConnectionStatus)
DECLARE_RPC_EX("SetServerCert", RPC_KEY_PAIR, StSetServerCert, InRpcKeyPair, OutRpcKeyPair, FreeRpcKeyPair)
DECLARE_RPC_EX("GetServerCert", RPC_KEY_PAIR, StGetServerCert, InRpcKeyPair, OutRpcKeyPair, FreeRpcKeyPair)
DECLARE_RPC_EX("GetServerCipherList", RPC_STR, StGetServerCipherList, InRpcStr, OutRpcStr, FreeRpcStr)
DECLARE_RPC_EX("GetServerCipher", RPC_STR, StGetServerCipher, InRpcStr, OutRpcStr, FreeRpcStr)
DECLARE_RPC_EX("SetServerCipher", RPC_STR, StSetServerCipher, InRpcStr, OutRpcStr, FreeRpcStr)
DECLARE_RPC_EX("AddWgk", RPC_WGK, StAddWgk, InRpcWgk, OutRpcWgk, FreeRpcWgk)
DECLARE_RPC_EX("DeleteWgk", RPC_WGK, StDeleteWgk, InRpcWgk, OutRpcWgk, FreeRpcWgk)
DECLARE_RPC_EX("EnumWgk", RPC_WGK, StEnumWgk, InRpcWgk, OutRpcWgk, FreeRpcWgk)
DECLARE_RPC("CreateHub", RPC_CREATE_HUB, StCreateHub, InRpcCreateHub, OutRpcCreateHub)
DECLARE_RPC("SetHub", RPC_CREATE_HUB, StSetHub, InRpcCreateHub, OutRpcCreateHub)
DECLARE_RPC("GetHub", RPC_CREATE_HUB, StGetHub, InRpcCreateHub, OutRpcCreateHub)
DECLARE_RPC_EX("EnumHub", RPC_ENUM_HUB, StEnumHub, InRpcEnumHub, OutRpcEnumHub, FreeRpcEnumHub)
DECLARE_RPC("DeleteHub", RPC_DELETE_HUB, StDeleteHub, InRpcDeleteHub, OutRpcDeleteHub)
DECLARE_RPC("GetHubRadius", RPC_RADIUS, StGetHubRadius, InRpcRadius, OutRpcRadius)
DECLARE_RPC("SetHubRadius", RPC_RADIUS, StSetHubRadius, InRpcRadius, OutRpcRadius)
DECLARE_RPC_EX("EnumConnection", RPC_ENUM_CONNECTION, StEnumConnection, InRpcEnumConnection, OutRpcEnumConnection, FreeRpcEnumConnection)
DECLARE_RPC("DisconnectConnection", RPC_DISCONNECT_CONNECTION, StDisconnectConnection, InRpcDisconnectConnection, OutRpcDisconnectConnection)
DECLARE_RPC("GetConnectionInfo", RPC_CONNECTION_INFO, StGetConnectionInfo, InRpcConnectionInfo, OutRpcConnectionInfo)
DECLARE_RPC("SetHubOnline", RPC_SET_HUB_ONLINE, StSetHubOnline, InRpcSetHubOnline, OutRpcSetHubOnline)
DECLARE_RPC("GetHubStatus", RPC_HUB_STATUS, StGetHubStatus, InRpcHubStatus, OutRpcHubStatus)
DECLARE_RPC("SetHubLog", RPC_HUB_LOG, StSetHubLog, InRpcHubLog, OutRpcHubLog)
DECLARE_RPC("GetHubLog", RPC_HUB_LOG, StGetHubLog, InRpcHubLog, OutRpcHubLog)
DECLARE_RPC_EX("AddCa", RPC_HUB_ADD_CA, StAddCa, InRpcHubAddCa, OutRpcHubAddCa, FreeRpcHubAddCa)
DECLARE_RPC_EX("EnumCa", RPC_HUB_ENUM_CA, StEnumCa, InRpcHubEnumCa, OutRpcHubEnumCa, FreeRpcHubEnumCa)
DECLARE_RPC_EX("GetCa", RPC_HUB_GET_CA, StGetCa, InRpcHubGetCa, OutRpcHubGetCa, FreeRpcHubGetCa)
DECLARE_RPC("DeleteCa", RPC_HUB_DELETE_CA, StDeleteCa, InRpcHubDeleteCa, OutRpcHubDeleteCa)
DECLARE_RPC("SetLinkOnline", RPC_LINK, StSetLinkOnline, InRpcLink, OutRpcLink)
DECLARE_RPC("SetLinkOffline", RPC_LINK, StSetLinkOffline, InRpcLink, OutRpcLink)
DECLARE_RPC("DeleteLink", RPC_LINK, StDeleteLink, InRpcLink, OutRpcLink)
DECLARE_RPC("RenameLink", RPC_RENAME_LINK, StRenameLink, InRpcRenameLink, OutRpcRenameLink)
DECLARE_RPC_EX("CreateLink", RPC_CREATE_LINK, StCreateLink, InRpcCreateLink, OutRpcCreateLink, FreeRpcCreateLink)
DECLARE_RPC_EX("GetLink", RPC_CREATE_LINK, StGetLink, InRpcCreateLink, OutRpcCreateLink, FreeRpcCreateLink)
DECLARE_RPC_EX("SetLink", RPC_CREATE_LINK, StSetLink, InRpcCreateLink, OutRpcCreateLink, FreeRpcCreateLink)
DECLARE_RPC_EX("EnumLink", RPC_ENUM_LINK, StEnumLink, InRpcEnumLink, OutRpcEnumLink, FreeRpcEnumLink)
DECLARE_RPC_EX("GetLinkStatus", RPC_LINK_STATUS, StGetLinkStatus, InRpcLinkStatus, OutRpcLinkStatus, FreeRpcLinkStatus)
DECLARE_RPC("AddAccess", RPC_ADD_ACCESS, StAddAccess, InRpcAddAccess, OutRpcAddAccess)
DECLARE_RPC("DeleteAccess", RPC_DELETE_ACCESS, StDeleteAccess, InRpcDeleteAccess, OutRpcDeleteAccess)
DECLARE_RPC_EX("EnumAccess", RPC_ENUM_ACCESS_LIST, StEnumAccess, InRpcEnumAccessList, OutRpcEnumAccessList, FreeRpcEnumAccessList)
DECLARE_RPC_EX("SetAccessList", RPC_ENUM_ACCESS_LIST, StSetAccessList, InRpcEnumAccessList, OutRpcEnumAccessList, FreeRpcEnumAccessList)
DECLARE_RPC_EX("CreateUser", RPC_SET_USER, StCreateUser, InRpcSetUser, OutRpcSetUser, FreeRpcSetUser)
DECLARE_RPC_EX("SetUser", RPC_SET_USER, StSetUser, InRpcSetUser, OutRpcSetUser, FreeRpcSetUser)
DECLARE_RPC_EX("GetUser", RPC_SET_USER, StGetUser, InRpcSetUser, OutRpcSetUser, FreeRpcSetUser)
DECLARE_RPC("DeleteUser", RPC_DELETE_USER, StDeleteUser, InRpcDeleteUser, OutRpcDeleteUser)
DECLARE_RPC_EX("EnumUser", RPC_ENUM_USER, StEnumUser, InRpcEnumUser, OutRpcEnumUser, FreeRpcEnumUser)
DECLARE_RPC_EX("CreateGroup", RPC_SET_GROUP, StCreateGroup, InRpcSetGroup, OutRpcSetGroup, FreeRpcSetGroup)
DECLARE_RPC_EX("SetGroup", RPC_SET_GROUP, StSetGroup, InRpcSetGroup, OutRpcSetGroup, FreeRpcSetGroup)
DECLARE_RPC_EX("GetGroup", RPC_SET_GROUP, StGetGroup, InRpcSetGroup, OutRpcSetGroup, FreeRpcSetGroup)
DECLARE_RPC("DeleteGroup", RPC_DELETE_USER, StDeleteGroup, InRpcDeleteUser, OutRpcDeleteUser)
DECLARE_RPC_EX("EnumGroup", RPC_ENUM_GROUP, StEnumGroup, InRpcEnumGroup, OutRpcEnumGroup, FreeRpcEnumGroup)
DECLARE_RPC_EX("EnumSession", RPC_ENUM_SESSION, StEnumSession, InRpcEnumSession, OutRpcEnumSession, FreeRpcEnumSession)
DECLARE_RPC_EX("GetSessionStatus", RPC_SESSION_STATUS, StGetSessionStatus, InRpcSessionStatus, OutRpcSessionStatus, FreeRpcSessionStatus)
DECLARE_RPC("DeleteSession", RPC_DELETE_SESSION, StDeleteSession, InRpcDeleteSession, OutRpcDeleteSession)
DECLARE_RPC_EX("EnumMacTable", RPC_ENUM_MAC_TABLE, StEnumMacTable, InRpcEnumMacTable, OutRpcEnumMacTable, FreeRpcEnumMacTable)
DECLARE_RPC("DeleteMacTable", RPC_DELETE_TABLE, StDeleteMacTable, InRpcDeleteTable, OutRpcDeleteTable)
DECLARE_RPC_EX("EnumIpTable", RPC_ENUM_IP_TABLE, StEnumIpTable, InRpcEnumIpTable, OutRpcEnumIpTable, FreeRpcEnumIpTable)
DECLARE_RPC("DeleteIpTable", RPC_DELETE_TABLE, StDeleteIpTable, InRpcDeleteTable, OutRpcDeleteTable)
DECLARE_RPC("SetKeep", RPC_KEEP, StSetKeep, InRpcKeep, OutRpcKeep)
DECLARE_RPC("GetKeep", RPC_KEEP, StGetKeep, InRpcKeep, OutRpcKeep)
DECLARE_RPC("EnableSecureNAT", RPC_HUB, StEnableSecureNAT, InRpcHub, OutRpcHub)
DECLARE_RPC("DisableSecureNAT", RPC_HUB, StDisableSecureNAT, InRpcHub, OutRpcHub)
DECLARE_RPC("SetSecureNATOption", VH_OPTION, StSetSecureNATOption, InVhOption, OutVhOption)
DECLARE_RPC("GetSecureNATOption", VH_OPTION, StGetSecureNATOption, InVhOption, OutVhOption)
DECLARE_RPC_EX("EnumNAT", RPC_ENUM_NAT, StEnumNAT, InRpcEnumNat, OutRpcEnumNat, FreeRpcEnumNat)
DECLARE_RPC_EX("EnumDHCP", RPC_ENUM_DHCP, StEnumDHCP, InRpcEnumDhcp, OutRpcEnumDhcp, FreeRpcEnumDhcp)
DECLARE_RPC("GetSecureNATStatus", RPC_NAT_STATUS, StGetSecureNATStatus, InRpcNatStatus, OutRpcNatStatus)
DECLARE_RPC_EX("EnumEthernet", RPC_ENUM_ETH, StEnumEthernet, InRpcEnumEth, OutRpcEnumEth, FreeRpcEnumEth)
DECLARE_RPC("AddLocalBridge", RPC_LOCALBRIDGE, StAddLocalBridge, InRpcLocalBridge, OutRpcLocalBridge)
DECLARE_RPC("DeleteLocalBridge", RPC_LOCALBRIDGE, StDeleteLocalBridge, InRpcLocalBridge, OutRpcLocalBridge)
DECLARE_RPC_EX("EnumLocalBridge", RPC_ENUM_LOCALBRIDGE, StEnumLocalBridge, InRpcEnumLocalBridge, OutRpcEnumLocalBridge, FreeRpcEnumLocalBridge)
DECLARE_RPC("GetBridgeSupport", RPC_BRIDGE_SUPPORT, StGetBridgeSupport, InRpcBridgeSupport, OutRpcBridgeSupport)
DECLARE_RPC("RebootServer", RPC_TEST, StRebootServer, InRpcTest, OutRpcTest)
DECLARE_RPC_EX("GetCaps", CAPSLIST, StGetCaps, InRpcCapsList, OutRpcCapsList, FreeRpcCapsList)
DECLARE_RPC_EX("GetConfig", RPC_CONFIG, StGetConfig, InRpcConfig, OutRpcConfig, FreeRpcConfig)
DECLARE_RPC_EX("SetConfig", RPC_CONFIG, StSetConfig, InRpcConfig, OutRpcConfig, FreeRpcConfig)
DECLARE_RPC_EX("GetDefaultHubAdminOptions", RPC_ADMIN_OPTION, StGetDefaultHubAdminOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
DECLARE_RPC_EX("GetHubAdminOptions", RPC_ADMIN_OPTION, StGetHubAdminOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
DECLARE_RPC_EX("SetHubAdminOptions", RPC_ADMIN_OPTION, StSetHubAdminOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
DECLARE_RPC_EX("GetHubExtOptions", RPC_ADMIN_OPTION, StGetHubExtOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
DECLARE_RPC_EX("SetHubExtOptions", RPC_ADMIN_OPTION, StSetHubExtOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
DECLARE_RPC("AddL3Switch", RPC_L3SW, StAddL3Switch, InRpcL3Sw, OutRpcL3Sw)
DECLARE_RPC("DelL3Switch", RPC_L3SW, StDelL3Switch, InRpcL3Sw, OutRpcL3Sw)
DECLARE_RPC_EX("EnumL3Switch", RPC_ENUM_L3SW, StEnumL3Switch, InRpcEnumL3Sw, OutRpcEnumL3Sw, FreeRpcEnumL3Sw)
DECLARE_RPC("StartL3Switch", RPC_L3SW, StStartL3Switch, InRpcL3Sw, OutRpcL3Sw)
DECLARE_RPC("StopL3Switch", RPC_L3SW, StStopL3Switch, InRpcL3Sw, OutRpcL3Sw)
DECLARE_RPC("AddL3If", RPC_L3IF, StAddL3If, InRpcL3If, OutRpcL3If)
DECLARE_RPC("DelL3If", RPC_L3IF, StDelL3If, InRpcL3If, OutRpcL3If)
DECLARE_RPC_EX("EnumL3If", RPC_ENUM_L3IF, StEnumL3If, InRpcEnumL3If, OutRpcEnumL3If, FreeRpcEnumL3If)
DECLARE_RPC("AddL3Table", RPC_L3TABLE, StAddL3Table, InRpcL3Table, OutRpcL3Table)
DECLARE_RPC("DelL3Table", RPC_L3TABLE, StDelL3Table, InRpcL3Table, OutRpcL3Table)
DECLARE_RPC_EX("EnumL3Table", RPC_ENUM_L3TABLE, StEnumL3Table, InRpcEnumL3Table, OutRpcEnumL3Table, FreeRpcEnumL3Table)
DECLARE_RPC_EX("EnumCrl", RPC_ENUM_CRL, StEnumCrl, InRpcEnumCrl, OutRpcEnumCrl, FreeRpcEnumCrl)
DECLARE_RPC_EX("AddCrl", RPC_CRL, StAddCrl, InRpcCrl, OutRpcCrl, FreeRpcCrl)
DECLARE_RPC_EX("DelCrl", RPC_CRL, StDelCrl, InRpcCrl, OutRpcCrl, FreeRpcCrl)
DECLARE_RPC_EX("GetCrl", RPC_CRL, StGetCrl, InRpcCrl, OutRpcCrl, FreeRpcCrl)
DECLARE_RPC_EX("SetCrl", RPC_CRL, StSetCrl, InRpcCrl, OutRpcCrl, FreeRpcCrl)
DECLARE_RPC_EX("SetAcList", RPC_AC_LIST, StSetAcList, InRpcAcList, OutRpcAcList, FreeRpcAcList)
DECLARE_RPC_EX("GetAcList", RPC_AC_LIST, StGetAcList, InRpcAcList, OutRpcAcList, FreeRpcAcList)
DECLARE_RPC_EX("EnumLogFile", RPC_ENUM_LOG_FILE, StEnumLogFile, InRpcEnumLogFile, OutRpcEnumLogFile, FreeRpcEnumLogFile)
DECLARE_RPC_EX("ReadLogFile", RPC_READ_LOG_FILE, StReadLogFile, InRpcReadLogFile, OutRpcReadLogFile, FreeRpcReadLogFile)
DECLARE_RPC("AddLicenseKey", RPC_TEST, StAddLicenseKey, InRpcTest, OutRpcTest)
DECLARE_RPC("DelLicenseKey", RPC_TEST, StDelLicenseKey, InRpcTest, OutRpcTest)
DECLARE_RPC_EX("EnumLicenseKey", RPC_ENUM_LICENSE_KEY, StEnumLicenseKey, InRpcEnumLicenseKey, OutRpcEnumLicenseKey, FreeRpcEnumLicenseKey)
DECLARE_RPC("GetLicenseStatus", RPC_LICENSE_STATUS, StGetLicenseStatus, InRpcLicenseStatus, OutRpcLicenseStatus)
DECLARE_RPC("SetSysLog", SYSLOG_SETTING, StSetSysLog, InRpcSysLogSetting, OutRpcSysLogSetting)
DECLARE_RPC("GetSysLog", SYSLOG_SETTING, StGetSysLog, InRpcSysLogSetting, OutRpcSysLogSetting)
DECLARE_RPC_EX("EnumEthVLan", RPC_ENUM_ETH_VLAN, StEnumEthVLan, InRpcEnumEthVLan, OutRpcEnumEthVLan, FreeRpcEnumEthVLan)
DECLARE_RPC("SetEnableEthVLan", RPC_TEST, StSetEnableEthVLan, InRpcTest, OutRpcTest)
DECLARE_RPC_EX("SetHubMsg", RPC_MSG, StSetHubMsg, InRpcMsg, OutRpcMsg, FreeRpcMsg)
DECLARE_RPC_EX("GetHubMsg", RPC_MSG, StGetHubMsg, InRpcMsg, OutRpcMsg, FreeRpcMsg)
DECLARE_RPC("Crash", RPC_TEST, StCrash, InRpcTest, OutRpcTest)
DECLARE_RPC_EX("GetAdminMsg", RPC_MSG, StGetAdminMsg, InRpcMsg, OutRpcMsg, FreeRpcMsg)
DECLARE_RPC("Flush", RPC_TEST, StFlush, InRpcTest, OutRpcTest)
DECLARE_RPC("Debug", RPC_TEST, StDebug, InRpcTest, OutRpcTest)
DECLARE_RPC("SetIPsecServices", IPSEC_SERVICES, StSetIPsecServices, InIPsecServices, OutIPsecServices)
DECLARE_RPC("GetIPsecServices", IPSEC_SERVICES, StGetIPsecServices, InIPsecServices, OutIPsecServices)
DECLARE_RPC("AddEtherIpId", ETHERIP_ID, StAddEtherIpId, InEtherIpId, OutEtherIpId)
DECLARE_RPC("GetEtherIpId", ETHERIP_ID, StGetEtherIpId, InEtherIpId, OutEtherIpId)
DECLARE_RPC("DeleteEtherIpId", ETHERIP_ID, StDeleteEtherIpId, InEtherIpId, OutEtherIpId)
DECLARE_RPC_EX("EnumEtherIpId", RPC_ENUM_ETHERIP_ID, StEnumEtherIpId, InRpcEnumEtherIpId, OutRpcEnumEtherIpId, FreeRpcEnumEtherIpId)
DECLARE_RPC("SetOpenVpnSstpConfig", OPENVPN_SSTP_CONFIG, StSetOpenVpnSstpConfig, InOpenVpnSstpConfig, OutOpenVpnSstpConfig)
DECLARE_RPC("GetOpenVpnSstpConfig", OPENVPN_SSTP_CONFIG, StGetOpenVpnSstpConfig, InOpenVpnSstpConfig, OutOpenVpnSstpConfig)
DECLARE_RPC("GetDDnsClientStatus", DDNS_CLIENT_STATUS, StGetDDnsClientStatus, InDDnsClientStatus, OutDDnsClientStatus)
DECLARE_RPC("ChangeDDnsClientHostname", RPC_TEST, StChangeDDnsClientHostname, InRpcTest, OutRpcTest)
DECLARE_RPC("RegenerateServerCert", RPC_TEST, StRegenerateServerCert, InRpcTest, OutRpcTest)
DECLARE_RPC_EX("MakeOpenVpnConfigFile", RPC_READ_LOG_FILE, StMakeOpenVpnConfigFile, InRpcReadLogFile, OutRpcReadLogFile, FreeRpcReadLogFile)
DECLARE_RPC("SetSpecialListener", RPC_SPECIAL_LISTENER, StSetSpecialListener, InRpcSpecialListener, OutRpcSpecialListener)
DECLARE_RPC("GetSpecialListener", RPC_SPECIAL_LISTENER, StGetSpecialListener, InRpcSpecialListener, OutRpcSpecialListener)
DECLARE_RPC("GetAzureStatus", RPC_AZURE_STATUS, StGetAzureStatus, InRpcAzureStatus, OutRpcAzureStatus)
DECLARE_RPC("SetAzureStatus", RPC_AZURE_STATUS, StSetAzureStatus, InRpcAzureStatus, OutRpcAzureStatus)
DECLARE_RPC("GetDDnsInternetSettng", INTERNET_SETTING, StGetDDnsInternetSetting, InRpcInternetSetting, OutRpcInternetSetting)
DECLARE_RPC("SetDDnsInternetSettng", INTERNET_SETTING, StSetDDnsInternetSetting, InRpcInternetSetting, OutRpcInternetSetting)
// RPC function declaration: till here
if (ok == false)
{
err = ERR_NOT_SUPPORTED;
}
if (err != ERR_NO_ERROR)
{
PackAddInt(ret, "error", err);
}
if (true)
{
char tmp[MAX_PATH];
char ip[MAX_PATH];
UINT rpc_id = 0;
StrCpy(ip, sizeof(ip), "Unknown");
if (rpc->Sock != NULL)
{
IPToStr(ip, sizeof(ip), &rpc->Sock->RemoteIP);
rpc_id = rpc->Sock->socket;
}
Format(tmp, sizeof(tmp), "RPC: RPC-%u (%s): Leaving RPC [%s] (Error: %u).",
rpc_id, ip, name, err);
SiDebugLog(a->Server, tmp);
}
Unlock(cedar->CedarSuperLock);
return ret;
}
// RPC call function declaration: from here
DECLARE_SC_EX("Test", RPC_TEST, ScTest, InRpcTest, OutRpcTest, FreeRpcTest)
DECLARE_SC_EX("GetServerInfo", RPC_SERVER_INFO, ScGetServerInfo, InRpcServerInfo, OutRpcServerInfo, FreeRpcServerInfo)
DECLARE_SC("GetServerStatus", RPC_SERVER_STATUS, ScGetServerStatus, InRpcServerStatus, OutRpcServerStatus)
DECLARE_SC("CreateListener", RPC_LISTENER, ScCreateListener, InRpcListener, OutRpcListener)
DECLARE_SC_EX("EnumListener", RPC_LISTENER_LIST, ScEnumListener, InRpcListenerList, OutRpcListenerList, FreeRpcListenerList)
DECLARE_SC("DeleteListener", RPC_LISTENER, ScDeleteListener, InRpcListener, OutRpcListener)
DECLARE_SC("EnableListener", RPC_LISTENER, ScEnableListener, InRpcListener, OutRpcListener)
DECLARE_SC_EX("SetPortsUDP", RPC_PORTS, ScSetPortsUDP, InRpcPorts, OutRpcPorts, FreeRpcPorts)
DECLARE_SC_EX("GetPortsUDP", RPC_PORTS, ScGetPortsUDP, InRpcPorts, OutRpcPorts, FreeRpcPorts)
DECLARE_SC_EX("SetProtoOptions", RPC_PROTO_OPTIONS, ScSetProtoOptions, InRpcProtoOptions, OutRpcProtoOptions, FreeRpcProtoOptions)
DECLARE_SC_EX("GetProtoOptions", RPC_PROTO_OPTIONS, ScGetProtoOptions, InRpcProtoOptions, OutRpcProtoOptions, FreeRpcProtoOptions)
DECLARE_SC("SetServerPassword", RPC_SET_PASSWORD, ScSetServerPassword, InRpcSetPassword, OutRpcSetPassword)
DECLARE_SC_EX("SetFarmSetting", RPC_FARM, ScSetFarmSetting, InRpcFarm, OutRpcFarm, FreeRpcFarm)
DECLARE_SC_EX("GetFarmSetting", RPC_FARM, ScGetFarmSetting, InRpcFarm, OutRpcFarm, FreeRpcFarm)
DECLARE_SC_EX("GetFarmInfo", RPC_FARM_INFO, ScGetFarmInfo, InRpcFarmInfo, OutRpcFarmInfo, FreeRpcFarmInfo)
DECLARE_SC_EX("EnumFarmMember", RPC_ENUM_FARM, ScEnumFarmMember, InRpcEnumFarm, OutRpcEnumFarm, FreeRpcEnumFarm)
DECLARE_SC("GetFarmConnectionStatus", RPC_FARM_CONNECTION_STATUS, ScGetFarmConnectionStatus, InRpcFarmConnectionStatus, OutRpcFarmConnectionStatus)
DECLARE_SC_EX("SetServerCert", RPC_KEY_PAIR, ScSetServerCert, InRpcKeyPair, OutRpcKeyPair, FreeRpcKeyPair)
DECLARE_SC_EX("GetServerCert", RPC_KEY_PAIR, ScGetServerCert, InRpcKeyPair, OutRpcKeyPair, FreeRpcKeyPair)
DECLARE_SC_EX("GetServerCipherList", RPC_STR, ScGetServerCipherList, InRpcStr, OutRpcStr, FreeRpcStr)
DECLARE_SC_EX("GetServerCipher", RPC_STR, ScGetServerCipher, InRpcStr, OutRpcStr, FreeRpcStr)
DECLARE_SC_EX("SetServerCipher", RPC_STR, ScSetServerCipher, InRpcStr, OutRpcStr, FreeRpcStr)
DECLARE_SC_EX("AddWgk", RPC_WGK, ScAddWgk, InRpcWgk, OutRpcWgk, FreeRpcWgk)
DECLARE_SC_EX("DeleteWgk", RPC_WGK, ScDeleteWgk, InRpcWgk, OutRpcWgk, FreeRpcWgk)
DECLARE_SC_EX("EnumWgk", RPC_WGK, ScEnumWgk, InRpcWgk, OutRpcWgk, FreeRpcWgk)
DECLARE_SC("CreateHub", RPC_CREATE_HUB, ScCreateHub, InRpcCreateHub, OutRpcCreateHub)
DECLARE_SC("SetHub", RPC_CREATE_HUB, ScSetHub, InRpcCreateHub, OutRpcCreateHub)
DECLARE_SC("GetHub", RPC_CREATE_HUB, ScGetHub, InRpcCreateHub, OutRpcCreateHub)
DECLARE_SC_EX("EnumHub", RPC_ENUM_HUB, ScEnumHub, InRpcEnumHub, OutRpcEnumHub, FreeRpcEnumHub)
DECLARE_SC("DeleteHub", RPC_DELETE_HUB, ScDeleteHub, InRpcDeleteHub, OutRpcDeleteHub)
DECLARE_SC("GetHubRadius", RPC_RADIUS, ScGetHubRadius, InRpcRadius, OutRpcRadius)
DECLARE_SC("SetHubRadius", RPC_RADIUS, ScSetHubRadius, InRpcRadius, OutRpcRadius)
DECLARE_SC_EX("EnumConnection", RPC_ENUM_CONNECTION, ScEnumConnection, InRpcEnumConnection, OutRpcEnumConnection, FreeRpcEnumConnection)
DECLARE_SC("DisconnectConnection", RPC_DISCONNECT_CONNECTION, ScDisconnectConnection, InRpcDisconnectConnection, OutRpcDisconnectConnection)
DECLARE_SC("GetConnectionInfo", RPC_CONNECTION_INFO, ScGetConnectionInfo, InRpcConnectionInfo, OutRpcConnectionInfo)
DECLARE_SC("SetHubOnline", RPC_SET_HUB_ONLINE, ScSetHubOnline, InRpcSetHubOnline, OutRpcSetHubOnline)
DECLARE_SC("GetHubStatus", RPC_HUB_STATUS, ScGetHubStatus, InRpcHubStatus, OutRpcHubStatus)
DECLARE_SC("SetHubLog", RPC_HUB_LOG, ScSetHubLog, InRpcHubLog, OutRpcHubLog)
DECLARE_SC("GetHubLog", RPC_HUB_LOG, ScGetHubLog, InRpcHubLog, OutRpcHubLog)
DECLARE_SC_EX("AddCa", RPC_HUB_ADD_CA, ScAddCa, InRpcHubAddCa, OutRpcHubAddCa, FreeRpcHubAddCa)
DECLARE_SC_EX("EnumCa", RPC_HUB_ENUM_CA, ScEnumCa, InRpcHubEnumCa, OutRpcHubEnumCa, FreeRpcHubEnumCa)
DECLARE_SC_EX("GetCa", RPC_HUB_GET_CA, ScGetCa, InRpcHubGetCa, OutRpcHubGetCa, FreeRpcHubGetCa)
DECLARE_SC("DeleteCa", RPC_HUB_DELETE_CA, ScDeleteCa, InRpcHubDeleteCa, OutRpcHubDeleteCa)
DECLARE_SC_EX("CreateLink", RPC_CREATE_LINK, ScCreateLink, InRpcCreateLink, OutRpcCreateLink, FreeRpcCreateLink)
DECLARE_SC_EX("GetLink", RPC_CREATE_LINK, ScGetLink, InRpcCreateLink, OutRpcCreateLink, FreeRpcCreateLink)
DECLARE_SC_EX("SetLink", RPC_CREATE_LINK, ScSetLink, InRpcCreateLink, OutRpcCreateLink, FreeRpcCreateLink)
DECLARE_SC_EX("EnumLink", RPC_ENUM_LINK, ScEnumLink, InRpcEnumLink, OutRpcEnumLink, FreeRpcEnumLink)
DECLARE_SC_EX("GetLinkStatus", RPC_LINK_STATUS, ScGetLinkStatus, InRpcLinkStatus, OutRpcLinkStatus, FreeRpcLinkStatus)
DECLARE_SC("SetLinkOnline", RPC_LINK, ScSetLinkOnline, InRpcLink, OutRpcLink)
DECLARE_SC("SetLinkOffline", RPC_LINK, ScSetLinkOffline, InRpcLink, OutRpcLink)
DECLARE_SC("DeleteLink", RPC_LINK, ScDeleteLink, InRpcLink, OutRpcLink)
DECLARE_SC("RenameLink", RPC_RENAME_LINK, ScRenameLink, InRpcRenameLink, OutRpcRenameLink)
DECLARE_SC("AddAccess", RPC_ADD_ACCESS, ScAddAccess, InRpcAddAccess, OutRpcAddAccess)
DECLARE_SC("DeleteAccess", RPC_DELETE_ACCESS, ScDeleteAccess, InRpcDeleteAccess, OutRpcDeleteAccess)
DECLARE_SC_EX("EnumAccess", RPC_ENUM_ACCESS_LIST, ScEnumAccess, InRpcEnumAccessList, OutRpcEnumAccessList, FreeRpcEnumAccessList)
DECLARE_SC_EX("SetAccessList", RPC_ENUM_ACCESS_LIST, ScSetAccessList, InRpcEnumAccessList, OutRpcEnumAccessList, FreeRpcEnumAccessList)
DECLARE_SC_EX("CreateUser", RPC_SET_USER, ScCreateUser, InRpcSetUser, OutRpcSetUser, FreeRpcSetUser)
DECLARE_SC_EX("SetUser", RPC_SET_USER, ScSetUser, InRpcSetUser, OutRpcSetUser, FreeRpcSetUser)
DECLARE_SC_EX("GetUser", RPC_SET_USER, ScGetUser, InRpcSetUser, OutRpcSetUser, FreeRpcSetUser)
DECLARE_SC("DeleteUser", RPC_DELETE_USER, ScDeleteUser, InRpcDeleteUser, OutRpcDeleteUser)
DECLARE_SC_EX("EnumUser", RPC_ENUM_USER, ScEnumUser, InRpcEnumUser, OutRpcEnumUser, FreeRpcEnumUser)
DECLARE_SC_EX("CreateGroup", RPC_SET_GROUP, ScCreateGroup, InRpcSetGroup, OutRpcSetGroup, FreeRpcSetGroup)
DECLARE_SC_EX("SetGroup", RPC_SET_GROUP, ScSetGroup, InRpcSetGroup, OutRpcSetGroup, FreeRpcSetGroup)
DECLARE_SC_EX("GetGroup", RPC_SET_GROUP, ScGetGroup, InRpcSetGroup, OutRpcSetGroup, FreeRpcSetGroup)
DECLARE_SC("DeleteGroup", RPC_DELETE_USER, ScDeleteGroup, InRpcDeleteUser, OutRpcDeleteUser)
DECLARE_SC_EX("EnumGroup", RPC_ENUM_GROUP, ScEnumGroup, InRpcEnumGroup, OutRpcEnumGroup, FreeRpcEnumGroup)
DECLARE_SC_EX("EnumSession", RPC_ENUM_SESSION, ScEnumSession, InRpcEnumSession, OutRpcEnumSession, FreeRpcEnumSession)
DECLARE_SC_EX("GetSessionStatus", RPC_SESSION_STATUS, ScGetSessionStatus, InRpcSessionStatus, OutRpcSessionStatus, FreeRpcSessionStatus)
DECLARE_SC("DeleteSession", RPC_DELETE_SESSION, ScDeleteSession, InRpcDeleteSession, OutRpcDeleteSession)
DECLARE_SC_EX("EnumMacTable", RPC_ENUM_MAC_TABLE, ScEnumMacTable, InRpcEnumMacTable, OutRpcEnumMacTable, FreeRpcEnumMacTable)
DECLARE_SC("DeleteMacTable", RPC_DELETE_TABLE, ScDeleteMacTable, InRpcDeleteTable, OutRpcDeleteTable)
DECLARE_SC_EX("EnumIpTable", RPC_ENUM_IP_TABLE, ScEnumIpTable, InRpcEnumIpTable, OutRpcEnumIpTable, FreeRpcEnumIpTable)
DECLARE_SC("DeleteIpTable", RPC_DELETE_TABLE, ScDeleteIpTable, InRpcDeleteTable, OutRpcDeleteTable)
DECLARE_SC("SetKeep", RPC_KEEP, ScSetKeep, InRpcKeep, OutRpcKeep)
DECLARE_SC("GetKeep", RPC_KEEP, ScGetKeep, InRpcKeep, OutRpcKeep)
DECLARE_SC("EnableSecureNAT", RPC_HUB, ScEnableSecureNAT, InRpcHub, OutRpcHub)
DECLARE_SC("DisableSecureNAT", RPC_HUB, ScDisableSecureNAT, InRpcHub, OutRpcHub)
DECLARE_SC("SetSecureNATOption", VH_OPTION, ScSetSecureNATOption, InVhOption, OutVhOption)
DECLARE_SC("GetSecureNATOption", VH_OPTION, ScGetSecureNATOption, InVhOption, OutVhOption)
DECLARE_SC_EX("EnumNAT", RPC_ENUM_NAT, ScEnumNAT, InRpcEnumNat, OutRpcEnumNat, FreeRpcEnumNat)
DECLARE_SC_EX("EnumDHCP", RPC_ENUM_DHCP, ScEnumDHCP, InRpcEnumDhcp, OutRpcEnumDhcp, FreeRpcEnumDhcp)
DECLARE_SC("GetSecureNATStatus", RPC_NAT_STATUS, ScGetSecureNATStatus, InRpcNatStatus, OutRpcNatStatus)
DECLARE_SC_EX("EnumEthernet", RPC_ENUM_ETH, ScEnumEthernet, InRpcEnumEth, OutRpcEnumEth, FreeRpcEnumEth)
DECLARE_SC("AddLocalBridge", RPC_LOCALBRIDGE, ScAddLocalBridge, InRpcLocalBridge, OutRpcLocalBridge)
DECLARE_SC("DeleteLocalBridge", RPC_LOCALBRIDGE, ScDeleteLocalBridge, InRpcLocalBridge, OutRpcLocalBridge)
DECLARE_SC_EX("EnumLocalBridge", RPC_ENUM_LOCALBRIDGE, ScEnumLocalBridge, InRpcEnumLocalBridge, OutRpcEnumLocalBridge, FreeRpcEnumLocalBridge)
DECLARE_SC("GetBridgeSupport", RPC_BRIDGE_SUPPORT, ScGetBridgeSupport, InRpcBridgeSupport, OutRpcBridgeSupport)
DECLARE_SC("RebootServer", RPC_TEST, ScRebootServer, InRpcTest, OutRpcTest)
DECLARE_SC_EX("GetCaps", CAPSLIST, ScGetCaps, InRpcCapsList, OutRpcCapsList, FreeRpcCapsList)
DECLARE_SC_EX("GetConfig", RPC_CONFIG, ScGetConfig, InRpcConfig, OutRpcConfig, FreeRpcConfig)
DECLARE_SC_EX("SetConfig", RPC_CONFIG, ScSetConfig, InRpcConfig, OutRpcConfig, FreeRpcConfig)
DECLARE_SC_EX("GetHubAdminOptions", RPC_ADMIN_OPTION, ScGetHubAdminOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
DECLARE_SC_EX("SetHubAdminOptions", RPC_ADMIN_OPTION, ScSetHubAdminOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
DECLARE_SC_EX("GetHubExtOptions", RPC_ADMIN_OPTION, ScGetHubExtOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
DECLARE_SC_EX("SetHubExtOptions", RPC_ADMIN_OPTION, ScSetHubExtOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
DECLARE_SC_EX("GetDefaultHubAdminOptions", RPC_ADMIN_OPTION, ScGetDefaultHubAdminOptions, InRpcAdminOption, OutRpcAdminOption, FreeRpcAdminOption)
DECLARE_SC("AddL3Switch", RPC_L3SW, ScAddL3Switch, InRpcL3Sw, OutRpcL3Sw)
DECLARE_SC("DelL3Switch", RPC_L3SW, ScDelL3Switch, InRpcL3Sw, OutRpcL3Sw)
DECLARE_SC_EX("EnumL3Switch", RPC_ENUM_L3SW, ScEnumL3Switch, InRpcEnumL3Sw, OutRpcEnumL3Sw, FreeRpcEnumL3Sw)
DECLARE_SC("StartL3Switch", RPC_L3SW, ScStartL3Switch, InRpcL3Sw, OutRpcL3Sw)
DECLARE_SC("StopL3Switch", RPC_L3SW, ScStopL3Switch, InRpcL3Sw, OutRpcL3Sw)
DECLARE_SC("AddL3If", RPC_L3IF, ScAddL3If, InRpcL3If, OutRpcL3If)
DECLARE_SC("DelL3If", RPC_L3IF, ScDelL3If, InRpcL3If, OutRpcL3If)
DECLARE_SC_EX("EnumL3If", RPC_ENUM_L3IF, ScEnumL3If, InRpcEnumL3If, OutRpcEnumL3If, FreeRpcEnumL3If)
DECLARE_SC("AddL3Table", RPC_L3TABLE, ScAddL3Table, InRpcL3Table, OutRpcL3Table)
DECLARE_SC("DelL3Table", RPC_L3TABLE, ScDelL3Table, InRpcL3Table, OutRpcL3Table)
DECLARE_SC_EX("EnumL3Table", RPC_ENUM_L3TABLE, ScEnumL3Table, InRpcEnumL3Table, OutRpcEnumL3Table, FreeRpcEnumL3Table)
DECLARE_SC_EX("EnumCrl", RPC_ENUM_CRL, ScEnumCrl, InRpcEnumCrl, OutRpcEnumCrl, FreeRpcEnumCrl)
DECLARE_SC_EX("AddCrl", RPC_CRL, ScAddCrl, InRpcCrl, OutRpcCrl, FreeRpcCrl)
DECLARE_SC_EX("DelCrl", RPC_CRL, ScDelCrl, InRpcCrl, OutRpcCrl, FreeRpcCrl)
DECLARE_SC_EX("GetCrl", RPC_CRL, ScGetCrl, InRpcCrl, OutRpcCrl, FreeRpcCrl)
DECLARE_SC_EX("SetCrl", RPC_CRL, ScSetCrl, InRpcCrl, OutRpcCrl, FreeRpcCrl)
DECLARE_SC_EX("SetAcList", RPC_AC_LIST, ScSetAcList, InRpcAcList, OutRpcAcList, FreeRpcAcList)
DECLARE_SC_EX("GetAcList", RPC_AC_LIST, ScGetAcList, InRpcAcList, OutRpcAcList, FreeRpcAcList)
DECLARE_SC_EX("EnumLogFile", RPC_ENUM_LOG_FILE, ScEnumLogFile, InRpcEnumLogFile, OutRpcEnumLogFile, FreeRpcEnumLogFile)
DECLARE_SC_EX("ReadLogFile", RPC_READ_LOG_FILE, ScReadLogFile, InRpcReadLogFile, OutRpcReadLogFile, FreeRpcReadLogFile)
DECLARE_SC("AddLicenseKey", RPC_TEST, ScAddLicenseKey, InRpcTest, OutRpcTest)
DECLARE_SC("DelLicenseKey", RPC_TEST, ScDelLicenseKey, InRpcTest, OutRpcTest)
DECLARE_SC_EX("EnumLicenseKey", RPC_ENUM_LICENSE_KEY, ScEnumLicenseKey, InRpcEnumLicenseKey, OutRpcEnumLicenseKey, FreeRpcEnumLicenseKey)
DECLARE_SC("GetLicenseStatus", RPC_LICENSE_STATUS, ScGetLicenseStatus, InRpcLicenseStatus, OutRpcLicenseStatus)
DECLARE_SC("SetSysLog", SYSLOG_SETTING, ScSetSysLog, InRpcSysLogSetting, OutRpcSysLogSetting)
DECLARE_SC("GetSysLog", SYSLOG_SETTING, ScGetSysLog, InRpcSysLogSetting, OutRpcSysLogSetting)
DECLARE_SC_EX("EnumEthVLan", RPC_ENUM_ETH_VLAN, ScEnumEthVLan, InRpcEnumEthVLan, OutRpcEnumEthVLan, FreeRpcEnumEthVLan)
DECLARE_SC("SetEnableEthVLan", RPC_TEST, ScSetEnableEthVLan, InRpcTest, OutRpcTest)
DECLARE_SC_EX("SetHubMsg", RPC_MSG, ScSetHubMsg, InRpcMsg, OutRpcMsg, FreeRpcMsg)
DECLARE_SC_EX("GetHubMsg", RPC_MSG, ScGetHubMsg, InRpcMsg, OutRpcMsg, FreeRpcMsg)
DECLARE_SC("Crash", RPC_TEST, ScCrash, InRpcTest, OutRpcTest)
DECLARE_SC_EX("GetAdminMsg", RPC_MSG, ScGetAdminMsg, InRpcMsg, OutRpcMsg, FreeRpcMsg)
DECLARE_SC("Flush", RPC_TEST, ScFlush, InRpcTest, OutRpcTest)
DECLARE_SC("Debug", RPC_TEST, ScDebug, InRpcTest, OutRpcTest)
DECLARE_SC("SetIPsecServices", IPSEC_SERVICES, ScSetIPsecServices, InIPsecServices, OutIPsecServices)
DECLARE_SC("GetIPsecServices", IPSEC_SERVICES, ScGetIPsecServices, InIPsecServices, OutIPsecServices)
DECLARE_SC("AddEtherIpId", ETHERIP_ID, ScAddEtherIpId, InEtherIpId, OutEtherIpId)
DECLARE_SC("GetEtherIpId", ETHERIP_ID, ScGetEtherIpId, InEtherIpId, OutEtherIpId)
DECLARE_SC("DeleteEtherIpId", ETHERIP_ID, ScDeleteEtherIpId, InEtherIpId, OutEtherIpId)
DECLARE_SC_EX("EnumEtherIpId", RPC_ENUM_ETHERIP_ID, ScEnumEtherIpId, InRpcEnumEtherIpId, OutRpcEnumEtherIpId, FreeRpcEnumEtherIpId)
DECLARE_SC("SetOpenVpnSstpConfig", OPENVPN_SSTP_CONFIG, ScSetOpenVpnSstpConfig, InOpenVpnSstpConfig, OutOpenVpnSstpConfig)
DECLARE_SC("GetOpenVpnSstpConfig", OPENVPN_SSTP_CONFIG, ScGetOpenVpnSstpConfig, InOpenVpnSstpConfig, OutOpenVpnSstpConfig)
DECLARE_SC("GetDDnsClientStatus", DDNS_CLIENT_STATUS, ScGetDDnsClientStatus, InDDnsClientStatus, OutDDnsClientStatus)
DECLARE_SC("ChangeDDnsClientHostname", RPC_TEST, ScChangeDDnsClientHostname, InRpcTest, OutRpcTest)
DECLARE_SC("RegenerateServerCert", RPC_TEST, ScRegenerateServerCert, InRpcTest, OutRpcTest)
DECLARE_SC_EX("MakeOpenVpnConfigFile", RPC_READ_LOG_FILE, ScMakeOpenVpnConfigFile, InRpcReadLogFile, OutRpcReadLogFile, FreeRpcReadLogFile)
DECLARE_SC("SetSpecialListener", RPC_SPECIAL_LISTENER, ScSetSpecialListener, InRpcSpecialListener, OutRpcSpecialListener)
DECLARE_SC("GetSpecialListener", RPC_SPECIAL_LISTENER, ScGetSpecialListener, InRpcSpecialListener, OutRpcSpecialListener)
DECLARE_SC("GetAzureStatus", RPC_AZURE_STATUS, ScGetAzureStatus, InRpcAzureStatus, OutRpcAzureStatus)
DECLARE_SC("SetAzureStatus", RPC_AZURE_STATUS, ScSetAzureStatus, InRpcAzureStatus, OutRpcAzureStatus)
DECLARE_SC("GetDDnsInternetSettng", INTERNET_SETTING, ScGetDDnsInternetSetting, InRpcInternetSetting, OutRpcInternetSetting)
DECLARE_SC("SetDDnsInternetSettng", INTERNET_SETTING, ScSetDDnsInternetSetting, InRpcInternetSetting, OutRpcInternetSetting)
// RPC call function declaration: till here
// Setting VPN Gate Server Configuration
UINT StSetVgsConfig(ADMIN *a, VGS_CONFIG *t)
{
return ERR_NOT_SUPPORTED;
}
// Get VPN Gate configuration
UINT StGetVgsConfig(ADMIN *a, VGS_CONFIG *t)
{
return ERR_NOT_SUPPORTED;
}
// Get DDNS proxy configuration
UINT StGetDDnsInternetSetting(ADMIN *a, INTERNET_SETTING *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
if (s->DDnsClient == NULL)
{
return ERR_NOT_SUPPORTED;
}
Zero(t, sizeof(INTERNET_SETTING));
DCGetInternetSetting(s->DDnsClient, t);
return ret;
}
// Set DDNS proxy configuration
UINT StSetDDnsInternetSetting(ADMIN *a, INTERNET_SETTING *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
if (s->DDnsClient == NULL)
{
return ERR_NOT_SUPPORTED;
}
DCSetInternetSetting(s->DDnsClient, t);
IncrementServerConfigRevision(s);
return ret;
}
// Get Azure status
UINT StGetAzureStatus(ADMIN *a, RPC_AZURE_STATUS *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
AZURE_CLIENT *ac;
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
if (SiIsAzureSupported(s) == false)
{
return ERR_NOT_SUPPORTED;
}
ac = s->AzureClient;
if (ac == NULL)
{
return ERR_NOT_SUPPORTED;
}
Zero(t, sizeof(RPC_AZURE_STATUS));
Lock(ac->Lock);
{
t->IsConnected = ac->IsConnected;
t->IsEnabled = ac->IsEnabled;
}
Unlock(ac->Lock);
return ERR_NO_ERROR;
}
// Set Azure status
UINT StSetAzureStatus(ADMIN *a, RPC_AZURE_STATUS *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
if (SiIsAzureSupported(s) == false)
{
return ERR_NOT_SUPPORTED;
}
SiSetAzureEnable(s, t->IsEnabled);
IncrementServerConfigRevision(s);
return ERR_NO_ERROR;
}
// Get special listener status
UINT StGetSpecialListener(ADMIN *a, RPC_SPECIAL_LISTENER *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
Zero(t, sizeof(RPC_SPECIAL_LISTENER));
t->VpnOverDnsListener = s->EnableVpnOverDns;
t->VpnOverIcmpListener = s->EnableVpnOverIcmp;
return ERR_NO_ERROR;
}
// Set special listener status
UINT StSetSpecialListener(ADMIN *a, RPC_SPECIAL_LISTENER *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
// Check ports
if (t->VpnOverDnsListener && (MAKEBOOL(s->EnableVpnOverDns) != MAKEBOOL(t->VpnOverDnsListener)))
{
if (SiCanOpenVpnOverDnsPort() == false)
{
return ERR_SPECIAL_LISTENER_DNS_ERROR;
}
}
if (t->VpnOverIcmpListener && (MAKEBOOL(s->EnableVpnOverIcmp) != MAKEBOOL(t->VpnOverIcmpListener)))
{
if (SiCanOpenVpnOverIcmpPort() == false)
{
return ERR_SPECIAL_LISTENER_ICMP_ERROR;
}
}
s->EnableVpnOverDns = t->VpnOverDnsListener;
s->EnableVpnOverIcmp = t->VpnOverIcmpListener;
SiApplySpecialListenerStatus(s);
ALog(a, NULL, "LA_SET_SPECIAL_LISTENER");
IncrementServerConfigRevision(s);
return ERR_NO_ERROR;
}
// Set configurations for OpenVPN and SSTP
UINT StSetOpenVpnSstpConfig(ADMIN *a, OPENVPN_SSTP_CONFIG *t)
{
PROTO *proto = a->Server->Proto;
PROTO_CONTAINER *container, tmp_c;
PROTO_OPTION *option, tmp_o;
UINT ret = ERR_NO_ERROR;
bool changed = false;
SERVER_ADMIN_ONLY;
if (proto == NULL)
{
return ERR_NOT_SUPPORTED;
}
tmp_o.Name = PROTO_OPTION_TOGGLE_NAME;
tmp_c.Name = "OpenVPN";
container = Search(proto->Containers, &tmp_c);
if (container != NULL)
{
option = Search(container->Options, &tmp_o);
if (option != NULL)
{
if (option->Type == PROTO_OPTION_BOOL)
{
option->Bool = t->EnableOpenVPN;
changed = true;
}
else
{
ret = ERR_INVALID_PARAMETER;
}
}
else
{
ret = ERR_OBJECT_NOT_FOUND;
}
}
else
{
ret = ERR_OBJECT_NOT_FOUND;
}
tmp_c.Name = "SSTP";
container = Search(proto->Containers, &tmp_c);
if (container != NULL)
{
option = Search(container->Options, &tmp_o);
if (option != NULL)
{
if (option->Type == PROTO_OPTION_BOOL)
{
option->Bool = t->EnableSSTP;
changed = true;
}
else
{
ret = ERR_INVALID_PARAMETER;
}
}
else
{
ret = ERR_OBJECT_NOT_FOUND;
}
}
else
{
ret = ERR_OBJECT_NOT_FOUND;
}
if (changed)
{
ALog(a, NULL, "LA_SET_OVPN_SSTP_CONFIG");
IncrementServerConfigRevision(a->Server);
}
return ret;
}
// Get configurations for OpenVPN and SSTP
UINT StGetOpenVpnSstpConfig(ADMIN *a, OPENVPN_SSTP_CONFIG *t)
{
PROTO *proto = a->Server->Proto;
if (proto == NULL)
{
return ERR_NOT_SUPPORTED;
}
t->EnableOpenVPN = ProtoEnabled(proto, "OpenVPN");
t->EnableSSTP = ProtoEnabled(proto, "SSTP");
return ERR_NO_ERROR;
}
// Get status of DDNS client
UINT StGetDDnsClientStatus(ADMIN *a, DDNS_CLIENT_STATUS *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
if (s->DDnsClient == NULL)
{
return ERR_NOT_SUPPORTED;
}
Zero(t, sizeof(DDNS_CLIENT_STATUS));
DCGetStatus(s->DDnsClient, t);
return ERR_NO_ERROR;
}
// Change host-name for DDNS client
UINT StChangeDDnsClientHostname(ADMIN *a, RPC_TEST *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
if (s->DDnsClient == NULL)
{
return ERR_NOT_SUPPORTED;
}
ret = DCChangeHostName(s->DDnsClient, t->StrValue);
if (ret == ERR_NO_ERROR)
{
ALog(a, NULL, "LA_DDNS_HOSTNAME_CHANGED", t->StrValue);
}
IncrementServerConfigRevision(s);
return ret;
}
// Regenerate server certification
UINT StRegenerateServerCert(ADMIN *a, RPC_TEST *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
X *x;
K *k;
SERVER_ADMIN_ONLY;
SiGenerateDefaultCertEx(&x, &k, t->StrValue);
SetCedarCert(c, x, k);
ALog(a, NULL, "LA_REGENERATE_SERVER_CERT", t->StrValue);
IncrementServerConfigRevision(s);
FreeX(x);
FreeK(k);
return ERR_NO_ERROR;
}
// Generate OpenVPN configuration files
UINT StMakeOpenVpnConfigFile(ADMIN *a, RPC_READ_LOG_FILE *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
ZIP_PACKER *p;
FIFO *f;
BUF *readme_buf;
BUF *readme_pdf_buf;
BUF *sample_buf;
LIST *port_list;
char my_hostname[MAX_SIZE];
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType != SERVER_TYPE_STANDALONE)
{
return ERR_NOT_SUPPORTED;
}
if (ProtoEnabled(s->Proto, "OpenVPN") == false)
{
return ERR_OPENVPN_IS_NOT_ENABLED;
}
port_list = s->PortsUDP;
FreeRpcReadLogFile(t);
Zero(t, sizeof(RPC_READ_LOG_FILE));
p = NewZipPacker();
// readme.txt
readme_buf = ReadDump("|openvpn_readme.txt");
// readme.pdf
readme_pdf_buf = ReadDump("|openvpn_readme.pdf");
// sample.ovpn
sample_buf = ReadDump("|openvpn_sample.ovpn");
// host name
GetMachineHostName(my_hostname, sizeof(my_hostname));
my_hostname[16] = 0;
if (readme_buf == NULL || sample_buf == NULL || readme_pdf_buf == NULL)
{
ret = ERR_INTERNAL_ERROR;
}
else
{
BUF *config_l3_buf, *config_l2_buf;
X *x = NULL;
BUF *x_buf;
char protocol[MAX_SIZE];
UINT port = OPENVPN_UDP_PORT;
char port_str[MAX_SIZE];
char hostname[MAX_SIZE];
char tag_before_hostname[MAX_SIZE];
DDNS_CLIENT_STATUS ddns;
UCHAR *zero_buffer;
UINT zero_buffer_size = 128 * 1024;
char name_tmp[MAX_SIZE];
zero_buffer = ZeroMalloc(zero_buffer_size);
if (x == NULL)
{
Lock(c->lock);
{
x = CloneX(c->ServerX);
}
Unlock(c->lock);
if (x != NULL)
{
// Get the root certificate
if (x->root_cert == false)
{
X *root_x = NULL;
LIST *cert_list = NewCertList(true);
if (TryGetRootCertChain(cert_list, x, true, &root_x))
{
FreeX(x);
x = root_x;
}
FreeCertList(cert_list);
}
}
}
x_buf = XToBuf(x, true);
SeekBufToEnd(x_buf);
WriteBufChar(x_buf, 0);
SeekBufToBegin(x_buf);
FreeX(x);
Zero(hostname, sizeof(hostname));
Zero(tag_before_hostname, sizeof(tag_before_hostname));
Zero(&ddns, sizeof(ddns));
if (s->DDnsClient != NULL)
{
DCGetStatus(s->DDnsClient, &ddns);
if (IsEmptyStr(ddns.CurrentHostName) == false && IsEmptyStr(ddns.DnsSuffix) == false &&
ddns.Err_IPv4 == ERR_NO_ERROR)
{
StrCpy(tag_before_hostname, sizeof(tag_before_hostname),
"# Note: The below hostname is came from the Dynamic DNS Client function\r\n"
"# which is running on the VPN Server. If you don't want to use\r\n"
"# the Dynamic DNS hostname, replace it to either IP address or\r\n"
"# other domain's hostname.\r\n\r\n");
Format(hostname, sizeof(hostname), "%s.v4%s", ddns.CurrentHostName, ddns.DnsSuffix);
}
}
if (IsEmptyStr(hostname))
{
IP myip;
Zero(&myip, sizeof(myip));
GetCurrentGlobalIP(&myip, false);
if (IsZeroIP(&myip))
{
GetCurrentGlobalIPGuess(&myip, false);
}
IPToStr(hostname, sizeof(hostname), &myip);
}
SeekBuf(sample_buf, sample_buf->Size, 0);
WriteBuf(sample_buf, zero_buffer, zero_buffer_size);
config_l3_buf = CloneBuf(sample_buf);
config_l2_buf = CloneBuf(sample_buf);
// Generate contents of configuration
if (LIST_NUM(port_list) >= 1)
{
StrCpy(protocol, sizeof(protocol), "udp");
if (IsIntInList(port_list, OPENVPN_UDP_PORT))
{
port = OPENVPN_UDP_PORT;
}
else
{
port = *((UINT *)(LIST_DATA(port_list, 0)));
}
}
else
{
RPC_LISTENER_LIST tt;
UINT i;
port = 0;
StrCpy(protocol, sizeof(protocol), "tcp");
Zero(&tt, sizeof(tt));
StEnumListener(a, &tt);
for (i = 0;i < tt.NumPort;i++)
{
if (tt.Enables[i] && tt.Errors[i] == false)
{
port = tt.Ports[i];
break;
}
}
FreeRpcListenerList(&tt);
if (port == 0)
{
StrCpy(protocol, sizeof(protocol), "udp");
port = OPENVPN_UDP_PORT;
}
}
ToStr(port_str, port);
if (IsEmptyStr(my_hostname) == false)
{
StrCat(my_hostname, sizeof(my_hostname), "_");
StrLower(my_hostname);
}
ZipAddFileSimple(p, "readme.txt", LocalTime64(), 0, readme_buf->Buf, readme_buf->Size);
ZipAddFileSimple(p, "readme.pdf", LocalTime64(), 0, readme_pdf_buf->Buf, readme_pdf_buf->Size);
ReplaceStrEx((char *)config_l3_buf->Buf, config_l3_buf->Size, (char *)config_l3_buf->Buf,
"$TAG_TUN_TAP$", "tun", false);
ReplaceStrEx((char *)config_l3_buf->Buf, config_l3_buf->Size, (char *)config_l3_buf->Buf,
"$TAG_PROTO$", protocol, false);
ReplaceStrEx((char *)config_l3_buf->Buf, config_l3_buf->Size, (char *)config_l3_buf->Buf,
"$TAG_HOSTNAME$", hostname, false);
ReplaceStrEx((char *)config_l3_buf->Buf, config_l3_buf->Size, (char *)config_l3_buf->Buf,
"$TAG_BEFORE_REMOTE$", tag_before_hostname, false);
ReplaceStrEx((char *)config_l3_buf->Buf, config_l3_buf->Size, (char *)config_l3_buf->Buf,
"$TAG_PORT$", port_str, false);
if (x_buf != NULL)
{
ReplaceStrEx((char *)config_l3_buf->Buf, config_l3_buf->Size, (char *)config_l3_buf->Buf,
"$CA$", x_buf->Buf, false);
}
Format(name_tmp, sizeof(name_tmp), "%sopenvpn_remote_access_l3.ovpn", my_hostname);
ZipAddFileSimple(p, name_tmp, LocalTime64(), 0, config_l3_buf->Buf, StrLen(config_l3_buf->Buf));
ReplaceStrEx((char *)config_l2_buf->Buf, config_l2_buf->Size, (char *)config_l2_buf->Buf,
"$TAG_TUN_TAP$", "tap", false);
ReplaceStrEx((char *)config_l2_buf->Buf, config_l2_buf->Size, (char *)config_l2_buf->Buf,
"$TAG_PROTO$", protocol, false);
ReplaceStrEx((char *)config_l2_buf->Buf, config_l2_buf->Size, (char *)config_l2_buf->Buf,
"$TAG_HOSTNAME$", hostname, false);
ReplaceStrEx((char *)config_l2_buf->Buf, config_l2_buf->Size, (char *)config_l2_buf->Buf,
"$TAG_BEFORE_REMOTE$", tag_before_hostname, false);
ReplaceStrEx((char *)config_l2_buf->Buf, config_l2_buf->Size, (char *)config_l2_buf->Buf,
"$TAG_PORT$", port_str, false);
if (x_buf != NULL)
{
ReplaceStrEx((char *)config_l2_buf->Buf, config_l2_buf->Size, (char *)config_l2_buf->Buf,
"$CA$", x_buf->Buf, false);
}
Format(name_tmp, sizeof(name_tmp), "%sopenvpn_site_to_site_bridge_l2.ovpn", my_hostname);
ZipAddFileSimple(p, name_tmp, LocalTime64(), 0, config_l2_buf->Buf, StrLen(config_l2_buf->Buf));
FreeBuf(config_l3_buf);
FreeBuf(config_l2_buf);
f = ZipFinish(p);
if (f != NULL)
{
t->Buffer = NewBuf();
WriteBuf(t->Buffer, FifoPtr(f), FifoSize(f));
SeekBuf(t->Buffer, 0, 0);
}
FreeBuf(readme_buf);
FreeBuf(sample_buf);
FreeBuf(readme_pdf_buf);
FreeBuf(x_buf);
Free(zero_buffer);
}
FreeZipPacker(p);
return ERR_NO_ERROR;
}
// Set IPsec service configuration
UINT StSetIPsecServices(ADMIN *a, IPSEC_SERVICES *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
if (GetServerCapsBool(s, "b_support_ipsec") == false || s->IPsecServer == NULL)
{
return ERR_NOT_SUPPORTED;
}
IPsecServerSetServices(s->IPsecServer, t);
ALog(a, NULL, "LA_SET_IPSEC_CONFIG");
IncrementServerConfigRevision(s);
return ERR_NO_ERROR;
}
// Get IPsec service configuration
UINT StGetIPsecServices(ADMIN *a, IPSEC_SERVICES *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
if (GetServerCapsBool(s, "b_support_ipsec") == false || s->IPsecServer == NULL)
{
return ERR_NOT_SUPPORTED;
}
Zero(t, sizeof(IPSEC_SERVICES));
IPsecServerGetServices(s->IPsecServer, t);
return ERR_NO_ERROR;
}
// Add EtherIP ID setting
UINT StAddEtherIpId(ADMIN *a, ETHERIP_ID *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
if (GetServerCapsBool(s, "b_support_ipsec") == false || s->IPsecServer == NULL)
{
return ERR_NOT_SUPPORTED;
}
AddEtherIPId(s->IPsecServer, t);
ALog(a, NULL, "LA_ADD_ETHERIP_ID", t->Id);
IncrementServerConfigRevision(s);
return ERR_NO_ERROR;
}
// Get EtherIP ID setting
UINT StGetEtherIpId(ADMIN *a, ETHERIP_ID *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
char id[MAX_SIZE];
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
if (GetServerCapsBool(s, "b_support_ipsec") == false || s->IPsecServer == NULL)
{
return ERR_NOT_SUPPORTED;
}
StrCpy(id, sizeof(id), t->Id);
Zero(t, sizeof(ETHERIP_ID));
if (SearchEtherIPId(s->IPsecServer, t, id) == false)
{
return ERR_OBJECT_NOT_FOUND;
}
return ERR_NO_ERROR;
}
// Delete EtherIP ID setting
UINT StDeleteEtherIpId(ADMIN *a, ETHERIP_ID *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
char id[MAX_SIZE];
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
if (GetServerCapsBool(s, "b_support_ipsec") == false || s->IPsecServer == NULL)
{
return ERR_NOT_SUPPORTED;
}
StrCpy(id, sizeof(id), t->Id);
if (DeleteEtherIPId(s->IPsecServer, id) == false)
{
return ERR_OBJECT_NOT_FOUND;
}
ALog(a, NULL, "LA_DEL_ETHERIP_ID", id);
IncrementServerConfigRevision(s);
return ERR_NO_ERROR;
}
// Enumerate EtherIP ID settings
UINT StEnumEtherIpId(ADMIN *a, RPC_ENUM_ETHERIP_ID *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
if (GetServerCapsBool(s, "b_support_ipsec") == false || s->IPsecServer == NULL)
{
return ERR_NOT_SUPPORTED;
}
FreeRpcEnumEtherIpId(t);
Zero(t, sizeof(RPC_ENUM_ETHERIP_ID));
Lock(s->IPsecServer->LockSettings);
{
UINT i;
UINT num;
num = LIST_NUM(s->IPsecServer->EtherIPIdList);
t->NumItem = num;
t->IdList = ZeroMalloc(sizeof(ETHERIP_ID) * num);
for (i = 0;i < num;i++)
{
ETHERIP_ID *d = &t->IdList[i];
ETHERIP_ID *src = LIST_DATA(s->IPsecServer->EtherIPIdList, i);
Copy(d, src, sizeof(ETHERIP_ID));
}
}
Unlock(s->IPsecServer->LockSettings);
return ERR_NO_ERROR;
}
// Set message of today on hub
UINT StSetHubMsg(ADMIN *a, RPC_MSG *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
if (UniStrLen(t->Msg) > HUB_MAXMSG_LEN)
{
return ERR_MEMORY_NOT_ENOUGH;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
h = GetHub(c, hubname);
if (h == NULL)
{
ret = ERR_HUB_NOT_FOUND;
}
else
{
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_msg") != 0)
{
ret = ERR_NOT_ENOUGH_RIGHT;
}
else
{
SetHubMsg(h, t->Msg);
}
ReleaseHub(h);
}
IncrementServerConfigRevision(s);
return ret;
}
// Get message of today on hub
UINT StGetHubMsg(ADMIN *a, RPC_MSG *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
if (UniStrLen(t->Msg) > HUB_MAXMSG_LEN)
{
return ERR_MEMORY_NOT_ENOUGH;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
h = GetHub(c, hubname);
if (h == NULL)
{
ret = ERR_HUB_NOT_FOUND;
}
else
{
FreeRpcMsg(t);
Zero(t, sizeof(RPC_MSG));
t->Msg = GetHubMsg(h);
ReleaseHub(h);
}
return ret;
}
// Do debug function
UINT StDebug(ADMIN *a, RPC_TEST *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
RPC_TEST t2;
SERVER_ADMIN_ONLY;
Zero(&t2, sizeof(t2));
ret = SiDebug(s, &t2, t->IntValue, t->StrValue);
if (ret == ERR_NO_ERROR)
{
Copy(t, &t2, sizeof(RPC_TEST));
}
else
{
Zero(t, sizeof(RPC_TEST));
}
return ret;
}
// Flush configuration file
UINT StFlush(ADMIN *a, RPC_TEST *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
UINT size;
SERVER_ADMIN_ONLY;
size = SiWriteConfigurationFile(s);
t->IntValue = size;
return ERR_NO_ERROR;
}
// Do Crash
UINT StCrash(ADMIN *a, RPC_TEST *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
SERVER_ADMIN_ONLY;
#ifdef OS_WIN32
MsSetEnableMinidump(false);
#endif // OS_WIN32
CrashNow();
return ERR_NO_ERROR;
}
// Get message for administrators
UINT StGetAdminMsg(ADMIN *a, RPC_MSG *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
RPC_WINVER server_ver;
RPC_WINVER client_ver;
wchar_t winver_msg_client[3800];
wchar_t winver_msg_server[3800];
UINT tmpsize;
wchar_t *tmp;
FreeRpcMsg(t);
Zero(t, sizeof(RPC_MSG));
// Check for Windows version
GetWinVer(&server_ver);
Copy(&client_ver, &a->ClientWinVer, sizeof(RPC_WINVER));
Zero(winver_msg_client, sizeof(winver_msg_client));
Zero(winver_msg_server, sizeof(winver_msg_server));
if (IsSupportedWinVer(&client_ver) == false)
{
SYSTEMTIME st;
LocalTime(&st);
UniFormat(winver_msg_client, sizeof(winver_msg_client), _UU("WINVER_ERROR_FORMAT"),
_UU("WINVER_ERROR_PC_LOCAL"),
client_ver.Title,
_UU("WINVER_ERROR_VPNSERVER"),
SUPPORTED_WINDOWS_LIST,
_UU("WINVER_ERROR_PC_LOCAL"),
_UU("WINVER_ERROR_VPNSERVER"),
_UU("WINVER_ERROR_VPNSERVER"),
_UU("WINVER_ERROR_VPNSERVER"),
st.wYear, st.wMonth);
}
if (IsSupportedWinVer(&server_ver) == false)
{
SYSTEMTIME st;
LocalTime(&st);
UniFormat(winver_msg_server, sizeof(winver_msg_server), _UU("WINVER_ERROR_FORMAT"),
_UU("WINVER_ERROR_PC_REMOTE"),
server_ver.Title,
_UU("WINVER_ERROR_VPNSERVER"),
SUPPORTED_WINDOWS_LIST,
_UU("WINVER_ERROR_PC_REMOTE"),
_UU("WINVER_ERROR_VPNSERVER"),
_UU("WINVER_ERROR_VPNSERVER"),
_UU("WINVER_ERROR_VPNSERVER"),
st.wYear, st.wMonth);
}
tmpsize = UniStrSize(winver_msg_client) + UniStrSize(winver_msg_server) + 10000;
tmp = ZeroMalloc(tmpsize);
if (
c->Bridge == false)
{
if (GetGlobalServerFlag(GSF_SHOW_OSS_MSG) != 0)
{
UniStrCat(tmp, tmpsize, _UU("OSS_MSG"));
}
}
UniStrCat(tmp, tmpsize, winver_msg_client);
UniStrCat(tmp, tmpsize, winver_msg_server);
t->Msg = tmp;
return ERR_NO_ERROR;
}
// Enumerate VLAN tag transparent setting
UINT StEnumEthVLan(ADMIN *a, RPC_ENUM_ETH_VLAN *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
SERVER_ADMIN_ONLY;
#ifdef OS_WIN32
if (GetServerCapsBool(s, "b_support_eth_vlan") == false)
{
ret = ERR_NOT_SUPPORTED;
}
else
{
FreeRpcEnumEthVLan(t);
Zero(t, sizeof(RPC_ENUM_ETH_VLAN));
if (EnumEthVLanWin32(t) == false)
{
ret = ERR_INTERNAL_ERROR;
}
}
#else // OS_WIN32
ret = ERR_NOT_SUPPORTED;
#endif // OS_WIN32
return ret;
}
// Set VLAN tag transparent setting
UINT StSetEnableEthVLan(ADMIN *a, RPC_TEST *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
SERVER_ADMIN_ONLY;
#ifdef OS_WIN32
if (GetServerCapsBool(s, "b_support_eth_vlan") == false)
{
ret = ERR_NOT_SUPPORTED;
}
else if (MsIsAdmin() == false)
{
ret = ERR_NOT_ENOUGH_RIGHT;
}
else
{
if (SetVLanEnableStatus(t->StrValue, MAKEBOOL(t->IntValue)) == false)
{
ret = ERR_INTERNAL_ERROR;
}
}
#else // OS_WIN32
ret = ERR_NOT_SUPPORTED;
#endif // OS_WIN32
return ret;
}
// Get license status
UINT StGetLicenseStatus(ADMIN *a, RPC_LICENSE_STATUS *t)
{
return ERR_NOT_SUPPORTED;
}
// Enumerate license key
UINT StEnumLicenseKey(ADMIN *a, RPC_ENUM_LICENSE_KEY *t)
{
return ERR_NOT_SUPPORTED;
}
// Add new license key
UINT StAddLicenseKey(ADMIN *a, RPC_TEST *t)
{
return ERR_NOT_SUPPORTED;
}
// Delete a license key
UINT StDelLicenseKey(ADMIN *a, RPC_TEST *t)
{
return ERR_NOT_SUPPORTED;
}
// Download a log file
BUF *DownloadFileFromServer(RPC *r, char *server_name, char *filepath, UINT total_size, DOWNLOAD_PROC *proc, void *param)
{
UINT offset;
BUF *buf;
// Validate arguments
if (r == NULL || filepath == NULL)
{
return NULL;
}
if (server_name == NULL)
{
server_name = "";
}
offset = 0;
buf = NewBuf();
while (true)
{
DOWNLOAD_PROGRESS g;
RPC_READ_LOG_FILE t;
UINT ret;
Zero(&t, sizeof(t));
StrCpy(t.FilePath, sizeof(t.FilePath), filepath);
t.Offset = offset;
StrCpy(t.ServerName, sizeof(t.ServerName), server_name);
ret = ScReadLogFile(r, &t);
if (ret != ERR_NO_ERROR)
{
// Failed
FreeRpcReadLogFile(&t);
FreeBuf(buf);
return NULL;
}
if (t.Buffer == NULL)
{
// read to the end
break;
}
// Update current progress
offset += t.Buffer->Size;
Zero(&g, sizeof(g));
g.Param = param;
g.CurrentSize = offset;
g.TotalSize = MAX(total_size, offset);
g.ProgressPercent = (UINT)(MAKESURE((UINT64)g.CurrentSize * 100ULL / (UINT64)(MAX(g.TotalSize, 1)), 0, 100ULL));
WriteBuf(buf, t.Buffer->Buf, t.Buffer->Size);
FreeRpcReadLogFile(&t);
if (proc != NULL)
{
if (proc(&g) == false)
{
// Canceled by user
FreeBuf(buf);
return NULL;
}
}
}
if (buf->Size == 0)
{
// Downloading failed
FreeBuf(buf);
return NULL;
}
return buf;
}
// Read a log file
UINT StReadLogFile(ADMIN *a, RPC_READ_LOG_FILE *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
char logfilename[MAX_PATH];
char servername[MAX_HOST_NAME_LEN + 1];
UINT offset;
bool local = true;
if (IsEmptyStr(t->FilePath))
{
return ERR_INVALID_PARAMETER;
}
StrCpy(logfilename, sizeof(logfilename), t->FilePath);
StrCpy(servername, sizeof(servername), t->ServerName);
offset = t->Offset;
if (s->ServerType != SERVER_TYPE_FARM_CONTROLLER)
{
GetMachineName(servername, sizeof(servername));
}
// Check the permission to read the log file
if (a->LogFileList == NULL)
{
// Enum the log files first
RPC_ENUM_LOG_FILE elf;
UINT elf_ret;
Zero(&elf, sizeof(elf));
elf_ret = StEnumLogFile(a, &elf);
FreeRpcEnumLogFile(&elf);
if (elf_ret != ERR_NO_ERROR)
{
return elf_ret;
}
}
if (CheckLogFileNameFromEnumList(a->LogFileList, logfilename, servername) == false)
{
// There is no such file in the log file list
return ERR_OBJECT_NOT_FOUND;
}
FreeRpcReadLogFile(t);
Zero(t, sizeof(RPC_READ_LOG_FILE));
if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
{
UINT i;
// When the host name in request is a cluster member, redirect the request
LockList(s->FarmMemberList);
{
for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
{
FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
if (f->Me == false)
{
if (StrCmpi(f->hostname, servername) == 0)
{
RPC_READ_LOG_FILE tt;
Zero(&tt, sizeof(tt));
local = false;
StrCpy(tt.ServerName, sizeof(tt.ServerName), servername);
StrCpy(tt.FilePath, sizeof(tt.FilePath), logfilename);
tt.Offset = offset;
if (SiCallReadLogFile(s, f, &tt))
{
if (tt.Buffer != NULL && tt.Buffer->Size > 0)
{
t->Buffer = NewBuf();
WriteBuf(t->Buffer, tt.Buffer->Buf, tt.Buffer->Size);
}
}
FreeRpcReadLogFile(&tt);
break;
}
}
}
}
UnlockList(s->FarmMemberList);
}
// Read a local file
if (local)
{
SiReadLocalLogFile(s, logfilename, offset, t);
}
if (offset == 0)
{
ALog(a, NULL, "LA_READ_LOG_FILE", servername, logfilename);
}
StrCpy(t->FilePath, sizeof(t->FilePath), logfilename);
StrCpy(t->ServerName, sizeof(t->ServerName), servername);
t->Offset = offset;
return ERR_NO_ERROR;
}
// Enumerate log files
UINT StEnumLogFile(ADMIN *a, RPC_ENUM_LOG_FILE *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT i;
bool no_access = false;
HUB *h;
if (a->ServerAdmin == false)
{
h = GetHub(c, a->HubName);
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_read_log_file") != 0)
{
no_access = true;
}
ReleaseHub(h);
}
else
{
if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
{
// Since Management session will become unstable if log files are
// enumerated on a cluster controller, it forbids.
return ERR_NOT_SUPPORTED;
}
}
if (no_access)
{
return ERR_NOT_ENOUGH_RIGHT;
}
FreeRpcEnumLogFile(t);
Zero(t, sizeof(RPC_ENUM_LOG_FILE));
// Enumerate local log files
SiEnumLocalLogFileList(s, a->ServerAdmin ? NULL : a->HubName, t);
if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
{
UINT i;
LIST *tt_list = NewListFast(NULL);
LockList(s->FarmMemberList);
{
for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
{
FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
if (f->Me == false)
{
// Enumerate log files on other cluster members.
RPC_ENUM_LOG_FILE *tt;
tt = ZeroMalloc(sizeof(RPC_ENUM_LOG_FILE));
if (SiCallEnumLogFileList(s, f, tt, a->ServerAdmin ? "" : a->HubName))
{
UINT i;
for (i = 0;i < tt->NumItem;i++)
{
RPC_ENUM_LOG_FILE_ITEM *e = &tt->Items[i];
StrCpy(e->ServerName, sizeof(e->ServerName), f->hostname);
}
Add(tt_list, tt);
}
else
{
Free(tt);
}
}
}
}
UnlockList(s->FarmMemberList);
for (i = 0;i < LIST_NUM(tt_list);i++)
{
RPC_ENUM_LOG_FILE *tt = LIST_DATA(tt_list, i);
AdjoinRpcEnumLogFile(t, tt);
FreeRpcEnumLogFile(tt);
Free(tt);
}
ReleaseList(tt_list);
}
// Cache the last list of log files on RPC session
if (a->LogFileList != NULL)
{
FreeEnumLogFile(a->LogFileList);
}
a->LogFileList = NewListFast(CmpLogFile);
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_LOG_FILE_ITEM *e = &t->Items[i];
LOG_FILE *f = ZeroMalloc(sizeof(LOG_FILE));
f->FileSize = e->FileSize;
f->UpdatedTime = e->UpdatedTime;
StrCpy(f->Path, sizeof(f->Path), e->FilePath);
StrCpy(f->ServerName, sizeof(f->ServerName), e->ServerName);
Insert(a->LogFileList, f);
}
return ERR_NO_ERROR;
}
// Get access control list
UINT StGetAcList(ADMIN *a, RPC_AC_LIST *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
FreeRpcAcList(t);
Zero(t, sizeof(RPC_AC_LIST));
StrCpy(t->HubName, sizeof(t->HubName), hubname);
h = GetHub(c, hubname);
if (h == NULL)
{
ret = ERR_HUB_NOT_FOUND;
}
else
{
if (h->HubDb == NULL)
{
ret = ERR_NOT_SUPPORTED;
}
else
{
HUBDB *db = h->HubDb;
LockList(db->AcList);
{
t->o = NewAcList();
SetAcList(t->o, db->AcList);
}
UnlockList(db->AcList);
}
ReleaseHub(h);
}
return ret;
}
// Set access control list
UINT StSetAcList(ADMIN *a, RPC_AC_LIST *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
if (c->Bridge)
{
return ERR_NOT_SUPPORTED;
}
if (GetGlobalServerFlag(GSF_DISABLE_AC) != 0 && LIST_NUM(t->o) >= 1)
{
return ERR_NOT_SUPPORTED_FUNCTION_ON_OPENSOURCE;
}
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
h = GetHub(c, hubname);
if (h == NULL)
{
ret = ERR_HUB_NOT_FOUND;
}
else
{
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_access_control_list") != 0)
{
ret = ERR_NOT_ENOUGH_RIGHT;
}
else
{
if (h->HubDb == NULL)
{
ret = ERR_NOT_SUPPORTED;
}
else
{
HUBDB *db = h->HubDb;
LockList(db->AcList);
{
SetAcList(db->AcList, t->o);
{
ALog(a, h, "LA_SET_AC_LIST", LIST_NUM(t->o));
IncrementServerConfigRevision(s);
}
}
UnlockList(db->AcList);
}
}
ReleaseHub(h);
}
return ret;
}
// Set CRL (Certificate Revocation List) entry
UINT StSetCrl(ADMIN *a, RPC_CRL *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
UINT key;
char hubname[MAX_HUBNAME_LEN + 1];
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
key = t->Key;
h = GetHub(c, hubname);
if (h == NULL)
{
ret = ERR_HUB_NOT_FOUND;
}
else
{
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_crl_list") != 0)
{
ret = ERR_NOT_ENOUGH_RIGHT;
}
else
{
if (h->HubDb == NULL)
{
ret = ERR_NOT_SUPPORTED;
}
else
{
LockList(h->HubDb->CrlList);
{
CRL *crl = ListKeyToPointer(h->HubDb->CrlList, t->Key);
if (crl == NULL)
{
ret = ERR_OBJECT_NOT_FOUND;
}
else
{
CRL *new_crl = CopyCrl(t->Crl);
if (ReplaceListPointer(h->HubDb->CrlList, crl, new_crl))
{
ALog(a, h, "LA_ADD_CRL");
FreeCrl(crl);
IncrementServerConfigRevision(s);
}
}
}
UnlockList(h->HubDb->CrlList);
}
}
ReleaseHub(h);
}
return ret;
}
// Get CRL (Certificate Revocation List) entry
UINT StGetCrl(ADMIN *a, RPC_CRL *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
UINT key;
char hubname[MAX_HUBNAME_LEN + 1];
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
key = t->Key;
FreeRpcCrl(t);
Zero(t, sizeof(RPC_CRL));
StrCpy(t->HubName, sizeof(t->HubName), hubname);
t->Key = key;
h = GetHub(c, hubname);
if (h == NULL)
{
ret = ERR_HUB_NOT_FOUND;
}
else
{
if (h->HubDb == NULL)
{
ret = ERR_NOT_SUPPORTED;
}
else
{
LockList(h->HubDb->CrlList);
{
CRL *crl = ListKeyToPointer(h->HubDb->CrlList, t->Key);
if (crl == NULL)
{
ret = ERR_OBJECT_NOT_FOUND;
}
else
{
t->Crl = CopyCrl(crl);
}
}
UnlockList(h->HubDb->CrlList);
}
ReleaseHub(h);
}
return ret;
}
// Delete CRL (Certificate Revocation List) entry
UINT StDelCrl(ADMIN *a, RPC_CRL *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
h = GetHub(c, hubname);
if (h == NULL)
{
ret = ERR_HUB_NOT_FOUND;
}
else
{
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_crl_list") != 0)
{
ret = ERR_NOT_ENOUGH_RIGHT;
}
else
{
if (h->HubDb == NULL)
{
ret = ERR_NOT_SUPPORTED;
}
else
{
LockList(h->HubDb->CrlList);
{
CRL *crl = ListKeyToPointer(h->HubDb->CrlList, t->Key);
if (crl == NULL)
{
ret = ERR_OBJECT_NOT_FOUND;
}
else
{
ALog(a, h, "LA_DEL_CRL");
FreeCrl(crl);
Delete(h->HubDb->CrlList, crl);
}
}
UnlockList(h->HubDb->CrlList);
}
}
ReleaseHub(h);
}
return ret;
}
// Add new CRL (Certificate Revocation List) entry
UINT StAddCrl(ADMIN *a, RPC_CRL *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
if (c->Bridge)
{
return ERR_NOT_SUPPORTED;
}
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
h = GetHub(c, hubname);
if (h == NULL)
{
ret = ERR_HUB_NOT_FOUND;
}
else
{
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_crl_list") != 0)
{
ret = ERR_NOT_ENOUGH_RIGHT;
}
else
{
if (h->HubDb == NULL)
{
ret = ERR_NOT_SUPPORTED;
}
else
{
LockList(h->HubDb->CrlList);
{
if (LIST_NUM(h->HubDb->CrlList) < MAX_HUB_CRLS)
{
CRL *crl = CopyCrl(t->Crl);
Insert(h->HubDb->CrlList, crl);
ALog(a, h, "LA_SET_CRL");
IncrementServerConfigRevision(s);
}
}
UnlockList(h->HubDb->CrlList);
}
}
ReleaseHub(h);
}
return ret;
}
// Get CRL (Certificate Revocation List) index
UINT StEnumCrl(ADMIN *a, RPC_ENUM_CRL *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
FreeRpcEnumCrl(t);
Zero(t, sizeof(RPC_ENUM_CRL));
StrCpy(t->HubName, sizeof(t->HubName), hubname);
h = GetHub(c, hubname);
if (h == NULL)
{
ret = ERR_HUB_NOT_FOUND;
}
else
{
if (h->HubDb == NULL)
{
ret = ERR_NOT_SUPPORTED;
}
else
{
LockList(h->HubDb->CrlList);
{
UINT i;
t->NumItem = LIST_NUM(h->HubDb->CrlList);
t->Items = ZeroMalloc(sizeof(RPC_ENUM_CRL_ITEM) * t->NumItem);
for (i = 0;i < LIST_NUM(h->HubDb->CrlList);i++)
{
CRL *crl = LIST_DATA(h->HubDb->CrlList, i);
wchar_t *info = GenerateCrlStr(crl);
UniStrCpy(t->Items[i].CrlInfo, sizeof(t->Items[i].CrlInfo), info);
Free(info);
t->Items[i].Key = POINTER_TO_KEY(crl);
}
}
UnlockList(h->HubDb->CrlList);
}
ReleaseHub(h);
}
return ret;
}
// Get routing table on virtual L3 switch
UINT StEnumL3Table(ADMIN *a, RPC_ENUM_L3TABLE *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
L3SW *sw;
char name[MAX_HUBNAME_LEN + 1];
if (IsEmptyStr(t->Name))
{
return ERR_INVALID_PARAMETER;
}
NO_SUPPORT_FOR_BRIDGE;
StrCpy(name, sizeof(name), t->Name);
FreeRpcEnumL3Table(t);
Zero(t, sizeof(RPC_ENUM_L3TABLE));
StrCpy(t->Name, sizeof(t->Name), name);
sw = L3GetSw(c, t->Name);
if (sw == NULL)
{
ret = ERR_LAYER3_SW_NOT_FOUND;
}
else
{
UINT i;
Lock(sw->lock);
{
t->NumItem = LIST_NUM(sw->TableList);
t->Items = ZeroMalloc(sizeof(RPC_L3TABLE) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
L3TABLE *tbl = LIST_DATA(sw->TableList, i);
RPC_L3TABLE *e = &t->Items[i];
StrCpy(e->Name, sizeof(e->Name), name);
e->NetworkAddress = tbl->NetworkAddress;
e->SubnetMask = tbl->SubnetMask;
e->GatewayAddress = tbl->GatewayAddress;
e->Metric = tbl->Metric;
}
}
Unlock(sw->lock);
ReleaseL3Sw(sw);
}
return ret;
}
// Delete routing table entry on virtual L3 switch
UINT StDelL3Table(ADMIN *a, RPC_L3TABLE *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
L3SW *sw;
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
sw = L3GetSw(c, t->Name);
if (sw == NULL)
{
ret = ERR_LAYER3_SW_NOT_FOUND;
}
else
{
L3TABLE tbl;
Zero(&tbl, sizeof(tbl));
tbl.NetworkAddress = t->NetworkAddress;
tbl.SubnetMask = t->SubnetMask;
tbl.GatewayAddress = t->GatewayAddress;
tbl.Metric = t->Metric;
if (L3DelTable(sw, &tbl) == false)
{
ret = ERR_LAYER3_TABLE_DEL_FAILED;
}
else
{
char tmp[MAX_SIZE];
IPToStr32(tmp, sizeof(tmp), tbl.NetworkAddress);
ALog(a, NULL, "LA_DEL_L3_TABLE", tmp, t->Name);
IncrementServerConfigRevision(s);
}
ReleaseL3Sw(sw);
}
return ret;
}
// Add new routing table entry on virtual L3 switch
UINT StAddL3Table(ADMIN *a, RPC_L3TABLE *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
L3SW *sw;
if (IsNetworkAddress32(t->NetworkAddress, t->SubnetMask) == false ||
IsHostIPAddress32(t->GatewayAddress) == false)
{
return ERR_INVALID_PARAMETER;
}
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
sw = L3GetSw(c, t->Name);
if (sw == NULL)
{
ret = ERR_LAYER3_SW_NOT_FOUND;
}
else
{
L3TABLE tbl;
Zero(&tbl, sizeof(tbl));
tbl.NetworkAddress = t->NetworkAddress;
tbl.SubnetMask = t->SubnetMask;
tbl.GatewayAddress = t->GatewayAddress;
tbl.Metric = t->Metric;
if (L3AddTable(sw, &tbl) == false)
{
ret = ERR_LAYER3_TABLE_ADD_FAILED;
}
else
{
char tmp[MAX_SIZE];
IPToStr32(tmp, sizeof(tmp), tbl.NetworkAddress);
ALog(a, NULL, "LA_ADD_L3_TABLE", tmp, t->Name);
IncrementServerConfigRevision(s);
}
ReleaseL3Sw(sw);
}
return ret;
}
// Enumerate virtual interfaces on virtual L3 switch
UINT StEnumL3If(ADMIN *a, RPC_ENUM_L3IF *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
L3SW *sw;
char name[MAX_HUBNAME_LEN + 1];
NO_SUPPORT_FOR_BRIDGE;
StrCpy(name, sizeof(name), t->Name);
FreeRpcEnumL3If(t);
Zero(t, sizeof(RPC_ENUM_L3IF));
StrCpy(t->Name, sizeof(t->Name), name);
sw = L3GetSw(c, t->Name);
if (sw == NULL)
{
ret = ERR_LAYER3_SW_NOT_FOUND;
}
else
{
Lock(sw->lock);
{
UINT i;
t->NumItem = LIST_NUM(sw->IfList);
t->Items = ZeroMalloc(sizeof(RPC_L3IF) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
L3IF *f = LIST_DATA(sw->IfList, i);
RPC_L3IF *e = &t->Items[i];
StrCpy(e->Name, sizeof(e->Name), sw->Name);
StrCpy(e->HubName, sizeof(e->HubName), f->HubName);
e->IpAddress = f->IpAddress;
e->SubnetMask = f->SubnetMask;
}
}
Unlock(sw->lock);
ReleaseL3Sw(sw);
}
return ret;
}
// Delete a virtual interface on virtual L3 switch
UINT StDelL3If(ADMIN *a, RPC_L3IF *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
L3SW *sw;
NO_SUPPORT_FOR_BRIDGE;
SERVER_ADMIN_ONLY;
sw = L3GetSw(c, t->Name);
if (sw == NULL)
{
ret = ERR_LAYER3_SW_NOT_FOUND;
}
else
{
if (L3DelIf(sw, t->HubName) == false)
{
ret = ERR_LAYER3_IF_DEL_FAILED;
}
else
{
ALog(a, NULL, "LA_DEL_L3_IF", t->HubName, t->Name);
IncrementServerConfigRevision(s);
}
ReleaseL3Sw(sw);
}
return ret;
}
// Add new virtual interface on virtual L3 switch
UINT StAddL3If(ADMIN *a, RPC_L3IF *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
L3SW *sw;
if (IsSubnetMask32(t->SubnetMask) == false || IsHostIPAddress32(t->IpAddress) == false)
{
return ERR_INVALID_PARAMETER;
}
if ((t->IpAddress & (~t->SubnetMask)) == 0)
{
return ERR_INVALID_PARAMETER;
}
NO_SUPPORT_FOR_BRIDGE;
SERVER_ADMIN_ONLY;
sw = L3GetSw(c, t->Name);
if (sw == NULL)
{
ret = ERR_LAYER3_SW_NOT_FOUND;
}
else
{
Lock(sw->lock);
{
if (L3SearchIf(sw, t->HubName) != NULL)
{
// Already exists
ret = ERR_LAYER3_IF_EXISTS;
}
else
{
if (L3AddIf(sw, t->HubName, t->IpAddress, t->SubnetMask) == false)
{
ret = ERR_LAYER3_IF_ADD_FAILED;
}
else
{
ALog(a, NULL, "LA_ADD_L3_IF", t->HubName, t->Name);
IncrementServerConfigRevision(s);
}
}
}
Unlock(sw->lock);
ReleaseL3Sw(sw);
}
return ret;
}
// Stop a virtual layer-3 switch
UINT StStopL3Switch(ADMIN *a, RPC_L3SW *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
L3SW *sw;
if (IsEmptyStr(t->Name))
{
return ERR_INVALID_PARAMETER;
}
NO_SUPPORT_FOR_BRIDGE;
SERVER_ADMIN_ONLY;
sw = L3GetSw(c, t->Name);
if (sw == NULL)
{
ret = ERR_LAYER3_SW_NOT_FOUND;
}
else
{
L3SwStop(sw);
ALog(a, NULL, "LA_STOP_L3_SW", sw->Name);
ReleaseL3Sw(sw);
IncrementServerConfigRevision(s);
}
return ret;
}
// Start a virtual layer-3 switch
UINT StStartL3Switch(ADMIN *a, RPC_L3SW *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
L3SW *sw;
if (IsEmptyStr(t->Name))
{
return ERR_INVALID_PARAMETER;
}
NO_SUPPORT_FOR_BRIDGE;
SERVER_ADMIN_ONLY;
sw = L3GetSw(c, t->Name);
if (sw == NULL)
{
ret = ERR_LAYER3_SW_NOT_FOUND;
}
else
{
Lock(sw->lock);
{
// Count the registered virtual interfaces
if (LIST_NUM(sw->IfList) >= 1)
{
L3SwStart(sw);
ALog(a, NULL, "LA_START_L3_SW", sw->Name);
IncrementServerConfigRevision(s);
}
else
{
ret = ERR_LAYER3_CANT_START_SWITCH;
}
}
Unlock(sw->lock);
ReleaseL3Sw(sw);
}
return ret;
}
// Enumerate virtual layer-3 switches
UINT StEnumL3Switch(ADMIN *a, RPC_ENUM_L3SW *t)
{
UINT i;
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
NO_SUPPORT_FOR_BRIDGE;
FreeRpcEnumL3Sw(t);
Zero(t, sizeof(RPC_ENUM_L3SW));
LockList(c->L3SwList);
{
t->NumItem = LIST_NUM(c->L3SwList);
t->Items = ZeroMalloc(sizeof(RPC_ENUM_L3SW_ITEM) * t->NumItem);
for (i = 0;i < LIST_NUM(c->L3SwList);i++)
{
L3SW *sw = LIST_DATA(c->L3SwList, i);
RPC_ENUM_L3SW_ITEM *e = &t->Items[i];
Lock(sw->lock);
{
StrCpy(e->Name, sizeof(e->Name), sw->Name);
e->NumInterfaces = LIST_NUM(sw->IfList);
e->NumTables = LIST_NUM(sw->TableList);
e->Active = sw->Active;
e->Online = sw->Online;
}
Unlock(sw->lock);
}
}
UnlockList(c->L3SwList);
return ret;
}
// Delete a virtual layer-3 switch
UINT StDelL3Switch(ADMIN *a, RPC_L3SW *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
if (IsEmptyStr(t->Name))
{
return ERR_INVALID_PARAMETER;
}
NO_SUPPORT_FOR_BRIDGE;
SERVER_ADMIN_ONLY;
if (L3DelSw(c, t->Name) == false)
{
ret = ERR_LAYER3_SW_NOT_FOUND;
}
else
{
ALog(a, NULL, "LA_DEL_L3_SW", t->Name);
IncrementServerConfigRevision(s);
}
return ret;
}
// Add a new virtual layer-3 switch
UINT StAddL3Switch(ADMIN *a, RPC_L3SW *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
L3SW *sw;
NO_SUPPORT_FOR_BRIDGE;
if (IsEmptyStr(t->Name))
{
return ERR_INVALID_PARAMETER;
}
if (IsSafeStr(t->Name) == false)
{
return ERR_INVALID_PARAMETER;
}
SERVER_ADMIN_ONLY;
// Duplication check
sw = L3GetSw(c, t->Name);
if (sw != NULL)
{
// Already exists
ReleaseL3Sw(sw);
ret = ERR_LAYER3_SW_EXISTS;
}
else
{
LockList(c->L3SwList);
{
if (LIST_NUM(c->L3SwList) >= GetServerCapsInt(s, "i_max_l3_sw"))
{
// No more virtual interfaces
sw = NULL;
}
else
{
// Create
sw = L3AddSw(c, t->Name);
if (sw != NULL)
{
ALog(a, NULL, "LA_ADD_L3_SW", t->Name);
IncrementServerConfigRevision(s);
}
}
}
UnlockList(c->L3SwList);
if (sw == NULL)
{
// Failed
ret = ERR_INTERNAL_ERROR;
}
else
{
// Success
ReleaseL3Sw(sw);
}
}
return ret;
}
// Set hub extended options
UINT StSetHubExtOptions(ADMIN *a, RPC_ADMIN_OPTION *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
bool not_server_admin = false;
if (t->NumItem > MAX_HUB_ADMIN_OPTIONS)
{
return ERR_TOO_MANT_ITEMS;
}
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
CHECK_RIGHT;
if (a->ServerAdmin == false)
{
not_server_admin = true;
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (GetHubAdminOption(h, "deny_hub_admin_change_ext_option") && not_server_admin)
{
// Insufficient permission
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
// Update setting
Lock(h->lock);
{
DataToHubOptionStruct(h->Option, t);
}
Unlock(h->lock);
ALog(a, NULL, "LA_SET_HUB_EXT_OPTION", h->Name);
h->CurrentVersion++;
SiHubUpdateProc(h);
ReleaseHub(h);
IncrementServerConfigRevision(s);
return ERR_NO_ERROR;
}
// Get hub extended options
UINT StGetHubExtOptions(ADMIN *a, RPC_ADMIN_OPTION *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
FreeRpcAdminOption(t);
Zero(t, sizeof(RPC_ADMIN_OPTION));
StrCpy(t->HubName, sizeof(t->HubName), h->Name);
// Get options
Lock(h->lock);
{
HubOptionStructToData(t, h->Option, h->Name);
}
Unlock(h->lock);
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Set hub administration options
UINT StSetHubAdminOptions(ADMIN *a, RPC_ADMIN_OPTION *t)
{
UINT i;
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
bool not_server_admin = false;
if (t->NumItem > MAX_HUB_ADMIN_OPTIONS)
{
return ERR_TOO_MANT_ITEMS;
}
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
CHECK_RIGHT;
if (a->ServerAdmin == false)
{
not_server_admin = true;
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (GetHubAdminOption(h, "allow_hub_admin_change_option") == false
&& not_server_admin)
{
// Insufficient permission
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
LockList(h->AdminOptionList);
{
DeleteAllHubAdminOption(h, false);
for (i = 0;i < t->NumItem;i++)
{
ADMIN_OPTION *e = &t->Items[i];
ADMIN_OPTION *a = ZeroMalloc(sizeof(ADMIN_OPTION));
StrCpy(a->Name, sizeof(a->Name), e->Name);
a->Value = e->Value;
Insert(h->AdminOptionList, a);
}
AddHubAdminOptionsDefaults(h, false);
}
UnlockList(h->AdminOptionList);
ALog(a, NULL, "LA_SET_HUB_ADMIN_OPTION", h->Name);
h->CurrentVersion++;
SiHubUpdateProc(h);
ReleaseHub(h);
IncrementServerConfigRevision(s);
return ERR_NO_ERROR;
}
// Get hub administration options
UINT StGetHubAdminOptions(ADMIN *a, RPC_ADMIN_OPTION *t)
{
UINT i;
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
FreeRpcAdminOption(t);
Zero(t, sizeof(RPC_ADMIN_OPTION));
StrCpy(t->HubName, sizeof(t->HubName), h->Name);
LockList(h->AdminOptionList);
{
t->NumItem = LIST_NUM(h->AdminOptionList);
t->Items = ZeroMalloc(sizeof(ADMIN_OPTION) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
ADMIN_OPTION *a = LIST_DATA(h->AdminOptionList, i);
ADMIN_OPTION *e = &t->Items[i];
StrCpy(e->Name, sizeof(e->Name), a->Name);
e->Value = a->Value;
UniStrCpy(e->Descrption, sizeof(e->Descrption), GetHubAdminOptionHelpString(e->Name));
}
}
UnlockList(h->AdminOptionList);
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Get default hub administration options
UINT StGetDefaultHubAdminOptions(ADMIN *a, RPC_ADMIN_OPTION *t)
{
UINT i;
NO_SUPPORT_FOR_BRIDGE;
if (a->Server->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
FreeRpcAdminOption(t);
Zero(t, sizeof(RPC_ADMIN_OPTION));
t->NumItem = num_admin_options;
t->Items = ZeroMalloc(sizeof(ADMIN_OPTION) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
ADMIN_OPTION *a = &t->Items[i];
StrCpy(a->Name, sizeof(a->Name), admin_options[i].Name);
a->Value = admin_options[i].Value;
UniStrCpy(a->Descrption, sizeof(a->Descrption), GetHubAdminOptionHelpString(a->Name));
}
return ERR_NO_ERROR;
}
// Get configuration file stream
UINT StGetConfig(ADMIN *a, RPC_CONFIG *t)
{
SERVER *s;
SERVER_ADMIN_ONLY;
FreeRpcConfig(t);
Zero(t, sizeof(RPC_CONFIG));
s = a->Server;
ALog(a, NULL, "LA_GET_CONFIG");
if (s->CfgRw != NULL)
{
FOLDER *f = SiWriteConfigurationToCfg(s);
BUF *b = CfgFolderToBuf(f, true);
StrCpy(t->FileName, sizeof(t->FileName), s->CfgRw->FileName + (s->CfgRw->FileName[0] == '@' ? 1 : 0));
t->FileData = ZeroMalloc(b->Size + 1);
Copy(t->FileData, b->Buf, b->Size);
CfgDeleteFolder(f);
FreeBuf(b);
return ERR_NO_ERROR;
}
else
{
return ERR_INTERNAL_ERROR;
}
}
// Overwrite configuration file by specified data
UINT StSetConfig(ADMIN *a, RPC_CONFIG *t)
{
SERVER *s;
IO *o;
char filename[MAX_PATH];
SERVER_ADMIN_ONLY;
s = a->Server;
if (s->CfgRw == NULL)
{
return ERR_INTERNAL_ERROR;
}
// Write new configuration file
Format(filename, sizeof(filename), "%s.new", s->CfgRw->FileName);
o = FileCreate(filename);
FileWrite(o, t->FileData, StrLen(t->FileData));
FileClose(o);
IncrementServerConfigRevision(s);
ALog(a, NULL, "LA_SET_CONFIG");
// Reboot server itself
SiRebootServer(s->Cedar->Bridge);
return ERR_NO_ERROR;
}
// Get capabilities
UINT StGetCaps(ADMIN *a, CAPSLIST *t)
{
FreeRpcCapsList(t);
Zero(t, sizeof(CAPSLIST));
GetServerCapsMain(a->Server, t);
return ERR_NO_ERROR;
}
// Reboot server itself
UINT StRebootServer(ADMIN *a, RPC_TEST *t)
{
SERVER_ADMIN_ONLY;
ALog(a, NULL, "LA_REBOOT_SERVER");
SiRebootServerEx(a->Server->Cedar->Bridge, t->IntValue);
return ERR_NO_ERROR;
}
// Get availability to localbridge function
UINT StGetBridgeSupport(ADMIN *a, RPC_BRIDGE_SUPPORT *t)
{
Zero(t, sizeof(RPC_BRIDGE_SUPPORT));
t->IsBridgeSupportedOs = IsBridgeSupported();
t->IsWinPcapNeeded = IsNeedWinPcap();
return ERR_NO_ERROR;
}
// Enumerate Ethernet devices
UINT StEnumEthernet(ADMIN *a, RPC_ENUM_ETH *t)
{
TOKEN_LIST *o;
UINT i;
char tmp[MAX_SIZE];
bool unix_support = false;
SERVER_ADMIN_ONLY;
#ifdef OS_UNIX
unix_support = EthIsInterfaceDescriptionSupportedUnix();
#endif // OS_UNIX
o = GetEthList();
if (o == NULL)
{
return ERR_NOT_SUPPORTED;
}
FreeRpcEnumEth(t);
Zero(t, sizeof(RPC_ENUM_ETH));
t->NumItem = o->NumTokens;
t->Items = ZeroMalloc(sizeof(RPC_ENUM_ETH_ITEM) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_ETH_ITEM *e = &t->Items[i];
StrCpy(e->DeviceName, sizeof(e->DeviceName), o->Token[i]);
StrCpy(tmp, sizeof(tmp), e->DeviceName);
#ifdef OS_WIN32
GetEthNetworkConnectionName(e->NetworkConnectionName, sizeof(e->NetworkConnectionName), e->DeviceName);
#else
if (unix_support == false)
{
StrCpy(tmp, sizeof(tmp), "");
}
else
{
if (EthGetInterfaceDescriptionUnix(e->DeviceName, tmp, sizeof(tmp)) == false)
{
StrCpy(tmp, sizeof(tmp), e->DeviceName);
}
}
StrToUni(e->NetworkConnectionName, sizeof(e->NetworkConnectionName), tmp);
#endif
}
FreeToken(o);
return ERR_NO_ERROR;
}
// Add a new local bridge
UINT StAddLocalBridge(ADMIN *a, RPC_LOCALBRIDGE *t)
{
if (IsEmptyStr(t->DeviceName) || IsEmptyStr(t->HubName))
{
return ERR_INVALID_PARAMETER;
}
SERVER_ADMIN_ONLY;
if (IsEthSupported() == false)
{
return ERR_LOCAL_BRIDGE_UNSUPPORTED;
}
#ifdef OS_WIN32
if (true)
{
char tmp[MAX_SIZE];
UINT id = Win32EthGetNameAndIdFromCombinedName(tmp, sizeof(tmp), t->DeviceName);
if (id == 0)
{
// If a ID is not specified in Win32, adding will fail
return ERR_OBJECT_NOT_FOUND;
}
}
#endif // OS_WIN32
ALog(a, NULL, "LA_ADD_BRIDGE", t->HubName, t->DeviceName);
AddLocalBridge(a->Server->Cedar, t->HubName, t->DeviceName, false, false, t->TapMode, NULL, false);
IncrementServerConfigRevision(a->Server);
return ERR_NO_ERROR;
}
// Delete a local bridge
UINT StDeleteLocalBridge(ADMIN *a, RPC_LOCALBRIDGE *t)
{
if (IsEmptyStr(t->DeviceName) || IsEmptyStr(t->HubName))
{
return ERR_INVALID_PARAMETER;
}
SERVER_ADMIN_ONLY;
ALog(a, NULL, "LA_DELETE_BRIDGE", t->HubName, t->DeviceName);
if (DeleteLocalBridge(a->Server->Cedar, t->HubName, t->DeviceName) == false)
{
return ERR_OBJECT_NOT_FOUND;
}
IncrementServerConfigRevision(a->Server);
return ERR_NO_ERROR;
}
// Enumerate local bridges
UINT StEnumLocalBridge(ADMIN *a, RPC_ENUM_LOCALBRIDGE *t)
{
UINT i;
CEDAR *c;
if (IsEthSupported() == false)
{
return ERR_LOCAL_BRIDGE_UNSUPPORTED;
}
FreeRpcEnumLocalBridge(t);
Zero(t, sizeof(RPC_ENUM_LOCALBRIDGE));
c = a->Server->Cedar;
LockList(c->LocalBridgeList);
{
t->NumItem = LIST_NUM(c->LocalBridgeList);
t->Items = ZeroMalloc(sizeof(RPC_LOCALBRIDGE) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
RPC_LOCALBRIDGE *e = &t->Items[i];
LOCALBRIDGE *br = LIST_DATA(c->LocalBridgeList, i);
if (br->Bridge == false)
{
e->Online = e->Active = false;
}
else
{
e->Online = true;
if (br->Bridge->Active)
{
e->Active = true;
}
else
{
e->Active = false;
}
}
StrCpy(e->DeviceName, sizeof(e->DeviceName), br->DeviceName);
StrCpy(e->HubName, sizeof(e->HubName), br->HubName);
e->TapMode = br->TapMode;
}
}
UnlockList(c->LocalBridgeList);
return ERR_NO_ERROR;
}
// Set syslog function setting
UINT StSetSysLog(ADMIN *a, SYSLOG_SETTING *t)
{
SERVER *s = a->Server;
SERVER_ADMIN_ONLY;
if (GetGlobalServerFlag(GSF_DISABLE_SYSLOG) != 0 && t->SaveType != SYSLOG_NONE)
{
return ERR_NOT_SUPPORTED_FUNCTION_ON_OPENSOURCE;
}
if (GetServerCapsBool(s, "b_support_syslog") == false)
{
return ERR_NOT_SUPPORTED;
}
SiSetSysLogSetting(s, t);
IncrementServerConfigRevision(s);
ALog(a, NULL, "LA_SET_SYSLOG");
return ERR_NO_ERROR;
}
// Get syslog function setting
UINT StGetSysLog(ADMIN *a, SYSLOG_SETTING *t)
{
SERVER *s = a->Server;
SiGetSysLogSetting(s, t);
if (a->ServerAdmin == false)
{
// Hide server name for non-administrator
if (t->SaveType == SYSLOG_NONE)
{
StrCpy(t->Hostname, sizeof(t->Hostname), "");
t->Port = 0;
}
else
{
StrCpy(t->Hostname, sizeof(t->Hostname), "Secret");
t->Port = 0;
}
}
return ERR_NO_ERROR;
}
// Set keep-alive function setting
UINT StSetKeep(ADMIN *a, RPC_KEEP *t)
{
SERVER *s = a->Server;
if (t->UseKeepConnect)
{
if (IsEmptyStr(t->KeepConnectHost) ||
t->KeepConnectPort == 0 ||
t->KeepConnectPort >= 65536)
{
return ERR_INVALID_PARAMETER;
}
}
SERVER_ADMIN_ONLY;
Lock(s->Keep->lock);
{
KEEP *keep = s->Keep;
keep->Enable = t->UseKeepConnect;
keep->Server = true;
StrCpy(keep->ServerName, sizeof(keep->ServerName), t->KeepConnectHost);
keep->ServerPort = t->KeepConnectPort;
keep->UdpMode = t->KeepConnectProtocol;
keep->Interval = t->KeepConnectInterval * 1000;
if (keep->Interval < 5000)
{
keep->Interval = 5000;
}
else if (keep->Interval > 600000)
{
keep->Interval = 600000;
}
}
Unlock(s->Keep->lock);
ALog(a, NULL, "LA_SET_KEEP");
IncrementServerConfigRevision(s);
return ERR_NO_ERROR;
}
// Get keep-alive function setting
UINT StGetKeep(ADMIN *a, RPC_KEEP *t)
{
SERVER *s = a->Server;
Zero(t, sizeof(RPC_KEEP));
Lock(s->Keep->lock);
{
KEEP *k = s->Keep;
t->UseKeepConnect = k->Enable;
StrCpy(t->KeepConnectHost, sizeof(t->KeepConnectHost), k->ServerName);
t->KeepConnectPort = k->ServerPort;
t->KeepConnectProtocol = k->UdpMode;
t->KeepConnectInterval = k->Interval / 1000;
}
Unlock(s->Keep->lock);
return ERR_NO_ERROR;
}
// Delete IP address table entry
UINT StDeleteIpTable(ADMIN *a, RPC_DELETE_TABLE *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
UINT ret = ERR_NO_ERROR;
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_delete_iptable") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
LockList(h->IpTable);
{
if (IsInListKey(h->IpTable, t->Key))
{
IP_TABLE_ENTRY *e = ListKeyToPointer(h->IpTable, t->Key);
Free(e);
Delete(h->IpTable, e);
}
else
{
ret = ERR_OBJECT_NOT_FOUND;
}
}
UnlockList(h->IpTable);
if (ret == ERR_OBJECT_NOT_FOUND)
{
if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
{
UINT i;
LockList(s->FarmMemberList);
{
for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
{
FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
if (f->Me == false)
{
SiCallDeleteIpTable(s, f, t->HubName, t->Key);
ret = ERR_NO_ERROR;
}
}
}
UnlockList(s->FarmMemberList);
}
}
ReleaseHub(h);
return ret;
}
// Get local IP address table
UINT SiEnumIpTable(SERVER *s, char *hubname, RPC_ENUM_IP_TABLE *t)
{
CEDAR *c;
UINT i;
HUB *h = NULL;
// Validate arguments
if (s == NULL || hubname == NULL || t == NULL)
{
return ERR_INTERNAL_ERROR;
}
c = s->Cedar;
LockHubList(c);
{
h = GetHub(c, hubname);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
StrCpy(t->HubName, sizeof(t->HubName), hubname);
LockList(h->IpTable);
{
t->NumIpTable = LIST_NUM(h->IpTable);
t->IpTables = ZeroMalloc(sizeof(RPC_ENUM_IP_TABLE_ITEM) * t->NumIpTable);
for (i = 0;i < t->NumIpTable;i++)
{
RPC_ENUM_IP_TABLE_ITEM *e = &t->IpTables[i];
IP_TABLE_ENTRY *table = LIST_DATA(h->IpTable, i);
e->Key = POINTER_TO_KEY(table);
StrCpy(e->SessionName, sizeof(e->SessionName), table->Session->Name);
e->Ip = IPToUINT(&table->Ip);
Copy(&e->IpV6, &table->Ip, sizeof(IP));
Copy(&e->IpAddress, &table->Ip, sizeof(IP));
e->DhcpAllocated = table->DhcpAllocated;
e->CreatedTime = TickToTime(table->CreatedTime);
e->UpdatedTime = TickToTime(table->UpdatedTime);
GetMachineName(e->RemoteHostname, sizeof(e->RemoteHostname));
}
}
UnlockList(h->IpTable);
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Get IP address table
UINT StEnumIpTable(ADMIN *a, RPC_ENUM_IP_TABLE *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
UINT i;
CHECK_RIGHT;
// Get local IP address table
StrCpy(hubname, sizeof(hubname), t->HubName);
FreeRpcEnumIpTable(t);
Zero(t, sizeof(RPC_ENUM_IP_TABLE));
StrCpy(t->HubName, sizeof(t->HubName), hubname);
ret = SiEnumIpTable(s, hubname, t);
if (ret != ERR_NO_ERROR)
{
return ret;
}
if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
{
// Get remote IP address table
LockList(s->FarmMemberList);
{
for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
{
FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
if (f->Me == false)
{
RPC_ENUM_IP_TABLE tmp;
Zero(&tmp, sizeof(tmp));
SiCallEnumIpTable(s, f, hubname, &tmp);
AdjoinRpcEnumIpTable(t, &tmp);
FreeRpcEnumIpTable(&tmp);
}
}
}
UnlockList(s->FarmMemberList);
}
return ret;
}
// Delete MAC address table entry
UINT StDeleteMacTable(ADMIN *a, RPC_DELETE_TABLE *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
UINT ret = ERR_NO_ERROR;
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_delete_mactable") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
LockHashList(h->MacHashTable);
{
if (IsInHashListKey(h->MacHashTable, t->Key))
{
MAC_TABLE_ENTRY *e = HashListKeyToPointer(h->MacHashTable, t->Key);
DeleteHash(h->MacHashTable, e);
Free(e);
}
else
{
ret = ERR_OBJECT_NOT_FOUND;
}
}
UnlockHashList(h->MacHashTable);
if (ret == ERR_OBJECT_NOT_FOUND)
{
if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
{
UINT i;
LockList(s->FarmMemberList);
{
for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
{
FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
if (f->Me == false)
{
SiCallDeleteMacTable(s, f, t->HubName, t->Key);
ret = ERR_NO_ERROR;
}
}
}
UnlockList(s->FarmMemberList);
}
}
ReleaseHub(h);
return ret;
}
// Get local MAC address table
UINT SiEnumMacTable(SERVER *s, char *hubname, RPC_ENUM_MAC_TABLE *t)
{
CEDAR *c;
UINT i;
HUB *h = NULL;
// Validate arguments
if (s == NULL || hubname == NULL || t == NULL)
{
return ERR_INTERNAL_ERROR;
}
c = s->Cedar;
LockHubList(c);
{
h = GetHub(c, hubname);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
StrCpy(t->HubName, sizeof(t->HubName), hubname);
LockHashList(h->MacHashTable);
{
MAC_TABLE_ENTRY **pp = (MAC_TABLE_ENTRY **)HashListToArray(h->MacHashTable, &t->NumMacTable);
t->MacTables = ZeroMalloc(sizeof(RPC_ENUM_MAC_TABLE_ITEM) * t->NumMacTable);
for (i = 0;i < t->NumMacTable;i++)
{
RPC_ENUM_MAC_TABLE_ITEM *e = &t->MacTables[i];
MAC_TABLE_ENTRY *mac = pp[i];
e->Key = POINTER_TO_KEY(mac);
StrCpy(e->SessionName, sizeof(e->SessionName), mac->Session->Name);
Copy(e->MacAddress, mac->MacAddress, sizeof(e->MacAddress));
e->CreatedTime = TickToTime(mac->CreatedTime);
e->UpdatedTime = TickToTime(mac->UpdatedTime);
e->VlanId = mac->VlanId;
GetMachineName(e->RemoteHostname, sizeof(e->RemoteHostname));
}
Free(pp);
}
UnlockHashList(h->MacHashTable);
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Get MAC address table
UINT StEnumMacTable(ADMIN *a, RPC_ENUM_MAC_TABLE *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
UINT i;
CHECK_RIGHT;
// Get local MAC address table
StrCpy(hubname, sizeof(hubname), t->HubName);
FreeRpcEnumMacTable(t);
Zero(t, sizeof(RPC_ENUM_MAC_TABLE));
ret = SiEnumMacTable(s, hubname, t);
if (ret != ERR_NO_ERROR)
{
return ret;
}
if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
{
// Get remote MAC address table
LockList(s->FarmMemberList);
{
for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
{
FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
if (f->Me == false)
{
RPC_ENUM_MAC_TABLE tmp;
Zero(&tmp, sizeof(tmp));
SiCallEnumMacTable(s, f, hubname, &tmp);
AdjoinRpcEnumMacTable(t, &tmp);
FreeRpcEnumMacTable(&tmp);
}
}
}
UnlockList(s->FarmMemberList);
}
return ret;
}
// Delete a session
UINT StDeleteSession(ADMIN *a, RPC_DELETE_SESSION *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
char name[MAX_SESSION_NAME_LEN + 1];
SESSION *sess;
if (IsEmptyStr(t->Name))
{
return ERR_INVALID_PARAMETER;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
StrCpy(name, sizeof(name), t->Name);
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_disconnect_session") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
sess = GetSessionByName(h, name);
if (sess == NULL)
{
if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
{
// Cluster controller
UINT i;
LockList(s->FarmMemberList);
{
for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
{
FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
if (f->Me == false)
{
// Try to disconnect
SiCallDeleteSession(s, f, t->HubName, t->Name);
}
}
}
UnlockList(s->FarmMemberList);
}
else
{
ret = ERR_OBJECT_NOT_FOUND;
}
}
else
{
if (sess->LinkModeServer)
{
ret = ERR_LINK_CANT_DISCONNECT;
}
else if (sess->SecureNATMode)
{
ret = ERR_SNAT_CANT_DISCONNECT;
}
else if (sess->BridgeMode)
{
ret = ERR_BRIDGE_CANT_DISCONNECT;
}
else if (sess->L3SwitchMode)
{
ret = ERR_LAYER3_CANT_DISCONNECT;
}
else
{
StopSession(sess);
}
ReleaseSession(sess);
}
if (ret != ERR_NO_ERROR)
{
ALog(a, h, "LA_DELETE_SESSION", t->Name);
}
ReleaseHub(h);
return ret;
}
// Get session status
UINT StGetSessionStatus(ADMIN *a, RPC_SESSION_STATUS *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
char name[MAX_SESSION_NAME_LEN + 1];
SESSION *sess;
StrCpy(hubname, sizeof(hubname), t->HubName);
StrCpy(name, sizeof(name), t->Name);
if (IsEmptyStr(t->Name))
{
return ERR_INVALID_PARAMETER;
}
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_query_session") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
FreeRpcSessionStatus(t);
Zero(t, sizeof(RPC_SESSION_STATUS));
StrCpy(t->HubName, sizeof(t->HubName), hubname);
StrCpy(t->Name, sizeof(t->Name), name);
sess = GetSessionByName(h, t->Name);
if (sess == NULL)
{
if (s->ServerType != SERVER_TYPE_FARM_CONTROLLER)
{
// Session is not found
ret = ERR_OBJECT_NOT_FOUND;
}
else
{
UINT i;
// Try to find the session on other cluster member
LockList(s->FarmMemberList);
{
for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
{
FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
if (f->Me == false)
{
RPC_SESSION_STATUS tmp;
Zero(&tmp, sizeof(tmp));
StrCpy(tmp.HubName, sizeof(tmp.HubName), t->HubName);
StrCpy(tmp.Name, sizeof(tmp.Name), t->Name);
if (SiCallGetSessionStatus(s, f, &tmp))
{
if (StrLen(tmp.HubName) != 0)
{
// Success to get session status
Copy(t, &tmp, sizeof(RPC_SESSION_STATUS));
break;
}
else
{
FreeRpcSessionStatus(&tmp);
}
}
}
}
if (i == LIST_NUM(s->FarmMemberList))
{
// not found after all
//
ret = ERR_OBJECT_NOT_FOUND;
}
}
UnlockList(s->FarmMemberList);
}
}
else
{
SESSION *s = sess;
Lock(s->lock);
{
StrCpy(t->Username, sizeof(t->Username), s->Username);
StrCpy(t->RealUsername, sizeof(t->RealUsername), s->UserNameReal);
StrCpy(t->GroupName, sizeof(t->GroupName), s->GroupName);
Copy(&t->NodeInfo, &s->NodeInfo, sizeof(NODE_INFO));
if (s->Connection != NULL)
{
t->ClientIp = IPToUINT(&s->Connection->ClientIp);
if (IsIP6(&s->Connection->ClientIp))
{
Copy(&t->ClientIp6, &s->Connection->ClientIp.address, sizeof(t->ClientIp6));
}
CopyIP(&t->ClientIpAddress, &s->Connection->ClientIp);
StrCpy(t->ClientHostName, sizeof(t->ClientHostName), s->Connection->ClientHostname);
}
}
Unlock(s->lock);
CiGetSessionStatus(&t->Status, s);
ReleaseSession(s);
}
ReleaseHub(h);
return ret;
}
// Main routine of session enumeration
void SiEnumSessionMain(SERVER *s, RPC_ENUM_SESSION *t)
{
char hubname[MAX_HUBNAME_LEN + 1];
UINT ret = ERR_NO_ERROR;
UINT num;
UINT i;
// Validate arguments
if (s == NULL || t == NULL)
{
return;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
FreeRpcEnumSession(t);
Zero(t, sizeof(RPC_ENUM_SESSION));
StrCpy(t->HubName, sizeof(t->HubName), hubname);
// Local session enumeration
num = 0;
SiEnumLocalSession(s, hubname, t);
if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
{
LIST *fm_list;
fm_list = NewListFast(NULL);
// Remote session enumeration
LockList(s->FarmMemberList);
{
while (true)
{
bool escape = true;
for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
{
FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
if (IsInList(fm_list, f) == false)
{
Add(fm_list, f);
escape = false;
if (f->Me == false)
{
RPC_ENUM_SESSION tmp;
Zero(&tmp, sizeof(tmp));
SiCallEnumSession(s, f, hubname, &tmp);
AdjoinRpcEnumSession(t, &tmp);
FreeRpcEnumSession(&tmp);
}
break;
}
}
if (escape)
{
break;
}
UnlockList(s->FarmMemberList);
LockList(s->FarmMemberList);
}
}
UnlockList(s->FarmMemberList);
ReleaseList(fm_list);
}
}
// Enumerate sessions
UINT StEnumSession(ADMIN *a, RPC_ENUM_SESSION *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
UINT ret = ERR_NO_ERROR;
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_enum_session") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
SiEnumSessionMain(s, t);
ReleaseHub(h);
return ret;
}
// Enumerate groups
UINT StEnumGroup(ADMIN *a, RPC_ENUM_GROUP *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
StrCpy(hubname, sizeof(hubname), t->HubName);
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
AcLock(h);
{
UINT i, j;
FreeRpcEnumGroup(t);
Zero(t, sizeof(RPC_ENUM_GROUP));
StrCpy(t->HubName, sizeof(t->HubName), hubname);
t->NumGroup = LIST_NUM(h->HubDb->GroupList);
t->Groups = ZeroMalloc(sizeof(RPC_ENUM_GROUP_ITEM) * t->NumGroup);
for (i = 0;i < t->NumGroup;i++)
{
RPC_ENUM_GROUP_ITEM *e = &t->Groups[i];
USERGROUP *g = LIST_DATA(h->HubDb->GroupList, i);
Lock(g->lock);
{
StrCpy(e->Name, sizeof(e->Name), g->Name);
UniStrCpy(e->Realname, sizeof(e->Realname), g->RealName);
UniStrCpy(e->Note, sizeof(e->Note), g->Note);
if (g->Policy != NULL)
{
if (g->Policy->Access == false)
{
e->DenyAccess = true;
}
}
}
Unlock(g->lock);
e->NumUsers = 0;
LockList(h->HubDb->UserList);
{
for (j = 0;j < LIST_NUM(h->HubDb->UserList);j++)
{
USER *u = LIST_DATA(h->HubDb->UserList, j);
Lock(u->lock);
{
if (u->Group == g)
{
e->NumUsers++;
}
}
Unlock(u->lock);
}
}
UnlockList(h->HubDb->UserList);
}
}
AcUnlock(h);
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Delete a group
UINT StDeleteGroup(ADMIN *a, RPC_DELETE_USER *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
UINT ret = ERR_NO_ERROR;
if (IsEmptyStr(t->Name) || IsSafeStr(t->Name) == false)
{
return ERR_INVALID_PARAMETER;
}
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_groups") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
AcLock(h);
{
if (AcDeleteGroup(h, t->Name) == false)
{
ret = ERR_OBJECT_NOT_FOUND;
}
}
AcUnlock(h);
if (ret == ERR_NO_ERROR)
{
ALog(a, h, "LA_DELETE_GROUP", t->Name);
}
ReleaseHub(h);
IncrementServerConfigRevision(s);
return ret;
}
// Get group information
UINT StGetGroup(ADMIN *a, RPC_SET_GROUP *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
if (IsEmptyStr(t->Name) || IsSafeStr(t->Name) == false)
{
return ERR_INVALID_PARAMETER;
}
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
AcLock(h);
{
USERGROUP *g = AcGetGroup(h, t->Name);
if (g == NULL)
{
ret = ERR_OBJECT_NOT_FOUND;
}
else
{
FreeRpcSetGroup(t);
Zero(t, sizeof(RPC_SET_GROUP));
StrCpy(t->HubName, sizeof(t->HubName), hubname);
Lock(g->lock);
{
StrCpy(t->Name, sizeof(t->Name), g->Name);
UniStrCpy(t->Realname, sizeof(t->Realname), g->RealName);
UniStrCpy(t->Note, sizeof(t->Note), g->Note);
Copy(&t->Traffic, g->Traffic, sizeof(TRAFFIC));
}
Unlock(g->lock);
t->Policy = GetGroupPolicy(g);
ReleaseGroup(g);
}
}
AcUnlock(h);
ReleaseHub(h);
return ret;
}
// Set group setting
UINT StSetGroup(ADMIN *a, RPC_SET_GROUP *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
UINT ret = ERR_NO_ERROR;
if (IsEmptyStr(t->Name) || IsSafeStr(t->Name) == false)
{
return ERR_INVALID_PARAMETER;
}
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_groups") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
AcLock(h);
{
USERGROUP *g = AcGetGroup(h, t->Name);
if (g == NULL)
{
ret = ERR_OBJECT_NOT_FOUND;
}
else
{
Lock(g->lock);
{
Free(g->RealName);
Free(g->Note);
g->RealName = UniCopyStr(t->Realname);
g->Note = UniCopyStr(t->Note);
}
Unlock(g->lock);
SetGroupPolicy(g, t->Policy);
ReleaseGroup(g);
ALog(a, h, "LA_SET_GROUP", t->Name);
}
}
AcUnlock(h);
ReleaseHub(h);
IncrementServerConfigRevision(s);
return ret;
}
// Create a group
UINT StCreateGroup(ADMIN *a, RPC_SET_GROUP *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
UINT ret = ERR_NO_ERROR;
if (IsEmptyStr(t->Name) || IsSafeStr(t->Name) == false)
{
return ERR_INVALID_PARAMETER;
}
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_FARM_CONTROLLER;
}
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_groups") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
AcLock(h);
{
if (AcIsGroup(h, t->Name))
{
ret = ERR_GROUP_ALREADY_EXISTS;
}
else
{
USERGROUP *g = NewGroup(t->Name, t->Realname, t->Note);
SetGroupPolicy(g, t->Policy);
if ((LIST_NUM(h->HubDb->GroupList) >= GetServerCapsInt(a->Server, "i_max_users_per_hub")) ||
((GetHubAdminOption(h, "max_groups") != 0) && (LIST_NUM(h->HubDb->GroupList) >= GetHubAdminOption(h, "max_groups"))))
{
ret = ERR_TOO_MANY_GROUP;
}
else
{
AcAddGroup(h, g);
}
ReleaseGroup(g);
ALog(a, h, "LA_CREATE_GROUP", t->Name);
}
}
AcUnlock(h);
ReleaseHub(h);
IncrementServerConfigRevision(s);
return ret;
}
// Enumerate users
UINT StEnumUser(ADMIN *a, RPC_ENUM_USER *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
UINT i, num;
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
FreeRpcEnumUser(t);
StrCpy(hubname, sizeof(hubname), t->HubName);
Zero(t, sizeof(RPC_ENUM_USER));
StrCpy(t->HubName, sizeof(t->HubName), hubname);
LockList(h->HubDb->UserList);
{
num = LIST_NUM(h->HubDb->UserList);
t->NumUser = num;
t->Users = ZeroMalloc(sizeof(RPC_ENUM_USER_ITEM) * num);
for (i = 0;i < num;i++)
{
USER *u = LIST_DATA(h->HubDb->UserList, i);
Lock(u->lock);
{
RPC_ENUM_USER_ITEM *e = &t->Users[i];
StrCpy(e->Name, sizeof(e->Name), u->Name);
StrCpy(e->GroupName, sizeof(e->GroupName), u->GroupName);
UniStrCpy(e->Realname, sizeof(e->Realname), u->RealName);
UniStrCpy(e->Note, sizeof(e->Note), u->Note);
e->AuthType = u->AuthType;
e->LastLoginTime = u->LastLoginTime;
e->NumLogin = u->NumLogin;
if (u->Policy != NULL)
{
e->DenyAccess = u->Policy->Access ? false : true;
}
Copy(&e->Traffic, u->Traffic, sizeof(TRAFFIC));
e->IsTrafficFilled = true;
e->Expires = u->ExpireTime;
e->IsExpiresFilled = true;
}
Unlock(u->lock);
}
}
UnlockList(h->HubDb->UserList);
ReleaseHub(h);
IncrementServerConfigRevision(s);
return ERR_NO_ERROR;
}
// Delete a user
UINT StDeleteUser(ADMIN *a, RPC_DELETE_USER *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
UINT ret = ERR_NO_ERROR;
if (IsEmptyStr(t->Name) || IsUserName(t->Name) == false)
{
return ERR_INVALID_PARAMETER;
}
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_users") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
ALog(a, h, "LA_DELETE_USER", t->Name);
AcLock(h);
{
if (AcDeleteUser(h, t->Name) == false)
{
ret = ERR_OBJECT_NOT_FOUND;
}
}
AcUnlock(h);
ReleaseHub(h);
IncrementServerConfigRevision(s);
return ret;
}
// Get user setting
UINT StGetUser(ADMIN *a, RPC_SET_USER *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
UINT ret = ERR_NO_ERROR;
USER *u = NULL;
USERGROUP *g = NULL;
char name[MAX_USERNAME_LEN + 1];
char hubname[MAX_HUBNAME_LEN + 1];
StrCpy(name, sizeof(name), t->Name);
StrCpy(hubname, sizeof(hubname), t->HubName);
if (IsEmptyStr(t->Name) || IsUserName(t->Name) == false)
{
return ERR_INVALID_PARAMETER;
}
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
FreeRpcSetUser(t);
Zero(t, sizeof(RPC_SET_USER));
StrCpy(t->HubName, sizeof(t->HubName), hubname);
StrCpy(t->Name, sizeof(t->Name), name);
LockHubList(c);
{
h = GetHub(c, hubname);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
AcLock(h);
{
u = AcGetUser(h, name);
if (u == NULL)
{
ret = ERR_OBJECT_NOT_FOUND;
}
else
{
Lock(u->lock);
{
StrCpy(t->GroupName, sizeof(t->GroupName), u->GroupName);
UniStrCpy(t->Realname, sizeof(t->Realname), u->RealName);
UniStrCpy(t->Note, sizeof(t->Note), u->Note);
t->CreatedTime = u->CreatedTime;
t->UpdatedTime = u->UpdatedTime;
t->ExpireTime = u->ExpireTime;
t->AuthType = u->AuthType;
t->AuthData = CopyAuthData(u->AuthData, t->AuthType);
t->NumLogin = u->NumLogin;
Copy(&t->Traffic, u->Traffic, sizeof(TRAFFIC));
if (u->Policy != NULL)
{
t->Policy = ClonePolicy(u->Policy);
}
}
Unlock(u->lock);
ReleaseUser(u);
}
}
AcUnlock(h);
ReleaseHub(h);
return ret;
}
// Set user setting
UINT StSetUser(ADMIN *a, RPC_SET_USER *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
UINT ret = ERR_NO_ERROR;
USER *u = NULL;
USERGROUP *g = NULL;
if (IsEmptyStr(t->Name) || IsUserName(t->Name) == false)
{
return ERR_INVALID_PARAMETER;
}
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
CHECK_RIGHT;
if (GetGlobalServerFlag(GSF_DISABLE_RADIUS_AUTH) != 0)
{
if (t->AuthType == AUTHTYPE_USERCERT || t->AuthType == AUTHTYPE_RADIUS || t->AuthType == AUTHTYPE_ROOTCERT || t->AuthType == AUTHTYPE_NT)
{
return ERR_NOT_SUPPORTED_AUTH_ON_OPENSOURCE;
}
}
if (StrCmpi(t->Name, "*") == 0)
{
if (t->AuthType != AUTHTYPE_RADIUS && t->AuthType != AUTHTYPE_NT)
{
return ERR_INVALID_PARAMETER;
}
}
if (t->AuthType == AUTHTYPE_USERCERT)
{
AUTHUSERCERT *c = t->AuthData;
if (c != NULL && c->UserX != NULL &&
c->UserX->is_compatible_bit == false)
{
return ERR_NOT_RSA_1024;
}
if (c == NULL || c->UserX == NULL)
{
return ERR_INVALID_PARAMETER;
}
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_users") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
AcLock(h);
{
u = AcGetUser(h, t->Name);
if (u == NULL)
{
ret = ERR_OBJECT_NOT_FOUND;
}
else
{
Lock(u->lock);
{
if (StrLen(t->GroupName) != 0)
{
g = AcGetGroup(h, t->GroupName);
if (g != NULL)
{
JoinUserToGroup(u, g);
ReleaseGroup(g);
}
else
{
ret = ERR_GROUP_NOT_FOUND;
}
}
else
{
JoinUserToGroup(u, NULL);
}
if (ret != ERR_GROUP_NOT_FOUND)
{
Free(u->RealName);
Free(u->Note);
u->RealName = UniCopyStr(t->Realname);
u->Note = UniCopyStr(t->Note);
SetUserAuthData(u, t->AuthType, CopyAuthData(t->AuthData, t->AuthType));
u->ExpireTime = t->ExpireTime;
u->UpdatedTime = SystemTime64();
SetUserPolicy(u, t->Policy);
}
}
Unlock(u->lock);
IncrementServerConfigRevision(s);
ReleaseUser(u);
}
}
AcUnlock(h);
if (ret == ERR_NO_ERROR)
{
ALog(a, h, "LA_SET_USER", t->Name);
}
ReleaseHub(h);
return ret;
}
// Create a user
UINT StCreateUser(ADMIN *a, RPC_SET_USER *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
UINT ret = ERR_NO_ERROR;
USER *u;
USERGROUP *g = NULL;
if (IsEmptyStr(t->Name) || IsUserName(t->Name) == false)
{
return ERR_INVALID_PARAMETER;
}
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
CHECK_RIGHT;
if (GetGlobalServerFlag(GSF_DISABLE_RADIUS_AUTH) != 0)
{
if (t->AuthType == AUTHTYPE_USERCERT || t->AuthType == AUTHTYPE_RADIUS || t->AuthType == AUTHTYPE_ROOTCERT || t->AuthType == AUTHTYPE_NT)
{
return ERR_NOT_SUPPORTED_AUTH_ON_OPENSOURCE;
}
}
if (t->AuthType == AUTHTYPE_USERCERT)
{
AUTHUSERCERT *c = t->AuthData;
if (c != NULL && c->UserX != NULL &&
c->UserX->is_compatible_bit == false)
{
return ERR_NOT_RSA_1024;
}
if (c == NULL || c->UserX == NULL)
{
return ERR_INVALID_PARAMETER;
}
}
if (IsUserName(t->Name) == false)
{
return ERR_INVALID_PARAMETER;
}
if (StrCmpi(t->Name, "*") == 0)
{
if (t->AuthType != AUTHTYPE_RADIUS && t->AuthType != AUTHTYPE_NT)
{
return ERR_INVALID_PARAMETER;
}
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_users") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
u = NewUser(t->Name, t->Realname, t->Note, t->AuthType, CopyAuthData(t->AuthData, t->AuthType));
if (u == NULL)
{
ReleaseHub(h);
return ERR_INTERNAL_ERROR;
}
u->ExpireTime = t->ExpireTime;
SetUserPolicy(u, t->Policy);
AcLock(h);
{
if ((LIST_NUM(h->HubDb->UserList) >= GetServerCapsInt(a->Server, "i_max_users_per_hub")) ||
((GetHubAdminOption(h, "max_users") != 0) && (LIST_NUM(h->HubDb->UserList) >= GetHubAdminOption(h, "max_users"))))
{
ret = ERR_TOO_MANY_USER;
}
else if (SiTooManyUserObjectsInServer(s, false))
{
ret = ERR_TOO_MANY_USERS_CREATED;
ALog(a, h, "ERR_128");
}
else if (AcIsUser(h, t->Name))
{
ret = ERR_USER_ALREADY_EXISTS;
}
else
{
if (StrLen(t->GroupName) != 0)
{
g = AcGetGroup(h, t->GroupName);
if (g == NULL)
{
ret = ERR_GROUP_NOT_FOUND;
}
}
if (ret != ERR_GROUP_NOT_FOUND)
{
if (g != NULL)
{
JoinUserToGroup(u, g);
ReleaseGroup(g);
}
AcAddUser(h, u);
ALog(a, h, "LA_CREATE_USER", t->Name);
IncrementServerConfigRevision(s);
}
}
}
AcUnlock(h);
ReleaseUser(u);
ReleaseHub(h);
return ret;
}
// Get access list
UINT StEnumAccess(ADMIN *a, RPC_ENUM_ACCESS_LIST *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT i;
char hubname[MAX_HUBNAME_LEN + 1];
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
FreeRpcEnumAccessList(t);
Zero(t, sizeof(RPC_ENUM_ACCESS_LIST));
StrCpy(t->HubName, sizeof(t->HubName), hubname);
LockList(h->AccessList);
{
t->NumAccess = LIST_NUM(h->AccessList);
t->Accesses = ZeroMalloc(sizeof(ACCESS) * t->NumAccess);
for (i = 0;i < LIST_NUM(h->AccessList);i++)
{
ACCESS *a = &t->Accesses[i];
Copy(a, LIST_DATA(h->AccessList, i), sizeof(ACCESS));
a->UniqueId = HashPtrToUINT(LIST_DATA(h->AccessList, i));
}
}
UnlockList(h->AccessList);
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Delete access list entry
UINT StDeleteAccess(ADMIN *a, RPC_DELETE_ACCESS *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT i;
bool exists;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_FARM_CONTROLLER;
}
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_access_list") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
exists = false;
LockList(h->AccessList);
{
for (i = 0;i < LIST_NUM(h->AccessList);i++)
{
ACCESS *access = LIST_DATA(h->AccessList, i);
if ((t->Id < MAX_ACCESSLISTS && access->Id == t->Id) ||
(t->Id >= MAX_ACCESSLISTS && HashPtrToUINT(access) == t->Id))
{
Free(access);
Delete(h->AccessList, access);
exists = true;
break;
}
}
}
UnlockList(h->AccessList);
if (exists == false)
{
ReleaseHub(h);
return ERR_OBJECT_NOT_FOUND;
}
ALog(a, h, "LA_DELETE_ACCESS");
IncrementServerConfigRevision(s);
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Set access list
UINT StSetAccessList(ADMIN *a, RPC_ENUM_ACCESS_LIST *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT i;
bool no_jitter = false;
bool no_include = false;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
CHECK_RIGHT;
if (t->NumAccess > GetServerCapsInt(a->Server, "i_max_access_lists"))
{
return ERR_TOO_MANY_ACCESS_LIST;
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
no_jitter = GetHubAdminOption(h, "no_delay_jitter_packet_loss");
no_include = GetHubAdminOption(h, "no_access_list_include_file");
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_access_list") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "max_accesslists") != 0 &&
t->NumAccess > GetHubAdminOption(h, "max_accesslists"))
{
ReleaseHub(h);
return ERR_TOO_MANY_ACCESS_LIST;
}
LockList(h->AccessList);
{
// Delete whole access list
for (i = 0; i < LIST_NUM(h->AccessList); ++i)
{
ACCESS *access = LIST_DATA(h->AccessList, i);
Free(access);
}
DeleteAll(h->AccessList);
ALog(a, h, "LA_SET_ACCESS_LIST", t->NumAccess);
// Add whole access list
for (i = 0; i < t->NumAccess; ++i)
{
ACCESS *a = &t->Accesses[i];
if (no_jitter)
{
a->Jitter = a->Loss = a->Delay = 0;
}
if (no_include)
{
if (StartWith(a->SrcUsername, ACCESS_LIST_INCLUDED_PREFIX) ||
StartWith(a->SrcUsername, ACCESS_LIST_EXCLUDED_PREFIX))
{
ClearStr(a->SrcUsername, sizeof(a->SrcUsername));
}
if (StartWith(a->DestUsername, ACCESS_LIST_INCLUDED_PREFIX) ||
StartWith(a->DestUsername, ACCESS_LIST_EXCLUDED_PREFIX))
{
ClearStr(a->DestUsername, sizeof(a->DestUsername));
}
}
if (i == (t->NumAccess - 1))
{
Sort(h->AccessList);
}
AddAccessListEx(h, a, ((i != (t->NumAccess - 1)) ? true : false), ((i != (t->NumAccess - 1)) ? true : false));
}
UnlockList(h->AccessList);
IncrementServerConfigRevision(s);
h->CurrentVersion++;
SiHubUpdateProc(h);
}
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Add access list entry
UINT StAddAccess(ADMIN *a, RPC_ADD_ACCESS *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
bool no_jitter = false;
bool no_include = false;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
no_jitter = GetHubAdminOption(h, "no_delay_jitter_packet_loss");
no_include = GetHubAdminOption(h, "no_access_list_include_file");
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_access_list") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
if ((LIST_NUM(h->AccessList) >= GetServerCapsInt(a->Server, "i_max_access_lists") ||
(GetHubAdminOption(h, "max_accesslists") != 0) && (LIST_NUM(h->AccessList) >= GetHubAdminOption(h, "max_accesslists"))))
{
ReleaseHub(h);
return ERR_TOO_MANY_ACCESS_LIST;
}
ALog(a, h, "LA_ADD_ACCESS");
if (no_jitter)
{
t->Access.Jitter = t->Access.Delay = t->Access.Loss = 0;
}
if (no_include)
{
if (StartWith(t->Access.SrcUsername, ACCESS_LIST_INCLUDED_PREFIX) ||
StartWith(t->Access.SrcUsername, ACCESS_LIST_EXCLUDED_PREFIX))
{
ClearStr(t->Access.SrcUsername, sizeof(t->Access.SrcUsername));
}
if (StartWith(t->Access.DestUsername, ACCESS_LIST_INCLUDED_PREFIX) ||
StartWith(t->Access.DestUsername, ACCESS_LIST_EXCLUDED_PREFIX))
{
ClearStr(t->Access.DestUsername, sizeof(t->Access.DestUsername));
}
}
AddAccessList(h, &t->Access);
h->CurrentVersion++;
SiHubUpdateProc(h);
ReleaseHub(h);
IncrementServerConfigRevision(s);
return ERR_NO_ERROR;
}
// Rename link (cascade connection)
UINT StRenameLink(ADMIN *a, RPC_RENAME_LINK *t)
{
UINT i;
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
LINK *k;
bool exists = false;
if (UniIsEmptyStr(t->OldAccountName) || UniIsEmptyStr(t->NewAccountName))
{
return ERR_INVALID_PARAMETER;
}
if (s->ServerType != SERVER_TYPE_STANDALONE)
{
return ERR_NOT_SUPPORTED;
}
CHECK_RIGHT;
if (UniStrCmpi(t->NewAccountName, t->OldAccountName) == 0)
{
// Noop if new name is same to old name
return ERR_NO_ERROR;
}
h = GetHub(c, t->HubName);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_cascade") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
k = NULL;
// Find specified link
LockList(h->LinkList);
{
for (i = 0;i < LIST_NUM(h->LinkList);i++)
{
LINK *kk = LIST_DATA(h->LinkList, i);
Lock(kk->lock);
{
if (UniStrCmpi(kk->Option->AccountName, t->OldAccountName) == 0)
{
k = kk;
AddRef(kk->ref);
}
}
Unlock(kk->lock);
if (k != NULL)
{
break;
}
}
exists = false;
if (k != NULL)
{
// Check whether the new link name is same to other links
for (i = 0;i < LIST_NUM(h->LinkList);i++)
{
LINK *kk = LIST_DATA(h->LinkList, i);
Lock(kk->lock);
{
if (UniStrCmpi(kk->Option->AccountName, t->NewAccountName) == 0)
{
// duplicated
exists = true;
}
}
Unlock(kk->lock);
}
if (exists)
{
// Already same name exists
ret = ERR_LINK_ALREADY_EXISTS;
}
else
{
// Do rename
UniStrCpy(k->Option->AccountName, sizeof(k->Option->AccountName), t->NewAccountName);
ALog(a, h, "LA_RENAME_LINK", t->OldAccountName, t->NewAccountName);
IncrementServerConfigRevision(s);
}
}
}
UnlockList(h->LinkList);
if (k == NULL)
{
// specified link is not found
ReleaseHub(h);
return ERR_OBJECT_NOT_FOUND;
}
ReleaseLink(k);
ReleaseHub(h);
return ret;
}
// Delete a link
UINT StDeleteLink(ADMIN *a, RPC_LINK *t)
{
UINT i;
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
wchar_t accountname[MAX_ACCOUNT_NAME_LEN + 1];
LINK *k;
if (UniIsEmptyStr(t->AccountName))
{
return ERR_INVALID_PARAMETER;
}
if (s->ServerType != SERVER_TYPE_STANDALONE)
{
return ERR_NOT_SUPPORTED;
}
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_cascade") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
UniStrCpy(accountname, sizeof(accountname), t->AccountName);
k = NULL;
// Find specified link
LockList(h->LinkList);
{
for (i = 0;i < LIST_NUM(h->LinkList);i++)
{
LINK *kk = LIST_DATA(h->LinkList, i);
Lock(kk->lock);
{
if (UniStrCmpi(kk->Option->AccountName, accountname) == 0)
{
k = kk;
AddRef(kk->ref);
}
}
Unlock(kk->lock);
if (k != NULL)
{
break;
}
}
}
UnlockList(h->LinkList);
if (k == NULL)
{
// Specified link is not found
ReleaseHub(h);
return ERR_OBJECT_NOT_FOUND;
}
k->NoOnline = true;
ALog(a, h, "LA_DELETE_LINK", t->AccountName);
SetLinkOffline(k);
IncrementServerConfigRevision(s);
DelLink(h, k);
ReleaseLink(k);
ReleaseHub(h);
return ret;
}
// Make a link into off-line
UINT StSetLinkOffline(ADMIN *a, RPC_LINK *t)
{
UINT i;
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
wchar_t accountname[MAX_ACCOUNT_NAME_LEN + 1];
LINK *k;
if (UniIsEmptyStr(t->AccountName))
{
return ERR_INVALID_PARAMETER;
}
if (s->ServerType != SERVER_TYPE_STANDALONE)
{
return ERR_NOT_SUPPORTED;
}
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_cascade") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
UniStrCpy(accountname, sizeof(accountname), t->AccountName);
k = NULL;
// Find specified link
LockList(h->LinkList);
{
for (i = 0;i < LIST_NUM(h->LinkList);i++)
{
LINK *kk = LIST_DATA(h->LinkList, i);
Lock(kk->lock);
{
if (UniStrCmpi(kk->Option->AccountName, accountname) == 0)
{
k = kk;
AddRef(kk->ref);
}
}
Unlock(kk->lock);
if (k != NULL)
{
break;
}
}
}
UnlockList(h->LinkList);
if (k == NULL)
{
// Link is not found
ReleaseHub(h);
return ERR_OBJECT_NOT_FOUND;
}
ALog(a, h, "LA_SET_LINK_OFFLINE", t->AccountName);
SetLinkOffline(k);
IncrementServerConfigRevision(s);
ReleaseLink(k);
ReleaseHub(h);
return ret;
}
// Make a link into on-line
UINT StSetLinkOnline(ADMIN *a, RPC_LINK *t)
{
UINT i;
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
wchar_t accountname[MAX_ACCOUNT_NAME_LEN + 1];
LINK *k;
if (UniIsEmptyStr(t->AccountName))
{
return ERR_INVALID_PARAMETER;
}
if (s->ServerType != SERVER_TYPE_STANDALONE)
{
return ERR_NOT_SUPPORTED;
}
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_cascade") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
UniStrCpy(accountname, sizeof(accountname), t->AccountName);
k = NULL;
// Find specified link
LockList(h->LinkList);
{
for (i = 0;i < LIST_NUM(h->LinkList);i++)
{
LINK *kk = LIST_DATA(h->LinkList, i);
Lock(kk->lock);
{
if (UniStrCmpi(kk->Option->AccountName, accountname) == 0)
{
k = kk;
AddRef(kk->ref);
}
}
Unlock(kk->lock);
if (k != NULL)
{
break;
}
}
}
UnlockList(h->LinkList);
if (k == NULL)
{
// Specified link is not found
ReleaseHub(h);
return ERR_OBJECT_NOT_FOUND;
}
ALog(a, h, "LA_SET_LINK_ONLINE", t->AccountName);
SetLinkOnline(k);
ReleaseLink(k);
ReleaseHub(h);
IncrementServerConfigRevision(s);
return ret;
}
// Get link status
UINT StGetLinkStatus(ADMIN *a, RPC_LINK_STATUS *t)
{
UINT i;
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
wchar_t accountname[MAX_ACCOUNT_NAME_LEN + 1];
LINK *k;
SESSION *sess;
if (UniIsEmptyStr(t->AccountName))
{
return ERR_INVALID_PARAMETER;
}
if (s->ServerType != SERVER_TYPE_STANDALONE)
{
return ERR_NOT_SUPPORTED;
}
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
UniStrCpy(accountname, sizeof(accountname), t->AccountName);
FreeRpcLinkStatus(t);
Zero(t, sizeof(RPC_LINK_STATUS));
StrCpy(t->HubName, sizeof(t->HubName), hubname);
UniStrCpy(t->AccountName, sizeof(t->AccountName), accountname);
k = NULL;
// Find the link
LockList(h->LinkList);
{
for (i = 0;i < LIST_NUM(h->LinkList);i++)
{
LINK *kk = LIST_DATA(h->LinkList, i);
Lock(kk->lock);
{
if (UniStrCmpi(kk->Option->AccountName, accountname) == 0)
{
k = kk;
AddRef(kk->ref);
}
}
Unlock(kk->lock);
if (k != NULL)
{
break;
}
}
}
UnlockList(h->LinkList);
if (k == NULL)
{
// Specified link is not found
ReleaseHub(h);
return ERR_OBJECT_NOT_FOUND;
}
// Get status information from session
Lock(k->lock);
{
sess = k->ClientSession;
if (sess != NULL)
{
AddRef(sess->ref);
}
}
Unlock(k->lock);
if (sess != NULL && k->Offline == false)
{
CiGetSessionStatus(&t->Status, sess);
}
else
{
ret = ERR_LINK_IS_OFFLINE;
}
ReleaseSession(sess);
ReleaseLink(k);
ReleaseHub(h);
return ret;
}
// Enumerate links
UINT StEnumLink(ADMIN *a, RPC_ENUM_LINK *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
char hubname[MAX_HUBNAME_LEN + 1];
UINT i;
if (s->ServerType != SERVER_TYPE_STANDALONE)
{
return ERR_NOT_SUPPORTED;
}
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
FreeRpcEnumLink(t);
Zero(t, sizeof(RPC_ENUM_LINK));
StrCpy(t->HubName, sizeof(t->HubName), hubname);
LockList(h->LinkList);
{
t->NumLink = LIST_NUM(h->LinkList);
t->Links = ZeroMalloc(sizeof(RPC_ENUM_LINK_ITEM) * t->NumLink);
for (i = 0;i < LIST_NUM(h->LinkList);i++)
{
LINK *k = LIST_DATA(h->LinkList, i);
RPC_ENUM_LINK_ITEM *e = &t->Links[i];
Lock(k->lock);
{
UniStrCpy(e->AccountName, sizeof(e->AccountName), k->Option->AccountName);
StrCpy(e->Hostname, sizeof(e->Hostname), k->Option->Hostname);
StrCpy(e->HubName, sizeof(e->HubName), k->Option->HubName);
e->Online = k->Offline ? false : true;
if (e->Online)
{
if (k->ClientSession != NULL)
{
e->ConnectedTime = TickToTime(k->ClientSession->CurrentConnectionEstablishTime);
e->Connected = (k->ClientSession->ClientStatus == CLIENT_STATUS_ESTABLISHED);
e->LastError = k->ClientSession->Err;
}
}
}
Unlock(k->lock);
}
}
UnlockList(h->LinkList);
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Get link configuration
UINT StGetLink(ADMIN *a, RPC_CREATE_LINK *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
UINT i;
char hubname[MAX_SIZE];
LINK *k;
if (s->ServerType != SERVER_TYPE_STANDALONE)
{
return ERR_NOT_SUPPORTED;
}
CHECK_RIGHT;
if (s->ServerType != SERVER_TYPE_STANDALONE)
{
return ERR_LINK_CANT_CREATE_ON_FARM;
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
k = NULL;
// Find the link
LockList(h->LinkList);
{
for (i = 0;i < LIST_NUM(h->LinkList);i++)
{
LINK *kk = LIST_DATA(h->LinkList, i);
Lock(kk->lock);
{
if (UniStrCmpi(kk->Option->AccountName, t->ClientOption->AccountName) == 0)
{
k = kk;
AddRef(kk->ref);
}
}
Unlock(kk->lock);
if (k != NULL)
{
break;
}
}
}
UnlockList(h->LinkList);
if (k == NULL)
{
// The link is not found
ReleaseHub(h);
return ERR_OBJECT_NOT_FOUND;
}
StrCpy(hubname, sizeof(hubname), t->HubName);
FreeRpcCreateLink(t);
Zero(t, sizeof(RPC_CREATE_LINK));
StrCpy(t->HubName, sizeof(t->HubName), hubname);
Lock(k->lock);
{
// Get configuration
t->Online = k->Offline ? false : true;
t->ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
Copy(t->ClientOption, k->Option, sizeof(CLIENT_OPTION));
t->ClientAuth = CopyClientAuth(k->Auth);
Copy(&t->Policy, k->Policy, sizeof(POLICY));
t->CheckServerCert = k->CheckServerCert;
t->ServerCert = CloneX(k->ServerCert);
}
Unlock(k->lock);
ReleaseLink(k);
ReleaseHub(h);
return ret;
}
// Set link configuration
UINT StSetLink(ADMIN *a, RPC_CREATE_LINK *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
UINT i;
LINK *k;
if (s->ServerType != SERVER_TYPE_STANDALONE)
{
return ERR_NOT_SUPPORTED;
}
CHECK_RIGHT;
if (s->ServerType != SERVER_TYPE_STANDALONE)
{
return ERR_LINK_CANT_CREATE_ON_FARM;
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_cascade") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
k = NULL;
// Find the link
LockList(h->LinkList);
{
for (i = 0;i < LIST_NUM(h->LinkList);i++)
{
LINK *kk = LIST_DATA(h->LinkList, i);
Lock(kk->lock);
{
if (UniStrCmpi(kk->Option->AccountName, t->ClientOption->AccountName) == 0)
{
k = kk;
AddRef(kk->ref);
}
}
Unlock(kk->lock);
if (k != NULL)
{
break;
}
}
}
UnlockList(h->LinkList);
if (k == NULL)
{
// The link is not found
ReleaseHub(h);
return ERR_OBJECT_NOT_FOUND;
}
ALog(a, h, "LA_SET_LINK", t->ClientOption->AccountName);
Lock(k->lock);
{
// Update the configuration of the link
if (k->ServerCert != NULL)
{
FreeX(k->ServerCert);
k->ServerCert = NULL;
}
Copy(k->Option, t->ClientOption, sizeof(CLIENT_OPTION));
StrCpy(k->Option->DeviceName, sizeof(k->Option->DeviceName), LINK_DEVICE_NAME);
k->Option->NumRetry = INFINITE;
k->Option->RetryInterval = 10;
k->Option->NoRoutingTracking = true;
CiFreeClientAuth(k->Auth);
k->Auth = CopyClientAuth(t->ClientAuth);
if (t->Policy.Ver3 == false)
{
Copy(k->Policy, &t->Policy, sizeof(UINT) * NUM_POLICY_ITEM_FOR_VER2);
}
else
{
Copy(k->Policy, &t->Policy, sizeof(POLICY));
}
k->Option->RequireBridgeRoutingMode = true; // Enable Bridge / Routing mode
k->Option->RequireMonitorMode = false; // Disable monitor mode
k->CheckServerCert = t->CheckServerCert;
k->ServerCert = CloneX(t->ServerCert);
}
Unlock(k->lock);
IncrementServerConfigRevision(s);
ReleaseLink(k);
ReleaseHub(h);
return ret;
}
// Create a new link(cascade)
UINT StCreateLink(ADMIN *a, RPC_CREATE_LINK *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
UINT i;
LINK *k;
CHECK_RIGHT;
if (s->ServerType != SERVER_TYPE_STANDALONE)
{
return ERR_LINK_CANT_CREATE_ON_FARM;
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_cascade") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
k = NULL;
// Check for existing a link which has same name
LockList(h->LinkList);
{
for (i = 0;i < LIST_NUM(h->LinkList);i++)
{
LINK *kk = LIST_DATA(h->LinkList, i);
Lock(kk->lock);
{
if (UniStrCmpi(kk->Option->AccountName, t->ClientOption->AccountName) == 0)
{
k = kk;
AddRef(kk->ref);
}
}
Unlock(kk->lock);
if (k != NULL)
{
break;
}
}
}
UnlockList(h->LinkList);
if (k != NULL)
{
// There is a link which has same name
ReleaseLink(k);
ReleaseHub(h);
return ERR_LINK_ALREADY_EXISTS;
}
ALog(a, h, "LA_CREATE_LINK", t->ClientOption->AccountName);
// Create a new link
k = NewLink(c, h, t->ClientOption, t->ClientAuth, &t->Policy);
if (k == NULL)
{
// Link creation failed
ret = ERR_INTERNAL_ERROR;
}
else
{
// setting of verifying server certification
//
k->CheckServerCert = t->CheckServerCert;
k->ServerCert = CloneX(t->ServerCert);
// stay this off-line
k->Offline = false;
SetLinkOffline(k);
ReleaseLink(k);
IncrementServerConfigRevision(s);
}
ReleaseHub(h);
return ret;
}
// Delete a CA(Certificate Authority) setting from the hub
UINT StDeleteCa(ADMIN *a, RPC_HUB_DELETE_CA *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_FARM_CONTROLLER;
}
NO_SUPPORT_FOR_BRIDGE;
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_cert_list") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
LockList(h->HubDb->RootCertList);
{
if (IsInListKey(h->HubDb->RootCertList, t->Key))
{
X *x = ListKeyToPointer(h->HubDb->RootCertList, t->Key);
Delete(h->HubDb->RootCertList, x);
FreeX(x);
ALog(a, h, "LA_DELETE_CA");
IncrementServerConfigRevision(s);
}
else
{
ret = ERR_OBJECT_NOT_FOUND;
}
}
UnlockList(h->HubDb->RootCertList);
ReleaseHub(h);
return ret;
}
// Get CA(Certificate Authority) setting from the hub
UINT StGetCa(ADMIN *a, RPC_HUB_GET_CA *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
UINT key;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_FARM_CONTROLLER;
}
NO_SUPPORT_FOR_BRIDGE;
StrCpy(hubname, sizeof(hubname), t->HubName);
key = t->Key;
FreeRpcHubGetCa(t);
Zero(t, sizeof(RPC_HUB_GET_CA));
t->Key = key;
StrCpy(t->HubName, sizeof(t->HubName), hubname);
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
LockList(h->HubDb->RootCertList);
{
if (IsInListKey(h->HubDb->RootCertList, key))
{
X *x = ListKeyToPointer(h->HubDb->RootCertList, key);
t->Cert = CloneX(x);
}
else
{
ret = ERR_OBJECT_NOT_FOUND;
}
}
UnlockList(h->HubDb->RootCertList);
ReleaseHub(h);
return ret;
}
// Enumerate CA(Certificate Authority) in the hub
UINT StEnumCa(ADMIN *a, RPC_HUB_ENUM_CA *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
char hubname[MAX_HUBNAME_LEN + 1];
UINT i;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_FARM_CONTROLLER;
}
NO_SUPPORT_FOR_BRIDGE;
StrCpy(hubname, sizeof(hubname), t->HubName);
FreeRpcHubEnumCa(t);
Zero(t, sizeof(RPC_HUB_ENUM_CA));
StrCpy(t->HubName, sizeof(t->HubName), hubname);
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, hubname);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
Zero(t, sizeof(RPC_HUB_ENUM_CA));
StrCpy(t->HubName, sizeof(t->HubName), hubname);
if (h->HubDb->RootCertList != NULL)
{
LockList(h->HubDb->RootCertList);
{
t->NumCa = LIST_NUM(h->HubDb->RootCertList);
t->Ca = ZeroMalloc(sizeof(RPC_HUB_ENUM_CA_ITEM) * t->NumCa);
for (i = 0;i < t->NumCa;i++)
{
RPC_HUB_ENUM_CA_ITEM *e = &t->Ca[i];
X *x = LIST_DATA(h->HubDb->RootCertList, i);
e->Key = POINTER_TO_KEY(x);
GetAllNameFromNameEx(e->SubjectName, sizeof(e->SubjectName), x->subject_name);
GetAllNameFromNameEx(e->IssuerName, sizeof(e->IssuerName), x->issuer_name);
e->Expires = x->notAfter;
}
}
UnlockList(h->HubDb->RootCertList);
}
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Add CA(Certificate Authority) into the hub
UINT StAddCa(ADMIN *a, RPC_HUB_ADD_CA *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_FARM_CONTROLLER;
}
if (c->Bridge)
{
return ERR_NOT_SUPPORTED;
}
if (t->Cert == NULL)
{
return ERR_INVALID_PARAMETER;
}
if (t->Cert->is_compatible_bit == false)
{
return ERR_NOT_RSA_1024;
}
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_cert_list") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
IncrementServerConfigRevision(s);
ALog(a, h, "LA_ADD_CA");
AddRootCert(h, t->Cert);
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Get logging configuration of the hub
UINT StGetHubLog(ADMIN *a, RPC_HUB_LOG *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
GetHubLogSetting(h, &t->LogSetting);
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Set logging configuration into the hub
UINT StSetHubLog(ADMIN *a, RPC_HUB_LOG *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_log_config") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
ALog(a, h, "LA_SET_HUB_LOG");
SetHubLogSettingEx(h, &t->LogSetting,
(a->ServerAdmin == false && GetHubAdminOption(h, "no_change_log_switch_type") != 0));
h->CurrentVersion++;
SiHubUpdateProc(h);
ReleaseHub(h);
IncrementServerConfigRevision(s);
return ERR_NO_ERROR;
}
// Get hub status
UINT StGetHubStatus(ADMIN *a, RPC_HUB_STATUS *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
Zero(t, sizeof(RPC_HUB_STATUS));
Lock(h->lock);
{
StrCpy(t->HubName, sizeof(t->HubName), h->Name);
t->HubType = h->Type;
t->Online = h->Offline ? false : true;
t->NumSessions = LIST_NUM(h->SessionList);
t->NumSessionsClient = Count(h->NumSessionsClient);
t->NumSessionsBridge = Count(h->NumSessionsBridge);
t->NumAccessLists = LIST_NUM(h->AccessList);
if (h->HubDb != NULL)
{
t->NumUsers = LIST_NUM(h->HubDb->UserList);
t->NumGroups = LIST_NUM(h->HubDb->GroupList);
}
t->NumMacTables = HASH_LIST_NUM(h->MacHashTable);
t->NumIpTables = LIST_NUM(h->IpTable);
Lock(h->TrafficLock);
{
Copy(&t->Traffic, h->Traffic, sizeof(TRAFFIC));
}
Unlock(h->TrafficLock);
t->NumLogin = h->NumLogin;
t->LastCommTime = h->LastCommTime;
t->LastLoginTime = h->LastLoginTime;
t->CreatedTime = h->CreatedTime;
}
Unlock(h->lock);
if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
{
UINT i;
LockList(s->FarmMemberList);
{
for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
{
UINT k;
FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
if (f->Me == false)
{
LockList(f->HubList);
{
for (k = 0;k < LIST_NUM(f->HubList);k++)
{
HUB_LIST *h = LIST_DATA(f->HubList, k);
if (StrCmpi(h->Name, t->HubName) == 0)
{
t->NumSessions += h->NumSessions;
t->NumSessionsClient += h->NumSessionsClient;
t->NumSessionsBridge += h->NumSessionsBridge;
t->NumMacTables += h->NumMacTables;
t->NumIpTables += h->NumIpTables;
}
}
}
UnlockList(f->HubList);
}
}
}
UnlockList(s->FarmMemberList);
}
if (h->Type != HUB_TYPE_FARM_STATIC)
{
t->SecureNATEnabled = h->EnableSecureNAT;
}
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Enable SecureNAT function of the hub
UINT StEnableSecureNAT(ADMIN *a, RPC_HUB *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (h->Type == HUB_TYPE_FARM_STATIC || GetServerCapsBool(s, "b_support_securenat") == false)
{
ReleaseHub(h);
return ERR_NOT_SUPPORTED;
}
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
ReleaseHub(h);
return ERR_NOT_FARM_CONTROLLER;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_securenat") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
ALog(a, h, "LA_ENABLE_SNAT");
EnableSecureNAT(h, true);
h->CurrentVersion++;
SiHubUpdateProc(h);
IncrementServerConfigRevision(s);
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Disable the SecureNAT function of the hub
UINT StDisableSecureNAT(ADMIN *a, RPC_HUB *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (h->Type == HUB_TYPE_FARM_STATIC || GetServerCapsBool(s, "b_support_securenat") == false)
{
ReleaseHub(h);
return ERR_NOT_SUPPORTED;
}
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
ReleaseHub(h);
return ERR_NOT_FARM_CONTROLLER;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_securenat") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
ALog(a, h, "LA_DISABLE_SNAT");
EnableSecureNAT(h, false);
h->CurrentVersion++;
SiHubUpdateProc(h);
IncrementServerConfigRevision(s);
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Enumerate NAT entries of the SecureNAT
UINT StEnumNAT(ADMIN *a, RPC_ENUM_NAT *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
UINT i;
CHECK_RIGHT;
StrCpy(hubname, sizeof(hubname), t->HubName);
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (h->Type == HUB_TYPE_FARM_STATIC || GetServerCapsBool(s, "b_support_securenat") == false)
{
ReleaseHub(h);
return ERR_NOT_SUPPORTED;
}
Lock(h->lock_online);
{
if (h->SecureNAT == NULL)
{
ret = ERR_SNAT_NOT_RUNNING;
}
else
{
NtEnumNatList(h->SecureNAT->Nat, t);
}
}
Unlock(h->lock_online);
if (h->Type == HUB_TYPE_FARM_DYNAMIC)
{
if (ret == ERR_SNAT_NOT_RUNNING)
{
// Get status of remote SecureNAT
LockList(s->FarmMemberList);
{
for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
{
FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
if (f->Me == false)
{
RPC_ENUM_NAT tmp;
Zero(&tmp, sizeof(tmp));
SiCallEnumNat(s, f, hubname, &tmp);
if (tmp.NumItem >= 1)
{
FreeRpcEnumNat(t);
Copy(t, &tmp, sizeof(RPC_ENUM_NAT));
ret = ERR_NO_ERROR;
break;
}
else
{
FreeRpcEnumNat(&tmp);
}
}
}
}
UnlockList(s->FarmMemberList);
}
}
ReleaseHub(h);
ret = ERR_NO_ERROR;
return ret;
}
// Get status of the SecureNAT
UINT StGetSecureNATStatus(ADMIN *a, RPC_NAT_STATUS *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
UINT i;
CHECK_RIGHT;
StrCpy(hubname, sizeof(hubname), t->HubName);
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (h->Type == HUB_TYPE_FARM_STATIC || GetServerCapsBool(s, "b_support_securenat") == false)
{
ReleaseHub(h);
return ERR_NOT_SUPPORTED;
}
Lock(h->lock_online);
{
if (h->SecureNAT == NULL)
{
ret = ERR_SNAT_NOT_RUNNING;
}
else
{
NtGetStatus(h->SecureNAT->Nat, t);
}
}
Unlock(h->lock_online);
if (h->Type == HUB_TYPE_FARM_DYNAMIC)
{
if (ret == ERR_SNAT_NOT_RUNNING)
{
// Get status of remote secureNAT
LockList(s->FarmMemberList);
{
for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
{
FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
if (f->Me == false)
{
RPC_NAT_STATUS tmp;
Zero(&tmp, sizeof(tmp));
SiCallGetNatStatus(s, f, hubname, &tmp);
if (tmp.NumDhcpClients == 0 && tmp.NumTcpSessions == 0 && tmp.NumUdpSessions == 0)
{
}
else
{
Copy(t, &tmp, sizeof(RPC_NAT_STATUS));
ret = ERR_NO_ERROR;
break;
}
}
}
}
UnlockList(s->FarmMemberList);
}
}
ReleaseHub(h);
StrCpy(t->HubName, sizeof(t->HubName), hubname);
ret = ERR_NO_ERROR;
return ret;
}
// Enumerate DHCP entries
UINT StEnumDHCP(ADMIN *a, RPC_ENUM_DHCP *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
char hubname[MAX_HUBNAME_LEN + 1];
UINT i;
StrCpy(hubname, sizeof(hubname), t->HubName);
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (h->Type == HUB_TYPE_FARM_STATIC || GetServerCapsBool(s, "b_support_securenat") == false)
{
ReleaseHub(h);
return ERR_NOT_SUPPORTED;
}
Lock(h->lock_online);
{
if (h->SecureNAT == NULL)
{
ret = ERR_SNAT_NOT_RUNNING;
}
else
{
NtEnumDhcpList(h->SecureNAT->Nat, t);
}
}
Unlock(h->lock_online);
if (h->Type == HUB_TYPE_FARM_DYNAMIC)
{
if (ret == ERR_SNAT_NOT_RUNNING)
{
// Get status of remote DHCP service
LockList(s->FarmMemberList);
{
for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
{
FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
if (f->Me == false)
{
RPC_ENUM_DHCP tmp;
Zero(&tmp, sizeof(tmp));
SiCallEnumDhcp(s, f, hubname, &tmp);
if (tmp.NumItem >= 1)
{
FreeRpcEnumDhcp(t);
Copy(t, &tmp, sizeof(RPC_ENUM_DHCP));
ret = ERR_NO_ERROR;
break;
}
else
{
FreeRpcEnumDhcp(&tmp);
}
}
}
}
UnlockList(s->FarmMemberList);
}
}
ReleaseHub(h);
ret = ERR_NO_ERROR;
return ret;
}
// Set SecureNAT options
UINT StSetSecureNATOption(ADMIN *a, VH_OPTION *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
char push_routes_str_old[MAX_DHCP_CLASSLESS_ROUTE_TABLE_STR_SIZE];
if (IsZero(t->MacAddress, sizeof(t->MacAddress)) ||
IsHostIPAddress4(&t->Ip) == false ||
IsSubnetMask4(&t->Mask) == false)
{
return ERR_INVALID_PARAMETER;
}
if ((IPToUINT(&t->Ip) & (~(IPToUINT(&t->Mask)))) == 0)
{
return ERR_INVALID_PARAMETER;
}
if (GetServerCapsBool(s, "b_support_securenat") == false)
{
t->ApplyDhcpPushRoutes = false;
}
if (t->ApplyDhcpPushRoutes)
{
if (NormalizeClasslessRouteTableStr(t->DhcpPushRoutes, sizeof(t->DhcpPushRoutes), t->DhcpPushRoutes) == false)
{
return ERR_INVALID_PARAMETER;
}
}
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (h->Type == HUB_TYPE_FARM_STATIC || GetServerCapsBool(s, "b_support_securenat") == false)
{
ReleaseHub(h);
return ERR_NOT_SUPPORTED;
}
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
ReleaseHub(h);
return ERR_NOT_FARM_CONTROLLER;
}
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_securenat") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
if (h->SecureNATOption->UseNat == false && t->UseNat)
{
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_securenat_enablenat") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
}
if (h->SecureNATOption->UseDhcp == false && t->UseDhcp)
{
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_securenat_enabledhcp") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
}
StrCpy(push_routes_str_old, sizeof(push_routes_str_old), h->SecureNATOption->DhcpPushRoutes);
Copy(h->SecureNATOption, t, sizeof(VH_OPTION));
if (t->ApplyDhcpPushRoutes == false)
{
StrCpy(h->SecureNATOption->DhcpPushRoutes, sizeof(h->SecureNATOption->DhcpPushRoutes), push_routes_str_old);
}
if (h->Type != HUB_TYPE_STANDALONE && h->Cedar != NULL && h->Cedar->Server != NULL &&
h->Cedar->Server->ServerType == SERVER_TYPE_FARM_CONTROLLER)
{
NiClearUnsupportedVhOptionForDynamicHub(h->SecureNATOption, false);
}
Lock(h->lock_online);
{
if (h->SecureNAT != NULL)
{
SetVirtualHostOption(h->SecureNAT->Nat->Virtual, t);
}
}
Unlock(h->lock_online);
ALog(a, h, "LA_SET_SNAT_OPTION");
h->CurrentVersion++;
SiHubUpdateProc(h);
IncrementServerConfigRevision(s);
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Get SecureNAT options
UINT StGetSecureNATOption(ADMIN *a, VH_OPTION *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
char hubname[MAX_HUBNAME_LEN + 1];
StrCpy(hubname, sizeof(hubname), t->HubName);
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (h->Type == HUB_TYPE_FARM_STATIC || GetServerCapsBool(s, "b_support_securenat") == false)
{
ReleaseHub(h);
return ERR_NOT_SUPPORTED;
}
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
ReleaseHub(h);
return ERR_NOT_FARM_CONTROLLER;
}
Zero(t, sizeof(VH_OPTION));
Copy(t, h->SecureNATOption, sizeof(VH_OPTION));
StrCpy(t->HubName, sizeof(t->HubName), h->Name);
t->ApplyDhcpPushRoutes = true;
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Make a hub on-line or off-line
UINT StSetHubOnline(ADMIN *a, RPC_SET_HUB_ONLINE *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_FARM_CONTROLLER;
}
NO_SUPPORT_FOR_BRIDGE;
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (a->ServerAdmin == false && t->Online && GetHubAdminOption(h, "no_online") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
if (a->ServerAdmin == false && t->Online == false && GetHubAdminOption(h, "no_offline") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
if (t->Online)
{
ALog(a, h, "LA_SET_HUB_ONLINE");
SetHubOnline(h);
}
else
{
ALog(a, h, "LA_SET_HUB_OFFLINE");
SetHubOffline(h);
}
h->CurrentVersion++;
SiHubUpdateProc(h);
IncrementServerConfigRevision(s);
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Get connection information
UINT StGetConnectionInfo(ADMIN *a, RPC_CONNECTION_INFO *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
CONNECTION *connection;
char name[MAX_CONNECTION_NAME_LEN + 1];
if (IsEmptyStr(t->Name))
{
return ERR_INVALID_PARAMETER;
}
SERVER_ADMIN_ONLY;
LockList(c->ConnectionList);
{
CONNECTION tt;
Zero(&tt, sizeof(tt));
tt.Name = t->Name;
StrCpy(name, sizeof(name), t->Name);
connection = Search(c->ConnectionList, &tt);
if (connection != NULL)
{
AddRef(connection->ref);
}
}
UnlockList(c->ConnectionList);
if (connection == NULL)
{
return ERR_OBJECT_NOT_FOUND;
}
Zero(t, sizeof(RPC_CONNECTION_INFO));
StrCpy(t->Name, sizeof(t->Name), name);
Lock(connection->lock);
{
SOCK *s = connection->FirstSock;
if (s != NULL)
{
t->Ip = IPToUINT(&s->RemoteIP);
t->Port = s->RemotePort;
StrCpy(t->Hostname, sizeof(t->Hostname), s->RemoteHostname);
}
StrCpy(t->Name, sizeof(t->Name), connection->Name);
t->ConnectedTime = TickToTime(connection->ConnectedTick);
t->Type = connection->Type;
StrCpy(t->ServerStr, sizeof(t->ServerStr), connection->ServerStr);
StrCpy(t->ClientStr, sizeof(t->ClientStr), connection->ClientStr);
t->ServerVer = connection->ServerVer;
t->ServerBuild = connection->ServerBuild;
t->ClientVer = connection->ClientVer;
t->ClientBuild = connection->ClientBuild;
}
Unlock(connection->lock);
ReleaseConnection(connection);
return ERR_NO_ERROR;
}
// Disconnect a connection
UINT StDisconnectConnection(ADMIN *a, RPC_DISCONNECT_CONNECTION *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
CONNECTION *connection;
if (IsEmptyStr(t->Name))
{
return ERR_INVALID_PARAMETER;
}
SERVER_ADMIN_ONLY;
LockList(c->ConnectionList);
{
CONNECTION tt;
Zero(&tt, sizeof(tt));
tt.Name = t->Name;
connection = Search(c->ConnectionList, &tt);
if (connection != NULL)
{
AddRef(connection->ref);
}
}
UnlockList(c->ConnectionList);
if (connection == NULL)
{
return ERR_OBJECT_NOT_FOUND;
}
StopConnection(connection, true);
ReleaseConnection(connection);
ALog(a, NULL, "LA_DISCONNECT_CONN", t->Name);
return ERR_NO_ERROR;
}
// Enumerate connections
UINT StEnumConnection(ADMIN *a, RPC_ENUM_CONNECTION *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
SERVER_ADMIN_ONLY;
FreeRpcEnumConnection(t);
Zero(t, sizeof(RPC_ENUM_CONNECTION));
LockList(c->ConnectionList);
{
UINT i;
t->NumConnection = LIST_NUM(c->ConnectionList);
t->Connections = ZeroMalloc(sizeof(RPC_ENUM_CONNECTION_ITEM) * t->NumConnection);
for (i = 0;i < t->NumConnection;i++)
{
RPC_ENUM_CONNECTION_ITEM *e = &t->Connections[i];
CONNECTION *connection = LIST_DATA(c->ConnectionList, i);
Lock(connection->lock);
{
SOCK *s = connection->FirstSock;
if (s != NULL)
{
e->Ip = IPToUINT(&s->RemoteIP);
e->Port = s->RemotePort;
StrCpy(e->Hostname, sizeof(e->Hostname), s->RemoteHostname);
}
StrCpy(e->Name, sizeof(e->Name), connection->Name);
e->ConnectedTime = TickToTime(connection->ConnectedTick);
e->Type = connection->Type;
}
Unlock(connection->lock);
}
}
UnlockList(c->ConnectionList);
return ERR_NO_ERROR;
}
// Set Radius options of the hub
UINT StSetHubRadius(ADMIN *a, RPC_RADIUS *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
if (GetGlobalServerFlag(GSF_DISABLE_RADIUS_AUTH) != 0 && IsEmptyStr(t->RadiusServerName) == false)
{
return ERR_NOT_SUPPORTED_FUNCTION_ON_OPENSOURCE;
}
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
//SetRadiusServer(h, t->RadiusServerName, t->RadiusPort, t->RadiusSecret);
SetRadiusServerEx(h, t->RadiusServerName, t->RadiusPort, t->RadiusSecret, t->RadiusRetryInterval);
ALog(a, h, "LA_SET_HUB_RADIUS");
ReleaseHub(h);
IncrementServerConfigRevision(s);
return ERR_NO_ERROR;
}
// Get Radius options of the hub
UINT StGetHubRadius(ADMIN *a, RPC_RADIUS *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
CHECK_RIGHT;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_SUPPORTED;
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
Zero(t, sizeof(RPC_RADIUS));
//GetRadiusServer(h, t->RadiusServerName, sizeof(t->RadiusServerName),
// &t->RadiusPort, t->RadiusSecret, sizeof(t->RadiusSecret));
GetRadiusServerEx(h, t->RadiusServerName, sizeof(t->RadiusServerName),
&t->RadiusPort, t->RadiusSecret, sizeof(t->RadiusSecret), &t->RadiusRetryInterval);
ReleaseHub(h);
return ERR_NO_ERROR;
}
// Delete a hub
UINT StDeleteHub(ADMIN *a, RPC_DELETE_HUB *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_FARM_CONTROLLER;
}
if (IsEmptyStr(t->HubName) || IsSafeStr(t->HubName) == false)
{
return ERR_INVALID_PARAMETER;
}
NO_SUPPORT_FOR_BRIDGE;
SERVER_ADMIN_ONLY;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
StopHub(h);
IncrementServerConfigRevision(s);
DelHub(c, h);
ReleaseHub(h);
ALog(a, NULL, "LA_DELETE_HUB", t->HubName);
return ERR_NO_ERROR;
}
// Enumerate hubs
UINT StEnumHub(ADMIN *a, RPC_ENUM_HUB *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h = NULL;
FreeRpcEnumHub(t);
Zero(t, sizeof(RPC_ENUM_HUB));
LockHubList(c);
{
UINT i, num, j;
num = 0;
for (i = 0;i < LIST_NUM(c->HubList);i++)
{
HUB *h = LIST_DATA(c->HubList, i);
Lock(h->lock);
if (a->ServerAdmin == false &&
h->Option != NULL &&
StrCmpi(h->Name, a->HubName) != 0)
{
// This hub is not listed
}
else
{
// This hub is listed
num++;
}
}
t->NumHub = num;
t->Hubs = ZeroMalloc(sizeof(RPC_ENUM_HUB_ITEM) * num);
i = 0;
for (j = 0;j < LIST_NUM(c->HubList);j++)
{
HUB *h = LIST_DATA(c->HubList, j);
if (a->ServerAdmin == false &&
h->Option != NULL &&
StrCmpi(h->Name, a->HubName) != 0)
{
// This hub is not listed
}
else
{
// This hub is listed
RPC_ENUM_HUB_ITEM *e = &t->Hubs[i++];
StrCpy(e->HubName, sizeof(e->HubName), h->Name);
e->Online = h->Offline ? false : true;
e->HubType = h->Type;
e->NumSessions = LIST_NUM(h->SessionList);
LockHashList(h->MacHashTable);
{
e->NumMacTables = HASH_LIST_NUM(h->MacHashTable);
}
UnlockHashList(h->MacHashTable);
LockList(h->IpTable);
{
e->NumIpTables = LIST_NUM(h->IpTable);
}
UnlockList(h->IpTable);
if (h->HubDb != NULL)
{
LockList(h->HubDb->UserList);
{
e->NumUsers = LIST_NUM(h->HubDb->UserList);
}
UnlockList(h->HubDb->UserList);
LockList(h->HubDb->GroupList);
{
e->NumGroups = LIST_NUM(h->HubDb->GroupList);
}
UnlockList(h->HubDb->GroupList);
}
e->LastCommTime = h->LastCommTime;
e->LastLoginTime = h->LastLoginTime;
e->NumLogin = h->NumLogin;
e->CreatedTime = h->CreatedTime;
Lock(h->TrafficLock);
{
Copy(&e->Traffic, h->Traffic, sizeof(TRAFFIC));
}
Unlock(h->TrafficLock);
e->IsTrafficFilled = true;
}
Unlock(h->lock);
}
}
UnlockHubList(c);
if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
{
UINT i, j, k;
LockList(s->FarmMemberList);
{
for (i = 0;i < LIST_NUM(s->FarmMemberList);i++)
{
FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
LockList(f->HubList);
{
if (f->Me == false)
{
for (j = 0;j < LIST_NUM(f->HubList);j++)
{
HUB_LIST *o = LIST_DATA(f->HubList, j);
for (k = 0;k < t->NumHub;k++)
{
RPC_ENUM_HUB_ITEM *e = &t->Hubs[k];
if (StrCmpi(e->HubName, o->Name) == 0)
{
e->NumIpTables += o->NumIpTables;
e->NumMacTables += o->NumMacTables;
e->NumSessions += o->NumSessions;
}
}
}
}
}
UnlockList(f->HubList);
}
}
UnlockList(s->FarmMemberList);
}
return ERR_NO_ERROR;
}
// Get hub configuration
UINT StGetHub(ADMIN *a, RPC_CREATE_HUB *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT ret = ERR_NO_ERROR;
HUB *h;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_FARM_CONTROLLER;
}
if (IsEmptyStr(t->HubName) || IsSafeStr(t->HubName) == false)
{
return ERR_INVALID_PARAMETER;
}
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_FARM_CONTROLLER;
}
NO_SUPPORT_FOR_BRIDGE;
CHECK_RIGHT;
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
Zero(t, sizeof(RPC_CREATE_HUB));
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
Lock(h->lock);
{
StrCpy(t->HubName, sizeof(t->HubName), h->Name);
t->Online = h->Offline ? false : true;
t->HubType = h->Type;
t->HubOption.DefaultGateway = h->Option->DefaultGateway;
t->HubOption.DefaultSubnet = h->Option->DefaultSubnet;
t->HubOption.MaxSession = h->Option->MaxSession;
t->HubOption.NoEnum = h->Option->NoEnum;
}
Unlock(h->lock);
ReleaseHub(h);
return ret;
}
// Set hub configuration
UINT StSetHub(ADMIN *a, RPC_CREATE_HUB *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
UINT ret = ERR_NO_ERROR;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_FARM_CONTROLLER;
}
if (IsEmptyStr(t->HubName) || IsSafeStr(t->HubName) == false)
{
return ERR_INVALID_PARAMETER;
}
CHECK_RIGHT;
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_FARM_CONTROLLER;
}
if (s->ServerType == SERVER_TYPE_STANDALONE)
{
if (t->HubType != HUB_TYPE_STANDALONE)
{
return ERR_INVALID_PARAMETER;
}
}
if (s->ServerType == SERVER_TYPE_FARM_CONTROLLER)
{
if (t->HubType == HUB_TYPE_STANDALONE)
{
return ERR_INVALID_PARAMETER;
}
}
LockHubList(c);
{
h = GetHub(c, t->HubName);
}
UnlockHubList(c);
if (h == NULL)
{
return ERR_HUB_NOT_FOUND;
}
if (h->Type != t->HubType)
{
ReleaseHub(h);
return ERR_NOT_SUPPORTED;
}
// For JSON-RPC
if (StrLen(t->AdminPasswordPlainText) != 0)
{
Sha0(t->HashedPassword, t->AdminPasswordPlainText, StrLen(t->AdminPasswordPlainText));
HashPassword(t->SecurePassword, ADMINISTRATOR_USERNAME, t->AdminPasswordPlainText);
}
if (IsZero(t->HashedPassword, sizeof(t->HashedPassword)) == false &&
IsZero(t->SecurePassword, sizeof(t->SecurePassword)) == false)
{
if (a->ServerAdmin == false && GetHubAdminOption(h, "no_change_admin_password") != 0)
{
ReleaseHub(h);
return ERR_NOT_ENOUGH_RIGHT;
}
}
// Is the password to be set blank
{
UCHAR hash1[SHA1_SIZE], hash2[SHA1_SIZE];
HashPassword(hash1, ADMINISTRATOR_USERNAME, "");
Sha0(hash2, "", 0);
if (Cmp(t->HashedPassword, hash2, SHA1_SIZE) == 0 || Cmp(t->SecurePassword, hash1, SHA1_SIZE) == 0)
{
if (a->ServerAdmin == false && IsLocalHostIP(&a->Rpc->Sock->RemoteIP) == false)
{
// Refuse to set a blank password to hub admin from remote host
ReleaseHub(h);
return ERR_INVALID_PARAMETER;
}
}
}
Lock(h->lock);
{
if (a->ServerAdmin == false && h->Type != t->HubType)
{
ret = ERR_NOT_ENOUGH_RIGHT;
}
else
{
h->Type = t->HubType;
h->Option->DefaultGateway = t->HubOption.DefaultGateway;
h->Option->DefaultSubnet = t->HubOption.DefaultSubnet;
h->Option->MaxSession = t->HubOption.MaxSession;
h->Option->NoEnum = t->HubOption.NoEnum;
if (IsZero(t->HashedPassword, sizeof(t->HashedPassword)) == false &&
IsZero(t->SecurePassword, sizeof(t->SecurePassword)) == false)
{
Copy(h->HashedPassword, t->HashedPassword, SHA1_SIZE);
Copy(h->SecurePassword, t->SecurePassword, SHA1_SIZE);
}
}
}
Unlock(h->lock);
if (t->Online)
{
if (a->ServerAdmin || GetHubAdminOption(h, "no_online") == 0)
{
SetHubOnline(h);
}
}
else
{
if (a->ServerAdmin || GetHubAdminOption(h, "no_offline") == 0)
{
SetHubOffline(h);
}
}
if (h->Type == HUB_TYPE_FARM_STATIC)
{
EnableSecureNAT(h, false);
}
h->CurrentVersion++;
SiHubUpdateProc(h);
IncrementServerConfigRevision(s);
ALog(a, h, "LA_SET_HUB");
ReleaseHub(h);
return ret;
}
// Create a hub
UINT StCreateHub(ADMIN *a, RPC_CREATE_HUB *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
HUB *h;
HUB_OPTION o;
UINT current_hub_num;
bool b;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_FARM_CONTROLLER;
}
if (IsEmptyStr(t->HubName) || IsSafeStr(t->HubName) == false)
{
return ERR_INVALID_PARAMETER;
}
NO_SUPPORT_FOR_BRIDGE;
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_FARM_CONTROLLER;
}
SERVER_ADMIN_ONLY;
Trim(t->HubName);
if (StrLen(t->HubName) == 0)
{
return ERR_INVALID_PARAMETER;
}
if (StartWith(t->HubName, ".") || EndWith(t->HubName, "."))
{
return ERR_INVALID_PARAMETER;
}
if (s->ServerType == SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_FARM_CONTROLLER;
}
if (s->ServerType == SERVER_TYPE_STANDALONE)
{
if (t->HubType != HUB_TYPE_STANDALONE)
{
return ERR_INVALID_PARAMETER;
}
}
else if (t->HubType != HUB_TYPE_FARM_DYNAMIC && t->HubType != HUB_TYPE_FARM_STATIC)
{
return ERR_INVALID_PARAMETER;
}
// Create a hub object
Zero(&o, sizeof(o));
o.DefaultGateway = t->HubOption.DefaultGateway;
o.DefaultSubnet = t->HubOption.DefaultSubnet;
o.MaxSession = t->HubOption.MaxSession;
o.NoEnum = t->HubOption.NoEnum;
// Default setting for hub admin options
SiSetDefaultHubOption(&o);
LockList(c->HubList);
{
current_hub_num = LIST_NUM(c->HubList);
}
UnlockList(c->HubList);
if (current_hub_num > GetServerCapsInt(a->Server, "i_max_hubs"))
{
return ERR_TOO_MANY_HUBS;
}
LockList(c->HubList);
{
b = IsHub(c, t->HubName);
}
UnlockList(c->HubList);
if (b)
{
return ERR_HUB_ALREADY_EXISTS;
}
ALog(a, NULL, "LA_CREATE_HUB", t->HubName);
// For JSON-RPC
if ((IsZero(t->HashedPassword, sizeof(t->HashedPassword)) &&
IsZero(t->SecurePassword, sizeof(t->SecurePassword))) ||
StrLen(t->AdminPasswordPlainText) != 0)
{
Sha0(t->HashedPassword, t->AdminPasswordPlainText, StrLen(t->AdminPasswordPlainText));
HashPassword(t->SecurePassword, ADMINISTRATOR_USERNAME, t->AdminPasswordPlainText);
}
h = NewHub(c, t->HubName, &o);
Copy(h->HashedPassword, t->HashedPassword, SHA1_SIZE);
Copy(h->SecurePassword, t->SecurePassword, SHA1_SIZE);
h->Type = t->HubType;
AddHub(c, h);
if (t->Online)
{
h->Offline = true;
SetHubOnline(h);
}
else
{
h->Offline = false;
SetHubOffline(h);
}
h->CreatedTime = SystemTime64();
ReleaseHub(h);
IncrementServerConfigRevision(s);
return ERR_NO_ERROR;
}
// Set cipher for SSL to the server
UINT StSetServerCipher(ADMIN *a, RPC_STR *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
if (IsEmptyStr(t->String))
{
return ERR_INVALID_PARAMETER;
}
SERVER_ADMIN_ONLY;
StrUpper(t->String);
ALog(a, NULL, "LA_SET_SERVER_CIPHER", t->String);
Lock(c->lock);
{
SetCedarCipherList(c, t->String);
}
Unlock(c->lock);
IncrementServerConfigRevision(s);
return ERR_NO_ERROR;
}
// Get cipher for SSL
UINT StGetServerCipher(ADMIN *a, RPC_STR *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
FreeRpcStr(t);
Zero(t, sizeof(RPC_STR));
Lock(c->lock);
{
t->String = CopyStr(c->CipherList);
}
Unlock(c->lock);
return ERR_NO_ERROR;
}
// Get list of available ciphers for SSL
UINT StGetServerCipherList(ADMIN *a, RPC_STR *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
FreeRpcStr(t);
Zero(t, sizeof(RPC_STR));
Lock(c->lock);
{
UINT i;
TOKEN_LIST *ciphers = GetCipherList();
if (ciphers->NumTokens > 0)
{
UINT size = StrSize(ciphers->Token[0]);
t->String = Malloc(size);
StrCpy(t->String, size, ciphers->Token[0]);
i = 1;
for (; i < ciphers->NumTokens; i++)
{
// We use StrSize() because we need the extra space for ';'
size += StrSize(ciphers->Token[i]);
t->String = ReAlloc(t->String, size);
StrCat(t->String, size, ";");
StrCat(t->String, size, ciphers->Token[i]);
}
}
FreeToken(ciphers);
}
Unlock(c->lock);
return ERR_NO_ERROR;
}
// Get the server certification
UINT StGetServerCert(ADMIN *a, RPC_KEY_PAIR *t)
{
bool admin;
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
bool is_vgs_cert = false;
admin = a->ServerAdmin;
FreeRpcKeyPair(t);
Zero(t, sizeof(RPC_KEY_PAIR));
Lock(c->lock);
{
t->Cert = CloneX(c->ServerX);
if (admin && is_vgs_cert == false)
{
t->Key = CloneK(c->ServerK);
}
}
Unlock(c->lock);
return ERR_NO_ERROR;
}
// Set the server certification
UINT StSetServerCert(ADMIN *a, RPC_KEY_PAIR *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
SERVER_ADMIN_ONLY;
if (t->Cert == NULL || t->Key == NULL)
{
return ERR_PROTOCOL_ERROR;
}
if (t->Cert->is_compatible_bit == false)
{
return ERR_NOT_RSA_1024;
}
if (CheckXandK(t->Cert, t->Key) == false)
{
return ERR_PROTOCOL_ERROR;
}
t->Flag1 = 1;
if (t->Cert->root_cert == false)
{
if (DownloadAndSaveIntermediateCertificatesIfNecessary(t->Cert) == false)
{
t->Flag1 = 0;
}
}
SetCedarCert(c, t->Cert, t->Key);
ALog(a, NULL, "LA_SET_SERVER_CERT");
IncrementServerConfigRevision(s);
return ERR_NO_ERROR;
}
// Add a WireGuard key to the allowed key list
UINT StAddWgk(ADMIN *a, RPC_WGK *t)
{
UINT ret = ERR_NO_ERROR;
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
LIST *to_add;
SERVER_ADMIN_ONLY;
to_add = NewListFast(NULL);
LockList(c->WgkList);
{
UINT i;
for (i = 0; i < t->Num; ++i)
{
WGK *rpc_wgk = &t->Wgks[i];
WGK *wgk;
if (IsEmptyStr(rpc_wgk->Key))
{
ret = ERR_INVALID_PARAMETER;
break;
}
if (Search(c->WgkList, rpc_wgk) != NULL)
{
ret = ERR_OBJECT_EXISTS;
break;
}
wgk = Malloc(sizeof(WGK));
StrCpy(wgk->Key, sizeof(wgk->Key), rpc_wgk->Key);
StrCpy(wgk->Hub, sizeof(wgk->Hub), rpc_wgk->Hub);
StrCpy(wgk->User, sizeof(wgk->User), rpc_wgk->User);
Add(to_add, wgk);
}
for (i = 0; i < LIST_NUM(to_add); ++i)
{
WGK *wgk = LIST_DATA(to_add, i);
ret == ERR_NO_ERROR ? Add(c->WgkList, wgk) : Free(wgk);
}
}
UnlockList(c->WgkList);
if (ret == ERR_NO_ERROR)
{
ALog(a, NULL, "LA_ADD_WGK", LIST_NUM(to_add));
IncrementServerConfigRevision(a->Server);
}
ReleaseList(to_add);
return ret;
}
// Delete a WireGuard key from the allowed key list
UINT StDeleteWgk(ADMIN *a, RPC_WGK *t)
{
UINT ret = ERR_NO_ERROR;
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
LIST *to_delete;
SERVER_ADMIN_ONLY;
to_delete = NewListFast(NULL);
LockList(c->WgkList);
{
UINT i;
for (i = 0; i < t->Num; ++i)
{
WGK *wgk = Search(c->WgkList, &t->Wgks[i]);
if (wgk == NULL)
{
ret = ERR_OBJECT_NOT_FOUND;
break;
}
Add(to_delete, wgk);
}
if (ret == ERR_NO_ERROR)
{
for (i = 0; i < LIST_NUM(to_delete); ++i)
{
WGK *wgk = LIST_DATA(to_delete, i);
Delete(c->WgkList, wgk);
Free(wgk);
}
}
}
UnlockList(c->WgkList);
if (ret == ERR_NO_ERROR)
{
ALog(a, NULL, "LA_DELETE_WGK", LIST_NUM(to_delete));
IncrementServerConfigRevision(a->Server);
}
ReleaseList(to_delete);
return ret;
}
// List the allowed WireGuard keys
UINT StEnumWgk(ADMIN *a, RPC_WGK *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
SERVER_ADMIN_ONLY;
LockList(c->WgkList);
{
UINT i;
t->Num = LIST_NUM(c->WgkList);
t->Wgks = Malloc(sizeof(WGK) * t->Num);
for (i = 0; i < t->Num; ++i)
{
WGK *wgk = LIST_DATA(c->WgkList, i);
WGK *rpc_wgk = &t->Wgks[i];
StrCpy(rpc_wgk->Key, sizeof(rpc_wgk->Key), wgk->Key);
StrCpy(rpc_wgk->Hub, sizeof(rpc_wgk->Hub), wgk->Hub);
StrCpy(rpc_wgk->User, sizeof(rpc_wgk->User), wgk->User);
}
}
UnlockList(c->WgkList);
return ERR_NO_ERROR;
}
// Get status of connection to cluster controller
UINT StGetFarmConnectionStatus(ADMIN *a, RPC_FARM_CONNECTION_STATUS *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
FARM_CONTROLLER *fc;
if (s->ServerType != SERVER_TYPE_FARM_MEMBER)
{
return ERR_NOT_FARM_MEMBER;
}
Zero(t, sizeof(RPC_FARM_CONNECTION_STATUS));
fc = s->FarmController;
Lock(fc->lock);
{
if (fc->Sock != NULL)
{
t->Ip = IPToUINT(&fc->Sock->RemoteIP);
t->Port = fc->Sock->RemotePort;
}
t->Online = fc->Online;
t->LastError = ERR_NO_ERROR;
if (t->Online == false)
{
t->LastError = fc->LastError;
}
else
{
t->CurrentConnectedTime = fc->CurrentConnectedTime;
}
t->StartedTime = fc->StartedTime;
t->FirstConnectedTime = fc->FirstConnectedTime;
t->NumConnected = fc->NumConnected;
t->NumTry = fc->NumTry;
t->NumFailed = fc->NumFailed;
}
Unlock(fc->lock);
return ERR_NO_ERROR;
}
// Enumerate cluster members
UINT StEnumFarmMember(ADMIN *a, RPC_ENUM_FARM *t)
{
SERVER *s = a->Server;
CEDAR *c = s->Cedar;
UINT i;
FreeRpcEnumFarm(t);
Zero(t, sizeof(RPC_ENUM_FARM));
if (s->ServerType != SERVER_TYPE_FARM_CONTROLLER)
{
return ERR_NOT_FARM_CONTROLLER;
}
Zero(t, sizeof(RPC_ENUM_FARM));
LockList(s->FarmMemberList);
{
t->NumFarm = LIST_NUM(s->FarmMemberList);
t->Farms = ZeroMalloc(sizeof(RPC_ENUM_FARM_ITEM) * t->NumFarm);
for (i = 0;i < t->NumFarm;i++)
{
FARM_MEMBER *f = LIST_DATA(s->FarmMemberList, i);
RPC_ENUM_FARM_ITEM *e = &t->Farms[i];
e->Id = POINTER_TO_KEY(f);
e->Controller = f->Me;
if (e->Controller)
{
e->ConnectedTime = TickToTime(c->CreatedTick);
e->Ip = 0x0100007f;
GetMachineName(e->Hostname, sizeof(e->Hostname));
e->Point = f->Point;
e->NumSessions = Count(c->CurrentSessions);
e->NumTcpConnections = Count(c->CurrentTcpConnections);
e->AssignedBridgeLicense = Count(c->AssignedBridgeLicense);
e->AssignedClientLicense = Count(c->AssignedClientLicense);
}
else
{
e->ConnectedTime = f->ConnectedTime;
e->Ip = f->Ip;
StrCpy(e->Hostname, sizeof(e->Hostname), f->hostname);
e->Point = f->Point;
e->NumSessions = f->NumSessions;
e->NumTcpConnections = f->NumTcpConnections;
e->AssignedBridgeLicense = f->AssignedBridgeLicense;
e->AssignedClientLicense = f->AssignedClientLicense;
}
e->NumHubs = LIST_NUM(f->HubList);
}
}
UnlockList(s->FarmMemberList);
return ERR_NO_ERROR;
}
// Get cluster member information
UINT StGetFarmInfo(ADMIN *a, RPC_FARM_INFO *t)
{
SERVER *s = a->Server;
UINT id = t->Id;
UINT i;
UINT ret = ERR_NO_ERROR;
FreeRpcFarmInfo(t);
Zero(t, sizeof(RPC_FARM_INFO));
if (s->ServerType != SERVER_TYPE_FARM_CONTROLLER)
{
return ERR_NOT_FARM_CONTROLLER;
}
LockList(s->FarmMemberList);
{
if (IsInListKey(s->FarmMemberList, id))
{
FARM_MEMBER *f = ListKeyToPointer(s->FarmMemberList, id);
t->Id = id;
t->Controller = f->Me;
t->Weight = f->Weight;
LockList(f->HubList);
{
t->NumFarmHub = LIST_NUM(f->HubList);
t->FarmHubs = ZeroMalloc(sizeof(RPC_FARM_HUB) * t->NumFarmHub);
for (i = 0;i < t->NumFarmHub;i++)
{
RPC_FARM_HUB *h = &t->FarmHubs[i];
HUB_LIST *hh = LIST_DATA(f->HubList, i);
h->DynamicHub = hh->DynamicHub;
StrCpy(h->HubName, sizeof(h->HubName), hh->Name);
}
}
UnlockList(f->HubList);
if (t->Controller)
{
t->ConnectedTime = TickToTime(s->Cedar->CreatedTick);
t->Ip = 0x0100007f;
GetMachineName(t->Hostname, sizeof(t->Hostname));
t->Point = f->Point;
LockList(s->ServerListenerList);
{
UINT i, n;
t->NumPort = 0;
for (i = 0;i < LIST_NUM(s->ServerListenerList);i++)
{
SERVER_LISTENER *o = LIST_DATA(s->ServerListenerList, i);
if (o->Enabled)
{
t->NumPort++;
}
}
t->Ports = ZeroMalloc(sizeof(UINT) * t->NumPort);
n = 0;
for (i = 0;i < LIST_NUM(s->ServerListenerList);i++)
{
SERVER_LISTENER *o = LIST_DATA(s->ServerListenerList, i);
if (o->Enabled)
{
t->Ports[n++] = o->Port;
}
}
}
UnlockList(s->ServerListenerList);
t->ServerCert = CloneX(s->Cedar->ServerX);
t->NumSessions = Count(s->Cedar->CurrentSessions);
t->NumTcpConnections = Count(s->Cedar->CurrentTcpConnections);
}
else
{
t->ConnectedTime = f->ConnectedTime;
t->Ip = f->Ip;
StrCpy(t->Hostname, sizeof(t->Hostname), f->hostname);
t->Point = f->Point;
t->NumPort = f->NumPort;
t->Ports = ZeroMalloc(sizeof(UINT) * t->NumPort);
Copy(t->Ports, f->Ports, sizeof(UINT) * t->NumPort);
t->ServerCert = CloneX(f->ServerCert);
t->NumSessions = f->NumSessions;
t->NumTcpConnections = f->NumTcpConnections;
}
}
else
{
ret = ERR_OBJECT_NOT_FOUND;
}
}
UnlockList(s->FarmMemberList);
return ret;
}
// Get clustering configuration
UINT StGetFarmSetting(ADMIN *a, RPC_FARM *t)
{
SERVER *s;
FreeRpcFarm(t);
Zero(t, sizeof(RPC_FARM));
s = a->Server;
t->ServerType = s->ServerType;
t->ControllerOnly = s->ControllerOnly;
t->Weight = s->Weight;
if (t->ServerType == SERVER_TYPE_FARM_MEMBER)
{
t->NumPort = s->NumPublicPort;
t->Ports = ZeroMalloc(sizeof(UINT) * t->NumPort);
Copy(t->Ports, s->PublicPorts, sizeof(UINT) * t->NumPort);
t->PublicIp = s->PublicIp;
StrCpy(t->ControllerName, sizeof(t->ControllerName), s->ControllerName);
t->ControllerPort = s->ControllerPort;
}
else
{
t->NumPort = 0;
t->Ports = ZeroMalloc(0);
}
return ERR_NO_ERROR;
}
// Set clustering configuration
UINT StSetFarmSetting(ADMIN *a, RPC_FARM *t)
{
bool cluster_allowed = false;
SERVER_ADMIN_ONLY;
NO_SUPPORT_FOR_BRIDGE;
cluster_allowed = GetServerCapsInt(a->Server, "b_support_cluster");
if (t->ServerType != SERVER_TYPE_STANDALONE && cluster_allowed == false)
{
// When clustering function is disabled, deny turning into clustering mode
return ERR_NOT_SUPPORTED;
}
if (IsZero(t->MemberPassword, sizeof(t->MemberPassword)))
{
if (IsEmptyStr(t->MemberPasswordPlaintext) == false)
{
// For JSON-RPC
HashAdminPassword(t->MemberPassword, t->MemberPasswordPlaintext);
}
}
ALog(a, NULL, "LA_SET_FARM_SETTING");
IncrementServerConfigRevision(a->Server);
SiSetServerType(a->Server, t->ServerType, t->PublicIp, t->NumPort, t->Ports,
t->ControllerName, t->ControllerPort, t->MemberPassword, t->Weight, t->ControllerOnly);
return ERR_NO_ERROR;
}
// Set server password
UINT StSetServerPassword(ADMIN *a, RPC_SET_PASSWORD *t)
{
SERVER_ADMIN_ONLY;
if (IsZero(t->HashedPassword, sizeof(t->HashedPassword)))
{
// For JSON-RPC
HashAdminPassword(t->HashedPassword, t->PlainTextPassword);
}
Copy(a->Server->HashedPassword, t->HashedPassword, SHA1_SIZE);
ALog(a, NULL, "LA_SET_SERVER_PASSWORD");
IncrementServerConfigRevision(a->Server);
return ERR_NO_ERROR;
}
// Enable / Disable listener
UINT StEnableListener(ADMIN *a, RPC_LISTENER *t)
{
UINT ret = ERR_NO_ERROR;
SERVER_ADMIN_ONLY;
LockList(a->Server->ServerListenerList);
{
if (t->Enable)
{
if (SiEnableListener(a->Server, t->Port) == false)
{
ret = ERR_LISTENER_NOT_FOUND;
}
else
{
ALog(a, NULL, "LA_ENABLE_LISTENER", t->Port);
}
}
else
{
if (SiDisableListener(a->Server, t->Port) == false)
{
ret = ERR_LISTENER_NOT_FOUND;
}
else
{
ALog(a, NULL, "LA_DISABLE_LISTENER", t->Port);
}
}
}
UnlockList(a->Server->ServerListenerList);
IncrementServerConfigRevision(a->Server);
SleepThread(250);
return ret;
}
// Delete a listener
UINT StDeleteListener(ADMIN *a, RPC_LISTENER *t)
{
UINT ret = ERR_NO_ERROR;
SERVER_ADMIN_ONLY;
LockList(a->Server->ServerListenerList);
{
if (SiDeleteListener(a->Server, t->Port) == false)
{
ret = ERR_LISTENER_NOT_FOUND;
}
else
{
ALog(a, NULL, "LA_DELETE_LISTENER", t->Port);
IncrementServerConfigRevision(a->Server);
}
}
UnlockList(a->Server->ServerListenerList);
return ret;
}
// Enumerating listeners
UINT StEnumListener(ADMIN *a, RPC_LISTENER_LIST *t)
{
CEDAR *c = a->Server->Cedar;
UINT i;
FreeRpcListenerList(t);
Zero(t, sizeof(RPC_LISTENER_LIST));
LockList(a->Server->ServerListenerList);
{
t->NumPort = LIST_NUM(a->Server->ServerListenerList);
t->Ports = ZeroMalloc(sizeof(UINT) * t->NumPort);
t->Enables = ZeroMalloc(sizeof(bool) * t->NumPort);
t->Errors = ZeroMalloc(sizeof(bool) * t->NumPort);
for (i = 0;i < t->NumPort;i++)
{
SERVER_LISTENER *o = LIST_DATA(a->Server->ServerListenerList, i);
t->Ports[i] = o->Port;
t->Enables[i] = o->Enabled;
if (t->Enables[i])
{
if (o->Listener->Status == LISTENER_STATUS_TRYING)
{
t->Errors[i] = true;
}
}
}
}
UnlockList(a->Server->ServerListenerList);
return ERR_NO_ERROR;
}
// Create a listener
UINT StCreateListener(ADMIN *a, RPC_LISTENER *t)
{
UINT ret = ERR_NO_ERROR;
CEDAR *c = a->Server->Cedar;
if (t->Port == 0 || t->Port > 65535)
{
return ERR_INVALID_PARAMETER;
}
SERVER_ADMIN_ONLY;
LockList(a->Server->ServerListenerList);
{
if (SiAddListener(a->Server, t->Port, t->Enable) == false)
{
ret = ERR_LISTENER_ALREADY_EXISTS;
}
else
{
ALog(a, NULL, "LA_CREATE_LISTENER", t->Port);
IncrementServerConfigRevision(a->Server);
}
}
UnlockList(a->Server->ServerListenerList);
SleepThread(250);
return ret;
}
// Set UDP ports the server should listen on
UINT StSetPortsUDP(ADMIN *a, RPC_PORTS *t)
{
UINT i;
LIST *ports, *server_ports;
SERVER_ADMIN_ONLY;
ports = NewIntList(true);
for (i = 0; i < t->Num; ++i)
{
const UINT port = t->Ports[i];
if (port < 1 || port > 65535)
{
ReleaseIntList(ports);
return ERR_INVALID_PARAMETER;
}
AddIntDistinct(ports, port);
}
server_ports = a->Server->PortsUDP;
LockList(server_ports);
{
char str[MAX_SIZE];
for (i = 0; i < LIST_NUM(server_ports); ++i)
{
Free(LIST_DATA(server_ports, i));
}
DeleteAll(server_ports);
for (i = 0; i < LIST_NUM(ports); ++i)
{
const UINT port = *(UINT *)LIST_DATA(ports, i);
AddInt(server_ports, port);
}
ProtoSetUdpPorts(a->Server->Proto, server_ports);
IntListToStr(str, sizeof(str), server_ports, ", ");
ALog(a, NULL, "LA_SET_PORTS_UDP", str);
}
UnlockList(server_ports);
ReleaseIntList(ports);
IncrementServerConfigRevision(a->Server);
return ERR_NO_ERROR;
}
// List UDP ports the server is listening on
UINT StGetPortsUDP(ADMIN *a, RPC_PORTS *t)
{
LIST *ports = a->Server->PortsUDP;
FreeRpcPorts(t);
LockList(ports);
{
t->Num = LIST_NUM(ports);
t->Ports = t->Num > 0 ? Malloc(sizeof(UINT) * t->Num) : NULL;
if (t->Ports != NULL)
{
UINT i;
for (i = 0; i < t->Num; ++i)
{
const UINT port = *(UINT *)LIST_DATA(ports, i);
t->Ports[i] = port;
}
}
}
UnlockList(ports);
return ERR_NO_ERROR;
}
UINT StGetProtoOptions(ADMIN *a, RPC_PROTO_OPTIONS *t)
{
PROTO *proto = a->Server->Proto;
PROTO_CONTAINER *container, tmp;
UINT ret = ERR_NO_ERROR;
LIST *options;
SERVER_ADMIN_ONLY;
if (proto == NULL)
{
return ERR_NOT_SUPPORTED;
}
tmp.Name = t->Protocol;
container = Search(proto->Containers, &tmp);
if (container == NULL)
{
return ERR_INVALID_PARAMETER;
}
options = container->Options;
LockList(options);
{
UINT i;
t->Num = LIST_NUM(options);
t->Options = Malloc(sizeof(PROTO_OPTION) * t->Num);
for (i = 0; i < t->Num; ++i)
{
const PROTO_OPTION *option = LIST_DATA(options, i);
PROTO_OPTION *rpc_option = &t->Options[i];
switch (option->Type)
{
case PROTO_OPTION_BOOL:
rpc_option->Bool = option->Bool;
break;
case PROTO_OPTION_UINT32:
rpc_option->UInt32 = option->UInt32;
break;
case PROTO_OPTION_STRING:
rpc_option->String = CopyStr(option->String);
break;
default:
Debug("StGetProtoOptions(): unhandled option type %u!\n", option->Type);
ret = ERR_INTERNAL_ERROR;
}
if (ret == ERR_NO_ERROR)
{
rpc_option->Name = CopyStr(option->Name);
rpc_option->Type = option->Type;
}
else
{
break;
}
}
}
UnlockList(options);
return ret;
}
UINT StSetProtoOptions(ADMIN *a, RPC_PROTO_OPTIONS *t)
{
PROTO *proto = a->Server->Proto;
PROTO_CONTAINER *container, tmp;
UINT ret = ERR_NO_ERROR;
bool changed = false;
LIST *options;
SERVER_ADMIN_ONLY;
if (proto == NULL)
{
return ERR_NOT_SUPPORTED;
}
tmp.Name = t->Protocol;
container = Search(proto->Containers, &tmp);
if (container == NULL)
{
return ERR_INVALID_PARAMETER;
}
options = container->Options;
LockList(options);
{
UINT i;
for (i = 0; i < t->Num; ++i)
{
PROTO_OPTION *rpc_option = &t->Options[i];
PROTO_OPTION *option = Search(options, rpc_option);
if (option == NULL || rpc_option->Type != option->Type)
{
ret = ERR_INVALID_PARAMETER;
break;
}
switch (option->Type)
{
case PROTO_OPTION_BOOL:
option->Bool = rpc_option->Bool;
break;
case PROTO_OPTION_UINT32:
option->UInt32 = rpc_option->UInt32;
break;
case PROTO_OPTION_STRING:
Free(option->String);
option->String = CopyStr(rpc_option->String);
break;
default:
Debug("StSetProtoOptions(): unhandled option type %u!\n", option->Type);
ret = ERR_INTERNAL_ERROR;
}
if (ret == ERR_NO_ERROR)
{
changed = true;
}
else
{
break;
}
}
}
UnlockList(options);
if (changed)
{
ALog(a, NULL, "LA_SET_PROTO_OPTIONS", t->Protocol);
IncrementServerConfigRevision(a->Server);
}
return ret;
}
// Get server status
UINT StGetServerStatus(ADMIN *a, RPC_SERVER_STATUS *t)
{
CEDAR *c;
UINT i;
c = a->Server->Cedar;
Zero(t, sizeof(RPC_SERVER_STATUS));
Lock(c->TrafficLock);
{
Copy(&t->Traffic, c->Traffic, sizeof(TRAFFIC));
}
Unlock(c->TrafficLock);
GetMemInfo(&t->MemInfo);
t->ServerType = a->Server->ServerType;
t->NumTcpConnections = t->NumTcpConnectionsLocal = t->NumTcpConnectionsRemote = 0;
t->NumSessionsTotal = t->NumSessionsLocal = t->NumSessionsRemote = 0;
t->NumTcpConnectionsLocal = Count(c->CurrentTcpConnections);
if (a->Server->ServerType == SERVER_TYPE_FARM_CONTROLLER)
{
LockList(a->Server->FarmMemberList);
{
for (i = 0;i < LIST_NUM(a->Server->FarmMemberList);i++)
{
FARM_MEMBER *f = LIST_DATA(a->Server->FarmMemberList, i);
if (f->Me == false)
{
t->NumTcpConnectionsRemote += f->NumTcpConnections;
t->NumSessionsRemote += f->NumSessions;
AddTraffic(&t->Traffic, &f->Traffic);
}
}
}
UnlockList(a->Server->FarmMemberList);
}
t->NumMacTables = t->NumIpTables = t->NumUsers = t->NumGroups = 0;
// The number of hubs
LockList(c->HubList);
{
t->NumHubTotal = LIST_NUM(c->HubList);
t->NumHubStandalone = t->NumHubDynamic = t->NumHubStatic = 0;
for (i = 0;i < LIST_NUM(c->HubList);i++)
{
HUB *h = LIST_DATA(c->HubList, i);
Lock(h->lock);
{
switch (h->Type)
{
case HUB_TYPE_STANDALONE:
t->NumHubStandalone++;
break;
case HUB_TYPE_FARM_STATIC:
t->NumHubStatic++;
break;
case HUB_TYPE_FARM_DYNAMIC:
t->NumHubDynamic++;
break;
}
}
t->NumMacTables += HASH_LIST_NUM(h->MacHashTable);
t->NumIpTables += LIST_NUM(h->IpTable);
if (h->HubDb != NULL)
{
t->NumUsers += LIST_NUM(h->HubDb->UserList);
t->NumGroups += LIST_NUM(h->HubDb->GroupList);
}
Unlock(h->lock);
}
}
UnlockList(c->HubList);
// The number of sessions
t->NumSessionsLocal = Count(c->CurrentSessions);
t->NumSessionsTotal = t->NumSessionsLocal + t->NumSessionsRemote;
t->NumTcpConnections = t->NumTcpConnectionsLocal + t->NumTcpConnectionsRemote;
t->AssignedBridgeLicenses = Count(c->AssignedBridgeLicense);
t->AssignedClientLicenses = Count(c->AssignedClientLicense);
t->AssignedBridgeLicensesTotal = a->Server->CurrentAssignedBridgeLicense;
t->AssignedClientLicensesTotal = a->Server->CurrentAssignedClientLicense;
t->CurrentTick = Tick64();
t->CurrentTime = SystemTime64();
t->StartTime = a->Server->StartTime;
return ERR_NO_ERROR;
}
// Get server information
UINT StGetServerInfo(ADMIN *a, RPC_SERVER_INFO *t)
{
CEDAR *c;
OS_INFO *info;
SYSTEMTIME st;
// Validate arguments
if (a == NULL || t == NULL)
{
return ERR_INTERNAL_ERROR;
}
FreeRpcServerInfo(t);
Zero(t, sizeof(RPC_SERVER_INFO));
c = a->Server->Cedar;
GetServerProductName(a->Server, t->ServerProductName, sizeof(t->ServerProductName));
StrCpy(t->ServerVersionString, sizeof(t->ServerVersionString), c->VerString);
StrCpy(t->ServerBuildInfoString, sizeof(t->ServerBuildInfoString), c->BuildInfo);
t->ServerVerInt = c->Version;
t->ServerBuildInt = c->Build;
GetMachineName(t->ServerHostName, sizeof(t->ServerHostName));
t->ServerType = c->Server->ServerType;
Zero(&st, sizeof(st));
st.wYear = BUILD_DATE_Y;
st.wMonth = BUILD_DATE_M;
st.wDay = BUILD_DATE_D;
st.wHour = BUILD_DATE_HO;
st.wMinute = BUILD_DATE_MI;
st.wSecond = BUILD_DATE_SE;
t->ServerBuildDate = SystemToUINT64(&st);
StrCpy(t->ServerFamilyName, sizeof(t->ServerFamilyName), UPDATE_FAMILY_NAME);
info = GetOsInfo();
if (info != NULL)
{
CopyOsInfo(&t->OsInfo, info);
}
return ERR_NO_ERROR;
}
// Copy OS_INFO
void CopyOsInfo(OS_INFO *dst, OS_INFO *info)
{
// Validate arguments
if (info == NULL || dst == NULL)
{
return;
}
dst->OsType = info->OsType;
dst->OsServicePack = info->OsServicePack;
dst->OsSystemName = CopyStr(info->OsSystemName);
dst->OsProductName = CopyStr(info->OsProductName);
dst->OsVendorName = CopyStr(info->OsVendorName);
dst->OsVersion = CopyStr(info->OsVersion);
dst->KernelName = CopyStr(info->KernelName);
dst->KernelVersion = CopyStr(info->KernelVersion);
}
// OPENVPN_SSTP_CONFIG
void InOpenVpnSstpConfig(OPENVPN_SSTP_CONFIG *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(OPENVPN_SSTP_CONFIG));
t->EnableOpenVPN = PackGetBool(p, "EnableOpenVPN");
t->EnableSSTP = PackGetBool(p, "EnableSSTP");
}
void OutOpenVpnSstpConfig(PACK *p, OPENVPN_SSTP_CONFIG *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddBool(p, "EnableOpenVPN", t->EnableOpenVPN);
PackAddBool(p, "EnableSSTP", t->EnableSSTP);
}
// DDNS_CLIENT_STATUS
void InDDnsClientStatus(DDNS_CLIENT_STATUS *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(DDNS_CLIENT_STATUS));
t->Err_IPv4 = PackGetInt(p, "Err_IPv4");
t->Err_IPv6 = PackGetInt(p, "Err_IPv6");
PackGetStr(p, "CurrentHostName", t->CurrentHostName, sizeof(t->CurrentHostName));
PackGetStr(p, "CurrentFqdn", t->CurrentFqdn, sizeof(t->CurrentFqdn));
PackGetStr(p, "DnsSuffix", t->DnsSuffix, sizeof(t->DnsSuffix));
PackGetStr(p, "CurrentIPv4", t->CurrentIPv4, sizeof(t->CurrentIPv4));
PackGetStr(p, "CurrentIPv6", t->CurrentIPv6, sizeof(t->CurrentIPv6));
PackGetUniStr(p, "ErrStr_IPv4", t->ErrStr_IPv4, sizeof(t->ErrStr_IPv4));
PackGetUniStr(p, "ErrStr_IPv6", t->ErrStr_IPv6, sizeof(t->ErrStr_IPv6));
}
void OutDDnsClientStatus(PACK *p, DDNS_CLIENT_STATUS *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddInt(p, "Err_IPv4", t->Err_IPv4);
PackAddInt(p, "Err_IPv6", t->Err_IPv6);
PackAddStr(p, "CurrentHostName", t->CurrentHostName);
PackAddStr(p, "CurrentFqdn", t->CurrentFqdn);
PackAddStr(p, "DnsSuffix", t->DnsSuffix);
PackAddStr(p, "CurrentIPv4", t->CurrentIPv4);
PackAddStr(p, "CurrentIPv6", t->CurrentIPv6);
PackAddUniStr(p, "ErrStr_IPv4", t->ErrStr_IPv4);
PackAddUniStr(p, "ErrStr_IPv6", t->ErrStr_IPv6);
}
// INTERNET_SETTING
void InRpcInternetSetting(INTERNET_SETTING *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
t->ProxyType = PackGetInt(p, "ProxyType");
PackGetStr(p, "ProxyHostName", t->ProxyHostName, sizeof(t->ProxyHostName));
t->ProxyPort = PackGetInt(p, "ProxyPort");
PackGetStr(p, "ProxyUsername", t->ProxyUsername, sizeof(t->ProxyUsername));
PackGetStr(p, "ProxyPassword", t->ProxyPassword, sizeof(t->ProxyPassword));
PackGetStr(p, "CustomHttpHeader", t->CustomHttpHeader, sizeof(t->CustomHttpHeader));
}
void OutRpcInternetSetting(PACK *p, INTERNET_SETTING *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddInt(p, "ProxyType", t->ProxyType);
PackAddStr(p, "ProxyHostName", t->ProxyHostName);
PackAddInt(p, "ProxyPort", t->ProxyPort);
PackAddStr(p, "ProxyUsername", t->ProxyUsername);
PackAddStr(p, "ProxyPassword", t->ProxyPassword);
PackAddStr(p, "CustomHttpHeader", t->CustomHttpHeader);
}
// RPC_AZURE_STATUS
void InRpcAzureStatus(RPC_AZURE_STATUS *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_AZURE_STATUS));
t->IsConnected = PackGetBool(p, "IsConnected");
t->IsEnabled = PackGetBool(p, "IsEnabled");
}
void OutRpcAzureStatus(PACK *p, RPC_AZURE_STATUS *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddBool(p, "IsConnected", t->IsConnected);
PackAddBool(p, "IsEnabled", t->IsEnabled);
}
// RPC_SPECIAL_LISTENER
void InRpcSpecialListener(RPC_SPECIAL_LISTENER *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_SPECIAL_LISTENER));
t->VpnOverIcmpListener = PackGetBool(p, "VpnOverIcmpListener");
t->VpnOverDnsListener = PackGetBool(p, "VpnOverDnsListener");
}
void OutRpcSpecialListener(PACK *p, RPC_SPECIAL_LISTENER *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddBool(p, "VpnOverIcmpListener", t->VpnOverIcmpListener);
PackAddBool(p, "VpnOverDnsListener", t->VpnOverDnsListener);
}
// ETHERIP_ID
void InEtherIpId(ETHERIP_ID *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(ETHERIP_ID));
PackGetStr(p, "Id", t->Id, sizeof(t->Id));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
PackGetStr(p, "UserName", t->UserName, sizeof(t->UserName));
PackGetStr(p, "Password", t->Password, sizeof(t->Password));
}
void OutEtherIpId(PACK *p, ETHERIP_ID *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "Id", t->Id);
PackAddStr(p, "HubName", t->HubName);
PackAddStr(p, "UserName", t->UserName);
PackAddStr(p, "Password", t->Password);
}
// RPC_ENUM_ETHERIP_ID
void InRpcEnumEtherIpId(RPC_ENUM_ETHERIP_ID *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_ETHERIP_ID));
t->NumItem = PackGetInt(p, "NumItem");
t->IdList = ZeroMalloc(sizeof(ETHERIP_ID) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
ETHERIP_ID *e = &t->IdList[i];
PackGetStrEx(p, "Id", e->Id, sizeof(e->Id), i);
PackGetStrEx(p, "HubName", e->HubName, sizeof(e->HubName), i);
PackGetStrEx(p, "UserName", e->UserName, sizeof(e->UserName), i);
PackGetStrEx(p, "Password", e->Password, sizeof(e->Password), i);
}
}
void OutRpcEnumEtherIpId(PACK *p, RPC_ENUM_ETHERIP_ID *t)
{
UINT i;
// Validate arguments
if (p == NULL || t == NULL)
{
return;
}
PackAddInt(p, "NumItem", t->NumItem);
PackSetCurrentJsonGroupName(p, "Settings");
for (i = 0;i < t->NumItem;i++)
{
ETHERIP_ID *e = &t->IdList[i];
PackAddStrEx(p, "Id", e->Id, i, t->NumItem);
PackAddStrEx(p, "HubName", e->HubName, i, t->NumItem);
PackAddStrEx(p, "UserName", e->UserName, i, t->NumItem);
PackAddStrEx(p, "Password", e->Password, i, t->NumItem);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumEtherIpId(RPC_ENUM_ETHERIP_ID *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->IdList);
}
// IPSEC_SERVICES
void InIPsecServices(IPSEC_SERVICES *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(IPSEC_SERVICES));
t->L2TP_Raw = PackGetBool(p, "L2TP_Raw");
t->L2TP_IPsec = PackGetBool(p, "L2TP_IPsec");
t->EtherIP_IPsec = PackGetBool(p, "EtherIP_IPsec");
PackGetStr(p, "IPsec_Secret", t->IPsec_Secret, sizeof(t->IPsec_Secret));
PackGetStr(p, "L2TP_DefaultHub", t->L2TP_DefaultHub, sizeof(t->L2TP_DefaultHub));
}
void OutIPsecServices(PACK *p, IPSEC_SERVICES *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddBool(p, "L2TP_Raw", t->L2TP_Raw);
PackAddBool(p, "L2TP_IPsec", t->L2TP_IPsec);
PackAddBool(p, "EtherIP_IPsec", t->EtherIP_IPsec);
PackAddStr(p, "IPsec_Secret", t->IPsec_Secret);
PackAddStr(p, "L2TP_DefaultHub", t->L2TP_DefaultHub);
}
// RPC_WINVER
void InRpcWinVer(RPC_WINVER *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_WINVER));
t->IsWindows = PackGetBool(p, "V_IsWindows");
t->IsNT = PackGetBool(p, "V_IsNT");
t->IsServer = PackGetBool(p, "V_IsServer");
t->IsBeta = PackGetBool(p, "V_IsBeta");
t->VerMajor = PackGetInt(p, "V_VerMajor");
t->VerMinor = PackGetInt(p, "V_VerMinor");
t->Build = PackGetInt(p, "V_Build");
t->ServicePack = PackGetInt(p, "V_ServicePack");
PackGetStr(p, "V_Title", t->Title, sizeof(t->Title));
}
void OutRpcWinVer(PACK *p, RPC_WINVER *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddBool(p, "V_IsWindows", t->IsWindows);
PackAddBool(p, "V_IsNT", t->IsNT);
PackAddBool(p, "V_IsServer", t->IsServer);
PackAddBool(p, "V_IsBeta", t->IsBeta);
PackAddInt(p, "V_VerMajor", t->VerMajor);
PackAddInt(p, "V_VerMinor", t->VerMinor);
PackAddInt(p, "V_Build", t->Build);
PackAddInt(p, "V_ServicePack", t->ServicePack);
PackAddStr(p, "V_Title", t->Title);
}
// RPC_MSG
void InRpcMsg(RPC_MSG *t, PACK *p)
{
UINT size;
char *utf8;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_MSG));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
size = PackGetDataSize(p, "Msg");
utf8 = ZeroMalloc(size + 8);
PackGetData(p, "Msg", utf8);
t->Msg = CopyUtfToUni(utf8);
Free(utf8);
}
void OutRpcMsg(PACK *p, RPC_MSG *t)
{
UINT size;
char *utf8;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
utf8 = CopyUniToUtf(t->Msg);
size = StrLen(utf8);
PackAddData(p, "Msg", utf8, size);
Free(utf8);
}
void FreeRpcMsg(RPC_MSG *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Msg);
}
// RPC_ENUM_ETH_VLAN
void InRpcEnumEthVLan(RPC_ENUM_ETH_VLAN *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_ETH_VLAN));
t->NumItem = PackGetIndexCount(p, "DeviceName");
t->Items = ZeroMalloc(sizeof(RPC_ENUM_ETH_VLAN_ITEM) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_ETH_VLAN_ITEM *e = &t->Items[i];
PackGetStrEx(p, "DeviceName", e->DeviceName, sizeof(e->DeviceName), i);
PackGetStrEx(p, "Guid", e->Guid, sizeof(e->Guid), i);
PackGetStrEx(p, "DeviceInstanceId", e->DeviceInstanceId, sizeof(e->DeviceInstanceId), i);
PackGetStrEx(p, "DriverName", e->DriverName, sizeof(e->DriverName), i);
PackGetStrEx(p, "DriverType", e->DriverType, sizeof(e->DriverType), i);
e->Support = PackGetBoolEx(p, "Support", i);
e->Enabled = PackGetBoolEx(p, "Enabled", i);
}
}
void OutRpcEnumEthVLan(PACK *p, RPC_ENUM_ETH_VLAN *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackSetCurrentJsonGroupName(p, "Devices");
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_ETH_VLAN_ITEM *e = &t->Items[i];
PackAddStrEx(p, "DeviceName", e->DeviceName, i, t->NumItem);
PackAddStrEx(p, "Guid", e->Guid, i, t->NumItem);
PackAddStrEx(p, "DeviceInstanceId", e->DeviceInstanceId, i, t->NumItem);
PackAddStrEx(p, "DriverName", e->DriverName, i, t->NumItem);
PackAddStrEx(p, "DriverType", e->DriverType, i, t->NumItem);
PackAddBoolEx(p, "Support", e->Support, i, t->NumItem);
PackAddBoolEx(p, "Enabled", e->Enabled, i, t->NumItem);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumEthVLan(RPC_ENUM_ETH_VLAN *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Items);
}
// RPC_ENUM_LOG_FILE
void InRpcEnumLogFile(RPC_ENUM_LOG_FILE *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_LOG_FILE));
t->NumItem = PackGetInt(p, "NumItem");
t->Items = ZeroMalloc(sizeof(RPC_ENUM_LOG_FILE_ITEM) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_LOG_FILE_ITEM *e = &t->Items[i];
PackGetStrEx(p, "FilePath", e->FilePath, sizeof(e->FilePath), i);
PackGetStrEx(p, "ServerName", e->ServerName, sizeof(e->ServerName), i);
e->FileSize = PackGetIntEx(p, "FileSize", i);
e->UpdatedTime = PackGetInt64Ex(p, "UpdatedTime", i);
}
}
void OutRpcEnumLogFile(PACK *p, RPC_ENUM_LOG_FILE *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddInt(p, "NumItem", t->NumItem);
PackSetCurrentJsonGroupName(p, "LogFiles");
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_LOG_FILE_ITEM *e = &t->Items[i];
PackAddStrEx(p, "FilePath", e->FilePath, i, t->NumItem);
PackAddStrEx(p, "ServerName", e->ServerName, i, t->NumItem);
PackAddIntEx(p, "FileSize", e->FileSize, i, t->NumItem);
PackAddTime64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumItem);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumLogFile(RPC_ENUM_LOG_FILE *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Items);
}
void AdjoinRpcEnumLogFile(RPC_ENUM_LOG_FILE *t, RPC_ENUM_LOG_FILE *src)
{
LIST *o;
UINT i;
// Validate arguments
if (t == NULL || src == NULL)
{
return;
}
o = NewListFast(CmpLogFile);
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_LOG_FILE_ITEM *e = &t->Items[i];
LOG_FILE *f = ZeroMalloc(sizeof(LOG_FILE));
f->FileSize = e->FileSize;
StrCpy(f->Path, sizeof(f->Path), e->FilePath);
StrCpy(f->ServerName, sizeof(f->ServerName), e->ServerName);
f->UpdatedTime = e->UpdatedTime;
Add(o, f);
}
for (i = 0;i < src->NumItem;i++)
{
RPC_ENUM_LOG_FILE_ITEM *e = &src->Items[i];
LOG_FILE *f = ZeroMalloc(sizeof(LOG_FILE));
f->FileSize = e->FileSize;
StrCpy(f->Path, sizeof(f->Path), e->FilePath);
StrCpy(f->ServerName, sizeof(f->ServerName), e->ServerName);
f->UpdatedTime = e->UpdatedTime;
Add(o, f);
}
FreeRpcEnumLogFile(t);
Sort(o);
Zero(t, sizeof(RPC_ENUM_LOG_FILE));
t->NumItem = LIST_NUM(o);
t->Items = ZeroMalloc(sizeof(RPC_ENUM_LOG_FILE_ITEM) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
LOG_FILE *f = LIST_DATA(o, i);
RPC_ENUM_LOG_FILE_ITEM *e = &t->Items[i];
StrCpy(e->FilePath, sizeof(e->FilePath), f->Path);
StrCpy(e->ServerName, sizeof(e->ServerName), f->ServerName);
e->FileSize = f->FileSize;
e->UpdatedTime = f->UpdatedTime;
}
FreeEnumLogFile(o);
}
// RPC_READ_LOG_FILE
void InRpcReadLogFile(RPC_READ_LOG_FILE *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_READ_LOG_FILE));
PackGetStr(p, "FilePath", t->FilePath, sizeof(t->FilePath));
PackGetStr(p, "ServerName", t->ServerName, sizeof(t->ServerName));
t->Offset = PackGetInt(p, "Offset");
t->Buffer = PackGetBuf(p, "Buffer");
}
void OutRpcReadLogFile(PACK *p, RPC_READ_LOG_FILE *t)
{
// Validate arguments
if (p == NULL || t == NULL)
{
return;
}
PackAddStr(p, "FilePath", t->FilePath);
PackAddStr(p, "ServerName", t->ServerName);
PackAddInt(p, "Offset", t->Offset);
if (t->Buffer != NULL)
{
PackAddBuf(p, "Buffer", t->Buffer);
}
}
void FreeRpcReadLogFile(RPC_READ_LOG_FILE *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
if (t->Buffer != NULL)
{
FreeBuf(t->Buffer);
}
}
// RPC_AC_LIST
void InRpcAcList(RPC_AC_LIST *t, PACK *p)
{
UINT i;
LIST *o;
UINT num;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_AC_LIST));
o = NewAcList();
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
num = PackGetIndexCount(p, "IpAddress");
for (i = 0;i < num;i++)
{
AC *ac = ZeroMalloc(sizeof(AC));
ac->Id = PackGetIntEx(p, "Id", i);
ac->Deny = PackGetBoolEx(p, "Deny", i);
PackGetIpEx(p, "IpAddress", &ac->IpAddress, i);
ac->Masked = PackGetBoolEx(p, "Masked", i);
if (ac->Masked)
{
PackGetIpEx(p, "SubnetMask", &ac->SubnetMask, i);
}
ac->Priority = PackGetIntEx(p, "Priority", i);
AddAc(o, ac);
Free(ac);
}
t->o = o;
}
void OutRpcAcList(PACK *p, RPC_AC_LIST *t)
{
UINT i, num;
LIST *o;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
o = t->o;
num = LIST_NUM(o);
PackAddInt(p, "NumItem", num);
PackAddStr(p, "HubName", t->HubName);
PackSetCurrentJsonGroupName(p, "ACList");
for (i = 0;i < num;i++)
{
AC *ac = LIST_DATA(o, i);
PackAddIntEx(p, "Id", ac->Id, i, num);
PackAddBoolEx(p, "Deny", ac->Deny, i, num);
PackAddIpEx(p, "IpAddress", &ac->IpAddress, i, num);
PackAddBoolEx(p, "Masked", ac->Masked, i, num);
PackAddIpEx(p, "SubnetMask", &ac->SubnetMask, i, num);
PackAddIntEx(p, "Priority", ac->Priority, i, num);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcAcList(RPC_AC_LIST *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
FreeAcList(t->o);
}
// RPC_INT
void InRpcInt(RPC_INT *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_INT));
t->IntValue = PackGetInt(p, "IntValue");
}
void OutRpcInt(PACK *p, RPC_INT *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddInt(p, "IntValue", t->IntValue);
}
// RPC_ENUM_CRL
void InRpcEnumCrl(RPC_ENUM_CRL *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_CRL));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->NumItem = PackGetInt(p, "NumItem");
t->Items = ZeroMalloc(sizeof(RPC_ENUM_CRL_ITEM) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_CRL_ITEM *e = &t->Items[i];
e->Key = PackGetIntEx(p, "Key", i);
PackGetUniStrEx(p, "CrlInfo", e->CrlInfo, sizeof(e->CrlInfo), i);
}
}
void OutRpcEnumCrl(PACK *p, RPC_ENUM_CRL *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddInt(p, "NumItem", t->NumItem);
PackSetCurrentJsonGroupName(p, "CRLList");
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_CRL_ITEM *e = &t->Items[i];
PackAddIntEx(p, "Key", e->Key, i, t->NumItem);
PackAddUniStrEx(p, "CrlInfo", e->CrlInfo, i, t->NumItem);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumCrl(RPC_ENUM_CRL *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Items);
}
// RPC_CRL
void InRpcCrl(RPC_CRL *t, PACK *p)
{
BUF *b;
NAME *n;
wchar_t tmp[MAX_SIZE];
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_CRL));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->Key = PackGetInt(p, "Key");
b = PackGetBuf(p, "Serial");
t->Crl = ZeroMalloc(sizeof(CRL));
if (b != NULL)
{
t->Crl->Serial = NewXSerial(b->Buf, b->Size);
FreeBuf(b);
}
t->Crl->Name = ZeroMalloc(sizeof(NAME));
n = t->Crl->Name;
if (PackGetUniStr(p, "CommonName", tmp, sizeof(tmp)))
{
n->CommonName = CopyUniStr(tmp);
}
if (PackGetUniStr(p, "Organization", tmp, sizeof(tmp)))
{
n->Organization = CopyUniStr(tmp);
}
if (PackGetUniStr(p, "Unit", tmp, sizeof(tmp)))
{
n->Unit = CopyUniStr(tmp);
}
if (PackGetUniStr(p, "Country", tmp, sizeof(tmp)))
{
n->Country = CopyUniStr(tmp);
}
if (PackGetUniStr(p, "State", tmp, sizeof(tmp)))
{
n->State = CopyUniStr(tmp);
}
if (PackGetUniStr(p, "Local", tmp, sizeof(tmp)))
{
n->Local = CopyUniStr(tmp);
}
if (PackGetDataSize(p, "DigestMD5") == MD5_SIZE)
{
PackGetData(p, "DigestMD5", t->Crl->DigestMD5);
}
if (PackGetDataSize(p, "DigestSHA1") == SHA1_SIZE)
{
PackGetData(p, "DigestSHA1", t->Crl->DigestSHA1);
}
}
void OutRpcCrl(PACK *p, RPC_CRL *t)
{
NAME *n;
// Validate arguments
if (p == NULL || t == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddInt(p, "Key", t->Key);
if (t->Crl == NULL)
{
return;
}
if (t->Crl->Serial != NULL)
{
PackAddData(p, "Serial", t->Crl->Serial->data, t->Crl->Serial->size);
}
n = t->Crl->Name;
if (n->CommonName != NULL)
{
PackAddUniStr(p, "CommonName", n->CommonName);
}
if (n->Organization != NULL)
{
PackAddUniStr(p, "Organization", n->Organization);
}
if (n->Unit != NULL)
{
PackAddUniStr(p, "Unit", n->Unit);
}
if (n->Country != NULL)
{
PackAddUniStr(p, "Country", n->Country);
}
if (n->State != NULL)
{
PackAddUniStr(p, "State", n->State);
}
if (n->Local != NULL)
{
PackAddUniStr(p, "Local", n->Local);
}
if (IsZero(t->Crl->DigestMD5, MD5_SIZE) == false)
{
PackAddData(p, "DigestMD5", t->Crl->DigestMD5, MD5_SIZE);
}
if (IsZero(t->Crl->DigestSHA1, SHA1_SIZE) == false)
{
PackAddData(p, "DigestSHA1", t->Crl->DigestSHA1, SHA1_SIZE);
}
}
void FreeRpcCrl(RPC_CRL *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
FreeCrl(t->Crl);
}
// RPC_ENUM_L3TABLE
void InRpcEnumL3Table(RPC_ENUM_L3TABLE *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_L3TABLE));
t->NumItem = PackGetInt(p, "NumItem");
PackGetStr(p, "Name", t->Name, sizeof(t->Name));
t->Items = ZeroMalloc(sizeof(RPC_L3TABLE) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
RPC_L3TABLE *e = &t->Items[i];
e->NetworkAddress = PackGetIp32Ex(p, "NetworkAddress", i);
e->SubnetMask = PackGetIp32Ex(p, "SubnetMask", i);
e->GatewayAddress = PackGetIp32Ex(p, "GatewayAddress", i);
e->Metric = PackGetIntEx(p, "Metric", i);
}
}
void OutRpcEnumL3Table(PACK *p, RPC_ENUM_L3TABLE *t)
{
UINT i;
// Validate arguments
if (p == NULL || t == NULL)
{
return;
}
PackAddInt(p, "NumItem", t->NumItem);
PackAddStr(p, "Name", t->Name);
PackSetCurrentJsonGroupName(p, "L3Table");
for (i = 0;i < t->NumItem;i++)
{
RPC_L3TABLE *e = &t->Items[i];
PackAddIp32Ex(p, "NetworkAddress", e->NetworkAddress, i, t->NumItem);
PackAddIp32Ex(p, "SubnetMask", e->SubnetMask, i, t->NumItem);
PackAddIp32Ex(p, "GatewayAddress", e->GatewayAddress, i, t->NumItem);
PackAddIntEx(p, "Metric", e->Metric, i, t->NumItem);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumL3Table(RPC_ENUM_L3TABLE *t)
{
Free(t->Items);
}
// RPC_L3TABLE
void InRpcL3Table(RPC_L3TABLE *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_L3TABLE));
PackGetStr(p, "Name", t->Name, sizeof(t->Name));
t->NetworkAddress = PackGetIp32(p, "NetworkAddress");
t->SubnetMask = PackGetIp32(p, "SubnetMask");
t->GatewayAddress = PackGetIp32(p, "GatewayAddress");
t->Metric = PackGetInt(p, "Metric");
}
void OutRpcL3Table(PACK *p, RPC_L3TABLE *t)
{
// Validate arguments
if (p == NULL || t == NULL)
{
return;
}
PackAddStr(p, "Name", t->Name);
PackAddIp32(p, "NetworkAddress", t->NetworkAddress);
PackAddIp32(p, "SubnetMask", t->SubnetMask);
PackAddIp32(p, "GatewayAddress", t->GatewayAddress);
PackAddInt(p, "Metric", t->Metric);
}
// RPC_ENUM_L3IF
void InRpcEnumL3If(RPC_ENUM_L3IF *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_L3IF));
t->NumItem = PackGetInt(p, "NumItem");
PackGetStr(p, "Name", t->Name, sizeof(t->Name));
t->Items = ZeroMalloc(sizeof(RPC_L3IF) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
RPC_L3IF *f = &t->Items[i];
PackGetStrEx(p, "HubName", f->HubName, sizeof(f->HubName), i);
f->IpAddress = PackGetIp32Ex(p, "IpAddress", i);
f->SubnetMask = PackGetIp32Ex(p, "SubnetMask", i);
}
}
void OutRpcEnumL3If(PACK *p, RPC_ENUM_L3IF *t)
{
UINT i;
// Validate arguments
if (p == NULL || t == NULL)
{
return;
}
PackAddInt(p, "NumItem", t->NumItem);
PackAddStr(p, "Name", t->Name);
PackSetCurrentJsonGroupName(p, "L3IFList");
for (i = 0;i < t->NumItem;i++)
{
RPC_L3IF *f = &t->Items[i];
PackAddStrEx(p, "HubName", f->HubName, i, t->NumItem);
PackAddIp32Ex(p, "IpAddress", f->IpAddress, i, t->NumItem);
PackAddIp32Ex(p, "SubnetMask", f->SubnetMask, i, t->NumItem);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumL3If(RPC_ENUM_L3IF *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Items);
}
// RPC_L3IF
void InRpcL3If(RPC_L3IF *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_L3IF));
PackGetStr(p, "Name", t->Name, sizeof(t->Name));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->IpAddress = PackGetIp32(p, "IpAddress");
t->SubnetMask = PackGetIp32(p, "SubnetMask");
}
void OutRpcL3If(PACK *p, RPC_L3IF *t)
{
// Validate arguments
if (p == NULL || t == NULL)
{
return;
}
PackAddStr(p, "Name", t->Name);
PackAddStr(p, "HubName", t->HubName);
PackAddIp32(p, "IpAddress", t->IpAddress);
PackAddIp32(p, "SubnetMask", t->SubnetMask);
}
// RPC_L3SW
void InRpcL3Sw(RPC_L3SW *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_L3SW));
PackGetStr(p, "Name", t->Name, sizeof(t->Name));
}
void OutRpcL3Sw(PACK *p, RPC_L3SW *t)
{
// Validate arguments
if (p == NULL || t == NULL)
{
return;
}
PackAddStr(p, "Name", t->Name);
}
// RPC_ENUM_L3SW
void InRpcEnumL3Sw(RPC_ENUM_L3SW *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_L3SW));
t->NumItem = PackGetInt(p, "NumItem");
t->Items = ZeroMalloc(sizeof(RPC_ENUM_L3SW_ITEM) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_L3SW_ITEM *s = &t->Items[i];
PackGetStrEx(p, "Name", s->Name, sizeof(s->Name), i);
s->NumInterfaces = PackGetIntEx(p, "NumInterfaces", i);
s->NumTables = PackGetIntEx(p, "NumTables", i);
s->Active = PackGetBoolEx(p, "Active", i);
s->Online = PackGetBoolEx(p, "Online", i);
}
}
void OutRpcEnumL3Sw(PACK *p, RPC_ENUM_L3SW *t)
{
UINT i;
// Validate arguments
if (p == NULL || t == NULL)
{
return;
}
PackAddInt(p, "NumItem", t->NumItem);
PackSetCurrentJsonGroupName(p, "L3SWList");
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_L3SW_ITEM *s = &t->Items[i];
PackAddStrEx(p, "Name", s->Name, i, t->NumItem);
PackAddIntEx(p, "NumInterfaces", s->NumInterfaces, i, t->NumItem);
PackAddIntEx(p, "NumTables", s->NumTables, i, t->NumItem);
PackAddBoolEx(p, "Active", s->Active, i, t->NumItem);
PackAddBoolEx(p, "Online", s->Online, i, t->NumItem);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumL3Sw(RPC_ENUM_L3SW *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Items);
}
// RPC_ENUM_ETH
void InRpcEnumEth(RPC_ENUM_ETH *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_ETH));
t->NumItem = PackGetInt(p, "NumItem");
t->Items = ZeroMalloc(sizeof(RPC_ENUM_ETH_ITEM) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_ETH_ITEM *e = &t->Items[i];
PackGetStrEx(p, "DeviceName", e->DeviceName, sizeof(e->DeviceName), i);
PackGetUniStrEx(p, "NetworkConnectionName", e->NetworkConnectionName, sizeof(e->NetworkConnectionName), i);
}
}
void OutRpcEnumEth(PACK *p, RPC_ENUM_ETH *t)
{
UINT i;
// Validate arguments
if (p == NULL || t == NULL)
{
return;
}
PackAddInt(p, "NumItem", t->NumItem);
PackSetCurrentJsonGroupName(p, "EthList");
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_ETH_ITEM *e = &t->Items[i];
PackAddStrEx(p, "DeviceName", e->DeviceName, i, t->NumItem);
PackAddUniStrEx(p, "NetworkConnectionName", e->NetworkConnectionName, i, t->NumItem);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumEth(RPC_ENUM_ETH *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Items);
}
// RPC_LOCALBRIDGE
void InRpcLocalBridge(RPC_LOCALBRIDGE *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_LOCALBRIDGE));
PackGetStr(p, "DeviceName", t->DeviceName, sizeof(t->DeviceName));
PackGetStr(p, "HubNameLB", t->HubName, sizeof(t->HubName));
t->TapMode = PackGetBool(p, "TapMode");
}
void OutRpcLocalBridge(PACK *p, RPC_LOCALBRIDGE *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "DeviceName", t->DeviceName);
PackAddStr(p, "HubNameLB", t->HubName);
PackAddBool(p, "TapMode", t->TapMode);
}
// RPC_ENUM_LOCALBRIDGE
void InRpcEnumLocalBridge(RPC_ENUM_LOCALBRIDGE *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_LOCALBRIDGE));
t->NumItem = PackGetInt(p, "NumItem");
t->Items = ZeroMalloc(sizeof(RPC_LOCALBRIDGE) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
RPC_LOCALBRIDGE *e = &t->Items[i];
PackGetStrEx(p, "DeviceName", e->DeviceName, sizeof(e->DeviceName), i);
PackGetStrEx(p, "HubNameLB", e->HubName, sizeof(e->HubName), i);
e->Online = PackGetBoolEx(p, "Online", i);
e->Active = PackGetBoolEx(p, "Active", i);
e->TapMode = PackGetBoolEx(p, "TapMode", i);
}
}
void OutRpcEnumLocalBridge(PACK *p, RPC_ENUM_LOCALBRIDGE *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddInt(p, "NumItem", t->NumItem);
PackSetCurrentJsonGroupName(p, "LocalBridgeList");
for (i = 0;i < t->NumItem;i++)
{
RPC_LOCALBRIDGE *e = &t->Items[i];
PackAddStrEx(p, "DeviceName", e->DeviceName, i, t->NumItem);
PackAddStrEx(p, "HubNameLB", e->HubName, i, t->NumItem);
PackAddBoolEx(p, "Online", e->Online, i, t->NumItem);
PackAddBoolEx(p, "Active", e->Active, i, t->NumItem);
PackAddBoolEx(p, "TapMode", e->TapMode, i, t->NumItem);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumLocalBridge(RPC_ENUM_LOCALBRIDGE *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Items);
}
// MEMINFO
void InRpcMemInfo(MEMINFO *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(MEMINFO));
t->TotalMemory = PackGetInt64(p, "TotalMemory");
t->UsedMemory = PackGetInt64(p, "UsedMemory");
t->FreeMemory = PackGetInt64(p, "FreeMemory");
t->TotalPhys = PackGetInt64(p, "TotalPhys");
t->UsedPhys = PackGetInt64(p, "UsedPhys");
t->FreePhys = PackGetInt64(p, "FreePhys");
}
void OutRpcMemInfo(PACK *p, MEMINFO *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddInt64(p, "TotalMemory", t->TotalMemory);
PackAddInt64(p, "UsedMemory", t->UsedMemory);
PackAddInt64(p, "FreeMemory", t->FreeMemory);
PackAddInt64(p, "TotalPhys", t->TotalPhys);
PackAddInt64(p, "UsedPhys", t->UsedPhys);
PackAddInt64(p, "FreePhys", t->FreePhys);
}
// OS_INFO
void InRpcOsInfo(OS_INFO *t, PACK *p)
{
char tmp[MAX_SIZE];
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(OS_INFO));
t->OsType = PackGetInt(p, "OsType");
t->OsServicePack = PackGetInt(p, "OsServicePack");
if (PackGetStr(p, "OsSystemName", tmp, sizeof(tmp)))
{
t->OsSystemName = CopyStr(tmp);
}
if (PackGetStr(p, "OsProductName", tmp, sizeof(tmp)))
{
t->OsProductName = CopyStr(tmp);
}
if (PackGetStr(p, "OsVendorName", tmp, sizeof(tmp)))
{
t->OsVendorName = CopyStr(tmp);
}
if (PackGetStr(p, "OsVersion", tmp, sizeof(tmp)))
{
t->OsVersion = CopyStr(tmp);
}
if (PackGetStr(p, "KernelName", tmp, sizeof(tmp)))
{
t->KernelName = CopyStr(tmp);
}
if (PackGetStr(p, "KernelVersion", tmp, sizeof(tmp)))
{
t->KernelVersion = CopyStr(tmp);
}
}
void OutRpcOsInfo(PACK *p, OS_INFO *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddInt(p, "OsType", t->OsType);
PackAddInt(p, "OsServicePack", t->OsServicePack);
PackAddStr(p, "OsSystemName", t->OsSystemName);
PackAddStr(p, "OsProductName", t->OsProductName);
PackAddStr(p, "OsVendorName", t->OsVendorName);
PackAddStr(p, "OsVersion", t->OsVersion);
PackAddStr(p, "KernelName", t->KernelName);
PackAddStr(p, "KernelVersion", t->KernelVersion);
}
void FreeRpcOsInfo(OS_INFO *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->OsSystemName);
Free(t->OsProductName);
Free(t->OsVendorName);
Free(t->OsVersion);
Free(t->KernelName);
Free(t->KernelVersion);
}
// Read a local log file
void SiReadLocalLogFile(SERVER *s, char *filepath, UINT offset, RPC_READ_LOG_FILE *t)
{
char exe_dir[MAX_PATH], full_path[MAX_PATH];
IO *o;
// Validate arguments
if (s == NULL || t == NULL || filepath == NULL)
{
return;
}
Zero(t, sizeof(RPC_READ_LOG_FILE));
GetLogDir(exe_dir, sizeof(exe_dir));
Format(full_path, sizeof(full_path), "%s/%s", exe_dir, filepath);
// Read file
o = FileOpenEx(full_path, false, false);
if (o != NULL)
{
UINT filesize = FileSize(o);
if (offset < filesize)
{
UINT readsize = MIN(filesize - offset, FTP_BLOCK_SIZE);
void *buf = ZeroMalloc(readsize);
FileSeek(o, FILE_BEGIN, offset);
FileRead(o, buf, readsize);
t->Buffer = NewBuf();
WriteBuf(t->Buffer, buf, readsize);
Free(buf);
}
FileClose(o);
}
}
// Enumerate local log files
void SiEnumLocalLogFileList(SERVER *s, char *hubname, RPC_ENUM_LOG_FILE *t)
{
LIST *o;
UINT i;
// Validate arguments
if (s == NULL || t == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_LOG_FILE));
o = EnumLogFile(hubname);
t->NumItem = LIST_NUM(o);
t->Items = ZeroMalloc(sizeof(RPC_ENUM_LOG_FILE_ITEM) * t->NumItem);
for (i = 0;i < LIST_NUM(o);i++)
{
LOG_FILE *f = LIST_DATA(o, i);
RPC_ENUM_LOG_FILE_ITEM *e = &t->Items[i];
StrCpy(e->FilePath, sizeof(e->FilePath), f->Path);
StrCpy(e->ServerName, sizeof(e->ServerName), f->ServerName);
e->FileSize = f->FileSize;
e->UpdatedTime = f->UpdatedTime;
}
FreeEnumLogFile(o);
}
// Enumerate local sessions
void SiEnumLocalSession(SERVER *s, char *hubname, RPC_ENUM_SESSION *t)
{
HUB *h;
UINT64 now = Tick64();
UINT64 dormant_interval = 0;
// Validate arguments
if (s == NULL || hubname == NULL || t == NULL)
{
return;
}
LockHubList(s->Cedar);
h = GetHub(s->Cedar, hubname);
UnlockHubList(s->Cedar);
if (h == NULL)
{
t->NumSession = 0;
t->Sessions = ZeroMalloc(0);
return;
}
if (h->Option != NULL)
{
dormant_interval = h->Option->DetectDormantSessionInterval * (UINT64)1000;
}
LockList(h->SessionList);
{
UINT i;
t->NumSession = LIST_NUM(h->SessionList);
t->Sessions = ZeroMalloc(sizeof(RPC_ENUM_SESSION_ITEM) * t->NumSession);
for (i = 0;i < t->NumSession;i++)
{
SESSION *s = LIST_DATA(h->SessionList, i);
RPC_ENUM_SESSION_ITEM *e = &t->Sessions[i];
Lock(s->lock);
{
StrCpy(e->Name, sizeof(e->Name), s->Name);
StrCpy(e->Username, sizeof(e->Username), s->Username);
e->Ip = IPToUINT(&s->Connection->ClientIp);
CopyIP(&e->ClientIP, &s->Connection->ClientIp);
StrCpy(e->Hostname, sizeof(e->Hostname), s->Connection->ClientHostname);
e->MaxNumTcp = s->MaxConnection;
e->CreatedTime = Tick64ToTime64(s->CreatedTime);
e->LastCommTime = Tick64ToTime64(s->LastCommTime);
e->LinkMode = s->LinkModeServer;
e->SecureNATMode = s->SecureNATMode;
e->BridgeMode = s->BridgeMode;
e->Layer3Mode = s->L3SwitchMode;
e->VLanId = s->VLanId;
LockList(s->Connection->Tcp->TcpSockList);
{
e->CurrentNumTcp = s->Connection->Tcp->TcpSockList->num_item;
}
UnlockList(s->Connection->Tcp->TcpSockList);
Lock(s->TrafficLock);
{
e->PacketSize = GetTrafficPacketSize(s->Traffic);
e->PacketNum = GetTrafficPacketNum(s->Traffic);
}
Unlock(s->TrafficLock);
e->Client_BridgeMode = s->IsBridgeMode;
e->Client_MonitorMode = s->IsMonitorMode;
Copy(e->UniqueId, s->NodeInfo.UniqueId, 16);
if (s->NormalClient)
{
e->IsDormantEnabled = (dormant_interval == 0 ? false : true);
if (e->IsDormantEnabled)
{
if (s->LastCommTimeForDormant == 0)
{
e->LastCommDormant = (UINT64)0x7FFFFFFF;
}
else
{
e->LastCommDormant = now - s->LastCommTimeForDormant;
}
if (s->LastCommTimeForDormant == 0)
{
e->IsDormant = true;
}
else
{
if ((s->LastCommTimeForDormant + dormant_interval) < now)
{
e->IsDormant = true;
}
}
}
}
}
Unlock(s->lock);
GetMachineName(e->RemoteHostname, sizeof(e->RemoteHostname));
}
}
UnlockList(h->SessionList);
ReleaseHub(h);
}
// RPC_ENUM_LICENSE_KEY
void InRpcEnumLicenseKey(RPC_ENUM_LICENSE_KEY *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_LICENSE_KEY));
t->NumItem = PackGetInt(p, "NumItem");
t->Items = ZeroMalloc(sizeof(RPC_ENUM_LICENSE_KEY_ITEM) * t->NumItem);
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_LICENSE_KEY_ITEM *e = &t->Items[i];
e->Id = PackGetIntEx(p, "Id", i);
PackGetStrEx(p, "LicenseKey", e->LicenseKey, sizeof(e->LicenseKey), i);
PackGetStrEx(p, "LicenseId", e->LicenseId, sizeof(e->LicenseId), i);
PackGetStrEx(p, "LicenseName", e->LicenseName, sizeof(e->LicenseName), i);
e->Expires = PackGetInt64Ex(p, "Expires", i);
e->Status = PackGetIntEx(p, "Status", i);
e->ProductId = PackGetIntEx(p, "ProductId", i);
e->SystemId = PackGetInt64Ex(p, "SystemId", i);
e->SerialId = PackGetIntEx(p, "SerialId", i);
}
}
void OutRpcEnumLicenseKey(PACK *p, RPC_ENUM_LICENSE_KEY *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddInt(p, "NumItem", t->NumItem);
PackSetCurrentJsonGroupName(p, "LicenseKeyList");
for (i = 0;i < t->NumItem;i++)
{
RPC_ENUM_LICENSE_KEY_ITEM *e = &t->Items[i];
PackAddIntEx(p, "Id", e->Id, i, t->NumItem);
PackAddStrEx(p, "LicenseKey", e->LicenseKey, i, t->NumItem);
PackAddStrEx(p, "LicenseId", e->LicenseId, i, t->NumItem);
PackAddStrEx(p, "LicenseName", e->LicenseName, i, t->NumItem);
PackAddTime64Ex(p, "Expires", e->Expires, i, t->NumItem);
PackAddIntEx(p, "Status", e->Status, i, t->NumItem);
PackAddIntEx(p, "ProductId", e->ProductId, i, t->NumItem);
PackAddInt64Ex(p, "SystemId", e->SystemId, i, t->NumItem);
PackAddIntEx(p, "SerialId", e->SerialId, i, t->NumItem);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumLicenseKey(RPC_ENUM_LICENSE_KEY *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Items);
}
// RPC_LICENSE_STATUS
void InRpcLicenseStatus(RPC_LICENSE_STATUS *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_LICENSE_STATUS));
t->EditionId = PackGetInt(p, "EditionId");
PackGetStr(p, "EditionStr", t->EditionStr, sizeof(t->EditionStr) );
t->SystemId = PackGetInt64(p, "SystemId");
t->SystemExpires = PackGetInt64(p, "SystemExpires");
t->NumClientConnectLicense = PackGetInt(p, "NumClientConnectLicense");
t->NumBridgeConnectLicense = PackGetInt(p, "NumBridgeConnectLicense");
// v3.0
t->NeedSubscription = PackGetBool(p, "NeedSubscription");
t->AllowEnterpriseFunction = PackGetBool(p, "AllowEnterpriseFunction");
t->SubscriptionExpires = PackGetInt64(p, "SubscriptionExpires");
t->IsSubscriptionExpired = PackGetBool(p, "IsSubscriptionExpired");
t->NumUserCreationLicense = PackGetInt(p, "NumUserCreationLicense");
t->ReleaseDate = PackGetInt64(p, "ReleaseDate");
}
void OutRpcLicenseStatus(PACK *p, RPC_LICENSE_STATUS *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddInt(p, "EditionId", t->EditionId);
PackAddStr(p, "EditionStr", t->EditionStr);
PackAddInt64(p, "SystemId", t->SystemId);
PackAddTime64(p, "SystemExpires", t->SystemExpires);
PackAddInt(p, "NumClientConnectLicense", t->NumClientConnectLicense);
PackAddInt(p, "NumBridgeConnectLicense", t->NumBridgeConnectLicense);
// v3.0
PackAddBool(p, "NeedSubscription", t->NeedSubscription);
PackAddBool(p, "AllowEnterpriseFunction", t->AllowEnterpriseFunction);
PackAddTime64(p, "SubscriptionExpires", t->SubscriptionExpires);
PackAddBool(p, "IsSubscriptionExpired", t->IsSubscriptionExpired);
PackAddInt(p, "NumUserCreationLicense", t->NumUserCreationLicense);
PackAddTime64(p, "ReleaseDate", t->ReleaseDate);
}
// RPC_ADMIN_OPTION
void InRpcAdminOption(RPC_ADMIN_OPTION *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ADMIN_OPTION));
t->NumItem = PackGetIndexCount(p, "Name");
t->Items = ZeroMalloc(sizeof(ADMIN_OPTION) * t->NumItem);
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
for (i = 0;i < t->NumItem;i++)
{
ADMIN_OPTION *o = &t->Items[i];
PackGetStrEx(p, "Name", o->Name, sizeof(o->Name), i);
o->Value = PackGetIntEx(p, "Value", i);
PackGetUniStrEx(p, "Descrption", o->Descrption, sizeof(o->Descrption), i);
}
}
void OutRpcAdminOption(PACK *p, RPC_ADMIN_OPTION *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddInt(p, "NumItem", t->NumItem);
PackAddStr(p, "HubName", t->HubName);
PackSetCurrentJsonGroupName(p, "AdminOptionList");
for (i = 0;i < t->NumItem;i++)
{
ADMIN_OPTION *o = &t->Items[i];
PackAddStrEx(p, "Name", o->Name, i, t->NumItem);
PackAddIntEx(p, "Value", o->Value, i, t->NumItem);
PackAddUniStrEx(p, "Descrption", o->Descrption, i, t->NumItem);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcAdminOption(RPC_ADMIN_OPTION *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Items);
}
// RPC_CONFIG
void InRpcConfig(RPC_CONFIG *t, PACK *p)
{
UINT size;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_CONFIG));
PackGetStr(p, "FileName", t->FileName, sizeof(t->FileName));
size = PackGetDataSize(p, "FileData");
t->FileData = ZeroMalloc(size + 1);
PackGetData(p, "FileData", t->FileData);
}
void OutRpcConfig(PACK *p, RPC_CONFIG *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "FileName", t->FileName);
PackAddData(p, "FileData", t->FileData, StrLen(t->FileData));
}
void FreeRpcConfig(RPC_CONFIG *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->FileData);
}
// RPC_BRIDGE_SUPPORT
void InRpcBridgeSupport(RPC_BRIDGE_SUPPORT *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_BRIDGE_SUPPORT));
t->IsBridgeSupportedOs = PackGetBool(p, "IsBridgeSupportedOs");
t->IsWinPcapNeeded = PackGetBool(p, "IsWinPcapNeeded");
}
void OutRpcBridgeSupport(PACK *p, RPC_BRIDGE_SUPPORT *t)
{
// Validate arguments
if (p == NULL || t == NULL)
{
return;
}
PackAddBool(p, "IsBridgeSupportedOs", t->IsBridgeSupportedOs);
PackAddBool(p, "IsWinPcapNeeded",t->IsWinPcapNeeded);
}
// RPC_ADD_ACCESS
void InRpcAddAccess(RPC_ADD_ACCESS *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ADD_ACCESS));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
InRpcAccess(&t->Access, p);
}
void OutRpcAddAccess(PACK *p, RPC_ADD_ACCESS *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
OutRpcAccess(p, &t->Access);
}
// RPC_DELETE_ACCESS
void InRpcDeleteAccess(RPC_DELETE_ACCESS *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_DELETE_ACCESS));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->Id = PackGetInt(p, "Id");
}
void OutRpcDeleteAccess(PACK *p, RPC_DELETE_ACCESS *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddInt(p, "Id", t->Id);
}
// RPC_SERVER_INFO
void InRpcServerInfo(RPC_SERVER_INFO *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_SERVER_INFO));
PackGetStr(p, "ServerProductName", t->ServerProductName, sizeof(t->ServerProductName));
PackGetStr(p, "ServerVersionString", t->ServerVersionString, sizeof(t->ServerVersionString));
PackGetStr(p, "ServerBuildInfoString", t->ServerBuildInfoString, sizeof(t->ServerBuildInfoString));
t->ServerVerInt = PackGetInt(p, "ServerVerInt");
t->ServerBuildInt = PackGetInt(p, "ServerBuildInt");
PackGetStr(p, "ServerHostName", t->ServerHostName, sizeof(t->ServerHostName));
t->ServerType = PackGetInt(p, "ServerType");
t->ServerBuildDate = PackGetInt64(p, "ServerBuildDate");
PackGetStr(p, "ServerFamilyName", t->ServerFamilyName, sizeof(t->ServerFamilyName));
InRpcOsInfo(&t->OsInfo, p);
}
void OutRpcServerInfo(PACK *p, RPC_SERVER_INFO *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "ServerProductName", t->ServerProductName);
PackAddStr(p, "ServerVersionString", t->ServerVersionString);
PackAddStr(p, "ServerBuildInfoString", t->ServerBuildInfoString);
PackAddInt(p, "ServerVerInt", t->ServerVerInt);
PackAddInt(p, "ServerBuildInt", t->ServerBuildInt);
PackAddStr(p, "ServerHostName", t->ServerHostName);
PackAddInt(p, "ServerType", t->ServerType);
PackAddTime64(p, "ServerBuildDate", t->ServerBuildDate);
PackAddStr(p, "ServerFamilyName", t->ServerFamilyName);
OutRpcOsInfo(p, &t->OsInfo);
}
void FreeRpcServerInfo(RPC_SERVER_INFO *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
FreeRpcOsInfo(&t->OsInfo);
}
// RPC_SERVER_STATUS
void InRpcServerStatus(RPC_SERVER_STATUS *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_SERVER_STATUS));
t->ServerType = PackGetInt(p, "ServerType");
t->NumTcpConnections = PackGetInt(p, "NumTcpConnections");
t->NumTcpConnectionsLocal = PackGetInt(p, "NumTcpConnectionsLocal");
t->NumTcpConnectionsRemote = PackGetInt(p, "NumTcpConnectionsRemote");
t->NumHubTotal = PackGetInt(p, "NumHubTotal");
t->NumHubStandalone = PackGetInt(p, "NumHubStandalone");
t->NumHubStatic = PackGetInt(p, "NumHubStatic");
t->NumHubDynamic = PackGetInt(p, "NumHubDynamic");
t->NumSessionsTotal = PackGetInt(p, "NumSessionsTotal");
t->NumSessionsLocal = PackGetInt(p, "NumSessionsLocal");
t->NumSessionsRemote = PackGetInt(p, "NumSessionsRemote");
t->NumMacTables = PackGetInt(p, "NumMacTables");
t->NumIpTables = PackGetInt(p, "NumIpTables");
t->NumUsers = PackGetInt(p, "NumUsers");
t->NumGroups = PackGetInt(p, "NumGroups");
t->CurrentTime = PackGetInt64(p, "CurrentTime");
t->CurrentTick = PackGetInt64(p, "CurrentTick");
t->AssignedBridgeLicenses = PackGetInt(p, "AssignedBridgeLicenses");
t->AssignedClientLicenses = PackGetInt(p, "AssignedClientLicenses");
t->AssignedBridgeLicensesTotal = PackGetInt(p, "AssignedBridgeLicensesTotal");
t->AssignedClientLicensesTotal = PackGetInt(p, "AssignedClientLicensesTotal");
t->StartTime = PackGetInt64(p, "StartTime");
InRpcTraffic(&t->Traffic, p);
InRpcMemInfo(&t->MemInfo, p);
}
void OutRpcServerStatus(PACK *p, RPC_SERVER_STATUS *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddInt(p, "ServerType", t->ServerType);
PackAddInt(p, "NumHubTotal", t->NumHubTotal);
PackAddInt(p, "NumHubStandalone", t->NumHubStandalone);
PackAddInt(p, "NumHubStatic", t->NumHubStatic);
PackAddInt(p, "NumHubDynamic", t->NumHubDynamic);
PackAddInt(p, "NumSessionsTotal", t->NumSessionsTotal);
PackAddInt(p, "NumSessionsLocal", t->NumSessionsLocal);
PackAddInt(p, "NumSessionsRemote", t->NumSessionsRemote);
PackAddInt(p, "NumTcpConnections", t->NumTcpConnections);
PackAddInt(p, "NumTcpConnectionsLocal", t->NumTcpConnectionsLocal);
PackAddInt(p, "NumTcpConnectionsRemote", t->NumTcpConnectionsRemote);
PackAddInt(p, "NumMacTables", t->NumMacTables);
PackAddInt(p, "NumIpTables", t->NumIpTables);
PackAddInt(p, "NumUsers", t->NumUsers);
PackAddInt(p, "NumGroups", t->NumGroups);
PackAddTime64(p, "CurrentTime", t->CurrentTime);
PackAddInt64(p, "CurrentTick", t->CurrentTick);
PackAddInt(p, "AssignedBridgeLicenses", t->AssignedBridgeLicenses);
PackAddInt(p, "AssignedClientLicenses", t->AssignedClientLicenses);
PackAddInt(p, "AssignedBridgeLicensesTotal", t->AssignedBridgeLicensesTotal);
PackAddInt(p, "AssignedClientLicensesTotal", t->AssignedClientLicensesTotal);
PackAddTime64(p, "StartTime", t->StartTime);
OutRpcTraffic(p, &t->Traffic);
OutRpcMemInfo(p, &t->MemInfo);
}
// RPC_LISTENER
void InRpcListener(RPC_LISTENER *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_LISTENER));
t->Port = PackGetInt(p, "Port");
t->Enable = PackGetBool(p, "Enable");
}
void OutRpcListener(PACK *p, RPC_LISTENER *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddInt(p, "Port", t->Port);
PackAddBool(p, "Enable", t->Enable);
}
// RPC_LISTENER_LIST
void InRpcListenerList(RPC_LISTENER_LIST *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_LISTENER_LIST));
t->NumPort = PackGetIndexCount(p, "Ports");
t->Ports = ZeroMalloc(sizeof(UINT) * t->NumPort);
t->Enables = ZeroMalloc(sizeof(UINT) * t->NumPort);
t->Errors = ZeroMalloc(sizeof(UINT) * t->NumPort);
for (i = 0;i < t->NumPort;i++)
{
t->Ports[i] = PackGetIntEx(p, "Ports", i);
t->Enables[i] = PackGetBoolEx(p, "Enables", i);
t->Errors[i] = PackGetBoolEx(p, "Errors", i);
}
}
void OutRpcListenerList(PACK *p, RPC_LISTENER_LIST *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackSetCurrentJsonGroupName(p, "ListenerList");
for (i = 0;i < t->NumPort;i++)
{
PackAddIntEx(p, "Ports", t->Ports[i], i, t->NumPort);
PackAddBoolEx(p, "Enables", t->Enables[i], i, t->NumPort);
PackAddBoolEx(p, "Errors", t->Errors[i], i, t->NumPort);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcListenerList(RPC_LISTENER_LIST *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Ports);
Free(t->Enables);
Free(t->Errors);
}
// RPC_PORTS
void InRpcPorts(RPC_PORTS *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
t->Num = PackGetIndexCount(p, "Ports");
t->Ports = ZeroMalloc(sizeof(UINT) * t->Num);
for (i = 0; i < t->Num; ++i)
{
t->Ports[i] = PackGetIntEx(p, "Ports", i);
}
}
void OutRpcPorts(PACK *p, RPC_PORTS *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
for (i = 0; i < t->Num; ++i)
{
PackAddIntEx(p, "Ports", t->Ports[i], i, t->Num);
}
}
void FreeRpcPorts(RPC_PORTS *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Ports);
}
// RPC_STR
void InRpcStr(RPC_STR *t, PACK *p)
{
UINT size = 65536;
char *tmp = Malloc(size);
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_STR));
if (PackGetStr(p, "String", tmp, size) == false)
{
t->String = CopyStr("");
}
else
{
t->String = CopyStr(tmp);
}
Free(tmp);
}
void OutRpcStr(PACK *p, RPC_STR *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "String", t->String);
}
void FreeRpcStr(RPC_STR *t)
{
// Validate arguments
if (t == NULL )
{
return;
}
Free(t->String);
}
// RPC_PROTO_OPTIONS
void InRpcProtoOptions(RPC_PROTO_OPTIONS *t, PACK *p)
{
UINT i, size;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_PROTO_OPTIONS));
size = PackGetStrSize(p, "Protocol");
if (size > 0)
{
t->Protocol = Malloc(size);
if (PackGetStr(p, "Protocol", t->Protocol, size) == false)
{
Zero(t->Protocol, size);
}
}
t->Num = PackGetIndexCount(p, "Name");
if (t->Num == 0)
{
return;
}
t->Options = ZeroMalloc(sizeof(PROTO_OPTION) * t->Num);
for (i = 0; i < t->Num; ++i)
{
PROTO_OPTION *option = &t->Options[i];
size = PackGetStrSizeEx(p, "Name", i);
if (size > 0)
{
option->Name = Malloc(size);
if (PackGetStrEx(p, "Name", option->Name, size, i) == false)
{
Zero(option->Name, size);
}
}
option->Type = PackGetIntEx(p, "Type", i);
switch (option->Type)
{
case PROTO_OPTION_STRING:
size = PackGetDataSizeEx(p, "Value", i);
if (size > 0)
{
option->String = Malloc(size);
if (PackGetDataEx2(p, "Value", option->String, size, i) == false)
{
Zero(option->String, size);
}
}
break;
case PROTO_OPTION_BOOL:
PackGetDataEx2(p, "Value", &option->Bool, sizeof(option->Bool), i);
break;
case PROTO_OPTION_UINT32:
PackGetDataEx2(p, "Value", &option->UInt32, sizeof(option->UInt32), i);
break;
default:
Debug("InRpcProtoOptions(): unhandled type %u!\n", option->Type);
}
}
}
void OutRpcProtoOptions(PACK *p, RPC_PROTO_OPTIONS *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "Protocol", t->Protocol);
for (i = 0; i < t->Num; ++i)
{
PROTO_OPTION *option = &t->Options[i];
PackAddStrEx(p, "Name", option->Name, i, t->Num);
PackAddIntEx(p, "Type", option->Type, i, t->Num);
switch (option->Type)
{
case PROTO_OPTION_STRING:
PackAddDataEx(p, "Value", option->String, StrLen(option->String) + 1, i, t->Num);
break;
case PROTO_OPTION_BOOL:
PackAddDataEx(p, "Value", &option->Bool, sizeof(option->Bool), i, t->Num);
break;
case PROTO_OPTION_UINT32:
PackAddDataEx(p, "Value", &option->UInt32, sizeof(option->UInt32), i, t->Num);
break;
default:
Debug("OutRpcProtoOptions(): unhandled type %u!\n", option->Type);
}
}
}
void FreeRpcProtoOptions(RPC_PROTO_OPTIONS *t)
{
UINT i;
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Protocol);
for (i = 0; i < t->Num; ++i)
{
PROTO_OPTION *option = &t->Options[i];
Free(option->Name);
if (option->Type == PROTO_OPTION_STRING)
{
Free(option->String);
}
}
Free(t->Options);
}
// RPC_SET_PASSWORD
void InRpcSetPassword(RPC_SET_PASSWORD *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_SET_PASSWORD));
PackGetData2(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword));
PackGetStr(p, "PlainTextPassword", t->PlainTextPassword, sizeof(t->PlainTextPassword));
}
void OutRpcSetPassword(PACK *p, RPC_SET_PASSWORD *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddData(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword));
PackAddStr(p, "PlainTextPassword", t->PlainTextPassword);
}
// RPC_FARM
void InRpcFarm(RPC_FARM *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_FARM));
t->ServerType = PackGetInt(p, "ServerType");
t->NumPort = PackGetIndexCount(p, "Ports");
t->Ports = ZeroMalloc(sizeof(UINT) * t->NumPort);
for (i = 0;i < t->NumPort;i++)
{
t->Ports[i] = PackGetIntEx(p, "Ports", i);
}
t->PublicIp = PackGetIp32(p, "PublicIp");
PackGetStr(p, "ControllerName", t->ControllerName, sizeof(t->ControllerName));
t->ControllerPort = PackGetInt(p, "ControllerPort");
PackGetData2(p, "MemberPassword", t->MemberPassword, sizeof(t->MemberPassword));
PackGetStr(p, "MemberPasswordPlaintext", t->MemberPasswordPlaintext, sizeof(t->MemberPasswordPlaintext));
t->Weight = PackGetInt(p, "Weight");
t->ControllerOnly = PackGetBool(p, "ControllerOnly");
}
void OutRpcFarm(PACK *p, RPC_FARM *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddInt(p, "ServerType", t->ServerType);
for (i = 0;i < t->NumPort;i++)
{
PackAddIntEx(p, "Ports", t->Ports[i], i, t->NumPort);
}
PackAddIp32(p, "PublicIp", t->PublicIp);
PackAddStr(p, "ControllerName", t->ControllerName);
PackAddInt(p, "ControllerPort", t->ControllerPort);
PackAddData(p, "MemberPassword", t->MemberPassword, sizeof(t->MemberPassword));
PackAddStr(p, "MemberPasswordPlaintext", t->MemberPasswordPlaintext);
PackAddInt(p, "Weight", t->Weight);
PackAddBool(p, "ControllerOnly", t->ControllerOnly);
}
void FreeRpcFarm(RPC_FARM *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Ports);
}
// RPC_FARM_HUB
void InRpcFarmHub(RPC_FARM_HUB *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_FARM_HUB));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->DynamicHub = PackGetBool(p, "DynamicHub");
}
void OutRpcFarmHub(PACK *p, RPC_FARM_HUB *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddBool(p, "DynamicHub", t->DynamicHub);
}
// RPC_FARM_INFO
void InRpcFarmInfo(RPC_FARM_INFO *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL)
{
return;
}
Zero(t, sizeof(RPC_FARM_INFO));
t->Id = PackGetInt(p, "Id");
t->Controller = PackGetBool(p, "Controller");
t->ConnectedTime = PackGetInt64(p, "ConnectedTime");
t->Ip = PackGetIp32(p, "Ip");
PackGetStr(p, "Hostname", t->Hostname, sizeof(t->Hostname));
t->Point = PackGetInt(p, "Point");
t->NumPort = PackGetIndexCount(p, "Ports");
t->Ports = ZeroMalloc(sizeof(UINT) * t->NumPort);
for (i = 0;i < t->NumPort;i++)
{
t->Ports[i] = PackGetIntEx(p, "Ports", i);
}
t->ServerCert = PackGetX(p, "ServerCert");
t->NumFarmHub = PackGetIndexCount(p, "HubName");
t->FarmHubs = ZeroMalloc(sizeof(RPC_FARM_HUB) * t->NumFarmHub);
for (i = 0;i < t->NumFarmHub;i++)
{
PackGetStrEx(p, "HubName", t->FarmHubs[i].HubName, sizeof(t->FarmHubs[i].HubName), i);
t->FarmHubs[i].DynamicHub = PackGetBoolEx(p, "DynamicHub", i);
}
t->NumSessions = PackGetInt(p, "NumSessions");
t->NumTcpConnections = PackGetInt(p, "NumTcpConnections");
t->Weight = PackGetInt(p, "Weight");
}
void OutRpcFarmInfo(PACK *p, RPC_FARM_INFO *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddInt(p, "Id", t->Id);
PackAddBool(p, "Controller", t->Controller);
PackAddTime64(p, "ConnectedTime", t->ConnectedTime);
PackAddIp32(p, "Ip", t->Ip);
PackAddStr(p, "Hostname", t->Hostname);
PackAddInt(p, "Point", t->Point);
for (i = 0;i < t->NumPort;i++)
{
PackAddIntEx(p, "Ports", t->Ports[i], i, t->NumPort);
}
PackAddX(p, "ServerCert", t->ServerCert);
PackSetCurrentJsonGroupName(p, "HubsList");
for (i = 0;i < t->NumFarmHub;i++)
{
PackAddStrEx(p, "HubName", t->FarmHubs[i].HubName, i, t->NumFarmHub);
PackAddBoolEx(p, "DynamicHub", t->FarmHubs[i].DynamicHub, i, t->NumFarmHub);
}
PackSetCurrentJsonGroupName(p, NULL);
PackAddInt(p, "NumSessions", t->NumSessions);
PackAddInt(p, "NumTcpConnections", t->NumTcpConnections);
PackAddInt(p, "Weight", t->Weight);
}
void FreeRpcFarmInfo(RPC_FARM_INFO *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Ports);
Free(t->FarmHubs);
FreeX(t->ServerCert);
}
void InRpcEnumFarm(RPC_ENUM_FARM *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_FARM));
t->NumFarm = PackGetIndexCount(p, "Id");
t->Farms = ZeroMalloc(sizeof(RPC_ENUM_FARM_ITEM) * t->NumFarm);
for (i = 0;i < t->NumFarm;i++)
{
RPC_ENUM_FARM_ITEM *e = &t->Farms[i];
e->Id = PackGetIntEx(p, "Id", i);
e->Controller = PackGetBoolEx(p, "Controller", i);
e->ConnectedTime = PackGetInt64Ex(p, "ConnectedTime", i);
e->Ip = PackGetIp32Ex(p, "Ip", i);
PackGetStrEx(p, "Hostname", e->Hostname, sizeof(e->Hostname), i);
e->Point = PackGetIntEx(p, "Point", i);
e->NumSessions = PackGetIntEx(p, "NumSessions", i);
e->NumTcpConnections = PackGetIntEx(p, "NumTcpConnections", i);
e->NumHubs = PackGetIntEx(p, "NumHubs", i);
e->AssignedClientLicense = PackGetIntEx(p, "AssignedClientLicense", i);
e->AssignedBridgeLicense = PackGetIntEx(p, "AssignedBridgeLicense", i);
}
}
void OutRpcEnumFarm(PACK *p, RPC_ENUM_FARM *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackSetCurrentJsonGroupName(p, "FarmMemberList");
for (i = 0;i < t->NumFarm;i++)
{
RPC_ENUM_FARM_ITEM *e = &t->Farms[i];
PackAddIntEx(p, "Id", e->Id, i, t->NumFarm);
PackAddBoolEx(p, "Controller", e->Controller, i, t->NumFarm);
PackAddTime64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumFarm);
PackAddIp32Ex(p, "Ip", e->Ip, i, t->NumFarm);
PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumFarm);
PackAddIntEx(p, "Point", e->Point, i, t->NumFarm);
PackAddIntEx(p, "NumSessions", e->NumSessions, i, t->NumFarm);
PackAddIntEx(p, "NumTcpConnections", e->NumTcpConnections, i, t->NumFarm);
PackAddIntEx(p, "NumHubs", e->NumHubs, i, t->NumFarm);
PackAddIntEx(p, "AssignedClientLicense", e->AssignedClientLicense, i, t->NumFarm);
PackAddIntEx(p, "AssignedBridgeLicense", e->AssignedBridgeLicense, i, t->NumFarm);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumFarm(RPC_ENUM_FARM *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Farms);
}
// RPC_FARM_CONNECTION_STATUS
void InRpcFarmConnectionStatus(RPC_FARM_CONNECTION_STATUS *t, PACK *p)
{
Zero(t, sizeof(RPC_FARM_CONNECTION_STATUS));
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
t->Ip = PackGetIp32(p, "Ip");
t->Port = PackGetInt(p, "Port");
t->Online = PackGetBool(p, "Online");
t->LastError = PackGetInt(p, "LastError");
t->StartedTime = PackGetInt64(p, "StartedTime");
t->CurrentConnectedTime = PackGetInt64(p, "CurrentConnectedTime");
t->FirstConnectedTime = PackGetInt64(p, "FirstConnectedTime");
t->NumConnected = PackGetInt(p, "NumConnected");
t->NumTry = PackGetInt(p, "NumTry");
t->NumFailed = PackGetInt(p, "NumFailed");
}
void OutRpcFarmConnectionStatus(PACK *p, RPC_FARM_CONNECTION_STATUS *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddIp32(p, "Ip", t->Ip);
PackAddInt(p, "Port", t->Port);
PackAddBool(p, "Online", t->Online);
PackAddInt(p, "LastError", t->LastError);
PackAddTime64(p, "StartedTime", t->StartedTime);
PackAddTime64(p, "CurrentConnectedTime", t->CurrentConnectedTime);
PackAddTime64(p, "FirstConnectedTime", t->FirstConnectedTime);
PackAddInt(p, "NumConnected", t->NumConnected);
PackAddInt(p, "NumTry", t->NumTry);
PackAddInt(p, "NumFailed", t->NumFailed);
}
// RPC_HUB_OPTION
void InRpcHubOption(RPC_HUB_OPTION *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_HUB_OPTION));
t->DefaultGateway = PackGetInt(p, "DefaultGateway");
t->DefaultSubnet = PackGetInt(p, "DefaultSubnet");
t->MaxSession = PackGetInt(p, "MaxSession");
t->NoEnum = PackGetBool(p, "NoEnum");
}
void OutRpcHubOption(PACK *p, RPC_HUB_OPTION *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddInt(p, "DefaultGateway", t->DefaultGateway);
PackAddInt(p, "DefaultSubnet", t->DefaultSubnet);
PackAddInt(p, "MaxSession", t->MaxSession);
PackAddBool(p, "NoEnum", t->NoEnum);
}
// RPC_RADIUS
void InRpcRadius(RPC_RADIUS *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_RADIUS));
PackGetStr(p, "RadiusServerName", t->RadiusServerName, sizeof(t->RadiusServerName));
t->RadiusPort = PackGetInt(p, "RadiusPort");
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
PackGetStr(p, "RadiusSecret", t->RadiusSecret, sizeof(t->RadiusSecret));
t->RadiusRetryInterval = PackGetInt(p, "RadiusRetryInterval");
}
void OutRpcRadius(PACK *p, RPC_RADIUS *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "RadiusServerName", t->RadiusServerName);
PackAddInt(p, "RadiusPort", t->RadiusPort);
PackAddStr(p, "HubName", t->HubName);
PackAddStr(p, "RadiusSecret", t->RadiusSecret);
PackAddInt(p, "RadiusRetryInterval", t->RadiusRetryInterval);
}
// RPC_HUB
void InRpcHub(RPC_HUB *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_HUB));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
}
void OutRpcHub(PACK *p, RPC_HUB *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
}
// RPC_CREATE_HUB
void InRpcCreateHub(RPC_CREATE_HUB *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_CREATE_HUB));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
PackGetData2(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword));
PackGetData2(p, "SecurePassword", t->SecurePassword, sizeof(t->SecurePassword));
PackGetStr(p, "AdminPasswordPlainText", t->AdminPasswordPlainText, sizeof(t->AdminPasswordPlainText));
t->Online = PackGetBool(p, "Online");
InRpcHubOption(&t->HubOption, p);
t->HubType = PackGetInt(p, "HubType");
}
void OutRpcCreateHub(PACK *p, RPC_CREATE_HUB *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddData(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword));
PackAddData(p, "SecurePassword", t->SecurePassword, sizeof(t->SecurePassword));
PackAddBool(p, "Online", t->Online);
PackAddStr(p, "AdminPasswordPlainText", t->AdminPasswordPlainText);
OutRpcHubOption(p, &t->HubOption);
PackAddInt(p, "HubType", t->HubType);
}
// RPC_ENUM_HUB
void InRpcEnumHub(RPC_ENUM_HUB *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_HUB));
t->NumHub = PackGetIndexCount(p, "HubName");
t->Hubs = ZeroMalloc(sizeof(RPC_ENUM_HUB_ITEM) * t->NumHub);
for (i = 0;i < t->NumHub;i++)
{
RPC_ENUM_HUB_ITEM *e = &t->Hubs[i];
PackGetStrEx(p, "HubName", e->HubName, sizeof(e->HubName), i);
e->Online = PackGetBoolEx(p, "Online", i);
e->HubType = PackGetIntEx(p, "HubType", i);
e->NumSessions = PackGetIntEx(p, "NumSessions", i);
e->NumUsers = PackGetIntEx(p, "NumUsers", i);
e->NumGroups = PackGetIntEx(p, "NumGroups", i);
e->NumMacTables = PackGetIntEx(p, "NumMacTables", i);
e->NumIpTables = PackGetIntEx(p, "NumIpTables", i);
e->LastCommTime = PackGetInt64Ex(p, "LastCommTime", i);
e->CreatedTime = PackGetInt64Ex(p, "CreatedTime", i);
e->LastLoginTime = PackGetInt64Ex(p, "LastLoginTime", i);
e->NumLogin = PackGetIntEx(p, "NumLogin", i);
e->IsTrafficFilled = PackGetBoolEx(p, "IsTrafficFilled", i);
InRpcTrafficEx(&e->Traffic, p, i);
}
}
void OutRpcEnumHub(PACK *p, RPC_ENUM_HUB *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackSetCurrentJsonGroupName(p, "HubList");
for (i = 0;i < t->NumHub;i++)
{
RPC_ENUM_HUB_ITEM *e = &t->Hubs[i];
PackAddStrEx(p, "HubName", e->HubName, i, t->NumHub);
PackAddBoolEx(p, "Online", e->Online, i, t->NumHub);
PackAddIntEx(p, "HubType", e->HubType, i, t->NumHub);
PackAddIntEx(p, "NumSessions", e->NumSessions, i, t->NumHub);
PackAddIntEx(p, "NumUsers", e->NumUsers, i, t->NumHub);
PackAddIntEx(p, "NumGroups", e->NumGroups, i, t->NumHub);
PackAddIntEx(p, "NumMacTables", e->NumMacTables, i, t->NumHub);
PackAddIntEx(p, "NumIpTables", e->NumIpTables, i, t->NumHub);
PackAddTime64Ex(p, "LastCommTime", e->LastCommTime, i, t->NumHub);
PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumHub);
PackAddTime64Ex(p, "LastLoginTime", e->LastLoginTime, i, t->NumHub);
PackAddIntEx(p, "NumLogin", e->NumLogin, i, t->NumHub);
PackAddBoolEx(p, "IsTrafficFilled", e->IsTrafficFilled, i, t->NumHub);
OutRpcTrafficEx(&e->Traffic, p, i, t->NumHub);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumHub(RPC_ENUM_HUB *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Hubs);
}
// RPC_DELETE_HUB
void InRpcDeleteHub(RPC_DELETE_HUB *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_DELETE_HUB));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
}
void OutRpcDeleteHub(PACK *p, RPC_DELETE_HUB *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
}
// RPC_ENUM_CONNECTION
void InRpcEnumConnection(RPC_ENUM_CONNECTION *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_CONNECTION));
t->NumConnection = PackGetIndexCount(p, "Name");
t->Connections = ZeroMalloc(sizeof(RPC_ENUM_CONNECTION_ITEM) * t->NumConnection);
for (i = 0;i < t->NumConnection;i++)
{
RPC_ENUM_CONNECTION_ITEM *e = &t->Connections[i];
e->Ip = PackGetIp32Ex(p, "Ip", i);
e->Port = PackGetIntEx(p, "Port", i);
PackGetStrEx(p, "Name", e->Name, sizeof(e->Name), i);
PackGetStrEx(p, "Hostname", e->Hostname, sizeof(e->Hostname), i);
e->ConnectedTime = PackGetInt64Ex(p, "ConnectedTime", i);
e->Type = PackGetIntEx(p, "Type", i);
}
}
void OutRpcEnumConnection(PACK *p, RPC_ENUM_CONNECTION *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackSetCurrentJsonGroupName(p, "ConnectionList");
for (i = 0;i < t->NumConnection;i++)
{
RPC_ENUM_CONNECTION_ITEM *e = &t->Connections[i];
PackAddIp32Ex(p, "Ip", e->Ip, i, t->NumConnection);
PackAddIntEx(p, "Port", e->Port, i, t->NumConnection);
PackAddStrEx(p, "Name", e->Name, i, t->NumConnection);
PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumConnection);
PackAddTime64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumConnection);
PackAddIntEx(p, "Type", e->Type, i, t->NumConnection);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumConnection(RPC_ENUM_CONNECTION *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Connections);
}
// RPC_DISCONNECT_CONNECTION
void InRpcDisconnectConnection(RPC_DISCONNECT_CONNECTION *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_DISCONNECT_CONNECTION));
PackGetStr(p, "Name", t->Name, sizeof(t->Name));
}
void OutRpcDisconnectConnection(PACK *p, RPC_DISCONNECT_CONNECTION *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "Name", t->Name);
}
// RPC_CONNECTION_INFO
void InRpcConnectionInfo(RPC_CONNECTION_INFO *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_CONNECTION_INFO));
PackGetStr(p, "Name", t->Name, sizeof(t->Name));
t->Ip = PackGetIp32(p, "Ip");
t->Port = PackGetInt(p, "Port");
t->ConnectedTime = PackGetInt64(p, "ConnectedTime");
PackGetStr(p, "Hostname", t->Hostname, sizeof(t->Hostname));
PackGetStr(p, "ServerStr", t->ServerStr, sizeof(t->ServerStr));
PackGetStr(p, "ClientStr", t->ClientStr, sizeof(t->ClientStr));
t->ServerVer = PackGetInt(p, "ServerVer");
t->ServerBuild = PackGetInt(p, "ServerBuild");
t->ClientVer = PackGetInt(p, "ClientVer");
t->ClientBuild = PackGetInt(p, "ClientBuild");
t->Type = PackGetInt(p, "Type");
}
void OutRpcConnectionInfo(PACK *p, RPC_CONNECTION_INFO *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "Name", t->Name);
PackAddIp32(p, "Ip", t->Ip);
PackAddInt(p, "Port", t->Port);
PackAddTime64(p, "ConnectedTime", t->ConnectedTime);
PackAddStr(p, "Hostname", t->Hostname);
PackAddStr(p, "ServerStr", t->ServerStr);
PackAddStr(p, "ClientStr", t->ClientStr);
PackAddInt(p, "ServerVer", t->ServerVer);
PackAddInt(p, "ServerBuild", t->ServerBuild);
PackAddInt(p, "ClientVer", t->ClientVer);
PackAddInt(p, "ClientBuild", t->ClientBuild);
PackAddInt(p, "Type", t->Type);
}
// RPC_SET_HUB_ONLINE
void InRpcSetHubOnline(RPC_SET_HUB_ONLINE *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_SET_HUB_ONLINE));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->Online = PackGetBool(p, "Online");
}
void OutRpcSetHubOnline(PACK *p, RPC_SET_HUB_ONLINE *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddBool(p, "Online", t->Online);
}
// RPC_HUB_STATUS
void InRpcHubStatus(RPC_HUB_STATUS *t, PACK *p)
{
Zero(t, sizeof(RPC_HUB_STATUS));
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->Online = PackGetBool(p, "Online");
t->HubType = PackGetInt(p, "HubType");
t->NumSessions = PackGetInt(p, "NumSessions");
t->NumSessionsClient = PackGetInt(p, "NumSessionsClient");
t->NumSessionsBridge = PackGetInt(p, "NumSessionsBridge");
t->NumAccessLists = PackGetInt(p, "NumAccessLists");
t->NumUsers = PackGetInt(p, "NumUsers");
t->NumGroups = PackGetInt(p, "NumGroups");
t->NumMacTables = PackGetInt(p, "NumMacTables");
t->NumIpTables = PackGetInt(p, "NumIpTables");
t->SecureNATEnabled = PackGetBool(p, "SecureNATEnabled");
InRpcTraffic(&t->Traffic, p);
t->LastCommTime = PackGetInt64(p, "LastCommTime");
t->CreatedTime = PackGetInt64(p, "CreatedTime");
t->LastLoginTime = PackGetInt64(p, "LastLoginTime");
t->NumLogin = PackGetInt(p, "NumLogin");
}
void OutRpcHubStatus(PACK *p, RPC_HUB_STATUS *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddBool(p, "Online", t->Online);
PackAddInt(p, "HubType", t->HubType);
PackAddInt(p, "NumSessions", t->NumSessions);
PackAddInt(p, "NumSessionsClient", t->NumSessionsClient);
PackAddInt(p, "NumSessionsBridge", t->NumSessionsBridge);
PackAddInt(p, "NumAccessLists", t->NumAccessLists);
PackAddInt(p, "NumUsers", t->NumUsers);
PackAddInt(p, "NumGroups", t->NumGroups);
PackAddInt(p, "NumMacTables", t->NumMacTables);
PackAddInt(p, "NumIpTables", t->NumIpTables);
PackAddBool(p, "SecureNATEnabled", t->SecureNATEnabled);
OutRpcTraffic(p, &t->Traffic);
PackAddTime64(p, "LastCommTime", t->LastCommTime);
PackAddTime64(p, "CreatedTime", t->CreatedTime);
PackAddTime64(p, "LastLoginTime", t->LastLoginTime);
PackAddInt(p, "NumLogin", t->NumLogin);
}
// RPC_HUB_LOG
void InRpcHubLog(RPC_HUB_LOG *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_HUB_LOG));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->LogSetting.SaveSecurityLog = PackGetBool(p, "SaveSecurityLog");
t->LogSetting.SecurityLogSwitchType = PackGetInt(p, "SecurityLogSwitchType");
t->LogSetting.SavePacketLog = PackGetBool(p, "SavePacketLog");
t->LogSetting.PacketLogSwitchType = PackGetInt(p, "PacketLogSwitchType");
for (i = 0;i < NUM_PACKET_LOG;i++)
{
t->LogSetting.PacketLogConfig[i] = PackGetIntEx(p, "PacketLogConfig", i);
}
}
void OutRpcHubLog(PACK *p, RPC_HUB_LOG *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddBool(p, "SaveSecurityLog", t->LogSetting.SaveSecurityLog);
PackAddInt(p, "SecurityLogSwitchType", t->LogSetting.SecurityLogSwitchType);
PackAddBool(p, "SavePacketLog", t->LogSetting.SavePacketLog);
PackAddInt(p, "PacketLogSwitchType", t->LogSetting.PacketLogSwitchType);
for (i = 0;i < NUM_PACKET_LOG;i++)
{
PackAddIntEx(p, "PacketLogConfig", t->LogSetting.PacketLogConfig[i], i, NUM_PACKET_LOG);
}
}
// RPC_HUB_ADD_CA
void InRpcHubAddCa(RPC_HUB_ADD_CA *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_HUB_ADD_CA));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->Cert = PackGetX(p, "Cert");
}
void OutRpcHubAddCa(PACK *p, RPC_HUB_ADD_CA *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddX(p, "Cert", t->Cert);
}
void FreeRpcHubAddCa(RPC_HUB_ADD_CA *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
FreeX(t->Cert);
}
// RPC_HUB_ENUM_CA
void InRpcHubEnumCa(RPC_HUB_ENUM_CA *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_HUB_ENUM_CA));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->NumCa = PackGetIndexCount(p, "Key");
t->Ca = ZeroMalloc(sizeof(RPC_HUB_ENUM_CA_ITEM) * t->NumCa);
for (i = 0;i < t->NumCa;i++)
{
RPC_HUB_ENUM_CA_ITEM *e = &t->Ca[i];
e->Key = PackGetIntEx(p, "Key", i);
PackGetUniStrEx(p, "SubjectName", e->SubjectName, sizeof(e->SubjectName), i);
PackGetUniStrEx(p, "IssuerName", e->IssuerName, sizeof(e->IssuerName), i);
e->Expires = PackGetInt64Ex(p, "Expires", i);
}
}
void OutRpcHubEnumCa(PACK *p, RPC_HUB_ENUM_CA *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackSetCurrentJsonGroupName(p, "CAList");
for (i = 0;i < t->NumCa;i++)
{
RPC_HUB_ENUM_CA_ITEM *e = &t->Ca[i];
PackAddIntEx(p, "Key", e->Key, i, t->NumCa);
PackAddUniStrEx(p, "SubjectName", e->SubjectName, i, t->NumCa);
PackAddUniStrEx(p, "IssuerName", e->IssuerName, i, t->NumCa);
PackAddTime64Ex(p, "Expires", e->Expires, i, t->NumCa);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcHubEnumCa(RPC_HUB_ENUM_CA *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Ca);
}
// RPC_HUB_GET_CA
void InRpcHubGetCa(RPC_HUB_GET_CA *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_HUB_GET_CA));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->Key = PackGetInt(p, "Key");
t->Cert = PackGetX(p, "Cert");
}
void OutRpcHubGetCa(PACK *p, RPC_HUB_GET_CA *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddInt(p, "Key", t->Key);
PackAddX(p, "Cert", t->Cert);
}
void FreeRpcHubGetCa(RPC_HUB_GET_CA *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
FreeX(t->Cert);
}
// RPC_HUB_DELETE_CA
void InRpcHubDeleteCa(RPC_HUB_DELETE_CA *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_HUB_DELETE_CA));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->Key = PackGetInt(p, "Key");
}
void OutRpcHubDeleteCa(PACK *p, RPC_HUB_DELETE_CA *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddInt(p, "Key", t->Key);
}
// RPC_CREATE_LINK
void InRpcCreateLink(RPC_CREATE_LINK *t, PACK *p)
{
BUF *b;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_CREATE_LINK));
PackGetStr(p, "HubName_Ex", t->HubName, sizeof(t->HubName));
t->Online = PackGetBool(p, "Online");
t->ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));
InRpcClientOption(t->ClientOption, p);
t->ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));
InRpcClientAuth(t->ClientAuth, p);
InRpcPolicy(&t->Policy, p);
t->CheckServerCert = PackGetBool(p, "CheckServerCert");
b = PackGetBuf(p, "ServerCert");
if (b != NULL)
{
t->ServerCert = BufToX(b, false);
FreeBuf(b);
}
}
void OutRpcCreateLink(PACK *p, RPC_CREATE_LINK *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName_Ex",t->HubName);
PackAddBool(p, "Online", t->Online);
OutRpcClientOption(p, t->ClientOption);
OutRpcClientAuth(p, t->ClientAuth);
OutRpcPolicy(p, &t->Policy);
PackAddBool(p, "CheckServerCert", t->CheckServerCert);
if (t->ServerCert != NULL)
{
BUF *b;
b = XToBuf(t->ServerCert, false);
PackAddBuf(p, "ServerCert", b);
FreeBuf(b);
}
}
void FreeRpcCreateLink(RPC_CREATE_LINK *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
if (t->ServerCert != NULL)
{
FreeX(t->ServerCert);
}
Free(t->ClientOption);
CiFreeClientAuth(t->ClientAuth);
}
// RPC_ENUM_LINK
void InRpcEnumLink(RPC_ENUM_LINK *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_LINK));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->NumLink = PackGetIndexCount(p, "AccountName");
t->Links = ZeroMalloc(sizeof(RPC_ENUM_LINK_ITEM) * t->NumLink);
for (i = 0;i < t->NumLink;i++)
{
RPC_ENUM_LINK_ITEM *e = &t->Links[i];
PackGetUniStrEx(p, "AccountName", e->AccountName, sizeof(e->AccountName), i);
PackGetStrEx(p, "Hostname", e->Hostname, sizeof(e->Hostname), i);
PackGetStrEx(p, "ConnectedHubName", e->HubName, sizeof(e->HubName), i);
e->Online = PackGetBoolEx(p, "Online", i);
e->ConnectedTime = PackGetInt64Ex(p, "ConnectedTime", i);
e->Connected = PackGetBoolEx(p, "Connected", i);
e->LastError = PackGetIntEx(p, "LastError", i);
PackGetStrEx(p, "LinkHubName", e->HubName, sizeof(e->HubName), i);
}
}
void OutRpcEnumLink(PACK *p, RPC_ENUM_LINK *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackSetCurrentJsonGroupName(p, "LinkList");
for (i = 0;i < t->NumLink;i++)
{
RPC_ENUM_LINK_ITEM *e = &t->Links[i];
PackAddUniStrEx(p, "AccountName", e->AccountName, i, t->NumLink);
PackAddStrEx(p, "ConnectedHubName", e->HubName, i, t->NumLink);
PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumLink);
PackAddBoolEx(p, "Online", e->Online, i, t->NumLink);
PackAddTime64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumLink);
PackAddBoolEx(p, "Connected", e->Connected, i, t->NumLink);
PackAddIntEx(p, "LastError", e->LastError, i, t->NumLink);
PackAddStrEx(p, "TargetHubName", e->HubName, i, t->NumLink);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumLink(RPC_ENUM_LINK *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Links);
}
// RPC_LINK_STATUS
void InRpcLinkStatus(RPC_LINK_STATUS *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_LINK_STATUS));
PackGetStr(p, "HubName_Ex", t->HubName, sizeof(t->HubName));
PackGetUniStr(p, "AccountName", t->AccountName, sizeof(t->AccountName));
InRpcClientGetConnectionStatus(&t->Status, p);
}
void OutRpcLinkStatus(PACK *p, RPC_LINK_STATUS *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName_Ex", t->HubName);
PackAddUniStr(p, "AccountName", t->AccountName);
OutRpcClientGetConnectionStatus(p, &t->Status);
}
void FreeRpcLinkStatus(RPC_LINK_STATUS *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
CiFreeClientGetConnectionStatus(&t->Status);
}
// RPC_LINK
void InRpcLink(RPC_LINK *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_LINK));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
PackGetUniStr(p, "AccountName", t->AccountName, sizeof(t->AccountName));
}
void OutRpcLink(PACK *p, RPC_LINK *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddUniStr(p, "AccountName", t->AccountName);
}
// RPC_RENAME_LINK
void InRpcRenameLink(RPC_RENAME_LINK *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_RENAME_LINK));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
PackGetUniStr(p, "OldAccountName", t->OldAccountName, sizeof(t->OldAccountName));
PackGetUniStr(p, "NewAccountName", t->NewAccountName, sizeof(t->NewAccountName));
}
void OutRpcRenameLink(PACK *p, RPC_RENAME_LINK *t)
{
// Validate arguments
if (p == NULL || t == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddUniStr(p, "OldAccountName", t->OldAccountName);
PackAddUniStr(p, "NewAccountName", t->NewAccountName);
}
// ACCESS
void InRpcAccessEx(ACCESS *a, PACK *p, UINT index)
{
// Validate arguments
if (a == NULL || p == NULL)
{
return;
}
Zero(a, sizeof(ACCESS));
a->Id = PackGetIntEx(p, "Id", index);
PackGetUniStrEx(p, "Note", a->Note, sizeof(a->Note), index);
a->Active = PackGetBoolEx(p, "Active", index);
a->Priority = PackGetIntEx(p, "Priority", index);
a->Discard = PackGetBoolEx(p, "Discard", index);
a->SrcIpAddress = PackGetIp32Ex(p, "SrcIpAddress", index);
a->SrcSubnetMask = PackGetIp32Ex(p, "SrcSubnetMask", index);
a->DestIpAddress = PackGetIp32Ex(p, "DestIpAddress", index);
a->DestSubnetMask = PackGetIp32Ex(p, "DestSubnetMask", index);
a->Protocol = PackGetIntEx(p, "Protocol", index);
a->SrcPortStart = PackGetIntEx(p, "SrcPortStart", index);
a->SrcPortEnd = PackGetIntEx(p, "SrcPortEnd", index);
a->DestPortStart = PackGetIntEx(p, "DestPortStart", index);
a->DestPortEnd = PackGetIntEx(p, "DestPortEnd", index);
//a->SrcUsernameHash = PackGetIntEx(p, "SrcUsernameHash", index);
PackGetStrEx(p, "SrcUsername", a->SrcUsername, sizeof(a->SrcUsername), index);
//a->DestUsernameHash = PackGetIntEx(p, "DestUsernameHash", index);
PackGetStrEx(p, "DestUsername", a->DestUsername, sizeof(a->DestUsername), index);
a->CheckSrcMac = PackGetBoolEx(p, "CheckSrcMac", index);
PackGetDataEx2(p, "SrcMacAddress", a->SrcMacAddress, sizeof(a->SrcMacAddress), index);
PackGetDataEx2(p, "SrcMacMask", a->SrcMacMask, sizeof(a->SrcMacMask), index);
a->CheckDstMac = PackGetBoolEx(p, "CheckDstMac", index);
PackGetDataEx2(p, "DstMacAddress", a->DstMacAddress, sizeof(a->DstMacAddress), index);
PackGetDataEx2(p, "DstMacMask", a->DstMacMask, sizeof(a->DstMacMask), index);
a->CheckTcpState = PackGetBoolEx(p, "CheckTcpState", index);
a->Established = PackGetBoolEx(p, "Established", index);
a->Delay = PackGetIntEx(p, "Delay", index);
a->Jitter = PackGetIntEx(p, "Jitter", index);
a->Loss = PackGetIntEx(p, "Loss", index);
a->IsIPv6 = PackGetBoolEx(p, "IsIPv6", index);
a->UniqueId = PackGetIntEx(p, "UniqueId", index);
PackGetStrEx(p, "RedirectUrl", a->RedirectUrl, sizeof(a->RedirectUrl), index);
if (a->IsIPv6)
{
PackGetIp6AddrEx(p, "SrcIpAddress6", &a->SrcIpAddress6, index);
PackGetIp6AddrEx(p, "SrcSubnetMask6", &a->SrcSubnetMask6, index);
PackGetIp6AddrEx(p, "DestIpAddress6", &a->DestIpAddress6, index);
PackGetIp6AddrEx(p, "DestSubnetMask6", &a->DestSubnetMask6, index);
}
}
void InRpcAccess(ACCESS *a, PACK *p)
{
// Validate arguments
if (a == NULL || p == NULL)
{
return;
}
InRpcAccessEx(a, p, 0);
}
void OutRpcAccessEx(PACK *p, ACCESS *a, UINT index, UINT total)
{
// Validate arguments
if (a == NULL || p == NULL)
{
return;
}
PackAddIntEx(p, "Id", a->Id, index, total);
PackAddUniStrEx(p, "Note", a->Note, index, total);
PackAddBoolEx(p, "Active", a->Active, index, total);
PackAddIntEx(p, "Priority", a->Priority, index, total);
PackAddBoolEx(p, "Discard", a->Discard, index, total);
if (a->IsIPv6)
{
PackAddIp32Ex(p, "SrcIpAddress", 0xFDFFFFDF, index, total);
PackAddIp32Ex(p, "SrcSubnetMask", 0xFFFFFFFF, index, total);
PackAddIp32Ex(p, "DestIpAddress", 0xFDFFFFDF, index, total);
PackAddIp32Ex(p, "DestSubnetMask", 0xFFFFFFFF, index, total);
}
else
{
PackAddIp32Ex(p, "SrcIpAddress", a->SrcIpAddress, index, total);
PackAddIp32Ex(p, "SrcSubnetMask", a->SrcSubnetMask, index, total);
PackAddIp32Ex(p, "DestIpAddress", a->DestIpAddress, index, total);
PackAddIp32Ex(p, "DestSubnetMask", a->DestSubnetMask, index, total);
}
PackAddIntEx(p, "Protocol", a->Protocol, index, total);
PackAddIntEx(p, "SrcPortStart", a->SrcPortStart, index, total);
PackAddIntEx(p, "SrcPortEnd", a->SrcPortEnd, index, total);
PackAddIntEx(p, "DestPortStart", a->DestPortStart, index, total);
PackAddIntEx(p, "DestPortEnd", a->DestPortEnd, index, total);
//PackAddIntEx(p, "SrcUsernameHash", a->SrcUsernameHash, index, total);
PackAddStrEx(p, "SrcUsername", a->SrcUsername, index, total);
//PackAddIntEx(p, "DestUsernameHash", a->DestUsernameHash, index, total);
PackAddStrEx(p, "DestUsername", a->DestUsername, index, total);
PackAddBoolEx(p, "CheckSrcMac", a->CheckSrcMac, index, total);
PackAddDataEx(p, "SrcMacAddress", a->SrcMacAddress, sizeof(a->SrcMacAddress), index, total);
PackAddDataEx(p, "SrcMacMask", a->SrcMacMask, sizeof(a->SrcMacMask), index, total);
PackAddBoolEx(p, "CheckDstMac", a->CheckDstMac, index, total);
PackAddDataEx(p, "DstMacAddress", a->DstMacAddress, sizeof(a->DstMacAddress), index, total);
PackAddDataEx(p, "DstMacMask", a->DstMacMask, sizeof(a->DstMacMask), index, total);
PackAddBoolEx(p, "CheckTcpState", a->CheckTcpState, index, total);
PackAddBoolEx(p, "Established", a->Established, index, total);
PackAddIntEx(p, "Delay", a->Delay, index, total);
PackAddIntEx(p, "Jitter", a->Jitter, index, total);
PackAddIntEx(p, "Loss", a->Loss, index, total);
PackAddBoolEx(p, "IsIPv6", a->IsIPv6, index, total);
PackAddIntEx(p, "UniqueId", a->UniqueId, index, total);
PackAddStrEx(p, "RedirectUrl", a->RedirectUrl, index, total);
if (a->IsIPv6)
{
PackAddIp6AddrEx(p, "SrcIpAddress6", &a->SrcIpAddress6, index, total);
PackAddIp6AddrEx(p, "SrcSubnetMask6", &a->SrcSubnetMask6, index, total);
PackAddIp6AddrEx(p, "DestIpAddress6", &a->DestIpAddress6, index, total);
PackAddIp6AddrEx(p, "DestSubnetMask6", &a->DestSubnetMask6, index, total);
}
else
{
IPV6_ADDR zero;
Zero(&zero, sizeof(zero));
PackAddIp6AddrEx(p, "SrcIpAddress6", &zero, index, total);
PackAddIp6AddrEx(p, "SrcSubnetMask6", &zero, index, total);
PackAddIp6AddrEx(p, "DestIpAddress6", &zero, index, total);
PackAddIp6AddrEx(p, "DestSubnetMask6", &zero, index, total);
}
}
void OutRpcAccess(PACK *p, ACCESS *a)
{
// Validate arguments
if (a == NULL || p == NULL)
{
return;
}
OutRpcAccessEx(p, a, 0, 1);
}
// RPC_ENUM_ACCESS_LIST
void InRpcEnumAccessList(RPC_ENUM_ACCESS_LIST *a, PACK *p)
{
UINT i;
// Validate arguments
if (a == NULL || p == NULL)
{
return;
}
Zero(a, sizeof(RPC_ENUM_ACCESS_LIST));
PackGetStr(p, "HubName", a->HubName, sizeof(a->HubName));
a->NumAccess = PackGetIndexCount(p, "Protocol");
a->Accesses = ZeroMalloc(sizeof(ACCESS) * a->NumAccess);
for (i = 0;i < a->NumAccess;i++)
{
ACCESS *e = &a->Accesses[i];
InRpcAccessEx(e, p, i);
}
}
void OutRpcEnumAccessList(PACK *p, RPC_ENUM_ACCESS_LIST *a)
{
UINT i;
// Validate arguments
if (a == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", a->HubName);
PackSetCurrentJsonGroupName(p, "AccessList");
for (i = 0;i < a->NumAccess;i++)
{
ACCESS *e = &a->Accesses[i];
OutRpcAccessEx(p, e, i, a->NumAccess);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumAccessList(RPC_ENUM_ACCESS_LIST *a)
{
// Validate arguments
if (a == NULL)
{
return;
}
Free(a->Accesses);
}
// AUTHDATA
void *InRpcAuthData(PACK *p, UINT *authtype, char *username)
{
wchar_t tmp[MAX_SIZE];
AUTHPASSWORD *pw;
AUTHUSERCERT *usercert;
AUTHROOTCERT *rootcert;
AUTHRADIUS *radius;
AUTHNT *nt;
BUF *b;
char plain_pw[MAX_SIZE];
// Validate arguments
if (p == NULL)
{
return NULL;
}
if (authtype == NULL)
{
return NULL;
}
*authtype = PackGetInt(p, "AuthType");
switch (*authtype)
{
case AUTHTYPE_PASSWORD:
pw = ZeroMalloc(sizeof(AUTHPASSWORD));
PackGetData2(p, "HashedKey", pw->HashedKey, sizeof(pw->HashedKey));
PackGetData2(p, "NtLmSecureHash", pw->NtLmSecureHash, sizeof(pw->NtLmSecureHash));
if (PackGetStr(p, "Auth_Password", plain_pw, sizeof(plain_pw)))
{
if (IsZero(pw->HashedKey, sizeof(pw->HashedKey)))
{
HashPassword(pw->HashedKey, username, plain_pw);
GenerateNtPasswordHash(pw->NtLmSecureHash, plain_pw);
}
}
return pw;
case AUTHTYPE_USERCERT:
usercert = ZeroMalloc(sizeof(AUTHUSERCERT));
usercert->UserX = PackGetX(p, "UserX");
return usercert;
case AUTHTYPE_ROOTCERT:
rootcert = ZeroMalloc(sizeof(AUTHROOTCERT));
b = PackGetBuf(p, "Serial");
if (b != NULL)
{
rootcert->Serial = NewXSerial(b->Buf, b->Size);
FreeBuf(b);
}
if (PackGetUniStr(p, "CommonName", tmp, sizeof(tmp)))
{
rootcert->CommonName = CopyUniStr(tmp);
}
return rootcert;
case AUTHTYPE_RADIUS:
radius = ZeroMalloc(sizeof(AUTHRADIUS));
if (PackGetUniStr(p, "RadiusUsername", tmp, sizeof(tmp)))
{
radius->RadiusUsername = CopyUniStr(tmp);
}
else
{
radius->RadiusUsername = CopyUniStr(L"");
}
return radius;
case AUTHTYPE_NT:
nt = ZeroMalloc(sizeof(AUTHNT));
if (PackGetUniStr(p, "NtUsername", tmp, sizeof(tmp)))
{
nt->NtUsername = CopyUniStr(tmp);
}
else
{
nt->NtUsername = CopyUniStr(L"");
}
return nt;
}
return NULL;
}
void OutRpcAuthData(PACK *p, void *authdata, UINT authtype)
{
AUTHPASSWORD *pw = authdata;
AUTHUSERCERT *usercert = authdata;
AUTHROOTCERT *rootcert = authdata;
AUTHRADIUS *radius = authdata;
AUTHNT *nt = authdata;
// Validate arguments
if (p == NULL)
{
return;
}
PackAddInt(p, "AuthType", authtype);
switch (authtype)
{
case AUTHTYPE_PASSWORD:
PackAddData(p, "HashedKey", pw->HashedKey, sizeof(pw->HashedKey));
PackAddData(p, "NtLmSecureHash", pw->NtLmSecureHash, sizeof(pw->NtLmSecureHash));
break;
case AUTHTYPE_USERCERT:
PackAddX(p, "UserX", usercert->UserX);
break;
case AUTHTYPE_ROOTCERT:
if (rootcert->Serial != NULL)
{
PackAddData(p, "Serial", rootcert->Serial->data, rootcert->Serial->size);
}
if (rootcert->CommonName != NULL)
{
PackAddUniStr(p, "CommonName", rootcert->CommonName);
}
break;
case AUTHTYPE_RADIUS:
PackAddUniStr(p, "RadiusUsername", radius->RadiusUsername);
break;
case AUTHTYPE_NT:
PackAddUniStr(p, "NtUsername", nt->NtUsername);
break;
}
}
void FreeRpcAuthData(void *authdata, UINT authtype)
{
FreeAuthData(authtype, authdata);
}
// RPC_SET_USER
void InRpcSetUser(RPC_SET_USER *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_SET_USER));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
PackGetStr(p, "Name", t->Name, sizeof(t->Name));
PackGetStr(p, "GroupName", t->GroupName, sizeof(t->GroupName));
PackGetUniStr(p, "Realname", t->Realname, sizeof(t->Realname));
PackGetUniStr(p, "Note", t->Note, sizeof(t->Note));
t->CreatedTime = PackGetInt64(p, "CreatedTime");
t->UpdatedTime = PackGetInt64(p, "UpdatedTime");
t->ExpireTime = PackGetInt64(p, "ExpireTime");
t->AuthData = InRpcAuthData(p, &t->AuthType, t->Name);
t->NumLogin = PackGetInt(p, "NumLogin");
InRpcTraffic(&t->Traffic, p);
if (PackGetBool(p, "UsePolicy"))
{
t->Policy = ZeroMalloc(sizeof(POLICY));
InRpcPolicy(t->Policy, p);
}
}
void OutRpcSetUser(PACK *p, RPC_SET_USER *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddStr(p, "Name", t->Name);
PackAddStr(p, "GroupName", t->GroupName);
PackAddUniStr(p, "Realname", t->Realname);
PackAddUniStr(p, "Note", t->Note);
PackAddTime64(p, "CreatedTime", t->CreatedTime);
PackAddTime64(p, "UpdatedTime", t->UpdatedTime);
PackAddTime64(p, "ExpireTime", t->ExpireTime);
OutRpcAuthData(p, t->AuthData, t->AuthType);
PackAddInt(p, "NumLogin", t->NumLogin);
OutRpcTraffic(p, &t->Traffic);
if (t->Policy != NULL)
{
PackAddBool(p, "UsePolicy", true);
OutRpcPolicy(p, t->Policy);
}
}
void FreeRpcSetUser(RPC_SET_USER *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
FreeRpcAuthData(t->AuthData, t->AuthType);
if (t->Policy)
{
Free(t->Policy);
}
}
// RPC_ENUM_USER
void InRpcEnumUser(RPC_ENUM_USER *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_USER));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->NumUser = PackGetIndexCount(p, "Name");
t->Users = ZeroMalloc(sizeof(RPC_ENUM_USER_ITEM) * t->NumUser);
for (i = 0;i < t->NumUser;i++)
{
RPC_ENUM_USER_ITEM *e = &t->Users[i];
PackGetStrEx(p, "Name", e->Name, sizeof(e->Name), i);
PackGetStrEx(p, "GroupName", e->GroupName, sizeof(e->GroupName), i);
PackGetUniStrEx(p, "Realname", e->Realname, sizeof(e->Realname), i);
PackGetUniStrEx(p, "Note", e->Note, sizeof(e->Note), i);
e->AuthType = PackGetIntEx(p, "AuthType", i);
e->LastLoginTime = PackGetInt64Ex(p, "LastLoginTime", i);
e->NumLogin = PackGetIntEx(p, "NumLogin", i);
e->DenyAccess = PackGetBoolEx(p, "DenyAccess", i);
e->IsTrafficFilled = PackGetBoolEx(p, "IsTrafficFilled", i);
InRpcTrafficEx(&e->Traffic, p, i);
e->IsExpiresFilled = PackGetBoolEx(p, "IsExpiresFilled", i);
e->Expires = PackGetInt64Ex(p, "Expires", i);
}
}
void OutRpcEnumUser(PACK *p, RPC_ENUM_USER *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackSetCurrentJsonGroupName(p, "UserList");
for (i = 0;i < t->NumUser;i++)
{
RPC_ENUM_USER_ITEM *e = &t->Users[i];
PackAddStrEx(p, "Name", e->Name, i, t->NumUser);
PackAddStrEx(p, "GroupName", e->GroupName, i, t->NumUser);
PackAddUniStrEx(p, "Realname", e->Realname, i, t->NumUser);
PackAddUniStrEx(p, "Note", e->Note, i, t->NumUser);
PackAddIntEx(p, "AuthType", e->AuthType, i, t->NumUser);
PackAddTime64Ex(p, "LastLoginTime", e->LastLoginTime, i, t->NumUser);
PackAddIntEx(p, "NumLogin", e->NumLogin, i, t->NumUser);
PackAddBoolEx(p, "DenyAccess", e->DenyAccess, i, t->NumUser);
PackAddBoolEx(p, "IsTrafficFilled", e->IsTrafficFilled, i, t->NumUser);
OutRpcTrafficEx(&e->Traffic, p, i, t->NumUser);
PackAddBoolEx(p, "IsExpiresFilled", e->IsExpiresFilled, i, t->NumUser);
PackAddTime64Ex(p, "Expires", e->Expires, i, t->NumUser);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumUser(RPC_ENUM_USER *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Users);
}
// RPC_SET_GROUP
void InRpcSetGroup(RPC_SET_GROUP *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_SET_GROUP));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
PackGetStr(p, "Name", t->Name, sizeof(t->Name));
PackGetUniStr(p, "Realname", t->Realname, sizeof(t->Realname));
PackGetUniStr(p, "Note", t->Note, sizeof(t->Note));
InRpcTraffic(&t->Traffic, p);
if (PackGetBool(p, "UsePolicy"))
{
t->Policy = ZeroMalloc(sizeof(POLICY));
InRpcPolicy(t->Policy, p);
}
}
void OutRpcSetGroup(PACK *p, RPC_SET_GROUP *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddStr(p, "Name", t->Name);
PackAddUniStr(p, "Realname", t->Realname);
PackAddUniStr(p, "Note", t->Note);
OutRpcTraffic(p, &t->Traffic);
if (t->Policy != NULL)
{
PackAddBool(p, "UsePolicy", true);
OutRpcPolicy(p, t->Policy);
}
}
void FreeRpcSetGroup(RPC_SET_GROUP *t)
{
Free(t->Policy);
}
// RPC_ENUM_GROUP
void InRpcEnumGroup(RPC_ENUM_GROUP *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_GROUP));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->NumGroup = PackGetIndexCount(p, "Name");
t->Groups = ZeroMalloc(sizeof(RPC_ENUM_GROUP_ITEM) * t->NumGroup);
for (i = 0;i < t->NumGroup;i++)
{
RPC_ENUM_GROUP_ITEM *e = &t->Groups[i];
PackGetStrEx(p, "Name", e->Name, sizeof(e->Name), i);
PackGetUniStrEx(p, "Realname", e->Realname, sizeof(e->Realname), i);
PackGetUniStrEx(p, "Note", e->Note, sizeof(e->Note), i);
e->NumUsers = PackGetIntEx(p, "NumUsers", i);
e->DenyAccess = PackGetBoolEx(p, "DenyAccess", i);
}
}
void OutRpcEnumGroup(PACK *p, RPC_ENUM_GROUP *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackSetCurrentJsonGroupName(p, "GroupList");
for (i = 0;i < t->NumGroup;i++)
{
RPC_ENUM_GROUP_ITEM *e = &t->Groups[i];
PackAddStrEx(p, "Name", e->Name, i, t->NumGroup);
PackAddUniStrEx(p, "Realname", e->Realname, i, t->NumGroup);
PackAddUniStrEx(p, "Note", e->Note, i, t->NumGroup);
PackAddIntEx(p, "NumUsers", e->NumUsers, i, t->NumGroup);
PackAddBoolEx(p, "DenyAccess", e->DenyAccess, i, t->NumGroup);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumGroup(RPC_ENUM_GROUP *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Groups);
}
// RPC_DELETE_USER
void InRpcDeleteUser(RPC_DELETE_USER *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_DELETE_USER));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
PackGetStr(p, "Name", t->Name, sizeof(t->Name));
}
void OutRpcDeleteUser(PACK *p, RPC_DELETE_USER *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddStr(p, "Name", t->Name);
}
// RPC_ENUM_SESSION
void InRpcEnumSession(RPC_ENUM_SESSION *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_SESSION));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->NumSession = PackGetIndexCount(p, "Name");
t->Sessions = ZeroMalloc(sizeof(RPC_ENUM_SESSION_ITEM) * t->NumSession);
for (i = 0;i < t->NumSession;i++)
{
RPC_ENUM_SESSION_ITEM *e = &t->Sessions[i];
PackGetStrEx(p, "Name", e->Name, sizeof(e->Name), i);
PackGetStrEx(p, "Username", e->Username, sizeof(e->Username), i);
e->Ip = PackGetIntEx(p, "Ip", i);
PackGetIpEx(p, "ClientIP", &e->ClientIP, i);
PackGetStrEx(p, "Hostname", e->Hostname, sizeof(e->Hostname), i);
e->MaxNumTcp = PackGetIntEx(p, "MaxNumTcp", i);
e->CurrentNumTcp = PackGetIntEx(p, "CurrentNumTcp", i);
e->PacketSize = PackGetInt64Ex(p, "PacketSize", i);
e->PacketNum = PackGetInt64Ex(p, "PacketNum", i);
e->RemoteSession = PackGetBoolEx(p, "RemoteSession", i);
e->LinkMode = PackGetBoolEx(p, "LinkMode", i);
e->SecureNATMode = PackGetBoolEx(p, "SecureNATMode", i);
e->BridgeMode = PackGetBoolEx(p, "BridgeMode", i);
e->Layer3Mode = PackGetBoolEx(p, "Layer3Mode", i);
e->Client_BridgeMode = PackGetBoolEx(p, "Client_BridgeMode", i);
e->Client_MonitorMode = PackGetBoolEx(p, "Client_MonitorMode", i);
PackGetStrEx(p, "RemoteHostname", e->RemoteHostname, sizeof(e->RemoteHostname), i);
e->VLanId = PackGetIntEx(p, "VLanId", i);
PackGetDataEx2(p, "UniqueId", e->UniqueId, sizeof(e->UniqueId), i);
e->IsDormantEnabled = PackGetBoolEx(p, "IsDormantEnabled", i);
e->IsDormant = PackGetBoolEx(p, "IsDormant", i);
e->LastCommDormant = PackGetInt64Ex(p, "LastCommDormant", i);
e->CreatedTime = PackGetInt64Ex(p, "CreatedTime", i);
e->LastCommTime = PackGetInt64Ex(p, "LastCommTime", i);
}
}
void OutRpcEnumSession(PACK *p, RPC_ENUM_SESSION *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackSetCurrentJsonGroupName(p, "SessionList");
for (i = 0;i < t->NumSession;i++)
{
RPC_ENUM_SESSION_ITEM *e = &t->Sessions[i];
PackAddStrEx(p, "Name", e->Name, i, t->NumSession);
PackAddStrEx(p, "Username", e->Username, i, t->NumSession);
PackAddIp32Ex(p, "Ip", e->Ip, i, t->NumSession);
PackAddIpEx(p, "ClientIP", &e->ClientIP, i, t->NumSession);
PackAddStrEx(p, "Hostname", e->Hostname, i, t->NumSession);
PackAddIntEx(p, "MaxNumTcp", e->MaxNumTcp, i, t->NumSession);
PackAddIntEx(p, "CurrentNumTcp", e->CurrentNumTcp, i, t->NumSession);
PackAddInt64Ex(p, "PacketSize", e->PacketSize, i, t->NumSession);
PackAddInt64Ex(p, "PacketNum", e->PacketNum, i, t->NumSession);
PackAddBoolEx(p, "RemoteSession", e->RemoteSession, i, t->NumSession);
PackAddStrEx(p, "RemoteHostname", e->RemoteHostname, i, t->NumSession);
PackAddBoolEx(p, "LinkMode", e->LinkMode, i, t->NumSession);
PackAddBoolEx(p, "SecureNATMode", e->SecureNATMode, i, t->NumSession);
PackAddBoolEx(p, "BridgeMode", e->BridgeMode, i, t->NumSession);
PackAddBoolEx(p, "Layer3Mode", e->Layer3Mode, i, t->NumSession);
PackAddBoolEx(p, "Client_BridgeMode", e->Client_BridgeMode, i, t->NumSession);
PackAddBoolEx(p, "Client_MonitorMode", e->Client_MonitorMode, i, t->NumSession);
PackAddIntEx(p, "VLanId", e->VLanId, i, t->NumSession);
PackAddDataEx(p, "UniqueId", e->UniqueId, sizeof(e->UniqueId), i, t->NumSession);
PackAddBoolEx(p, "IsDormantEnabled", e->IsDormantEnabled, i, t->NumSession);
PackAddBoolEx(p, "IsDormant", e->IsDormant, i, t->NumSession);
PackAddTime64Ex(p, "LastCommDormant", e->LastCommDormant, i, t->NumSession);
PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumSession);
PackAddTime64Ex(p, "LastCommTime", e->LastCommTime, i, t->NumSession);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumSession(RPC_ENUM_SESSION *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Sessions);
}
// RPC_KEY_PAIR
void InRpcKeyPair(RPC_KEY_PAIR *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
t->Cert = PackGetX(p, "Cert");
t->Key = PackGetK(p, "Key");
t->Flag1 = PackGetInt(p, "Flag1");
}
void OutRpcKeyPair(PACK *p, RPC_KEY_PAIR *t)
{
// Validate arguments
if (p == NULL || t == NULL)
{
return;
}
PackAddX(p, "Cert", t->Cert);
PackAddK(p, "Key", t->Key);
PackAddInt(p, "Flag1", t->Flag1);
}
void FreeRpcKeyPair(RPC_KEY_PAIR *t)
{
FreeX(t->Cert);
FreeK(t->Key);
}
// RPC_WGK
void InRpcWgk(RPC_WGK *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_WGK));
t->Num = PackGetIndexCount(p, "Key");
if (t->Num == 0)
{
return;
}
t->Wgks = ZeroMalloc(sizeof(WGK) * t->Num);
for (i = 0; i < t->Num; ++i)
{
WGK *wgk = &t->Wgks[i];
PackGetStrEx(p, "Key", wgk->Key, sizeof(wgk->Key), i);
PackGetStrEx(p, "Hub", wgk->Hub, sizeof(wgk->Hub), i);
PackGetStrEx(p, "User", wgk->User, sizeof(wgk->User), i);
}
}
void OutRpcWgk(PACK *p, RPC_WGK *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
for (i = 0; i < t->Num; ++i)
{
WGK *wgk = &t->Wgks[i];
PackAddStrEx(p, "Key", wgk->Key, i, t->Num);
PackAddStrEx(p, "Hub", wgk->Hub, i, t->Num);
PackAddStrEx(p, "User", wgk->User, i, t->Num);
}
}
void FreeRpcWgk(RPC_WGK *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->Wgks);
}
// NODE_INFO
void InRpcNodeInfo(NODE_INFO *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(NODE_INFO));
PackGetStr(p, "ClientProductName", t->ClientProductName, sizeof(t->ClientProductName));
PackGetStr(p, "ServerProductName", t->ServerProductName, sizeof(t->ServerProductName));
PackGetStr(p, "ClientOsName", t->ClientOsName, sizeof(t->ClientOsName));
PackGetStr(p, "ClientOsVer", t->ClientOsVer, sizeof(t->ClientOsVer));
PackGetStr(p, "ClientOsProductId", t->ClientOsProductId, sizeof(t->ClientOsProductId));
PackGetStr(p, "ClientHostname", t->ClientHostname, sizeof(t->ClientHostname));
PackGetStr(p, "ServerHostname", t->ServerHostname, sizeof(t->ServerHostname));
PackGetStr(p, "ProxyHostname", t->ProxyHostname, sizeof(t->ProxyHostname));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
PackGetData2(p, "UniqueId", t->UniqueId, sizeof(t->UniqueId));
t->ClientProductVer = PackGetInt(p, "ClientProductVer");
t->ClientProductBuild = PackGetInt(p, "ClientProductBuild");
t->ServerProductVer = PackGetInt(p, "ServerProductVer");
t->ServerProductBuild = PackGetInt(p, "ServerProductBuild");
t->ClientIpAddress = PackGetIp32(p, "ClientIpAddress");
PackGetData2(p, "ClientIpAddress6", t->ClientIpAddress6, sizeof(t->ClientIpAddress6));
t->ClientPort = PackGetInt(p, "ClientPort");
t->ServerIpAddress = PackGetIp32(p, "ServerIpAddress");
PackGetData2(p, "ServerIpAddress6", t->ServerIpAddress6, sizeof(t->ServerIpAddress6));
t->ServerPort = PackGetInt(p, "ServerPort2");
t->ProxyIpAddress = PackGetIp32(p, "ProxyIpAddress");
PackGetData2(p, "ProxyIpAddress6", t->ProxyIpAddress6, sizeof(t->ProxyIpAddress6));
t->ProxyPort = PackGetInt(p, "ProxyPort");
}
void OutRpcNodeInfo(PACK *p, NODE_INFO *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "ClientProductName", t->ClientProductName);
PackAddStr(p, "ServerProductName", t->ServerProductName);
PackAddStr(p, "ClientOsName", t->ClientOsName);
PackAddStr(p, "ClientOsVer", t->ClientOsVer);
PackAddStr(p, "ClientOsProductId", t->ClientOsProductId);
PackAddStr(p, "ClientHostname", t->ClientHostname);
PackAddStr(p, "ServerHostname", t->ServerHostname);
PackAddStr(p, "ProxyHostname", t->ProxyHostname);
PackAddStr(p, "HubName", t->HubName);
PackAddData(p, "UniqueId", t->UniqueId, sizeof(t->UniqueId));
PackAddInt(p, "ClientProductVer", t->ClientProductVer);
PackAddInt(p, "ClientProductBuild", t->ClientProductBuild);
PackAddInt(p, "ServerProductVer", t->ServerProductVer);
PackAddInt(p, "ServerProductBuild", t->ServerProductBuild);
PackAddIp32(p, "ClientIpAddress", t->ClientIpAddress);
PackAddData(p, "ClientIpAddress6", t->ClientIpAddress6, sizeof(t->ClientIpAddress6));
PackAddInt(p, "ClientPort", t->ClientPort);
PackAddIp32(p, "ServerIpAddress", t->ServerIpAddress);
PackAddData(p, "ServerIpAddress6", t->ServerIpAddress6, sizeof(t->ServerIpAddress6));
PackAddInt(p, "ServerPort2", t->ServerPort);
PackAddIp32(p, "ProxyIpAddress", t->ProxyIpAddress);
PackAddData(p, "ProxyIpAddress6", t->ProxyIpAddress6, sizeof(t->ProxyIpAddress6));
PackAddInt(p, "ProxyPort", t->ProxyPort);
}
// RPC_SESSION_STATUS
void InRpcSessionStatus(RPC_SESSION_STATUS *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_SESSION_STATUS));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
PackGetStr(p, "Name", t->Name, sizeof(t->Name));
PackGetStr(p, "Username", t->Username, sizeof(t->Username));
PackGetStr(p, "GroupName", t->GroupName, sizeof(t->GroupName));
PackGetStr(p, "RealUsername", t->RealUsername, sizeof(t->RealUsername));
t->ClientIp = PackGetIp32(p, "SessionStatus_ClientIp");
PackGetData2(p, "SessionStatus_ClientIp6", t->ClientIp6, sizeof(t->ClientIp6));
PackGetStr(p, "SessionStatus_ClientHostName", t->ClientHostName, sizeof(t->ClientHostName));
PackGetIp(p, "Client_Ip_Address", &t->ClientIpAddress);
InRpcClientGetConnectionStatus(&t->Status, p);
InRpcNodeInfo(&t->NodeInfo, p);
}
void OutRpcSessionStatus(PACK *p, RPC_SESSION_STATUS *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddStr(p, "Name", t->Name);
PackAddStr(p, "Username", t->Username);
PackAddStr(p, "GroupName", t->GroupName);
PackAddStr(p, "RealUsername", t->RealUsername);
PackAddIp32(p, "SessionStatus_ClientIp", t->ClientIp);
PackAddData(p, "SessionStatus_ClientIp6", t->ClientIp6, sizeof(t->ClientIp6));
PackAddStr(p, "SessionStatus_ClientHostName", t->ClientHostName);
PackAddIp(p, "Client_Ip_Address", &t->ClientIpAddress);
OutRpcClientGetConnectionStatus(p, &t->Status);
OutRpcNodeInfo(p, &t->NodeInfo);
}
void FreeRpcSessionStatus(RPC_SESSION_STATUS *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
CiFreeClientGetConnectionStatus(&t->Status);
}
// RPC_DELETE_SESSION
void InRpcDeleteSession(RPC_DELETE_SESSION *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_DELETE_SESSION));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
PackGetStr(p, "Name", t->Name, sizeof(t->Name));
}
void OutRpcDeleteSession(PACK *p, RPC_DELETE_SESSION *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddStr(p, "Name", t->Name);
}
// RPC_ENUM_MAC_TABLE
void InRpcEnumMacTable(RPC_ENUM_MAC_TABLE *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_MAC_TABLE));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->NumMacTable = PackGetIndexCount(p, "SessionName");
t->MacTables = ZeroMalloc(sizeof(RPC_ENUM_MAC_TABLE_ITEM) * t->NumMacTable);
for (i = 0;i < t->NumMacTable;i++)
{
RPC_ENUM_MAC_TABLE_ITEM *e = &t->MacTables[i];
e->Key = PackGetIntEx(p, "Key", i);
PackGetStrEx(p, "SessionName", e->SessionName, sizeof(e->SessionName), i);
PackGetDataEx2(p, "MacAddress", e->MacAddress, sizeof(e->MacAddress), i);
e->VlanId = PackGetIntEx(p, "VlanId", i);
e->CreatedTime = PackGetInt64Ex(p, "CreatedTime", i);
e->UpdatedTime = PackGetInt64Ex(p, "UpdatedTime", i);
e->RemoteItem = PackGetBoolEx(p, "RemoteItem", i);
PackGetStrEx(p, "RemoteHostname", e->RemoteHostname, sizeof(e->RemoteHostname), i);
}
}
void OutRpcEnumMacTable(PACK *p, RPC_ENUM_MAC_TABLE *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackSetCurrentJsonGroupName(p, "MacTable");
for (i = 0;i < t->NumMacTable;i++)
{
RPC_ENUM_MAC_TABLE_ITEM *e = &t->MacTables[i];
PackAddIntEx(p, "Key", e->Key, i, t->NumMacTable);
PackAddStrEx(p, "SessionName", e->SessionName, i, t->NumMacTable);
PackAddDataEx(p, "MacAddress", e->MacAddress, sizeof(e->MacAddress), i, t->NumMacTable);
PackAddIntEx(p, "VlanId", e->VlanId, i, t->NumMacTable);
PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumMacTable);
PackAddTime64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumMacTable);
PackAddBoolEx(p, "RemoteItem", e->RemoteItem, i, t->NumMacTable);
PackAddStrEx(p, "RemoteHostname", e->RemoteHostname, i, t->NumMacTable);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumMacTable(RPC_ENUM_MAC_TABLE *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->MacTables);
}
// RPC_ENUM_IP_TABLE
void InRpcEnumIpTable(RPC_ENUM_IP_TABLE *t, PACK *p)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_ENUM_IP_TABLE));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->NumIpTable = PackGetIndexCount(p, "SessionName");
t->IpTables = ZeroMalloc(sizeof(RPC_ENUM_IP_TABLE_ITEM) * t->NumIpTable);
for (i = 0;i < t->NumIpTable;i++)
{
RPC_ENUM_IP_TABLE_ITEM *e = &t->IpTables[i];
e->Key = PackGetIntEx(p, "Key", i);
PackGetStrEx(p, "SessionName", e->SessionName, sizeof(e->SessionName), i);
e->Ip = PackGetIp32Ex(p, "Ip", i);
if (PackGetIpEx(p, "IpV6", &e->IpV6, i) == false)
{
UINTToIP(&e->IpV6, e->Ip);
}
PackGetIp(p, "IpAddress", &e->IpAddress);
e->DhcpAllocated = PackGetBoolEx(p, "DhcpAllocated", i);
e->CreatedTime = PackGetInt64Ex(p, "CreatedTime", i);
e->UpdatedTime = PackGetInt64Ex(p, "UpdatedTime", i);
e->RemoteItem = PackGetBoolEx(p, "RemoteItem", i);
PackGetStrEx(p, "RemoteHostname", e->RemoteHostname, sizeof(e->RemoteHostname), i);
}
}
void OutRpcEnumIpTable(PACK *p, RPC_ENUM_IP_TABLE *t)
{
UINT i;
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackSetCurrentJsonGroupName(p, "IpTable");
for (i = 0;i < t->NumIpTable;i++)
{
RPC_ENUM_IP_TABLE_ITEM *e = &t->IpTables[i];
PackAddIntEx(p, "Key", e->Key, i, t->NumIpTable);
PackAddStrEx(p, "SessionName", e->SessionName, i, t->NumIpTable);
PackAddIp32Ex(p, "Ip", e->Ip, i, t->NumIpTable);
PackAddIpEx(p, "IpV6", &e->IpV6, i, t->NumIpTable);
PackAddIpEx(p, "IpAddress", &e->IpAddress, i, t->NumIpTable);
PackAddBoolEx(p, "DhcpAllocated", e->DhcpAllocated, i, t->NumIpTable);
PackAddTime64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumIpTable);
PackAddTime64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumIpTable);
PackAddBoolEx(p, "RemoteItem", e->RemoteItem, i, t->NumIpTable);
PackAddStrEx(p, "RemoteHostname", e->RemoteHostname, i, t->NumIpTable);
}
PackSetCurrentJsonGroupName(p, NULL);
}
void FreeRpcEnumIpTable(RPC_ENUM_IP_TABLE *t)
{
// Validate arguments
if (t == NULL)
{
return;
}
Free(t->IpTables);
}
// RPC_DELETE_TABLE
void InRpcDeleteTable(RPC_DELETE_TABLE *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_DELETE_TABLE));
PackGetStr(p, "HubName", t->HubName, sizeof(t->HubName));
t->Key = PackGetInt(p, "Key");
}
void OutRpcDeleteTable(PACK *p, RPC_DELETE_TABLE *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddStr(p, "HubName", t->HubName);
PackAddInt(p, "Key", t->Key);
}
// Adjoin RPC_ENUM_IP_TABLE
void AdjoinRpcEnumIpTable(RPC_ENUM_IP_TABLE *dest, RPC_ENUM_IP_TABLE *src)
{
UINT old_num;
UINT i, n;
if (dest == NULL || src == NULL)
{
return;
}
if (src->NumIpTable == 0)
{
return;
}
old_num = dest->NumIpTable;
dest->NumIpTable += src->NumIpTable;
dest->IpTables = ReAlloc(dest->IpTables, sizeof(RPC_ENUM_IP_TABLE_ITEM) * dest->NumIpTable);
n = 0;
for (i = old_num;i < dest->NumIpTable;i++)
{
Copy(&dest->IpTables[i], &src->IpTables[n++], sizeof(RPC_ENUM_IP_TABLE_ITEM));
}
}
// Adjoin RPC_ENUM_MAC_TABLE
void AdjoinRpcEnumMacTable(RPC_ENUM_MAC_TABLE *dest, RPC_ENUM_MAC_TABLE *src)
{
UINT old_num;
UINT i, n;
if (dest == NULL || src == NULL)
{
return;
}
if (src->NumMacTable == 0)
{
return;
}
old_num = dest->NumMacTable;
dest->NumMacTable += src->NumMacTable;
dest->MacTables = ReAlloc(dest->MacTables, sizeof(RPC_ENUM_MAC_TABLE_ITEM) * dest->NumMacTable);
n = 0;
for (i = old_num;i < dest->NumMacTable;i++)
{
Copy(&dest->MacTables[i], &src->MacTables[n++], sizeof(RPC_ENUM_MAC_TABLE_ITEM));
}
}
// Adjoin RPC_ENUM_SESSION
void AdjoinRpcEnumSession(RPC_ENUM_SESSION *dest, RPC_ENUM_SESSION *src)
{
UINT old_num;
UINT i, n;
if (dest == NULL || src == NULL)
{
return;
}
if (src->NumSession == 0)
{
return;
}
old_num = dest->NumSession;
dest->NumSession += src->NumSession;
dest->Sessions = ReAlloc(dest->Sessions, sizeof(RPC_ENUM_SESSION_ITEM) * dest->NumSession);
n = 0;
for (i = old_num;i < dest->NumSession;i++)
{
Copy(&dest->Sessions[i], &src->Sessions[n++], sizeof(RPC_ENUM_SESSION_ITEM));
}
}
// RPC_KEEP
void InRpcKeep(RPC_KEEP *t, PACK *p)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
Zero(t, sizeof(RPC_KEEP));
t->UseKeepConnect = PackGetBool(p, "UseKeepConnect");
PackGetStr(p, "KeepConnectHost", t->KeepConnectHost, sizeof(t->KeepConnectHost));
t->KeepConnectPort = PackGetInt(p, "KeepConnectPort");
t->KeepConnectProtocol = PackGetInt(p, "KeepConnectProtocol");
t->KeepConnectInterval = PackGetInt(p, "KeepConnectInterval");
}
void OutRpcKeep(PACK *p, RPC_KEEP *t)
{
// Validate arguments
if (t == NULL || p == NULL)
{
return;
}
PackAddBool(p, "UseKeepConnect", t->UseKeepConnect);
PackAddStr(p, "KeepConnectHost", t->KeepConnectHost);
PackAddInt(p, "KeepConnectPort", t->KeepConnectPort);
PackAddInt(p, "KeepConnectProtocol", t->KeepConnectProtocol);
PackAddInt(p, "KeepConnectInterval", t->KeepConnectInterval);
}
// test RPC function
UINT StTest(ADMIN *a, RPC_TEST *t)
{
Format(t->StrValue, sizeof(t->StrValue), "%u", t->IntValue);
return ERR_NO_ERROR;
}
// RPC_TEST
void InRpcTest(RPC_TEST *t, PACK *p)
{
Zero(t, sizeof(RPC_TEST));
t->IntValue = PackGetInt(p, "IntValue");
t->Int64Value = PackGetInt64(p, "Int64Value");
PackGetStr(p, "StrValue", t->StrValue, sizeof(t->StrValue));
PackGetUniStr(p, "UniStrValue", t->UniStrValue, sizeof(t->UniStrValue));
}
void OutRpcTest(PACK *p, RPC_TEST *t)
{
PackAddInt(p, "IntValue", t->IntValue);
PackAddInt64(p, "Int64Value", t->Int64Value);
PackAddStr(p, "StrValue", t->StrValue);
PackAddUniStr(p, "UniStrValue", t->UniStrValue);
}
void FreeRpcTest(RPC_TEST *t)
{
}
// Admin RPC call
PACK *AdminCall(RPC *rpc, char *function_name, PACK *p)
{
// Validate arguments
if (rpc == NULL || function_name == NULL)
{
return NULL;
}
if (p == NULL)
{
p = NewPack();
}
// Debug("Admin RPC Call: %s\n", function_name);
return RpcCall(rpc, function_name, p);
}
// Check whether the source IP address is permitted to admin connection
bool CheckAdminSourceAddress(SOCK *sock, char *hubname)
{
BUF *b;
char *s;
bool ok = false;
// Validate arguments
if (sock == NULL)
{
return false;
}
b = ReadDump(ADMINIP_TXT);
if (b == NULL)
{
return true;
}
while (true)
{
UINT i;
TOKEN_LIST *t;
IP ip;
IP mask;
IP ip1;
IP ip2;
s = CfgReadNextLine(b);
if (s == NULL)
{
break;
}
Trim(s);
i = SearchStrEx(s, "//", 0, false);
if (i != INFINITE)
{
s[i] = 0;
}
i = SearchStrEx(s, "#", 0, false);
if (i != INFINITE)
{
s[i] = 0;
}
Trim(s);
t = ParseToken(s, " \t");
if (t != NULL)
{
if (t->NumTokens >= 1)
{
if (t->NumTokens == 1 || StrCmpi(hubname, t->Token[1]) == 0)
{
if (ParseIpAndMask46(t->Token[0], &ip, &mask))
{
if (IsIP4(&sock->RemoteIP) && IsIP4(&ip))
{
IPAnd4(&ip1, &sock->RemoteIP, &mask);
IPAnd4(&ip2, &ip, &mask);
if (CmpIpAddr(&ip1, &ip2) == 0)
{
ok = true;
}
}
else if (IsIP6(&sock->RemoteIP) && IsIP6(&ip))
{
IPAnd6(&ip1, &sock->RemoteIP, &mask);
IPAnd6(&ip2, &ip, &mask);
if (CmpIpAddr(&ip1, &ip2) == 0)
{
ok = true;
}
}
}
else if (StrToIP(&ip, t->Token[0]))
{
if (CmpIpAddr(&sock->RemoteIP, &ip) == 0)
{
ok = true;
}
}
if (StrCmpi(t->Token[0], "*") == 0)
{
ok = true;
}
}
}
FreeToken(t);
}
Free(s);
}
FreeBuf(b);
return ok;
}
// Accept admin connection
UINT AdminAccept(CONNECTION *c, PACK *p)
{
ADMIN *a;
UCHAR secure_password[SHA1_SIZE];
UCHAR null_password[SHA1_SIZE];
UCHAR secure_null_password[SHA1_SIZE];
char hubname[MAX_HUBNAME_LEN + 1];
CEDAR *cedar;
SOCK *sock;
RPC *rpc;
UINT err;
SERVER *server = NULL;
RPC_WINVER ver;
bool accept_empty_password;
bool is_empty_password = false;
// Validate arguments
if (c == NULL || p == NULL)
{
return ERR_INTERNAL_ERROR;
}
cedar = c->Cedar;
sock = c->FirstSock;
if (cedar != NULL)
{
server = cedar->Server;
}
accept_empty_password = PackGetBool(p, "accept_empty_password");
// Get client OS version
InRpcWinVer(&ver, p);
// Get hub name
if (PackGetStr(p, "hubname", hubname, sizeof(hubname)) == false)
{
// without hub name
StrCpy(hubname, sizeof(hubname), "");
}
// Check source IP address
if (CheckAdminSourceAddress(sock, hubname) == false)
{
SLog(c->Cedar, "LA_IP_DENIED", c->Name);
return ERR_IP_ADDRESS_DENIED;
}
// Get password information
if (PackGetDataSize(p, "secure_password") != SHA1_SIZE)
{
// Malformed information
return ERR_PROTOCOL_ERROR;
}
PackGetData(p, "secure_password", secure_password);
if (StrLen(hubname) == 0)
{
// Server admin mode
SLog(c->Cedar, "LA_CONNECTED_1", c->Name);
}
else
{
// Hub admin mode
if (server != NULL && server->ServerType == SERVER_TYPE_FARM_MEMBER)
{
// Connection with hub admin mode to cluster member is not permitted
return ERR_NOT_ENOUGH_RIGHT;
}
SLog(c->Cedar, "LA_CONNECTED_2", c->Name, hubname);
}
// Check password
err = AdminCheckPassword(cedar, c->Random, secure_password,
StrLen(hubname) != 0 ? hubname : NULL, accept_empty_password, &is_empty_password);
if (err != ERR_NO_ERROR)
{
// Error occured
SLog(c->Cedar, "LA_ERROR", c->Name, GetUniErrorStr(err), err);
return err;
}
SLog(c->Cedar, "LA_OK", c->Name);
HashAdminPassword(null_password, "");
SecurePassword(secure_null_password, null_password, c->Random);
if (Cmp(secure_null_password, secure_password, SHA1_SIZE) == 0)
{
if (IsLocalHostIP(&sock->RemoteIP) == false)
{
// The client tried to use blank password for hub admin mode from remote
if (StrLen(hubname) != 0)
{
return ERR_NULL_PASSWORD_LOCAL_ONLY;
}
}
}
// Reply success result
p = NewPack();
if (accept_empty_password && is_empty_password)
{
PackAddBool(p, "empty_password", true);
}
HttpServerSend(sock, p);
FreePack(p);
// Construct ADMIN object
a = ZeroMalloc(sizeof(ADMIN));
a->ServerAdmin = ((StrLen(hubname) == 0) ? true : false);
a->HubName = (StrLen(hubname) != 0 ? hubname : NULL);
a->Server = c->Cedar->Server;
a->ClientBuild = c->ClientBuild;
Copy(&a->ClientWinVer, &ver, sizeof(RPC_WINVER));
// Timeout setting
SetTimeout(sock, INFINITE);
// RPC Server
rpc = StartRpcServer(sock, AdminDispatch, a);
a->Rpc = rpc;
SLog(c->Cedar, "LA_RPC_START", c->Name, rpc->Name);
RpcServer(rpc);
RpcFree(rpc);
if (a->LogFileList != NULL)
{
// Free cached log file list, if it exists
FreeEnumLogFile(a->LogFileList);
}
// Free ADMIN object
Free(a);
return ERR_NO_ERROR;
}
// Check for admin password
UINT AdminCheckPassword(CEDAR *c, void *random, void *secure_password, char *hubname,
bool accept_empty_password, bool *is_password_empty)
{
UCHAR check[SHA1_SIZE];
bool b_dummy;
// Validate arguments
if (c == NULL || random == NULL || secure_password == NULL)
{
return ERR_INTERNAL_ERROR;
}
if (is_password_empty == NULL)
{
is_password_empty = &b_dummy;
}
*is_password_empty = false;
if (hubname == NULL || StrLen(hubname) == 0)
{
// Server admin mode
Lock(c->lock);
{
if (accept_empty_password && SiIsEmptyPassword(c->Server->HashedPassword))
{
// blank password
*is_password_empty = true;
}
SecurePassword(check, c->Server->HashedPassword, random);
}
Unlock(c->lock);
if (Cmp(check, secure_password, SHA1_SIZE) != 0)
{
// Password incorrect
return ERR_ACCESS_DENIED;
}
}
else
{
HUB *h;
#if 0
if (c->Server->ServerType == SERVER_TYPE_FARM_MEMBER)
{
// In cluster member mode, hub admin mode is disabled
return ERR_FARM_MEMBER_HUB_ADMIN;
}
#endif
// Hub admin mode
LockHubList(c);
{
h = GetHub(c, hubname);
}
UnlockHubList(c);
if (h == NULL)
{
// Specified hub is not found
return ERR_HUB_NOT_FOUND;
}
Lock(h->lock);
{
if (accept_empty_password && SiIsEmptyPassword(h->HashedPassword))
{
// User specified blank password
*is_password_empty = true;
}
SecurePassword(check, h->HashedPassword, random);
}
Unlock(h->lock);
ReleaseHub(h);
if (Cmp(check, secure_password, SHA1_SIZE) != 0)
{
// Incorrect password
return ERR_ACCESS_DENIED;
}
}
return ERR_NO_ERROR;
}
// Hash admin password
void HashAdminPassword(void *hash, char *password)
{
// Validate arguments
if (hash == NULL || password == NULL)
{
return;
}
Sha0(hash, password, StrLen(password));
}
// Disconnect admin connection
void AdminDisconnect(RPC *rpc)
{
SESSION *s;
SOCK *sock;
// Validate arguments
if (rpc == NULL)
{
return;
}
s = (SESSION *)rpc->Param;
sock = rpc->Sock;
EndRpc(rpc);
Disconnect(sock);
ReleaseSession(s);
}
// Admin connection main routine
SESSION *AdminConnectMain(CEDAR *cedar, CLIENT_OPTION *o, char *hubname, void *hashed_password, UINT *err, char *client_name, void *hWnd, bool *empty_password)
{
UCHAR secure_password[SHA1_SIZE];
SESSION *s;
SOCK *sock;
PACK *p;
RPC_WINVER ver;
// connect
s = NewRpcSessionEx2(cedar, o, err, client_name, hWnd);
if (s == NULL)
{
return NULL;
}
// Get socket
sock = s->Connection->FirstSock;
// Generate connect method
p = NewPack();
PackAddClientVersion(p, s->Connection);
PackAddStr(p, "method", "admin");
PackAddBool(p, "accept_empty_password", true);
// Windows version on client
GetWinVer(&ver);
OutRpcWinVer(p, &ver);
// Secure Password
SecurePassword(secure_password, hashed_password, s->Connection->Random);
PackAddData(p, "secure_password", secure_password, sizeof(secure_password));
// HUB name
if (hubname != NULL)
{
PackAddStr(p, "hubname", hubname);
}
if (HttpClientSend(sock, p) == false)
{
// disconnect
FreePack(p);
ReleaseSession(s);
*err = ERR_DISCONNECTED;
return NULL;
}
FreePack(p);
p = HttpClientRecv(sock);
if (p == NULL)
{
// disconnect
ReleaseSession(s);
*err = ERR_DISCONNECTED;
return NULL;
}
if (GetErrorFromPack(p) != 0)
{
// error
ReleaseSession(s);
*err = GetErrorFromPack(p);
FreePack(p);
return NULL;
}
if (empty_password != NULL)
{
*empty_password = PackGetBool(p, "empty_password");
}
FreePack(p);
return s;
}
// Admin connection
RPC *AdminConnectEx(CEDAR *cedar, CLIENT_OPTION *o, char *hubname, void *hashed_password, UINT *err, char *client_name)
{
return AdminConnectEx2(cedar, o, hubname, hashed_password, err, client_name, NULL);
}
RPC *AdminConnectEx2(CEDAR *cedar, CLIENT_OPTION *o, char *hubname, void *hashed_password, UINT *err, char *client_name, void *hWnd)
{
SESSION *s;
SOCK *sock;
RPC *rpc;
UCHAR hashed_password_2[SHA1_SIZE];
bool empty_password = false;
// Validate arguments
if (cedar == NULL || o == NULL || hashed_password == NULL || err == NULL)
{
return NULL;
}
if (client_name == NULL)
{
client_name = CEDAR_MANAGER_STR;
}
Copy(hashed_password_2, hashed_password, SHA1_SIZE);
s = AdminConnectMain(cedar, o, hubname, hashed_password_2, err, client_name, hWnd, &empty_password);
if (s == NULL)
{
return NULL;
}
sock = s->Connection->FirstSock;
// RPC start
rpc = StartRpcClient(sock, s);
rpc->IsVpnServer = true;
Copy(&rpc->VpnServerClientOption, o, sizeof(CLIENT_OPTION));
StrCpy(rpc->VpnServerHubName, sizeof(rpc->VpnServerHubName), hubname);
StrCpy(rpc->VpnServerClientName, sizeof(rpc->VpnServerClientName), client_name);
if (empty_password == false)
{
Copy(rpc->VpnServerHashedPassword, hashed_password_2, SHA1_SIZE);
}
else
{
HashAdminPassword(rpc->VpnServerHashedPassword, "");
}
// timeout setting
SetTimeout(sock, INFINITE);
return rpc;
}
// Reconnect admin connection
UINT AdminReconnect(RPC *rpc)
{
SESSION *s;
SOCK *sock;
CEDAR *cedar;
UINT err;
bool empty_password = false;
// Validate arguments
if (rpc == NULL || rpc->IsVpnServer == false)
{
return ERR_INTERNAL_ERROR;
}
s = (SESSION *)rpc->Param;
cedar = s->Cedar;
AddRef(cedar->ref);
sock = rpc->Sock;
Disconnect(sock);
ReleaseSock(sock);
ReleaseSession(s);
rpc->Param = NULL;
rpc->Sock = NULL;
s = AdminConnectMain(cedar, &rpc->VpnServerClientOption,
rpc->VpnServerHubName,
rpc->VpnServerHashedPassword,
&err,
rpc->VpnServerClientName, NULL, &empty_password);
ReleaseCedar(cedar);
if (s == NULL)
{
return err;
}
if (empty_password)
{
HashAdminPassword(rpc->VpnServerHashedPassword, "");
}
rpc->Param = s;
rpc->Sock = s->Connection->FirstSock;
AddRef(rpc->Sock->ref);
return ERR_NO_ERROR;
}
// Identify blank password
bool SiIsEmptyPassword(void *hash_password)
{
UCHAR hash[SHA1_SIZE];
// Validate arguments
if (hash_password == NULL)
{
return false;
}
Sha0(hash, "", 0);
if (Cmp(hash_password, hash, SHA1_SIZE) == 0)
{
return true;
}
return false;
}