import { messages } from '../../../core/messages/index.js';
import { splitLines } from '../../../shared/helpers/index.js';
import { criarOcorrencia } from '../../../types/index.js';
import { isOrgVerificada } from './org-verified.js';
export const detectorWorkflowSecurity = {
    nome: 'detector-workflow-security',
    categoria: 'workflows',
    descricao: 'Detecta vulnerabilidades em GitHub Actions',
    test: (relPath) => /\.github\/workflows\/.*\.ya?ml$/i.test(relPath),
    aplicar: (src, relPath) => {
        if (!src)
            return [];
        const ocorrencias = [];
        const linhas = splitLines(src);
        const actionsSemShaPinning = [];
        linhas.forEach((linha, index) => {
            const numeroLinha = index + 1;
            if (/\$\{\{\s*github\.event\./.test(linha) && /run:/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'workflow-script-injection',
                    nivel: 'erro',
                    mensagem: messages.AnalistaGithubActionsMensagens.possibleScriptInjection,
                    relPath,
                    linha: numeroLinha,
                    sugestao: messages.AnalistaGithubActionsMensagens.possibleScriptInjectionSugestao
                }));
            }
            const usesMatch = linha.match(/uses:\s*([^\s@]+)@([^\s]+)/);
            if (usesMatch) {
                const [, actionRef, version] = usesMatch;
                if (/^v\d+/.test(version) && !isOrgVerificada(actionRef)) {
                    actionsSemShaPinning.push({ linha: numeroLinha, action: `${actionRef}@${version}` });
                }
            }
            if (/\b(KEY|TOKEN|SECRET|PASSWORD)\b.*[:=]\s*['"][^'"]+['"]/i.test(linha) && !/\$\{\{/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'workflow-hardcoded-secret',
                    nivel: 'erro',
                    mensagem: messages.AnalistaGithubActionsMensagens.hardcodedSecret,
                    relPath,
                    linha: numeroLinha,
                    sugestao: messages.AnalistaGithubActionsMensagens.hardcodedSecretSugestao
                }));
            }
            if (/\bsudo\s+/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'workflow-sudo-usage',
                    nivel: 'aviso',
                    mensagem: messages.AnalistaGithubActionsMensagens.sudoUsageDetected,
                    relPath,
                    linha: numeroLinha,
                    sugestao: messages.AnalistaGithubActionsMensagens.sudoUsageDetectedSugestao
                }));
            }
            if (/\/home\/runner\//.test(linha) || /\/tmp\//.test(linha)) {
                const isGitHubVar = /\$\{?\{?\s*(runner\.temp|GITHUB_WORKSPACE|RUNNER_TEMP)/.test(linha);
                const isComment = linha.trim().startsWith('#');
                const isCleanupCommand = /rm\s+-.+\/tmp\//.test(linha);
                if (!isGitHubVar && !isComment && !isCleanupCommand) {
                    ocorrencias.push(criarOcorrencia({
                        tipo: 'workflow-hardcoded-path',
                        nivel: 'info',
                        mensagem: messages.AnalistaGithubActionsMensagens.absoluteTempPathHardcoded,
                        relPath,
                        linha: numeroLinha,
                        sugestao: messages.AnalistaGithubActionsMensagens.absoluteTempPathHardcodedSugestao
                    }));
                }
            }
            if (/echo\s+.*::set-output\s+name=.*secret/i.test(linha) || (/echo\s+.*\$(SECRET|TOKEN|KEY)/i.test(linha) && !/::add-mask::/i.test(src))) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'workflow-sensitive-output',
                    nivel: 'erro',
                    mensagem: messages.AnalistaGithubActionsMensagens.possibleSecretExposure,
                    relPath,
                    linha: numeroLinha,
                    sugestao: messages.AnalistaGithubActionsMensagens.possibleSecretExposureSugestao
                }));
            }
            if (/pull_request_target:/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'workflow-pr-target',
                    nivel: 'erro',
                    mensagem: messages.AnalistaGithubActionsMensagens.pullRequestTargetExecutesForkCode,
                    relPath,
                    linha: numeroLinha,
                    sugestao: messages.AnalistaGithubActionsMensagens.pullRequestTargetExecutesForkCodeSugestao
                }));
            }
            if (/workflow_run:/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'workflow-run-trigger',
                    nivel: 'aviso',
                    mensagem: messages.AnalistaGithubActionsMensagens.workflowRunUnsafe,
                    relPath,
                    linha: numeroLinha,
                    sugestao: messages.AnalistaGithubActionsMensagens.workflowRunUnsafeSugestao
                }));
            }
            if (/checkout@v\d+/.test(linha) && /fetch-depth:\s*0/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'workflow-fetch-depth-zero',
                    nivel: 'info',
                    mensagem: messages.AnalistaGithubActionsMensagens.checkoutFetchDepthZero,
                    relPath,
                    linha: numeroLinha,
                    sugestao: messages.AnalistaGithubActionsMensagens.checkoutFetchDepthZeroSugestao
                }));
            }
        });
        if (actionsSemShaPinning.length > 0) {
            ocorrencias.push(criarOcorrencia({
                tipo: 'workflow-missing-sha-pinning',
                nivel: 'aviso',
                mensagem: `${actionsSemShaPinning.length} action(s) de terceiros sem pinning por SHA: ${actionsSemShaPinning.map(a => a.action).join(', ')}`,
                relPath,
                linha: 1,
                sugestao: 'Use @<commit-sha-completo> para garantir integridade da action'
            }));
        }
        if (!/permissions:/.test(src)) {
            ocorrencias.push(criarOcorrencia({
                tipo: 'workflow-missing-permissions',
                nivel: 'info',
                mensagem: messages.AnalistaGithubActionsMensagens.permissionsNotDefined,
                relPath,
                linha: 1,
                sugestao: messages.AnalistaGithubActionsMensagens.permissionsNotDefinedSugestao
            }));
        }
        const hasAuditStep = /\b(npm audit|yarn audit|snyk|trivy|checkov|terrascan|gitleaks|semgrep)\b/i.test(src);
        const isBuildOrDeploy = /\b(npm install|yarn|pnpm|build|deploy|publish|docker build|docker push)\b/i.test(src);
        const isSecurityWorkflow = /codeql|security-advanced|security-enhanced-code-scanning/i.test(src);
        if (isBuildOrDeploy && !hasAuditStep && !isSecurityWorkflow) {
            ocorrencias.push(criarOcorrencia({
                tipo: 'workflow-missing-security-scan',
                nivel: 'aviso',
                mensagem: messages.AnalistaGithubActionsMensagens.buildDeployWithoutSecurityAudit,
                relPath,
                linha: 1,
                sugestao: messages.AnalistaGithubActionsMensagens.buildDeployWithoutSecurityAuditSugestao
            }));
        }
        return ocorrencias;
    }
};
//# sourceMappingURL=detector-workflow-security.js.map