PR #124 fixed major and minor issues

This commit is contained in:
Marc
2026-02-08 07:04:10 -06:00
parent b7e8bf9664
commit 72eb92ce51
7 changed files with 535 additions and 79 deletions
+30 -12
View File
@@ -1332,6 +1332,14 @@
totalSignals: 0
};
// XSS protection: Escape HTML special characters
function escapeHtml(text) {
if (text === null || text === undefined) return '';
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
// Band configurations by region
const BAND_CONFIG = {
'Europe': [
@@ -1832,23 +1840,23 @@
<div class="tower-info">
<div class="tower-info-row">
<span class="tower-info-label">Cell ID</span>
<span class="tower-info-value">${tower.cid} ${tower.rogue ? '<span class="tower-rogue-badge">ROGUE</span>' : ''}</span>
<span class="tower-info-value">${escapeHtml(tower.cid)} ${tower.rogue ? '<span class="tower-rogue-badge">ROGUE</span>' : ''}</span>
</div>
<div class="tower-info-row">
<span class="tower-info-label">MCC / MNC</span>
<span class="tower-info-value">${tower.mcc} / ${tower.mnc}</span>
<span class="tower-info-value">${escapeHtml(tower.mcc)} / ${escapeHtml(tower.mnc)}</span>
</div>
<div class="tower-info-row">
<span class="tower-info-label">LAC</span>
<span class="tower-info-value">${tower.lac}</span>
<span class="tower-info-value">${escapeHtml(tower.lac)}</span>
</div>
<div class="tower-info-row">
<span class="tower-info-label">ARFCN</span>
<span class="tower-info-value">${tower.arfcn}</span>
<span class="tower-info-value">${escapeHtml(tower.arfcn)}</span>
</div>
<div class="tower-info-row">
<span class="tower-info-label">Signal (dBm)</span>
<span class="tower-info-value">${tower.signal || 'N/A'}</span>
<span class="tower-info-value">${escapeHtml(tower.signal || 'N/A')}</span>
</div>
<div class="tower-info-row">
<span class="tower-info-label">Location</span>
@@ -1877,14 +1885,14 @@
for (const [key, tower] of Object.entries(towers)) {
const selected = key === selectedTowerKey ? 'selected' : '';
html += `
<div class="list-item ${selected}" onclick="selectTower('${key}')">
<div class="list-item ${selected}" onclick="selectTower('${escapeHtml(key)}')">
<div class="list-item-header">
<span class="list-item-id">CID ${tower.cid}</span>
<span class="list-item-meta">${tower.mcc}-${tower.mnc}</span>
<span class="list-item-id">CID ${escapeHtml(tower.cid)}</span>
<span class="list-item-meta">${escapeHtml(tower.mcc)}-${escapeHtml(tower.mnc)}</span>
${tower.rogue ? '<span class="rogue-indicator"></span>' : ''}
</div>
<div class="list-item-details">
LAC ${tower.lac} | ARFCN ${tower.arfcn} | ${tower.signal || 'N/A'} dBm
LAC ${escapeHtml(tower.lac)} | ARFCN ${escapeHtml(tower.arfcn)} | ${escapeHtml(tower.signal || 'N/A')} dBm
</div>
</div>
`;
@@ -1900,6 +1908,13 @@
const key = data.imsi || data.tmsi || `device_${Date.now()}`;
devices[key] = data;
// Check if device has valid coordinates before creating marker
if (!data.lat || !data.lon) {
console.warn('[GSM SPY] Device has no coordinates, skipping map marker:', key);
updateDevicesList();
return;
}
// Create device marker with vector icon
const marker = L.marker([data.lat, data.lon], {
icon: createGSMMarkerIcon('device', '#00d9ff', false, false)
@@ -1951,14 +1966,17 @@
let html = '';
for (const [key, device] of Object.entries(devices)) {
const identifier = device.imsi || device.tmsi || 'Unknown';
const location = (device.lat && device.lon)
? `${device.lat.toFixed(6)}, ${device.lon.toFixed(6)}`
: 'Location unknown';
html += `
<div class="list-item">
<div class="list-item-header">
<span class="list-item-id">${identifier}</span>
<span class="list-item-id">${escapeHtml(identifier)}</span>
<span class="list-item-meta">${new Date(device.timestamp).toLocaleTimeString()}</span>
</div>
<div class="list-item-details">
Tower CID ${device.cid} | ${device.lat.toFixed(6)}, ${device.lon.toFixed(6)}
Tower CID ${escapeHtml(device.cid)} | ${escapeHtml(location)}
</div>
</div>
`;
@@ -1983,7 +2001,7 @@
<div class="alert-time">${new Date(data.timestamp).toLocaleTimeString()}</div>
<div class="alert-message">
⚠ ROGUE TOWER DETECTED<br>
CID ${data.cid} | MCC ${data.mcc} MNC ${data.mnc} | ${data.reason || 'Unknown threat'}
CID ${escapeHtml(data.cid)} | MCC ${escapeHtml(data.mcc)} MNC ${escapeHtml(data.mnc)} | ${escapeHtml(data.reason || 'Unknown threat')}
</div>
`;