2022-01-11 09:14:08 +00:00
|
|
|
/*
|
|
|
|
* Global Captcha that is valid sitewide
|
|
|
|
* via api/captcha
|
|
|
|
* Displayed in an Alert
|
|
|
|
*/
|
|
|
|
|
|
|
|
import React, { useState } from 'react';
|
|
|
|
import { t } from 'ttag';
|
|
|
|
|
|
|
|
import Captcha from './Captcha';
|
2022-10-03 10:47:03 +00:00
|
|
|
import socketClient from '../socket/SocketClient';
|
2022-09-21 22:55:13 +00:00
|
|
|
import {
|
|
|
|
requestBanMe,
|
|
|
|
} from '../store/actions/fetch';
|
2022-01-11 09:14:08 +00:00
|
|
|
|
|
|
|
const GlobalCaptcha = ({ close }) => {
|
2022-10-03 10:47:03 +00:00
|
|
|
const [error, setError] = useState(null);
|
|
|
|
const [submitting, setSubmitting] = useState(false);
|
2022-09-21 22:55:13 +00:00
|
|
|
const [legit, setLegit] = useState(false);
|
2022-01-11 09:14:08 +00:00
|
|
|
// used to be able to force Captcha rerender on error
|
|
|
|
const [captKey, setCaptKey] = useState(Date.now());
|
|
|
|
|
|
|
|
return (
|
|
|
|
<form
|
|
|
|
onSubmit={async (e) => {
|
|
|
|
e.preventDefault();
|
2022-10-02 20:46:12 +00:00
|
|
|
const text = e.target.captcha.value.slice(0, 6);
|
2022-10-03 10:47:03 +00:00
|
|
|
if (submitting || !text) {
|
2022-09-22 21:54:39 +00:00
|
|
|
return;
|
|
|
|
}
|
2022-10-12 11:01:02 +00:00
|
|
|
// detect suspiciously solved captcha
|
|
|
|
if (!legit) {
|
2022-09-23 14:32:05 +00:00
|
|
|
await requestBanMe(2);
|
2022-09-21 22:55:13 +00:00
|
|
|
}
|
|
|
|
// ----
|
2022-01-11 09:14:08 +00:00
|
|
|
const captchaid = e.target.captchaid.value;
|
2022-10-03 10:47:03 +00:00
|
|
|
let errorText;
|
|
|
|
try {
|
|
|
|
setSubmitting(true);
|
|
|
|
const retCode = await socketClient
|
|
|
|
.sendCaptchaSolution(text, captchaid);
|
|
|
|
switch (retCode) {
|
|
|
|
case 0:
|
|
|
|
close();
|
|
|
|
return;
|
|
|
|
case 1:
|
|
|
|
errorText = t`You took too long, try again.`;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
errorText = t`You failed your captcha`;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
errorText = t`No or invalid captcha text`;
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
errorText = t`No captcha id given`;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
errorText = t`Unknown Captcha Error`;
|
|
|
|
}
|
|
|
|
} catch (err) {
|
|
|
|
errorText = `${err.message}`;
|
2022-01-11 09:14:08 +00:00
|
|
|
}
|
2022-10-03 10:47:03 +00:00
|
|
|
setSubmitting(false);
|
|
|
|
setCaptKey(Date.now());
|
|
|
|
setError(errorText);
|
2022-01-11 09:14:08 +00:00
|
|
|
}}
|
|
|
|
>
|
2022-10-03 10:47:03 +00:00
|
|
|
{(error) && (
|
2022-01-11 09:14:08 +00:00
|
|
|
<p key={error} className="errormessage">
|
|
|
|
<span>{t`Error`}</span>: {error}
|
|
|
|
</p>
|
2022-10-03 10:47:03 +00:00
|
|
|
)}
|
2022-09-21 22:55:13 +00:00
|
|
|
<Captcha autoload key={captKey} setLegit={setLegit} />
|
2022-01-11 09:14:08 +00:00
|
|
|
<p>
|
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
onClick={close}
|
|
|
|
>
|
|
|
|
{t`Cancel`}
|
|
|
|
</button>
|
|
|
|
|
|
|
|
<button
|
|
|
|
type="submit"
|
|
|
|
>
|
2022-10-03 10:47:03 +00:00
|
|
|
{(submitting) ? '...' : t`Send`}
|
2022-01-11 09:14:08 +00:00
|
|
|
</button>
|
|
|
|
</p>
|
|
|
|
</form>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default React.memo(GlobalCaptcha);
|