All files hooks.js

97.78% Statements 44/45
96.43% Branches 27/28
90.91% Functions 10/11
97.56% Lines 40/41
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82      1x       18x 13x   13x 13x 13x         52x         13x         1x     12x 12x 12x 12x 12x   12x         8x 8x   6x 3x       7x 7x   6x 6x 5x 5x   5x 6x   1x 1x 1x       6x 5x 5x 5x 5x 5x 5x 5x 5x         5x    
 
/* eslint no-param-reassign: 0 */
 
const errors = require('@feathersjs/errors');
const { checkContext, getItems, replaceItems } = require('feathers-hooks-common');
const { getLongToken, getShortToken, ensureFieldHasChanged } = require('./helpers');
 
module.exports.addVerification = path => hook => {
  checkContext(hook, 'before', ['create', 'patch', 'update']);
 
  return Promise.resolve()
    .then(() => hook.app.service(path || 'authManagement').create({ action: 'options' }))
    .then(options => Promise.all([
      options,
      getLongToken(options.longTokenLen),
      getShortToken(options.shortTokenLen, options.shortTokenDigits)
    ]))
    .then(([options, longToken, shortToken]) => {
      // We do NOT add verification fields if the 3 following conditions are fulfilled:
      // - hook is PATCH or PUT
      // - user is authenticated
      // - user's identifyUserProps fields did not change
      if (
        (hook.method === 'patch' || hook.method === 'update') &&
        !!hook.params.user &&
        !options.identifyUserProps.some(ensureFieldHasChanged(hook.data, hook.params.user))
      ) {
        return hook;
      }
 
      hook.data.isVerified = false;
      hook.data.verifyExpires = Date.now() + options.delay;
      hook.data.verifyToken = longToken;
      hook.data.verifyShortToken = shortToken;
      hook.data.verifyChanges = {};
 
      return hook;
    })
    .catch(err => { throw new errors.GeneralError(err); });
};
 
module.exports.isVerified = () => hook => {
  checkContext(hook, 'before');
 
  if (!hook.params.user || !hook.params.user.isVerified) {
    throw new errors.BadRequest('User\'s email is not yet verified.');
  }
};
 
module.exports.removeVerification = ifReturnTokens => hook => {
  checkContext(hook, 'after');
  // Retrieve the items from the hook
  let users = getItems(hook);
  if (!users) return;
  const isArray = Array.isArray(users);
  users = (isArray ? users : [users]);
 
  users.forEach(user => {
    if (!('isVerified' in user) && hook.method === 'create') {
      /* eslint-disable no-console */
      console.warn('Property isVerified not found in user properties. (removeVerification)');
      console.warn('Have you added authManagement\'s properties to your model? (Refer to README.md)');
      console.warn('Have you added the addVerification hook on users::create?');
      /* eslint-enable */
    }
 
    if (hook.params.provider && user) { // noop if initiated by server
      delete user.verifyExpires;
      delete user.resetExpires;
      delete user.verifyChanges;
      Eif (!ifReturnTokens) {
        delete user.verifyToken;
        delete user.verifyShortToken;
        delete user.resetToken;
        delete user.resetShortToken;
      }
    }
  });
  // Replace the items within the hook
  replaceItems(hook, isArray ? users : users[0]);
};