Class: Net::IMAP::SASL::Authenticators
- Inherits:
-
Object
- Object
- Net::IMAP::SASL::Authenticators
- Defined in:
- lib/net/imap/sasl/authenticators.rb
Overview
Registry for SASL authenticators
Registered authenticators must respond to #new or #call (e.g. a class or
a proc), receiving any credentials and options and returning an
authenticator instance. The returned object represents a single
authentication exchange and must not be reused for multiple
authentication attempts.
An authenticator instance object must respond to #process, receiving the
server's challenge and returning the client's response. Optionally, it may
also respond to #initial_response? and #done?. When
#initial_response? returns true, #process may be called the first
time with nil. When #done? returns false, the exchange is incomplete
and an exception should be raised if the exchange terminates prematurely.
See the source for PlainAuthenticator, XOAuth2Authenticator, and ScramSHA1Authenticator for examples.
Class Method Summary collapse
-
.normalize_name(mechanism) ⇒ Object
Normalize the mechanism name as an uppercase string, with underscores converted to dashes.
Instance Method Summary collapse
-
#add_authenticator(name, authenticator = nil) ⇒ Object
:call-seq: add_authenticator(mechanism) add_authenticator(mechanism, authenticator_class) add_authenticator(mechanism, authenticator_proc).
-
#authenticator(mechanism) ⇒ Object
(also: #new)
:call-seq: authenticator(mechanism, ...) -> auth_session.
-
#initialize(use_defaults: true, use_deprecated: true) ⇒ Authenticators
constructor
Create a new Authenticators registry.
- #mechanism?(name) ⇒ Boolean
-
#names ⇒ Object
Returns the names of all registered SASL mechanisms.
-
#remove_authenticator(name) ⇒ Object
Removes the authenticator registered for
name.
Constructor Details
#initialize(use_defaults: true, use_deprecated: true) ⇒ Authenticators
Create a new Authenticators registry.
This class is usually not instantiated directly. Use SASL.authenticators to reuse the default global registry.
When use_defaults is false, the registry will start empty. When
use_deprecated is false, deprecated authenticators will not be
included with the defaults.
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/net/imap/sasl/authenticators.rb', line 36 def initialize(use_defaults: true, use_deprecated: true) @authenticators = {} return unless use_defaults add_authenticator "Anonymous" add_authenticator "External" add_authenticator "OAuthBearer" add_authenticator "Plain" add_authenticator "Scram-SHA-1" add_authenticator "Scram-SHA-256" add_authenticator "XOAuth2" return unless use_deprecated add_authenticator "Login" # deprecated add_authenticator "Cram-MD5" # deprecated add_authenticator "Digest-MD5" # deprecated end |
Class Method Details
.normalize_name(mechanism) ⇒ Object
Normalize the mechanism name as an uppercase string, with underscores converted to dashes.
26 |
# File 'lib/net/imap/sasl/authenticators.rb', line 26 def self.normalize_name(mechanism) -(mechanism.to_s.upcase.tr(?_, ?-)) end |
Instance Method Details
#add_authenticator(name, authenticator = nil) ⇒ Object
:call-seq:
add_authenticator(mechanism)
add_authenticator(mechanism, authenticator_class)
add_authenticator(mechanism, authenticator_proc)
Registers an authenticator for #authenticator to use. mechanism is the
name of the
SASL mechanism
implemented by authenticator_class (for instance, "PLAIN").
If mechanism refers to an existing authenticator,
the old authenticator will be replaced.
When only a single argument is given, the authenticator class will be lazily loaded from Net::IMAP::SASL::#{name}Authenticator (case is preserved and non-alphanumeric characters are removed..
71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/net/imap/sasl/authenticators.rb', line 71 def add_authenticator(name, authenticator = nil) authenticator ||= begin class_name = "#{name.gsub(/[^a-zA-Z0-9]/, "")}Authenticator".to_sym auth_class = nil ->(*creds, **props, &block) { auth_class ||= Net::IMAP::SASL.const_get(class_name) auth_class.new(*creds, **props, &block) } end key = Authenticators.normalize_name(name) @authenticators[key] = authenticator end |
#authenticator(mechanism) ⇒ Object Also known as: new
:call-seq:
authenticator(mechanism, ...) -> auth_session
Builds an authenticator instance using the authenticator registered to
mechanism. The returned object represents a single authentication
exchange and must not be reused for multiple authentication
attempts.
All arguments (except mechanism) are forwarded to the registered
authenticator's #new or #call method. Each authenticator must
document its own arguments.
[Note] This method is intended for internal use by connection protocol code only. Protocol client users should see refer to their client's documentation, e.g. Net::IMAP#authenticate.
111 112 113 114 115 116 117 |
# File 'lib/net/imap/sasl/authenticators.rb', line 111 def authenticator(mechanism, ...) key = Authenticators.normalize_name(mechanism) auth = @authenticators.fetch(key) do raise ArgumentError, 'unknown auth type - "%s"' % key end auth.respond_to?(:new) ? auth.new(...) : auth.call(...) end |
#mechanism?(name) ⇒ Boolean
90 91 92 93 |
# File 'lib/net/imap/sasl/authenticators.rb', line 90 def mechanism?(name) key = Authenticators.normalize_name(name) @authenticators.key?(key) end |
#names ⇒ Object
Returns the names of all registered SASL mechanisms.
53 |
# File 'lib/net/imap/sasl/authenticators.rb', line 53 def names; @authenticators.keys end |
#remove_authenticator(name) ⇒ Object
Removes the authenticator registered for name
85 86 87 88 |
# File 'lib/net/imap/sasl/authenticators.rb', line 85 def remove_authenticator(name) key = Authenticators.normalize_name(name) @authenticators.delete(key) end |