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.
Files changed (180) hide show
  1. {keri-1.2.0.dev1/src/keri.egg-info → keri-1.2.0.dev3}/PKG-INFO +1 -1
  2. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/setup.py +1 -1
  3. keri-1.2.0.dev3/src/keri/__init__.py +5 -0
  4. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/delegate/confirm.py +5 -11
  5. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/incept.py +6 -7
  6. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/agree.py +2 -2
  7. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/apply.py +2 -2
  8. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/list.py +7 -0
  9. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/offer.py +2 -2
  10. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/join.py +38 -27
  11. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/rotate.py +5 -5
  12. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/nonce.py +2 -2
  13. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/rotate.py +2 -2
  14. keri-1.2.0.dev3/src/keri/app/cli/commands/watcher/__init__.py +6 -0
  15. keri-1.2.0.dev3/src/keri/app/cli/commands/watcher/add.py +132 -0
  16. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/authenticate.py +5 -2
  17. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/delegating.py +35 -32
  18. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/grouping.py +1 -5
  19. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/habbing.py +1 -1
  20. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/indirecting.py +7 -5
  21. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/oobiing.py +93 -4
  22. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/__init__.py +1 -5
  23. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/coring.py +25 -77
  24. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/counting.py +37 -6
  25. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/eventing.py +23 -59
  26. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/indexing.py +16 -1
  27. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/parsing.py +6 -6
  28. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/signing.py +0 -38
  29. keri-1.2.0.dev3/src/keri/core/streaming.py +391 -0
  30. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/structing.py +1 -0
  31. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/db/basing.py +1 -1
  32. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/db/escrowing.py +0 -2
  33. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/end/ending.py +4 -0
  34. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/help/helping.py +1 -1
  35. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/kering.py +10 -1
  36. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vdr/eventing.py +2 -1
  37. {keri-1.2.0.dev1 → keri-1.2.0.dev3/src/keri.egg-info}/PKG-INFO +1 -1
  38. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri.egg-info/SOURCES.txt +3 -0
  39. keri-1.2.0.dev1/src/keri/__init__.py +0 -5
  40. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/LICENSE +0 -0
  41. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/README.md +0 -0
  42. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/setup.cfg +0 -0
  43. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/__init__.py +0 -0
  44. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/agenting.py +0 -0
  45. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/apping.py +0 -0
  46. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/challenging.py +0 -0
  47. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/__init__.py +0 -0
  48. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/__init__.py +0 -0
  49. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/challenge/__init__.py +0 -0
  50. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/challenge/generate.py +0 -0
  51. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/challenge/respond.py +0 -0
  52. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/challenge/verify.py +0 -0
  53. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/clean.py +0 -0
  54. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/contacts/__init__.py +0 -0
  55. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/contacts/list.py +0 -0
  56. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/decrypt.py +0 -0
  57. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/delegate/__init__.py +0 -0
  58. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/delegate/request.py +0 -0
  59. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/did/__init__.py +0 -0
  60. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/did/generate.py +0 -0
  61. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ends/__init__.py +0 -0
  62. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ends/add.py +0 -0
  63. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ends/export.py +0 -0
  64. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ends/list.py +0 -0
  65. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/escrow.py +0 -0
  66. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/export.py +0 -0
  67. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/init.py +0 -0
  68. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/interact.py +0 -0
  69. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/__init__.py +0 -0
  70. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/admit.py +0 -0
  71. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/grant.py +0 -0
  72. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/join.py +0 -0
  73. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/spurn.py +0 -0
  74. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/kevers.py +0 -0
  75. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/list.py +0 -0
  76. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/local/__init__.py +0 -0
  77. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/local/watch.py +0 -0
  78. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/mailbox/__init__.py +0 -0
  79. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/mailbox/debug.py +0 -0
  80. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/mailbox/update.py +0 -0
  81. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate/__init__.py +0 -0
  82. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate/list.py +0 -0
  83. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate/run.py +0 -0
  84. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate/show.py +0 -0
  85. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate.py +0 -0
  86. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/__init__.py +0 -0
  87. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/continue.py +0 -0
  88. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/demo.py +0 -0
  89. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/incept.py +0 -0
  90. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/interact.py +0 -0
  91. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/notice.py +0 -0
  92. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/shell.py +0 -0
  93. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/update.py +0 -0
  94. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/oobi/__init__.py +0 -0
  95. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/oobi/clean.py +0 -0
  96. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/oobi/generate.py +0 -0
  97. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/oobi/resolve.py +0 -0
  98. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/passcode/__init__.py +0 -0
  99. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/passcode/generate.py +0 -0
  100. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/passcode/remove.py +0 -0
  101. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/passcode/set.py +0 -0
  102. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/query.py +0 -0
  103. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/rename.py +0 -0
  104. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/rollback.py +0 -0
  105. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/saidify.py +0 -0
  106. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/salt.py +0 -0
  107. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/sign.py +0 -0
  108. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ssh/__init__.py +0 -0
  109. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ssh/export.py +0 -0
  110. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/status.py +0 -0
  111. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/time.py +0 -0
  112. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/__init__.py +0 -0
  113. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/create.py +0 -0
  114. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/export.py +0 -0
  115. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/list.py +0 -0
  116. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/registry/__init__.py +0 -0
  117. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/registry/incept.py +0 -0
  118. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/registry/list.py +0 -0
  119. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/registry/status.py +0 -0
  120. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/revoke.py +0 -0
  121. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/verify.py +0 -0
  122. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/version.py +0 -0
  123. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/__init__.py +0 -0
  124. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/demo.py +0 -0
  125. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/start.py +0 -0
  126. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/submit.py +0 -0
  127. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/common/__init__.py +0 -0
  128. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/common/config.py +0 -0
  129. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/common/displaying.py +0 -0
  130. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/common/existing.py +0 -0
  131. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/common/incepting.py +0 -0
  132. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/common/rotating.py +0 -0
  133. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/common/terming.py +0 -0
  134. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/cli/kli.py +0 -0
  135. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/configing.py +0 -0
  136. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/connecting.py +0 -0
  137. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/directing.py +0 -0
  138. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/forwarding.py +0 -0
  139. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/httping.py +0 -0
  140. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/keeping.py +0 -0
  141. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/notifying.py +0 -0
  142. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/querying.py +0 -0
  143. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/signaling.py +0 -0
  144. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/signing.py +0 -0
  145. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/specing.py +0 -0
  146. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/app/storing.py +0 -0
  147. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/routing.py +0 -0
  148. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/scheming.py +0 -0
  149. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/core/serdering.py +0 -0
  150. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/db/__init__.py +0 -0
  151. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/db/dbing.py +0 -0
  152. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/db/koming.py +0 -0
  153. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/db/migrations/__init__.py +0 -0
  154. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/db/migrations/rekey_habs.py +0 -0
  155. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/db/subing.py +0 -0
  156. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/demo/__init__.py +0 -0
  157. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/demo/demo_bob.py +0 -0
  158. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/demo/demo_eve.py +0 -0
  159. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/demo/demo_kev.py +0 -0
  160. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/demo/demo_sam.py +0 -0
  161. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/demo/demoing.py +0 -0
  162. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/end/__init__.py +0 -0
  163. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/end/priming.py +0 -0
  164. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/help/__init__.py +0 -0
  165. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/peer/__init__.py +0 -0
  166. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/peer/exchanging.py +0 -0
  167. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vc/__init__.py +0 -0
  168. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vc/protocoling.py +0 -0
  169. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vc/proving.py +0 -0
  170. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vc/walleting.py +0 -0
  171. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vdr/__init__.py +0 -0
  172. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vdr/credentialing.py +0 -0
  173. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vdr/verifying.py +0 -0
  174. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri/vdr/viring.py +0 -0
  175. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri.egg-info/dependency_links.txt +0 -0
  176. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri.egg-info/entry_points.txt +0 -0
  177. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri.egg-info/not-zip-safe +0 -0
  178. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri.egg-info/requires.txt +0 -0
  179. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/src/keri.egg-info/top_level.txt +0 -0
  180. {keri-1.2.0.dev1 → keri-1.2.0.dev3}/tests/test_kering.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: keri
