aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2010-08-29 03:39:59 +0000
committerRob Austein <sra@hactrn.net>2010-08-29 03:39:59 +0000
commit376316916567bf253a57a909d0cd53d2bd53583d (patch)
treeb76113eb3c4d5dc6dfd13ae401c9e0f1cc4a076e
parent64de2f733ac0c0d1ceffe52209ebde2f60cb6f5f (diff)
Break XML packet dumps into multiple lines when logging schema
validation errors. svn path=/rpkid/rpki/publication.py; revision=3431
-rw-r--r--rpkid/rpki/publication.py2
-rw-r--r--rpkid/rpki/up_down.py17
-rw-r--r--rpkid/rpki/x509.py22
-rw-r--r--rpkid/rpki/xml_utils.py12
4 files changed, 26 insertions, 27 deletions
diff --git a/rpkid/rpki/publication.py b/rpkid/rpki/publication.py
index 59db3ded..1af4be10 100644
--- a/rpkid/rpki/publication.py
+++ b/rpkid/rpki/publication.py
@@ -190,7 +190,7 @@ class publication_object_elt(rpki.xml_utils.base_elt, publication_namespace):
"""
elt = self.make_elt()
if self.payload:
- elt.text = base64.b64encode(self.payload.get_DER())
+ elt.text = self.payload.get_Base64()
return elt
def serve_dispatch(self, r_msg, cb, eb):
diff --git a/rpkid/rpki/up_down.py b/rpkid/rpki/up_down.py
index 42dc4acb..225c0bd4 100644
--- a/rpkid/rpki/up_down.py
+++ b/rpkid/rpki/up_down.py
@@ -75,14 +75,12 @@ class base_elt(object):
elt.set(key, str(val))
return elt
- def make_b64elt(self, elt, name, value=None):
+ def make_b64elt(self, elt, name, value):
"""
Construct a sub-element with Base64 text content.
"""
- if value is None:
- value = getattr(self, name, None)
- if value is not None:
- lxml.etree.SubElement(elt, "{%s}%s" % (xmlns, name), nsmap=nsmap).text = base64.b64encode(value)
+ if value is not None and not value.empty():
+ lxml.etree.SubElement(elt, "{%s}%s" % (xmlns, name), nsmap=nsmap).text = value.get_Base64()
def serve_pdu(self, q_msg, r_msg, child, callback, errback):
"""Default PDU handler to catch unexpected types."""
@@ -145,7 +143,7 @@ class certificate_elt(base_elt):
Handle text content of a <certificate/> element.
"""
assert name == "certificate", "Unexpected name %s, stack %s" % (name, stack)
- self.cert = rpki.x509.X509(Base64=text)
+ self.cert = rpki.x509.X509(Base64 = text)
stack.pop()
def toXML(self):
@@ -193,7 +191,7 @@ class class_elt(base_elt):
Handle <class/> elements and their children.
"""
if name == "issuer":
- self.issuer = rpki.x509.X509(Base64=text)
+ self.issuer = rpki.x509.X509(Base64 = text)
else:
assert name == "class", "Unexpected name %s, stack %s" % (name, stack)
stack.pop()
@@ -206,8 +204,7 @@ class class_elt(base_elt):
"resource_set_ipv4", "resource_set_ipv6",
"resource_set_notafter", "suggested_sia_head")
elt.extend([i.toXML() for i in self.certs])
- if self.issuer is not None:
- self.make_b64elt(elt, "issuer", self.issuer.get_DER())
+ self.make_b64elt(elt, "issuer", self.issuer)
return elt
def to_resource_bag(self):
@@ -334,7 +331,7 @@ class issue_pdu(base_elt):
Handle "issue" PDU.
"""
assert name == "request", "Unexpected name %s, stack %s" % (name, stack)
- self.pkcs10 = rpki.x509.PKCS10(Base64=text)
+ self.pkcs10 = rpki.x509.PKCS10(Base64 = text)
stack.pop()
def toXML(self):
diff --git a/rpkid/rpki/x509.py b/rpkid/rpki/x509.py
index b2350368..9d770ffa 100644
--- a/rpkid/rpki/x509.py
+++ b/rpkid/rpki/x509.py
@@ -48,6 +48,15 @@ import email.mime.application, email.utils, mailbox, time
import rpki.exceptions, rpki.resource_set, rpki.oids, rpki.sundial
import rpki.manifest, rpki.roa, rpki.log, rpki.async
+def base64_with_linebreaks(der):
+ """
+ Encode DER (really, anything) as Base64 text, with linebreaks to
+ keep the result (sort of) readable.
+ """
+ b = base64.b64encode(der)
+ n = len(b)
+ return "\n" + "\n".join(b[i : min(i + 64, n)] for i in xrange(0, n, 64)) + "\n"
+
def calculate_SKI(public_key_der):
"""
Calculate the SKI value given the DER representation of a public
@@ -95,12 +104,7 @@ class PEM_converter(object):
"""
Convert from DER to PEM.
"""
- b64 = base64.b64encode(der)
- pem = self.b + "\n"
- while len(b64) > 64:
- pem += b64[0:64] + "\n"
- b64 = b64[64:]
- return pem + b64 + "\n" + self.e + "\n"
+ return self.b + base64_with_linebreaks(der) + self.e + "\n"
def _find_xia_uri(extension, name):
"""
@@ -203,7 +207,7 @@ class DER_object(object):
def get_Base64(self):
"""Get the Base64 encoding of the DER value of this object."""
- return base64.b64encode(self.get_DER())
+ return base64_with_linebreaks(self.get_DER())
def get_PEM(self):
"""Get the PEM representation of this object."""
@@ -1093,7 +1097,9 @@ class XML_CMS_object(CMS_object):
try:
self.schema.assertValid(self.get_content())
except lxml.etree.DocumentInvalid:
- rpki.log.error("PDU failed schema check: " + self.pretty_print_content())
+ rpki.log.error("PDU failed schema check:")
+ for line in self.pretty_print_content().splitlines():
+ rpki.log.error(line)
raise
def dump_to_disk(self, prefix):
diff --git a/rpkid/rpki/xml_utils.py b/rpkid/rpki/xml_utils.py
index 274eeea0..4933cda9 100644
--- a/rpkid/rpki/xml_utils.py
+++ b/rpkid/rpki/xml_utils.py
@@ -189,14 +189,12 @@ class base_elt(object):
elt.set(key, "yes")
return elt
- def make_b64elt(self, elt, name, value = None):
+ def make_b64elt(self, elt, name, value):
"""
Constructor for Base64-encoded subelement.
"""
- if value is None:
- value = getattr(self, name, None)
- if value is not None:
- lxml.etree.SubElement(elt, "{%s}%s" % (self.xmlns, name), nsmap = self.nsmap).text = base64.b64encode(value)
+ if value is not None and not value.empty():
+ lxml.etree.SubElement(elt, "{%s}%s" % (self.xmlns, name), nsmap = self.nsmap).text = value.get_Base64()
def __str__(self):
"""
@@ -267,9 +265,7 @@ class data_elt(base_elt):
"""
elt = self.make_elt()
for i in self.elements:
- x = getattr(self, i, None)
- if x and not x.empty():
- self.make_b64elt(elt, i, x.get_DER())
+ self.make_b64elt(elt, i, getattr(self, i, None))
return elt
def make_reply(self, r_pdu = None):