/ letsencrypt / continuity_auth.py
continuity_auth.py
1 """Continuity Authenticator""" 2 import zope.interface 3 4 from acme import challenges 5 6 from letsencrypt import achallenges 7 from letsencrypt import errors 8 from letsencrypt import interfaces 9 from letsencrypt import proof_of_possession 10 11 12 class ContinuityAuthenticator(object): 13 """IAuthenticator for 14 :const:`~acme.challenges.ContinuityChallenge` class challenges. 15 16 :ivar proof_of_pos: Performs "proofOfPossession" challenges. 17 :type proof_of_pos: 18 :class:`letsencrypt.proof_of_possession.Proof_of_Possession` 19 20 """ 21 zope.interface.implements(interfaces.IAuthenticator) 22 23 # This will have an installer soon for get_key/cert purposes 24 def __init__(self, config, installer): # pylint: disable=unused-argument 25 """Initialize Client Authenticator. 26 27 :param config: Configuration. 28 :type config: :class:`letsencrypt.interfaces.IConfig` 29 30 :param installer: Let's Encrypt Installer. 31 :type installer: :class:`letsencrypt.interfaces.IInstaller` 32 33 """ 34 self.proof_of_pos = proof_of_possession.ProofOfPossession(installer) 35 36 def get_chall_pref(self, unused_domain): # pylint: disable=no-self-use 37 """Return list of challenge preferences.""" 38 return [challenges.ProofOfPossession] 39 40 def perform(self, achalls): 41 """Perform client specific challenges for IAuthenticator""" 42 responses = [] 43 for achall in achalls: 44 if isinstance(achall, achallenges.ProofOfPossession): 45 responses.append(self.proof_of_pos.perform(achall)) 46 else: 47 raise errors.ContAuthError("Unexpected Challenge") 48 return responses 49 50 def cleanup(self, achalls): # pylint: disable=no-self-use 51 """Cleanup call for IAuthenticator.""" 52 for achall in achalls: 53 if not isinstance(achall, achallenges.ProofOfPossession): 54 raise errors.ContAuthError("Unexpected Challenge")