From 6e4e1050d9dba2b7b2523fdd1768823ab85feef4 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 20 Aug 2020 18:42:06 +0000 Subject: Add latest changes from gitlab-org/gitlab@13-3-stable-ee --- lib/banzai/filter/abstract_reference_filter.rb | 4 +- .../filter/ascii_doc_post_processing_filter.rb | 3 ++ lib/banzai/filter/base_sanitization_filter.rb | 2 +- lib/banzai/filter/design_reference_filter.rb | 2 +- lib/banzai/filter/gollum_tags_filter.rb | 2 +- lib/banzai/filter/inline_alert_metrics_filter.rb | 47 ++++++++++++++++++++++ lib/banzai/filter/inline_cluster_metrics_filter.rb | 2 +- lib/banzai/filter/inline_embeds_filter.rb | 4 ++ lib/banzai/filter/inline_metrics_filter.rb | 2 +- .../filter/inline_metrics_redactor_filter.rb | 6 ++- lib/banzai/filter/issue_reference_filter.rb | 4 -- lib/banzai/filter/label_reference_filter.rb | 8 +++- lib/banzai/filter/reference_filter.rb | 22 ++++------ lib/banzai/filter/syntax_highlight_filter.rb | 2 +- lib/banzai/reference_parser/base_parser.rb | 3 +- lib/banzai/reference_parser/snippet_parser.rb | 17 +++++++- 16 files changed, 98 insertions(+), 32 deletions(-) create mode 100644 lib/banzai/filter/inline_alert_metrics_filter.rb (limited to 'lib/banzai') diff --git a/lib/banzai/filter/abstract_reference_filter.rb b/lib/banzai/filter/abstract_reference_filter.rb index 38105e2237c..b0a2f6f69d5 100644 --- a/lib/banzai/filter/abstract_reference_filter.rb +++ b/lib/banzai/filter/abstract_reference_filter.rb @@ -136,7 +136,7 @@ module Banzai end def call - return doc unless project || group + return doc unless project || group || user ref_pattern = object_class.reference_pattern link_pattern = object_class.link_reference_pattern @@ -280,7 +280,7 @@ module Banzai end def object_link_text(object, matches) - parent = context[:project] || context[:group] + parent = project || group || user text = object.reference_link_text(parent) extras = object_link_text_extras(object, matches) diff --git a/lib/banzai/filter/ascii_doc_post_processing_filter.rb b/lib/banzai/filter/ascii_doc_post_processing_filter.rb index 88439f06b5f..09f0fd7df45 100644 --- a/lib/banzai/filter/ascii_doc_post_processing_filter.rb +++ b/lib/banzai/filter/ascii_doc_post_processing_filter.rb @@ -8,6 +8,9 @@ module Banzai node.set_attribute('class', 'code math js-render-math') end + doc.search('[data-mermaid-style]').each do |node| + node.set_attribute('class', 'js-render-mermaid') + end doc end end diff --git a/lib/banzai/filter/base_sanitization_filter.rb b/lib/banzai/filter/base_sanitization_filter.rb index 1b7af8aee45..fc3791e0cbf 100644 --- a/lib/banzai/filter/base_sanitization_filter.rb +++ b/lib/banzai/filter/base_sanitization_filter.rb @@ -25,7 +25,7 @@ module Banzai # Allow data-math-style attribute in order to support LaTeX formatting whitelist[:attributes]['code'] = %w(data-math-style) - whitelist[:attributes]['pre'] = %w(data-math-style) + whitelist[:attributes]['pre'] = %w(data-math-style data-mermaid-style) # Allow html5 details/summary elements whitelist[:elements].push('details') diff --git a/lib/banzai/filter/design_reference_filter.rb b/lib/banzai/filter/design_reference_filter.rb index 7455dfe00ef..2ab47c5c6db 100644 --- a/lib/banzai/filter/design_reference_filter.rb +++ b/lib/banzai/filter/design_reference_filter.rb @@ -114,7 +114,7 @@ module Banzai end def enabled? - Feature.enabled?(FEATURE_FLAG, parent) + Feature.enabled?(FEATURE_FLAG, parent, default_enabled: true) end end end diff --git a/lib/banzai/filter/gollum_tags_filter.rb b/lib/banzai/filter/gollum_tags_filter.rb index 033e3d2c33e..7928272a2cf 100644 --- a/lib/banzai/filter/gollum_tags_filter.rb +++ b/lib/banzai/filter/gollum_tags_filter.rb @@ -82,7 +82,7 @@ module Banzai def process_tag(tag) parts = tag.split('|') - return if parts.size.zero? + return if parts.empty? process_image_tag(parts) || process_page_link_tag(parts) end diff --git a/lib/banzai/filter/inline_alert_metrics_filter.rb b/lib/banzai/filter/inline_alert_metrics_filter.rb new file mode 100644 index 00000000000..a6140d1ac81 --- /dev/null +++ b/lib/banzai/filter/inline_alert_metrics_filter.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +module Banzai + module Filter + # HTML filter that inserts a placeholder element for each + # reference to an alert dashboard. + class InlineAlertMetricsFilter < ::Banzai::Filter::InlineEmbedsFilter + include ::Gitlab::Routing + # Search params for selecting alert metrics links. A few + # simple checks is enough to boost performance without + # the cost of doing a full regex match. + def xpath_search + "descendant-or-self::a[contains(@href,'metrics_dashboard') and \ + contains(@href,'prometheus/alerts') and \ + starts-with(@href, '#{gitlab_domain}')]" + end + + # Regular expression matching alert dashboard urls + def link_pattern + ::Gitlab::Metrics::Dashboard::Url.alert_regex + end + + private + + # Endpoint FE should hit to collect the appropriate + # chart information + def metrics_dashboard_url(params) + metrics_dashboard_namespace_project_prometheus_alert_url( + params['namespace'], + params['project'], + params['alert'], + embedded: true, + format: :json, + **query_params(params['url']) + ) + end + + # Parses query params out from full url string into hash. + # + # Ex) 'https:////metrics_dashboard?title=Title&group=Group' + # --> { title: 'Title', group: 'Group' } + def query_params(url) + ::Gitlab::Metrics::Dashboard::Url.parse_query(url) + end + end + end +end diff --git a/lib/banzai/filter/inline_cluster_metrics_filter.rb b/lib/banzai/filter/inline_cluster_metrics_filter.rb index 5ef68388ea9..a696d3a6f9c 100644 --- a/lib/banzai/filter/inline_cluster_metrics_filter.rb +++ b/lib/banzai/filter/inline_cluster_metrics_filter.rb @@ -15,7 +15,7 @@ module Banzai def xpath_search "descendant-or-self::a[contains(@href,'clusters') and \ - starts-with(@href, '#{::Gitlab.config.gitlab.url}')]" + starts-with(@href, '#{gitlab_domain}')]" end def link_pattern diff --git a/lib/banzai/filter/inline_embeds_filter.rb b/lib/banzai/filter/inline_embeds_filter.rb index d7d78cf1866..cb9a493e8c6 100644 --- a/lib/banzai/filter/inline_embeds_filter.rb +++ b/lib/banzai/filter/inline_embeds_filter.rb @@ -82,6 +82,10 @@ module Banzai def metrics_dashboard_url raise NotImplementedError end + + def gitlab_domain + ::Gitlab.config.gitlab.url + end end end end diff --git a/lib/banzai/filter/inline_metrics_filter.rb b/lib/banzai/filter/inline_metrics_filter.rb index 409e8db87f4..543d98e62be 100644 --- a/lib/banzai/filter/inline_metrics_filter.rb +++ b/lib/banzai/filter/inline_metrics_filter.rb @@ -11,7 +11,7 @@ module Banzai def xpath_search "descendant-or-self::a[contains(@href,'metrics') and \ contains(@href,'environments') and \ - starts-with(@href, '#{Gitlab.config.gitlab.url}')]" + starts-with(@href, '#{gitlab_domain}')]" end # Regular expression matching metrics urls diff --git a/lib/banzai/filter/inline_metrics_redactor_filter.rb b/lib/banzai/filter/inline_metrics_redactor_filter.rb index 7f98a52d421..2259115acfc 100644 --- a/lib/banzai/filter/inline_metrics_redactor_filter.rb +++ b/lib/banzai/filter/inline_metrics_redactor_filter.rb @@ -81,6 +81,10 @@ module Banzai Route.new( ::Gitlab::Metrics::Dashboard::Url.clusters_regex, :read_cluster + ), + Route.new( + ::Gitlab::Metrics::Dashboard::Url.alert_regex, + :read_prometheus_alerts ) ] end @@ -147,5 +151,3 @@ module Banzai end end end - -Banzai::Filter::InlineMetricsRedactorFilter.prepend_if_ee('EE::Banzai::Filter::InlineMetricsRedactorFilter') diff --git a/lib/banzai/filter/issue_reference_filter.rb b/lib/banzai/filter/issue_reference_filter.rb index dc4b865bfb6..216418ee5fa 100644 --- a/lib/banzai/filter/issue_reference_filter.rb +++ b/lib/banzai/filter/issue_reference_filter.rb @@ -23,10 +23,6 @@ module Banzai issue_url(issue, project) end - def projects_relation_for_paths(paths) - super(paths).includes(:gitlab_issue_tracker_service) - end - def parent_records(parent, ids) parent.issues.where(iid: ids.to_a) end diff --git a/lib/banzai/filter/label_reference_filter.rb b/lib/banzai/filter/label_reference_filter.rb index 2ab88620df1..a4d3e352051 100644 --- a/lib/banzai/filter/label_reference_filter.rb +++ b/lib/banzai/filter/label_reference_filter.rb @@ -19,7 +19,7 @@ module Banzai unescaped_html = unescape_html_entities(text).gsub(pattern) do |match| namespace, project = $~[:namespace], $~[:project] project_path = full_project_path(namespace, project) - label = find_label(project_path, $~[:label_id], $~[:label_name]) + label = find_label_cached(project_path, $~[:label_id], $~[:label_name]) if label labels[label.id] = yield match, label.id, project, namespace, $~ @@ -34,6 +34,12 @@ module Banzai escape_with_placeholders(unescaped_html, labels) end + def find_label_cached(parent_ref, label_id, label_name) + cached_call(:banzai_find_label_cached, label_name&.tr('"', '') || label_id, path: [object_class, parent_ref]) do + find_label(parent_ref, label_id, label_name) + end + end + def find_label(parent_ref, label_id, label_name) parent = parent_from_ref(parent_ref) return unless parent diff --git a/lib/banzai/filter/reference_filter.rb b/lib/banzai/filter/reference_filter.rb index 33df1d655fd..cfd4b932568 100644 --- a/lib/banzai/filter/reference_filter.rb +++ b/lib/banzai/filter/reference_filter.rb @@ -25,14 +25,12 @@ module Banzai def initialize(doc, context = nil, result = nil) super - if update_nodes_enabled? - @new_nodes = {} - @nodes = self.result[:reference_filter_nodes] - end + @new_nodes = {} + @nodes = self.result[:reference_filter_nodes] end def call_and_update_nodes - update_nodes_enabled? ? with_update_nodes { call } : call + with_update_nodes { call } end # Returns a data attribute String to attach to a reference link @@ -78,6 +76,10 @@ module Banzai context[:group] end + def user + context[:user] + end + def skip_project_check? context[:skip_project_check] end @@ -164,11 +166,7 @@ module Banzai end def replace_text_with_html(node, index, html) - if update_nodes_enabled? - replace_and_update_new_nodes(node, index, html) - else - node.replace(html) - end + replace_and_update_new_nodes(node, index, html) end def replace_and_update_new_nodes(node, index, html) @@ -208,10 +206,6 @@ module Banzai end result[:reference_filter_nodes] = nodes end - - def update_nodes_enabled? - Feature.enabled?(:update_nodes_for_banzai_reference_filter, project) - end end end end diff --git a/lib/banzai/filter/syntax_highlight_filter.rb b/lib/banzai/filter/syntax_highlight_filter.rb index c1a5f33c225..6dc0cce6050 100644 --- a/lib/banzai/filter/syntax_highlight_filter.rb +++ b/lib/banzai/filter/syntax_highlight_filter.rb @@ -14,7 +14,7 @@ module Banzai LANG_PARAMS_ATTR = 'data-lang-params' def call - doc.search('pre:not([data-math-style]) > code').each do |node| + doc.search('pre:not([data-math-style]):not([data-mermaid-style]) > code').each do |node| highlight_node(node) end diff --git a/lib/banzai/reference_parser/base_parser.rb b/lib/banzai/reference_parser/base_parser.rb index 9ecbc3ecec2..c4d7e40b46c 100644 --- a/lib/banzai/reference_parser/base_parser.rb +++ b/lib/banzai/reference_parser/base_parser.rb @@ -169,7 +169,8 @@ module Banzai # been queried the object is returned from the cache. def collection_objects_for_ids(collection, ids) if Gitlab::SafeRequestStore.active? - ids = ids.map(&:to_i) + ids = ids.map(&:to_i).uniq + cache = collection_cache[collection_cache_key(collection)] to_query = ids - cache.keys diff --git a/lib/banzai/reference_parser/snippet_parser.rb b/lib/banzai/reference_parser/snippet_parser.rb index b86c259efbd..bd42f6e6ed4 100644 --- a/lib/banzai/reference_parser/snippet_parser.rb +++ b/lib/banzai/reference_parser/snippet_parser.rb @@ -9,10 +9,23 @@ module Banzai Snippet end + # Returns all the nodes that are visible to the given user. + def nodes_visible_to_user(user, nodes) + snippets = lazy { grouped_objects_for_nodes(nodes, references_relation, self.class.data_attribute) } + + nodes.select do |node| + if node.has_attribute?(self.class.data_attribute) + can_read_reference?(user, snippets[node]) + else + true + end + end + end + private - def can_read_reference?(user, ref_project, node) - can?(user, :read_snippet, referenced_by([node]).first) + def can_read_reference?(user, snippet) + can?(user, :read_snippet, snippet) end end end -- cgit v1.2.3