fix(firewall): banned IPs search, modify modal, export/import, Tracking Prevention

- Add searchBannedIPFilter for searching banned IPs by IP, reason, or status
- Add openModifyModal, closeModifyModal, saveModifyBannedIP for modify modal
- Add exportBannedIPs and importBannedIPs for export/import buttons
- Wrap localStorage in try-catch in base template to handle Tracking Prevention
  (Firefox/Safari blocking storage access for cross-site context)
- Fixes firewall banned IPs page search and functionality
This commit is contained in:
master3395
2026-02-16 00:20:57 +01:00
parent 399a16be9a
commit 3022f92e27
3 changed files with 224 additions and 11 deletions

View File

@@ -68,6 +68,111 @@ app.controller('firewallController', function ($scope, $http, $timeout) {
$scope.banIP = '';
$scope.banReason = '';
$scope.banDuration = '24h';
$scope.bannedIPSearch = '';
// Modify banned IP modal
$scope.showModifyModal = false;
$scope.modifyBannedIPData = { ip: '', reason: '', duration: '24h', id: null };
// Search filter for banned IPs (by IP, reason, or status)
$scope.searchBannedIPFilter = function(item) {
var q = ($scope.bannedIPSearch || '').toLowerCase().trim();
if (!q) return true;
var ip = (item.ip || '').toLowerCase();
var reason = (item.reason || '').toLowerCase();
var status = item.active ? 'active' : 'expired';
return ip.indexOf(q) !== -1 || reason.indexOf(q) !== -1 || status.indexOf(q) !== -1;
};
// Modify banned IP modal functions
$scope.openModifyModal = function(bannedIP) {
if (!bannedIP) return;
$scope.modifyBannedIPData = {
id: bannedIP.id,
ip: bannedIP.ip,
reason: bannedIP.reason || '',
duration: bannedIP.duration || '24h'
};
$scope.showModifyModal = true;
};
$scope.closeModifyModal = function() { $scope.showModifyModal = false; };
$scope.saveModifyBannedIP = function() {
if (!$scope.modifyBannedIPData || !$scope.modifyBannedIPData.id) return;
$scope.bannedIPsLoading = true;
$http.post('/firewall/modifyBannedIP', {
id: $scope.modifyBannedIPData.id,
reason: $scope.modifyBannedIPData.reason,
duration: $scope.modifyBannedIPData.duration
}, { headers: { 'X-CSRFToken': getCookie('csrftoken') } }).then(
function(response) {
$scope.bannedIPsLoading = false;
if (response.data && response.data.status === 1) {
$scope.bannedIPActionSuccess = false;
$scope.closeModifyModal();
populateBannedIPs();
} else {
$scope.bannedIPActionFailed = false;
$scope.bannedIPErrorMessage = (response.data && response.data.error_message) || 'Unknown error';
}
},
function() {
$scope.bannedIPsLoading = false;
$scope.bannedIPCouldNotConnect = false;
}
);
};
// Export banned IPs (triggers file download)
$scope.exportBannedIPs = function() {
var url = '/firewall/exportBannedIPs';
var form = document.createElement('form');
form.method = 'POST';
form.action = url;
form.style.display = 'none';
var csrfInput = document.createElement('input');
csrfInput.type = 'hidden';
csrfInput.name = 'csrfmiddlewaretoken';
csrfInput.value = getCookie('csrftoken');
form.appendChild(csrfInput);
document.body.appendChild(form);
form.submit();
document.body.removeChild(form);
};
// Import banned IPs (file picker -> POST)
$scope.importBannedIPs = function() {
var input = document.createElement('input');
input.type = 'file';
input.accept = '.json';
input.style.display = 'none';
input.onchange = function(ev) {
var file = ev.target && ev.target.files[0];
if (!file) return;
var formData = new FormData();
formData.append('import_file', file);
formData.append('csrfmiddlewaretoken', getCookie('csrftoken'));
$scope.bannedIPsLoading = false;
$http.post('/firewall/importBannedIPs', formData, {
headers: { 'X-CSRFToken': getCookie('csrftoken'), 'Content-Type': undefined },
transformRequest: angular.identity
}).then(function(response) {
$scope.bannedIPsLoading = true;
if (response.data && response.data.importStatus === 1) {
$scope.bannedIPActionSuccess = false;
populateBannedIPs();
} else {
$scope.bannedIPActionFailed = false;
$scope.bannedIPErrorMessage = (response.data && response.data.error_message) || 'Import failed';
}
}, function() {
$scope.bannedIPsLoading = true;
$scope.bannedIPCouldNotConnect = false;
});
};
document.body.appendChild(input);
input.click();
document.body.removeChild(input);
};
firewallStatus();