pixelplanet/src/routes/api/auth/register.js

118 lines
3.0 KiB
JavaScript

import Sequelize from 'sequelize';
import logger from '../../../core/logger';
import { RegUser } from '../../../data/sql';
import mailProvider from '../../../core/MailProvider';
import getMe from '../../../core/me';
import { getIPFromRequest, getHostFromRequest } from '../../../utils/ip';
import { checkIfMailDisposable } from '../../../core/isAllowed';
import {
validateEMail,
validateName,
validatePassword,
} from '../../../utils/validation';
import {
checkCaptchaSolution,
} from '../../../data/redis/captcha';
async function validate(email, name, password, captcha, captchaid, t, gettext) {
const errors = [];
const emailerror = gettext(validateEMail(email));
if (emailerror) {
errors.push(emailerror);
} else if (await checkIfMailDisposable(email)) {
errors.push(t`This email provider is not allowed`);
}
const nameerror = validateName(name);
if (nameerror) errors.push(nameerror);
const passworderror = gettext(validatePassword(password));
if (passworderror) errors.push(passworderror);
if (!captcha || !captchaid) errors.push(t`No Captcha given`);
let reguser = await RegUser.findOne({ where: { email } });
if (reguser) errors.push(t`E-Mail already in use.`);
reguser = await RegUser.findOne({ where: { name } });
if (reguser) errors.push(t`Username already in use.`);
return errors;
}
export default async (req, res) => {
const {
email, name, password, captcha, captchaid,
} = req.body;
const { t, gettext } = req.ttag;
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;
}
}
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({
errors: [t`Failed to create new user :(`],
});
return;
}
logger.info(`Created new user ${name} ${email} ${ip}`);
const { user, lang } = req;
user.setRegUser(newuser);
const me = await getMe(user, lang);
await req.logIn(user, (err) => {
if (err) {
logger.warn(`Login after register error: ${err.message}`);
res.status(500);
res.json({
errors: [t`Failed to establish session after register :(`],
});
return;
}
const host = getHostFromRequest(req);
mailProvider.sendVerifyMail(email, name, host, lang);
res.status(200);
res.json({
success: true,
me,
});
});
};