Release Sign in with QR out of labs (#10182)

This commit is contained in:
Hugh Nimmo-Smith 2023-02-17 09:27:57 +00:00 committed by GitHub
parent 62f968be7c
commit a854e941cc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 12 additions and 66 deletions

View file

@ -20,7 +20,6 @@ import type { IServerVersions } from "matrix-js-sdk/src/matrix";
import { _t } from "../../../../languageHandler"; import { _t } from "../../../../languageHandler";
import AccessibleButton from "../../elements/AccessibleButton"; import AccessibleButton from "../../elements/AccessibleButton";
import SettingsSubsection from "../shared/SettingsSubsection"; import SettingsSubsection from "../shared/SettingsSubsection";
import SettingsStore from "../../../../settings/SettingsStore";
interface IProps { interface IProps {
onShowQr: () => void; onShowQr: () => void;
@ -33,12 +32,10 @@ export default class LoginWithQRSection extends React.Component<IProps> {
} }
public render(): JSX.Element | null { public render(): JSX.Element | null {
// Needs server support for MSC3882 and MSC3886:
const msc3882Supported = !!this.props.versions?.unstable_features?.["org.matrix.msc3882"]; const msc3882Supported = !!this.props.versions?.unstable_features?.["org.matrix.msc3882"];
const msc3886Supported = !!this.props.versions?.unstable_features?.["org.matrix.msc3886"]; const msc3886Supported = !!this.props.versions?.unstable_features?.["org.matrix.msc3886"];
const offerShowQr = msc3882Supported && msc3886Supported;
// Needs to be enabled as a feature + server support MSC3886 or have a default rendezvous server configured:
const offerShowQr =
SettingsStore.getValue("feature_qr_signin_reciprocate_show") && msc3882Supported && msc3886Supported; // We don't support configuration of a fallback at the moment so we just check the MSCs
// don't show anything if no method is available // don't show anything if no method is available
if (!offerShowQr) { if (!offerShowQr) {

View file

@ -381,7 +381,6 @@ export default class SecurityUserSettingsTab extends React.Component<IProps, ISt
} }
const useNewSessionManager = SettingsStore.getValue("feature_new_device_manager"); const useNewSessionManager = SettingsStore.getValue("feature_new_device_manager");
const showQrCodeEnabled = SettingsStore.getValue("feature_qr_signin_reciprocate_show");
const devicesSection = useNewSessionManager ? null : ( const devicesSection = useNewSessionManager ? null : (
<> <>
<div className="mx_SettingsTab_heading">{_t("Where you're signed in")}</div> <div className="mx_SettingsTab_heading">{_t("Where you're signed in")}</div>
@ -394,15 +393,13 @@ export default class SecurityUserSettingsTab extends React.Component<IProps, ISt
</span> </span>
<DevicesPanel /> <DevicesPanel />
</div> </div>
{showQrCodeEnabled ? (
<LoginWithQRSection onShowQr={this.onShowQRClicked} versions={this.state.versions} /> <LoginWithQRSection onShowQr={this.onShowQRClicked} versions={this.state.versions} />
) : null}
</> </>
); );
const client = MatrixClientPeg.get(); const client = MatrixClientPeg.get();
if (showQrCodeEnabled && this.state.showLoginWithQR) { if (this.state.showLoginWithQR) {
return ( return (
<div className="mx_SettingsTab mx_SecurityUserSettingsTab"> <div className="mx_SettingsTab mx_SecurityUserSettingsTab">
<LoginWithQR <LoginWithQR

View file

@ -34,7 +34,6 @@ import { deleteDevicesWithInteractiveAuth } from "../../devices/deleteDevices";
import SettingsTab from "../SettingsTab"; import SettingsTab from "../SettingsTab";
import LoginWithQRSection from "../../devices/LoginWithQRSection"; import LoginWithQRSection from "../../devices/LoginWithQRSection";
import LoginWithQR, { Mode } from "../../../auth/LoginWithQR"; import LoginWithQR, { Mode } from "../../../auth/LoginWithQR";
import SettingsStore from "../../../../../settings/SettingsStore";
import { useAsyncMemo } from "../../../../../hooks/useAsyncMemo"; import { useAsyncMemo } from "../../../../../hooks/useAsyncMemo";
import QuestionDialog from "../../../dialogs/QuestionDialog"; import QuestionDialog from "../../../dialogs/QuestionDialog";
import { FilterVariation } from "../../devices/filter"; import { FilterVariation } from "../../devices/filter";
@ -212,8 +211,6 @@ const SessionManagerTab: React.FC = () => {
const [signInWithQrMode, setSignInWithQrMode] = useState<Mode | null>(); const [signInWithQrMode, setSignInWithQrMode] = useState<Mode | null>();
const showQrCodeEnabled = SettingsStore.getValue("feature_qr_signin_reciprocate_show");
const onQrFinish = useCallback(() => { const onQrFinish = useCallback(() => {
setSignInWithQrMode(null); setSignInWithQrMode(null);
}, [setSignInWithQrMode]); }, [setSignInWithQrMode]);
@ -222,7 +219,7 @@ const SessionManagerTab: React.FC = () => {
setSignInWithQrMode(Mode.Show); setSignInWithQrMode(Mode.Show);
}, [setSignInWithQrMode]); }, [setSignInWithQrMode]);
if (showQrCodeEnabled && signInWithQrMode) { if (signInWithQrMode) {
return <LoginWithQR mode={signInWithQrMode} onFinished={onQrFinish} client={matrixClient} />; return <LoginWithQR mode={signInWithQrMode} onFinished={onQrFinish} client={matrixClient} />;
} }
@ -282,7 +279,7 @@ const SessionManagerTab: React.FC = () => {
/> />
</SettingsSubsection> </SettingsSubsection>
)} )}
{showQrCodeEnabled ? <LoginWithQRSection onShowQr={onShowQrClicked} versions={clientVersions} /> : null} <LoginWithQRSection onShowQr={onShowQrClicked} versions={clientVersions} />
</SettingsTab> </SettingsTab>
); );
}; };

