matrix-js-sdk 28.1.0 → 28.2.0-rc.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/CHANGELOG.md +17 -1
- package/dist/browser-matrix.js +1458 -391
- package/dist/browser-matrix.js.map +32 -22
- package/dist/browser-matrix.min.js +5 -5
- package/dist/browser-matrix.min.js.map +1 -1
- package/git-revision.txt +1 -1
- package/lib/ReEmitter.js +1 -1
- package/lib/ReEmitter.js.map +1 -1
- package/lib/ToDeviceMessageQueue.js +1 -1
- package/lib/ToDeviceMessageQueue.js.map +1 -1
- package/lib/autodiscovery.js +17 -18
- package/lib/autodiscovery.js.map +1 -1
- package/lib/client.d.ts +14 -0
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +59 -85
- package/lib/client.js.map +1 -1
- package/lib/common-crypto/CryptoBackend.d.ts +41 -0
- package/lib/common-crypto/CryptoBackend.d.ts.map +1 -1
- package/lib/common-crypto/CryptoBackend.js.map +1 -1
- package/lib/common-crypto/base64.d.ts +22 -0
- package/lib/common-crypto/base64.d.ts.map +1 -0
- package/lib/common-crypto/base64.js +55 -0
- package/lib/common-crypto/base64.js.map +1 -0
- package/lib/content-helpers.js +16 -16
- package/lib/content-helpers.js.map +1 -1
- package/lib/crypto/CrossSigning.js +3 -3
- package/lib/crypto/CrossSigning.js.map +1 -1
- package/lib/crypto/DeviceList.js +11 -14
- package/lib/crypto/DeviceList.js.map +1 -1
- package/lib/crypto/EncryptionSetup.js +3 -10
- package/lib/crypto/EncryptionSetup.js.map +1 -1
- package/lib/crypto/OlmDevice.js +1 -1
- package/lib/crypto/OlmDevice.js.map +1 -1
- package/lib/crypto/OutgoingRoomKeyRequestManager.js +19 -20
- package/lib/crypto/OutgoingRoomKeyRequestManager.js.map +1 -1
- package/lib/crypto/RoomList.js +1 -1
- package/lib/crypto/RoomList.js.map +1 -1
- package/lib/crypto/SecretSharing.js +1 -1
- package/lib/crypto/SecretSharing.js.map +1 -1
- package/lib/crypto/SecretStorage.js +0 -4
- package/lib/crypto/SecretStorage.js.map +1 -1
- package/lib/crypto/algorithms/base.js +0 -14
- package/lib/crypto/algorithms/base.js.map +1 -1
- package/lib/crypto/algorithms/megolm.js +22 -31
- package/lib/crypto/algorithms/megolm.js.map +1 -1
- package/lib/crypto/backup.d.ts +17 -0
- package/lib/crypto/backup.d.ts.map +1 -1
- package/lib/crypto/backup.js +29 -8
- package/lib/crypto/backup.js.map +1 -1
- package/lib/crypto/dehydration.js +1 -5
- package/lib/crypto/dehydration.js.map +1 -1
- package/lib/crypto/deviceinfo.js +1 -1
- package/lib/crypto/deviceinfo.js.map +1 -1
- package/lib/crypto/index.d.ts +10 -2
- package/lib/crypto/index.d.ts.map +1 -1
- package/lib/crypto/index.js +133 -68
- package/lib/crypto/index.js.map +1 -1
- package/lib/crypto/keybackup.d.ts +1 -16
- package/lib/crypto/keybackup.d.ts.map +1 -1
- package/lib/crypto/keybackup.js.map +1 -1
- package/lib/crypto/olmlib.js +21 -21
- package/lib/crypto/olmlib.js.map +1 -1
- package/lib/crypto/recoverykey.d.ts.map +1 -1
- package/lib/crypto/recoverykey.js +3 -2
- package/lib/crypto/recoverykey.js.map +1 -1
- package/lib/crypto/store/indexeddb-crypto-store-backend.js +1 -1
- package/lib/crypto/store/indexeddb-crypto-store-backend.js.map +1 -1
- package/lib/crypto/store/indexeddb-crypto-store.js +0 -2
- package/lib/crypto/store/indexeddb-crypto-store.js.map +1 -1
- package/lib/crypto/store/memory-crypto-store.js +16 -16
- package/lib/crypto/store/memory-crypto-store.js.map +1 -1
- package/lib/crypto/verification/Base.js +6 -13
- package/lib/crypto/verification/Base.js.map +1 -1
- package/lib/crypto/verification/QRCode.js +0 -1
- package/lib/crypto/verification/QRCode.js.map +1 -1
- package/lib/crypto/verification/SAS.js +0 -4
- package/lib/crypto/verification/SAS.js.map +1 -1
- package/lib/crypto/verification/request/InRoomChannel.js +0 -1
- package/lib/crypto/verification/request/InRoomChannel.js.map +1 -1
- package/lib/crypto/verification/request/ToDeviceChannel.js +0 -1
- package/lib/crypto/verification/request/ToDeviceChannel.js.map +1 -1
- package/lib/crypto/verification/request/VerificationRequest.js +5 -7
- package/lib/crypto/verification/request/VerificationRequest.js.map +1 -1
- package/lib/crypto-api/keybackup.d.ts +15 -0
- package/lib/crypto-api/keybackup.d.ts.map +1 -1
- package/lib/crypto-api/keybackup.js.map +1 -1
- package/lib/crypto-api.d.ts +53 -0
- package/lib/crypto-api.d.ts.map +1 -1
- package/lib/crypto-api.js +55 -29
- package/lib/crypto-api.js.map +1 -1
- package/lib/embedded.d.ts +2 -1
- package/lib/embedded.d.ts.map +1 -1
- package/lib/embedded.js +29 -14
- package/lib/embedded.js.map +1 -1
- package/lib/event-mapper.js +17 -17
- package/lib/event-mapper.js.map +1 -1
- package/lib/extensible_events_v1/MessageEvent.js +31 -31
- package/lib/extensible_events_v1/MessageEvent.js.map +1 -1
- package/lib/extensible_events_v1/PollEndEvent.js +24 -24
- package/lib/extensible_events_v1/PollEndEvent.js.map +1 -1
- package/lib/extensible_events_v1/PollResponseEvent.js +0 -1
- package/lib/extensible_events_v1/PollResponseEvent.js.map +1 -1
- package/lib/extensible_events_v1/PollStartEvent.js +44 -44
- package/lib/extensible_events_v1/PollStartEvent.js.map +1 -1
- package/lib/filter.js +17 -19
- package/lib/filter.js.map +1 -1
- package/lib/http-api/errors.js +4 -6
- package/lib/http-api/errors.js.map +1 -1
- package/lib/http-api/fetch.js +1 -1
- package/lib/http-api/fetch.js.map +1 -1
- package/lib/http-api/index.js +1 -1
- package/lib/http-api/index.js.map +1 -1
- package/lib/interactive-auth.js +6 -16
- package/lib/interactive-auth.js.map +1 -1
- package/lib/matrixrtc/CallMembership.d.ts +31 -0
- package/lib/matrixrtc/CallMembership.d.ts.map +1 -0
- package/lib/matrixrtc/CallMembership.js +80 -0
- package/lib/matrixrtc/CallMembership.js.map +1 -0
- package/lib/matrixrtc/MatrixRTCSession.d.ts +81 -0
- package/lib/matrixrtc/MatrixRTCSession.d.ts.map +1 -0
- package/lib/matrixrtc/MatrixRTCSession.js +345 -0
- package/lib/matrixrtc/MatrixRTCSession.js.map +1 -0
- package/lib/matrixrtc/MatrixRTCSessionManager.d.ts +38 -0
- package/lib/matrixrtc/MatrixRTCSessionManager.d.ts.map +1 -0
- package/lib/matrixrtc/MatrixRTCSessionManager.js +116 -0
- package/lib/matrixrtc/MatrixRTCSessionManager.js.map +1 -0
- package/lib/matrixrtc/focus.d.ts +9 -0
- package/lib/matrixrtc/focus.d.ts.map +1 -0
- package/lib/matrixrtc/focus.js +6 -0
- package/lib/matrixrtc/focus.js.map +1 -0
- package/lib/models/MSC3089Branch.js +16 -16
- package/lib/models/MSC3089Branch.js.map +1 -1
- package/lib/models/MSC3089TreeSpace.js +16 -17
- package/lib/models/MSC3089TreeSpace.js.map +1 -1
- package/lib/models/beacon.js +3 -8
- package/lib/models/beacon.js.map +1 -1
- package/lib/models/device.js +14 -16
- package/lib/models/device.js.map +1 -1
- package/lib/models/event-context.js +1 -2
- package/lib/models/event-context.js.map +1 -1
- package/lib/models/event-timeline-set.js +1 -7
- package/lib/models/event-timeline-set.js.map +1 -1
- package/lib/models/event-timeline.js +4 -8
- package/lib/models/event-timeline.js.map +1 -1
- package/lib/models/event.d.ts +1 -1
- package/lib/models/event.js +7 -25
- package/lib/models/event.js.map +1 -1
- package/lib/models/poll.js +4 -8
- package/lib/models/poll.js.map +1 -1
- package/lib/models/read-receipt.js +0 -1
- package/lib/models/read-receipt.js.map +1 -1
- package/lib/models/related-relations.js +0 -3
- package/lib/models/related-relations.js.map +1 -1
- package/lib/models/relations-container.js +2 -2
- package/lib/models/relations-container.js.map +1 -1
- package/lib/models/relations.js +3 -4
- package/lib/models/relations.js.map +1 -1
- package/lib/models/room-member.js +2 -20
- package/lib/models/room-member.js.map +1 -1
- package/lib/models/room-state.js +3 -3
- package/lib/models/room-state.js.map +1 -1
- package/lib/models/room.d.ts +1 -1
- package/lib/models/room.d.ts.map +1 -1
- package/lib/models/room.js +40 -76
- package/lib/models/room.js.map +1 -1
- package/lib/models/thread.js +21 -32
- package/lib/models/thread.js.map +1 -1
- package/lib/models/user.js +1 -20
- package/lib/models/user.js.map +1 -1
- package/lib/oidc/authorize.js +16 -16
- package/lib/oidc/authorize.js.map +1 -1
- package/lib/oidc/discovery.js +16 -16
- package/lib/oidc/discovery.js.map +1 -1
- package/lib/pushprocessor.js +17 -17
- package/lib/pushprocessor.js.map +1 -1
- package/lib/receipt-accumulator.js +1 -1
- package/lib/receipt-accumulator.js.map +1 -1
- package/lib/rendezvous/MSC3906Rendezvous.js +2 -5
- package/lib/rendezvous/MSC3906Rendezvous.js.map +1 -1
- package/lib/rendezvous/channels/MSC3903ECDHv2RendezvousChannel.js +1 -4
- package/lib/rendezvous/channels/MSC3903ECDHv2RendezvousChannel.js.map +1 -1
- package/lib/rendezvous/transports/MSC3886SimpleHttpRendezvousTransport.js +1 -8
- package/lib/rendezvous/transports/MSC3886SimpleHttpRendezvousTransport.js.map +1 -1
- package/lib/room-hierarchy.js +4 -8
- package/lib/room-hierarchy.js.map +1 -1
- package/lib/rust-crypto/CrossSigningIdentity.d.ts +1 -5
- package/lib/rust-crypto/CrossSigningIdentity.d.ts.map +1 -1
- package/lib/rust-crypto/CrossSigningIdentity.js +1 -4
- package/lib/rust-crypto/CrossSigningIdentity.js.map +1 -1
- package/lib/rust-crypto/KeyClaimManager.js +1 -2
- package/lib/rust-crypto/KeyClaimManager.js.map +1 -1
- package/lib/rust-crypto/OutgoingRequestProcessor.js +16 -16
- package/lib/rust-crypto/OutgoingRequestProcessor.js.map +1 -1
- package/lib/rust-crypto/RoomEncryptor.js +0 -3
- package/lib/rust-crypto/RoomEncryptor.js.map +1 -1
- package/lib/rust-crypto/backup.d.ts +20 -2
- package/lib/rust-crypto/backup.d.ts.map +1 -1
- package/lib/rust-crypto/backup.js +39 -4
- package/lib/rust-crypto/backup.js.map +1 -1
- package/lib/rust-crypto/index.d.ts.map +1 -1
- package/lib/rust-crypto/index.js +1 -0
- package/lib/rust-crypto/index.js.map +1 -1
- package/lib/rust-crypto/rust-crypto.d.ts +39 -3
- package/lib/rust-crypto/rust-crypto.d.ts.map +1 -1
- package/lib/rust-crypto/rust-crypto.js +260 -61
- package/lib/rust-crypto/rust-crypto.js.map +1 -1
- package/lib/rust-crypto/verification.js +5 -7
- package/lib/rust-crypto/verification.js.map +1 -1
- package/lib/scheduler.js +2 -2
- package/lib/scheduler.js.map +1 -1
- package/lib/sliding-sync-sdk.js +4 -7
- package/lib/sliding-sync-sdk.js.map +1 -1
- package/lib/sliding-sync.js +23 -28
- package/lib/sliding-sync.js.map +1 -1
- package/lib/store/indexeddb-local-backend.js +6 -10
- package/lib/store/indexeddb-local-backend.js.map +1 -1
- package/lib/store/indexeddb-remote-backend.js +8 -11
- package/lib/store/indexeddb-remote-backend.js.map +1 -1
- package/lib/store/indexeddb-store-worker.js +1 -2
- package/lib/store/indexeddb-store-worker.js.map +1 -1
- package/lib/store/indexeddb.js +0 -1
- package/lib/store/indexeddb.js.map +1 -1
- package/lib/store/memory.js +0 -3
- package/lib/store/memory.js.map +1 -1
- package/lib/sync-accumulator.d.ts +11 -1
- package/lib/sync-accumulator.d.ts.map +1 -1
- package/lib/sync-accumulator.js +55 -4
- package/lib/sync-accumulator.js.map +1 -1
- package/lib/sync.d.ts.map +1 -1
- package/lib/sync.js +53 -39
- package/lib/sync.js.map +1 -1
- package/lib/timeline-window.js +2 -6
- package/lib/timeline-window.js.map +1 -1
- package/lib/utils.js +18 -18
- package/lib/utils.js.map +1 -1
- package/lib/webrtc/audioContext.js +1 -1
- package/lib/webrtc/audioContext.js.map +1 -1
- package/lib/webrtc/call.js +35 -73
- package/lib/webrtc/call.js.map +1 -1
- package/lib/webrtc/callEventHandler.js +1 -6
- package/lib/webrtc/callEventHandler.js.map +1 -1
- package/lib/webrtc/callFeed.js +2 -17
- package/lib/webrtc/callFeed.js.map +1 -1
- package/lib/webrtc/groupCall.d.ts +7 -1
- package/lib/webrtc/groupCall.d.ts.map +1 -1
- package/lib/webrtc/groupCall.js +47 -33
- package/lib/webrtc/groupCall.js.map +1 -1
- package/lib/webrtc/groupCallEventHandler.d.ts.map +1 -1
- package/lib/webrtc/groupCallEventHandler.js +3 -2
- package/lib/webrtc/groupCallEventHandler.js.map +1 -1
- package/lib/webrtc/mediaHandler.js +3 -7
- package/lib/webrtc/mediaHandler.js.map +1 -1
- package/lib/webrtc/stats/callStatsReportGatherer.js +19 -22
- package/lib/webrtc/stats/callStatsReportGatherer.js.map +1 -1
- package/lib/webrtc/stats/groupCallStats.js +4 -5
- package/lib/webrtc/stats/groupCallStats.js.map +1 -1
- package/lib/webrtc/stats/media/mediaSsrcHandler.js +1 -1
- package/lib/webrtc/stats/media/mediaSsrcHandler.js.map +1 -1
- package/lib/webrtc/stats/media/mediaTrackStats.js +3 -3
- package/lib/webrtc/stats/media/mediaTrackStats.js.map +1 -1
- package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +1 -1
- package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +1 -1
- package/package.json +4 -4
- package/src/client.ts +66 -23
- package/src/common-crypto/CryptoBackend.ts +45 -0
- package/src/common-crypto/base64.ts +46 -0
- package/src/crypto/backup.ts +30 -0
- package/src/crypto/index.ts +90 -3
- package/src/crypto/keybackup.ts +3 -20
- package/src/crypto/recoverykey.ts +3 -4
- package/src/crypto-api/keybackup.ts +19 -0
- package/src/crypto-api.ts +63 -0
- package/src/embedded.ts +28 -1
- package/src/matrixrtc/CallMembership.ts +95 -0
- package/src/matrixrtc/MatrixRTCSession.ts +418 -0
- package/src/matrixrtc/MatrixRTCSessionManager.ts +128 -0
- package/src/matrixrtc/focus.ts +24 -0
- package/src/models/event.ts +1 -1
- package/src/models/room.ts +11 -5
- package/src/rust-crypto/CrossSigningIdentity.ts +0 -4
- package/src/rust-crypto/backup.ts +56 -2
- package/src/rust-crypto/index.ts +3 -0
- package/src/rust-crypto/rust-crypto.ts +282 -44
- package/src/sync-accumulator.ts +63 -1
- package/src/sync.ts +26 -1
- package/src/webrtc/groupCall.ts +43 -6
- package/src/webrtc/groupCallEventHandler.ts +3 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MSC3886SimpleHttpRendezvousTransport.js","names":["_matrixEventsSdk","require","_logger","_utils","_","_httpApi","TYPE","UnstableValue","MSC3886SimpleHttpRendezvousTransport","constructor","onFailure","client","fallbackRzServer","fetchFn","_defineProperty2","default","ready","_ready","details","uri","Error","type","name","fetch","resource","options","global","getPostEndpoint","doesServerSupportUnstableFeature","baseUrl","ClientPrefix","Unstable","err","logger","warn","send","data","_this$uri","_res$headers$get","cancelled","method","headers","etag","res","body","JSON","stringify","status","cancel","RendezvousFailureReason","Unknown","get","undefined","_res$url","location","expires","expiresAt","Date","url","URL","endsWith","href","receive","poll","_poll$headers$get","_poll$headers$get2","json","sleep","reason","_this$onFailure","getTime","now","Expired","call","UserDeclined","e","exports"],"sources":["../../../src/rendezvous/transports/MSC3886SimpleHttpRendezvousTransport.ts"],"sourcesContent":["/*\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { UnstableValue } from \"matrix-events-sdk\";\n\nimport { logger } from \"../../logger\";\nimport { sleep } from \"../../utils\";\nimport {\n RendezvousFailureListener,\n RendezvousFailureReason,\n RendezvousTransport,\n RendezvousTransportDetails,\n} from \"..\";\nimport { MatrixClient } from \"../../matrix\";\nimport { ClientPrefix } from \"../../http-api\";\n\nconst TYPE = new UnstableValue(\"http.v1\", \"org.matrix.msc3886.http.v1\");\n\nexport interface MSC3886SimpleHttpRendezvousTransportDetails extends RendezvousTransportDetails {\n uri: string;\n}\n\n/**\n * Implementation of the unstable [MSC3886](https://github.com/matrix-org/matrix-spec-proposals/pull/3886)\n * simple HTTP rendezvous protocol.\n * Note that this is UNSTABLE and may have breaking changes without notice.\n */\nexport class MSC3886SimpleHttpRendezvousTransport<T extends {}> implements RendezvousTransport<T> {\n private uri?: string;\n private etag?: string;\n private expiresAt?: Date;\n private client: MatrixClient;\n private fallbackRzServer?: string;\n private fetchFn?: typeof global.fetch;\n private cancelled = false;\n private _ready = false;\n public onFailure?: RendezvousFailureListener;\n\n public constructor({\n onFailure,\n client,\n fallbackRzServer,\n fetchFn,\n }: {\n fetchFn?: typeof global.fetch;\n onFailure?: RendezvousFailureListener;\n client: MatrixClient;\n fallbackRzServer?: string;\n }) {\n this.fetchFn = fetchFn;\n this.onFailure = onFailure;\n this.client = client;\n this.fallbackRzServer = fallbackRzServer;\n }\n\n public get ready(): boolean {\n return this._ready;\n }\n\n public async details(): Promise<MSC3886SimpleHttpRendezvousTransportDetails> {\n if (!this.uri) {\n throw new Error(\"Rendezvous not set up\");\n }\n\n return {\n type: TYPE.name,\n uri: this.uri,\n };\n }\n\n private fetch(resource: URL | string, options?: RequestInit): ReturnType<typeof global.fetch> {\n if (this.fetchFn) {\n return this.fetchFn(resource, options);\n }\n return global.fetch(resource, options);\n }\n\n private async getPostEndpoint(): Promise<string | undefined> {\n try {\n if (await this.client.doesServerSupportUnstableFeature(\"org.matrix.msc3886\")) {\n return `${this.client.baseUrl}${ClientPrefix.Unstable}/org.matrix.msc3886/rendezvous`;\n }\n } catch (err) {\n logger.warn(\"Failed to get unstable features\", err);\n }\n\n return this.fallbackRzServer;\n }\n\n public async send(data: T): Promise<void> {\n if (this.cancelled) {\n return;\n }\n const method = this.uri ? \"PUT\" : \"POST\";\n const uri = this.uri ?? (await this.getPostEndpoint());\n\n if (!uri) {\n throw new Error(\"Invalid rendezvous URI\");\n }\n\n const headers: Record<string, string> = { \"content-type\": \"application/json\" };\n if (this.etag) {\n headers[\"if-match\"] = this.etag;\n }\n\n const res = await this.fetch(uri, { method, headers, body: JSON.stringify(data) });\n if (res.status === 404) {\n return this.cancel(RendezvousFailureReason.Unknown);\n }\n this.etag = res.headers.get(\"etag\") ?? undefined;\n\n if (method === \"POST\") {\n const location = res.headers.get(\"location\");\n if (!location) {\n throw new Error(\"No rendezvous URI given\");\n }\n const expires = res.headers.get(\"expires\");\n if (expires) {\n this.expiresAt = new Date(expires);\n }\n // we would usually expect the final `url` to be set by a proper fetch implementation.\n // however, if a polyfill based on XHR is used it won't be set, we we use existing URI as fallback\n const baseUrl = res.url ?? uri;\n // resolve location header which could be relative or absolute\n this.uri = new URL(location, `${baseUrl}${baseUrl.endsWith(\"/\") ? \"\" : \"/\"}`).href;\n this._ready = true;\n }\n }\n\n public async receive(): Promise<Partial<T> | undefined> {\n if (!this.uri) {\n throw new Error(\"Rendezvous not set up\");\n }\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (this.cancelled) {\n return undefined;\n }\n\n const headers: Record<string, string> = {};\n if (this.etag) {\n headers[\"if-none-match\"] = this.etag;\n }\n const poll = await this.fetch(this.uri, { method: \"GET\", headers });\n\n if (poll.status === 404) {\n this.cancel(RendezvousFailureReason.Unknown);\n return undefined;\n }\n\n // rely on server expiring the channel rather than checking ourselves\n\n if (poll.headers.get(\"content-type\") !== \"application/json\") {\n this.etag = poll.headers.get(\"etag\") ?? undefined;\n } else if (poll.status === 200) {\n this.etag = poll.headers.get(\"etag\") ?? undefined;\n return poll.json();\n }\n await sleep(1000);\n }\n }\n\n public async cancel(reason: RendezvousFailureReason): Promise<void> {\n if (reason === RendezvousFailureReason.Unknown && this.expiresAt && this.expiresAt.getTime() < Date.now()) {\n reason = RendezvousFailureReason.Expired;\n }\n\n this.cancelled = true;\n this._ready = false;\n this.onFailure?.(reason);\n\n if (this.uri && reason === RendezvousFailureReason.UserDeclined) {\n try {\n await this.fetch(this.uri, { method: \"DELETE\" });\n } catch (e) {\n logger.warn(e);\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MSC3886SimpleHttpRendezvousTransport.js","names":["_matrixEventsSdk","require","_logger","_utils","_","_httpApi","TYPE","UnstableValue","MSC3886SimpleHttpRendezvousTransport","constructor","onFailure","client","fallbackRzServer","fetchFn","_defineProperty2","default","ready","_ready","details","uri","Error","type","name","fetch","resource","options","global","getPostEndpoint","doesServerSupportUnstableFeature","baseUrl","ClientPrefix","Unstable","err","logger","warn","send","data","_this$uri","_res$headers$get","cancelled","method","headers","etag","res","body","JSON","stringify","status","cancel","RendezvousFailureReason","Unknown","get","undefined","_res$url","location","expires","expiresAt","Date","url","URL","endsWith","href","receive","poll","_poll$headers$get","_poll$headers$get2","json","sleep","reason","_this$onFailure","getTime","now","Expired","call","UserDeclined","e","exports"],"sources":["../../../src/rendezvous/transports/MSC3886SimpleHttpRendezvousTransport.ts"],"sourcesContent":["/*\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { UnstableValue } from \"matrix-events-sdk\";\n\nimport { logger } from \"../../logger\";\nimport { sleep } from \"../../utils\";\nimport {\n RendezvousFailureListener,\n RendezvousFailureReason,\n RendezvousTransport,\n RendezvousTransportDetails,\n} from \"..\";\nimport { MatrixClient } from \"../../matrix\";\nimport { ClientPrefix } from \"../../http-api\";\n\nconst TYPE = new UnstableValue(\"http.v1\", \"org.matrix.msc3886.http.v1\");\n\nexport interface MSC3886SimpleHttpRendezvousTransportDetails extends RendezvousTransportDetails {\n uri: string;\n}\n\n/**\n * Implementation of the unstable [MSC3886](https://github.com/matrix-org/matrix-spec-proposals/pull/3886)\n * simple HTTP rendezvous protocol.\n * Note that this is UNSTABLE and may have breaking changes without notice.\n */\nexport class MSC3886SimpleHttpRendezvousTransport<T extends {}> implements RendezvousTransport<T> {\n private uri?: string;\n private etag?: string;\n private expiresAt?: Date;\n private client: MatrixClient;\n private fallbackRzServer?: string;\n private fetchFn?: typeof global.fetch;\n private cancelled = false;\n private _ready = false;\n public onFailure?: RendezvousFailureListener;\n\n public constructor({\n onFailure,\n client,\n fallbackRzServer,\n fetchFn,\n }: {\n fetchFn?: typeof global.fetch;\n onFailure?: RendezvousFailureListener;\n client: MatrixClient;\n fallbackRzServer?: string;\n }) {\n this.fetchFn = fetchFn;\n this.onFailure = onFailure;\n this.client = client;\n this.fallbackRzServer = fallbackRzServer;\n }\n\n public get ready(): boolean {\n return this._ready;\n }\n\n public async details(): Promise<MSC3886SimpleHttpRendezvousTransportDetails> {\n if (!this.uri) {\n throw new Error(\"Rendezvous not set up\");\n }\n\n return {\n type: TYPE.name,\n uri: this.uri,\n };\n }\n\n private fetch(resource: URL | string, options?: RequestInit): ReturnType<typeof global.fetch> {\n if (this.fetchFn) {\n return this.fetchFn(resource, options);\n }\n return global.fetch(resource, options);\n }\n\n private async getPostEndpoint(): Promise<string | undefined> {\n try {\n if (await this.client.doesServerSupportUnstableFeature(\"org.matrix.msc3886\")) {\n return `${this.client.baseUrl}${ClientPrefix.Unstable}/org.matrix.msc3886/rendezvous`;\n }\n } catch (err) {\n logger.warn(\"Failed to get unstable features\", err);\n }\n\n return this.fallbackRzServer;\n }\n\n public async send(data: T): Promise<void> {\n if (this.cancelled) {\n return;\n }\n const method = this.uri ? \"PUT\" : \"POST\";\n const uri = this.uri ?? (await this.getPostEndpoint());\n\n if (!uri) {\n throw new Error(\"Invalid rendezvous URI\");\n }\n\n const headers: Record<string, string> = { \"content-type\": \"application/json\" };\n if (this.etag) {\n headers[\"if-match\"] = this.etag;\n }\n\n const res = await this.fetch(uri, { method, headers, body: JSON.stringify(data) });\n if (res.status === 404) {\n return this.cancel(RendezvousFailureReason.Unknown);\n }\n this.etag = res.headers.get(\"etag\") ?? undefined;\n\n if (method === \"POST\") {\n const location = res.headers.get(\"location\");\n if (!location) {\n throw new Error(\"No rendezvous URI given\");\n }\n const expires = res.headers.get(\"expires\");\n if (expires) {\n this.expiresAt = new Date(expires);\n }\n // we would usually expect the final `url` to be set by a proper fetch implementation.\n // however, if a polyfill based on XHR is used it won't be set, we we use existing URI as fallback\n const baseUrl = res.url ?? uri;\n // resolve location header which could be relative or absolute\n this.uri = new URL(location, `${baseUrl}${baseUrl.endsWith(\"/\") ? \"\" : \"/\"}`).href;\n this._ready = true;\n }\n }\n\n public async receive(): Promise<Partial<T> | undefined> {\n if (!this.uri) {\n throw new Error(\"Rendezvous not set up\");\n }\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (this.cancelled) {\n return undefined;\n }\n\n const headers: Record<string, string> = {};\n if (this.etag) {\n headers[\"if-none-match\"] = this.etag;\n }\n const poll = await this.fetch(this.uri, { method: \"GET\", headers });\n\n if (poll.status === 404) {\n this.cancel(RendezvousFailureReason.Unknown);\n return undefined;\n }\n\n // rely on server expiring the channel rather than checking ourselves\n\n if (poll.headers.get(\"content-type\") !== \"application/json\") {\n this.etag = poll.headers.get(\"etag\") ?? undefined;\n } else if (poll.status === 200) {\n this.etag = poll.headers.get(\"etag\") ?? undefined;\n return poll.json();\n }\n await sleep(1000);\n }\n }\n\n public async cancel(reason: RendezvousFailureReason): Promise<void> {\n if (reason === RendezvousFailureReason.Unknown && this.expiresAt && this.expiresAt.getTime() < Date.now()) {\n reason = RendezvousFailureReason.Expired;\n }\n\n this.cancelled = true;\n this._ready = false;\n this.onFailure?.(reason);\n\n if (this.uri && reason === RendezvousFailureReason.UserDeclined) {\n try {\n await this.fetch(this.uri, { method: \"DELETE\" });\n } catch (e) {\n logger.warn(e);\n }\n }\n }\n}\n"],"mappings":"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"}
|
package/lib/room-hierarchy.js
CHANGED
|
@@ -35,20 +35,16 @@ class RoomHierarchy {
|
|
|
35
35
|
* @param suggestedOnly - whether to only return rooms with suggested=true.
|
|
36
36
|
*/
|
|
37
37
|
constructor(root, pageSize, maxDepth, suggestedOnly = false) {
|
|
38
|
-
this.root = root;
|
|
39
|
-
this.pageSize = pageSize;
|
|
40
|
-
this.maxDepth = maxDepth;
|
|
41
|
-
this.suggestedOnly = suggestedOnly;
|
|
42
38
|
// Map from room id to list of servers which are listed as a via somewhere in the loaded hierarchy
|
|
43
39
|
(0, _defineProperty2.default)(this, "viaMap", new Map());
|
|
44
40
|
// Map from room id to list of rooms which claim this room as their child
|
|
45
41
|
(0, _defineProperty2.default)(this, "backRefs", new Map());
|
|
46
42
|
// Map from room id to object
|
|
47
43
|
(0, _defineProperty2.default)(this, "roomMap", new Map());
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
this.root = root;
|
|
45
|
+
this.pageSize = pageSize;
|
|
46
|
+
this.maxDepth = maxDepth;
|
|
47
|
+
this.suggestedOnly = suggestedOnly;
|
|
52
48
|
}
|
|
53
49
|
get noSupport() {
|
|
54
50
|
return !!this.serverSupportError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room-hierarchy.js","names":["_event","require","RoomHierarchy","constructor","root","pageSize","maxDepth","suggestedOnly","_defineProperty2","default","Map","noSupport","serverSupportError","canLoadMore","nextBatch","_rooms","loading","loadRequest","rooms","load","then","r","client","getRoomHierarchy","roomId","next_batch","e","errcode","undefined","concat","forEach","room","roomMap","set","room_id","children_state","ev","type","EventType","SpaceChild","childRoomId","state_key","backRefs","has","get","push","Array","isArray","content","via","viaMap","Set","vias","add","getRelation","parentId","childId","_this$roomMap$get","find","isSuggested","_this$getRelation","suggested","removeRelation","length","delete","filter","ref","exports"],"sources":["../src/room-hierarchy.ts"],"sourcesContent":["/*\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { Room } from \"./models/room\";\nimport { IHierarchyRoom, IHierarchyRelation } from \"./@types/spaces\";\nimport { MatrixClient } from \"./client\";\nimport { EventType } from \"./@types/event\";\nimport { MatrixError } from \"./http-api\";\n\nexport class RoomHierarchy {\n // Map from room id to list of servers which are listed as a via somewhere in the loaded hierarchy\n public readonly viaMap = new Map<string, Set<string>>();\n // Map from room id to list of rooms which claim this room as their child\n public readonly backRefs = new Map<string, string[]>();\n // Map from room id to object\n public readonly roomMap = new Map<string, IHierarchyRoom>();\n private loadRequest?: ReturnType<MatrixClient[\"getRoomHierarchy\"]>;\n private nextBatch?: string;\n private _rooms?: IHierarchyRoom[];\n private serverSupportError?: Error;\n\n /**\n * Construct a new RoomHierarchy\n *\n * A RoomHierarchy instance allows you to easily make use of the /hierarchy API and paginate it.\n *\n * @param root - the root of this hierarchy\n * @param pageSize - the maximum number of rooms to return per page, can be overridden per load request.\n * @param maxDepth - the maximum depth to traverse the hierarchy to\n * @param suggestedOnly - whether to only return rooms with suggested=true.\n */\n public constructor(\n public readonly root: Room,\n private readonly pageSize?: number,\n private readonly maxDepth?: number,\n private readonly suggestedOnly = false,\n ) {}\n\n public get noSupport(): boolean {\n return !!this.serverSupportError;\n }\n\n public get canLoadMore(): boolean {\n return !!this.serverSupportError || !!this.nextBatch || !this._rooms;\n }\n\n public get loading(): boolean {\n return !!this.loadRequest;\n }\n\n public get rooms(): IHierarchyRoom[] | undefined {\n return this._rooms;\n }\n\n public async load(pageSize = this.pageSize): Promise<IHierarchyRoom[]> {\n if (this.loadRequest) return this.loadRequest.then((r) => r.rooms);\n\n this.loadRequest = this.root.client.getRoomHierarchy(\n this.root.roomId,\n pageSize,\n this.maxDepth,\n this.suggestedOnly,\n this.nextBatch,\n );\n\n let rooms: IHierarchyRoom[];\n try {\n ({ rooms, next_batch: this.nextBatch } = await this.loadRequest);\n } catch (e) {\n if ((<MatrixError>e).errcode === \"M_UNRECOGNIZED\") {\n this.serverSupportError = <MatrixError>e;\n } else {\n throw e;\n }\n\n return [];\n } finally {\n this.loadRequest = undefined;\n }\n\n if (this._rooms) {\n this._rooms = this._rooms.concat(rooms);\n } else {\n this._rooms = rooms;\n }\n\n rooms.forEach((room) => {\n this.roomMap.set(room.room_id, room);\n\n room.children_state.forEach((ev) => {\n if (ev.type !== EventType.SpaceChild) return;\n const childRoomId = ev.state_key;\n\n // track backrefs for quicker hierarchy navigation\n if (!this.backRefs.has(childRoomId)) {\n this.backRefs.set(childRoomId, []);\n }\n this.backRefs.get(childRoomId)!.push(room.room_id);\n\n // fill viaMap\n if (Array.isArray(ev.content.via)) {\n if (!this.viaMap.has(childRoomId)) {\n this.viaMap.set(childRoomId, new Set());\n }\n const vias = this.viaMap.get(childRoomId)!;\n ev.content.via.forEach((via) => vias.add(via));\n }\n });\n });\n\n return rooms;\n }\n\n public getRelation(parentId: string, childId: string): IHierarchyRelation | undefined {\n return this.roomMap.get(parentId)?.children_state.find((e) => e.state_key === childId);\n }\n\n public isSuggested(parentId: string, childId: string): boolean | undefined {\n return this.getRelation(parentId, childId)?.content.suggested;\n }\n\n // locally remove a relation as a form of local echo\n public removeRelation(parentId: string, childId: string): void {\n const backRefs = this.backRefs.get(childId);\n if (backRefs?.length === 1) {\n this.backRefs.delete(childId);\n } else if (backRefs?.length) {\n this.backRefs.set(\n childId,\n backRefs.filter((ref) => ref !== parentId),\n );\n }\n\n const room = this.roomMap.get(parentId);\n if (room) {\n room.children_state = room.children_state.filter((ev) => ev.state_key !== childId);\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"room-hierarchy.js","names":["_event","require","RoomHierarchy","constructor","root","pageSize","maxDepth","suggestedOnly","_defineProperty2","default","Map","noSupport","serverSupportError","canLoadMore","nextBatch","_rooms","loading","loadRequest","rooms","load","then","r","client","getRoomHierarchy","roomId","next_batch","e","errcode","undefined","concat","forEach","room","roomMap","set","room_id","children_state","ev","type","EventType","SpaceChild","childRoomId","state_key","backRefs","has","get","push","Array","isArray","content","via","viaMap","Set","vias","add","getRelation","parentId","childId","_this$roomMap$get","find","isSuggested","_this$getRelation","suggested","removeRelation","length","delete","filter","ref","exports"],"sources":["../src/room-hierarchy.ts"],"sourcesContent":["/*\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { Room } from \"./models/room\";\nimport { IHierarchyRoom, IHierarchyRelation } from \"./@types/spaces\";\nimport { MatrixClient } from \"./client\";\nimport { EventType } from \"./@types/event\";\nimport { MatrixError } from \"./http-api\";\n\nexport class RoomHierarchy {\n // Map from room id to list of servers which are listed as a via somewhere in the loaded hierarchy\n public readonly viaMap = new Map<string, Set<string>>();\n // Map from room id to list of rooms which claim this room as their child\n public readonly backRefs = new Map<string, string[]>();\n // Map from room id to object\n public readonly roomMap = new Map<string, IHierarchyRoom>();\n private loadRequest?: ReturnType<MatrixClient[\"getRoomHierarchy\"]>;\n private nextBatch?: string;\n private _rooms?: IHierarchyRoom[];\n private serverSupportError?: Error;\n\n /**\n * Construct a new RoomHierarchy\n *\n * A RoomHierarchy instance allows you to easily make use of the /hierarchy API and paginate it.\n *\n * @param root - the root of this hierarchy\n * @param pageSize - the maximum number of rooms to return per page, can be overridden per load request.\n * @param maxDepth - the maximum depth to traverse the hierarchy to\n * @param suggestedOnly - whether to only return rooms with suggested=true.\n */\n public constructor(\n public readonly root: Room,\n private readonly pageSize?: number,\n private readonly maxDepth?: number,\n private readonly suggestedOnly = false,\n ) {}\n\n public get noSupport(): boolean {\n return !!this.serverSupportError;\n }\n\n public get canLoadMore(): boolean {\n return !!this.serverSupportError || !!this.nextBatch || !this._rooms;\n }\n\n public get loading(): boolean {\n return !!this.loadRequest;\n }\n\n public get rooms(): IHierarchyRoom[] | undefined {\n return this._rooms;\n }\n\n public async load(pageSize = this.pageSize): Promise<IHierarchyRoom[]> {\n if (this.loadRequest) return this.loadRequest.then((r) => r.rooms);\n\n this.loadRequest = this.root.client.getRoomHierarchy(\n this.root.roomId,\n pageSize,\n this.maxDepth,\n this.suggestedOnly,\n this.nextBatch,\n );\n\n let rooms: IHierarchyRoom[];\n try {\n ({ rooms, next_batch: this.nextBatch } = await this.loadRequest);\n } catch (e) {\n if ((<MatrixError>e).errcode === \"M_UNRECOGNIZED\") {\n this.serverSupportError = <MatrixError>e;\n } else {\n throw e;\n }\n\n return [];\n } finally {\n this.loadRequest = undefined;\n }\n\n if (this._rooms) {\n this._rooms = this._rooms.concat(rooms);\n } else {\n this._rooms = rooms;\n }\n\n rooms.forEach((room) => {\n this.roomMap.set(room.room_id, room);\n\n room.children_state.forEach((ev) => {\n if (ev.type !== EventType.SpaceChild) return;\n const childRoomId = ev.state_key;\n\n // track backrefs for quicker hierarchy navigation\n if (!this.backRefs.has(childRoomId)) {\n this.backRefs.set(childRoomId, []);\n }\n this.backRefs.get(childRoomId)!.push(room.room_id);\n\n // fill viaMap\n if (Array.isArray(ev.content.via)) {\n if (!this.viaMap.has(childRoomId)) {\n this.viaMap.set(childRoomId, new Set());\n }\n const vias = this.viaMap.get(childRoomId)!;\n ev.content.via.forEach((via) => vias.add(via));\n }\n });\n });\n\n return rooms;\n }\n\n public getRelation(parentId: string, childId: string): IHierarchyRelation | undefined {\n return this.roomMap.get(parentId)?.children_state.find((e) => e.state_key === childId);\n }\n\n public isSuggested(parentId: string, childId: string): boolean | undefined {\n return this.getRelation(parentId, childId)?.content.suggested;\n }\n\n // locally remove a relation as a form of local echo\n public removeRelation(parentId: string, childId: string): void {\n const backRefs = this.backRefs.get(childId);\n if (backRefs?.length === 1) {\n this.backRefs.delete(childId);\n } else if (backRefs?.length) {\n this.backRefs.set(\n childId,\n backRefs.filter((ref) => ref !== parentId),\n );\n }\n\n const room = this.roomMap.get(parentId);\n if (room) {\n room.children_state = room.children_state.filter((ev) => ev.state_key !== childId);\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -10,11 +10,7 @@ export declare class CrossSigningIdentity {
|
|
|
10
10
|
private readonly olmMachine;
|
|
11
11
|
private readonly outgoingRequestProcessor;
|
|
12
12
|
private readonly secretStorage;
|
|
13
|
-
|
|
14
|
-
private readonly onCrossSigningKeysImport;
|
|
15
|
-
constructor(olmMachine: OlmMachine, outgoingRequestProcessor: OutgoingRequestProcessor, secretStorage: ServerSideSecretStorage,
|
|
16
|
-
/** Called if the cross signing keys are imported from the secret storage */
|
|
17
|
-
onCrossSigningKeysImport: () => Promise<void>);
|
|
13
|
+
constructor(olmMachine: OlmMachine, outgoingRequestProcessor: OutgoingRequestProcessor, secretStorage: ServerSideSecretStorage);
|
|
18
14
|
/**
|
|
19
15
|
* Initialise our cross-signing keys by creating new keys if they do not exist, and uploading to the server
|
|
20
16
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CrossSigningIdentity.d.ts","sourceRoot":"","sources":["../../src/rust-crypto/CrossSigningIdentity.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,UAAU,EAAsB,MAAM,oCAAoC,CAAC;AAGpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,EAAmB,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEvF,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;GAGG;AACH,qBAAa,oBAAoB;IAEzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,wBAAwB;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa;
|
|
1
|
+
{"version":3,"file":"CrossSigningIdentity.d.ts","sourceRoot":"","sources":["../../src/rust-crypto/CrossSigningIdentity.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,UAAU,EAAsB,MAAM,oCAAoC,CAAC;AAGpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,EAAmB,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEvF,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;GAGG;AACH,qBAAa,oBAAoB;IAEzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,wBAAwB;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAFb,UAAU,EAAE,UAAU,EACtB,wBAAwB,EAAE,wBAAwB,EAClD,aAAa,EAAE,uBAAuB;IAG3D;;OAEG;IACU,qBAAqB,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+DlF;;;;;;OAMG;YACW,iBAAiB;IAU/B;;;;OAIG;YACW,+BAA+B;CAGhD"}
|
|
@@ -26,12 +26,10 @@ limitations under the License.
|
|
|
26
26
|
* @internal
|
|
27
27
|
*/
|
|
28
28
|
class CrossSigningIdentity {
|
|
29
|
-
constructor(olmMachine, outgoingRequestProcessor, secretStorage
|
|
30
|
-
onCrossSigningKeysImport) {
|
|
29
|
+
constructor(olmMachine, outgoingRequestProcessor, secretStorage) {
|
|
31
30
|
this.olmMachine = olmMachine;
|
|
32
31
|
this.outgoingRequestProcessor = outgoingRequestProcessor;
|
|
33
32
|
this.secretStorage = secretStorage;
|
|
34
|
-
this.onCrossSigningKeysImport = onCrossSigningKeysImport;
|
|
35
33
|
}
|
|
36
34
|
|
|
37
35
|
/**
|
|
@@ -75,7 +73,6 @@ class CrossSigningIdentity {
|
|
|
75
73
|
// Sign the device with our cross-signing key and upload the signature
|
|
76
74
|
const request = await device.verify();
|
|
77
75
|
await this.outgoingRequestProcessor.makeOutgoingRequest(request);
|
|
78
|
-
await this.onCrossSigningKeysImport();
|
|
79
76
|
}
|
|
80
77
|
|
|
81
78
|
// TODO: we might previously have bootstrapped cross-signing but not completed uploading the keys to the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CrossSigningIdentity.js","names":["_logger","require","CrossSigningIdentity","constructor","olmMachine","outgoingRequestProcessor","secretStorage","
|
|
1
|
+
{"version":3,"file":"CrossSigningIdentity.js","names":["_logger","require","CrossSigningIdentity","constructor","olmMachine","outgoingRequestProcessor","secretStorage","bootstrapCrossSigning","opts","setupNewCrossSigning","resetCrossSigning","authUploadDeviceSigningKeys","olmDeviceStatus","crossSigningStatus","masterKeyFromSecretStorage","get","selfSigningKeyFromSecretStorage","userSigningKeyFromSecretStorage","privateKeysInSecretStorage","Boolean","olmDeviceHasKeys","hasMaster","hasUserSigning","hasSelfSigning","logger","log","olmDeviceHasMaster","olmDeviceHasUserSigning","olmDeviceHasSelfSigning","exportCrossSigningKeysToStorage","importCrossSigningKeys","device","getDevice","userId","deviceId","request","verify","makeOutgoingRequest","outgoingRequests","req","exports"],"sources":["../../src/rust-crypto/CrossSigningIdentity.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { OlmMachine, CrossSigningStatus } from \"@matrix-org/matrix-sdk-crypto-wasm\";\nimport * as RustSdkCryptoJs from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport { BootstrapCrossSigningOpts } from \"../crypto-api\";\nimport { logger } from \"../logger\";\nimport { OutgoingRequest, OutgoingRequestProcessor } from \"./OutgoingRequestProcessor\";\nimport { UIAuthCallback } from \"../interactive-auth\";\nimport { ServerSideSecretStorage } from \"../secret-storage\";\n\n/** Manages the cross-signing keys for our own user.\n *\n * @internal\n */\nexport class CrossSigningIdentity {\n public constructor(\n private readonly olmMachine: OlmMachine,\n private readonly outgoingRequestProcessor: OutgoingRequestProcessor,\n private readonly secretStorage: ServerSideSecretStorage,\n ) {}\n\n /**\n * Initialise our cross-signing keys by creating new keys if they do not exist, and uploading to the server\n */\n public async bootstrapCrossSigning(opts: BootstrapCrossSigningOpts): Promise<void> {\n if (opts.setupNewCrossSigning) {\n await this.resetCrossSigning(opts.authUploadDeviceSigningKeys);\n return;\n }\n\n const olmDeviceStatus: CrossSigningStatus = await this.olmMachine.crossSigningStatus();\n\n // Try to fetch cross signing keys from the secret storage\n const masterKeyFromSecretStorage = await this.secretStorage.get(\"m.cross_signing.master\");\n const selfSigningKeyFromSecretStorage = await this.secretStorage.get(\"m.cross_signing.self_signing\");\n const userSigningKeyFromSecretStorage = await this.secretStorage.get(\"m.cross_signing.user_signing\");\n const privateKeysInSecretStorage = Boolean(\n masterKeyFromSecretStorage && selfSigningKeyFromSecretStorage && userSigningKeyFromSecretStorage,\n );\n\n const olmDeviceHasKeys =\n olmDeviceStatus.hasMaster && olmDeviceStatus.hasUserSigning && olmDeviceStatus.hasSelfSigning;\n\n // Log all relevant state for easier parsing of debug logs.\n logger.log(\"bootStrapCrossSigning: starting\", {\n setupNewCrossSigning: opts.setupNewCrossSigning,\n olmDeviceHasMaster: olmDeviceStatus.hasMaster,\n olmDeviceHasUserSigning: olmDeviceStatus.hasUserSigning,\n olmDeviceHasSelfSigning: olmDeviceStatus.hasSelfSigning,\n privateKeysInSecretStorage,\n });\n\n if (!olmDeviceHasKeys && !privateKeysInSecretStorage) {\n logger.log(\n \"bootStrapCrossSigning: Cross-signing private keys not found locally or in secret storage, creating new keys\",\n );\n await this.resetCrossSigning(opts.authUploadDeviceSigningKeys);\n } else if (olmDeviceHasKeys) {\n logger.log(\"bootStrapCrossSigning: Olm device has private keys: exporting to secret storage\");\n await this.exportCrossSigningKeysToStorage();\n } else if (privateKeysInSecretStorage) {\n logger.log(\n \"bootStrapCrossSigning: Cross-signing private keys not found locally, but they are available \" +\n \"in secret storage, reading storage and caching locally\",\n );\n await this.olmMachine.importCrossSigningKeys(\n masterKeyFromSecretStorage,\n selfSigningKeyFromSecretStorage,\n userSigningKeyFromSecretStorage,\n );\n\n // Get the current device\n const device: RustSdkCryptoJs.Device = await this.olmMachine.getDevice(\n this.olmMachine.userId,\n this.olmMachine.deviceId,\n );\n\n // Sign the device with our cross-signing key and upload the signature\n const request: RustSdkCryptoJs.SignatureUploadRequest = await device.verify();\n await this.outgoingRequestProcessor.makeOutgoingRequest(request);\n }\n\n // TODO: we might previously have bootstrapped cross-signing but not completed uploading the keys to the\n // server -- in which case we should call OlmDevice.bootstrap_cross_signing. How do we know?\n logger.log(\"bootStrapCrossSigning: complete\");\n }\n\n /** Reset our cross-signing keys\n *\n * This method will:\n * * Tell the OlmMachine to create new keys\n * * Upload the new public keys and the device signature to the server\n * * Upload the private keys to SSSS, if it is set up\n */\n private async resetCrossSigning(authUploadDeviceSigningKeys?: UIAuthCallback<void>): Promise<void> {\n const outgoingRequests: Array<OutgoingRequest> = await this.olmMachine.bootstrapCrossSigning(true);\n\n logger.log(\"bootStrapCrossSigning: publishing keys to server\");\n for (const req of outgoingRequests) {\n await this.outgoingRequestProcessor.makeOutgoingRequest(req, authUploadDeviceSigningKeys);\n }\n await this.exportCrossSigningKeysToStorage();\n }\n\n /**\n * Extract the cross-signing keys from the olm machine and save them to secret storage, if it is configured\n *\n * (If secret storage is *not* configured, we assume that the export will happen when it is set up)\n */\n private async exportCrossSigningKeysToStorage(): Promise<void> {\n // TODO\n }\n}\n"],"mappings":"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"}
|
|
@@ -31,10 +31,9 @@ limitations under the License.
|
|
|
31
31
|
*/
|
|
32
32
|
class KeyClaimManager {
|
|
33
33
|
constructor(olmMachine, outgoingRequestProcessor) {
|
|
34
|
+
(0, _defineProperty2.default)(this, "stopped", false);
|
|
34
35
|
this.olmMachine = olmMachine;
|
|
35
36
|
this.outgoingRequestProcessor = outgoingRequestProcessor;
|
|
36
|
-
(0, _defineProperty2.default)(this, "currentClaimPromise", void 0);
|
|
37
|
-
(0, _defineProperty2.default)(this, "stopped", false);
|
|
38
37
|
this.currentClaimPromise = Promise.resolve();
|
|
39
38
|
}
|
|
40
39
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyClaimManager.js","names":["KeyClaimManager","constructor","olmMachine","outgoingRequestProcessor","_defineProperty2","default","currentClaimPromise","Promise","resolve","stop","stopped","ensureSessionsForUsers","userList","prom","catch","then","ensureSessionsForUsersInner","Error","claimRequest","getMissingSessions","makeOutgoingRequest","exports"],"sources":["../../src/rust-crypto/KeyClaimManager.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { OlmMachine, UserId } from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport { OutgoingRequestProcessor } from \"./OutgoingRequestProcessor\";\n\n/**\n * KeyClaimManager: linearises calls to OlmMachine.getMissingSessions to avoid races\n *\n * We have one of these per `RustCrypto` (and hence per `MatrixClient`).\n *\n * @internal\n */\nexport class KeyClaimManager {\n private currentClaimPromise: Promise<void>;\n private stopped = false;\n\n public constructor(\n private readonly olmMachine: OlmMachine,\n private readonly outgoingRequestProcessor: OutgoingRequestProcessor,\n ) {\n this.currentClaimPromise = Promise.resolve();\n }\n\n /**\n * Tell the KeyClaimManager to immediately stop processing requests.\n *\n * Any further calls, and any still in the queue, will fail with an error.\n */\n public stop(): void {\n this.stopped = true;\n }\n\n /**\n * Given a list of users, attempt to ensure that we have Olm Sessions active with each of their devices\n *\n * If we don't have an active olm session, we will claim a one-time key and start one.\n *\n * @param userList - list of userIDs to claim\n */\n public ensureSessionsForUsers(userList: Array<UserId>): Promise<void> {\n // The Rust-SDK requires that we only have one getMissingSessions process in flight at once. This little dance\n // ensures that, by only having one call to ensureSessionsForUsersInner active at once (and making them\n // queue up in order).\n const prom = this.currentClaimPromise\n .catch(() => {\n // any errors in the previous claim will have been reported already, so there is nothing to do here.\n // we just throw away the error and start anew.\n })\n .then(() => this.ensureSessionsForUsersInner(userList));\n this.currentClaimPromise = prom;\n return prom;\n }\n\n private async ensureSessionsForUsersInner(userList: Array<UserId>): Promise<void> {\n // bail out quickly if we've been stopped.\n if (this.stopped) {\n throw new Error(`Cannot ensure Olm sessions: shutting down`);\n }\n const claimRequest = await this.olmMachine.getMissingSessions(userList);\n if (claimRequest) {\n await this.outgoingRequestProcessor.makeOutgoingRequest(claimRequest);\n }\n }\n}\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,eAAe,CAAC;EAIlBC,WAAWA,CACGC,UAAsB,EACtBC,wBAAkD,EACrE;IAAA,
|
|
1
|
+
{"version":3,"file":"KeyClaimManager.js","names":["KeyClaimManager","constructor","olmMachine","outgoingRequestProcessor","_defineProperty2","default","currentClaimPromise","Promise","resolve","stop","stopped","ensureSessionsForUsers","userList","prom","catch","then","ensureSessionsForUsersInner","Error","claimRequest","getMissingSessions","makeOutgoingRequest","exports"],"sources":["../../src/rust-crypto/KeyClaimManager.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { OlmMachine, UserId } from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport { OutgoingRequestProcessor } from \"./OutgoingRequestProcessor\";\n\n/**\n * KeyClaimManager: linearises calls to OlmMachine.getMissingSessions to avoid races\n *\n * We have one of these per `RustCrypto` (and hence per `MatrixClient`).\n *\n * @internal\n */\nexport class KeyClaimManager {\n private currentClaimPromise: Promise<void>;\n private stopped = false;\n\n public constructor(\n private readonly olmMachine: OlmMachine,\n private readonly outgoingRequestProcessor: OutgoingRequestProcessor,\n ) {\n this.currentClaimPromise = Promise.resolve();\n }\n\n /**\n * Tell the KeyClaimManager to immediately stop processing requests.\n *\n * Any further calls, and any still in the queue, will fail with an error.\n */\n public stop(): void {\n this.stopped = true;\n }\n\n /**\n * Given a list of users, attempt to ensure that we have Olm Sessions active with each of their devices\n *\n * If we don't have an active olm session, we will claim a one-time key and start one.\n *\n * @param userList - list of userIDs to claim\n */\n public ensureSessionsForUsers(userList: Array<UserId>): Promise<void> {\n // The Rust-SDK requires that we only have one getMissingSessions process in flight at once. This little dance\n // ensures that, by only having one call to ensureSessionsForUsersInner active at once (and making them\n // queue up in order).\n const prom = this.currentClaimPromise\n .catch(() => {\n // any errors in the previous claim will have been reported already, so there is nothing to do here.\n // we just throw away the error and start anew.\n })\n .then(() => this.ensureSessionsForUsersInner(userList));\n this.currentClaimPromise = prom;\n return prom;\n }\n\n private async ensureSessionsForUsersInner(userList: Array<UserId>): Promise<void> {\n // bail out quickly if we've been stopped.\n if (this.stopped) {\n throw new Error(`Cannot ensure Olm sessions: shutting down`);\n }\n const claimRequest = await this.olmMachine.getMissingSessions(userList);\n if (claimRequest) {\n await this.outgoingRequestProcessor.makeOutgoingRequest(claimRequest);\n }\n }\n}\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,eAAe,CAAC;EAIlBC,WAAWA,CACGC,UAAsB,EACtBC,wBAAkD,EACrE;IAAA,IAAAC,gBAAA,CAAAC,OAAA,mBALgB,KAAK;IAAA,KAGFH,UAAsB,GAAtBA,UAAsB;IAAA,KACtBC,wBAAkD,GAAlDA,wBAAkD;IAEnE,IAAI,CAACG,mBAAmB,GAAGC,OAAO,CAACC,OAAO,CAAC,CAAC;EAChD;;EAEA;AACJ;AACA;AACA;AACA;EACWC,IAAIA,CAAA,EAAS;IAChB,IAAI,CAACC,OAAO,GAAG,IAAI;EACvB;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;EACWC,sBAAsBA,CAACC,QAAuB,EAAiB;IAClE;IACA;IACA;IACA,MAAMC,IAAI,GAAG,IAAI,CAACP,mBAAmB,CAChCQ,KAAK,CAAC,MAAM;MACT;MACA;IAAA,CACH,CAAC,CACDC,IAAI,CAAC,MAAM,IAAI,CAACC,2BAA2B,CAACJ,QAAQ,CAAC,CAAC;IAC3D,IAAI,CAACN,mBAAmB,GAAGO,IAAI;IAC/B,OAAOA,IAAI;EACf;EAEA,MAAcG,2BAA2BA,CAACJ,QAAuB,EAAiB;IAC9E;IACA,IAAI,IAAI,CAACF,OAAO,EAAE;MACd,MAAM,IAAIO,KAAK,CAAE,2CAA0C,CAAC;IAChE;IACA,MAAMC,YAAY,GAAG,MAAM,IAAI,CAAChB,UAAU,CAACiB,kBAAkB,CAACP,QAAQ,CAAC;IACvE,IAAIM,YAAY,EAAE;MACd,MAAM,IAAI,CAACf,wBAAwB,CAACiB,mBAAmB,CAACF,YAAY,CAAC;IACzE;EACJ;AACJ;AAACG,OAAA,CAAArB,eAAA,GAAAA,eAAA"}
|
|
@@ -9,22 +9,22 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
|
|
|
9
9
|
var _matrixSdkCryptoWasm = require("@matrix-org/matrix-sdk-crypto-wasm");
|
|
10
10
|
var _logger = require("../logger");
|
|
11
11
|
var _httpApi = require("../http-api");
|
|
12
|
-
function ownKeys(
|
|
13
|
-
function _objectSpread(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
12
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
13
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /*
|
|
14
|
+
Copyright 2023 The Matrix.org Foundation C.I.C.
|
|
15
|
+
|
|
16
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
17
|
+
you may not use this file except in compliance with the License.
|
|
18
|
+
You may obtain a copy of the License at
|
|
19
|
+
|
|
20
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
21
|
+
|
|
22
|
+
Unless required by applicable law or agreed to in writing, software
|
|
23
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
24
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
25
|
+
See the License for the specific language governing permissions and
|
|
26
|
+
limitations under the License.
|
|
27
|
+
*/
|
|
28
28
|
/**
|
|
29
29
|
* Common interface for all the request types returned by `OlmMachine.outgoingRequests`.
|
|
30
30
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OutgoingRequestProcessor.js","names":["_matrixSdkCryptoWasm","require","_logger","_httpApi","ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","key","_defineProperty2","default","getOwnPropertyDescriptors","defineProperties","defineProperty","OutgoingRequestProcessor","constructor","olmMachine","http","makeOutgoingRequest","msg","uiaCallback","resp","KeysUploadRequest","rawJsonRequest","Method","Post","body","KeysQueryRequest","KeysClaimRequest","SignatureUploadRequest","KeysBackupRequest","Put","version","ToDeviceRequest","path","encodeURIComponent","event_type","txn_id","RoomMessageRequest","room_id","SigningKeysUploadRequest","makeRequestWithUIA","logger","warn","getPrototypeOf","id","markRequestAsSent","type","e","Error","message","log","method","queryParams","parsedBody","JSON","parse","makeRequest","auth","newBody","stringify","opts","json","headers","prefix","response","authedRequest","info","exports"],"sources":["../../src/rust-crypto/OutgoingRequestProcessor.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport {\n OlmMachine,\n KeysBackupRequest,\n KeysClaimRequest,\n KeysQueryRequest,\n KeysUploadRequest,\n RoomMessageRequest,\n SignatureUploadRequest,\n ToDeviceRequest,\n SigningKeysUploadRequest,\n} from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport { logger } from \"../logger\";\nimport { IHttpOpts, MatrixHttpApi, Method } from \"../http-api\";\nimport { QueryDict } from \"../utils\";\nimport { IAuthDict, UIAuthCallback } from \"../interactive-auth\";\nimport { UIAResponse } from \"../@types/uia\";\n\n/**\n * Common interface for all the request types returned by `OlmMachine.outgoingRequests`.\n *\n * @internal\n */\nexport interface OutgoingRequest {\n readonly id: string | undefined;\n readonly type: number;\n}\n\n/**\n * OutgoingRequestManager: turns `OutgoingRequest`s from the rust sdk into HTTP requests\n *\n * We have one of these per `RustCrypto` (and hence per `MatrixClient`), not that it does anything terribly complicated.\n * It's responsible for:\n *\n * * holding the reference to the `MatrixHttpApi`\n * * turning `OutgoingRequest`s from the rust backend into HTTP requests, and sending them\n * * sending the results of such requests back to the rust backend.\n *\n * @internal\n */\nexport class OutgoingRequestProcessor {\n public constructor(\n private readonly olmMachine: OlmMachine,\n private readonly http: MatrixHttpApi<IHttpOpts & { onlyData: true }>,\n ) {}\n\n public async makeOutgoingRequest<T>(msg: OutgoingRequest, uiaCallback?: UIAuthCallback<T>): Promise<void> {\n let resp: string;\n\n /* refer https://docs.rs/matrix-sdk-crypto/0.6.0/matrix_sdk_crypto/requests/enum.OutgoingRequests.html\n * for the complete list of request types\n */\n if (msg instanceof KeysUploadRequest) {\n resp = await this.rawJsonRequest(Method.Post, \"/_matrix/client/v3/keys/upload\", {}, msg.body);\n } else if (msg instanceof KeysQueryRequest) {\n resp = await this.rawJsonRequest(Method.Post, \"/_matrix/client/v3/keys/query\", {}, msg.body);\n } else if (msg instanceof KeysClaimRequest) {\n resp = await this.rawJsonRequest(Method.Post, \"/_matrix/client/v3/keys/claim\", {}, msg.body);\n } else if (msg instanceof SignatureUploadRequest) {\n resp = await this.rawJsonRequest(Method.Post, \"/_matrix/client/v3/keys/signatures/upload\", {}, msg.body);\n } else if (msg instanceof KeysBackupRequest) {\n resp = await this.rawJsonRequest(\n Method.Put,\n \"/_matrix/client/v3/room_keys/keys\",\n { version: msg.version },\n msg.body,\n );\n } else if (msg instanceof ToDeviceRequest) {\n const path =\n `/_matrix/client/v3/sendToDevice/${encodeURIComponent(msg.event_type)}/` +\n encodeURIComponent(msg.txn_id);\n resp = await this.rawJsonRequest(Method.Put, path, {}, msg.body);\n } else if (msg instanceof RoomMessageRequest) {\n const path =\n `/_matrix/client/v3/rooms/${encodeURIComponent(msg.room_id)}/send/` +\n `${encodeURIComponent(msg.event_type)}/${encodeURIComponent(msg.txn_id)}`;\n resp = await this.rawJsonRequest(Method.Put, path, {}, msg.body);\n } else if (msg instanceof SigningKeysUploadRequest) {\n resp = await this.makeRequestWithUIA(\n Method.Post,\n \"/_matrix/client/v3/keys/device_signing/upload\",\n {},\n msg.body,\n uiaCallback,\n );\n } else {\n logger.warn(\"Unsupported outgoing message\", Object.getPrototypeOf(msg));\n resp = \"\";\n }\n\n if (msg.id) {\n try {\n await this.olmMachine.markRequestAsSent(msg.id, msg.type, resp);\n } catch (e) {\n // Ignore errors which are caused by the olmMachine having been freed. The exact error message depends\n // on whether we are using a release or develop build of rust-sdk-crypto-wasm.\n if (\n e instanceof Error &&\n (e.message === \"Attempt to use a moved value\" || e.message === \"null pointer passed to rust\")\n ) {\n logger.log(`Ignoring error '${e.message}': client is likely shutting down`);\n } else {\n throw e;\n }\n }\n }\n }\n\n private async makeRequestWithUIA<T>(\n method: Method,\n path: string,\n queryParams: QueryDict,\n body: string,\n uiaCallback: UIAuthCallback<T> | undefined,\n ): Promise<string> {\n if (!uiaCallback) {\n return await this.rawJsonRequest(method, path, queryParams, body);\n }\n\n const parsedBody = JSON.parse(body);\n const makeRequest = async (auth: IAuthDict | null): Promise<UIAResponse<T>> => {\n const newBody: Record<string, any> = {\n ...parsedBody,\n };\n if (auth !== null) {\n newBody.auth = auth;\n }\n const resp = await this.rawJsonRequest(method, path, queryParams, JSON.stringify(newBody));\n return JSON.parse(resp) as T;\n };\n\n const resp = await uiaCallback(makeRequest);\n return JSON.stringify(resp);\n }\n\n private async rawJsonRequest(method: Method, path: string, queryParams: QueryDict, body: string): Promise<string> {\n const opts = {\n // inhibit the JSON stringification and parsing within HttpApi.\n json: false,\n\n // nevertheless, we are sending, and accept, JSON.\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\",\n },\n\n // we use the full prefix\n prefix: \"\",\n };\n\n try {\n const response = await this.http.authedRequest<string>(method, path, queryParams, body, opts);\n logger.info(`rust-crypto: successfully made HTTP request: ${method} ${path}`);\n return response;\n } catch (e) {\n logger.warn(`rust-crypto: error making HTTP request: ${method} ${path}: ${e}`);\n throw e;\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OutgoingRequestProcessor.js","names":["_matrixSdkCryptoWasm","require","_logger","_httpApi","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","default","getOwnPropertyDescriptors","defineProperties","defineProperty","OutgoingRequestProcessor","constructor","olmMachine","http","makeOutgoingRequest","msg","uiaCallback","resp","KeysUploadRequest","rawJsonRequest","Method","Post","body","KeysQueryRequest","KeysClaimRequest","SignatureUploadRequest","KeysBackupRequest","Put","version","ToDeviceRequest","path","encodeURIComponent","event_type","txn_id","RoomMessageRequest","room_id","SigningKeysUploadRequest","makeRequestWithUIA","logger","warn","getPrototypeOf","id","markRequestAsSent","type","Error","message","log","method","queryParams","parsedBody","JSON","parse","makeRequest","auth","newBody","stringify","opts","json","headers","prefix","response","authedRequest","info","exports"],"sources":["../../src/rust-crypto/OutgoingRequestProcessor.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport {\n OlmMachine,\n KeysBackupRequest,\n KeysClaimRequest,\n KeysQueryRequest,\n KeysUploadRequest,\n RoomMessageRequest,\n SignatureUploadRequest,\n ToDeviceRequest,\n SigningKeysUploadRequest,\n} from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport { logger } from \"../logger\";\nimport { IHttpOpts, MatrixHttpApi, Method } from \"../http-api\";\nimport { QueryDict } from \"../utils\";\nimport { IAuthDict, UIAuthCallback } from \"../interactive-auth\";\nimport { UIAResponse } from \"../@types/uia\";\n\n/**\n * Common interface for all the request types returned by `OlmMachine.outgoingRequests`.\n *\n * @internal\n */\nexport interface OutgoingRequest {\n readonly id: string | undefined;\n readonly type: number;\n}\n\n/**\n * OutgoingRequestManager: turns `OutgoingRequest`s from the rust sdk into HTTP requests\n *\n * We have one of these per `RustCrypto` (and hence per `MatrixClient`), not that it does anything terribly complicated.\n * It's responsible for:\n *\n * * holding the reference to the `MatrixHttpApi`\n * * turning `OutgoingRequest`s from the rust backend into HTTP requests, and sending them\n * * sending the results of such requests back to the rust backend.\n *\n * @internal\n */\nexport class OutgoingRequestProcessor {\n public constructor(\n private readonly olmMachine: OlmMachine,\n private readonly http: MatrixHttpApi<IHttpOpts & { onlyData: true }>,\n ) {}\n\n public async makeOutgoingRequest<T>(msg: OutgoingRequest, uiaCallback?: UIAuthCallback<T>): Promise<void> {\n let resp: string;\n\n /* refer https://docs.rs/matrix-sdk-crypto/0.6.0/matrix_sdk_crypto/requests/enum.OutgoingRequests.html\n * for the complete list of request types\n */\n if (msg instanceof KeysUploadRequest) {\n resp = await this.rawJsonRequest(Method.Post, \"/_matrix/client/v3/keys/upload\", {}, msg.body);\n } else if (msg instanceof KeysQueryRequest) {\n resp = await this.rawJsonRequest(Method.Post, \"/_matrix/client/v3/keys/query\", {}, msg.body);\n } else if (msg instanceof KeysClaimRequest) {\n resp = await this.rawJsonRequest(Method.Post, \"/_matrix/client/v3/keys/claim\", {}, msg.body);\n } else if (msg instanceof SignatureUploadRequest) {\n resp = await this.rawJsonRequest(Method.Post, \"/_matrix/client/v3/keys/signatures/upload\", {}, msg.body);\n } else if (msg instanceof KeysBackupRequest) {\n resp = await this.rawJsonRequest(\n Method.Put,\n \"/_matrix/client/v3/room_keys/keys\",\n { version: msg.version },\n msg.body,\n );\n } else if (msg instanceof ToDeviceRequest) {\n const path =\n `/_matrix/client/v3/sendToDevice/${encodeURIComponent(msg.event_type)}/` +\n encodeURIComponent(msg.txn_id);\n resp = await this.rawJsonRequest(Method.Put, path, {}, msg.body);\n } else if (msg instanceof RoomMessageRequest) {\n const path =\n `/_matrix/client/v3/rooms/${encodeURIComponent(msg.room_id)}/send/` +\n `${encodeURIComponent(msg.event_type)}/${encodeURIComponent(msg.txn_id)}`;\n resp = await this.rawJsonRequest(Method.Put, path, {}, msg.body);\n } else if (msg instanceof SigningKeysUploadRequest) {\n resp = await this.makeRequestWithUIA(\n Method.Post,\n \"/_matrix/client/v3/keys/device_signing/upload\",\n {},\n msg.body,\n uiaCallback,\n );\n } else {\n logger.warn(\"Unsupported outgoing message\", Object.getPrototypeOf(msg));\n resp = \"\";\n }\n\n if (msg.id) {\n try {\n await this.olmMachine.markRequestAsSent(msg.id, msg.type, resp);\n } catch (e) {\n // Ignore errors which are caused by the olmMachine having been freed. The exact error message depends\n // on whether we are using a release or develop build of rust-sdk-crypto-wasm.\n if (\n e instanceof Error &&\n (e.message === \"Attempt to use a moved value\" || e.message === \"null pointer passed to rust\")\n ) {\n logger.log(`Ignoring error '${e.message}': client is likely shutting down`);\n } else {\n throw e;\n }\n }\n }\n }\n\n private async makeRequestWithUIA<T>(\n method: Method,\n path: string,\n queryParams: QueryDict,\n body: string,\n uiaCallback: UIAuthCallback<T> | undefined,\n ): Promise<string> {\n if (!uiaCallback) {\n return await this.rawJsonRequest(method, path, queryParams, body);\n }\n\n const parsedBody = JSON.parse(body);\n const makeRequest = async (auth: IAuthDict | null): Promise<UIAResponse<T>> => {\n const newBody: Record<string, any> = {\n ...parsedBody,\n };\n if (auth !== null) {\n newBody.auth = auth;\n }\n const resp = await this.rawJsonRequest(method, path, queryParams, JSON.stringify(newBody));\n return JSON.parse(resp) as T;\n };\n\n const resp = await uiaCallback(makeRequest);\n return JSON.stringify(resp);\n }\n\n private async rawJsonRequest(method: Method, path: string, queryParams: QueryDict, body: string): Promise<string> {\n const opts = {\n // inhibit the JSON stringification and parsing within HttpApi.\n json: false,\n\n // nevertheless, we are sending, and accept, JSON.\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\",\n },\n\n // we use the full prefix\n prefix: \"\",\n };\n\n try {\n const response = await this.http.authedRequest<string>(method, path, queryParams, body, opts);\n logger.info(`rust-crypto: successfully made HTTP request: ${method} ${path}`);\n return response;\n } catch (e) {\n logger.warn(`rust-crypto: error making HTTP request: ${method} ${path}: ${e}`);\n throw e;\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
3
|
Object.defineProperty(exports, "__esModule", {
|
|
5
4
|
value: true
|
|
6
5
|
});
|
|
7
6
|
exports.RoomEncryptor = void 0;
|
|
8
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
7
|
var _matrixSdkCryptoWasm = require("@matrix-org/matrix-sdk-crypto-wasm");
|
|
10
8
|
var _event = require("../@types/event");
|
|
11
9
|
var _logger = require("../logger");
|
|
@@ -43,7 +41,6 @@ class RoomEncryptor {
|
|
|
43
41
|
this.outgoingRequestProcessor = outgoingRequestProcessor;
|
|
44
42
|
this.room = room;
|
|
45
43
|
this.encryptionSettings = encryptionSettings;
|
|
46
|
-
(0, _defineProperty2.default)(this, "prefixedLogger", void 0);
|
|
47
44
|
this.prefixedLogger = _logger.logger.withPrefix(`[${room.roomId} encryption]`);
|
|
48
45
|
}
|
|
49
46
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoomEncryptor.js","names":["_matrixSdkCryptoWasm","require","_event","_logger","RoomEncryptor","constructor","olmMachine","keyClaimManager","outgoingRequestProcessor","room","encryptionSettings","_defineProperty2","default","prefixedLogger","logger","withPrefix","roomId","onCryptoEvent","config","JSON","stringify","error","onRoomMembership","member","debug","membership","userId","shouldEncryptForInvitedMembers","updateTrackedUsers","UserId","ensureEncryptionSession","algorithm","Error","members","getEncryptionTargetMembers","map","u","userList","ensureSessionsForUsers","rustEncryptionSettings","EncryptionSettings","shareMessages","shareRoomKey","RoomId","m","makeOutgoingRequest","forceDiscardSession","r","invalidateGroupSession","info","encryptEvent","event","encryptedContent","encryptRoomEvent","getType","getContent","makeEncrypted","EventType","RoomMessageEncrypted","parse","identityKeys","curve25519","toBase64","ed25519","exports"],"sources":["../../src/rust-crypto/RoomEncryptor.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { EncryptionSettings, OlmMachine, RoomId, UserId } from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport { EventType } from \"../@types/event\";\nimport { IContent, MatrixEvent } from \"../models/event\";\nimport { Room } from \"../models/room\";\nimport { logger, PrefixedLogger } from \"../logger\";\nimport { KeyClaimManager } from \"./KeyClaimManager\";\nimport { RoomMember } from \"../models/room-member\";\nimport { OutgoingRequestProcessor } from \"./OutgoingRequestProcessor\";\n\n/**\n * RoomEncryptor: responsible for encrypting messages to a given room\n *\n * @internal\n */\nexport class RoomEncryptor {\n private readonly prefixedLogger: PrefixedLogger;\n\n /**\n * @param olmMachine - The rust-sdk's OlmMachine\n * @param keyClaimManager - Our KeyClaimManager, which manages the queue of one-time-key claim requests\n * @param room - The room we want to encrypt for\n * @param encryptionSettings - body of the m.room.encryption event currently in force in this room\n */\n public constructor(\n private readonly olmMachine: OlmMachine,\n private readonly keyClaimManager: KeyClaimManager,\n private readonly outgoingRequestProcessor: OutgoingRequestProcessor,\n private readonly room: Room,\n private encryptionSettings: IContent,\n ) {\n this.prefixedLogger = logger.withPrefix(`[${room.roomId} encryption]`);\n }\n\n /**\n * Handle a new `m.room.encryption` event in this room\n *\n * @param config - The content of the encryption event\n */\n public onCryptoEvent(config: IContent): void {\n if (JSON.stringify(this.encryptionSettings) != JSON.stringify(config)) {\n this.prefixedLogger.error(`Ignoring m.room.encryption event which requests a change of config`);\n }\n }\n\n /**\n * Handle a new `m.room.member` event in this room\n *\n * @param member - new membership state\n */\n public onRoomMembership(member: RoomMember): void {\n this.prefixedLogger.debug(`${member.membership} event for ${member.userId}`);\n\n if (\n member.membership == \"join\" ||\n (member.membership == \"invite\" && this.room.shouldEncryptForInvitedMembers())\n ) {\n // make sure we are tracking the deviceList for this user\n this.prefixedLogger.debug(`starting to track devices for: ${member.userId}`);\n this.olmMachine.updateTrackedUsers([new UserId(member.userId)]);\n }\n\n // TODO: handle leaves (including our own)\n }\n\n /**\n * Prepare to encrypt events in this room.\n *\n * This ensures that we have a megolm session ready to use and that we have shared its key with all the devices\n * in the room.\n */\n public async ensureEncryptionSession(): Promise<void> {\n if (this.encryptionSettings.algorithm !== \"m.megolm.v1.aes-sha2\") {\n throw new Error(\n `Cannot encrypt in ${this.room.roomId} for unsupported algorithm '${this.encryptionSettings.algorithm}'`,\n );\n }\n\n const members = await this.room.getEncryptionTargetMembers();\n this.prefixedLogger.debug(\n `Encrypting for users (shouldEncryptForInvitedMembers: ${this.room.shouldEncryptForInvitedMembers()}):`,\n members.map((u) => `${u.userId} (${u.membership})`),\n );\n\n const userList = members.map((u) => new UserId(u.userId));\n await this.keyClaimManager.ensureSessionsForUsers(userList);\n\n this.prefixedLogger.debug(\"Sessions for users are ready; now sharing room key\");\n\n const rustEncryptionSettings = new EncryptionSettings();\n /* FIXME historyVisibility, rotation, etc */\n\n const shareMessages = await this.olmMachine.shareRoomKey(\n new RoomId(this.room.roomId),\n userList,\n rustEncryptionSettings,\n );\n if (shareMessages) {\n for (const m of shareMessages) {\n await this.outgoingRequestProcessor.makeOutgoingRequest(m);\n }\n }\n }\n\n /**\n * Discard any existing group session for this room\n */\n public async forceDiscardSession(): Promise<void> {\n const r = await this.olmMachine.invalidateGroupSession(new RoomId(this.room.roomId));\n if (r) {\n this.prefixedLogger.info(\"Discarded existing group session\");\n }\n }\n\n /**\n * Encrypt an event for this room\n *\n * This will ensure that we have a megolm session for this room, share it with the devices in the room, and\n * then encrypt the event using the session.\n *\n * @param event - Event to be encrypted.\n */\n public async encryptEvent(event: MatrixEvent): Promise<void> {\n await this.ensureEncryptionSession();\n\n const encryptedContent = await this.olmMachine.encryptRoomEvent(\n new RoomId(this.room.roomId),\n event.getType(),\n JSON.stringify(event.getContent()),\n );\n\n event.makeEncrypted(\n EventType.RoomMessageEncrypted,\n JSON.parse(encryptedContent),\n this.olmMachine.identityKeys.curve25519.toBase64(),\n this.olmMachine.identityKeys.ed25519.toBase64(),\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RoomEncryptor.js","names":["_matrixSdkCryptoWasm","require","_event","_logger","RoomEncryptor","constructor","olmMachine","keyClaimManager","outgoingRequestProcessor","room","encryptionSettings","prefixedLogger","logger","withPrefix","roomId","onCryptoEvent","config","JSON","stringify","error","onRoomMembership","member","debug","membership","userId","shouldEncryptForInvitedMembers","updateTrackedUsers","UserId","ensureEncryptionSession","algorithm","Error","members","getEncryptionTargetMembers","map","u","userList","ensureSessionsForUsers","rustEncryptionSettings","EncryptionSettings","shareMessages","shareRoomKey","RoomId","m","makeOutgoingRequest","forceDiscardSession","r","invalidateGroupSession","info","encryptEvent","event","encryptedContent","encryptRoomEvent","getType","getContent","makeEncrypted","EventType","RoomMessageEncrypted","parse","identityKeys","curve25519","toBase64","ed25519","exports"],"sources":["../../src/rust-crypto/RoomEncryptor.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { EncryptionSettings, OlmMachine, RoomId, UserId } from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport { EventType } from \"../@types/event\";\nimport { IContent, MatrixEvent } from \"../models/event\";\nimport { Room } from \"../models/room\";\nimport { logger, PrefixedLogger } from \"../logger\";\nimport { KeyClaimManager } from \"./KeyClaimManager\";\nimport { RoomMember } from \"../models/room-member\";\nimport { OutgoingRequestProcessor } from \"./OutgoingRequestProcessor\";\n\n/**\n * RoomEncryptor: responsible for encrypting messages to a given room\n *\n * @internal\n */\nexport class RoomEncryptor {\n private readonly prefixedLogger: PrefixedLogger;\n\n /**\n * @param olmMachine - The rust-sdk's OlmMachine\n * @param keyClaimManager - Our KeyClaimManager, which manages the queue of one-time-key claim requests\n * @param room - The room we want to encrypt for\n * @param encryptionSettings - body of the m.room.encryption event currently in force in this room\n */\n public constructor(\n private readonly olmMachine: OlmMachine,\n private readonly keyClaimManager: KeyClaimManager,\n private readonly outgoingRequestProcessor: OutgoingRequestProcessor,\n private readonly room: Room,\n private encryptionSettings: IContent,\n ) {\n this.prefixedLogger = logger.withPrefix(`[${room.roomId} encryption]`);\n }\n\n /**\n * Handle a new `m.room.encryption` event in this room\n *\n * @param config - The content of the encryption event\n */\n public onCryptoEvent(config: IContent): void {\n if (JSON.stringify(this.encryptionSettings) != JSON.stringify(config)) {\n this.prefixedLogger.error(`Ignoring m.room.encryption event which requests a change of config`);\n }\n }\n\n /**\n * Handle a new `m.room.member` event in this room\n *\n * @param member - new membership state\n */\n public onRoomMembership(member: RoomMember): void {\n this.prefixedLogger.debug(`${member.membership} event for ${member.userId}`);\n\n if (\n member.membership == \"join\" ||\n (member.membership == \"invite\" && this.room.shouldEncryptForInvitedMembers())\n ) {\n // make sure we are tracking the deviceList for this user\n this.prefixedLogger.debug(`starting to track devices for: ${member.userId}`);\n this.olmMachine.updateTrackedUsers([new UserId(member.userId)]);\n }\n\n // TODO: handle leaves (including our own)\n }\n\n /**\n * Prepare to encrypt events in this room.\n *\n * This ensures that we have a megolm session ready to use and that we have shared its key with all the devices\n * in the room.\n */\n public async ensureEncryptionSession(): Promise<void> {\n if (this.encryptionSettings.algorithm !== \"m.megolm.v1.aes-sha2\") {\n throw new Error(\n `Cannot encrypt in ${this.room.roomId} for unsupported algorithm '${this.encryptionSettings.algorithm}'`,\n );\n }\n\n const members = await this.room.getEncryptionTargetMembers();\n this.prefixedLogger.debug(\n `Encrypting for users (shouldEncryptForInvitedMembers: ${this.room.shouldEncryptForInvitedMembers()}):`,\n members.map((u) => `${u.userId} (${u.membership})`),\n );\n\n const userList = members.map((u) => new UserId(u.userId));\n await this.keyClaimManager.ensureSessionsForUsers(userList);\n\n this.prefixedLogger.debug(\"Sessions for users are ready; now sharing room key\");\n\n const rustEncryptionSettings = new EncryptionSettings();\n /* FIXME historyVisibility, rotation, etc */\n\n const shareMessages = await this.olmMachine.shareRoomKey(\n new RoomId(this.room.roomId),\n userList,\n rustEncryptionSettings,\n );\n if (shareMessages) {\n for (const m of shareMessages) {\n await this.outgoingRequestProcessor.makeOutgoingRequest(m);\n }\n }\n }\n\n /**\n * Discard any existing group session for this room\n */\n public async forceDiscardSession(): Promise<void> {\n const r = await this.olmMachine.invalidateGroupSession(new RoomId(this.room.roomId));\n if (r) {\n this.prefixedLogger.info(\"Discarded existing group session\");\n }\n }\n\n /**\n * Encrypt an event for this room\n *\n * This will ensure that we have a megolm session for this room, share it with the devices in the room, and\n * then encrypt the event using the session.\n *\n * @param event - Event to be encrypted.\n */\n public async encryptEvent(event: MatrixEvent): Promise<void> {\n await this.ensureEncryptionSession();\n\n const encryptedContent = await this.olmMachine.encryptRoomEvent(\n new RoomId(this.room.roomId),\n event.getType(),\n JSON.stringify(event.getContent()),\n );\n\n event.makeEncrypted(\n EventType.RoomMessageEncrypted,\n JSON.parse(encryptedContent),\n this.olmMachine.identityKeys.curve25519.toBase64(),\n this.olmMachine.identityKeys.ed25519.toBase64(),\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { OlmMachine } from "@matrix-org/matrix-sdk-crypto-wasm";
|
|
2
2
|
import * as RustSdkCryptoJs from "@matrix-org/matrix-sdk-crypto-wasm";
|
|
3
|
-
import { BackupTrustInfo, KeyBackupCheck, KeyBackupInfo } from "../crypto-api/keybackup";
|
|
3
|
+
import { BackupTrustInfo, KeyBackupCheck, KeyBackupInfo, KeyBackupSession, Curve25519SessionData } from "../crypto-api/keybackup";
|
|
4
4
|
import { IHttpOpts, MatrixHttpApi } from "../http-api";
|
|
5
|
-
import { CryptoEvent } from "../crypto";
|
|
5
|
+
import { CryptoEvent, IMegolmSessionData } from "../crypto";
|
|
6
6
|
import { TypedEventEmitter } from "../models/typed-event-emitter";
|
|
7
7
|
import { OutgoingRequestProcessor } from "./OutgoingRequestProcessor";
|
|
8
|
+
import { BackupDecryptor } from "../common-crypto/CryptoBackend";
|
|
9
|
+
import { IEncryptedPayload } from "../crypto/aes";
|
|
8
10
|
/** Authentification of the backup info, depends on algorithm */
|
|
9
11
|
type AuthData = KeyBackupInfo["auth_data"];
|
|
10
12
|
/**
|
|
@@ -97,6 +99,22 @@ export declare class RustBackupManager extends TypedEventEmitter<RustBackupCrypt
|
|
|
97
99
|
*/
|
|
98
100
|
deleteKeyBackupVersion(version: string): Promise<void>;
|
|
99
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Implementation of {@link BackupDecryptor} for the rust crypto backend.
|
|
104
|
+
*/
|
|
105
|
+
export declare class RustBackupDecryptor implements BackupDecryptor {
|
|
106
|
+
private decryptionKey;
|
|
107
|
+
sourceTrusted: boolean;
|
|
108
|
+
constructor(decryptionKey: RustSdkCryptoJs.BackupDecryptionKey);
|
|
109
|
+
/**
|
|
110
|
+
* Implements {@link BackupDecryptor#decryptSessions}
|
|
111
|
+
*/
|
|
112
|
+
decryptSessions(ciphertexts: Record<string, KeyBackupSession<Curve25519SessionData | IEncryptedPayload>>): Promise<IMegolmSessionData[]>;
|
|
113
|
+
/**
|
|
114
|
+
* Implements {@link BackupDecryptor#free}
|
|
115
|
+
*/
|
|
116
|
+
free(): void;
|
|
117
|
+
}
|
|
100
118
|
export type RustBackupCryptoEvents = CryptoEvent.KeyBackupStatus | CryptoEvent.KeyBackupSessionsRemaining | CryptoEvent.KeyBackupFailed;
|
|
101
119
|
export type RustBackupCryptoEventMap = {
|
|
102
120
|
[CryptoEvent.KeyBackupStatus]: (enabled: boolean) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/rust-crypto/backup.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,UAAU,EAAyB,MAAM,oCAAoC,CAAC;AACvF,OAAO,KAAK,eAAe,MAAM,oCAAoC,CAAC;AAEtE,OAAO,
|
|
1
|
+
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/rust-crypto/backup.ts"],"names":[],"mappings":"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"}
|