summaryrefslogtreecommitdiff
path: root/config/initializers/mail_starttls_patch.rb
diff options
context:
space:
mode:
Diffstat (limited to 'config/initializers/mail_starttls_patch.rb')
-rw-r--r--config/initializers/mail_starttls_patch.rb87
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