matrix-react-sdk
Version:
SDK for matrix.org using React
140 lines (107 loc) • 14.2 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _languageHandler = require("../../../languageHandler");
var _CountlyAnalytics = _interopRequireDefault(require("../../../CountlyAnalytics"));
var _replaceableComponent = require("../../../utils/replaceableComponent");
var _dec, _class, _class2, _temp;
const DIV_ID = 'mx_recaptcha';
/**
* A pure UI component which displays a captcha form.
*/
let CaptchaForm = (_dec = (0, _replaceableComponent.replaceableComponent)("views.auth.CaptchaForm"), _dec(_class = (_temp = _class2 = class CaptchaForm extends _react.default.Component {
constructor(props) {
super(props);
this.state = {
errorText: null
};
this._captchaWidgetId = null;
this._recaptchaContainer = /*#__PURE__*/(0, _react.createRef)();
_CountlyAnalytics.default.instance.track("onboarding_grecaptcha_begin");
}
componentDidMount() {
// Just putting a script tag into the returned jsx doesn't work, annoyingly,
// so we do this instead.
if (global.grecaptcha) {
// already loaded
this._onCaptchaLoaded();
} else {
console.log("Loading recaptcha script...");
window.mx_on_recaptcha_loaded = () => {
this._onCaptchaLoaded();
};
const scriptTag = document.createElement('script');
scriptTag.setAttribute('src', `https://www.recaptcha.net/recaptcha/api.js?onload=mx_on_recaptcha_loaded&render=explicit`);
this._recaptchaContainer.current.appendChild(scriptTag);
}
}
componentWillUnmount() {
this._resetRecaptcha();
}
_renderRecaptcha(divId) {
if (!global.grecaptcha) {
console.error("grecaptcha not loaded!");
throw new Error("Recaptcha did not load successfully");
}
const publicKey = this.props.sitePublicKey;
if (!publicKey) {
console.error("No public key for recaptcha!");
throw new Error("This server has not supplied enough information for Recaptcha " + "authentication");
}
console.info("Rendering to %s", divId);
this._captchaWidgetId = global.grecaptcha.render(divId, {
sitekey: publicKey,
callback: this.props.onCaptchaResponse
});
}
_resetRecaptcha() {
if (this._captchaWidgetId !== null) {
global.grecaptcha.reset(this._captchaWidgetId);
}
}
_onCaptchaLoaded() {
console.log("Loaded recaptcha script.");
try {
this._renderRecaptcha(DIV_ID); // clear error if re-rendered
this.setState({
errorText: null
});
_CountlyAnalytics.default.instance.track("onboarding_grecaptcha_loaded");
} catch (e) {
this.setState({
errorText: e.toString()
});
_CountlyAnalytics.default.instance.track("onboarding_grecaptcha_error", {
error: e.toString()
});
}
}
render() {
let error = null;
if (this.state.errorText) {
error = /*#__PURE__*/_react.default.createElement("div", {
className: "error"
}, this.state.errorText);
}
return /*#__PURE__*/_react.default.createElement("div", {
ref: this._recaptchaContainer
}, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("This homeserver would like to make sure you are not a robot.")), /*#__PURE__*/_react.default.createElement("div", {
id: DIV_ID
}), error);
}
}, (0, _defineProperty2.default)(_class2, "propTypes", {
sitePublicKey: _propTypes.default.string,
// called with the captcha response
onCaptchaResponse: _propTypes.default.func
}), (0, _defineProperty2.default)(_class2, "defaultProps", {
onCaptchaResponse: () => {}
}), _temp)) || _class);
exports.default = CaptchaForm;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2F1dGgvQ2FwdGNoYUZvcm0uanMiXSwibmFtZXMiOlsiRElWX0lEIiwiQ2FwdGNoYUZvcm0iLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJzdGF0ZSIsImVycm9yVGV4dCIsIl9jYXB0Y2hhV2lkZ2V0SWQiLCJfcmVjYXB0Y2hhQ29udGFpbmVyIiwiQ291bnRseUFuYWx5dGljcyIsImluc3RhbmNlIiwidHJhY2siLCJjb21wb25lbnREaWRNb3VudCIsImdsb2JhbCIsImdyZWNhcHRjaGEiLCJfb25DYXB0Y2hhTG9hZGVkIiwiY29uc29sZSIsImxvZyIsIndpbmRvdyIsIm14X29uX3JlY2FwdGNoYV9sb2FkZWQiLCJzY3JpcHRUYWciLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJzZXRBdHRyaWJ1dGUiLCJjdXJyZW50IiwiYXBwZW5kQ2hpbGQiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsIl9yZXNldFJlY2FwdGNoYSIsIl9yZW5kZXJSZWNhcHRjaGEiLCJkaXZJZCIsImVycm9yIiwiRXJyb3IiLCJwdWJsaWNLZXkiLCJzaXRlUHVibGljS2V5IiwiaW5mbyIsInJlbmRlciIsInNpdGVrZXkiLCJjYWxsYmFjayIsIm9uQ2FwdGNoYVJlc3BvbnNlIiwicmVzZXQiLCJzZXRTdGF0ZSIsImUiLCJ0b1N0cmluZyIsIlByb3BUeXBlcyIsInN0cmluZyIsImZ1bmMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFnQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxNQUFNQSxNQUFNLEdBQUcsY0FBZjtBQUVBO0FBQ0E7QUFDQTs7SUFFcUJDLFcsV0FEcEIsZ0RBQXFCLHdCQUFyQixDLG1DQUFELE1BQ3FCQSxXQURyQixTQUN5Q0MsZUFBTUMsU0FEL0MsQ0FDeUQ7QUFZckRDLEVBQUFBLFdBQVcsQ0FBQ0MsS0FBRCxFQUFRO0FBQ2YsVUFBTUEsS0FBTjtB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QUFmLEVBQTBCO0FBQ3RCd0IsTUFBQUEsS0FBSyxnQkFDRDtBQUFLLFFBQUEsU0FBUyxFQUFDO0FBQWYsU0FDTSxLQUFLekIsS0FBTCxDQUFXQyxTQURqQixDQURKO0FBS0g7O0FBRUQsd0JBQ0k7QUFBSyxNQUFBLEdBQUcsRUFBRSxLQUFLRTtBQUFmLG9CQUNJLHdDQUFJLHlCQUNBLDhEQURBLENBQUosQ0FESixlQUlJO0FBQUssTUFBQSxFQUFFLEVBQUVUO0FBQVQsTUFKSixFQUtNK0IsS0FMTixDQURKO0FBU0g7O0FBOUdvRCxDLHNEQUNsQztBQUNmRyxFQUFBQSxhQUFhLEVBQUVVLG1CQUFVQyxNQURWO0FBR2Y7QUFDQU4sRUFBQUEsaUJBQWlCLEVBQUVLLG1CQUFVRTtBQUpkLEMsMERBT0c7QUFDbEJQLEVBQUFBLGlCQUFpQixFQUFFLE1BQU0sQ0FBRTtBQURULEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTUsIDIwMTYgT3Blbk1hcmtldCBMdGRcblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHtjcmVhdGVSZWZ9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBfdCB9IGZyb20gJy4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlcic7XG5pbXBvcnQgQ291bnRseUFuYWx5dGljcyBmcm9tIFwiLi4vLi4vLi4vQ291bnRseUFuYWx5dGljc1wiO1xuaW1wb3J0IHtyZXBsYWNlYWJsZUNvbXBvbmVudH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3JlcGxhY2VhYmxlQ29tcG9uZW50XCI7XG5cbmNvbnN0IERJVl9JRCA9ICdteF9yZWNhcHRjaGEnO1xuXG4vKipcbiAqIEEgcHVyZSBVSSBjb21wb25lbnQgd2hpY2ggZGlzcGxheXMgYSBjYXB0Y2hhIGZvcm0uXG4gKi9cbkByZXBsYWNlYWJsZUNvbXBvbmVudChcInZpZXdzLmF1dGguQ2FwdGNoYUZvcm1cIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhcHRjaGFGb3JtIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICBzaXRlUHVibGljS2V5OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gICAgICAgIC8vIGNhbGxlZCB3aXRoIHRoZSBjYXB0Y2hhIHJlc3BvbnNlXG4gICAgICAgIG9uQ2FwdGNoYVJlc3BvbnNlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICB9O1xuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgb25DYXB0Y2hhUmVzcG9uc2U6ICgpID0+IHt9LFxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGVycm9yVGV4dDogbnVsbCxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9jYXB0Y2hhV2lkZ2V0SWQgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3JlY2FwdGNoYUNvbnRhaW5lciA9IGNyZWF0ZVJlZigpO1xuXG4gICAgICAgIENvdW50bHlBbmFseXRpY3MuaW5zdGFuY2UudHJhY2soXCJvbmJvYXJkaW5nX2dyZWNhcHRjaGFfYmVnaW5cIik7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIC8vIEp1c3QgcHV0dGluZyBhIHNjcmlwdCB0YWcgaW50byB0aGUgcmV0dXJuZWQganN4IGRvZXNuJ3Qgd29yaywgYW5ub3lpbmdseSxcbiAgICAgICAgLy8gc28gd2UgZG8gdGhpcyBpbnN0ZWFkLlxuICAgICAgICBpZiAoZ2xvYmFsLmdyZWNhcHRjaGEpIHtcbiAgICAgICAgICAgIC8vIGFscmVhZHkgbG9hZGVkXG4gICAgICAgICAgICB0aGlzLl9vbkNhcHRjaGFMb2FkZWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTG9hZGluZyByZWNhcHRjaGEgc2NyaXB0Li4uXCIpO1xuICAgICAgICAgICAgd2luZG93Lm14X29uX3JlY2FwdGNoYV9sb2FkZWQgPSAoKSA9PiB7dGhpcy5fb25DYXB0Y2hhTG9hZGVkKCk7fTtcbiAgICAgICAgICAgIGNvbnN0IHNjcmlwdFRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgc2NyaXB0VGFnLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAnc3JjJywgYGh0dHBzOi8vd3d3LnJlY2FwdGNoYS5uZXQvcmVjYXB0Y2hhL2FwaS5qcz9vbmxvYWQ9bXhfb25fcmVjYXB0Y2hhX2xvYWRlZCZyZW5kZXI9ZXhwbGljaXRgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuX3JlY2FwdGNoYUNvbnRhaW5lci5jdXJyZW50LmFwcGVuZENoaWxkKHNjcmlwdFRhZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgdGhpcy5fcmVzZXRSZWNhcHRjaGEoKTtcbiAgICB9XG5cbiAgICBfcmVuZGVyUmVjYXB0Y2hhKGRpdklkKSB7XG4gICAgICAgIGlmICghZ2xvYmFsLmdyZWNhcHRjaGEpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJncmVjYXB0Y2hhIG5vdCBsb2FkZWQhXCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVjYXB0Y2hhIGRpZCBub3QgbG9hZCBzdWNjZXNzZnVsbHlcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwdWJsaWNLZXkgPSB0aGlzLnByb3BzLnNpdGVQdWJsaWNLZXk7XG4gICAgICAgIGlmICghcHVibGljS2V5KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gcHVibGljIGtleSBmb3IgcmVjYXB0Y2hhIVwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIlRoaXMgc2VydmVyIGhhcyBub3Qgc3VwcGxpZWQgZW5vdWdoIGluZm9ybWF0aW9uIGZvciBSZWNhcHRjaGEgXCJcbiAgICAgICAgICAgICAgICAgICAgKyBcImF1dGhlbnRpY2F0aW9uXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5pbmZvKFwiUmVuZGVyaW5nIHRvICVzXCIsIGRpdklkKTtcbiAgICAgICAgdGhpcy5fY2FwdGNoYVdpZGdldElkID0gZ2xvYmFsLmdyZWNhcHRjaGEucmVuZGVyKGRpdklkLCB7XG4gICAgICAgICAgICBzaXRla2V5OiBwdWJsaWNLZXksXG4gICAgICAgICAgICBjYWxsYmFjazogdGhpcy5wcm9wcy5vbkNhcHRjaGFSZXNwb25zZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3Jlc2V0UmVjYXB0Y2hhKCkge1xuICAgICAgICBpZiAodGhpcy5fY2FwdGNoYVdpZGdldElkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBnbG9iYWwuZ3JlY2FwdGNoYS5yZXNldCh0aGlzLl9jYXB0Y2hhV2lkZ2V0SWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uQ2FwdGNoYUxvYWRlZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJMb2FkZWQgcmVjYXB0Y2hhIHNjcmlwdC5cIik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJSZWNhcHRjaGEoRElWX0lEKTtcbiAgICAgICAgICAgIC8vIGNsZWFyIGVycm9yIGlmIHJlLXJlbmRlcmVkXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBlcnJvclRleHQ6IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIENvdW50bHlBbmFseXRpY3MuaW5zdGFuY2UudHJhY2soXCJvbmJvYXJkaW5nX2dyZWNhcHRjaGFfbG9hZGVkXCIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBlcnJvclRleHQ6IGUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgQ291bnRseUFuYWx5dGljcy5pbnN0YW5jZS50cmFjayhcIm9uYm9hcmRpbmdfZ3JlY2FwdGNoYV9lcnJvclwiLCB7IGVycm9yOiBlLnRvU3RyaW5nKCkgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCBlcnJvciA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmVycm9yVGV4dCkge1xuICAgICAgICAgICAgZXJyb3IgPSAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJlcnJvclwiPlxuICAgICAgICAgICAgICAgICAgICB7IHRoaXMuc3RhdGUuZXJyb3JUZXh0IH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiByZWY9e3RoaXMuX3JlY2FwdGNoYUNvbnRhaW5lcn0+XG4gICAgICAgICAgICAgICAgPHA+e190KFxuICAgICAgICAgICAgICAgICAgICBcIlRoaXMgaG9tZXNlcnZlciB3b3VsZCBsaWtlIHRvIG1ha2Ugc3VyZSB5b3UgYXJlIG5vdCBhIHJvYm90LlwiLFxuICAgICAgICAgICAgICAgICl9PC9wPlxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9e0RJVl9JRH0gLz5cbiAgICAgICAgICAgICAgICB7IGVycm9yIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==