aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2010-03-05 01:21:58 +0000
committerRob Austein <sra@hactrn.net>2010-03-05 01:21:58 +0000
commite4f7b7ebba7ac820a080aeab8c1e91cf63f8edd3 (patch)
tree209a40ce53b3b6dda93901d6b0c0d0fbd5c8ed21
parentdac9c84f9f8484fe1b8dc3533a1b5a26d301e785 (diff)
FINALLY figured out a (relatively) sane way to deal with XML
namespaces in xml.etree API: check and strip the one and only legal namespace on read, add the one and only legal namespace on write, keep all namespace glorp out of the rest of the code entirely. svn path=/myrpki.rototill/myirbe.py; revision=3026
-rw-r--r--myrpki.rototill/myirbe.py6
-rw-r--r--myrpki.rototill/myrpki.py35
-rw-r--r--myrpki.rototill/setup.py33
3 files changed, 34 insertions, 40 deletions
diff --git a/myrpki.rototill/myirbe.py b/myrpki.rototill/myirbe.py
index 98fc91be..3fc4cedd 100644
--- a/myrpki.rototill/myirbe.py
+++ b/myrpki.rototill/myirbe.py
@@ -56,7 +56,11 @@ if hasattr(warnings, "catch_warnings"):
else:
import MySQLdb
-tag = myrpki.tag
+def tag(t):
+ """
+ Wrap an element name in the right XML namespace goop.
+ """
+ return "{" + myrpki.namespace + "}" + t
def findbase64(tree, name, b64type = rpki.x509.X509):
"""
diff --git a/myrpki.rototill/myrpki.py b/myrpki.rototill/myrpki.py
index 434266de..bf466038 100644
--- a/myrpki.rototill/myrpki.py
+++ b/myrpki.rototill/myrpki.py
@@ -51,11 +51,13 @@ PERFORMANCE OF THIS SOFTWARE.
import subprocess, csv, re, os, getopt, sys, ConfigParser, base64
-from xml.etree.ElementTree import Element, SubElement, ElementTree, QName
+from xml.etree.ElementTree import Element, SubElement, ElementTree
-# Our XML namespace.
+# Our XML namespace and protocol version.
-namespace = "http://www.hactrn.net/uris/rpki/myrpki/"
+namespace = "http://www.hactrn.net/uris/rpki/myrpki/"
+version = "1"
+namespaceQName = "{" + namespace + "}"
# Dialect for our use of CSV files, here to make it easy to change if
# your site needs to do something different. See doc for the csv
@@ -589,32 +591,31 @@ def etree_write(e, filename, verbose = True):
I still miss SYSCAL(RENMWO).
"""
-
assert isinstance(filename, str)
if verbose:
print "Writing", filename
- ElementTree(e).write(filename + ".tmp")
+ tmp = Element(e.tag, e.attrib, xmlns = namespace, version = version)
+ tmp[:] = e[:]
+ ElementTree(tmp).write(filename + ".tmp")
os.rename(filename + ".tmp", filename)
def etree_read(filename, verbose = False):
"""
- Read an etree from a file.
+ Read an etree from a file, verifying then stripping XML namespace
+ cruft.
"""
if verbose:
print "Reading", filename
try:
- return ElementTree(file = filename).getroot()
+ e = ElementTree(file = filename).getroot()
except IOError:
return None
-
-def tag(t):
- """
- Wrap an element name in the right XML namespace goop. We probably
- should be using a QName, but it doesn't work correctly with the
- etree search functions
- """
- #return QName(namespace, t)
- return "{" + namespace + "}" + t
+ for i in e.getiterator():
+ if i.tag.startswith(namespaceQName):
+ i.tag = i.tag[len(namespaceQName):]
+ else:
+ raise RuntimeError, "XML tag %r is not in namespace %r" % (i.tag, namespace)
+ return e
def main(argv = ()):
"""
@@ -656,7 +657,7 @@ def main(argv = ()):
e = etree_read(xml_filename)
if e:
- bsc_req, bsc_cer = bpki.bsc(e.findtext(tag("bpki_bsc_pkcs10")))
+ bsc_req, bsc_cer = bpki.bsc(e.findtext("bpki_bsc_pkcs10"))
else:
bsc_req, bsc_cer = None, None
diff --git a/myrpki.rototill/setup.py b/myrpki.rototill/setup.py
index cf5d3351..8d1bfd9b 100644
--- a/myrpki.rototill/setup.py
+++ b/myrpki.rototill/setup.py
@@ -21,9 +21,6 @@ import myrpki, rpki.config, rpki.cli
from xml.etree.ElementTree import Element, SubElement, ElementTree
-namespace = myrpki.namespace
-tag = myrpki.tag
-
def read_xml_handle_tree(filename):
handle = os.path.splitext(os.path.split(filename)[-1])[0]
etree = myrpki.etree_read(filename)
@@ -118,7 +115,7 @@ class main(rpki.cli.Cmd):
# Build the me.xml file. Need to check for existing file so we don't
# overwrite? Worry about that later.
- e = Element("me", xmlns = namespace, version = "1", handle = self.handle)
+ e = Element("me", handle = self.handle)
myrpki.PEMElement(e, "bpki_ca_certificate", self.bpki_myrpki.cer)
myrpki.etree_write(e, "%s.xml" % self.handle)
@@ -128,18 +125,19 @@ class main(rpki.cli.Cmd):
r = Element("repository", type = "offer",
service_url = "https://%s:%s/" % (self.cfg.get("pubd_server_host"),
self.cfg.get("pubd_server_port")))
+ myrpki.etree_write(r, "repositories/%s.xml" % self.handle)
# If we're running rootd, construct a fake parent to go with it,
# and cross-certify in both directions so we can talk to rootd.
if self.run_rootd:
- e = Element(tag("parent"), version = "1",
+ e = Element("parent", version = "1",
parent_handle = "rootd", child_handle = self.handle,
service_url = "https://localhost:%s/" % self.cfg.get("rootd_server_port"))
- myrpki.PEMElement(e, tag("bpki_resource_ca"), self.bpki_myirbe.cer)
- myrpki.PEMElement(e, tag("bpki_server_ca"), self.bpki_myirbe.cer)
+ myrpki.PEMElement(e, "bpki_resource_ca", self.bpki_myirbe.cer)
+ myrpki.PEMElement(e, "bpki_server_ca", self.bpki_myirbe.cer)
e.append(r)
myrpki.etree_write(e, "parents/rootd.xml")
@@ -150,13 +148,6 @@ class main(rpki.cli.Cmd):
if not os.path.exists(rootd_child_fn):
os.link(self.bpki_myirbe.xcert(self.bpki_myrpki.cer), rootd_child_fn)
- # Save repository entry.
-
- if self.run_pubd:
- r.set("xmlns", namespace)
- r.set("version", "1")
- myrpki.etree_write(r, "repositories/%s.xml" % self.handle)
-
def do_receive_from_child(self, arg):
self.load_xml()
@@ -181,10 +172,9 @@ class main(rpki.cli.Cmd):
print "Child calls itself %r, we call it %r" % (c.get("handle"), child_handle)
- self.bpki_myirbe.fxcert(c.findtext(myrpki.tag("bpki_ca_certificate")))
+ self.bpki_myirbe.fxcert(c.findtext("bpki_ca_certificate"))
- e = Element("parent", xmlns = namespace, version = "1",
- parent_handle = self.handle, child_handle = child_handle,
+ e = Element("parent", parent_handle = self.handle, child_handle = child_handle,
service_url = "https://%s:%s/up-down/%s/%s" % (self.cfg.get("rpkid_server_host"),
self.cfg.get("rpkid_server_port"),
self.handle, child_handle))
@@ -230,16 +220,15 @@ class main(rpki.cli.Cmd):
print "Parent calls us %r" % p.get("child_handle")
print "We call repository %r" % repository_handle
- self.bpki_myrpki.fxcert(p.findtext(myrpki.tag("bpki_resource_ca")))
- b = self.bpki_myrpki.fxcert(p.findtext(myrpki.tag("bpki_server_ca")))
+ self.bpki_myrpki.fxcert(p.findtext("bpki_resource_ca"))
+ b = self.bpki_myrpki.fxcert(p.findtext("bpki_server_ca"))
myrpki.etree_write(p, "parents/%s.xml" % parent_handle)
- r = p.find(myrpki.tag("repository"))
+ r = p.find("repository")
if r is not None and r.get("type") == "offer":
- e = Element("repository", xmlns = namespace, version = "1",
- service_url = r.get("service_url"))
+ e = Element("repository", service_url = r.get("service_url"))
myrpki.PEMElement(e, "bpki_server_ca", b)
myrpki.etree_write(e, "repositories/%s.xml" % repository_handle)