Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-08-20 21:42:06 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-08-20 21:42:06 +0300
commit6e4e1050d9dba2b7b2523fdd1768823ab85feef4 (patch)
tree78be5963ec075d80116a932011d695dd33910b4e /lib/banzai
parent1ce776de4ae122aba3f349c02c17cebeaa8ecf07 (diff)
Add latest changes from gitlab-org/gitlab@13-3-stable-ee
Diffstat (limited to 'lib/banzai')
-rw-r--r--lib/banzai/filter/abstract_reference_filter.rb4
-rw-r--r--lib/banzai/filter/ascii_doc_post_processing_filter.rb3
-rw-r--r--lib/banzai/filter/base_sanitization_filter.rb2
-rw-r--r--lib/banzai/filter/design_reference_filter.rb2
-rw-r--r--lib/banzai/filter/gollum_tags_filter.rb2
-rw-r--r--lib/banzai/filter/inline_alert_metrics_filter.rb47
-rw-r--r--lib/banzai/filter/inline_cluster_metrics_filter.rb2
-rw-r--r--lib/banzai/filter/inline_embeds_filter.rb4
-rw-r--r--lib/banzai/filter/inline_metrics_filter.rb2
-rw-r--r--lib/banzai/filter/inline_metrics_redactor_filter.rb6
-rw-r--r--lib/banzai/filter/issue_reference_filter.rb4
-rw-r--r--lib/banzai/filter/label_reference_filter.rb8
-rw-r--r--lib/banzai/filter/reference_filter.rb22
-rw-r--r--lib/banzai/filter/syntax_highlight_filter.rb2
-rw-r--r--lib/banzai/reference_parser/base_parser.rb3
-rw-r--r--lib/banzai/reference_parser/snippet_parser.rb17
16 files changed, 98 insertions, 32 deletions
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://<root>/<project>/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