import sanitizeHtml from 'sanitize-html'; // Even though the upstream feed is operated by Ghost org, the resulting HTML // is rendered into admin inboxes on the receiving install. A compromised or // malformed feed entry must not be able to ship scripts, event handlers, or // non-http(s) URLs to recipients via this path. const ALLOWED_TAGS = [ 'p', 'br', 'hr', 'strong', 'b', 'em', 'i', 'u', 'code', 'a', 'ul', 'ol', 'li', 'blockquote', 'h1', 'h2', 'h3', 'h4' ]; const ALLOWED_SCHEMES = ['http', 'https', 'mailto']; const SANITIZE_OPTIONS: sanitizeHtml.IOptions = { allowedTags: ALLOWED_TAGS, allowedAttributes: { a: ['href', 'title', 'target', 'rel'] }, allowedSchemes: ALLOWED_SCHEMES, allowProtocolRelative: false, transformTags: { a: sanitizeHtml.simpleTransform('a', { target: '_blank', rel: 'noopener noreferrer' }) } }; export function sanitizeEmailHtml(html: string): string { return sanitizeHtml(html, SANITIZE_OPTIONS); }