diff options
Diffstat (limited to 'node_modules/csurf/index.js')
| -rw-r--r-- | node_modules/csurf/index.js | 306 |
1 files changed, 0 insertions, 306 deletions
diff --git a/node_modules/csurf/index.js b/node_modules/csurf/index.js deleted file mode 100644 index 9b8c19e..0000000 --- a/node_modules/csurf/index.js +++ /dev/null @@ -1,306 +0,0 @@ -/*! - * csurf - * Copyright(c) 2011 Sencha Inc. - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2014-2016 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var Cookie = require('cookie') -var createError = require('http-errors') -var sign = require('cookie-signature').sign -var Tokens = require('csrf') - -/** - * Module exports. - * @public - */ - -module.exports = csurf - -/** - * CSRF protection middleware. - * - * This middleware adds a `req.csrfToken()` function to make a token - * which should be added to requests which mutate - * state, within a hidden form field, query-string etc. This - * token is validated against the visitor's session. - * - * @param {Object} options - * @return {Function} middleware - * @public - */ - -function csurf (options) { - var opts = options || {} - - // get cookie options - var cookie = getCookieOptions(opts.cookie) - - // get session options - var sessionKey = opts.sessionKey || 'session' - - // get value getter - var value = opts.value || defaultValue - - // token repo - var tokens = new Tokens(opts) - - // ignored methods - var ignoreMethods = opts.ignoreMethods === undefined - ? ['GET', 'HEAD', 'OPTIONS'] - : opts.ignoreMethods - - if (!Array.isArray(ignoreMethods)) { - throw new TypeError('option ignoreMethods must be an array') - } - - // generate lookup - var ignoreMethod = getIgnoredMethods(ignoreMethods) - - return function csrf (req, res, next) { - // validate the configuration against request - if (!verifyConfiguration(req, sessionKey, cookie)) { - return next(new Error('misconfigured csrf')) - } - - // get the secret from the request - var secret = getSecret(req, sessionKey, cookie) - var token - - // lazy-load token getter - req.csrfToken = function csrfToken () { - var sec = !cookie - ? getSecret(req, sessionKey, cookie) - : secret - - // use cached token if secret has not changed - if (token && sec === secret) { - return token - } - - // generate & set new secret - if (sec === undefined) { - sec = tokens.secretSync() - setSecret(req, res, sessionKey, sec, cookie) - } - - // update changed secret - secret = sec - - // create new token - token = tokens.create(secret) - - return token - } - - // generate & set secret - if (!secret) { - secret = tokens.secretSync() - setSecret(req, res, sessionKey, secret, cookie) - } - - // verify the incoming token - if (!ignoreMethod[req.method] && !tokens.verify(secret, value(req))) { - return next(createError(403, 'invalid csrf token', { - code: 'EBADCSRFTOKEN' - })) - } - - next() - } -} - -/** - * Default value function, checking the `req.body` - * and `req.query` for the CSRF token. - * - * @param {IncomingMessage} req - * @return {String} - * @api private - */ - -function defaultValue (req) { - return (req.body && req.body._csrf) || - (req.query && req.query._csrf) || - (req.headers['csrf-token']) || - (req.headers['xsrf-token']) || - (req.headers['x-csrf-token']) || - (req.headers['x-xsrf-token']) -} - -/** - * Get options for cookie. - * - * @param {boolean|object} [options] - * @returns {object} - * @api private - */ - -function getCookieOptions (options) { - if (options !== true && typeof options !== 'object') { - return undefined - } - - var opts = { - key: '_csrf', - path: '/' - } - - if (options && typeof options === 'object') { - for (var prop in options) { - var val = options[prop] - - if (val !== undefined) { - opts[prop] = val - } - } - } - - return opts -} - -/** - * Get a lookup of ignored methods. - * - * @param {array} methods - * @returns {object} - * @api private - */ - -function getIgnoredMethods (methods) { - var obj = Object.create(null) - - for (var i = 0; i < methods.length; i++) { - var method = methods[i].toUpperCase() - obj[method] = true - } - - return obj -} - -/** - * Get the token secret from the request. - * - * @param {IncomingMessage} req - * @param {String} sessionKey - * @param {Object} [cookie] - * @api private - */ - -function getSecret (req, sessionKey, cookie) { - // get the bag & key - var bag = getSecretBag(req, sessionKey, cookie) - var key = cookie ? cookie.key : 'csrfSecret' - - if (!bag) { - /* istanbul ignore next: should never actually run */ - throw new Error('misconfigured csrf') - } - - // return secret from bag - return bag[key] -} - -/** - * Get the token secret bag from the request. - * - * @param {IncomingMessage} req - * @param {String} sessionKey - * @param {Object} [cookie] - * @api private - */ - -function getSecretBag (req, sessionKey, cookie) { - if (cookie) { - // get secret from cookie - var cookieKey = cookie.signed - ? 'signedCookies' - : 'cookies' - - return req[cookieKey] - } else { - // get secret from session - return req[sessionKey] - } -} - -/** - * Set a cookie on the HTTP response. - * - * @param {OutgoingMessage} res - * @param {string} name - * @param {string} val - * @param {Object} [options] - * @api private - */ - -function setCookie (res, name, val, options) { - var data = Cookie.serialize(name, val, options) - - var prev = res.getHeader('set-cookie') || [] - var header = Array.isArray(prev) ? prev.concat(data) - : Array.isArray(data) ? [prev].concat(data) - : [prev, data] - - res.setHeader('set-cookie', header) -} - -/** - * Set the token secret on the request. - * - * @param {IncomingMessage} req - * @param {OutgoingMessage} res - * @param {string} sessionKey - * @param {string} val - * @param {Object} [cookie] - * @api private - */ - -function setSecret (req, res, sessionKey, val, cookie) { - if (cookie) { - // set secret on cookie - if (cookie.signed) { - var secret = req.secret - - if (!secret) { - /* istanbul ignore next: should never actually run */ - throw new Error('misconfigured csrf') - } - - val = 's:' + sign(val, secret) - } - - setCookie(res, cookie.key, val, cookie) - } else if (req[sessionKey]) { - // set secret on session - req[sessionKey].csrfSecret = val - } else { - /* istanbul ignore next: should never actually run */ - throw new Error('misconfigured csrf') - } -} - -/** - * Verify the configuration against the request. - * @private - */ - -function verifyConfiguration (req, sessionKey, cookie) { - if (!getSecretBag(req, sessionKey, cookie)) { - return false - } - - if (cookie && cookie.signed && !req.secret) { - return false - } - - return true -} |
