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

create_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: db518bfdf24fcf3fd63cb365017b5be98e251d05 (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
# frozen_string_literal: true

module ServiceDesk
  module CustomEmailVerifications
    class CreateService < BaseService
      attr_reader :ramp_up_error

      def execute
        return error_feature_flag_disabled unless Feature.enabled?(:service_desk_custom_email, project)
        return error_settings_missing unless settings.present?
        return error_user_not_authorized unless can?(current_user, :admin_project, project)

        update_settings
        notify_project_owners_and_user_about_verification_start
        send_verification_email_and_catch_delivery_errors

        if ramp_up_error
          handle_error_case
        else
          ServiceResponse.success
        end
      end

      private

      def verification
        @verification ||= settings.custom_email_verification ||
          ServiceDesk::CustomEmailVerification.new(project_id: settings.project_id)
      end

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

        verification.mark_as_started!(current_user)
        # We use verification association from project, to use it in email, we need to reset it here.
        project.reset
      end

      def notify_project_owners_and_user_about_verification_start
        notify_project_owners_and_user_with_email(
          email_method_name: :service_desk_verification_triggered_email,
          user: current_user
        )
      end

      def send_verification_email_and_catch_delivery_errors
        # Send this synchronously as we need to get direct feedback on delivery errors.
        Notify.service_desk_custom_email_verification_email(settings).deliver
      rescue SocketError, OpenSSL::SSL::SSLError
        # e.g. host not found or host certificate issues
        @ramp_up_error = :smtp_host_issue
      rescue Net::SMTPAuthenticationError
        # incorrect username or password
        @ramp_up_error = :invalid_credentials
      end

      def handle_error_case
        notify_project_owners_and_user_about_result(user: current_user)

        verification.mark_as_failed!(ramp_up_error)

        error_not_verified(ramp_up_error)
      end

      def error_settings_missing
        error_response(_('ServiceDesk|Service Desk setting missing'))
      end

      def error_user_not_authorized
        error_response(_('ServiceDesk|User cannot manage project.'))
      end
    end
  end
end