diff --git a/backend/package-lock.json b/backend/package-lock.json index 1ec788e..980f426 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -15,7 +15,6 @@ "express": "^4.21.2", "express-rate-limit": "^7.5.0", "macaddress": "^0.5.3", - "oui": "^13.0.5", "pino": "^9.6.0", "pino-pretty": "^13.0.0", "whois-json": "^2.0.4" @@ -905,22 +904,6 @@ "wrappy": "1" } }, - "node_modules/oui": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/oui/-/oui-13.0.5.tgz", - "integrity": "sha512-bAXoXcLrl3SweuEuh8aWpdTsfHka6B7Gh1SxsTZMXtWi9QSxQk7CupxWlP2QQ4olTDifaWAiQbROMxfarAQZlQ==", - "dependencies": { - "oui-data": "^1.1.76" - }, - "bin": { - "oui": "bin/oui.js" - } - }, - "node_modules/oui-data": { - "version": "1.1.314", - "resolved": "https://registry.npmjs.org/oui-data/-/oui-data-1.1.314.tgz", - "integrity": "sha512-F8r1LwdAucn6Fgq1KECZPMCpMgXPdhCblFOY/eQ6S83x5lfQQK9aRRIpz7dH6iQeAeqoSP1b4I8z4lqUaTwAvg==" - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", diff --git a/backend/package.json b/backend/package.json index e94e1af..28dc974 100644 --- a/backend/package.json +++ b/backend/package.json @@ -16,7 +16,6 @@ "express": "^4.21.2", "express-rate-limit": "^7.5.0", "macaddress": "^0.5.3", - "oui": "^13.0.5", "pino": "^9.6.0", "pino-pretty": "^13.0.0", "whois-json": "^2.0.4" diff --git a/backend/server.js b/backend/server.js index 2be6a19..55f578b 100644 --- a/backend/server.js +++ b/backend/server.js @@ -9,7 +9,7 @@ const dns = require('dns').promises; const pino = require('pino'); // Logging library const rateLimit = require('express-rate-limit'); // Rate limiting middleware const whois = require('whois-json'); // Hinzugefügt für WHOIS -const oui = require('oui'); // Ersetzt macaddress für OUI Lookup +// REMOVED: const oui = require('oui'); // --- Logger Initialisierung --- const logger = pino({ @@ -86,21 +86,7 @@ function isValidDomain(domain) { return domainRegex.test(domain.trim()); } -/** - * Validiert eine MAC-Adresse. - * @param {string} mac - Die zu validierende MAC-Adresse. - * @returns {boolean} True, wenn gültig, sonst false. - */ -function isValidMac(mac) { - if (!mac || typeof mac !== 'string') { - return false; - } - // Erlaubt Formate wie 00:1A:2B:3C:4D:5E, 00-1A-2B-3C-4D-5E, 001A.2B3C.4D5E, 001a2b3c4d5e - // Die oui Bibliothek ist tolerant gegenüber verschiedenen Formaten. - const macRegex = /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$|^([0-9A-Fa-f]{4}\.){2}([0-9A-Fa-f]{4})$|^([0-9A-Fa-f]{12})$/; - return macRegex.test(mac.trim()); -} - +// REMOVED: isValidMac function /** * Bereinigt eine IP-Adresse (z.B. entfernt ::ffff: Präfix von IPv4-mapped IPv6). @@ -259,7 +245,7 @@ function parseTracerouteLine(line) { } -// --- Initialisierung (MaxMind DBs laden & OUI DB laden) --- +// --- Initialisierung (MaxMind DBs laden) --- async function initialize() { try { logger.info('Loading MaxMind databases...'); @@ -270,10 +256,7 @@ async function initialize() { asnReader = await geoip.Reader.open(asnDbPath); logger.info('MaxMind databases loaded successfully.'); - // OUI Datenbank laden (kann beim ersten Aufruf etwas dauern) - logger.info('Loading OUI database...'); - await oui.update(); // Sicherstellen, dass die DB aktuell ist (optional, aber empfohlen) - logger.info('OUI database loaded/updated.'); + // REMOVED: OUI database loading } catch (error) { logger.fatal({ error: error.message, stack: error.stack }, 'Could not initialize databases. Exiting.'); @@ -306,7 +289,7 @@ app.use('/api/traceroute', generalLimiter); app.use('/api/lookup', generalLimiter); app.use('/api/dns-lookup', generalLimiter); app.use('/api/whois-lookup', generalLimiter); -app.use('/api/mac-lookup', generalLimiter); +// REMOVED: app.use('/api/mac-lookup', generalLimiter); // --- Routen --- @@ -687,39 +670,7 @@ app.get('/api/whois-lookup', async (req, res) => { } }); -// MAC Address Lookup Endpunkt (mit 'oui' Bibliothek) -app.get('/api/mac-lookup', async (req, res) => { - const macRaw = req.query.mac; - const mac = typeof macRaw === 'string' ? macRaw.trim() : macRaw; - const requestIp = req.ip || req.socket.remoteAddress; - - logger.info({ requestIp, mac }, 'MAC lookup request received'); - - if (!isValidMac(mac)) { - logger.warn({ requestIp, mac }, 'Invalid MAC address format for lookup'); - return res.status(400).json({ success: false, error: 'Invalid MAC address format provided.' }); - } - - try { - // Verwende die oui Bibliothek für den Lookup. Sie sollte verschiedene Formate verarbeiten können. - // oui() gibt den Vendor-String oder null zurück. Es kann beim ersten Mal die DB laden. - const vendor = await oui(mac); // Verwende await, falls oui.update() im Hintergrund läuft - - if (vendor) { - logger.info({ requestIp, mac, vendor }, 'MAC lookup successful'); - res.json({ success: true, mac: mac, vendor: vendor }); - } else { - logger.info({ requestIp, mac }, 'MAC lookup successful, but no vendor found'); - res.json({ success: true, mac: mac, vendor: null, message: 'Vendor not found for this MAC address prefix.' }); - } - - } catch (error) { - // Fehler können auftreten, wenn die interne DB nicht geladen werden kann oder andere Probleme auftreten - logger.error({ requestIp, mac, error: error.message }, 'MAC lookup failed'); - res.status(500).json({ success: false, error: `MAC lookup failed: ${error.message}` }); - } -}); - +// REMOVED: MAC Address Lookup Endpunkt // Version Endpunkt app.get('/api/version', (req, res) => { @@ -740,7 +691,7 @@ initialize().then(() => { logger.info(` http://localhost:${PORT}/api/lookup?targetIp=`); logger.info(` http://localhost:${PORT}/api/dns-lookup?domain=&type=`); logger.info(` http://localhost:${PORT}/api/whois-lookup?query=`); - logger.info(` http://localhost:${PORT}/api/mac-lookup?mac=`); + // REMOVED: MAC lookup log message logger.info(` http://localhost:${PORT}/api/version`); }); }).catch(error => { diff --git a/frontend/app/index.html b/frontend/app/index.html index bc2d960..a95dd35 100644 --- a/frontend/app/index.html +++ b/frontend/app/index.html @@ -92,7 +92,7 @@
  • Subnetz Rechner
  • DNS Lookup
  • WHOIS Lookup
  • -
  • MAC Lookup
  • + diff --git a/frontend/app/mac-lookup.html b/frontend/app/mac-lookup.html deleted file mode 100644 index 8e8f071..0000000 --- a/frontend/app/mac-lookup.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - MAC Address Lookup - uTools - - - - - - - -
    -

    uTools Network Suite

    - -
    - -
    - -

    MAC Address Lookup

    - - -
    -
    - - -
    - - -
    - - - - - - - -
    - - - - - \ No newline at end of file diff --git a/frontend/app/mac-lookup.js b/frontend/app/mac-lookup.js deleted file mode 100644 index 76027d1..0000000 --- a/frontend/app/mac-lookup.js +++ /dev/null @@ -1,135 +0,0 @@ -// frontend/mac-lookup.js -document.addEventListener('DOMContentLoaded', () => { - // --- DOM Elements (MAC Lookup) --- - const macInput = document.getElementById('mac-input'); - const macLookupButton = document.getElementById('mac-lookup-button'); - const macLookupErrorEl = document.getElementById('mac-lookup-error'); - const macLookupResultsSection = document.getElementById('mac-lookup-results-section'); - const macLookupQueryEl = document.getElementById('mac-lookup-query'); - const macLookupLoader = document.getElementById('mac-lookup-loader'); - const macLookupOutputEl = document.getElementById('mac-lookup-output'); - const macLookupNotFoundEl = document.getElementById('mac-lookup-notfound'); - - // --- DOM Elements (Common) --- - const globalErrorEl = document.getElementById('global-error'); - const commitShaEl = document.getElementById('commit-sha'); - - // --- Configuration --- - const API_BASE_URL = '/api'; // Anpassen, falls nötig - - // --- Helper Functions --- - - /** Zeigt globale Fehler an */ - function showGlobalError(message) { - if (!globalErrorEl) return; - globalErrorEl.textContent = `Error: ${message}`; - globalErrorEl.classList.remove('hidden'); - } - - /** Versteckt globale Fehler */ - function hideGlobalError() { - if (!globalErrorEl) return; - globalErrorEl.classList.add('hidden'); - } - - /** - * Generische Funktion zum Abrufen und Anzeigen von Lookup-Ergebnissen. - * @param {string} endpoint - Der API-Endpunkt (z.B. '/mac-lookup'). - * @param {object} params - Query-Parameter als Objekt (z.B. { mac: '...' }). - * @param {HTMLElement} resultsSection - Der Container für die Ergebnisse. - * @param {HTMLElement} loaderElement - Das Loader-Element. - * @param {HTMLElement} errorElement - Das Fehleranzeige-Element für diesen Lookup. - * @param {HTMLElement} queryElement - Das Element zur Anzeige der Suchanfrage. - * @param {HTMLElement} outputElement - Das Element zur Anzeige der Ergebnisse (
     oder 

    ). - * @param {function} displayFn - Funktion zur Formatierung und Anzeige der Daten im outputElement. - */ - async function fetchAndDisplay(endpoint, params, resultsSection, loaderElement, errorElement, queryElement, outputElement, displayFn) { - resultsSection.classList.remove('hidden'); - loaderElement.classList.remove('hidden'); - errorElement.classList.add('hidden'); - outputElement.textContent = ''; // Clear previous results - if (macLookupNotFoundEl) macLookupNotFoundEl.classList.add('hidden'); // Hide 'not found' specifically for MAC - if (queryElement) queryElement.textContent = Object.values(params).join(', '); // Display query - hideGlobalError(); // Hide global errors before new request - - const urlParams = new URLSearchParams(params); - const url = `${API_BASE_URL}${endpoint}?${urlParams.toString()}`; - - try { - const response = await fetch(url); - const data = await response.json(); - - if (!response.ok || !data.success) { - throw new Error(data.error || `Request failed with status ${response.status}`); - } - - console.log(`Received ${endpoint} data:`, data); - displayFn(data, outputElement); // Call the specific display function - - } catch (error) { - console.error(`Failed to fetch ${endpoint}:`, error); - errorElement.textContent = `Error: ${error.message}`; - errorElement.classList.remove('hidden'); - outputElement.textContent = ''; // Clear output on error - } finally { - loaderElement.classList.add('hidden'); - } - } - - /** Ruft die Versionsinformationen (Commit SHA) ab */ - async function fetchVersionInfo() { - if (!commitShaEl) return; // Don't fetch if element doesn't exist - try { - const response = await fetch(`${API_BASE_URL}/version`); - if (!response.ok) throw new Error(`Network response: ${response.statusText} (${response.status})`); - const data = await response.json(); - commitShaEl.textContent = data.commitSha || 'unknown'; - } catch (error) { - console.error('Failed to fetch version info:', error); - commitShaEl.textContent = 'error'; - // Optionally show global error - // showGlobalError(`Could not load version info: ${error.message}`); - } - } - - // --- MAC Lookup Specific Functions --- - function displayMacResults(data, outputEl) { - macLookupNotFoundEl.classList.add('hidden'); // Hide not found message first - if (data.vendor) { - outputEl.textContent = data.vendor; - } else { - outputEl.textContent = ''; // Clear vendor text - macLookupNotFoundEl.classList.remove('hidden'); // Show not found message - } - } - - function handleMacLookupClick() { - const mac = macInput.value.trim(); - if (!mac) { - macLookupErrorEl.textContent = 'Please enter a MAC address.'; - macLookupErrorEl.classList.remove('hidden'); - return; - } - // Clear previous 'not found' message - macLookupNotFoundEl.classList.add('hidden'); - fetchAndDisplay( - '/mac-lookup', - { mac }, - macLookupResultsSection, - macLookupLoader, - macLookupErrorEl, - macLookupQueryEl, - macLookupOutputEl, // Pass the

    element - displayMacResults - ); - } - - // --- Initial Load & Event Listeners --- - fetchVersionInfo(); // Lade Versionsinfo für Footer - - macLookupButton.addEventListener('click', handleMacLookupClick); - macInput.addEventListener('keypress', (event) => { - if (event.key === 'Enter') handleMacLookupClick(); - }); - -}); // End DOMContentLoaded \ No newline at end of file