New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@fastify/csrf

Package Overview
Dependencies
Maintainers
19
Versions
13
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@fastify/csrf - npm Package Compare versions

Comparing version 7.1.1 to 8.0.0

test/polyfill.js

6

index.js

@@ -341,8 +341,6 @@ 'use strict'

fnBody.push('const base62 = \'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\'.split(\'\');')
fnBody.push('return function () {')
fnBody.push('const base62 = \'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\'.split(\'\');', 'return function () {')
const salt = []
for (let i = 0; i < saltLength; ++i) salt.push('base62[(62 * Math.random()) | 0]')
fnBody.push('return ' + salt.join('+'))
fnBody.push('}')
fnBody.push('return ' + salt.join('+'), '}')
return new Function(fnBody.join(''))() // eslint-disable-line no-new-func

@@ -349,0 +347,0 @@ }

{
"name": "@fastify/csrf",
"description": "primary logic behind csrf tokens",
"version": "7.1.1",
"version": "8.0.0",
"author": "Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)",

@@ -46,3 +46,3 @@ "main": "index.js",

"test": "npm run test:unit && npm run test:typescript",
"test:unit": "tap",
"test:unit": "c8 --100 node --test",
"test:typescript": "tsd"

@@ -54,5 +54,5 @@ },

"benchmark": "^2.1.4",
"c8": "^10.1.3",
"eslint": "^9.17.0",
"neostandard": "^0.12.0",
"tap": "^18.7.1",
"tsd": "^0.31.0"

@@ -59,0 +59,0 @@ },

'use strict'
const test = require('tap').test
const { test } = require('node:test')
const Tokens = require('..')

@@ -8,3 +8,3 @@

t.plan(1)
t.throws(() => new Tokens({ saltLength: 'bogus' }), new TypeError('option saltLength must be finite number > 1'))
t.assert.throws(() => new Tokens({ saltLength: 'bogus' }), new TypeError('option saltLength must be finite number > 1'))
})

@@ -14,3 +14,3 @@

t.plan(1)
t.throws(() => new Tokens({ saltLength: NaN }), new TypeError('option saltLength must be finite number > 1'))
t.assert.throws(() => new Tokens({ saltLength: NaN }), new TypeError('option saltLength must be finite number > 1'))
})

@@ -20,3 +20,3 @@

t.plan(1)
t.throws(() => new Tokens({ saltLength: Infinity }), new TypeError('option saltLength must be finite number > 1'))
t.assert.throws(() => new Tokens({ saltLength: Infinity }), new TypeError('option saltLength must be finite number > 1'))
})

@@ -26,3 +26,3 @@

t.plan(1)
t.throws(() => new Tokens({ secretLength: 'bogus' }), new TypeError('option secretLength must be finite number > 1'))
t.assert.throws(() => new Tokens({ secretLength: 'bogus' }), new TypeError('option secretLength must be finite number > 1'))
})

@@ -32,3 +32,3 @@

t.plan(1)
t.throws(() => new Tokens({ secretLength: NaN }), new TypeError('option secretLength must be finite number > 1'))
t.assert.throws(() => new Tokens({ secretLength: NaN }), new TypeError('option secretLength must be finite number > 1'))
})

@@ -38,3 +38,3 @@

t.plan(1)
t.throws(() => new Tokens({ secretLength: Infinity }), new TypeError('option secretLength must be finite number > 1'))
t.assert.throws(() => new Tokens({ secretLength: Infinity }), new TypeError('option secretLength must be finite number > 1'))
})

@@ -44,3 +44,3 @@

t.plan(1)
t.throws(() => new Tokens({ validity: 'bogus' }), new TypeError('option validity must be finite number > 0'))
t.assert.throws(() => new Tokens({ validity: 'bogus' }), new TypeError('option validity must be finite number > 0'))
})

@@ -50,3 +50,3 @@

t.plan(1)
t.throws(() => new Tokens({ validity: NaN }), new TypeError('option validity must be finite number > 0'))
t.assert.throws(() => new Tokens({ validity: NaN }), new TypeError('option validity must be finite number > 0'))
})

