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
2 changes: 1 addition & 1 deletion src/keri/app/cli/commands/delegate/confirm.py
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ def confirmDo(self, tymth, tock=0.0, **kwa):

print(f"Delegate {eserder.pre} {typ} event committed.")

self.hby.db.delegables.rem(keys=(pre, sn))
self.hby.db.delegables.rem(keys=(pre, sn), val=edig)
self.remove(self.toRemove)
return True

Expand Down
2 changes: 1 addition & 1 deletion src/keri/app/habbing.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ def openHab(name="test", base="", salt=None, temp=True, cf=None, **kwa):

with openHby(name=name, base=base, salt=salt, temp=temp, cf=cf) as hby:
if (hab := hby.habByName(name)) is None:
hab = hby.makeHab(name=name, icount=1, isith='1', ncount=1, nsith='1', **kwa)
hab = hby.makeHab(name=name, icount=1, isith='1', ncount=1, nsith='1', cf=cf, **kwa)

yield hby, hab

Expand Down
69 changes: 57 additions & 12 deletions src/keri/core/eventing.py
Original file line number Diff line number Diff line change
Expand Up @@ -2397,7 +2397,7 @@ def valSigsWigsDel(self, serder, sigers, verfers, tholder,
# seal in this case can't be malicious since sourced locally.
# Doesn't get to here until fully signed and witnessed.

if self.locallyDelegated(delpre) and not self.locallyOwned(): # local delegator
if serder.ilk in (Ilks.dip, Ilks.drt) and self.locallyDelegated(delpre) and not self.locallyOwned(): # local delegator of delegated event
#if (delpre in self.prefixes) and not self.locallyOwned(): # local delegator
# must be local if locallyDelegated or caught above as misfit
if delseqner is None or delsaider is None: # missing delegation seal
Expand Down Expand Up @@ -5329,6 +5329,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 @@ -6307,17 +6308,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
Expand All @@ -6341,6 +6334,58 @@ 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):
"""
Process qry events escrowed by Kevery for KELs that have not yet met the criteria of the query.
Expand Down
Loading
Loading