Ejemplo n.º 1
0
Archivo: cbor.py Proyecto: zhill/yosai
def _decode_custom_type(decoder: cbor2.CBORDecoder, value, fp,
                        shareable_index: Optional[int], *,
                        serializer: 'CBORSerializer'):
    typename, serialized_state = value
    try:
        cls, unmarshaller = serializer.unmarshallers[typename]
    except KeyError:
        raise LookupError(
            'no unmarshaller found for type "{}"'.format(typename)) from None

    instance = cls.__new__(cls)
    if shareable_index is not None:
        decoder.shareables[shareable_index] = instance

    buf = BytesIO(serialized_state)
    state = decoder.decode(buf)
    unmarshaller(instance, state)
    return instance
    def cbor_tag_decoder(self, decoder: cbor2.CBORDecoder, tag: cbor2.CBORTag,
                         shareable_index: int = None):
        if tag.tag != self.type_tag:
            return tag

        typename, serialized_state = tag.value
        try:
            cls, unmarshaller = self.serializer.unmarshallers[typename]
        except KeyError:
            raise LookupError('no unmarshaller found for type "{}"'.format(typename)) from None

        if cls is not None:
            instance = cls.__new__(cls)
            decoder.set_shareable(shareable_index, instance)
            marshalled_state = decoder.decode_from_bytes(serialized_state)
            unmarshaller(instance, marshalled_state)
            return instance
        else:
            marshalled_state = decoder.decode_from_bytes(serialized_state)
            return unmarshaller(marshalled_state)
Ejemplo n.º 3
0
    def cbor_tag_decoder(self, decoder: cbor2.CBORDecoder, tag: cbor2.CBORTag,
                         shareable_index: int = None):
        if tag.tag != self.type_tag:
            return tag

        typename, serialized_state = tag.value
        try:
            cls, unmarshaller = self.serializer.unmarshallers[typename]
        except KeyError:
            raise LookupError('no unmarshaller found for type "{}"'.format(typename)) from None

        if cls is not None:
            instance = cls.__new__(cls)
            decoder.set_shareable(shareable_index, instance)
            marshalled_state = decoder.decode_from_bytes(serialized_state)
            unmarshaller(instance, marshalled_state)
            return instance
        else:
            marshalled_state = decoder.decode_from_bytes(serialized_state)
            return unmarshaller(marshalled_state)
