diff options
-rw-r--r-- | buildtools/make-relaxng.py | 62 | ||||
-rw-r--r-- | ca/tests/yamlconf.py | 6 | ||||
-rw-r--r-- | ca/tests/yamltest.py | 6 | ||||
-rw-r--r-- | rpki/irdb/zookeeper.py | 24 | ||||
-rw-r--r-- | rpki/left_right.py | 8 | ||||
-rw-r--r-- | rpki/publication.py | 9 | ||||
-rw-r--r-- | rpki/relaxng.py | 29 | ||||
-rw-r--r-- | rpki/relaxng_parser.py | 42 | ||||
-rw-r--r-- | rpki/up_down.py | 9 | ||||
-rw-r--r-- | rpki/xml_utils.py | 6 | ||||
-rw-r--r-- | schemas/relaxng/left-right-schema.rnc | 2 | ||||
-rw-r--r-- | schemas/relaxng/left-right-schema.rng | 3 | ||||
-rw-r--r-- | schemas/relaxng/publication-schema.rnc | 2 | ||||
-rw-r--r-- | schemas/relaxng/publication-schema.rng | 3 |
14 files changed, 132 insertions, 79 deletions
diff --git a/buildtools/make-relaxng.py b/buildtools/make-relaxng.py index 7580016f..d540fa9a 100644 --- a/buildtools/make-relaxng.py +++ b/buildtools/make-relaxng.py @@ -1,32 +1,21 @@ # $Id$ # -# Copyright (C) 2009-2012 Internet Systems Consortium ("ISC") -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH -# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, -# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -# PERFORMANCE OF THIS SOFTWARE. -# +# Copyright (C) 2014 Dragon Research Labs ("DRL") +# Portions copyright (C) 2009--2012 Internet Systems Consortium ("ISC") # Portions copyright (C) 2007--2008 American Registry for Internet Numbers ("ARIN") -# +# # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND ARIN DISCLAIMS ALL WARRANTIES WITH -# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -# AND FITNESS. IN NO EVENT SHALL ARIN BE LIABLE FOR ANY SPECIAL, DIRECT, -# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -# PERFORMANCE OF THIS SOFTWARE. +# copyright notices and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND DRL, ISC, AND ARIN DISCLAIM ALL +# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DRL, +# ISC, OR ARIN BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. """ Script to generate rpki/relaxng.py. @@ -34,27 +23,30 @@ Script to generate rpki/relaxng.py. import sys -format_1 = """\ +header = """\ # Automatically generated, do not edit. -import lxml.etree +from rpki.relaxng_parser import RelaxNGParser """ -format_2 = """\ +format = """ ## @var %(name)s ## Parsed RelaxNG %(name)s schema -%(name)s = lxml.etree.RelaxNG(lxml.etree.fromstring(r'''%(rng)s''')) +%(name)s = RelaxNGParser(r'''%(rng)s''') """ -def filename_to_symbol(s): +footer = """ +del RelaxNGParser +""" + +def symbol(s): for suffix in (".rng", "-schema"): if s.endswith(suffix): s = s[:-len(suffix)] return s.replace("-", "_") -print format_1 - -for filename in sys.argv[1:]: - print format_2 % { - "name" : filename_to_symbol(filename), - "rng" : open(filename).read() } +sys.stdout.write(header) +for fn in sys.argv[1:]: + with open(fn, "r") as f: + sys.stdout.write(format % dict(name = symbol(fn), rng = f.read())) +sys.stdout.write(footer) diff --git a/ca/tests/yamlconf.py b/ca/tests/yamlconf.py index acc56497..1b339a89 100644 --- a/ca/tests/yamlconf.py +++ b/ca/tests/yamlconf.py @@ -357,8 +357,10 @@ class allocation(object): path = self.path(fn) if not quiet: print "Writing", path - xmlns = "{http://www.hactrn.net/uris/rpki/router-certificate/}" - xml = lxml.etree.Element(xmlns + "router_certificate_requests", version = "1") + xmlns = rpki.relaxng.router_certificate.xmlns + xml = lxml.etree.Element(xmlns + "router_certificate_requests", + version = rpki.relaxng.router_certificate.version, + nsmap = rpki.relaxng.router_certificate.nsmap) for r in self.router_certs: x = lxml.etree.SubElement(xml, xmlns + "router_certificate_request", router_id = str(r.router_id), diff --git a/ca/tests/yamltest.py b/ca/tests/yamltest.py index 1482c4e2..2b65dbd2 100644 --- a/ca/tests/yamltest.py +++ b/ca/tests/yamltest.py @@ -414,8 +414,10 @@ class allocation(object): if not args.skip_config: path = self.path(fn) print "Writing", path - xmlns = "{http://www.hactrn.net/uris/rpki/router-certificate/}" - xml = lxml.etree.Element(xmlns + "router_certificate_requests", version = "1") + xmlns = rpki.relaxng.router_certificate.xmlns + xml = lxml.etree.Element(xmlns + "router_certificate_requests", + version = rpki.relaxng.router_certificate.version, + nsmap = rpki.relaxng.router_certificate.nsmap) for r in self.router_certs: x = lxml.etree.SubElement(xml, xmlns + "router_certificate_request", router_id = str(r.router_id), diff --git a/rpki/irdb/zookeeper.py b/rpki/irdb/zookeeper.py index 6b762b0f..1e163a4d 100644 --- a/rpki/irdb/zookeeper.py +++ b/rpki/irdb/zookeeper.py @@ -46,9 +46,8 @@ from rpki.csv_utils import csv_reader # is historical and may change before we propose this as the basis for # a standard. -myrpki_namespace = "http://www.hactrn.net/uris/rpki/myrpki/" -myrpki_version = "2" -myrpki_namespaceQName = "{" + myrpki_namespace + "}" +myrpki_xmlns = rpki.relaxng.myrpki.xmlns +myrpki_version = rpki.relaxng.myrpki.version # XML namespace and protocol version for router certificate requests. # We probably ought to be pulling this sort of thing from the schema, @@ -56,9 +55,8 @@ myrpki_namespaceQName = "{" + myrpki_namespace + "}" # protocol version number, but just copy what we did for myrpki until # I'm ready to rewrite the rpki.relaxng code. -routercert_namespace = "http://www.hactrn.net/uris/rpki/router-certificate/" -routercert_version = "1" -routercert_namespaceQName = "{" + routercert_namespace + "}" +routercert_xmlns = rpki.relaxng.router_certificate.xmlns +routercert_version = rpki.relaxng.router_certificate.version myrpki_section = "myrpki" irdbd_section = "irdbd" @@ -139,10 +137,10 @@ def etree_read(filename): e = ElementTree(file = filename).getroot() rpki.relaxng.myrpki.assertValid(e) for i in e.getiterator(): - if i.tag.startswith(myrpki_namespaceQName): - i.tag = i.tag[len(myrpki_namespaceQName):] + if i.tag.startswith(myrpki_xmlns): + i.tag = i.tag[len(myrpki_xmlns):] else: - raise BadXMLMessage("XML tag %r is not in namespace %r" % (i.tag, myrpki_namespace)) + raise BadXMLMessage("XML tag %r is not in namespace %r" % (i.tag, myrpki_xmlns[1:-1])) return e @@ -159,8 +157,8 @@ class etree_wrapper(object): e.set("version", myrpki_version) for i in e.getiterator(): if i.tag[0] != "{": - i.tag = myrpki_namespaceQName + i.tag - assert i.tag.startswith(myrpki_namespaceQName) + i.tag = myrpki_xmlns + i.tag + assert i.tag.startswith(myrpki_xmlns) if debug: print ElementToString(e) rpki.relaxng.myrpki.assertValid(e) @@ -620,7 +618,7 @@ class Zookeeper(object): proposed_sia_base = repo.sia_base + child.handle + "/" referral_cert, created = rpki.irdb.Referral.objects.get_or_certify(issuer = self.resource_ca) auth = rpki.x509.SignedReferral() - auth.set_content(B64Element(None, myrpki_namespaceQName + "referral", child.ta, + auth.set_content(B64Element(None, myrpki_xmlns + "referral", child.ta, version = myrpki_version, authorized_sia_base = proposed_sia_base)) auth.schema_check() @@ -1631,7 +1629,7 @@ class Zookeeper(object): xml = ElementTree(file = router_certificate_request_xml).getroot() rpki.relaxng.router_certificate.assertValid(xml) - for req in xml.getiterator(routercert_namespaceQName + "router_certificate_request"): + for req in xml.getiterator(routercert_xmlns + "router_certificate_request"): pkcs10 = rpki.x509.PKCS10(Base64 = req.text) router_id = long(req.get("router_id")) diff --git a/rpki/left_right.py b/rpki/left_right.py index 12c69521..68ead08f 100644 --- a/rpki/left_right.py +++ b/rpki/left_right.py @@ -48,8 +48,8 @@ class left_right_namespace(object): XML namespace parameters for left-right protocol. """ - xmlns = "http://www.hactrn.net/uris/rpki/left-right-spec/" - nsmap = { None : xmlns } + xmlns = rpki.relaxng.left_right.xmlns + nsmap = rpki.relaxng.left_right.nsmap class data_elt(rpki.xml_utils.data_elt, rpki.sql.sql_persistent, left_right_namespace): """ @@ -1230,7 +1230,7 @@ class msg(rpki.xml_utils.msg, left_right_namespace): ## @var version # Protocol version - version = 1 + version = int(rpki.relaxng.left_right.version) ## @var pdus # Dispatch table of PDUs for this protocol. @@ -1278,7 +1278,7 @@ class sax_handler(rpki.xml_utils.sax_handler): pdu = msg name = "msg" - version = "1" + version = rpki.relaxng.left_right.version class cms_msg(rpki.x509.XML_CMS_object): """ diff --git a/rpki/publication.py b/rpki/publication.py index 95f4f314..5fc7f3dd 100644 --- a/rpki/publication.py +++ b/rpki/publication.py @@ -53,8 +53,8 @@ class publication_namespace(object): XML namespace parameters for publication protocol. """ - xmlns = "http://www.hactrn.net/uris/rpki/publication-spec/" - nsmap = { None : xmlns } + xmlns = rpki.relaxng.publication.xmlns + nsmap = rpki.relaxng.publication.nsmap class control_elt(rpki.xml_utils.data_elt, rpki.sql.sql_persistent, publication_namespace): """ @@ -413,7 +413,7 @@ class msg(rpki.xml_utils.msg, publication_namespace): ## @var version # Protocol version - version = 1 + version = int(rpki.relaxng.publication.version) ## @var pdus # Dispatch table of PDUs for this protocol. @@ -457,7 +457,8 @@ class sax_handler(rpki.xml_utils.sax_handler): pdu = msg name = "msg" - version = "1" + version = rpki.relaxng.publication.version + class cms_msg(rpki.x509.XML_CMS_object): """ diff --git a/rpki/relaxng.py b/rpki/relaxng.py index 594b0a09..2ca4e39f 100644 --- a/rpki/relaxng.py +++ b/rpki/relaxng.py @@ -1,10 +1,10 @@ # Automatically generated, do not edit. -import lxml.etree +from rpki.relaxng_parser import RelaxNGParser ## @var left_right ## Parsed RelaxNG left_right schema -left_right = lxml.etree.RelaxNG(lxml.etree.fromstring(r'''<?xml version="1.0" encoding="UTF-8"?> +left_right = RelaxNGParser(r'''<?xml version="1.0" encoding="UTF-8"?> <!-- $Id: left-right-schema.rnc 5845 2014-05-29 22:31:15Z sra $ @@ -28,6 +28,9 @@ left_right = lxml.etree.RelaxNG(lxml.etree.fromstring(r'''<?xml version="1.0" en WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --> <grammar ns="http://www.hactrn.net/uris/rpki/left-right-spec/" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> + <define name="version"> + <value>1</value> + </define> <!-- Top level PDU --> <start> <element name="msg"> @@ -1093,11 +1096,11 @@ left_right = lxml.etree.RelaxNG(lxml.etree.fromstring(r'''<?xml version="1.0" en comment-start-skip: "#[ \t]*" End: --> -''')) +''') ## @var myrpki ## Parsed RelaxNG myrpki schema -myrpki = lxml.etree.RelaxNG(lxml.etree.fromstring(r'''<?xml version="1.0" encoding="UTF-8"?> +myrpki = RelaxNGParser(r'''<?xml version="1.0" encoding="UTF-8"?> <!-- $Id: myrpki.rnc 5757 2014-04-05 22:42:12Z sra $ @@ -1476,11 +1479,11 @@ myrpki = lxml.etree.RelaxNG(lxml.etree.fromstring(r'''<?xml version="1.0" encodi comment-start-skip: "#[ \t]*" End: --> -''')) +''') ## @var publication ## Parsed RelaxNG publication schema -publication = lxml.etree.RelaxNG(lxml.etree.fromstring(r'''<?xml version="1.0" encoding="UTF-8"?> +publication = RelaxNGParser(r'''<?xml version="1.0" encoding="UTF-8"?> <!-- $Id: publication-schema.rnc 5845 2014-05-29 22:31:15Z sra $ @@ -1504,6 +1507,9 @@ publication = lxml.etree.RelaxNG(lxml.etree.fromstring(r'''<?xml version="1.0" e WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --> <grammar ns="http://www.hactrn.net/uris/rpki/publication-spec/" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> + <define name="version"> + <value>1</value> + </define> <!-- Top level PDU --> <start> <element name="msg"> @@ -2054,11 +2060,11 @@ publication = lxml.etree.RelaxNG(lxml.etree.fromstring(r'''<?xml version="1.0" e comment-start-skip: "#[ \t]*" End: --> -''')) +''') ## @var router_certificate ## Parsed RelaxNG router_certificate schema -router_certificate = lxml.etree.RelaxNG(lxml.etree.fromstring(r'''<?xml version="1.0" encoding="UTF-8"?> +router_certificate = RelaxNGParser(r'''<?xml version="1.0" encoding="UTF-8"?> <!-- $Id: router-certificate-schema.rnc 5757 2014-04-05 22:42:12Z sra $ @@ -2156,11 +2162,11 @@ router_certificate = lxml.etree.RelaxNG(lxml.etree.fromstring(r'''<?xml version= comment-start-skip: "#[ \t]*" End: --> -''')) +''') ## @var up_down ## Parsed RelaxNG up_down schema -up_down = lxml.etree.RelaxNG(lxml.etree.fromstring(r'''<?xml version="1.0" encoding="UTF-8"?> +up_down = RelaxNGParser(r'''<?xml version="1.0" encoding="UTF-8"?> <!-- $Id: up-down-schema.rnc 5757 2014-04-05 22:42:12Z sra $ @@ -2437,5 +2443,6 @@ up_down = lxml.etree.RelaxNG(lxml.etree.fromstring(r'''<?xml version="1.0" encod comment-start-skip: "#[ \t]*" End: --> -''')) +''') +del RelaxNGParser diff --git a/rpki/relaxng_parser.py b/rpki/relaxng_parser.py new file mode 100644 index 00000000..466b1a79 --- /dev/null +++ b/rpki/relaxng_parser.py @@ -0,0 +1,42 @@ +# $Id$ +# +# Copyright (C) 2014 Dragon Research Labs ("DRL") +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND DRL DISCLAIMS ALL WARRANTIES WITH +# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS. IN NO EVENT SHALL DRL BE LIABLE FOR ANY SPECIAL, DIRECT, +# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +""" +Wrapper around lxml to extract various useful data and methods +from an XML-format RelaxNG schema. +""" + +import lxml.etree + +class RelaxNGParser(object): + """ + Parse schema, extract XML namespace and protocol version (if any). + Method calls are just passed along to the parsed RelaxNG schema. + """ + + def __init__(self, text): + xml = lxml.etree.fromstring(text) + self.schema = lxml.etree.RelaxNG(xml) + ns = xml.get("ns") + self.xmlns = "{" + ns + "}" + self.nsmap = { None : ns } + x = xml.xpath("ns0:define[@name = 'version']/ns0:value", + namespaces = dict(ns0 = "http://relaxng.org/ns/structure/1.0")) + if len(x) == 1: + self.version = x[0].text + + def __getattr__(self, name): + return getattr(self.schema, name) diff --git a/rpki/up_down.py b/rpki/up_down.py index 262003a2..73a0ae99 100644 --- a/rpki/up_down.py +++ b/rpki/up_down.py @@ -33,9 +33,8 @@ import rpki.relaxng logger = logging.getLogger(__name__) -xmlns = "http://www.apnic.net/specs/rescerts/up-down/" - -nsmap = { None : xmlns } +xmlns = rpki.relaxng.up_down.xmlns +nsmap = rpki.relaxng.up_down.nsmap class base_elt(object): """ @@ -65,7 +64,7 @@ class base_elt(object): """ Construct a element, copying over a set of attributes. """ - elt = lxml.etree.Element("{%s}%s" % (xmlns, name), nsmap=nsmap) + elt = lxml.etree.Element(xmlns + name, nsmap = nsmap) for key in attrs: val = getattr(self, key, None) if val is not None: @@ -77,7 +76,7 @@ class base_elt(object): Construct a sub-element with Base64 text content. """ if value is not None and not value.empty(): - lxml.etree.SubElement(elt, "{%s}%s" % (xmlns, name), nsmap=nsmap).text = value.get_Base64() + lxml.etree.SubElement(elt, xmlns + name, nsmap = nsmap).text = value.get_Base64() def serve_pdu(self, q_msg, r_msg, child, callback, errback): """ diff --git a/rpki/xml_utils.py b/rpki/xml_utils.py index e940d127..c276ce98 100644 --- a/rpki/xml_utils.py +++ b/rpki/xml_utils.py @@ -187,7 +187,7 @@ class base_elt(object): """ XML element constructor. """ - elt = lxml.etree.Element("{%s}%s" % (self.xmlns, self.element_name), nsmap = self.nsmap) + elt = lxml.etree.Element(self.xmlns + self.element_name, nsmap = self.nsmap) for key in self.attributes: val = getattr(self, key, None) if val is not None: @@ -202,7 +202,7 @@ class base_elt(object): Constructor for Base64-encoded subelement. """ 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() + lxml.etree.SubElement(elt, self.xmlns + name, nsmap = self.nsmap).text = value.get_Base64() def __str__(self): """ @@ -459,7 +459,7 @@ class msg(list): """ Generate top-level PDU. """ - elt = lxml.etree.Element("{%s}msg" % (self.xmlns), nsmap = self.nsmap, version = str(self.version), type = self.type) + elt = lxml.etree.Element(self.xmlns + "msg", nsmap = self.nsmap, version = str(self.version), type = self.type) elt.extend([i.toXML() for i in self]) return elt diff --git a/schemas/relaxng/left-right-schema.rnc b/schemas/relaxng/left-right-schema.rnc index 81c1e1e1..201f8ff0 100644 --- a/schemas/relaxng/left-right-schema.rnc +++ b/schemas/relaxng/left-right-schema.rnc @@ -21,6 +21,8 @@ default namespace = "http://www.hactrn.net/uris/rpki/left-right-spec/" +version = "1" + # Top level PDU start = element msg { diff --git a/schemas/relaxng/left-right-schema.rng b/schemas/relaxng/left-right-schema.rng index c5708be1..6e60bd40 100644 --- a/schemas/relaxng/left-right-schema.rng +++ b/schemas/relaxng/left-right-schema.rng @@ -22,6 +22,9 @@ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --> <grammar ns="http://www.hactrn.net/uris/rpki/left-right-spec/" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> + <define name="version"> + <value>1</value> + </define> <!-- Top level PDU --> <start> <element name="msg"> diff --git a/schemas/relaxng/publication-schema.rnc b/schemas/relaxng/publication-schema.rnc index 960922e0..fdf38c9e 100644 --- a/schemas/relaxng/publication-schema.rnc +++ b/schemas/relaxng/publication-schema.rnc @@ -21,6 +21,8 @@ default namespace = "http://www.hactrn.net/uris/rpki/publication-spec/" +version = "1" + # Top level PDU start = element msg { diff --git a/schemas/relaxng/publication-schema.rng b/schemas/relaxng/publication-schema.rng index c257b6bc..72a77ad4 100644 --- a/schemas/relaxng/publication-schema.rng +++ b/schemas/relaxng/publication-schema.rng @@ -22,6 +22,9 @@ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --> <grammar ns="http://www.hactrn.net/uris/rpki/publication-spec/" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> + <define name="version"> + <value>1</value> + </define> <!-- Top level PDU --> <start> <element name="msg"> |