diff options
Diffstat (limited to 'rpkid/rpki/left_right.py')
-rw-r--r-- | rpkid/rpki/left_right.py | 182 |
1 files changed, 16 insertions, 166 deletions
diff --git a/rpkid/rpki/left_right.py b/rpkid/rpki/left_right.py index 900d5e16..04f35529 100644 --- a/rpkid/rpki/left_right.py +++ b/rpkid/rpki/left_right.py @@ -141,31 +141,6 @@ class self_elt(data_elt): """ return self.sql_fetch_all(self.gctx) - def startElement(self, stack, name, attrs): - """Handle <self/> element.""" - if name not in ("bpki_cert", "bpki_glue"): - assert name == "self", "Unexpected name %s, stack %s" % (name, stack) - self.read_attrs(attrs) - - def endElement(self, stack, name, text): - """Handle <self/> element.""" - if name == "bpki_cert": - self.bpki_cert = rpki.x509.X509(Base64 = text) - elif name == "bpki_glue": - self.bpki_glue = rpki.x509.X509(Base64 = text) - else: - assert name == "self", "Unexpected name %s, stack %s" % (name, stack) - stack.pop() - - def toXML(self): - """Generate <self/> element.""" - elt = self.make_elt() - if self.bpki_cert and not self.bpki_cert.empty(): - self.make_b64elt(elt, "bpki_cert", self.bpki_cert.get_DER()) - if self.bpki_glue and not self.bpki_glue.empty(): - self.make_b64elt(elt, "bpki_glue", self.bpki_glue.get_DER()) - return elt - def client_poll(self): """Run the regular client poll cycle with each of this self's parents in turn.""" @@ -261,7 +236,7 @@ class bsc_elt(data_elt): element_name = "bsc" attributes = ("action", "tag", "self_id", "bsc_id", "key_type", "hash_alg", "key_length") - elements = ("signing_cert", "signing_cert_crl") + elements = ("pkcs10_request", "signing_cert", "signing_cert_crl") booleans = ("generate_keypair",) sql_template = rpki.sql.template("bsc", "bsc_id", "self_id", "hash_alg", @@ -299,35 +274,6 @@ class bsc_elt(data_elt): self.pkcs10_request = rpki.x509.PKCS10.create(keypair) r_pdu.pkcs10_request = self.pkcs10_request - def startElement(self, stack, name, attrs): - """Handle <bsc/> element.""" - if name not in ("pkcs10_request", "signing_cert", "signing_cert_crl"): - assert name == "bsc", "Unexpected name %s, stack %s" % (name, stack) - self.read_attrs(attrs) - - def endElement(self, stack, name, text): - """Handle <bsc/> element.""" - if name == "signing_cert": - self.signing_cert = rpki.x509.X509(Base64 = text) - elif name == "signing_cert_crl": - self.signing_cert_crl = rpki.x509.CRL(Base64 = text) - elif name == "pkcs10_request": - self.pkcs10_request = rpki.x509.PKCS10(Base64 = text) - else: - assert name == "bsc", "Unexpected name %s, stack %s" % (name, stack) - stack.pop() - - def toXML(self): - """Generate <bsc/> element.""" - elt = self.make_elt() - if self.signing_cert is not None: - self.make_b64elt(elt, "signing_cert", self.signing_cert.get_DER()) - if self.signing_cert_crl is not None: - self.make_b64elt(elt, "signing_cert_crl", self.signing_cert_crl.get_DER()) - if self.pkcs10_request is not None: - self.make_b64elt(elt, "pkcs10_request", self.pkcs10_request.get_DER()) - return elt - class parent_elt(data_elt): """<parent/> element.""" @@ -373,39 +319,6 @@ class parent_elt(data_elt): for ca in self.cas(): ca.revoke() - def startElement(self, stack, name, attrs): - """Handle <parent/> element.""" - if name not in ("bpki_cms_cert", "bpki_cms_glue", "bpki_https_cert", "bpki_https_glue"): - assert name == "parent", "Unexpected name %s, stack %s" % (name, stack) - self.read_attrs(attrs) - - def endElement(self, stack, name, text): - """Handle <parent/> element.""" - if name == "bpki_cms_cert": - self.bpki_cms_cert = rpki.x509.X509(Base64 = text) - elif name == "bpki_cms_glue": - self.bpki_cms_glue = rpki.x509.X509(Base64 = text) - elif name == "bpki_https_cert": - self.bpki_https_cert = rpki.x509.X509(Base64 = text) - elif name == "bpki_https_glue": - self.bpki_https_glue = rpki.x509.X509(Base64 = text) - else: - assert name == "parent", "Unexpected name %s, stack %s" % (name, stack) - stack.pop() - - def toXML(self): - """Generate <parent/> element.""" - elt = self.make_elt() - if self.bpki_cms_cert and not self.bpki_cms_cert.empty(): - self.make_b64elt(elt, "bpki_cms_cert", self.bpki_cms_cert.get_DER()) - if self.bpki_cms_glue and not self.bpki_cms_glue.empty(): - self.make_b64elt(elt, "bpki_cms_glue", self.bpki_cms_glue.get_DER()) - if self.bpki_https_cert and not self.bpki_https_cert.empty(): - self.make_b64elt(elt, "bpki_https_cert", self.bpki_https_cert.get_DER()) - if self.bpki_https_glue and not self.bpki_https_glue.empty(): - self.make_b64elt(elt, "bpki_https_glue", self.bpki_https_glue.get_DER()) - return elt - def query_up_down(self, q_pdu): """Client code for sending one up-down query PDU to this parent. @@ -492,32 +405,14 @@ class child_elt(data_elt): self.gctx.clear_https_ta_cache() self.clear_https_ta_cache = False - def startElement(self, stack, name, attrs): - """Handle <child/> element.""" - if name not in ("bpki_cert", "bpki_glue"): - assert name == "child", "Unexpected name %s, stack %s" % (name, stack) - self.read_attrs(attrs) - def endElement(self, stack, name, text): - """Handle <child/> element.""" - if name == "bpki_cert": - self.bpki_cert = rpki.x509.X509(Base64 = text) - self.clear_https_ta_cache = True - elif name == "bpki_glue": - self.bpki_glue = rpki.x509.X509(Base64 = text) + """Handle subelements of <child/> element. These require special + handling because modifying them invalidates the HTTPS trust anchor + cache. + """ + rpki.xml_utils.data_elt.endElement(self, stack, name, text) + if name in self.elements: self.clear_https_ta_cache = True - else: - assert name == "child", "Unexpected name %s, stack %s" % (name, stack) - stack.pop() - - def toXML(self): - """Generate <child/> element.""" - elt = self.make_elt() - if self.bpki_cert and not self.bpki_cert.empty(): - self.make_b64elt(elt, "bpki_cert", self.bpki_cert.get_DER()) - if self.bpki_glue and not self.bpki_glue.empty(): - self.make_b64elt(elt, "bpki_glue", self.bpki_glue.get_DER()) - return elt def serve_up_down(self, query): """Outer layer of server handling for one up-down PDU from this child.""" @@ -569,39 +464,6 @@ class repository_elt(data_elt): """Fetch all parent objects that link to this repository object.""" return parent_elt.sql_fetch_where(self.gctx, "repository_id = %s", (self.repository_id,)) - def startElement(self, stack, name, attrs): - """Handle <repository/> element.""" - if name not in ("bpki_cms_cert", "bpki_cms_glue", "bpki_https_cert", "bpki_https_glue"): - assert name == "repository", "Unexpected name %s, stack %s" % (name, stack) - self.read_attrs(attrs) - - def endElement(self, stack, name, text): - """Handle <repository/> element.""" - if name == "bpki_cms_cert": - self.bpki_cms_cert = rpki.x509.X509(Base64 = text) - elif name == "bpki_cms_glue": - self.bpki_cms_glue = rpki.x509.X509(Base64 = text) - elif name == "bpki_https_cert": - self.bpki_https_cert = rpki.x509.X509(Base64 = text) - elif name == "bpki_https_glue": - self.bpki_https_glue = rpki.x509.X509(Base64 = text) - else: - assert name == "repository", "Unexpected name %s, stack %s" % (name, stack) - stack.pop() - - def toXML(self): - """Generate <repository/> element.""" - elt = self.make_elt() - if self.bpki_cms_cert: - self.make_b64elt(elt, "bpki_cms_cert", self.bpki_cms_cert.get_DER()) - if self.bpki_cms_glue: - self.make_b64elt(elt, "bpki_cms_glue", self.bpki_cms_glue.get_DER()) - if self.bpki_https_cert: - self.make_b64elt(elt, "bpki_https_cert", self.bpki_https_cert.get_DER()) - if self.bpki_https_glue: - self.make_b64elt(elt, "bpki_https_glue", self.bpki_https_glue.get_DER()) - return elt - @staticmethod def uri_to_filename(base, uri): """Convert a URI to a filename. [TEMPORARY]""" @@ -715,7 +577,9 @@ class route_origin_elt(data_elt): self.unimplemented_control("suppress_publication") def startElement(self, stack, name, attrs): - """Handle <route_origin/> element.""" + """Handle <route_origin/> element. This requires special + processing due to the data types of some of the attributes. + """ assert name == "route_origin", "Unexpected name %s, stack %s" % (name, stack) self.read_attrs(attrs) if self.as_number is not None: @@ -725,15 +589,6 @@ class route_origin_elt(data_elt): if self.ipv6 is not None: self.ipv6 = rpki.resource_set.roa_prefix_set_ipv6(self.ipv6) - def endElement(self, stack, name, text): - """Handle <route_origin/> element.""" - assert name == "route_origin", "Unexpected name %s, stack %s" % (name, stack) - stack.pop() - - def toXML(self): - """Generate <route_origin/> element.""" - return self.make_elt() - def update_roa(self): """Bring this route_origin's ROA up to date if necesssary.""" @@ -884,7 +739,9 @@ class list_resources_elt(rpki.xml_utils.base_elt, left_right_namespace): valid_until = None def startElement(self, stack, name, attrs): - """Handle <list_resources/> element.""" + """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) if isinstance(self.valid_until, str): @@ -897,7 +754,9 @@ class list_resources_elt(rpki.xml_utils.base_elt, left_right_namespace): self.ipv6 = rpki.resource_set.resource_set_ipv6(self.ipv6) def toXML(self): - """Generate <list_resources/> element.""" + """Generate <list_resources/> element. This requires special + handling due to the data types of some of the attributes. + """ elt = self.make_elt() if isinstance(self.valid_until, int): elt.set("valid_until", self.valid_until.toXMLtime()) @@ -909,15 +768,6 @@ class report_error_elt(rpki.xml_utils.base_elt, left_right_namespace): element_name = "report_error" attributes = ("tag", "self_id", "error_code") - def startElement(self, stack, name, attrs): - """Handle <report_error/> element.""" - assert name == self.element_name, "Unexpected name %s, stack %s" % (name, stack) - self.read_attrs(attrs) - - def toXML(self): - """Generate <report_error/> element.""" - return self.make_elt() - @classmethod def from_exception(cls, exc, self_id = None): """Generate a <report_error/> element from an exception.""" |