/*
Technitium DNS Server
Copyright (C) 2024 Shreyas Zare (shreyas@technitium.com)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
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
along with this program. If not, see .
*/
using DnsServerCore.Auth;
using DnsServerCore.Dhcp;
using DnsServerCore.Dhcp.Options;
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Net;
using System.Text.Json;
using System.Threading.Tasks;
using TechnitiumLibrary;
namespace DnsServerCore
{
class WebServiceDhcpApi
{
#region variables
static readonly char[] _commaSeparator = new char[] { ',' };
readonly DnsWebService _dnsWebService;
#endregion
#region constructor
public WebServiceDhcpApi(DnsWebService dnsWebService)
{
_dnsWebService = dnsWebService;
}
#endregion
#region public
public void ListDhcpLeases(HttpContext context)
{
UserSession session = context.GetCurrentSession();
if (!_dnsWebService._authManager.IsPermitted(PermissionSection.DhcpServer, session.User, PermissionFlag.View))
throw new DnsWebServiceException("Access was denied.");
IReadOnlyDictionary scopes = _dnsWebService.DhcpServer.Scopes;
//sort by name
List sortedScopes = new List(scopes.Count);
foreach (KeyValuePair entry in scopes)
sortedScopes.Add(entry.Value);
sortedScopes.Sort();
Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter();
jsonWriter.WritePropertyName("leases");
jsonWriter.WriteStartArray();
foreach (Scope scope in sortedScopes)
{
IReadOnlyDictionary leases = scope.Leases;
//sort by address
List sortedLeases = new List(leases.Count);
foreach (KeyValuePair entry in leases)
sortedLeases.Add(entry.Value);
sortedLeases.Sort();
foreach (Lease lease in sortedLeases)
{
jsonWriter.WriteStartObject();
jsonWriter.WriteString("scope", scope.Name);
jsonWriter.WriteString("type", lease.Type.ToString());
jsonWriter.WriteString("hardwareAddress", BitConverter.ToString(lease.HardwareAddress));
jsonWriter.WriteString("clientIdentifier", lease.ClientIdentifier.ToString());
jsonWriter.WriteString("address", lease.Address.ToString());
jsonWriter.WriteString("hostName", lease.HostName);
jsonWriter.WriteString("leaseObtained", lease.LeaseObtained);
jsonWriter.WriteString("leaseExpires", lease.LeaseExpires);
jsonWriter.WriteEndObject();
}
}
jsonWriter.WriteEndArray();
}
public void ListDhcpScopes(HttpContext context)
{
UserSession session = context.GetCurrentSession();
if (!_dnsWebService._authManager.IsPermitted(PermissionSection.DhcpServer, session.User, PermissionFlag.View))
throw new DnsWebServiceException("Access was denied.");
IReadOnlyDictionary scopes = _dnsWebService.DhcpServer.Scopes;
//sort by name
List sortedScopes = new List(scopes.Count);
foreach (KeyValuePair entry in scopes)
sortedScopes.Add(entry.Value);
sortedScopes.Sort();
Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter();
jsonWriter.WritePropertyName("scopes");
jsonWriter.WriteStartArray();
foreach (Scope scope in sortedScopes)
{
jsonWriter.WriteStartObject();
jsonWriter.WriteString("name", scope.Name);
jsonWriter.WriteBoolean("enabled", scope.Enabled);
jsonWriter.WriteString("startingAddress", scope.StartingAddress.ToString());
jsonWriter.WriteString("endingAddress", scope.EndingAddress.ToString());
jsonWriter.WriteString("subnetMask", scope.SubnetMask.ToString());
jsonWriter.WriteString("networkAddress", scope.NetworkAddress.ToString());
jsonWriter.WriteString("broadcastAddress", scope.BroadcastAddress.ToString());
if (scope.InterfaceAddress is not null)
jsonWriter.WriteString("interfaceAddress", scope.InterfaceAddress.ToString());
jsonWriter.WriteEndObject();
}
jsonWriter.WriteEndArray();
}
public void GetDhcpScope(HttpContext context)
{
UserSession session = context.GetCurrentSession();
if (!_dnsWebService._authManager.IsPermitted(PermissionSection.DhcpServer, session.User, PermissionFlag.View))
throw new DnsWebServiceException("Access was denied.");
string scopeName = context.Request.GetQueryOrForm("name");
Scope scope = _dnsWebService.DhcpServer.GetScope(scopeName);
if (scope is null)
throw new DnsWebServiceException("DHCP scope was not found: " + scopeName);
Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter();
jsonWriter.WriteString("name", scope.Name);
jsonWriter.WriteString("startingAddress", scope.StartingAddress.ToString());
jsonWriter.WriteString("endingAddress", scope.EndingAddress.ToString());
jsonWriter.WriteString("subnetMask", scope.SubnetMask.ToString());
jsonWriter.WriteNumber("leaseTimeDays", scope.LeaseTimeDays);
jsonWriter.WriteNumber("leaseTimeHours", scope.LeaseTimeHours);
jsonWriter.WriteNumber("leaseTimeMinutes", scope.LeaseTimeMinutes);
jsonWriter.WriteNumber("offerDelayTime", scope.OfferDelayTime);
jsonWriter.WriteBoolean("pingCheckEnabled", scope.PingCheckEnabled);
jsonWriter.WriteNumber("pingCheckTimeout", scope.PingCheckTimeout);
jsonWriter.WriteNumber("pingCheckRetries", scope.PingCheckRetries);
if (!string.IsNullOrEmpty(scope.DomainName))
jsonWriter.WriteString("domainName", scope.DomainName);
if (scope.DomainSearchList is not null)
{
jsonWriter.WritePropertyName("domainSearchList");
jsonWriter.WriteStartArray();
foreach (string domainSearchString in scope.DomainSearchList)
jsonWriter.WriteStringValue(domainSearchString);
jsonWriter.WriteEndArray();
}
jsonWriter.WriteBoolean("dnsUpdates", scope.DnsUpdates);
jsonWriter.WriteNumber("dnsTtl", scope.DnsTtl);
if (scope.ServerAddress is not null)
jsonWriter.WriteString("serverAddress", scope.ServerAddress.ToString());
if (scope.ServerHostName is not null)
jsonWriter.WriteString("serverHostName", scope.ServerHostName);
if (scope.BootFileName is not null)
jsonWriter.WriteString("bootFileName", scope.BootFileName);
if (scope.RouterAddress is not null)
jsonWriter.WriteString("routerAddress", scope.RouterAddress.ToString());
jsonWriter.WriteBoolean("useThisDnsServer", scope.UseThisDnsServer);
if (scope.DnsServers is not null)
{
jsonWriter.WritePropertyName("dnsServers");
jsonWriter.WriteStartArray();
foreach (IPAddress dnsServer in scope.DnsServers)
jsonWriter.WriteStringValue(dnsServer.ToString());
jsonWriter.WriteEndArray();
}
if (scope.WinsServers is not null)
{
jsonWriter.WritePropertyName("winsServers");
jsonWriter.WriteStartArray();
foreach (IPAddress winsServer in scope.WinsServers)
jsonWriter.WriteStringValue(winsServer.ToString());
jsonWriter.WriteEndArray();
}
if (scope.NtpServers is not null)
{
jsonWriter.WritePropertyName("ntpServers");
jsonWriter.WriteStartArray();
foreach (IPAddress ntpServer in scope.NtpServers)
jsonWriter.WriteStringValue(ntpServer.ToString());
jsonWriter.WriteEndArray();
}
if (scope.NtpServerDomainNames is not null)
{
jsonWriter.WritePropertyName("ntpServerDomainNames");
jsonWriter.WriteStartArray();
foreach (string ntpServerDomainName in scope.NtpServerDomainNames)
jsonWriter.WriteStringValue(ntpServerDomainName);
jsonWriter.WriteEndArray();
}
if (scope.StaticRoutes is not null)
{
jsonWriter.WritePropertyName("staticRoutes");
jsonWriter.WriteStartArray();
foreach (ClasslessStaticRouteOption.Route route in scope.StaticRoutes)
{
jsonWriter.WriteStartObject();
jsonWriter.WriteString("destination", route.Destination.ToString());
jsonWriter.WriteString("subnetMask", route.SubnetMask.ToString());
jsonWriter.WriteString("router", route.Router.ToString());
jsonWriter.WriteEndObject();
}
jsonWriter.WriteEndArray();
}
if (scope.VendorInfo is not null)
{
jsonWriter.WritePropertyName("vendorInfo");
jsonWriter.WriteStartArray();
foreach (KeyValuePair entry in scope.VendorInfo)
{
jsonWriter.WriteStartObject();
jsonWriter.WriteString("identifier", entry.Key);
jsonWriter.WriteString("information", BitConverter.ToString(entry.Value.Information).Replace('-', ':'));
jsonWriter.WriteEndObject();
}
jsonWriter.WriteEndArray();
}
if (scope.CAPWAPAcIpAddresses is not null)
{
jsonWriter.WritePropertyName("capwapAcIpAddresses");
jsonWriter.WriteStartArray();
foreach (IPAddress acIpAddress in scope.CAPWAPAcIpAddresses)
jsonWriter.WriteStringValue(acIpAddress.ToString());
jsonWriter.WriteEndArray();
}
if (scope.TftpServerAddresses is not null)
{
jsonWriter.WritePropertyName("tftpServerAddresses");
jsonWriter.WriteStartArray();
foreach (IPAddress address in scope.TftpServerAddresses)
jsonWriter.WriteStringValue(address.ToString());
jsonWriter.WriteEndArray();
}
if (scope.GenericOptions is not null)
{
jsonWriter.WritePropertyName("genericOptions");
jsonWriter.WriteStartArray();
foreach (DhcpOption genericOption in scope.GenericOptions)
{
jsonWriter.WriteStartObject();
jsonWriter.WriteNumber("code", (byte)genericOption.Code);
jsonWriter.WriteString("value", BitConverter.ToString(genericOption.RawValue).Replace('-', ':'));
jsonWriter.WriteEndObject();
}
jsonWriter.WriteEndArray();
}
if (scope.Exclusions is not null)
{
jsonWriter.WritePropertyName("exclusions");
jsonWriter.WriteStartArray();
foreach (Exclusion exclusion in scope.Exclusions)
{
jsonWriter.WriteStartObject();
jsonWriter.WriteString("startingAddress", exclusion.StartingAddress.ToString());
jsonWriter.WriteString("endingAddress", exclusion.EndingAddress.ToString());
jsonWriter.WriteEndObject();
}
jsonWriter.WriteEndArray();
}
jsonWriter.WritePropertyName("reservedLeases");
jsonWriter.WriteStartArray();
foreach (Lease reservedLease in scope.ReservedLeases)
{
jsonWriter.WriteStartObject();
jsonWriter.WriteString("hostName", reservedLease.HostName);
jsonWriter.WriteString("hardwareAddress", BitConverter.ToString(reservedLease.HardwareAddress));
jsonWriter.WriteString("address", reservedLease.Address.ToString());
jsonWriter.WriteString("comments", reservedLease.Comments);
jsonWriter.WriteEndObject();
}
jsonWriter.WriteEndArray();
jsonWriter.WriteBoolean("allowOnlyReservedLeases", scope.AllowOnlyReservedLeases);
jsonWriter.WriteBoolean("blockLocallyAdministeredMacAddresses", scope.BlockLocallyAdministeredMacAddresses);
jsonWriter.WriteBoolean("ignoreClientIdentifierOption", scope.IgnoreClientIdentifierOption);
}
public async Task SetDhcpScopeAsync(HttpContext context)
{
UserSession session = context.GetCurrentSession();
if (!_dnsWebService._authManager.IsPermitted(PermissionSection.DhcpServer, session.User, PermissionFlag.Modify))
throw new DnsWebServiceException("Access was denied.");
HttpRequest request = context.Request;
string scopeName = request.GetQueryOrForm("name");
string strStartingAddress = request.QueryOrForm("startingAddress");
string strEndingAddress = request.QueryOrForm("endingAddress");
string strSubnetMask = request.QueryOrForm("subnetMask");
bool scopeExists;
Scope scope = _dnsWebService.DhcpServer.GetScope(scopeName);
if (scope is null)
{
//scope does not exists; create new scope
if (string.IsNullOrEmpty(strStartingAddress))
throw new DnsWebServiceException("Parameter 'startingAddress' missing.");
if (string.IsNullOrEmpty(strEndingAddress))
throw new DnsWebServiceException("Parameter 'endingAddress' missing.");
if (string.IsNullOrEmpty(strSubnetMask))
throw new DnsWebServiceException("Parameter 'subnetMask' missing.");
scopeExists = false;
scope = new Scope(scopeName, true, IPAddress.Parse(strStartingAddress), IPAddress.Parse(strEndingAddress), IPAddress.Parse(strSubnetMask), _dnsWebService._log, _dnsWebService.DhcpServer);
scope.IgnoreClientIdentifierOption = true;
}
else
{
scopeExists = true;
IPAddress startingAddress = string.IsNullOrEmpty(strStartingAddress) ? scope.StartingAddress : IPAddress.Parse(strStartingAddress);
IPAddress endingAddress = string.IsNullOrEmpty(strEndingAddress) ? scope.EndingAddress : IPAddress.Parse(strEndingAddress);
IPAddress subnetMask = string.IsNullOrEmpty(strSubnetMask) ? scope.SubnetMask : IPAddress.Parse(strSubnetMask);
//validate scope address
foreach (KeyValuePair entry in _dnsWebService.DhcpServer.Scopes)
{
Scope existingScope = entry.Value;
if (existingScope.Equals(scope))
continue;
if (existingScope.IsAddressInRange(startingAddress) || existingScope.IsAddressInRange(endingAddress))
throw new DhcpServerException("Scope with overlapping range already exists: " + existingScope.StartingAddress.ToString() + "-" + existingScope.EndingAddress.ToString());
}
scope.ChangeNetwork(startingAddress, endingAddress, subnetMask);
}
if (request.TryGetQueryOrForm("leaseTimeDays", ushort.Parse, out ushort leaseTimeDays))
scope.LeaseTimeDays = leaseTimeDays;
if (request.TryGetQueryOrForm("leaseTimeHours", byte.Parse, out byte leaseTimeHours))
scope.LeaseTimeHours = leaseTimeHours;
if (request.TryGetQueryOrForm("leaseTimeMinutes", byte.Parse, out byte leaseTimeMinutes))
scope.LeaseTimeMinutes = leaseTimeMinutes;
if (request.TryGetQueryOrForm("offerDelayTime", ushort.Parse, out ushort offerDelayTime))
scope.OfferDelayTime = offerDelayTime;
if (request.TryGetQueryOrForm("pingCheckEnabled", bool.Parse, out bool pingCheckEnabled))
scope.PingCheckEnabled = pingCheckEnabled;
if (request.TryGetQueryOrForm("pingCheckTimeout", ushort.Parse, out ushort pingCheckTimeout))
scope.PingCheckTimeout = pingCheckTimeout;
if (request.TryGetQueryOrForm("pingCheckRetries", byte.Parse, out byte pingCheckRetries))
scope.PingCheckRetries = pingCheckRetries;
string domainName = request.QueryOrForm("domainName");
if (domainName is not null)
scope.DomainName = domainName.Length == 0 ? null : domainName;
string domainSearchList = request.QueryOrForm("domainSearchList");
if (domainSearchList is not null)
{
if (domainSearchList.Length == 0)
scope.DomainSearchList = null;
else
scope.DomainSearchList = domainSearchList.Split(_commaSeparator, StringSplitOptions.RemoveEmptyEntries);
}
if (request.TryGetQueryOrForm("dnsUpdates", bool.Parse, out bool dnsUpdates))
scope.DnsUpdates = dnsUpdates;
if (request.TryGetQueryOrForm("dnsTtl", uint.Parse, out uint dnsTtl))
scope.DnsTtl = dnsTtl;
string serverAddress = request.QueryOrForm("serverAddress");
if (serverAddress is not null)
scope.ServerAddress = serverAddress.Length == 0 ? null : IPAddress.Parse(serverAddress);
string serverHostName = request.QueryOrForm("serverHostName");
if (serverHostName is not null)
scope.ServerHostName = serverHostName.Length == 0 ? null : serverHostName;
string bootFileName = request.QueryOrForm("bootFileName");
if (bootFileName is not null)
scope.BootFileName = bootFileName.Length == 0 ? null : bootFileName;
string routerAddress = request.QueryOrForm("routerAddress");
if (routerAddress is not null)
scope.RouterAddress = routerAddress.Length == 0 ? null : IPAddress.Parse(routerAddress);
if (request.TryGetQueryOrForm("useThisDnsServer", bool.Parse, out bool useThisDnsServer))
scope.UseThisDnsServer = useThisDnsServer;
if (!scope.UseThisDnsServer)
{
string dnsServers = request.QueryOrForm("dnsServers");
if (dnsServers is not null)
{
if (dnsServers.Length == 0)
scope.DnsServers = null;
else
scope.DnsServers = dnsServers.Split(IPAddress.Parse, ',');
}
}
string winsServers = request.QueryOrForm("winsServers");
if (winsServers is not null)
{
if (winsServers.Length == 0)
scope.WinsServers = null;
else
scope.WinsServers = winsServers.Split(IPAddress.Parse, ',');
}
string ntpServers = request.QueryOrForm("ntpServers");
if (ntpServers is not null)
{
if (ntpServers.Length == 0)
scope.NtpServers = null;
else
scope.NtpServers = ntpServers.Split(IPAddress.Parse, ',');
}
string ntpServerDomainNames = request.QueryOrForm("ntpServerDomainNames");
if (ntpServerDomainNames is not null)
{
if (ntpServerDomainNames.Length == 0)
scope.NtpServerDomainNames = null;
else
scope.NtpServerDomainNames = ntpServerDomainNames.Split(_commaSeparator, StringSplitOptions.RemoveEmptyEntries);
}
string strStaticRoutes = request.QueryOrForm("staticRoutes");
if (strStaticRoutes is not null)
{
if (strStaticRoutes.Length == 0)
{
scope.StaticRoutes = null;
}
else
{
string[] strStaticRoutesParts = strStaticRoutes.Split('|');
List staticRoutes = new List();
for (int i = 0; i < strStaticRoutesParts.Length; i += 3)
staticRoutes.Add(new ClasslessStaticRouteOption.Route(IPAddress.Parse(strStaticRoutesParts[i + 0]), IPAddress.Parse(strStaticRoutesParts[i + 1]), IPAddress.Parse(strStaticRoutesParts[i + 2])));
scope.StaticRoutes = staticRoutes;
}
}
string strVendorInfo = request.QueryOrForm("vendorInfo");
if (strVendorInfo is not null)
{
if (strVendorInfo.Length == 0)
{
scope.VendorInfo = null;
}
else
{
string[] strVendorInfoParts = strVendorInfo.Split('|');
Dictionary vendorInfo = new Dictionary();
for (int i = 0; i < strVendorInfoParts.Length; i += 2)
vendorInfo.Add(strVendorInfoParts[i + 0], new VendorSpecificInformationOption(strVendorInfoParts[i + 1]));
scope.VendorInfo = vendorInfo;
}
}
string capwapAcIpAddresses = request.QueryOrForm("capwapAcIpAddresses");
if (capwapAcIpAddresses is not null)
{
if (capwapAcIpAddresses.Length == 0)
scope.CAPWAPAcIpAddresses = null;
else
scope.CAPWAPAcIpAddresses = capwapAcIpAddresses.Split(IPAddress.Parse, ',');
}
string tftpServerAddresses = request.QueryOrForm("tftpServerAddresses");
if (tftpServerAddresses is not null)
{
if (tftpServerAddresses.Length == 0)
scope.TftpServerAddresses = null;
else
scope.TftpServerAddresses = tftpServerAddresses.Split(IPAddress.Parse, ',');
}
string strGenericOptions = request.QueryOrForm("genericOptions");
if (strGenericOptions is not null)
{
if (strGenericOptions.Length == 0)
{
scope.GenericOptions = null;
}
else
{
string[] strGenericOptionsParts = strGenericOptions.Split('|');
List genericOptions = new List();
for (int i = 0; i < strGenericOptionsParts.Length; i += 2)
genericOptions.Add(new DhcpOption((DhcpOptionCode)byte.Parse(strGenericOptionsParts[i + 0]), strGenericOptionsParts[i + 1]));
scope.GenericOptions = genericOptions;
}
}
string strExclusions = request.QueryOrForm("exclusions");
if (strExclusions is not null)
{
if (strExclusions.Length == 0)
{
scope.Exclusions = null;
}
else
{
string[] strExclusionsParts = strExclusions.Split('|');
List exclusions = new List();
for (int i = 0; i < strExclusionsParts.Length; i += 2)
exclusions.Add(new Exclusion(IPAddress.Parse(strExclusionsParts[i + 0]), IPAddress.Parse(strExclusionsParts[i + 1])));
scope.Exclusions = exclusions;
}
}
string strReservedLeases = request.QueryOrForm("reservedLeases");
if (strReservedLeases is not null)
{
if (strReservedLeases.Length == 0)
{
scope.ReservedLeases = null;
}
else
{
string[] strReservedLeaseParts = strReservedLeases.Split('|');
List reservedLeases = new List();
for (int i = 0; i < strReservedLeaseParts.Length; i += 4)
reservedLeases.Add(new Lease(LeaseType.Reserved, strReservedLeaseParts[i + 0], DhcpMessageHardwareAddressType.Ethernet, strReservedLeaseParts[i + 1], IPAddress.Parse(strReservedLeaseParts[i + 2]), strReservedLeaseParts[i + 3]));
scope.ReservedLeases = reservedLeases;
}
}
if (request.TryGetQueryOrForm("allowOnlyReservedLeases", bool.Parse, out bool allowOnlyReservedLeases))
scope.AllowOnlyReservedLeases = allowOnlyReservedLeases;
if (request.TryGetQueryOrForm("blockLocallyAdministeredMacAddresses", bool.Parse, out bool blockLocallyAdministeredMacAddresses))
scope.BlockLocallyAdministeredMacAddresses = blockLocallyAdministeredMacAddresses;
if (request.TryGetQueryOrForm("ignoreClientIdentifierOption", bool.Parse, out bool ignoreClientIdentifierOption))
scope.IgnoreClientIdentifierOption = ignoreClientIdentifierOption;
if (scopeExists)
{
_dnsWebService.DhcpServer.SaveScope(scopeName);
_dnsWebService._log.Write(context.GetRemoteEndPoint(_dnsWebService._webServiceRealIpHeader), "[" + session.User.Username + "] DHCP scope was updated successfully: " + scopeName);
}
else
{
await _dnsWebService.DhcpServer.AddScopeAsync(scope);
_dnsWebService._log.Write(context.GetRemoteEndPoint(_dnsWebService._webServiceRealIpHeader), "[" + session.User.Username + "] DHCP scope was added successfully: " + scopeName);
}
if (request.TryGetQueryOrForm("newName", out string newName) && !newName.Equals(scopeName))
{
_dnsWebService.DhcpServer.RenameScope(scopeName, newName);
_dnsWebService._log.Write(context.GetRemoteEndPoint(_dnsWebService._webServiceRealIpHeader), "[" + session.User.Username + "] DHCP scope was renamed successfully: '" + scopeName + "' to '" + newName + "'");
}
}
public void AddReservedLease(HttpContext context)
{
UserSession session = context.GetCurrentSession();
if (!_dnsWebService._authManager.IsPermitted(PermissionSection.DhcpServer, session.User, PermissionFlag.Modify))
throw new DnsWebServiceException("Access was denied.");
HttpRequest request = context.Request;
string scopeName = request.GetQueryOrForm("name");
Scope scope = _dnsWebService.DhcpServer.GetScope(scopeName);
if (scope is null)
throw new DnsWebServiceException("No such scope exists: " + scopeName);
string hostName = request.QueryOrForm("hostName");
string hardwareAddress = request.GetQueryOrForm("hardwareAddress");
string strIpAddress = request.GetQueryOrForm("ipAddress");
string comments = request.QueryOrForm("comments");
Lease reservedLease = new Lease(LeaseType.Reserved, hostName, DhcpMessageHardwareAddressType.Ethernet, hardwareAddress, IPAddress.Parse(strIpAddress), comments);
if (!scope.AddReservedLease(reservedLease))
throw new DnsWebServiceException("Failed to add reserved lease for scope: " + scopeName);
_dnsWebService.DhcpServer.SaveScope(scopeName);
_dnsWebService._log.Write(context.GetRemoteEndPoint(_dnsWebService._webServiceRealIpHeader), "[" + session.User.Username + "] DHCP scope reserved lease was added successfully: " + scopeName);
}
public void RemoveReservedLease(HttpContext context)
{
UserSession session = context.GetCurrentSession();
if (!_dnsWebService._authManager.IsPermitted(PermissionSection.DhcpServer, session.User, PermissionFlag.Modify))
throw new DnsWebServiceException("Access was denied.");
HttpRequest request = context.Request;
string scopeName = request.GetQueryOrForm("name");
Scope scope = _dnsWebService.DhcpServer.GetScope(scopeName);
if (scope is null)
throw new DnsWebServiceException("No such scope exists: " + scopeName);
string hardwareAddress = request.GetQueryOrForm("hardwareAddress");
if (!scope.RemoveReservedLease(hardwareAddress))
throw new DnsWebServiceException("Failed to remove reserved lease for scope: " + scopeName);
_dnsWebService.DhcpServer.SaveScope(scopeName);
_dnsWebService._log.Write(context.GetRemoteEndPoint(_dnsWebService._webServiceRealIpHeader), "[" + session.User.Username + "] DHCP scope reserved lease was removed successfully: " + scopeName);
}
public async Task EnableDhcpScopeAsync(HttpContext context)
{
UserSession session = context.GetCurrentSession();
if (!_dnsWebService._authManager.IsPermitted(PermissionSection.DhcpServer, session.User, PermissionFlag.Modify))
throw new DnsWebServiceException("Access was denied.");
string scopeName = context.Request.GetQueryOrForm("name");
await _dnsWebService.DhcpServer.EnableScopeAsync(scopeName, true);
_dnsWebService._log.Write(context.GetRemoteEndPoint(_dnsWebService._webServiceRealIpHeader), "[" + session.User.Username + "] DHCP scope was enabled successfully: " + scopeName);
}
public void DisableDhcpScope(HttpContext context)
{
UserSession session = context.GetCurrentSession();
if (!_dnsWebService._authManager.IsPermitted(PermissionSection.DhcpServer, session.User, PermissionFlag.Modify))
throw new DnsWebServiceException("Access was denied.");
string scopeName = context.Request.GetQueryOrForm("name");
_dnsWebService.DhcpServer.DisableScope(scopeName, true);
_dnsWebService._log.Write(context.GetRemoteEndPoint(_dnsWebService._webServiceRealIpHeader), "[" + session.User.Username + "] DHCP scope was disabled successfully: " + scopeName);
}
public void DeleteDhcpScope(HttpContext context)
{
UserSession session = context.GetCurrentSession();
if (!_dnsWebService._authManager.IsPermitted(PermissionSection.DhcpServer, session.User, PermissionFlag.Delete))
throw new DnsWebServiceException("Access was denied.");
string scopeName = context.Request.GetQueryOrForm("name");
_dnsWebService.DhcpServer.DeleteScope(scopeName);
_dnsWebService._log.Write(context.GetRemoteEndPoint(_dnsWebService._webServiceRealIpHeader), "[" + session.User.Username + "] DHCP scope was deleted successfully: " + scopeName);
}
public void RemoveDhcpLease(HttpContext context)
{
UserSession session = context.GetCurrentSession();
if (!_dnsWebService._authManager.IsPermitted(PermissionSection.DhcpServer, session.User, PermissionFlag.Delete))
throw new DnsWebServiceException("Access was denied.");
HttpRequest request = context.Request;
string scopeName = request.GetQueryOrForm("name");
Scope scope = _dnsWebService.DhcpServer.GetScope(scopeName);
if (scope is null)
throw new DnsWebServiceException("DHCP scope does not exists: " + scopeName);
string clientIdentifier = request.QueryOrForm("clientIdentifier");
string hardwareAddress = request.QueryOrForm("hardwareAddress");
if (!string.IsNullOrEmpty(clientIdentifier))
scope.RemoveLease(ClientIdentifierOption.Parse(clientIdentifier));
else if (!string.IsNullOrEmpty(hardwareAddress))
scope.RemoveLease(hardwareAddress);
else
throw new DnsWebServiceException("Parameter 'hardwareAddress' or 'clientIdentifier' missing. At least one of them must be specified.");
_dnsWebService.DhcpServer.SaveScope(scopeName);
_dnsWebService._log.Write(context.GetRemoteEndPoint(_dnsWebService._webServiceRealIpHeader), "[" + session.User.Username + "] DHCP scope's lease was removed successfully: " + scopeName);
}
public void ConvertToReservedLease(HttpContext context)
{
UserSession session = context.GetCurrentSession();
if (!_dnsWebService._authManager.IsPermitted(PermissionSection.DhcpServer, session.User, PermissionFlag.Modify))
throw new DnsWebServiceException("Access was denied.");
HttpRequest request = context.Request;
string scopeName = request.GetQueryOrForm("name");
Scope scope = _dnsWebService.DhcpServer.GetScope(scopeName);
if (scope == null)
throw new DnsWebServiceException("DHCP scope does not exists: " + scopeName);
string clientIdentifier = request.QueryOrForm("clientIdentifier");
string hardwareAddress = request.QueryOrForm("hardwareAddress");
if (!string.IsNullOrEmpty(clientIdentifier))
scope.ConvertToReservedLease(ClientIdentifierOption.Parse(clientIdentifier));
else if (!string.IsNullOrEmpty(hardwareAddress))
scope.ConvertToReservedLease(hardwareAddress);
else
throw new DnsWebServiceException("Parameter 'hardwareAddress' or 'clientIdentifier' missing. At least one of them must be specified.");
_dnsWebService.DhcpServer.SaveScope(scopeName);
_dnsWebService._log.Write(context.GetRemoteEndPoint(_dnsWebService._webServiceRealIpHeader), "[" + session.User.Username + "] DHCP scope's lease was reserved successfully: " + scopeName);
}
public void ConvertToDynamicLease(HttpContext context)
{
UserSession session = context.GetCurrentSession();
if (!_dnsWebService._authManager.IsPermitted(PermissionSection.DhcpServer, session.User, PermissionFlag.Modify))
throw new DnsWebServiceException("Access was denied.");
HttpRequest request = context.Request;
string scopeName = request.GetQueryOrForm("name");
Scope scope = _dnsWebService.DhcpServer.GetScope(scopeName);
if (scope == null)
throw new DnsWebServiceException("DHCP scope does not exists: " + scopeName);
string clientIdentifier = request.QueryOrForm("clientIdentifier");
string hardwareAddress = request.QueryOrForm("hardwareAddress");
if (!string.IsNullOrEmpty(clientIdentifier))
scope.ConvertToDynamicLease(ClientIdentifierOption.Parse(clientIdentifier));
else if (!string.IsNullOrEmpty(hardwareAddress))
scope.ConvertToDynamicLease(hardwareAddress);
else
throw new DnsWebServiceException("Parameter 'hardwareAddress' or 'clientIdentifier' missing. At least one of them must be specified.");
_dnsWebService.DhcpServer.SaveScope(scopeName);
_dnsWebService._log.Write(context.GetRemoteEndPoint(_dnsWebService._webServiceRealIpHeader), "[" + session.User.Username + "] DHCP scope's lease was unreserved successfully: " + scopeName);
}
#endregion
}
}