Files
discourse/lib/validators/pop3_polling_enabled_setting_validator.rb
Martin Brennan 2d68e5d942 FEATURE: Scheduled problem checks for admin dashboard (#15327)
This commit introduces scheduled problem checks for the admin dashboard, which are long running or otherwise cumbersome problem checks that will be run every 10 minutes rather than every time the dashboard is loaded. If these scheduled checks add a problem, the problem will remain until it is cleared or until the scheduled job runs again.

An example of a check that should be scheduled is validating credentials against an external provider.

This commit also introduces the concept of a `priority` to the problems generated by `AdminDashboardData` and the scheduled checks. This is `low` by default, and can be set to `high`, but this commit does not change any part of the UI with this information, only adds a CSS class.

I will be making a follow up PR to check group SMTP credentials.
2021-12-20 09:59:11 +10:00

56 lines
1.8 KiB
Ruby

# frozen_string_literal: true
require "net/pop"
class POP3PollingEnabledSettingValidator
def initialize(opts = {})
@opts = opts
end
def valid_value?(val)
# only validate when enabling polling
return true if val == "f"
# ensure we can authenticate
SiteSetting.pop3_polling_host.present? &&
SiteSetting.pop3_polling_username.present? &&
SiteSetting.pop3_polling_password.present? &&
authentication_works?
end
def error_message
if SiteSetting.pop3_polling_host.blank?
I18n.t("site_settings.errors.pop3_polling_host_is_empty")
elsif SiteSetting.pop3_polling_username.blank?
I18n.t("site_settings.errors.pop3_polling_username_is_empty")
elsif SiteSetting.pop3_polling_password.blank?
I18n.t("site_settings.errors.pop3_polling_password_is_empty")
elsif !authentication_works?
I18n.t("site_settings.errors.pop3_polling_authentication_failed")
end
end
private
def authentication_works?
# TODO (martin, post-2.7 release) Change to use EmailSettingsValidator
# EmailSettingsValidator.validate_pop3(
# host: SiteSetting.pop3_polling_host,
# port: SiteSetting.pop3_polling_port,
# ssl: SiteSetting.pop3_polling_ssl,
# username: SiteSetting.pop3_polling_username,
# password: SiteSetting.pop3_polling_password,
# openssl_verify: SiteSetting.pop3_polling_openssl_verify
# )
@authentication_works ||= begin
pop3 = Net::POP3.new(SiteSetting.pop3_polling_host, SiteSetting.pop3_polling_port)
pop3.enable_ssl(OpenSSL::SSL::VERIFY_NONE) if SiteSetting.pop3_polling_ssl
pop3.auth_only(SiteSetting.pop3_polling_username, SiteSetting.pop3_polling_password)
rescue Net::POPAuthenticationError
false
else
true
end
end
end