FIX: Make disabling TLS in mail possible again

Following the Rails 7 upgrade, the `DISCOURSE_SMTP_ENABLE_START_TLS`
setting doesn’t work anymore. This is because Rails upgraded the
`net-smtp` gem to the 0.3.1 version which enables `starttls` by default.
The `mail` gem doesn’t support this new behavior yet and doesn’t know
how to disable TLS. This should be fixed in an upcoming release.

Meanwhile applying this patch allows us to get back the previous
behavior which is expected by many.
This commit is contained in:
Loïc Guitaut 2022-06-07 16:58:04 +02:00 committed by Loïc Guitaut
parent 284db78055
commit fff3ff11c0
4 changed files with 46 additions and 2 deletions

View File

@ -41,7 +41,7 @@ gem 'actionview_precompiler', require: false
gem 'seed-fu'
gem 'mail', git: 'https://github.com/discourse/mail.git', require: false
gem 'mail', git: 'https://github.com/discourse/mail.git'
gem 'mini_mime'
gem 'mini_suffix'

View File

@ -41,7 +41,7 @@ Discourse::Application.configure do
settings[:tls] = true
end
config.action_mailer.smtp_settings = settings.reject { |_, y| y.nil? }
config.action_mailer.smtp_settings = settings.compact
else
config.action_mailer.delivery_method = :sendmail
config.action_mailer.sendmail_settings = { arguments: '-i' }

View File

@ -0,0 +1,21 @@
# frozen_string_literal: true
# Patch from
# https://github.com/rails/rails/issues/44698#issuecomment-1069675285 to enable
# previous behavior with Net::SMTP regarding TLS.
#
# This should be fixed in an upcoming release of the Mail gem (probably 2.8),
# when this patch is merged: https://github.com/mikel/mail/pull/1435
module FreedomPatches::MailDisableStarttls
def build_smtp_session
super.tap do |smtp|
unless settings[:enable_starttls_auto]
if smtp.respond_to?(:disable_starttls)
smtp.disable_starttls
end
end
end
end
::Mail::SMTP.prepend(self)
end

View File

@ -0,0 +1,23 @@
# frozen_string_literal: true
describe FreedomPatches::MailDisableStarttls do
subject(:smtp_session) { smtp.build_smtp_session }
let(:smtp) { Mail::SMTP.new(options) }
context "when the starttls option is not provided" do
let(:options) { {} }
it "doesn't disable starttls" do
expect(smtp_session).to be_starttls
end
end
context "when the starttls option is set to `false`" do
let(:options) { { enable_starttls_auto: false } }
it "properly disables starttls" do
expect(smtp_session).not_to be_starttls
end
end
end