keri 1.2.0.dev2__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.dev2/src/keri.egg-info → keri-1.2.0.dev3}/PKG-INFO +1 -1
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/setup.py +1 -1
- keri-1.2.0.dev3/src/keri/__init__.py +5 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/delegate/confirm.py +5 -11
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/incept.py +6 -7
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/join.py +38 -27
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/rotate.py +5 -5
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/rotate.py +2 -2
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/delegating.py +35 -32
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/grouping.py +1 -5
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/__init__.py +1 -2
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/eventing.py +13 -42
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/parsing.py +2 -2
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/signing.py +0 -38
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/db/basing.py +1 -4
- {keri-1.2.0.dev2 → keri-1.2.0.dev3/src/keri.egg-info}/PKG-INFO +1 -1
- keri-1.2.0.dev2/src/keri/__init__.py +0 -5
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/LICENSE +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/README.md +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/setup.cfg +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/agenting.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/apping.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/challenging.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/challenge/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/challenge/generate.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/challenge/respond.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/challenge/verify.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/clean.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/contacts/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/contacts/list.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/decrypt.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/delegate/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/delegate/request.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/did/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/did/generate.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ends/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ends/add.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ends/export.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ends/list.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/escrow.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/export.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/init.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/interact.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/admit.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/agree.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/apply.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/grant.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/join.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/list.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/offer.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/spurn.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/kevers.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/list.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/local/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/local/watch.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/mailbox/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/mailbox/debug.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/mailbox/update.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate/list.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate/run.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate/show.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/continue.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/demo.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/incept.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/interact.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/notice.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/shell.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/update.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/nonce.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/oobi/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/oobi/clean.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/oobi/generate.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/oobi/resolve.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/passcode/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/passcode/generate.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/passcode/remove.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/passcode/set.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/query.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/rename.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/rollback.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/saidify.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/salt.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/sign.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ssh/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ssh/export.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/status.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/time.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/create.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/export.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/list.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/registry/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/registry/incept.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/registry/list.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/registry/status.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/revoke.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/verify.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/version.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/watcher/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/watcher/add.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/authenticate.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/demo.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/start.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/submit.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/common/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/common/config.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/common/displaying.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/common/existing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/common/incepting.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/common/rotating.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/common/terming.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/kli.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/configing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/connecting.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/directing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/forwarding.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/habbing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/httping.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/indirecting.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/keeping.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/notifying.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/oobiing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/querying.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/signaling.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/signing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/specing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/storing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/coring.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/counting.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/indexing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/routing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/scheming.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/serdering.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/streaming.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/structing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/db/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/db/dbing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/db/escrowing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/db/koming.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/db/migrations/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/db/migrations/rekey_habs.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/db/subing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/demo/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/demo/demo_bob.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/demo/demo_eve.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/demo/demo_kev.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/demo/demo_sam.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/demo/demoing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/end/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/end/ending.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/end/priming.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/help/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/help/helping.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/kering.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/peer/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/peer/exchanging.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vc/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vc/protocoling.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vc/proving.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vc/walleting.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vdr/__init__.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vdr/credentialing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vdr/eventing.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vdr/verifying.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vdr/viring.py +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri.egg-info/SOURCES.txt +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri.egg-info/dependency_links.txt +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri.egg-info/entry_points.txt +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri.egg-info/not-zip-safe +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri.egg-info/requires.txt +0 -0
- {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri.egg-info/top_level.txt +0 -0
- {keri-1.2.0.dev2 → 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
|
|
@@ -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)
|
|
@@ -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
|
|
@@ -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):
|
|
@@ -47,11 +47,7 @@ class Counselor(doing.DoDoer):
|
|
|
47
47
|
saider (Saider): saider of event of group identifier
|
|
48
48
|
|
|
49
49
|
"""
|
|
50
|
-
|
|
51
|
-
serder = serdering.SerderKERI(raw=evt)
|
|
52
|
-
del evt[:serder.size]
|
|
53
|
-
|
|
54
|
-
logger.info(f"Waiting for other signatures for {serder.pre}:{seqner.sn}...")
|
|
50
|
+
print(f"Waiting for other signatures for {prefixer.qb64}:{seqner.sn}...")
|
|
55
51
|
return self.hby.db.gpse.add(keys=(prefixer.qb64,), val=(seqner, saider))
|
|
56
52
|
|
|
57
53
|
def complete(self, prefixer, seqner, saider=None):
|
|
@@ -14,5 +14,4 @@ from .coring import (Matter, MtrDex, Number, NumDex, Dater, Texter,
|
|
|
14
14
|
|
|
15
15
|
from .coring import Tholder
|
|
16
16
|
from .indexing import Indexer, Siger, IdrDex, IdxSigDex
|
|
17
|
-
from .signing import (Signer, Salter, Cipher, Encrypter, Decrypter,
|
|
18
|
-
generateSigners, )
|
|
17
|
+
from .signing import (Signer, Salter, Cipher, Encrypter, Decrypter, )
|
|
@@ -1709,7 +1709,6 @@ class Kever:
|
|
|
1709
1709
|
pre = pre if pre is not None else self.prefixer.qb64
|
|
1710
1710
|
return pre in self.groups # groups
|
|
1711
1711
|
|
|
1712
|
-
|
|
1713
1712
|
def locallyContributedIndices(self, verfers: list[Verfer]):
|
|
1714
1713
|
"""Returns list of indices of public keys contributed by local members
|
|
1715
1714
|
to the KEL with current signing keys represented by verfers
|
|
@@ -1723,19 +1722,11 @@ class Kever:
|
|
|
1723
1722
|
indices list[int]: list of indices of keys contributed by local members
|
|
1724
1723
|
|
|
1725
1724
|
"""
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
for i, verfer in enumerate(verfers):
|
|
1729
|
-
if (couples := self.pubs.get(keys=(verfer.qb64,))) is None:
|
|
1730
|
-
continue
|
|
1731
|
-
|
|
1732
|
-
for (prefixer, seqner) in couples:
|
|
1733
|
-
if self.locallyOwned(prefixer.qb64): # only member not group aid
|
|
1734
|
-
indices.append(i)
|
|
1735
|
-
break # only need one local member to exclude signature
|
|
1736
|
-
|
|
1737
|
-
return indices
|
|
1725
|
+
habord = self.db.habs.get(keys=(self.prefixer.qb64,))
|
|
1726
|
+
kever = self.kevers[habord.mid]
|
|
1738
1727
|
|
|
1728
|
+
idx = [verfer.qb64 for verfer in verfers].index(kever.verfers[0].qb64)
|
|
1729
|
+
return [idx]
|
|
1739
1730
|
|
|
1740
1731
|
def reload(self, state):
|
|
1741
1732
|
"""
|
|
@@ -2227,13 +2218,15 @@ class Kever:
|
|
|
2227
2218
|
# compromised signature remotely to satisfy threshold.
|
|
2228
2219
|
|
|
2229
2220
|
if not local and self.locallyMembered(): # is this Kever's pre a local group
|
|
2230
|
-
if
|
|
2221
|
+
if indices := self.locallyContributedIndices(verfers):
|
|
2231
2222
|
for siger in list(sigers): # copy so clean del on original elements
|
|
2232
2223
|
if siger.index in indices:
|
|
2233
|
-
|
|
2234
|
-
self.cues
|
|
2235
|
-
|
|
2236
|
-
|
|
2224
|
+
sigers.remove(siger)
|
|
2225
|
+
if self.cues:
|
|
2226
|
+
self.cues.push(dict(kin="remoteMemberedSig",
|
|
2227
|
+
serder=serder,
|
|
2228
|
+
index=siger.index))
|
|
2229
|
+
|
|
2237
2230
|
|
|
2238
2231
|
# get unique verified sigers and indices lists from sigers list
|
|
2239
2232
|
sigers, indices = verifySigs(raw=serder.raw, sigers=sigers, verfers=verfers)
|
|
@@ -2255,7 +2248,6 @@ class Kever:
|
|
|
2255
2248
|
f"or locally witnessed event"
|
|
2256
2249
|
f" = {serder.ked}.")
|
|
2257
2250
|
|
|
2258
|
-
|
|
2259
2251
|
werfers = [Verfer(qb64=wit) for wit in wits] # get witness public key verifiers
|
|
2260
2252
|
# get unique verified wigers and windices lists from wigers list
|
|
2261
2253
|
wigers, windices = verifySigs(raw=serder.raw, sigers=wigers, verfers=werfers)
|
|
@@ -2270,6 +2262,7 @@ class Kever:
|
|
|
2270
2262
|
f" on sigs for {[siger.qb64 for siger in sigers]}"
|
|
2271
2263
|
f" for evt = {serder.ked}.")
|
|
2272
2264
|
|
|
2265
|
+
|
|
2273
2266
|
# escrow if not fully signed vs prior next rotation threshold
|
|
2274
2267
|
if serder.ilk in (Ilks.rot, Ilks.drt): # rotation so check prior next threshold
|
|
2275
2268
|
# prior next threshold in .ntholder and digers in .ndigers
|
|
@@ -2306,7 +2299,7 @@ class Kever:
|
|
|
2306
2299
|
|
|
2307
2300
|
# short circuit witness validation when either locallyOwned or locallyWitnessed
|
|
2308
2301
|
# otherwise must validate fully witnessed
|
|
2309
|
-
if not (self.locallyOwned() or self.locallyWitnessed(wits=wits)):
|
|
2302
|
+
if not (self.locallyOwned() or self.locallyMembered() or self.locallyWitnessed(wits=wits)):
|
|
2310
2303
|
if wits: # is witnessed
|
|
2311
2304
|
if toader.num < 1 or toader.num > len(wits): # out of bounds toad
|
|
2312
2305
|
raise ValidationError(f"Invalid toad = {toader.num} for wits = {wits}")
|
|
@@ -2639,38 +2632,16 @@ class Kever:
|
|
|
2639
2632
|
f" delegation by {delpre} of"
|
|
2640
2633
|
f"event = {serder.ked}.")
|
|
2641
2634
|
|
|
2642
|
-
# ToDo XXXX This logic moves to the Delegable escrow processing
|
|
2643
|
-
# ToDo XXXX create process escrow for delegable events "dees."
|
|
2644
|
-
#in order to get delegator approval
|
|
2645
|
-
# any virtual delegation or sandboxing logic happens there
|
|
2646
|
-
# create virtual anchor seal so local delegator can evaluate
|
|
2647
|
-
# superseding logic with provisional virtual seal
|
|
2648
|
-
#dkever = self.kevers[delpre]
|
|
2649
|
-
#dseal = SealEvent(i=serder.pre, s=serder.snh, d=serder.said)
|
|
2650
|
-
#dserder = interact(pre=dkever.prefixer.qb64,
|
|
2651
|
-
#dig=dkever.serder.said,
|
|
2652
|
-
#sn=dkever.sner.num + 1,
|
|
2653
|
-
#data=[dseal._asdict()])
|
|
2654
|
-
#delseqner = coring.Seqner(snh=dserder.snh)
|
|
2655
|
-
#delsaider = coring.Saider(qb64=dserder.said)
|
|
2656
|
-
# ToDo XXXX need to cue task here to approve delegation by generating
|
|
2657
|
-
# an anchoring SealEvent of serder in delegators KEL
|
|
2658
|
-
# may include MFA and or business logic for the delegator i.e. is local
|
|
2659
|
-
# event that designates this controller as delegator triggers
|
|
2660
|
-
# this cue to approave delegation
|
|
2661
2635
|
#self.cues.push(dict(kin="approveDelegation",
|
|
2662
2636
|
#delegator=kever.delpre,
|
|
2663
2637
|
#serder=serder))
|
|
2664
2638
|
|
|
2665
|
-
|
|
2666
2639
|
else: # not local delegator so escrow
|
|
2667
2640
|
self.escrowPSEvent(serder=serder, sigers=sigers, wigers=wigers, local=local)
|
|
2668
2641
|
raise MissingDelegationError(f"No delegation seal for delegator "
|
|
2669
2642
|
"{delpre} of evt = {serder.ked}.")
|
|
2670
2643
|
|
|
2671
|
-
#ssn = validateSN(sn=delseqner.snh, inceptive=False) # delseqner Number should already do this
|
|
2672
2644
|
ssn = Number(num=delseqner.sn).validate(inceptive=False).sn
|
|
2673
|
-
#ssn = sner.num sner is Number seqner is Seqner
|
|
2674
2645
|
# ToDo XXXX need to replace Seqners with Numbers
|
|
2675
2646
|
|
|
2676
2647
|
# get the dig of the delegating event. Using getKeLast ensures delegating
|
|
@@ -994,10 +994,10 @@ class Parser:
|
|
|
994
994
|
|
|
995
995
|
if cigars:
|
|
996
996
|
kvy.processAttachedReceiptCouples(serder, cigars,
|
|
997
|
-
|
|
997
|
+
firner=firner, local=local)
|
|
998
998
|
if trqs:
|
|
999
999
|
kvy.processAttachedReceiptQuadruples(serder, trqs,
|
|
1000
|
-
|
|
1000
|
+
firner=firner, local=local)
|
|
1001
1001
|
|
|
1002
1002
|
except AttributeError as ex:
|
|
1003
1003
|
raise kering.ValidationError("No kevery to process so dropped msg"
|
|
@@ -25,44 +25,6 @@ ECDSA_256r1_SEEDBYTES = 32
|
|
|
25
25
|
ECDSA_256k1_SEEDBYTES = 32
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
# deprecated use Salter.signers instead
|
|
29
|
-
def generateSigners(raw=None, count=8, transferable=True):
|
|
30
|
-
"""Returns list of Signers for Ed25519
|
|
31
|
-
|
|
32
|
-
Deprecated, use Salter.signers instead.
|
|
33
|
-
|
|
34
|
-
Use this when simply need valid AIDs but not when need valid controller
|
|
35
|
-
contexts. In the latter case use openHby or openHab which create databases.
|
|
36
|
-
|
|
37
|
-
Parameters:
|
|
38
|
-
raw (bytes): 16 byte long salt cryptomatter from which seeds
|
|
39
|
-
for Signers in list are derived
|
|
40
|
-
random salt created if not provided
|
|
41
|
-
count is number of signers in list
|
|
42
|
-
transferable is boolean true means signer.verfer code is transferable
|
|
43
|
-
non-transferable otherwise
|
|
44
|
-
"""
|
|
45
|
-
if not raw:
|
|
46
|
-
raw = pysodium.randombytes(pysodium.crypto_pwhash_SALTBYTES)
|
|
47
|
-
|
|
48
|
-
signers = []
|
|
49
|
-
for i in range(count):
|
|
50
|
-
path = f"{i:x}"
|
|
51
|
-
# algorithm default is argon2id
|
|
52
|
-
seed = pysodium.crypto_pwhash(outlen=32,
|
|
53
|
-
passwd=path,
|
|
54
|
-
salt=raw,
|
|
55
|
-
opslimit=2, # pysodium.crypto_pwhash_OPSLIMIT_INTERACTIVE,
|
|
56
|
-
memlimit=67108864, # pysodium.crypto_pwhash_MEMLIMIT_INTERACTIVE,
|
|
57
|
-
alg=pysodium.crypto_pwhash_ALG_ARGON2ID13)
|
|
58
|
-
|
|
59
|
-
signers.append(Signer(raw=seed, transferable=transferable))
|
|
60
|
-
|
|
61
|
-
return signers
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
28
|
class Signer(Matter):
|
|
67
29
|
"""
|
|
68
30
|
Signer is Matter subclass with method to create signature of serialization
|
|
@@ -949,7 +949,7 @@ class Baser(dbing.LMDBer):
|
|
|
949
949
|
self.misfits = subing.IoSetSuber(db=self, subkey='mfes.')
|
|
950
950
|
|
|
951
951
|
# delegable events escrows. events with local delegator that need approval
|
|
952
|
-
self.delegables = subing.
|
|
952
|
+
self.delegables = subing.IoSetSuber(db=self, subkey='dees.')
|
|
953
953
|
|
|
954
954
|
# events as ordered by first seen ordinals
|
|
955
955
|
self.fons = subing.CesrSuber(db=self, subkey='fons.', klas=core.Number)
|
|
@@ -1500,9 +1500,6 @@ class Baser(dbing.LMDBer):
|
|
|
1500
1500
|
atc.extend(coring.Counter(code=coring.CtrDex.SealSourceCouples,
|
|
1501
1501
|
count=1).qb64b)
|
|
1502
1502
|
atc.extend(couple)
|
|
1503
|
-
elif self.kevers[pre].delegated:
|
|
1504
|
-
if coring.SerderKERI(raw=raw).estive:
|
|
1505
|
-
raise kering.MissingEntryError("Missing delegator anchor seal for dig={}.".format(dig))
|
|
1506
1503
|
|
|
1507
1504
|
# add trans endorsement quadruples to attachments not controller
|
|
1508
1505
|
# may have been originally key event attachments or receipted endorsements
|
|
File without changes
|
|
File without changes
|