From c02ce7965b00533dcafb523ebf418d596d302ab0 Mon Sep 17 00:00:00 2001 From: nick evans Date: Sat, 14 Oct 2023 14:03:27 -0400 Subject: [PATCH] Delegate checking auth args to the authenticator Each authenticator has different parameters, so argument validation must be delegated to the authenticator classes. --- lib/net/smtp.rb | 24 +++++++----------------- lib/net/smtp/authenticator.rb | 9 +++++++++ 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/lib/net/smtp.rb b/lib/net/smtp.rb index 145f897..fcc2205 100644 --- a/lib/net/smtp.rb +++ b/lib/net/smtp.rb @@ -633,9 +633,8 @@ def tcp_socket(address, port) def do_start(helo_domain, user, secret, authtype) raise IOError, 'SMTP session already started' if @started - if user or secret - check_auth_method(authtype || DEFAULT_AUTH_TYPE) - check_auth_args user, secret + if user || secret || authtype + check_auth_args authtype, user, secret end s = Timeout.timeout(@open_timeout, Net::OpenTimeout) do tcp_socket(@address, @port) @@ -832,27 +831,18 @@ def open_message_stream(from_addr, *to_addrs, &block) # :yield: stream DEFAULT_AUTH_TYPE = :plain def authenticate(user, secret, authtype = DEFAULT_AUTH_TYPE) - check_auth_method authtype - check_auth_args user, secret + check_auth_args authtype, user, secret authenticator = Authenticator.auth_class(authtype).new(self) authenticator.auth(user, secret) end private - def check_auth_method(type) - unless Authenticator.auth_class(type) + def check_auth_args(type, *args, **kwargs) + type ||= DEFAULT_AUTH_TYPE + klass = Authenticator.auth_class(type) or raise ArgumentError, "wrong authentication type #{type}" - end - end - - def check_auth_args(user, secret, authtype = DEFAULT_AUTH_TYPE) - unless user - raise ArgumentError, 'SMTP-AUTH requested but missing user name' - end - unless secret - raise ArgumentError, 'SMTP-AUTH requested but missing secret phrase' - end + klass.check_args(*args, **kwargs) end # diff --git a/lib/net/smtp/authenticator.rb b/lib/net/smtp/authenticator.rb index 756bfa9..4e91228 100644 --- a/lib/net/smtp/authenticator.rb +++ b/lib/net/smtp/authenticator.rb @@ -15,6 +15,15 @@ def self.auth_class(type) Authenticator.auth_classes[type] end + def self.check_args(user_arg = nil, secret_arg = nil, *, **) + unless user_arg + raise ArgumentError, 'SMTP-AUTH requested but missing user name' + end + unless secret_arg + raise ArgumentError, 'SMTP-AUTH requested but missing secret phrase' + end + end + attr_reader :smtp def initialize(smtp)