ask electron users to do captchas in a web browser.

This will happen anyway when they follow email verification links.
make captchas poll for success so if they are completed elsewhere, electron moves on
This commit is contained in:
Matthew Hodgson 2016-12-24 03:15:30 +00:00
parent b1c4c759f4
commit 69b277b282
4 changed files with 33 additions and 15 deletions

View File

@ -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 {

View File

@ -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";

View File

@ -273,6 +273,7 @@ module.exports = React.createClass({
if (serverParams && serverParams["m.login.recaptcha"]) {
publicKey = serverParams["m.login.recaptcha"].public_key;
}
registerStep = (
<CaptchaForm sitePublicKey={publicKey}
onCaptchaResponse={this.onCaptchaResponse}

View File

@ -52,14 +52,25 @@ module.exports = React.createClass({
this._onCaptchaLoaded();
} else {
console.log("Loading recaptcha script...");
var scriptTag = document.createElement('script');
window.mx_on_recaptcha_loaded = () => {this._onCaptchaLoaded()};
var protocol = global.location.protocol === "file:" ? "https:" : global.location.protocol;
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 <a href='https://riot.im/app'>using a web browser</a>.";
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);
}
}
},
_renderRecaptcha: function(divId) {
@ -107,6 +118,7 @@ module.exports = React.createClass({
return (
<div ref="recaptchaContainer">
This Home Server would like to make sure you are not a robot
<br/>
<div id={DIV_ID}></div>
{error}
</div>