diff options
author | Rob Austein <sra@hactrn.net> | 2014-07-17 21:57:36 +0000 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2014-07-17 21:57:36 +0000 |
commit | e2b9b042765d3e42bf9166d3f7980949a38a70b9 (patch) | |
tree | a3bd7edf4f6967865d1e2c3ff9bad1c2be377a93 | |
parent | 8436607494189c48bb26a507ede9cb8b7a9c25d9 (diff) |
Publication code mostly just deals with DER and Base64, so defer ASN.1
decode until something asks to look at the object.
svn path=/branches/tk705/; revision=5901
-rw-r--r-- | rpki/pubd.py | 18 | ||||
-rw-r--r-- | rpki/publication.py | 20 | ||||
-rw-r--r-- | rpki/rpkid.py | 2 | ||||
-rw-r--r-- | rpki/sql_schemas.py | 2 | ||||
-rw-r--r-- | schemas/sql/pubd.sql | 2 |
5 files changed, 26 insertions, 18 deletions
diff --git a/rpki/pubd.py b/rpki/pubd.py index 4548265d..647b0f68 100644 --- a/rpki/pubd.py +++ b/rpki/pubd.py @@ -306,7 +306,7 @@ class session_obj(rpki.sql.sql_persistent): xml.text = "\n" for obj in self.objects: DERSubElement(xml, rrdp_xmlns + "publish", - der = obj.payload, + der = obj.der, uri = obj.uri) rpki.relaxng.rrdp.assertValid(xml) self.snapshot = ElementToString(xml, pretty_print = True) @@ -401,14 +401,14 @@ class delta_obj(rpki.sql.sql_persistent): del self.deltas self.sql_mark_dirty() - def publish(self, client, obj, uri, hash): + def publish(self, client, der, uri, hash): if hash is not None: self.withdraw(client, uri, hash) elif object_obj.current_object_at_uri(client, self, uri) is not None: raise rpki.exceptions.ExistingObjectAtURI("Object already published at %s" % uri) logger.debug("Publishing %s", uri) - object_obj.create(client, self, obj, uri) - se = DERSubElement(self.deltas[0], rrdp_xmlns + "publish", obj.get_DER(), uri = uri) + object_obj.create(client, self, der, uri) + se = DERSubElement(self.deltas[0], rrdp_xmlns + "publish", der = der, uri = uri) if hash is not None: se.set("hash", hash) rpki.relaxng.rrdp.assertValid(self.deltas) @@ -434,8 +434,8 @@ class object_obj(rpki.sql.sql_persistent): "object", "object_id", "uri", + "der", "hash", - "payload", "client_id", "session_id") @@ -453,13 +453,13 @@ class object_obj(rpki.sql.sql_persistent): return rpki.publication_control.client_elt.sql_fetch(self.gctx, self.client_id) @classmethod - def create(cls, client, delta, obj, uri): + def create(cls, client, delta, der, uri): self = cls() self.gctx = delta.gctx self.uri = uri - self.payload = obj.get_DER() - self.hash = rpki.x509.sha256(self.payload).encode("hex") - logger.debug("Computed hash %s for %r", self.hash, obj) + self.der = der + self.hash = rpki.x509.sha256(der).encode("hex") + logger.debug("Computed hash %s for %s", self.hash, self.uri) self.session_id = delta.session_id self.client_id = client.client_id self.sql_mark_dirty() diff --git a/rpki/publication.py b/rpki/publication.py index f619d0d9..5d9daf20 100644 --- a/rpki/publication.py +++ b/rpki/publication.py @@ -52,12 +52,20 @@ class base_publication_elt(rpki.xml_utils.base_elt, publication_namespace): tag = None uri = None + der = None hash = None - payload = None + + _payload = None def __repr__(self): return rpki.log.log_repr(self, self.tag, self.uri, self.hash, self.payload) + @property + def payload(self): + if self._payload is None and self.der is not None: + self._payload = rpki.x509.uri_dispatch(self.uri)(DER = self.der) + return self._payload + def uri_to_filename(self): """ Convert a URI to a local filename. @@ -96,7 +104,7 @@ class publish_elt(base_publication_elt): assert name == self.element_name, "Unexpected name %s, stack %s" % (name, stack) if text: - self.payload = rpki.x509.uri_dispatch(self.uri)(Base64 = text) + self.der = text.decode("base64") stack.pop() def toXML(self): @@ -105,8 +113,8 @@ class publish_elt(base_publication_elt): """ elt = self.make_elt() - if self.payload != None: - elt.text = self.payload.get_Base64() + if self.der is not None: + elt.text = self.der.encode("base64") return elt def serve_action(self, delta): @@ -115,14 +123,14 @@ class publish_elt(base_publication_elt): """ logger.info("Publishing %s", self.payload.tracking_data(self.uri)) - delta.publish(self.client, self.payload, self.uri, self.hash) + delta.publish(self.client, self.der, self.uri, self.hash) filename = self.uri_to_filename() filename_tmp = filename + ".tmp" dirname = os.path.dirname(filename) if not os.path.isdir(dirname): os.makedirs(dirname) with open(filename_tmp, "wb") as f: - f.write(self.payload.get_DER()) + f.write(self.der) os.rename(filename_tmp, filename) diff --git a/rpki/rpkid.py b/rpki/rpkid.py index b5044b2a..9a9429e5 100644 --- a/rpki/rpkid.py +++ b/rpki/rpkid.py @@ -2544,7 +2544,7 @@ class publication_queue(object): if new_obj is None: pdu = rpki.publication.withdraw_elt.make_pdu(uri = uri, hash = hash) else: - pdu = rpki.publication.publish_elt.make_pdu( uri = uri, hash = hash, payload = new_obj) + pdu = rpki.publication.publish_elt.make_pdu( uri = uri, hash = hash, der = new_obj.get_DER()) if handler is not None: self.handlers[id(pdu)] = handler diff --git a/rpki/sql_schemas.py b/rpki/sql_schemas.py index 6cb95819..6778ecd9 100644 --- a/rpki/sql_schemas.py +++ b/rpki/sql_schemas.py @@ -315,8 +315,8 @@ CREATE TABLE delta ( CREATE TABLE object ( object_id SERIAL NOT NULL, uri VARCHAR(255) NOT NULL, + der LONGBLOB NOT NULL, hash CHAR(64) NOT NULL, - payload LONGBLOB NOT NULL, client_id BIGINT UNSIGNED NOT NULL, session_id BIGINT UNSIGNED NOT NULL, PRIMARY KEY (object_id), diff --git a/schemas/sql/pubd.sql b/schemas/sql/pubd.sql index 1264b82a..de857bf4 100644 --- a/schemas/sql/pubd.sql +++ b/schemas/sql/pubd.sql @@ -68,8 +68,8 @@ CREATE TABLE delta ( CREATE TABLE object ( object_id SERIAL NOT NULL, uri VARCHAR(255) NOT NULL, + der LONGBLOB NOT NULL, hash CHAR(64) NOT NULL, - payload LONGBLOB NOT NULL, client_id BIGINT UNSIGNED NOT NULL, session_id BIGINT UNSIGNED NOT NULL, PRIMARY KEY (object_id), |