All files hooks.js

97.44% Statements 38/39
95.83% Branches 23/24
90% Functions 9/10
97.22% Lines 35/36
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      1x       18x 13x   13x 13x 13x         52x         13x         1x     12x 12x 12x 12x 12x   12x         8x 8x   6x 3x       6x 6x 5x   5x   2x 2x 2x       5x 4x 4x 4x 4x 4x 4x 4x 4x        
 
/* eslint no-param-reassign: 0 */
 
const errors = require('feathers-errors');
const { checkContext } = 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');
  const user = hook.result || {};
 
  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;
    }
  }
};