From 1aeee16d9ede4697533680f1fa45545f4353fcb5 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Fri, 2 Feb 2024 15:02:10 +0000 Subject: [PATCH 1/7] Upgrade dependency to matrix-js-sdk@31.3.0-rc.3 --- package.json | 2 +- yarn.lock | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 3c3626be79..26db468e00 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "maplibre-gl": "^2.0.0", "matrix-encrypt-attachment": "^1.0.3", "matrix-events-sdk": "0.0.1", - "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", + "matrix-js-sdk": "31.3.0-rc.3", "matrix-widget-api": "^1.5.0", "memoize-one": "^6.0.0", "minimist": "^1.2.5", diff --git a/yarn.lock b/yarn.lock index 20841794f1..a62e4bfd6a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1832,7 +1832,7 @@ emojibase "^15.0.0" emojibase-data "^15.0.0" -"@matrix-org/matrix-sdk-crypto-wasm@^4.1.0": +"@matrix-org/matrix-sdk-crypto-wasm@^4.3.0": version "4.3.0" resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-4.3.0.tgz#ef08e7eafae6e9e85658c14a41f0d74a48c03f4a" integrity sha512-05+NO78pXda/MTxi05NJwBbbAsOmU6WywBOcAk9GarPzgvrj4GvOuYTY6VR5PD7Gzb3AI+vNx/Ho4V0GFKPW/w== @@ -6944,12 +6944,13 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": - version "31.2.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/1a364c93c3e2d4c211dc9cf374fb80038bab1214" +matrix-js-sdk@31.3.0-rc.3: + version "31.3.0-rc.3" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-31.3.0-rc.3.tgz#947fcd28ca5ecd20eaa9e3df293c4dd6e14aecad" + integrity sha512-wSLue7BSHzC/Szj/Sf/6FFs1mTz9DdRcogv+ETZNg/Uf8s0zjx+uOCjnPF/pshM6Kf2k4nq9nI6ORWMOr0MRsg== dependencies: "@babel/runtime" "^7.12.5" - "@matrix-org/matrix-sdk-crypto-wasm" "^4.1.0" + "@matrix-org/matrix-sdk-crypto-wasm" "^4.3.0" another-json "^0.2.0" bs58 "^5.0.0" content-type "^1.0.4" From 80245a52edc86ed95f5dd2537c4a7e2bf1801cbb Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Fri, 2 Feb 2024 15:06:59 +0000 Subject: [PATCH 2/7] v3.92.0-rc.0 --- package.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 26db468e00..4cf1662372 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "3.91.0", + "version": "3.92.0-rc.0", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { @@ -23,7 +23,7 @@ "package.json", ".stylelintrc.js" ], - "main": "./src/index.ts", + "main": "./lib/index.ts", "matrix_src_main": "./src/index.ts", "matrix_lib_main": "./lib/index.ts", "matrix_lib_typings": "./lib/index.d.ts", @@ -231,5 +231,6 @@ "outputDirectory": "coverage", "outputName": "jest-sonar-report.xml", "relativePaths": true - } + }, + "typings": "./lib/index.d.ts" } From 4eba6b0387d8ce3c487b0c80ff099a5778cae088 Mon Sep 17 00:00:00 2001 From: Valere Date: Mon, 5 Feb 2024 18:57:12 +0100 Subject: [PATCH 3/7] Fix the StorageManger detecting a false positive consistency check when manually migrating to rust from labs (#12225) * Fix StorageManager checks for rust migration manual opt-in * fix restricted imports * Moved utility to check db internals into js-sdk * fix typos and test names * more timeout for migration test (cherry picked from commit cdfcd37b9426def8ef85269e5af6d47afbb3d1fe) --- package.json | 1 + playwright/e2e/crypto/staged-rollout.spec.ts | 47 +++++ src/utils/StorageManager.ts | 99 +++++++---- test/utils/StorageManager-test.ts | 175 +++++++++++++++++++ yarn.lock | 5 + 5 files changed, 291 insertions(+), 36 deletions(-) create mode 100644 test/utils/StorageManager-test.ts diff --git a/package.json b/package.json index 4cf1662372..066f475c6a 100644 --- a/package.json +++ b/package.json @@ -151,6 +151,7 @@ "@babel/preset-typescript": "^7.12.7", "@babel/register": "^7.12.10", "@casualbot/jest-sonar-reporter": "2.2.7", + "fake-indexeddb": "^5.0.2", "@peculiar/webcrypto": "^1.4.3", "@playwright/test": "^1.40.1", "@testing-library/dom": "^9.0.0", diff --git a/playwright/e2e/crypto/staged-rollout.spec.ts b/playwright/e2e/crypto/staged-rollout.spec.ts index 4395b9c6b0..6e85e7e970 100644 --- a/playwright/e2e/crypto/staged-rollout.spec.ts +++ b/playwright/e2e/crypto/staged-rollout.spec.ts @@ -16,6 +16,7 @@ limitations under the License. import { test, expect } from "../../element-web-test"; import { logIntoElement } from "./utils"; +import { SettingLevel } from "../../../src/settings/SettingLevel"; test.describe("Adoption of rust stack", () => { test("Test migration of existing logins when rollout is 100%", async ({ @@ -30,6 +31,7 @@ test.describe("Adoption of rust stack", () => { "No need to test this on Rust Crypto as we override the config manually", ); await page.goto("/#/login"); + test.slow(); let featureRustCrypto = false; let stagedRolloutPercent = 0; @@ -86,6 +88,7 @@ test.describe("Adoption of rust stack", () => { workerInfo.project.name === "Rust Crypto", "No need to test this on Rust Crypto as we override the config manually", ); + test.slow(); await page.goto("/#/login"); await context.route(`http://localhost:8080/config.json*`, async (route) => { @@ -123,6 +126,7 @@ test.describe("Adoption of rust stack", () => { workerInfo.project.name === "Rust Crypto", "No need to test this on Rust Crypto as we override the config manually", ); + test.slow(); await page.goto("/#/login"); @@ -150,4 +154,47 @@ test.describe("Adoption of rust stack", () => { await app.settings.openUserSettings("Help & About"); await expect(page.getByText("Crypto version: Olm")).toBeVisible(); }); + + test("Migrate using labflag should work", async ({ page, context, app, credentials, homeserver }, workerInfo) => { + test.skip( + workerInfo.project.name === "Rust Crypto", + "No need to test this on Rust Crypto as we override the config manually", + ); + test.slow(); + + await page.goto("/#/login"); + + // In the project.name = "Legacy crypto" it will be olm crypto + await logIntoElement(page, homeserver, credentials); + + await app.settings.openUserSettings("Help & About"); + await expect(page.getByText("Crypto version: Olm")).toBeVisible(); + + // We need to enable devtools for this test + await app.settings.setValue("developerMode", null, SettingLevel.ACCOUNT, true); + + // Now simulate a refresh with `feature_rust_crypto` enabled but ensure no automatic migration + await context.route(`http://localhost:8080/config.json*`, async (route) => { + const json = {}; + json["features"] = { + feature_rust_crypto: true, + }; + json["setting_defaults"] = { + "RustCrypto.staged_rollout_percent": 0, + }; + await route.fulfill({ json }); + }); + + await page.reload(); + + // Go to the labs flag and enable the migration + await app.settings.openUserSettings("Labs"); + await page.getByRole("switch", { name: "Rust cryptography implementation" }).click(); + + // Fixes a bug where a missing session data was shown + // https://github.com/element-hq/element-web/issues/26970 + + await app.settings.openUserSettings("Help & About"); + await expect(page.getByText("Crypto version: Rust SDK")).toBeVisible(); + }); }); diff --git a/src/utils/StorageManager.ts b/src/utils/StorageManager.ts index bec3729b40..faf5f7d27a 100644 --- a/src/utils/StorageManager.ts +++ b/src/utils/StorageManager.ts @@ -22,26 +22,20 @@ import { Features } from "../settings/Settings"; const localStorage = window.localStorage; -// just *accessing* indexedDB throws an exception in firefox with -// indexeddb disabled. -let indexedDB: IDBFactory; -try { - indexedDB = window.indexedDB; -} catch (e) {} +// make this lazy in order to make testing easier +function getIndexedDb(): IDBFactory | undefined { + // just *accessing* _indexedDB throws an exception in firefox with + // indexeddb disabled. + try { + return window.indexedDB; + } catch (e) {} +} // The JS SDK will add a prefix of "matrix-js-sdk:" to the sync store name. const SYNC_STORE_NAME = "riot-web-sync"; const LEGACY_CRYPTO_STORE_NAME = "matrix-js-sdk:crypto"; const RUST_CRYPTO_STORE_NAME = "matrix-js-sdk::matrix-sdk-crypto"; -function cryptoStoreName(): string { - if (SettingsStore.getValue(Features.RustCrypto)) { - return RUST_CRYPTO_STORE_NAME; - } else { - return LEGACY_CRYPTO_STORE_NAME; - } -} - function log(msg: string): void { logger.log(`StorageManager: ${msg}`); } @@ -74,7 +68,7 @@ export async function checkConsistency(): Promise<{ }> { log("Checking storage consistency"); log(`Local storage supported? ${!!localStorage}`); - log(`IndexedDB supported? ${!!indexedDB}`); + log(`IndexedDB supported? ${!!getIndexedDb()}`); let dataInLocalStorage = false; let dataInCryptoStore = false; @@ -92,7 +86,7 @@ export async function checkConsistency(): Promise<{ error("Local storage cannot be used on this browser"); } - if (indexedDB && localStorage) { + if (getIndexedDb() && localStorage) { const results = await checkSyncStore(); if (!results.healthy) { healthy = false; @@ -102,7 +96,7 @@ export async function checkConsistency(): Promise<{ error("Sync store cannot be used on this browser"); } - if (indexedDB) { + if (getIndexedDb()) { const results = await checkCryptoStore(); dataInCryptoStore = results.exists; if (!results.healthy) { @@ -144,7 +138,7 @@ interface StoreCheck { async function checkSyncStore(): Promise { let exists = false; try { - exists = await IndexedDBStore.exists(indexedDB, SYNC_STORE_NAME); + exists = await IndexedDBStore.exists(getIndexedDb()!, SYNC_STORE_NAME); log(`Sync store using IndexedDB contains data? ${exists}`); return { exists, healthy: true }; } catch (e) { @@ -155,23 +149,56 @@ async function checkSyncStore(): Promise { } async function checkCryptoStore(): Promise { - let exists = false; - try { - exists = await IndexedDBCryptoStore.exists(indexedDB, cryptoStoreName()); - log(`Crypto store using IndexedDB contains data? ${exists}`); - return { exists, healthy: true }; - } catch (e) { - error("Crypto store using IndexedDB inaccessible", e); + if (await SettingsStore.getValue(Features.RustCrypto)) { + // check first if there is a rust crypto store + try { + const rustDbExists = await IndexedDBCryptoStore.exists(getIndexedDb()!, RUST_CRYPTO_STORE_NAME); + log(`Rust Crypto store using IndexedDB contains data? ${rustDbExists}`); + + if (rustDbExists) { + // There was an existing rust database, so consider it healthy. + return { exists: true, healthy: true }; + } else { + // No rust store, so let's check if there is a legacy store not yet migrated. + try { + const legacyIdbExists = await IndexedDBCryptoStore.existsAndIsNotMigrated( + getIndexedDb()!, + LEGACY_CRYPTO_STORE_NAME, + ); + log(`Legacy Crypto store using IndexedDB contains non migrated data? ${legacyIdbExists}`); + return { exists: legacyIdbExists, healthy: true }; + } catch (e) { + error("Legacy crypto store using IndexedDB inaccessible", e); + } + + // No need to check local storage or memory as rust stack doesn't support them. + // Given that rust stack requires indexeddb, set healthy to false. + return { exists: false, healthy: false }; + } + } catch (e) { + error("Rust crypto store using IndexedDB inaccessible", e); + return { exists: false, healthy: false }; + } + } else { + let exists = false; + // legacy checks + try { + exists = await IndexedDBCryptoStore.exists(getIndexedDb()!, LEGACY_CRYPTO_STORE_NAME); + log(`Crypto store using IndexedDB contains data? ${exists}`); + return { exists, healthy: true }; + } catch (e) { + error("Crypto store using IndexedDB inaccessible", e); + } + try { + exists = LocalStorageCryptoStore.exists(localStorage); + log(`Crypto store using local storage contains data? ${exists}`); + return { exists, healthy: true }; + } catch (e) { + error("Crypto store using local storage inaccessible", e); + } + log("Crypto store using memory only"); + return { exists, healthy: false }; } - try { - exists = LocalStorageCryptoStore.exists(localStorage); - log(`Crypto store using local storage contains data? ${exists}`); - return { exists, healthy: true }; - } catch (e) { - error("Crypto store using local storage inaccessible", e); - } - log("Crypto store using memory only"); - return { exists, healthy: false }; } /** @@ -194,11 +221,11 @@ export function setCryptoInitialised(cryptoInited: boolean): void { let idb: IDBDatabase | null = null; async function idbInit(): Promise { - if (!indexedDB) { + if (!getIndexedDb()) { throw new Error("IndexedDB not available"); } idb = await new Promise((resolve, reject) => { - const request = indexedDB.open("matrix-react-sdk", 1); + const request = getIndexedDb()!.open("matrix-react-sdk", 1); request.onerror = reject; request.onsuccess = (): void => { resolve(request.result); diff --git a/test/utils/StorageManager-test.ts b/test/utils/StorageManager-test.ts new file mode 100644 index 0000000000..786e20caea --- /dev/null +++ b/test/utils/StorageManager-test.ts @@ -0,0 +1,175 @@ +/* +Copyright 2024 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import "fake-indexeddb/auto"; + +import { IDBFactory } from "fake-indexeddb"; +import { IndexedDBCryptoStore } from "matrix-js-sdk/src/matrix"; + +import * as StorageManager from "../../src/utils/StorageManager"; +import SettingsStore from "../../src/settings/SettingsStore"; + +const LEGACY_CRYPTO_STORE_NAME = "matrix-js-sdk:crypto"; +const RUST_CRYPTO_STORE_NAME = "matrix-js-sdk::matrix-sdk-crypto"; + +describe("StorageManager", () => { + async function createDB(name: string, withStores: string[] | undefined = undefined): Promise { + const request = indexedDB.open(name); + return new Promise((resolve, reject) => { + request.onupgradeneeded = function (event) { + const db = request.result; + if (withStores) { + withStores.forEach((storeName) => { + db.createObjectStore(storeName); + }); + } + }; + request.onsuccess = function (event) { + const db = request.result; + resolve(db); + }; + request.onerror = function (event) { + reject(event); + }; + }); + } + + async function populateLegacyStore(migrationState: number | undefined) { + const db = await createDB(LEGACY_CRYPTO_STORE_NAME, [IndexedDBCryptoStore.STORE_ACCOUNT]); + + if (migrationState) { + const transaction = db.transaction([IndexedDBCryptoStore.STORE_ACCOUNT], "readwrite"); + const store = transaction.objectStore(IndexedDBCryptoStore.STORE_ACCOUNT); + store.put(migrationState, "migrationState"); + await new Promise((resolve, reject) => { + transaction.oncomplete = resolve; + transaction.onerror = reject; + }); + } + } + + beforeEach(() => { + global.structuredClone = (v) => JSON.parse(JSON.stringify(v)); + }); + + describe("Crypto store checks", () => { + async function populateHealthySession() { + // Storage manager only check for the existence of the `riot-web-sync` store, so just create one. + await createDB("riot-web-sync"); + } + + beforeEach(async () => { + await populateHealthySession(); + // eslint-disable-next-line no-global-assign + indexedDB = new IDBFactory(); + }); + + describe("with `feature_rust_crypto` enabled", () => { + beforeEach(() => { + jest.spyOn(SettingsStore, "getValue").mockImplementation(async (key) => { + if (key === "feature_rust_crypto") { + return true; + } + throw new Error(`Unknown key ${key}`); + }); + }); + + it("should not be ok if sync store but no crypto store", async () => { + const result = await StorageManager.checkConsistency(); + expect(result.healthy).toBe(true); + expect(result.dataInCryptoStore).toBe(false); + }); + + it("should be ok if sync store and a rust crypto store", async () => { + await createDB(RUST_CRYPTO_STORE_NAME); + + const result = await StorageManager.checkConsistency(); + expect(result.healthy).toBe(true); + expect(result.dataInCryptoStore).toBe(true); + }); + + describe("without rust store", () => { + it("should be ok if there is non migrated legacy crypto store", async () => { + await populateLegacyStore(undefined); + + const result = await StorageManager.checkConsistency(); + expect(result.healthy).toBe(true); + expect(result.dataInCryptoStore).toBe(true); + }); + + it("should be ok if legacy store in MigrationState `NOT_STARTED`", async () => { + await populateLegacyStore(0 /* MigrationState.NOT_STARTED*/); + + const result = await StorageManager.checkConsistency(); + expect(result.healthy).toBe(true); + expect(result.dataInCryptoStore).toBe(true); + }); + + it("should not be ok if MigrationState greater than `NOT_STARTED`", async () => { + await populateLegacyStore(1 /*INITIAL_DATA_MIGRATED*/); + + const result = await StorageManager.checkConsistency(); + expect(result.healthy).toBe(true); + expect(result.dataInCryptoStore).toBe(false); + }); + + it("should not be healthy if no indexeddb", async () => { + // eslint-disable-next-line no-global-assign + indexedDB = {} as IDBFactory; + + const result = await StorageManager.checkConsistency(); + expect(result.healthy).toBe(false); + + // eslint-disable-next-line no-global-assign + indexedDB = new IDBFactory(); + }); + }); + }); + + describe("with `feature_rust_crypto` disabled", () => { + beforeEach(() => { + jest.spyOn(SettingsStore, "getValue").mockImplementation(async (key) => { + if (key === "feature_rust_crypto") { + return false; + } + throw new Error(`Unknown key ${key}`); + }); + }); + + it("should not be ok if sync store but no crypto store", async () => { + const result = await StorageManager.checkConsistency(); + expect(result.healthy).toBe(true); + expect(result.dataInCryptoStore).toBe(false); + }); + + it("should not be ok if sync store but no crypto store and a rust store", async () => { + await createDB(RUST_CRYPTO_STORE_NAME); + + const result = await StorageManager.checkConsistency(); + expect(result.healthy).toBe(true); + expect(result.dataInCryptoStore).toBe(false); + }); + + it("should be healthy if sync store and a legacy crypto store", async () => { + await createDB(LEGACY_CRYPTO_STORE_NAME); + + const result = await StorageManager.checkConsistency(); + expect(result.healthy).toBe(true); + expect(result.dataInCryptoStore).toBe(true); + }); + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index a62e4bfd6a..94bfd1e586 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5110,6 +5110,11 @@ extend@^3.0.0: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +fake-indexeddb@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/fake-indexeddb/-/fake-indexeddb-5.0.2.tgz#8e0b6c75c6dc6639cbb50c1aa948772147d7c93e" + integrity sha512-cB507r5T3D55DfclY01GLkninZLfU7HXV/mhVRTnTRm5k2u+fY7Fof2dBkr80p5t7G7dlA/G5dI87QiMdPpMCQ== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" From 31e7c39d95be720af803c0110e80a77057b9483a Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 6 Feb 2024 15:38:02 +0000 Subject: [PATCH 4/7] Upgrade dependency to matrix-js-sdk@31.3.0-rc.4 --- package.json | 4 ++-- yarn.lock | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 066f475c6a..a4be6a8bbf 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "maplibre-gl": "^2.0.0", "matrix-encrypt-attachment": "^1.0.3", "matrix-events-sdk": "0.0.1", - "matrix-js-sdk": "31.3.0-rc.3", + "matrix-js-sdk": "31.3.0-rc.4", "matrix-widget-api": "^1.5.0", "memoize-one": "^6.0.0", "minimist": "^1.2.5", @@ -151,7 +151,6 @@ "@babel/preset-typescript": "^7.12.7", "@babel/register": "^7.12.10", "@casualbot/jest-sonar-reporter": "2.2.7", - "fake-indexeddb": "^5.0.2", "@peculiar/webcrypto": "^1.4.3", "@playwright/test": "^1.40.1", "@testing-library/dom": "^9.0.0", @@ -202,6 +201,7 @@ "eslint-plugin-react-hooks": "^4.3.0", "eslint-plugin-unicorn": "^50.0.0", "express": "^4.18.2", + "fake-indexeddb": "^5.0.2", "fetch-mock-jest": "^1.5.1", "fs-extra": "^11.0.0", "jest": "^29.6.2", diff --git a/yarn.lock b/yarn.lock index 94bfd1e586..d46be31d9b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6949,10 +6949,10 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -matrix-js-sdk@31.3.0-rc.3: - version "31.3.0-rc.3" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-31.3.0-rc.3.tgz#947fcd28ca5ecd20eaa9e3df293c4dd6e14aecad" - integrity sha512-wSLue7BSHzC/Szj/Sf/6FFs1mTz9DdRcogv+ETZNg/Uf8s0zjx+uOCjnPF/pshM6Kf2k4nq9nI6ORWMOr0MRsg== +matrix-js-sdk@31.3.0-rc.4: + version "31.3.0-rc.4" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-31.3.0-rc.4.tgz#be8d7eaa667084fc12d64e507e358047ab1dd837" + integrity sha512-gNgRcTgXE0aUEiaUkW3PRl22HV/ex12k5mr3c19kuClcXXdRmnFtJsT/6wE6oQ6izBNdg0V7dL3plJ/pazhiDw== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-wasm" "^4.3.0" From 6336cf4dc9f5347c67efa3ca582fc66ad6cbb591 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 6 Feb 2024 15:44:02 +0000 Subject: [PATCH 5/7] v3.92.0-rc.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a4be6a8bbf..58c06ba0ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "3.92.0-rc.0", + "version": "3.92.0-rc.1", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From 368db9d2b4b934e13417c948e95fcfcecf18cbad Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 13 Feb 2024 14:57:12 +0000 Subject: [PATCH 6/7] Upgrade dependency to matrix-js-sdk@31.3.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 58c06ba0ca..0d10b6bf61 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "maplibre-gl": "^2.0.0", "matrix-encrypt-attachment": "^1.0.3", "matrix-events-sdk": "0.0.1", - "matrix-js-sdk": "31.3.0-rc.4", + "matrix-js-sdk": "31.3.0", "matrix-widget-api": "^1.5.0", "memoize-one": "^6.0.0", "minimist": "^1.2.5", diff --git a/yarn.lock b/yarn.lock index d46be31d9b..e0f916c077 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6949,10 +6949,10 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -matrix-js-sdk@31.3.0-rc.4: - version "31.3.0-rc.4" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-31.3.0-rc.4.tgz#be8d7eaa667084fc12d64e507e358047ab1dd837" - integrity sha512-gNgRcTgXE0aUEiaUkW3PRl22HV/ex12k5mr3c19kuClcXXdRmnFtJsT/6wE6oQ6izBNdg0V7dL3plJ/pazhiDw== +matrix-js-sdk@31.3.0: + version "31.3.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-31.3.0.tgz#724b0f6677d850d96e651955882d51c56cab7052" + integrity sha512-RwpHQxb8DWBaE7yzrTfSfO1N4jyk6ilcu/Zt3VFqwmeym/0ipVUy98sB2JXOf6E+MdG1w4WzOIxQu2R7GpPZ2g== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-wasm" "^4.3.0" From cfd58016e829a5aa8ea10e355c0befabb7747867 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 13 Feb 2024 15:02:07 +0000 Subject: [PATCH 7/7] v3.92.0 --- CHANGELOG.md | 19 +++++++++++++++++++ package.json | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17dc6f4dc4..a8743130ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,22 @@ +Changes in [3.92.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.92.0) (2024-02-13) +===================================================================================================== +## ✨ Features + +* Add Element call related functionality to new room header ([#12091](https://github.com/matrix-org/matrix-react-sdk/pull/12091)). Contributed by @toger5. +* Add labs flag for Threads Activity Centre ([#12137](https://github.com/matrix-org/matrix-react-sdk/pull/12137)). Contributed by @florianduros. +* Refactor element call lobby + skip lobby ([#12057](https://github.com/matrix-org/matrix-react-sdk/pull/12057)). Contributed by @toger5. +* Hide the "Message" button in the sidebar if the CreateRooms components should not be shown ([#9271](https://github.com/matrix-org/matrix-react-sdk/pull/9271)). Contributed by @dhenneke. +* Add notification dots to thread summary icons ([#12146](https://github.com/matrix-org/matrix-react-sdk/pull/12146)). Contributed by @dbkr. + +## 🐛 Bug Fixes + +* [Backport staging] Fix the StorageManger detecting a false positive consistency check when manually migrating to rust from labs ([#12230](https://github.com/matrix-org/matrix-react-sdk/pull/12230)). Contributed by @RiotRobot. +* Fix logout can take ages ([#12191](https://github.com/matrix-org/matrix-react-sdk/pull/12191)). Contributed by @BillCarsonFr. +* Fix `Mark all as read` in settings ([#12205](https://github.com/matrix-org/matrix-react-sdk/pull/12205)). Contributed by @florianduros. +* Fix default thread notification of the new RoomHeader ([#12194](https://github.com/matrix-org/matrix-react-sdk/pull/12194)). Contributed by @florianduros. +* Fix display of room notification debug info ([#12183](https://github.com/matrix-org/matrix-react-sdk/pull/12183)). Contributed by @dbkr. + + Changes in [3.91.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.91.0) (2024-01-31) ===================================================================================================== ## ✨ Features diff --git a/package.json b/package.json index 0d10b6bf61..907ce2ba00 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "3.92.0-rc.1", + "version": "3.92.0", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": {