Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/caiotomaza_govcert.json
T

1 line
16 KiB
JSON

{"repo": "caiotomaza/govcert", "files": {"src/database/seeders/DatabaseSeeder.php": {"82c0efc0cd956caf8c7b92e7a5e6ca501e0d761b": {"t": 1785746154.490161, "n": 15373, "h": "bbe1d91eb97c1f6e", "c": "<?php\n\nnamespace Database\\Seeders;\n\nuse App\\Models\\ActivityLog;\nuse App\\Models\\AiProviderSetting;\nuse App\\Models\\AuditLog;\nuse App\\Models\\TokenAlert;\nuse App\\Models\\TokenAlertEvent;\nuse App\\Models\\User;\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Collection;\nuse Illuminate\\Support\\Facades\\Hash;\n\nclass DatabaseSeeder extends Seeder\n{\n public function run(): void\n {\n $users = $this->seedUsers();\n $this->seedAuditLogs($users);\n $this->seedTokenAlerts($users);\n $this->seedSystemSettings();\n $this->seedActivityLogs($users);\n\n $totalUsers = User::count();\n $totalLogs = AuditLog::count();\n\n $this->command->newLine();\n $this->command->info(\"✓ Seed concluído: {$totalUsers} usuários, {$totalLogs} logs de auditoria.\");\n $this->command->newLine();\n $this->command->line(' Painel (admin): admin@govcert.gov.br / admin123');\n $this->command->line(' Painel (auditor): auditor@govcert.gov.br / auditor123');\n $this->command->line(' Extensão: maria.silva@govcert.gov.br / usuario123');\n $this->command->line(' Inativo (bloq.): bloqueado@govcert.gov.br / usuario123');\n $this->command->newLine();\n }\n\n // ── Usuários ─────────────────────────────────────────────────────────────\n\n private function seedUsers(): Collection\n {\n // Admins\n $admin = User::factory()->admin()->create([\n 'name' => 'Administrador GovCert',\n 'email' => 'admin@govcert.gov.br',\n 'password' => Hash::make('admin123'),\n ]);\n\n $chefe = User::factory()->admin()->create([\n 'name' => 'Chefe de Segurança',\n 'email' => 'chefe@govcert.gov.br',\n 'password' => Hash::make('admin123'),\n ]);\n\n // Auditor\n $auditor = User::factory()->auditor()->create([\n 'name' => 'Auditor GovCert',\n 'email' => 'auditor@govcert.gov.br',\n 'password' => Hash::make('auditor123'),\n ]);\n\n // Usuários comuns — perfis distintos de consumo de tokens\n $maria = User::factory()->usuario()->create([\n 'name' => 'Maria Silva',\n 'email' => 'maria.silva@govcert.gov.br',\n 'password' => Hash::make('usuario123'),\n ]);\n\n $joao = User::factory()->usuario()->create([\n 'name' => 'João Santos',\n 'email' => 'joao.santos@govcert.gov.br',\n 'password' => Hash::make('usuario123'),\n ]);\n\n $ana = User::factory()->usuario()->create([\n 'name' => 'Ana Lima',\n 'email' => 'ana.lima@govcert.gov.br',\n 'password' => Hash::make('usuario123'),\n ]);\n\n $pedro = User::factory()->usuario()->create([\n 'name' => 'Pedro Costa',\n 'email' => 'pedro.costa@govcert.gov.br',\n 'password' => Hash::make('usuario123'),\n ]);\n\n $lucas = User::factory()->usuario()->create([\n 'name' => 'Lucas Ferreira',\n 'email' => 'lucas.ferreira@govcert.gov.br',\n 'password' => Hash::make('usuario123'),\n ]);\n\n $carla = User::factory()->usuario()->create([\n 'name' => 'Carla Moura',\n 'email' => 'carla.moura@govcert.gov.br',\n 'password' => Hash::make('usuario123'),\n ]);\n\n $rafael = User::factory()->usuario()->create([\n 'name' => 'Rafael Almeida',\n 'email' => 'rafael.almeida@govcert.gov.br',\n 'password' => Hash::make('usuario123'),\n ]);\n\n $bianca = User::factory()->usuario()->create([\n 'name' => 'Bianca Rocha',\n 'email' => 'bianca.rocha@govcert.gov.br',\n 'password' => Hash::make('usuario123'),\n ]);\n\n // Usuário inativo — para testar bloqueio da API\n User::factory()->usuario()->inactive()->create([\n 'name' => 'Usuário Bloqueado',\n 'email' => 'bloqueado@govcert.gov.br',\n 'password' => Hash::make('usuario123'),\n ]);\n\n return collect(compact(\n 'admin', 'chefe', 'auditor',\n 'maria', 'joao', 'ana', 'pedro',\n 'lucas', 'carla', 'rafael', 'bianca'\n ));\n }\n\n // ── Logs de auditoria ────────────────────────────────────────────────────\n\n private function seedAuditLogs(Collection $users): void\n {\n /**\n * Perfis de consumo (consumption) e volume (count):\n *\n * admin → alto (40 logs) — usa extensão p/ auditoria interna\n * chefe → médio-alto (30 logs)\n * auditor → médio (20 logs)\n * maria → baixo consumo: poucos logs, poucos tokens\n * joao → médio consumo\n * ana → alto consumo: muitos logs, tokens altos\n * pedro → crítico: 100+ logs, tokens muito altos\n * lucas → muitos logs pequenos (heatmap de qtd alta, tokens baixo)\n * carla → poucos logs enormes (heatmap de tokens alto, qtd baixo)\n * rafael → alto risco c/ dados sensíveis\n * bianca → uso normal, sem dados sensíveis\n */\n $profiles = [\n 'admin' => ['count' => 40, 'consumption' => 'high'],\n 'chefe' => ['count' => 30, 'consumption' => 'medium'],\n 'auditor' => ['count' => 20, 'consumption' => 'medium'],\n 'maria' => ['count' => 7, 'consumption' => 'low'],\n 'joao' => ['count' => 22, 'consumption' => 'medium'],\n 'ana' => ['count' => 55, 'consumption' => 'high'],\n 'pedro' => ['count' => 110, 'consumption' => 'critical'],\n 'lucas' => ['count' => 80, 'consumption' => 'low'],\n 'carla' => ['count' => 8, 'consumption' => 'critical'],\n 'rafael' => ['count' => 35, 'consumption' => 'high'],\n 'bianca' => ['count' => 18, 'consumption' => 'low'],\n ];\n\n foreach ($profiles as $key => $profile) {\n $user = $users[$key];\n\n foreach (range(1, $profile['count']) as $_) {\n AuditLog::factory()\n ->scenario($profile['consumption'])\n ->create([\n 'user_id' => $user->id,\n 'user_identifier' => $user->email,\n ]);\n }\n }\n }\n\n // ── Alertas de tokens ────────────────────────────────────────────────────\n\n private function seedTokenAlerts(Collection $users): void\n {\n // Alerta 1 — Pedro Costa: limite mensal ultrapassado (critical)\n $alertPedro = TokenAlert::create([\n 'user_id' => $users['pedro']->id,\n 'threshold_tokens' => 50_000,\n 'period' => 'monthly',\n 'notify_user' => true,\n 'notify_auditors' => true,\n 'notify_admins' => true,\n 'notify_email' => null,\n 'is_active' => true,\n 'created_by' => $users['admin']->id,\n 'last_triggered_at' => now()->subHours(3),\n ]);\n\n // Evento de disparo — Pedro já ultrapassou\n TokenAlertEvent::create([\n 'token_alert_id' => $alertPedro->id,\n 'user_id' => $users['pedro']->id,\n 'current_tokens' => AuditLog::where('user_id', $users['pedro']->id)->sum('total_tokens'),\n 'threshold_tokens' => 50_000,\n 'triggered_at' => now()->subHours(3),\n 'notified_targets' => [$users['pedro']->email, $users['admin']->email, $users['auditor']->email],\n ]);\n\n // Alerta 2 — Ana Lima: mensal ativo\n TokenAlert::create([\n 'user_id' => $users['ana']->id,\n 'threshold_tokens' => 30_000,\n 'period' => 'monthly',\n 'notify_user' => false,\n 'notify_auditors' => true,\n 'notify_admins' => false,\n 'notify_email' => null,\n 'is_active' => true,\n 'created_by' => $users['admin']->id,\n 'last_triggered_at' => null,\n ]);\n\n // Alerta 3 — Carla Moura: semanal ativo\n TokenAlert::create([\n 'user_id' => $users['carla']->id,\n 'threshold_tokens' => 20_000,\n 'period' => 'weekly',\n 'notify_user' => true,\n 'notify_auditors' => true,\n 'notify_admins' => false,\n 'notify_email' => null,\n 'is_active' => true,\n 'created_by' => $users['chefe']->id,\n 'last_triggered_at' => null,\n ]);\n\n // Alerta 4 — Global mensal\n $alertGlobal = TokenAlert::create([\n 'user_id' => null,\n 'threshold_tokens' => 100_000,\n 'period' => 'monthly',\n 'notify_user' => false,\n 'notify_auditors' => true,\n 'notify_admins' => true,\n 'notify_email' => null,\n 'is_active' => true,\n 'created_by' => $users['admin']->id,\n 'last_triggered_at' => now()->subDay(),\n ]);\n\n // Evento de disparo — alerta global\n TokenAlertEvent::create([\n 'token_alert_id' => $alertGlobal->id,\n 'user_id' => null,\n 'current_tokens' => AuditLog::sum('total_tokens'),\n 'threshold_tokens' => 100_000,\n 'triggered_at' => now()->subDay(),\n 'notified_targets' => [$users['admin']->email, $users['auditor']->email],\n ]);\n\n // Alerta 5 — Lucas Ferreira: diário inativo\n TokenAlert::create([\n 'user_id' => $users['lucas']->id,\n 'threshold_tokens' => 10_000,\n 'period' => 'daily',\n 'notify_user' => true,\n 'notify_auditors' => false,\n 'notify_admins' => false,\n 'notify_email' => null,\n 'is_active' => false,\n 'created_by' => $users['chefe']->id,\n 'last_triggered_at' => null,\n ]);\n }\n\n // ── Configurações do sistema ──────────────────────────────────────────────\n\n private function seedSystemSettings(): void\n {\n // Provedor ativo — Gemini sem chave real (use .env em dev)\n AiProviderSetting::create([\n 'provider' => 'gemini',\n 'model' => 'gemini-2.5-flash',\n 'base_url' => null,\n 'api_key_encrypted' => null,\n 'timeout_seconds' => 30,\n 'is_active' => true,\n 'last_tested_at' => null,\n 'last_test_status' => null,\n ]);\n\n // DeepSeek inativo\n AiProviderSetting::create([\n 'provider' => 'deepseek',\n 'model' => 'deepseek-chat',\n 'base_url' => 'https://api.deepseek.com/v1',\n 'api_key_encrypted' => null,\n 'timeout_seconds' => 30,\n 'is_active' => false,\n 'last_tested_at' => null,\n 'last_test_status' => null,\n ]);\n\n // Grok inativo\n AiProviderSetting::create([\n 'provider' => 'grok',\n 'model' => 'grok-beta',\n 'base_url' => 'https://api.x.ai/v1',\n 'api_key_encrypted' => null,\n 'timeout_seconds' => 30,\n 'is_active' => false,\n 'last_tested_at' => null,\n 'last_test_status' => null,\n ]);\n }\n\n // ── Trilha de atividades ──────────────────────────────────────────────────\n\n private function seedActivityLogs(Collection $users): void\n {\n $entries = [\n [\n 'user_id' => $users['admin']->id,\n 'action' => 'auth.login',\n 'description' => 'Autenticou no sistema',\n 'subject_type' => null,\n 'subject_id' => null,\n 'ip_address' => '192.168.1.10',\n 'properties' => null,\n 'created_at' => now()->subDays(30),\n ],\n [\n 'user_id' => $users['admin']->id,\n 'action' => 'settings.ai-provider-updated',\n 'description' => 'Configuração de provedor de IA atualizada: Gemini (gemini-2.5-flash).',\n 'subject_type' => AiProviderSetting::class,\n 'subject_id' => 1,\n 'ip_address' => '192.168.1.10',\n 'properties' => ['provider' => 'gemini', 'model' => 'gemini-2.5-flash'],\n 'created_at' => now()->subDays(29),\n ],\n [\n 'user_id' => $users['admin']->id,\n 'action' => 'settings.ai-provider-tested',\n 'description' => 'Teste de API do provedor Gemini (gemini-2.5-flash): sucesso.',\n 'subject_type' => null,\n 'subject_id' => null,\n 'ip_address' => '192.168.1.10',\n 'properties' => ['provider' => 'gemini', 'model' => 'gemini-2.5-flash', 'success' => true],\n 'created_at' => now()->subDays(29),\n ],\n [\n 'user_id' => $users['admin']->id,\n 'action' => 'user.created',\n 'description' => 'Cadastrou o usuário pedro.costa@govcert.gov.br com perfil usuario.',\n 'subject_type' => User::class,\n 'subject_id' => $users['pedro']->id,\n 'ip_address' => '192.168.1.10',\n 'properties' => ['role' => 'usuario', 'email' => 'pedro.costa@govcert.gov.br'],\n 'created_at' => now()->subDays(28),\n ],\n [\n 'user_id' => $users['chefe']->id,\n 'action' => 'user.updated',\n 'description' => 'Editou o usuário auditor@govcert.gov.br',\n 'subject_type' => User::class,\n 'subject_id' => $users['auditor']->id,\n 'ip_address' => '10.0.0.5',\n 'properties' => ['de' => ['name' => 'Auditor'], 'para' => ['name' => 'Auditor GovCert']],\n 'created_at' => now()->subDays(15),\n ],\n [\n 'user_id' => $users['admin']->id,\n 'action' => 'token_alert.triggered',\n 'description' => 'Alerta de tokens disparado: limite de 50000 tokens (monthly) atingido com 150000 tokens.',\n 'subject_type' => TokenAlert::class,\n 'subject_id' => 1,\n 'ip_address' => '127.0.0.1',\n 'properties' => ['alert_id' => 1, 'current_tokens' => 150000],\n 'created_at' => now()->subHours(3),\n ],\n [\n 'user_id' => $users['auditor']->id,\n 'action' => 'auth.login',\n 'description' => 'Autenticou no sistema',\n 'subject_type' => null,\n 'subject_id' => null,\n 'ip_address' => '10.0.0.8',\n 'properties' => null,\n 'created_at' => now()->subHours(2),\n ],\n ];\n\n foreach ($entries as $entry) {\n ActivityLog::create([\n 'user_id' => $entry['user_id'],\n 'action' => $entry['action'],\n 'description' => $entry['description'],\n 'subject_type' => $entry['subject_type'] ?? null,\n 'subject_id' => $entry['subject_id'] ?? null,\n 'ip_address' => $entry['ip_address'],\n 'user_agent' => 'GovCert/Seed',\n 'properties' => $entry['properties'] ?? null,\n 'created_at' => $entry['created_at'],\n ]);\n }\n }\n}\n"}}}}