Ejemplo n.º 4
0
def main():
    usage = '%prog [-v] [-h] <cds file...>'
    parser = optparse.OptionParser(usage, version='%prog 0.01')
    parser.add_option('-v', '--verbose', action='store_true', dest='verbose',
                      help='turn verbose mode on')

    (options, args) = parser.parse_args()

    if options.verbose == True:
        log.setLevel(logging.DEBUG)
        log.debug('argv: %s', sys.argv)
        log.debug('options: %s', options)
        log.debug('args: %s', args)
    else:
        log.setLevel(logging.WARNING)

    if not args:
        parser.print_usage()
        exit(1)

    decoder = CBORDecoder()
    # if https://github.com/agronholm/cbor2/pull/5 is not merged/released yet
    if 0 not in decoder.special_decoders:
        decoder.special_decoders[0] = lambda self, fp, shareable_index=None: SimpleValue(0)
        decoder.special_decoders[1] = lambda self, fp, shareable_index=None: SimpleValue(1)
        decoder.special_decoders[2] = lambda self, fp, shareable_index=None: SimpleValue(2)
        decoder.special_decoders[3] = lambda self, fp, shareable_index=None: SimpleValue(3)
        decoder.special_decoders[4] = lambda self, fp, shareable_index=None: SimpleValue(4)
        decoder.special_decoders[5] = lambda self, fp, shareable_index=None: SimpleValue(5)
        decoder.special_decoders[6] = lambda self, fp, shareable_index=None: SimpleValue(6)
        decoder.special_decoders[7] = lambda self, fp, shareable_index=None: SimpleValue(7)
        decoder.special_decoders[8] = lambda self, fp, shareable_index=None: SimpleValue(8)
        decoder.special_decoders[9] = lambda self, fp, shareable_index=None: SimpleValue(9)
        decoder.special_decoders[10] = lambda self, fp, shareable_index=None: SimpleValue(10)
        decoder.special_decoders[11] = lambda self, fp, shareable_index=None: SimpleValue(11)
        decoder.special_decoders[12] = lambda self, fp, shareable_index=None: SimpleValue(12)
        decoder.special_decoders[13] = lambda self, fp, shareable_index=None: SimpleValue(13)
        decoder.special_decoders[14] = lambda self, fp, shareable_index=None: SimpleValue(14)
        decoder.special_decoders[15] = lambda self, fp, shareable_index=None: SimpleValue(15)
        decoder.special_decoders[16] = lambda self, fp, shareable_index=None: SimpleValue(16)
        decoder.special_decoders[17] = lambda self, fp, shareable_index=None: SimpleValue(17)
        decoder.special_decoders[18] = lambda self, fp, shareable_index=None: SimpleValue(18)
        decoder.special_decoders[19] = lambda self, fp, shareable_index=None: SimpleValue(19)
        decoder.special_decoders[24] = decode_simple_value

    version = None

    for f in args:
        log.debug('file: %s', f)
        with open(f, 'rb') as fp:
            obj = None
            try:
                obj = decoder.decode(fp)
            except Exception as e:
                if e.__str__().find("index out of range") == -1:
                    raise
            if not isinstance(obj, list):
                raise Exception("Invalid element, expected an array but found: {}".format(type(obj)))

            version = obj.pop(0)
            if version != "CDSv1":
                raise Exception("Invalid version, expected CDSv1 but got: {}".format(version))

            while len(obj):
                opt = obj.pop(0)
                if not isinstance(opt, int):
                    raise Exception("Invalid option, expected int but got: {}".format(type(opt)))
                if opt == 0:
                    MAX_RLABELS = obj.pop(0)
                    if not isinstance(MAX_RLABELS, int) or MAX_RLABELS < 1:
                        raise Exception("Invalid option for maximum rlabels, got: {}".format(MAX_RLABELS))
                    log.debug("Using maximum rlabels {}".format(MAX_RLABELS))
                elif opt == 1:
                    MIN_RLABEL_SIZE = obj.pop(0)
                    if not isinstance(MIN_RLABEL_SIZE, int) or MIN_RLABEL_SIZE < 1:
                        raise Exception("Invalid option for minimum rlabel size, got: {}".format(MIN_RLABEL_SIZE))
                    log.debug("Using minimum rlabel size {}".format(MIN_RLABEL_SIZE))
                else:
                    raise Exception("Unknown option: {}".format(opt))

            while True:
                obj = None
                try:
                    obj = decoder.decode(fp)
                except Exception as e:
                    if e.__str__().find("index out of range") == -1:
                        raise
                if obj is None:
                    break
                if not isinstance(obj, list):
                    raise Exception("Invalid element, expected an array but found: {}".format(type(obj)))
                parse(obj)

            last.reset()
