2017-11-14 11:49:19 +01:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Auth.js controller
|
|
|
|
*
|
|
|
|
* @description: A set of functions called "actions" for managing `Auth`.
|
|
|
|
*/
|
|
|
|
|
2017-11-16 14:12:03 +01:00
|
|
|
const _ = require('lodash');
|
2017-11-16 18:00:15 +01:00
|
|
|
const crypto = require('crypto');
|
2017-11-16 14:12:03 +01:00
|
|
|
|
2017-11-14 11:49:19 +01:00
|
|
|
module.exports = {
|
|
|
|
callback: async (ctx) => {
|
|
|
|
const provider = ctx.params.provider || 'local';
|
|
|
|
const params = ctx.request.body;
|
|
|
|
const access_token = ctx.query.access_token;
|
|
|
|
|
|
|
|
if (provider === 'local') {
|
|
|
|
// The identifier is required.
|
|
|
|
if (!params.identifier) {
|
2017-11-20 16:28:50 +01:00
|
|
|
return ctx.badRequest(null, [{ messages: [{ id: 'Auth.form.error.email.provide' }] }]);
|
2017-11-14 11:49:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// The password is required.
|
|
|
|
if (!params.password) {
|
2017-11-20 16:28:50 +01:00
|
|
|
return ctx.badRequest(null, [{ messages: [{ id: 'Auth.form.error.password.provide' }] }]);
|
2017-11-14 11:49:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
const query = {};
|
|
|
|
|
|
|
|
// Check if the provided identifier is an email or not.
|
2017-11-16 14:29:49 +01:00
|
|
|
const isEmail = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(params.identifier);
|
2017-11-14 11:49:19 +01:00
|
|
|
|
|
|
|
// Set the identifier to the appropriate query field.
|
|
|
|
if (isEmail) {
|
|
|
|
query.email = params.identifier;
|
|
|
|
} else {
|
|
|
|
query.username = params.identifier;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check if the user exists.
|
2017-11-20 16:28:50 +01:00
|
|
|
const user = await strapi.query('user', 'users-permissions').findOne(query);
|
|
|
|
|
|
|
|
if (!user) {
|
|
|
|
return ctx.badRequest(null, [{ messages: [{ id: 'Auth.form.error.invalid' }] }]);
|
|
|
|
}
|
|
|
|
|
|
|
|
// The user never registered with the `local` provider.
|
|
|
|
if (!user.password) {
|
|
|
|
return ctx.badRequest(null, [{ messages: [{ id: 'Auth.form.error.password.local' }] }]);
|
|
|
|
}
|
|
|
|
|
|
|
|
const validPassword = strapi.plugins['users-permissions'].services.user.validatePassword(params.password, user.password);
|
|
|
|
|
|
|
|
if (!validPassword) {
|
|
|
|
return ctx.badRequest(null, [{ messages: [{ id: 'Auth.form.error.invalid' }] }]);
|
|
|
|
} else {
|
|
|
|
ctx.send({
|
|
|
|
jwt: strapi.plugins['users-permissions'].services.jwt.issue(user),
|
|
|
|
user: user
|
|
|
|
});
|
2017-11-14 11:49:19 +01:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Connect the user thanks to the third-party provider.
|
2017-11-20 16:28:50 +01:00
|
|
|
const user = await strapi.api.user.services.grant.connect(provider, access_token);
|
|
|
|
|
|
|
|
ctx.redirect(strapi.config.frontendUrl || strapi.config.url + '?jwt=' + strapi.api.user.services.jwt.issue(user) + '&user=' + JSON.stringify(user));
|
2017-11-14 11:49:19 +01:00
|
|
|
}
|
2017-11-16 14:12:03 +01:00
|
|
|
},
|
|
|
|
|
|
|
|
register: async (ctx) => {
|
|
|
|
const params = _.assign(ctx.request.body, {
|
|
|
|
provider: 'local'
|
|
|
|
});
|
|
|
|
|
|
|
|
// Password is required.
|
|
|
|
if (!params.password) {
|
2017-11-20 16:28:50 +01:00
|
|
|
return ctx.badRequest(null, [{ messages: [{ id: 'Auth.form.error.password.provide' }] }]);
|
2017-11-16 14:12:03 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Throw an error if the password selected by the user
|
|
|
|
// contains more than two times the symbol '$'.
|
|
|
|
if (strapi.plugins['users-permissions'].services.user.isHashed(params.password)) {
|
2017-11-20 16:28:50 +01:00
|
|
|
return ctx.badRequest(null, [{ messages: [{ id: 'Auth.form.error.password.format' }] }]);
|
2017-11-16 14:12:03 +01:00
|
|
|
}
|
|
|
|
|
2017-11-17 12:05:03 +01:00
|
|
|
// First, check if the user is the first one to register as admin.
|
2017-11-27 16:47:16 +01:00
|
|
|
const adminUsers = await strapi.query('user', 'users-permissions').find({ role: '0' });
|
2017-11-16 14:12:03 +01:00
|
|
|
|
2017-11-20 16:28:50 +01:00
|
|
|
// Check if the user is the first to register
|
|
|
|
if (adminUsers.length === 0) {
|
2017-11-27 16:47:16 +01:00
|
|
|
params.role = '0';
|
|
|
|
} else {
|
|
|
|
params.role = '1';
|
2017-11-20 16:28:50 +01:00
|
|
|
}
|
2017-11-16 14:12:03 +01:00
|
|
|
|
2017-11-20 16:28:50 +01:00
|
|
|
params.password = await strapi.plugins['users-permissions'].services.user.hashPassword(params);
|
2017-11-16 14:29:49 +01:00
|
|
|
|
2017-11-30 11:07:54 +01:00
|
|
|
const user = await strapi.query('user', 'users-permissions').create(params);
|
2017-11-16 14:12:03 +01:00
|
|
|
|
2017-11-20 16:28:50 +01:00
|
|
|
ctx.send({
|
|
|
|
jwt: strapi.plugins['users-permissions'].services.jwt.issue(user),
|
|
|
|
user: user
|
|
|
|
});
|
2017-11-16 18:00:15 +01:00
|
|
|
},
|
|
|
|
|
|
|
|
forgotPassword: async (ctx) => {
|
|
|
|
const email = ctx.request.body.email;
|
|
|
|
const url = ctx.request.body.url;
|
|
|
|
|
|
|
|
// Find the user user thanks to his email.
|
|
|
|
const user = await strapi.query('user', 'users-permissions').findOne({ email });
|
|
|
|
|
|
|
|
// User not found.
|
|
|
|
if (!user) {
|
2017-11-20 16:28:50 +01:00
|
|
|
return ctx.badRequest(null, [{ messages: [{ id: 'Auth.form.error.user.not-exist' }] }]);
|
2017-11-16 18:00:15 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Generate random token.
|
|
|
|
const resetPasswordToken = crypto.randomBytes(64).toString('hex');
|
|
|
|
|
2017-11-17 11:41:23 +01:00
|
|
|
// Set the property code.
|
2017-11-16 18:00:15 +01:00
|
|
|
user.resetPasswordToken = resetPasswordToken;
|
|
|
|
|
|
|
|
// Update the user.
|
2017-11-30 11:07:54 +01:00
|
|
|
await strapi.query('user', 'users-permissions').update(user);
|
2017-11-16 18:00:15 +01:00
|
|
|
|
|
|
|
// Send an email to the user.
|
2017-11-20 16:28:50 +01:00
|
|
|
await strapi.plugins['email'].services.email.send({
|
|
|
|
to: user.email,
|
|
|
|
subject: 'Reset password',
|
|
|
|
text: url + '?code=' + resetPasswordToken,
|
|
|
|
html: url + '?code=' + resetPasswordToken
|
|
|
|
});
|
|
|
|
|
2017-12-04 13:40:07 +01:00
|
|
|
ctx.send({ ok: true });
|
2017-11-17 11:41:23 +01:00
|
|
|
},
|
|
|
|
|
|
|
|
changePassword: async (ctx) => {
|
|
|
|
const params = _.assign({}, ctx.request.body, ctx.params);
|
|
|
|
|
|
|
|
if (params.password && params.passwordConfirmation && params.password === params.passwordConfirmation && params.code) {
|
2017-11-20 16:28:50 +01:00
|
|
|
const user = await strapi.query('user', 'users-permissions').findOne({ resetPasswordToken: params.code });
|
2017-11-17 11:41:23 +01:00
|
|
|
|
2017-11-20 16:28:50 +01:00
|
|
|
if (!user) {
|
|
|
|
return ctx.badRequest(null, [{ messages: [{ id: 'Auth.form.error.code.provide' }] }]);
|
|
|
|
}
|
2017-11-17 11:41:23 +01:00
|
|
|
|
2017-11-20 16:28:50 +01:00
|
|
|
// Delete the current code
|
|
|
|
user.resetPasswordToken = null;
|
2017-11-17 11:41:23 +01:00
|
|
|
|
2017-11-20 16:28:50 +01:00
|
|
|
user.password = await strapi.plugins['users-permissions'].services.user.hashPassword(params);
|
2017-11-17 11:41:23 +01:00
|
|
|
|
2017-11-20 16:28:50 +01:00
|
|
|
// Update the user.
|
2017-11-30 11:07:54 +01:00
|
|
|
await strapi.query('user', 'users-permissions').update(user);
|
2017-11-17 11:41:23 +01:00
|
|
|
|
2017-11-20 16:28:50 +01:00
|
|
|
ctx.send({
|
|
|
|
jwt: strapi.plugins['users-permissions'].services.jwt.issue(user),
|
|
|
|
user: user
|
|
|
|
});
|
2017-11-17 11:41:23 +01:00
|
|
|
} else if (params.password && params.passwordConfirmation && params.password !== params.passwordConfirmation) {
|
2017-11-20 16:28:50 +01:00
|
|
|
return ctx.badRequest(null, [{ messages: [{ id: 'Auth.form.error.password.matching' }] }]);
|
2017-11-17 11:41:23 +01:00
|
|
|
} else {
|
2017-11-20 16:28:50 +01:00
|
|
|
return ctx.badRequest(null, [{ messages: [{ id: 'Auth.form.error.params.provide' }] }]);
|
2017-11-17 11:41:23 +01:00
|
|
|
}
|
2017-11-14 11:49:19 +01:00
|
|
|
}
|
|
|
|
};
|