Merge pull request #601 from matrix-org/matthew/electron-captcha2

Let electron users complete captchas in a web browser
This commit is contained in:
Matthew Hodgson 2016-12-24 18:38:40 +00:00 committed by GitHub
commit cb7ef76dcb
4 changed files with 33 additions and 14 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,13 +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;
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', global.location.protocol+"//www.google.com/recaptcha/api.js?onload=mx_on_recaptcha_loaded&render=explicit"
'src', protocol+"//www.google.com/recaptcha/api.js?onload=mx_on_recaptcha_loaded&render=explicit"
);
this.refs.recaptchaContainer.appendChild(scriptTag);
}
}
},
_renderRecaptcha: function(divId) {
@ -106,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>