diff --git a/DnsServerCore/www/js/zone.js b/DnsServerCore/www/js/zone.js index 2e03570e..cced7adc 100644 --- a/DnsServerCore/www/js/zone.js +++ b/DnsServerCore/www/js/zone.js @@ -22,6 +22,10 @@ $(function () { $("input[type=radio][name=rdAddZoneType]").change(function () { $("#divAddZonePrimaryNameServerAddresses").hide(); + $("#divAddZoneZoneTransferProtocol").hide(); + $("#divAddZoneTsigKeyName").hide(); + $("#divAddZoneTsigSharedSecret").hide(); + $("#divAddZoneTsigAlgorithm").hide(); $("#divAddZoneForwarderProtocol").hide(); $("#divAddZoneForwarder").hide(); @@ -31,6 +35,13 @@ $(function () { break; case "Secondary": + $("#divAddZonePrimaryNameServerAddresses").show(); + $("#divAddZoneZoneTransferProtocol").show(); + $("#divAddZoneTsigKeyName").show(); + $("#divAddZoneTsigSharedSecret").show(); + $("#divAddZoneTsigAlgorithm").show(); + break; + case "Stub": $("#divAddZonePrimaryNameServerAddresses").show(); break; @@ -321,6 +332,17 @@ function deleteZone(objBtn, domain, editZone) { }); } +function addZoneOptionsTsigKeyRow(keyName, sharedSecret) { + + var id = Math.floor(Math.random() * 10000); + + var tableHtmlRows = ""; + tableHtmlRows += ""; + tableHtmlRows += ""; + + $("#tableZoneOptionsTsigKeys").append(tableHtmlRows); +} + function showZoneOptions(domain) { var divZoneOptionsAlert = $("#divZoneOptionsAlert"); var divZoneOptionsLoader = $("#divZoneOptionsLoader"); @@ -396,6 +418,14 @@ function showZoneOptions(domain) { $("#txtZoneNotifyNameServers").val(value); } + $("#tableZoneOptionsTsigKeys").html(""); + + if (responseJSON.response.tsigKeys != null) { + for (var i = 0; i < responseJSON.response.tsigKeys.length; i++) { + addZoneOptionsTsigKeyRow(responseJSON.response.tsigKeys[i].keyName, responseJSON.response.tsigKeys[i].sharedSecret); + } + } + divZoneOptionsLoader.hide(); divZoneOptions.show(); }, @@ -434,13 +464,21 @@ function saveZoneOptions() { else $("#txtZoneNotifyNameServers").val(notifyNameServers.replace(/,/g, "\n")); + var tsigKeys = serializeTableData($("#tableZoneOptionsTsigKeys"), 2); + if (tsigKeys === false) + return; + + if (tsigKeys.length === 0) + tsigKeys = false; + var btn = $("#btnSaveZoneOptions"); btn.button('loading'); HTTPRequest({ url: "/api/zone/options/set?token=" + token + "&domain=" + domain + "&zoneTransfer=" + zoneTransfer + "&zoneTransferNameServers=" + encodeURIComponent(zoneTransferNameServers) - + "¬ify=" + notify + "¬ifyNameServers=" + encodeURIComponent(notifyNameServers), + + "¬ify=" + notify + "¬ifyNameServers=" + encodeURIComponent(notifyNameServers) + + "&tsigKeys=" + encodeURIComponent(tsigKeys), success: function (responseJSON) { btn.button('reset'); $("#modalZoneOptions").modal("hide"); @@ -462,8 +500,15 @@ function saveZoneOptions() { } function resyncZone(objBtn, domain) { - if (!confirm("The resync action will perform a full zone refresh. For Secondary zones, there will be a full zone transfer (AXFR) performed. You will need to check the logs to confirm if the resync action was successful.\r\n\r\nAre you sure you want to resync the '" + domain + "' zone?")) - return false; + + if ($("#titleEditZoneType").text() == "Secondary") { + if (!confirm("The resync action will perform a full zone transfer (AXFR). You will need to check the logs to confirm if the resync action was successful.\r\n\r\nAre you sure you want to resync the '" + domain + "' zone?")) + return false; + } + else { + if (!confirm("The resync action will perform a full zone refresh. You will need to check the logs to confirm if the resync action was successful.\r\n\r\nAre you sure you want to resync the '" + domain + "' zone?")) + return false; + } var btn = $(objBtn); btn.button('loading'); @@ -490,6 +535,10 @@ function showAddZoneModal() { $("#txtAddZone").val(""); $("#rdAddZoneTypePrimary").prop("checked", true); $("#txtAddZonePrimaryNameServerAddresses").val(""); + $("#rdAddZoneZoneTransferProtocolTcp").prop("checked", true); + $("#txtAddZoneTsigKeyName").val(""); + $("#txtAddZoneTsigSharedSecret").val(""); + $("#optAddZoneTsigAlgorithm").val(""); $("input[name=rdAddZoneForwarderProtocol]:radio").attr("disabled", false); $("#rdAddZoneForwarderProtocolUdp").prop("checked", true); $("#chkAddZoneForwarderThisServer").prop('checked', false); @@ -498,6 +547,10 @@ function showAddZoneModal() { $("#txtAddZoneForwarder").val(""); $("#divAddZonePrimaryNameServerAddresses").hide(); + $("#divAddZoneZoneTransferProtocol").hide(); + $("#divAddZoneTsigKeyName").hide(); + $("#divAddZoneTsigSharedSecret").hide(); + $("#divAddZoneTsigAlgorithm").hide(); $("#divAddZoneForwarderProtocol").hide(); $("#divAddZoneForwarder").hide(); @@ -545,8 +598,15 @@ function addZone() { switch (type) { case "Secondary": + parameters = "&primaryNameServerAddresses=" + encodeURIComponent(cleanTextList($("#txtAddZonePrimaryNameServerAddresses").val())); + parameters += "&zoneTransferProtocol=" + $('input[name=rdAddZoneZoneTransferProtocol]:checked').val(); + parameters += "&tsigKeyName=" + encodeURIComponent($("#txtAddZoneTsigKeyName").val()); + parameters += "&tsigSharedSecret=" + encodeURIComponent($("#txtAddZoneTsigSharedSecret").val()); + parameters += "&tsigAlgorithm=" + encodeURIComponent($("#optAddZoneTsigAlgorithm").val()); + break; + case "Stub": - parameters = "&primaryNameServerAddresses=" + cleanTextList($("#txtAddZonePrimaryNameServerAddresses").val()); + parameters = "&primaryNameServerAddresses=" + encodeURIComponent(cleanTextList($("#txtAddZonePrimaryNameServerAddresses").val())); break; case "Forwarder": @@ -558,7 +618,7 @@ function addZone() { return; } - parameters = "&protocol=" + $('input[name=rdAddZoneForwarderProtocol]:checked').val() + "&forwarder=" + forwarder; + parameters = "&protocol=" + $('input[name=rdAddZoneForwarderProtocol]:checked').val() + "&forwarder=" + encodeURIComponent(forwarder); break; default: @@ -770,6 +830,38 @@ function showEditZone(domain) { additionalDataAttributes = "data-record-paddresses=\"\" "; } + if (records[i].rData.zoneTransferProtocol != null) { + tableHtmlRows += "
Zone Transfer Protocol: " + records[i].rData.zoneTransferProtocol; + + additionalDataAttributes += "data-record-zonetransferprotocol=\"" + htmlEncode(records[i].rData.zoneTransferProtocol) + "\" "; + } else { + additionalDataAttributes += "data-record-zonetransferprotocol=\"\" "; + } + + if (records[i].rData.tsigKeyName != null) { + tableHtmlRows += "
TSIG Key Name: " + records[i].rData.tsigKeyName; + + additionalDataAttributes += "data-record-tsigkeyname=\"" + htmlEncode(records[i].rData.tsigKeyName) + "\" "; + } else { + additionalDataAttributes += "data-record-tsigkeyname=\"\" "; + } + + if (records[i].rData.tsigSharedSecret != null) { + tableHtmlRows += "
TSIG Shared Secret: ********"; + + additionalDataAttributes += "data-record-tsigsharedsecret=\"" + htmlEncode(records[i].rData.tsigSharedSecret) + "\" "; + } else { + additionalDataAttributes += "data-record-tsigsharedsecret=\"\" "; + } + + if (records[i].rData.tsigAlgorithm != null) { + tableHtmlRows += "
TSIG Algorithm: " + records[i].rData.tsigAlgorithm; + + additionalDataAttributes += "data-record-tsigalgorithm=\"" + htmlEncode(records[i].rData.tsigAlgorithm) + "\" "; + } else { + additionalDataAttributes += "data-record-tsigalgorithm=\"\" "; + } + if ((records[i].comments != null) && (records[i].comments.length > 0)) tableHtmlRows += "

Comments:
" + htmlEncode(records[i].comments) + "
"; @@ -1135,6 +1227,10 @@ function modifyAddRecordFormByType() { $("#txtEditRecordDataSoaExpire").val(""); $("#txtEditRecordDataSoaMinimum").val(""); $("#txtEditRecordDataSoaPrimaryAddresses").val(""); + $("#rdEditRecordDataSoaZoneTransferProtocolTcp").prop("checked", true); + $("#txtEditRecordDataSoaTsigKeyName").val(""); + $("#txtEditRecordDataSoaTsigSharedSecret").val(""); + $("#optEditRecordDataSoaTsigAlgorithm").val(""); $("#divEditRecordDataSoa").show(); break; @@ -1489,8 +1585,9 @@ function showEditRecordModal(objBtn) { $("#txtAddEditRecordTtl").val(ttl) $("#txtAddEditRecordComments").val(comments); - var disableEditRecordModalFields = false; + var disableSoaRecordModalFields = false; var hideSoaRecordPrimaryAddressesField = false; + var hideSoaRecordXfrAndTsigFields = false; var zoneType = $("#titleEditZoneType").text(); switch (zoneType) { @@ -1498,6 +1595,7 @@ function showEditRecordModal(objBtn) { switch (type) { case "SOA": hideSoaRecordPrimaryAddressesField = true; + hideSoaRecordXfrAndTsigFields = true; break; } break; @@ -1505,7 +1603,7 @@ function showEditRecordModal(objBtn) { case "Secondary": switch (type) { case "SOA": - disableEditRecordModalFields = true; + disableSoaRecordModalFields = true; break; } break; @@ -1513,7 +1611,8 @@ function showEditRecordModal(objBtn) { case "Stub": switch (type) { case "SOA": - disableEditRecordModalFields = true; + disableSoaRecordModalFields = true; + hideSoaRecordXfrAndTsigFields = true; break; } break; @@ -1540,13 +1639,6 @@ function showEditRecordModal(objBtn) { case "NS": $("#txtAddEditRecordDataNsNameServer").val(divData.attr("data-record-value")); $("#txtAddEditRecordDataNsGlue").val(divData.attr("data-record-glue").replace(/, /g, "\n")); - - if (disableEditRecordModalFields) { - $("#txtAddEditRecordName").prop("disabled", true); - $("#txtAddEditRecordTtl").prop("disabled", true); - - $("#txtAddEditRecordDataNsNameServer").prop("disabled", true); - } break; case "SOA": @@ -1559,9 +1651,24 @@ function showEditRecordModal(objBtn) { $("#txtEditRecordDataSoaMinimum").val(divData.attr("data-record-minimum")); $("#txtEditRecordDataSoaPrimaryAddresses").val(divData.attr("data-record-paddresses").replace(/, /g, "\n")); + switch (divData.attr("data-record-zonetransferprotocol").toLowerCase()) { + case "tls": + $("#rdEditRecordDataSoaZoneTransferProtocolTls").prop("checked", true); + break; + + case "tcp": + default: + $("#rdEditRecordDataSoaZoneTransferProtocolTcp").prop("checked", true); + break; + } + + $("#txtEditRecordDataSoaTsigKeyName").val(divData.attr("data-record-tsigkeyname")); + $("#txtEditRecordDataSoaTsigSharedSecret").val(divData.attr("data-record-tsigsharedsecret")); + $("#optEditRecordDataSoaTsigAlgorithm").val(divData.attr("data-record-tsigalgorithm")); + $("#txtAddEditRecordName").prop("disabled", true); - if (disableEditRecordModalFields) { + if (disableSoaRecordModalFields) { $("#txtAddEditRecordTtl").prop("disabled", true); $("#txtEditRecordDataSoaPrimaryNameServer").prop("disabled", true); @@ -1579,6 +1686,18 @@ function showEditRecordModal(objBtn) { $("#divEditRecordDataSoaPrimaryAddresses").show(); } + if (hideSoaRecordXfrAndTsigFields) { + $("#divEditRecordDataSoaZoneTransferProtocol").hide(); + $("#divEditRecordDataSoaTsigKeyName").hide(); + $("#divEditRecordDataSoaTsigSharedSecret").hide(); + $("#divEditRecordDataSoaTsigAlgorithm").hide(); + } else { + $("#divEditRecordDataSoaZoneTransferProtocol").show(); + $("#divEditRecordDataSoaTsigKeyName").show(); + $("#divEditRecordDataSoaTsigSharedSecret").show(); + $("#divEditRecordDataSoaTsigAlgorithm").show(); + } + break; case "MX": @@ -1790,6 +1909,10 @@ function updateRecord() { } var primaryAddresses = cleanTextList($("#txtEditRecordDataSoaPrimaryAddresses").val()); + var zoneTransferProtocol = $('input[name=rdEditRecordDataSoaZoneTransferProtocol]:checked').val(); + var tsigKeyName = $("#txtEditRecordDataSoaTsigKeyName").val(); + var tsigSharedSecret = $("#txtEditRecordDataSoaTsigSharedSecret").val(); + var tsigAlgorithm = $("#optEditRecordDataSoaTsigAlgorithm").val(); apiUrl += "&primaryNameServer=" + encodeURIComponent(primaryNameServer) + "&responsiblePerson=" + encodeURIComponent(responsiblePerson) + @@ -1798,7 +1921,12 @@ function updateRecord() { "&retry=" + encodeURIComponent(retry) + "&expire=" + encodeURIComponent(expire) + "&minimum=" + encodeURIComponent(minimum) + - "&primaryAddresses=" + encodeURIComponent(primaryAddresses); + "&primaryAddresses=" + encodeURIComponent(primaryAddresses) + + "&zoneTransferProtocol=" + encodeURIComponent(zoneTransferProtocol) + + "&tsigKeyName=" + encodeURIComponent(tsigKeyName) + + "&tsigSharedSecret=" + encodeURIComponent(tsigSharedSecret) + + "&tsigAlgorithm=" + encodeURIComponent(tsigAlgorithm); + break; case "MX":