@enbox/dwn-sdk-js 0.0.6 → 0.0.8
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.
- package/dist/browser.mjs +8 -8
- package/dist/browser.mjs.map +4 -4
- package/dist/esm/generated/precompiled-validators.js +762 -911
- package/dist/esm/generated/precompiled-validators.js.map +1 -1
- package/dist/esm/src/core/abstract-message.js +4 -0
- package/dist/esm/src/core/abstract-message.js.map +1 -1
- package/dist/esm/src/core/auth.js +22 -33
- package/dist/esm/src/core/auth.js.map +1 -1
- package/dist/esm/src/core/constants.js +11 -0
- package/dist/esm/src/core/constants.js.map +1 -0
- package/dist/esm/src/core/core-protocol.js +44 -0
- package/dist/esm/src/core/core-protocol.js.map +1 -0
- package/dist/esm/src/core/dwn-constant.js +7 -7
- package/dist/esm/src/core/dwn-constant.js.map +1 -1
- package/dist/esm/src/core/dwn-error.js +10 -12
- package/dist/esm/src/core/dwn-error.js.map +1 -1
- package/dist/esm/src/core/grant-authorization.js +50 -52
- package/dist/esm/src/core/grant-authorization.js.map +1 -1
- package/dist/esm/src/core/message.js +85 -116
- package/dist/esm/src/core/message.js.map +1 -1
- package/dist/esm/src/core/messages-grant-authorization.js +63 -78
- package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization-action.js +266 -0
- package/dist/esm/src/core/protocol-authorization-action.js.map +1 -0
- package/dist/esm/src/core/protocol-authorization-validation.js +321 -0
- package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -0
- package/dist/esm/src/core/protocol-authorization.js +144 -741
- package/dist/esm/src/core/protocol-authorization.js.map +1 -1
- package/dist/esm/src/core/protocols-grant-authorization.js +24 -38
- package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/record-chain.js +64 -0
- package/dist/esm/src/core/record-chain.js.map +1 -0
- package/dist/esm/src/core/records-grant-authorization.js +53 -72
- package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/resumable-task-manager.js +50 -65
- package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
- package/dist/esm/src/core/tenant-gate.js +2 -13
- package/dist/esm/src/core/tenant-gate.js.map +1 -1
- package/dist/esm/src/dwn.js +108 -101
- package/dist/esm/src/dwn.js.map +1 -1
- package/dist/esm/src/event-stream/event-emitter-event-log.js +204 -0
- package/dist/esm/src/event-stream/event-emitter-event-log.js.map +1 -0
- package/dist/esm/src/handlers/messages-read.js +67 -81
- package/dist/esm/src/handlers/messages-read.js.map +1 -1
- package/dist/esm/src/handlers/messages-subscribe.js +51 -63
- package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/messages-sync.js +75 -89
- package/dist/esm/src/handlers/messages-sync.js.map +1 -1
- package/dist/esm/src/handlers/protocols-configure.js +153 -163
- package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
- package/dist/esm/src/handlers/protocols-query.js +52 -55
- package/dist/esm/src/handlers/protocols-query.js.map +1 -1
- package/dist/esm/src/handlers/records-count.js +97 -85
- package/dist/esm/src/handlers/records-count.js.map +1 -1
- package/dist/esm/src/handlers/records-delete.js +75 -93
- package/dist/esm/src/handlers/records-delete.js.map +1 -1
- package/dist/esm/src/handlers/records-query.js +116 -105
- package/dist/esm/src/handlers/records-query.js.map +1 -1
- package/dist/esm/src/handlers/records-read.js +130 -132
- package/dist/esm/src/handlers/records-read.js.map +1 -1
- package/dist/esm/src/handlers/records-subscribe.js +164 -104
- package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/records-write.js +213 -280
- package/dist/esm/src/handlers/records-write.js.map +1 -1
- package/dist/esm/src/index.js +5 -2
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/interfaces/messages-read.js +24 -32
- package/dist/esm/src/interfaces/messages-read.js.map +1 -1
- package/dist/esm/src/interfaces/messages-subscribe.js +28 -41
- package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/messages-sync.js +26 -40
- package/dist/esm/src/interfaces/messages-sync.js.map +1 -1
- package/dist/esm/src/interfaces/protocols-configure.js +87 -65
- package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
- package/dist/esm/src/interfaces/protocols-query.js +55 -68
- package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-count.js +50 -66
- package/dist/esm/src/interfaces/records-count.js.map +1 -1
- package/dist/esm/src/interfaces/records-delete.js +45 -55
- package/dist/esm/src/interfaces/records-delete.js.map +1 -1
- package/dist/esm/src/interfaces/records-query.js +60 -76
- package/dist/esm/src/interfaces/records-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-read.js +51 -67
- package/dist/esm/src/interfaces/records-read.js.map +1 -1
- package/dist/esm/src/interfaces/records-subscribe.js +53 -68
- package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/records-write-query.js +102 -0
- package/dist/esm/src/interfaces/records-write-query.js.map +1 -0
- package/dist/esm/src/interfaces/records-write-signing.js +81 -0
- package/dist/esm/src/interfaces/records-write-signing.js.map +1 -0
- package/dist/esm/src/interfaces/records-write.js +396 -610
- package/dist/esm/src/interfaces/records-write.js.map +1 -1
- package/dist/esm/src/jose/algorithms/signing/ed25519.js +10 -19
- package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -1
- package/dist/esm/src/jose/jws/general/builder.js +23 -35
- package/dist/esm/src/jose/jws/general/builder.js.map +1 -1
- package/dist/esm/src/jose/jws/general/verifier.js +56 -69
- package/dist/esm/src/jose/jws/general/verifier.js.map +1 -1
- package/dist/esm/src/protocols/permission-grant.js +43 -14
- package/dist/esm/src/protocols/permission-grant.js.map +1 -1
- package/dist/esm/src/protocols/permission-request.js +28 -14
- package/dist/esm/src/protocols/permission-request.js.map +1 -1
- package/dist/esm/src/protocols/permissions.js +325 -227
- package/dist/esm/src/protocols/permissions.js.map +1 -1
- package/dist/esm/src/smt/smt-store-level.js +42 -64
- package/dist/esm/src/smt/smt-store-level.js.map +1 -1
- package/dist/esm/src/smt/smt-store-memory.js +19 -45
- package/dist/esm/src/smt/smt-store-memory.js.map +1 -1
- package/dist/esm/src/smt/smt-utils.js +28 -45
- package/dist/esm/src/smt/smt-utils.js.map +1 -1
- package/dist/esm/src/smt/sparse-merkle-tree.js +426 -471
- package/dist/esm/src/smt/sparse-merkle-tree.js.map +1 -1
- package/dist/esm/src/state-index/state-index-level.js +113 -150
- package/dist/esm/src/state-index/state-index-level.js.map +1 -1
- package/dist/esm/src/store/blockstore-level.js +54 -156
- package/dist/esm/src/store/blockstore-level.js.map +1 -1
- package/dist/esm/src/store/blockstore-mock.js +48 -153
- package/dist/esm/src/store/blockstore-mock.js.map +1 -1
- package/dist/esm/src/store/data-store-level.js +137 -100
- package/dist/esm/src/store/data-store-level.js.map +1 -1
- package/dist/esm/src/store/index-level-compound.js +246 -0
- package/dist/esm/src/store/index-level-compound.js.map +1 -0
- package/dist/esm/src/store/index-level.js +307 -715
- package/dist/esm/src/store/index-level.js.map +1 -1
- package/dist/esm/src/store/level-wrapper.js +143 -244
- package/dist/esm/src/store/level-wrapper.js.map +1 -1
- package/dist/esm/src/store/message-store-level.js +71 -94
- package/dist/esm/src/store/message-store-level.js.map +1 -1
- package/dist/esm/src/store/resumable-task-store-level.js +62 -101
- package/dist/esm/src/store/resumable-task-store-level.js.map +1 -1
- package/dist/esm/src/store/storage-controller.js +131 -146
- package/dist/esm/src/store/storage-controller.js.map +1 -1
- package/dist/esm/src/types/permission-types.js.map +1 -1
- package/dist/esm/src/types/protocols-types.js +10 -0
- package/dist/esm/src/types/protocols-types.js.map +1 -1
- package/dist/esm/src/types/records-types.js.map +1 -1
- package/dist/esm/src/utils/abort.js +8 -19
- package/dist/esm/src/utils/abort.js.map +1 -1
- package/dist/esm/src/utils/array.js +15 -49
- package/dist/esm/src/utils/array.js.map +1 -1
- package/dist/esm/src/utils/cid.js +29 -77
- package/dist/esm/src/utils/cid.js.map +1 -1
- package/dist/esm/src/utils/data-stream.js +37 -65
- package/dist/esm/src/utils/data-stream.js.map +1 -1
- package/dist/esm/src/utils/encryption.js +136 -162
- package/dist/esm/src/utils/encryption.js.map +1 -1
- package/dist/esm/src/utils/filter.js +1 -12
- package/dist/esm/src/utils/filter.js.map +1 -1
- package/dist/esm/src/utils/hd-key.js +45 -71
- package/dist/esm/src/utils/hd-key.js.map +1 -1
- package/dist/esm/src/utils/jws.js +9 -20
- package/dist/esm/src/utils/jws.js.map +1 -1
- package/dist/esm/src/utils/memory-cache.js +12 -23
- package/dist/esm/src/utils/memory-cache.js.map +1 -1
- package/dist/esm/src/utils/messages.js +21 -33
- package/dist/esm/src/utils/messages.js.map +1 -1
- package/dist/esm/src/utils/private-key-signer.js +9 -17
- package/dist/esm/src/utils/private-key-signer.js.map +1 -1
- package/dist/esm/src/utils/protocols.js +62 -70
- package/dist/esm/src/utils/protocols.js.map +1 -1
- package/dist/esm/src/utils/records.js +103 -166
- package/dist/esm/src/utils/records.js.map +1 -1
- package/dist/esm/src/utils/secp256k1.js +60 -96
- package/dist/esm/src/utils/secp256k1.js.map +1 -1
- package/dist/esm/src/utils/secp256r1.js +54 -71
- package/dist/esm/src/utils/secp256r1.js.map +1 -1
- package/dist/esm/src/utils/time.js +5 -18
- package/dist/esm/src/utils/time.js.map +1 -1
- package/dist/esm/src/utils/url.js +3 -3
- package/dist/esm/src/utils/url.js.map +1 -1
- package/dist/esm/tests/core/auth.spec.js +3 -12
- package/dist/esm/tests/core/auth.spec.js.map +1 -1
- package/dist/esm/tests/core/message.spec.js +50 -59
- package/dist/esm/tests/core/message.spec.js.map +1 -1
- package/dist/esm/tests/core/protocol-authorization.spec.js +10 -18
- package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
- package/dist/esm/tests/dwn.spec.js +65 -89
- package/dist/esm/tests/dwn.spec.js.map +1 -1
- package/dist/esm/tests/event-emitter-event-log.spec.js +305 -0
- package/dist/esm/tests/event-emitter-event-log.spec.js.map +1 -0
- package/dist/esm/tests/features/author-delegated-grant.spec.js +337 -347
- package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-delegated-grant.spec.js +160 -172
- package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-signature.spec.js +78 -82
- package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
- package/dist/esm/tests/features/permissions.spec.js +449 -184
- package/dist/esm/tests/features/permissions.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-composition.spec.js +981 -360
- package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-create-action.spec.js +45 -54
- package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-delete-action.spec.js +99 -108
- package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-update-action.spec.js +108 -117
- package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
- package/dist/esm/tests/features/records-immutable.spec.js +315 -0
- package/dist/esm/tests/features/records-immutable.spec.js.map +1 -0
- package/dist/esm/tests/features/records-prune.spec.js +178 -194
- package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
- package/dist/esm/tests/features/records-record-limit.spec.js +542 -0
- package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -0
- package/dist/esm/tests/features/records-tags.spec.js +456 -463
- package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
- package/dist/esm/tests/features/resumable-tasks.spec.js +88 -98
- package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-read.spec.js +215 -210
- package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-subscribe.spec.js +309 -171
- package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-sync.spec.js +272 -199
- package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-configure.spec.js +247 -241
- package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-query.spec.js +159 -172
- package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-count.spec.js +101 -105
- package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-delete.spec.js +266 -279
- package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-query.spec.js +984 -996
- package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-read.spec.js +542 -671
- package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-subscribe.spec.js +433 -302
- package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-write.spec.js +1216 -1140
- package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/messages-get.spec.js +39 -48
- package/dist/esm/tests/interfaces/messages-get.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/messages-subscribe.spec.js +4 -13
- package/dist/esm/tests/interfaces/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/protocols-configure.spec.js +212 -88
- package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/protocols-query.spec.js +8 -17
- package/dist/esm/tests/interfaces/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-delete.spec.js +8 -17
- package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-query.spec.js +20 -29
- package/dist/esm/tests/interfaces/records-query.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-read.spec.js +42 -51
- package/dist/esm/tests/interfaces/records-read.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-subscribe.spec.js +16 -25
- package/dist/esm/tests/interfaces/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-write.spec.js +190 -219
- package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
- package/dist/esm/tests/jose/jws/general.spec.js +36 -45
- package/dist/esm/tests/jose/jws/general.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permission-grant.spec.js +44 -50
- package/dist/esm/tests/protocols/permission-grant.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permission-request.spec.js +23 -32
- package/dist/esm/tests/protocols/permission-request.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permissions.spec.js +49 -55
- package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/aggregator.spec.js +127 -138
- package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/deleted-record.spec.js +372 -36
- package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +55 -64
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/nested-roles.spec.js +66 -76
- package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/subscriptions.spec.js +451 -354
- package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
- package/dist/esm/tests/smt/smt-store-level.spec.js +76 -87
- package/dist/esm/tests/smt/smt-store-level.spec.js.map +1 -1
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +344 -353
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +1 -1
- package/dist/esm/tests/state-index/state-index-level.spec.js +117 -126
- package/dist/esm/tests/state-index/state-index-level.spec.js.map +1 -1
- package/dist/esm/tests/store/blockstore-level.spec.js +44 -99
- package/dist/esm/tests/store/blockstore-level.spec.js.map +1 -1
- package/dist/esm/tests/store/blockstore-mock.spec.js +40 -120
- package/dist/esm/tests/store/blockstore-mock.spec.js.map +1 -1
- package/dist/esm/tests/store/data-store-level.spec.js +160 -108
- package/dist/esm/tests/store/data-store-level.spec.js.map +1 -1
- package/dist/esm/tests/store/index-level.spec.js +404 -414
- package/dist/esm/tests/store/index-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store-level.spec.js +13 -22
- package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store.spec.js +229 -238
- package/dist/esm/tests/store/message-store.spec.js.map +1 -1
- package/dist/esm/tests/test-event-stream.js +12 -13
- package/dist/esm/tests/test-event-stream.js.map +1 -1
- package/dist/esm/tests/test-stores.js +16 -13
- package/dist/esm/tests/test-stores.js.map +1 -1
- package/dist/esm/tests/test-suite.js +8 -15
- package/dist/esm/tests/test-suite.js.map +1 -1
- package/dist/esm/tests/utils/cid.spec.js +24 -33
- package/dist/esm/tests/utils/cid.spec.js.map +1 -1
- package/dist/esm/tests/utils/data-stream.spec.js +48 -57
- package/dist/esm/tests/utils/data-stream.spec.js.map +1 -1
- package/dist/esm/tests/utils/encryption-callbacks.spec.js +45 -54
- package/dist/esm/tests/utils/encryption-callbacks.spec.js.map +1 -1
- package/dist/esm/tests/utils/encryption.spec.js +229 -82
- package/dist/esm/tests/utils/encryption.spec.js.map +1 -1
- package/dist/esm/tests/utils/filters.spec.js +46 -55
- package/dist/esm/tests/utils/filters.spec.js.map +1 -1
- package/dist/esm/tests/utils/hd-key.spec.js +10 -19
- package/dist/esm/tests/utils/hd-key.spec.js.map +1 -1
- package/dist/esm/tests/utils/jws.spec.js +3 -12
- package/dist/esm/tests/utils/jws.spec.js.map +1 -1
- package/dist/esm/tests/utils/memory-cache.spec.js +9 -18
- package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -1
- package/dist/esm/tests/utils/messages.spec.js +18 -20
- package/dist/esm/tests/utils/messages.spec.js.map +1 -1
- package/dist/esm/tests/utils/poller.js +22 -33
- package/dist/esm/tests/utils/poller.js.map +1 -1
- package/dist/esm/tests/utils/private-key-signer.spec.js +15 -24
- package/dist/esm/tests/utils/private-key-signer.spec.js.map +1 -1
- package/dist/esm/tests/utils/records.spec.js +14 -27
- package/dist/esm/tests/utils/records.spec.js.map +1 -1
- package/dist/esm/tests/utils/secp256k1.spec.js +16 -25
- package/dist/esm/tests/utils/secp256k1.spec.js.map +1 -1
- package/dist/esm/tests/utils/secp256r1.spec.js +18 -27
- package/dist/esm/tests/utils/secp256r1.spec.js.map +1 -1
- package/dist/esm/tests/utils/test-data-generator.js +446 -467
- package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js +2 -11
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js +4 -13
- package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js +8 -17
- package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js +3 -12
- package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js +4 -13
- package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js +2 -11
- package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js +2 -11
- package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +44 -24
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -1
- package/dist/types/generated/precompiled-validators.d.ts +49 -40
- package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
- package/dist/types/src/core/constants.d.ts +11 -0
- package/dist/types/src/core/constants.d.ts.map +1 -0
- package/dist/types/src/core/core-protocol.d.ts +89 -0
- package/dist/types/src/core/core-protocol.d.ts.map +1 -0
- package/dist/types/src/core/dwn-error.d.ts +9 -12
- package/dist/types/src/core/dwn-error.d.ts.map +1 -1
- package/dist/types/src/core/grant-authorization.d.ts +6 -2
- package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization-action.d.ts +42 -0
- package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -0
- package/dist/types/src/core/protocol-authorization-validation.d.ts +81 -0
- package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -0
- package/dist/types/src/core/protocol-authorization.d.ts +24 -106
- package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
- package/dist/types/src/core/record-chain.d.ts +24 -0
- package/dist/types/src/core/record-chain.d.ts.map +1 -0
- package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/dwn.d.ts +19 -7
- package/dist/types/src/dwn.d.ts.map +1 -1
- package/dist/types/src/event-stream/event-emitter-event-log.d.ts +50 -0
- package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +1 -0
- package/dist/types/src/handlers/messages-read.d.ts +3 -8
- package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
- package/dist/types/src/handlers/messages-subscribe.d.ts +6 -10
- package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
- package/dist/types/src/handlers/messages-sync.d.ts +3 -8
- package/dist/types/src/handlers/messages-sync.d.ts.map +1 -1
- package/dist/types/src/handlers/protocols-configure.d.ts +3 -10
- package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/handlers/protocols-query.d.ts +3 -8
- package/dist/types/src/handlers/protocols-query.d.ts.map +1 -1
- package/dist/types/src/handlers/records-count.d.ts +3 -6
- package/dist/types/src/handlers/records-count.d.ts.map +1 -1
- package/dist/types/src/handlers/records-delete.d.ts +3 -8
- package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
- package/dist/types/src/handlers/records-query.d.ts +3 -8
- package/dist/types/src/handlers/records-query.d.ts.map +1 -1
- package/dist/types/src/handlers/records-read.d.ts +3 -8
- package/dist/types/src/handlers/records-read.d.ts.map +1 -1
- package/dist/types/src/handlers/records-subscribe.d.ts +8 -10
- package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/handlers/records-write.d.ts +4 -24
- package/dist/types/src/handlers/records-write.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +8 -4
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/interfaces/messages-subscribe.d.ts +5 -0
- package/dist/types/src/interfaces/messages-subscribe.d.ts.map +1 -1
- package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-subscribe.d.ts +5 -0
- package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-write-query.d.ts +33 -0
- package/dist/types/src/interfaces/records-write-query.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-write-signing.d.ts +34 -0
- package/dist/types/src/interfaces/records-write-signing.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-write.d.ts +13 -53
- package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
- package/dist/types/src/protocols/permission-grant.d.ts +1 -1
- package/dist/types/src/protocols/permission-grant.d.ts.map +1 -1
- package/dist/types/src/protocols/permission-request.d.ts +1 -1
- package/dist/types/src/protocols/permission-request.d.ts.map +1 -1
- package/dist/types/src/protocols/permissions.d.ts +40 -3
- package/dist/types/src/protocols/permissions.d.ts.map +1 -1
- package/dist/types/src/state-index/state-index-level.d.ts.map +1 -1
- package/dist/types/src/store/data-store-level.d.ts +20 -4
- package/dist/types/src/store/data-store-level.d.ts.map +1 -1
- package/dist/types/src/store/index-level-compound.d.ts +70 -0
- package/dist/types/src/store/index-level-compound.d.ts.map +1 -0
- package/dist/types/src/store/index-level.d.ts +4 -58
- package/dist/types/src/store/index-level.d.ts.map +1 -1
- package/dist/types/src/store/storage-controller.d.ts +4 -4
- package/dist/types/src/store/storage-controller.d.ts.map +1 -1
- package/dist/types/src/types/message-types.d.ts +3 -3
- package/dist/types/src/types/message-types.d.ts.map +1 -1
- package/dist/types/src/types/messages-types.d.ts +12 -3
- package/dist/types/src/types/messages-types.d.ts.map +1 -1
- package/dist/types/src/types/method-handler.d.ts +24 -3
- package/dist/types/src/types/method-handler.d.ts.map +1 -1
- package/dist/types/src/types/permission-types.d.ts +7 -0
- package/dist/types/src/types/permission-types.d.ts.map +1 -1
- package/dist/types/src/types/protocols-types.d.ts +41 -1
- package/dist/types/src/types/protocols-types.d.ts.map +1 -1
- package/dist/types/src/types/records-types.d.ts +16 -6
- package/dist/types/src/types/records-types.d.ts.map +1 -1
- package/dist/types/src/types/subscriptions.d.ts +151 -13
- package/dist/types/src/types/subscriptions.d.ts.map +1 -1
- package/dist/types/src/utils/hd-key.d.ts +1 -9
- package/dist/types/src/utils/hd-key.d.ts.map +1 -1
- package/dist/types/src/utils/messages.d.ts +7 -5
- package/dist/types/src/utils/messages.d.ts.map +1 -1
- package/dist/types/src/utils/protocols.d.ts +5 -0
- package/dist/types/src/utils/protocols.d.ts.map +1 -1
- package/dist/types/src/utils/records.d.ts +1 -11
- package/dist/types/src/utils/records.d.ts.map +1 -1
- package/dist/types/tests/dwn.spec.d.ts.map +1 -1
- package/dist/types/tests/event-emitter-event-log.spec.d.ts +2 -0
- package/dist/types/tests/event-emitter-event-log.spec.d.ts.map +1 -0
- package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
- package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
- package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
- package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-immutable.spec.d.ts +2 -0
- package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -0
- package/dist/types/tests/features/records-record-limit.spec.d.ts +2 -0
- package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -0
- package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
- package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
- package/dist/types/tests/test-event-stream.d.ts +11 -12
- package/dist/types/tests/test-event-stream.d.ts.map +1 -1
- package/dist/types/tests/test-suite.d.ts +2 -2
- package/dist/types/tests/test-suite.d.ts.map +1 -1
- package/dist/types/tests/utils/test-data-generator.d.ts +18 -0
- package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
- package/package.json +5 -4
- package/src/core/constants.ts +11 -0
- package/src/core/core-protocol.ts +129 -0
- package/src/core/dwn-error.ts +15 -12
- package/src/core/grant-authorization.ts +20 -3
- package/src/core/protocol-authorization-action.ts +377 -0
- package/src/core/protocol-authorization-validation.ts +487 -0
- package/src/core/protocol-authorization.ts +111 -856
- package/src/core/record-chain.ts +99 -0
- package/src/core/records-grant-authorization.ts +6 -8
- package/src/dwn.ts +58 -73
- package/src/event-stream/event-emitter-event-log.ts +283 -0
- package/src/handlers/messages-read.ts +8 -9
- package/src/handlers/messages-subscribe.ts +24 -28
- package/src/handlers/messages-sync.ts +10 -16
- package/src/handlers/protocols-configure.ts +47 -32
- package/src/handlers/protocols-query.ts +6 -9
- package/src/handlers/records-count.ts +11 -10
- package/src/handlers/records-delete.ts +12 -21
- package/src/handlers/records-query.ts +12 -12
- package/src/handlers/records-read.ts +34 -22
- package/src/handlers/records-subscribe.ts +47 -26
- package/src/handlers/records-write.ts +47 -104
- package/src/index.ts +9 -5
- package/src/interfaces/messages-subscribe.ts +7 -1
- package/src/interfaces/protocols-configure.ts +73 -8
- package/src/interfaces/records-count.ts +1 -1
- package/src/interfaces/records-delete.ts +1 -1
- package/src/interfaces/records-query.ts +1 -1
- package/src/interfaces/records-read.ts +1 -1
- package/src/interfaces/records-subscribe.ts +8 -1
- package/src/interfaces/records-write-query.ts +139 -0
- package/src/interfaces/records-write-signing.ts +123 -0
- package/src/interfaces/records-write.ts +66 -261
- package/src/protocols/permission-grant.ts +1 -1
- package/src/protocols/permission-request.ts +1 -1
- package/src/protocols/permissions.ts +148 -6
- package/src/state-index/state-index-level.ts +5 -7
- package/src/store/data-store-level.ts +124 -34
- package/src/store/index-level-compound.ts +324 -0
- package/src/store/index-level.ts +68 -341
- package/src/store/storage-controller.ts +11 -11
- package/src/types/message-types.ts +3 -3
- package/src/types/messages-types.ts +12 -3
- package/src/types/method-handler.ts +26 -4
- package/src/types/mitt.d.ts +28 -0
- package/src/types/permission-types.ts +7 -0
- package/src/types/protocols-types.ts +46 -0
- package/src/types/records-types.ts +16 -6
- package/src/types/subscriptions.ts +178 -14
- package/src/utils/hd-key.ts +0 -9
- package/src/utils/messages.ts +17 -37
- package/src/utils/protocols.ts +8 -0
- package/src/utils/records.ts +8 -59
- package/dist/esm/src/event-stream/event-emitter-stream.js +0 -60
- package/dist/esm/src/event-stream/event-emitter-stream.js.map +0 -1
- package/dist/esm/tests/event-stream/event-emitter-stream.spec.js +0 -77
- package/dist/esm/tests/event-stream/event-emitter-stream.spec.js.map +0 -1
- package/dist/esm/tests/event-stream/event-stream.spec.js +0 -123
- package/dist/esm/tests/event-stream/event-stream.spec.js.map +0 -1
- package/dist/types/src/event-stream/event-emitter-stream.d.ts +0 -23
- package/dist/types/src/event-stream/event-emitter-stream.d.ts.map +0 -1
- package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts +0 -2
- package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts.map +0 -1
- package/dist/types/tests/event-stream/event-stream.spec.d.ts +0 -2
- package/dist/types/tests/event-stream/event-stream.spec.d.ts.map +0 -1
- package/src/event-stream/event-emitter-stream.ts +0 -69
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import minimalProtocolDefinition from '../vectors/protocol-definitions/minimal.json' with { type: 'json' };
|
|
11
2
|
import sinon from 'sinon';
|
|
12
3
|
import { DataStream } from '../../src/utils/data-stream.js';
|
|
@@ -16,7 +7,7 @@ import { Jws } from '../../src/utils/jws.js';
|
|
|
16
7
|
import { PermissionGrant } from '../../src/protocols/permission-grant.js';
|
|
17
8
|
import { RecordsWrite } from '../../src/interfaces/records-write.js';
|
|
18
9
|
import { TestDataGenerator } from '../utils/test-data-generator.js';
|
|
19
|
-
import {
|
|
10
|
+
import { TestEventLog } from '../test-event-stream.js';
|
|
20
11
|
import { TestStores } from '../test-stores.js';
|
|
21
12
|
import { Time } from '../../src/utils/time.js';
|
|
22
13
|
import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'bun:test';
|
|
@@ -29,43 +20,43 @@ export function testOwnerDelegatedGrant() {
|
|
|
29
20
|
let dataStore;
|
|
30
21
|
let resumableTaskStore;
|
|
31
22
|
let stateIndex;
|
|
32
|
-
let
|
|
23
|
+
let eventLog;
|
|
33
24
|
let dwn;
|
|
34
25
|
// important to follow the `before` and `after` pattern to initialize and clean the stores in tests
|
|
35
26
|
// so that different test suites can reuse the same backend store for testing
|
|
36
|
-
beforeAll(() =>
|
|
27
|
+
beforeAll(async () => {
|
|
37
28
|
didResolver = new UniversalResolver({ didResolvers: [DidKey] });
|
|
38
29
|
const stores = TestStores.get();
|
|
39
30
|
messageStore = stores.messageStore;
|
|
40
31
|
dataStore = stores.dataStore;
|
|
41
32
|
resumableTaskStore = stores.resumableTaskStore;
|
|
42
33
|
stateIndex = stores.stateIndex;
|
|
43
|
-
|
|
44
|
-
dwn =
|
|
45
|
-
})
|
|
46
|
-
beforeEach(() =>
|
|
34
|
+
eventLog = TestEventLog.get();
|
|
35
|
+
dwn = await Dwn.create({ didResolver, messageStore, dataStore, stateIndex, eventLog, resumableTaskStore });
|
|
36
|
+
});
|
|
37
|
+
beforeEach(async () => {
|
|
47
38
|
sinon.restore(); // wipe all previous stubs/spies/mocks/fakes
|
|
48
39
|
// clean up before each test rather than after so that a test does not depend on other tests to do the clean up
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
})
|
|
54
|
-
afterAll(() =>
|
|
55
|
-
|
|
56
|
-
})
|
|
40
|
+
await messageStore.clear();
|
|
41
|
+
await dataStore.clear();
|
|
42
|
+
await resumableTaskStore.clear();
|
|
43
|
+
await stateIndex.clear();
|
|
44
|
+
});
|
|
45
|
+
afterAll(async () => {
|
|
46
|
+
await dwn.close();
|
|
47
|
+
});
|
|
57
48
|
describe('RecordsWrite.parse()', () => {
|
|
58
|
-
it('should throw if a message invokes an owner-delegated grant (ID) but the owner-delegated grant is not given', () =>
|
|
59
|
-
const alice =
|
|
60
|
-
const bob =
|
|
61
|
-
const appX =
|
|
49
|
+
it('should throw if a message invokes an owner-delegated grant (ID) but the owner-delegated grant is not given', async () => {
|
|
50
|
+
const alice = await TestDataGenerator.generatePersona();
|
|
51
|
+
const bob = await TestDataGenerator.generatePersona();
|
|
52
|
+
const appX = await TestDataGenerator.generatePersona();
|
|
62
53
|
// Alice grants App X to write as her for the chat protocol
|
|
63
54
|
const scope = {
|
|
64
55
|
interface: DwnInterfaceName.Records,
|
|
65
56
|
method: DwnMethodName.Write,
|
|
66
57
|
protocol: 'chat'
|
|
67
58
|
};
|
|
68
|
-
const grantToAppX =
|
|
59
|
+
const grantToAppX = await PermissionsProtocol.createGrant({
|
|
69
60
|
delegated: true, // this is a delegated grant
|
|
70
61
|
dateExpires: Time.createOffsetTimestamp({ seconds: 100 }),
|
|
71
62
|
description: 'Allow App X to write as me in chat protocol',
|
|
@@ -74,28 +65,30 @@ export function testOwnerDelegatedGrant() {
|
|
|
74
65
|
signer: Jws.createSigner(alice)
|
|
75
66
|
});
|
|
76
67
|
// Bob creates a RecordsWrite message
|
|
77
|
-
const recordsWrite =
|
|
68
|
+
const recordsWrite = await RecordsWrite.create({
|
|
78
69
|
signer: Jws.createSigner(bob),
|
|
70
|
+
protocol: 'http://test-protocol.xyz',
|
|
71
|
+
protocolPath: 'testRecord',
|
|
79
72
|
dataFormat: 'application/octet-stream',
|
|
80
73
|
data: TestDataGenerator.randomBytes(10),
|
|
81
74
|
});
|
|
82
75
|
// App X signs over Bob's RecordsWrite as DWN owner but does not include the delegated grant (we remove it below)
|
|
83
|
-
|
|
76
|
+
await recordsWrite.signAsOwnerDelegate(Jws.createSigner(appX), grantToAppX.dataEncodedMessage);
|
|
84
77
|
delete recordsWrite.message.authorization.ownerDelegatedGrant; // intentionally remove `ownerDelegatedGrant`
|
|
85
78
|
const parsePromise = RecordsWrite.parse(recordsWrite.message);
|
|
86
|
-
|
|
87
|
-
})
|
|
88
|
-
it('should throw if a message includes an owner-delegated grant but does not reference it in owner signature', () =>
|
|
89
|
-
const alice =
|
|
90
|
-
const bob =
|
|
91
|
-
const appX =
|
|
79
|
+
await expect(parsePromise).rejects.toThrow(DwnErrorCode.RecordsOwnerDelegatedGrantAndIdExistenceMismatch);
|
|
80
|
+
});
|
|
81
|
+
it('should throw if a message includes an owner-delegated grant but does not reference it in owner signature', async () => {
|
|
82
|
+
const alice = await TestDataGenerator.generatePersona();
|
|
83
|
+
const bob = await TestDataGenerator.generatePersona();
|
|
84
|
+
const appX = await TestDataGenerator.generatePersona();
|
|
92
85
|
// Alice grants App X to write as her for the chat protocol
|
|
93
86
|
const scope = {
|
|
94
87
|
interface: DwnInterfaceName.Records,
|
|
95
88
|
method: DwnMethodName.Write,
|
|
96
89
|
protocol: 'chat'
|
|
97
90
|
};
|
|
98
|
-
const grantToAppX =
|
|
91
|
+
const grantToAppX = await PermissionsProtocol.createGrant({
|
|
99
92
|
delegated: true, // this is a delegated grant
|
|
100
93
|
dateExpires: Time.createOffsetTimestamp({ seconds: 100 }),
|
|
101
94
|
description: 'Allow App X to write as me in chat protocol',
|
|
@@ -104,23 +97,24 @@ export function testOwnerDelegatedGrant() {
|
|
|
104
97
|
signer: Jws.createSigner(alice)
|
|
105
98
|
});
|
|
106
99
|
// Bob creates a RecordsWrite message
|
|
107
|
-
const recordsWrite =
|
|
100
|
+
const recordsWrite = await RecordsWrite.create({
|
|
108
101
|
signer: Jws.createSigner(bob),
|
|
102
|
+
protocol: 'http://test-protocol.xyz',
|
|
103
|
+
protocolPath: 'testRecord',
|
|
109
104
|
dataFormat: 'application/octet-stream',
|
|
110
105
|
data: TestDataGenerator.randomBytes(10),
|
|
111
106
|
});
|
|
112
107
|
// App X attempts to sign over Bob's RecordsWrite as the DWN owner by including an owner-delegated grant
|
|
113
108
|
// but does not reference the grant ID in owner signature (we remove it below)
|
|
114
|
-
|
|
115
|
-
const ownerSignaturePayloadCopy =
|
|
109
|
+
await recordsWrite.signAsOwnerDelegate(Jws.createSigner(appX), grantToAppX.dataEncodedMessage);
|
|
110
|
+
const ownerSignaturePayloadCopy = { ...recordsWrite.ownerSignaturePayload };
|
|
116
111
|
delete ownerSignaturePayloadCopy.delegatedGrantId; // intentionally remove `delegatedGrantId` in ownerSignature
|
|
117
112
|
recordsWrite.message.authorization.ownerSignature.payload = Encoder.stringToBase64Url(JSON.stringify(ownerSignaturePayloadCopy));
|
|
118
113
|
const parsePromise = RecordsWrite.parse(recordsWrite.message);
|
|
119
|
-
|
|
120
|
-
})
|
|
114
|
+
await expect(parsePromise).rejects.toThrow(DwnErrorCode.RecordsOwnerDelegatedGrantAndIdExistenceMismatch);
|
|
115
|
+
});
|
|
121
116
|
});
|
|
122
|
-
it('should only allow correct entity invoking an owner-delegated grant to write', () =>
|
|
123
|
-
var _a;
|
|
117
|
+
it('should only allow correct entity invoking an owner-delegated grant to write', async () => {
|
|
124
118
|
// scenario:
|
|
125
119
|
// 1. Alice installs a protocol
|
|
126
120
|
// 2. Alice creates a delegated grant for app X to write in the protocol
|
|
@@ -129,18 +123,18 @@ export function testOwnerDelegatedGrant() {
|
|
|
129
123
|
// 5. Verify that App Y cannot write Bob's message in Alice's DWN by invoking the delegated grant for App X.
|
|
130
124
|
// 6. Verify that App X can successfully write Bob's message in Alice's DWN by invoking an owner-delegated grant
|
|
131
125
|
// 7. Sanity verify the RecordsWrite written by App X
|
|
132
|
-
const alice =
|
|
133
|
-
const bob =
|
|
134
|
-
const appX =
|
|
135
|
-
const appY =
|
|
126
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
127
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
128
|
+
const appX = await TestDataGenerator.generateDidKeyPersona();
|
|
129
|
+
const appY = await TestDataGenerator.generateDidKeyPersona();
|
|
136
130
|
// 1. Alice installs a protocol
|
|
137
131
|
const protocolDefinition = minimalProtocolDefinition;
|
|
138
132
|
const protocol = minimalProtocolDefinition.protocol;
|
|
139
|
-
const protocolsConfig =
|
|
133
|
+
const protocolsConfig = await ProtocolsConfigure.create({
|
|
140
134
|
signer: Jws.createSigner(alice),
|
|
141
135
|
definition: protocolDefinition
|
|
142
136
|
});
|
|
143
|
-
const protocolsConfigureReply =
|
|
137
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
144
138
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
145
139
|
// 2. Alice creates a delegated grant for app X to write in the protocol
|
|
146
140
|
const scope = {
|
|
@@ -148,7 +142,7 @@ export function testOwnerDelegatedGrant() {
|
|
|
148
142
|
method: DwnMethodName.Write,
|
|
149
143
|
protocol
|
|
150
144
|
};
|
|
151
|
-
const appXGrant =
|
|
145
|
+
const appXGrant = await PermissionsProtocol.createGrant({
|
|
152
146
|
delegated: true, // this is a delegated grant
|
|
153
147
|
dateExpires: Time.createOffsetTimestamp({ seconds: 100 }),
|
|
154
148
|
grantedTo: appX.did,
|
|
@@ -157,7 +151,7 @@ export function testOwnerDelegatedGrant() {
|
|
|
157
151
|
});
|
|
158
152
|
// 3. A third party (Bob) authors a RecordsWrite
|
|
159
153
|
const bobRecordsWriteBytes = new TextEncoder().encode('message from Bob');
|
|
160
|
-
const bobRecordsWrite =
|
|
154
|
+
const bobRecordsWrite = await RecordsWrite.create({
|
|
161
155
|
signer: Jws.createSigner(bob),
|
|
162
156
|
protocol,
|
|
163
157
|
protocolPath: 'foo', // this comes from `types` in protocol definition
|
|
@@ -165,51 +159,50 @@ export function testOwnerDelegatedGrant() {
|
|
|
165
159
|
data: bobRecordsWriteBytes
|
|
166
160
|
});
|
|
167
161
|
// 4. Sanity test that Bob's RecordsWrite cannot be written to Alice's DWN by itself
|
|
168
|
-
const unauthorizedRecordsWriteReply =
|
|
162
|
+
const unauthorizedRecordsWriteReply = await dwn.processMessage(alice.did, bobRecordsWrite.message, { dataStream: DataStream.fromBytes(bobRecordsWriteBytes) });
|
|
169
163
|
expect(unauthorizedRecordsWriteReply.status.code).toBe(401);
|
|
170
164
|
// 5. Verify that App Y cannot write Bob's message in Alice's DWN by invoking the delegated grant for App X.
|
|
171
|
-
const appYAugmentedWrite =
|
|
172
|
-
|
|
173
|
-
const appYWriteReply =
|
|
165
|
+
const appYAugmentedWrite = await RecordsWrite.parse(bobRecordsWrite.message);
|
|
166
|
+
await appYAugmentedWrite.signAsOwnerDelegate(Jws.createSigner(appY), appXGrant.dataEncodedMessage);
|
|
167
|
+
const appYWriteReply = await dwn.processMessage(alice.did, appYAugmentedWrite.message, { dataStream: DataStream.fromBytes(bobRecordsWriteBytes) });
|
|
174
168
|
expect(appYWriteReply.status.code).toBe(400);
|
|
175
169
|
expect(appYWriteReply.status.detail).toContain(DwnErrorCode.RecordsOwnerDelegatedGrantGrantedToAndOwnerSignatureMismatch);
|
|
176
170
|
// 6. Verify that App X can successfully write Bob's message in Alice's DWN by invoking an owner-delegated grant
|
|
177
|
-
const appXAugmentedWrite =
|
|
178
|
-
|
|
179
|
-
const appXWriteReply =
|
|
171
|
+
const appXAugmentedWrite = await RecordsWrite.parse(bobRecordsWrite.message);
|
|
172
|
+
await appXAugmentedWrite.signAsOwnerDelegate(Jws.createSigner(appX), appXGrant.dataEncodedMessage);
|
|
173
|
+
const appXWriteReply = await dwn.processMessage(alice.did, appXAugmentedWrite.message, { dataStream: DataStream.fromBytes(bobRecordsWriteBytes) });
|
|
180
174
|
expect(appXWriteReply.status.code).toBe(202);
|
|
181
175
|
// 7. Sanity verify the RecordsWrite written by App X
|
|
182
|
-
const recordsQuery =
|
|
176
|
+
const recordsQuery = await TestDataGenerator.generateRecordsQuery({
|
|
183
177
|
author: alice,
|
|
184
178
|
filter: { protocol }
|
|
185
179
|
});
|
|
186
|
-
const recordsQueryReply =
|
|
180
|
+
const recordsQueryReply = await dwn.processMessage(alice.did, recordsQuery.message);
|
|
187
181
|
expect(recordsQueryReply.status.code).toBe(200);
|
|
188
|
-
expect(
|
|
182
|
+
expect(recordsQueryReply.entries?.length).toBe(1);
|
|
189
183
|
const fetchedEntry = recordsQueryReply.entries[0];
|
|
190
184
|
expect(fetchedEntry.encodedData).toBe(Encoder.bytesToBase64Url(bobRecordsWriteBytes));
|
|
191
|
-
const fetchedRecordsWrite =
|
|
185
|
+
const fetchedRecordsWrite = await RecordsWrite.parse(fetchedEntry);
|
|
192
186
|
expect(fetchedRecordsWrite.author).toBe(bob.did);
|
|
193
|
-
})
|
|
194
|
-
it('should not allow entity using a non-delegated grant as an owner-delegated grant to invoke write', () =>
|
|
195
|
-
var _a;
|
|
187
|
+
});
|
|
188
|
+
it('should not allow entity using a non-delegated grant as an owner-delegated grant to invoke write', async () => {
|
|
196
189
|
// scenario:
|
|
197
190
|
// 1. Alice installs a protocol
|
|
198
191
|
// 2. Alice creates a non-delegated grant for app X to write in the protocol
|
|
199
192
|
// 3. A third party (Bob) authors a RecordsWrite
|
|
200
193
|
// 4. Verify that App X cannot write Bob's message in Alice's DWN by invoking an non-delegated grant
|
|
201
194
|
// 5. Sanity verify the RecordsWrite is not written by App X
|
|
202
|
-
const alice =
|
|
203
|
-
const bob =
|
|
204
|
-
const appX =
|
|
195
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
196
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
197
|
+
const appX = await TestDataGenerator.generateDidKeyPersona();
|
|
205
198
|
// 1. Alice installs a protocol
|
|
206
199
|
const protocolDefinition = minimalProtocolDefinition;
|
|
207
200
|
const protocol = minimalProtocolDefinition.protocol;
|
|
208
|
-
const protocolsConfig =
|
|
201
|
+
const protocolsConfig = await ProtocolsConfigure.create({
|
|
209
202
|
signer: Jws.createSigner(alice),
|
|
210
203
|
definition: protocolDefinition
|
|
211
204
|
});
|
|
212
|
-
const protocolsConfigureReply =
|
|
205
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
213
206
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
214
207
|
// 2. Alice creates a non-delegated grant for app X to write in the protocol
|
|
215
208
|
const scope = {
|
|
@@ -217,7 +210,7 @@ export function testOwnerDelegatedGrant() {
|
|
|
217
210
|
method: DwnMethodName.Write,
|
|
218
211
|
protocol
|
|
219
212
|
};
|
|
220
|
-
const appXGrant =
|
|
213
|
+
const appXGrant = await PermissionsProtocol.createGrant({
|
|
221
214
|
// delegated : true, // intentionally commented out to show that this is not a delegated grant
|
|
222
215
|
dateExpires: Time.createOffsetTimestamp({ seconds: 100 }),
|
|
223
216
|
grantedTo: appX.did,
|
|
@@ -226,7 +219,7 @@ export function testOwnerDelegatedGrant() {
|
|
|
226
219
|
});
|
|
227
220
|
// 3. A third party (Bob) authors a RecordsWrite
|
|
228
221
|
const bobRecordsWriteBytes = new TextEncoder().encode('message from Bob');
|
|
229
|
-
const bobRecordsWrite =
|
|
222
|
+
const bobRecordsWrite = await RecordsWrite.create({
|
|
230
223
|
signer: Jws.createSigner(bob),
|
|
231
224
|
protocol,
|
|
232
225
|
protocolPath: 'foo', // this comes from `types` in protocol definition
|
|
@@ -234,22 +227,21 @@ export function testOwnerDelegatedGrant() {
|
|
|
234
227
|
data: bobRecordsWriteBytes
|
|
235
228
|
});
|
|
236
229
|
// 4. Verify that App X cannot write Bob's message in Alice's DWN by invoking an non-delegated grant
|
|
237
|
-
const appXAugmentedWrite =
|
|
238
|
-
|
|
239
|
-
const appXWriteReply =
|
|
230
|
+
const appXAugmentedWrite = await RecordsWrite.parse(bobRecordsWrite.message);
|
|
231
|
+
await appXAugmentedWrite.signAsOwnerDelegate(Jws.createSigner(appX), appXGrant.dataEncodedMessage);
|
|
232
|
+
const appXWriteReply = await dwn.processMessage(alice.did, appXAugmentedWrite.message, { dataStream: DataStream.fromBytes(bobRecordsWriteBytes) });
|
|
240
233
|
expect(appXWriteReply.status.code).toBe(400);
|
|
241
234
|
expect(appXWriteReply.status.detail).toContain(DwnErrorCode.RecordsOwnerDelegatedGrantNotADelegatedGrant);
|
|
242
235
|
// 5. Sanity verify the RecordsWrite is not written by App X
|
|
243
|
-
const recordsQuery =
|
|
236
|
+
const recordsQuery = await TestDataGenerator.generateRecordsQuery({
|
|
244
237
|
author: alice,
|
|
245
238
|
filter: { protocol }
|
|
246
239
|
});
|
|
247
|
-
const recordsQueryReply =
|
|
240
|
+
const recordsQueryReply = await dwn.processMessage(alice.did, recordsQuery.message);
|
|
248
241
|
expect(recordsQueryReply.status.code).toBe(200);
|
|
249
|
-
expect(
|
|
250
|
-
})
|
|
251
|
-
it('should fail if owner-delegated grant invoked for write has a mismatching interface method or protocol scope', () =>
|
|
252
|
-
var _a;
|
|
242
|
+
expect(recordsQueryReply.entries?.length).toBe(0);
|
|
243
|
+
});
|
|
244
|
+
it('should fail if owner-delegated grant invoked for write has a mismatching interface method or protocol scope', async () => {
|
|
253
245
|
// scenario:
|
|
254
246
|
// 1. Alice installs a protocol
|
|
255
247
|
// 2. Alice creates a delegated grant for app X to read in the protocol
|
|
@@ -258,17 +250,17 @@ export function testOwnerDelegatedGrant() {
|
|
|
258
250
|
// 5. Verify that App X cannot write Bob's message in Alice's DWN by invoking a delegated grant for RecordsRead
|
|
259
251
|
// 6. Verify that App X cannot write Bob's message in Alice's DWN by invoking a delegated grant for writing in another random protocol
|
|
260
252
|
// 7. Sanity verify the RecordsWrite is not written by App X
|
|
261
|
-
const alice =
|
|
262
|
-
const bob =
|
|
263
|
-
const appX =
|
|
253
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
254
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
255
|
+
const appX = await TestDataGenerator.generateDidKeyPersona();
|
|
264
256
|
// 1. Alice installs a protocol
|
|
265
257
|
const protocolDefinition = minimalProtocolDefinition;
|
|
266
258
|
const protocol = minimalProtocolDefinition.protocol;
|
|
267
|
-
const protocolsConfig =
|
|
259
|
+
const protocolsConfig = await ProtocolsConfigure.create({
|
|
268
260
|
signer: Jws.createSigner(alice),
|
|
269
261
|
definition: protocolDefinition
|
|
270
262
|
});
|
|
271
|
-
const protocolsConfigureReply =
|
|
263
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
272
264
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
273
265
|
// 2. Alice creates a delegated grant for app X to read in the protocol
|
|
274
266
|
const readScope = {
|
|
@@ -276,7 +268,7 @@ export function testOwnerDelegatedGrant() {
|
|
|
276
268
|
method: DwnMethodName.Read,
|
|
277
269
|
protocol
|
|
278
270
|
};
|
|
279
|
-
const appXGrantToRead =
|
|
271
|
+
const appXGrantToRead = await PermissionsProtocol.createGrant({
|
|
280
272
|
delegated: true,
|
|
281
273
|
dateExpires: Time.createOffsetTimestamp({ seconds: 100 }),
|
|
282
274
|
grantedTo: appX.did,
|
|
@@ -289,7 +281,7 @@ export function testOwnerDelegatedGrant() {
|
|
|
289
281
|
method: DwnMethodName.Write,
|
|
290
282
|
protocol: `random-protocol`
|
|
291
283
|
};
|
|
292
|
-
const appXGrantToWriteInRandomProtocol =
|
|
284
|
+
const appXGrantToWriteInRandomProtocol = await PermissionsProtocol.createGrant({
|
|
293
285
|
delegated: true,
|
|
294
286
|
dateExpires: Time.createOffsetTimestamp({ seconds: 100 }),
|
|
295
287
|
grantedTo: appX.did,
|
|
@@ -298,7 +290,7 @@ export function testOwnerDelegatedGrant() {
|
|
|
298
290
|
});
|
|
299
291
|
// 4. A third party (Bob) authors a RecordsWrite
|
|
300
292
|
const bobRecordsWriteBytes = new TextEncoder().encode('message from Bob');
|
|
301
|
-
const bobRecordsWrite =
|
|
293
|
+
const bobRecordsWrite = await RecordsWrite.create({
|
|
302
294
|
signer: Jws.createSigner(bob),
|
|
303
295
|
protocol,
|
|
304
296
|
protocolPath: 'foo', // this comes from `types` in protocol definition
|
|
@@ -306,45 +298,44 @@ export function testOwnerDelegatedGrant() {
|
|
|
306
298
|
data: bobRecordsWriteBytes
|
|
307
299
|
});
|
|
308
300
|
// 5. Verify that App X cannot write Bob's message in Alice's DWN by invoking a delegated grant for RecordsRead
|
|
309
|
-
const appXAugmentedWrite =
|
|
310
|
-
|
|
311
|
-
const appXWriteReply =
|
|
301
|
+
const appXAugmentedWrite = await RecordsWrite.parse(bobRecordsWrite.message);
|
|
302
|
+
await appXAugmentedWrite.signAsOwnerDelegate(Jws.createSigner(appX), appXGrantToRead.dataEncodedMessage);
|
|
303
|
+
const appXWriteReply = await dwn.processMessage(alice.did, appXAugmentedWrite.message, { dataStream: DataStream.fromBytes(bobRecordsWriteBytes) });
|
|
312
304
|
expect(appXWriteReply.status.code).toBe(401);
|
|
313
305
|
expect(appXWriteReply.status.detail).toContain(DwnErrorCode.GrantAuthorizationMethodMismatch);
|
|
314
306
|
// 6. Verify that App X cannot write Bob's message in Alice's DWN by invoking a delegated grant for writing in another random protocol
|
|
315
|
-
const appXAugmentedWrite2 =
|
|
316
|
-
|
|
317
|
-
const appXWriteReply2 =
|
|
307
|
+
const appXAugmentedWrite2 = await RecordsWrite.parse(bobRecordsWrite.message);
|
|
308
|
+
await appXAugmentedWrite2.signAsOwnerDelegate(Jws.createSigner(appX), appXGrantToWriteInRandomProtocol.dataEncodedMessage);
|
|
309
|
+
const appXWriteReply2 = await dwn.processMessage(alice.did, appXAugmentedWrite2.message, { dataStream: DataStream.fromBytes(bobRecordsWriteBytes) });
|
|
318
310
|
expect(appXWriteReply2.status.code).toBe(401);
|
|
319
311
|
expect(appXWriteReply2.status.detail).toContain(DwnErrorCode.RecordsGrantAuthorizationScopeProtocolMismatch);
|
|
320
312
|
// 7. Sanity verify the RecordsWrite is not written by App X
|
|
321
|
-
const recordsQuery =
|
|
313
|
+
const recordsQuery = await TestDataGenerator.generateRecordsQuery({
|
|
322
314
|
author: alice,
|
|
323
315
|
filter: { protocol }
|
|
324
316
|
});
|
|
325
|
-
const recordsQueryReply =
|
|
317
|
+
const recordsQueryReply = await dwn.processMessage(alice.did, recordsQuery.message);
|
|
326
318
|
expect(recordsQueryReply.status.code).toBe(200);
|
|
327
|
-
expect(
|
|
328
|
-
})
|
|
329
|
-
it('should fail RecordsWrite if presented with an owner-delegated grant with invalid grantor signature', () =>
|
|
330
|
-
var _a;
|
|
319
|
+
expect(recordsQueryReply.entries?.length).toBe(0);
|
|
320
|
+
});
|
|
321
|
+
it('should fail RecordsWrite if presented with an owner-delegated grant with invalid grantor signature', async () => {
|
|
331
322
|
// scenario:
|
|
332
323
|
// 1. Alice installs a protocol
|
|
333
324
|
// 2. Alice creates a delegated grant for App X to write as Alice, but with invalid signature
|
|
334
325
|
// 3. A third party (Bob) authors a RecordsWrite
|
|
335
326
|
// 4. Verify that App X cannot write Bob's message in Alice's DWN by invoking an owner-delegated grant with invalid signature
|
|
336
327
|
// 5. Sanity verify the RecordsWrite is not written by App X
|
|
337
|
-
const alice =
|
|
338
|
-
const bob =
|
|
339
|
-
const appX =
|
|
328
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
329
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
330
|
+
const appX = await TestDataGenerator.generateDidKeyPersona();
|
|
340
331
|
// 1. Alice installs a protocol
|
|
341
332
|
const protocolDefinition = minimalProtocolDefinition;
|
|
342
333
|
const protocol = minimalProtocolDefinition.protocol;
|
|
343
|
-
const protocolsConfig =
|
|
334
|
+
const protocolsConfig = await ProtocolsConfigure.create({
|
|
344
335
|
signer: Jws.createSigner(alice),
|
|
345
336
|
definition: protocolDefinition
|
|
346
337
|
});
|
|
347
|
-
const protocolsConfigureReply =
|
|
338
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
348
339
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
349
340
|
// 2. Alice creates a delegated grant for App X to write as Alice, but with invalid signature
|
|
350
341
|
const scope = {
|
|
@@ -352,7 +343,7 @@ export function testOwnerDelegatedGrant() {
|
|
|
352
343
|
method: DwnMethodName.Write,
|
|
353
344
|
protocol
|
|
354
345
|
};
|
|
355
|
-
const appXGrant =
|
|
346
|
+
const appXGrant = await PermissionsProtocol.createGrant({
|
|
356
347
|
delegated: true,
|
|
357
348
|
dateExpires: Time.createOffsetTimestamp({ seconds: 100 }),
|
|
358
349
|
grantedTo: appX.did,
|
|
@@ -360,10 +351,10 @@ export function testOwnerDelegatedGrant() {
|
|
|
360
351
|
signer: Jws.createSigner(alice)
|
|
361
352
|
});
|
|
362
353
|
const appXGrantMessage = appXGrant.dataEncodedMessage;
|
|
363
|
-
appXGrantMessage.authorization.signature.signatures[0].signature =
|
|
354
|
+
appXGrantMessage.authorization.signature.signatures[0].signature = await TestDataGenerator.randomSignatureString();
|
|
364
355
|
// 3. A third party (Bob) authors a RecordsWrite
|
|
365
356
|
const bobRecordsWriteBytes = new TextEncoder().encode('message from Bob');
|
|
366
|
-
const bobRecordsWrite =
|
|
357
|
+
const bobRecordsWrite = await RecordsWrite.create({
|
|
367
358
|
signer: Jws.createSigner(bob),
|
|
368
359
|
protocol,
|
|
369
360
|
protocolPath: 'foo', // this comes from `types` in protocol definition
|
|
@@ -371,39 +362,38 @@ export function testOwnerDelegatedGrant() {
|
|
|
371
362
|
data: bobRecordsWriteBytes
|
|
372
363
|
});
|
|
373
364
|
// 4. Verify that App X cannot write Bob's message in Alice's DWN by invoking an owner-delegated grant with invalid signature
|
|
374
|
-
const appXAugmentedWrite =
|
|
375
|
-
|
|
376
|
-
const appXWriteReply =
|
|
365
|
+
const appXAugmentedWrite = await RecordsWrite.parse(bobRecordsWrite.message);
|
|
366
|
+
await appXAugmentedWrite.signAsOwnerDelegate(Jws.createSigner(appX), appXGrantMessage);
|
|
367
|
+
const appXWriteReply = await dwn.processMessage(alice.did, appXAugmentedWrite.message, { dataStream: DataStream.fromBytes(bobRecordsWriteBytes) });
|
|
377
368
|
expect(appXWriteReply.status.code).toBe(401);
|
|
378
369
|
expect(appXWriteReply.status.detail).toContain(DwnErrorCode.GeneralJwsVerifierInvalidSignature);
|
|
379
370
|
// 5. Sanity verify the RecordsWrite is not written by App X
|
|
380
|
-
const recordsQuery =
|
|
371
|
+
const recordsQuery = await TestDataGenerator.generateRecordsQuery({
|
|
381
372
|
author: alice,
|
|
382
373
|
filter: { protocol }
|
|
383
374
|
});
|
|
384
|
-
const recordsQueryReply =
|
|
375
|
+
const recordsQueryReply = await dwn.processMessage(alice.did, recordsQuery.message);
|
|
385
376
|
expect(recordsQueryReply.status.code).toBe(200);
|
|
386
|
-
expect(
|
|
387
|
-
})
|
|
388
|
-
it('should fail RecordsWrite if grant ID in owner signature payload and CID of owner-delegated grant are mismatching', () =>
|
|
389
|
-
var _a;
|
|
377
|
+
expect(recordsQueryReply.entries?.length).toBe(0);
|
|
378
|
+
});
|
|
379
|
+
it('should fail RecordsWrite if grant ID in owner signature payload and CID of owner-delegated grant are mismatching', async () => {
|
|
390
380
|
// scenario:
|
|
391
381
|
// 1. Alice installs a protocol
|
|
392
382
|
// 2. Creates two delegated grant for App X to write as Alice
|
|
393
383
|
// 3. A third party (Bob) authors a RecordsWrite
|
|
394
384
|
// 4. Verify that App X cannot write Bob's message in Alice's DWN by invoking an owner-delegated grant with the wrong ID
|
|
395
385
|
// 5. Sanity verify the RecordsWrite is not written by App X
|
|
396
|
-
const alice =
|
|
397
|
-
const bob =
|
|
398
|
-
const appX =
|
|
386
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
387
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
388
|
+
const appX = await TestDataGenerator.generateDidKeyPersona();
|
|
399
389
|
// 1. Alice installs a protocol
|
|
400
390
|
const protocolDefinition = minimalProtocolDefinition;
|
|
401
391
|
const protocol = minimalProtocolDefinition.protocol;
|
|
402
|
-
const protocolsConfig =
|
|
392
|
+
const protocolsConfig = await ProtocolsConfigure.create({
|
|
403
393
|
signer: Jws.createSigner(alice),
|
|
404
394
|
definition: protocolDefinition
|
|
405
395
|
});
|
|
406
|
-
const protocolsConfigureReply =
|
|
396
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
407
397
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
408
398
|
// 2. Creates two delegated grant for App X to write as Alice
|
|
409
399
|
const scope = {
|
|
@@ -411,15 +401,15 @@ export function testOwnerDelegatedGrant() {
|
|
|
411
401
|
method: DwnMethodName.Write,
|
|
412
402
|
protocol
|
|
413
403
|
};
|
|
414
|
-
const appXGrant =
|
|
404
|
+
const appXGrant = await PermissionsProtocol.createGrant({
|
|
415
405
|
delegated: true,
|
|
416
406
|
dateExpires: Time.createOffsetTimestamp({ seconds: 100 }),
|
|
417
407
|
grantedTo: appX.did,
|
|
418
408
|
scope: scope,
|
|
419
409
|
signer: Jws.createSigner(alice)
|
|
420
410
|
});
|
|
421
|
-
|
|
422
|
-
const appXGrant2 =
|
|
411
|
+
await Time.minimalSleep();
|
|
412
|
+
const appXGrant2 = await PermissionsProtocol.createGrant({
|
|
423
413
|
delegated: true,
|
|
424
414
|
dateExpires: Time.createOffsetTimestamp({ seconds: 100 }),
|
|
425
415
|
grantedTo: appX.did,
|
|
@@ -428,7 +418,7 @@ export function testOwnerDelegatedGrant() {
|
|
|
428
418
|
});
|
|
429
419
|
// 3. A third party (Bob) authors a RecordsWrite
|
|
430
420
|
const bobRecordsWriteBytes = new TextEncoder().encode('message from Bob');
|
|
431
|
-
const bobRecordsWrite =
|
|
421
|
+
const bobRecordsWrite = await RecordsWrite.create({
|
|
432
422
|
signer: Jws.createSigner(bob),
|
|
433
423
|
protocol,
|
|
434
424
|
protocolPath: 'foo', // this comes from `types` in protocol definition
|
|
@@ -436,23 +426,22 @@ export function testOwnerDelegatedGrant() {
|
|
|
436
426
|
data: bobRecordsWriteBytes
|
|
437
427
|
});
|
|
438
428
|
// 4. Verify that App X cannot write Bob's message in Alice's DWN by invoking an owner-delegated grant with the wrong ID
|
|
439
|
-
const appXAugmentedWrite =
|
|
440
|
-
|
|
429
|
+
const appXAugmentedWrite = await RecordsWrite.parse(bobRecordsWrite.message);
|
|
430
|
+
await appXAugmentedWrite.signAsOwnerDelegate(Jws.createSigner(appX), appXGrant.dataEncodedMessage);
|
|
441
431
|
appXAugmentedWrite.message.authorization.ownerDelegatedGrant = appXGrant2.dataEncodedMessage; // intentionally have a mismatching grant
|
|
442
|
-
const appXWriteReply =
|
|
432
|
+
const appXWriteReply = await dwn.processMessage(alice.did, appXAugmentedWrite.message, { dataStream: DataStream.fromBytes(bobRecordsWriteBytes) });
|
|
443
433
|
expect(appXWriteReply.status.code).toBe(400);
|
|
444
434
|
expect(appXWriteReply.status.detail).toContain(DwnErrorCode.RecordsOwnerDelegatedGrantCidMismatch);
|
|
445
435
|
// 5. Sanity verify the RecordsWrite is not written by App X
|
|
446
|
-
const recordsQuery =
|
|
436
|
+
const recordsQuery = await TestDataGenerator.generateRecordsQuery({
|
|
447
437
|
author: alice,
|
|
448
438
|
filter: { protocol }
|
|
449
439
|
});
|
|
450
|
-
const recordsQueryReply =
|
|
440
|
+
const recordsQueryReply = await dwn.processMessage(alice.did, recordsQuery.message);
|
|
451
441
|
expect(recordsQueryReply.status.code).toBe(200);
|
|
452
|
-
expect(
|
|
453
|
-
})
|
|
454
|
-
it('should fail RecordsWrite if owner-delegated grant is revoked', () =>
|
|
455
|
-
var _a;
|
|
442
|
+
expect(recordsQueryReply.entries?.length).toBe(0);
|
|
443
|
+
});
|
|
444
|
+
it('should fail RecordsWrite if owner-delegated grant is revoked', async () => {
|
|
456
445
|
// scenario:
|
|
457
446
|
// 1. Alice installs a protocol
|
|
458
447
|
// 2. Alice creates a delegated grant for App X to write as Alice
|
|
@@ -460,17 +449,17 @@ export function testOwnerDelegatedGrant() {
|
|
|
460
449
|
// 4. A third party (Bob) authors a RecordsWrite
|
|
461
450
|
// 5. Verify that App X cannot write Bob's message in Alice's DWN by invoking a revoked owner-delegated grant
|
|
462
451
|
// 6. Sanity verify the RecordsWrite is not written by App X
|
|
463
|
-
const alice =
|
|
464
|
-
const bob =
|
|
465
|
-
const appX =
|
|
452
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
453
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
454
|
+
const appX = await TestDataGenerator.generateDidKeyPersona();
|
|
466
455
|
// 1. Alice installs a protocol
|
|
467
456
|
const protocolDefinition = minimalProtocolDefinition;
|
|
468
457
|
const protocol = minimalProtocolDefinition.protocol;
|
|
469
|
-
const protocolsConfig =
|
|
458
|
+
const protocolsConfig = await ProtocolsConfigure.create({
|
|
470
459
|
signer: Jws.createSigner(alice),
|
|
471
460
|
definition: protocolDefinition
|
|
472
461
|
});
|
|
473
|
-
const protocolsConfigureReply =
|
|
462
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
474
463
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
475
464
|
// 2. Alice creates a delegated grant for App X to write as Alice
|
|
476
465
|
const scope = {
|
|
@@ -478,7 +467,7 @@ export function testOwnerDelegatedGrant() {
|
|
|
478
467
|
method: DwnMethodName.Write,
|
|
479
468
|
protocol
|
|
480
469
|
};
|
|
481
|
-
const appXGrant =
|
|
470
|
+
const appXGrant = await PermissionsProtocol.createGrant({
|
|
482
471
|
delegated: true,
|
|
483
472
|
dateExpires: Time.createOffsetTimestamp({ seconds: 100 }),
|
|
484
473
|
grantedTo: appX.did,
|
|
@@ -486,19 +475,19 @@ export function testOwnerDelegatedGrant() {
|
|
|
486
475
|
signer: Jws.createSigner(alice)
|
|
487
476
|
});
|
|
488
477
|
const grantDataStream = DataStream.fromBytes(appXGrant.permissionGrantBytes);
|
|
489
|
-
const permissionGrantWriteReply =
|
|
478
|
+
const permissionGrantWriteReply = await dwn.processMessage(alice.did, appXGrant.recordsWrite.message, { dataStream: grantDataStream });
|
|
490
479
|
expect(permissionGrantWriteReply.status.code).toBe(202);
|
|
491
480
|
// 3. Alice revokes the grant
|
|
492
|
-
const permissionRevoke =
|
|
481
|
+
const permissionRevoke = await PermissionsProtocol.createRevocation({
|
|
493
482
|
signer: Jws.createSigner(alice),
|
|
494
|
-
grant:
|
|
483
|
+
grant: PermissionGrant.parse(appXGrant.dataEncodedMessage),
|
|
495
484
|
});
|
|
496
485
|
const revocationDataStream = DataStream.fromBytes(permissionRevoke.permissionRevocationBytes);
|
|
497
|
-
const permissionRevokeReply =
|
|
486
|
+
const permissionRevokeReply = await dwn.processMessage(alice.did, permissionRevoke.recordsWrite.message, { dataStream: revocationDataStream });
|
|
498
487
|
expect(permissionRevokeReply.status.code).toBe(202);
|
|
499
488
|
// 4. A third party (Bob) authors a RecordsWrite
|
|
500
489
|
const bobRecordsWriteBytes = new TextEncoder().encode('message from Bob');
|
|
501
|
-
const bobRecordsWrite =
|
|
490
|
+
const bobRecordsWrite = await RecordsWrite.create({
|
|
502
491
|
signer: Jws.createSigner(bob),
|
|
503
492
|
protocol,
|
|
504
493
|
protocolPath: 'foo', // this comes from `types` in protocol definition
|
|
@@ -506,39 +495,38 @@ export function testOwnerDelegatedGrant() {
|
|
|
506
495
|
data: bobRecordsWriteBytes
|
|
507
496
|
});
|
|
508
497
|
// 5. Verify that App X cannot write Bob's message in Alice's DWN by invoking a revoked owner-delegated grant
|
|
509
|
-
const appXAugmentedWrite =
|
|
510
|
-
|
|
511
|
-
const appXWriteReply =
|
|
498
|
+
const appXAugmentedWrite = await RecordsWrite.parse(bobRecordsWrite.message);
|
|
499
|
+
await appXAugmentedWrite.signAsOwnerDelegate(Jws.createSigner(appX), appXGrant.dataEncodedMessage);
|
|
500
|
+
const appXWriteReply = await dwn.processMessage(alice.did, appXAugmentedWrite.message, { dataStream: DataStream.fromBytes(bobRecordsWriteBytes) });
|
|
512
501
|
expect(appXWriteReply.status.code).toBe(401);
|
|
513
502
|
expect(appXWriteReply.status.detail).toContain(DwnErrorCode.GrantAuthorizationGrantRevoked);
|
|
514
503
|
// 6. Sanity verify the RecordsWrite is not written by App X
|
|
515
|
-
const recordsQuery =
|
|
504
|
+
const recordsQuery = await TestDataGenerator.generateRecordsQuery({
|
|
516
505
|
author: alice,
|
|
517
506
|
filter: { protocol }
|
|
518
507
|
});
|
|
519
|
-
const recordsQueryReply =
|
|
508
|
+
const recordsQueryReply = await dwn.processMessage(alice.did, recordsQuery.message);
|
|
520
509
|
expect(recordsQueryReply.status.code).toBe(200);
|
|
521
|
-
expect(
|
|
522
|
-
})
|
|
523
|
-
it('should fail RecordsWrite if owner-delegated grant is expired', () =>
|
|
524
|
-
var _a;
|
|
510
|
+
expect(recordsQueryReply.entries?.length).toBe(0);
|
|
511
|
+
});
|
|
512
|
+
it('should fail RecordsWrite if owner-delegated grant is expired', async () => {
|
|
525
513
|
// scenario:
|
|
526
514
|
// 1. Alice installs a protocol
|
|
527
515
|
// 2. Alice creates a delegated grant for App X to write as Alice, but make it expired
|
|
528
516
|
// 3. A third party (Bob) authors a RecordsWrite
|
|
529
517
|
// 4. Verify that App X cannot write Bob's message in Alice's DWN by invoking an expired owner-delegated grant
|
|
530
518
|
// 5. Sanity verify the RecordsWrite is not written by App X
|
|
531
|
-
const alice =
|
|
532
|
-
const bob =
|
|
533
|
-
const appX =
|
|
519
|
+
const alice = await TestDataGenerator.generateDidKeyPersona();
|
|
520
|
+
const bob = await TestDataGenerator.generateDidKeyPersona();
|
|
521
|
+
const appX = await TestDataGenerator.generateDidKeyPersona();
|
|
534
522
|
// 1. Alice installs a protocol
|
|
535
523
|
const protocolDefinition = minimalProtocolDefinition;
|
|
536
524
|
const protocol = minimalProtocolDefinition.protocol;
|
|
537
|
-
const protocolsConfig =
|
|
525
|
+
const protocolsConfig = await ProtocolsConfigure.create({
|
|
538
526
|
signer: Jws.createSigner(alice),
|
|
539
527
|
definition: protocolDefinition
|
|
540
528
|
});
|
|
541
|
-
const protocolsConfigureReply =
|
|
529
|
+
const protocolsConfigureReply = await dwn.processMessage(alice.did, protocolsConfig.message);
|
|
542
530
|
expect(protocolsConfigureReply.status.code).toBe(202);
|
|
543
531
|
// 2. Alice creates a delegated grant for App X to write as Alice, but make it expired
|
|
544
532
|
const scope = {
|
|
@@ -546,7 +534,7 @@ export function testOwnerDelegatedGrant() {
|
|
|
546
534
|
method: DwnMethodName.Write,
|
|
547
535
|
protocol
|
|
548
536
|
};
|
|
549
|
-
const appXGrant =
|
|
537
|
+
const appXGrant = await PermissionsProtocol.createGrant({
|
|
550
538
|
delegated: true,
|
|
551
539
|
dateExpires: Time.getCurrentTimestamp(), // intentionally set to current time to make it expired immediately
|
|
552
540
|
grantedTo: appX.did,
|
|
@@ -555,7 +543,7 @@ export function testOwnerDelegatedGrant() {
|
|
|
555
543
|
});
|
|
556
544
|
// 3. A third party (Bob) authors a RecordsWrite
|
|
557
545
|
const bobRecordsWriteBytes = new TextEncoder().encode('message from Bob');
|
|
558
|
-
const bobRecordsWrite =
|
|
546
|
+
const bobRecordsWrite = await RecordsWrite.create({
|
|
559
547
|
signer: Jws.createSigner(bob),
|
|
560
548
|
protocol,
|
|
561
549
|
protocolPath: 'foo', // this comes from `types` in protocol definition
|
|
@@ -563,20 +551,20 @@ export function testOwnerDelegatedGrant() {
|
|
|
563
551
|
data: bobRecordsWriteBytes
|
|
564
552
|
});
|
|
565
553
|
// 4. Verify that App X cannot write Bob's message in Alice's DWN by invoking an expired owner-delegated grant
|
|
566
|
-
const appXAugmentedWrite =
|
|
567
|
-
|
|
568
|
-
const appXWriteReply =
|
|
554
|
+
const appXAugmentedWrite = await RecordsWrite.parse(bobRecordsWrite.message);
|
|
555
|
+
await appXAugmentedWrite.signAsOwnerDelegate(Jws.createSigner(appX), appXGrant.dataEncodedMessage);
|
|
556
|
+
const appXWriteReply = await dwn.processMessage(alice.did, appXAugmentedWrite.message, { dataStream: DataStream.fromBytes(bobRecordsWriteBytes) });
|
|
569
557
|
expect(appXWriteReply.status.code).toBe(401);
|
|
570
558
|
expect(appXWriteReply.status.detail).toContain(DwnErrorCode.GrantAuthorizationGrantExpired);
|
|
571
559
|
// 5. Sanity verify the RecordsWrite is not written by App X
|
|
572
|
-
const recordsQuery =
|
|
560
|
+
const recordsQuery = await TestDataGenerator.generateRecordsQuery({
|
|
573
561
|
author: alice,
|
|
574
562
|
filter: { protocol }
|
|
575
563
|
});
|
|
576
|
-
const recordsQueryReply =
|
|
564
|
+
const recordsQueryReply = await dwn.processMessage(alice.did, recordsQuery.message);
|
|
577
565
|
expect(recordsQueryReply.status.code).toBe(200);
|
|
578
|
-
expect(
|
|
579
|
-
})
|
|
566
|
+
expect(recordsQueryReply.entries?.length).toBe(0);
|
|
567
|
+
});
|
|
580
568
|
});
|
|
581
569
|
}
|
|
582
570
|
//# sourceMappingURL=owner-delegated-grant.spec.js.map
|