mirror of
https://github.com/SoftEtherVPN/SoftEtherVPN.git
synced 2024-11-07 18:20:41 +03:00
56c4582da8
* Allow specifying cipher suites instead of single ciphers. CipherName now specifies all cipher suites instead of the preferred cipher. This allows insecure ciphers like RC4 to be permanently disabled, instead of being the default fallback when the preferred cipher is unsupported. CipherName is now left for OpenSSL to verify. Should it be invalid, a secure default is used. The default CipherName setting for new servers is one such invalid string: "~DEFAULT~". This allows for future updates to change the default and the servers can stay secure. * Remove unused temporary variable.
13904 lines
319 KiB
C
13904 lines
319 KiB
C
// SoftEther VPN Source Code - Developer Edition Master Branch
|
|
// Cedar Communication Module
|
|
//
|
|
// SoftEther VPN Server, Client and Bridge are free software under GPLv2.
|
|
//
|
|
// Copyright (c) Daiyuu Nobori.
|
|
// Copyright (c) SoftEther VPN Project, University of Tsukuba, Japan.
|
|
// Copyright (c) SoftEther Corporation.
|
|
//
|
|
// All Rights Reserved.
|
|
//
|
|
// http://www.softether.org/
|
|
//
|
|
// Author: Daiyuu Nobori, Ph.D.
|
|
// Contributors:
|
|
// - ELIN (https://github.com/el1n)
|
|
// Comments: Tetsuo Sugiyama, Ph.D.
|
|
//
|
|
// This program is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU General Public License
|
|
// version 2 as published by the Free Software Foundation.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License version 2
|
|
// along with this program; if not, write to the Free Software
|
|
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
//
|
|
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
|
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
|
//
|
|
//
|
|
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
|
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
|
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
|
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
|
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
|
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
|
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
|
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
|
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
|
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
|
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
|
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
|
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
|
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
|
//
|
|
// USE ONLY IN JAPAN. DO NOT USE THIS SOFTWARE IN ANOTHER COUNTRY UNLESS
|
|
// YOU HAVE A CONFIRMATION THAT THIS SOFTWARE DOES NOT VIOLATE ANY
|
|
// CRIMINAL LAWS OR CIVIL RIGHTS IN THAT PARTICULAR COUNTRY. USING THIS
|
|
// SOFTWARE IN OTHER COUNTRIES IS COMPLETELY AT YOUR OWN RISK. THE
|
|
// SOFTETHER VPN PROJECT HAS DEVELOPED AND DISTRIBUTED THIS SOFTWARE TO
|
|
// COMPLY ONLY WITH THE JAPANESE LAWS AND EXISTING CIVIL RIGHTS INCLUDING
|
|
// PATENTS WHICH ARE SUBJECTS APPLY IN JAPAN. OTHER COUNTRIES' LAWS OR
|
|
// CIVIL RIGHTS ARE NONE OF OUR CONCERNS NOR RESPONSIBILITIES. WE HAVE
|
|
// NEVER INVESTIGATED ANY CRIMINAL REGULATIONS, CIVIL LAWS OR
|
|
// INTELLECTUAL PROPERTY RIGHTS INCLUDING PATENTS IN ANY OF OTHER 200+
|
|
// COUNTRIES AND TERRITORIES. BY NATURE, THERE ARE 200+ REGIONS IN THE
|
|
// WORLD, WITH DIFFERENT LAWS. IT IS IMPOSSIBLE TO VERIFY EVERY
|
|
// COUNTRIES' LAWS, REGULATIONS AND CIVIL RIGHTS TO MAKE THE SOFTWARE
|
|
// COMPLY WITH ALL COUNTRIES' LAWS BY THE PROJECT. EVEN IF YOU WILL BE
|
|
// SUED BY A PRIVATE ENTITY OR BE DAMAGED BY A PUBLIC SERVANT IN YOUR
|
|
// COUNTRY, THE DEVELOPERS OF THIS SOFTWARE WILL NEVER BE LIABLE TO
|
|
// RECOVER OR COMPENSATE SUCH DAMAGES, CRIMINAL OR CIVIL
|
|
// RESPONSIBILITIES. NOTE THAT THIS LINE IS NOT LICENSE RESTRICTION BUT
|
|
// JUST A STATEMENT FOR WARNING AND DISCLAIMER.
|
|
//
|
|
//
|
|
// SOURCE CODE CONTRIBUTION
|
|
// ------------------------
|
|
//
|
|
// Your contribution to SoftEther VPN Project is much appreciated.
|
|
// Please send patches to us through GitHub.
|
|
// Read the SoftEther VPN Patch Acceptance Policy in advance:
|
|
// http://www.softether.org/5-download/src/9.patch
|
|
//
|
|
//
|
|
// DEAR SECURITY EXPERTS
|
|
// ---------------------
|
|
//
|
|
// If you find a bug or a security vulnerability please kindly inform us
|
|
// about the problem immediately so that we can fix the security problem
|
|
// to protect a lot of users around the world as soon as possible.
|
|
//
|
|
// Our e-mail address for security reports is:
|
|
// softether-vpn-security [at] softether.org
|
|
//
|
|
// Please note that the above e-mail address is not a technical support
|
|
// inquiry address. If you need technical assistance, please visit
|
|
// http://www.softether.org/ and ask your question on the users forum.
|
|
//
|
|
// Thank you for your cooperation.
|
|
//
|
|
//
|
|
// NO MEMORY OR RESOURCE LEAKS
|
|
// ---------------------------
|
|
//
|
|
// The memory-leaks and resource-leaks verification under the stress
|
|
// test has been passed before release this source code.
|
|
|
|
|
|
// Admin.c
|
|
// RPC Module for Management
|
|
|
|
#include "CedarPch.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 && (t->HubName == NULL || 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);
|
|
}
|
|
else
|
|
{
|
|
// Success getting Caps
|
|
if (info.ServerBuildInt <= 4350)
|
|
{
|
|
if (is_bridge == false)
|
|
{
|
|
// b_support_cluster should be true for build 4300 or earlier
|
|
CAPS *caps = GetCaps(t, "b_support_cluster");
|
|
if (caps == NULL)
|
|
{
|
|
AddCapsBool(t, "b_support_cluster", true);
|
|
}
|
|
else
|
|
{
|
|
caps->Value = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
// 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("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("GetServerCipher", RPC_STR, StGetServerCipher, InRpcStr, OutRpcStr, FreeRpcStr)
|
|
DECLARE_RPC_EX("SetServerCipher", RPC_STR, StSetServerCipher, InRpcStr, OutRpcStr, FreeRpcStr)
|
|
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, FreeRpcEnumConnetion)
|
|
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("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("GetServerCipher", RPC_STR, ScGetServerCipher, InRpcStr, OutRpcStr, FreeRpcStr)
|
|
DECLARE_SC_EX("SetServerCipher", RPC_STR, ScSetServerCipher, InRpcStr, OutRpcStr, FreeRpcStr)
|
|
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, FreeRpcEnumConnetion)
|
|
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)
|
|
{
|
|
SERVER *s = a->Server;
|
|
CEDAR *c = s->Cedar;
|
|
UINT ret = ERR_NO_ERROR;
|
|
|
|
SERVER_ADMIN_ONLY;
|
|
NO_SUPPORT_FOR_BRIDGE;
|
|
if (s->ServerType != SERVER_TYPE_STANDALONE)
|
|
{
|
|
return ERR_NOT_SUPPORTED;
|
|
}
|
|
|
|
SiSetOpenVPNAndSSTPConfig(s, t);
|
|
|
|
ALog(a, NULL, "LA_SET_OVPN_SSTP_CONFIG");
|
|
|
|
IncrementServerConfigRevision(s);
|
|
|
|
return ERR_NO_ERROR;
|
|
}
|
|
|
|
// Get configurations for OpenVPN and SSTP
|
|
UINT StGetOpenVpnSstpConfig(ADMIN *a, OPENVPN_SSTP_CONFIG *t)
|
|
{
|
|
SERVER *s = a->Server;
|
|
CEDAR *c = s->Cedar;
|
|
UINT ret = ERR_NO_ERROR;
|
|
|
|
SERVER_ADMIN_ONLY;
|
|
NO_SUPPORT_FOR_BRIDGE;
|
|
if (s->ServerType != SERVER_TYPE_STANDALONE)
|
|
{
|
|
return ERR_NOT_SUPPORTED;
|
|
}
|
|
|
|
Zero(t, sizeof(OPENVPN_SSTP_CONFIG));
|
|
SiGetOpenVPNAndSSTPConfig(s, t);
|
|
|
|
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;
|
|
OPENVPN_SSTP_CONFIG config;
|
|
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;
|
|
}
|
|
|
|
SiGetOpenVPNAndSSTPConfig(s, &config);
|
|
|
|
if (config.EnableOpenVPN == false)
|
|
{
|
|
return ERR_OPENVPN_IS_NOT_ENABLED;
|
|
}
|
|
|
|
port_list = StrToIntList(config.OpenVPNPortList, true);
|
|
|
|
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];
|
|
X *dummy_x = NULL;
|
|
K *dummy_private_k = NULL;
|
|
K *dummy_public_k = NULL;
|
|
BUF *dummy_x_buf = NULL;
|
|
BUF *dummy_k_buf = NULL;
|
|
|
|
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);
|
|
|
|
// Generate a dummy certificate
|
|
if (x != NULL)
|
|
{
|
|
if (RsaGen(&dummy_private_k, &dummy_public_k, x->bits))
|
|
{
|
|
NAME *name;
|
|
wchar_t cn[128];
|
|
|
|
UniToStr64(cn, Rand64());
|
|
|
|
name = NewName(cn, cn, cn, L"US", NULL, NULL);
|
|
|
|
dummy_x = NewRootX(dummy_public_k, dummy_private_k, name, GetDaysUntil2038Ex(), NULL);
|
|
|
|
FreeName(name);
|
|
|
|
dummy_x_buf = XToBuf(dummy_x, true);
|
|
SeekBufToEnd(dummy_x_buf);
|
|
WriteBufChar(dummy_x_buf, 0);
|
|
SeekBufToBegin(dummy_x_buf);
|
|
|
|
dummy_k_buf = KToBuf(dummy_private_k, true, NULL);
|
|
SeekBufToEnd(dummy_k_buf);
|
|
WriteBufChar(dummy_k_buf, 0);
|
|
SeekBufToBegin(dummy_k_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);
|
|
}
|
|
|
|
if (dummy_x_buf != NULL)
|
|
{
|
|
ReplaceStrEx((char *)config_l3_buf->Buf, config_l3_buf->Size, (char *)config_l3_buf->Buf,
|
|
"$CERT$", dummy_x_buf->Buf, false);
|
|
}
|
|
|
|
if (dummy_k_buf != NULL)
|
|
{
|
|
ReplaceStrEx((char *)config_l3_buf->Buf, config_l3_buf->Size, (char *)config_l3_buf->Buf,
|
|
"$KEY$", dummy_k_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);
|
|
}
|
|
|
|
if (dummy_x_buf != NULL)
|
|
{
|
|
ReplaceStrEx((char *)config_l2_buf->Buf, config_l2_buf->Size, (char *)config_l2_buf->Buf,
|
|
"$CERT$", dummy_x_buf->Buf, false);
|
|
}
|
|
|
|
if (dummy_k_buf != NULL)
|
|
{
|
|
ReplaceStrEx((char *)config_l2_buf->Buf, config_l2_buf->Size, (char *)config_l2_buf->Buf,
|
|
"$KEY$", dummy_k_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);
|
|
|
|
FreeX(dummy_x);
|
|
FreeK(dummy_private_k);
|
|
FreeK(dummy_public_k);
|
|
|
|
FreeBuf(dummy_k_buf);
|
|
FreeBuf(dummy_x_buf);
|
|
|
|
Free(zero_buffer);
|
|
}
|
|
|
|
FreeStrList(port_list);
|
|
|
|
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(t));
|
|
|
|
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)
|
|
{
|
|
// Cache not found
|
|
return ERR_OBJECT_NOT_FOUND;
|
|
}
|
|
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);
|
|
}
|
|
|
|
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_INTERNAL_ERROR;
|
|
}
|
|
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_INTERNAL_ERROR;
|
|
}
|
|
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_INTERNAL_ERROR;
|
|
}
|
|
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;
|
|
}
|
|
}
|
|
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;
|
|
}
|
|
|
|
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));
|
|
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.ipv6_addr, sizeof(t->ClientIp6));
|
|
}
|
|
|
|
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;
|
|
UINT ret = ERR_NO_ERROR;
|
|
|
|
|
|
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);
|
|
{
|
|
UINT i;
|
|
|
|
// Confirm whether the access list of form which cannot handle by the old client already exists
|
|
if (a->ClientBuild < 6560)
|
|
{
|
|
for (i = 0;i < LIST_NUM(h->AccessList);i++)
|
|
{
|
|
ACCESS *access = LIST_DATA(h->AccessList, i);
|
|
if (access->IsIPv6 ||
|
|
access->Jitter != 0 || access->Loss != 0 || access->Delay != 0)
|
|
{
|
|
ret = ERR_VERSION_INVALID;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (a->ClientBuild < 8234)
|
|
{
|
|
for (i = 0;i < LIST_NUM(h->AccessList);i++)
|
|
{
|
|
ACCESS *access = LIST_DATA(h->AccessList, i);
|
|
|
|
if (IsEmptyStr(access->RedirectUrl) == false)
|
|
{
|
|
ret = ERR_VERSION_INVALID;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
// 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);
|
|
}
|
|
}
|
|
|
|
if (ret == ERR_NO_ERROR)
|
|
{
|
|
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);
|
|
}
|
|
else
|
|
{
|
|
UnlockList(h->AccessList);
|
|
}
|
|
|
|
ReleaseHub(h);
|
|
|
|
return ret;
|
|
}
|
|
|
|
// 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 (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 infomation 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(t));
|
|
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));
|
|
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);
|
|
|
|
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));
|
|
StrCpy(t->HubName, sizeof(t->HubName), hubname);
|
|
Copy(t, h->SecureNATOption, sizeof(VH_OPTION));
|
|
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;
|
|
|
|
FreeRpcEnumConnetion(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(t));
|
|
//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->HubOption.MaxSession = h->Option->MaxSession;
|
|
t->HubOption.NoEnum = h->Option->NoEnum;
|
|
t->HubType = h->Type;
|
|
}
|
|
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;
|
|
}
|
|
|
|
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, "");
|
|
Hash(hash2, "", 0, true);
|
|
|
|
if (Cmp(t->HashedPassword, hash2, SHA1_SIZE) == 0 || Cmp(t->SecurePassword, hash1, SHA1_SIZE) == 0)
|
|
{
|
|
if (a->ServerAdmin == false && a->Rpc->Sock->RemoteIP.addr[0] != 127)
|
|
{
|
|
// 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->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.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);
|
|
|
|
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 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;
|
|
}
|
|
|
|
// 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;
|
|
}
|
|
|
|
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;
|
|
|
|
|
|
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;
|
|
}
|
|
|
|
// 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");
|
|
PackGetStr(p, "OpenVPNPortList", t->OpenVPNPortList, sizeof(t->OpenVPNPortList));
|
|
}
|
|
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);
|
|
PackAddStr(p, "OpenVPNPortList", t->OpenVPNPortList);
|
|
}
|
|
|
|
// 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));
|
|
}
|
|
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);
|
|
}
|
|
|
|
// 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));
|
|
}
|
|
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);
|
|
}
|
|
|
|
// 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);
|
|
|
|
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);
|
|
}
|
|
}
|
|
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;
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
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);
|
|
|
|
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);
|
|
PackAddInt64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumItem);
|
|
}
|
|
}
|
|
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 = PackGetInt(p, "NumItem");
|
|
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
AC *ac = ZeroMalloc(sizeof(AC));
|
|
|
|
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);
|
|
|
|
for (i = 0;i < num;i++)
|
|
{
|
|
AC *ac = LIST_DATA(o, i);
|
|
|
|
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);
|
|
}
|
|
}
|
|
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);
|
|
|
|
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);
|
|
}
|
|
}
|
|
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);
|
|
|
|
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);
|
|
}
|
|
}
|
|
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);
|
|
|
|
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);
|
|
}
|
|
}
|
|
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);
|
|
|
|
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);
|
|
}
|
|
}
|
|
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);
|
|
|
|
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);
|
|
}
|
|
}
|
|
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);
|
|
|
|
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);
|
|
}
|
|
}
|
|
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));
|
|
|
|
GetExeDir(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);
|
|
StrCpy(e->Hostname, sizeof(e->Hostname), s->Connection->ClientHostname);
|
|
e->MaxNumTcp = s->MaxConnection;
|
|
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);
|
|
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);
|
|
PackAddInt64Ex(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);
|
|
}
|
|
}
|
|
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);
|
|
PackAddInt64(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);
|
|
PackAddInt64(p, "SubscriptionExpires", t->SubscriptionExpires);
|
|
PackAddBool(p, "IsSubscriptionExpired", t->IsSubscriptionExpired);
|
|
PackAddInt(p, "NumUserCreationLicense", t->NumUserCreationLicense);
|
|
PackAddInt64(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 = PackGetInt(p, "NumItem");
|
|
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);
|
|
}
|
|
}
|
|
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);
|
|
|
|
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);
|
|
}
|
|
}
|
|
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);
|
|
PackAddInt64(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);
|
|
PackAddInt64(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);
|
|
PackAddInt64(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;
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
void FreeRpcListenerList(RPC_LISTENER_LIST *t)
|
|
{
|
|
// Validate arguments
|
|
if (t == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Free(t->Ports);
|
|
Free(t->Enables);
|
|
Free(t->Errors);
|
|
}
|
|
|
|
// 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_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));
|
|
}
|
|
void OutRpcSetPassword(PACK *p, RPC_SET_PASSWORD *t)
|
|
{
|
|
// Validate arguments
|
|
if (t == NULL || p == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
PackAddData(p, "HashedPassword", t->HashedPassword, sizeof(t->HashedPassword));
|
|
}
|
|
|
|
// 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));
|
|
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));
|
|
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);
|
|
PackAddInt64(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);
|
|
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);
|
|
}
|
|
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;
|
|
}
|
|
|
|
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);
|
|
PackAddInt64Ex(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);
|
|
}
|
|
}
|
|
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);
|
|
PackAddInt64(p, "StartedTime", t->StartedTime);
|
|
PackAddInt64(p, "CurrentConnectedTime", t->CurrentConnectedTime);
|
|
PackAddInt64(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->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, "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));
|
|
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);
|
|
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;
|
|
}
|
|
|
|
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);
|
|
PackAddInt64Ex(p, "LastCommTime", e->LastCommTime, i, t->NumHub);
|
|
PackAddInt64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumHub);
|
|
PackAddInt64Ex(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);
|
|
}
|
|
}
|
|
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;
|
|
}
|
|
|
|
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);
|
|
PackAddInt64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumConnection);
|
|
PackAddIntEx(p, "Type", e->Type, i, t->NumConnection);
|
|
}
|
|
}
|
|
void FreeRpcEnumConnetion(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);
|
|
PackAddInt64(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);
|
|
PackAddInt64(p, "LastCommTime", t->LastCommTime);
|
|
PackAddInt64(p, "CreatedTime", t->CreatedTime);
|
|
PackAddInt64(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);
|
|
|
|
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);
|
|
PackAddInt64Ex(p, "Expires", e->Expires, i, t->NumCa);
|
|
}
|
|
}
|
|
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);
|
|
}
|
|
}
|
|
void OutRpcEnumLink(PACK *p, RPC_ENUM_LINK *t)
|
|
{
|
|
UINT i;
|
|
// Validate arguments
|
|
if (t == NULL || p == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
PackAddStr(p, "HubName", t->HubName);
|
|
|
|
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);
|
|
PackAddInt64Ex(p, "ConnectedTime", e->ConnectedTime, i, t->NumLink);
|
|
PackAddBoolEx(p, "Connected", e->Connected, i, t->NumLink);
|
|
PackAddIntEx(p, "LastError", e->LastError, i, t->NumLink);
|
|
}
|
|
}
|
|
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);
|
|
|
|
for (i = 0;i < a->NumAccess;i++)
|
|
{
|
|
ACCESS *e = &a->Accesses[i];
|
|
|
|
OutRpcAccessEx(p, e, i, a->NumAccess);
|
|
}
|
|
}
|
|
void FreeRpcEnumAccessList(RPC_ENUM_ACCESS_LIST *a)
|
|
{
|
|
// Validate arguments
|
|
if (a == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Free(a->Accesses);
|
|
}
|
|
|
|
// AUTHDATA
|
|
void *InRpcAuthData(PACK *p, UINT *authtype)
|
|
{
|
|
wchar_t tmp[MAX_SIZE];
|
|
AUTHPASSWORD *pw;
|
|
AUTHUSERCERT *usercert;
|
|
AUTHROOTCERT *rootcert;
|
|
AUTHRADIUS *radius;
|
|
AUTHNT *nt;
|
|
BUF *b;
|
|
// 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));
|
|
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->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);
|
|
PackAddInt64(p, "CreatedTime", t->CreatedTime);
|
|
PackAddInt64(p, "UpdatedTime", t->UpdatedTime);
|
|
PackAddInt64(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);
|
|
|
|
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);
|
|
PackAddInt64Ex(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);
|
|
PackAddInt64Ex(p, "Expires", e->Expires, i, t->NumUser);
|
|
}
|
|
}
|
|
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);
|
|
|
|
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);
|
|
}
|
|
}
|
|
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);
|
|
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);
|
|
}
|
|
}
|
|
void OutRpcEnumSession(PACK *p, RPC_ENUM_SESSION *t)
|
|
{
|
|
UINT i;
|
|
// Validate arguments
|
|
if (t == NULL || p == NULL)
|
|
{
|
|
return;
|
|
}
|
|
PackAddStr(p, "HubName", t->HubName);
|
|
|
|
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);
|
|
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);
|
|
PackAddInt64Ex(p, "LastCommDormant", e->LastCommDormant, i, t->NumSession);
|
|
}
|
|
}
|
|
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);
|
|
}
|
|
|
|
// 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));
|
|
|
|
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);
|
|
|
|
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);
|
|
|
|
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);
|
|
PackAddInt64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumMacTable);
|
|
PackAddInt64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumMacTable);
|
|
PackAddBoolEx(p, "RemoteItem", e->RemoteItem, i, t->NumMacTable);
|
|
PackAddStrEx(p, "RemoteHostname", e->RemoteHostname, i, t->NumMacTable);
|
|
}
|
|
}
|
|
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);
|
|
}
|
|
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);
|
|
|
|
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);
|
|
PackAddBoolEx(p, "DhcpAllocated", e->DhcpAllocated, i, t->NumIpTable);
|
|
PackAddInt64Ex(p, "CreatedTime", e->CreatedTime, i, t->NumIpTable);
|
|
PackAddInt64Ex(p, "UpdatedTime", e->UpdatedTime, i, t->NumIpTable);
|
|
PackAddBoolEx(p, "RemoteItem", e->RemoteItem, i, t->NumIpTable);
|
|
PackAddStrEx(p, "RemoteHostname", e->RemoteHostname, i, t->NumIpTable);
|
|
}
|
|
}
|
|
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), "");
|
|
}
|
|
|
|
// Cehck 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 (cedar->Server != NULL && cedar->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 (sock->RemoteIP.addr[0] != 127)
|
|
{
|
|
// 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;
|
|
}
|
|
|
|
Hash(hash, password, StrLen(password), true);
|
|
}
|
|
|
|
// 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 *AdminConnect(CEDAR *cedar, CLIENT_OPTION *o, char *hubname, void *hashed_password, UINT *err)
|
|
{
|
|
return AdminConnectEx(cedar, o, hubname, hashed_password, err, NULL);
|
|
}
|
|
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;
|
|
}
|
|
|
|
Hash(hash, "", 0, true);
|
|
|
|
if (Cmp(hash_password, hash, SHA1_SIZE) == 0)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|