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

update_service.rb « custom_email_verifications « service_desk « services « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 5ef36ce0576e3693d20a0edfd3930ee473abd50f (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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# frozen_string_literal: true

module ServiceDesk
  module CustomEmailVerifications
    class UpdateService < BaseService
      EMAIL_TOKEN_REGEXP = /Verification token: ([A-Za-z0-9_-]{12})/

      def execute
        return error_feature_flag_disabled unless Feature.enabled?(:service_desk_custom_email, project)
        return error_parameter_missing if settings.blank? || verification.blank?
        return error_already_finished if already_finished_and_no_mail?
        return error_already_failed if already_failed_and_no_mail?

        verification_error = verify

        settings.update!(custom_email_enabled: false) if settings.custom_email_enabled?

        notify_project_owners_and_user_about_result(user: verification.triggerer)

        if verification_error.present?
          verification.mark_as_failed!(verification_error)

          error_not_verified(verification_error)
        else
          verification.mark_as_finished!

          log_info
          ServiceResponse.success
        end
      end

      private

      def mail
        params[:mail]
      end

      def verification
        @verification ||= settings.custom_email_verification
      end

      def already_finished_and_no_mail?
        verification.finished? && mail.blank?
      end

      def already_failed_and_no_mail?
        verification.failed? && mail.blank?
      end

      def verify
        return :mail_not_received_within_timeframe if mail_not_received_within_timeframe?
        return :incorrect_from if incorrect_from?
        return :incorrect_token if incorrect_token?

        nil
      end

      def mail_not_received_within_timeframe?
        # (For completeness) also raise if no email provided
        mail.blank? || !verification.in_timeframe?
      end

      def incorrect_from?
        # Does the email forwarder preserve the FROM header?
        mail.from.first != settings.custom_email
      end

      def incorrect_token?
        message, _stripped_text = Gitlab::Email::ReplyParser.new(mail).execute

        scan_result = message.scan(EMAIL_TOKEN_REGEXP)

        return true if scan_result.empty?

        scan_result.first.first != verification.token
      end

      def error_parameter_missing
        error_response(s_('ServiceDesk|Service Desk setting or verification object missing'))
      end

      def error_already_finished
        error_response(s_('ServiceDesk|Custom email address has already been verified.'))
      end

      def error_already_failed
        error_response(s_('ServiceDesk|Custom email address verification has already been processed and failed.'))
      end
    end
  end
end