Skip to content

Commit

Permalink
Merge pull request #52 from factomatic/fix-did-updater
Browse files Browse the repository at this point in the history
Fix DID updater
  • Loading branch information
PeterAsenov22 committed Oct 24, 2019
2 parents 574365f + 0dcef05 commit 8eadc9c
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 1 deletion.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ install:
- pip install pipenv
- pipenv install -d --pre
script:
- pytest --cov=./client/ --cov=./resolver
- pytest --cov=./factom_did/client/ --cov=./factom_did/resolver
after_success:
- coveralls
33 changes: 33 additions & 0 deletions factom_did/client/updater.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,13 @@ def export_entry_data(self):
)
new_management_keys, new_did_keys, new_services = self._get_new()

if not self.exists_management_key_with_priority_zero(
self.orig_management_keys, new_management_keys, revoked_management_keys
):
raise ValueError(
"DIDUpdate entry would leave no management keys of priority zero"
)

# Entries in the "revoke" section of a DIDUpdate entry
revoke_dict = defaultdict(list)

Expand Down Expand Up @@ -311,6 +318,32 @@ def record_on_chain(self, factomd, walletd, ec_address, verbose=False):
verbose,
)

@staticmethod
def exists_management_key_with_priority_zero(
active_management_keys, new_management_keys, management_keys_to_revoke
):
"""
Checks if a management key of priority zero would be present if the management keys will be updated according
to the given parameters.
Parameters
----------
active_management_keys: set
The currently active management keys
new_management_keys: set
The management keys to be added
management_keys_to_revoke: set
The management keys to be revoked
Returns
-------
bool
"""
active_management_keys = active_management_keys.copy()
active_management_keys.update(new_management_keys)
remaining_keys = active_management_keys.difference(management_keys_to_revoke)
return min(map(lambda key: key.priority, remaining_keys)) == 0

def _get_revoked(self):
revoked_management_keys = self.orig_management_keys.difference(
set(self.did.management_keys)
Expand Down
4 changes: 4 additions & 0 deletions tests/test_updater.py
Original file line number Diff line number Diff line change
Expand Up @@ -301,3 +301,7 @@ def test_addition_and_revocation(self, full_did):
assert added["service"][0]["id"] == "{}#encrypted-chat".format(full_did.id)
assert added["service"][0]["type"] == "chat-service"
assert added["service"][0]["serviceEndpoint"] == "https://my-chat-service.com"

def test_revocation_of_all_mngt_keys_with_priority_zero(self, full_did):
with pytest.raises(ValueError):
full_did.update().revoke_management_key("man-key1").export_entry_data()

0 comments on commit 8eadc9c

Please sign in to comment.