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

broadcast_message_placeholders_filter.rb « filter « banzai « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 5b5e2f643c52ee6f168c77dd56a3b41f622d8212 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
# frozen_string_literal: true

module Banzai
  module Filter
    # Replaces placeholders for broadcast messages with data from the current
    # user or the instance.
    class BroadcastMessagePlaceholdersFilter < HTML::Pipeline::Filter
      def call
        return doc unless context[:broadcast_message_placeholders]

        doc.traverse { |node| replace_placeholders(node) }
      end

      private

      def replace_placeholders(node)
        if node.text? && !node.content.empty?
          node.content = replace_content(node.content)
        elsif href = link_href(node)
          href.value = replace_content(href.value, url_safe_encoding: true)
        end

        node
      end

      def link_href(node)
        node.element? &&
          node.name == 'a' &&
          node.attribute_nodes.find { |a| a.name == "href" }
      end

      def replace_content(content, url_safe_encoding: false)
        placeholders.each do |placeholder, method|
          regex = Regexp.new("{{#{placeholder}}}|#{CGI.escape("{{#{placeholder}}}")}")
          value = url_safe_encoding ? CGI.escape(method.call.to_s) : method.call.to_s
          content.gsub!(regex, value)
        end

        content
      end

      def placeholders
        {
          "email" => -> { current_user.try(:email) },
          "name" => -> { current_user.try(:name) },
          "user_id" => -> { current_user.try(:id) },
          "username" => -> { current_user.try(:username) },
          "instance_id" => -> { Gitlab::CurrentSettings.try(:uuid) }
        }
      end

      def current_user
        context[:current_user]
      end
    end
  end
end