aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rpki/left_right.py93
-rw-r--r--rpki/xml_utils.py12
2 files changed, 21 insertions, 84 deletions
diff --git a/rpki/left_right.py b/rpki/left_right.py
index 2f1b7577..b102187a 100644
--- a/rpki/left_right.py
+++ b/rpki/left_right.py
@@ -1282,37 +1282,18 @@ class list_resources_elt(rpki.xml_utils.base_elt, left_right_namespace):
"""
element_name = "list_resources"
- attributes = ("self_handle", "tag", "child_handle", "valid_until", "asn", "ipv4", "ipv6")
+
valid_until = None
+ attributes = dict(valid_until = rpki.sundial.datetime.fromXMLtime,
+ asn = rpki.resource_set.resource_set_as,
+ ipv4 = rpki.resource_set.resource_set_ipv4,
+ ipv6 = rpki.resource_set.resource_set_ipv6)
+ attributes.update((_, None) for _ in ("self_handle", "tag", "child_handle"))
+
def __repr__(self):
return rpki.log.log_repr(self, self.self_handle, self.child_handle, self.asn, self.ipv4, self.ipv6)
- def fix_attribute_types(self):
- """
- Fix data types for certain attributes.
- """
-
- if isinstance(self.valid_until, str):
- self.valid_until = rpki.sundial.datetime.fromXMLtime(self.valid_until)
- if self.asn is not None:
- self.asn = rpki.resource_set.resource_set_as(self.asn)
- if self.ipv4 is not None:
- self.ipv4 = rpki.resource_set.resource_set_ipv4(self.ipv4)
- if self.ipv6 is not None:
- self.ipv6 = rpki.resource_set.resource_set_ipv6(self.ipv6)
-
- @classmethod
- def fromXML(cls, elt):
- """
- Handle <list_resources/> element. This requires special handling
- due to the data types of some of the attributes.
- """
-
- self = super(list_resources_elt, cls).fromXML(elt)
- self.fix_attribute_types()
- return self
-
def toXML(self):
"""
Generate <list_resources/> element. This requires special
@@ -1330,28 +1311,11 @@ class list_roa_requests_elt(rpki.xml_utils.base_elt, left_right_namespace):
"""
element_name = "list_roa_requests"
- attributes = ("self_handle", "tag", "asn", "ipv4", "ipv6")
-
- def fix_attribute_types(self):
- """
- Fix data types for certain attributes.
- """
- if self.ipv4 is not None:
- self.ipv4 = rpki.resource_set.roa_prefix_set_ipv4(self.ipv4)
- if self.ipv6 is not None:
- self.ipv6 = rpki.resource_set.roa_prefix_set_ipv6(self.ipv6)
-
- @classmethod
- def fromXML(self, elt):
- """
- Handle <list_roa_requests/> element. This requires special handling
- due to the data types of some of the attributes.
- """
-
- self = super(list_roa_requests_elt, cls).fromXML(elt)
- self.fix_attribute_types()
- return self
+ attributes = dict(asn = rpki.resource_set.resource_set_as,
+ ipv4 = rpki.resource_set.resource_set_ipv4,
+ ipv6 = rpki.resource_set.resource_set_ipv6)
+ attributes.update((_, None) for _ in ("self_handle", "tag"))
def __repr__(self):
return rpki.log.log_repr(self, self.self_handle, self.asn, self.ipv4, self.ipv6)
@@ -1376,7 +1340,13 @@ class list_ee_certificate_requests_elt(rpki.xml_utils.base_elt, left_right_names
"""
element_name = "list_ee_certificate_requests"
- attributes = ("self_handle", "tag", "gski", "valid_until", "asn", "ipv4", "ipv6", "cn", "sn", "eku")
+
+ attributes = dict(valid_until = rpki.sundial.datetime.fromXMLtime,
+ asn = rpki.resource_set.resource_set_as,
+ ipv4 = rpki.resource_set.resource_set_ipv4,
+ ipv6 = rpki.resource_set.resource_set_ipv6,
+ eku = lambda x: x.split(","))
+ attributes.update((_, None) for _ in ("self_handle", "tag", "gski", "cn", "sn"))
elements = collections.OrderedDict((
("pkcs10", rpki.x509.PKCS10),))
@@ -1388,33 +1358,6 @@ class list_ee_certificate_requests_elt(rpki.xml_utils.base_elt, left_right_names
def __repr__(self):
return rpki.log.log_repr(self, self.self_handle, self.gski, self.cn, self.sn, self.asn, self.ipv4, self.ipv6)
- def fix_attribute_types(self):
- """
- Fix data types for certain attributes.
- """
-
- if isinstance(self.valid_until, str):
- self.valid_until = rpki.sundial.datetime.fromXMLtime(self.valid_until)
- if self.asn is not None:
- self.asn = rpki.resource_set.resource_set_as(self.asn)
- if self.ipv4 is not None:
- self.ipv4 = rpki.resource_set.resource_set_ipv4(self.ipv4)
- if self.ipv6 is not None:
- self.ipv6 = rpki.resource_set.resource_set_ipv6(self.ipv6)
- if self.eku is not None:
- self.eku = self.eku.split(",")
-
- @classmethod
- def fromXML(cls, elt):
- """
- Handle <list_ee_certificate_requests/> element. This requires special
- handling due to the data types of some of the attributes.
- """
-
- self = super(list_ee_certificate_requests_elt, cls).fromXML(elt)
- self.fix_attribute_types()
- return self
-
def toXML(self):
"""
Generate <list_ee_certificate_requests/> element. This requires special
diff --git a/rpki/xml_utils.py b/rpki/xml_utils.py
index 89a9095f..b85a60c5 100644
--- a/rpki/xml_utils.py
+++ b/rpki/xml_utils.py
@@ -73,7 +73,9 @@ class base_elt(object):
val = elt.get(key, None)
if val is not None:
val = val.encode("ascii")
- if val.isdigit() and not key.endswith("_handle"):
+ if isinstance(self.attributes, dict) and self.attributes[key] is not None:
+ val = self.attributes[key](val)
+ elif val.isdigit() and not key.endswith("_handle"):
val = long(val)
setattr(self, key, val)
for key in self.booleans:
@@ -110,14 +112,6 @@ class base_elt(object):
Template-driven attribute reader.
"""
- for key in self.attributes:
- val = attrs.get(key, None)
- if isinstance(val, str) and val.isdigit() and not key.endswith("_handle"):
- val = long(val)
- setattr(self, key, val)
- for key in self.booleans:
- setattr(self, key, attrs.get(key, False))
-
def make_elt(self):
"""
XML element constructor.