VERSION | 2 +- doc/news.rst | 7 +++++++ pyderasn.py | 48 ++++++++++++++++++++++++++++-------------------- tests/test_pyderasn.py | 5 ++++- diff --git a/VERSION b/VERSION index d430032a9fe3b79db8963e79f91e6195c340f04ab0e2652268350b3958014b23..e5a82fc7481ec7a60e4263efa1960be7711fd0445d424ab6b9f5a0c13bf92abd 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.9 +5.0 diff --git a/doc/news.rst b/doc/news.rst index 863c684ce2e82944e0ef38f9c8e056cc3ed0393f802bf013daf34b8867f4b85a..5cf93bf57b66603b00b953b7bdda4b1b4688cbd05a23306dc2c4b06bd9deba95 100644 --- a/doc/news.rst +++ b/doc/news.rst @@ -1,6 +1,13 @@ News ==== +.. _release5.0: + +5.0 +--- +* Ability to specify multip[le OID mappings for pprinted output + (``oids`` keyword argument is renamed to ``oid_maps``) + .. _release4.9: 4.9 diff --git a/pyderasn.py b/pyderasn.py index 54af90025ce60480aadb331aaaa5dce2b81d711b4007f7662dc3c27ab065fb38..0f45414337c57343246cf7d301a23a4b6f4a46d2c91c75a1574e31ccc15e2ceb 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -1435,7 +1435,7 @@ def pp_console_row( pp, - oids=None, + oid_maps=(), with_offsets=False, with_blob=True, with_colours=False, @@ -1470,14 +1470,18 @@ ent = pp.decode_path[-1] if isinstance(ent, DecodePathDefBy): cols.append(_colourize("DEFINED BY", "red", with_colours, ("reverse",))) value = str(ent.defined_by) + oid_name = None if ( - oids is not None and + len(oid_maps) > 0 and ent.defined_by.asn1_type_name == - ObjectIdentifier.asn1_type_name and - value in oids + ObjectIdentifier.asn1_type_name ): - cols.append(_colourize("%s:" % oids[value], "green", with_colours)) - else: + for oid_map in oid_maps: + oid_name = oid_map.get(value) + if oid_name is not None: + cols.append(_colourize("%s:" % oid_name, "green", with_colours)) + break + if oid_name is None: cols.append(_colourize("%s:" % value, "white", with_colours, ("reverse",))) else: cols.append(_colourize("%s:" % ent, "yellow", with_colours, ("reverse",))) @@ -1498,11 +1502,14 @@ if pp.value is not None: value = pp.value cols.append(_colourize(value, "white", with_colours, ("reverse",))) if ( - oids is not None and - pp.asn1_type_name == ObjectIdentifier.asn1_type_name and - value in oids + len(oid_maps) > 0 and + pp.asn1_type_name == ObjectIdentifier.asn1_type_name ): - cols.append(_colourize("(%s)" % oids[value], "green", with_colours)) + for oid_map in oid_maps: + oid_name = oid_map.get(value) + if oid_name is not None: + cols.append(_colourize("(%s)" % oid_name, "green", with_colours)) + break if pp.asn1_type_name == Integer.asn1_type_name: hex_repr = hex(int(pp.obj._value))[2:].upper() if len(hex_repr) % 2 != 0: @@ -1546,7 +1553,7 @@ def pprint( obj, - oids=None, + oid_maps=(), big_blobs=False, with_colours=False, with_decode_path=False, @@ -1555,8 +1562,9 @@ ): """Pretty print object :param Obj obj: object you want to pretty print - :param oids: ``OID <-> humand readable string`` dictionary. When OID - from it is met, then its humand readable form is printed + :param oid_maps: list of ``OID <-> humand readable string`` dictionary. + When OID from it is met, then its humand readable form + is printed :param big_blobs: if large binary objects are met (like OctetString values), do we need to print them too, on separate lines @@ -1578,7 +1586,7 @@ continue if big_blobs: yield pp_console_row( pp, - oids=oids, + oid_maps=oid_maps, with_offsets=True, with_blob=False, with_colours=with_colours, @@ -1593,7 +1601,7 @@ yield row else: yield pp_console_row( pp, - oids=oids, + oid_maps=oid_maps, with_offsets=True, with_blob=True, with_colours=with_colours, @@ -5604,7 +5612,7 @@ schema = choice def pprint_any( obj, - oids=None, + oid_maps=(), with_colours=False, with_decode_path=False, decode_path_only=(), @@ -5624,7 +5632,7 @@ pp_kwargs["decode_path"] = pp.decode_path[:-1] + (">",) pp = _pp(**pp_kwargs) yield pp_console_row( pp, - oids=oids, + oid_maps=oid_maps, with_offsets=True, with_blob=False, with_colours=with_colours, @@ -5654,7 +5662,7 @@ help="Skip that number of bytes from the beginning", ) parser.add_argument( "--oids", - help="Python path to dictionary with OIDs", + help="Python paths to dictionary with OIDs, comma separated", ) parser.add_argument( "--schema", @@ -5692,7 +5700,7 @@ args = parser.parse_args() args.DERFile.seek(args.skip) der = memoryview(args.DERFile.read()) args.DERFile.close() - oids = obj_by_path(args.oids) if args.oids else {} + oid_maps = [obj_by_path(_path) for _path in (args.oids or "").split(",")] if args.schema: schema = obj_by_path(args.schema) from functools import partial @@ -5708,7 +5716,7 @@ ctx["defines_by_path"] = obj_by_path(args.defines_by_path) obj, tail = schema().decode(der, ctx=ctx) print(pprinter( obj, - oids=oids, + oid_maps=oid_maps, with_colours=True if environ.get("NO_COLOR") is None else False, with_decode_path=args.print_decode_path, decode_path_only=( diff --git a/tests/test_pyderasn.py b/tests/test_pyderasn.py index d10d937e2adc64ab9474d6e4603c91b6719e6748068ad8aab9ac47e09029527a..29a380175a5b90d54255a0ea0bc4e5a252808695099449e904e3834ebdfd32e7 100644 --- a/tests/test_pyderasn.py +++ b/tests/test_pyderasn.py @@ -6129,7 +6129,10 @@ chosen = d.draw(sampled_from(sorted(oids))) chosen_id = oids[chosen] pp = _pp(asn1_type_name=ObjectIdentifier.asn1_type_name, value=chosen) self.assertNotIn(chosen_id, pp_console_row(pp)) - self.assertIn(chosen_id, pp_console_row(pp, oids=oids)) + self.assertIn( + chosen_id, + pp_console_row(pp, oid_maps=[{'whatever': 'whenever'}, oids]), + ) class TestAutoAddSlots(TestCase):