Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 55 additions & 12 deletions src/keri/core/eventing.py
Original file line number Diff line number Diff line change
Expand Up @@ -5571,6 +5571,7 @@ def processEscrows(self):
self.processEscrowPartialWigs()
self.processEscrowPartialSigs()
self.processEscrowDuplicitous()
self.processEscrowDelegables()
self.processQueryNotFound()

except Exception as ex: # log diagnostics errors etc
Expand Down Expand Up @@ -6550,18 +6551,9 @@ def processEscrowDelegables(self):
wigers = [Siger(qb64b=bytes(wig)) for wig in wigs]

# get delgate seal
couple = self.db.getAes(dgkey)
if couple is not None: # Only try to parse the event if we have the del seal
raw = bytearray(couple)
seqner = coring.Seqner(qb64b=raw, strip=True)
saider = coring.Saider(qb64b=raw)

# process event
self.processEvent(serder=eserder, sigers=sigers, wigers=wigers, delseqner=seqner,
delsaider=saider, local=esr.local)
else:
raise MissingDelegableApprovalError("No delegation seal found for event.")

seqner, saider = self._getDelegationSeal(eserder=eserder, dgkey=dgkey)
self.processEvent(serder=eserder, sigers=sigers, wigers=wigers, delseqner=seqner,
delsaider=saider, local=esr.local)
except MissingDelegableApprovalError as ex:
# still waiting on missing delegation approval
if logger.isEnabledFor(logging.DEBUG):
Expand All @@ -6584,6 +6576,57 @@ def processEscrowDelegables(self):
"event=%s", eserder.said)
logger.debug(f"Event=\n%s\n", eserder.pretty())

def _getDelegationSeal(self, eserder: serdering.SerderKERI, dgkey: bytes) -> tuple[coring.Seqner, coring.Saider]:
"""
Get sequence number (delseqner) and event digest (delsaider)
for delegated inception (dip) or rotation (drt) event from AES seal database or KEL state.

Parameters:
eserder: SerderKERI instance of the delegated event
dgkey: bytes of the digest key of the delegated event
Returns:
(Seqner, Saider): sequence number and event digest
Raises:
MissingDelegableApprovalError: if the delegation seal is not found
"""
# get delgate seal
couple = self.db.getAes(dgkey)
if couple is not None: # Only try to parse the event if we have the del seal
raw = bytearray(couple)
seqner = coring.Seqner(qb64b=raw, strip=True)
saider = coring.Saider(qb64b=raw)
return seqner, saider
else:
# Check KEL for seal (like in valSigsWigsDel)
# This handles the case where delegation was approved
# and the seal is in the delegator's KEL
if eserder.ilk in (Ilks.dip, Ilks.drt):
# Get delpre (delegator prefix) from dip or drt
if eserder.ilk == Ilks.dip:
delpre = eserder.delpre # delegator from dip event
if not delpre:
raise MissingDelegableApprovalError(
f"Empty or missing delegator for delegated inception event = {eserder.said}.")
else: # For drt, delpre is in kever state
# If we have the kever, use it; otherwise we can't process
if eserder.pre in self.kevers:
delpre = self.kevers[eserder.pre].delpre
else:
raise MissingDelegableApprovalError(
f"No kever found for delegated rotation event = {eserder.said}.")

# Look up seal in delegator's KEL
seal = dict(i=eserder.pre, s=eserder.snh, d=eserder.said)
dserder = self.db.fetchLastSealingEventByEventSeal(pre=delpre, seal=seal)
if dserder is not None: # found seal - use it
seqner = coring.Seqner(sn=dserder.sn)
saider = coring.Saider(qb64=dserder.said)
return seqner, saider
else:
raise MissingDelegableApprovalError("No delegation seal found for event.")
else:
raise MissingDelegableApprovalError("No delegation seal found for event.")


def processQueryNotFound(self):
"""
Expand Down
12 changes: 6 additions & 6 deletions src/keri/core/serdering.py
Original file line number Diff line number Diff line change
Expand Up @@ -776,8 +776,8 @@ def _validate(self):

if (self.kind == Kinds.cesr and (self.pvrsn.major < Vrsn_2_0.major or
(self.gvrsn is not None and self.gvrsn.major < Vrsn_2_0.major))):
raise ValidationError(f"Invalid major protocol version={pvrsn} and/or"
f" invalid major genus version={gvrsn} "
raise ValidationError(f"Invalid major protocol version={self.pvrsn} and/or"
f" invalid major genus version={self.gvrsn} "
f"for native CESR serialization.")

if self.pvrsn not in self.Fields[self.proto]:
Expand Down Expand Up @@ -1465,8 +1465,8 @@ def _loads(self, raw, size=None):

case _: # if extra fields this is where logic would be
raise DeserializeError(f"Unsupported protocol field label"
f"='{l}' for protocol={proto}"
f" version={pvrsn}.")
f"='{l}' for protocol={self.proto}"
f" version={self.pvrsn}.")


elif self.proto == Protocols.acdc:
Expand Down Expand Up @@ -1586,8 +1586,8 @@ def _loads(self, raw, size=None):

case _: # if extra fields this is where logic would be
raise DeserializeError(f"Unsupported protocol field label"
f"='{l}' for protocol={proto}"
f" version={pvrsn}.")
f"='{l}' for protocol={self.proto}"
f" version={self.pvrsn}.")

else: # unsupported protocol type
raise DeserializeError(f"Unsupported protocol={self.proto}.")
Expand Down
Loading
Loading