keri 1.2.0.dev1__tar.gz → 1.2.0.dev3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {keri-1.2.0.dev1/src/keri.egg-info → keri-1.2.0.dev3}/PKG-INFO +1 -1
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/setup.py +1 -1
- keri-1.2.0.dev3/src/keri/__init__.py +5 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/delegate/confirm.py +5 -11
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/incept.py +6 -7
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/agree.py +2 -2
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/apply.py +2 -2
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/list.py +7 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/offer.py +2 -2
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/join.py +38 -27
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/rotate.py +5 -5
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/nonce.py +2 -2
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/rotate.py +2 -2
- keri-1.2.0.dev3/src/keri/app/cli/commands/watcher/__init__.py +6 -0
- keri-1.2.0.dev3/src/keri/app/cli/commands/watcher/add.py +132 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/authenticate.py +5 -2
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/delegating.py +35 -32
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/grouping.py +1 -5
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/habbing.py +1 -1
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/indirecting.py +7 -5
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/oobiing.py +93 -4
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/__init__.py +1 -5
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/coring.py +25 -77
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/counting.py +37 -6
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/eventing.py +23 -59
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/indexing.py +16 -1
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/parsing.py +6 -6
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/signing.py +0 -38
- keri-1.2.0.dev3/src/keri/core/streaming.py +391 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/structing.py +1 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/db/basing.py +1 -1
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/db/escrowing.py +0 -2
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/end/ending.py +4 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/help/helping.py +1 -1
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/kering.py +10 -1
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vdr/eventing.py +2 -1
- {keri-1.2.0.dev1 → keri-1.2.0.dev3/src/keri.egg-info}/PKG-INFO +1 -1
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri.egg-info/SOURCES.txt +3 -0
- keri-1.2.0.dev1/src/keri/__init__.py +0 -5
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/LICENSE +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/README.md +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/setup.cfg +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/agenting.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/apping.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/challenging.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/challenge/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/challenge/generate.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/challenge/respond.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/challenge/verify.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/clean.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/contacts/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/contacts/list.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/decrypt.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/delegate/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/delegate/request.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/did/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/did/generate.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ends/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ends/add.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ends/export.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ends/list.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/escrow.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/export.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/init.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/interact.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/admit.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/grant.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/join.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/spurn.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/kevers.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/list.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/local/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/local/watch.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/mailbox/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/mailbox/debug.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/mailbox/update.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate/list.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate/run.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate/show.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/continue.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/demo.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/incept.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/interact.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/notice.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/shell.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/update.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/oobi/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/oobi/clean.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/oobi/generate.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/oobi/resolve.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/passcode/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/passcode/generate.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/passcode/remove.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/passcode/set.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/query.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/rename.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/rollback.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/saidify.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/salt.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/sign.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ssh/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ssh/export.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/status.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/time.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/create.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/export.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/list.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/registry/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/registry/incept.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/registry/list.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/registry/status.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/revoke.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/verify.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/version.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/demo.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/start.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/submit.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/common/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/common/config.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/common/displaying.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/common/existing.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/common/incepting.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/common/rotating.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/common/terming.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/kli.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/configing.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/connecting.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/directing.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/forwarding.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/httping.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/keeping.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/notifying.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/querying.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/signaling.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/signing.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/specing.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/storing.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/routing.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/scheming.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/serdering.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/db/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/db/dbing.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/db/koming.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/db/migrations/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/db/migrations/rekey_habs.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/db/subing.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/demo/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/demo/demo_bob.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/demo/demo_eve.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/demo/demo_kev.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/demo/demo_sam.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/demo/demoing.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/end/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/end/priming.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/help/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/peer/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/peer/exchanging.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vc/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vc/protocoling.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vc/proving.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vc/walleting.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vdr/__init__.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vdr/credentialing.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vdr/verifying.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vdr/viring.py +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri.egg-info/dependency_links.txt +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri.egg-info/entry_points.txt +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri.egg-info/not-zip-safe +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri.egg-info/requires.txt +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri.egg-info/top_level.txt +0 -0
- {keri-1.2.0.dev1 → keri-1.2.0.dev3}/tests/test_kering.py +0 -0
|
@@ -37,7 +37,7 @@ from os.path import splitext
|
|
|
37
37
|
from setuptools import find_packages, setup
|
|
38
38
|
setup(
|
|
39
39
|
name='keri',
|
|
40
|
-
version='1.2.0-
|
|
40
|
+
version='1.2.0-dev3', # also change in src/keri/__init__.py
|
|
41
41
|
license='Apache Software License 2.0',
|
|
42
42
|
description='Key Event Receipt Infrastructure',
|
|
43
43
|
long_description="KERI Decentralized Key Management Infrastructure",
|
|
@@ -96,9 +96,8 @@ class ConfirmDoer(doing.DoDoer):
|
|
|
96
96
|
|
|
97
97
|
while True:
|
|
98
98
|
esc = self.escrowed()
|
|
99
|
-
for
|
|
100
|
-
|
|
101
|
-
dgkey = dbing.dgKey(pre, bytes(edig))
|
|
99
|
+
for pre, sn, edig in esc:
|
|
100
|
+
dgkey = dbing.dgKey(pre, edig)
|
|
102
101
|
eraw = self.hby.db.getEvt(dgkey)
|
|
103
102
|
if eraw is None:
|
|
104
103
|
continue
|
|
@@ -204,6 +203,7 @@ class ConfirmDoer(doing.DoDoer):
|
|
|
204
203
|
|
|
205
204
|
print(f"Delegate {eserder.pre} {typ} event committed.")
|
|
206
205
|
|
|
206
|
+
self.hby.db.delegables.rem(keys=(pre, sn))
|
|
207
207
|
self.remove(self.toRemove)
|
|
208
208
|
return True
|
|
209
209
|
|
|
@@ -213,12 +213,6 @@ class ConfirmDoer(doing.DoDoer):
|
|
|
213
213
|
|
|
214
214
|
def escrowed(self):
|
|
215
215
|
esc = []
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
for ekey, edig in self.hby.db.getPseItemsNextIter(key=key):
|
|
219
|
-
esc.append((ekey, edig))
|
|
220
|
-
if ekey == key: # still same so no escrows found on last while iteration
|
|
221
|
-
break
|
|
222
|
-
key = ekey # setup next while iteration, with key after ekey
|
|
223
|
-
|
|
216
|
+
for (pre, sn), edig in self.hby.db.delegables.getItemIter():
|
|
217
|
+
esc.append((pre, sn, edig))
|
|
224
218
|
return esc
|
|
@@ -137,16 +137,15 @@ class InceptDoer(doing.DoDoer):
|
|
|
137
137
|
clear=False)
|
|
138
138
|
self.endpoint = endpoint
|
|
139
139
|
self.proxy = proxy
|
|
140
|
-
hby = existing.setupHby(name=name, base=base, bran=bran, cf=cf)
|
|
141
|
-
self.hbyDoer = habbing.HaberyDoer(habery=hby) # setup doer
|
|
142
|
-
self.swain = delegating.Anchorer(hby=hby)
|
|
143
|
-
self.postman = forwarding.Poster(hby=hby)
|
|
144
|
-
self.mbx = indirecting.MailboxDirector(hby=hby, topics=['/receipt', "/replay", "/reply"])
|
|
140
|
+
self.hby = existing.setupHby(name=name, base=base, bran=bran, cf=cf)
|
|
141
|
+
self.hbyDoer = habbing.HaberyDoer(habery=self.hby) # setup doer
|
|
142
|
+
self.swain = delegating.Anchorer(hby=self.hby, proxy=self.hby.habByName(self.proxy))
|
|
143
|
+
self.postman = forwarding.Poster(hby=self.hby)
|
|
144
|
+
self.mbx = indirecting.MailboxDirector(hby=self.hby, topics=['/receipt', "/replay", "/reply"])
|
|
145
145
|
doers = [self.hbyDoer, self.postman, self.mbx, self.swain, doing.doify(self.inceptDo)]
|
|
146
146
|
|
|
147
147
|
self.inits = kwa
|
|
148
148
|
self.alias = alias
|
|
149
|
-
self.hby = hby
|
|
150
149
|
super(InceptDoer, self).__init__(doers=doers)
|
|
151
150
|
|
|
152
151
|
def inceptDo(self, tymth, tock=0.0):
|
|
@@ -169,7 +168,7 @@ class InceptDoer(doing.DoDoer):
|
|
|
169
168
|
self.extend([witDoer, receiptor])
|
|
170
169
|
|
|
171
170
|
if hab.kever.delpre:
|
|
172
|
-
self.swain.delegation(pre=hab.pre, sn=0
|
|
171
|
+
self.swain.delegation(pre=hab.pre, sn=0)
|
|
173
172
|
print("Waiting for delegation approval...")
|
|
174
173
|
while not self.swain.complete(hab.kever.prefixer, coring.Seqner(sn=hab.kever.sn)):
|
|
175
174
|
yield self.tock
|
|
@@ -7,7 +7,7 @@ import argparse
|
|
|
7
7
|
|
|
8
8
|
from hio.base import doing
|
|
9
9
|
|
|
10
|
-
from keri.core import
|
|
10
|
+
from keri.core import signing
|
|
11
11
|
|
|
12
12
|
parser = argparse.ArgumentParser(description='Reply to IPEX offer message acknowledged willingness to accept offered '
|
|
13
13
|
'credential')
|
|
@@ -23,4 +23,4 @@ def nonce(tymth, tock=0.0):
|
|
|
23
23
|
"""
|
|
24
24
|
_ = (yield tock)
|
|
25
25
|
|
|
26
|
-
print(
|
|
26
|
+
print(signing.Salter().qb64)
|
|
@@ -7,7 +7,7 @@ import argparse
|
|
|
7
7
|
|
|
8
8
|
from hio.base import doing
|
|
9
9
|
|
|
10
|
-
from keri.core import
|
|
10
|
+
from keri.core import signing
|
|
11
11
|
|
|
12
12
|
parser = argparse.ArgumentParser(description='Request a credential from another party by initiating an IPEX exchange')
|
|
13
13
|
parser.set_defaults(handler=lambda args: handler(args))
|
|
@@ -22,4 +22,4 @@ def nonce(tymth, tock=0.0):
|
|
|
22
22
|
"""
|
|
23
23
|
_ = (yield tock)
|
|
24
24
|
|
|
25
|
-
print(
|
|
25
|
+
print(signing.Salter().qb64)
|
|
@@ -8,6 +8,7 @@ keri.kli.commands module
|
|
|
8
8
|
import argparse
|
|
9
9
|
import datetime
|
|
10
10
|
import os
|
|
11
|
+
import json
|
|
11
12
|
import sys
|
|
12
13
|
|
|
13
14
|
from hio import help
|
|
@@ -199,6 +200,12 @@ class ListDoer(doing.DoDoer):
|
|
|
199
200
|
if response is not None:
|
|
200
201
|
print(f" Response: {responseType} ({response.qb64})")
|
|
201
202
|
|
|
203
|
+
if self.verbose:
|
|
204
|
+
bsad = json.dumps(sad, indent=2)
|
|
205
|
+
print(" Full Credential:")
|
|
206
|
+
for line in bsad.splitlines():
|
|
207
|
+
print(f"\t{line}")
|
|
208
|
+
|
|
202
209
|
def apply(self, note, exn, pathed):
|
|
203
210
|
pass
|
|
204
211
|
|
|
@@ -7,7 +7,7 @@ import argparse
|
|
|
7
7
|
|
|
8
8
|
from hio.base import doing
|
|
9
9
|
|
|
10
|
-
from keri.core import
|
|
10
|
+
from keri.core import signing
|
|
11
11
|
|
|
12
12
|
parser = argparse.ArgumentParser(description='Reply to IPEX apply message or initiate an IPEX exchange with an offer'
|
|
13
13
|
' for a credential with certain characteristics')
|
|
@@ -23,4 +23,4 @@ def nonce(tymth, tock=0.0):
|
|
|
23
23
|
"""
|
|
24
24
|
_ = (yield tock)
|
|
25
25
|
|
|
26
|
-
print(
|
|
26
|
+
print(signing.Salter().qb64)
|
|
@@ -21,47 +21,52 @@ from keri.vdr import verifying, credentialing
|
|
|
21
21
|
logger = help.ogler.getLogger()
|
|
22
22
|
|
|
23
23
|
parser = argparse.ArgumentParser(description='Join group multisig inception, rotation or interaction event.')
|
|
24
|
-
parser.set_defaults(handler=lambda args:
|
|
24
|
+
parser.set_defaults(handler=lambda args: join(args))
|
|
25
25
|
parser.add_argument('--name', '-n', help='keystore name and file location of KERI keystore', required=True)
|
|
26
26
|
parser.add_argument('--base', '-b', help='additional optional prefix to file location of KERI keystore',
|
|
27
27
|
required=False, default="")
|
|
28
|
+
parser.add_argument('--group', '-a', help='human-readable name for the multisig group identifier prefix', required=False, default=None)
|
|
28
29
|
parser.add_argument('--passcode', '-p', help='21 character encryption passcode for keystore (is not saved)',
|
|
29
30
|
dest="bran", default=None) # passcode => bran
|
|
30
31
|
parser.add_argument("--auto", "-Y", help="auto approve any delegation request non-interactively", action="store_true")
|
|
31
32
|
|
|
32
33
|
|
|
33
|
-
def
|
|
34
|
-
"""
|
|
34
|
+
def join(args):
|
|
35
|
+
""" Wait for and provide interactive confirmation of group multisig inception, rotation or interaction events
|
|
35
36
|
|
|
36
37
|
Parameters:
|
|
37
|
-
args(Namespace): parsed
|
|
38
|
+
args(Namespace): parsed arguments namespace object
|
|
38
39
|
|
|
39
40
|
"""
|
|
40
41
|
name = args.name
|
|
41
42
|
base = args.base
|
|
42
43
|
bran = args.bran
|
|
43
44
|
auto = args.auto
|
|
45
|
+
group = args.group
|
|
44
46
|
|
|
45
|
-
|
|
47
|
+
joinDoer = JoinDoer(name=name, base=base, bran=bran, group=group, auto=auto)
|
|
46
48
|
|
|
47
|
-
doers = [
|
|
49
|
+
doers = [joinDoer]
|
|
48
50
|
return doers
|
|
49
51
|
|
|
50
52
|
|
|
51
|
-
class
|
|
52
|
-
"""
|
|
53
|
+
class JoinDoer(doing.DoDoer):
|
|
54
|
+
""" Doist doer capable of polling for group multisig events and prompting user for action
|
|
53
55
|
|
|
54
56
|
"""
|
|
55
57
|
|
|
56
|
-
def __init__(self, name, base, bran, auto=False):
|
|
58
|
+
def __init__(self, name, base, bran, group, auto=False):
|
|
57
59
|
""" Create doer for polling for group multisig events and either approve automatically or prompt user
|
|
58
60
|
|
|
59
61
|
Parameters:
|
|
60
62
|
name (str): database environment name
|
|
61
63
|
base (str): database directory prefix
|
|
62
64
|
bran (str): passcode to unlock keystore
|
|
63
|
-
|
|
65
|
+
group (str): human-readable name for the multisig identifier prefix
|
|
66
|
+
auto (bool): non-interactively auto approve any inception, rotation, interaction, or other event
|
|
67
|
+
while using the default group of "default-group"
|
|
64
68
|
"""
|
|
69
|
+
self.group = group
|
|
65
70
|
self.hby = existing.setupHby(name=name, base=base, bran=bran)
|
|
66
71
|
self.rgy = credentialing.Regery(hby=self.hby, name=name, base=base)
|
|
67
72
|
self.hbyDoer = habbing.HaberyDoer(habery=self.hby) # setup doer
|
|
@@ -88,11 +93,11 @@ class ConfirmDoer(doing.DoDoer):
|
|
|
88
93
|
|
|
89
94
|
doers = [self.hbyDoer, self.witq, self.mbx, self.counselor, self.registrar, self.credentialer, self.postman]
|
|
90
95
|
self.toRemove = list(doers)
|
|
91
|
-
doers.extend([doing.doify(self.
|
|
96
|
+
doers.extend([doing.doify(self.joinDo)])
|
|
92
97
|
self.auto = auto
|
|
93
|
-
super(
|
|
98
|
+
super(JoinDoer, self).__init__(doers=doers)
|
|
94
99
|
|
|
95
|
-
def
|
|
100
|
+
def joinDo(self, tymth, tock=0.0):
|
|
96
101
|
"""
|
|
97
102
|
Parameters:
|
|
98
103
|
tymth (function): injected function wrapper closure returned by .tymen() of
|
|
@@ -146,7 +151,7 @@ class ConfirmDoer(doing.DoDoer):
|
|
|
146
151
|
self.remove(self.toRemove)
|
|
147
152
|
|
|
148
153
|
def incept(self, attrs):
|
|
149
|
-
"""
|
|
154
|
+
""" Join a group multisig inception event
|
|
150
155
|
|
|
151
156
|
"""
|
|
152
157
|
said = attrs["d"]
|
|
@@ -177,8 +182,8 @@ class ConfirmDoer(doing.DoDoer):
|
|
|
177
182
|
inits["isith"] = oicp.ked["kt"]
|
|
178
183
|
inits["nsith"] = oicp.ked["nt"]
|
|
179
184
|
|
|
180
|
-
inits["estOnly"] =
|
|
181
|
-
inits["DnD"] =
|
|
185
|
+
inits["estOnly"] = kering.TraitCodex.EstOnly in oicp.ked["c"]
|
|
186
|
+
inits["DnD"] = kering.TraitCodex.DoNotDelegate in oicp.ked["c"]
|
|
182
187
|
|
|
183
188
|
inits["toad"] = oicp.ked["bt"]
|
|
184
189
|
inits["wits"] = oicp.ked["b"]
|
|
@@ -196,17 +201,20 @@ class ConfirmDoer(doing.DoDoer):
|
|
|
196
201
|
|
|
197
202
|
if approve:
|
|
198
203
|
if self.auto:
|
|
199
|
-
|
|
204
|
+
if self.group is None:
|
|
205
|
+
group = "default-group"
|
|
206
|
+
else:
|
|
207
|
+
group = self.group
|
|
200
208
|
else:
|
|
201
209
|
while True:
|
|
202
|
-
|
|
203
|
-
if self.hby.habByName(
|
|
204
|
-
print(f"AID
|
|
210
|
+
group = input(f"\nEnter group name for new AID: ")
|
|
211
|
+
if self.hby.habByName(group) is not None:
|
|
212
|
+
print(f"AID group name {group} is already in use, please try again")
|
|
205
213
|
else:
|
|
206
214
|
break
|
|
207
215
|
|
|
208
216
|
try:
|
|
209
|
-
ghab = self.hby.makeGroupHab(group=
|
|
217
|
+
ghab = self.hby.makeGroupHab(group=group, mhab=mhab,
|
|
210
218
|
smids=smids, rmids=rmids, **inits)
|
|
211
219
|
except ValueError as e:
|
|
212
220
|
return False
|
|
@@ -393,19 +401,22 @@ class ConfirmDoer(doing.DoDoer):
|
|
|
393
401
|
ghab = self.hby.habs[pre]
|
|
394
402
|
else:
|
|
395
403
|
if self.auto:
|
|
396
|
-
|
|
404
|
+
if self.group is None:
|
|
405
|
+
group = "default-group"
|
|
406
|
+
else:
|
|
407
|
+
group = self.group
|
|
397
408
|
else:
|
|
398
409
|
while True:
|
|
399
|
-
|
|
400
|
-
if self.hby.habByName(
|
|
401
|
-
print(f"AID
|
|
410
|
+
group = input(f"\nEnter group name for new AID: ")
|
|
411
|
+
if self.hby.habByName(group) is not None:
|
|
412
|
+
print(f"AID group name {group} is already in use, please try again")
|
|
402
413
|
else:
|
|
403
414
|
break
|
|
404
415
|
|
|
405
|
-
ghab = self.hby.joinGroupHab(pre, group=
|
|
416
|
+
ghab = self.hby.joinGroupHab(pre, group=group, mhab=mhab, smids=smids, rmids=rmids)
|
|
406
417
|
|
|
407
418
|
try:
|
|
408
|
-
ghab.rotate(serder=orot)
|
|
419
|
+
ghab.rotate(serder=orot, smids=smids, rmids=rmids)
|
|
409
420
|
except ValueError:
|
|
410
421
|
return False
|
|
411
422
|
|
|
@@ -53,9 +53,9 @@ def rotateGroupIdentifier(args):
|
|
|
53
53
|
"""
|
|
54
54
|
|
|
55
55
|
data = config.parseData(args.data) if args.data is not None else None
|
|
56
|
-
|
|
57
|
-
rotDoer = GroupMultisigRotate(
|
|
58
|
-
|
|
56
|
+
hby = existing.setupHby(name=args.name, base=args.base, bran=args.bran)
|
|
57
|
+
rotDoer = GroupMultisigRotate(hby=hby, alias=args.alias, smids=args.smids, rmids=args.rmids,
|
|
58
|
+
wits=args.witnesses, cuts=args.cuts, adds=args.witness_add,
|
|
59
59
|
isith=args.isith, nsith=args.nsith, toad=args.toad, data=data)
|
|
60
60
|
|
|
61
61
|
doers = [rotDoer]
|
|
@@ -70,7 +70,7 @@ class GroupMultisigRotate(doing.DoDoer):
|
|
|
70
70
|
|
|
71
71
|
"""
|
|
72
72
|
|
|
73
|
-
def __init__(self,
|
|
73
|
+
def __init__(self, hby, alias, smids=None, rmids=None, isith=None, nsith=None,
|
|
74
74
|
toad=None, wits=None, cuts=None, adds=None, data: list = None):
|
|
75
75
|
|
|
76
76
|
self.alias = alias
|
|
@@ -80,12 +80,12 @@ class GroupMultisigRotate(doing.DoDoer):
|
|
|
80
80
|
self.smids = smids
|
|
81
81
|
self.rmids = rmids
|
|
82
82
|
self.data = data
|
|
83
|
+
self.hby = hby
|
|
83
84
|
|
|
84
85
|
self.wits = wits if wits is not None else []
|
|
85
86
|
self.cuts = cuts if cuts is not None else []
|
|
86
87
|
self.adds = adds if adds is not None else []
|
|
87
88
|
|
|
88
|
-
self.hby = existing.setupHby(name=name, base=base, bran=bran)
|
|
89
89
|
self.hbyDoer = habbing.HaberyDoer(habery=self.hby) # setup doer
|
|
90
90
|
notifier = Notifier(self.hby)
|
|
91
91
|
mux = grouping.Multiplexor(self.hby, notifier=notifier)
|
|
@@ -8,7 +8,7 @@ import argparse
|
|
|
8
8
|
import pysodium
|
|
9
9
|
from hio.base import doing
|
|
10
10
|
|
|
11
|
-
from keri.core import
|
|
11
|
+
from keri.core import signing
|
|
12
12
|
|
|
13
13
|
parser = argparse.ArgumentParser(description='Print a new random nonce')
|
|
14
14
|
parser.set_defaults(handler=lambda args: handler(args))
|
|
@@ -23,4 +23,4 @@ def nonce(tymth, tock=0.0):
|
|
|
23
23
|
"""
|
|
24
24
|
_ = (yield tock)
|
|
25
25
|
|
|
26
|
-
print(
|
|
26
|
+
print(signing.Salter().qb64)
|
|
@@ -151,7 +151,7 @@ class RotateDoer(doing.DoDoer):
|
|
|
151
151
|
|
|
152
152
|
self.hby = existing.setupHby(name=name, base=base, bran=bran)
|
|
153
153
|
self.hbyDoer = habbing.HaberyDoer(habery=self.hby) # setup doer
|
|
154
|
-
self.swain = delegating.Anchorer(hby=self.hby)
|
|
154
|
+
self.swain = delegating.Anchorer(hby=self.hby, proxy=self.hby.habByName(self.proxy))
|
|
155
155
|
self.postman = forwarding.Poster(hby=self.hby)
|
|
156
156
|
self.mbx = indirecting.MailboxDirector(hby=self.hby, topics=['/receipt', "/replay", "/reply"])
|
|
157
157
|
doers = [self.hbyDoer, self.mbx, self.swain, self.postman, doing.doify(self.rotateDo)]
|
|
@@ -198,7 +198,7 @@ class RotateDoer(doing.DoDoer):
|
|
|
198
198
|
auths[wit] = f"{code}#{helping.nowIso8601()}"
|
|
199
199
|
|
|
200
200
|
if hab.kever.delpre:
|
|
201
|
-
self.swain.delegation(pre=hab.pre, sn=hab.kever.sn
|
|
201
|
+
self.swain.delegation(pre=hab.pre, sn=hab.kever.sn)
|
|
202
202
|
print("Waiting for delegation approval...")
|
|
203
203
|
while not self.swain.complete(hab.kever.prefixer, coring.Seqner(sn=hab.kever.sn)):
|
|
204
204
|
yield self.tock
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
KERI
|
|
4
|
+
keri.kli.commands module
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
import argparse
|
|
8
|
+
|
|
9
|
+
from hio import help
|
|
10
|
+
from hio.base import doing
|
|
11
|
+
|
|
12
|
+
from keri.app import connecting, habbing, forwarding
|
|
13
|
+
from keri.app.cli.common import existing
|
|
14
|
+
from keri.core import eventing, serdering
|
|
15
|
+
|
|
16
|
+
logger = help.ogler.getLogger()
|
|
17
|
+
|
|
18
|
+
parser = argparse.ArgumentParser(description='Add AID or Alias to list of AIDs for a watcher to watch')
|
|
19
|
+
parser.set_defaults(handler=lambda args: add(args),
|
|
20
|
+
transferable=True)
|
|
21
|
+
parser.add_argument('--name', '-n', help='keystore name and file location of KERI keystore', required=True)
|
|
22
|
+
parser.add_argument('--alias', '-a', help='human readable alias for the identifier to whom the credential was issued',
|
|
23
|
+
required=True)
|
|
24
|
+
parser.add_argument('--base', '-b', help='additional optional prefix to file location of KERI keystore',
|
|
25
|
+
required=False, default="")
|
|
26
|
+
parser.add_argument('--passcode', '-p', help='22 character encryption passcode for keystore (is not saved)',
|
|
27
|
+
dest="bran", default=None) # passcode => bran
|
|
28
|
+
parser.add_argument("--watcher", '-w', help="the watcher AID or alias to add to", required=True)
|
|
29
|
+
parser.add_argument("--watched", '-W', help="the watched AID or alias to add")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def add(args):
|
|
33
|
+
""" Command line handler for adding an aid to a watcher's list of AIds to watch
|
|
34
|
+
|
|
35
|
+
Parameters:
|
|
36
|
+
args(Namespace): parsed command line arguments
|
|
37
|
+
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
ed = AddDoer(name=args.name,
|
|
41
|
+
alias=args.alias,
|
|
42
|
+
base=args.base,
|
|
43
|
+
bran=args.bran,
|
|
44
|
+
watcher=args.watcher,
|
|
45
|
+
watched=args.watched)
|
|
46
|
+
return [ed]
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class AddDoer(doing.DoDoer):
|
|
50
|
+
|
|
51
|
+
def __init__(self, name, alias, base, bran, watcher, watched):
|
|
52
|
+
self.hby = existing.setupHby(name=name, base=base, bran=bran)
|
|
53
|
+
self.hab = self.hby.habByName(alias)
|
|
54
|
+
self.org = connecting.Organizer(hby=self.hby)
|
|
55
|
+
|
|
56
|
+
if watcher in self.hby.kevers:
|
|
57
|
+
wat = watcher
|
|
58
|
+
else:
|
|
59
|
+
wat = self.org.find("alias", watcher)
|
|
60
|
+
if len(wat) != 1:
|
|
61
|
+
raise ValueError(f"invalid recipient {watcher}")
|
|
62
|
+
wat = wat[0]['id']
|
|
63
|
+
|
|
64
|
+
if not wat:
|
|
65
|
+
raise ValueError(f"unknown watcher {watcher}")
|
|
66
|
+
|
|
67
|
+
if watched in self.hby.kevers:
|
|
68
|
+
watd = watched
|
|
69
|
+
else:
|
|
70
|
+
watd = self.org.find("alias", watched)
|
|
71
|
+
if len(watd) != 1:
|
|
72
|
+
raise ValueError(f"invalid recipient {watched}")
|
|
73
|
+
watd = watd[0]['id']
|
|
74
|
+
|
|
75
|
+
if not watd:
|
|
76
|
+
raise ValueError(f"unknown watched {watched}")
|
|
77
|
+
|
|
78
|
+
self.watcher = wat
|
|
79
|
+
self.watched = watd
|
|
80
|
+
|
|
81
|
+
self.oobi = None
|
|
82
|
+
for (key,), obr in self.hby.db.roobi.getItemIter():
|
|
83
|
+
if obr.cid == watd:
|
|
84
|
+
self.oobi = key
|
|
85
|
+
|
|
86
|
+
if not self.oobi:
|
|
87
|
+
raise ValueError(f"no valid oobi for watched {self.watched}")
|
|
88
|
+
|
|
89
|
+
doers = [doing.doify(self.addDo)]
|
|
90
|
+
|
|
91
|
+
super(AddDoer, self).__init__(doers=doers)
|
|
92
|
+
|
|
93
|
+
def addDo(self, tymth, tock=0.0):
|
|
94
|
+
""" Grant credential by creating /ipex/grant exn message
|
|
95
|
+
|
|
96
|
+
Parameters:
|
|
97
|
+
tymth (function): injected function wrapper closure returned by .tymen() of
|
|
98
|
+
Tymist instance. Calling tymth() returns associated Tymist .tyme.
|
|
99
|
+
tock (float): injected initial tock value
|
|
100
|
+
|
|
101
|
+
Returns: doifiable Doist compatible generator method
|
|
102
|
+
|
|
103
|
+
"""
|
|
104
|
+
# enter context
|
|
105
|
+
self.wind(tymth)
|
|
106
|
+
self.tock = tock
|
|
107
|
+
_ = (yield self.tock)
|
|
108
|
+
|
|
109
|
+
if isinstance(self.hab, habbing.GroupHab):
|
|
110
|
+
raise ValueError("watchers for multisig AIDs not currently supported")
|
|
111
|
+
|
|
112
|
+
postman = forwarding.StreamPoster(hby=self.hby, hab=self.hab, recp=self.watcher, topic="reply")
|
|
113
|
+
for msg in self.hab.db.clonePreIter(pre=self.hab.pre):
|
|
114
|
+
serder = serdering.SerderKERI(raw=msg)
|
|
115
|
+
postman.send(serder=serder, attachment=msg[serder.size:])
|
|
116
|
+
|
|
117
|
+
data = dict(cid=self.hab.pre,
|
|
118
|
+
wid=self.watched,
|
|
119
|
+
oobi=self.oobi)
|
|
120
|
+
|
|
121
|
+
route = "/watcher/aid/add"
|
|
122
|
+
msg = self.hab.reply(route=route, data=data)
|
|
123
|
+
rpy = serdering.SerderKERI(raw=msg)
|
|
124
|
+
postman.send(serder=rpy, attachment=msg[rpy.size:])
|
|
125
|
+
|
|
126
|
+
doer = doing.DoDoer(doers=postman.deliver())
|
|
127
|
+
self.extend([doer])
|
|
128
|
+
|
|
129
|
+
while not doer.done:
|
|
130
|
+
yield self.tock
|
|
131
|
+
|
|
132
|
+
print(f"Request to add {self.watched} to watcher {self.watcher} submitted.")
|
|
@@ -35,7 +35,10 @@ parser.add_argument("--witness", '-w', help="the witness AID or alias to authent
|
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
def auth(args):
|
|
38
|
-
""" Command line
|
|
38
|
+
""" Command line handler for authenticating against a witness by retrieving the secret or a TOTP
|
|
39
|
+
|
|
40
|
+
Parameters:
|
|
41
|
+
args(Namespace): parsed command line arguments
|
|
39
42
|
|
|
40
43
|
"""
|
|
41
44
|
|
|
@@ -65,7 +68,7 @@ class AuthDoer(doing.DoDoer):
|
|
|
65
68
|
if not wit:
|
|
66
69
|
raise ValueError(f"unknown witness {witness}")
|
|
67
70
|
|
|
68
|
-
self.witness =
|
|
71
|
+
self.witness = wit
|
|
69
72
|
self.clienter = httping.Clienter()
|
|
70
73
|
doers = [doing.doify(self.authDo), self.clienter]
|
|
71
74
|
|
|
@@ -47,50 +47,30 @@ class Anchorer(doing.DoDoer):
|
|
|
47
47
|
self.proxy = proxy
|
|
48
48
|
|
|
49
49
|
super(Anchorer, self).__init__(doers=[self.witq, self.witDoer, self.postman, doing.doify(self.escrowDo)],
|
|
50
|
-
|
|
50
|
+
**kwa)
|
|
51
51
|
|
|
52
52
|
def delegation(self, pre, sn=None, proxy=None):
|
|
53
53
|
if pre not in self.hby.habs:
|
|
54
54
|
raise kering.ValidationError(f"{pre} is not a valid local AID for delegation")
|
|
55
55
|
|
|
56
|
+
if proxy is not None:
|
|
57
|
+
self.proxy = proxy
|
|
58
|
+
|
|
56
59
|
# load the hab of the delegated identifier to anchor
|
|
57
60
|
hab = self.hby.habs[pre]
|
|
58
61
|
delpre = hab.kever.delpre # get the delegator identifier
|
|
59
62
|
if delpre not in hab.kevers:
|
|
60
63
|
raise kering.ValidationError(f"delegator {delpre} not found, unable to process delegation")
|
|
61
64
|
|
|
62
|
-
dkever = hab.kevers[delpre] # and the delegator's kever
|
|
63
65
|
sn = sn if sn is not None else hab.kever.sner.num
|
|
64
66
|
|
|
65
67
|
# load the event and signatures
|
|
66
68
|
evt = hab.makeOwnEvent(sn=sn)
|
|
67
69
|
|
|
68
|
-
smids = []
|
|
69
|
-
if isinstance(hab, GroupHab):
|
|
70
|
-
phab = hab.mhab
|
|
71
|
-
smids = hab.smids
|
|
72
|
-
elif proxy is not None:
|
|
73
|
-
phab = proxy
|
|
74
|
-
elif hab.kever.sn > 0:
|
|
75
|
-
phab = hab
|
|
76
|
-
elif self.proxy is not None:
|
|
77
|
-
phab = self.proxy
|
|
78
|
-
else:
|
|
79
|
-
raise kering.ValidationError("no proxy to send messages for delegation")
|
|
80
|
-
|
|
81
70
|
# Send exn message for notification purposes
|
|
82
|
-
exn, atc = delegateRequestExn(phab, delpre=delpre, evt=bytes(evt), aids=smids)
|
|
83
|
-
|
|
84
|
-
self.postman.send(hab=phab, dest=hab.kever.delpre, topic="delegate", serder=exn, attachment=atc)
|
|
85
|
-
|
|
86
71
|
srdr = serdering.SerderKERI(raw=evt)
|
|
87
|
-
|
|
88
|
-
self.
|
|
89
|
-
|
|
90
|
-
seal = dict(i=srdr.pre, s=srdr.snh, d=srdr.said)
|
|
91
|
-
self.witq.query(hab=phab, pre=dkever.prefixer.qb64, anchor=seal)
|
|
92
|
-
|
|
93
|
-
self.hby.db.dune.pin(keys=(srdr.pre, srdr.said), val=srdr)
|
|
72
|
+
self.witDoer.msgs.append(dict(pre=pre, sn=srdr.sn))
|
|
73
|
+
self.hby.db.dpwe.pin(keys=(srdr.pre, srdr.said), val=srdr)
|
|
94
74
|
|
|
95
75
|
def complete(self, prefixer, seqner, saider=None):
|
|
96
76
|
""" Check for completed delegation protocol for the specific event
|
|
@@ -139,8 +119,8 @@ class Anchorer(doing.DoDoer):
|
|
|
139
119
|
yield 0.5
|
|
140
120
|
|
|
141
121
|
def processEscrows(self):
|
|
142
|
-
self.processUnanchoredEscrow()
|
|
143
122
|
self.processPartialWitnessEscrow()
|
|
123
|
+
self.processUnanchoredEscrow()
|
|
144
124
|
|
|
145
125
|
def processUnanchoredEscrow(self):
|
|
146
126
|
"""
|
|
@@ -159,11 +139,10 @@ class Anchorer(doing.DoDoer):
|
|
|
159
139
|
couple = seqner.qb64b + dserder.saidb
|
|
160
140
|
dgkey = dbing.dgKey(kever.prefixer.qb64b, kever.serder.saidb)
|
|
161
141
|
self.hby.db.setAes(dgkey, couple) # authorizer event seal (delegator/issuer)
|
|
162
|
-
self.witDoer.msgs.append(dict(pre=pre, sn=serder.sn))
|
|
163
142
|
|
|
164
143
|
# Move to escrow waiting for witness receipts
|
|
165
|
-
logger.info(f"
|
|
166
|
-
self.hby.db.
|
|
144
|
+
logger.info(f"Delegation approval received, {serder.pre} confirmed")
|
|
145
|
+
self.hby.db.cdel.put(keys=(pre, coring.Seqner(sn=serder.sn).qb64), val=coring.Saider(qb64=serder.said))
|
|
167
146
|
self.hby.db.dune.rem(keys=(pre, said))
|
|
168
147
|
|
|
169
148
|
def processPartialWitnessEscrow(self):
|
|
@@ -188,9 +167,33 @@ class Anchorer(doing.DoDoer):
|
|
|
188
167
|
witnessed = True
|
|
189
168
|
if not witnessed:
|
|
190
169
|
continue
|
|
191
|
-
logger.info(f"Witness receipts complete,
|
|
170
|
+
logger.info(f"Witness receipts complete, waiting for delegation approval.")
|
|
171
|
+
hab = self.hby.habs[pre]
|
|
172
|
+
delpre = hab.kever.delpre # get the delegator identifier
|
|
173
|
+
dkever = hab.kevers[delpre] # and the delegator's kever
|
|
174
|
+
smids = []
|
|
175
|
+
if isinstance(hab, GroupHab):
|
|
176
|
+
phab = hab.mhab
|
|
177
|
+
smids = hab.smids
|
|
178
|
+
elif self.proxy is not None:
|
|
179
|
+
phab = self.proxy
|
|
180
|
+
else:
|
|
181
|
+
raise kering.ValidationError("no proxy to send messages for delegation")
|
|
182
|
+
|
|
183
|
+
evt = hab.db.cloneEvtMsg(pre=serder.pre, fn=0, dig=serder.said)
|
|
184
|
+
exn, atc = delegateRequestExn(phab, delpre=delpre, evt=bytes(evt), aids=smids)
|
|
185
|
+
|
|
186
|
+
self.postman.send(hab=phab, dest=hab.kever.delpre, topic="delegate", serder=exn, attachment=atc)
|
|
187
|
+
|
|
188
|
+
srdr = serdering.SerderKERI(raw=evt)
|
|
189
|
+
del evt[:srdr.size]
|
|
190
|
+
self.postman.send(hab=phab, dest=delpre, topic="delegate", serder=srdr, attachment=evt)
|
|
191
|
+
|
|
192
|
+
seal = dict(i=srdr.pre, s=srdr.snh, d=srdr.said)
|
|
193
|
+
self.witq.query(hab=phab, pre=dkever.prefixer.qb64, anchor=seal)
|
|
194
|
+
|
|
192
195
|
self.hby.db.dpwe.rem(keys=(pre, said))
|
|
193
|
-
self.hby.db.
|
|
196
|
+
self.hby.db.dune.pin(keys=(srdr.pre, srdr.said), val=srdr)
|
|
194
197
|
|
|
195
198
|
|
|
196
199
|
def loadHandlers(hby, exc, notifier):
|