RFC3339DateField (pyrfc3339)

This commit is contained in:
Jakub Warmuz
2015-03-25 16:02:41 +00:00
parent 0b557a0b8c
commit 34466f745b
4 changed files with 40 additions and 7 deletions
+19
View File
@@ -0,0 +1,19 @@
"""ACME JSON fields."""
import pyrfc3339
from letsencrypt.acme import jose
class RFC3339Field(jose.Field):
"""RFC3339 field encoder/decoder"""
@classmethod
def default_encoder(self, value):
return pyrfc3339.generate(value)
@classmethod
def default_decoder(cls, value):
try:
return pyrfc3339.parse(value)
except ValueError as error:
raise jose.DeserializationError(error)
+19 -6
View File
@@ -3,6 +3,7 @@ import jsonschema
from letsencrypt.acme import challenges from letsencrypt.acme import challenges
from letsencrypt.acme import errors from letsencrypt.acme import errors
from letsencrypt.acme import fields
from letsencrypt.acme import jose from letsencrypt.acme import jose
from letsencrypt.acme import other from letsencrypt.acme import other
from letsencrypt.acme import util from letsencrypt.acme import util
@@ -157,8 +158,7 @@ class Challenge(ResourceBody):
__slots__ = ('chall',) __slots__ = ('chall',)
uri = jose.Field('uri') uri = jose.Field('uri')
status = jose.Field('status', decoder=Status.from_json) status = jose.Field('status', decoder=Status.from_json)
# TODO: de/encode datetime validated = fields.RFC3339Field('validated', omitempty=True)
validated = jose.Field('validated', omitempty=True)
def to_json(self): def to_json(self):
jobj = super(Challenge, self).to_json() jobj = super(Challenge, self).to_json()
@@ -202,7 +202,7 @@ class Authorization(ResourceBody):
# general, but for Key Authorization '[t]he "expires" field MUST # general, but for Key Authorization '[t]he "expires" field MUST
# be absent'... then acme-spec gives example with 'expires' # be absent'... then acme-spec gives example with 'expires'
# present... That's confusing! # present... That's confusing!
expires = jose.Field('expires', omitempty=True) # TODO: this is date expires = fields.RFC3339Field('expires', omitempty=True)
@challenges.decoder @challenges.decoder
def challenges(value): # pylint: disable=missing-docstring,no-self-argument def challenges(value): # pylint: disable=missing-docstring,no-self-argument
@@ -241,8 +241,21 @@ class CertificateResource(Resource):
class Revocation(jose.JSONObjectWithFields): class Revocation(jose.JSONObjectWithFields):
"""Revocation message.""" """Revocation message."""
class When(object): # TODO: 'now' or datetime NOW = 'now'
pass
revoke = jose.Field('revoke') # TODO: use When revoke = jose.Field('revoke')
authorizations = CertificateRequest._fields['authorizations'] authorizations = CertificateRequest._fields['authorizations']
@revoke.decoder
def revoke(value):
if jobj == NOW:
return jobj
else:
return RFC3339Field.default_decoder(value)
@revoke.encoder
def revoke(value):
if jobj == NOW:
return value
else:
return RFC3339Field.default_encoder(value)
+1 -1
View File
@@ -355,7 +355,7 @@ class Network(object):
""" """
return self._get_cert(certr.cert_chain_uri) return self._get_cert(certr.cert_chain_uri)
def revoke(self, certr, when='now'): def revoke(self, certr, when=messages2.Revocation.NOW):
"""Revoke certificate. """Revoke certificate.
:param when: When should the revocation take place. :param when: When should the revocation take place.
+1
View File
@@ -36,6 +36,7 @@ install_requires = [
'pyasn1', # urllib3 InsecurePlatformWarning (#304) 'pyasn1', # urllib3 InsecurePlatformWarning (#304)
'pycrypto', 'pycrypto',
'PyOpenSSL', 'PyOpenSSL',
'pyrfc3339',
'python-augeas', 'python-augeas',
'python2-pythondialog', 'python2-pythondialog',
'requests', 'requests',