aboutsummaryrefslogtreecommitdiff
path: root/myrpki.rototill/myrpki.py
diff options
context:
space:
mode:
Diffstat (limited to 'myrpki.rototill/myrpki.py')
-rw-r--r--myrpki.rototill/myrpki.py22
1 files changed, 19 insertions, 3 deletions
diff --git a/myrpki.rototill/myrpki.py b/myrpki.rototill/myrpki.py
index f1d1fc29..9aea1c6a 100644
--- a/myrpki.rototill/myrpki.py
+++ b/myrpki.rototill/myrpki.py
@@ -610,7 +610,17 @@ class CA(object):
return xcert
-def etree_write(e, filename, verbose = True):
+def etree_validate(e):
+ try:
+ import schema
+ schema.myrpki.assertValid(e)
+ except lxml.etree.DocumentInvalid:
+ print lxml.etree.tostring(e, pretty_print = True)
+ raise
+ except ImportError:
+ print "Couldn't import RelaxNG schema, validation disabled"
+
+def etree_write(e, filename, verbose = True, validate = False):
"""
Write out an etree to a file, safely.
@@ -622,11 +632,15 @@ def etree_write(e, filename, verbose = True):
e = copy.deepcopy(e)
e.set("version", version)
for i in e.getiterator():
- i.tag = namespaceQName + i.tag
+ if i.tag[0] != "{":
+ i.tag = namespaceQName + i.tag
+ assert i.tag.startswith(namespaceQName)
+ if validate:
+ etree_validate(e)
ElementTree(e).write(filename + ".tmp")
os.rename(filename + ".tmp", filename)
-def etree_read(filename, verbose = False):
+def etree_read(filename, verbose = False, validate = False):
"""
Read an etree from a file, verifying then stripping XML namespace
cruft.
@@ -634,6 +648,8 @@ def etree_read(filename, verbose = False):
if verbose:
print "Reading", filename
e = ElementTree(file = filename).getroot()
+ if validate:
+ etree_validate(e)
for i in e.getiterator():
if i.tag.startswith(namespaceQName):
i.tag = i.tag[len(namespaceQName):]