示例#1
0
    def from_uri(serialized_condition):
        """
        Create a Condition object from a URI.

        This method will parse a condition URI and construct a corresponding Condition object.

        Args:
            serialized_condition (str): URI representing the condition

        Returns:
            Condition: Resulting object
        """
        # TODO consider removing.
        if isinstance(serialized_condition, Condition):
            return serialized_condition
        # TODO Use static typing instead (e.g.: with mypy).
        elif not isinstance(serialized_condition, str):
            raise TypeError('Serialized condition must be a string')

        pieces = serialized_condition.split(':')
        if pieces[0] != CONDITION_URI_SCHEME:
            raise PrefixError(
                'Serialized condition must start with "{}:"'.format(
                    CONDITION_URI_SCHEME
                )
            )

        regex_match = re.match(CONDITION_REGEX_STRICT, serialized_condition)
        if not regex_match:
            raise ParsingError('Invalid condition format')

        qs_dict = parse_qs(regex_match.group(2))

        try:
            fingerprint_type = qs_dict['fpt'][0]
        except (KeyError, IndexError):
            raise ParsingError(
                'Invalid condition format: "fpt" parameter or value missing.')

        condition_type = TypeRegistry.find_by_name(fingerprint_type)
        try:
            cost = qs_dict['cost'][0]
        except (KeyError, IndexError):
            raise ParsingError(
                'Invalid condition format: "cost" parameter or value missing.')

        if not re.match(INTEGER_REGEX, cost):
            raise ParsingError('No or invalid cost provided')

        fingerprint = regex_match.group(1)
        condition = Condition()
        condition.type_id = condition_type['type_id']
        condition._subtypes = set()
        if condition_type['class'].TYPE_CATEGORY == 'compound':
            condition._subtypes.update(qs_dict['subtypes'][0].split(','))
        condition.hash = base64.urlsafe_b64decode(
            base64_add_padding(fingerprint))
        condition.cost = int(cost)
        return condition
示例#2
0
 def to_asn1_dict(self):
     condition_type = TypeRegistry.find_by_type_id(self.type_id)
     condition_class = condition_type['class']
     payload = {'fingerprint': self.hash, 'cost': self.cost}
     if condition_class.TYPE_CATEGORY == 'compound':
         subtype_ids = [
             TypeRegistry.find_by_name(subtype)['type_id']
             for subtype in self.subtypes
         ]
         bits = ['0' for bit in range(5)]
         for subtype_id in subtype_ids:
             bits[subtype_id] = '1'
         bitstring = ''.join(bits).rstrip('0')
         payload['subtypes'] = bitstring
     return {condition_class.TYPE_ASN1: payload}
示例#3
0
 def from_json(data):
     type_ = TypeRegistry.find_by_name(data['type'])
     fulfillment = type_['class']()
     fulfillment.parse_json(data)
     return fulfillment
 def from_json(data):
     type_ = TypeRegistry.find_by_name(data['type'])
     fulfillment = type_['class']()
     fulfillment.parse_json(data)
     return fulfillment