@@ -56,3 +56,3 @@

t.plan(1)
t.throws(() => new Tokens({ validity: Infinity }), new TypeError('option validity must be finite number > 0'))
t.assert.throws(() => new Tokens({ validity: Infinity }), new TypeError('option validity must be finite number > 0'))
})

@@ -62,3 +62,3 @@

t.plan(1)
t.throws(() => new Tokens({ userInfo: 'bogus' }), new TypeError('option userInfo must be a boolean'))
t.assert.throws(() => new Tokens({ userInfo: 'bogus' }), new TypeError('option userInfo must be a boolean'))
})

@@ -68,3 +68,3 @@

t.plan(1)
t.ok(Tokens() instanceof Tokens, true)
t.assert.ok(Tokens() instanceof Tokens, true)
})

@@ -74,3 +74,3 @@

t.plan(1)
t.throws(() => new Tokens({ algorithm: 'invalid' }), new TypeError('option algorithm must be a supported hash-algorithm'))
t.assert.throws(() => new Tokens({ algorithm: 'invalid' }), new TypeError('option algorithm must be a supported hash-algorithm'))
})
'use strict'
const test = require('tap').test
const { test } = require('node:test')
const Tokens = require('..')

@@ -9,3 +9,3 @@

t.throws(() => new Tokens().create(), new TypeError('argument secret is required'))
t.assert.throws(() => new Tokens().create(), new TypeError('argument secret is required'))
})

@@ -16,3 +16,3 @@

t.throws(() => new Tokens().create(42), new TypeError('argument secret is required'))
t.assert.throws(() => new Tokens().create(42), new TypeError('argument secret is required'))
})

@@ -23,3 +23,3 @@

t.throws(() => new Tokens().create(''), new TypeError('argument secret is required'))
t.assert.throws(() => new Tokens().create(''), new TypeError('argument secret is required'))
})

@@ -31,3 +31,3 @@

const secret = new Tokens().secretSync()
t.type(new Tokens().create(secret), 'string')
t.assert.ok(typeof new Tokens().create(secret) === 'string')
})

@@ -41,6 +41,6 @@

t.equal(tokenLength, 52)
t.assert.deepStrictEqual(tokenLength, 52)
for (let i = 0; i < 1000; i++) {
t.equal(new Tokens().create(secret).length, tokenLength)
t.assert.deepStrictEqual(new Tokens().create(secret).length, tokenLength)
}

@@ -54,6 +54,6 @@ })

const token = new Tokens().create(new Tokens().secretSync())
t.not(token.includes('/'))
t.not(token.includes('+'))
t.not(token.includes('='))
t.ok(token.split('-').length - 1 >= 1, token)
t.assert.ok(!token.includes('/'))
t.assert.ok(!token.includes('+'))
t.assert.ok(!token.includes('='))
t.assert.ok(token.split('-').length - 1 >= 1, token)
}

@@ -67,6 +67,6 @@ })

const token = new Tokens({ userInfo: true }).create(new Tokens().secretSync(), 'foo')
t.not(token.includes('/'))
t.not(token.includes('+'))
t.not(token.includes('='))
t.ok(token.split('-').length - 1 >= 2, token)
t.assert.ok(!token.includes('/'))
t.assert.ok(!token.includes('+'))
t.assert.ok(!token.includes('='))
t.assert.ok(token.split('-').length - 1 >= 2, token)
}

@@ -80,6 +80,6 @@ })

const token = new Tokens({ validity: 3600 }).create(new Tokens().secretSync())
t.not(token.includes('/'))
t.not(token.includes('+'))
t.not(token.includes('='))
t.ok(token.split('-').length - 1 >= 2, token)
t.assert.ok(!token.includes('/'))
t.assert.ok(!token.includes('+'))
t.assert.ok(!token.includes('='))
t.assert.ok(token.split('-').length - 1 >= 2, token)
}

@@ -93,6 +93,6 @@ })

