2020-01-02 16:58:06 +00:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @flow
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
import type { Request, Response } from 'express';
|
|
|
|
import Sequelize from 'sequelize';
|
|
|
|
|
2020-04-27 18:44:22 +00:00
|
|
|
import logger from '../../../core/logger';
|
2022-06-19 21:19:10 +00:00
|
|
|
import { RegUser } from '../../../data/sql';
|
2020-01-02 16:58:06 +00:00
|
|
|
import mailProvider from '../../../core/mail';
|
|
|
|
import getMe from '../../../core/me';
|
2020-04-27 18:44:22 +00:00
|
|
|
import { getIPFromRequest, getHostFromRequest } from '../../../utils/ip';
|
2020-01-06 11:29:33 +00:00
|
|
|
import {
|
|
|
|
validateEMail,
|
|
|
|
validateName,
|
|
|
|
validatePassword,
|
|
|
|
} from '../../../utils/validation';
|
2022-01-11 09:14:08 +00:00
|
|
|
import {
|
|
|
|
checkCaptchaSolution,
|
|
|
|
} from '../../../utils/captcha';
|
2020-01-02 16:58:06 +00:00
|
|
|
|
2022-01-11 09:14:08 +00:00
|
|
|
async function validate(email, name, password, captcha, captchaid, t, gettext) {
|
2020-01-02 16:58:06 +00:00
|
|
|
const errors = [];
|
2021-01-30 21:36:53 +00:00
|
|
|
const emailerror = gettext(validateEMail(email));
|
2020-01-02 16:58:06 +00:00
|
|
|
if (emailerror) errors.push(emailerror);
|
|
|
|
const nameerror = validateName(name);
|
|
|
|
if (nameerror) errors.push(nameerror);
|
2021-01-30 12:32:46 +00:00
|
|
|
const passworderror = gettext(validatePassword(password));
|
2020-01-02 16:58:06 +00:00
|
|
|
if (passworderror) errors.push(passworderror);
|
|
|
|
|
2022-01-11 09:14:08 +00:00
|
|
|
if (!captcha || !captchaid) errors.push(t`No Captcha given`);
|
|
|
|
|
2020-01-02 16:58:06 +00:00
|
|
|
let reguser = await RegUser.findOne({ where: { email } });
|
2021-01-30 21:36:53 +00:00
|
|
|
if (reguser) errors.push(t`E-Mail already in use.`);
|
2020-01-02 16:58:06 +00:00
|
|
|
reguser = await RegUser.findOne({ where: { name } });
|
2021-01-30 21:36:53 +00:00
|
|
|
if (reguser) errors.push(t`Username already in use.`);
|
2020-01-02 16:58:06 +00:00
|
|
|
|
|
|
|
return errors;
|
|
|
|
}
|
|
|
|
|
|
|
|
export default async (req: Request, res: Response) => {
|
2022-01-11 09:14:08 +00:00
|
|
|
const {
|
|
|
|
email, name, password, captcha, captchaid,
|
|
|
|
} = req.body;
|
2021-01-30 12:32:46 +00:00
|
|
|
const { t, gettext } = req.ttag;
|
2022-01-11 09:14:08 +00:00
|
|
|
const errors = await validate(
|
|
|
|
email, name, password, captcha, captchaid, t, gettext,
|
|
|
|
);
|
|
|
|
|
|
|
|
const ip = getIPFromRequest(req);
|
|
|
|
if (!errors.length) {
|
|
|
|
const captchaPass = await checkCaptchaSolution(
|
|
|
|
captcha, ip, true, captchaid,
|
|
|
|
);
|
|
|
|
switch (captchaPass) {
|
|
|
|
case 0:
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
errors.push(t`You took too long, try again.`);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
errors.push(t`You failed your captcha`);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
errors.push(t`Unknown Captcha Error`);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-02 16:58:06 +00:00
|
|
|
if (errors.length > 0) {
|
|
|
|
res.status(400);
|
|
|
|
res.json({
|
|
|
|
errors,
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const newuser = await RegUser.create({
|
|
|
|
email,
|
|
|
|
name,
|
|
|
|
password,
|
|
|
|
verificationReqAt: Sequelize.literal('CURRENT_TIMESTAMP'),
|
|
|
|
lastLogIn: Sequelize.literal('CURRENT_TIMESTAMP'),
|
|
|
|
});
|
|
|
|
|
|
|
|
if (!newuser) {
|
|
|
|
res.status(500);
|
|
|
|
res.json({
|
2021-01-30 12:32:46 +00:00
|
|
|
errors: [t`Failed to create new user :(`],
|
2020-01-02 16:58:06 +00:00
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-04-27 18:44:22 +00:00
|
|
|
logger.info(`Created new user ${name} ${email} ${ip}`);
|
|
|
|
|
2021-01-30 12:32:46 +00:00
|
|
|
const { user, lang } = req;
|
2020-11-07 15:37:52 +00:00
|
|
|
user.setRegUser(newuser);
|
2021-01-30 12:32:46 +00:00
|
|
|
const me = await getMe(user, lang);
|
2020-01-02 16:58:06 +00:00
|
|
|
|
|
|
|
await req.logIn(user, (err) => {
|
|
|
|
if (err) {
|
|
|
|
res.status(500);
|
|
|
|
res.json({
|
2021-01-30 12:32:46 +00:00
|
|
|
errors: [t`Failed to establish session after register :(`],
|
2020-01-02 16:58:06 +00:00
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
2020-01-09 14:54:55 +00:00
|
|
|
const host = getHostFromRequest(req);
|
2021-01-30 12:32:46 +00:00
|
|
|
mailProvider.sendVerifyMail(email, name, host, lang);
|
2020-01-02 16:58:06 +00:00
|
|
|
res.status(200);
|
|
|
|
res.json({
|
|
|
|
success: true,
|
|
|
|
me,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|