diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index 9890ec7c75780cf6b11f3aa1af3875b4aa7a9030..f2cab2840d4da5162169ff77fb4a8cbfc8171c23 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -52,7 +52,8 @@ module GitlabMarkdownHelper ref: @ref ) - Gitlab::Markdown.render(text, context) + html = Gitlab::Markdown.render(text, context) + Gitlab::Markdown.post_process(html, current_user) end # TODO (rspeicher): Remove all usages of this helper and just call `markdown` @@ -65,7 +66,8 @@ module GitlabMarkdownHelper ref: @ref ) - Gitlab::Markdown.gfm(text, options) + html = Gitlab::Markdown.gfm(text, options) + Gitlab::Markdown.post_process(html, current_user) end def asciidoc(text) diff --git a/lib/gitlab/markdown.rb b/lib/gitlab/markdown.rb index 478851fc656447379e6ab9711ed341cb7315595c..dbb8da3f0ad6ecb4b227acbbc023df539dc5251e 100644 --- a/lib/gitlab/markdown.rb +++ b/lib/gitlab/markdown.rb @@ -31,6 +31,24 @@ module Gitlab renderer.render(markdown) end + # Perform post-processing on an HTML String + # + # This method is used to perform state-dependent changes to a String of + # HTML, such as removing references that the current user doesn't have + # permission to make (`RedactorFilter`). + # + # html - String to process + # for_user - User state + # + # Returns an HTML-safe String + def self.post_process(html, for_user) + result = post_processor.call(html, current_user: for_user) + + result[:output]. + to_html. + html_safe + end + # Provide autoload paths for filters to prevent a circular dependency error autoload :AutolinkFilter, 'gitlab/markdown/autolink_filter' autoload :CommitRangeReferenceFilter, 'gitlab/markdown/commit_range_reference_filter' @@ -115,6 +133,10 @@ module Gitlab end end + def self.post_processor + @post_processor ||= HTML::Pipeline.new([Gitlab::Markdown::RedactorFilter]) + end + def self.redcarpet_options # https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use @redcarpet_options ||= { diff --git a/spec/features/markdown_spec.rb b/spec/features/markdown_spec.rb index c557a1061af269741f7c9d674e57b7d5ba994fdb..fdd8cf07b12cf14c792caaaac76296ac368206f1 100644 --- a/spec/features/markdown_spec.rb +++ b/spec/features/markdown_spec.rb @@ -220,7 +220,7 @@ describe 'GitLab Markdown', feature: true do end end - # `markdown` calls these two methods + # Fake a `current_user` helper def current_user @feat.user end