payload
Version:
Node, React and MongoDB Headless CMS and Application Framework
129 lines (128 loc) • 16.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function() {
return _default;
}
});
const _crypto = /*#__PURE__*/ _interop_require_default(require("crypto"));
const _utils = require("../../collections/operations/utils");
const _errors = require("../../errors");
const _commitTransaction = require("../../utilities/commitTransaction");
const _initTransaction = require("../../utilities/initTransaction");
const _killTransaction = require("../../utilities/killTransaction");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
async function forgotPassword(incomingArgs) {
if (!Object.prototype.hasOwnProperty.call(incomingArgs.data, 'email')) {
throw new _errors.APIError('Missing email.', 400);
}
let args = incomingArgs;
try {
const shouldCommit = await (0, _initTransaction.initTransaction)(args.req);
// /////////////////////////////////////
// beforeOperation - Collection
// /////////////////////////////////////
await args.collection.config.hooks.beforeOperation.reduce(async (priorHook, hook)=>{
await priorHook;
args = await hook({
args,
collection: args.collection?.config,
context: args.req.context,
operation: 'forgotPassword',
req: args.req
}) || args;
}, Promise.resolve());
const { collection: { config: collectionConfig }, data, disableEmail, expiration, req: { payload: { config, emailOptions, sendEmail: email }, payload, t }, req } = args;
// /////////////////////////////////////
// Forget password
// /////////////////////////////////////
let token = _crypto.default.randomBytes(20);
token = token.toString('hex');
if (!data.email) {
throw new _errors.APIError('Missing email.');
}
let user = await payload.db.findOne({
collection: collectionConfig.slug,
req,
where: {
email: {
equals: data.email.toLowerCase()
}
}
});
if (!user) return null;
user.resetPasswordToken = token;
user.resetPasswordExpiration = new Date(expiration || Date.now() + 3600000).toISOString() // 1 hour
;
user = await payload.update({
id: user.id,
collection: collectionConfig.slug,
data: user,
req
});
if (!disableEmail) {
const serverURL = config.serverURL !== null && config.serverURL !== '' ? config.serverURL : `${req.protocol}://${req.get('host')}`;
let html = `${t('authentication:youAreReceivingResetPassword')}
<a href="${serverURL}${config.routes.admin}/reset/${token}">
${serverURL}${config.routes.admin}/reset/${token}
</a>
${t('authentication:youDidNotRequestPassword')}`;
if (typeof collectionConfig.auth.forgotPassword.generateEmailHTML === 'function') {
html = await collectionConfig.auth.forgotPassword.generateEmailHTML({
req,
token,
user
});
}
let subject = t('authentication:resetYourPassword');
if (typeof collectionConfig.auth.forgotPassword.generateEmailSubject === 'function') {
subject = await collectionConfig.auth.forgotPassword.generateEmailSubject({
req,
token,
user
});
}
// eslint-disable-next-line @typescript-eslint/no-floating-promises
email({
from: `"${emailOptions.fromName}" <${emailOptions.fromAddress}>`,
html,
subject,
to: data.email
});
}
// /////////////////////////////////////
// afterForgotPassword - Collection
// /////////////////////////////////////
await collectionConfig.hooks.afterForgotPassword.reduce(async (priorHook, hook)=>{
await priorHook;
await hook({
args,
collection: args.collection?.config,
context: req.context
});
}, Promise.resolve());
// /////////////////////////////////////
// afterOperation - Collection
// /////////////////////////////////////
token = await (0, _utils.buildAfterOperation)({
args,
collection: args.collection?.config,
operation: 'forgotPassword',
result: token
});
if (shouldCommit) await (0, _commitTransaction.commitTransaction)(req);
return token;
} catch (error) {
await (0, _killTransaction.killTransaction)(args.req);
throw error;
}
}
const _default = forgotPassword;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdXRoL29wZXJhdGlvbnMvZm9yZ290UGFzc3dvcmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nXG5cbmltcG9ydCB0eXBlIHsgQ29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL2NvbGxlY3Rpb25zL2NvbmZpZy90eXBlcydcbmltcG9ydCB0eXBlIHsgUGF5bG9hZFJlcXVlc3QgfSBmcm9tICcuLi8uLi9leHByZXNzL3R5cGVzJ1xuXG5pbXBvcnQgeyBidWlsZEFmdGVyT3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vY29sbGVjdGlvbnMvb3BlcmF0aW9ucy91dGlscydcbmltcG9ydCB7IEFQSUVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3JzJ1xuaW1wb3J0IHsgY29tbWl0VHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvY29tbWl0VHJhbnNhY3Rpb24nXG5pbXBvcnQgeyBpbml0VHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvaW5pdFRyYW5zYWN0aW9uJ1xuaW1wb3J0IHsga2lsbFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2tpbGxUcmFuc2FjdGlvbidcblxuZXhwb3J0IHR5cGUgQXJndW1lbnRzID0ge1xuICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uXG4gIGRhdGE6IHtcbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG4gICAgZW1haWw6IHN0cmluZ1xuICB9XG4gIGRpc2FibGVFbWFpbD86IGJvb2xlYW5cbiAgZXhwaXJhdGlvbj86IG51bWJlclxuICByZXE6IFBheWxvYWRSZXF1ZXN0XG59XG5cbmV4cG9ydCB0eXBlIFJlc3VsdCA9IHN0cmluZ1xuXG5hc3luYyBmdW5jdGlvbiBmb3Jnb3RQYXNzd29yZChpbmNvbWluZ0FyZ3M6IEFyZ3VtZW50cyk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpbmNvbWluZ0FyZ3MuZGF0YSwgJ2VtYWlsJykpIHtcbiAgICB0aHJvdyBuZXcgQVBJRXJyb3IoJ01pc3NpbmcgZW1haWwuJywgNDAwKVxuICB9XG5cbiAgbGV0IGFyZ3MgPSBpbmNvbWluZ0FyZ3NcblxuICB0cnkge1xuICAgIGNvbnN0IHNob3VsZENvbW1pdCA9IGF3YWl0IGluaXRUcmFuc2FjdGlvbihhcmdzLnJlcSlcblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBiZWZvcmVPcGVyYXRpb24gLSBDb2xsZWN0aW9uXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgYXdhaXQgYXJncy5jb2xsZWN0aW9uLmNvbmZpZy5ob29rcy5iZWZvcmVPcGVyYXRpb24ucmVkdWNlKGFzeW5jIChwcmlvckhvb2ssIGhvb2spID0+IHtcbiAgICAgIGF3YWl0IHByaW9ySG9va1xuXG4gICAgICBhcmdzID1cbiAgICAgICAgKGF3YWl0IGhvb2soe1xuICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgY29sbGVjdGlvbjogYXJncy5jb2xsZWN0aW9uPy5jb25maWcsXG4gICAgICAgICAgY29udGV4dDogYXJncy5yZXEuY29udGV4dCxcbiAgICAgICAgICBvcGVyYXRpb246ICdmb3Jnb3RQYXNzd29yZCcsXG4gICAgICAgICAgcmVxOiBhcmdzLnJlcSxcbiAgICAgICAgfSkpIHx8IGFyZ3NcbiAgICB9LCBQcm9taXNlLnJlc29sdmUoKSlcblxuICAgIGNvbnN0IHtcbiAgICAgIGNvbGxlY3Rpb246IHsgY29uZmlnOiBjb2xsZWN0aW9uQ29uZmlnIH0sXG4gICAgICBkYXRhLFxuICAgICAgZGlzYWJsZUVtYWlsLFxuICAgICAgZXhwaXJhdGlvbixcbiAgICAgIHJlcToge1xuICAgICAgICBwYXlsb2FkOiB7IGNvbmZpZywgZW1haWxPcHRpb25zLCBzZW5kRW1haWw6IGVtYWlsIH0sXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIHQsXG4gICAgICB9LFxuICAgICAgcmVxLFxuICAgIH0gPSBhcmdzXG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gRm9yZ2V0IHBhc3N3b3JkXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgbGV0IHRva2VuOiBCdWZmZXIgfCBzdHJpbmcgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoMjApXG4gICAgdG9rZW4gPSB0b2tlbi50b1N0cmluZygnaGV4JylcblxuICAgIHR5cGUgVXNlckRvYyA9IHtcbiAgICAgIGlkOiBudW1iZXIgfCBzdHJpbmdcbiAgICAgIHJlc2V0UGFzc3dvcmRFeHBpcmF0aW9uPzogc3RyaW5nXG4gICAgICByZXNldFBhc3N3b3JkVG9rZW4/OiBzdHJpbmdcbiAgICB9XG5cbiAgICBpZiAoIWRhdGEuZW1haWwpIHtcbiAgICAgIHRocm93IG5ldyBBUElFcnJvcignTWlzc2luZyBlbWFpbC4nKVxuICAgIH1cblxuICAgIGxldCB1c2VyID0gYXdhaXQgcGF5bG9hZC5kYi5maW5kT25lPFVzZXJEb2M+KHtcbiAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25Db25maWcuc2x1ZyxcbiAgICAgIHJlcSxcbiAgICAgIHdoZXJlOiB7IGVtYWlsOiB7IGVxdWFsczogZGF0YS5lbWFpbC50b0xvd2VyQ2FzZSgpIH0gfSxcbiAgICB9KVxuXG4gICAgaWYgKCF1c2VyKSByZXR1cm4gbnVsbFxuXG4gICAgdXNlci5yZXNldFBhc3N3b3JkVG9rZW4gPSB0b2tlblxuICAgIHVzZXIucmVzZXRQYXNzd29yZEV4cGlyYXRpb24gPSBuZXcgRGF0ZShleHBpcmF0aW9uIHx8IERhdGUubm93KCkgKyAzNjAwMDAwKS50b0lTT1N0cmluZygpIC8vIDEgaG91clxuXG4gICAgdXNlciA9IGF3YWl0IHBheWxvYWQudXBkYXRlKHtcbiAgICAgIGlkOiB1c2VyLmlkLFxuICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZy5zbHVnLFxuICAgICAgZGF0YTogdXNlcixcbiAgICAgIHJlcSxcbiAgICB9KVxuXG4gICAgaWYgKCFkaXNhYmxlRW1haWwpIHtcbiAgICAgIGNvbnN0IHNlcnZlclVSTCA9XG4gICAgICAgIGNvbmZpZy5zZXJ2ZXJVUkwgIT09IG51bGwgJiYgY29uZmlnLnNlcnZlclVSTCAhPT0gJydcbiAgICAgICAgICA/IGNvbmZpZy5zZXJ2ZXJVUkxcbiAgICAgICAgICA6IGAke3JlcS5wcm90b2NvbH06Ly8ke3JlcS5nZXQoJ2hvc3QnKX1gXG5cbiAgICAgIGxldCBodG1sID0gYCR7dCgnYXV0aGVudGljYXRpb246eW91QXJlUmVjZWl2aW5nUmVzZXRQYXNzd29yZCcpfVxuICAgIDxhIGhyZWY9XCIke3NlcnZlclVSTH0ke2NvbmZpZy5yb3V0ZXMuYWRtaW59L3Jlc2V0LyR7dG9rZW59XCI+XG4gICAgICR7c2VydmVyVVJMfSR7Y29uZmlnLnJvdXRlcy5hZG1pbn0vcmVzZXQvJHt0b2tlbn1cbiAgICA8L2E+XG4gICAgJHt0KCdhdXRoZW50aWNhdGlvbjp5b3VEaWROb3RSZXF1ZXN0UGFzc3dvcmQnKX1gXG5cbiAgICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbkNvbmZpZy5hdXRoLmZvcmdvdFBhc3N3b3JkLmdlbmVyYXRlRW1haWxIVE1MID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGh0bWwgPSBhd2FpdCBjb2xsZWN0aW9uQ29uZmlnLmF1dGguZm9yZ290UGFzc3dvcmQuZ2VuZXJhdGVFbWFpbEhUTUwoe1xuICAgICAgICAgIHJlcSxcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgICB1c2VyLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBsZXQgc3ViamVjdCA9IHQoJ2F1dGhlbnRpY2F0aW9uOnJlc2V0WW91clBhc3N3b3JkJylcblxuICAgICAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uQ29uZmlnLmF1dGguZm9yZ290UGFzc3dvcmQuZ2VuZXJhdGVFbWFpbFN1YmplY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgc3ViamVjdCA9IGF3YWl0IGNvbGxlY3Rpb25Db25maWcuYXV0aC5mb3Jnb3RQYXNzd29yZC5nZW5lcmF0ZUVtYWlsU3ViamVjdCh7XG4gICAgICAgICAgcmVxLFxuICAgICAgICAgIHRva2VuLFxuICAgICAgICAgIHVzZXIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgIGVtYWlsKHtcbiAgICAgICAgZnJvbTogYFwiJHtlbWFpbE9wdGlvbnMuZnJvbU5hbWV9XCIgPCR7ZW1haWxPcHRpb25zLmZyb21BZGRyZXNzfT5gLFxuICAgICAgICBodG1sLFxuICAgICAgICBzdWJqZWN0LFxuICAgICAgICB0bzogZGF0YS5lbWFpbCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIGFmdGVyRm9yZ290UGFzc3dvcmQgLSBDb2xsZWN0aW9uXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgYXdhaXQgY29sbGVjdGlvbkNvbmZpZy5ob29rcy5hZnRlckZvcmdvdFBhc3N3b3JkLnJlZHVjZShhc3luYyAocHJpb3JIb29rLCBob29rKSA9PiB7XG4gICAgICBhd2FpdCBwcmlvckhvb2tcbiAgICAgIGF3YWl0IGhvb2soeyBhcmdzLCBjb2xsZWN0aW9uOiBhcmdzLmNvbGxlY3Rpb24/LmNvbmZpZywgY29udGV4dDogcmVxLmNvbnRleHQgfSlcbiAgICB9LCBQcm9taXNlLnJlc29sdmUoKSlcblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBhZnRlck9wZXJhdGlvbiAtIENvbGxlY3Rpb25cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICB0b2tlbiA9IGF3YWl0IGJ1aWxkQWZ0ZXJPcGVyYXRpb24oe1xuICAgICAgYXJncyxcbiAgICAgIGNvbGxlY3Rpb246IGFyZ3MuY29sbGVjdGlvbj8uY29uZmlnLFxuICAgICAgb3BlcmF0aW9uOiAnZm9yZ290UGFzc3dvcmQnLFxuICAgICAgcmVzdWx0OiB0b2tlbixcbiAgICB9KVxuXG4gICAgaWYgKHNob3VsZENvbW1pdCkgYXdhaXQgY29tbWl0VHJhbnNhY3Rpb24ocmVxKVxuXG4gICAgcmV0dXJuIHRva2VuXG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgYXdhaXQga2lsbFRyYW5zYWN0aW9uKGFyZ3MucmVxKVxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZm9yZ290UGFzc3dvcmRcbiJdLCJuYW1lcyI6WyJmb3Jnb3RQYXNzd29yZCIsImluY29taW5nQXJncyIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRhdGEiLCJBUElFcnJvciIsImFyZ3MiLCJzaG91bGRDb21taXQiLCJpbml0VHJhbnNhY3Rpb24iLCJyZXEiLCJjb2xsZWN0aW9uIiwiY29uZmlnIiwiaG9va3MiLCJiZWZvcmVPcGVyYXRpb24iLCJyZWR1Y2UiLCJwcmlvckhvb2siLCJob29rIiwiY29udGV4dCIsIm9wZXJhdGlvbiIsIlByb21pc2UiLCJyZXNvbHZlIiwiY29sbGVjdGlvbkNvbmZpZyIsImRpc2FibGVFbWFpbCIsImV4cGlyYXRpb24iLCJwYXlsb2FkIiwiZW1haWxPcHRpb25zIiwic2VuZEVtYWlsIiwiZW1haWwiLCJ0IiwidG9rZW4iLCJjcnlwdG8iLCJyYW5kb21CeXRlcyIsInRvU3RyaW5nIiwidXNlciIsImRiIiwiZmluZE9uZSIsInNsdWciLCJ3aGVyZSIsImVxdWFscyIsInRvTG93ZXJDYXNlIiwicmVzZXRQYXNzd29yZFRva2VuIiwicmVzZXRQYXNzd29yZEV4cGlyYXRpb24iLCJEYXRlIiwibm93IiwidG9JU09TdHJpbmciLCJ1cGRhdGUiLCJpZCIsInNlcnZlclVSTCIsInByb3RvY29sIiwiZ2V0IiwiaHRtbCIsInJvdXRlcyIsImFkbWluIiwiYXV0aCIsImdlbmVyYXRlRW1haWxIVE1MIiwic3ViamVjdCIsImdlbmVyYXRlRW1haWxTdWJqZWN0IiwiZnJvbSIsImZyb21OYW1lIiwiZnJvbUFkZHJlc3MiLCJ0byIsImFmdGVyRm9yZ290UGFzc3dvcmQiLCJidWlsZEFmdGVyT3BlcmF0aW9uIiwicmVzdWx0IiwiY29tbWl0VHJhbnNhY3Rpb24iLCJlcnJvciIsImtpbGxUcmFuc2FjdGlvbiJdLCJtYXBwaW5ncyI6Ijs7OzsrQkF1S0E7OztlQUFBOzs7K0RBdkttQjt1QkFLaUI7d0JBQ1g7bUNBQ1M7aUNBQ0Y7aUNBQ0E7Ozs7OztBQWVoQyxlQUFlQSxlQUFlQyxZQUF1QjtJQUNuRCxJQUFJLENBQUNDLE9BQU9DLFNBQVMsQ0FBQ0MsY0FBYyxDQUFDQyxJQUFJLENBQUNKLGFBQWFLLElBQUksRUFBRSxVQUFVO1FBQ3JFLE1BQU0sSUFBSUMsZ0JBQVEsQ0FBQyxrQkFBa0I7SUFDdkM7SUFFQSxJQUFJQyxPQUFPUDtJQUVYLElBQUk7UUFDRixNQUFNUSxlQUFlLE1BQU1DLElBQUFBLGdDQUFlLEVBQUNGLEtBQUtHLEdBQUc7UUFFbkQsd0NBQXdDO1FBQ3hDLCtCQUErQjtRQUMvQix3Q0FBd0M7UUFFeEMsTUFBTUgsS0FBS0ksVUFBVSxDQUFDQyxNQUFNLENBQUNDLEtBQUssQ0FBQ0MsZUFBZSxDQUFDQyxNQUFNLENBQUMsT0FBT0MsV0FBV0M7WUFDMUUsTUFBTUQ7WUFFTlQsT0FDRSxBQUFDLE1BQU1VLEtBQUs7Z0JBQ1ZWO2dCQUNBSSxZQUFZSixLQUFLSSxVQUFVLEVBQUVDO2dCQUM3Qk0sU0FBU1gsS0FBS0csR0FBRyxDQUFDUSxPQUFPO2dCQUN6QkMsV0FBVztnQkFDWFQsS0FBS0gsS0FBS0csR0FBRztZQUNmLE1BQU9IO1FBQ1gsR0FBR2EsUUFB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