Added null checks for all DOM element accesses in applyAdvancedActionsSettings to prevent similar errors

This commit is contained in:
2026-01-14 17:36:06 +01:00
parent 4abc22d6fe
commit 8ed18f2473

View File

@@ -275,25 +275,48 @@ function sendTestEmail() {
function applyAdvancedActionsSettings(cfg) { function applyAdvancedActionsSettings(cfg) {
cfg = cfg || {}; cfg = cfg || {};
document.getElementById('advancedActionsEnabled').checked = !!cfg.enabled; const enabledEl = document.getElementById('advancedActionsEnabled');
document.getElementById('advancedThreshold').value = cfg.threshold || 5; if (enabledEl) enabledEl.checked = !!cfg.enabled;
const thresholdEl = document.getElementById('advancedThreshold');
if (thresholdEl) thresholdEl.value = cfg.threshold || 5;
const integrationSelect = document.getElementById('advancedIntegrationSelect'); const integrationSelect = document.getElementById('advancedIntegrationSelect');
integrationSelect.value = cfg.integration || ''; if (integrationSelect) integrationSelect.value = cfg.integration || '';
const mk = cfg.mikrotik || {}; const mk = cfg.mikrotik || {};
document.getElementById('mikrotikHost').value = mk.host || ''; const mkHost = document.getElementById('mikrotikHost');
document.getElementById('mikrotikPort').value = mk.port || 22; if (mkHost) mkHost.value = mk.host || '';
document.getElementById('mikrotikUsername').value = mk.username || ''; const mkPort = document.getElementById('mikrotikPort');
document.getElementById('mikrotikPassword').value = mk.password || ''; if (mkPort) mkPort.value = mk.port || 22;
document.getElementById('mikrotikSSHKey').value = mk.sshKeyPath || ''; const mkUser = document.getElementById('mikrotikUsername');
document.getElementById('mikrotikList').value = mk.addressList || 'fail2ban-permanent'; if (mkUser) mkUser.value = mk.username || '';
const mkPass = document.getElementById('mikrotikPassword');
if (mkPass) mkPass.value = mk.password || '';
const mkKey = document.getElementById('mikrotikSSHKey');
if (mkKey) mkKey.value = mk.sshKeyPath || '';
const mkList = document.getElementById('mikrotikList');
if (mkList) mkList.value = mk.addressList || 'fail2ban-permanent';
const pf = cfg.pfSense || {}; const pf = cfg.pfSense || {};
document.getElementById('pfSenseBaseURL').value = pf.baseUrl || ''; const pfURL = document.getElementById('pfSenseBaseURL');
document.getElementById('pfSenseToken').value = pf.apiToken || ''; if (pfURL) pfURL.value = pf.baseUrl || '';
document.getElementById('pfSenseSecret').value = pf.apiSecret || ''; const pfToken = document.getElementById('pfSenseToken');
document.getElementById('pfSenseAlias').value = pf.alias || ''; if (pfToken) pfToken.value = pf.apiToken || '';
document.getElementById('pfSenseSkipTLS').checked = !!pf.skipTLSVerify; const pfAlias = document.getElementById('pfSenseAlias');
if (pfAlias) pfAlias.value = pf.alias || '';
const pfTLS = document.getElementById('pfSenseSkipTLS');
if (pfTLS) pfTLS.checked = !!pf.skipTLSVerify;
const opn = cfg.opnsense || {};
const opnURL = document.getElementById('opnsenseBaseURL');
if (opnURL) opnURL.value = opn.baseUrl || '';
const opnKey = document.getElementById('opnsenseKey');
if (opnKey) opnKey.value = opn.apiKey || '';
const opnSecret = document.getElementById('opnsenseSecret');
if (opnSecret) opnSecret.value = opn.apiSecret || '';
const opnAlias = document.getElementById('opnsenseAlias');
if (opnAlias) opnAlias.value = opn.alias || '';
const opnTLS = document.getElementById('opnsenseSkipTLS');
if (opnTLS) opnTLS.checked = !!opn.skipTLSVerify;
updateAdvancedIntegrationFields(); updateAdvancedIntegrationFields();
} }
@@ -314,9 +337,15 @@ function collectAdvancedActionsSettings() {
pfSense: { pfSense: {
baseUrl: document.getElementById('pfSenseBaseURL').value.trim(), baseUrl: document.getElementById('pfSenseBaseURL').value.trim(),
apiToken: document.getElementById('pfSenseToken').value.trim(), apiToken: document.getElementById('pfSenseToken').value.trim(),
apiSecret: document.getElementById('pfSenseSecret').value.trim(),
alias: document.getElementById('pfSenseAlias').value.trim(), alias: document.getElementById('pfSenseAlias').value.trim(),
skipTLSVerify: document.getElementById('pfSenseSkipTLS').checked, skipTLSVerify: document.getElementById('pfSenseSkipTLS').checked,
},
opnsense: {
baseUrl: document.getElementById('opnsenseBaseURL').value.trim(),
apiKey: document.getElementById('opnsenseKey').value.trim(),
apiSecret: document.getElementById('opnsenseSecret').value.trim(),
alias: document.getElementById('opnsenseAlias').value.trim(),
skipTLSVerify: document.getElementById('opnsenseSkipTLS').checked,
} }
}; };
} }
@@ -325,6 +354,7 @@ function updateAdvancedIntegrationFields() {
const selected = document.getElementById('advancedIntegrationSelect').value; const selected = document.getElementById('advancedIntegrationSelect').value;
document.getElementById('advancedMikrotikFields').classList.toggle('hidden', selected !== 'mikrotik'); document.getElementById('advancedMikrotikFields').classList.toggle('hidden', selected !== 'mikrotik');
document.getElementById('advancedPfSenseFields').classList.toggle('hidden', selected !== 'pfsense'); document.getElementById('advancedPfSenseFields').classList.toggle('hidden', selected !== 'pfsense');
document.getElementById('advancedOPNsenseFields').classList.toggle('hidden', selected !== 'opnsense');
} }
function loadPermanentBlockLog() { function loadPermanentBlockLog() {
@@ -391,42 +421,21 @@ function refreshPermanentBlockLog() {
} }
function openAdvancedTestModal() { function openAdvancedTestModal() {
populateAdvancedTestServers();
document.getElementById('advancedTestIP').value = ''; document.getElementById('advancedTestIP').value = '';
document.getElementById('advancedTestServer').value = '';
openModal('advancedTestModal'); openModal('advancedTestModal');
} }
function populateAdvancedTestServers() {
const select = document.getElementById('advancedTestServer');
if (!select) return;
const value = select.value;
select.innerHTML = '';
const baseOption = document.createElement('option');
baseOption.value = '';
baseOption.textContent = t('settings.advanced.test_server_none', 'Use global integration settings');
select.appendChild(baseOption);
serversCache.forEach(server => {
const opt = document.createElement('option');
opt.value = server.id;
opt.textContent = server.name || server.id;
select.appendChild(opt);
});
select.value = value;
}
function submitAdvancedTest(action) { function submitAdvancedTest(action) {
const ipValue = document.getElementById('advancedTestIP').value.trim(); const ipValue = document.getElementById('advancedTestIP').value.trim();
if (!ipValue) { if (!ipValue) {
showToast('Please enter an IP address.', 'info'); showToast('Please enter an IP address.', 'info');
return; return;
} }
const serverId = document.getElementById('advancedTestServer').value;
showLoading(true); showLoading(true);
fetch('/api/advanced-actions/test', { fetch('/api/advanced-actions/test', {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: action, ip: ipValue, serverId: serverId }) body: JSON.stringify({ action: action, ip: ipValue })
}) })
.then(res => res.json()) .then(res => res.json())
.then(data => { .then(data => {