diff --git a/scripts/pi-hole/js/groups-adlists.js b/scripts/pi-hole/js/groups-adlists.js index 84ff709c..d5363c01 100644 --- a/scripts/pi-hole/js/groups-adlists.js +++ b/scripts/pi-hole/js/groups-adlists.js @@ -499,13 +499,21 @@ function delItems(ids) { function addAdlist(event) { const type = event.data.type; - const address = utils.escapeHtml($("#new_address").val()); const comment = utils.escapeHtml($("#new_comment").val()); - utils.disableAll(); - utils.showAlert("info", "", "Adding subscribed " + type + "list...", address); + // Check if the user wants to add multiple domains (space or newline separated) + // If so, split the input and store it in an array + var addresses = utils.escapeHtml($("#new_address").val()).split(/[\s,]+/); + // Remove empty elements + addresses = addresses.filter(function (el) { + return el !== ""; + }); + const addressestr = JSON.stringify(addresses); - if (address.length === 0) { + utils.disableAll(); + utils.showAlert("info", "", "Adding subscribed " + type + "list(s)...", addressestr); + + if (addresses.length === 0) { // enable the ui elements again utils.enableAll(); utils.showAlert("warning", "", "Warning", "Please specify " + type + "list address"); @@ -516,10 +524,15 @@ function addAdlist(event) { url: "/api/lists", method: "post", dataType: "json", - data: JSON.stringify({ address: address, comment: comment, type: type }), + data: JSON.stringify({ address: addresses, comment: comment, type: type }), success: function () { utils.enableAll(); - utils.showAlert("success", "fas fa-plus", "Successfully added " + type + "list", address); + utils.showAlert( + "success", + "fas fa-plus", + "Successfully added " + type + "list(s)", + addressestr + ); table.ajax.reload(null, false); table.rows().deselect(); diff --git a/scripts/pi-hole/js/groups-clients.js b/scripts/pi-hole/js/groups-clients.js index 843be7b9..013bab8b 100644 --- a/scripts/pi-hole/js/groups-clients.js +++ b/scripts/pi-hole/js/groups-clients.js @@ -405,34 +405,47 @@ function delItems(ids) { } function addClient() { - var ip = utils.escapeHtml($("#select").val().trim()); const comment = utils.escapeHtml($("#new_comment").val()); - utils.disableAll(); - utils.showAlert("info", "", "Adding client...", ip); - - if (ip.length === 0) { - utils.enableAll(); - utils.showAlert("warning", "", "Warning", "Please specify a client IP or MAC address"); - return; - } + // Check if the user wants to add multiple IPs (space or newline separated) + // If so, split the input and store it in an array + var ips = utils.escapeHtml($("#select").val().trim()).split(/[\s,]+/); + // Remove empty elements + ips = ips.filter(function (el) { + return el !== ""; + }); + const ipStr = JSON.stringify(ips); // Validate input, can be: // - IPv4 address (with and without CIDR) // - IPv6 address (with and without CIDR) // - MAC address (in the form AA:BB:CC:DD:EE:FF) // - host name (arbitrary form, we're only checking against some reserved characters) - if (utils.validateIPv4CIDR(ip) || utils.validateIPv6CIDR(ip) || utils.validateMAC(ip)) { - // Convert input to upper case (important for MAC addresses) - ip = ip.toUpperCase(); - } else if (!utils.validateHostname(ip)) { + for (var i = 0; i < ips.length; i++) { + if ( + utils.validateIPv4CIDR(ips[i]) || + utils.validateIPv6CIDR(ips[i]) || + utils.validateMAC(ips[i]) + ) { + // Convert input to upper case (important for MAC addresses) + ips[i] = ips[i].toUpperCase(); + } else if (!utils.validateHostname(ips[i])) { + utils.showAlert( + "warning", + "", + "Warning", + "Input is neither a valid IP or MAC address nor a valid host name!" + ); + return; + } + } + + utils.disableAll(); + utils.showAlert("info", "", "Adding client(s)...", ipStr); + + if (ips.length === 0) { utils.enableAll(); - utils.showAlert( - "warning", - "", - "Warning", - "Input is neither a valid IP or MAC address nor a valid host name!" - ); + utils.showAlert("warning", "", "Warning", "Please specify a client IP or MAC address"); return; } @@ -440,10 +453,10 @@ function addClient() { url: "/api/clients", method: "post", dataType: "json", - data: JSON.stringify({ client: ip, comment: comment }), + data: JSON.stringify({ client: ips, comment: comment }), success: function () { utils.enableAll(); - utils.showAlert("success", "fas fa-plus", "Successfully added client", ip); + utils.showAlert("success", "fas fa-plus", "Successfully added client(s)", ipStr); reloadClientSuggestions(); table.ajax.reload(null, false); table.rows().deselect(); diff --git a/scripts/pi-hole/js/groups-domains.js b/scripts/pi-hole/js/groups-domains.js index 1429a95a..a4591253 100644 --- a/scripts/pi-hole/js/groups-domains.js +++ b/scripts/pi-hole/js/groups-domains.js @@ -497,45 +497,53 @@ function addDomain() { commentEl = $("#new_regex_comment"); } - var domain = utils.escapeHtml(domainEl.val()); const comment = utils.escapeHtml(commentEl.val()); - utils.disableAll(); - utils.showAlert("info", "", "Adding domain...", domain); + // Check if the user wants to add multiple domains (space or newline separated) + // If so, split the input and store it in an array + var domains = utils.escapeHtml(domainEl.val()).split(/[\s,]+/); + // Remove empty elements + domains = domains.filter(function (el) { + return el !== ""; + }); + const domainStr = JSON.stringify(domains); - if (domain.length < 2) { + utils.disableAll(); + utils.showAlert("info", "", "Adding domain(s)...", domainStr); + + if (domains.length === 0) { utils.enableAll(); - utils.showAlert("warning", "", "Warning", "Please specify a domain"); + utils.showAlert("warning", "", "Warning", "Please specify at least one domain"); return; } - // strip "*." if specified by user in wildcard mode - if (kind === "exact" && wildcardChecked && domain.startsWith("*.")) { - domain = domain.substr(2); + for (var i = 0; i < domains.length; i++) { + if (kind === "exact" && wildcardChecked) { + // Transform domain to wildcard if specified by user + domains[i] = "(\\.|^)" + domains[i].replaceAll(".", "\\.") + "$"; + kind = "regex"; + + // strip leading "*." if specified by user in wildcard mode + if (domains[i].startsWith("*.")) domains[i] = domains[i].substr(2); + } } // determine list type const type = action === "add_deny" ? "deny" : "allow"; - // Transform domain to wildcard if specified by user - if (kind === "exact" && wildcardChecked) { - domain = "(\\.|^)" + domain.replaceAll(".", "\\.") + "$"; - kind = "regex"; - } - $.ajax({ url: "/api/domains/" + type + "/" + kind, method: "post", dataType: "json", data: JSON.stringify({ - domain: domain, + domain: domains, comment: comment, type: type, kind: kind, }), success: function () { utils.enableAll(); - utils.showAlert("success", "fas fa-plus", "Successfully added domain", domain); + utils.showAlert("success", "fas fa-plus", "Successfully added domain(s)", domainStr); table.ajax.reload(null, false); table.rows().deselect(); diff --git a/scripts/pi-hole/js/groups.js b/scripts/pi-hole/js/groups.js index 0beab5ba..eb14b0eb 100644 --- a/scripts/pi-hole/js/groups.js +++ b/scripts/pi-hole/js/groups.js @@ -277,13 +277,24 @@ function delItems(ids) { } function addGroup() { - const name = utils.escapeHtml($("#new_name").val()); const comment = utils.escapeHtml($("#new_comment").val()); - utils.disableAll(); - utils.showAlert("info", "", "Adding group...", name); + // Check if the user wants to add multiple groups (space or newline separated) + // If so, split the input and store it in an array + var names = utils + .escapeHtml($("#new_name")) + .val() + .split(/[\s,]+/); + // Remove empty elements + names = names.filter(function (el) { + return el !== ""; + }); + const groupStr = JSON.stringify(names); - if (name.length === 0) { + utils.disableAll(); + utils.showAlert("info", "", "Adding group(s)...", groupStr); + + if (names.length === 0) { // enable the ui elements again utils.enableAll(); utils.showAlert("warning", "", "Warning", "Please specify a group name"); @@ -295,13 +306,13 @@ function addGroup() { method: "post", dataType: "json", data: JSON.stringify({ - name: name, + name: names, comment: comment, enabled: true, }), success: function () { utils.enableAll(); - utils.showAlert("success", "fas fa-plus", "Successfully added group", name); + utils.showAlert("success", "fas fa-plus", "Successfully added group(s)", groupStr); $("#new_name").val(""); $("#new_comment").val(""); table.ajax.reload();