aboutsummaryrefslogtreecommitdiff
path: root/rpki/left_right.py
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2015-10-07 00:03:58 +0000
committerRob Austein <sra@hactrn.net>2015-10-07 00:03:58 +0000
commitd5471f32fa908df1ce89a1957fff529a69a177c7 (patch)
tree8a7e59101bd1db4fdeca8ff64d89a1768a524748 /rpki/left_right.py
parent7a1323fafdd9067a61146c103d5e040eea61b867 (diff)
Working without SAX. I think. Checkpointing version that worked
before ripping out remaining SAX code. svn path=/branches/tk705/; revision=6093
Diffstat (limited to 'rpki/left_right.py')
-rw-r--r--rpki/left_right.py134
1 files changed, 100 insertions, 34 deletions
diff --git a/rpki/left_right.py b/rpki/left_right.py
index 55f893b8..c7517e26 100644
--- a/rpki/left_right.py
+++ b/rpki/left_right.py
@@ -23,6 +23,7 @@ RPKI "left-right" protocol.
import base64
import logging
+import collections
import rpki.resource_set
import rpki.x509
import rpki.sql
@@ -179,10 +180,13 @@ class self_elt(data_elt):
element_name = "self"
attributes = ("action", "tag", "self_handle", "crl_interval", "regen_margin")
- elements = ("bpki_cert", "bpki_glue")
booleans = ("rekey", "reissue", "revoke", "run_now", "publish_world_now", "revoke_forgotten",
"clear_replay_protection")
+ elements = collections.OrderedDict((
+ ("bpki_cert", rpki.x509.X509),
+ ("bpki_glue", rpki.x509.X509)))
+
sql_template = rpki.sql.template(
"self",
"self_id",
@@ -489,9 +493,13 @@ class bsc_elt(data_elt):
element_name = "bsc"
attributes = ("action", "tag", "self_handle", "bsc_handle", "key_type", "hash_alg", "key_length")
- elements = ("signing_cert", "signing_cert_crl", "pkcs10_request")
booleans = ("generate_keypair",)
+ elements = collections.OrderedDict((
+ ("signing_cert", rpki.x509.X509),
+ ("signing_cert_crl", rpki.x509.CRL),
+ ("pkcs10_request", rpki.x509.PKCS10)))
+
sql_template = rpki.sql.template(
"bsc",
"bsc_id",
@@ -557,9 +565,12 @@ class repository_elt(data_elt):
element_name = "repository"
attributes = ("action", "tag", "self_handle", "repository_handle", "bsc_handle", "peer_contact_uri")
- elements = ("bpki_cert", "bpki_glue")
booleans = ("clear_replay_protection",)
+ elements = collections.OrderedDict((
+ ("bpki_cert", rpki.x509.X509),
+ ("bpki_glue", rpki.x509.X509)))
+
sql_template = rpki.sql.template(
"repository",
"repository_id",
@@ -677,9 +688,12 @@ class parent_elt(data_elt):
element_name = "parent"
attributes = ("action", "tag", "self_handle", "parent_handle", "bsc_handle", "repository_handle",
"peer_contact_uri", "sia_base", "sender_name", "recipient_name")
- elements = ("bpki_cms_cert", "bpki_cms_glue")
booleans = ("rekey", "reissue", "revoke", "revoke_forgotten", "clear_replay_protection")
+ elements = collections.OrderedDict((
+ ("bpki_cms_cert", rpki.x509.X509),
+ ("bpki_cms_glue", rpki.x509.X509)))
+
sql_template = rpki.sql.template(
"parent",
"parent_id",
@@ -969,9 +983,12 @@ class child_elt(data_elt):
element_name = "child"
attributes = ("action", "tag", "self_handle", "child_handle", "bsc_handle")
- elements = ("bpki_cert", "bpki_glue")
booleans = ("reissue", "clear_replay_protection")
+ elements = collections.OrderedDict((
+ ("bpki_cert", rpki.x509.X509),
+ ("bpki_glue", rpki.x509.X509)))
+
sql_template = rpki.sql.template(
"child",
"child_id",
@@ -1271,14 +1288,11 @@ class list_resources_elt(rpki.xml_utils.base_elt, left_right_namespace):
def __repr__(self):
return rpki.log.log_repr(self, self.self_handle, self.child_handle, self.asn, self.ipv4, self.ipv6)
- def startElement(self, stack, name, attrs):
+ def fix_attribute_types(self):
"""
- Handle <list_resources/> element. This requires special handling
- due to the data types of some of the attributes.
+ Fix data types for certain attributes.
"""
- assert name == "list_resources", "Unexpected name %s, stack %s" % (name, stack)
- self.read_attrs(attrs)
if isinstance(self.valid_until, str):
self.valid_until = rpki.sundial.datetime.fromXMLtime(self.valid_until)
if self.asn is not None:
@@ -1288,6 +1302,27 @@ class list_resources_elt(rpki.xml_utils.base_elt, left_right_namespace):
if self.ipv6 is not None:
self.ipv6 = rpki.resource_set.resource_set_ipv6(self.ipv6)
+ def startElement(self, stack, name, attrs):
+ """
+ Handle <list_resources/> element. This requires special handling
+ due to the data types of some of the attributes.
+ """
+
+ assert name == "list_resources", "Unexpected name %s, stack %s" % (name, stack)
+ self.read_attrs(attrs)
+ self.fix_attribute_types()
+
+ @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
@@ -1307,6 +1342,16 @@ 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)
+
def startElement(self, stack, name, attrs):
"""
Handle <list_roa_requests/> element. This requires special handling
@@ -1315,10 +1360,18 @@ class list_roa_requests_elt(rpki.xml_utils.base_elt, left_right_namespace):
assert name == "list_roa_requests", "Unexpected name %s, stack %s" % (name, stack)
self.read_attrs(attrs)
- 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)
+ self.fix_attribute_types()
+
+ @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
def __repr__(self):
return rpki.log.log_repr(self, self.self_handle, self.asn, self.ipv4, self.ipv6)
@@ -1344,7 +1397,9 @@ 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")
- elements = ("pkcs10",)
+
+ elements = collections.OrderedDict((
+ ("pkcs10", rpki.x509.PKCS10),))
pkcs10 = None
valid_until = None
@@ -1353,6 +1408,22 @@ 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(",")
+
def startElement(self, stack, name, attrs):
"""
Handle <list_ee_certificate_requests/> element. This requires special
@@ -1362,16 +1433,18 @@ class list_ee_certificate_requests_elt(rpki.xml_utils.base_elt, left_right_names
if name not in self.elements:
assert name == self.element_name, "Unexpected name %s, stack %s" % (name, stack)
self.read_attrs(attrs)
- 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(",")
+ self.fix_attribute_types()
+
+ @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 endElement(self, stack, name, text):
"""
@@ -1569,14 +1642,6 @@ class msg(rpki.xml_utils.msg, left_right_namespace):
rpki.async.iterator(self, loop, done)
-class sax_handler(rpki.xml_utils.sax_handler):
- """
- SAX handler for Left-Right protocol.
- """
-
- pdu = msg
- name = "msg"
- version = rpki.relaxng.left_right.version
class cms_msg(rpki.x509.XML_CMS_object):
"""
@@ -1585,7 +1650,8 @@ class cms_msg(rpki.x509.XML_CMS_object):
encoding = "us-ascii"
schema = rpki.relaxng.left_right
- saxify = sax_handler.saxify
+ saxify = msg.fromXML
+
class cms_msg_no_sax(cms_msg):
"""