View file

@ -977,7 +977,6 @@
"New session manager": "New session manager", "New session manager": "New session manager",
"Have greater visibility and control over all your sessions.": "Have greater visibility and control over all your sessions.", "Have greater visibility and control over all your sessions.": "Have greater visibility and control over all your sessions.",
"Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.", "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.",
"Allow a QR code to be shown in session manager to sign in another device (requires compatible homeserver)": "Allow a QR code to be shown in session manager to sign in another device (requires compatible homeserver)",
"Rust cryptography implementation": "Rust cryptography implementation", "Rust cryptography implementation": "Rust cryptography implementation",
"Under active development. Can currently only be enabled via config.json": "Under active development. Can currently only be enabled via config.json", "Under active development. Can currently only be enabled via config.json": "Under active development. Can currently only be enabled via config.json",
"Font size": "Font size", "Font size": "Font size",

View file

@ -496,16 +496,6 @@ export const SETTINGS: { [setting: string]: ISetting } = {
), ),
}, },
}, },
"feature_qr_signin_reciprocate_show": {
isFeature: true,
labsGroup: LabGroup.Experimental,
supportedLevels: LEVELS_FEATURE,
displayName: _td(
"Allow a QR code to be shown in session manager to sign in another device " +
"(requires compatible homeserver)",
),
default: false,
},
"feature_rust_crypto": { "feature_rust_crypto": {
// use the rust matrix-sdk-crypto-js for crypto. // use the rust matrix-sdk-crypto-js for crypto.
isFeature: true, isFeature: true,

View file

@ -21,8 +21,6 @@ import React from "react";
import LoginWithQRSection from "../../../../../src/components/views/settings/devices/LoginWithQRSection"; import LoginWithQRSection from "../../../../../src/components/views/settings/devices/LoginWithQRSection";
import { MatrixClientPeg } from "../../../../../src/MatrixClientPeg"; import { MatrixClientPeg } from "../../../../../src/MatrixClientPeg";
import { SettingLevel } from "../../../../../src/settings/SettingLevel";
import SettingsStore from "../../../../../src/settings/SettingsStore";
function makeClient() { function makeClient() {
return mocked({ return mocked({
@ -67,22 +65,14 @@ describe("<LoginWithQRSection />", () => {
expect(container).toMatchSnapshot(); expect(container).toMatchSnapshot();
}); });
it("feature enabled", async () => { it("only MSC3882 enabled", async () => {
await SettingsStore.setValue("feature_qr_signin_reciprocate_show", null, SettingLevel.DEVICE, true);
const { container } = render(getComponent());
expect(container).toMatchSnapshot();
});
it("only feature + MSC3882 enabled", async () => {
await SettingsStore.setValue("feature_qr_signin_reciprocate_show", null, SettingLevel.DEVICE, true);
const { container } = render(getComponent({ versions: makeVersions({ "org.matrix.msc3882": true }) })); const { container } = render(getComponent({ versions: makeVersions({ "org.matrix.msc3882": true }) }));
expect(container).toMatchSnapshot(); expect(container).toMatchSnapshot();
}); });
}); });
describe("should render panel", () => { describe("should render panel", () => {
it("enabled by feature + MSC3882 + MSC3886", async () => { it("MSC3882 + MSC3886", async () => {
await SettingsStore.setValue("feature_qr_signin_reciprocate_show", null, SettingLevel.DEVICE, true);
const { container } = render( const { container } = render(
getComponent({ getComponent({
versions: makeVersions({ versions: makeVersions({

View file

@ -1,12 +1,10 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP // Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`<LoginWithQRSection /> should not render feature enabled 1`] = `<div />`;
exports[`<LoginWithQRSection /> should not render no support at all 1`] = `<div />`; exports[`<LoginWithQRSection /> should not render no support at all 1`] = `<div />`;
exports[`<LoginWithQRSection /> should not render only feature + MSC3882 enabled 1`] = `<div />`; exports[`<LoginWithQRSection /> should not render only MSC3882 enabled 1`] = `<div />`;
exports[`<LoginWithQRSection /> should render panel enabled by feature + MSC3882 + MSC3886 1`] = ` exports[`<LoginWithQRSection /> should render panel MSC3882 + MSC3886 1`] = `
<div> <div>
<div <div
class="mx_SettingsSubsection" class="mx_SettingsSubsection"

View file

@ -79,17 +79,7 @@ describe("<SecurityUserSettingsTab />", () => {
expect(queryByTestId("devices-section")).toBeFalsy(); expect(queryByTestId("devices-section")).toBeFalsy();
}); });
it("does not render qr code login section when disabled", () => { it("renders qr code login section", async () => {
settingsValueSpy.mockReturnValue(false);
const { queryByText } = render(getComponent());
expect(settingsValueSpy).toHaveBeenCalledWith("feature_qr_signin_reciprocate_show");
expect(queryByText("Sign in with QR code")).toBeFalsy();
});
it("renders qr code login section when enabled", async () => {
settingsValueSpy.mockImplementation((settingName) => settingName === "feature_qr_signin_reciprocate_show");
const { getByText } = render(getComponent()); const { getByText } = render(getComponent());
// wait for versions call to settle // wait for versions call to settle
@ -99,7 +89,6 @@ describe("<SecurityUserSettingsTab />", () => {
}); });
it("enters qr code login section when show QR code button clicked", async () => { it("enters qr code login section when show QR code button clicked", async () => {
settingsValueSpy.mockImplementation((settingName) => settingName === "feature_qr_signin_reciprocate_show");
const { getByText, getByTestId } = render(getComponent()); const { getByText, getByTestId } = render(getComponent());
// wait for versions call to settle // wait for versions call to settle
await flushPromises(); await flushPromises();

View file

@ -1348,17 +1348,7 @@ describe("<SessionManagerTab />", () => {
}); });
}); });
it("does not render qr code login section when disabled", () => { it("renders qr code login section", async () => {
settingsValueSpy.mockReturnValue(false);
const { queryByText } = render(getComponent());
expect(settingsValueSpy).toHaveBeenCalledWith("feature_qr_signin_reciprocate_show");
expect(queryByText("Sign in with QR code")).toBeFalsy();
});
it("renders qr code login section when enabled", async () => {
settingsValueSpy.mockImplementation((settingName) => settingName === "feature_qr_signin_reciprocate_show");
const { getByText } = render(getComponent()); const { getByText } = render(getComponent());
// wait for versions call to settle // wait for versions call to settle
@ -1368,7 +1358,6 @@ describe("<SessionManagerTab />", () => {
}); });
it("enters qr code login section when show QR code button clicked", async () => { it("enters qr code login section when show QR code button clicked", async () => {
settingsValueSpy.mockImplementation((settingName) => settingName === "feature_qr_signin_reciprocate_show");
const { getByText, getByTestId } = render(getComponent()); const { getByText, getByTestId } = render(getComponent());
// wait for versions call to settle // wait for versions call to settle
await flushPromises(); await flushPromises();