feat: 3 Scan-Modi (Quick/Web/Full) für Key Scanner
- Quick-Scan: nur GitHub mit Dotenv, Text, Markdown + .env - Web-Scan: nur Serper.dev (Google Dorks) - Full-Scan: GitHub + Serper komplett (wie bisher) - Backend: TriggerScan(mode), ScanGitHubQuick(), mode-basierte Quellsteuerung - Endpoint: ?mode=quick|web|full Query-Parameter - Frontend: 3 Buttons (⚡ Quick, 🌐 Web, 🔍 Full) mit gemeinsamer Scan-Logik - Status-Anzeige zeigt Scan-Modus im Ergebnis
This commit is contained in:
1 parent
ed8e5af428
commit
558ded1ed5
5 files changed
+117
-25
No files matched your search
+3
-1
@@ -580,7 +580,9 @@
|
||||
<h2>Key Scanner</h2>
|
||||
<div style="display:flex;gap:.5rem;align-items:center">
|
||||
<span id="scanStatus" class="admin-user-meta" style="font-size:.85em"></span>
|
||||
<button id="scanTriggerBtn" class="section-add-btn"><i class="fa fa-search"></i> Jetzt scannen</button>
|
||||
<button id="scanQuickBtn" class="section-add-btn"><i class="fa fa-bolt"></i> Quick</button>
|
||||
<button id="scanWebBtn" class="section-add-btn"><i class="fa fa-globe"></i> Web</button>
|
||||
<button id="scanFullBtn" class="section-add-btn"><i class="fa fa-search"></i> Full</button>
|
||||
</div>
|
||||
</div>
|
||||
<div id="scannedKeysList" class="admin-user-list"></div>
|
||||
|
||||
+1
-1
@@ -226,7 +226,7 @@ function apiCheckApiKey(id) { return _post('/api/admin/api-keys/' + id + '/check
|
||||
|
||||
// ── Key Scanner API (Admin) ──
|
||||
|
||||
function apiTriggerScan() { return _post('/api/admin/api-keys/scan', undefined, 'Fehler beim Starten des Scans'); }
|
||||
function apiTriggerScan(mode) { return _post('/api/admin/api-keys/scan?mode=' + (mode || 'full'), undefined, 'Fehler beim Starten des Scans'); }
|
||||
function apiScanStatus() { return _get('/api/admin/api-keys/scan/status', {}); }
|
||||
function apiGetScannedKeys() { return _get('/api/admin/api-keys/scanned', []); }
|
||||
function apiRecheckScannedKey(id) { return _post('/api/admin/api-keys/scanned/' + id + '/recheck', undefined, 'Fehler beim Prüfen'); }
|
||||
|
||||
@@ -318,7 +318,10 @@ registerPage('api-keys', {
|
||||
|
||||
// ── Scanner UI ──
|
||||
|
||||
var scanBtn = document.getElementById('scanTriggerBtn');
|
||||
var scanQuickBtn = document.getElementById('scanQuickBtn');
|
||||
var scanWebBtn = document.getElementById('scanWebBtn');
|
||||
var scanFullBtn = document.getElementById('scanFullBtn');
|
||||
var scanBtns = [scanQuickBtn, scanWebBtn, scanFullBtn];
|
||||
var scanStatusEl = document.getElementById('scanStatus');
|
||||
var scannedList = document.getElementById('scannedKeysList');
|
||||
var scannedKeys = [];
|
||||
@@ -435,14 +438,29 @@ registerPage('api-keys', {
|
||||
} catch (err) { showToast(err.message, 'error'); }
|
||||
}
|
||||
|
||||
var scanBtnDefaults = [
|
||||
{ btn: scanQuickBtn, icon: 'fa-bolt', label: 'Quick' },
|
||||
{ btn: scanWebBtn, icon: 'fa-globe', label: 'Web' },
|
||||
{ btn: scanFullBtn, icon: 'fa-search', label: 'Full' }
|
||||
];
|
||||
|
||||
function setScanButtonsDisabled(disabled) {
|
||||
scanBtnDefaults.forEach(function(d) { d.btn.disabled = disabled; });
|
||||
}
|
||||
|
||||
function resetScanButtons() {
|
||||
scanBtnDefaults.forEach(function(d) {
|
||||
d.btn.innerHTML = '<i class="fa ' + d.icon + '"></i> ' + d.label;
|
||||
d.btn.disabled = false;
|
||||
});
|
||||
}
|
||||
|
||||
async function updateScanStatus() {
|
||||
try {
|
||||
var s = await apiScanStatus();
|
||||
if (s.running) {
|
||||
scanStatusEl.textContent = '⏳ Scan läuft…';
|
||||
scanBtn.disabled = true;
|
||||
scanBtn.innerHTML = '<i class="fa fa-spinner fa-spin"></i> Läuft…';
|
||||
// Polling starten wenn noch nicht aktiv
|
||||
setScanButtonsDisabled(true);
|
||||
if (!pollTimer) {
|
||||
pollTimer = setInterval(async function() {
|
||||
var st = await apiScanStatus();
|
||||
@@ -450,15 +468,13 @@ registerPage('api-keys', {
|
||||
if (!st.running) {
|
||||
clearInterval(pollTimer);
|
||||
pollTimer = null;
|
||||
scanBtn.disabled = false;
|
||||
scanBtn.innerHTML = '<i class="fa fa-search"></i> Jetzt scannen';
|
||||
resetScanButtons();
|
||||
scanStatusEl.textContent = st.lastResult ? '✅ ' + st.lastResult : '';
|
||||
}
|
||||
}, 3000);
|
||||
}
|
||||
} else {
|
||||
scanBtn.disabled = false;
|
||||
scanBtn.innerHTML = '<i class="fa fa-search"></i> Jetzt scannen';
|
||||
resetScanButtons();
|
||||
if (s.lastResult) {
|
||||
var timeStr = s.lastRun ? new Date(s.lastRun).toLocaleString() + ' – ' : '';
|
||||
scanStatusEl.textContent = timeStr + s.lastResult;
|
||||
@@ -467,15 +483,22 @@ registerPage('api-keys', {
|
||||
} catch (err) { /* ignore */ }
|
||||
}
|
||||
|
||||
scanBtn.addEventListener('click', async function() {
|
||||
async function triggerScan(mode, btn) {
|
||||
try {
|
||||
await apiTriggerScan();
|
||||
showToast('Scan gestartet');
|
||||
btn.innerHTML = '<i class="fa fa-spinner fa-spin"></i> Läuft…';
|
||||
setScanButtonsDisabled(true);
|
||||
await apiTriggerScan(mode);
|
||||
showToast(mode.charAt(0).toUpperCase() + mode.slice(1) + '-Scan gestartet');
|
||||
await updateScanStatus();
|
||||
} catch (err) {
|
||||
showToast(err.message, 'error');
|
||||
resetScanButtons();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
scanQuickBtn.addEventListener('click', function() { triggerScan('quick', scanQuickBtn); });
|
||||
scanWebBtn.addEventListener('click', function() { triggerScan('web', scanWebBtn); });
|
||||
scanFullBtn.addEventListener('click', function() { triggerScan('full', scanFullBtn); });
|
||||
|
||||
await loadScannedKeys();
|
||||
await updateScanStatus();
|
||||
|
||||
Reference in new issue
Block a user