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