const token = new Tokens({ validity: 3600, userInfo: true }).create(new Tokens().secretSync(), 'foo')
t.not(token.includes('/'))
t.not(token.includes('+'))
t.not(token.includes('='))
t.ok(token.split('-').length - 1 >= 3, token)
t.assert.ok(!token.includes('/'))
t.assert.ok(!token.includes('+'))
t.assert.ok(!token.includes('='))
t.assert.ok(token.split('-').length - 1 >= 3, token)
}

@@ -108,3 +108,3 @@ })

const token = new Tokens().create(new Tokens().secretSync())
t.not(tokenSet.has(token))
t.assert.ok(!tokenSet.has(token))
tokenSet.add(token)

@@ -119,3 +119,3 @@ }

t.throws(() => new Tokens({ userInfo: true }).create(secret), new Error('argument userInfo is required to be a string'))
t.assert.throws(() => new Tokens({ userInfo: true }).create(secret), new TypeError('argument userInfo is required to be a string'))
})
'use strict'
const test = require('tap').test
const { test } = require('node:test')
const Tokens = require('..')
require('./polyfill')
test('Tokens.constructor: instantiating Tokens with a non string hmacKey should throw', t => {
t.plan(1)
t.throws(() => new Tokens({ hmacKey: 123 }), new TypeError('option hmacKey must be a supported hmac key'))
t.assert.throws(() => new Tokens({ hmacKey: 123 }), new TypeError('option hmacKey must be a supported hmac key'))
})

@@ -14,7 +16,13 @@

const { promise, resolve } = Promise.withResolvers()
new Tokens({ hmacKey: 'foo' }).secret(function (err, secret) {
t.error(err)
t.type(secret, 'string')
t.equal(secret.length, 24)
t.assert.ifError(err)
t.assert.ok(typeof secret === 'string')
t.assert.deepStrictEqual(secret.length, 24)
resolve()
})
return promise
})

@@ -28,3 +36,3 @@

t.equal(new Tokens({ hmacKey: 'foo' }).verify(secret, token), true)
t.assert.deepStrictEqual(new Tokens({ hmacKey: 'foo' }).verify(secret, token), true)
})

@@ -38,7 +46,7 @@

t.equal(new Tokens({ hmacKey: 'foo' }).verify(new Tokens().secretSync(), token), false)
t.equal(new Tokens({ hmacKey: 'foo' }).verify('invalid', token), false)
t.equal(new Tokens({ hmacKey: 'foo' }).verify(), false)
t.equal(new Tokens({ hmacKey: 'foo' }).verify([]), false)
t.equal(new Tokens({ hmacKey: 'foo' }).verify('invalid'), false)
t.assert.deepStrictEqual(new Tokens({ hmacKey: 'foo' }).verify(new Tokens().secretSync(), token), false)
t.assert.deepStrictEqual(new Tokens({ hmacKey: 'foo' }).verify('invalid', token), false)
t.assert.deepStrictEqual(new Tokens({ hmacKey: 'foo' }).verify(), false)
t.assert.deepStrictEqual(new Tokens({ hmacKey: 'foo' }).verify([]), false)
t.assert.deepStrictEqual(new Tokens({ hmacKey: 'foo' }).verify('invalid'), false)
})

@@ -52,6 +60,6 @@

t.equal(new Tokens({ hmacKey: 'foo' }).verify('invalid', token), false)
t.equal(new Tokens({ hmacKey: 'foo' }).verify(secret, undefined), false)
t.equal(new Tokens({ hmacKey: 'foo' }).verify(secret, []), false)
t.equal(new Tokens({ hmacKey: 'foo' }).verify(secret, 'hi'), false)
t.assert.deepStrictEqual(new Tokens({ hmacKey: 'foo' }).verify('invalid', token), false)
t.assert.deepStrictEqual(new Tokens({ hmacKey: 'foo' }).verify(secret, undefined), false)
t.assert.deepStrictEqual(new Tokens({ hmacKey: 'foo' }).verify(secret, []), false)
t.assert.deepStrictEqual(new Tokens({ hmacKey: 'foo' }).verify(secret, 'hi'), false)
})

@@ -65,4 +73,4 @@

