UNPKG

matrix-react-sdk

Version:
748 lines (655 loc) • 96.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = getEntryComponentForLoginType; exports.FallbackAuthEntry = exports.SSOAuthEntry = exports.MsisdnAuthEntry = exports.EmailIdentityAuthEntry = exports.TermsAuthEntry = exports.RecaptchaAuthEntry = exports.PasswordAuthEntry = exports.DEFAULT_PHASE = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _classnames = _interopRequireDefault(require("classnames")); var sdk = _interopRequireWildcard(require("../../../index")); var _languageHandler = require("../../../languageHandler"); var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore")); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _Spinner = _interopRequireDefault(require("../elements/Spinner")); var _CountlyAnalytics = _interopRequireDefault(require("../../../CountlyAnalytics")); var _replaceableComponent = require("../../../utils/replaceableComponent"); var _dec, _class, _class2, _temp, _dec2, _class3, _class4, _temp2, _dec3, _class5, _class6, _temp3, _dec4, _class7, _class8, _temp4, _dec5, _class9, _class10, _temp5, _dec6, _class11, _class12, _temp6, _dec7, _class13, _class14, _temp7; /* This file contains a collection of components which are used by the * InteractiveAuth to prompt the user to enter the information needed * for an auth stage. (The intention is that they could also be used for other * components, such as the registration flow). * * Call getEntryComponentForLoginType() to get a component suitable for a * particular login type. Each component requires the same properties: * * matrixClient: A matrix client. May be a different one to the one * currently being used generally (eg. to register with * one HS whilst beign a guest on another). * loginType: the login type of the auth stage being attempted * authSessionId: session id from the server * clientSecret: The client secret in use for ID server auth sessions * stageParams: params from the server for the stage being attempted * errorText: error message from a previous attempt to authenticate * submitAuthDict: a function which will be called with the new auth dict * busy: a boolean indicating whether the auth logic is doing something * the user needs to wait for. * inputs: Object of inputs provided by the user, as in js-sdk * interactive-auth * stageState: Stage-specific object used for communicating state information * to the UI from the state-specific auth logic. * Defined keys for stages are: * m.login.email.identity: * * emailSid: string representing the sid of the active * verification session from the ID server, or * null if no session is active. * fail: a function which should be called with an error object if an * error occurred during the auth stage. This will cause the auth * session to be failed and the process to go back to the start. * setEmailSid: m.login.email.identity only: a function to be called with the * email sid after a token is requested. * onPhaseChange: A function which is called when the stage's phase changes. If * the stage has no phases, call this with DEFAULT_PHASE. Takes * one argument, the phase, and is always defined/required. * continueText: For stages which have a continue button, the text to use. * continueKind: For stages which have a continue button, the style of button to * use. For example, 'danger' or 'primary'. * onCancel A function with no arguments which is called by the stage if the * user knowingly cancelled/dismissed the authentication attempt. * * Each component may also provide the following functions (beyond the standard React ones): * focus: set the input focus appropriately in the form. */ const DEFAULT_PHASE = 0; exports.DEFAULT_PHASE = DEFAULT_PHASE; let PasswordAuthEntry = (_dec = (0, _replaceableComponent.replaceableComponent)("views.auth.PasswordAuthEntry"), _dec(_class = (_temp = _class2 = class PasswordAuthEntry extends _react.default.Component { constructor(...args) { super(...args); (0, _defineProperty2.default)(this, "state", { password: "" }); (0, _defineProperty2.default)(this, "_onSubmit", e => { e.preventDefault(); if (this.props.busy) return; this.props.submitAuthDict({ type: PasswordAuthEntry.LOGIN_TYPE, // TODO: Remove `user` once servers support proper UIA // See https://github.com/vector-im/element-web/issues/10312 user: this.props.matrixClient.credentials.userId, identifier: { type: "m.id.user", user: this.props.matrixClient.credentials.userId }, password: this.state.password }); }); (0, _defineProperty2.default)(this, "_onPasswordFieldChange", ev => { // enable the submit button iff the password is non-empty this.setState({ password: ev.target.value }); }); } componentDidMount() { this.props.onPhaseChange(DEFAULT_PHASE); } render() { const passwordBoxClass = (0, _classnames.default)({ "error": this.props.errorText }); let submitButtonOrSpinner; if (this.props.busy) { const Loader = sdk.getComponent("elements.Spinner"); submitButtonOrSpinner = /*#__PURE__*/_react.default.createElement(Loader, null); } else { submitButtonOrSpinner = /*#__PURE__*/_react.default.createElement("input", { type: "submit", className: "mx_Dialog_primary", disabled: !this.state.password, value: (0, _languageHandler._t)("Continue") }); } let errorSection; if (this.props.errorText) { errorSection = /*#__PURE__*/_react.default.createElement("div", { className: "error", role: "alert" }, this.props.errorText); } const Field = sdk.getComponent('elements.Field'); return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Confirm your identity by entering your account password below.")), /*#__PURE__*/_react.default.createElement("form", { onSubmit: this._onSubmit, className: "mx_InteractiveAuthEntryComponents_passwordSection" }, /*#__PURE__*/_react.default.createElement(Field, { className: passwordBoxClass, type: "password", name: "passwordField", label: (0, _languageHandler._t)('Password'), autoFocus: true, value: this.state.password, onChange: this._onPasswordFieldChange }), /*#__PURE__*/_react.default.createElement("div", { className: "mx_button_row" }, submitButtonOrSpinner)), errorSection); } }, (0, _defineProperty2.default)(_class2, "LOGIN_TYPE", "m.login.password"), (0, _defineProperty2.default)(_class2, "propTypes", { matrixClient: _propTypes.default.object.isRequired, submitAuthDict: _propTypes.default.func.isRequired, errorText: _propTypes.default.string, // is the auth logic currently waiting for something to // happen? busy: _propTypes.default.bool, onPhaseChange: _propTypes.default.func.isRequired }), _temp)) || _class); exports.PasswordAuthEntry = PasswordAuthEntry; let RecaptchaAuthEntry = (_dec2 = (0, _replaceableComponent.replaceableComponent)("views.auth.RecaptchaAuthEntry"), _dec2(_class3 = (_temp2 = _class4 = class RecaptchaAuthEntry extends _react.default.Component { constructor(...args) { super(...args); (0, _defineProperty2.default)(this, "_onCaptchaResponse", response => { _CountlyAnalytics.default.instance.track("onboarding_grecaptcha_submit"); this.props.submitAuthDict({ type: RecaptchaAuthEntry.LOGIN_TYPE, response: response }); }); } componentDidMount() { this.props.onPhaseChange(DEFAULT_PHASE); } render() { if (this.props.busy) { const Loader = sdk.getComponent("elements.Spinner"); return /*#__PURE__*/_react.default.createElement(Loader, null); } let errorText = this.props.errorText; const CaptchaForm = sdk.getComponent("views.auth.CaptchaForm"); let sitePublicKey; if (!this.props.stageParams || !this.props.stageParams.public_key) { errorText = (0, _languageHandler._t)("Missing captcha public key in homeserver configuration. Please report " + "this to your homeserver administrator."); } else { sitePublicKey = this.props.stageParams.public_key; } let errorSection; if (errorText) { errorSection = /*#__PURE__*/_react.default.createElement("div", { className: "error", role: "alert" }, errorText); } return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(CaptchaForm, { sitePublicKey: sitePublicKey, onCaptchaResponse: this._onCaptchaResponse }), errorSection); } }, (0, _defineProperty2.default)(_class4, "LOGIN_TYPE", "m.login.recaptcha"), (0, _defineProperty2.default)(_class4, "propTypes", { submitAuthDict: _propTypes.default.func.isRequired, stageParams: _propTypes.default.object.isRequired, errorText: _propTypes.default.string, busy: _propTypes.default.bool, onPhaseChange: _propTypes.default.func.isRequired }), _temp2)) || _class3); exports.RecaptchaAuthEntry = RecaptchaAuthEntry; let TermsAuthEntry = (_dec3 = (0, _replaceableComponent.replaceableComponent)("views.auth.TermsAuthEntry"), _dec3(_class5 = (_temp3 = _class6 = class TermsAuthEntry extends _react.default.Component { constructor(props) { super(props); // example stageParams: // // { // "policies": { // "privacy_policy": { // "version": "1.0", // "en": { // "name": "Privacy Policy", // "url": "https://example.org/privacy-1.0-en.html", // }, // "fr": { // "name": "Politique de confidentialité", // "url": "https://example.org/privacy-1.0-fr.html", // }, // }, // "other_policy": { ... }, // } // } (0, _defineProperty2.default)(this, "tryContinue", () => { this._trySubmit(); }); (0, _defineProperty2.default)(this, "_trySubmit", () => { let allChecked = true; for (const policy of this.state.policies) { const checked = this.state.toggledPolicies[policy.id]; allChecked = allChecked && checked; } if (allChecked) { this.props.submitAuthDict({ type: TermsAuthEntry.LOGIN_TYPE }); _CountlyAnalytics.default.instance.track("onboarding_terms_complete"); } else { this.setState({ errorText: (0, _languageHandler._t)("Please review and accept all of the homeserver's policies") }); } }); const allPolicies = this.props.stageParams.policies || {}; const prefLang = _SettingsStore.default.getValue("language"); const initToggles = {}; const pickedPolicies = []; for (const policyId of Object.keys(allPolicies)) { const policy = allPolicies[policyId]; // Pick a language based on the user's language, falling back to english, // and finally to the first language available. If there's still no policy // available then the homeserver isn't respecting the spec. let langPolicy = policy[prefLang]; if (!langPolicy) langPolicy = policy["en"]; if (!langPolicy) { // last resort const firstLang = Object.keys(policy).find(e => e !== "version"); langPolicy = policy[firstLang]; } if (!langPolicy) throw new Error("Failed to find a policy to show the user"); initToggles[policyId] = false; langPolicy.id = policyId; pickedPolicies.push(langPolicy); } this.state = { toggledPolicies: initToggles, policies: pickedPolicies }; _CountlyAnalytics.default.instance.track("onboarding_terms_begin"); } componentDidMount() { this.props.onPhaseChange(DEFAULT_PHASE); } _togglePolicy(policyId) { const newToggles = {}; for (const policy of this.state.policies) { let checked = this.state.toggledPolicies[policy.id]; if (policy.id === policyId) checked = !checked; newToggles[policy.id] = checked; } this.setState({ "toggledPolicies": newToggles }); } render() { if (this.props.busy) { const Loader = sdk.getComponent("elements.Spinner"); return /*#__PURE__*/_react.default.createElement(Loader, null); } const checkboxes = []; let allChecked = true; for (const policy of this.state.policies) { const checked = this.state.toggledPolicies[policy.id]; allChecked = allChecked && checked; checkboxes.push( /*#__PURE__*/ // XXX: replace with StyledCheckbox _react.default.createElement("label", { key: "policy_checkbox_" + policy.id, className: "mx_InteractiveAuthEntryComponents_termsPolicy" }, /*#__PURE__*/_react.default.createElement("input", { type: "checkbox", onChange: () => this._togglePolicy(policy.id), checked: checked }), /*#__PURE__*/_react.default.createElement("a", { href: policy.url, target: "_blank", rel: "noreferrer noopener" }, policy.name))); } let errorSection; if (this.props.errorText || this.state.errorText) { errorSection = /*#__PURE__*/_react.default.createElement("div", { className: "error", role: "alert" }, this.props.errorText || this.state.errorText); } let submitButton; if (this.props.showContinue !== false) { // XXX: button classes submitButton = /*#__PURE__*/_react.default.createElement("button", { className: "mx_InteractiveAuthEntryComponents_termsSubmit mx_GeneralButton", onClick: this._trySubmit, disabled: !allChecked }, (0, _languageHandler._t)("Accept")); } return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Please review and accept the policies of this homeserver:")), checkboxes, errorSection, submitButton); } }, (0, _defineProperty2.default)(_class6, "LOGIN_TYPE", "m.login.terms"), (0, _defineProperty2.default)(_class6, "propTypes", { submitAuthDict: _propTypes.default.func.isRequired, stageParams: _propTypes.default.object.isRequired, errorText: _propTypes.default.string, busy: _propTypes.default.bool, showContinue: _propTypes.default.bool, onPhaseChange: _propTypes.default.func.isRequired }), _temp3)) || _class5); exports.TermsAuthEntry = TermsAuthEntry; let EmailIdentityAuthEntry = (_dec4 = (0, _replaceableComponent.replaceableComponent)("views.auth.EmailIdentityAuthEntry"), _dec4(_class7 = (_temp4 = _class8 = class EmailIdentityAuthEntry extends _react.default.Component { componentDidMount() { this.props.onPhaseChange(DEFAULT_PHASE); } render() { // This component is now only displayed once the token has been requested, // so we know the email has been sent. It can also get loaded after the user // has clicked the validation link if the server takes a while to propagate // the validation internally. If we're in the session spawned from clicking // the validation link, we won't know the email address, so if we don't have it, // assume that the link has been clicked and the server will realise when we poll. if (this.props.inputs.emailAddress === undefined) { return /*#__PURE__*/_react.default.createElement(_Spinner.default, null); } else if (this.props.stageState?.emailSid) { // we only have a session ID if the user has clicked the link in their email, // so show a loading state instead of "an email has been sent to..." because // that's confusing when you've already read that email. return /*#__PURE__*/_react.default.createElement(_Spinner.default, null); } else { return /*#__PURE__*/_react.default.createElement("div", { className: "mx_InteractiveAuthEntryComponents_emailWrapper" }, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("A confirmation email has been sent to %(emailAddress)s", { emailAddress: sub => /*#__PURE__*/_react.default.createElement("b", null, this.props.inputs.emailAddress) })), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Open the link in the email to continue registration."))); } } }, (0, _defineProperty2.default)(_class8, "LOGIN_TYPE", "m.login.email.identity"), (0, _defineProperty2.default)(_class8, "propTypes", { matrixClient: _propTypes.default.object.isRequired, submitAuthDict: _propTypes.default.func.isRequired, authSessionId: _propTypes.default.string.isRequired, clientSecret: _propTypes.default.string.isRequired, inputs: _propTypes.default.object.isRequired, stageState: _propTypes.default.object.isRequired, fail: _propTypes.default.func.isRequired, setEmailSid: _propTypes.default.func.isRequired, onPhaseChange: _propTypes.default.func.isRequired }), _temp4)) || _class7); exports.EmailIdentityAuthEntry = EmailIdentityAuthEntry; let MsisdnAuthEntry = (_dec5 = (0, _replaceableComponent.replaceableComponent)("views.auth.MsisdnAuthEntry"), _dec5(_class9 = (_temp5 = _class10 = class MsisdnAuthEntry extends _react.default.Component { constructor(...args) { super(...args); (0, _defineProperty2.default)(this, "state", { token: '', requestingToken: false }); (0, _defineProperty2.default)(this, "_onTokenChange", e => { this.setState({ token: e.target.value }); }); (0, _defineProperty2.default)(this, "_onFormSubmit", async e => { e.preventDefault(); if (this.state.token == '') return; this.setState({ errorText: null }); try { let result; if (this._submitUrl) { result = await this.props.matrixClient.submitMsisdnTokenOtherUrl(this._submitUrl, this._sid, this.props.clientSecret, this.state.token); } else { throw new Error("The registration with MSISDN flow is misconfigured"); } if (result.success) { const creds = { sid: this._sid, client_secret: this.props.clientSecret }; this.props.submitAuthDict({ type: MsisdnAuthEntry.LOGIN_TYPE, // TODO: Remove `threepid_creds` once servers support proper UIA // See https://github.com/vector-im/element-web/issues/10312 // See https://github.com/matrix-org/matrix-doc/issues/2220 threepid_creds: creds, threepidCreds: creds }); } else { this.setState({ errorText: (0, _languageHandler._t)("Token incorrect") }); } } catch (e) { this.props.fail(e); console.log("Failed to submit msisdn token"); } }); } componentDidMount() { this.props.onPhaseChange(DEFAULT_PHASE); this._submitUrl = null; this._sid = null; this._msisdn = null; this._tokenBox = null; this.setState({ requestingToken: true }); this._requestMsisdnToken().catch(e => { this.props.fail(e); }).finally(() => { this.setState({ requestingToken: false }); }); } /* * Requests a verification token by SMS. */ _requestMsisdnToken() { return this.props.matrixClient.requestRegisterMsisdnToken(this.props.inputs.phoneCountry, this.props.inputs.phoneNumber, this.props.clientSecret, 1 // TODO: Multiple send attempts? ).then(result => { this._submitUrl = result.submit_url; this._sid = result.sid; this._msisdn = result.msisdn; }); } render() { if (this.state.requestingToken) { const Loader = sdk.getComponent("elements.Spinner"); return /*#__PURE__*/_react.default.createElement(Loader, null); } else { const enableSubmit = Boolean(this.state.token); const submitClasses = (0, _classnames.default)({ mx_InteractiveAuthEntryComponents_msisdnSubmit: true, mx_GeneralButton: true }); let errorSection; if (this.state.errorText) { errorSection = /*#__PURE__*/_react.default.createElement("div", { className: "error", role: "alert" }, this.state.errorText); } return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("A text message has been sent to %(msisdn)s", { msisdn: /*#__PURE__*/_react.default.createElement("i", null, this._msisdn) })), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Please enter the code it contains:")), /*#__PURE__*/_react.default.createElement("div", { className: "mx_InteractiveAuthEntryComponents_msisdnWrapper" }, /*#__PURE__*/_react.default.createElement("form", { onSubmit: this._onFormSubmit }, /*#__PURE__*/_react.default.createElement("input", { type: "text", className: "mx_InteractiveAuthEntryComponents_msisdnEntry", value: this.state.token, onChange: this._onTokenChange, "aria-label": (0, _languageHandler._t)("Code") }), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("input", { type: "submit", value: (0, _languageHandler._t)("Submit"), className: submitClasses, disabled: !enableSubmit })), errorSection)); } } }, (0, _defineProperty2.default)(_class10, "LOGIN_TYPE", "m.login.msisdn"), (0, _defineProperty2.default)(_class10, "propTypes", { inputs: _propTypes.default.shape({ phoneCountry: _propTypes.default.string, phoneNumber: _propTypes.default.string }), fail: _propTypes.default.func, clientSecret: _propTypes.default.func, submitAuthDict: _propTypes.default.func.isRequired, matrixClient: _propTypes.default.object, onPhaseChange: _propTypes.default.func.isRequired }), _temp5)) || _class9); exports.MsisdnAuthEntry = MsisdnAuthEntry; let SSOAuthEntry = (_dec6 = (0, _replaceableComponent.replaceableComponent)("views.auth.SSOAuthEntry"), _dec6(_class11 = (_temp6 = _class12 = class SSOAuthEntry extends _react.default.Component { // button to start SSO // button to confirm SSO completed constructor(props) { super(props); // We actually send the user through fallback auth so we don't have to // deal with a redirect back to us, losing application context. (0, _defineProperty2.default)(this, "_ssoUrl", void 0); (0, _defineProperty2.default)(this, "attemptFailed", () => { this.setState({ attemptFailed: true }); }); (0, _defineProperty2.default)(this, "_onReceiveMessage", event => { if (event.data === "authDone" && event.origin === this.props.matrixClient.getHomeserverUrl()) { if (this._popupWindow) { this._popupWindow.close(); this._popupWindow = null; } } }); (0, _defineProperty2.default)(this, "onStartAuthClick", () => { // Note: We don't use PlatformPeg's startSsoAuth functions because we almost // certainly will need to open the thing in a new tab to avoid losing application // context. this._popupWindow = window.open(this._ssoUrl, "_blank"); this.setState({ phase: SSOAuthEntry.PHASE_POSTAUTH }); this.props.onPhaseChange(SSOAuthEntry.PHASE_POSTAUTH); }); (0, _defineProperty2.default)(this, "onConfirmClick", () => { this.props.submitAuthDict({}); }); this._ssoUrl = props.matrixClient.getFallbackAuthUrl(this.props.loginType, this.props.authSessionId); this._popupWindow = null; window.addEventListener("message", this._onReceiveMessage); this.state = { phase: SSOAuthEntry.PHASE_PREAUTH, attemptFailed: false }; } componentDidMount() /*: void*/ { this.props.onPhaseChange(SSOAuthEntry.PHASE_PREAUTH); } componentWillUnmount() { window.removeEventListener("message", this._onReceiveMessage); if (this._popupWindow) { this._popupWindow.close(); this._popupWindow = null; } } render() { let continueButton = null; const cancelButton = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: this.props.onCancel, kind: this.props.continueKind ? this.props.continueKind + '_outline' : 'primary_outline' }, (0, _languageHandler._t)("Cancel")); if (this.state.phase === SSOAuthEntry.PHASE_PREAUTH) { continueButton = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: this.onStartAuthClick, kind: this.props.continueKind || 'primary' }, this.props.continueText || (0, _languageHandler._t)("Single Sign On")); } else { continueButton = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: this.onConfirmClick, kind: this.props.continueKind || 'primary' }, this.props.continueText || (0, _languageHandler._t)("Confirm")); } let errorSection; if (this.props.errorText) { errorSection = /*#__PURE__*/_react.default.createElement("div", { className: "error", role: "alert" }, this.props.errorText); } else if (this.state.attemptFailed) { errorSection = /*#__PURE__*/_react.default.createElement("div", { className: "error", role: "alert" }, (0, _languageHandler._t)("Something went wrong in confirming your identity. Cancel and try again.")); } return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, errorSection, /*#__PURE__*/_react.default.createElement("div", { className: "mx_InteractiveAuthEntryComponents_sso_buttons" }, cancelButton, continueButton)); } }, (0, _defineProperty2.default)(_class12, "propTypes", { matrixClient: _propTypes.default.object.isRequired, authSessionId: _propTypes.default.string.isRequired, loginType: _propTypes.default.string.isRequired, submitAuthDict: _propTypes.default.func.isRequired, errorText: _propTypes.default.string, onPhaseChange: _propTypes.default.func.isRequired, continueText: _propTypes.default.string, continueKind: _propTypes.default.string, onCancel: _propTypes.default.func }), (0, _defineProperty2.default)(_class12, "LOGIN_TYPE", "m.login.sso"), (0, _defineProperty2.default)(_class12, "UNSTABLE_LOGIN_TYPE", "org.matrix.login.sso"), (0, _defineProperty2.default)(_class12, "PHASE_PREAUTH", 1), (0, _defineProperty2.default)(_class12, "PHASE_POSTAUTH", 2), _temp6)) || _class11); exports.SSOAuthEntry = SSOAuthEntry; let FallbackAuthEntry = (_dec7 = (0, _replaceableComponent.replaceableComponent)("views.auth.FallbackAuthEntry"), _dec7(_class13 = (_temp7 = _class14 = class FallbackAuthEntry extends _react.default.Component { constructor(props) { super(props); // we have to make the user click a button, as browsers will block // the popup if we open it immediately. (0, _defineProperty2.default)(this, "focus", () => { if (this._fallbackButton.current) { this._fallbackButton.current.focus(); } }); (0, _defineProperty2.default)(this, "_onShowFallbackClick", e => { e.preventDefault(); e.stopPropagation(); const url = this.props.matrixClient.getFallbackAuthUrl(this.props.loginType, this.props.authSessionId); this._popupWindow = window.open(url, "_blank"); }); (0, _defineProperty2.default)(this, "_onReceiveMessage", event => { if (event.data === "authDone" && event.origin === this.props.matrixClient.getHomeserverUrl()) { this.props.submitAuthDict({}); } }); this._popupWindow = null; window.addEventListener("message", this._onReceiveMessage); this._fallbackButton = /*#__PURE__*/(0, _react.createRef)(); } componentDidMount() { this.props.onPhaseChange(DEFAULT_PHASE); } componentWillUnmount() { window.removeEventListener("message", this._onReceiveMessage); if (this._popupWindow) { this._popupWindow.close(); } } render() { let errorSection; if (this.props.errorText) { errorSection = /*#__PURE__*/_react.default.createElement("div", { className: "error", role: "alert" }, this.props.errorText); } return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("a", { href: "", ref: this._fallbackButton, onClick: this._onShowFallbackClick }, (0, _languageHandler._t)("Start authentication")), errorSection); } }, (0, _defineProperty2.default)(_class14, "propTypes", { matrixClient: _propTypes.default.object.isRequired, authSessionId: _propTypes.default.string.isRequired, loginType: _propTypes.default.string.isRequired, submitAuthDict: _propTypes.default.func.isRequired, errorText: _propTypes.default.string, onPhaseChange: _propTypes.default.func.isRequired }), _temp7)) || _class13); exports.FallbackAuthEntry = FallbackAuthEntry; const AuthEntryComponents = [PasswordAuthEntry, RecaptchaAuthEntry, EmailIdentityAuthEntry, MsisdnAuthEntry, TermsAuthEntry, SSOAuthEntry]; function getEntryComponentForLoginType(loginType) { for (const c of AuthEntryComponents) { if (c.LOGIN_TYPE === loginType || c.UNSTABLE_LOGIN_TYPE === loginType) { return c; } } return FallbackAuthEntry; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2F1dGgvSW50ZXJhY3RpdmVBdXRoRW50cnlDb21wb25lbnRzLmpzIl0sIm5hbWVzIjpbIkRFRkFVTFRfUEhBU0UiLCJQYXNzd29yZEF1dGhFbnRyeSIsIlJlYWN0IiwiQ29tcG9uZW50IiwicGFzc3dvcmQiLCJlIiwicHJldmVudERlZmF1bHQiLCJwcm9wcyIsImJ1c3kiLCJzdWJtaXRBdXRoRGljdCIsInR5cGUiLCJMT0dJTl9UWVBFIiwidXNlciIsIm1hdHJpeENsaWVudCIsImNyZWRlbnRpYWxzIiwidXNlcklkIiwiaWRlbnRpZmllciIsInN0YXRlIiwiZXYiLCJzZXRTdGF0ZSIsInRhcmdldCIsInZhbHVlIiwiY29tcG9uZW50RGlkTW91bnQiLCJvblBoYXNlQ2hhbmdlIiwicmVuZGVyIiwicGFzc3dvcmRCb3hDbGFzcyIsImVycm9yVGV4dCIsInN1Ym1pdEJ1dHRvbk9yU3Bpbm5lciIsIkxvYWRlciIsInNkayIsImdldENvbXBvbmVudCIsImVycm9yU2VjdGlvbiIsIkZpZWxkIiwiX29uU3VibWl0IiwiX29uUGFzc3dvcmRGaWVsZENoYW5nZSIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJmdW5jIiwic3RyaW5nIiwiYm9vbCIsIlJlY2FwdGNoYUF1dGhFbnRyeSIsInJlc3BvbnNlIiwiQ291bnRseUFuYWx5dGljcyIsImluc3RhbmNlIiwidHJhY2siLCJDYXB0Y2hhRm9ybSIsInNpdGVQdWJsaWNLZXkiLCJzdGFnZVBhcmFtcyIsInB1YmxpY19rZXkiLCJfb25DYXB0Y2hhUmVzcG9uc2UiLCJUZXJtc0F1dGhFbnRyeSIsImNvbnN0cnVjdG9yIiwiX3RyeVN1Ym1pdCIsImFsbENoZWNrZWQiLCJwb2xpY3kiLCJwb2xpY2llcyIsImNoZWNrZWQiLCJ0b2dnbGVkUG9saWNpZXMiLCJpZCIsImFsbFBvbGljaWVzIiwicHJlZkxhbmciLCJTZXR0aW5nc1N0b3JlIiwiZ2V0VmFsdWUiLCJpbml0VG9nZ2xlcyIsInBpY2tlZFBvbGljaWVzIiwicG9saWN5SWQiLCJPYmplY3QiLCJrZXlzIiwibGFuZ1BvbGljeSIsImZpcnN0TGFuZyIsImZpbmQiLCJFcnJvciIsInB1c2giLCJfdG9nZ2xlUG9saWN5IiwibmV3VG9nZ2xlcyIsImNoZWNrYm94ZXMiLCJ1cmwiLCJuYW1lIiwic3VibWl0QnV0dG9uIiwic2hvd0NvbnRpbnVlIiwiRW1haWxJZGVudGl0eUF1dGhFbnRyeSIsImlucHV0cyIsImVtYWlsQWRkcmVzcyIsInVuZGVmaW5lZCIsInN0YWdlU3RhdGUiLCJlbWFpbFNpZCIsInN1YiIsImF1dGhTZXNzaW9uSWQiLCJjbGllbnRTZWNyZXQiLCJmYWlsIiwic2V0RW1haWxTaWQiLCJNc2lzZG5BdXRoRW50cnkiLCJ0b2tlbiIsInJlcXVlc3RpbmdUb2tlbiIsInJlc3VsdCIsIl9zdWJtaXRVcmwiLCJzdWJtaXRNc2lzZG5Ub2tlbk90aGVyVXJsIiwiX3NpZCIsInN1Y2Nlc3MiLCJjcmVkcyIsInNpZCIsImNsaWVudF9zZWNyZXQiLCJ0aHJlZXBpZF9jcmVkcyIsInRocmVlcGlkQ3JlZHMiLCJjb25zb2xlIiwibG9nIiwiX21zaXNkbiIsIl90b2tlbkJveCIsIl9yZXF1ZXN0TXNpc2RuVG9rZW4iLCJjYXRjaCIsImZpbmFsbHkiLCJyZXF1ZXN0UmVnaXN0ZXJNc2lzZG5Ub2tlbiIsInBob25lQ291bnRyeSIsInBob25lTnVtYmVyIiwidGhlbiIsInN1Ym1pdF91cmwiLCJtc2lzZG4iLCJlbmFibGVTdWJtaXQiLCJCb29sZWFuIiwic3VibWl0Q2xhc3NlcyIsIm14X0ludGVyYWN0aXZlQXV0aEVudHJ5Q29tcG9uZW50c19tc2lzZG5TdWJtaXQiLCJteF9HZW5lcmFsQnV0dG9uIiwiX29uRm9ybVN1Ym1pdCIsIl9vblRva2VuQ2hhbmdlIiwic2hhcGUiLCJTU09BdXRoRW50cnkiLCJhdHRlbXB0RmFpbGVkIiwiZXZlbnQiLCJkYXRhIiwib3JpZ2luIiwiZ2V0SG9tZXNlcnZlclVybCIsIl9wb3B1cFdpbmRvdyIsImNsb3NlIiwid2luZG93Iiwib3BlbiIsIl9zc29VcmwiLCJwaGFzZSIsIlBIQVNFX1BPU1RBVVRIIiwiZ2V0RmFsbGJhY2tBdXRoVXJsIiwibG9naW5UeXBlIiwiYWRkRXZlbnRMaXN0ZW5lciIsIl9vblJlY2VpdmVNZXNzYWdlIiwiUEhBU0VfUFJFQVVUSCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImNvbnRpbnVlQnV0dG9uIiwiY2FuY2VsQnV0dG9uIiwib25DYW5jZWwiLCJjb250aW51ZUtpbmQiLCJvblN0YXJ0QXV0aENsaWNrIiwiY29udGludWVUZXh0Iiwib25Db25maXJtQ2xpY2siLCJGYWxsYmFja0F1dGhFbnRyeSIsIl9mYWxsYmFja0J1dHRvbiIsImN1cnJlbnQiLCJmb2N1cyIsInN0b3BQcm9wYWdhdGlvbiIsIl9vblNob3dGYWxsYmFja0NsaWNrIiwiQXV0aEVudHJ5Q29tcG9uZW50cyIsImdldEVudHJ5Q29tcG9uZW50Rm9yTG9naW5UeXBlIiwiYyIsIlVOU1RBQkxFX0xPR0lOX1RZUEUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBa0JBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRU8sTUFBTUEsYUFBYSxHQUFHLENBQXRCOztJQUdNQyxpQixXQURaLGdEQUFxQiw4QkFBckIsQyxtQ0FBRCxNQUNhQSxpQkFEYixTQUN1Q0MsZUFBTUMsU0FE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