mirror of
https://github.com/strapi/strapi.git
synced 2025-11-01 10:23:34 +00:00
fix: u&p service hashes password attributes
This commit is contained in:
parent
113a853206
commit
a7cf7e50ee
@ -11,6 +11,7 @@ const bcrypt = require('bcryptjs');
|
||||
const urlJoin = require('url-join');
|
||||
|
||||
const { sanitize } = require('@strapi/utils');
|
||||
const { toNumber, getOr } = require('lodash/fp');
|
||||
const { getService } = require('../utils');
|
||||
|
||||
const USER_MODEL_UID = 'plugin::users-permissions.user';
|
||||
@ -27,10 +28,26 @@ module.exports = ({ strapi }) => ({
|
||||
},
|
||||
|
||||
/**
|
||||
* Promise to search count users
|
||||
* Hashes password fields in the provided values object if they are present.
|
||||
* It checks each key in the values object against the model's attributes and
|
||||
* hashes it if the attribute type is 'password',
|
||||
*
|
||||
* @return {Promise}
|
||||
* @param {object} values - The object containing the fields to be hashed.
|
||||
* @return {object} The values object with hashed password fields if they were present.
|
||||
*/
|
||||
async ensureHashedPasswords(values) {
|
||||
const attributes = strapi.getModel(USER_MODEL_UID).attributes;
|
||||
|
||||
for (const key in values) {
|
||||
if (attributes[key] && attributes[key].type === 'password') {
|
||||
// Check if a custom encryption.rounds has been set on the password attribute
|
||||
const rounds = toNumber(getOr(10, 'encryption.rounds', attributes[key]));
|
||||
values[key] = await bcrypt.hash(values[key], rounds);
|
||||
}
|
||||
}
|
||||
|
||||
return values;
|
||||
},
|
||||
|
||||
/**
|
||||
* Promise to add a/an user.
|
||||
@ -38,7 +55,7 @@ module.exports = ({ strapi }) => ({
|
||||
*/
|
||||
async add(values) {
|
||||
return strapi.db.query(USER_MODEL_UID).create({
|
||||
data: values,
|
||||
data: await this.ensureHashedPasswords(values),
|
||||
populate: ['role'],
|
||||
});
|
||||
},
|
||||
@ -52,7 +69,7 @@ module.exports = ({ strapi }) => ({
|
||||
async edit(userId, params = {}) {
|
||||
return strapi.db.query(USER_MODEL_UID).update({
|
||||
where: { id: userId },
|
||||
data: params,
|
||||
data: await this.ensureHashedPasswords(params),
|
||||
populate: ['role'],
|
||||
});
|
||||
},
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
'use strict';
|
||||
|
||||
const bcrypt = require('bcryptjs');
|
||||
|
||||
const { createStrapiInstance } = require('api-tests/strapi');
|
||||
const { createRequest } = require('api-tests/request');
|
||||
const { createAuthenticatedUser } = require('../utils');
|
||||
@ -20,7 +22,7 @@ const internals = {
|
||||
|
||||
const data = {};
|
||||
|
||||
describe.skip('Auth API', () => {
|
||||
describe('Auth API', () => {
|
||||
beforeAll(async () => {
|
||||
strapi = await createStrapiInstance({ bypassAuth: false });
|
||||
|
||||
@ -111,6 +113,15 @@ describe.skip('Auth API', () => {
|
||||
},
|
||||
});
|
||||
|
||||
// check that password was hashed
|
||||
const user = await strapi.db.query('plugin::users-permissions.user').findOne({
|
||||
where: {
|
||||
email: internals.user.email.toLowerCase(),
|
||||
},
|
||||
});
|
||||
expect(bcrypt.compareSync(internals.newPassword, user.password)).toBe(true);
|
||||
|
||||
// check results
|
||||
expect(res.statusCode).toBe(200);
|
||||
expect(res.body).toMatchObject({
|
||||
jwt: expect.any(String),
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
// Test a simple default API with no relations
|
||||
|
||||
const bcrypt = require('bcryptjs');
|
||||
const { createStrapiInstance } = require('api-tests/strapi');
|
||||
const { createContentAPIRequest } = require('api-tests/request');
|
||||
|
||||
@ -73,6 +74,15 @@ describe('Users API', () => {
|
||||
body: user,
|
||||
});
|
||||
|
||||
// check that password was hashed
|
||||
const userDb = await strapi.db.query('plugin::users-permissions.user').findOne({
|
||||
where: {
|
||||
email: user.email,
|
||||
},
|
||||
});
|
||||
|
||||
expect(bcrypt.compareSync(user.password, userDb.password)).toBe(true);
|
||||
|
||||
expect(res.statusCode).toBe(201);
|
||||
expect(res.body).toMatchObject({
|
||||
username: user.username,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user