@seams/wallet-server 0.8.0 → 0.9.1
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/THIRD_PARTY_NOTICES.md +7 -1
- package/artifact-manifest.json +196 -41
- package/cloudflare-router-ab/build/deriver-a/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/deriver-a/index.js +2 -2
- package/cloudflare-router-ab/build/deriver-a/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/deriver-b/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/deriver-b/index.js +2 -2
- package/cloudflare-router-ab/build/deriver-b/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/local-tools/darwin-arm64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/local-tools/darwin-x64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/local-tools/linux-x64/router_ab_local_init +0 -0
- package/cloudflare-router-ab/build/router/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/router/index.js +2 -2
- package/cloudflare-router-ab/build/router/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/signing-worker/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/signing-worker/index.js +2 -2
- package/cloudflare-router-ab/build/signing-worker/index_bg.wasm +0 -0
- package/cloudflare-router-ab/build/tenant-root-control-plane/build-stamp.json +1 -1
- package/cloudflare-router-ab/build/tenant-root-control-plane/index.js +2 -2
- package/cloudflare-router-ab/build/tenant-root-control-plane/index_bg.wasm +0 -0
- package/cloudflare-router-ab/migrations/deriver-a/0019_wallet_object_addresses.sql +10 -0
- package/cloudflare-router-ab/migrations/deriver-b/0019_wallet_object_addresses.sql +10 -0
- package/cloudflare-router-ab/scripts/prepare-local-runtime-config.mjs +3 -117
- package/cloudflare-router-ab/wrangler.deriver-a.toml +0 -8
- package/cloudflare-router-ab/wrangler.deriver-b.toml +24 -8
- package/cloudflare-router-ab/wrangler.router.toml +0 -2
- package/cloudflare-router-ab/wrangler.signing-worker.toml +29 -0
- package/dist/esm/authorization/domain.js +3 -2
- package/dist/esm/authorization/ed25519WalletSessionAdmission.js +0 -0
- package/dist/esm/authorization/service.js +64 -36
- package/dist/esm/cloud-host.js +24 -19
- package/dist/esm/core/EmailOtpRecords.js +29 -6
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.js +2 -0
- package/dist/esm/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.js +10 -0
- package/dist/esm/core/ThresholdService/routerAb/internalServiceHttp.js +1 -0
- package/dist/esm/core/ThresholdService/validation.js +2 -2
- package/dist/esm/core/authService/nearPrivateKeySigning.js +1 -1
- package/dist/esm/core/authService/webauthn.js +1 -1
- package/dist/esm/core/d1Ed25519SignerRead.js +55 -0
- package/dist/esm/core/d1WalletStore.js +14 -11
- package/dist/esm/core/deviceLinking/linkedDeviceEmailOtpGrant.js +2 -2
- package/dist/esm/core/deviceLinking/linkedDeviceManagement.js +1 -1
- package/dist/esm/core/deviceLinking/linkedDeviceSessionRecord.js +2 -2
- package/dist/esm/core/emailOtpD1Statements.js +1 -0
- package/dist/esm/core/nearRelayerAccountProvisioning.js +1 -1
- package/dist/esm/core/routerAbSigning/RouterAbEcdsaPresignRuntime.js +4 -0
- package/dist/esm/core/signingLanes/WalletExecutionLaneProjection.js +1 -1
- package/dist/esm/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.js +1 -0
- package/dist/esm/hosted-wallet-gateway.js +93 -10
- package/dist/esm/localHostedWalletGatewayHandler.js +12 -9
- package/dist/esm/localIntendedYaoSigningFault.js +2 -30
- package/dist/esm/localRegistrationSetupAuthority.js +8 -1
- package/dist/esm/router/auth/commonRouterUtils.js +17 -10
- package/dist/esm/router/auth/routerApiCredentialAuth.js +26 -7
- package/dist/esm/router/auth/walletRegistrationContext.js +49 -0
- package/dist/esm/router/auth/webAuthnCredentialCodecs.js +1 -1
- package/dist/esm/router/cloudflare/d1/auth/d1AuthorizationAssembly.js +4 -3
- package/dist/esm/router/cloudflare/d1/auth/d1AuthorizedOperationRouteService.js +2 -0
- package/dist/esm/router/cloudflare/d1/auth/d1EmailOtpRouteService.js +25 -0
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthConfig.js +14 -6
- package/dist/esm/router/cloudflare/d1/auth/d1RouterApiAuthService.js +44 -40
- package/dist/esm/router/cloudflare/d1/auth/walletSessionCredentialReaders.js +17 -1
- package/dist/esm/router/cloudflare/d1/authorization/authorizedOperationStatements.js +35 -5
- package/dist/esm/router/cloudflare/d1/authorization/d1AuthorizationStore.js +258 -99
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.js +31 -4
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceOwnerAuthorizationProvider.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceRequestProofNonceStore.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceSessionRecords.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetCredentialProvider.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceTargetPlanner.js +1 -1
- package/dist/esm/router/cloudflare/d1/deviceLinking/d1LinkedDeviceVerifiedLinkBuilder.js +1 -1
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.js +11 -2
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.js +100 -10
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.js +92 -0
- package/dist/esm/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.js +77 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.js +14 -8
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.js +14 -8
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.js +3 -1
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.js +58 -38
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.js +27 -20
- package/dist/esm/router/cloudflare/d1/emailOtp/d1EmailOtpRecoveryService.js +1 -0
- package/dist/esm/router/cloudflare/d1/emailOtp/d1GoogleEmailOtpSessionResolver.js +1 -0
- package/dist/esm/router/cloudflare/d1/oidc/d1OidcBoundary.js +1 -1
- package/dist/esm/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.js +18 -7
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.js +75 -14
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyRecords.js +1 -1
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.js +49 -29
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSessionTransaction.js +28 -0
- package/dist/esm/router/cloudflare/d1/registration/d1RegistrationSetupSupport.js +11 -1
- package/dist/esm/router/cloudflare/d1/registration/d1WalletExecutionAuthority.js +168 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletOperationStore.js +53 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.js +83 -42
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationInitialSession.js +33 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationPreparation.js +16 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationRead.js +58 -0
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationService.js +439 -500
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetup.js +1 -1
- package/dist/esm/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.js +104 -90
- package/dist/esm/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.js +78 -44
- package/dist/esm/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.js +11 -35
- package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js +98 -39
- package/dist/esm/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.js +12 -9
- package/dist/esm/router/cloudflare/d1/wallet/authorizationSnapshotLayout.js +168 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerFinalizeRecord.js +1 -1
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAddSignerService.js +15 -6
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthMethodService.js +3 -40
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorityStore.js +54 -1
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.js +157 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.js +56 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.js +238 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationIntake.js +287 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletAuthorizationSnapshot.js +295 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.js +140 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.js +170 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.js +60 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationOwner.js +33 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.js +74 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.js +77 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.js +37 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationSessions.js +97 -0
- package/dist/esm/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.js +133 -0
- package/dist/esm/router/cloudflare/d1/walletObjectAddresses.js +47 -0
- package/dist/esm/router/cloudflare/d1/webauthn/d1WebAuthnAuthService.js +1 -1
- package/dist/esm/router/cloudflare/runtime/routerAbServiceBindings.js +32 -1
- package/dist/esm/router/cloudflare/runtime/staticWalletConsoleBinding.js +20 -8
- package/dist/esm/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.js +488 -0
- package/dist/esm/router/cloudflare/runtime/walletConsoleOps.js +1 -1
- package/dist/esm/router/cloudflare/runtime/walletConsoleOpsClient.js +26 -6
- package/dist/esm/router/cloudflare/runtime/walletControlOps.js +3 -0
- package/dist/esm/router/cloudflare/runtime/walletGateway.js +1 -1
- package/dist/esm/router/cloudflare/runtime/walletObjectAddresses.js +105 -0
- package/dist/esm/router/cloudflare/runtime/walletPlacementRoutes.js +339 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationDeriver.js +244 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationEcdsa.js +212 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationEd25519.js +172 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationOps.js +183 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationPresign.js +185 -0
- package/dist/esm/router/cloudflare/runtime/walletRelocationSource.js +221 -0
- package/dist/esm/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.js +30 -8
- package/dist/esm/router/cloudflare-adaptor.js +8 -8
- package/dist/esm/router/cloudflare.js +34115 -32240
- package/dist/esm/router/domains/ecdsa/routerAbEcdsaStrictRegistration.js +35 -9
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.js +42 -0
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js +32 -6
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.js +61 -1
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPersistence.js +70 -3
- package/dist/esm/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationRequestScopedRuntime.js +59 -87
- package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.js +52 -22
- package/dist/esm/router/domains/ed25519Yao/export/routerAbEd25519YaoExportRequestScopedCloudflare.js +10 -7
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.js +108 -78
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryRequestScopedCloudflare.js +19 -5
- package/dist/esm/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.js +71 -22
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.js +37 -25
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.js +3 -3
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.js +2 -1
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.js +24 -3
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationRequestScopedCloudflare.js +4 -3
- package/dist/esm/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js +20 -7
- package/dist/esm/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.js +7 -1
- package/dist/esm/router/domains/emailOtp/emailOtpRouteHandlers.js +2 -2
- package/dist/esm/router/domains/passkeyCustody/passkeyCustodyEnvelopeRetrieval.js +1 -1
- package/dist/esm/router/domains/passkeyCustody/registrationCustodyOutcome.js +34 -18
- package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.js +2 -2
- package/dist/esm/router/domains/passkeyCustody/walletCustodyRegistrationCommit.js +16 -6
- package/dist/esm/router/domains/signingOperations/authorizedOperationWire.js +73 -0
- package/dist/esm/router/domains/signingOperations/ecdsaSigningResponse.js +31 -0
- package/dist/esm/router/domains/signingOperations/ed25519AuthorizedOperationReceipt.js +1 -1
- package/dist/esm/router/domains/signingOperations/routerAbEcdsaDerivationNormalSigningRoute.js +2 -1
- package/dist/esm/router/domains/signingOperations/routerAbEd25519NormalSigningRoute.js +31 -121
- package/dist/esm/router/domains/signingOperations/routerAbNormalSigningAdmission.js +2 -93
- package/dist/esm/router/domains/signingOperations/routerAbPrivateSigningWorker.js +1 -1
- package/dist/esm/router/domains/signingOperations/signingPrepareSession.js +33 -0
- package/dist/esm/router/domains/walletRegistration/registrationSessionSeal.js +121 -0
- package/dist/esm/router/domains/walletRegistration/walletRegistrationReservation.js +4 -4
- package/dist/esm/router/domains/walletRegistration/walletRegistrationRoutes.js +46 -157
- package/dist/esm/router/domains/walletRegistration/walletRegistrationSetupPayload.js +1 -1
- package/dist/esm/router/express.js +764 -894
- package/dist/esm/router/framework/http.js +2 -1
- package/dist/esm/router/transport/fetch/createFetchRouter.js +2 -2
- package/dist/esm/router/transport/fetch/routes/auth.js +1 -1
- package/dist/esm/router/transport/fetch/routes/deviceLinking.js +3 -3
- package/dist/esm/router/transport/fetch/routes/deviceLinkingOwnerAuthorization.js +2 -2
- package/dist/esm/router/transport/fetch/routes/ed25519AuthorizedOperationRevalidation.js +65 -0
- package/dist/esm/router/transport/fetch/routes/normalSigningRouterProxy.js +13 -3
- package/dist/esm/router/transport/fetch/routes/passkeyCustody.js +3 -3
- package/dist/esm/router/transport/fetch/routes/sessions.js +3 -2
- package/dist/esm/router/transport/fetch/routes/thresholdEcdsa.js +67 -130
- package/dist/esm/router/transport/fetch/routes/thresholdEd25519.js +76 -212
- package/dist/esm/router/transport/fetch/routes/walletExecutionLanePreflight.js +18 -41
- package/dist/esm/router/transport/fetch/routes/walletRegistration.js +6 -5
- package/dist/esm/router/transport/fetch/routes/webauthnAuthenticators.js +1 -1
- package/dist/esm/shared-ts/src/authorization/index.js +1 -1
- package/dist/esm/shared-ts/src/authorization/walletAuthority.js +2 -2
- package/dist/esm/shared-ts/src/device-linking/activeWalletSession.js +12 -2
- package/dist/esm/shared-ts/src/device-linking/digests.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/ed25519ExportRoot.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/index.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/parsers.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/sourceContribution.js +1 -1
- package/dist/esm/shared-ts/src/device-linking/wireFields.js +1 -1
- package/dist/esm/shared-ts/src/near/nearClient.js +1 -1
- package/dist/esm/shared-ts/src/signing-lanes/ownerContinuity.js +2 -2
- package/dist/esm/shared-ts/src/utils/ecdsaServerTiming.js +6 -1
- package/dist/esm/shared-ts/src/utils/emailOtpDomain.js +4 -2
- package/dist/esm/shared-ts/src/utils/routerAbEcdsaDerivation.js +1 -1
- package/dist/esm/shared-ts/src/utils/routerAbPublicKeyset.js +0 -27
- package/dist/esm/shared-ts/src/wallet-recovery/walletRecoveryEcdsaPossession.js +1 -1
- package/dist/esm/threshold/session/signingSessionSeal/options.js +1 -1
- package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
- package/dist/types/shared-ts/src/device-linking/activeWalletSession.d.ts +2 -1
- package/dist/types/shared-ts/src/device-linking/contracts.d.ts +10 -0
- package/dist/types/shared-ts/src/threshold/ed25519OperationFingerprint.d.ts +2 -1
- package/dist/types/shared-ts/src/utils/emailOtpDomain.d.ts +3 -1
- package/dist/types/shared-ts/src/utils/routerAbPublicKeyset.d.ts +0 -9
- package/dist/types/shared-ts/src/utils/walletManagementProtocol.d.ts +1 -1
- package/dist/types/wallet-server/src/authorization/domain.d.ts +17 -1
- package/dist/types/wallet-server/src/authorization/ecdsaWalletSessionAdmission.d.ts +1 -0
- package/dist/types/wallet-server/src/authorization/ed25519WalletSessionAdmission.d.ts +35 -0
- package/dist/types/wallet-server/src/authorization/ed25519WalletSessionAdmission.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/authorization/service.d.ts +43 -5
- package/dist/types/wallet-server/src/authorization/sessionRouting.d.ts +2 -0
- package/dist/types/wallet-server/src/cloud-host.d.ts +7 -3
- package/dist/types/wallet-server/src/core/EmailOtpRecords.d.ts +2 -1
- package/dist/types/wallet-server/src/core/EmailOtpStores.d.ts +19 -5
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPoolFillHandlers.d.ts +1 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/ecdsaDerivationPresignBridge.d.ts +6 -0
- package/dist/types/wallet-server/src/core/ThresholdService/routerAb/internalServiceHttp.d.ts +1 -0
- package/dist/types/wallet-server/src/core/d1Ed25519SignerRead.d.ts +17 -0
- package/dist/types/wallet-server/src/core/d1WalletStore.d.ts +6 -0
- package/dist/types/wallet-server/src/core/emailOtpD1Statements.d.ts +1 -0
- package/dist/types/wallet-server/src/core/routerAbSigning/RouterAbEcdsaPresignRuntime.d.ts +5 -1
- package/dist/types/wallet-server/src/core/signingMaterial/ordinaryInactiveSignerMaterialReservation.d.ts +1 -0
- package/dist/types/wallet-server/src/core/threeRouteRegistrationContracts.d.ts +14 -48
- package/dist/types/wallet-server/src/hosted-wallet-gateway.d.ts +4 -3
- package/dist/types/wallet-server/src/localIntendedYaoSigningFault.d.ts +1 -16
- package/dist/types/wallet-server/src/localRegistrationSetupAuthority.d.ts +1 -1
- package/dist/types/wallet-server/src/router/auth/commonRouterUtils.d.ts +7 -1
- package/dist/types/wallet-server/src/router/auth/routerApiCredentialAuth.d.ts +11 -3
- package/dist/types/wallet-server/src/router/auth/walletRegistrationContext.d.ts +8 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1AuthorizationAssembly.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1EmailOtpRouteService.d.ts +16 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthConfig.d.ts +7 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/d1RouterApiAuthService.d.ts +4 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/auth/walletSessionCredentialReaders.d.ts +7 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/authorization/d1AuthorizationStore.d.ts +32 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/deviceLinking/d1LinkedDeviceAuthorityInstallService.d.ts +2 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoLifecycleDecisionStore.d.ts +3 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoProductRegistrationPartitionedStateStore.d.ts +1 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1Ed25519YaoStateWriteFence.d.ts +8 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/ed25519Yao/d1WalletCeremonyActivity.d.ts +15 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeIssuer.d.ts +6 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeStore.d.ts +1 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpChallengeVerifier.d.ts +4 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpCounters.typecheck.d.ts +2 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRateLimitStore.d.ts +6 -29
- package/dist/types/wallet-server/src/router/cloudflare/d1/emailOtp/d1EmailOtpRecords.d.ts +21 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/passkeyCustody/d1WalletCustodyCommitStore.d.ts +17 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyRecordStore.d.ts +32 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationCeremonyStore.d.ts +16 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSessionTransaction.d.ts +13 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1RegistrationSetupSupport.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletExecutionAuthority.d.ts +41 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletOperationStore.d.ts +28 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationCommitStore.d.ts +6 -9
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationInitialSession.d.ts +17 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationPreparation.d.ts +12 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationRead.d.ts +43 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationService.d.ts +24 -45
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/d1WalletRegistrationSetupExecution.d.ts +9 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationEstablishedSessionIssuer.d.ts +42 -14
- package/dist/types/wallet-server/src/router/cloudflare/d1/registration/walletRegistrationSessionCommitReceipt.d.ts +5 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.d.ts +24 -1
- package/dist/types/wallet-server/src/router/cloudflare/d1/versionedJson/d1VersionedJsonRecordStore.d.ts +10 -4
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/authorizationSnapshotLayout.d.ts +21 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAddSignerService.d.ts +3 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthMethodService.d.ts +3 -7
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorityStore.d.ts +8 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationCleanup.d.ts +20 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationFreeze.d.ts +12 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationHistory.d.ts +20 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationIntake.d.ts +29 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletAuthorizationSnapshot.d.ts +31 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationApprovals.d.ts +49 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationChallenges.d.ts +47 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationEmailOtp.d.ts +25 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwner.d.ts +88 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationOwnerRequest.d.ts +37 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationPasskey.d.ts +12 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationReadAccess.d.ts +18 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationSessions.d.ts +23 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/wallet/d1WalletRelocationWriteBlock.d.ts +16 -0
- package/dist/types/wallet-server/src/router/cloudflare/d1/walletObjectAddresses.d.ts +14 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/routerAbServiceBindings.d.ts +13 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletAuthorizationRelocationRoutes.d.ts +21 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOps.d.ts +1 -1
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletConsoleOpsClient.d.ts +3 -3
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletControlOps.d.ts +2 -1
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletGateway.d.ts +3 -1
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletObjectAddresses.d.ts +45 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletPlacementRoutes.d.ts +30 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationDeriver.d.ts +11 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationEcdsa.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationEd25519.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationOps.d.ts +11 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationPresign.d.ts +7 -0
- package/dist/types/wallet-server/src/router/cloudflare/runtime/walletRelocationSource.d.ts +26 -0
- package/dist/types/wallet-server/src/router/cloudflare/signingLanes/cloudflareOrdinaryInactiveSignerMaterialReservation.d.ts +5 -0
- package/dist/types/wallet-server/src/router/domains/ecdsa/routerAbEcdsaStrictRegistration.d.ts +3 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoCapabilityCommit.d.ts +7 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.d.ts +41 -7
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistrationPartitionedStateStore.d.ts +33 -2
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/export/routerAbEd25519YaoExport.d.ts +12 -6
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.d.ts +17 -9
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/recovery/routerAbEd25519YaoRecoveryWalletSessionAuthorization.d.ts +2 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoHttpRegistrationBackend.d.ts +13 -14
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistration.d.ts +7 -3
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationExecutionRecord.d.ts +1 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationIntentAuthorization.d.ts +6 -1
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.d.ts +11 -0
- package/dist/types/wallet-server/src/router/domains/ed25519Yao/routerAbEd25519YaoGatewayEnvelope.d.ts +12 -3
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/registrationCustodyOutcome.d.ts +10 -6
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationAdmission.d.ts +10 -3
- package/dist/types/wallet-server/src/router/domains/passkeyCustody/walletCustodyRegistrationCommit.d.ts +12 -5
- package/dist/types/wallet-server/src/router/domains/signingOperations/authorizedOperationWire.d.ts +97 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/ecdsaSigningResponse.d.ts +13 -0
- package/dist/types/wallet-server/src/router/domains/signingOperations/routerAbNormalSigningAdmission.d.ts +9 -206
- package/dist/types/wallet-server/src/router/domains/signingOperations/signingPrepareSession.d.ts +23 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/registrationSessionSeal.d.ts +36 -0
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationInputs.d.ts +7 -7
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationReservation.d.ts +80 -6
- package/dist/types/wallet-server/src/router/domains/walletRegistration/walletRegistrationRoutes.d.ts +15 -5
- package/dist/types/wallet-server/src/router/framework/apiCredentialPorts.d.ts +24 -0
- package/dist/types/wallet-server/src/router/framework/authServicePort.d.ts +21 -7
- package/dist/types/wallet-server/src/router/framework/routerApi.d.ts +3 -12
- package/dist/types/wallet-server/src/router/transport/fetch/routes/ed25519AuthorizedOperationRevalidation.d.ts +37 -0
- package/dist/types/wallet-server/src/router/transport/fetch/routes/thresholdEcdsa.d.ts +1 -17
- package/dist/types/wallet-server/src/storage/tenantRoute.d.ts +1 -1
- package/migrations/d1-signer/0049_wallet_relocation_challenges.sql +16 -0
- package/migrations/d1-signer/0050_wallet_relocation_approvals.sql +14 -0
- package/migrations/d1-signer/0051_wallet_relocation_email_otp.sql +92 -0
- package/migrations/d1-signer/0052_wallet_relocation_session_fences.sql +91 -0
- package/migrations/d1-signer/0053_wallet_hosted_history_import.sql +164 -0
- package/migrations/d1-signer/0054_wallet_authorization_freeze.sql +318 -0
- package/migrations/d1-signer/0055_wallet_authorization_snapshot.sql +120 -0
- package/migrations/d1-signer/0056_wallet_authorization_history_import.sql +424 -0
- package/migrations/d1-signer/0057_wallet_authorization_intake.sql +44 -0
- package/migrations/d1-signer/0058_wallet_ceremony_activity.sql +59 -0
- package/migrations/d1-signer/0059_wallet_authorization_activation.sql +45 -0
- package/migrations/d1-signer/0060_wallet_authorization_cleanup.sql +153 -0
- package/migrations/d1-signer/0061_wallet_session_operation_settlement.sql +28 -0
- package/migrations/d1-signer/0062_wallet_step_up_operation_settlement.sql +204 -0
- package/migrations/d1-signer/0063_wallet_operation_history_transfer.sql +466 -0
- package/migrations/d1-signer/0064_wallet_execution_generations.sql +93 -0
- package/migrations/d1-signer/0065_wallet_operation_execution_generation.sql +37 -0
- package/migrations/d1-signer/0066_regional_deployment_admission.sql +59 -0
- package/migrations/d1-signer/0067_registration_completion_decision.sql +12 -0
- package/migrations/d1-signer/0068_registration_cancellation_write_fence.sql +24 -0
- package/migrations/d1-signer/0069_cancelled_registration_session_fence.sql +11 -0
- package/migrations/d1-signer/0070_wallet_passkey_relocation.sql +369 -0
- package/migrations/d1-signer/0071_regional_wallet_otp_counters.sql +98 -0
- package/migrations/d1-signer/0072_linked_device_relocation_history.sql +899 -0
- package/migrations/d1-signer/0073_wallet_recovery_relocation.sql +86 -0
- package/migrations/d1-signer/0074_email_otp_relocation.sql +158 -0
- package/migrations/d1-signer/0075_wallet_authorization_return.sql +107 -0
- package/migrations/d1-signer/0076_wallet_relocation_write_block.sql +406 -0
- package/migrations/d1-signer/0077_wallet_object_addresses.sql +24 -0
- package/package.json +1 -1
- package/src/README.md +23 -1
- package/cloudflare-router-ab/scripts/local-key-material.mjs +0 -29
package/dist/esm/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { isPlainObject, requireNonEmptyString } from "../../../../shared-ts/src/utils/validation.js";
|
|
2
2
|
import { normalizeRuntimePolicyScope } from "../../../../shared-ts/src/threshold/signingRootScope.js";
|
|
3
3
|
import { isD1DatabaseLike, parseD1JsonColumn } from "../../../../storage/d1Sql.js";
|
|
4
|
+
import { ED25519_SIGNER_ACTIVATION_ID_PATH } from "../../../../core/d1WalletStore.js";
|
|
4
5
|
import { abusePrincipalKey, runtimePolicyScopeKey } from "../../../domains/signingOperations/routerAbNormalSigningAdmissionCore.js";
|
|
5
6
|
//#region src/router/cloudflare/d1/signingAdmission/d1RouterAbNormalSigningAdmissionStore.ts
|
|
6
7
|
const ROUTER_AB_NORMAL_SIGNING_ADMISSION_TABLE = "router_ab_normal_signing_admission_records";
|
|
@@ -12,10 +13,8 @@ var CloudflareD1RouterAbNormalSigningAdmissionStore = class {
|
|
|
12
13
|
this.now = options.now || Date.now;
|
|
13
14
|
}
|
|
14
15
|
async evaluatePolicy(input) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
if (decision) return decision;
|
|
18
|
-
}
|
|
16
|
+
const snapshot = credentialPolicyDecision(input, this.database, this.storageNamespace);
|
|
17
|
+
if (snapshot) return snapshot;
|
|
19
18
|
const scope = input.runtimePolicyScope;
|
|
20
19
|
return parsePolicyRow(await this.database.prepare(`WITH scope(namespace, org_id, project_id, env_id, signing_root_version,
|
|
21
20
|
project_key, abuse_key) AS (VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7))
|
|
@@ -181,33 +180,7 @@ var D1EcdsaAdmissionPolicyRead = class D1EcdsaAdmissionPolicyRead {
|
|
|
181
180
|
this.#decisions = decisions;
|
|
182
181
|
}
|
|
183
182
|
static fromRows(database, namespace, walletId, activationId, rows) {
|
|
184
|
-
|
|
185
|
-
const decisions = /* @__PURE__ */ new Map();
|
|
186
|
-
for (const row of rows) {
|
|
187
|
-
if (!isPlainObject(row)) throw new Error("ECDSA policy candidate is invalid");
|
|
188
|
-
const key = runtimePolicyScopeKey(normalizeRuntimePolicyScope(parseD1JsonColumn(row.scope_json)));
|
|
189
|
-
if (decisions.has(key)) throw new Error("ECDSA policy scope is ambiguous");
|
|
190
|
-
try {
|
|
191
|
-
const decision = parsePolicyRow({
|
|
192
|
-
project_key: row.project_key,
|
|
193
|
-
project_decision: row.project_decision,
|
|
194
|
-
project_retry_after_ms: row.project_retry_after_ms,
|
|
195
|
-
abuse_key: row.abuse_key,
|
|
196
|
-
abuse_decision: row.abuse_decision,
|
|
197
|
-
abuse_retry_after_ms: row.abuse_retry_after_ms
|
|
198
|
-
});
|
|
199
|
-
decisions.set(key, {
|
|
200
|
-
ok: true,
|
|
201
|
-
decision
|
|
202
|
-
});
|
|
203
|
-
} catch (error) {
|
|
204
|
-
decisions.set(key, {
|
|
205
|
-
ok: false,
|
|
206
|
-
message: error instanceof Error ? error.message : "ECDSA policy read failed"
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
return new D1EcdsaAdmissionPolicyRead(database, namespace, walletId, activationId, decisions);
|
|
183
|
+
return new D1EcdsaAdmissionPolicyRead(database, namespace, walletId, activationId, parsePolicyCandidates(rows, "ECDSA"));
|
|
211
184
|
}
|
|
212
185
|
resolve(database, namespace, input) {
|
|
213
186
|
if (database !== this.database || namespace !== this.namespace) return null;
|
|
@@ -218,13 +191,79 @@ var D1EcdsaAdmissionPolicyRead = class D1EcdsaAdmissionPolicyRead {
|
|
|
218
191
|
return result.decision;
|
|
219
192
|
}
|
|
220
193
|
};
|
|
221
|
-
|
|
194
|
+
/** Policy rows read with an Ed25519 Wallet Session, for the scopes of its signer. */
|
|
195
|
+
var D1Ed25519AdmissionPolicyRead = class D1Ed25519AdmissionPolicyRead {
|
|
196
|
+
#decisions;
|
|
197
|
+
constructor(database, namespace, walletId, authorityId, decisions) {
|
|
198
|
+
this.database = database;
|
|
199
|
+
this.namespace = namespace;
|
|
200
|
+
this.walletId = walletId;
|
|
201
|
+
this.authorityId = authorityId;
|
|
202
|
+
this.#decisions = decisions;
|
|
203
|
+
}
|
|
204
|
+
static fromRows(database, namespace, walletId, authorityId, rows) {
|
|
205
|
+
return new D1Ed25519AdmissionPolicyRead(database, namespace, walletId, authorityId, parsePolicyCandidates(rows, "Ed25519"));
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Null sends the caller to the database: another store, or a scope this read
|
|
209
|
+
* did not select. Linked-device material has no signer row to select from.
|
|
210
|
+
*/
|
|
211
|
+
resolve(database, namespace, input) {
|
|
212
|
+
if (database !== this.database || namespace !== this.namespace) return null;
|
|
213
|
+
if (input.walletId !== this.walletId || input.authorityId !== this.authorityId) throw new Error("Ed25519 policy credential scope does not match");
|
|
214
|
+
const result = this.#decisions.get(runtimePolicyScopeKey(input.runtimePolicyScope));
|
|
215
|
+
if (!result) return null;
|
|
216
|
+
if (!result.ok) throw new Error(result.message);
|
|
217
|
+
return result.decision;
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
/** The decision a credential read already holds for this store, when the request carries one. */
|
|
221
|
+
function credentialPolicyDecision(input, database, namespace) {
|
|
222
|
+
if (input.curve === "ecdsa") return input.policyReadSource.kind === "credential_snapshot" ? input.policyReadSource.policyRead.resolve(database, namespace, input) : null;
|
|
223
|
+
if (input.authorityKind !== "wallet_authority_v1" || input.policyReadSource.kind !== "credential_snapshot") return null;
|
|
224
|
+
return input.policyReadSource.policyRead.resolve(database, namespace, input);
|
|
225
|
+
}
|
|
226
|
+
function parsePolicyCandidates(rows, curve) {
|
|
227
|
+
if (!Array.isArray(rows)) throw new Error(`${curve} policy candidates are invalid`);
|
|
228
|
+
const decisions = /* @__PURE__ */ new Map();
|
|
229
|
+
for (const row of rows) {
|
|
230
|
+
if (!isPlainObject(row)) throw new Error(`${curve} policy candidate is invalid`);
|
|
231
|
+
const key = runtimePolicyScopeKey(normalizeRuntimePolicyScope(parseD1JsonColumn(row.scope_json)));
|
|
232
|
+
if (decisions.has(key)) throw new Error(`${curve} policy scope is ambiguous`);
|
|
233
|
+
try {
|
|
234
|
+
const decision = parsePolicyRow({
|
|
235
|
+
project_key: row.project_key,
|
|
236
|
+
project_decision: row.project_decision,
|
|
237
|
+
project_retry_after_ms: row.project_retry_after_ms,
|
|
238
|
+
abuse_key: row.abuse_key,
|
|
239
|
+
abuse_decision: row.abuse_decision,
|
|
240
|
+
abuse_retry_after_ms: row.abuse_retry_after_ms
|
|
241
|
+
});
|
|
242
|
+
decisions.set(key, {
|
|
243
|
+
ok: true,
|
|
244
|
+
decision
|
|
245
|
+
});
|
|
246
|
+
} catch (error) {
|
|
247
|
+
decisions.set(key, {
|
|
248
|
+
ok: false,
|
|
249
|
+
message: error instanceof Error ? error.message : `${curve} policy read failed`
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return decisions;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Policy rows for the runtime scopes of the session wallet's signers, read in
|
|
257
|
+
* the session's own statement. `signers` selects the signer rows, `scopePath`
|
|
258
|
+
* is where a row holds its scope, and `principal` names the abuse principal.
|
|
259
|
+
*/
|
|
260
|
+
function credentialPolicyProjection(input) {
|
|
261
|
+
return `
|
|
222
262
|
(WITH candidates AS (
|
|
223
|
-
SELECT DISTINCT json_extract(signer.record_json, '
|
|
263
|
+
SELECT DISTINCT json_extract(signer.record_json, '${input.scopePath}') AS scope_json
|
|
224
264
|
FROM wallet_signers AS signer
|
|
225
|
-
WHERE
|
|
226
|
-
AND signer.
|
|
227
|
-
AND signer.wallet_id = session.wallet_id AND signer.signer_family = 'ecdsa'
|
|
265
|
+
WHERE ${input.signers}
|
|
266
|
+
AND signer.wallet_id = session.wallet_id AND signer.signer_family = '${input.family}'
|
|
228
267
|
AND json_valid(signer.record_json)
|
|
229
268
|
), scopes AS (
|
|
230
269
|
SELECT scope_json,
|
|
@@ -256,9 +295,29 @@ const ECDSA_CREDENTIAL_POLICY_PROJECTION = `
|
|
|
256
295
|
AND abuse.signing_root_version = scopes.signing_root_version
|
|
257
296
|
AND abuse.record_kind = 'abuse'
|
|
258
297
|
AND abuse.record_key = scopes.project_key || char(31) || session.wallet_id || char(31) ||
|
|
259
|
-
|
|
260
|
-
) AS
|
|
298
|
+
${input.principal} || char(31) || '${input.family}'
|
|
299
|
+
) AS ${input.family}_policy_records_json,`;
|
|
300
|
+
}
|
|
301
|
+
/** Binds the material activation id. */
|
|
302
|
+
const ECDSA_CREDENTIAL_POLICY_PROJECTION = credentialPolicyProjection({
|
|
303
|
+
family: "ecdsa",
|
|
304
|
+
signers: `signer.namespace = session.namespace AND signer.org_id = session.org_id
|
|
305
|
+
AND signer.project_id = session.project_id AND signer.env_id = session.env_id`,
|
|
306
|
+
scopePath: "$.runtimePolicyScope",
|
|
307
|
+
principal: `'material_activation:' || ?`
|
|
308
|
+
});
|
|
309
|
+
/** Binds the signer scope (namespace, organization, project, environment) and the activation id. */
|
|
310
|
+
const ED25519_CREDENTIAL_POLICY_PROJECTION = credentialPolicyProjection({
|
|
311
|
+
family: "ed25519",
|
|
312
|
+
signers: `signer.namespace = ? AND signer.org_id = ?
|
|
313
|
+
AND signer.project_id = ? AND signer.env_id = ?
|
|
314
|
+
AND CASE WHEN json_valid(signer.record_json) THEN
|
|
315
|
+
json_extract(signer.record_json, '${ED25519_SIGNER_ACTIVATION_ID_PATH}') = ?
|
|
316
|
+
ELSE 0 END`,
|
|
317
|
+
scopePath: "$.activeYaoCapability.runtimePolicyScope",
|
|
318
|
+
principal: `'wallet_authority:' || session.authority_id`
|
|
319
|
+
});
|
|
261
320
|
//#endregion
|
|
262
|
-
export { CloudflareD1RouterAbNormalSigningAdmissionStore, D1EcdsaAdmissionPolicyRead, ECDSA_CREDENTIAL_POLICY_PROJECTION, createCloudflareD1RouterAbNormalSigningAdmissionStore };
|
|
321
|
+
export { CloudflareD1RouterAbNormalSigningAdmissionStore, D1EcdsaAdmissionPolicyRead, D1Ed25519AdmissionPolicyRead, ECDSA_CREDENTIAL_POLICY_PROJECTION, ED25519_CREDENTIAL_POLICY_PROJECTION, createCloudflareD1RouterAbNormalSigningAdmissionStore };
|
|
263
322
|
|
|
264
323
|
//# sourceMappingURL=d1RouterAbNormalSigningAdmissionStore.js.map
|
|
@@ -75,13 +75,7 @@ var CloudflareD1VersionedJsonRecordStore = class {
|
|
|
75
75
|
}
|
|
76
76
|
async readMany(keys) {
|
|
77
77
|
const preparedKeys = prepareReadKeys(keys, this.keyPrefix);
|
|
78
|
-
const statements = preparedKeys.map(({
|
|
79
|
-
FROM ${TABLE_NAME}
|
|
80
|
-
WHERE namespace = ?1
|
|
81
|
-
AND org_id = ?2
|
|
82
|
-
AND project_id = ?3
|
|
83
|
-
AND env_id = ?4
|
|
84
|
-
AND record_key = ?5`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, storageKey));
|
|
78
|
+
const statements = preparedKeys.map(({ key }) => this.prepareRead(key));
|
|
85
79
|
let results;
|
|
86
80
|
try {
|
|
87
81
|
results = await this.database.batch(statements);
|
|
@@ -98,6 +92,15 @@ var CloudflareD1VersionedJsonRecordStore = class {
|
|
|
98
92
|
result: this.parseReadResult(results[index])
|
|
99
93
|
}));
|
|
100
94
|
}
|
|
95
|
+
prepareRead(key) {
|
|
96
|
+
return this.database.prepare(`SELECT version, record_json
|
|
97
|
+
FROM ${TABLE_NAME}
|
|
98
|
+
WHERE namespace = ?1
|
|
99
|
+
AND org_id = ?2
|
|
100
|
+
AND project_id = ?3
|
|
101
|
+
AND env_id = ?4
|
|
102
|
+
AND record_key = ?5`).bind(this.scope.namespace, this.scope.orgId, this.scope.projectId, this.scope.envId, this.storageKey(key));
|
|
103
|
+
}
|
|
101
104
|
parseReadResult(result) {
|
|
102
105
|
const row = firstResult(result);
|
|
103
106
|
if (row === null) return { kind: "missing" };
|
|
@@ -136,7 +139,7 @@ var CloudflareD1VersionedJsonRecordStore = class {
|
|
|
136
139
|
* commit spans this JSON store and a normalized table (for example, a
|
|
137
140
|
* recovery envelope plus its WebAuthn authenticator and binding).
|
|
138
141
|
*/
|
|
139
|
-
async putManyWithAdditionalStatements(mutations, additionalStatements) {
|
|
142
|
+
async putManyWithAdditionalStatements(mutations, additionalStatements, executeBatch) {
|
|
140
143
|
const prepared = this.prepareBatchMutations(mutations);
|
|
141
144
|
const statements = [];
|
|
142
145
|
for (const mutation of prepared) {
|
|
@@ -145,7 +148,7 @@ var CloudflareD1VersionedJsonRecordStore = class {
|
|
|
145
148
|
}
|
|
146
149
|
statements.push(...additionalStatements);
|
|
147
150
|
try {
|
|
148
|
-
assertBatchSucceeded(await this.database.batch(statements), statements.length);
|
|
151
|
+
assertBatchSucceeded(executeBatch ? await executeBatch(statements) : await this.database.batch(statements), statements.length);
|
|
149
152
|
return {
|
|
150
153
|
kind: "stored",
|
|
151
154
|
versions: prepared.map((mutation) => ({
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { requireArray, requireRecord } from "../../../../shared-ts/src/utils/validation.js";
|
|
2
|
+
//#region src/router/cloudflare/d1/wallet/authorizationSnapshotLayout.ts
|
|
3
|
+
const TABLES = [
|
|
4
|
+
"wallet_email_otp_rate_limits",
|
|
5
|
+
"email_otp_wallet_enrollments",
|
|
6
|
+
"email_otp_auth_states",
|
|
7
|
+
"wallets",
|
|
8
|
+
"wallet_signers",
|
|
9
|
+
"wallet_recovery_code_locators",
|
|
10
|
+
"wallet_authorities",
|
|
11
|
+
"wallet_auth_methods",
|
|
12
|
+
"wallet_relocation_approvals",
|
|
13
|
+
"webauthn_credential_bindings",
|
|
14
|
+
"webauthn_authenticators",
|
|
15
|
+
"router_ab_yao_versioned_json_records",
|
|
16
|
+
"authorization_wallet_session_quotas",
|
|
17
|
+
"wallet_session_authorizations_v2",
|
|
18
|
+
"wallet_session_hosted_credentials_v2",
|
|
19
|
+
"wallet_session_hosted_exchange_codes_v2",
|
|
20
|
+
"verified_wallet_operation_evidence_sets",
|
|
21
|
+
"authorized_operations",
|
|
22
|
+
"authorized_operation_audit_events",
|
|
23
|
+
"linked_device_sessions",
|
|
24
|
+
"linked_device_authority_allocations",
|
|
25
|
+
"linked_device_authority_installations",
|
|
26
|
+
"linked_device_target_credentials",
|
|
27
|
+
"linked_device_target_commit_reservations",
|
|
28
|
+
"linked_device_session_transcripts",
|
|
29
|
+
"linked_device_ed25519_export_root_transfers",
|
|
30
|
+
"linked_device_email_otp_grants",
|
|
31
|
+
"linked_device_request_proof_nonces",
|
|
32
|
+
"linked_device_bootstrap_imports",
|
|
33
|
+
"linked_device_wallet_session_credential_deliveries_v1"
|
|
34
|
+
];
|
|
35
|
+
var AuthorizationSnapshotLayout = class AuthorizationSnapshotLayout {
|
|
36
|
+
#validated = true;
|
|
37
|
+
constructor(table, columns, keyColumns) {
|
|
38
|
+
this.table = table;
|
|
39
|
+
this.columns = columns;
|
|
40
|
+
this.keyColumns = keyColumns;
|
|
41
|
+
Object.freeze(this);
|
|
42
|
+
}
|
|
43
|
+
static async read(database) {
|
|
44
|
+
const layout = [];
|
|
45
|
+
const statements = [];
|
|
46
|
+
for (const table of TABLES) statements.push(database.prepare(`PRAGMA table_info(${table})`));
|
|
47
|
+
const results = await database.batch(statements);
|
|
48
|
+
for (const [index, table] of TABLES.entries()) {
|
|
49
|
+
const result = results[index];
|
|
50
|
+
if (!result) throw new Error("Authorization snapshot schema is incomplete");
|
|
51
|
+
const columns = [];
|
|
52
|
+
const keys = [];
|
|
53
|
+
for (const field of result.results ?? []) {
|
|
54
|
+
if (!Number.isSafeInteger(field.pk) || field.pk < 0) throw new Error("Authorization snapshot primary key is invalid");
|
|
55
|
+
if (field.type !== "TEXT" && field.type !== "INTEGER") throw new Error("Authorization snapshot column type is unsupported");
|
|
56
|
+
columns.push(field.name);
|
|
57
|
+
if (field.pk > 0) keys.push(field.name);
|
|
58
|
+
}
|
|
59
|
+
columns.sort();
|
|
60
|
+
keys.sort();
|
|
61
|
+
layout.push({
|
|
62
|
+
table,
|
|
63
|
+
columns,
|
|
64
|
+
keyColumns: keys
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return AuthorizationSnapshotLayout.parse(layout);
|
|
68
|
+
}
|
|
69
|
+
static parse(raw) {
|
|
70
|
+
const entries = requireArray(raw, "authorization snapshot layout");
|
|
71
|
+
if (entries.length !== TABLES.length) throw new Error("Authorization snapshot table set conflicts");
|
|
72
|
+
const result = [];
|
|
73
|
+
for (const [index, table] of TABLES.entries()) {
|
|
74
|
+
const entry = requireRecord(entries[index], "authorization snapshot table");
|
|
75
|
+
if (Object.keys(entry).length !== 3 || entry.table !== table) throw new Error("Authorization snapshot table order conflicts");
|
|
76
|
+
const columns = columnNames(entry.columns);
|
|
77
|
+
const keyColumns = columnNames(entry.keyColumns);
|
|
78
|
+
for (const key of keyColumns) if (!columns.includes(key)) throw new Error("Authorization snapshot key column is absent");
|
|
79
|
+
result.push(new AuthorizationSnapshotLayout(table, columns, keyColumns));
|
|
80
|
+
}
|
|
81
|
+
return Object.freeze(result);
|
|
82
|
+
}
|
|
83
|
+
expressions() {
|
|
84
|
+
if (!this.#validated) throw new Error("Authorization snapshot layout is unvalidated");
|
|
85
|
+
const fields = [];
|
|
86
|
+
for (const column of this.columns) fields.push(`'${column}', target.${column}`);
|
|
87
|
+
const keys = [];
|
|
88
|
+
for (const column of this.keyColumns) keys.push(`target.${column}`);
|
|
89
|
+
return {
|
|
90
|
+
key: `json_array(${keys.join(", ")})`,
|
|
91
|
+
record: `json_object(${fields.join(", ")})`,
|
|
92
|
+
ownership: AuthorizationSnapshotLayout.ownership(this.table)
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
snapshotSelection() {
|
|
96
|
+
const ownership = AuthorizationSnapshotLayout.ownership(this.table);
|
|
97
|
+
if (this.table !== "wallet_email_otp_rate_limits") return ownership;
|
|
98
|
+
return `${ownership} AND target.reset_at_ms > (
|
|
99
|
+
SELECT frozen_at_ms FROM wallet_relocation_authorization_fences
|
|
100
|
+
WHERE namespace = ?1 AND org_id = ?2 AND project_id = ?3 AND env_id = ?4 AND wallet_id = ?5)`;
|
|
101
|
+
}
|
|
102
|
+
static ownership(table) {
|
|
103
|
+
switch (table) {
|
|
104
|
+
case "linked_device_sessions": return `target.namespace = ?1 AND target.org_id = ?2 AND target.project_id = ?3
|
|
105
|
+
AND target.env_id = ?4 AND json_extract(target.record_json, '$.claimTranscript.value.walletId') = ?5`;
|
|
106
|
+
case "linked_device_target_commit_reservations":
|
|
107
|
+
case "linked_device_session_transcripts":
|
|
108
|
+
case "linked_device_request_proof_nonces":
|
|
109
|
+
case "linked_device_bootstrap_imports": return `target.namespace = ?1 AND target.org_id = ?2 AND target.project_id = ?3
|
|
110
|
+
AND target.env_id = ?4 AND EXISTS (SELECT 1 FROM linked_device_sessions AS parent
|
|
111
|
+
WHERE parent.namespace = target.namespace AND parent.org_id = target.org_id
|
|
112
|
+
AND parent.project_id = target.project_id AND parent.env_id = target.env_id
|
|
113
|
+
AND parent.link_session_id = target.link_session_id
|
|
114
|
+
AND json_extract(parent.record_json, '$.claimTranscript.value.walletId') = ?5)`;
|
|
115
|
+
case "router_ab_yao_versioned_json_records": return `target.namespace = ?1 AND target.org_id = ?2 AND target.project_id = ?3
|
|
116
|
+
AND target.env_id = ?4 AND json_extract(target.record_json, '$.walletId') = ?5
|
|
117
|
+
AND CASE
|
|
118
|
+
WHEN substr(target.record_key, 1, 17) = 'passkey-envelope:' AND json_valid(substr(target.record_key, 18))
|
|
119
|
+
THEN json_extract(substr(target.record_key, 18), '$[0]') = ?5
|
|
120
|
+
WHEN substr(target.record_key, 1, 28) = 'passkey-credential-activity:' AND json_valid(substr(target.record_key, 29))
|
|
121
|
+
THEN json_extract(substr(target.record_key, 29), '$[0]') = ?5
|
|
122
|
+
ELSE target.record_key IN ('passkey-envelope:recovery-set:' || ?5,
|
|
123
|
+
'passkey-envelope:wallet-recovery-backup-ack/' || ?5)
|
|
124
|
+
END`;
|
|
125
|
+
case "webauthn_credential_bindings":
|
|
126
|
+
case "webauthn_authenticators": return `target.namespace = ?1 AND target.org_id = ?2 AND target.project_id = ?3
|
|
127
|
+
AND target.env_id = ?4 AND target.user_id = ?5
|
|
128
|
+
AND EXISTS (SELECT 1 FROM wallet_auth_methods AS method
|
|
129
|
+
WHERE method.namespace = target.namespace AND method.org_id = target.org_id
|
|
130
|
+
AND method.project_id = target.project_id AND method.env_id = target.env_id
|
|
131
|
+
AND method.wallet_id = ?5 AND method.kind = 'passkey'
|
|
132
|
+
AND method.credential_id_b64u = target.credential_id_b64u
|
|
133
|
+
AND ${table === "webauthn_credential_bindings" ? "method.rp_id = target.rp_id" : "method.credential_public_key_b64u = target.credential_public_key_b64u"})`;
|
|
134
|
+
case "authorization_wallet_session_quotas": return `EXISTS (SELECT 1 FROM wallet_session_authorizations_v2 AS session
|
|
135
|
+
WHERE session.namespace = ?1 AND session.org_id = ?2 AND session.project_id = ?3 AND session.env_id = ?4
|
|
136
|
+
AND session.wallet_id = ?5 AND session.namespace = target.namespace AND session.tenant_id = target.tenant_id
|
|
137
|
+
AND session.quota_id = target.quota_id AND session.wallet_session_id = target.wallet_session_id)`;
|
|
138
|
+
case "authorized_operations": return `EXISTS (SELECT 1 FROM wallet_operation_authorizations AS owner
|
|
139
|
+
WHERE owner.namespace = ?1 AND owner.org_id = ?2 AND owner.project_id = ?3 AND owner.env_id = ?4
|
|
140
|
+
AND owner.wallet_id = ?5 AND owner.namespace = target.namespace AND owner.tenant_id = target.tenant_id
|
|
141
|
+
AND owner.source_kind = target.authorization_source_kind
|
|
142
|
+
AND owner.source_id = CASE target.authorization_source_kind
|
|
143
|
+
WHEN 'authorization_grant' THEN target.authorization_id ELSE target.evidence_set_digest END
|
|
144
|
+
AND (target.authorization_source_kind = 'verified_step_up' OR
|
|
145
|
+
(target.authorization_grant_kind = 'wallet_session_authorization'
|
|
146
|
+
AND owner.org_id = target.owner_scope_org_id AND owner.project_id = target.owner_scope_project_id
|
|
147
|
+
AND owner.env_id = target.owner_scope_env_id)))`;
|
|
148
|
+
case "authorized_operation_audit_events": return `EXISTS (SELECT 1 FROM wallet_operation_owners AS owner
|
|
149
|
+
WHERE owner.namespace = ?1 AND owner.org_id = ?2 AND owner.project_id = ?3 AND owner.env_id = ?4
|
|
150
|
+
AND owner.wallet_id = ?5 AND owner.namespace = target.namespace AND owner.tenant_id = target.tenant_id
|
|
151
|
+
AND owner.authorized_operation_id = target.authorized_operation_id)`;
|
|
152
|
+
default: return "target.namespace = ?1 AND target.org_id = ?2 AND target.project_id = ?3 AND target.env_id = ?4 AND target.wallet_id = ?5";
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
function columnNames(raw) {
|
|
157
|
+
const names = [];
|
|
158
|
+
for (const name of requireArray(raw, "authorization snapshot columns")) {
|
|
159
|
+
if (typeof name !== "string" || !/^[a-z][a-z0-9_]*$/u.test(name) || names.includes(name)) throw new Error("Authorization snapshot column is invalid");
|
|
160
|
+
names.push(name);
|
|
161
|
+
}
|
|
162
|
+
if (names.length === 0) throw new Error("Authorization snapshot columns are empty");
|
|
163
|
+
return Object.freeze(names);
|
|
164
|
+
}
|
|
165
|
+
//#endregion
|
|
166
|
+
export { AuthorizationSnapshotLayout };
|
|
167
|
+
|
|
168
|
+
//# sourceMappingURL=authorizationSnapshotLayout.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { isPlainObject } from "../../../../shared-ts/src/utils/validation.js";
|
|
1
2
|
import { base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
|
|
2
3
|
import { alphabetizeStringify, sha256BytesUtf8 } from "../../../../shared-ts/src/utils/digests.js";
|
|
3
4
|
import "../../../../shared-ts/src/utils/encoders.js";
|
|
4
|
-
import { isPlainObject } from "../../../../shared-ts/src/utils/validation.js";
|
|
5
5
|
import { parseRouterAbEd25519YaoRegistrationSideEffectRecordV1 } from "../../../domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js";
|
|
6
6
|
import { parseD1WalletAddSignerFinalizeTerminalResponse, parseWalletIdForIntent } from "../registration/d1RegistrationCeremonyRecords.js";
|
|
7
7
|
//#region src/router/cloudflare/d1/wallet/d1WalletAddSignerFinalizeRecord.ts
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { mpcMaterialActivationRefsEqual, parseWalletKeyId, parseWebAuthnCredentialIdB64u, parseWebAuthnRpId } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
|
-
import { base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
|
|
3
|
-
import { alphabetizeStringify, sha256BytesUtf8 } from "../../../../shared-ts/src/utils/digests.js";
|
|
4
|
-
import "../../../../shared-ts/src/utils/encoders.js";
|
|
5
2
|
import { normalizeOptionalTrimmedString } from "../../../../shared-ts/src/utils/normalize.js";
|
|
6
3
|
import { isPlainObject } from "../../../../shared-ts/src/utils/validation.js";
|
|
4
|
+
import { base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
|
|
5
|
+
import { alphabetizeStringify, sha256BytesUtf8 } from "../../../../shared-ts/src/utils/digests.js";
|
|
7
6
|
import { parseSecp256k1CompressedPublicKeyB64u } from "../../../../shared-ts/src/passkey-custody/primitives.js";
|
|
7
|
+
import "../../../../shared-ts/src/utils/encoders.js";
|
|
8
8
|
import { routerAbMpcMaterialActivationRefFromWire } from "../../../../shared-ts/src/utils/routerAbNormalSigningIdentity.js";
|
|
9
9
|
import { parseRouterAbEd25519YaoRegistrationAdmissionRequestV1, sameRouterAbEd25519YaoRegistrationAdmissionRequestV1 } from "../../../../shared-ts/src/utils/routerAbEd25519Yao.js";
|
|
10
10
|
import { ecdsaClientRootPublicKey33B64uFromString } from "../../../../shared-ts/src/threshold/ecdsaDerivationRoleLocalBootstrap.js";
|
|
@@ -12,11 +12,11 @@ import { deriveSigningRootId } from "../../../../shared-ts/src/threshold/signing
|
|
|
12
12
|
import { buildRouterAbEcdsaDerivationPublicCapabilityV1, parseRouterAbEcdsaRegistrationRequestFactsV1, sameRouterAbEcdsaDerivationNormalSigningStateV1, sameRouterAbEcdsaRegistrationActivationReceiptV1, sameRouterAbEcdsaRegistrationRequestFactsV1, sameRouterAbEcdsaVerifiedClientActivationFactsV1 } from "../../../../shared-ts/src/utils/routerAbEcdsaDerivation.js";
|
|
13
13
|
import { buildWalletEcdsaSignerActivationV1, extendEd25519WalletAuthorityWithEcdsa, isActiveEd25519WalletAuthorityV1 } from "../../../../shared-ts/src/authorization/walletAuthority.js";
|
|
14
14
|
import { registrationPreparationIdFromString } from "../../../../core/types.js";
|
|
15
|
-
import { buildTenantRootIdentityFromAuthenticatedDeploymentV1 } from "../../../../shared-ts/src/tenant-root/tenantRootIdentity.js";
|
|
16
15
|
import { addSignerIntentGrantFromString, computeAddSignerIntentDigestB64u, sameAddSignerIntentV1 } from "../../../../shared-ts/src/utils/registrationIntent.js";
|
|
17
|
-
import {
|
|
16
|
+
import { buildTenantRootIdentityFromAuthenticatedDeploymentV1 } from "../../../../shared-ts/src/tenant-root/tenantRootIdentity.js";
|
|
18
17
|
import { buildRouterAbEd25519YaoRegistrationCapabilityRecordV1 } from "../../../domains/ed25519Yao/recovery/routerAbEd25519YaoRecovery.js";
|
|
19
18
|
import { buildRouterAbEd25519YaoAddSignerAdmissionRequestV1, createRouterAbEd25519YaoMaterialActivationRefV1 } from "../../../domains/ed25519Yao/capabilityLifecycle/routerAbEd25519YaoProductRegistration.js";
|
|
19
|
+
import { WalletAuthorityCommitConflictError } from "./d1WalletAuthorityStore.js";
|
|
20
20
|
import { parseRouterAbEd25519YaoRegistrationSideEffectRecordV1, runRouterAbEd25519YaoRegistrationSideEffectV1, throwIfRouterAbEd25519YaoRetryableSideEffectFailureV1 } from "../../../domains/ed25519Yao/registration/routerAbEd25519YaoRegistrationSideEffectBoundary.js";
|
|
21
21
|
import { buildYaoEd25519WalletSignerRecord, ed25519NearPublicKeyFromBytes, implicitNearAccountIdFromEd25519PublicKeyBytes } from "../ed25519Yao/d1Ed25519YaoWalletSigner.js";
|
|
22
22
|
import { routerAbEcdsaStrictRegistrationRequestMatchesFacts } from "../../../domains/ecdsa/routerAbEcdsaStrictRegistration.js";
|
|
@@ -373,6 +373,7 @@ function sameEcdsaSignerActivation(left, right) {
|
|
|
373
373
|
}
|
|
374
374
|
var CloudflareD1WalletAddSignerService = class {
|
|
375
375
|
constructor(input) {
|
|
376
|
+
this.executionAuthority = input.executionAuthority;
|
|
376
377
|
this.getRegistrationCeremonyIntentStore = input.getRegistrationCeremonyIntentStore;
|
|
377
378
|
this.getEd25519YaoProductRegistration = input.getEd25519YaoProductRegistration;
|
|
378
379
|
this.ecdsaStrictRegistration = input.ecdsaStrictRegistration;
|
|
@@ -682,8 +683,11 @@ var CloudflareD1WalletAddSignerService = class {
|
|
|
682
683
|
signingWorkerId: yaoRuntime.signingWorkerId
|
|
683
684
|
})
|
|
684
685
|
});
|
|
686
|
+
const homeAdmission = await this.executionAuthority.admitEstablishedHome({ walletId: input.walletId });
|
|
687
|
+
if (!homeAdmission.ok) return rejectedWalletAddSignerStartTerminal(homeAdmission.code, homeAdmission.message);
|
|
685
688
|
const bound = await yaoRuntime.bindVerifiedIntent({
|
|
686
689
|
kind: "verified_add_signer_intent",
|
|
690
|
+
ownershipGeneration: homeAdmission.ownershipGeneration,
|
|
687
691
|
addSignerIntentGrant: storedIntent.grant,
|
|
688
692
|
intent: ed25519Intent,
|
|
689
693
|
admissionRequest,
|
|
@@ -811,9 +815,14 @@ var CloudflareD1WalletAddSignerService = class {
|
|
|
811
815
|
code: "invalid_state",
|
|
812
816
|
message: "ECDSA add-signer tenant root is not active"
|
|
813
817
|
};
|
|
818
|
+
const home = await this.executionAuthority.admitEstablishedHome({ walletId: ceremony.intent.walletId });
|
|
819
|
+
if (!home.ok) return home;
|
|
814
820
|
const registered = await this.ecdsaStrictRegistration.registerWithTenantRoot({
|
|
815
821
|
request: request.ecdsa.strictRegistration,
|
|
816
|
-
tenantRoot
|
|
822
|
+
tenantRoot: {
|
|
823
|
+
...tenantRoot,
|
|
824
|
+
ownershipGeneration: home.ownershipGeneration
|
|
825
|
+
},
|
|
817
826
|
requestPolicy: {
|
|
818
827
|
policyVersion: WALLET_ADD_SIGNER_ROUTER_POLICY_VERSION,
|
|
819
828
|
requestDigestB64u: request.ecdsa.requestDigestB64u
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { parseChallengeSubjectId, parseEmailOtpChallengeId, parseOrgId, parseProviderSubject, parseWalletAuthMethodId, parseWebAuthnCredentialIdB64u, parseWebAuthnRpId } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
|
+
import { normalizeOptionalTrimmedString } from "../../../../shared-ts/src/utils/normalize.js";
|
|
3
|
+
import { buildDelegatedWalletAuthorityV1, buildFullOwnerPermissionsV1, sameDelegatedWalletAuthorityV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
|
|
2
4
|
import { base64UrlDecode, base64UrlEncode } from "../../../../shared-ts/src/utils/base64.js";
|
|
3
5
|
import { alphabetizeStringify } from "../../../../shared-ts/src/utils/digests.js";
|
|
4
6
|
import "../../../../shared-ts/src/utils/encoders.js";
|
|
5
|
-
import { normalizeOptionalTrimmedString } from "../../../../shared-ts/src/utils/normalize.js";
|
|
6
|
-
import { buildDelegatedWalletAuthorityV1, buildFullOwnerPermissionsV1, sameDelegatedWalletAuthorityV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
|
|
7
7
|
import { parseWalletAddAuthMethodRegistrationOptions } from "../../../../shared-ts/src/utils/addAuthMethodRegistration.js";
|
|
8
8
|
import { normalizeRuntimePolicyScope } from "../../../../shared-ts/src/threshold/signingRootScope.js";
|
|
9
9
|
import { buildEmailOtpWalletAuthAuthority, walletAuthAuthorityRef } from "../../../../shared-ts/src/utils/walletAuthAuthority.js";
|
|
@@ -1458,44 +1458,7 @@ var CloudflareD1WalletAuthMethodService = class {
|
|
|
1458
1458
|
* Ed25519 leg arrives, so that leg must address the same rows.
|
|
1459
1459
|
*/
|
|
1460
1460
|
async readActiveRegistrationIdentity(authority) {
|
|
1461
|
-
|
|
1462
|
-
switch (authority.kind) {
|
|
1463
|
-
case "passkey":
|
|
1464
|
-
record = await this.getWalletAuthMethodStore().getPasskeyV2({
|
|
1465
|
-
rpId: authority.rpId,
|
|
1466
|
-
credentialIdB64u: authority.credentialIdB64u
|
|
1467
|
-
});
|
|
1468
|
-
break;
|
|
1469
|
-
case "email_otp":
|
|
1470
|
-
record = await this.getWalletAuthMethodStore().getEmailOtpV2({
|
|
1471
|
-
walletId: String(authority.walletId),
|
|
1472
|
-
emailHashHex: authority.emailHashHex
|
|
1473
|
-
});
|
|
1474
|
-
break;
|
|
1475
|
-
default: return unreachableRegistrationStartAuthority(authority);
|
|
1476
|
-
}
|
|
1477
|
-
if (!record || record.status !== "active" || record.walletId !== authority.walletId) return null;
|
|
1478
|
-
if (authority.kind === "passkey") {
|
|
1479
|
-
if (record.kind !== "passkey" || record.rpId !== authority.rpId || record.credentialIdB64u !== authority.credentialIdB64u || record.credentialPublicKeyB64u !== authority.credentialPublicKeyB64u) return null;
|
|
1480
|
-
} else if (record.kind !== "email_otp" || record.emailHashHex !== authority.emailHashHex || record.registrationAuthorityId !== authority.registrationAuthorityId) return null;
|
|
1481
|
-
const walletAuthority = await this.walletAuthorityStore.readById(record.walletAuthorityId);
|
|
1482
|
-
if (!walletAuthority || walletAuthority.state !== "active" || walletAuthority.walletId !== record.walletId) return null;
|
|
1483
|
-
return {
|
|
1484
|
-
walletAuthorityId: record.walletAuthorityId,
|
|
1485
|
-
walletAuthMethodId: record.walletAuthMethodId,
|
|
1486
|
-
authority: walletAuthority,
|
|
1487
|
-
authMethod: record
|
|
1488
|
-
};
|
|
1489
|
-
}
|
|
1490
|
-
async readActiveRegistrationAuthority(authority) {
|
|
1491
|
-
const identity = await this.readActiveRegistrationIdentity(authority);
|
|
1492
|
-
if (!identity) return null;
|
|
1493
|
-
const walletAuthority = await this.walletAuthorityStore.readById(identity.walletAuthorityId);
|
|
1494
|
-
if (!walletAuthority || walletAuthority.state !== "active" || walletAuthority.walletId !== authority.walletId || walletAuthority.authorityId !== identity.walletAuthorityId) return null;
|
|
1495
|
-
return {
|
|
1496
|
-
authority: walletAuthority,
|
|
1497
|
-
walletAuthMethodId: identity.walletAuthMethodId
|
|
1498
|
-
};
|
|
1461
|
+
return await this.walletAuthorityStore.readActiveRegistrationIdentity(authority);
|
|
1499
1462
|
}
|
|
1500
1463
|
/**
|
|
1501
1464
|
* Verifies a revocation's source proof: bound to this operation, and from a
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { mpcMaterialActivationRefsEqual, parseLinkDeviceSessionId, parseLinkedDeviceEnrollmentId, parseWalletAuthorityId, parseWalletId, parseWalletRecoveryOperationId } from "../../../../shared-ts/src/utils/domainIds.js";
|
|
2
2
|
import { parseDeviceId } from "../../../../shared-ts/src/authorization/capabilityKinds.js";
|
|
3
|
-
import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
4
3
|
import { parseDelegatedWalletPermissionSetV1 } from "../../../../shared-ts/src/authorization/delegatedAuthority.js";
|
|
4
|
+
import { parseDigestB64u } from "../../../../shared-ts/src/utils/canonicalPrimitives.js";
|
|
5
5
|
import { parseWalletAuthMethodRecordV2 } from "../../../../shared-ts/src/utils/walletAuthMethodRecord.js";
|
|
6
6
|
import { buildRevokedWalletAuthorityV1, computeWalletAuthorityDigestB64u, parseWalletAuthorityV1, parseWalletSignerActivationSetV1, walletAuthorityDigestsMatchV1 } from "../../../../shared-ts/src/authorization/walletAuthority.js";
|
|
7
7
|
import { buildWalletSessionCapabilitySubjectsV1 } from "../../../../authorization/domain.js";
|
|
@@ -10,6 +10,29 @@ import { prepareD1WalletPutSignerStatement } from "../../../../core/d1WalletStor
|
|
|
10
10
|
import { prepareD1WalletAuthMethodV2PutStatement } from "../../../../core/d1WalletAuthMethodStore.js";
|
|
11
11
|
import { prepareD1WalletSessionAuthorityProjectionStatements } from "../authorization/walletSessionAuthorityProjection.js";
|
|
12
12
|
//#region src/router/cloudflare/d1/wallet/d1WalletAuthorityStore.ts
|
|
13
|
+
function registrationMethodSelector(authority) {
|
|
14
|
+
switch (authority.kind) {
|
|
15
|
+
case "passkey": return {
|
|
16
|
+
predicate: "kind = 'passkey' AND rp_id = ? AND credential_id_b64u = ?",
|
|
17
|
+
values: [authority.rpId, authority.credentialIdB64u]
|
|
18
|
+
};
|
|
19
|
+
case "email_otp": return {
|
|
20
|
+
predicate: "kind = 'email_otp' AND wallet_id = ? AND email_hash_hex = ?",
|
|
21
|
+
values: [authority.walletId, authority.emailHashHex]
|
|
22
|
+
};
|
|
23
|
+
default: return assertNeverRegistrationAuthority(authority);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function registrationMethodMatches(expected, method) {
|
|
27
|
+
switch (expected.kind) {
|
|
28
|
+
case "passkey": return method.kind === "passkey" && method.rpId === expected.rpId && method.credentialIdB64u === expected.credentialIdB64u && method.credentialPublicKeyB64u === expected.credentialPublicKeyB64u;
|
|
29
|
+
case "email_otp": return method.kind === "email_otp" && method.emailHashHex === expected.emailHashHex && method.registrationAuthorityId === expected.registrationAuthorityId;
|
|
30
|
+
default: return assertNeverRegistrationAuthority(expected);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function assertNeverRegistrationAuthority(value) {
|
|
34
|
+
throw new Error(`Unsupported registration authority: ${String(value)}`);
|
|
35
|
+
}
|
|
13
36
|
function normalizeScope(input) {
|
|
14
37
|
return {
|
|
15
38
|
namespace: requireScopeString(input.namespace, "namespace"),
|
|
@@ -321,6 +344,36 @@ var D1WalletAuthorityStore = class {
|
|
|
321
344
|
if (!row) return null;
|
|
322
345
|
return await parseD1WalletAuthorityRow(row);
|
|
323
346
|
}
|
|
347
|
+
/** Reads the method and its authority from one database snapshot. */
|
|
348
|
+
async readActiveRegistrationIdentity(expected) {
|
|
349
|
+
const selector = registrationMethodSelector(expected);
|
|
350
|
+
const row = await this.database.prepare(`SELECT authority.*, method.record_json AS auth_method_record_json,
|
|
351
|
+
method.wallet_auth_method_id, method.status AS auth_method_status
|
|
352
|
+
FROM (
|
|
353
|
+
SELECT * FROM wallet_auth_methods
|
|
354
|
+
WHERE namespace = ? AND org_id = ? AND project_id = ? AND env_id = ?
|
|
355
|
+
AND ${selector.predicate}
|
|
356
|
+
ORDER BY created_at_ms ASC LIMIT 1
|
|
357
|
+
) AS method
|
|
358
|
+
JOIN wallet_authorities AS authority
|
|
359
|
+
ON authority.namespace = method.namespace
|
|
360
|
+
AND authority.org_id = method.org_id
|
|
361
|
+
AND authority.project_id = method.project_id
|
|
362
|
+
AND authority.env_id = method.env_id
|
|
363
|
+
AND authority.authority_id = method.wallet_authority_id
|
|
364
|
+
AND authority.wallet_id = method.wallet_id`).bind(...scopeValues(this.scope), ...selector.values).first();
|
|
365
|
+
if (!row) return null;
|
|
366
|
+
const method = parseWalletAuthMethodRecordV2(parseD1JsonColumn(row.auth_method_record_json));
|
|
367
|
+
if (!method || method.status !== "active" || method.status !== row.auth_method_status || method.walletAuthMethodId !== row.wallet_auth_method_id || method.walletId !== expected.walletId || !registrationMethodMatches(expected, method)) return null;
|
|
368
|
+
const authority = await parseD1WalletAuthorityRow(row);
|
|
369
|
+
if (authority.state !== "active" || authority.walletId !== method.walletId || authority.authorityId !== method.walletAuthorityId) return null;
|
|
370
|
+
return {
|
|
371
|
+
walletAuthorityId: authority.authorityId,
|
|
372
|
+
walletAuthMethodId: method.walletAuthMethodId,
|
|
373
|
+
authority,
|
|
374
|
+
authMethod: method
|
|
375
|
+
};
|
|
376
|
+
}
|
|
324
377
|
async readByWalletAndDevice(input) {
|
|
325
378
|
const row = await this.database.prepare(`SELECT *
|
|
326
379
|
FROM wallet_authorities
|