All files / node-user-accounts-boilerplate-nahid/restriction recaptcha.js

100% Statements 15/15
100% Branches 18/18
100% Functions 4/4
100% Lines 15/15

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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                                12x     6x 6x   6x   3x       3x   3x   1x   2x           2x   1x       1x             9x   20x       3x  
"use strict";
 
/**
 * Implementation of reCAPTCHA rate restriction.
 * 
 * Will validate recaptcha using req.body.recaptchaResponse value.
 * 
 * Requires ```node-recaptcha2``` package.
 * 
 * @param {object} [settings] settings for recaptcha, or null to disable
 * @param {string} settings.privateKey also known as secret key
 * @param {string} settings.publicKey also known as site key
 * @return {ExpressMiddlewareFunction}
 */
function recaptcha(settings = null)
{
  if (settings)
  {
    // make sure we have all the settings we need
    const privateKey = settings.privateKey || false;
    const publicKey = settings.publicKey || false;
 
    if (privateKey && publicKey)
    {
      let Recaptcha = require('node-recaptcha2')
        .Recaptcha;
 
 
      return function (req, res, next)
      {
        if (!req.body.recaptchaResponse || typeof req.body.recaptchaResponse !== 'string' || req.body.recaptchaResponse.length < 1)
        {
          return res.error('reCAPTCHA response not included');
        }
        (new Recaptcha(publicKey, privateKey, {
          remoteip: req.clientIp,
          response: req.body.recaptchaResponse
        }))
        .verify((success, errCode) =>
        {
          if (!success)
          {
            res.error('Failed verifying reCAPTCHA');
          }
          else
          {
            next();
          }
        });
      };
    }
  }
 
  return function (req, res, next)
  {
    next();
  };
}
 
module.exports = recaptcha;