t.equal(new Tokens({ hmacKey: 'foo' }).verify(secret, token), true)
t.equal(new Tokens({ hmacKey: 'bar' }).verify(secret, token), false)
t.assert.deepStrictEqual(new Tokens({ hmacKey: 'foo' }).verify(secret, token), true)
t.assert.deepStrictEqual(new Tokens({ hmacKey: 'bar' }).verify(secret, token), false)
})
'use strict'
const test = require('tap').test
const { test } = require('node:test')
const Tokens = require('..')

@@ -12,3 +12,3 @@

t.equal(new Tokens({ validity: 3600 }).verify(secret, token), true)
t.assert.deepStrictEqual(new Tokens({ validity: 3600 }).verify(secret, token), true)
})

@@ -21,3 +21,3 @@

const now = Date.now()
t.teardown(() => { Date.now = fn })
t.after(() => { Date.now = fn })

@@ -29,3 +29,3 @@ const secret = new Tokens().secretSync()

Date.now = function () { return now + 3601 }
t.equal(new Tokens({ validity: 3600 }).verify(secret, token), false)
t.assert.deepStrictEqual(new Tokens({ validity: 3600 }).verify(secret, token), false)
})

@@ -38,3 +38,3 @@

const now = Date.now()
t.teardown(() => { Date.now = fn })
t.after(() => { Date.now = fn })

@@ -46,3 +46,3 @@ Date.now = function () { return now }

t.equal(new Tokens({ validity: 3600 }).verify(secret, token), true, { secret, token, now })
t.assert.deepStrictEqual(new Tokens({ validity: 3600 }).verify(secret, token), true, { secret, token, now })
})

@@ -56,3 +56,3 @@

t.equal(new Tokens({ validity: 3600 }).verify(secret, token), false)
t.assert.deepStrictEqual(new Tokens({ validity: 3600 }).verify(secret, token), false)
})

@@ -66,3 +66,3 @@

t.equal(new Tokens({ userInfo: true }).verify(secret, token, 'foobar'), true)
t.assert.deepStrictEqual(new Tokens({ userInfo: true }).verify(secret, token, 'foobar'), true)
})

@@ -76,3 +76,3 @@

t.equal(new Tokens({ userInfo: true }).verify(secret, token, 'foobar'), false)
t.assert.deepStrictEqual(new Tokens({ userInfo: true }).verify(secret, token, 'foobar'), false)
})

@@ -86,3 +86,3 @@

t.equal(new Tokens({ userInfo: true }).verify(secret, token), false)
t.assert.deepStrictEqual(new Tokens({ userInfo: true }).verify(secret, token), false)
})

@@ -96,3 +96,3 @@

t.equal(new Tokens({ userInfo: true }).verify(secret, token, {}), false)
t.assert.deepStrictEqual(new Tokens({ userInfo: true }).verify(secret, token, {}), false)
})

@@ -106,3 +106,3 @@

t.equal(new Tokens({ userInfo: true }).verify(secret, token, 'foo'), false)
t.assert.deepStrictEqual(new Tokens({ userInfo: true }).verify(secret, token, 'foo'), false)
})

@@ -116,3 +116,3 @@

t.equal(new Tokens({ validity: 3600 }).verify(secret, token), false)
t.assert.deepStrictEqual(new Tokens({ validity: 3600 }).verify(secret, token), false)
})

@@ -126,3 +126,3 @@

t.equal(new Tokens({ userInfo: true }).verify(secret, token, 'foo'), false)
t.assert.deepStrictEqual(new Tokens({ userInfo: true }).verify(secret, token, 'foo'), false)
})

@@ -136,3 +136,3 @@

t.equal(new Tokens({ userInfo: true }).verify(secret, token, 'foo'), false)
t.assert.deepStrictEqual(new Tokens({ userInfo: true }).verify(secret, token, 'foo'), false)
})

@@ -146,4 +146,4 @@

