matrix-react-sdk
Version:
SDK for matrix.org using React
748 lines (655 loc) • 96.2 kB
JavaScript
"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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