diff --git a/app/services/email_settings_exception_handler.rb b/app/services/email_settings_exception_handler.rb index b85a9aaa95b..24f7f8fbc5e 100644 --- a/app/services/email_settings_exception_handler.rb +++ b/app/services/email_settings_exception_handler.rb @@ -75,7 +75,18 @@ class EmailSettingsExceptionHandler end def net_smtp_authentication_error - I18n.t("email_settings.smtp_authentication_error") + # Generally SMTP authentication errors are due to invalid credentials, + # and most common mail servers provide more detailed error messages, + # so it should be safe to return the error message as is. + # + # Example: Office 365 returns: + # + # 535 5.7.139 Authentication unsuccessful, user is locked by your organization's security defaults policy. Contact your administrator. + # + # Example: Gmail returns: + # + # Application-specific password required. Learn more at https://support.google.com/accounts/answer/185833 + I18n.t("email_settings.smtp_authentication_error", message: @exception.message) end def net_smtp_server_busy @@ -99,33 +110,7 @@ class EmailSettingsExceptionHandler end end - class GmailProvider < GenericProvider - def net_smtp_authentication_error - # Gmail requires use of application-specific passwords when 2FA is enabled and return - # a special error message calling this out. - if @exception.message.match(/Application-specific password required/) - I18n.t("email_settings.authentication_error_gmail_app_password") - else - super - end - end - - def net_imap_no_response_error - # Gmail requires use of application-specific passwords when 2FA is enabled and return - # a special error message calling this out. - if @exception.message.match(/Application-specific password required/) - I18n.t("email_settings.authentication_error_gmail_app_password") - else - super - end - end - end - def self.friendly_exception_message(exception, host) - if host.include?("gmail.com") - EmailSettingsExceptionHandler::GmailProvider.new(exception).message - else - EmailSettingsExceptionHandler::GenericProvider.new(exception).message - end + EmailSettingsExceptionHandler::GenericProvider.new(exception).message end end diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 5de98d755b9..5b11bcaa28b 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1123,8 +1123,7 @@ en: pop3_authentication_error: "There was an issue with the POP3 credentials provided, check the username and password and try again." imap_authentication_error: "There was an issue with the IMAP credentials provided, check the username and password and try again." imap_no_response_error: "An error occurred when communicating with the IMAP server. %{message}" - smtp_authentication_error: "There was an issue with the SMTP credentials provided, check the username and password and try again." - authentication_error_gmail_app_password: 'Application-specific password required. Learn more at this Google Help article' + smtp_authentication_error: "There was an issue with the SMTP credentials provided, check the username and password and try again. %{message}" smtp_server_busy_error: "The SMTP server is currently busy, try again later." smtp_unhandled_error: "There was an unhandled error when communicating with the SMTP server. %{message}" imap_unhandled_error: "There was an unhandled error when communicating with the IMAP server. %{message}" diff --git a/spec/requests/groups_controller_spec.rb b/spec/requests/groups_controller_spec.rb index e25aa3a96e5..6d042a7f502 100644 --- a/spec/requests/groups_controller_spec.rb +++ b/spec/requests/groups_controller_spec.rb @@ -2799,7 +2799,7 @@ RSpec.describe GroupsController do post "/groups/#{group.id}/test_email_settings.json", params: params expect(response.status).to eq(422) expect(response.parsed_body["errors"]).to include( - I18n.t("email_settings.smtp_authentication_error"), + I18n.t("email_settings.smtp_authentication_error", message: "Invalid credentials"), ) end end diff --git a/spec/services/email_settings_exception_handler_spec.rb b/spec/services/email_settings_exception_handler_spec.rb index 1baa084abbc..1fe25376bbc 100644 --- a/spec/services/email_settings_exception_handler_spec.rb +++ b/spec/services/email_settings_exception_handler_spec.rb @@ -23,28 +23,10 @@ RSpec.describe EmailSettingsExceptionHandler do ) end - it "formats a general Net::IMAP::NoResponseError with application-specific password Gmail error" do - exception = - Net::IMAP::NoResponseError.new( - stub(data: stub(text: "NO Application-specific password required")), - ) - expect(described_class.friendly_exception_message(exception, "imap.gmail.com")).to eq( - I18n.t("email_settings.authentication_error_gmail_app_password"), - ) - end - it "formats a Net::SMTPAuthenticationError" do exception = Net::SMTPAuthenticationError.new("invalid credentials") expect(described_class.friendly_exception_message(exception, "smtp.test.com")).to eq( - I18n.t("email_settings.smtp_authentication_error"), - ) - end - - it "formats a Net::SMTPAuthenticationError with application-specific password Gmail error" do - exception = - Net::SMTPAuthenticationError.new(nil, message: "Application-specific password required") - expect(described_class.friendly_exception_message(exception, "smtp.gmail.com")).to eq( - I18n.t("email_settings.authentication_error_gmail_app_password"), + I18n.t("email_settings.smtp_authentication_error", message: "invalid credentials"), ) end diff --git a/spec/services/problem_check/group_email_credentials_spec.rb b/spec/services/problem_check/group_email_credentials_spec.rb index 2c2ea73a70f..c8551e4dfb7 100644 --- a/spec/services/problem_check/group_email_credentials_spec.rb +++ b/spec/services/problem_check/group_email_credentials_spec.rb @@ -45,7 +45,14 @@ RSpec.describe ProblemCheck::GroupEmailCredentials do target: group2.id, priority: "high", message: - "There was an issue with the email credentials for the group . No emails will be sent from the group inbox until this problem is addressed. There was an issue with the SMTP credentials provided, check the username and password and try again.", + I18n.t( + "dashboard.problem.group_email_credentials", + base_path: Discourse.base_path, + group_name: group2.name, + group_full_name: group2.full_name, + error: + I18n.t("email_settings.smtp_authentication_error", message: "bad credentials"), + ), ), ) end @@ -63,7 +70,14 @@ RSpec.describe ProblemCheck::GroupEmailCredentials do target: group3.id, priority: "high", message: - "There was an issue with the email credentials for the group . No emails will be sent from the group inbox until this problem is addressed. There was an issue with the IMAP credentials provided, check the username and password and try again.", + I18n.t( + "dashboard.problem.group_email_credentials", + base_path: Discourse.base_path, + group_name: group3.name, + group_full_name: group3.full_name, + error: + I18n.t("email_settings.imap_authentication_error", message: "bad credentials"), + ), ), ) end