t.equal(token.length, 96)
t.equal(new Tokens({ userInfo: true, algorithm: 'sha256' }).verify(secret, token, 'foobar'), true)
t.assert.deepStrictEqual(token.length, 96)
t.assert.deepStrictEqual(new Tokens({ userInfo: true, algorithm: 'sha256' }).verify(secret, token, 'foobar'), true)
})

@@ -157,4 +157,4 @@

t.equal(token.length, 64)
t.equal(new Tokens({ userInfo: true, algorithm: 'sha1' }).verify(secret, token, 'foobar'), true)
t.assert.deepStrictEqual(token.length, 64)
t.assert.deepStrictEqual(new Tokens({ userInfo: true, algorithm: 'sha1' }).verify(secret, token, 'foobar'), true)
})
'use strict'
const { test, mockRequire } = require('tap')
const { test } = require('node:test')
const Tokens = require('..')
require('./polyfill')
test('Tokens.secret: should reject bad callback', t => {
t.plan(1)
t.throws(() => new Tokens().secret(42), new TypeError('argument callback must be a function'))
t.assert.throws(() => new Tokens().secret(42), new TypeError('argument callback must be a function'))
})

@@ -15,16 +17,22 @@

const { promise, resolve } = Promise.withResolvers()
new Tokens().secret(function (err, secret) {
t.error(err)
t.type(secret, 'string')
t.equal(secret.length, 24)
t.assert.ifError(err)
t.assert.ok(typeof secret === 'string')
t.assert.deepStrictEqual(secret.length, 24)
resolve()
})
return promise
})
test('Tokens.secret: with global Promise', t => {
test('Tokens.secret: with global Promise', async t => {
t.plan(2)
new Tokens().secret().then(function (secret) {
t.type(secret, 'string')
t.equal(secret.length, 24)
})
const secret = await new Tokens().secret()
t.assert.ok(typeof secret === 'string')
t.assert.deepStrictEqual(secret.length, 24)
})

@@ -37,5 +45,5 @@

global.Promise = undefined
t.teardown(() => { global.Promise = promise })
t.after(() => { global.Promise = promise })
t.throws(() => new Tokens().secret(), new TypeError('argument callback is required'))
t.assert.throws(() => new Tokens().secret(), new TypeError('argument callback is required'))
})

@@ -48,47 +56,61 @@