3
- Version: 1.2.0.dev1
3
+ Version: 1.2.0.dev3
4
4
  Summary: Key Event Receipt Infrastructure
5
5
  Home-page: https://github.com/WebOfTrust/keripy
6
6
  Author: Samuel M. Smith
@@ -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-dev1', # also change in src/keri/__init__.py
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",
@@ -0,0 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ __version__ = '1.2.0-dev3' # also change in setup.py
4
+
5
+
@@ -96,9 +96,8 @@ class ConfirmDoer(doing.DoDoer):
96
96
 
97
97
  while True:
98
98
  esc = self.escrowed()
99
- for ekey, edig in esc:
100
- pre, sn = dbing.splitKeySN(ekey) # get pre and sn from escrow item
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
- key = ekey = b'' # both start same. when not same means escrows found
217
- while True: # break when done
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, proxy=self.hby.habByName(self.proxy))
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 coring
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(coring.randomNonce())
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 coring
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(coring.randomNonce())
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 coring
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(coring.randomNonce())
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: confirm(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 confirm(args):
34
- """ Wait for and provide interactive confirmation of group multisig inception, rotation or interaction events
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 arguements namespace object
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
- confirmDoer = ConfirmDoer(name=name, base=base, bran=bran, auto=auto)
47
+ joinDoer = JoinDoer(name=name, base=base, bran=bran, group=group, auto=auto)
46
48
 
47
- doers = [confirmDoer]
49
+ doers = [joinDoer]
48
50
  return doers
49
51
 
50
52
 
51
- class ConfirmDoer(doing.DoDoer):
52
- """ Doist doer capable of polling for group multisig events and prompting user for action
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.confirmDo)])
96
+ doers.extend([doing.doify(self.joinDo)])
92
97
  self.auto = auto
