feat: Stripe-Key-Checker, Krea AI Pattern, Scan-Progress-Tracking

- StripeKeyChecker: 2-Schritt-Check (/v1/balance + /v1/account), Live/Test-Erkennung, Balance, Account-Details
- KeyPatterns: Stripe-Patterns einkommentiert (sk_live_, sk_test_), Krea AI Pattern (UUID:Token), Mindest-Suchlänge 4
- KeyScannerService: Stripe-Check integriert, Auto-Check nach Scan entfernt (manuell separat), Progress-Tracking (Phase, Detail, Current/Total, KeysFound)
- ApiKeysEndpoint: Stripe in HandleCheck/HandleCheckAll/HandleAdopt, Progress im Status-Endpoint
- Frontend: Live-Fortschrittsanzeige mit Spinner, Phase, Query, Counter, Polling 1.5s, Krea AI in typeNames/typeIcons
This commit is contained in:
Meleki committed 2026-03-14 14:34:02 +01:00
1 parent 122000487c
commit 3cd35ebbfa
6 files changed
+326 -14

No files matched your search

+3 -3
View File
@@ -557,8 +557,6 @@
<h1>API-Keys</h1>
</header>
<div class="page-content">
<div id="eventScannerStatus" style="display:none;padding:1em;"></div>
<div class="form">
<div class="section-header">
<h2>API-Key</h2>
@@ -585,17 +583,19 @@
</div>
</div>
<div id="eventScannerStatus" style="display:none;padding:1em 2em;"></div>
<div class="form">
<div class="section-header">
<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="recheckAllScannedBtn" class="section-add-btn"><i class="fa fa-refresh"></i> Alle prüfen</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="scanStatus" style="font-size:.85em;color:var(--text-secondary);padding:0 0 .5rem 0"></div>
<div id="scannedKeysList" class="admin-user-list"></div>
<div class="form-actions">
<button hidden>&nbsp;</button>
+24 -8
View File
@@ -333,7 +333,7 @@ registerPage('api-keys', {
google_api: 'Google / Gemini', aws_access_key: 'AWS Access Key',
github_pat: 'GitHub PAT', github_oauth: 'GitHub OAuth', gitlab_pat: 'GitLab PAT',
huggingface: 'HuggingFace', stripe_live: 'Stripe Live', stripe_test: 'Stripe Test',
sendgrid: 'SendGrid', slack: 'Slack'
sendgrid: 'SendGrid', slack: 'Slack', krea_ai: 'Krea AI'
};
var typeIcons = {
@@ -342,7 +342,7 @@ registerPage('api-keys', {
google_api: '🔵', aws_access_key: '🟡',
github_pat: '⚫', github_oauth: '⚫', gitlab_pat: '🟤',
huggingface: '🤗', stripe_live: '💳', stripe_test: '💳',
sendgrid: '📧', slack: '💬'
sendgrid: '📧', slack: '💬', krea_ai: '🎨'
};
function renderSummary(summary) {
@@ -673,29 +673,45 @@ registerPage('api-keys', {
} catch(e) { el.style.display = 'none'; }
}
function formatScanProgress(s) {
var parts = [];
if (s.phase) parts.push(s.phase);
if (s.total > 0) parts.push(s.current + '/' + s.total);
if (s.detail && s.detail !== s.phase) {
var d = s.detail.length > 60 ? s.detail.substring(0, 57) + '…' : s.detail;
parts.push(d);
}
if (s.keysFound > 0) parts.push('🔑 ' + s.keysFound + ' gefunden');
return parts.join(' · ');
}
async function updateScanStatus() {
try {
var s = await apiScanStatus();
if (s.running) {
scanStatusEl.textContent = '⏳ Scan läuft…';
var progressText = formatScanProgress(s);
scanStatusEl.innerHTML = '<i class="fa fa-spinner fa-spin"></i> ' + (progressText || 'Scan läuft…');
setScanButtonsDisabled(true);
if (!pollTimer) {
pollTimer = setInterval(async function() {
var st = await apiScanStatus();
await loadScannedKeys();
if (!st.running) {
if (st.running) {
var pt = formatScanProgress(st);
scanStatusEl.innerHTML = '<i class="fa fa-spinner fa-spin"></i> ' + (pt || 'Scan läuft…');
} else {
clearInterval(pollTimer);
pollTimer = null;
resetScanButtons();
scanStatusEl.textContent = st.lastResult ? '✅ ' + st.lastResult : '';
await loadScannedKeys();
scanStatusEl.innerHTML = st.lastResult ? '✅ ' + st.lastResult : '';
}
}, 3000);
}, 1500);
}
} else {
resetScanButtons();
if (s.lastResult) {
var timeStr = s.lastRun ? new Date(s.lastRun).toLocaleString() + ' – ' : '';
scanStatusEl.textContent = timeStr + s.lastResult;
scanStatusEl.innerHTML = timeStr + s.lastResult;
}
}
} catch (err) { /* ignore */ }