// src/utils/commentSanitizer.js const { logInfo, logWarning } = require('./logger'); /** * Remove HTML tags e converte entidades HTML - CORRIGIDO */ const stripHTML = (html) => { if (!html) return ''; // PRIMEIRO: converte entidades HTML para caracteres normais let cleaned = html .replace(/</g, '<') // < para < .replace(/>/g, '>') // > para > .replace(/&/g, '&') // & para & .replace(/ /g, ' ') //   para espaço .replace(/</g, '<') // < para < .replace(/>/g, '>') // > para > .replace(/&/g, '&') // & para & .replace(/"/g, '"'); // " para " // DEPOIS: remove tags HTML cleaned = cleaned .replace(//gi, '\n') //
para quebra de linha .replace(/

/gi, '') // Remove

.replace(/<\/p>/gi, '\n\n') //

para duas quebras .replace(//gi, '**') // para ** .replace(/<\/strong>/gi, '**') // para ** .replace(//gi, '*') // para * .replace(/<\/em>/gi, '*') // para * .replace(/
/gi, '> ') //
para citação .replace(/<\/blockquote>/gi, '') //
.replace(/]*>/gi, '') // Remove
com qualquer atributo .replace(/<\/div>/gi, '\n') //
para quebra .replace(/<[^>]*>/g, '') // Remove todas outras tags HTML .replace(/\n\s*\n\s*\n/g, '\n\n') // Remove múltiplas quebras .replace(/^\s+|\s+$/g, '') // Remove espaços no início/fim .trim(); return cleaned; }; /** * Detecta e trata imagens do GLPI */ const handleImages = (content) => { const imgRegex = /]+src="([^"]+)"[^>]*>/gi; const hasImages = imgRegex.test(content); if (hasImages) { logWarning('📷 Imagem detectada no comentário GLPI'); // Remove toda a tag de imagem mas mantém o texto around return content.replace(/]*>.*?]*>.*?<\/a>/gi, '[IMAGEM ANEXA NO GLPI]'); } return content; }; /** * Limpa metadados JSON do GLPI */ const cleanJSONMetadata = (content) => { if (typeof content === 'string' && content.includes('{id=') && content.includes('content=')) { try { // Extrai o conteúdo do campo content= do objeto const contentMatch = content.match(/content=([^,]+),/); if (contentMatch && contentMatch[1]) { let extracted = contentMatch[1].trim(); // Remove aspas se existirem extracted = extracted.replace(/^['"]|['"]$/g, ''); return extracted; } } catch (error) { logWarning('Não foi possível extrair conteúdo do metadado GLPI', { content }); } } return content; }; /** * Função principal de sanitização */ const sanitizeGLPIComment = (commentObj) => { if (!commentObj || typeof commentObj !== 'object') { logWarning('Comentário inválido recebido', { comment: commentObj }); return ''; } // Pega o conteúdo do objeto comment let content = commentObj.content || ''; // Se for string vazia, retorna vazio if (!content) return ''; // Aplica as limpezas em sequência content = cleanJSONMetadata(content.toString()); content = handleImages(content); content = stripHTML(content); // Log para debugging if (content !== commentObj.content) { logInfo('🔧 Comentário sanitizado', { original: commentObj.content.substring(0, 100) + '...', cleaned: content.substring(0, 100) + '...' }); } return content; }; /** * Esse módulo fornece funções para sanitizar comentários importados do GLPI. * Ele remove tags HTML, trata imagens e limpa metadados JSON específicos do GLPI. * O objetivo é garantir que os comentários sejam legíveis e seguros para exibição. * * Funções principais: * - sanitizeGLPIComment: Função principal que aplica todas as sanitizações. * - stripHTML: Remove tags HTML e converte algumas entidades para texto simples. * - handleImages: Detecta imagens e substitui por um marcador de imagem. * - cleanJSONMetadata: Remove metadados JSON do GLPI, extraindo apenas o conteúdo relevante. * * Logs são gerados para ajudar no debugging e monitoramento do processo de sanitização. */ module.exports = { sanitizeGLPIComment, stripHTML, handleImages, cleanJSONMetadata };