Source code for pysasl.mechanism.external


from typing import Union, Tuple, Sequence

from . import (ServerMechanism, ClientMechanism, ServerChallenge,
               ChallengeResponse)
from ..creds.client import ClientCredentials
from ..creds.external import ExternalCredentials
from ..exception import UnexpectedChallenge

__all__ = ['ExternalMechanism']


[docs]class ExternalMechanism(ServerMechanism, ClientMechanism): """Implements the EXTERNAL authentication mechanism. See Also: `RFC 4422 Appendix A <https://tools.ietf.org/html/rfc4422#appendix-A>`_ """ def __init__(self, name: Union[str, bytes] = b'EXTERNAL') -> None: super().__init__(name)
[docs] def server_attempt(self, responses: Sequence[ChallengeResponse]) \ -> Tuple[ExternalCredentials, None]: try: first = responses[0] except IndexError as exc: raise ServerChallenge(b'') from exc authzid_str = first.response.decode('utf-8') return ExternalCredentials(authzid_str), None
[docs] def client_attempt(self, creds: ClientCredentials, challenges: Sequence[ServerChallenge]) \ -> ChallengeResponse: if len(challenges) == 0: challenge = b'' elif len(challenges) == 1: challenge = challenges[0].data else: raise UnexpectedChallenge() authzid = creds.authzid.encode('utf-8') return ChallengeResponse(challenge, authzid)