From b352aa4cc3948e37f4240e012e30c7d5da9c5f44 Mon Sep 17 00:00:00 2001 From: Davide Beatrici Date: Sat, 18 Jul 2020 18:14:28 +0200 Subject: [PATCH] Cedar/Server: load and save Proto settings Snippet from the server configuration: declare root { ... declare ServerConfiguration { ... declare Proto { declare OpenVPN { string DefaultClientOption dev-type$20tun,link-mtu$201500,tun-mtu$201500,cipher$20AES-128-CBC,auth$20SHA1,keysize$20128,key-method$202,tls-client bool Enabled true bool Obfuscation false string ObfuscationMask $ bool PushDummyIPv4AddressOnL2Mode true } declare SSTP { bool Enabled true } } ... } ... } --- src/Cedar/Server.c | 130 ++++++++++++++++++++++++++++++++++++++++----- src/Cedar/Server.h | 2 + 2 files changed, 120 insertions(+), 12 deletions(-) diff --git a/src/Cedar/Server.c b/src/Cedar/Server.c index 21d375bb..d6ca5168 100644 --- a/src/Cedar/Server.c +++ b/src/Cedar/Server.c @@ -5675,7 +5675,7 @@ void SiLoadServerCfg(SERVER *s, FOLDER *f) Lock(c->lock); { OPENVPN_SSTP_CONFIG config; - FOLDER *syslog_f; + FOLDER *ff; { UINT i; LIST *ports; @@ -5738,20 +5738,27 @@ void SiLoadServerCfg(SERVER *s, FOLDER *f) } // syslog - syslog_f = CfgGetFolder(f, "SyslogSettings"); - if (syslog_f != NULL && GetServerCapsBool(s, "b_support_syslog")) + ff = CfgGetFolder(f, "SyslogSettings"); + if (ff != NULL && GetServerCapsBool(s, "b_support_syslog")) { SYSLOG_SETTING set; Zero(&set, sizeof(set)); - set.SaveType = CfgGetInt(syslog_f, "SaveType"); - CfgGetStr(syslog_f, "HostName", set.Hostname, sizeof(set.Hostname)); - set.Port = CfgGetInt(syslog_f, "Port"); + set.SaveType = CfgGetInt(ff, "SaveType"); + CfgGetStr(ff, "HostName", set.Hostname, sizeof(set.Hostname)); + set.Port = CfgGetInt(ff, "Port"); SiSetSysLogSetting(s, &set); } + // Proto + ff = CfgGetFolder(f, "Proto"); + if (ff != NULL) + { + SiLoadProtoCfg(s->Proto, ff); + } + // Whether to disable the IPv6 listener s->Cedar->DisableIPv6Listener = CfgGetBool(f, "DisableIPv6Listener"); @@ -6185,7 +6192,7 @@ void SiWriteServerCfg(FOLDER *f, SERVER *s) Lock(c->lock); { - FOLDER *syslog_f; + FOLDER *ff; Lock(s->Keep->lock); { KEEP *k = s->Keep; @@ -6198,16 +6205,23 @@ void SiWriteServerCfg(FOLDER *f, SERVER *s) Unlock(s->Keep->lock); // syslog - syslog_f = CfgCreateFolder(f, "SyslogSettings"); - if (syslog_f != NULL) + ff = CfgCreateFolder(f, "SyslogSettings"); + if (ff != NULL) { SYSLOG_SETTING set; SiGetSysLogSetting(s, &set); - CfgAddInt(syslog_f, "SaveType", set.SaveType); - CfgAddStr(syslog_f, "HostName", set.Hostname); - CfgAddInt(syslog_f, "Port", set.Port); + CfgAddInt(ff, "SaveType", set.SaveType); + CfgAddStr(ff, "HostName", set.Hostname); + CfgAddInt(ff, "Port", set.Port); + } + + // Proto + ff = CfgCreateFolder(f, "Proto"); + if (ff != NULL) + { + SiWriteProtoCfg(ff, s->Proto); } // IPv6 listener disable setting @@ -6390,6 +6404,98 @@ void SiWriteServerCfg(FOLDER *f, SERVER *s) Unlock(c->lock); } +void SiLoadProtoCfg(PROTO *p, FOLDER *f) +{ + UINT i; + + if (p == NULL || f == NULL) + { + return; + } + + for (i = 0; i < LIST_NUM(p->Containers); ++i) + { + UINT j; + const PROTO_CONTAINER *container = LIST_DATA(p->Containers, i); + LIST *options = container->Options; + FOLDER *ff = CfgGetFolder(f, container->Name); + if (ff == NULL) + { + continue; + } + + LockList(options); + + for (j = 0; j < LIST_NUM(options); ++j) + { + PROTO_OPTION *option = LIST_DATA(options, j); + switch (option->Type) + { + case PROTO_OPTION_BOOL: + option->Bool = CfgGetBool(ff, option->Name); + break; + case PROTO_OPTION_STRING: + { + UINT size; + char buf[MAX_SIZE]; + if (CfgGetStr(ff, option->Name, buf, sizeof(buf)) == false) + { + continue; + } + + size = StrLen(buf) + 1; + option->String = ReAlloc(option->String, size); + StrCpy(option->String, size, buf); + + break; + } + default: + Debug("SiLoadProtoCfg(): unhandled option type %u!\n", option->Type); + } + } + + UnlockList(options); + } +} + +void SiWriteProtoCfg(FOLDER *f, PROTO *p) +{ + UINT i; + + if (f == NULL || p == NULL) + { + return; + } + + for (i = 0; i < LIST_NUM(p->Containers); ++i) + { + UINT j; + const PROTO_CONTAINER *container = LIST_DATA(p->Containers, i); + LIST *options = container->Options; + FOLDER *ff = CfgCreateFolder(f, container->Name); + + LockList(options); + + for (j = 0; j < LIST_NUM(options); ++j) + { + const PROTO_OPTION *option = LIST_DATA(options, j); + switch (option->Type) + { + case PROTO_OPTION_BOOL: + CfgAddBool(ff, option->Name, option->Bool); + break; + case PROTO_OPTION_STRING: + CfgAddStr(ff, option->Name, option->String); + break; + default: + Debug("SiWriteProtoCfg(): unhandled option type %u!\n", option->Type); + } + } + + UnlockList(options); + } +} + // Read the traffic information void SiLoadTraffic(FOLDER *parent, char *name, TRAFFIC *t) { diff --git a/src/Cedar/Server.h b/src/Cedar/Server.h index 0e14c8fc..972e5b20 100644 --- a/src/Cedar/Server.h +++ b/src/Cedar/Server.h @@ -418,6 +418,8 @@ void SiLoadServerCfg(SERVER *s, FOLDER *f); void SiWriteGlobalParamsCfg(FOLDER *f); void SiLoadGlobalParamsCfg(FOLDER *f); void SiLoadGlobalParamItem(UINT id, UINT value); +void SiLoadProtoCfg(PROTO *p, FOLDER *f); +void SiWriteProtoCfg(FOLDER *f, PROTO *p); void SiWriteTraffic(FOLDER *parent, char *name, TRAFFIC *t); void SiWriteTrafficInner(FOLDER *parent, char *name, TRAFFIC_ENTRY *e); void SiLoadTrafficInner(FOLDER *parent, char *name, TRAFFIC_ENTRY *e);