diff --git a/src/Signup.js b/src/Signup.js index a76919f34e..f148ac2419 100644 --- a/src/Signup.js +++ b/src/Signup.js @@ -191,7 +191,7 @@ class Register extends Signup { } } if (poll_for_success) { - return q.delay(5000).then(function() { + return q.delay(2000).then(function() { return self._tryRegister(client, authDict, poll_for_success); }); } else { diff --git a/src/SignupStages.js b/src/SignupStages.js index 283b11afef..06401da218 100644 --- a/src/SignupStages.js +++ b/src/SignupStages.js @@ -52,7 +52,13 @@ DummyStage.TYPE = "m.login.dummy"; class RecaptchaStage extends Stage { constructor(matrixClient, signupInstance) { super(RecaptchaStage.TYPE, matrixClient, signupInstance); - this.defer = q.defer(); // resolved with the captcha response + this.authDict = { + auth: { + type: 'm.login.recaptcha', + // we'll add in the response param if we get one from the local user. + }, + poll_for_success: true, + }; } // called when the recaptcha has been completed. @@ -60,16 +66,15 @@ class RecaptchaStage extends Stage { if (!data || !data.response) { return; } - this.defer.resolve({ - auth: { - type: 'm.login.recaptcha', - response: data.response, - } - }); + this.authDict.response = data.response; } complete() { - return this.defer.promise; + // we return the authDict with no response, telling Signup to keep polling + // the server in case the captcha is filled in on another window (e.g. by + // following a nextlink from an email signup). If the user completes the + // captcha locally, then we return at the next poll. + return q(this.authDict); } } RecaptchaStage.TYPE = "m.login.recaptcha"; diff --git a/src/components/structures/login/Registration.js b/src/components/structures/login/Registration.js index 5071a6b4c6..269aabed9b 100644 --- a/src/components/structures/login/Registration.js +++ b/src/components/structures/login/Registration.js @@ -273,6 +273,7 @@ module.exports = React.createClass({ if (serverParams && serverParams["m.login.recaptcha"]) { publicKey = serverParams["m.login.recaptcha"].public_key; } + registerStep = ( {this._onCaptchaLoaded()}; - var protocol = global.location.protocol === "file:" ? "https:" : global.location.protocol; - scriptTag.setAttribute( - 'src', protocol+"//www.google.com/recaptcha/api.js?onload=mx_on_recaptcha_loaded&render=explicit" - ); - this.refs.recaptchaContainer.appendChild(scriptTag); + var protocol = global.location.protocol; + if (protocol === "file:") { + var warning = document.createElement('div'); + // XXX: fix hardcoded app URL. Better solutions include: + // * jumping straight to a hosted captcha page (but we don't support that yet) + // * embedding the captcha in an iframe (if that works) + // * using a better captcha lib + warning.innerHTML = "Robot check is currently unavailable on desktop - please sign up using a web browser."; + this.refs.recaptchaContainer.appendChild(warning); + } + else { + var scriptTag = document.createElement('script'); + scriptTag.setAttribute( + 'src', protocol+"//www.google.com/recaptcha/api.js?onload=mx_on_recaptcha_loaded&render=explicit" + ); + this.refs.recaptchaContainer.appendChild(scriptTag); + } } }, @@ -107,6 +118,7 @@ module.exports = React.createClass({ return (
This Home Server would like to make sure you are not a robot +
{error}