Ejemplo n.º 5
0
def main():
    usage = '%prog [-v] [-h] <cds file...>'
    parser = optparse.OptionParser(usage, version='%prog 0.01')
    parser.add_option('-v', '--verbose', action='store_true', dest='verbose',
                      help='turn verbose mode on')

    (options, args) = parser.parse_args()

    if options.verbose == True:
        log.setLevel(logging.DEBUG)
        log.debug('argv: %s', sys.argv)
        log.debug('options: %s', options)
        log.debug('args: %s', args)
    else:
        log.setLevel(logging.WARNING)

    if not args:
        parser.print_usage()
        exit(1)

    decoder = CBORDecoder()
    # if https://github.com/agronholm/cbor2/pull/5 is not merged/released yet
    if 0 not in decoder.special_decoders:
        decoder.special_decoders[0] = lambda self, fp, shareable_index=None: SimpleValue(0)
        decoder.special_decoders[1] = lambda self, fp, shareable_index=None: SimpleValue(1)
        decoder.special_decoders[2] = lambda self, fp, shareable_index=None: SimpleValue(2)
        decoder.special_decoders[3] = lambda self, fp, shareable_index=None: SimpleValue(3)
        decoder.special_decoders[4] = lambda self, fp, shareable_index=None: SimpleValue(4)
        decoder.special_decoders[5] = lambda self, fp, shareable_index=None: SimpleValue(5)
        decoder.special_decoders[6] = lambda self, fp, shareable_index=None: SimpleValue(6)
        decoder.special_decoders[7] = lambda self, fp, shareable_index=None: SimpleValue(7)
        decoder.special_decoders[8] = lambda self, fp, shareable_index=None: SimpleValue(8)
        decoder.special_decoders[9] = lambda self, fp, shareable_index=None: SimpleValue(9)
        decoder.special_decoders[10] = lambda self, fp, shareable_index=None: SimpleValue(10)
        decoder.special_decoders[11] = lambda self, fp, shareable_index=None: SimpleValue(11)
        decoder.special_decoders[12] = lambda self, fp, shareable_index=None: SimpleValue(12)
        decoder.special_decoders[13] = lambda self, fp, shareable_index=None: SimpleValue(13)
        decoder.special_decoders[14] = lambda self, fp, shareable_index=None: SimpleValue(14)
        decoder.special_decoders[15] = lambda self, fp, shareable_index=None: SimpleValue(15)
        decoder.special_decoders[16] = lambda self, fp, shareable_index=None: SimpleValue(16)
        decoder.special_decoders[17] = lambda self, fp, shareable_index=None: SimpleValue(17)
        decoder.special_decoders[18] = lambda self, fp, shareable_index=None: SimpleValue(18)
        decoder.special_decoders[19] = lambda self, fp, shareable_index=None: SimpleValue(19)
        decoder.special_decoders[24] = decode_simple_value

    version = None

    for f in args:
        log.debug('file: %s', f)
        with open(f, 'rb') as fp:
            obj = None
            try:
                obj = decoder.decode(fp)
            except Exception as e:
                if e.__str__().find("index out of range") == -1:
                    raise
            if not isinstance(obj, list):
                raise Exception("Invalid element, expected an array but found: {}".format(type(obj)))

            version = obj.pop(0)
            if version != "CDSv1":
                raise Exception("Invalid version, expected CDSv1 but got: {}".format(version))

            while len(obj):
                opt = obj.pop(0)
                if not isinstance(opt, int):
                    raise Exception("Invalid option, expected int but got: {}".format(type(opt)))
                if opt == 0:
                    MAX_RLABELS = obj.pop(0)
                    if not isinstance(MAX_RLABELS, int) or MAX_RLABELS < 1:
                        raise Exception("Invalid option for maximum rlabels, got: {}".format(MAX_RLABELS))
                    log.debug("Using maximum rlabels {}".format(MAX_RLABELS))
                elif opt == 1:
                    MIN_RLABEL_SIZE = obj.pop(0)
                    if not isinstance(MIN_RLABEL_SIZE, int) or MIN_RLABEL_SIZE < 1:
                        raise Exception("Invalid option for minimum rlabel size, got: {}".format(MIN_RLABEL_SIZE))
                    log.debug("Using minimum rlabel size {}".format(MIN_RLABEL_SIZE))
                else:
                    raise Exception("Unknown option: {}".format(opt))

            while True:
                obj = None
                try:
                    obj = decoder.decode(fp)
                except Exception as e:
                    if e.__str__().find("index out of range") == -1:
                        raise
                if obj is None:
                    break
                if not isinstance(obj, list):
                    raise Exception("Invalid element, expected an array but found: {}".format(type(obj)))
                parse(obj)

            log.debug("unique labels: {} parts: {} rdata: {}".format(len(last.labels), len(last.label_parts), len(last.rdata)))

            n = 0
            e = 0
            for l in last.labels:
#                print("{}: {}".format(l, last.labels[l]))
                if last.labels[l] > 1:
                    n += last.label_len[l] * ( last.labels[l] - 1 )
                    e += 2 * ( last.labels[l] - 1 )
            log.debug("reduce labels: {} - {}".format(n, e))

            n = 0
            e = 0
            for l in last.label_parts:
#                print("{}: {}".format(l, last.label_parts[l]))
                if last.label_parts[l] > 1:
                    n += last.label_part_len[l] * ( last.label_parts[l] - 1 )
                    e += 2 * ( last.label_parts[l] - 1 )
            log.debug("reduce label parts: {} - {}".format(n, e))

            n = 0
            e = 0
            for l in last.rdata:
                if last.rdata[l] > 1:
                    n += last.rdata_len[l] * ( last.rdata[l] - 1 )
                    e += 2 * ( last.rdata[l] - 1 )
#                    print("{}: {}".format(l, last.rdata[l]))
            log.debug("reduce rdata: {} - {}".format(n, e))

            last.reset()