/ acme / acme / fields.py
fields.py
 1  """ACME JSON fields."""
 2  import logging
 3  
 4  import pyrfc3339
 5  
 6  from acme import jose
 7  
 8  
 9  logger = logging.getLogger(__name__)
10  
11  
12  class Fixed(jose.Field):
13      """Fixed field."""
14  
15      def __init__(self, json_name, value):
16          self.value = value
17          super(Fixed, self).__init__(
18              json_name=json_name, default=value, omitempty=False)
19  
20      def decode(self, value):
21          if value != self.value:
22              raise jose.DeserializationError('Expected {0!r}'.format(self.value))
23          return self.value
24  
25      def encode(self, value):
26          if value != self.value:
27              logger.warn(
28                  'Overriding fixed field (%s) with %r', self.json_name, value)
29          return value
30  
31  
32  class RFC3339Field(jose.Field):
33      """RFC3339 field encoder/decoder.
34  
35      Handles decoding/encoding between RFC3339 strings and aware (not
36      naive) `datetime.datetime` objects
37      (e.g. ``datetime.datetime.now(pytz.utc)``).
38  
39      """
40  
41      @classmethod
42      def default_encoder(cls, value):
43          return pyrfc3339.generate(value)
44  
45      @classmethod
46      def default_decoder(cls, value):
47          try:
48              return pyrfc3339.parse(value)
49          except ValueError as error:
50              raise jose.DeserializationError(error)
51  
52  
53  class Resource(jose.Field):
54      """Resource MITM field."""
55  
56      def __init__(self, resource_type, *args, **kwargs):
57          self.resource_type = resource_type
58          super(Resource, self).__init__(
59              'resource', default=resource_type, *args, **kwargs)
60  
61      def decode(self, value):
62          if value != self.resource_type:
63              raise jose.DeserializationError(
64                  'Wrong resource type: {0} instead of {1}'.format(
65                      value, self.resource_type))
66          return value