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
|