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:
Meleki committed 2026-03-13 20:43:20 +01:00
1 parent eb8844a4f1
commit c8859a89d0
9 files changed
+536 -52

No files matched your search

+14 -1
View File
@@ -29,6 +29,7 @@ public static class ApiKeysEndpoint
app.MapPost("/api/admin/api-keys/scan", HandleScanTrigger);
app.MapGet("/api/admin/api-keys/scan/status", HandleScanStatus);
app.MapGet("/api/admin/api-keys/scanned", HandleGetScanned);
app.MapGet("/api/admin/api-keys/scanned/summary", HandleGetScannedSummary);
app.MapPost("/api/admin/api-keys/scanned/recheck-all", HandleRecheckAll);
app.MapPost("/api/admin/api-keys/scanned/{id}/recheck", HandleRecheck);
app.MapPost("/api/admin/api-keys/scanned/{id}/adopt", HandleAdopt);
@@ -261,7 +262,11 @@ public static class ApiKeysEndpoint
{
if (!ctx.IsAdmin()) { ctx.Response.StatusCode = 403; return; }
var keys = await db.GetScannedKeys();
var type = ctx.Request.Query["type"].FirstOrDefault();
var keys = string.IsNullOrEmpty(type)
? await db.GetScannedKeys()
: await db.GetScannedKeysByType(type);
var result = keys.Select(k => new
{
k.ScannedKeyId,
@@ -279,6 +284,14 @@ public static class ApiKeysEndpoint
await ctx.Response.WriteAsJsonAsync(result);
}
private static async Task HandleGetScannedSummary(HttpContext ctx, DatabaseService db)
{
if (!ctx.IsAdmin()) { ctx.Response.StatusCode = 403; return; }
var summary = await db.GetScannedKeysSummary();
await ctx.Response.WriteAsJsonAsync(summary);
}
private static async Task HandleRecheckAll(HttpContext ctx, DatabaseService db, KeyScannerService scanner)
{
if (!ctx.IsAdmin()) { ctx.Response.StatusCode = 403; return; }