mirror of
https://github.com/certbot/certbot.git
synced 2026-07-31 18:25:24 +02:00
Revert to ChallengeResource/ChallengeBody/Challenge triplet
This commit is contained in:
@@ -5,20 +5,24 @@ import hashlib
|
||||
|
||||
import Crypto.Random
|
||||
|
||||
from letsencrypt.acme import fields
|
||||
from letsencrypt.acme import jose
|
||||
from letsencrypt.acme import messages2
|
||||
from letsencrypt.acme import other
|
||||
|
||||
|
||||
# pylint: disable=too-few-public-methods
|
||||
|
||||
|
||||
class ContinuityChallenge(messages2.Challenge): # pylint: disable=abstract-method
|
||||
class Challenge(jose.TypedJSONObjectWithFields):
|
||||
# _fields_to_json | pylint: disable=abstract-method
|
||||
"""ACME challenge."""
|
||||
TYPES = {}
|
||||
|
||||
|
||||
class ContinuityChallenge(Challenge): # pylint: disable=abstract-method
|
||||
"""Client validation challenges."""
|
||||
|
||||
|
||||
class DVChallenge(messages2.Challenge): # pylint: disable=abstract-method
|
||||
class DVChallenge(Challenge): # pylint: disable=abstract-method
|
||||
"""Domain validation challenges."""
|
||||
|
||||
|
||||
@@ -37,7 +41,7 @@ class ChallengeResponse(jose.TypedJSONObjectWithFields):
|
||||
return super(ChallengeResponse, cls).from_json(jobj)
|
||||
|
||||
|
||||
@messages2.Challenge.register
|
||||
@Challenge.register
|
||||
class SimpleHTTPS(DVChallenge):
|
||||
"""ACME "simpleHttps" challenge."""
|
||||
typ = "simpleHttps"
|
||||
@@ -65,7 +69,7 @@ class SimpleHTTPSResponse(ChallengeResponse):
|
||||
return self.URI_TEMPLATE.format(domain=domain, path=self.path)
|
||||
|
||||
|
||||
@messages2.Challenge.register
|
||||
@Challenge.register
|
||||
class DVSNI(DVChallenge):
|
||||
"""ACME "dvsni" challenge.
|
||||
|
||||
@@ -89,9 +93,6 @@ class DVSNI(DVChallenge):
|
||||
nonce = jose.Field("nonce", encoder=binascii.hexlify,
|
||||
decoder=functools.partial(functools.partial(
|
||||
jose.decode_hex16, size=NONCE_SIZE)))
|
||||
uri = jose.Field('uri')
|
||||
status = jose.Field('status', decoder=messages2.Status.from_json)
|
||||
validated = fields.RFC3339Field('validated', omitempty=True)
|
||||
|
||||
@property
|
||||
def nonce_domain(self):
|
||||
@@ -137,7 +138,7 @@ class DVSNIResponse(ChallengeResponse):
|
||||
"""Domain name for certificate subjectAltName."""
|
||||
return self.z(chall) + self.DOMAIN_SUFFIX
|
||||
|
||||
@messages2.Challenge.register
|
||||
@Challenge.register
|
||||
class RecoveryContact(ContinuityChallenge):
|
||||
"""ACME "recoveryContact" challenge."""
|
||||
typ = "recoveryContact"
|
||||
@@ -146,10 +147,6 @@ class RecoveryContact(ContinuityChallenge):
|
||||
success_url = jose.Field("successURL", omitempty=True)
|
||||
contact = jose.Field("contact", omitempty=True)
|
||||
|
||||
uri = jose.Field('uri')
|
||||
status = jose.Field('status', decoder=messages2.Status.from_json)
|
||||
validated = fields.RFC3339Field('validated', omitempty=True)
|
||||
|
||||
|
||||
@ChallengeResponse.register
|
||||
class RecoveryContactResponse(ChallengeResponse):
|
||||
@@ -158,15 +155,11 @@ class RecoveryContactResponse(ChallengeResponse):
|
||||
token = jose.Field("token", omitempty=True)
|
||||
|
||||
|
||||
@messages2.Challenge.register
|
||||
@Challenge.register
|
||||
class RecoveryToken(ContinuityChallenge):
|
||||
"""ACME "recoveryToken" challenge."""
|
||||
typ = "recoveryToken"
|
||||
|
||||
uri = jose.Field('uri')
|
||||
status = jose.Field('status', decoder=messages2.Status.from_json)
|
||||
validated = fields.RFC3339Field('validated', omitempty=True)
|
||||
|
||||
|
||||
@ChallengeResponse.register
|
||||
class RecoveryTokenResponse(ChallengeResponse):
|
||||
@@ -175,7 +168,7 @@ class RecoveryTokenResponse(ChallengeResponse):
|
||||
token = jose.Field("token", omitempty=True)
|
||||
|
||||
|
||||
@messages2.Challenge.register
|
||||
@Challenge.register
|
||||
class ProofOfPossession(ContinuityChallenge):
|
||||
"""ACME "proofOfPossession" challenge.
|
||||
|
||||
@@ -187,10 +180,6 @@ class ProofOfPossession(ContinuityChallenge):
|
||||
|
||||
NONCE_SIZE = 16
|
||||
|
||||
uri = jose.Field('uri')
|
||||
status = jose.Field('status', decoder=messages2.Status.from_json)
|
||||
validated = fields.RFC3339Field('validated', omitempty=True)
|
||||
|
||||
class Hints(jose.JSONObjectWithFields):
|
||||
"""Hints for "proofOfPossession" challenge.
|
||||
|
||||
@@ -247,15 +236,12 @@ class ProofOfPossessionResponse(ChallengeResponse):
|
||||
return self.signature.verify(self.nonce)
|
||||
|
||||
|
||||
@messages2.Challenge.register
|
||||
@Challenge.register
|
||||
class DNS(DVChallenge):
|
||||
"""ACME "dns" challenge."""
|
||||
typ = "dns"
|
||||
token = jose.Field("token")
|
||||
|
||||
uri = jose.Field('uri')
|
||||
status = jose.Field('status', decoder=messages2.Status.from_json)
|
||||
validated = fields.RFC3339Field('validated', omitempty=True)
|
||||
|
||||
@ChallengeResponse.register
|
||||
class DNSResponse(ChallengeResponse):
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
"""ACME protocol v02 messages."""
|
||||
from letsencrypt.acme import challenges
|
||||
from letsencrypt.acme import fields
|
||||
from letsencrypt.acme import jose
|
||||
|
||||
@@ -110,12 +111,8 @@ class Resource(jose.ImmutableMap):
|
||||
__slots__ = ('body', 'uri')
|
||||
|
||||
|
||||
class TypedResourceBody(jose.TypedJSONObjectWithFields):
|
||||
"""ACME Resource Body with type."""
|
||||
|
||||
|
||||
class ResourceBody(jose.JSONObjectWithFields):
|
||||
"""ACME Resource Body"""
|
||||
"""ACME Resource Body."""
|
||||
|
||||
|
||||
class RegistrationResource(Resource):
|
||||
@@ -148,7 +145,7 @@ class Registration(ResourceBody):
|
||||
class ChallengeResource(Resource, jose.JSONObjectWithFields):
|
||||
"""Challenge Resource.
|
||||
|
||||
:ivar letsencrypt.acme.messages2.Challenge body:
|
||||
:ivar letsencrypt.acme.messages2.ChallengeBody body:
|
||||
:ivar str authzr_uri: URI found in the 'up' ``Link`` header.
|
||||
|
||||
"""
|
||||
@@ -161,22 +158,34 @@ class ChallengeResource(Resource, jose.JSONObjectWithFields):
|
||||
return self.body.uri
|
||||
|
||||
|
||||
class Challenge(TypedResourceBody):
|
||||
class ChallengeBody(ResourceBody):
|
||||
"""Challenge Resource Body.
|
||||
|
||||
.. todo::
|
||||
Confusingly, this has a similar name to `.challenges.Challenge`,
|
||||
as well as `.achallenges.AnnotateChallenge`. Please use names
|
||||
such as ``challb`` to distinguish instanced of this class from
|
||||
``achall``.
|
||||
|
||||
:ivar letsencrypt.acme.messages2.Status status:
|
||||
:ivar datetime.datetime validated:
|
||||
|
||||
"""
|
||||
TYPES = {}
|
||||
__slots__ = ('chall',)
|
||||
uri = jose.Field('uri')
|
||||
status = jose.Field('status', decoder=Status.from_json)
|
||||
validated = fields.RFC3339Field('validated', omitempty=True)
|
||||
|
||||
def to_json(self):
|
||||
jobj = super(Challenge, self).to_json()
|
||||
jobj = super(ChallengeBody, self).to_json()
|
||||
jobj.update(self.chall.to_json())
|
||||
return jobj
|
||||
|
||||
@classmethod
|
||||
def fields_from_json(cls, jobj):
|
||||
jobj_fields = super(ChallengeBody, cls).fields_from_json(jobj)
|
||||
jobj_fields['chall'] = challenges.Challenge.from_json(jobj)
|
||||
return jobj_fields
|
||||
|
||||
|
||||
class AuthorizationResource(Resource):
|
||||
@@ -193,7 +202,7 @@ class Authorization(ResourceBody):
|
||||
"""Authorization Resource Body.
|
||||
|
||||
:ivar letsencrypt.acme.messages2.Identifier identifier:
|
||||
:ivar list challenges: `list` of `.Challenge`
|
||||
:ivar list challenges: `list` of `.ChallengeBody`
|
||||
:ivar tuple combinations: Challenge combinations (`tuple` of `tuple`
|
||||
of `int`, as opposed to `list` of `list` from the spec).
|
||||
:ivar letsencrypt.acme.jose.jwk.JWK key: Public key.
|
||||
@@ -220,7 +229,7 @@ class Authorization(ResourceBody):
|
||||
|
||||
@challenges.decoder
|
||||
def challenges(value): # pylint: disable=missing-docstring,no-self-argument
|
||||
return tuple(Challenge.from_json(chall) for chall in value)
|
||||
return tuple(ChallengeBody.from_json(chall) for chall in value)
|
||||
|
||||
@property
|
||||
def resolved_combinations(self):
|
||||
|
||||
Reference in New Issue
Block a user