123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895 |
- /*
- Technitium DNS Server
- Copyright (C) 2023 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 <http://www.gnu.org/licenses/>.
- */
- using DnsServerCore.Auth;
- using DnsServerCore.Dns;
- using DnsServerCore.Dns.Dnssec;
- using DnsServerCore.Dns.ResourceRecords;
- using DnsServerCore.Dns.ZoneManagers;
- using DnsServerCore.Dns.Zones;
- using Microsoft.AspNetCore.Http;
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Net;
- using System.Text.Json;
- using System.Threading.Tasks;
- using TechnitiumLibrary;
- using TechnitiumLibrary.Net;
- using TechnitiumLibrary.Net.Dns;
- using TechnitiumLibrary.Net.Dns.ResourceRecords;
- using TechnitiumLibrary.Net.Proxy;
- namespace DnsServerCore
- {
- class WebServiceZonesApi
- {
- #region variables
- readonly DnsWebService _dnsWebService;
- uint _defaultRecordTtl = 3600;
- #endregion
- #region constructor
- public WebServiceZonesApi(DnsWebService dnsWebService)
- {
- _dnsWebService = dnsWebService;
- }
- #endregion
- #region static
- public static void WriteRecordsAsJson(List<DnsResourceRecord> records, Utf8JsonWriter jsonWriter, bool authoritativeZoneRecords, AuthZoneInfo zoneInfo = null)
- {
- if (records is null)
- {
- jsonWriter.WritePropertyName("records");
- jsonWriter.WriteStartArray();
- jsonWriter.WriteEndArray();
- return;
- }
- records.Sort();
- Dictionary<string, Dictionary<DnsResourceRecordType, List<DnsResourceRecord>>> groupedByDomainRecords = DnsResourceRecord.GroupRecords(records);
- jsonWriter.WritePropertyName("records");
- jsonWriter.WriteStartArray();
- foreach (KeyValuePair<string, Dictionary<DnsResourceRecordType, List<DnsResourceRecord>>> groupedByTypeRecords in groupedByDomainRecords)
- {
- foreach (KeyValuePair<DnsResourceRecordType, List<DnsResourceRecord>> groupedRecords in groupedByTypeRecords.Value)
- {
- foreach (DnsResourceRecord record in groupedRecords.Value)
- WriteRecordAsJson(record, jsonWriter, authoritativeZoneRecords, zoneInfo);
- }
- }
- jsonWriter.WriteEndArray();
- }
- #endregion
- #region private
- private static void WriteRecordAsJson(DnsResourceRecord record, Utf8JsonWriter jsonWriter, bool authoritativeZoneRecords, AuthZoneInfo zoneInfo = null)
- {
- jsonWriter.WriteStartObject();
- jsonWriter.WriteString("name", record.Name);
- jsonWriter.WriteString("type", record.Type.ToString());
- if (authoritativeZoneRecords)
- {
- AuthRecordInfo authRecordInfo = record.GetAuthRecordInfo();
- jsonWriter.WriteNumber("ttl", record.TTL);
- jsonWriter.WriteBoolean("disabled", authRecordInfo.Disabled);
- string comments = authRecordInfo.Comments;
- if (!string.IsNullOrEmpty(comments))
- jsonWriter.WriteString("comments", comments);
- }
- else
- {
- if (record.IsStale)
- jsonWriter.WriteString("ttl", "0 (0 sec)");
- else
- jsonWriter.WriteString("ttl", record.TTL + " (" + WebUtilities.GetFormattedTime((int)record.TTL) + ")");
- }
- jsonWriter.WritePropertyName("rData");
- jsonWriter.WriteStartObject();
- switch (record.Type)
- {
- case DnsResourceRecordType.A:
- {
- if (record.RDATA is DnsARecordData rdata)
- {
- jsonWriter.WriteString("ipAddress", rdata.Address.ToString());
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.NS:
- {
- if (record.RDATA is DnsNSRecordData rdata)
- {
- jsonWriter.WriteString("nameServer", rdata.NameServer.Length == 0 ? "." : rdata.NameServer);
- if (!authoritativeZoneRecords)
- {
- if (rdata.IsParentSideTtlSet)
- jsonWriter.WriteString("parentSideTtl", rdata.ParentSideTtl + " (" + WebUtilities.GetFormattedTime((int)rdata.ParentSideTtl) + ")");
- }
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.CNAME:
- {
- if (record.RDATA is DnsCNAMERecordData rdata)
- {
- jsonWriter.WriteString("cname", rdata.Domain.Length == 0 ? "." : rdata.Domain);
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.SOA:
- {
- if (record.RDATA is DnsSOARecordData rdata)
- {
- jsonWriter.WriteString("primaryNameServer", rdata.PrimaryNameServer);
- jsonWriter.WriteString("responsiblePerson", rdata.ResponsiblePerson);
- jsonWriter.WriteNumber("serial", rdata.Serial);
- jsonWriter.WriteNumber("refresh", rdata.Refresh);
- jsonWriter.WriteNumber("retry", rdata.Retry);
- jsonWriter.WriteNumber("expire", rdata.Expire);
- jsonWriter.WriteNumber("minimum", rdata.Minimum);
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- if (authoritativeZoneRecords)
- {
- AuthRecordInfo authRecordInfo = record.GetAuthRecordInfo();
- IReadOnlyList<NameServerAddress> primaryNameServers = authRecordInfo.PrimaryNameServers;
- if (primaryNameServers is not null)
- {
- string primaryAddresses = null;
- foreach (NameServerAddress primaryNameServer in primaryNameServers)
- {
- if (primaryAddresses == null)
- primaryAddresses = primaryNameServer.OriginalAddress;
- else
- primaryAddresses = primaryAddresses + ", " + primaryNameServer.OriginalAddress;
- }
- jsonWriter.WriteString("primaryAddresses", primaryAddresses);
- }
- if (authRecordInfo.ZoneTransferProtocol != DnsTransportProtocol.Udp)
- jsonWriter.WriteString("zoneTransferProtocol", authRecordInfo.ZoneTransferProtocol.ToString());
- if (!string.IsNullOrEmpty(authRecordInfo.TsigKeyName))
- jsonWriter.WriteString("tsigKeyName", authRecordInfo.TsigKeyName);
- }
- }
- break;
- case DnsResourceRecordType.PTR:
- {
- if (record.RDATA is DnsPTRRecordData rdata)
- {
- jsonWriter.WriteString("ptrName", rdata.Domain.Length == 0 ? "." : rdata.Domain);
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.MX:
- {
- if (record.RDATA is DnsMXRecordData rdata)
- {
- jsonWriter.WriteNumber("preference", rdata.Preference);
- jsonWriter.WriteString("exchange", rdata.Exchange.Length == 0 ? "." : rdata.Exchange);
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.TXT:
- {
- if (record.RDATA is DnsTXTRecordData rdata)
- {
- jsonWriter.WriteString("text", rdata.Text);
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.AAAA:
- {
- if (record.RDATA is DnsAAAARecordData rdata)
- {
- jsonWriter.WriteString("ipAddress", rdata.Address.ToString());
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.SRV:
- {
- if (record.RDATA is DnsSRVRecordData rdata)
- {
- jsonWriter.WriteNumber("priority", rdata.Priority);
- jsonWriter.WriteNumber("weight", rdata.Weight);
- jsonWriter.WriteNumber("port", rdata.Port);
- jsonWriter.WriteString("target", rdata.Target.Length == 0 ? "." : rdata.Target);
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.DNAME:
- {
- if (record.RDATA is DnsDNAMERecordData rdata)
- {
- jsonWriter.WriteString("dname", rdata.Domain.Length == 0 ? "." : rdata.Domain);
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.DS:
- {
- if (record.RDATA is DnsDSRecordData rdata)
- {
- jsonWriter.WriteNumber("keyTag", rdata.KeyTag);
- jsonWriter.WriteString("algorithm", rdata.Algorithm.ToString());
- jsonWriter.WriteString("digestType", rdata.DigestType.ToString());
- jsonWriter.WriteString("digest", Convert.ToHexString(rdata.Digest));
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.SSHFP:
- {
- if (record.RDATA is DnsSSHFPRecordData rdata)
- {
- jsonWriter.WriteString("algorithm", rdata.Algorithm.ToString());
- jsonWriter.WriteString("fingerprintType", rdata.FingerprintType.ToString());
- jsonWriter.WriteString("fingerprint", Convert.ToHexString(rdata.Fingerprint));
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.RRSIG:
- {
- if (record.RDATA is DnsRRSIGRecordData rdata)
- {
- jsonWriter.WriteString("typeCovered", rdata.TypeCovered.ToString());
- jsonWriter.WriteString("algorithm", rdata.Algorithm.ToString());
- jsonWriter.WriteNumber("labels", rdata.Labels);
- jsonWriter.WriteNumber("originalTtl", rdata.OriginalTtl);
- jsonWriter.WriteString("signatureExpiration", DateTime.UnixEpoch.AddSeconds(rdata.SignatureExpiration));
- jsonWriter.WriteString("signatureInception", DateTime.UnixEpoch.AddSeconds(rdata.SignatureInception));
- jsonWriter.WriteNumber("keyTag", rdata.KeyTag);
- jsonWriter.WriteString("signersName", rdata.SignersName.Length == 0 ? "." : rdata.SignersName);
- jsonWriter.WriteString("signature", Convert.ToBase64String(rdata.Signature));
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.NSEC:
- {
- if (record.RDATA is DnsNSECRecordData rdata)
- {
- jsonWriter.WriteString("nextDomainName", rdata.NextDomainName);
- jsonWriter.WritePropertyName("types");
- jsonWriter.WriteStartArray();
- foreach (DnsResourceRecordType type in rdata.Types)
- jsonWriter.WriteStringValue(type.ToString());
- jsonWriter.WriteEndArray();
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.DNSKEY:
- {
- if (record.RDATA is DnsDNSKEYRecordData rdata)
- {
- jsonWriter.WriteString("flags", rdata.Flags.ToString());
- jsonWriter.WriteNumber("protocol", rdata.Protocol);
- jsonWriter.WriteString("algorithm", rdata.Algorithm.ToString());
- jsonWriter.WriteString("publicKey", rdata.PublicKey.ToString());
- jsonWriter.WriteNumber("computedKeyTag", rdata.ComputedKeyTag);
- if (authoritativeZoneRecords)
- {
- if ((zoneInfo is not null) && (zoneInfo.Type == AuthZoneType.Primary))
- {
- IReadOnlyCollection<DnssecPrivateKey> dnssecPrivateKeys = zoneInfo.DnssecPrivateKeys;
- if (dnssecPrivateKeys is not null)
- {
- foreach (DnssecPrivateKey dnssecPrivateKey in dnssecPrivateKeys)
- {
- if (dnssecPrivateKey.KeyTag == rdata.ComputedKeyTag)
- {
- jsonWriter.WriteString("dnsKeyState", dnssecPrivateKey.State.ToString());
- if ((dnssecPrivateKey.KeyType == DnssecPrivateKeyType.KeySigningKey) && (dnssecPrivateKey.State == DnssecPrivateKeyState.Published))
- jsonWriter.WriteString("dnsKeyStateReadyBy", (zoneInfo.ApexZone as PrimaryZone).GetDnsKeyStateReadyBy(dnssecPrivateKey));
- break;
- }
- }
- }
- }
- if (rdata.Flags.HasFlag(DnsDnsKeyFlag.SecureEntryPoint))
- {
- jsonWriter.WritePropertyName("computedDigests");
- jsonWriter.WriteStartArray();
- {
- jsonWriter.WriteStartObject();
- jsonWriter.WriteString("digestType", "SHA256");
- jsonWriter.WriteString("digest", Convert.ToHexString(rdata.CreateDS(record.Name, DnssecDigestType.SHA256).Digest));
- jsonWriter.WriteEndObject();
- }
- {
- jsonWriter.WriteStartObject();
- jsonWriter.WriteString("digestType", "SHA384");
- jsonWriter.WriteString("digest", Convert.ToHexString(rdata.CreateDS(record.Name, DnssecDigestType.SHA384).Digest));
- jsonWriter.WriteEndObject();
- }
- jsonWriter.WriteEndArray();
- }
- }
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.NSEC3:
- {
- if (record.RDATA is DnsNSEC3RecordData rdata)
- {
- jsonWriter.WriteString("hashAlgorithm", rdata.HashAlgorithm.ToString());
- jsonWriter.WriteString("flags", rdata.Flags.ToString());
- jsonWriter.WriteNumber("iterations", rdata.Iterations);
- jsonWriter.WriteString("salt", Convert.ToHexString(rdata.Salt));
- jsonWriter.WriteString("nextHashedOwnerName", rdata.NextHashedOwnerName);
- jsonWriter.WritePropertyName("types");
- jsonWriter.WriteStartArray();
- foreach (DnsResourceRecordType type in rdata.Types)
- jsonWriter.WriteStringValue(type.ToString());
- jsonWriter.WriteEndArray();
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.NSEC3PARAM:
- {
- if (record.RDATA is DnsNSEC3PARAMRecordData rdata)
- {
- jsonWriter.WriteString("hashAlgorithm", rdata.HashAlgorithm.ToString());
- jsonWriter.WriteString("flags", rdata.Flags.ToString());
- jsonWriter.WriteNumber("iterations", rdata.Iterations);
- jsonWriter.WriteString("salt", Convert.ToHexString(rdata.Salt));
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.TLSA:
- {
- if (record.RDATA is DnsTLSARecordData rdata)
- {
- jsonWriter.WriteString("certificateUsage", rdata.CertificateUsage.ToString().Replace('_', '-'));
- jsonWriter.WriteString("selector", rdata.Selector.ToString());
- jsonWriter.WriteString("matchingType", rdata.MatchingType.ToString().Replace('_', '-'));
- jsonWriter.WriteString("certificateAssociationData", Convert.ToHexString(rdata.CertificateAssociationData));
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.CAA:
- {
- if (record.RDATA is DnsCAARecordData rdata)
- {
- jsonWriter.WriteNumber("flags", rdata.Flags);
- jsonWriter.WriteString("tag", rdata.Tag);
- jsonWriter.WriteString("value", rdata.Value);
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.ANAME:
- {
- if (record.RDATA is DnsANAMERecordData rdata)
- {
- jsonWriter.WriteString("aname", rdata.Domain.Length == 0 ? "." : rdata.Domain);
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- case DnsResourceRecordType.FWD:
- {
- if (record.RDATA is DnsForwarderRecordData rdata)
- {
- jsonWriter.WriteString("protocol", rdata.Protocol.ToString());
- jsonWriter.WriteString("forwarder", rdata.Forwarder);
- jsonWriter.WriteBoolean("dnssecValidation", rdata.DnssecValidation);
- jsonWriter.WriteString("proxyType", rdata.ProxyType.ToString());
- if (rdata.ProxyType != NetProxyType.None)
- {
- jsonWriter.WriteString("proxyAddress", rdata.ProxyAddress);
- jsonWriter.WriteNumber("proxyPort", rdata.ProxyPort);
- jsonWriter.WriteString("proxyUsername", rdata.ProxyUsername);
- jsonWriter.WriteString("proxyPassword", rdata.ProxyPassword);
- }
- }
- }
- break;
- case DnsResourceRecordType.APP:
- {
- if (record.RDATA is DnsApplicationRecordData rdata)
- {
- jsonWriter.WriteString("appName", rdata.AppName);
- jsonWriter.WriteString("classPath", rdata.ClassPath);
- jsonWriter.WriteString("data", rdata.Data);
- }
- }
- break;
- default:
- {
- if (record.RDATA is DnsUnknownRecordData)
- {
- using (MemoryStream mS = new MemoryStream())
- {
- record.RDATA.WriteTo(mS);
- jsonWriter.WriteString("value", Convert.ToBase64String(mS.ToArray()));
- }
- }
- else
- {
- jsonWriter.WriteString("dataType", record.RDATA.GetType().Name);
- jsonWriter.WriteString("data", record.RDATA.ToString());
- }
- }
- break;
- }
- jsonWriter.WriteEndObject();
- jsonWriter.WriteString("dnssecStatus", record.DnssecStatus.ToString());
- if (authoritativeZoneRecords)
- {
- AuthRecordInfo authRecordInfo = record.GetAuthRecordInfo();
- IReadOnlyList<DnsResourceRecord> glueRecords = authRecordInfo.GlueRecords;
- if (glueRecords is not null)
- {
- string glue = null;
- foreach (DnsResourceRecord glueRecord in glueRecords)
- {
- if (glue == null)
- glue = glueRecord.RDATA.ToString();
- else
- glue = glue + ", " + glueRecord.RDATA.ToString();
- }
- jsonWriter.WriteString("glueRecords", glue);
- }
- jsonWriter.WriteString("lastUsedOn", authRecordInfo.LastUsedOn);
- }
- else
- {
- CacheRecordInfo cacheRecordInfo = record.GetCacheRecordInfo();
- IReadOnlyList<DnsResourceRecord> glueRecords = cacheRecordInfo.GlueRecords;
- if (glueRecords is not null)
- {
- string glue = null;
- foreach (DnsResourceRecord glueRecord in glueRecords)
- {
- if (glue == null)
- glue = glueRecord.RDATA.ToString();
- else
- glue = glue + ", " + glueRecord.RDATA.ToString();
- }
- jsonWriter.WriteString("glueRecords", glue);
- }
- IReadOnlyList<DnsResourceRecord> rrsigRecords = cacheRecordInfo.RRSIGRecords;
- IReadOnlyList<DnsResourceRecord> nsecRecords = cacheRecordInfo.NSECRecords;
- if ((rrsigRecords is not null) || (nsecRecords is not null))
- {
- jsonWriter.WritePropertyName("dnssecRecords");
- jsonWriter.WriteStartArray();
- if (rrsigRecords is not null)
- {
- foreach (DnsResourceRecord rrsigRecord in rrsigRecords)
- jsonWriter.WriteStringValue(rrsigRecord.ToString());
- }
- if (nsecRecords is not null)
- {
- foreach (DnsResourceRecord nsecRecord in nsecRecords)
- jsonWriter.WriteStringValue(nsecRecord.ToString());
- }
- jsonWriter.WriteEndArray();
- }
- NetworkAddress eDnsClientSubnet = cacheRecordInfo.EDnsClientSubnet;
- if (eDnsClientSubnet is not null)
- {
- jsonWriter.WriteString("eDnsClientSubnet", eDnsClientSubnet.ToString());
- }
- jsonWriter.WriteString("lastUsedOn", cacheRecordInfo.LastUsedOn);
- }
- jsonWriter.WriteEndObject();
- }
- private static void WriteZoneInfoAsJson(AuthZoneInfo zoneInfo, Utf8JsonWriter jsonWriter)
- {
- jsonWriter.WriteStartObject();
- jsonWriter.WriteString("name", zoneInfo.Name);
- jsonWriter.WriteString("type", zoneInfo.Type.ToString());
- switch (zoneInfo.Type)
- {
- case AuthZoneType.Primary:
- jsonWriter.WriteBoolean("internal", zoneInfo.Internal);
- jsonWriter.WriteString("dnssecStatus", zoneInfo.DnssecStatus.ToString());
- if (!zoneInfo.Internal)
- jsonWriter.WriteBoolean("notifyFailed", zoneInfo.NotifyFailed);
- break;
- case AuthZoneType.Secondary:
- jsonWriter.WriteString("dnssecStatus", zoneInfo.DnssecStatus.ToString());
- jsonWriter.WriteString("expiry", zoneInfo.Expiry);
- jsonWriter.WriteBoolean("isExpired", zoneInfo.IsExpired);
- jsonWriter.WriteBoolean("notifyFailed", zoneInfo.NotifyFailed);
- jsonWriter.WriteBoolean("syncFailed", zoneInfo.SyncFailed);
- break;
- case AuthZoneType.Stub:
- jsonWriter.WriteString("expiry", zoneInfo.Expiry);
- jsonWriter.WriteBoolean("isExpired", zoneInfo.IsExpired);
- jsonWriter.WriteBoolean("syncFailed", zoneInfo.SyncFailed);
- break;
- }
- jsonWriter.WriteBoolean("disabled", zoneInfo.Disabled);
- jsonWriter.WriteEndObject();
- }
- #endregion
- #region public
- public void ListZones(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.View))
- throw new DnsWebServiceException("Access was denied.");
- HttpRequest request = context.Request;
- Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter();
- IReadOnlyList<AuthZoneInfo> zones;
- if (request.TryGetQueryOrForm("pageNumber", int.Parse, out int pageNumber))
- {
- int zonesPerPage = request.GetQueryOrForm("zonesPerPage", int.Parse, 10);
- AuthZoneManager.ZonesPage page = _dnsWebService.DnsServer.AuthZoneManager.GetZonesPage(pageNumber, zonesPerPage);
- zones = page.Zones;
- jsonWriter.WriteNumber("pageNumber", page.PageNumber);
- jsonWriter.WriteNumber("totalPages", page.TotalPages);
- jsonWriter.WriteNumber("totalZones", page.TotalZones);
- }
- else
- {
- zones = _dnsWebService.DnsServer.AuthZoneManager.GetAllZones();
- }
- jsonWriter.WritePropertyName("zones");
- jsonWriter.WriteStartArray();
- foreach (AuthZoneInfo zone in zones)
- {
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zone.Name, session.User, PermissionFlag.View))
- continue;
- WriteZoneInfoAsJson(zone, jsonWriter);
- }
- jsonWriter.WriteEndArray();
- }
- public async Task CreateZoneAsync(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- HttpRequest request = context.Request;
- string zoneName = request.GetQueryOrFormAlt("zone", "domain");
- if (zoneName.Contains('*'))
- throw new DnsWebServiceException("Domain name for a zone cannot contain wildcard character.");
- if (IPAddress.TryParse(zoneName, out IPAddress ipAddress))
- {
- zoneName = ipAddress.GetReverseDomain().ToLower();
- }
- else if (zoneName.Contains('/'))
- {
- string[] parts = zoneName.Split('/');
- if ((parts.Length == 2) && IPAddress.TryParse(parts[0], out ipAddress) && int.TryParse(parts[1], out int subnetMaskWidth))
- zoneName = Zone.GetReverseZone(ipAddress, subnetMaskWidth);
- }
- else if (zoneName.EndsWith("."))
- {
- zoneName = zoneName.Substring(0, zoneName.Length - 1);
- }
- AuthZoneType type = request.GetQueryOrFormEnum("type", AuthZoneType.Primary);
- AuthZoneInfo zoneInfo;
- switch (type)
- {
- case AuthZoneType.Primary:
- {
- zoneInfo = _dnsWebService.DnsServer.AuthZoneManager.CreatePrimaryZone(zoneName, _dnsWebService.DnsServer.ServerDomain, false);
- if (zoneInfo is null)
- throw new DnsWebServiceException("Zone already exists: " + zoneName);
- //set permissions
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.ADMINISTRATORS), PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.DNS_ADMINISTRATORS), PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SaveConfigFile();
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Authoritative primary zone was created: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name);
- }
- break;
- case AuthZoneType.Secondary:
- {
- string primaryNameServerAddresses = request.GetQueryOrForm("primaryNameServerAddresses", null);
- DnsTransportProtocol zoneTransferProtocol = request.GetQueryOrFormEnum("zoneTransferProtocol", DnsTransportProtocol.Tcp);
- string tsigKeyName = request.GetQueryOrForm("tsigKeyName", null);
- if (zoneTransferProtocol == DnsTransportProtocol.Quic)
- DnsWebService.ValidateQuicSupport();
- zoneInfo = await _dnsWebService.DnsServer.AuthZoneManager.CreateSecondaryZoneAsync(zoneName, primaryNameServerAddresses, zoneTransferProtocol, tsigKeyName);
- if (zoneInfo is null)
- throw new DnsWebServiceException("Zone already exists: " + zoneName);
- //set permissions
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.ADMINISTRATORS), PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.DNS_ADMINISTRATORS), PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SaveConfigFile();
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Authoritative secondary zone was created: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name);
- }
- break;
- case AuthZoneType.Stub:
- {
- string primaryNameServerAddresses = request.GetQueryOrForm("primaryNameServerAddresses", null);
- zoneInfo = await _dnsWebService.DnsServer.AuthZoneManager.CreateStubZoneAsync(zoneName, primaryNameServerAddresses);
- if (zoneInfo is null)
- throw new DnsWebServiceException("Zone already exists: " + zoneName);
- //set permissions
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.ADMINISTRATORS), PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.DNS_ADMINISTRATORS), PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SaveConfigFile();
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Stub zone was created: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name);
- }
- break;
- case AuthZoneType.Forwarder:
- {
- DnsTransportProtocol forwarderProtocol = request.GetQueryOrFormEnum("protocol", DnsTransportProtocol.Udp);
- string forwarder = request.GetQueryOrForm("forwarder");
- bool dnssecValidation = request.GetQueryOrForm("dnssecValidation", bool.Parse, false);
- NetProxyType proxyType = request.GetQueryOrFormEnum("proxyType", NetProxyType.None);
- string proxyAddress = null;
- ushort proxyPort = 0;
- string proxyUsername = null;
- string proxyPassword = null;
- if (proxyType != NetProxyType.None)
- {
- proxyAddress = request.GetQueryOrForm("proxyAddress");
- proxyPort = request.GetQueryOrForm("proxyPort", ushort.Parse);
- proxyUsername = request.QueryOrForm("proxyUsername");
- proxyPassword = request.QueryOrForm("proxyPassword");
- }
- switch (forwarderProtocol)
- {
- case DnsTransportProtocol.HttpsJson:
- forwarderProtocol = DnsTransportProtocol.Https;
- break;
- case DnsTransportProtocol.Quic:
- DnsWebService.ValidateQuicSupport();
- break;
- }
- zoneInfo = _dnsWebService.DnsServer.AuthZoneManager.CreateForwarderZone(zoneName, forwarderProtocol, forwarder, dnssecValidation, proxyType, proxyAddress, proxyPort, proxyUsername, proxyPassword, null);
- if (zoneInfo is null)
- throw new DnsWebServiceException("Zone already exists: " + zoneName);
- //set permissions
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.ADMINISTRATORS), PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, zoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.DNS_ADMINISTRATORS), PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SaveConfigFile();
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Forwarder zone was created: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name);
- }
- break;
- default:
- throw new NotSupportedException("Zone type not supported.");
- }
- //delete cache for this zone to allow rebuilding cache data as needed by stub or forwarder zones
- _dnsWebService.DnsServer.CacheZoneManager.DeleteZone(zoneInfo.Name);
- Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter();
- jsonWriter.WriteString("domain", string.IsNullOrEmpty(zoneInfo.Name) ? "." : zoneInfo.Name);
- }
- public void SignPrimaryZone(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- HttpRequest request = context.Request;
- string zoneName = request.GetQueryOrForm("zone").TrimEnd('.');
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete))
- throw new DnsWebServiceException("Access was denied.");
- string algorithm = request.GetQueryOrForm("algorithm");
- uint dnsKeyTtl = request.GetQueryOrForm<uint>("dnsKeyTtl", uint.Parse, 24 * 60 * 60);
- ushort zskRolloverDays = request.GetQueryOrForm<ushort>("zskRolloverDays", ushort.Parse, 90);
- bool useNSEC3 = false;
- string strNxProof = request.QueryOrForm("nxProof");
- if (!string.IsNullOrEmpty(strNxProof))
- {
- switch (strNxProof.ToUpper())
- {
- case "NSEC":
- useNSEC3 = false;
- break;
- case "NSEC3":
- useNSEC3 = true;
- break;
- default:
- throw new NotSupportedException("Non-existence proof type is not supported: " + strNxProof);
- }
- }
- ushort iterations = 0;
- byte saltLength = 0;
- if (useNSEC3)
- {
- iterations = request.GetQueryOrForm<ushort>("iterations", ushort.Parse, 0);
- saltLength = request.GetQueryOrForm<byte>("saltLength", byte.Parse, 0);
- }
- switch (algorithm.ToUpper())
- {
- case "RSA":
- string hashAlgorithm = request.GetQueryOrForm("hashAlgorithm");
- int kskKeySize = request.GetQueryOrForm("kskKeySize", int.Parse);
- int zskKeySize = request.GetQueryOrForm("zskKeySize", int.Parse);
- if (useNSEC3)
- _dnsWebService.DnsServer.AuthZoneManager.SignPrimaryZoneWithRsaNSEC3(zoneName, hashAlgorithm, kskKeySize, zskKeySize, iterations, saltLength, dnsKeyTtl, zskRolloverDays);
- else
- _dnsWebService.DnsServer.AuthZoneManager.SignPrimaryZoneWithRsaNSEC(zoneName, hashAlgorithm, kskKeySize, zskKeySize, dnsKeyTtl, zskRolloverDays);
- break;
- case "ECDSA":
- string curve = request.GetQueryOrForm("curve");
- if (useNSEC3)
- _dnsWebService.DnsServer.AuthZoneManager.SignPrimaryZoneWithEcdsaNSEC3(zoneName, curve, iterations, saltLength, dnsKeyTtl, zskRolloverDays);
- else
- _dnsWebService.DnsServer.AuthZoneManager.SignPrimaryZoneWithEcdsaNSEC(zoneName, curve, dnsKeyTtl, zskRolloverDays);
- break;
- default:
- throw new NotSupportedException("Algorithm is not supported: " + algorithm);
- }
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Primary zone was signed successfully: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneName);
- }
- public void UnsignPrimaryZone(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- string zoneName = context.Request.GetQueryOrForm("zone").TrimEnd('.');
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete))
- throw new DnsWebServiceException("Access was denied.");
- _dnsWebService.DnsServer.AuthZoneManager.UnsignPrimaryZone(zoneName);
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Primary zone was unsigned successfully: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneName);
- }
- public void GetPrimaryZoneDnssecProperties(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- string zoneName = context.Request.GetQueryOrForm("zone").TrimEnd('.');
- AuthZoneInfo zoneInfo = _dnsWebService.DnsServer.AuthZoneManager.GetAuthZoneInfo(zoneName);
- if (zoneInfo is null)
- throw new DnsWebServiceException("No such authoritative zone was found: " + zoneName);
- if (zoneInfo.Internal)
- throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone.");
- if (zoneInfo.Type != AuthZoneType.Primary)
- throw new DnsWebServiceException("The zone must be a primary zone.");
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.View))
- throw new DnsWebServiceException("Access was denied.");
- Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter();
- jsonWriter.WriteString("name", zoneInfo.Name);
- jsonWriter.WriteString("type", zoneInfo.Type.ToString());
- jsonWriter.WriteBoolean("internal", zoneInfo.Internal);
- jsonWriter.WriteBoolean("disabled", zoneInfo.Disabled);
- jsonWriter.WriteString("dnssecStatus", zoneInfo.DnssecStatus.ToString());
- if (zoneInfo.DnssecStatus == AuthZoneDnssecStatus.SignedWithNSEC3)
- {
- IReadOnlyList<DnsResourceRecord> nsec3ParamRecords = zoneInfo.GetApexRecords(DnsResourceRecordType.NSEC3PARAM);
- DnsNSEC3PARAMRecordData nsec3Param = nsec3ParamRecords[0].RDATA as DnsNSEC3PARAMRecordData;
- jsonWriter.WriteNumber("nsec3Iterations", nsec3Param.Iterations);
- jsonWriter.WriteNumber("nsec3SaltLength", nsec3Param.Salt.Length);
- }
- jsonWriter.WriteNumber("dnsKeyTtl", zoneInfo.DnsKeyTtl);
- jsonWriter.WritePropertyName("dnssecPrivateKeys");
- jsonWriter.WriteStartArray();
- IReadOnlyCollection<DnssecPrivateKey> dnssecPrivateKeys = zoneInfo.DnssecPrivateKeys;
- if (dnssecPrivateKeys is not null)
- {
- List<DnssecPrivateKey> sortedDnssecPrivateKey = new List<DnssecPrivateKey>(dnssecPrivateKeys);
- sortedDnssecPrivateKey.Sort(delegate (DnssecPrivateKey key1, DnssecPrivateKey key2)
- {
- int value = key1.KeyType.CompareTo(key2.KeyType);
- if (value == 0)
- value = key1.StateChangedOn.CompareTo(key2.StateChangedOn);
- return value;
- });
- foreach (DnssecPrivateKey dnssecPrivateKey in sortedDnssecPrivateKey)
- {
- jsonWriter.WriteStartObject();
- jsonWriter.WriteNumber("keyTag", dnssecPrivateKey.KeyTag);
- jsonWriter.WriteString("keyType", dnssecPrivateKey.KeyType.ToString());
- switch (dnssecPrivateKey.Algorithm)
- {
- case DnssecAlgorithm.RSAMD5:
- case DnssecAlgorithm.RSASHA1:
- case DnssecAlgorithm.RSASHA1_NSEC3_SHA1:
- case DnssecAlgorithm.RSASHA256:
- case DnssecAlgorithm.RSASHA512:
- jsonWriter.WriteString("algorithm", dnssecPrivateKey.Algorithm.ToString() + " (" + (dnssecPrivateKey as DnssecRsaPrivateKey).KeySize + " bits)");
- break;
- default:
- jsonWriter.WriteString("algorithm", dnssecPrivateKey.Algorithm.ToString());
- break;
- }
- jsonWriter.WriteString("state", dnssecPrivateKey.State.ToString());
- jsonWriter.WriteString("stateChangedOn", dnssecPrivateKey.StateChangedOn);
- if ((dnssecPrivateKey.KeyType == DnssecPrivateKeyType.KeySigningKey) && (dnssecPrivateKey.State == DnssecPrivateKeyState.Published))
- jsonWriter.WriteString("stateReadyBy", (zoneInfo.ApexZone as PrimaryZone).GetDnsKeyStateReadyBy(dnssecPrivateKey));
- jsonWriter.WriteBoolean("isRetiring", dnssecPrivateKey.IsRetiring);
- jsonWriter.WriteNumber("rolloverDays", dnssecPrivateKey.RolloverDays);
- jsonWriter.WriteEndObject();
- }
- }
- jsonWriter.WriteEndArray();
- }
- public void ConvertPrimaryZoneToNSEC(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- string zoneName = context.Request.GetQueryOrForm("zone").TrimEnd('.');
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete))
- throw new DnsWebServiceException("Access was denied.");
- _dnsWebService.DnsServer.AuthZoneManager.ConvertPrimaryZoneToNSEC(zoneName);
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Primary zone was converted to NSEC successfully: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneName);
- }
- public void ConvertPrimaryZoneToNSEC3(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- HttpRequest request = context.Request;
- string zoneName = request.GetQueryOrForm("zone").TrimEnd('.');
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete))
- throw new DnsWebServiceException("Access was denied.");
- ushort iterations = request.GetQueryOrForm<ushort>("iterations", ushort.Parse, 0);
- byte saltLength = request.GetQueryOrForm<byte>("saltLength", byte.Parse, 0);
- _dnsWebService.DnsServer.AuthZoneManager.ConvertPrimaryZoneToNSEC3(zoneName, iterations, saltLength);
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Primary zone was converted to NSEC3 successfully: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneName);
- }
- public void UpdatePrimaryZoneNSEC3Parameters(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- HttpRequest request = context.Request;
- string zoneName = request.GetQueryOrForm("zone").TrimEnd('.');
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete))
- throw new DnsWebServiceException("Access was denied.");
- ushort iterations = request.GetQueryOrForm<ushort>("iterations", ushort.Parse, 0);
- byte saltLength = request.GetQueryOrForm<byte>("saltLength", byte.Parse, 0);
- _dnsWebService.DnsServer.AuthZoneManager.UpdatePrimaryZoneNSEC3Parameters(zoneName, iterations, saltLength);
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Primary zone NSEC3 parameters were updated successfully: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneName);
- }
- public void UpdatePrimaryZoneDnssecDnsKeyTtl(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- HttpRequest request = context.Request;
- string zoneName = request.GetQueryOrForm("zone").TrimEnd('.');
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete))
- throw new DnsWebServiceException("Access was denied.");
- uint dnsKeyTtl = request.GetQueryOrForm("ttl", uint.Parse);
- _dnsWebService.DnsServer.AuthZoneManager.UpdatePrimaryZoneDnsKeyTtl(zoneName, dnsKeyTtl);
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Primary zone DNSKEY TTL was updated successfully: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneName);
- }
- public void GenerateAndAddPrimaryZoneDnssecPrivateKey(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- HttpRequest request = context.Request;
- string zoneName = request.GetQueryOrForm("zone").TrimEnd('.');
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete))
- throw new DnsWebServiceException("Access was denied.");
- DnssecPrivateKeyType keyType = request.GetQueryOrFormEnum<DnssecPrivateKeyType>("keyType");
- ushort rolloverDays = request.GetQueryOrForm("rolloverDays", ushort.Parse, (ushort)(keyType == DnssecPrivateKeyType.ZoneSigningKey ? 90 : 0));
- string algorithm = request.GetQueryOrForm("algorithm");
- switch (algorithm.ToUpper())
- {
- case "RSA":
- string hashAlgorithm = request.GetQueryOrForm("hashAlgorithm");
- int keySize = request.GetQueryOrForm("keySize", int.Parse);
- _dnsWebService.DnsServer.AuthZoneManager.GenerateAndAddPrimaryZoneDnssecRsaPrivateKey(zoneName, keyType, hashAlgorithm, keySize, rolloverDays);
- break;
- case "ECDSA":
- string curve = request.GetQueryOrForm("curve");
- _dnsWebService.DnsServer.AuthZoneManager.GenerateAndAddPrimaryZoneDnssecEcdsaPrivateKey(zoneName, keyType, curve, rolloverDays);
- break;
- default:
- throw new NotSupportedException("Algorithm is not supported: " + algorithm);
- }
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] DNSSEC private key was generated and added to the primary zone successfully: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneName);
- }
- public void UpdatePrimaryZoneDnssecPrivateKey(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- HttpRequest request = context.Request;
- string zoneName = request.GetQueryOrForm("zone").TrimEnd('.');
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete))
- throw new DnsWebServiceException("Access was denied.");
- ushort keyTag = request.GetQueryOrForm("keyTag", ushort.Parse);
- ushort rolloverDays = request.GetQueryOrForm("rolloverDays", ushort.Parse);
- _dnsWebService.DnsServer.AuthZoneManager.UpdatePrimaryZoneDnssecPrivateKey(zoneName, keyTag, rolloverDays);
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Primary zone DNSSEC private key config was updated successfully: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneName);
- }
- public void DeletePrimaryZoneDnssecPrivateKey(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- HttpRequest request = context.Request;
- string zoneName = request.GetQueryOrForm("zone").TrimEnd('.');
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete))
- throw new DnsWebServiceException("Access was denied.");
- ushort keyTag = request.GetQueryOrForm("keyTag", ushort.Parse);
- _dnsWebService.DnsServer.AuthZoneManager.DeletePrimaryZoneDnssecPrivateKey(zoneName, keyTag);
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] DNSSEC private key was deleted from primary zone successfully: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneName);
- }
- public void PublishAllGeneratedPrimaryZoneDnssecPrivateKeys(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- string zoneName = context.Request.GetQueryOrForm("zone").TrimEnd('.');
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete))
- throw new DnsWebServiceException("Access was denied.");
- _dnsWebService.DnsServer.AuthZoneManager.PublishAllGeneratedPrimaryZoneDnssecPrivateKeys(zoneName);
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] All DNSSEC private keys from the primary zone were published successfully: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneName);
- }
- public void RolloverPrimaryZoneDnsKey(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- HttpRequest request = context.Request;
- string zoneName = request.GetQueryOrForm("zone").TrimEnd('.');
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete))
- throw new DnsWebServiceException("Access was denied.");
- ushort keyTag = request.GetQueryOrForm("keyTag", ushort.Parse);
- _dnsWebService.DnsServer.AuthZoneManager.RolloverPrimaryZoneDnsKey(zoneName, keyTag);
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] The DNSKEY (" + keyTag + ") from the primary zone was rolled over successfully: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneName);
- }
- public void RetirePrimaryZoneDnsKey(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- HttpRequest request = context.Request;
- string zoneName = request.GetQueryOrForm("zone").TrimEnd('.');
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneName, session.User, PermissionFlag.Delete))
- throw new DnsWebServiceException("Access was denied.");
- ushort keyTag = request.GetQueryOrForm("keyTag", ushort.Parse);
- _dnsWebService.DnsServer.AuthZoneManager.RetirePrimaryZoneDnsKey(zoneName, keyTag);
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] The DNSKEY (" + keyTag + ") from the primary zone was retired successfully: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneName);
- }
- public void DeleteZone(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Delete))
- throw new DnsWebServiceException("Access was denied.");
- string zoneName = context.Request.GetQueryOrFormAlt("zone", "domain").TrimEnd('.');
- AuthZoneInfo zoneInfo = _dnsWebService.DnsServer.AuthZoneManager.GetAuthZoneInfo(zoneName);
- if (zoneInfo is null)
- throw new DnsWebServiceException("No such authoritative zone was found: " + zoneName);
- if (zoneInfo.Internal)
- throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone.");
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.Delete))
- throw new DnsWebServiceException("Access was denied.");
- if (!_dnsWebService.DnsServer.AuthZoneManager.DeleteZone(zoneInfo.Name))
- throw new DnsWebServiceException("Failed to delete the zone: " + zoneInfo.Name);
- _dnsWebService._authManager.RemoveAllPermissions(PermissionSection.Zones, zoneInfo.Name);
- _dnsWebService._authManager.SaveConfigFile();
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] " + zoneInfo.Type.ToString() + " zone was deleted: " + zoneName);
- _dnsWebService.DnsServer.AuthZoneManager.DeleteZoneFile(zoneInfo.Name);
- }
- public void EnableZone(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- string zoneName = context.Request.GetQueryOrFormAlt("zone", "domain").TrimEnd('.');
- AuthZoneInfo zoneInfo = _dnsWebService.DnsServer.AuthZoneManager.GetAuthZoneInfo(zoneName);
- if (zoneInfo is null)
- throw new DnsWebServiceException("No such authoritative zone was found: " + zoneName);
- if (zoneInfo.Internal)
- throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone.");
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- zoneInfo.Disabled = false;
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] " + zoneInfo.Type.ToString() + " zone was enabled: " + zoneInfo.Name);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name);
- //delete cache for this zone to allow rebuilding cache data as needed by stub or forwarder zones
- _dnsWebService.DnsServer.CacheZoneManager.DeleteZone(zoneInfo.Name);
- }
- public void DisableZone(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- string zoneName = context.Request.GetQueryOrFormAlt("zone", "domain").TrimEnd('.');
- AuthZoneInfo zoneInfo = _dnsWebService.DnsServer.AuthZoneManager.GetAuthZoneInfo(zoneName);
- if (zoneInfo is null)
- throw new DnsWebServiceException("No such authoritative zone was found: " + zoneName);
- if (zoneInfo.Internal)
- throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone.");
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- zoneInfo.Disabled = true;
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] " + zoneInfo.Type.ToString() + " zone was disabled: " + zoneInfo.Name);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name);
- }
- public void GetZoneOptions(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- HttpRequest request = context.Request;
- string zoneName = request.GetQueryOrFormAlt("zone", "domain").TrimEnd('.');
- bool includeAvailableTsigKeyNames = request.GetQueryOrForm("includeAvailableTsigKeyNames", bool.Parse, false);
- AuthZoneInfo zoneInfo = _dnsWebService.DnsServer.AuthZoneManager.GetAuthZoneInfo(zoneName);
- if (zoneInfo is null)
- throw new DnsWebServiceException("No such authoritative zone was found: " + zoneName);
- if (zoneInfo.Internal)
- throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone.");
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.View))
- throw new DnsWebServiceException("Access was denied.");
- Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter();
- jsonWriter.WriteString("name", zoneInfo.Name);
- jsonWriter.WriteString("type", zoneInfo.Type.ToString());
- switch (zoneInfo.Type)
- {
- case AuthZoneType.Primary:
- jsonWriter.WriteBoolean("internal", zoneInfo.Internal);
- jsonWriter.WriteString("dnssecStatus", zoneInfo.DnssecStatus.ToString());
- break;
- case AuthZoneType.Secondary:
- jsonWriter.WriteString("dnssecStatus", zoneInfo.DnssecStatus.ToString());
- break;
- }
- jsonWriter.WriteBoolean("disabled", zoneInfo.Disabled);
- switch (zoneInfo.Type)
- {
- case AuthZoneType.Primary:
- case AuthZoneType.Secondary:
- jsonWriter.WriteString("zoneTransfer", zoneInfo.ZoneTransfer.ToString());
- jsonWriter.WritePropertyName("zoneTransferNameServers");
- {
- jsonWriter.WriteStartArray();
- if (zoneInfo.ZoneTransferNameServers is not null)
- {
- foreach (IPAddress nameServer in zoneInfo.ZoneTransferNameServers)
- jsonWriter.WriteStringValue(nameServer.ToString());
- }
- jsonWriter.WriteEndArray();
- }
- jsonWriter.WritePropertyName("zoneTransferTsigKeyNames");
- {
- jsonWriter.WriteStartArray();
- if (zoneInfo.ZoneTransferTsigKeyNames is not null)
- {
- foreach (KeyValuePair<string, object> tsigKeyName in zoneInfo.ZoneTransferTsigKeyNames)
- jsonWriter.WriteStringValue(tsigKeyName.Key);
- }
- jsonWriter.WriteEndArray();
- }
- jsonWriter.WriteString("notify", zoneInfo.Notify.ToString());
- jsonWriter.WritePropertyName("notifyNameServers");
- {
- jsonWriter.WriteStartArray();
- if (zoneInfo.NotifyNameServers is not null)
- {
- foreach (IPAddress nameServer in zoneInfo.NotifyNameServers)
- jsonWriter.WriteStringValue(nameServer.ToString());
- }
- jsonWriter.WriteEndArray();
- }
- break;
- }
- switch (zoneInfo.Type)
- {
- case AuthZoneType.Primary:
- jsonWriter.WriteString("update", zoneInfo.Update.ToString());
- jsonWriter.WritePropertyName("updateIpAddresses");
- {
- jsonWriter.WriteStartArray();
- if (zoneInfo.UpdateIpAddresses is not null)
- {
- foreach (IPAddress updateIpAddress in zoneInfo.UpdateIpAddresses)
- jsonWriter.WriteStringValue(updateIpAddress.ToString());
- }
- jsonWriter.WriteEndArray();
- }
- jsonWriter.WritePropertyName("updateSecurityPolicies");
- {
- jsonWriter.WriteStartArray();
- if (zoneInfo.UpdateSecurityPolicies is not null)
- {
- foreach (KeyValuePair<string, IReadOnlyDictionary<string, IReadOnlyList<DnsResourceRecordType>>> updateSecurityPolicy in zoneInfo.UpdateSecurityPolicies)
- {
- foreach (KeyValuePair<string, IReadOnlyList<DnsResourceRecordType>> policy in updateSecurityPolicy.Value)
- {
- jsonWriter.WriteStartObject();
- jsonWriter.WriteString("tsigKeyName", updateSecurityPolicy.Key);
- jsonWriter.WriteString("domain", policy.Key);
- jsonWriter.WritePropertyName("allowedTypes");
- jsonWriter.WriteStartArray();
- foreach (DnsResourceRecordType allowedType in policy.Value)
- jsonWriter.WriteStringValue(allowedType.ToString());
- jsonWriter.WriteEndArray();
- jsonWriter.WriteEndObject();
- }
- }
- }
- jsonWriter.WriteEndArray();
- }
- break;
- }
- if (includeAvailableTsigKeyNames)
- {
- jsonWriter.WritePropertyName("availableTsigKeyNames");
- {
- jsonWriter.WriteStartArray();
- if (_dnsWebService.DnsServer.TsigKeys is not null)
- {
- foreach (KeyValuePair<string, TsigKey> tsigKey in _dnsWebService.DnsServer.TsigKeys)
- jsonWriter.WriteStringValue(tsigKey.Key);
- }
- jsonWriter.WriteEndArray();
- }
- }
- }
- public void SetZoneOptions(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- HttpRequest request = context.Request;
- string zoneName = request.GetQueryOrFormAlt("zone", "domain").TrimEnd('.');
- AuthZoneInfo zoneInfo = _dnsWebService.DnsServer.AuthZoneManager.GetAuthZoneInfo(zoneName);
- if (zoneInfo is null)
- throw new DnsWebServiceException("No such authoritative zone was found: " + zoneName);
- if (zoneInfo.Internal)
- throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone.");
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.Delete))
- throw new DnsWebServiceException("Access was denied.");
- if (request.TryGetQueryOrForm("disabled", bool.Parse, out bool disabled))
- zoneInfo.Disabled = disabled;
- switch (zoneInfo.Type)
- {
- case AuthZoneType.Primary:
- case AuthZoneType.Secondary:
- if (request.TryGetQueryOrFormEnum("zoneTransfer", out AuthZoneTransfer zoneTransfer))
- zoneInfo.ZoneTransfer = zoneTransfer;
- string strZoneTransferNameServers = request.QueryOrForm("zoneTransferNameServers");
- if (strZoneTransferNameServers is not null)
- {
- if ((strZoneTransferNameServers.Length == 0) || strZoneTransferNameServers.Equals("false", StringComparison.OrdinalIgnoreCase))
- zoneInfo.ZoneTransferNameServers = null;
- else
- zoneInfo.ZoneTransferNameServers = strZoneTransferNameServers.Split(IPAddress.Parse, ',');
- }
- string strZoneTransferTsigKeyNames = request.QueryOrForm("zoneTransferTsigKeyNames");
- if (strZoneTransferTsigKeyNames is not null)
- {
- if ((strZoneTransferTsigKeyNames.Length == 0) || strZoneTransferTsigKeyNames.Equals("false", StringComparison.OrdinalIgnoreCase))
- {
- zoneInfo.ZoneTransferTsigKeyNames = null;
- }
- else
- {
- string[] strZoneTransferTsigKeyNamesParts = strZoneTransferTsigKeyNames.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
- Dictionary<string, object> zoneTransferTsigKeyNames = new Dictionary<string, object>(strZoneTransferTsigKeyNamesParts.Length);
- for (int i = 0; i < strZoneTransferTsigKeyNamesParts.Length; i++)
- zoneTransferTsigKeyNames.Add(strZoneTransferTsigKeyNamesParts[i].ToLower(), null);
- zoneInfo.ZoneTransferTsigKeyNames = zoneTransferTsigKeyNames;
- }
- }
- if (request.TryGetQueryOrFormEnum("notify", out AuthZoneNotify notify))
- zoneInfo.Notify = notify;
- string strNotifyNameServers = request.QueryOrForm("notifyNameServers");
- if (strNotifyNameServers is not null)
- {
- if ((strNotifyNameServers.Length == 0) || strNotifyNameServers.Equals("false", StringComparison.OrdinalIgnoreCase))
- zoneInfo.NotifyNameServers = null;
- else
- zoneInfo.NotifyNameServers = strNotifyNameServers.Split(IPAddress.Parse, ',');
- }
- break;
- }
- switch (zoneInfo.Type)
- {
- case AuthZoneType.Primary:
- if (request.TryGetQueryOrFormEnum("update", out AuthZoneUpdate update))
- zoneInfo.Update = update;
- string strUpdateIpAddresses = request.QueryOrForm("updateIpAddresses");
- if (strUpdateIpAddresses is not null)
- {
- if ((strUpdateIpAddresses.Length == 0) || strUpdateIpAddresses.Equals("false", StringComparison.OrdinalIgnoreCase))
- zoneInfo.UpdateIpAddresses = null;
- else
- zoneInfo.UpdateIpAddresses = strUpdateIpAddresses.Split(IPAddress.Parse, ',');
- }
- string strUpdateSecurityPolicies = request.QueryOrForm("updateSecurityPolicies");
- if (strUpdateSecurityPolicies is not null)
- {
- if ((strUpdateSecurityPolicies.Length == 0) || strUpdateSecurityPolicies.Equals("false", StringComparison.OrdinalIgnoreCase))
- {
- zoneInfo.UpdateSecurityPolicies = null;
- }
- else
- {
- string[] strUpdateSecurityPoliciesParts = strUpdateSecurityPolicies.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
- Dictionary<string, IReadOnlyDictionary<string, IReadOnlyList<DnsResourceRecordType>>> updateSecurityPolicies = new Dictionary<string, IReadOnlyDictionary<string, IReadOnlyList<DnsResourceRecordType>>>(strUpdateSecurityPoliciesParts.Length);
- for (int i = 0; i < strUpdateSecurityPoliciesParts.Length; i += 3)
- {
- string tsigKeyName = strUpdateSecurityPoliciesParts[i].ToLower();
- string domain = strUpdateSecurityPoliciesParts[i + 1].ToLower();
- string strTypes = strUpdateSecurityPoliciesParts[i + 2];
- if (!domain.Equals(zoneInfo.Name, StringComparison.OrdinalIgnoreCase) && !domain.EndsWith("." + zoneInfo.Name, StringComparison.OrdinalIgnoreCase))
- throw new DnsWebServiceException("Cannot set Dynamic Updates security policies: the domain '" + domain + "' must be part of the current zone.");
- if (!updateSecurityPolicies.TryGetValue(tsigKeyName, out IReadOnlyDictionary<string, IReadOnlyList<DnsResourceRecordType>> policyMap))
- {
- policyMap = new Dictionary<string, IReadOnlyList<DnsResourceRecordType>>();
- updateSecurityPolicies.Add(tsigKeyName, policyMap);
- }
- if (!policyMap.TryGetValue(domain, out IReadOnlyList<DnsResourceRecordType> types))
- {
- types = new List<DnsResourceRecordType>();
- (policyMap as Dictionary<string, IReadOnlyList<DnsResourceRecordType>>).Add(domain, types);
- }
- foreach (string strType in strTypes.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries))
- (types as List<DnsResourceRecordType>).Add(Enum.Parse<DnsResourceRecordType>(strType, true));
- }
- zoneInfo.UpdateSecurityPolicies = updateSecurityPolicies;
- }
- }
- break;
- }
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] " + zoneInfo.Type.ToString() + " zone options were updated successfully: " + zoneInfo.Name);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name);
- }
- public void ResyncZone(HttpContext context)
- {
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- string zoneName = context.Request.GetQueryOrFormAlt("zone", "domain").TrimEnd('.');
- AuthZoneInfo zoneInfo = _dnsWebService.DnsServer.AuthZoneManager.GetAuthZoneInfo(zoneName);
- if (zoneInfo is null)
- throw new DnsWebServiceException("No such authoritative zone was found: " + zoneName);
- if (zoneInfo.Internal)
- throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone.");
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- switch (zoneInfo.Type)
- {
- case AuthZoneType.Secondary:
- case AuthZoneType.Stub:
- zoneInfo.TriggerResync();
- break;
- default:
- throw new DnsWebServiceException("Only Secondary and Stub zones support resync.");
- }
- }
- public void AddRecord(HttpContext context)
- {
- HttpRequest request = context.Request;
- string domain = request.GetQueryOrForm("domain").TrimEnd('.');
- string zoneName = request.QueryOrForm("zone");
- if (zoneName is not null)
- zoneName = zoneName.TrimEnd('.');
- AuthZoneInfo zoneInfo = _dnsWebService.DnsServer.AuthZoneManager.FindAuthZoneInfo(string.IsNullOrEmpty(zoneName) ? domain : zoneName);
- if (zoneInfo is null)
- throw new DnsWebServiceException("No such authoritative zone was found: " + domain);
- if (zoneInfo.Internal)
- throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone.");
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- DnsResourceRecordType type = request.GetQueryOrFormEnum<DnsResourceRecordType>("type");
- uint ttl = request.GetQueryOrForm("ttl", uint.Parse, _defaultRecordTtl);
- bool overwrite = request.GetQueryOrForm("overwrite", bool.Parse, false);
- string comments = request.QueryOrForm("comments");
- DnsResourceRecord newRecord;
- switch (type)
- {
- case DnsResourceRecordType.A:
- case DnsResourceRecordType.AAAA:
- {
- string strIPAddress = request.GetQueryOrFormAlt("ipAddress", "value");
- IPAddress ipAddress;
- if (strIPAddress.Equals("request-ip-address"))
- ipAddress = context.GetRemoteEndPoint().Address;
- else
- ipAddress = IPAddress.Parse(strIPAddress);
- bool ptr = request.GetQueryOrForm("ptr", bool.Parse, false);
- if (ptr)
- {
- string ptrDomain = Zone.GetReverseZone(ipAddress, type == DnsResourceRecordType.A ? 32 : 128);
- AuthZoneInfo reverseZoneInfo = _dnsWebService.DnsServer.AuthZoneManager.FindAuthZoneInfo(ptrDomain);
- if (reverseZoneInfo is null)
- {
- bool createPtrZone = request.GetQueryOrForm("createPtrZone", bool.Parse, false);
- if (!createPtrZone)
- throw new DnsServerException("No reverse zone available to add PTR record.");
- string ptrZone = Zone.GetReverseZone(ipAddress, type == DnsResourceRecordType.A ? 24 : 64);
- reverseZoneInfo = _dnsWebService.DnsServer.AuthZoneManager.CreatePrimaryZone(ptrZone, _dnsWebService.DnsServer.ServerDomain, false);
- if (reverseZoneInfo == null)
- throw new DnsServerException("Failed to create reverse zone to add PTR record: " + ptrZone);
- //set permissions
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, reverseZoneInfo.Name, session.User, PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, reverseZoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.ADMINISTRATORS), PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, reverseZoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.DNS_ADMINISTRATORS), PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SaveConfigFile();
- }
- if (reverseZoneInfo.Internal)
- throw new DnsServerException("Reverse zone '" + reverseZoneInfo.Name + "' is an internal zone.");
- if (reverseZoneInfo.Type != AuthZoneType.Primary)
- throw new DnsServerException("Reverse zone '" + reverseZoneInfo.Name + "' is not a primary zone.");
- _dnsWebService.DnsServer.AuthZoneManager.SetRecords(reverseZoneInfo.Name, ptrDomain, DnsResourceRecordType.PTR, ttl, new DnsPTRRecordData[] { new DnsPTRRecordData(domain) });
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(reverseZoneInfo.Name);
- }
- if (type == DnsResourceRecordType.A)
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsARecordData(ipAddress));
- else
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsAAAARecordData(ipAddress));
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- if (overwrite)
- _dnsWebService.DnsServer.AuthZoneManager.SetRecord(zoneInfo.Name, newRecord);
- else
- _dnsWebService.DnsServer.AuthZoneManager.AddRecord(zoneInfo.Name, newRecord);
- }
- break;
- case DnsResourceRecordType.NS:
- {
- string nameServer = request.GetQueryOrFormAlt("nameServer", "value").TrimEnd('.');
- string glueAddresses = request.GetQueryOrForm("glue", null);
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsNSRecordData(nameServer));
- if (!string.IsNullOrEmpty(glueAddresses))
- newRecord.SetGlueRecords(glueAddresses);
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- if (overwrite)
- _dnsWebService.DnsServer.AuthZoneManager.SetRecord(zoneInfo.Name, newRecord);
- else
- _dnsWebService.DnsServer.AuthZoneManager.AddRecord(zoneInfo.Name, newRecord);
- }
- break;
- case DnsResourceRecordType.CNAME:
- {
- if (!overwrite)
- {
- IReadOnlyList<DnsResourceRecord> existingRecords = _dnsWebService.DnsServer.AuthZoneManager.GetRecords(zoneInfo.Name, domain, type);
- if (existingRecords.Count > 0)
- throw new DnsWebServiceException("Record already exists. Use overwrite option if you wish to overwrite existing records.");
- }
- string cname = request.GetQueryOrFormAlt("cname", "value").TrimEnd('.');
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsCNAMERecordData(cname));
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.SetRecord(zoneInfo.Name, newRecord);
- }
- break;
- case DnsResourceRecordType.PTR:
- {
- string ptrName = request.GetQueryOrFormAlt("ptrName", "value").TrimEnd('.');
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsPTRRecordData(ptrName));
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- if (overwrite)
- _dnsWebService.DnsServer.AuthZoneManager.SetRecord(zoneInfo.Name, newRecord);
- else
- _dnsWebService.DnsServer.AuthZoneManager.AddRecord(zoneInfo.Name, newRecord);
- }
- break;
- case DnsResourceRecordType.MX:
- {
- ushort preference = request.GetQueryOrForm("preference", ushort.Parse);
- string exchange = request.GetQueryOrFormAlt("exchange", "value").TrimEnd('.');
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsMXRecordData(preference, exchange));
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- if (overwrite)
- _dnsWebService.DnsServer.AuthZoneManager.SetRecord(zoneInfo.Name, newRecord);
- else
- _dnsWebService.DnsServer.AuthZoneManager.AddRecord(zoneInfo.Name, newRecord);
- }
- break;
- case DnsResourceRecordType.TXT:
- {
- string text = request.GetQueryOrFormAlt("text", "value");
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsTXTRecordData(text));
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- if (overwrite)
- _dnsWebService.DnsServer.AuthZoneManager.SetRecord(zoneInfo.Name, newRecord);
- else
- _dnsWebService.DnsServer.AuthZoneManager.AddRecord(zoneInfo.Name, newRecord);
- }
- break;
- case DnsResourceRecordType.SRV:
- {
- ushort priority = request.GetQueryOrForm("priority", ushort.Parse);
- ushort weight = request.GetQueryOrForm("weight", ushort.Parse);
- ushort port = request.GetQueryOrForm("port", ushort.Parse);
- string target = request.GetQueryOrFormAlt("target", "value").TrimEnd('.');
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsSRVRecordData(priority, weight, port, target));
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- if (overwrite)
- _dnsWebService.DnsServer.AuthZoneManager.SetRecord(zoneInfo.Name, newRecord);
- else
- _dnsWebService.DnsServer.AuthZoneManager.AddRecord(zoneInfo.Name, newRecord);
- }
- break;
- case DnsResourceRecordType.DNAME:
- {
- if (!overwrite)
- {
- IReadOnlyList<DnsResourceRecord> existingRecords = _dnsWebService.DnsServer.AuthZoneManager.GetRecords(zoneInfo.Name, domain, type);
- if (existingRecords.Count > 0)
- throw new DnsWebServiceException("Record already exists. Use overwrite option if you wish to overwrite existing records.");
- }
- string dname = request.GetQueryOrFormAlt("dname", "value").TrimEnd('.');
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsDNAMERecordData(dname));
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.SetRecord(zoneInfo.Name, newRecord);
- }
- break;
- case DnsResourceRecordType.DS:
- {
- ushort keyTag = request.GetQueryOrForm("keyTag", ushort.Parse);
- DnssecAlgorithm algorithm = Enum.Parse<DnssecAlgorithm>(request.GetQueryOrForm("algorithm").Replace('-', '_'), true);
- DnssecDigestType digestType = Enum.Parse<DnssecDigestType>(request.GetQueryOrForm("digestType").Replace('-', '_'), true);
- byte[] digest = request.GetQueryOrFormAlt("digest", "value", Convert.FromHexString);
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsDSRecordData(keyTag, algorithm, digestType, digest));
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- if (overwrite)
- _dnsWebService.DnsServer.AuthZoneManager.SetRecord(zoneInfo.Name, newRecord);
- else
- _dnsWebService.DnsServer.AuthZoneManager.AddRecord(zoneInfo.Name, newRecord);
- }
- break;
- case DnsResourceRecordType.SSHFP:
- {
- DnsSSHFPAlgorithm sshfpAlgorithm = request.GetQueryOrFormEnum<DnsSSHFPAlgorithm>("sshfpAlgorithm");
- DnsSSHFPFingerprintType sshfpFingerprintType = request.GetQueryOrFormEnum<DnsSSHFPFingerprintType>("sshfpFingerprintType");
- byte[] sshfpFingerprint = request.GetQueryOrForm("sshfpFingerprint", Convert.FromHexString);
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsSSHFPRecordData(sshfpAlgorithm, sshfpFingerprintType, sshfpFingerprint));
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- if (overwrite)
- _dnsWebService.DnsServer.AuthZoneManager.SetRecord(zoneInfo.Name, newRecord);
- else
- _dnsWebService.DnsServer.AuthZoneManager.AddRecord(zoneInfo.Name, newRecord);
- }
- break;
- case DnsResourceRecordType.TLSA:
- {
- DnsTLSACertificateUsage tlsaCertificateUsage = Enum.Parse<DnsTLSACertificateUsage>(request.GetQueryOrForm("tlsaCertificateUsage").Replace('-', '_'), true);
- DnsTLSASelector tlsaSelector = request.GetQueryOrFormEnum<DnsTLSASelector>("tlsaSelector");
- DnsTLSAMatchingType tlsaMatchingType = Enum.Parse<DnsTLSAMatchingType>(request.GetQueryOrForm("tlsaMatchingType").Replace('-', '_'), true);
- string tlsaCertificateAssociationData = request.GetQueryOrForm("tlsaCertificateAssociationData");
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsTLSARecordData(tlsaCertificateUsage, tlsaSelector, tlsaMatchingType, tlsaCertificateAssociationData));
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- if (overwrite)
- _dnsWebService.DnsServer.AuthZoneManager.SetRecord(zoneInfo.Name, newRecord);
- else
- _dnsWebService.DnsServer.AuthZoneManager.AddRecord(zoneInfo.Name, newRecord);
- }
- break;
- case DnsResourceRecordType.CAA:
- {
- byte flags = request.GetQueryOrForm("flags", byte.Parse);
- string tag = request.GetQueryOrForm("tag");
- string value = request.GetQueryOrForm("value");
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsCAARecordData(flags, tag, value));
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- if (overwrite)
- _dnsWebService.DnsServer.AuthZoneManager.SetRecord(zoneInfo.Name, newRecord);
- else
- _dnsWebService.DnsServer.AuthZoneManager.AddRecord(zoneInfo.Name, newRecord);
- }
- break;
- case DnsResourceRecordType.ANAME:
- {
- string aname = request.GetQueryOrFormAlt("aname", "value").TrimEnd('.');
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsANAMERecordData(aname));
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- if (overwrite)
- _dnsWebService.DnsServer.AuthZoneManager.SetRecord(zoneInfo.Name, newRecord);
- else
- _dnsWebService.DnsServer.AuthZoneManager.AddRecord(zoneInfo.Name, newRecord);
- }
- break;
- case DnsResourceRecordType.FWD:
- {
- DnsTransportProtocol protocol = request.GetQueryOrFormEnum("protocol", DnsTransportProtocol.Udp);
- string forwarder = request.GetQueryOrFormAlt("forwarder", "value");
- bool dnssecValidation = request.GetQueryOrForm("dnssecValidation", bool.Parse, false);
- NetProxyType proxyType = NetProxyType.None;
- string proxyAddress = null;
- ushort proxyPort = 0;
- string proxyUsername = null;
- string proxyPassword = null;
- if (!forwarder.Equals("this-server"))
- {
- proxyType = request.GetQueryOrFormEnum("proxyType", NetProxyType.None);
- if (proxyType != NetProxyType.None)
- {
- proxyAddress = request.GetQueryOrForm("proxyAddress");
- proxyPort = request.GetQueryOrForm("proxyPort", ushort.Parse);
- proxyUsername = request.QueryOrForm("proxyUsername");
- proxyPassword = request.QueryOrForm("proxyPassword");
- }
- }
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsForwarderRecordData(protocol, forwarder, dnssecValidation, proxyType, proxyAddress, proxyPort, proxyUsername, proxyPassword));
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- if (overwrite)
- _dnsWebService.DnsServer.AuthZoneManager.SetRecord(zoneInfo.Name, newRecord);
- else
- _dnsWebService.DnsServer.AuthZoneManager.AddRecord(zoneInfo.Name, newRecord);
- }
- break;
- case DnsResourceRecordType.APP:
- {
- string appName = request.GetQueryOrFormAlt("appName", "value");
- string classPath = request.GetQueryOrForm("classPath");
- string recordData = request.GetQueryOrForm("recordData", "");
- if (!overwrite)
- {
- IReadOnlyList<DnsResourceRecord> existingRecords = _dnsWebService.DnsServer.AuthZoneManager.GetRecords(zoneInfo.Name, domain, type);
- if (existingRecords.Count > 0)
- throw new DnsWebServiceException("Record already exists. Use overwrite option if you wish to overwrite existing records.");
- }
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsApplicationRecordData(appName, classPath, recordData));
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.SetRecord(zoneInfo.Name, newRecord);
- }
- break;
- default:
- throw new DnsWebServiceException("Type not supported for AddRecords().");
- }
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] New record was added to authoritative zone {record: " + newRecord.ToString() + "}");
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name);
- Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter();
- jsonWriter.WritePropertyName("zone");
- WriteZoneInfoAsJson(zoneInfo, jsonWriter);
- jsonWriter.WritePropertyName("addedRecord");
- WriteRecordAsJson(newRecord, jsonWriter, true, null);
- }
- public void GetRecords(HttpContext context)
- {
- HttpRequest request = context.Request;
- string domain = request.GetQueryOrForm("domain").TrimEnd('.');
- string zoneName = request.QueryOrForm("zone");
- if (zoneName is not null)
- zoneName = zoneName.TrimEnd('.');
- AuthZoneInfo zoneInfo = _dnsWebService.DnsServer.AuthZoneManager.FindAuthZoneInfo(string.IsNullOrEmpty(zoneName) ? domain : zoneName);
- if (zoneInfo is null)
- throw new DnsWebServiceException("No such authoritative zone was found: " + domain);
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.View))
- throw new DnsWebServiceException("Access was denied.");
- bool listZone = request.GetQueryOrForm("listZone", bool.Parse, false);
- List<DnsResourceRecord> records = new List<DnsResourceRecord>();
- if (listZone)
- _dnsWebService.DnsServer.AuthZoneManager.ListAllZoneRecords(zoneInfo.Name, records);
- else
- _dnsWebService.DnsServer.AuthZoneManager.ListAllRecords(zoneInfo.Name, domain, records);
- Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter();
- jsonWriter.WritePropertyName("zone");
- WriteZoneInfoAsJson(zoneInfo, jsonWriter);
- WriteRecordsAsJson(records, jsonWriter, true, zoneInfo);
- }
- public void DeleteRecord(HttpContext context)
- {
- HttpRequest request = context.Request;
- string domain = request.GetQueryOrForm("domain").TrimEnd('.');
- string zoneName = request.QueryOrForm("zone");
- if (zoneName is not null)
- zoneName = zoneName.TrimEnd('.');
- AuthZoneInfo zoneInfo = _dnsWebService.DnsServer.AuthZoneManager.FindAuthZoneInfo(string.IsNullOrEmpty(zoneName) ? domain : zoneName);
- if (zoneInfo is null)
- throw new DnsWebServiceException("No such authoritative zone was found: " + domain);
- if (zoneInfo.Internal)
- throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone.");
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.Delete))
- throw new DnsWebServiceException("Access was denied.");
- DnsResourceRecordType type = request.GetQueryOrFormEnum<DnsResourceRecordType>("type");
- switch (type)
- {
- case DnsResourceRecordType.A:
- case DnsResourceRecordType.AAAA:
- {
- IPAddress ipAddress = IPAddress.Parse(request.GetQueryOrFormAlt("ipAddress", "value"));
- if (type == DnsResourceRecordType.A)
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsARecordData(ipAddress));
- else
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsAAAARecordData(ipAddress));
- string ptrDomain = Zone.GetReverseZone(ipAddress, type == DnsResourceRecordType.A ? 32 : 128);
- AuthZoneInfo reverseZoneInfo = _dnsWebService.DnsServer.AuthZoneManager.FindAuthZoneInfo(ptrDomain);
- if ((reverseZoneInfo != null) && !reverseZoneInfo.Internal && (reverseZoneInfo.Type == AuthZoneType.Primary))
- {
- IReadOnlyList<DnsResourceRecord> ptrRecords = _dnsWebService.DnsServer.AuthZoneManager.GetRecords(reverseZoneInfo.Name, ptrDomain, DnsResourceRecordType.PTR);
- if (ptrRecords.Count > 0)
- {
- foreach (DnsResourceRecord ptrRecord in ptrRecords)
- {
- if ((ptrRecord.RDATA as DnsPTRRecordData).Domain.Equals(domain, StringComparison.OrdinalIgnoreCase))
- {
- //delete PTR record and save reverse zone
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecord(reverseZoneInfo.Name, ptrDomain, DnsResourceRecordType.PTR, ptrRecord.RDATA);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(reverseZoneInfo.Name);
- break;
- }
- }
- }
- }
- }
- break;
- case DnsResourceRecordType.NS:
- {
- string nameServer = request.GetQueryOrFormAlt("nameServer", "value").TrimEnd('.');
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsNSRecordData(nameServer));
- }
- break;
- case DnsResourceRecordType.CNAME:
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecords(zoneInfo.Name, domain, type);
- break;
- case DnsResourceRecordType.PTR:
- {
- string ptrName = request.GetQueryOrFormAlt("ptrName", "value").TrimEnd('.');
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsPTRRecordData(ptrName));
- }
- break;
- case DnsResourceRecordType.MX:
- {
- ushort preference = request.GetQueryOrForm("preference", ushort.Parse);
- string exchange = request.GetQueryOrFormAlt("exchange", "value").TrimEnd('.');
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsMXRecordData(preference, exchange));
- }
- break;
- case DnsResourceRecordType.TXT:
- {
- string text = request.GetQueryOrFormAlt("text", "value");
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsTXTRecordData(text));
- }
- break;
- case DnsResourceRecordType.SRV:
- {
- ushort priority = request.GetQueryOrForm("priority", ushort.Parse);
- ushort weight = request.GetQueryOrForm("weight", ushort.Parse);
- ushort port = request.GetQueryOrForm("port", ushort.Parse);
- string target = request.GetQueryOrFormAlt("target", "value").TrimEnd('.');
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsSRVRecordData(priority, weight, port, target));
- }
- break;
- case DnsResourceRecordType.DNAME:
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecords(zoneInfo.Name, domain, type);
- break;
- case DnsResourceRecordType.DS:
- {
- ushort keyTag = request.GetQueryOrForm("keyTag", ushort.Parse);
- DnssecAlgorithm algorithm = Enum.Parse<DnssecAlgorithm>(request.GetQueryOrForm("algorithm").Replace('-', '_'), true);
- DnssecDigestType digestType = Enum.Parse<DnssecDigestType>(request.GetQueryOrForm("digestType").Replace('-', '_'), true);
- byte[] digest = Convert.FromHexString(request.GetQueryOrFormAlt("digest", "value"));
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsDSRecordData(keyTag, algorithm, digestType, digest));
- }
- break;
- case DnsResourceRecordType.SSHFP:
- {
- DnsSSHFPAlgorithm sshfpAlgorithm = request.GetQueryOrFormEnum<DnsSSHFPAlgorithm>("sshfpAlgorithm");
- DnsSSHFPFingerprintType sshfpFingerprintType = request.GetQueryOrFormEnum<DnsSSHFPFingerprintType>("sshfpFingerprintType");
- byte[] sshfpFingerprint = request.GetQueryOrForm("sshfpFingerprint", Convert.FromHexString);
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsSSHFPRecordData(sshfpAlgorithm, sshfpFingerprintType, sshfpFingerprint));
- }
- break;
- case DnsResourceRecordType.TLSA:
- {
- DnsTLSACertificateUsage tlsaCertificateUsage = Enum.Parse<DnsTLSACertificateUsage>(request.GetQueryOrForm("tlsaCertificateUsage").Replace('-', '_'), true);
- DnsTLSASelector tlsaSelector = request.GetQueryOrFormEnum<DnsTLSASelector>("tlsaSelector");
- DnsTLSAMatchingType tlsaMatchingType = Enum.Parse<DnsTLSAMatchingType>(request.GetQueryOrForm("tlsaMatchingType").Replace('-', '_'), true);
- string tlsaCertificateAssociationData = request.GetQueryOrForm("tlsaCertificateAssociationData");
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsTLSARecordData(tlsaCertificateUsage, tlsaSelector, tlsaMatchingType, tlsaCertificateAssociationData));
- }
- break;
- case DnsResourceRecordType.CAA:
- {
- byte flags = request.GetQueryOrForm("flags", byte.Parse);
- string tag = request.GetQueryOrForm("tag");
- string value = request.GetQueryOrForm("value");
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsCAARecordData(flags, tag, value));
- }
- break;
- case DnsResourceRecordType.ANAME:
- {
- string aname = request.GetQueryOrFormAlt("aname", "value").TrimEnd('.');
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsANAMERecordData(aname));
- }
- break;
- case DnsResourceRecordType.FWD:
- {
- DnsTransportProtocol protocol = request.GetQueryOrFormEnum("protocol", DnsTransportProtocol.Udp);
- string forwarder = request.GetQueryOrFormAlt("forwarder", "value");
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecord(zoneInfo.Name, domain, type, new DnsForwarderRecordData(protocol, forwarder));
- }
- break;
- case DnsResourceRecordType.APP:
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecords(zoneInfo.Name, domain, type);
- break;
- default:
- throw new DnsWebServiceException("Type not supported for DeleteRecord().");
- }
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Record was deleted from authoritative zone {domain: " + domain + "; type: " + type + ";}");
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name);
- }
- public void UpdateRecord(HttpContext context)
- {
- HttpRequest request = context.Request;
- string domain = request.GetQueryOrForm("domain").TrimEnd('.');
- string zoneName = request.QueryOrForm("zone");
- if (zoneName is not null)
- zoneName = zoneName.TrimEnd('.');
- AuthZoneInfo zoneInfo = _dnsWebService.DnsServer.AuthZoneManager.FindAuthZoneInfo(string.IsNullOrEmpty(zoneName) ? domain : zoneName);
- if (zoneInfo is null)
- throw new DnsWebServiceException("No such authoritative zone was found: " + domain);
- if (zoneInfo.Internal)
- throw new DnsWebServiceException("Access was denied to manage internal DNS Server zone.");
- UserSession session = context.GetCurrentSession();
- if (!_dnsWebService._authManager.IsPermitted(PermissionSection.Zones, zoneInfo.Name, session.User, PermissionFlag.Modify))
- throw new DnsWebServiceException("Access was denied.");
- string newDomain = request.GetQueryOrForm("newDomain", domain).TrimEnd('.');
- uint ttl = request.GetQueryOrForm("ttl", uint.Parse, _defaultRecordTtl);
- bool disable = request.GetQueryOrForm("disable", bool.Parse, false);
- string comments = request.QueryOrForm("comments");
- DnsResourceRecordType type = request.GetQueryOrFormEnum<DnsResourceRecordType>("type");
- DnsResourceRecord oldRecord = null;
- DnsResourceRecord newRecord;
- switch (type)
- {
- case DnsResourceRecordType.A:
- case DnsResourceRecordType.AAAA:
- {
- IPAddress ipAddress = IPAddress.Parse(request.GetQueryOrFormAlt("ipAddress", "value"));
- IPAddress newIpAddress = IPAddress.Parse(request.GetQueryOrFormAlt("newIpAddress", "newValue", ipAddress.ToString()));
- bool ptr = request.GetQueryOrForm("ptr", bool.Parse, false);
- if (ptr)
- {
- string newPtrDomain = Zone.GetReverseZone(newIpAddress, type == DnsResourceRecordType.A ? 32 : 128);
- AuthZoneInfo newReverseZoneInfo = _dnsWebService.DnsServer.AuthZoneManager.FindAuthZoneInfo(newPtrDomain);
- if (newReverseZoneInfo is null)
- {
- bool createPtrZone = request.GetQueryOrForm("createPtrZone", bool.Parse, false);
- if (!createPtrZone)
- throw new DnsServerException("No reverse zone available to add PTR record.");
- string ptrZone = Zone.GetReverseZone(newIpAddress, type == DnsResourceRecordType.A ? 24 : 64);
- newReverseZoneInfo = _dnsWebService.DnsServer.AuthZoneManager.CreatePrimaryZone(ptrZone, _dnsWebService.DnsServer.ServerDomain, false);
- if (newReverseZoneInfo is null)
- throw new DnsServerException("Failed to create reverse zone to add PTR record: " + ptrZone);
- //set permissions
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, newReverseZoneInfo.Name, session.User, PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, newReverseZoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.ADMINISTRATORS), PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SetPermission(PermissionSection.Zones, newReverseZoneInfo.Name, _dnsWebService._authManager.GetGroup(Group.DNS_ADMINISTRATORS), PermissionFlag.ViewModifyDelete);
- _dnsWebService._authManager.SaveConfigFile();
- }
- if (newReverseZoneInfo.Internal)
- throw new DnsServerException("Reverse zone '" + newReverseZoneInfo.Name + "' is an internal zone.");
- if (newReverseZoneInfo.Type != AuthZoneType.Primary)
- throw new DnsServerException("Reverse zone '" + newReverseZoneInfo.Name + "' is not a primary zone.");
- string oldPtrDomain = Zone.GetReverseZone(ipAddress, type == DnsResourceRecordType.A ? 32 : 128);
- AuthZoneInfo oldReverseZoneInfo = _dnsWebService.DnsServer.AuthZoneManager.FindAuthZoneInfo(oldPtrDomain);
- if ((oldReverseZoneInfo != null) && !oldReverseZoneInfo.Internal && (oldReverseZoneInfo.Type == AuthZoneType.Primary))
- {
- //delete old PTR record if any and save old reverse zone
- _dnsWebService.DnsServer.AuthZoneManager.DeleteRecords(oldReverseZoneInfo.Name, oldPtrDomain, DnsResourceRecordType.PTR);
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(oldReverseZoneInfo.Name);
- }
- //add new PTR record and save reverse zone
- _dnsWebService.DnsServer.AuthZoneManager.SetRecords(newReverseZoneInfo.Name, newPtrDomain, DnsResourceRecordType.PTR, ttl, new DnsPTRRecordData[] { new DnsPTRRecordData(domain) });
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(newReverseZoneInfo.Name);
- }
- if (type == DnsResourceRecordType.A)
- {
- oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsARecordData(ipAddress));
- newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsARecordData(newIpAddress));
- }
- else
- {
- oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsAAAARecordData(ipAddress));
- newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsAAAARecordData(newIpAddress));
- }
- if (disable)
- newRecord.GetAuthRecordInfo().Disabled = true;
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.UpdateRecord(zoneInfo.Name, oldRecord, newRecord);
- }
- break;
- case DnsResourceRecordType.NS:
- {
- string nameServer = request.GetQueryOrFormAlt("nameServer", "value").TrimEnd('.');
- string newNameServer = request.GetQueryOrFormAlt("newNameServer", "newValue", nameServer).TrimEnd('.');
- oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsNSRecordData(nameServer));
- newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsNSRecordData(newNameServer));
- if (disable)
- newRecord.GetAuthRecordInfo().Disabled = true;
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- if (request.TryGetQueryOrForm("glue", out string glueAddresses))
- newRecord.SetGlueRecords(glueAddresses);
- _dnsWebService.DnsServer.AuthZoneManager.UpdateRecord(zoneInfo.Name, oldRecord, newRecord);
- }
- break;
- case DnsResourceRecordType.CNAME:
- {
- string cname = request.GetQueryOrFormAlt("cname", "value").TrimEnd('.');
- oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsCNAMERecordData(cname));
- newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsCNAMERecordData(cname));
- if (disable)
- newRecord.GetAuthRecordInfo().Disabled = true;
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.UpdateRecord(zoneInfo.Name, oldRecord, newRecord);
- }
- break;
- case DnsResourceRecordType.SOA:
- {
- string primaryNameServer = request.GetQueryOrForm("primaryNameServer").TrimEnd('.');
- string responsiblePerson = request.GetQueryOrForm("responsiblePerson").TrimEnd('.');
- uint serial = request.GetQueryOrForm("serial", uint.Parse);
- uint refresh = request.GetQueryOrForm("refresh", uint.Parse);
- uint retry = request.GetQueryOrForm("retry", uint.Parse);
- uint expire = request.GetQueryOrForm("expire", uint.Parse);
- uint minimum = request.GetQueryOrForm("minimum", uint.Parse);
- DnsResourceRecord newSOARecord = new DnsResourceRecord(domain, type, DnsClass.IN, ttl, new DnsSOARecordData(primaryNameServer, responsiblePerson, serial, refresh, retry, expire, minimum));
- switch (zoneInfo.Type)
- {
- case AuthZoneType.Secondary:
- {
- AuthRecordInfo recordInfo = newSOARecord.GetAuthRecordInfo();
- if (request.TryGetQueryOrFormEnum("zoneTransferProtocol", out DnsTransportProtocol zoneTransferProtocol))
- {
- if (zoneTransferProtocol == DnsTransportProtocol.Quic)
- DnsWebService.ValidateQuicSupport();
- recordInfo.ZoneTransferProtocol = zoneTransferProtocol;
- }
- if (request.TryGetQueryOrForm("primaryAddresses", out string primaryAddresses))
- {
- recordInfo.PrimaryNameServers = primaryAddresses.Split(delegate (string address)
- {
- NameServerAddress nameServer = NameServerAddress.Parse(address);
- if (nameServer.Protocol != zoneTransferProtocol)
- nameServer = nameServer.ChangeProtocol(zoneTransferProtocol);
- return nameServer;
- }, ',');
- }
- if (request.TryGetQueryOrForm("tsigKeyName", out string tsigKeyName))
- recordInfo.TsigKeyName = tsigKeyName;
- }
- break;
- case AuthZoneType.Stub:
- {
- if (request.TryGetQueryOrForm("primaryAddresses", out string primaryAddresses))
- {
- newSOARecord.GetAuthRecordInfo().PrimaryNameServers = primaryAddresses.Split(delegate (string address)
- {
- NameServerAddress nameServer = NameServerAddress.Parse(address);
- if (nameServer.Protocol != DnsTransportProtocol.Udp)
- nameServer = nameServer.ChangeProtocol(DnsTransportProtocol.Udp);
- return nameServer;
- }, ',');
- }
- }
- break;
- }
- if (!string.IsNullOrEmpty(comments))
- newSOARecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.SetRecord(zoneInfo.Name, newSOARecord);
- newRecord = zoneInfo.GetApexRecords(DnsResourceRecordType.SOA)[0];
- }
- break;
- case DnsResourceRecordType.PTR:
- {
- string ptrName = request.GetQueryOrFormAlt("ptrName", "value").TrimEnd('.');
- string newPtrName = request.GetQueryOrFormAlt("newPtrName", "newValue", ptrName).TrimEnd('.');
- oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsPTRRecordData(ptrName));
- newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsPTRRecordData(newPtrName));
- if (disable)
- newRecord.GetAuthRecordInfo().Disabled = true;
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.UpdateRecord(zoneInfo.Name, oldRecord, newRecord);
- }
- break;
- case DnsResourceRecordType.MX:
- {
- ushort preference = request.GetQueryOrForm("preference", ushort.Parse);
- ushort newPreference = request.GetQueryOrForm("newPreference", ushort.Parse, preference);
- string exchange = request.GetQueryOrFormAlt("exchange", "value").TrimEnd('.');
- string newExchange = request.GetQueryOrFormAlt("newExchange", "newValue", exchange).TrimEnd('.');
- oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsMXRecordData(preference, exchange));
- newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsMXRecordData(newPreference, newExchange));
- if (disable)
- newRecord.GetAuthRecordInfo().Disabled = true;
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.UpdateRecord(zoneInfo.Name, oldRecord, newRecord);
- }
- break;
- case DnsResourceRecordType.TXT:
- {
- string text = request.GetQueryOrFormAlt("text", "value");
- string newText = request.GetQueryOrFormAlt("newText", "newValue", text);
- oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsTXTRecordData(text));
- newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsTXTRecordData(newText));
- if (disable)
- newRecord.GetAuthRecordInfo().Disabled = true;
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.UpdateRecord(zoneInfo.Name, oldRecord, newRecord);
- }
- break;
- case DnsResourceRecordType.SRV:
- {
- ushort priority = request.GetQueryOrForm("priority", ushort.Parse);
- ushort newPriority = request.GetQueryOrForm("newPriority", ushort.Parse, priority);
- ushort weight = request.GetQueryOrForm("weight", ushort.Parse);
- ushort newWeight = request.GetQueryOrForm("newWeight", ushort.Parse, weight);
- ushort port = request.GetQueryOrForm("port", ushort.Parse);
- ushort newPort = request.GetQueryOrForm("newPort", ushort.Parse, port);
- string target = request.GetQueryOrFormAlt("target", "value").TrimEnd('.');
- string newTarget = request.GetQueryOrFormAlt("newTarget", "newValue", target).TrimEnd('.');
- oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsSRVRecordData(priority, weight, port, target));
- newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsSRVRecordData(newPriority, newWeight, newPort, newTarget));
- if (disable)
- newRecord.GetAuthRecordInfo().Disabled = true;
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.UpdateRecord(zoneInfo.Name, oldRecord, newRecord);
- }
- break;
- case DnsResourceRecordType.DNAME:
- {
- string dname = request.GetQueryOrFormAlt("dname", "value").TrimEnd('.');
- oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsDNAMERecordData(dname));
- newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsDNAMERecordData(dname));
- if (disable)
- newRecord.GetAuthRecordInfo().Disabled = true;
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.UpdateRecord(zoneInfo.Name, oldRecord, newRecord);
- }
- break;
- case DnsResourceRecordType.DS:
- {
- ushort keyTag = request.GetQueryOrForm("keyTag", ushort.Parse);
- ushort newKeyTag = request.GetQueryOrForm("newKeyTag", ushort.Parse, keyTag);
- DnssecAlgorithm algorithm = Enum.Parse<DnssecAlgorithm>(request.GetQueryOrForm("algorithm").Replace('-', '_'), true);
- DnssecAlgorithm newAlgorithm = Enum.Parse<DnssecAlgorithm>(request.GetQueryOrForm("newAlgorithm", algorithm.ToString()).Replace('-', '_'), true);
- DnssecDigestType digestType = Enum.Parse<DnssecDigestType>(request.GetQueryOrForm("digestType").Replace('-', '_'), true);
- DnssecDigestType newDigestType = Enum.Parse<DnssecDigestType>(request.GetQueryOrForm("newDigestType", digestType.ToString()).Replace('-', '_'), true);
- byte[] digest = request.GetQueryOrFormAlt("digest", "value", Convert.FromHexString);
- byte[] newDigest = request.GetQueryOrFormAlt("newDigest", "newValue", Convert.FromHexString, digest);
- oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsDSRecordData(keyTag, algorithm, digestType, digest));
- newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsDSRecordData(newKeyTag, newAlgorithm, newDigestType, newDigest));
- if (disable)
- newRecord.GetAuthRecordInfo().Disabled = true;
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.UpdateRecord(zoneInfo.Name, oldRecord, newRecord);
- }
- break;
- case DnsResourceRecordType.SSHFP:
- {
- DnsSSHFPAlgorithm sshfpAlgorithm = request.GetQueryOrFormEnum<DnsSSHFPAlgorithm>("sshfpAlgorithm");
- DnsSSHFPAlgorithm newSshfpAlgorithm = request.GetQueryOrFormEnum("newSshfpAlgorithm", sshfpAlgorithm);
- DnsSSHFPFingerprintType sshfpFingerprintType = request.GetQueryOrFormEnum<DnsSSHFPFingerprintType>("sshfpFingerprintType");
- DnsSSHFPFingerprintType newSshfpFingerprintType = request.GetQueryOrFormEnum("newSshfpFingerprintType", sshfpFingerprintType);
- byte[] sshfpFingerprint = request.GetQueryOrForm("sshfpFingerprint", Convert.FromHexString);
- byte[] newSshfpFingerprint = request.GetQueryOrForm("newSshfpFingerprint", Convert.FromHexString, sshfpFingerprint);
- oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsSSHFPRecordData(sshfpAlgorithm, sshfpFingerprintType, sshfpFingerprint));
- newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsSSHFPRecordData(newSshfpAlgorithm, newSshfpFingerprintType, newSshfpFingerprint));
- if (disable)
- newRecord.GetAuthRecordInfo().Disabled = true;
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.UpdateRecord(zoneInfo.Name, oldRecord, newRecord);
- }
- break;
- case DnsResourceRecordType.TLSA:
- {
- DnsTLSACertificateUsage tlsaCertificateUsage = Enum.Parse<DnsTLSACertificateUsage>(request.GetQueryOrForm("tlsaCertificateUsage").Replace('-', '_'), true);
- DnsTLSACertificateUsage newTlsaCertificateUsage = Enum.Parse<DnsTLSACertificateUsage>(request.GetQueryOrForm("newTlsaCertificateUsage", tlsaCertificateUsage.ToString()).Replace('-', '_'), true);
- DnsTLSASelector tlsaSelector = request.GetQueryOrFormEnum<DnsTLSASelector>("tlsaSelector");
- DnsTLSASelector newTlsaSelector = request.GetQueryOrFormEnum("newTlsaSelector", tlsaSelector);
- DnsTLSAMatchingType tlsaMatchingType = Enum.Parse<DnsTLSAMatchingType>(request.GetQueryOrForm("tlsaMatchingType").Replace('-', '_'), true);
- DnsTLSAMatchingType newTlsaMatchingType = Enum.Parse<DnsTLSAMatchingType>(request.GetQueryOrForm("newTlsaMatchingType", tlsaMatchingType.ToString()).Replace('-', '_'), true);
- string tlsaCertificateAssociationData = request.GetQueryOrForm("tlsaCertificateAssociationData");
- string newTlsaCertificateAssociationData = request.GetQueryOrForm("newTlsaCertificateAssociationData", tlsaCertificateAssociationData);
- oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsTLSARecordData(tlsaCertificateUsage, tlsaSelector, tlsaMatchingType, tlsaCertificateAssociationData));
- newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsTLSARecordData(newTlsaCertificateUsage, newTlsaSelector, newTlsaMatchingType, newTlsaCertificateAssociationData));
- if (disable)
- newRecord.GetAuthRecordInfo().Disabled = true;
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.UpdateRecord(zoneInfo.Name, oldRecord, newRecord);
- }
- break;
- case DnsResourceRecordType.CAA:
- {
- byte flags = request.GetQueryOrForm("flags", byte.Parse);
- byte newFlags = request.GetQueryOrForm("newFlags", byte.Parse, flags);
- string tag = request.GetQueryOrForm("tag");
- string newTag = request.GetQueryOrForm("newTag", tag);
- string value = request.GetQueryOrForm("value");
- string newValue = request.GetQueryOrForm("newValue", value);
- oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsCAARecordData(flags, tag, value));
- newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsCAARecordData(newFlags, newTag, newValue));
- if (disable)
- newRecord.GetAuthRecordInfo().Disabled = true;
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.UpdateRecord(zoneInfo.Name, oldRecord, newRecord);
- }
- break;
- case DnsResourceRecordType.ANAME:
- {
- string aname = request.GetQueryOrFormAlt("aname", "value").TrimEnd('.');
- string newAName = request.GetQueryOrFormAlt("newAName", "newValue", aname).TrimEnd('.');
- oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsANAMERecordData(aname));
- newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsANAMERecordData(newAName));
- if (disable)
- newRecord.GetAuthRecordInfo().Disabled = true;
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.UpdateRecord(zoneInfo.Name, oldRecord, newRecord);
- }
- break;
- case DnsResourceRecordType.FWD:
- {
- DnsTransportProtocol protocol = request.GetQueryOrFormEnum("protocol", DnsTransportProtocol.Udp);
- DnsTransportProtocol newProtocol = request.GetQueryOrFormEnum("newProtocol", protocol);
- string forwarder = request.GetQueryOrFormAlt("forwarder", "value");
- string newForwarder = request.GetQueryOrFormAlt("newForwarder", "newValue", forwarder);
- bool dnssecValidation = request.GetQueryOrForm("dnssecValidation", bool.Parse, false);
- NetProxyType proxyType = NetProxyType.None;
- string proxyAddress = null;
- ushort proxyPort = 0;
- string proxyUsername = null;
- string proxyPassword = null;
- if (!newForwarder.Equals("this-server"))
- {
- proxyType = request.GetQueryOrFormEnum("proxyType", NetProxyType.None);
- if (proxyType != NetProxyType.None)
- {
- proxyAddress = request.GetQueryOrForm("proxyAddress");
- proxyPort = request.GetQueryOrForm("proxyPort", ushort.Parse);
- proxyUsername = request.QueryOrForm("proxyUsername");
- proxyPassword = request.QueryOrForm("proxyPassword");
- }
- }
- switch (newProtocol)
- {
- case DnsTransportProtocol.HttpsJson:
- newProtocol = DnsTransportProtocol.Https;
- break;
- case DnsTransportProtocol.Quic:
- DnsWebService.ValidateQuicSupport();
- break;
- }
- oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsForwarderRecordData(protocol, forwarder));
- newRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsForwarderRecordData(newProtocol, newForwarder, dnssecValidation, proxyType, proxyAddress, proxyPort, proxyUsername, proxyPassword));
- if (disable)
- newRecord.GetAuthRecordInfo().Disabled = true;
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.UpdateRecord(zoneInfo.Name, oldRecord, newRecord);
- }
- break;
- case DnsResourceRecordType.APP:
- {
- string appName = request.GetQueryOrFormAlt("appName", "value");
- string classPath = request.GetQueryOrForm("classPath");
- string recordData = request.GetQueryOrForm("recordData", "");
- oldRecord = new DnsResourceRecord(domain, type, DnsClass.IN, 0, new DnsApplicationRecordData(appName, classPath, recordData));
- newRecord = new DnsResourceRecord(newDomain, type, DnsClass.IN, ttl, new DnsApplicationRecordData(appName, classPath, recordData));
- if (disable)
- newRecord.GetAuthRecordInfo().Disabled = true;
- if (!string.IsNullOrEmpty(comments))
- newRecord.GetAuthRecordInfo().Comments = comments;
- _dnsWebService.DnsServer.AuthZoneManager.UpdateRecord(zoneInfo.Name, oldRecord, newRecord);
- }
- break;
- default:
- throw new DnsWebServiceException("Type not supported for UpdateRecords().");
- }
- _dnsWebService._log.Write(context.GetRemoteEndPoint(), "[" + session.User.Username + "] Record was updated for authoritative zone {" + (oldRecord is null ? "" : "oldRecord: " + oldRecord.ToString() + "; ") + "newRecord: " + newRecord.ToString() + "}");
- _dnsWebService.DnsServer.AuthZoneManager.SaveZoneFile(zoneInfo.Name);
- Utf8JsonWriter jsonWriter = context.GetCurrentJsonWriter();
- jsonWriter.WritePropertyName("zone");
- WriteZoneInfoAsJson(zoneInfo, jsonWriter);
- jsonWriter.WritePropertyName("updatedRecord");
- WriteRecordAsJson(newRecord, jsonWriter, true, null);
- }
- #endregion
- #region properties
- public uint DefaultRecordTtl
- {
- get { return _defaultRecordTtl; }
- set { _defaultRecordTtl = value; }
- }
- #endregion
- }
- }
|