grannt 5.4.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,53 @@
1
+
2
+ var qs = require('qs')
3
+ var Grant = require('../grant')
4
+ var Session = require('../session')
5
+
6
+
7
+ module.exports = function (args = {}) {
8
+ var grant = Grant(args.config ? args : {config: args})
9
+ app.config = grant.config
10
+
11
+ var regex = new RegExp([
12
+ /^https?:\/\/[^/]+/.source,
13
+ app.config.defaults.prefix,
14
+ /(?:\/([^\/\?]+?))/.source, // /:provider
15
+ /(?:\/([^\/\?]+?))?/.source, // /:override?
16
+ /(?:\/$|\/?\?+.*)?$/.source, // querystring
17
+ ].join(''), 'i')
18
+
19
+ var store = Session(args.session)
20
+
21
+ async function app (req, state) {
22
+ var session = store(req)
23
+ var match = regex.exec(req.originalUrl)
24
+ if (!match) {
25
+ return {session}
26
+ }
27
+
28
+ var {location, session:sess, state} = await grant({
29
+ method: req.method,
30
+ params: {provider: match[1], override: match[2]},
31
+ query: {...req.query, code: req.query.oauth_code},
32
+ body: req.method === 'POST' ? req.body : {},
33
+ state,
34
+ session: (await session.get()).grant
35
+ })
36
+
37
+ await session.set({grant: sess})
38
+
39
+ return location
40
+ ? {session, redirect: redirect(location, session)}
41
+ : {session, response: state.response || sess.response}
42
+ }
43
+
44
+ return app
45
+ }
46
+
47
+ var redirect = (location, session) => ({
48
+ status: 302,
49
+ headers: {
50
+ location,
51
+ 'set-cookie': session.headers['set-cookie']
52
+ }
53
+ })
@@ -0,0 +1,46 @@
1
+
2
+ var qs = require('qs')
3
+ var Grant = require('../grant')
4
+
5
+
6
+ module.exports = function (args = {}) {
7
+ var grant = Grant(args.config ? args : {config: args})
8
+ app.config = grant.config
9
+
10
+ var regex = new RegExp([
11
+ '^',
12
+ app.config.defaults.prefix,
13
+ /(?:\/([^\/\?]+?))/.source, // /:provider
14
+ /(?:\/([^\/\?]+?))?/.source, // /:override?
15
+ /(?:\/$|\/?\?+.*)?$/.source, // querystring
16
+ ].join(''), 'i')
17
+
18
+ async function app (ctx, next) {
19
+ var match = regex.exec(ctx.path)
20
+ if (!match) {
21
+ return next()
22
+ }
23
+
24
+ if (!ctx.state.session) {
25
+ throw new Error('Grant: mount session middleware first')
26
+ }
27
+ if (ctx.method === 'POST' && !ctx.request.body) {
28
+ throw new Error('Grant: mount body parser middleware first')
29
+ }
30
+
31
+ var {location, session, state} = await grant({
32
+ method: ctx.method,
33
+ params: {provider: match[1], override: match[2]},
34
+ query: qs.parse(ctx.request.query),
35
+ body: qs.parse(ctx.request.body),
36
+ state: ctx.state.grant,
37
+ session: ctx.state.session.grant,
38
+ })
39
+
40
+ ctx.state.session.grant = session
41
+ ctx.state.grant = state
42
+ location ? ctx.response.redirect(302, location) : await next()
43
+ }
44
+
45
+ return app
46
+ }
@@ -0,0 +1,53 @@
1
+
2
+ var Grant = require('../grant')
3
+
4
+
5
+ module.exports = function (args = {}) {
6
+ var grant = Grant(args.config ? args : {config: args})
7
+ app.config = grant.config
8
+
9
+ var regex = new RegExp([
10
+ '^',
11
+ app.config.defaults.prefix,
12
+ /(?:\/([^\/\?]+?))/.source, // /:provider
13
+ /(?:\/([^\/\?]+?))?/.source, // /:override?
14
+ /(?:\/$|\/?\?+.*)?$/.source, // querystring
15
+ ].join(''), 'i')
16
+
17
+ async function app (req, res, next) {
18
+ var match = regex.exec(req.originalUrl)
19
+ if (!match) {
20
+ return next()
21
+ }
22
+
23
+ if (!req.session) {
24
+ next(new Error('Grant: mount session middleware first'))
25
+ return
26
+ }
27
+ if (req.method === 'POST' && !req.body) {
28
+ next(new Error('Grant: mount body parser middleware first'))
29
+ return
30
+ }
31
+
32
+ var {location, session, state} = await grant({
33
+ method: req.method,
34
+ params: {provider: match[1], override: match[2]},
35
+ query: req.query,
36
+ body: req.body,
37
+ state: res.locals.grant,
38
+ session: req.session.grant,
39
+ })
40
+
41
+ req.session.grant = session
42
+ res.locals.grant = state
43
+ location ? redirect(req, res, location) : next()
44
+ }
45
+
46
+ return app
47
+ }
48
+
49
+ var redirect = (req, res, location) =>
50
+ typeof req.session.save === 'function' &&
51
+ Object.getPrototypeOf(req.session).save.length
52
+ ? req.session.save(() => res.redirect(location))
53
+ : res.redirect(location)
@@ -0,0 +1,50 @@
1
+
2
+ var qs = require('qs')
3
+ var Grant = require('../grant')
4
+
5
+
6
+ module.exports = function (args = {}) {
7
+
8
+ function app (server, options, next) {
9
+ args = args.config ? args : {config: args}
10
+
11
+ var grant = Grant(args)
12
+ app.config = grant.config
13
+
14
+ var prefix = app.config.defaults.prefix.replace(options.prefix, '')
15
+
16
+ server.route({
17
+ method: ['GET', 'POST'],
18
+ path: `${prefix}/:provider`,
19
+ handler
20
+ })
21
+ server.route({
22
+ method: ['GET', 'POST'],
23
+ path: `${prefix}/:provider/:override`,
24
+ handler
25
+ })
26
+
27
+ async function handler (req, res) {
28
+ if (!req.session) {
29
+ throw new Error('Grant: register session plugin first')
30
+ }
31
+
32
+ var {location, session, state} = await grant({
33
+ method: req.method,
34
+ params: req.params,
35
+ query: qs.parse(req.query),
36
+ body: qs.parse(req.body),
37
+ state: req.grant,
38
+ session: req.session.grant,
39
+ })
40
+
41
+ req.session.grant = session
42
+ res.grant = state
43
+ return location ? res.redirect(location) : res.send()
44
+ }
45
+
46
+ next()
47
+ }
48
+
49
+ return app
50
+ }
@@ -0,0 +1,56 @@
1
+
2
+ var qs = require('qs')
3
+ var Grant = require('../grant')
4
+ var Session = require('../session')
5
+
6
+
7
+ module.exports = function (args = {}) {
8
+ var grant = Grant(args.config ? args : {config: args})
9
+ app.config = grant.config
10
+
11
+ var regex = new RegExp([
12
+ '^',
13
+ app.config.defaults.prefix,
14
+ /(?:\/([^\/\?]+?))/.source, // /:provider
15
+ /(?:\/([^\/\?]+?))?/.source, // /:override?
16
+ /(?:\/$|\/?\?+.*)?$/.source, // querystring
17
+ ].join(''), 'i')
18
+
19
+ var store = Session(args.session)
20
+
21
+ async function app (req, res, state) {
22
+ var session = store(req, res)
23
+ var match = regex.exec(req.url)
24
+ if (!match) {
25
+ return {session}
26
+ }
27
+
28
+ var {location, session:sess, state} = await grant({
29
+ method: req.method,
30
+ params: {provider: match[1], override: match[2]},
31
+ query: qs.parse(req.query),
32
+ body: req.body,
33
+ state,
34
+ session: (await session.get()).grant
35
+ })
36
+
37
+ await session.set({grant: sess})
38
+
39
+ return location
40
+ ? (redirect(res, location, session), {session, redirect: true})
41
+ : {session, response: state.response || sess.response}
42
+ }
43
+
44
+ return app
45
+ }
46
+
47
+ var redirect = (res, location, session) => {
48
+ res.setHeader('set-cookie', session.headers['set-cookie'])
49
+ setImmediate(() => {
50
+ if (!res.headersSent) {
51
+ res.statusCode = 302
52
+ res.setHeader('location', location)
53
+ res.end()
54
+ }
55
+ })
56
+ }
@@ -0,0 +1,60 @@
1
+
2
+ var url = require('url')
3
+ var qs = require('qs')
4
+ var Grant = require('../grant')
5
+
6
+
7
+ module.exports = function (args = {}) {
8
+ var app = {}
9
+
10
+ function register (server, options, next) {
11
+ args = args.config ? args : {config: args}
12
+ args.config = Object.keys(options).length ? options : args.config
13
+
14
+ var grant = Grant(args)
15
+ app.config = grant.config
16
+
17
+ var prefix = app.config.defaults.prefix
18
+ .replace(server.realm.modifiers.route.prefix, '')
19
+
20
+ server.route({
21
+ method: ['GET', 'POST'],
22
+ path: `${prefix}/{provider}/{override?}`,
23
+ handler: (req, res) => {
24
+ if (!(req.session || req.yar)) {
25
+ throw new Error('Grant: register session plugin first')
26
+ }
27
+
28
+ var query = (parseInt(server.version.split('.')[0]) >= 12)
29
+ ? qs.parse(url.parse(req.url, false).query) // #2985
30
+ : req.query
31
+
32
+ var body = (parseInt(server.version.split('.')[0]) >= 12)
33
+ ? qs.parse(req.payload) // #2985
34
+ : req.payload
35
+
36
+ grant({
37
+ method: req.method,
38
+ params: req.params,
39
+ query: query,
40
+ body: body,
41
+ state: req.plugins.grant,
42
+ session: (req.session || req.yar).get('grant'),
43
+ }).then(({location, session, state}) => {
44
+ ;(req.session || req.yar).set('grant', session)
45
+ req.plugins.grant = state
46
+ location ? res.redirect(location) : res.continue()
47
+ })
48
+ }
49
+ })
50
+
51
+ next()
52
+ }
53
+
54
+ register.attributes = {
55
+ pkg: require('../../package.json')
56
+ }
57
+
58
+ app.register = register
59
+ return app
60
+ }
@@ -0,0 +1,47 @@
1
+
2
+ var qs = require('qs')
3
+ var Grant = require('../grant')
4
+
5
+
6
+ module.exports = function (args = {}) {
7
+ var app = {}
8
+
9
+ function register (server, options) {
10
+ args = args.config ? args : {config: args}
11
+ args.config = Object.keys(options).length ? options : args.config
12
+
13
+ var grant = Grant(args)
14
+ app.config = grant.config
15
+
16
+ var prefix = app.config.defaults.prefix
17
+ .replace(server.realm.modifiers.route.prefix, '')
18
+
19
+ server.route({
20
+ method: ['GET', 'POST'],
21
+ path: `${prefix}/{provider}/{override?}`,
22
+ handler: async (req, res) => {
23
+ if (!req.yar) {
24
+ throw new Error('Grant: register session plugin first')
25
+ }
26
+
27
+ var {location, session, state} = await grant({
28
+ method: req.method,
29
+ params: req.params,
30
+ query: qs.parse(req.query),
31
+ body: qs.parse(req.payload), // #2985
32
+ state: req.plugins.grant,
33
+ session: req.yar.get('grant'),
34
+ })
35
+
36
+ req.yar.set('grant', session)
37
+ req.plugins.grant = state
38
+ return location ? res.redirect(location) : res.continue
39
+ }
40
+ })
41
+ }
42
+
43
+ app.pkg = require('../../package.json')
44
+
45
+ app.register = register
46
+ return app
47
+ }
@@ -0,0 +1,46 @@
1
+
2
+ var qs = require('qs')
3
+ var Grant = require('../grant')
4
+
5
+
6
+ module.exports = function (args) {
7
+ var grant = Grant((args || {}).config ? args : {config: args})
8
+ app.config = grant.config
9
+
10
+ var regex = new RegExp([
11
+ '^',
12
+ app.config.defaults.prefix,
13
+ /(?:\/([^\/\?]+?))/.source, // /:provider
14
+ /(?:\/([^\/\?]+?))?/.source, // /:override?
15
+ /(?:\/$|\/?\?+.*)?$/.source, // querystring
16
+ ].join(''), 'i')
17
+
18
+ function* app (next) {
19
+ var match = regex.exec(this.request.originalUrl)
20
+ if (!match) {
21
+ return yield next
22
+ }
23
+
24
+ if (!this.session) {
25
+ throw new Error('Grant: mount session middleware first')
26
+ }
27
+ if (this.method === 'POST' && !this.request.body) {
28
+ throw new Error('Grant: mount body parser middleware first')
29
+ }
30
+
31
+ var result = yield grant({
32
+ method: this.method,
33
+ params: {provider: match[1], override: match[2]},
34
+ query: qs.parse(this.request.query),
35
+ body: this.request.body,
36
+ state: this.state.grant,
37
+ session: this.session.grant,
38
+ })
39
+
40
+ this.session.grant = result.session
41
+ this.state.grant = result.state
42
+ result.location ? this.response.redirect(result.location) : yield next
43
+ }
44
+
45
+ return app
46
+ }
@@ -0,0 +1,46 @@
1
+
2
+ var qs = require('qs')
3
+ var Grant = require('../grant')
4
+
5
+
6
+ module.exports = function (args = {}) {
7
+ var grant = Grant(args.config ? args : {config: args})
8
+ app.config = grant.config
9
+
10
+ var regex = new RegExp([
11
+ '^',
12
+ app.config.defaults.prefix,
13
+ /(?:\/([^\/\?]+?))/.source, // /:provider
14
+ /(?:\/([^\/\?]+?))?/.source, // /:override?
15
+ /(?:\/$|\/?\?+.*)?$/.source, // querystring
16
+ ].join(''), 'i')
17
+
18
+ async function app (ctx, next) {
19
+ var match = regex.exec(ctx.originalUrl)
20
+ if (!match) {
21
+ return next()
22
+ }
23
+
24
+ if (!ctx.session) {
25
+ ctx.throw(400, 'Grant: mount session middleware first')
26
+ }
27
+ if (ctx.method === 'POST' && !ctx.request.body) {
28
+ ctx.throw(400, 'Grant: mount body parser middleware first')
29
+ }
30
+
31
+ var {location, session, state} = await grant({
32
+ method: ctx.method,
33
+ params: {provider: match[1], override: match[2]},
34
+ query: qs.parse(ctx.request.query),
35
+ body: ctx.request.body,
36
+ state: ctx.state.grant,
37
+ session: ctx.session.grant,
38
+ })
39
+
40
+ ctx.session.grant = session
41
+ ctx.state.grant = state
42
+ location ? ctx.response.redirect(location) : await next()
43
+ }
44
+
45
+ return app
46
+ }
@@ -0,0 +1,62 @@
1
+
2
+ var qs = require('qs')
3
+ var Grant = require('../grant')
4
+ var Session = require('../session')
5
+
6
+
7
+ module.exports = function (args = {}) {
8
+ var grant = Grant(args.config ? args : {config: args})
9
+ app.config = grant.config
10
+
11
+ var regex = new RegExp([
12
+ '^',
13
+ app.config.defaults.prefix,
14
+ /(?:\/([^\/\?]+?))/.source, // /:provider
15
+ /(?:\/([^\/\?]+?))?/.source, // /:override?
16
+ /(?:\/$|\/?\?+(.*))?$/.source, // querystring
17
+ ].join(''), 'i')
18
+
19
+ var store = Session(args.session)
20
+
21
+ async function app (req, res, state) {
22
+ var session = store(req, res)
23
+ var match = regex.exec(req.url)
24
+ if (!match) {
25
+ return {session}
26
+ }
27
+
28
+ var {location, session:sess, state} = await grant({
29
+ method: req.method,
30
+ params: {provider: match[1], override: match[2]},
31
+ query: qs.parse(match[3]),
32
+ body: req.method === 'POST' ? qs.parse(await buffer(req)) : {},
33
+ state,
34
+ session: (await session.get()).grant
35
+ })
36
+
37
+ await session.set({grant: sess})
38
+
39
+ return location
40
+ ? (redirect(res, location, session), {session, redirect: true})
41
+ : {session, response: state.response || sess.response}
42
+ }
43
+
44
+ return app
45
+ }
46
+
47
+ var redirect = (res, location, session) => {
48
+ res.setHeader('set-cookie', session.headers['set-cookie'])
49
+ setImmediate(() => {
50
+ if (!res.headersSent) {
51
+ res.statusCode = 302
52
+ res.setHeader('location', location)
53
+ res.end()
54
+ }
55
+ })
56
+ }
57
+
58
+ var buffer = (req, body = []) => new Promise((resolve, reject) => req
59
+ .on('data', (chunk) => body.push(chunk))
60
+ .on('end', () => resolve(Buffer.concat(body).toString('utf8')))
61
+ .on('error', reject)
62
+ )
@@ -0,0 +1,56 @@
1
+
2
+ var qs = require('qs')
3
+ var Grant = require('../grant')
4
+ var Session = require('../session')
5
+
6
+
7
+ module.exports = function (args = {}) {
8
+ var grant = Grant(args.config ? args : {config: args})
9
+ app.config = grant.config
10
+
11
+ var regex = new RegExp([
12
+ '^',
13
+ app.config.defaults.prefix,
14
+ /(?:\/([^\/\?]+?))/.source, // /:provider
15
+ /(?:\/([^\/\?]+?))?/.source, // /:override?
16
+ /(?:\/$|\/?\?+.*)?$/.source, // querystring
17
+ ].join(''), 'i')
18
+
19
+ var store = Session(args.session)
20
+
21
+ async function app (req, res, state) {
22
+ var session = store(req, res)
23
+ var match = regex.exec(req.url)
24
+ if (!match) {
25
+ return {session}
26
+ }
27
+
28
+ var {location, session:sess, state} = await grant({
29
+ method: req.method,
30
+ params: {provider: match[1], override: match[2]},
31
+ query: qs.parse(req.query),
32
+ body: req.body,
33
+ state,
34
+ session: (await session.get()).grant
35
+ })
36
+
37
+ await session.set({grant: sess})
38
+
39
+ return location
40
+ ? (redirect(res, location, session), {session, redirect: true})
41
+ : {session, response: state.response || sess.response}
42
+ }
43
+
44
+ return app
45
+ }
46
+
47
+ var redirect = (res, location, session) => {
48
+ res.setHeader('set-cookie', session.headers['set-cookie'])
49
+ setImmediate(() => {
50
+ if (!res.headersSent) {
51
+ res.statusCode = 302
52
+ res.setHeader('location', location)
53
+ res.end()
54
+ }
55
+ })
56
+ }
package/lib/oidc.js ADDED
@@ -0,0 +1,47 @@
1
+
2
+ var crypto = require('crypto')
3
+
4
+
5
+ var base64url = (str) =>
6
+ str.toString('base64').replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_')
7
+
8
+ var kid = (jwk) => {
9
+ if (jwk.kid) {
10
+ return jwk.kid
11
+ }
12
+ var keys =
13
+ jwk.kty === 'RSA' ? {e: jwk.e, kty: jwk.kty, n: jwk.n} :
14
+ jwk.kty === 'EC' ? {crv: jwk.crv, kty: jwk.kty, x: jwk.x, y: jwk.y} :
15
+ jwk.kty === 'oct' ? {k: jwk.k, kty: jwk.kty} : undefined
16
+ return keys
17
+ ? base64url(crypto.createHash('sha256').update(JSON.stringify(keys)).digest())
18
+ : undefined
19
+ }
20
+
21
+ var x5t = (cert) => {
22
+ var s1 = cert.replace(/(?:-----(?:BEGIN|END) CERTIFICATE-----|\s)/g, '')
23
+ var s2 = Buffer.from(s1, 'base64')
24
+ var s3 = crypto.createHash('sha1').update(s2).digest('hex').toUpperCase()
25
+ return base64url(Buffer.from(s3, 'hex'))
26
+ }
27
+
28
+ var pem = (jwk) => {
29
+ var pem = require('jwk-to-pem')
30
+ return pem(jwk, {private: true})
31
+ }
32
+
33
+ var sign = (jwt) => {
34
+ var jws = require('jws')
35
+ return jws.sign(jwt)
36
+ }
37
+
38
+ var jwt = (str) => {
39
+ var [header, payload, signature] = str.split('.')
40
+ return {
41
+ header: JSON.parse(Buffer.from(header, 'base64').toString('binary')),
42
+ payload: JSON.parse(Buffer.from(payload, 'base64').toString('utf8')),
43
+ signature,
44
+ }
45
+ }
46
+
47
+ module.exports = {base64url, kid, x5t, pem, sign, jwt}