* Age fallback using origin_server_ts instead of 0
Signed-off-by: Timo K <toger5@hotmail.de>
* use getMsUntilExpiry for isExpired
Signed-off-by: Timo K <toger5@hotmail.de>
* fix tests
tests now also rely on localTimestamp. So this need to be mocked as well
Signed-off-by: Timo K <toger5@hotmail.de>
* better fallback for unavailable unsigned
Signed-off-by: Timo K <toger5@hotmail.de>
---------
Signed-off-by: Timo K <toger5@hotmail.de>
* Ignore receipts pointing at missing or invalid events
* Remove extra whitespace from log message
* Unit tests for ignoring invalid receipts
* Improve comments around getEventReadUpTo
* Re-instate second param to compareEventOrdering in test
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* Further improve comments around getEventReadUpTo
---------
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* fix members loaded on intitial sync
* Update test to use KeyResponder
* Use E2EKeyResponder
* code review
* better comment
* fix test
* post merge fix
* fix imports
* refactoring, better names
* code review
* clean tests
* Cleanups per review comments
* fix test
* Apply suggestions from code review
---------
Co-authored-by: Richard van der Hoff <richard@matrix.org>
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* Age fallback using origin_server_ts instead of 0
Signed-off-by: Timo K <toger5@hotmail.de>
* use getMsUntilExpiry for isExpired
Signed-off-by: Timo K <toger5@hotmail.de>
* fix tests
tests now also rely on localTimestamp. So this need to be mocked as well
Signed-off-by: Timo K <toger5@hotmail.de>
* fix another test that now also depends on localTimestamp
Signed-off-by: Timo K <toger5@hotmail.de>
* fix tests and cleanup
Signed-off-by: Timo K <toger5@hotmail.de>
* format
Signed-off-by: Timo K <toger5@hotmail.de>
* make things simpler by calculating localTimestamp
from getLocalAge
Signed-off-by: Timo K <toger5@hotmail.de>
* this test was not covered by the change to mockRTCEvent
Signed-off-by: Timo K <toger5@hotmail.de>
* format
Signed-off-by: Timo K <toger5@hotmail.de>
---------
Signed-off-by: Timo K <toger5@hotmail.de>
* WIP refactor for removing m.call events
* Always remember rtcsessions since we need to only have one instance
* Fix tests
* Fix import loop
* Fix more cyclic imports & tests
* Test session joining
* Attempt to make tests happy
* Always leave calls in the tests to clean up
* comment + desperate attempt to work out what's failing
* More test debugging
* Okay, so these ones are fine?
* Stop more timers and hopefully have happy tests
* Test no rejoin
* Test malformed m.call.member events
* Test event emitting
and also move some code to a more sensible place in the file
* Test getActiveFoci()
* Test event emitting (and also fix it)
* Test membership updating & pruning on join
* Test getOldestMembership()
* Test member event renewal
* Don't start the rtc manager until the client has synced
Then we can initialise from the state once it's completed.
* Fix type
* Remove listeners added in constructor
* Stop the client here too
* Stop the client here also also
* ARGH. Disable tests to work out which one is causing the exception
* Disable everything
* Re-jig to avoid setting listeners in the constructor
and re-enable tests
* No need to rename this anymore
* argh, remove the right listener
* Is it this test???
* Re-enable some tests
* Try mocking getRooms to return something valid
* Re-enable other tests
* Give up trying to get the tests to work sensibly and deal with getRooms() returning nothing
* Oops, don't enable the ones that were skipped before
* One more try at the sensible way
* Didn't work, go back to the hack way.
* Log when we manage to send the member event update
* Support `getOpenIdToken()` in embedded mode (#3676)
* Call `sendContentLoaded()` (#3677)
* Start MatrixRTC in embedded mode (#3679)
* Reschedule the membership event check
* Bump widget api version
* Add mock for sendContentLoaded()
* Embeded mode pre-requisites
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Embeded mode E2EE
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Encryption condition
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Revert "Embeded mode pre-requisites"
This reverts commit 8cd73702052609c995ad754e31f85d0da0be4aa9.
* Get back event type
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
fds
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Change embedded E2EE implementation
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* More log detail
* Fix tests
and also better assert because the tests were passing undefined which
was considered fine because we were only checking for null.
* Simplify updateCallMembershipEvent a bit
* Split up updateCallMembershipEvent some more
* Use `crypto.getRandomValues()`
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Rename to `membershipToUserAndDeviceId()`
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Better error
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Add log line
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Add comment
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Send call ID in enc events
(also a small refactor)
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Revert making `joinRoomSession()` async
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Make `client` `private` again
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Just use `toString()`
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Fix `callId` check
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Fix map
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Fix map compare
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Fix emitting
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Explicit logging
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Refactor
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Make `updateEncryptionKeyEvent()` public
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Only update keys based on others
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Fix call order
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Improve logging
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Avoid races
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Revert "Avoid races"
This reverts commit f65ed72d6e.
* Add try-catch
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Make `updateEncryptionKeyEvent()` private
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Handle indices and throttling
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Fix merge mistakes
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Mort post-merge fixes
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Split out key generation from key sending
And send all keys in a key event (changes the format of the key event)
rather than just the one we just generated.
* Remember and clear the timeout for the send key event
So we don't schedule more key updates if one is already pending.
Also don't update the last sent time when we didn't actually send the
keys.
* Make key event resends more robust
* Attempt to make tests pass
* crypto wasn't defined at all
* Hopefully get interface right
* Fix key format on the wire to base64
* Add comment
* More standard method order
* Rename encryptMedia
The js-sdk doesn't do media and therefore doesn't do media encryption
* Stop logging encryption keys now
* Use regular base64
It's not going in a URL, so no need
* Re-add base64url
randomstring was using it. Also give it a test.
* Add tests for randomstring
* Switch between either browser or node crypto
Let's see if this will work...
* Obviously crypto has already solved this
* Some tests for MatrixRTCSession key stuff
* Test keys object contents
* Change keys event format
To move away from m. keys
* Test key event retries
* Test onCallEncryption
* Test event sending & spam prevention
* Test event cancelation
* Test onCallEncryption called
* Some errors didn't have data
* Fix binary key comparison
& add log line
* Fix compare function with undefined values
* Remove more key logging
* Check content.keys is an array
* Check key index & key
* Better function name
* Tests too
---------
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
Co-authored-by: David Baker <dave@matrix.org>
Co-authored-by: David Baker <dbkr@users.noreply.github.com>
* Fix issue
* Fix jest test
* Fix even more jest failures
* Fix formatting
* Add a test
* Write test for older code
* Fix lint
* Rename method
* Make ctor deprecated
* Add current version of the rust-sdk and vodozemac
* Return OlmVersion in `CryptoApi#getVersion` for old crypto
* Add `Olm` prefix
* Fix documentation
* Review changes
* Wire up history visibility in `RoomEncryptor.ts`
* Add more tests to history visibility conversion
* Factorize `expectSendMessage` and `expectSendMegolmMessage`
* Use correct import
* Fix overwriteRoutes
* Update comments
We had two identical sets of base64 functions in the js-sdk, both
using Buffer which isn't really available in the browser unless you're
using an old webpack (ie. what element-web uses). This PR:
* Takes the crypto base64 file and moves it out of crypto (because
we use base64 for much more than just crypto)
* Makes them work in a browser without the Buffer global
* Removes the other base64 functions
* Changes everything to use the new common ones
* Adds a comment explaining why the function is kinda ugly and how
soul destroyingly awful the JS ecosystem is.
* Runs the tests with both impls
* Changes the test to not just test the decoder against the encoder
* Adds explicit support & tests for (decoding) base64Url (I'll add an
encode method later, no need for that to go in this PR too).
* Don't remove thread info from a thread root when it is redacted
* Move the redaction event to main at the same time we move redacted
Since the redacted event is moving to the main timeline, the redaction
belongs there too, since its relationship to the redacted event is the
only thing making it part of the thread.
* Handle backup secret gossip
* use getSecretsFromInbox
* add gossip test
* use delete secret API
* fix logger
* better comment and cleaning
* free the pkSigning
* fix typo
* add missing mocks
* improve coverage
* better var name
* quick refactoring
* add more tests
* Review, format and comments
* refactor move more logic to backup.ts
* poll secret inbox
* missing mock
* Update src/rust-crypto/rust-crypto.ts
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* Update src/rust-crypto/rust-crypto.ts
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* Update src/rust-crypto/rust-crypto.ts
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* Update src/rust-crypto/backup.ts
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* Update src/rust-crypto/rust-crypto.ts
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* code review
* fix comment
* remove comment
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* quick factorise
---------
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* Move redaction event tests into their own describe block
* Factor out utils in redaction tests
* Factor out the code for moving an event to the main timeline
* Move all related messages into main timeline on redaction
* Extract threadIdForReceipt function from sendReceipt
* Tests for threadIdForReceipt
* Correct test of threadIdForReceipt to expect main for redaction of threaded
* Expand and comment implementation of threadIdForReceipt
* very messy poc
* iterate
* more types and use tokenRefreshFunction
* working refresh without persistence
* tidy
* add claims to completeauhtorizationcodegrant response
* export tokenrefresher from matrix
* add idtokenclaims
* add claims to completeauhtorizationcodegrant response
* only one token refresh attempt at a time
* tests
* comments
* add tokenRefresher class
* export generateScope
* export oidc from matrix
* test refreshtoken
* mark experimental
* add getRefreshToken to client
* Apply suggestions from code review
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* remove some vars in test
* make TokenRefresher un-abstract, comments and improvements
* remove invalid jsdoc
* Update src/oidc/tokenRefresher.ts
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* Code review improvements
* fix verification integ tests
* remove unused type from props
* fix incomplete mock fn in fetch.spec
* document TokenRefreshFunction
* comments
* tidying
* update for injected logger
---------
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* Don't use event.sender in CallMembership
I fell into another js-sdk trap: this is "only guaranteed to be set
for events that appear in a timeline" and not state events. It does
not say why. We only ever used it to get the sender user ID anyway,
so just use getSender().
* Fix test
* Support MatrixClient-specific loggers.
Signed-off-by: Patrick Cloke <clokep@patrick.cloke.us>
* Use client-specific logger in client.ts.
Signed-off-by: Patrick Cloke <clokep@patrick.cloke.us>
* Log `fetch` requests to the per-client logger
* Use client-specific logger in rust-crypto
* add tokenRefresher class
* export generateScope
* export oidc from matrix
* mark experimental
* Apply suggestions from code review
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* remove some vars in test
* make TokenRefresher un-abstract, comments and improvements
* remove invalid jsdoc
* Update src/oidc/tokenRefresher.ts
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* Code review improvements
* document TokenRefreshFunction
---------
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* rename loglevel import to loglevel
* Define new `Logger` interface to replace `PrefixedLogger`
* PrefixedLogger -> Logger in crypto store
* PrefixedLogger -> Logger in `src/crypto`
* PrefixedLogger -> Logger in rust-crypto
* `RustBackupManager.getActiveBackupVersion`: check that backup is enabled
The previous check on `isBackupEnabled` was a no-op
* Fix log spam on shieldless events
* Reduce log spam about tracking users
* Reduce log spam about decrypting events
Logging the entire event is excessive
* Add membershipID to call memberships
This allows us to recognise easily when a membership is from some
previous sessions rather than our own and therefore ignore it
(see comment for more).
This was causing us to see existing, expired membership events and
bump the expiry on them rather than send a new membership. This might
have been okay if we bumped them enough to actually make them un-expired,
but it's a fresh session so semanticly we want to post a fresh membership
rather than resurrecting a previous, expired membership.
* Fix test types
* Fix tests
* Make test coverage happy
---------
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Element-R: use the pickleKey to encrypt the crypto store
`pickleKey` is a passphrase set by the application for this express purpose.
* update tests
* fix tests, again
* Emit a `UserTrustStatusChanged` when user identity is updated
* Remove redundant `onCrossSigningKeysImport` callback
This now happens as a side-effect of importing the keys.
* bump to alpha release of matrix-rust-sdk-crypto-wasm
* fixup! Remove redundant `onCrossSigningKeysImport` callback
* Fix potential delay in sending out requests from the rust SDK
There was a potential race which could cause us to be very slow to send out
pending HTTP requests, particularly when handling a user verification. Add some
resiliece to make sure we handle it correctly.
* add comments
* Add a unit test
---------
Co-authored-by: Andy Balaam <andy.balaam@matrix.org>
* Refactor key backup recovery to prepare for rust
* rust backup restore support
* Move export out of old crypto to api with re-export
* extract base64 utility
* add tests for base64 util
* more efficient regex
* fix typo
* Add hacky option to disable the actual calling part of group calls.
So we can try using livekit instead.
* Put LiveKit info into the `m.call` state event (#3522)
* Put LK info into state
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Update to the new way the LK service works
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
---------
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
* Send 'contentLoaded' event
As per comment, so we can start digging ourselves out of the widget
API hole we're currently in.
* Add comment on updating the livekit service URL
* Appease CI on `livekit` branch (#3566)
* Update codeowners on `livekit` branch (#3567)
* add getOpenIdToken to embedded client backend
Signed-off-by: Timo K <toger5@hotmail.de>
* add test and update comment
Signed-off-by: Timo K <toger5@hotmail.de>
* Merge `develop` into `livekit` (#3569)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: RiotRobot <releases@riot.im>
Co-authored-by: Florian Duros <florianduros@element.io>
Co-authored-by: Kerry <kerrya@element.io>
Co-authored-by: David Baker <dbkr@users.noreply.github.com>
Co-authored-by: Erik Johnston <erik@matrix.org>
Co-authored-by: Valere <bill.carson@valrsoft.com>
Co-authored-by: Hubert Chathi <hubertc@matrix.org>
Close IDB database before deleting it to prevent spurious unexpected close errors (#3478)
Fix export type `GeneratedSecretStorageKey` (#3479)
Fix order of things in `crypto-api.ts` (#3491)
Fix bug where switching media caused media in subsequent calls to fail (#3489)
fixes (#3515)
fix the integ tests, where #3509 etc fix the unit tests.
fix breakage on node 16 (#3527)
Fix an instance of failed to decrypt error when an in flight `/keys/query` fails. (#3486)
Fix `TypedEventEmitter::removeAllListeners(void)` not working (#3561)
* Revert "Merge `develop` into `livekit`" (#3572)
* Don't update calls with no livekit URL & expose method to update it instead
and generally simplify a bit: change it to a single string rather than
an array of structs.
* Fix other instances of passing focusInfo / livekit url
* Add temporary setter
* WIP refactor for removing m.call events
* Always remember rtcsessions since we need to only have one instance
* Fix tests
* Fix import loop
* Fix more cyclic imports & tests
* Test session joining
* Attempt to make tests happy
* Always leave calls in the tests to clean up
* comment + desperate attempt to work out what's failing
* More test debugging
* Okay, so these ones are fine?
* Stop more timers and hopefully have happy tests
* Test no rejoin
* Test malformed m.call.member events
* Test event emitting
and also move some code to a more sensible place in the file
* Test getActiveFoci()
* Test event emitting (and also fix it)
* Test membership updating & pruning on join
* Test getOldestMembership()
* Test member event renewal
* Don't start the rtc manager until the client has synced
Then we can initialise from the state once it's completed.
* Fix type
* Remove listeners added in constructor
* Stop the client here too
* Stop the client here also also
* ARGH. Disable tests to work out which one is causing the exception
* Disable everything
* Re-jig to avoid setting listeners in the constructor
and re-enable tests
* No need to rename this anymore
* argh, remove the right listener
* Is it this test???
* Re-enable some tests
* Try mocking getRooms to return something valid
* Re-enable other tests
* Give up trying to get the tests to work sensibly and deal with getRooms() returning nothing
* Oops, don't enable the ones that were skipped before
* One more try at the sensible way
* Didn't work, go back to the hack way.
* Log when we manage to send the member event update
* Support `getOpenIdToken()` in embedded mode (#3676)
* Call `sendContentLoaded()` (#3677)
* Start MatrixRTC in embedded mode (#3679)
* Reschedule the membership event check
* Bump widget api version
* Add mock for sendContentLoaded()
* More log detail
* Fix tests
and also better assert because the tests were passing undefined which
was considered fine because we were only checking for null.
* Simplify updateCallMembershipEvent a bit
* Split up updateCallMembershipEvent some more
* Typo
Co-authored-by: Daniel Abramov <inetcrack2@gmail.com>
* Expand comment
* Add comment
* More comments
* Better comment
* Sesson
* Rename some variables
* Comment
* Remove unused method
* Wrap updatecallMembershipEvent so it only runs one at a time
* Do another update if another one is triggered while the update happens
* Make triggerCallMembershipEventUpdate async
* Fix test & some missed timer removals
* Mark session manager as unstable
---------
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
Signed-off-by: Timo K <toger5@hotmail.de>
Co-authored-by: Šimon Brandner <simon.bra.ag@gmail.com>
Co-authored-by: Timo K <toger5@hotmail.de>
Co-authored-by: Timo <16718859+toger5@users.noreply.github.com>
Co-authored-by: Daniel Abramov <inetcrack2@gmail.com>
Reading the test "should fire stateUpdated callback with error when a
request fails" it looks like this would always cause an infinite loop
between doRequest and statusUpdated calls. I don't know why this wasn't
a problem until we updated Jest to v29.5.4, but after that point it was.
This change should fix the test failures for the Jest upgrade PR:
https://github.com/matrix-org/matrix-js-sdk/pull/3670 .
* Emit a `UserTrustStatusChanged` when user identity is updated
* Remove redundant `onCrossSigningKeysImport` callback
This now happens as a side-effect of importing the keys.
* bump to alpha release of matrix-rust-sdk-crypto-wasm
* fixup! Remove redundant `onCrossSigningKeysImport` callback