# 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