@enbox/dwn-sdk-js 0.0.5 → 0.0.7
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 +1 -2
- 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/dwn-constant.js +7 -7
- package/dist/esm/src/core/dwn-constant.js.map +1 -1
- package/dist/esm/src/core/dwn-error.js +1 -0
- package/dist/esm/src/core/dwn-error.js.map +1 -1
- package/dist/esm/src/core/grant-authorization.js +37 -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 +254 -0
- package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -0
- package/dist/esm/src/core/protocol-authorization.js +122 -740
- 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 +55 -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 +69 -86
- package/dist/esm/src/dwn.js.map +1 -1
- package/dist/esm/src/event-stream/event-emitter-stream.js +17 -31
- package/dist/esm/src/event-stream/event-emitter-stream.js.map +1 -1
- package/dist/esm/src/handlers/messages-read.js +67 -77
- package/dist/esm/src/handlers/messages-read.js.map +1 -1
- package/dist/esm/src/handlers/messages-subscribe.js +51 -61
- package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/messages-sync.js +75 -85
- package/dist/esm/src/handlers/messages-sync.js.map +1 -1
- package/dist/esm/src/handlers/protocols-configure.js +135 -155
- package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
- package/dist/esm/src/handlers/protocols-query.js +52 -51
- package/dist/esm/src/handlers/protocols-query.js.map +1 -1
- package/dist/esm/src/handlers/records-count.js +96 -82
- package/dist/esm/src/handlers/records-count.js.map +1 -1
- package/dist/esm/src/handlers/records-delete.js +78 -88
- package/dist/esm/src/handlers/records-delete.js.map +1 -1
- package/dist/esm/src/handlers/records-query.js +116 -101
- package/dist/esm/src/handlers/records-query.js.map +1 -1
- package/dist/esm/src/handlers/records-read.js +124 -131
- package/dist/esm/src/handlers/records-read.js.map +1 -1
- package/dist/esm/src/handlers/records-subscribe.js +150 -103
- package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/records-write.js +250 -259
- package/dist/esm/src/handlers/records-write.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 +27 -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 +63 -63
- 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 +52 -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 +92 -0
- package/dist/esm/src/interfaces/records-write-signing.js.map +1 -0
- package/dist/esm/src/interfaces/records-write.js +407 -602
- 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 +44 -15
- package/dist/esm/src/protocols/permission-grant.js.map +1 -1
- package/dist/esm/src/protocols/permission-request.js +29 -15
- package/dist/esm/src/protocols/permission-request.js.map +1 -1
- package/dist/esm/src/protocols/permissions.js +216 -226
- 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 +115 -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 +59 -99
- 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 +295 -713
- 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 +129 -144
- package/dist/esm/src/store/storage-controller.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 -63
- 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 +9 -3
- 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 +108 -140
- 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 +9 -18
- package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
- package/dist/esm/tests/dwn.spec.js +45 -58
- package/dist/esm/tests/dwn.spec.js.map +1 -1
- package/dist/esm/tests/event-stream/event-emitter-stream.spec.js +24 -33
- package/dist/esm/tests/event-stream/event-emitter-stream.spec.js.map +1 -1
- package/dist/esm/tests/event-stream/event-stream.spec.js +46 -55
- package/dist/esm/tests/event-stream/event-stream.spec.js.map +1 -1
- package/dist/esm/tests/features/author-delegated-grant.spec.js +326 -343
- package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-delegated-grant.spec.js +153 -169
- package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-signature.spec.js +67 -78
- package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
- package/dist/esm/tests/features/permissions.spec.js +446 -181
- package/dist/esm/tests/features/permissions.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-composition.spec.js +346 -356
- package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-create-action.spec.js +42 -51
- package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-delete-action.spec.js +94 -103
- package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-update-action.spec.js +105 -114
- package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
- package/dist/esm/tests/features/records-prune.spec.js +175 -191
- package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
- package/dist/esm/tests/features/records-tags.spec.js +441 -460
- package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
- package/dist/esm/tests/features/resumable-tasks.spec.js +82 -91
- package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-read.spec.js +206 -207
- package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-subscribe.spec.js +145 -154
- package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-sync.spec.js +174 -183
- package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-configure.spec.js +244 -238
- package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-query.spec.js +156 -169
- package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-count.spec.js +93 -102
- package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-delete.spec.js +252 -264
- package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-query.spec.js +917 -988
- package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-read.spec.js +553 -568
- package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-subscribe.spec.js +269 -278
- package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-write.spec.js +1057 -1082
- 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 +152 -165
- 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 +124 -135
- package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/deleted-record.spec.js +23 -32
- package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +52 -61
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/nested-roles.spec.js +63 -73
- package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/subscriptions.spec.js +377 -333
- 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 +86 -95
- 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 +3 -3
- 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 +2 -11
- 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 +291 -44
- 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 +6 -15
- 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 +10 -19
- 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 +414 -468
- 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 +7 -16
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.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 +60 -0
- package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -0
- package/dist/types/src/core/protocol-authorization.d.ts +10 -100
- 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/handlers/records-write.d.ts +2 -1
- package/dist/types/src/handlers/records-write.d.ts.map +1 -1
- package/dist/types/src/interfaces/protocols-configure.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 +35 -0
- package/dist/types/src/interfaces/records-write-signing.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-write.d.ts +10 -44
- package/dist/types/src/interfaces/records-write.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 +0 -58
- package/dist/types/src/store/index-level.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 +3 -1
- package/dist/types/src/utils/records.d.ts.map +1 -1
- package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/core/protocol-authorization-action.ts +377 -0
- package/src/core/protocol-authorization-validation.ts +391 -0
- package/src/core/protocol-authorization.ts +60 -849
- package/src/core/record-chain.ts +99 -0
- package/src/handlers/records-read.ts +1 -1
- package/src/handlers/records-write.ts +37 -21
- package/src/interfaces/protocols-configure.ts +33 -5
- package/src/interfaces/records-write-query.ts +139 -0
- package/src/interfaces/records-write-signing.ts +143 -0
- package/src/interfaces/records-write.ts +49 -221
- package/src/store/index-level-compound.ts +324 -0
- package/src/store/index-level.ts +24 -306
- package/src/utils/protocols.ts +8 -0
- package/src/utils/records.ts +9 -15
|
@@ -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 { DwnInterfaceName } from '../enums/dwn-interface-method.js';
|
|
11
2
|
import { GrantAuthorization } from './grant-authorization.js';
|
|
12
3
|
import { PermissionsProtocol } from '../protocols/permissions.js';
|
|
@@ -18,95 +9,89 @@ export class MessagesGrantAuthorization {
|
|
|
18
9
|
* Authorizes a MessagesReadMessage using the given permission grant.
|
|
19
10
|
* @param messageStore Used to check if the given grant has been revoked; and to fetch related RecordsWrites if needed.
|
|
20
11
|
*/
|
|
21
|
-
static authorizeMessagesRead(input) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
messageStore
|
|
30
|
-
});
|
|
31
|
-
const scope = permissionGrant.scope;
|
|
32
|
-
yield MessagesGrantAuthorization.verifyScope(expectedGrantor, messageToRead, scope, messageStore);
|
|
12
|
+
static async authorizeMessagesRead(input) {
|
|
13
|
+
const { messagesReadMessage, messageToRead, expectedGrantor, expectedGrantee, permissionGrant, messageStore } = input;
|
|
14
|
+
await GrantAuthorization.performBaseValidation({
|
|
15
|
+
incomingMessage: messagesReadMessage,
|
|
16
|
+
expectedGrantor,
|
|
17
|
+
expectedGrantee,
|
|
18
|
+
permissionGrant,
|
|
19
|
+
messageStore
|
|
33
20
|
});
|
|
21
|
+
const scope = permissionGrant.scope;
|
|
22
|
+
await MessagesGrantAuthorization.verifyScope(expectedGrantor, messageToRead, scope, messageStore);
|
|
34
23
|
}
|
|
35
24
|
/**
|
|
36
25
|
* Authorizes the scope of a permission grant for MessagesSubscribe or MessagesSync.
|
|
37
26
|
* @param messageStore Used to check if the grant has been revoked.
|
|
38
27
|
*/
|
|
39
|
-
static authorizeSubscribeOrSync(input) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
throw new DwnError(DwnErrorCode.MessagesGrantAuthorizationMismatchedProtocol, `The protocol ${syncMessage.descriptor.protocol} does not match the scoped protocol ${scopedProtocol}`);
|
|
57
|
-
}
|
|
28
|
+
static async authorizeSubscribeOrSync(input) {
|
|
29
|
+
const { incomingMessage, expectedGrantor, expectedGrantee, permissionGrant, messageStore } = input;
|
|
30
|
+
await GrantAuthorization.performBaseValidation({
|
|
31
|
+
incomingMessage,
|
|
32
|
+
expectedGrantor,
|
|
33
|
+
expectedGrantee,
|
|
34
|
+
permissionGrant,
|
|
35
|
+
messageStore
|
|
36
|
+
});
|
|
37
|
+
// if the grant is scoped to a specific protocol, ensure that the message targets that protocol
|
|
38
|
+
if (PermissionsProtocol.hasProtocolScope(permissionGrant.scope)) {
|
|
39
|
+
const scopedProtocol = permissionGrant.scope.protocol;
|
|
40
|
+
// MessagesSync uses a direct `protocol` field on the descriptor
|
|
41
|
+
if ('action' in incomingMessage.descriptor) {
|
|
42
|
+
const syncMessage = incomingMessage;
|
|
43
|
+
if (syncMessage.descriptor.protocol !== scopedProtocol) {
|
|
44
|
+
throw new DwnError(DwnErrorCode.MessagesGrantAuthorizationMismatchedProtocol, `The protocol ${syncMessage.descriptor.protocol} does not match the scoped protocol ${scopedProtocol}`);
|
|
58
45
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// MessagesSubscribe uses filters
|
|
49
|
+
const filteredMessage = incomingMessage;
|
|
50
|
+
for (const filter of filteredMessage.descriptor.filters) {
|
|
51
|
+
if (filter.protocol !== scopedProtocol) {
|
|
52
|
+
throw new DwnError(DwnErrorCode.MessagesGrantAuthorizationMismatchedProtocol, `The protocol ${filter.protocol} does not match the scoped protocol ${scopedProtocol}`);
|
|
66
53
|
}
|
|
67
54
|
}
|
|
68
55
|
}
|
|
69
|
-
}
|
|
56
|
+
}
|
|
70
57
|
}
|
|
71
58
|
/**
|
|
72
59
|
* Verifies the given record against the scope of the given grant.
|
|
73
60
|
*/
|
|
74
|
-
static verifyScope(tenant, messageToGet, incomingScope, messageStore) {
|
|
75
|
-
|
|
76
|
-
if
|
|
77
|
-
|
|
61
|
+
static async verifyScope(tenant, messageToGet, incomingScope, messageStore) {
|
|
62
|
+
if (incomingScope.protocol === undefined) {
|
|
63
|
+
// if no protocol is specified in the scope, then the grant is for all records
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (messageToGet.descriptor.interface === DwnInterfaceName.Records) {
|
|
67
|
+
// if the message is a Records interface message, get the RecordsWrite message associated with the record
|
|
68
|
+
const recordsMessage = messageToGet;
|
|
69
|
+
const recordsWriteMessage = Records.isRecordsWrite(recordsMessage) ? recordsMessage :
|
|
70
|
+
await RecordsWrite.fetchNewestRecordsWrite(messageStore, tenant, recordsMessage.descriptor.recordId);
|
|
71
|
+
if (recordsWriteMessage.descriptor.protocol === incomingScope.protocol) {
|
|
72
|
+
// the record protocol matches the incoming scope protocol
|
|
78
73
|
return;
|
|
79
74
|
}
|
|
80
|
-
if
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
// the record protocol matches the incoming scope protocol
|
|
75
|
+
// we check if the protocol is the internal PermissionsProtocol for further validation
|
|
76
|
+
if (recordsWriteMessage.descriptor.protocol === PermissionsProtocol.uri) {
|
|
77
|
+
// get the permission scope from the permission message
|
|
78
|
+
const permissionScope = await PermissionsProtocol.getScopeFromPermissionRecord(tenant, messageStore, recordsWriteMessage);
|
|
79
|
+
if (PermissionsProtocol.hasProtocolScope(permissionScope) && permissionScope.protocol === incomingScope.protocol) {
|
|
80
|
+
// the permissions record scoped protocol matches the incoming scope protocol
|
|
87
81
|
return;
|
|
88
82
|
}
|
|
89
|
-
// we check if the protocol is the internal PermissionsProtocol for further validation
|
|
90
|
-
if (recordsWriteMessage.descriptor.protocol === PermissionsProtocol.uri) {
|
|
91
|
-
// get the permission scope from the permission message
|
|
92
|
-
const permissionScope = yield PermissionsProtocol.getScopeFromPermissionRecord(tenant, messageStore, recordsWriteMessage);
|
|
93
|
-
if (PermissionsProtocol.hasProtocolScope(permissionScope) && permissionScope.protocol === incomingScope.protocol) {
|
|
94
|
-
// the permissions record scoped protocol matches the incoming scope protocol
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
83
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
84
|
+
}
|
|
85
|
+
else if (messageToGet.descriptor.interface === DwnInterfaceName.Protocols) {
|
|
86
|
+
// if the message is a protocol message, it must be a `ProtocolConfigure` message
|
|
87
|
+
const protocolsConfigureMessage = messageToGet;
|
|
88
|
+
const configureProtocol = protocolsConfigureMessage.descriptor.definition.protocol;
|
|
89
|
+
if (configureProtocol === incomingScope.protocol) {
|
|
90
|
+
// the configured protocol matches the incoming scope protocol
|
|
91
|
+
return;
|
|
107
92
|
}
|
|
108
|
-
|
|
109
|
-
|
|
93
|
+
}
|
|
94
|
+
throw new DwnError(DwnErrorCode.MessagesReadVerifyScopeFailed, 'record message failed scope authorization');
|
|
110
95
|
}
|
|
111
96
|
}
|
|
112
97
|
//# sourceMappingURL=messages-grant-authorization.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages-grant-authorization.js","sourceRoot":"","sources":["../../../../src/core/messages-grant-authorization.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"messages-grant-authorization.js","sourceRoot":"","sources":["../../../../src/core/messages-grant-authorization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { FilterUtility } from '../utils/filter.js';
|
|
2
|
+
import { RecordsWrite } from '../interfaces/records-write.js';
|
|
3
|
+
import { DwnError, DwnErrorCode } from './dwn-error.js';
|
|
4
|
+
import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
|
|
5
|
+
import { getRuleSetAtPath, isCrossProtocolRef, parseCrossProtocolRef } from '../utils/protocols.js';
|
|
6
|
+
import { ProtocolAction, ProtocolActor } from '../types/protocols-types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Check if the incoming message is invoking a role. If so, validate the invoked role.
|
|
9
|
+
* For cross-protocol role invocation, the role record may live in a different protocol
|
|
10
|
+
* (resolved via the composing protocol's `uses` map).
|
|
11
|
+
*/
|
|
12
|
+
export async function verifyInvokedRole(tenant, incomingMessage, protocolUri, contextId, protocolDefinition, messageStore, fetchProtocolDefinition, governingTimestamp) {
|
|
13
|
+
const protocolRole = incomingMessage.signaturePayload?.protocolRole;
|
|
14
|
+
// Only verify role if there is a role being invoked
|
|
15
|
+
if (protocolRole === undefined) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
// Determine the protocol URI and protocol path for the role record.
|
|
19
|
+
// For cross-protocol roles (e.g., "threads:thread/participant"), resolve the alias.
|
|
20
|
+
let roleProtocolUri = protocolUri;
|
|
21
|
+
let roleProtocolPath = protocolRole;
|
|
22
|
+
if (isCrossProtocolRef(protocolRole)) {
|
|
23
|
+
const parsed = parseCrossProtocolRef(protocolRole);
|
|
24
|
+
if (parsed === undefined) {
|
|
25
|
+
throw new DwnError(DwnErrorCode.ProtocolAuthorizationNotARole, `Cross-protocol role '${protocolRole}' could not be parsed as a valid 'alias:path' format.`);
|
|
26
|
+
}
|
|
27
|
+
if (protocolDefinition.uses === undefined || protocolDefinition.uses[parsed.alias] === undefined) {
|
|
28
|
+
throw new DwnError(DwnErrorCode.ProtocolAuthorizationNotARole, `Cross-protocol role alias '${parsed.alias}' in '${protocolRole}' does not exist in the protocol's 'uses' map.`);
|
|
29
|
+
}
|
|
30
|
+
roleProtocolUri = protocolDefinition.uses[parsed.alias];
|
|
31
|
+
roleProtocolPath = parsed.protocolPath;
|
|
32
|
+
// Fetch the referenced protocol's definition to validate the role exists
|
|
33
|
+
const refDefinition = await fetchProtocolDefinition(tenant, roleProtocolUri, messageStore, governingTimestamp);
|
|
34
|
+
const roleRuleSet = getRuleSetAtPath(roleProtocolPath, refDefinition.structure);
|
|
35
|
+
if (roleRuleSet === undefined || !roleRuleSet.$role) {
|
|
36
|
+
throw new DwnError(DwnErrorCode.ProtocolAuthorizationNotARole, `Cross-protocol role path ${protocolRole} does not match role record type.`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// Local role: validate in the composing protocol's definition
|
|
41
|
+
const roleRuleSet = getRuleSetAtPath(protocolRole, protocolDefinition.structure);
|
|
42
|
+
if (roleRuleSet === undefined || !roleRuleSet.$role) {
|
|
43
|
+
throw new DwnError(DwnErrorCode.ProtocolAuthorizationNotARole, `Protocol path ${protocolRole} does not match role record type.`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Construct a filter to fetch the invoked role record
|
|
47
|
+
const roleRecordFilter = {
|
|
48
|
+
interface: DwnInterfaceName.Records,
|
|
49
|
+
method: DwnMethodName.Write,
|
|
50
|
+
protocol: roleProtocolUri,
|
|
51
|
+
protocolPath: roleProtocolPath,
|
|
52
|
+
recipient: incomingMessage.author,
|
|
53
|
+
isLatestBaseState: true,
|
|
54
|
+
};
|
|
55
|
+
const ancestorSegmentCountOfRolePath = roleProtocolPath.split('/').length - 1;
|
|
56
|
+
if (contextId === undefined && ancestorSegmentCountOfRolePath > 0) {
|
|
57
|
+
throw new DwnError(DwnErrorCode.ProtocolAuthorizationMissingContextId, 'Could not verify role because contextId is missing.');
|
|
58
|
+
}
|
|
59
|
+
// Compute `contextId` prefix filter for fetching the invoked role record if the role path is not at the root level.
|
|
60
|
+
// e.g. if invoked role path is `Thread/Participant`, and the `contextId` of the message is `threadX/messageY/attachmentZ`,
|
|
61
|
+
// then we need to add a prefix filter as `threadX` for the `contextId`
|
|
62
|
+
// because the `contextId` of the Participant record would be in the form of be `threadX/participantA`
|
|
63
|
+
if (ancestorSegmentCountOfRolePath > 0) {
|
|
64
|
+
const contextIdSegments = contextId.split('/'); // NOTE: currently contextId segment count is never shorter than the role path count.
|
|
65
|
+
const contextIdPrefix = contextIdSegments.slice(0, ancestorSegmentCountOfRolePath).join('/');
|
|
66
|
+
const contextIdPrefixFilter = FilterUtility.constructPrefixFilterAsRangeFilter(contextIdPrefix);
|
|
67
|
+
roleRecordFilter.contextId = contextIdPrefixFilter;
|
|
68
|
+
}
|
|
69
|
+
const { messages: matchingMessages } = await messageStore.query(tenant, [roleRecordFilter]);
|
|
70
|
+
if (matchingMessages.length === 0) {
|
|
71
|
+
throw new DwnError(DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound, `No matching role record found for protocol path ${roleProtocolPath}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Returns all the ProtocolActions that would authorized the incoming message
|
|
76
|
+
* (but we still need to later verify if there is a rule defined that matches one of the actions).
|
|
77
|
+
* NOTE: the reason why there could be multiple actions is because:
|
|
78
|
+
* - In case of an initial RecordsWrite, the RecordsWrite can be authorized by an allow `create` or `write` rule.
|
|
79
|
+
* - In case of a non-initial RecordsWrite by the original record author, the RecordsWrite can be authorized by a `write` or `co-update` rule.
|
|
80
|
+
*
|
|
81
|
+
* It is important to recognize that the `write` access that allowed the original record author to create the record maybe revoked
|
|
82
|
+
* (e.g. by role revocation) by the time a "non-initial" write by the same author is attempted.
|
|
83
|
+
*/
|
|
84
|
+
export async function getActionsSeekingARuleMatch(tenant, incomingMessage, messageStore) {
|
|
85
|
+
switch (incomingMessage.message.descriptor.method) {
|
|
86
|
+
case DwnMethodName.Delete:
|
|
87
|
+
const recordsDelete = incomingMessage;
|
|
88
|
+
const recordId = recordsDelete.message.descriptor.recordId;
|
|
89
|
+
const initialWrite = await RecordsWrite.fetchInitialRecordsWrite(messageStore, tenant, recordId);
|
|
90
|
+
// if there is no initial write, then no action rule can authorize the incoming message, because we won't know who the original author is
|
|
91
|
+
// NOTE: purely defensive programming: currently not reachable
|
|
92
|
+
// because RecordsDelete handler already have an existence check prior to this method being called.
|
|
93
|
+
if (initialWrite === undefined) {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
const actionsThatWouldAuthorizeDelete = [];
|
|
97
|
+
const prune = recordsDelete.message.descriptor.prune;
|
|
98
|
+
if (prune) {
|
|
99
|
+
actionsThatWouldAuthorizeDelete.push(ProtocolAction.CoPrune);
|
|
100
|
+
// A prune by the original record author can also be authorized by a 'prune' rule.
|
|
101
|
+
if (incomingMessage.author === initialWrite.author) {
|
|
102
|
+
actionsThatWouldAuthorizeDelete.push(ProtocolAction.Prune);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
actionsThatWouldAuthorizeDelete.push(ProtocolAction.CoDelete);
|
|
107
|
+
// A delete by the original record author can also be authorized by a 'delete' rule.
|
|
108
|
+
if (incomingMessage.author === initialWrite.author) {
|
|
109
|
+
actionsThatWouldAuthorizeDelete.push(ProtocolAction.Delete);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return actionsThatWouldAuthorizeDelete;
|
|
113
|
+
case DwnMethodName.Count:
|
|
114
|
+
return [ProtocolAction.Read];
|
|
115
|
+
case DwnMethodName.Query:
|
|
116
|
+
return [ProtocolAction.Read];
|
|
117
|
+
case DwnMethodName.Read:
|
|
118
|
+
return [ProtocolAction.Read];
|
|
119
|
+
case DwnMethodName.Subscribe:
|
|
120
|
+
return [ProtocolAction.Read];
|
|
121
|
+
case DwnMethodName.Write:
|
|
122
|
+
const incomingRecordsWrite = incomingMessage;
|
|
123
|
+
if (await incomingRecordsWrite.isInitialWrite()) {
|
|
124
|
+
return [ProtocolAction.Create];
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// else incoming RecordsWrite not an initial write
|
|
128
|
+
const recordId = incomingMessage.message.recordId;
|
|
129
|
+
const initialWrite = await RecordsWrite.fetchInitialRecordsWrite(messageStore, tenant, recordId);
|
|
130
|
+
// if there is no initial write to update from, then no action rule can authorize the incoming message
|
|
131
|
+
if (initialWrite === undefined) {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
if (incomingMessage.author === initialWrite.author) {
|
|
135
|
+
// 'update' or 'co-update' action authorizes the incoming message
|
|
136
|
+
return [ProtocolAction.CoUpdate, ProtocolAction.Update];
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// An update by someone who is not the record author can only be authorized by a 'co-update' rule.
|
|
140
|
+
return [ProtocolAction.CoUpdate];
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// purely defensive programming: should not be reachable
|
|
145
|
+
// setting to empty array will prevent any message from being authorized
|
|
146
|
+
return [];
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Verifies the given message is authorized by one of the action rules in the given protocol rule set.
|
|
150
|
+
* @param protocolDefinition Optional protocol definition for resolving cross-protocol `of` and `role` references.
|
|
151
|
+
* @throws {Error} if action not allowed.
|
|
152
|
+
*/
|
|
153
|
+
export async function authorizeAgainstAllowedActions(tenant, incomingMessage, ruleSet, recordChain, messageStore, protocolDefinition) {
|
|
154
|
+
const incomingMessageMethod = incomingMessage.message.descriptor.method;
|
|
155
|
+
const actionsSeekingARuleMatch = await getActionsSeekingARuleMatch(tenant, incomingMessage, messageStore);
|
|
156
|
+
const author = incomingMessage.author;
|
|
157
|
+
const actionRules = ruleSet.$actions;
|
|
158
|
+
// NOTE: We have already checked that the message is not from tenant, owner, or permission grant authorized prior to this method being called.
|
|
159
|
+
if (actionRules === undefined) {
|
|
160
|
+
throw new DwnError(DwnErrorCode.ProtocolAuthorizationActionRulesNotFound, `no action rule defined for Records${incomingMessageMethod}, ${author} is unauthorized`);
|
|
161
|
+
}
|
|
162
|
+
const invokedRole = incomingMessage.signaturePayload?.protocolRole;
|
|
163
|
+
// Iterate through the action rules to find a rule that authorizes the incoming message.
|
|
164
|
+
for (const actionRule of actionRules) {
|
|
165
|
+
// If the action rule does not have an allowed action that matches an action that can authorize the message, skip to evaluate next action rule.
|
|
166
|
+
const ruleHasAMatchingAllowedAction = actionRule.can.some((allowedAction) => actionsSeekingARuleMatch.includes(allowedAction));
|
|
167
|
+
if (!ruleHasAMatchingAllowedAction) {
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
// Code reaches here means this action rule has an allowed action that matches the action of the message.
|
|
171
|
+
// The remaining code checks the actor/author of the incoming message.
|
|
172
|
+
// If the action rule allows `anyone`, then no further checks are needed.
|
|
173
|
+
if (actionRule.who === ProtocolActor.Anyone) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
// Since not `anyone` is allowed in this action rule, we will need to check the author of the incoming message,
|
|
177
|
+
// if the author of incoming message is not defined, this action rule cannot authorize the incoming message.
|
|
178
|
+
if (author === undefined) {
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
// go through role validation path if a role is invoked by the incoming message
|
|
182
|
+
if (invokedRole !== undefined) {
|
|
183
|
+
// When a protocol role is being invoked, we require that there is a matching `role` rule.
|
|
184
|
+
if (actionRule.role === invokedRole) {
|
|
185
|
+
// role is successfully invoked
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// else we go through the actor (`who`) validation
|
|
193
|
+
// If `of` is not set, handle it as a special case
|
|
194
|
+
// NOTE: `of` is always set if `who` is set to `author` (we do this check in `validateRuleSetRecursively()`)
|
|
195
|
+
if (actionRule.who === ProtocolActor.Recipient && actionRule.of === undefined) {
|
|
196
|
+
// If the action rule specifies a recipient without `of` and the incoming message is authenticated:
|
|
197
|
+
// Author must be recipient of the record being accessed
|
|
198
|
+
let recordsWriteMessage;
|
|
199
|
+
if (incomingMessage.message.descriptor.method === DwnMethodName.Write) {
|
|
200
|
+
recordsWriteMessage = incomingMessage.message;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
// else the incoming message must be a `RecordsDelete` because only `co-update`, `co-delete`, `co-prune` are allowed recipient actions,
|
|
204
|
+
// (we do this check in `validateRuleSetRecursively()`)
|
|
205
|
+
// and we have already checked that the incoming message is not a `RecordsWrite` above which covers `co-update` path.
|
|
206
|
+
recordsWriteMessage = recordChain[recordChain.length - 1];
|
|
207
|
+
}
|
|
208
|
+
if (recordsWriteMessage.descriptor.recipient === author) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// validate the actor is allowed by the current action rule
|
|
216
|
+
const ancestorRuleSuccess = await checkActor(author, actionRule, recordChain, protocolDefinition);
|
|
217
|
+
if (ancestorRuleSuccess) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// No action rules were satisfied, message is not authorized
|
|
222
|
+
throw new DwnError(DwnErrorCode.ProtocolAuthorizationActionNotAllowed, `Inbound message action Records${incomingMessageMethod} by author ${incomingMessage.author} not allowed.`);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Checks if the `who: 'author' | 'recipient'` action rule has a matching record in the record chain.
|
|
226
|
+
* For cross-protocol `of` references (e.g., `"threads:thread"`), matches against both the protocol URI
|
|
227
|
+
* and the protocol path of the ancestor record.
|
|
228
|
+
* @returns `true` if the action rule is satisfied; `false` otherwise.
|
|
229
|
+
*/
|
|
230
|
+
export async function checkActor(author, actionRule, recordChain, composingDefinition) {
|
|
231
|
+
const ofValue = actionRule.of;
|
|
232
|
+
// `of` should always be defined when `checkActor` is called, but guard defensively
|
|
233
|
+
if (ofValue === undefined) {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
let ancestorRecordsWrite;
|
|
237
|
+
if (isCrossProtocolRef(ofValue) && composingDefinition?.uses !== undefined) {
|
|
238
|
+
// Cross-protocol `of`: resolve alias to protocol URI and match by both protocol + protocolPath
|
|
239
|
+
const parsed = parseCrossProtocolRef(ofValue);
|
|
240
|
+
if (parsed !== undefined) {
|
|
241
|
+
const refProtocolUri = composingDefinition.uses[parsed.alias];
|
|
242
|
+
if (refProtocolUri !== undefined) {
|
|
243
|
+
ancestorRecordsWrite = recordChain.find((msg) => msg.descriptor.protocol === refProtocolUri && msg.descriptor.protocolPath === parsed.protocolPath);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
// Local `of`: match by protocolPath only (same protocol assumed)
|
|
249
|
+
ancestorRecordsWrite = recordChain.find((msg) => msg.descriptor.protocolPath === ofValue);
|
|
250
|
+
}
|
|
251
|
+
if (ancestorRecordsWrite === undefined) {
|
|
252
|
+
// No matching ancestor found in the record chain. Return false to allow the caller
|
|
253
|
+
// to continue evaluating other action rules that might authorize the request.
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
if (actionRule.who === ProtocolActor.Recipient) {
|
|
257
|
+
// author of the incoming message must be the recipient of the ancestor message
|
|
258
|
+
return author === ancestorRecordsWrite.descriptor.recipient;
|
|
259
|
+
}
|
|
260
|
+
else { // actionRule.who === ProtocolActor.Author
|
|
261
|
+
// author of the incoming message must be the author of the ancestor message
|
|
262
|
+
const ancestorAuthor = (await RecordsWrite.parse(ancestorRecordsWrite)).author;
|
|
263
|
+
return author === ancestorAuthor;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=protocol-authorization-action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol-authorization-action.js","sourceRoot":"","sources":["../../../../src/core/protocol-authorization-action.ts"],"names":[],"mappings":"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"}
|