Class: Banzai::Filter::BaseSanitizationFilter
- Inherits:
-
HTML::Pipeline::SanitizationFilter
- Object
- HTML::Pipeline::SanitizationFilter
- Banzai::Filter::BaseSanitizationFilter
- Extended by:
- Gitlab::Utils::SanitizeNodeLink
- Includes:
- Concerns::TimeoutFilterHandler, Gitlab::Utils::StrongMemoize
- Defined in:
- lib/banzai/filter/base_sanitization_filter.rb
Overview
Sanitize HTML produced by markup languages (Markdown, AsciiDoc…). Specific rules are implemented in dedicated filters:
-
Banzai::Filter::SanitizationFilter (Markdown)
-
Banzai::Filter::AsciiDocSanitizationFilter (AsciiDoc/Asciidoctor)
-
Banzai::Filter::BroadcastMessageSanitizationFilter (Markdown with styled links and line breaks)
-
Banzai::Filter::MinimumMarkdownSanitizationFilter (only inline elements)
Extends HTML::Pipeline::SanitizationFilter with common rules.
Direct Known Subclasses
AsciiDocSanitizationFilter, BroadcastMessageSanitizationFilter, MinimumMarkdownSanitizationFilter, SanitizationFilter
Constant Summary collapse
- UNSAFE_PROTOCOLS =
%w[data javascript vbscript].freeze
Constants included from Gitlab::Utils::SanitizeNodeLink
Gitlab::Utils::SanitizeNodeLink::ATTRS_TO_SANITIZE
Constants included from Concerns::TimeoutFilterHandler
Concerns::TimeoutFilterHandler::COMPLEX_MARKDOWN_MESSAGE, Concerns::TimeoutFilterHandler::RENDER_TIMEOUT, Concerns::TimeoutFilterHandler::SANITIZATION_RENDER_TIMEOUT
Class Method Summary collapse
Instance Method Summary collapse
Methods included from Gitlab::Utils::SanitizeNodeLink
permit_url?, remove_unsafe_links, safe_protocol?, sanitize_unsafe_links
Class Method Details
.remove_rel ⇒ Object
88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/banzai/filter/base_sanitization_filter.rb', line 88 def remove_rel ->(env) do if env[:node_name] == 'a' # we allow rel="license" to support the Rel-license microformat # http://microformats.org/wiki/rel-license unless env[:node].attribute('rel')&.value == 'license' env[:node].remove_attribute('rel') end end end end |
Instance Method Details
#allowlist ⇒ Object
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/banzai/filter/base_sanitization_filter.rb', line 25 def allowlist strong_memoize(:allowlist) do allowlist = super.deep_dup # Allow span elements allowlist[:elements].push('span') # Allow data-math-style attribute in order to support LaTeX formatting allowlist[:attributes]['span'] = %w[data-math-style] allowlist[:attributes]['code'] = %w[data-math-style] allowlist[:attributes]['pre'] = %w[data-canonical-lang data-lang-params data-math-style data-mermaid-style data-kroki-style] # Allow data-placeholder from gitlab-glfm-markdown allowlist[:attributes]['span'].push('data-placeholder') # Allow html5 details/summary elements allowlist[:elements].push('details') allowlist[:elements].push('summary') # Allow abbr elements with title attribute allowlist[:elements].push('abbr') allowlist[:attributes]['abbr'] = %w[title] # Disallow `name` attribute globally, allow on `a` allowlist[:attributes][:all].delete('name') allowlist[:attributes]['a'].push('name') allowlist[:attributes]['a'].push('data-wikilink') allowlist[:attributes]['a'].push('data-placeholder') allowlist[:attributes]['img'].push('data-diagram') allowlist[:attributes]['img'].push('data-diagram-src') allowlist[:attributes]['img'].push('data-placeholder') # Allow any protocol in `a` elements # and then remove links with unsafe protocols in SanitizeLinkFilter allowlist[:protocols].delete('a') # Remove `rel` attribute from `a` elements allowlist[:transformers].push(self.class.remove_rel) customize_allowlist(allowlist) end end |
#call ⇒ Object
21 22 23 |
# File 'lib/banzai/filter/base_sanitization_filter.rb', line 21 def call Sanitize.clean_node!(doc, allowlist) end |
#customize_allowlist(allowlist) ⇒ Object
71 72 73 |
# File 'lib/banzai/filter/base_sanitization_filter.rb', line 71 def customize_allowlist(allowlist) raise NotImplementedError end |