mirror of
https://github.com/pi-hole/web.git
synced 2024-12-06 19:36:21 +01:00
Implement support for adding multiple domains, clients, groups, and list addresses at once
Signed-off-by: DL6ER <dl6er@dl6er.de>
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user