Capsule filtration bugfixes

pull/2960/head
Kieran Prasch 2022-08-30 15:43:35 +02:00
parent 150163fc7f
commit 0608608460
2 changed files with 11 additions and 19 deletions

View File

@ -52,7 +52,7 @@ class RetrievalPlan:
# Record the retrieval kits order # Record the retrieval kits order
self._capsules, _conditions = tuple(zip(*((rk.capsule, rk.conditions) for rk in retrieval_kits))) self._capsules, _conditions = tuple(zip(*((rk.capsule, rk.conditions) for rk in retrieval_kits)))
self._conditions = (ConditionLingo.from_bytes(l) if l else None for l in _conditions) self._conditions = list(ConditionLingo.from_bytes(l) if l else None for l in _conditions)
self._threshold = treasure_map.threshold self._threshold = treasure_map.threshold
@ -95,19 +95,14 @@ class RetrievalPlan:
# Only request reencryption for capsules that: # Only request reencryption for capsules that:
# - haven't been processed by this Ursula # - haven't been processed by this Ursula
# - don't already have cfrags from `threshold` Ursulas # - don't already have cfrags from `threshold` Ursulas
packets = [] packets = [(capsule, lingo) for capsule, lingo in zip(self._capsules, self._conditions)
for capsule, lingo in zip(self._capsules, self._conditions): if (capsule not in self._processed_capsules.get(ursula_address, set())
not_done = capsule not in self._processed_capsules.get(ursula_address, set()) and len(self._queried_addresses[capsule]) < self._threshold)]
need_more = len(self._queried_addresses[capsule]) < self._threshold
if not_done and need_more:
result = [capsule, lingo]
packets.append(result)
if len(packets) > 0: if len(packets) > 0:
capsules, lingos = list(zip(*packets)) # (<lingo>, None, <lingo>) capsules, conditions = list(zip(*packets))
return RetrievalWorkOrder(ursula_address=ursula_address, return RetrievalWorkOrder(ursula_address=ursula_address,
capsules=list(capsules), capsules=list(capsules),
lingo=list(lingos)) lingo=list(conditions))
# Execution will not reach this point if `is_complete()` returned `False` before this call. # Execution will not reach this point if `is_complete()` returned `False` before this call.
raise RuntimeError("No Ursulas left") raise RuntimeError("No Ursulas left")
@ -150,11 +145,10 @@ class RetrievalWorkOrder:
self.__lingo = lingo self.__lingo = lingo
def conditions(self, as_json=True) -> Union[str, List[ConditionLingo]]: def conditions(self, as_json=True) -> Union[str, List[ConditionLingo]]:
if not self.__lingo: lingo = self.__lingo or list()
return list()
if as_json: if as_json:
return json.dumps([l.to_json() if l else None for l in self.__lingo]) return json.dumps([l.to_json() if l else None for l in lingo])
return self.__lingo return lingo
class RetrievalClient: class RetrievalClient:
@ -250,8 +244,7 @@ class RetrievalClient:
alice_verifying_key=alice_verifying_key, alice_verifying_key=alice_verifying_key,
ursula_verifying_key=ursula_verifying_key, ursula_verifying_key=ursula_verifying_key,
policy_encrypting_key=policy_encrypting_key, policy_encrypting_key=policy_encrypting_key,
bob_encrypting_key=bob_encrypting_key, bob_encrypting_key=bob_encrypting_key)
)
except InvalidSignature as e: except InvalidSignature as e:
self.log.warn(str(e)) self.log.warn(str(e))
raise raise

View File

@ -93,8 +93,7 @@ def test_single_retrieve_with_conditions(enacted_federated_policy, federated_bob
**_policy_info_kwargs(enacted_federated_policy), **_policy_info_kwargs(enacted_federated_policy),
) )
assert cleartexts == b'lab' assert b'lab' in cleartexts
def test_use_external_cache(enacted_federated_policy, federated_bob, federated_ursulas): def test_use_external_cache(enacted_federated_policy, federated_bob, federated_ursulas):