import { messages } from '../../../core/messages/index.js';
import { createLineLookup, maskGoComments } from '../../../shared/helpers/index.js';
import { criarAnalista } from '../../../types/index.js';
const disableEnv = process.env.TUTANUS_DISABLE_PLUGIN_GO === '1';
function detectVulnerabilities(src, relPath) {
    const ocorrencias = [];
    const lineOf = createLineLookup(src).lineAt;
    const scan = maskGoComments(src);
    for (const match of scan.matchAll(/(?:password|secret|api[_-]?key|token|credential|senha)\s*(?::\s*|=\s*["'`])([^"'`\s]{4,})/gi)) {
        const line = lineOf(match.index);
        const value = match[1];
        if (value.includes('${') || value.includes('os.Getenv') || value.includes('$'))
            continue;
        ocorrencias.push({
            relPath,
            mensagem: messages.GoMensagens.hardcodedSecret,
            linha: line,
            nivel: messages.SeverityNiveis.error,
            origem: 'detector-vulnerabilidades',
            tipo: 'go/rule'
        });
    }
    for (const match of scan.matchAll(/`(?:SELECT|INSERT|UPDATE|DELETE)\b[\s\S]{0,200}`\s*\+/gi)) {
        const line = lineOf(match.index);
        ocorrencias.push({
            relPath,
            mensagem: messages.GoMensagens.sqlInjection,
            linha: line,
            nivel: messages.SeverityNiveis.error,
            origem: 'detector-vulnerabilidades',
            tipo: 'go/rule'
        });
    }
    for (const match of scan.matchAll(/\bexec\.Command\s*\(\s*["'`][^"'`]*["'`]\s*,\s*["'`][^"'`]*\$|fmt\.Sprintf\s*\([^)]*\)\s*\)/g)) {
        const line = lineOf(match.index);
        ocorrencias.push({
            relPath,
            mensagem: messages.GoMensagens.commandInjection,
            linha: line,
            nivel: messages.SeverityNiveis.error,
            origem: 'detector-vulnerabilidades',
            tipo: 'go/rule'
        });
    }
    for (const match of scan.matchAll(/\bos\.Open\s*\([^)]*r\.(?:FormValue|URL\.Query|PathValue|Header)/g)) {
        const line = lineOf(match.index);
        ocorrencias.push({
            relPath,
            mensagem: messages.GoMensagens.pathTraversal,
            linha: line,
            nivel: messages.SeverityNiveis.error,
            origem: 'detector-vulnerabilidades',
            tipo: 'go/rule'
        });
    }
    return ocorrencias;
}
export const detectorVulnerabilidades = criarAnalista({
    nome: 'detector-vulnerabilidades-go',
    categoria: 'seguranca',
    descricao: 'Detecta vulnerabilidades de segurança como injeção SQL, command injection e path traversal.',
    global: false,
    test: (relPath) => /\.go$/i.test(relPath),
    aplicar: async (src, relPath) => {
        if (disableEnv)
            return null;
        const msgs = detectVulnerabilities(src, relPath);
        return msgs.length ? msgs : null;
    }
});
//# sourceMappingURL=detector-vulnerabilities.js.map