UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

129 lines (128 loc) • 16.5 kB
"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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