global.Promise = undefined
t.teardown(() => { global.Promise = promise })
t.throws(() => new Tokens().secret(42), new TypeError('argument callback must be a function'))
t.after(() => { global.Promise = promise })
t.assert.throws(() => new Tokens().secret(42), new TypeError('argument callback must be a function'))
})
test('Tokens.secret: should not contain /, +, or =, Promise', t => {
test('Tokens.secret: should not contain /, +, or =, Promise', async t => {
t.plan(3000)
for (let i = 0; i < 1000; i++) {
new Tokens().secret().then(function (secret) {
t.not(secret.includes('/'))
t.not(secret.includes('+'))
t.not(secret.includes('='))
})
const secret = await new Tokens().secret()
t.assert.ok(!secret.includes('/'))
t.assert.ok(!secret.includes('+'))
t.assert.ok(!secret.includes('='))
}
})
test('Tokens.secret: should not contain /, +, or =, callback', t => {
test('Tokens.secret: should not contain /, +, or =, callback', async t => {
t.plan(4000)
for (let i = 0; i < 1000; i++) {
const { promise, resolve } = Promise.withResolvers()
new Tokens().secret(function (err, secret) {
t.error(err)
t.not(secret.includes('/'))
t.not(secret.includes('+'))
t.not(secret.includes('='))
t.assert.ifError(err)
t.assert.ok(!secret.includes('/'))
t.assert.ok(!secret.includes('+'))
t.assert.ok(!secret.includes('='))
resolve()
})
await promise
}
})
test('Tokens.secret: should handle error, Promise', t => {
t.plan(2)
const Tokens = mockRequire('..', {
'node:crypto': {
randomBytes: (_size, cb) => {
cb(new Error('oh no'))
},
createHash: require('node:crypto').createHash
const mockRandomBytes = (t) => {
const crypto = require('node:crypto')
let oldCrypto
t.before(() => {
oldCrypto = crypto.randomBytes.bind(crypto)
crypto.randomBytes = (_size, cb) => {
cb(new Error('oh no'))
}
})
t.after(() => {
crypto.randomBytes = oldCrypto
})
}
new Tokens().secret().catch(err => {
t.ok(err instanceof Error)
t.ok(err.message === 'oh no')
})
test('Tokens.secret: should handle error, Promise', async t => {
t.plan(2)
mockRandomBytes(t)
try {
await new Tokens().secret()
} catch (err) {
t.assert.ok(err instanceof Error)
t.assert.ok(err.message === 'oh no')
}
})

@@ -99,15 +121,14 @@

const Tokens = mockRequire('..', {
'node:crypto': {
randomBytes: (size, cb) => {
cb(new Error('oh no'))
},
createHash: require('node:crypto').createHash
}
})
mockRandomBytes(t)
const { promise, resolve } = Promise.withResolvers()
new Tokens().secret(function (err, _secret) {
t.ok(err instanceof Error)
t.ok(err.message === 'oh no')
t.assert.ok(err instanceof Error)
t.assert.ok(err.message === 'oh no')
resolve()
})
return promise
})
'use strict'
const test = require('tap').test
const { test } = require('node:test')
const Tokens = require('..')

@@ -11,4 +11,4 @@

// 4 bytes = 6 base-64 characters
t.equal(new Tokens({ secretLength: 3 }).secretSync().length, 4)
t.equal(new Tokens({ secretLength: 4 }).secretSync().length, 6)
t.assert.deepStrictEqual(new Tokens({ secretLength: 3 }).secretSync().length, 4)
t.assert.deepStrictEqual(new Tokens({ secretLength: 4 }).secretSync().length, 6)
})

@@ -20,4 +20,4 @@

const secret = new Tokens().secretSync()
t.type(secret, 'string')
t.equal(secret.length, 24)
t.assert.ok(typeof secret === 'string')
t.assert.deepStrictEqual(secret.length, 24)
})

@@ -29,6 +29,6 @@

for (let i = 0; i < 1000; i++) {
t.not(new Tokens().secretSync().includes('/'))
t.not(new Tokens().secretSync().includes('+'))
t.not(new Tokens().secretSync().includes('='))
t.assert.ok(!new Tokens().secretSync().includes('/'))
t.assert.ok(!new Tokens().secretSync().includes('+'))
t.assert.ok(!new Tokens().secretSync().includes('='))
}
})
'use strict'
const test = require('tap').test
const { test } = require('node:test')
const Tokens = require('..')

@@ -12,3 +12,3 @@

t.equal(new Tokens().verify(secret, token), true)
t.assert.deepStrictEqual(new Tokens().verify(secret, token), true)
})

@@ -22,7 +22,7 @@

t.equal(new Tokens().verify(new Tokens().secretSync(), token), false)
t.equal(new Tokens().verify('invalid', token), false)
t.equal(new Tokens().verify(), false)
t.equal(new Tokens().verify([]), false)
t.equal(new Tokens().verify('invalid'), false)
t.assert.deepStrictEqual(new Tokens().verify(new Tokens().secretSync(), token), false)
t.assert.deepStrictEqual(new Tokens().verify('invalid', token), false)
t.assert.deepStrictEqual(new Tokens().verify(), false)
t.assert.deepStrictEqual(new Tokens().verify([]), false)
t.assert.deepStrictEqual(new Tokens().verify('invalid'), false)
})

@@ -36,6 +36,6 @@

t.equal(new Tokens().verify('invalid', token), false)
t.equal(new Tokens().verify(secret, undefined), false)
t.equal(new Tokens().verify(secret, []), false)
t.equal(new Tokens().verify(secret, 'hi'), false)
t.assert.deepStrictEqual(new Tokens().verify('invalid', token), false)
t.assert.deepStrictEqual(new Tokens().verify(secret, undefined), false)
t.assert.deepStrictEqual(new Tokens().verify(secret, []), false)
t.assert.deepStrictEqual(new Tokens().verify(secret, 'hi'), false)
})

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc