aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rpki/pubd.py11
-rw-r--r--rpki/rpkid.py12
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)