93
- super(ConfirmDoer, self).__init__(doers=doers)
98
+ super(JoinDoer, self).__init__(doers=doers)
94
99
 
95
- def confirmDo(self, tymth, tock=0.0):
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
- """ Incept group multisig
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"] = eventing.TraitCodex.EstOnly in oicp.ked["c"]
181
- inits["DnD"] = eventing.TraitCodex.DoNotDelegate in oicp.ked["c"]
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
- alias = "test alias"
204
+ if self.group is None:
205
+ group = "default-group"
206
+ else:
207
+ group = self.group
200
208
  else:
201
209
  while True:
202
- alias = input(f"\nEnter alias for new AID: ")
203
- if self.hby.habByName(alias) is not None:
204
- print(f"AID alias {alias} is already in use, please try again")
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=alias, mhab=mhab,
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
- alias = "test alias"
404
+ if self.group is None:
405
+ group = "default-group"
406
+ else:
407
+ group = self.group
397
408
  else:
398
409
  while True:
399
- alias = input(f"\nEnter alias for new AID: ")
400
- if self.hby.habByName(alias) is not None:
401
- print(f"AID alias {alias} is already in use, please try again")
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=alias, mhab=mhab, smids=smids, rmids=rmids)
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(name=args.name, base=args.base, alias=args.alias, smids=args.smids, rmids=args.rmids,
58
- bran=args.bran, wits=args.witnesses, cuts=args.cuts, adds=args.witness_add,
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, name, base, bran, alias, smids=None, rmids=None, isith=None, nsith=None,
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 coring
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(coring.randomNonce())
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, proxy=self.hby.habByName(self.proxy))
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,6 @@
1
+ # -*- encoding: utf-8 -*-
2
+ """
3
+ KERI
4
+ keri.app.cli.commands.watcher Package
5
+ """
6
+
@@ -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 list credential registries handler
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 = 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
- **kwa)
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
- del evt[:srdr.size]
88
- self.postman.send(hab=phab, dest=delpre, topic="delegate", serder=srdr, attachment=evt)
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"Waiting for fully signed witness receipts for {serder.sn}")
166
- self.hby.db.dpwe.pin(keys=(pre, said), val=serder)
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, {pre} confirmed.")
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.cdel.put(keys=(pre, seqner.qb64), val=coring.Saider(qb64=serder.said))
196
+ self.hby.db.dune.pin(keys=(srdr.pre, srdr.said), val=srdr)
194
197
 
195
198
 
196
199
  def loadHandlers(hby, exc, notifier):