From 5b10be8450f19a00b47606169cc42809f54c84c5 Mon Sep 17 00:00:00 2001 From: Callum Brown Date: Fri, 3 Dec 2021 10:23:57 +0000 Subject: [PATCH 01/15] Support token authenticated registration https://spec.matrix.org/v1.2/client-server-api/#token-authenticated-registration Signed-off-by: Callum Brown --- .../auth/InteractiveAuthEntryComponents.tsx | 89 +++++++++++++++++++ src/i18n/strings/en_EN.json | 2 + 2 files changed, 91 insertions(+) diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/src/components/views/auth/InteractiveAuthEntryComponents.tsx index 63845f0e97c..96653a2e38f 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -621,6 +621,93 @@ export class MsisdnAuthEntry extends React.Component { + static LOGIN_TYPE = AuthType.RegistrationToken; + + constructor(props) { + super(props); + + this.state = { + registrationToken: "", + }; + } + + componentDidMount() { + this.props.onPhaseChange(DEFAULT_PHASE); + } + + private onSubmit = (e: FormEvent) => { + e.preventDefault(); + if (this.props.busy) return; + + this.props.submitAuthDict({ + type: AuthType.RegistrationToken, + token: this.state.registrationToken, + }); + }; + + private onRegistrationTokenFieldChange = (ev: ChangeEvent) => { + // enable the submit button if the registration token is non-empty + this.setState({ + registrationToken: ev.target.value, + }); + }; + + render() { + const registrationTokenBoxClass = classNames({ + "error": this.props.errorText, + }); + + let submitButtonOrSpinner; + if (this.props.busy) { + submitButtonOrSpinner = ; + } else { + submitButtonOrSpinner = ( + + ); + } + + let errorSection; + if (this.props.errorText) { + errorSection = ( +
+ { this.props.errorText } +
+ ); + } + + return ( +
+

{ _t("Enter a registration token.") }

+
+ + { errorSection } +
+ { submitButtonOrSpinner } +
+ +
+ ); + } +} + interface ISSOAuthEntryProps extends IAuthEntryProps { continueText?: string; continueKind?: string; @@ -854,6 +941,8 @@ export default function getEntryComponentForLoginType(loginType: AuthType): ISta return MsisdnAuthEntry; case AuthType.Terms: return TermsAuthEntry; + case AuthType.RegistrationToken: + return RegistrationTokenAuthEntry; case AuthType.Sso: case AuthType.SsoUnstable: return SSOAuthEntry; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index e50bd524455..84c85c1f801 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2942,6 +2942,8 @@ "Please enter the code it contains:": "Please enter the code it contains:", "Code": "Code", "Submit": "Submit", + "Enter a registration token.": "Enter a registration token.", + "Registration token": "Registration token", "Something went wrong in confirming your identity. Cancel and try again.": "Something went wrong in confirming your identity. Cancel and try again.", "Start authentication": "Start authentication", "Enter password": "Enter password", From 39c258afa72bc1149f83b9e59766534b6835703d Mon Sep 17 00:00:00 2001 From: Callum Brown Date: Fri, 18 Feb 2022 17:45:10 +0000 Subject: [PATCH 02/15] Backwards compatibility with unstable auth type Some server installs are not updated to use the stable version of the registration token authentication type, so also handle the unstable version defined in MSC3231. Signed-off-by: Callum Brown --- src/components/views/auth/InteractiveAuthEntryComponents.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/src/components/views/auth/InteractiveAuthEntryComponents.tsx index 96653a2e38f..e4f49e43254 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -646,7 +646,8 @@ export class RegistrationTokenAuthEntry extends React.Component Date: Sun, 10 Apr 2022 12:21:43 +0100 Subject: [PATCH 03/15] Make LOGIN_TYPE public and readonly Co-authored-by: Travis Ralston --- src/components/views/auth/InteractiveAuthEntryComponents.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/src/components/views/auth/InteractiveAuthEntryComponents.tsx index e4f49e43254..6727bd6ec7a 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -627,7 +627,7 @@ interface IRegistrationTokenAuthEntryState { @replaceableComponent("views.auth.RegistrationTokenAuthEntry") export class RegistrationTokenAuthEntry extends React.Component { - static LOGIN_TYPE = AuthType.RegistrationToken; + public static readonly LOGIN_TYPE = AuthType.RegistrationToken; constructor(props) { super(props); From f9a3fe81ed8d879dd26442f5db34b57c31e7da31 Mon Sep 17 00:00:00 2001 From: Callum Brown Date: Sun, 10 Apr 2022 12:44:39 +0100 Subject: [PATCH 04/15] Remove line related to skinning Signed-off-by: Callum Brown --- src/components/views/auth/InteractiveAuthEntryComponents.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/src/components/views/auth/InteractiveAuthEntryComponents.tsx index de069123f85..d601d6c74d7 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -610,7 +610,6 @@ interface IRegistrationTokenAuthEntryState { registrationToken: string; } -@replaceableComponent("views.auth.RegistrationTokenAuthEntry") export class RegistrationTokenAuthEntry extends React.Component { public static readonly LOGIN_TYPE = AuthType.RegistrationToken; From 47e3a7a214fb4dbb14a9a1757be82c6c1044652c Mon Sep 17 00:00:00 2001 From: Callum Brown Date: Sun, 10 Apr 2022 12:46:53 +0100 Subject: [PATCH 05/15] Change empty string to null Signed-off-by: Callum Brown --- src/components/views/auth/InteractiveAuthEntryComponents.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/src/components/views/auth/InteractiveAuthEntryComponents.tsx index d601d6c74d7..5f05cd6e6b7 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -617,7 +617,7 @@ export class RegistrationTokenAuthEntry extends React.Component Date: Thu, 12 May 2022 10:57:56 +0100 Subject: [PATCH 06/15] Use "public"s for new code style Signed-off-by: Callum Brown --- .../views/auth/InteractiveAuthEntryComponents.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/src/components/views/auth/InteractiveAuthEntryComponents.tsx index 5f05cd6e6b7..bd8d31f2c71 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -613,7 +613,7 @@ interface IRegistrationTokenAuthEntryState { export class RegistrationTokenAuthEntry extends React.Component { public static readonly LOGIN_TYPE = AuthType.RegistrationToken; - constructor(props) { + public constructor(props: IAuthEntryProps) { super(props); this.state = { @@ -621,7 +621,7 @@ export class RegistrationTokenAuthEntry extends React.Component Date: Mon, 16 May 2022 13:40:04 +0100 Subject: [PATCH 07/15] Change input to AccessibleButton Signed-off-by: Callum Brown --- .../views/auth/InteractiveAuthEntryComponents.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/src/components/views/auth/InteractiveAuthEntryComponents.tsx index a3f0d871f09..827633075e0 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -719,11 +719,10 @@ export class RegistrationTokenAuthEntry extends React.Component; } else { submitButtonOrSpinner = ( - + { this.props.continueText || _t("Continue") } ); } From 6fa9204535a61f0a3a2ef6666c644d1513f05841 Mon Sep 17 00:00:00 2001 From: Callum Brown Date: Mon, 16 May 2022 13:46:32 +0100 Subject: [PATCH 08/15] Add more detail regarding source of token Signed-off-by: Callum Brown --- src/components/views/auth/InteractiveAuthEntryComponents.tsx | 2 +- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/src/components/views/auth/InteractiveAuthEntryComponents.tsx index 827633075e0..fde3ab4ad47 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -737,7 +737,7 @@ export class RegistrationTokenAuthEntry extends React.Component -

{ _t("Enter a registration token.") }

+

{ _t("Enter a registration token provided by the homeserver administrator.") }

Date: Fri, 12 Aug 2022 11:10:46 +0100 Subject: [PATCH 09/15] Fix lint error The text and button type will be the same every time for registration tokens, unlike (possibly) for SSO. Signed-off-by: Callum Brown --- src/components/views/auth/InteractiveAuthEntryComponents.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/src/components/views/auth/InteractiveAuthEntryComponents.tsx index 06314ec9638..7d1ceb08926 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -721,8 +721,8 @@ export class RegistrationTokenAuthEntry extends React.Component{ this.props.continueText || _t("Continue") } + kind='primary' + >{ _t("Continue") } ); } From 6cb3260ce5c929fe61e37d615ebff613b67accf0 Mon Sep 17 00:00:00 2001 From: Callum Brown Date: Sat, 10 Sep 2022 19:26:44 +0100 Subject: [PATCH 10/15] Change null back to "" Due to the following warning when attempting to test: > Warning: `value` prop on `input` should not be null. > Consider using an empty string to clear the component or > `undefined` for uncontrolled components. Signed-off-by: Callum Brown --- src/components/views/auth/InteractiveAuthEntryComponents.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/src/components/views/auth/InteractiveAuthEntryComponents.tsx index 7d1ceb08926..44dffe73411 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -683,7 +683,7 @@ export class RegistrationTokenAuthEntry extends React.Component Date: Sat, 10 Sep 2022 21:00:23 +0100 Subject: [PATCH 11/15] Disable submit button when no token entered Signed-off-by: Callum Brown --- src/components/views/auth/InteractiveAuthEntryComponents.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/src/components/views/auth/InteractiveAuthEntryComponents.tsx index 44dffe73411..e984aa666d7 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -722,6 +722,7 @@ export class RegistrationTokenAuthEntry extends React.Component{ _t("Continue") } ); } From a19b417e40ba3bbc82ecd38a134cae1991a9c415 Mon Sep 17 00:00:00 2001 From: Callum Brown Date: Sat, 10 Sep 2022 21:03:06 +0100 Subject: [PATCH 12/15] Add test for registration tokens Adapted from test/components/views/dialogs/InteractiveAuthDialog-test.tsx Signed-off-by: Callum Brown --- .../views/auth/RegistrationToken-test.tsx | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 test/components/views/auth/RegistrationToken-test.tsx diff --git a/test/components/views/auth/RegistrationToken-test.tsx b/test/components/views/auth/RegistrationToken-test.tsx new file mode 100644 index 00000000000..1bb282052d3 --- /dev/null +++ b/test/components/views/auth/RegistrationToken-test.tsx @@ -0,0 +1,110 @@ +/* +Copyright 2016 OpenMarket Ltd +Copyright 2022 The Matrix.org Foundation C.I.C. +Copyright 2022 Callum Brown + +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 React from 'react'; +import { act } from 'react-dom/test-utils'; +// eslint-disable-next-line deprecate/import +import { mount, ReactWrapper } from 'enzyme'; + +import InteractiveAuthComponent from "../../../../src/components/structures/InteractiveAuth"; +import { flushPromises, getMockClientWithEventEmitter, unmockClientPeg } from '../../../test-utils'; + +describe('InteractiveAuthComponent', function() { + const mockClient = getMockClientWithEventEmitter({ + generateClientSecret: jest.fn().mockReturnValue('t35tcl1Ent5ECr3T'), + }); + + const defaultProps = { + matrixClient: mockClient, + makeRequest: jest.fn().mockResolvedValue(undefined), + onAuthFinished: jest.fn(), + }; + const getComponent = (props = {}) => mount(); + + beforeEach(function() { + jest.clearAllMocks(); + }); + + afterAll(() => { + unmockClientPeg(); + }); + + const getSubmitButton = (wrapper: ReactWrapper) => wrapper.find('AccessibleButton[kind="primary"]').at(0); + const getRegistrationTokenInput = (wrapper: ReactWrapper) => wrapper.find( + 'input[name="registrationTokenField"]', + ).at(0); + + it('Should successfully complete a registration token flow', async () => { + const onAuthFinished = jest.fn(); + const makeRequest = jest.fn().mockResolvedValue({ a: 1 }); + + const authData = { + session: "sess", + flows: [ + { "stages": ["m.login.registration_token"] }, + ], + }; + + const wrapper = getComponent({ makeRequest, onAuthFinished, authData }); + + const registrationTokenNode = getRegistrationTokenInput(wrapper); + const submitNode = getSubmitButton(wrapper); + const formNode = wrapper.find('form').at(0); + + expect(registrationTokenNode).toBeTruthy(); + expect(submitNode).toBeTruthy(); + expect(formNode).toBeTruthy(); + + // submit should be disabled + expect(submitNode.props().disabled).toBe(true); + + // put something in the registration token box + act(() => { + registrationTokenNode.simulate('change', { target: { value: "s3kr3t" } }); + wrapper.setProps({}); + }); + + expect(getRegistrationTokenInput(wrapper).props().value).toEqual("s3kr3t"); + expect(getSubmitButton(wrapper).props().disabled).toBe(false); + + // hit enter; that should trigger a request + act(() => { + formNode.simulate('submit'); + }); + + // wait for auth request to resolve + await flushPromises(); + + expect(makeRequest).toHaveBeenCalledTimes(1); + expect(makeRequest).toBeCalledWith(expect.objectContaining({ + session: "sess", + type: "m.login.registration_token", + token: "s3kr3t", + })); + + expect(onAuthFinished).toBeCalledTimes(1); + expect(onAuthFinished).toBeCalledWith( + true, + { a: 1 }, + { "clientSecret": "t35tcl1Ent5ECr3T", "emailSid": null }, + ); + }); +}); From aea870d1196015033804b5c700fbb287a4d3977f Mon Sep 17 00:00:00 2001 From: Callum Brown Date: Wed, 18 Jan 2023 18:30:55 +0000 Subject: [PATCH 13/15] Fix linting errors Signed-off-by: Callum Brown --- .../auth/InteractiveAuthEntryComponents.tsx | 28 +++++----- .../views/auth/RegistrationToken-test.tsx | 54 ++++++++----------- 2 files changed, 35 insertions(+), 47 deletions(-) diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/src/components/views/auth/InteractiveAuthEntryComponents.tsx index 70977a8992c..2b0ad6063be 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -707,11 +707,11 @@ export class RegistrationTokenAuthEntry extends React.Component { + private onSubmit = (e: FormEvent): void => { e.preventDefault(); if (this.props.busy) return; @@ -722,16 +722,16 @@ export class RegistrationTokenAuthEntry extends React.Component) => { + private onRegistrationTokenFieldChange = (ev: ChangeEvent): void => { // enable the submit button if the registration token is non-empty this.setState({ registrationToken: ev.target.value, }); }; - public render() { + public render(): JSX.Element { const registrationTokenBoxClass = classNames({ - "error": this.props.errorText, + error: this.props.errorText, }); let submitButtonOrSpinner; @@ -739,11 +739,9 @@ export class RegistrationTokenAuthEntry extends React.Component; } else { submitButtonOrSpinner = ( - { _t("Continue") } + + {_t("Continue")} + ); } @@ -751,14 +749,14 @@ export class RegistrationTokenAuthEntry extends React.Component - { this.props.errorText } + {this.props.errorText} ); } return (
-

{ _t("Enter a registration token provided by the homeserver administrator.") }

+

{_t("Enter a registration token provided by the homeserver administrator.")}

- { errorSection } -
- { submitButtonOrSpinner } -
+ {errorSection} +
{submitButtonOrSpinner}
); diff --git a/test/components/views/auth/RegistrationToken-test.tsx b/test/components/views/auth/RegistrationToken-test.tsx index 1bb282052d3..92b6fcf0fc9 100644 --- a/test/components/views/auth/RegistrationToken-test.tsx +++ b/test/components/views/auth/RegistrationToken-test.tsx @@ -16,17 +16,17 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React from 'react'; -import { act } from 'react-dom/test-utils'; +import React from "react"; +import { act } from "react-dom/test-utils"; // eslint-disable-next-line deprecate/import -import { mount, ReactWrapper } from 'enzyme'; +import { mount, ReactWrapper } from "enzyme"; import InteractiveAuthComponent from "../../../../src/components/structures/InteractiveAuth"; -import { flushPromises, getMockClientWithEventEmitter, unmockClientPeg } from '../../../test-utils'; +import { flushPromises, getMockClientWithEventEmitter, unmockClientPeg } from "../../../test-utils"; -describe('InteractiveAuthComponent', function() { +describe("InteractiveAuthComponent", function () { const mockClient = getMockClientWithEventEmitter({ - generateClientSecret: jest.fn().mockReturnValue('t35tcl1Ent5ECr3T'), + generateClientSecret: jest.fn().mockReturnValue("t35tcl1Ent5ECr3T"), }); const defaultProps = { @@ -34,12 +34,9 @@ describe('InteractiveAuthComponent', function() { makeRequest: jest.fn().mockResolvedValue(undefined), onAuthFinished: jest.fn(), }; - const getComponent = (props = {}) => mount(); + const getComponent = (props = {}) => mount(); - beforeEach(function() { + beforeEach(function () { jest.clearAllMocks(); }); @@ -48,26 +45,23 @@ describe('InteractiveAuthComponent', function() { }); const getSubmitButton = (wrapper: ReactWrapper) => wrapper.find('AccessibleButton[kind="primary"]').at(0); - const getRegistrationTokenInput = (wrapper: ReactWrapper) => wrapper.find( - 'input[name="registrationTokenField"]', - ).at(0); + const getRegistrationTokenInput = (wrapper: ReactWrapper) => + wrapper.find('input[name="registrationTokenField"]').at(0); - it('Should successfully complete a registration token flow', async () => { + it("Should successfully complete a registration token flow", async () => { const onAuthFinished = jest.fn(); const makeRequest = jest.fn().mockResolvedValue({ a: 1 }); const authData = { session: "sess", - flows: [ - { "stages": ["m.login.registration_token"] }, - ], + flows: [{ stages: ["m.login.registration_token"] }], }; const wrapper = getComponent({ makeRequest, onAuthFinished, authData }); const registrationTokenNode = getRegistrationTokenInput(wrapper); const submitNode = getSubmitButton(wrapper); - const formNode = wrapper.find('form').at(0); + const formNode = wrapper.find("form").at(0); expect(registrationTokenNode).toBeTruthy(); expect(submitNode).toBeTruthy(); @@ -78,7 +72,7 @@ describe('InteractiveAuthComponent', function() { // put something in the registration token box act(() => { - registrationTokenNode.simulate('change', { target: { value: "s3kr3t" } }); + registrationTokenNode.simulate("change", { target: { value: "s3kr3t" } }); wrapper.setProps({}); }); @@ -87,24 +81,22 @@ describe('InteractiveAuthComponent', function() { // hit enter; that should trigger a request act(() => { - formNode.simulate('submit'); + formNode.simulate("submit"); }); // wait for auth request to resolve await flushPromises(); expect(makeRequest).toHaveBeenCalledTimes(1); - expect(makeRequest).toBeCalledWith(expect.objectContaining({ - session: "sess", - type: "m.login.registration_token", - token: "s3kr3t", - })); + expect(makeRequest).toBeCalledWith( + expect.objectContaining({ + session: "sess", + type: "m.login.registration_token", + token: "s3kr3t", + }), + ); expect(onAuthFinished).toBeCalledTimes(1); - expect(onAuthFinished).toBeCalledWith( - true, - { a: 1 }, - { "clientSecret": "t35tcl1Ent5ECr3T", "emailSid": null }, - ); + expect(onAuthFinished).toBeCalledWith(true, { a: 1 }, { clientSecret: "t35tcl1Ent5ECr3T", emailSid: null }); }); }); From 3636932031a8948fea4e0e45a3bbcebc84ccbf1a Mon Sep 17 00:00:00 2001 From: Callum Brown Date: Wed, 18 Jan 2023 18:40:26 +0000 Subject: [PATCH 14/15] Fix test for registration tokens Signed-off-by: Callum Brown --- test/components/views/auth/RegistrationToken-test.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/components/views/auth/RegistrationToken-test.tsx b/test/components/views/auth/RegistrationToken-test.tsx index 92b6fcf0fc9..bbe6ebfe365 100644 --- a/test/components/views/auth/RegistrationToken-test.tsx +++ b/test/components/views/auth/RegistrationToken-test.tsx @@ -97,6 +97,10 @@ describe("InteractiveAuthComponent", function () { ); expect(onAuthFinished).toBeCalledTimes(1); - expect(onAuthFinished).toBeCalledWith(true, { a: 1 }, { clientSecret: "t35tcl1Ent5ECr3T", emailSid: null }); + expect(onAuthFinished).toBeCalledWith( + true, + { a: 1 }, + { clientSecret: "t35tcl1Ent5ECr3T", emailSid: undefined }, + ); }); }); From 284ba03a680cffe8f8a0becfcd5508c3a03c89eb Mon Sep 17 00:00:00 2001 From: Andy Balaam Date: Tue, 24 Jan 2023 10:08:43 +0000 Subject: [PATCH 15/15] Add missing type --- src/components/views/auth/InteractiveAuthEntryComponents.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/src/components/views/auth/InteractiveAuthEntryComponents.tsx index 2b0ad6063be..4a995e4d06b 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -796,7 +796,7 @@ export class SSOAuthEntry extends React.Component