# frozen_string_literal: true
module Net
class IMAP
module SASL
# SASL::ProtocolAdapters modules are meant to be used as mixins for
# SASL::ClientAdapter and its subclasses. Where the client adapter must
# be customized for each client library, the protocol adapter mixin
# handles \SASL requirements that are part of the protocol specification,
# but not specific to any particular client library. In particular, see
# {RFC4422 ยง4}[https://www.rfc-editor.org/rfc/rfc4422.html#section-4]
#
# === Interface
#
# >>>
# NOTE: This API is experimental, and may change.
#
# - {#command_name}[rdoc-ref:Generic#command_name] -- The name of the
# command used to to initiate an authentication exchange.
# - {#service}[rdoc-ref:Generic#service] -- The GSSAPI service name.
# - {#encode_ir}[rdoc-ref:Generic#encode_ir]--Encodes an initial response.
# - {#decode}[rdoc-ref:Generic#decode] -- Decodes a server challenge.
# - {#encode}[rdoc-ref:Generic#encode] -- Encodes a client response.
# - {#cancel_response}[rdoc-ref:Generic#cancel_response] -- The encoded
# client response used to cancel an authentication exchange.
#
# Other protocol requirements of the \SASL authentication exchange are
# handled by SASL::ClientAdapter.
#
# === Included protocol adapters
#
# - Generic -- a basic implementation of all of the methods listed above.
# - IMAP -- An adapter for the IMAP4 protocol.
# - SMTP -- An adapter for the \SMTP protocol with the +AUTH+ capability.
# - POP -- An adapter for the POP3 protocol with the +SASL+ capability.
module ProtocolAdapters
# See SASL::ProtocolAdapters@Interface.
module Generic
# The name of the protocol command used to initiate a \SASL
# authentication exchange.
#
# The generic implementation returns "AUTHENTICATE".
def command_name; "AUTHENTICATE" end
# A service name from the {GSSAPI/Kerberos/SASL Service Names
# registry}[https://www.iana.org/assignments/gssapi-service-names/gssapi-service-names.xhtml].
#
# The generic implementation returns "host", which is the
# generic GSSAPI host-based service name.
def service; "host" end
# Encodes an initial response string.
#
# The generic implementation returns the result of #encode, or returns
# "=" when +string+ is empty.
def encode_ir(string) string.empty? ? "=" : encode(string) end
# Encodes a client response string.
#
# The generic implementation returns the Base64 encoding of +string+.
def encode(string) [string].pack("m0") end
# Decodes a server challenge string.
#
# The generic implementation returns the Base64 decoding of +string+.
def decode(string) string.unpack1("m0") end
# Returns the message used by the client to abort an authentication
# exchange.
#
# The generic implementation returns "*".
def cancel_response; "*" end
end
# See RFC-3501 (IMAP4rev1), RFC-4959 (SASL-IR capability),
# and RFC-9051 (IMAP4rev2).
module IMAP
include Generic
def service; "imap" end
end
# See RFC-4954 (AUTH capability).
module SMTP
include Generic
def command_name; "AUTH" end
def service; "smtp" end
end
# See RFC-5034 (SASL capability).
module POP
include Generic
def command_name; "AUTH" end
def service; "pop" end
end
end
end
end
end