import { messages } from '../../../core/messages/index.js';
import { criarAnalista, criarOcorrencia } from '../../../types/index.js';
export const analistaShell = criarAnalista({
    nome: 'analista-shell',
    categoria: 'infrastructure',
    descricao: 'Analisa scripts Shell em busca de comandos perigosos, insegurança e falta de boas práticas.',
    test: (relPath) => /\.(sh|bash|zsh|fish)$/i.test(relPath),
    aplicar: async (src, relPath) => {
        const ocorrencias = [];
        const linhas = src.split('\n');
        if (linhas.length > 0 && !linhas[0].startsWith('#!')) {
            ocorrencias.push(criarOcorrencia({
                tipo: 'codigo-fragil',
                nivel: 'aviso',
                mensagem: messages.AnalistaShellMensagens.missingShebang,
                relPath,
                linha: 1,
                sugestao: messages.AnalistaShellMensagens.missingShebangSugestao
            }));
        }
        const srcCompleto = src.toLowerCase();
        if (!srcCompleto.includes('set -e') && !srcCompleto.includes('set -o pipefail')) {
            ocorrencias.push(criarOcorrencia({
                tipo: 'codigo-fragil',
                nivel: 'info',
                mensagem: messages.AnalistaShellMensagens.missingSetE,
                relPath,
                linha: 1,
                sugestao: messages.AnalistaShellMensagens.missingSetESugestao
            }));
        }
        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: 'vulnerabilidade-seguranca',
                    nivel: 'erro',
                    mensagem: messages.AnalistaShellMensagens.evalUsage,
                    relPath,
                    linha: numeroLinha,
                    sugestao: messages.AnalistaShellMensagens.evalUsageSugestao
                }));
            }
            if (/\$(\w+)\b/.test(linha) && !/["'].*\$\w+.*["']/.test(linha) && !/\$\(.*\)/.test(linha) && !/^\s*(for|while|if|case|read)\s+/.test(linhaTrim)) {
                if (/\b(echo|ls|cd|rm|cp|mv)\s+.*\$\w+/.test(linhaTrim)) {
                    ocorrencias.push(criarOcorrencia({
                        tipo: 'codigo-fragil',
                        nivel: 'info',
                        mensagem: messages.AnalistaShellMensagens.unquotedVariable,
                        relPath,
                        linha: numeroLinha,
                        sugestao: messages.AnalistaShellMensagens.unquotedVariableSugestao
                    }));
                }
            }
            if (/\brm\s+-rf\s+\/(\s|$|['"`])/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'vulnerabilidade-seguranca',
                    nivel: 'critica',
                    mensagem: messages.AnalistaShellMensagens.rmRfRoot,
                    relPath,
                    linha: numeroLinha,
                    sugestao: messages.AnalistaShellMensagens.rmRfRootSugestao
                }));
            }
            if (/(curl|wget).*(|\s)sh(\s|$)/.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'vulnerabilidade-seguranca',
                    nivel: 'alta',
                    mensagem: messages.AnalistaShellMensagens.curlPipeSh,
                    relPath,
                    linha: numeroLinha,
                    sugestao: messages.AnalistaShellMensagens.curlPipeShSugestao
                }));
            }
            if (/\b(password|pass|secret|token|key)\b\s*=\s*['"].*['"]/i.test(linha)) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'vulnerabilidade-seguranca',
                    nivel: 'erro',
                    mensagem: messages.AnalistaShellMensagens.hardcodedPassword,
                    relPath,
                    linha: numeroLinha,
                    sugestao: messages.AnalistaShellMensagens.hardcodedPasswordSugestao
                }));
            }
            if (/\bsudo\s+/.test(linha) && !relPath.includes('setup') && !relPath.includes('install')) {
                ocorrencias.push(criarOcorrencia({
                    tipo: 'codigo-fragil',
                    nivel: 'info',
                    mensagem: messages.AnalistaShellMensagens.sudoUsage,
                    relPath,
                    linha: numeroLinha,
                    sugestao: messages.AnalistaShellMensagens.sudoUsageSugestao
                }));
            }
        });
        return ocorrencias;
    },
    global: false
});
//# sourceMappingURL=analyst-shell.js.map