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.
Files changed (180) hide show
  1. {keri-1.2.0.dev2/src/keri.egg-info → keri-1.2.0.dev3}/PKG-INFO +1 -1
  2. {keri-1.2.0.dev2 → 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.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/delegate/confirm.py +5 -11
  5. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/incept.py +6 -7
  6. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/join.py +38 -27
  7. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/rotate.py +5 -5
  8. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/rotate.py +2 -2
  9. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/delegating.py +35 -32
  10. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/grouping.py +1 -5
  11. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/__init__.py +1 -2
  12. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/eventing.py +13 -42
  13. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/parsing.py +2 -2
  14. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/signing.py +0 -38
  15. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/db/basing.py +1 -4
  16. {keri-1.2.0.dev2 → keri-1.2.0.dev3/src/keri.egg-info}/PKG-INFO +1 -1
  17. keri-1.2.0.dev2/src/keri/__init__.py +0 -5
  18. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/LICENSE +0 -0
  19. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/README.md +0 -0
  20. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/setup.cfg +0 -0
  21. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/__init__.py +0 -0
  22. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/agenting.py +0 -0
  23. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/apping.py +0 -0
  24. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/challenging.py +0 -0
  25. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/__init__.py +0 -0
  26. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/__init__.py +0 -0
  27. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/challenge/__init__.py +0 -0
  28. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/challenge/generate.py +0 -0
  29. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/challenge/respond.py +0 -0
  30. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/challenge/verify.py +0 -0
  31. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/clean.py +0 -0
  32. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/contacts/__init__.py +0 -0
  33. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/contacts/list.py +0 -0
  34. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/decrypt.py +0 -0
  35. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/delegate/__init__.py +0 -0
  36. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/delegate/request.py +0 -0
  37. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/did/__init__.py +0 -0
  38. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/did/generate.py +0 -0
  39. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ends/__init__.py +0 -0
  40. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ends/add.py +0 -0
  41. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ends/export.py +0 -0
  42. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ends/list.py +0 -0
  43. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/escrow.py +0 -0
  44. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/export.py +0 -0
  45. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/init.py +0 -0
  46. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/interact.py +0 -0
  47. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/__init__.py +0 -0
  48. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/admit.py +0 -0
  49. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/agree.py +0 -0
  50. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/apply.py +0 -0
  51. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/grant.py +0 -0
  52. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/join.py +0 -0
  53. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/list.py +0 -0
  54. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/offer.py +0 -0
  55. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ipex/spurn.py +0 -0
  56. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/kevers.py +0 -0
  57. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/list.py +0 -0
  58. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/local/__init__.py +0 -0
  59. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/local/watch.py +0 -0
  60. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/mailbox/__init__.py +0 -0
  61. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/mailbox/debug.py +0 -0
  62. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/mailbox/update.py +0 -0
  63. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate/__init__.py +0 -0
  64. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate/list.py +0 -0
  65. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate/run.py +0 -0
  66. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate/show.py +0 -0
  67. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/migrate.py +0 -0
  68. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/__init__.py +0 -0
  69. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/continue.py +0 -0
  70. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/demo.py +0 -0
  71. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/incept.py +0 -0
  72. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/interact.py +0 -0
  73. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/notice.py +0 -0
  74. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/shell.py +0 -0
  75. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/multisig/update.py +0 -0
  76. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/nonce.py +0 -0
  77. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/oobi/__init__.py +0 -0
  78. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/oobi/clean.py +0 -0
  79. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/oobi/generate.py +0 -0
  80. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/oobi/resolve.py +0 -0
  81. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/passcode/__init__.py +0 -0
  82. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/passcode/generate.py +0 -0
  83. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/passcode/remove.py +0 -0
  84. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/passcode/set.py +0 -0
  85. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/query.py +0 -0
  86. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/rename.py +0 -0
  87. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/rollback.py +0 -0
  88. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/saidify.py +0 -0
  89. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/salt.py +0 -0
  90. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/sign.py +0 -0
  91. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ssh/__init__.py +0 -0
  92. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/ssh/export.py +0 -0
  93. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/status.py +0 -0
  94. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/time.py +0 -0
  95. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/__init__.py +0 -0
  96. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/create.py +0 -0
  97. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/export.py +0 -0
  98. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/list.py +0 -0
  99. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/registry/__init__.py +0 -0
  100. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/registry/incept.py +0 -0
  101. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/registry/list.py +0 -0
  102. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/registry/status.py +0 -0
  103. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/vc/revoke.py +0 -0
  104. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/verify.py +0 -0
  105. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/version.py +0 -0
  106. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/watcher/__init__.py +0 -0
  107. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/watcher/add.py +0 -0
  108. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/__init__.py +0 -0
  109. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/authenticate.py +0 -0
  110. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/demo.py +0 -0
  111. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/start.py +0 -0
  112. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/commands/witness/submit.py +0 -0
  113. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/common/__init__.py +0 -0
  114. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/common/config.py +0 -0
  115. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/common/displaying.py +0 -0
  116. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/common/existing.py +0 -0
  117. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/common/incepting.py +0 -0
  118. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/common/rotating.py +0 -0
  119. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/common/terming.py +0 -0
  120. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/cli/kli.py +0 -0
  121. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/configing.py +0 -0
  122. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/connecting.py +0 -0
  123. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/directing.py +0 -0
  124. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/forwarding.py +0 -0
  125. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/habbing.py +0 -0
  126. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/httping.py +0 -0
  127. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/indirecting.py +0 -0
  128. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/keeping.py +0 -0
  129. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/notifying.py +0 -0
  130. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/oobiing.py +0 -0
  131. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/querying.py +0 -0
  132. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/signaling.py +0 -0
  133. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/signing.py +0 -0
  134. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/specing.py +0 -0
  135. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/app/storing.py +0 -0
  136. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/coring.py +0 -0
  137. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/counting.py +0 -0
  138. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/indexing.py +0 -0
  139. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/routing.py +0 -0
  140. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/scheming.py +0 -0
  141. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/serdering.py +0 -0
  142. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/streaming.py +0 -0
  143. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/core/structing.py +0 -0
  144. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/db/__init__.py +0 -0
  145. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/db/dbing.py +0 -0
  146. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/db/escrowing.py +0 -0
  147. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/db/koming.py +0 -0
  148. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/db/migrations/__init__.py +0 -0
  149. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/db/migrations/rekey_habs.py +0 -0
  150. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/db/subing.py +0 -0
  151. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/demo/__init__.py +0 -0
  152. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/demo/demo_bob.py +0 -0
  153. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/demo/demo_eve.py +0 -0
  154. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/demo/demo_kev.py +0 -0
  155. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/demo/demo_sam.py +0 -0
  156. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/demo/demoing.py +0 -0
  157. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/end/__init__.py +0 -0
  158. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/end/ending.py +0 -0
  159. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/end/priming.py +0 -0
  160. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/help/__init__.py +0 -0
  161. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/help/helping.py +0 -0
  162. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/kering.py +0 -0
  163. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/peer/__init__.py +0 -0
  164. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/peer/exchanging.py +0 -0
  165. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vc/__init__.py +0 -0
  166. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vc/protocoling.py +0 -0
  167. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vc/proving.py +0 -0
  168. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vc/walleting.py +0 -0
  169. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vdr/__init__.py +0 -0
  170. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vdr/credentialing.py +0 -0
  171. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vdr/eventing.py +0 -0
  172. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vdr/verifying.py +0 -0
  173. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri/vdr/viring.py +0 -0
  174. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri.egg-info/SOURCES.txt +0 -0
  175. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri.egg-info/dependency_links.txt +0 -0
  176. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri.egg-info/entry_points.txt +0 -0
  177. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri.egg-info/not-zip-safe +0 -0
  178. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri.egg-info/requires.txt +0 -0
  179. {keri-1.2.0.dev2 → keri-1.2.0.dev3}/src/keri.egg-info/top_level.txt +0 -0
  180. {keri-1.2.0.dev2 → 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.dev2
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-dev2', # 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
@@ -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)
@@ -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
@@ -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):
@@ -47,11 +47,7 @@ class Counselor(doing.DoDoer):
47
47
  saider (Saider): saider of event of group identifier
48
48
 
49
49
  """
50
- evt = ghab.makeOwnEvent(sn=seqner.sn, allowPartiallySigned=True)
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
- indices = []
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 (indices := self.locallyContributedIndices(verfers)):
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
- del sigers[siger.index]
2234
- self.cues.push(dict(kin="remoteMemberedSig",
2235
- serder=serder,
2236
- index=siger.index))
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
- firner=firner, local=local)
997
+ firner=firner, local=local)
998
998
  if trqs:
999
999
  kvy.processAttachedReceiptQuadruples(serder, trqs,
1000
- firner=firner, local=local)
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.CesrIoSetSuber(db=self, subkey='dees.', klas=coring.Diger)
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: keri
3
- Version: 1.2.0.dev2
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
@@ -1,5 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- __version__ = '1.2.0-dev2' # also change in setup.py
4
-
5
-
File without changes
File without changes