diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-04-14 14:17:48 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-04-14 14:17:48 +0000 |
commit | d56c47033c32d6d32a864e5c16a3b2fd959b08da (patch) | |
tree | 8a249fae71ddfef174030ce966e5ebe6ed2937c5 /config/initializers/mail_starttls_patch.rb | |
parent | 1b7933f32303f102555ce078716a33a701e434e1 (diff) | |
download | gitlab-ce-d56c47033c32d6d32a864e5c16a3b2fd959b08da.tar.gz |
Add latest changes from gitlab-org/gitlab@15-10-stable-ee
Diffstat (limited to 'config/initializers/mail_starttls_patch.rb')
-rw-r--r-- | config/initializers/mail_starttls_patch.rb | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/config/initializers/mail_starttls_patch.rb b/config/initializers/mail_starttls_patch.rb new file mode 100644 index 00000000000..c4fe102edfb --- /dev/null +++ b/config/initializers/mail_starttls_patch.rb @@ -0,0 +1,87 @@ +# frozen_string_literal: true + +require 'mail/network/delivery_methods/smtp' + +# Monkey patch mail 2.8.1 to make it possible to disable STARTTLS. +# without having to change existing settings. +# This brings in changes from https://github.com/mikel/mail/pull/1536, +# which has not been released yet. +module Mail + class SMTP + def initialize(values) + self.settings = DEFAULTS + settings[:enable_starttls_auto] = nil + settings.merge!(values) + end + + private + + # `key` is said to be provided when `settings` has a non-nil value for `key`. + def setting_provided?(key) + !settings[key].nil? + end + + # Yields one of `:always`, `:auto` or `false` based on `enable_starttls` and `enable_starttls_auto` flags. + # Yields `false` when `smtp_tls?`. + def smtp_starttls + return false if smtp_tls? + + if setting_provided?(:enable_starttls) && settings[:enable_starttls] + # enable_starttls: provided and truthy + case settings[:enable_starttls] + when :auto then :auto + when :always then :always + else + :always + end + elsif setting_provided?(:enable_starttls_auto) + # enable_starttls: not provided or false + settings[:enable_starttls_auto] ? :auto : false + else + # enable_starttls_auto: not provided + # enable_starttls: when provided then false + # use :auto when neither enable_starttls* provided + setting_provided?(:enable_starttls) ? false : :auto + end + end + + def smtp_tls? + (setting_provided?(:tls) && settings[:tls]) || (setting_provided?(:ssl) && settings[:ssl]) + end + + def start_smtp_session(&block) + build_smtp_session.start(settings[:domain], settings[:user_name], settings[:password], + settings[:authentication], &block) + end + + def build_smtp_session + if smtp_tls? && (settings[:enable_starttls] || settings[:enable_starttls_auto]) + # rubocop:disable Layout/LineLength + raise ArgumentError, + ":enable_starttls and :tls are mutually exclusive. Set :tls if you're on an SMTPS connection. Set :enable_starttls if you're on an SMTP connection and using STARTTLS for secure TLS upgrade." + # rubocop:enable Layout/LineLength + end + + Net::SMTP.new(settings[:address], settings[:port]).tap do |smtp| + if smtp_tls? + smtp.disable_starttls + smtp.enable_tls(ssl_context) + else + smtp.disable_tls + + case smtp_starttls + when :always + smtp.enable_starttls(ssl_context) + when :auto + smtp.enable_starttls_auto(ssl_context) + else + smtp.disable_starttls + end + end + + smtp.open_timeout = settings[:open_timeout] if settings[:open_timeout] + smtp.read_timeout = settings[:read_timeout] if settings[:read_timeout] + end + end + end +end |