Multi-Provider Key Scanner + Checker (OpenAI, Google, 15 Key-Typen)
- KeyPatterns.cs: Zentrale Pattern-Klasse für 15 Key-Typen (Anthropic, OpenAI, Google, AWS, GitHub, GitLab, HuggingFace, Stripe, SendGrid, Slack) - OpenAiKeyChecker.cs: Prüft sk-proj/sk-svcacct/sk- Keys via /v1/models (Org, Modelle, RPM/TPM, Tier-Erkennung Free bis 5+) - GoogleKeyChecker.cs: Prüft AIza-Keys via Gemini /v1/models (Gemini-Modelle, Maps-Key-Erkennung) - KeyScannerService + GitHubEventScannerService: Dispatch nach Key-Typ - ApiKeysEndpoint: GET /scanned/summary + ?type= Filter - Frontend: 2-stufige UI (Typ-Übersicht → Keys pro Typ)
This commit is contained in:
1 parent
eb8844a4f1
commit
c8859a89d0
9 files changed
+536
-52
No files matched your search
@@ -31,15 +31,8 @@ public class GitHubEventScannerService : BackgroundService
|
||||
private const int MaxDiffSizeBytes = 100_000; // Diffs > 100KB überspringen
|
||||
private const int MaxProcessedIds = 10_000; // Ringbuffer für Event-Dedup
|
||||
|
||||
// Gleiche Key-Patterns wie KeyScannerService
|
||||
private static readonly (string Pattern, string SearchTerm)[] KeyPatterns =
|
||||
{
|
||||
(@"sk-ant-oat01-[A-Za-z0-9_\-]{95}", "sk-ant-oat01"),
|
||||
};
|
||||
|
||||
private static readonly Regex[] CompiledPatterns = KeyPatterns
|
||||
.Select(p => new Regex(p.Pattern, RegexOptions.Compiled))
|
||||
.ToArray();
|
||||
// Zentrale Key-Patterns aus KeyPatterns.cs
|
||||
private static readonly Regex[] CompiledPatterns = KeyPatterns.Compiled;
|
||||
|
||||
// Deduplication Ringbuffer
|
||||
private readonly HashSet<string> _processedEventIds = new();
|
||||
@@ -386,13 +379,31 @@ public class GitHubEventScannerService : BackgroundService
|
||||
foreach (var sk in unchecked_)
|
||||
{
|
||||
ct.ThrowIfCancellationRequested();
|
||||
var type = KeyPatterns.DetectType(sk.ApiKey);
|
||||
|
||||
try
|
||||
{
|
||||
var result = await AnthropicKeyChecker.CheckKeyAsync(_httpFactory, sk.ApiKey);
|
||||
var status = (result.Status == "ok" || result.Status == "usage_limited") ? "valid" : result.Status;
|
||||
await _db.UpdateScannedKeyStatus(sk.ScannedKeyId, status, result.Plan, result.Usage7d, result.Usage5h);
|
||||
_logger.LogInformation("Key geprüft: {Status} ({Plan})", status, result.Plan);
|
||||
if (KeyPatterns.IsAnthropic(type))
|
||||
{
|
||||
var result = await AnthropicKeyChecker.CheckKeyAsync(_httpFactory, sk.ApiKey);
|
||||
var status = (result.Status == "ok" || result.Status == "usage_limited") ? "valid" : result.Status;
|
||||
await _db.UpdateScannedKeyStatus(sk.ScannedKeyId, status, result.Plan, result.Usage7d, result.Usage5h);
|
||||
_logger.LogInformation("Key geprüft: {Status} ({Plan})", status, result.Plan);
|
||||
}
|
||||
else if (type == "openai_project" || type == "openai_service" || type == "openai_legacy")
|
||||
{
|
||||
var result = await OpenAiKeyChecker.CheckKeyAsync(_httpFactory, sk.ApiKey);
|
||||
var status = result.Status == "ok" ? "valid" : result.Status;
|
||||
await _db.UpdateScannedKeyStatus(sk.ScannedKeyId, status, result.Message, null, null);
|
||||
_logger.LogInformation("OpenAI Key geprüft: {Status}", status);
|
||||
}
|
||||
else if (type == "google_api")
|
||||
{
|
||||
var result = await GoogleKeyChecker.CheckKeyAsync(_httpFactory, sk.ApiKey);
|
||||
var status = result.Status == "ok" ? "valid" : result.Status;
|
||||
await _db.UpdateScannedKeyStatus(sk.ScannedKeyId, status, result.Message, null, null);
|
||||
_logger.LogInformation("Google Key geprüft: {Status}", status);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -443,13 +454,7 @@ public class GitHubEventScannerService : BackgroundService
|
||||
return client;
|
||||
}
|
||||
|
||||
private static string DetectKeyType(string key)
|
||||
{
|
||||
if (key.StartsWith("sk-ant-oat01-", StringComparison.Ordinal)) return "anthropic_oauth";
|
||||
if (key.StartsWith("sk-ant-api03-", StringComparison.Ordinal)) return "anthropic_api";
|
||||
if (key.StartsWith("sk-ant-", StringComparison.Ordinal)) return "anthropic_unknown";
|
||||
return "unknown";
|
||||
}
|
||||
private static string DetectKeyType(string key) => KeyPatterns.DetectType(key);
|
||||
|
||||
// ── Interne Datenstrukturen ──
|
||||
|
||||
|
||||
Reference in new issue
Block a user