payload
Version:
Node, React and MongoDB Headless CMS and Application Framework
107 lines (106 loc) • 13.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function() {
return _default;
}
});
const _jsonwebtoken = /*#__PURE__*/ _interop_require_default(require("jsonwebtoken"));
const _errors = require("../../errors");
const _commitTransaction = require("../../utilities/commitTransaction");
const _getCookieExpiration = /*#__PURE__*/ _interop_require_default(require("../../utilities/getCookieExpiration"));
const _initTransaction = require("../../utilities/initTransaction");
const _killTransaction = require("../../utilities/killTransaction");
const _authenticate = require("../strategies/local/authenticate");
const _generatePasswordSaltHash = require("../strategies/local/generatePasswordSaltHash");
const _getFieldsToSign = require("./getFieldsToSign");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
async function resetPassword(args) {
if (!Object.prototype.hasOwnProperty.call(args.data, 'token') || !Object.prototype.hasOwnProperty.call(args.data, 'password')) {
throw new _errors.APIError('Missing required data.');
}
const { collection: { config: collectionConfig }, data, depth, overrideAccess, req: { payload: { config, secret }, payload }, req } = args;
try {
const shouldCommit = await (0, _initTransaction.initTransaction)(req);
// /////////////////////////////////////
// Reset Password
// /////////////////////////////////////
const user = await payload.db.findOne({
collection: collectionConfig.slug,
req,
where: {
resetPasswordExpiration: {
greater_than: new Date()
},
resetPasswordToken: {
equals: data.token
}
}
});
if (!user) throw new _errors.APIError('Token is either invalid or has expired.');
// TODO: replace this method
const { hash, salt } = await (0, _generatePasswordSaltHash.generatePasswordSaltHash)({
password: data.password
});
user.salt = salt;
user.hash = hash;
user.resetPasswordExpiration = new Date().toISOString();
if (collectionConfig.auth.verify) {
user._verified = true;
}
const doc = await payload.db.updateOne({
id: user.id,
collection: collectionConfig.slug,
data: user,
req
});
await (0, _authenticate.authenticateLocalStrategy)({
doc,
password: data.password
});
const fieldsToSign = (0, _getFieldsToSign.getFieldsToSign)({
collectionConfig,
email: user.email,
user
});
const token = _jsonwebtoken.default.sign(fieldsToSign, secret, {
expiresIn: collectionConfig.auth.tokenExpiration
});
if (args.res) {
const cookieOptions = {
domain: undefined,
expires: (0, _getCookieExpiration.default)(collectionConfig.auth.tokenExpiration),
httpOnly: true,
path: '/',
sameSite: collectionConfig.auth.cookies.sameSite,
secure: collectionConfig.auth.cookies.secure
};
if (collectionConfig.auth.cookies.domain) cookieOptions.domain = collectionConfig.auth.cookies.domain;
args.res.cookie(`${config.cookiePrefix}-token`, token, cookieOptions);
}
const fullUser = await payload.findByID({
id: user.id,
collection: collectionConfig.slug,
depth,
overrideAccess,
req
});
if (shouldCommit) await (0, _commitTransaction.commitTransaction)(req);
return {
token: collectionConfig.auth.removeTokenFromResponses ? undefined : token,
user: fullUser
};
} catch (error) {
await (0, _killTransaction.killTransaction)(req);
throw error;
}
}
const _default = resetPassword;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdXRoL29wZXJhdGlvbnMvcmVzZXRQYXNzd29yZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcydcblxuaW1wb3J0IGp3dCBmcm9tICdqc29ud2VidG9rZW4nXG5cbmltcG9ydCB0eXBlIHsgQ29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL2NvbGxlY3Rpb25zL2NvbmZpZy90eXBlcydcbmltcG9ydCB0eXBlIHsgUGF5bG9hZFJlcXVlc3QgfSBmcm9tICcuLi8uLi9leHByZXNzL3R5cGVzJ1xuXG5pbXBvcnQgeyBBUElFcnJvciB9IGZyb20gJy4uLy4uL2Vycm9ycydcbmltcG9ydCB7IGNvbW1pdFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2NvbW1pdFRyYW5zYWN0aW9uJ1xuaW1wb3J0IGdldENvb2tpZUV4cGlyYXRpb24gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2dldENvb2tpZUV4cGlyYXRpb24nXG5pbXBvcnQgeyBpbml0VHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvaW5pdFRyYW5zYWN0aW9uJ1xuaW1wb3J0IHsga2lsbFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2tpbGxUcmFuc2FjdGlvbidcbmltcG9ydCB7IGF1dGhlbnRpY2F0ZUxvY2FsU3RyYXRlZ3kgfSBmcm9tICcuLi9zdHJhdGVnaWVzL2xvY2FsL2F1dGhlbnRpY2F0ZSdcbmltcG9ydCB7IGdlbmVyYXRlUGFzc3dvcmRTYWx0SGFzaCB9IGZyb20gJy4uL3N0cmF0ZWdpZXMvbG9jYWwvZ2VuZXJhdGVQYXNzd29yZFNhbHRIYXNoJ1xuaW1wb3J0IHsgZ2V0RmllbGRzVG9TaWduIH0gZnJvbSAnLi9nZXRGaWVsZHNUb1NpZ24nXG5cbmV4cG9ydCB0eXBlIFJlc3VsdCA9IHtcbiAgdG9rZW4/OiBzdHJpbmdcbiAgdXNlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbn1cblxuZXhwb3J0IHR5cGUgQXJndW1lbnRzID0ge1xuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uXG4gIGRhdGE6IHtcbiAgICBwYXNzd29yZDogc3RyaW5nXG4gICAgdG9rZW46IHN0cmluZ1xuICB9XG4gIGRlcHRoPzogbnVtYmVyXG4gIG92ZXJyaWRlQWNjZXNzPzogYm9vbGVhblxuICByZXE6IFBheWxvYWRSZXF1ZXN0XG4gIHJlcz86IFJlc3BvbnNlXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc2V0UGFzc3dvcmQoYXJnczogQXJndW1lbnRzKTogUHJvbWlzZTxSZXN1bHQ+IHtcbiAgaWYgKFxuICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJncy5kYXRhLCAndG9rZW4nKSB8fFxuICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJncy5kYXRhLCAncGFzc3dvcmQnKVxuICApIHtcbiAgICB0aHJvdyBuZXcgQVBJRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgZGF0YS4nKVxuICB9XG5cbiAgY29uc3Qge1xuICAgIGNvbGxlY3Rpb246IHsgY29uZmlnOiBjb2xsZWN0aW9uQ29uZmlnIH0sXG4gICAgZGF0YSxcbiAgICBkZXB0aCxcbiAgICBvdmVycmlkZUFjY2VzcyxcbiAgICByZXE6IHtcbiAgICAgIHBheWxvYWQ6IHsgY29uZmlnLCBzZWNyZXQgfSxcbiAgICAgIHBheWxvYWQsXG4gICAgfSxcbiAgICByZXEsXG4gIH0gPSBhcmdzXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzaG91bGRDb21taXQgPSBhd2FpdCBpbml0VHJhbnNhY3Rpb24ocmVxKVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIFJlc2V0IFBhc3N3b3JkXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHBheWxvYWQuZGIuZmluZE9uZTxhbnk+KHtcbiAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25Db25maWcuc2x1ZyxcbiAgICAgIHJlcSxcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIHJlc2V0UGFzc3dvcmRFeHBpcmF0aW9uOiB7IGdyZWF0ZXJfdGhhbjogbmV3IERhdGUoKSB9LFxuICAgICAgICByZXNldFBhc3N3b3JkVG9rZW46IHsgZXF1YWxzOiBkYXRhLnRva2VuIH0sXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBpZiAoIXVzZXIpIHRocm93IG5ldyBBUElFcnJvcignVG9rZW4gaXMgZWl0aGVyIGludmFsaWQgb3IgaGFzIGV4cGlyZWQuJylcblxuICAgIC8vIFRPRE86IHJlcGxhY2UgdGhpcyBtZXRob2RcbiAgICBjb25zdCB7IGhhc2gsIHNhbHQgfSA9IGF3YWl0IGdlbmVyYXRlUGFzc3dvcmRTYWx0SGFzaCh7IHBhc3N3b3JkOiBkYXRhLnBhc3N3b3JkIH0pXG5cbiAgICB1c2VyLnNhbHQgPSBzYWx0XG4gICAgdXNlci5oYXNoID0gaGFzaFxuXG4gICAgdXNlci5yZXNldFBhc3N3b3JkRXhwaXJhdGlvbiA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuXG4gICAgaWYgKGNvbGxlY3Rpb25Db25maWcuYXV0aC52ZXJpZnkpIHtcbiAgICAgIHVzZXIuX3ZlcmlmaWVkID0gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IGRvYyA9IGF3YWl0IHBheWxvYWQuZGIudXBkYXRlT25lKHtcbiAgICAgIGlkOiB1c2VyLmlkLFxuICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZy5zbHVnLFxuICAgICAgZGF0YTogdXNlcixcbiAgICAgIHJlcSxcbiAgICB9KVxuXG4gICAgYXdhaXQgYXV0aGVudGljYXRlTG9jYWxTdHJhdGVneSh7IGRvYywgcGFzc3dvcmQ6IGRhdGEucGFzc3dvcmQgfSlcblxuICAgIGNvbnN0IGZpZWxkc1RvU2lnbiA9IGdldEZpZWxkc1RvU2lnbih7XG4gICAgICBjb2xsZWN0aW9uQ29uZmlnLFxuICAgICAgZW1haWw6IHVzZXIuZW1haWwsXG4gICAgICB1c2VyLFxuICAgIH0pXG5cbiAgICBjb25zdCB0b2tlbiA9IGp3dC5zaWduKGZpZWxkc1RvU2lnbiwgc2VjcmV0LCB7XG4gICAgICBleHBpcmVzSW46IGNvbGxlY3Rpb25Db25maWcuYXV0aC50b2tlbkV4cGlyYXRpb24sXG4gICAgfSlcblxuICAgIGlmIChhcmdzLnJlcykge1xuICAgICAgY29uc3QgY29va2llT3B0aW9ucyA9IHtcbiAgICAgICAgZG9tYWluOiB1bmRlZmluZWQsXG4gICAgICAgIGV4cGlyZXM6IGdldENvb2tpZUV4cGlyYXRpb24oY29sbGVjdGlvbkNvbmZpZy5hdXRoLnRva2VuRXhwaXJhdGlvbiksXG4gICAgICAgIGh0dHBPbmx5OiB0cnVlLFxuICAgICAgICBwYXRoOiAnLycsXG4gICAgICAgIHNhbWVTaXRlOiBjb2xsZWN0aW9uQ29uZmlnLmF1dGguY29va2llcy5zYW1lU2l0ZSxcbiAgICAgICAgc2VjdXJlOiBjb2xsZWN0aW9uQ29uZmlnLmF1dGguY29va2llcy5zZWN1cmUsXG4gICAgICB9XG5cbiAgICAgIGlmIChjb2xsZWN0aW9uQ29uZmlnLmF1dGguY29va2llcy5kb21haW4pXG4gICAgICAgIGNvb2tpZU9wdGlvbnMuZG9tYWluID0gY29sbGVjdGlvbkNvbmZpZy5hdXRoLmNvb2tpZXMuZG9tYWluXG5cbiAgICAgIGFyZ3MucmVzLmNvb2tpZShgJHtjb25maWcuY29va2llUHJlZml4fS10b2tlbmAsIHRva2VuLCBjb29raWVPcHRpb25zKVxuICAgIH1cblxuICAgIGNvbnN0IGZ1bGxVc2VyID0gYXdhaXQgcGF5bG9hZC5maW5kQnlJRCh7XG4gICAgICBpZDogdXNlci5pZCxcbiAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25Db25maWcuc2x1ZyxcbiAgICAgIGRlcHRoLFxuICAgICAgb3ZlcnJpZGVBY2Nlc3MsXG4gICAgICByZXEsXG4gICAgfSlcbiAgICBpZiAoc2hvdWxkQ29tbWl0KSBhd2FpdCBjb21taXRUcmFuc2FjdGlvbihyZXEpXG5cbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW46IGNvbGxlY3Rpb25Db25maWcuYXV0aC5yZW1vdmVUb2tlbkZyb21SZXNwb25zZXMgPyB1bmRlZmluZWQgOiB0b2tlbixcbiAgICAgIHVzZXI6IGZ1bGxVc2VyLFxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBhd2FpdCBraWxsVHJhbnNhY3Rpb24ocmVxKVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVzZXRQYXNzd29yZFxuIl0sIm5hbWVzIjpbInJlc2V0UGFzc3dvcmQiLCJhcmdzIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGF0YSIsIkFQSUVycm9yIiwiY29sbGVjdGlvbiIsImNvbmZpZyIsImNvbGxlY3Rpb25Db25maWciLCJkZXB0aCIsIm92ZXJyaWRlQWNjZXNzIiwicmVxIiwicGF5bG9hZCIsInNlY3JldCIsInNob3VsZENvbW1pdCIsImluaXRUcmFuc2FjdGlvbiIsInVzZXIiLCJkYiIsImZpbmRPbmUiLCJzbHVnIiwid2hlcmUiLCJyZXNldFBhc3N3b3JkRXhwaXJhdGlvbiIsImdyZWF0ZXJfdGhhbiIsIkRhdGUiLCJyZXNldFBhc3N3b3JkVG9rZW4iLCJlcXVhbHMiLCJ0b2tlbiIsImhhc2giLCJzYWx0IiwiZ2VuZXJhdGVQYXNzd29yZFNhbHRIYXNoIiwicGFzc3dvcmQiLCJ0b0lTT1N0cmluZyIsImF1dGgiLCJ2ZXJpZnkiLCJfdmVyaWZpZWQiLCJkb2MiLCJ1cGRhdGVPbmUiLCJpZCIsImF1dGhlbnRpY2F0ZUxvY2FsU3RyYXRlZ3kiLCJmaWVsZHNUb1NpZ24iLCJnZXRGaWVsZHNUb1NpZ24iLCJlbWFpbCIsImp3dCIsInNpZ24iLCJleHBpcmVzSW4iLCJ0b2tlbkV4cGlyYXRpb24iLCJyZXMiLCJjb29raWVPcHRpb25zIiwiZG9tYWluIiwidW5kZWZpbmVkIiwiZXhwaXJlcyIsImdldENvb2tpZUV4cGlyYXRpb24iLCJodHRwT25seSIsInBhdGgiLCJzYW1lU2l0ZSIsImNvb2tpZXMiLCJzZWN1cmUiLCJjb29raWUiLCJjb29raWVQcmVmaXgiLCJmdWxsVXNlciIsImZpbmRCeUlEIiwiY29tbWl0VHJhbnNhY3Rpb24iLCJyZW1vdmVUb2tlbkZyb21SZXNwb25zZXMiLCJlcnJvciIsImtpbGxUcmFuc2FjdGlvbiJdLCJtYXBwaW5ncyI6Ijs7OzsrQkF5SUE7OztlQUFBOzs7cUVBdklnQjt3QkFLUzttQ0FDUzs0RUFDRjtpQ0FDQTtpQ0FDQTs4QkFDVTswQ0FDRDtpQ0FDVDs7Ozs7O0FBbUJoQyxlQUFlQSxjQUFjQyxJQUFlO0lBQzFDLElBQ0UsQ0FBQ0MsT0FBT0MsU0FBUyxDQUFDQyxjQUFjLENBQUNDLElBQUksQ0FBQ0osS0FBS0ssSUFBSSxFQUFFLFlBQ2pELENBQUNKLE9BQU9DLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUNKLEtBQUtLLElBQUksRUFBRSxhQUNqRDtRQUNBLE1BQU0sSUFBSUMsZ0JBQVEsQ0FBQztJQUNyQjtJQUVBLE1BQU0sRUFDSkMsWUFBWSxFQUFFQyxRQUFRQyxnQkFBZ0IsRUFBRSxFQUN4Q0osSUFBSSxFQUNKSyxLQUFLLEVBQ0xDLGNBQWMsRUFDZEMsS0FBSyxFQUNIQyxTQUFTLEVBQUVMLE1BQU0sRUFBRU0sTUFBTSxFQUFFLEVBQzNCRCxPQUFPLEVBQ1IsRUFDREQsR0FBRyxFQUNKLEdBQUdaO0lBRUosSUFBSTtRQUNGLE1BQU1lLGVBQWUsTUFBTUMsSUFBQUEsZ0NBQWUsRUFBQ0o7UUFFM0Msd0NBQXdDO1FBQ3hDLGlCQUFpQjtRQUNqQix3Q0FBd0M7UUFFeEMsTUFBTUssT0FBTyxNQUFNSixRQUFRSyxFQUFFLENBQUNDLE9BQU8sQ0FBTTtZQUN6Q1osWUFBWUUsaUJBQWlCVyxJQUFJO1lBQ2pDUjtZQUNBUyxPQUFPO2dCQUNMQyx5QkFBeUI7b0JBQUVDLGNBQWMsSUFBSUM7Z0JBQU87Z0JBQ3BEQyxvQkFBb0I7b0JBQUVDLFFBQVFy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