import { splitLines } from '../../../shared/helpers/index.js';
import { criarOcorrencia } from '../../../types/index.js';
export const detectorShellSecurity = {
    nome: 'detector-shell-security',
    categoria: 'infrastructure',
    descricao: 'Detecta vulnerabilidades em Shell Script',
    test: (relPath) => /\.(sh|bash|zsh|fish)$/i.test(relPath),
    aplicar: (src, relPath) => {
        if (!src)
            return [];
        const ocorrencias = [];
        const linhas = splitLines(src);
        if (linhas.length > 0 && !linhas[0].startsWith('#!')) {
            ocorrencias.push(criarOcorrencia({
                tipo: 'shell-missing-shebang',
                nivel: 'info',
                mensagem: 'Script sem shebang',
                relPath,
                linha: 1,
                sugestao: 'Adicione #!/bin/bash ou #!/bin/sh'
            }));
        }
        if (!/set\s+(-e|-o\s+pipefail)/.test(src)) {
            ocorrencias.push(criarOcorrencia({
                tipo: 'shell-missing-set-e',
                nivel: 'info',
                mensagem: 'Script sem "set -e" - erros não interrompem execução',
                relPath,
                linha: 1,
                sugestao: 'Adicione set -e no início do script'
            }));
        }
        linhas.forEach((linha, index) => {
            const numeroLinha = index + 1;
            const linhaTrim = linha.trim();
            if (linhaTrim.startsWith('#'))
                return;
            if (/\beval\s+/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'shell-eval-usage',
                    nivel: 'erro',
                    mensagem: 'eval() detectado - risco de execução arbitrária',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Evite eval - use arrays ou outras construções'
                }));
            }
            if (/\brm\s+-rf\s+\/(\s|$)/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'shell-rm-rf-root',
                    nivel: 'erro',
                    mensagem: 'COMANDO EXTREMAMENTE PERIGOSO: rm -rf /',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Remova este comando imediatamente!'
                }));
            }
            if (/(curl|wget).*\|\s*(ba)?sh/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'shell-curl-pipe-sh',
                    nivel: 'erro',
                    mensagem: 'curl/wget piped para shell - risco de segurança',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Baixe, inspecione e execute separadamente'
                }));
            }
            if (/\b(password|pass|secret|token)\b\s*=\s*['"].*['"]/i.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'shell-hardcoded-password',
                    nivel: 'erro',
                    mensagem: 'Credencial hardcoded em variável',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Use variáveis de ambiente'
                }));
            }
            if (/\b(echo|ls|cd|rm|cp|mv)\s+.*\$\w+/.test(linha) && !/["'].*\$\w+.*["']/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'shell-unquoted-variable',
                    nivel: 'info',
                    mensagem: 'Variável sem aspas - problemas com espaços',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Use "$VAR" ao invés de $VAR'
                }));
            }
            if (/\bsudo\s+/.test(linha) && !relPath.includes('setup') && !relPath.includes('install')) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'shell-sudo-usage',
                    nivel: 'info',
                    mensagem: 'Uso de sudo detectado',
                    relPath,
                    linha: numeroLinha,
                    sugestao: 'Projete scripts que rodem sem root'
                }));
            }
        });
        return ocorrencias;
    }
};
//# sourceMappingURL=detector-shell-security.js.map