${escapeHtml(client.mac)}
${vendorBadge}
@@ -4895,6 +4907,116 @@
list.innerHTML = html;
}
+ // Select a WiFi network or client for detailed view
+ function selectWifiDevice(id, type) {
+ selectedWifiDevice = id;
+ selectedWifiType = type;
+ updateWifiSelectedDevice();
+ }
+
+ // Update the selected WiFi device panel
+ function updateWifiSelectedDevice() {
+ const panel = document.getElementById('wifiSelectedDevice');
+ if (!panel) return;
+
+ if (!selectedWifiDevice) {
+ panel.innerHTML = '
Click a network or client to view details
';
+ return;
+ }
+
+ if (selectedWifiType === 'network') {
+ const net = wifiNetworks[selectedWifiDevice];
+ if (!net) {
+ panel.innerHTML = '
Network no longer visible
';
+ return;
+ }
+
+ const power = parseInt(net.power) || -100;
+ const signalPercent = Math.max(0, Math.min(100, (power + 100) * 2));
+ const signalColor = power >= -50 ? 'var(--accent-green)' : power >= -70 ? 'var(--accent-orange)' : 'var(--accent-red)';
+
+ panel.innerHTML = `
+
+
+
${escapeHtml(net.essid || '[Hidden]')}
+
${escapeHtml(net.bssid)}
+
+
+
SIGNAL
+
${power} dBm
+
+
+
+
CHANNEL
+
${net.channel}
+
+
+
SECURITY
+
${escapeHtml(net.privacy || 'Unknown')}
+
+
+
BEACONS
+
${net.beacons || 0}
+
+
+
+
+
+
+ `;
+ } else if (selectedWifiType === 'client') {
+ const client = wifiClients[selectedWifiDevice];
+ if (!client) {
+ panel.innerHTML = '
Client no longer visible
';
+ return;
+ }
+
+ const power = parseInt(client.power) || -100;
+ const signalPercent = Math.max(0, Math.min(100, (power + 100) * 2));
+ const signalColor = power >= -50 ? 'var(--accent-green)' : power >= -70 ? 'var(--accent-orange)' : 'var(--accent-red)';
+ const probes = (client.probes || '').split(',').map(p => p.trim()).filter(p => p);
+ const associatedNet = client.bssid && wifiNetworks[client.bssid];
+
+ panel.innerHTML = `
+
+
+
CLIENT DEVICE
+
${escapeHtml(client.mac)}
+ ${client.vendor ? `
${escapeHtml(client.vendor)}
` : ''}
+
+
+
SIGNAL
+
${power} dBm
+
+
+
+
PACKETS
+
${client.packets || 0}
+
+ ${associatedNet ? `
+
+
CONNECTED TO
+
${escapeHtml(associatedNet.essid || associatedNet.bssid)}
+
+ ` : ''}
+ ${probes.length > 0 ? `
+
+
PROBING FOR
+
+ ${probes.slice(0, 5).map(p => `${escapeHtml(p)}`).join('')}
+ ${probes.length > 5 ? `+${probes.length - 5} more` : ''}
+
+
+ ` : ''}
+
+ `;
+ }
+ }
+
// Add WiFi network card to output
function addWifiNetworkCard(net, isNew) {
const output = document.getElementById('output');
@@ -4911,11 +5033,18 @@
card.style.borderLeftColor = net.privacy.includes('WPA') ? 'var(--accent-orange)' :
net.privacy.includes('WEP') ? 'var(--accent-red)' :
'var(--accent-green)';
+ card.style.cursor = 'pointer';
+ card.onclick = () => selectWifiDevice(net.bssid, 'network');
output.insertBefore(card, output.firstChild);
}
- const signalStrength = parseInt(net.power) || -100;
- const signalBars = Math.max(0, Math.min(5, Math.floor((signalStrength + 100) / 15)));
+ // Handle signal strength - airodump returns -1 when not measured
+ let signalStrength = parseInt(net.power);
+ if (isNaN(signalStrength) || signalStrength === -1) {
+ signalStrength = null; // No reading available
+ }
+ const signalBars = signalStrength !== null ? Math.max(0, Math.min(5, Math.floor((signalStrength + 100) / 15))) : 0;
+ const signalDisplay = signalStrength !== null ? `${signalStrength} dBm` : 'N/A';
const wpsEnabled = net.wps === '1' || net.wps === 'Yes' || (net.privacy || '').includes('WPS');
const wpsHtml = wpsEnabled ? '
WPS' : '';
@@ -4936,7 +5065,7 @@