diff options
Diffstat (limited to 'rpki')
-rw-r--r-- | rpki/pubd.py | 11 | ||||
-rw-r--r-- | rpki/rpkid.py | 12 |
2 files changed, 16 insertions, 7 deletions
diff --git a/rpki/pubd.py b/rpki/pubd.py index 4814dc24..229f9511 100644 --- a/rpki/pubd.py +++ b/rpki/pubd.py @@ -470,10 +470,13 @@ class delta_obj(rpki.sql.sql_persistent): def publish(self, client, der, uri, hash): obj = object_obj.current_object_at_uri(client, self, uri) - if obj is not None and obj.hash == hash: - obj.delete(self) - elif obj is not None: - raise rpki.exceptions.ExistingObjectAtURI("Object already published at %s" % uri) + if obj is not None: + if obj.hash == hash: + obj.delete(self) + elif hash is None: + raise rpki.exceptions.ExistingObjectAtURI("Object already published at %s" % uri) + else: + raise rpki.exceptions.DifferentObjectAtURI("Found different object at %s (old %s, new %s)" % (uri, obj.hash, hash)) logger.debug("Publishing %s", uri) object_obj.create(client, self, der, uri) se = DERSubElement(self.deltas[0], rrdp_tag_publish, der = der, uri = uri) diff --git a/rpki/rpkid.py b/rpki/rpkid.py index 9a9429e5..e3120b75 100644 --- a/rpki/rpkid.py +++ b/rpki/rpkid.py @@ -2530,6 +2530,8 @@ class publication_queue(object): assert old_obj is None or isinstance(old_obj, rpki.x509.uri_dispatch(uri)) assert new_obj is None or isinstance(new_obj, rpki.x509.uri_dispatch(uri)) + logger.debug("Queuing publication action: uri %s, old %r, new %r", uri, old_obj, new_obj) + rid = id(repository) if rid not in self.repositories: self.repositories[rid] = repository @@ -2537,9 +2539,13 @@ class publication_queue(object): if self.replace and uri in self.uris: logger.debug("Removing publication duplicate %r", self.uris[uri]) - self.msgs[rid].remove(self.uris.pop(uri)) - - hash = None if old_obj is None else rpki.x509.sha256(old_obj.get_DER()).encode("hex") + old_pdu = self.uris.pop(uri) + self.msgs[rid].remove(old_pdu) + hash = old_pdu.hash + elif old_obj is None: + hash = None + else: + hash = rpki.x509.sha256(old_obj.get_DER()).encode("hex") if new_obj is None: pdu = rpki.publication.withdraw_elt.make_pdu(uri = uri, hash = hash) |