From a8b24ef7a932dfb1a1e33d848ef43b2f6dd4d41f Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Thu, 7 Feb 2019 14:10:49 +0100 Subject: [PATCH 01/60] trustedOrigins is empty by default --- config/defaults.js | 2 +- test/integration/authentication-oidc-test.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/config/defaults.js b/config/defaults.js index 97c82f0e6..92b4ef70e 100644 --- a/config/defaults.js +++ b/config/defaults.js @@ -12,7 +12,7 @@ module.exports = { 'serverUri': 'https://localhost:8443', 'webid': true, 'strictOrigin': true, - 'trustedOrigins': ['https://apps.solid.invalid'], + 'trustedOrigins': [], 'dataBrowserPath': 'default' // For use in Enterprises to configure a HTTP proxy for all outbound HTTP requests from the SOLID server (we use diff --git a/test/integration/authentication-oidc-test.js b/test/integration/authentication-oidc-test.js index 54281eec3..bfa4a315b 100644 --- a/test/integration/authentication-oidc-test.js +++ b/test/integration/authentication-oidc-test.js @@ -42,7 +42,8 @@ describe('Authentication API (OIDC)', () => { dataBrowser: false, webid: true, multiuser: false, - configPath + configPath, + trustedOrigins: ['https://apps.solid.invalid'] } const aliceRootPath = path.join(__dirname, '../resources/accounts-scenario/alice') From 8f5df1bfbe9c0bf4a9650797d2dc3e41d9832f19 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 15 Feb 2019 01:22:06 +0000 Subject: [PATCH 02/60] fix: package.json & package-lock.json to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-HANDLEBARS-173692 --- package-lock.json | 25 +++++++++++++++---------- package.json | 2 +- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5ea6345f8..f3161f52c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3582,9 +3582,9 @@ "dev": true }, "handlebars": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", - "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.13.tgz", + "integrity": "sha512-uydY0jy4Z3wy/iGXsi64UtLD4t1fFJe16c/NFxsYE4WdQis8ZCzOXUZaPQNG0e5bgtLQV41QTfqBindhEjnpyQ==", "requires": { "async": "^2.5.0", "optimist": "^0.6.1", @@ -3593,11 +3593,11 @@ }, "dependencies": { "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", "requires": { - "lodash": "^4.17.10" + "lodash": "^4.17.11" } }, "source-map": { @@ -5165,6 +5165,7 @@ "version": "0.1.4", "bundled": true, "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -5489,7 +5490,8 @@ "is-buffer": { "version": "1.1.6", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "is-builtin-module": { "version": "1.0.0", @@ -5573,6 +5575,7 @@ "version": "3.2.2", "bundled": true, "dev": true, + "optional": true, "requires": { "is-buffer": "^1.1.5" } @@ -5619,7 +5622,8 @@ "longest": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "lru-cache": { "version": "4.1.3", @@ -5885,7 +5889,8 @@ "repeat-string": { "version": "1.6.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "require-directory": { "version": "2.1.1", diff --git a/package.json b/package.json index 7e0eea54a..4916d4fc8 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "get-folder-size": "^2.0.0", "glob": "^7.1.1", "global-tunnel-ng": "^2.1.0", - "handlebars": "^4.0.6", + "handlebars": "^4.0.13", "http-proxy-middleware": "^0.18.0", "inquirer": "^1.0.2", "ip-range-check": "0.0.2", From 92ca52456a0fbf68b3ffe035f91ca84f9fa0b5d0 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Mon, 28 Jan 2019 20:07:08 +0100 Subject: [PATCH 03/60] Restricting access to API endpoints to top domain --- lib/api/accounts/user-accounts.js | 16 +++++++----- lib/api/authn/webid-oidc.js | 26 ++++++++++--------- lib/capability-discovery.js | 3 ++- lib/handlers/restrict-to-top-domain.js | 12 +++++++++ lib/utils.js | 6 +++-- .../integration/account-creation-oidc-test.js | 19 +++++++------- 6 files changed, 51 insertions(+), 31 deletions(-) create mode 100644 lib/handlers/restrict-to-top-domain.js diff --git a/lib/api/accounts/user-accounts.js b/lib/api/accounts/user-accounts.js index cc5daafd0..2d58631cd 100644 --- a/lib/api/accounts/user-accounts.js +++ b/lib/api/accounts/user-accounts.js @@ -4,6 +4,8 @@ const express = require('express') const bodyParser = require('body-parser').urlencoded({ extended: false }) const debug = require('../../debug').accounts +const restrictToTopDomain = require('../../handlers/restrict-to-top-domain') + const CreateAccountRequest = require('../../requests/create-account-request') const AddCertificateRequest = require('../../requests/add-cert-request') const DeleteAccountRequest = require('../../requests/delete-account-request') @@ -65,16 +67,16 @@ function middleware (accountManager) { router.get('/', checkAccountExists(accountManager)) - router.post('/api/accounts/new', bodyParser, CreateAccountRequest.post) - router.get(['/register', '/api/accounts/new'], CreateAccountRequest.get) + router.post('/api/accounts/new', restrictToTopDomain, bodyParser, CreateAccountRequest.post) + router.get(['/register', '/api/accounts/new'], restrictToTopDomain, CreateAccountRequest.get) - router.post('/api/accounts/cert', bodyParser, newCertificate(accountManager)) + router.post('/api/accounts/cert', restrictToTopDomain, bodyParser, newCertificate(accountManager)) - router.get('/account/delete', DeleteAccountRequest.get) - router.post('/account/delete', bodyParser, DeleteAccountRequest.post) + router.get('/account/delete', restrictToTopDomain, DeleteAccountRequest.get) + router.post('/account/delete', restrictToTopDomain, bodyParser, DeleteAccountRequest.post) - router.get('/account/delete/confirm', DeleteAccountConfirmRequest.get) - router.post('/account/delete/confirm', bodyParser, DeleteAccountConfirmRequest.post) + router.get('/account/delete/confirm', restrictToTopDomain, DeleteAccountConfirmRequest.get) + router.post('/account/delete/confirm', restrictToTopDomain, bodyParser, DeleteAccountConfirmRequest.post) return router } diff --git a/lib/api/authn/webid-oidc.js b/lib/api/authn/webid-oidc.js index f48f7d3d0..46546fdf4 100644 --- a/lib/api/authn/webid-oidc.js +++ b/lib/api/authn/webid-oidc.js @@ -9,6 +9,8 @@ const bodyParser = require('body-parser').urlencoded({ extended: false }) const OidcManager = require('../../models/oidc-manager') const { LoginRequest } = require('../../requests/login-request') +const restrictToTopDomain = require('../../handlers/restrict-to-top-domain') + const PasswordResetEmailRequest = require('../../requests/password-reset-email-request') const PasswordChangeRequest = require('../../requests/password-change-request') @@ -65,29 +67,29 @@ function middleware (oidc) { const router = express.Router('/') // User-facing Authentication API - router.get(['/login', '/signin'], LoginRequest.get) + router.get(['/login', '/signin'], restrictToTopDomain, LoginRequest.get) - router.post('/login/password', bodyParser, LoginRequest.loginPassword) + router.post('/login/password', restrictToTopDomain, bodyParser, LoginRequest.loginPassword) - router.post('/login/tls', bodyParser, LoginRequest.loginTls) + router.post('/login/tls', restrictToTopDomain, bodyParser, LoginRequest.loginTls) - router.get('/account/password/reset', PasswordResetEmailRequest.get) - router.post('/account/password/reset', bodyParser, PasswordResetEmailRequest.post) + router.get('/account/password/reset', restrictToTopDomain, PasswordResetEmailRequest.get) + router.post('/account/password/reset', restrictToTopDomain, bodyParser, PasswordResetEmailRequest.post) - router.get('/account/password/change', PasswordChangeRequest.get) - router.post('/account/password/change', bodyParser, PasswordChangeRequest.post) + router.get('/account/password/change', restrictToTopDomain, PasswordChangeRequest.get) + router.post('/account/password/change', restrictToTopDomain, bodyParser, PasswordChangeRequest.post) - router.get('/.well-known/solid/logout/', (req, res) => res.redirect('/logout')) + router.get('/.well-known/solid/logout/', restrictToTopDomain, (req, res) => res.redirect('/logout')) - router.get('/goodbye', (req, res) => { res.render('auth/goodbye') }) + router.get('/goodbye', restrictToTopDomain, (req, res) => { res.render('auth/goodbye') }) // The relying party callback is called at the end of the OIDC signin process - router.get('/api/oidc/rp/:issuer_id', AuthCallbackRequest.get) + router.get('/api/oidc/rp/:issuer_id', restrictToTopDomain, AuthCallbackRequest.get) // Static assets related to authentication const authAssets = [ - ['/.well-known/solid/login/', '../static/popup-redirect.html', false], - ['/common/', 'solid-auth-client/dist-popup/popup.html'] + ['/.well-known/solid/login/', '../static/popup-redirect.html', false, true], + ['/common/', 'solid-auth-client/dist-popup/popup.html', true, true] ] authAssets.map(args => routeResolvedFile(router, ...args)) diff --git a/lib/capability-discovery.js b/lib/capability-discovery.js index 567ee2561..6acc386dd 100644 --- a/lib/capability-discovery.js +++ b/lib/capability-discovery.js @@ -3,6 +3,7 @@ * @module capability-discovery */ const express = require('express') +const restrictToTopDomain = require('./handlers/restrict-to-top-domain') const serviceConfigDefaults = { 'api': { @@ -31,7 +32,7 @@ function capabilityDiscovery () { const router = express.Router('/') // Advertise the server capability discover endpoint - router.get('/.well-known/solid', serviceCapabilityDocument(serviceConfigDefaults)) + router.get('/.well-known/solid', restrictToTopDomain, serviceCapabilityDocument(serviceConfigDefaults)) return router } diff --git a/lib/handlers/restrict-to-top-domain.js b/lib/handlers/restrict-to-top-domain.js new file mode 100644 index 000000000..b2b770f61 --- /dev/null +++ b/lib/handlers/restrict-to-top-domain.js @@ -0,0 +1,12 @@ +const HTTPError = require('../http-error') + +module.exports = function (req, res, next) { + const locals = req.app.locals + const ldp = locals.ldp + const serverUri = locals.host.serverUri + const hostname = ldp.resourceMapper.resolveUrl(req.hostname) + if (hostname === serverUri) { + return next() + } + return next(new HTTPError(403, 'Not allowed to access top-level APIs on accounts')) +} diff --git a/lib/utils.js b/lib/utils.js index 21e5f6870..9ac035620 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -21,6 +21,7 @@ const url = require('url') const debug = require('./debug').fs const getSize = require('get-folder-size') var ns = require('solid-namespace')($rdf) +const restrictToTopDomainHandler = require('./handlers/restrict-to-top-domain') /** * Returns a fully qualified URL from an Express.js Request object. @@ -178,10 +179,11 @@ function stripLineEndings (obj) { /** * Adds a route that serves a static file from another Node module */ -function routeResolvedFile (router, path, file, appendFileName = true) { +function routeResolvedFile (router, path, file, appendFileName = true, restrictToTopDomain = false) { const fullPath = appendFileName ? path + file.match(/[^/]+$/) : path const fullFile = require.resolve(file) - router.get(fullPath, (req, res) => res.sendFile(fullFile)) + const restrictHandler = restrictToTopDomain ? restrictToTopDomainHandler : (req, res, next) => next() + router.get(fullPath, restrictHandler, (req, res) => res.sendFile(fullFile)) } /** diff --git a/test/integration/account-creation-oidc-test.js b/test/integration/account-creation-oidc-test.js index cda089586..6d2be533d 100644 --- a/test/integration/account-creation-oidc-test.js +++ b/test/integration/account-creation-oidc-test.js @@ -80,21 +80,21 @@ describe('AccountManager (OIDC account creation tests)', function () { }) it('should not create WebID if no username is given', (done) => { - let subdomain = supertest('https://nicola.' + host) + let subdomain = supertest('https://' + host) subdomain.post('/api/accounts/new') .send('username=&password=12345') .expect(400, done) }) it('should not create WebID if no password is given', (done) => { - let subdomain = supertest('https://nicola.' + host) + let subdomain = supertest('https://' + host) subdomain.post('/api/accounts/new') .send('username=nicola&password=') .expect(400, done) }) it('should not create a WebID if it already exists', function (done) { - var subdomain = supertest('https://nicola.' + host) + var subdomain = supertest('https://' + host) subdomain.post('/api/accounts/new') .send('username=nicola&password=12345&acceptToc=true') .expect(302) @@ -112,14 +112,14 @@ describe('AccountManager (OIDC account creation tests)', function () { }) it('should not create WebID if T&C is not accepted', (done) => { - let subdomain = supertest('https://nicola.' + host) + let subdomain = supertest('https://' + host) subdomain.post('/api/accounts/new') .send('username=nicola&password=12345&acceptToc=') .expect(400, done) }) it('should create the default folders', function (done) { - var subdomain = supertest('https://nicola.' + host) + var subdomain = supertest('https://' + host) subdomain.post('/api/accounts/new') .send('username=nicola&password=12345&acceptToc=true') .expect(302) @@ -150,14 +150,15 @@ describe('AccountManager (OIDC account creation tests)', function () { }).timeout(20000) it('should link WebID to the root account', function (done) { - var subdomain = supertest('https://nicola.' + host) - subdomain.post('/api/accounts/new') + const domain = supertest('https://' + host) + domain.post('/api/accounts/new') .send('username=nicola&password=12345&acceptToc=true') .expect(302) .end(function (err) { if (err) { return done(err) } + const subdomain = supertest('https://nicola.' + host) subdomain.get('/.meta') .expect(200) .end(function (err, data) { @@ -185,7 +186,7 @@ describe('AccountManager (OIDC account creation tests)', function () { describe('after setting up account', () => { beforeEach(done => { - var subdomain = supertest('https://nicola.' + host) + var subdomain = supertest('https://' + host) subdomain.post('/api/accounts/new') .send('username=nicola&password=12345&acceptToc=true') .end(done) @@ -294,7 +295,7 @@ describe('Signup page where Terms & Conditions are not being enforced', () => { }) it('should not enforce T&C upon creating account', function (done) { - var subdomain = supertest('https://nicola.' + host) + var subdomain = supertest('https://' + host) subdomain.post('/api/accounts/new') .send('username=nicola&password=12345') .expect(302, done) From f02987d7fab3d5b0e91560007078aa2ff8c7e3b4 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Fri, 15 Feb 2019 14:11:04 +0100 Subject: [PATCH 04/60] Fixed so that capability discovery points to valid APIs Login and logout should be accessible on subdomains Restricting access to API endpoints to top domain --- lib/capability-discovery.js | 47 +++++++++++++------------- lib/handlers/restrict-to-top-domain.js | 3 +- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/lib/capability-discovery.js b/lib/capability-discovery.js index 6acc386dd..f96fe021d 100644 --- a/lib/capability-discovery.js +++ b/lib/capability-discovery.js @@ -3,23 +3,7 @@ * @module capability-discovery */ const express = require('express') -const restrictToTopDomain = require('./handlers/restrict-to-top-domain') - -const serviceConfigDefaults = { - 'api': { - 'accounts': { - // 'changePassword': '/api/account/changePassword', - // 'delete': '/api/accounts/delete', - - // Create new user (see IdentityProvider.post() in identity-provider.js) - 'new': '/api/accounts/new', - 'recover': '/api/accounts/recover', - 'signin': '/login', - 'signout': '/logout', - 'validateToken': '/api/accounts/validateToken' - } - } -} +const { URL } = require('url') module.exports = capabilityDiscovery @@ -32,7 +16,7 @@ function capabilityDiscovery () { const router = express.Router('/') // Advertise the server capability discover endpoint - router.get('/.well-known/solid', restrictToTopDomain, serviceCapabilityDocument(serviceConfigDefaults)) + router.get('/.well-known/solid', serviceCapabilityDocument()) return router } @@ -44,12 +28,27 @@ function capabilityDiscovery () { * @param res * @param next */ -function serviceCapabilityDocument (serviceConfig) { +function serviceCapabilityDocument () { return (req, res) => { - // Add the server root url - serviceConfig.root = req.app.locals.ldp.resourceMapper.resolveUrl(req.hostname, req.path) - // Add the 'apps' urls section - serviceConfig.apps = req.app.locals.appUrls - res.json(serviceConfig) + const ldp = req.app.locals.ldp + res.json({ + // Add the server root url + root: req.app.locals.ldp.resourceMapper.resolveUrl(req.hostname, req.path), + // Add the 'apps' urls section + apps: req.app.locals.appUrls, + api: { + accounts: { + // 'changePassword': '/api/account/changePassword', + // 'delete': '/api/accounts/delete', + + // Create new user (see IdentityProvider.post() in identity-provider.js) + new: new URL('/api/accounts/new', ldp.serverUri), + recover: new URL('/api/accounts/recover', ldp.serverUri), + signin: req.app.locals.ldp.resourceMapper.resolveUrl(req.hostname, '/login'), + signout: req.app.locals.ldp.resourceMapper.resolveUrl(req.hostname, '/logout'), + validateToken: new URL('/api/accounts/validateToken', ldp.serverUri) + } + } + }) } } diff --git a/lib/handlers/restrict-to-top-domain.js b/lib/handlers/restrict-to-top-domain.js index b2b770f61..2b6aecc37 100644 --- a/lib/handlers/restrict-to-top-domain.js +++ b/lib/handlers/restrict-to-top-domain.js @@ -8,5 +8,6 @@ module.exports = function (req, res, next) { if (hostname === serverUri) { return next() } - return next(new HTTPError(403, 'Not allowed to access top-level APIs on accounts')) + const isLoggedIn = !!(req.session && req.session.userId) + return next(new HTTPError(isLoggedIn ? 403 : 401, 'Not allowed to access top-level APIs on accounts')) } From 821776f9b5ebf9b60d792ff12c78559b4fdcfab7 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Fri, 15 Feb 2019 14:39:07 +0100 Subject: [PATCH 05/60] Laxing a bit on the endpoints you can visit on subdomains Should be able to login and logout and keep tokens updated via endpoints on subdomain --- lib/api/authn/webid-oidc.js | 16 ++++++++-------- lib/utils.js | 6 ++---- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/lib/api/authn/webid-oidc.js b/lib/api/authn/webid-oidc.js index 46546fdf4..798bd6d47 100644 --- a/lib/api/authn/webid-oidc.js +++ b/lib/api/authn/webid-oidc.js @@ -67,11 +67,11 @@ function middleware (oidc) { const router = express.Router('/') // User-facing Authentication API - router.get(['/login', '/signin'], restrictToTopDomain, LoginRequest.get) + router.get(['/login', '/signin'], LoginRequest.get) - router.post('/login/password', restrictToTopDomain, bodyParser, LoginRequest.loginPassword) + router.post('/login/password', bodyParser, LoginRequest.loginPassword) - router.post('/login/tls', restrictToTopDomain, bodyParser, LoginRequest.loginTls) + router.post('/login/tls', bodyParser, LoginRequest.loginTls) router.get('/account/password/reset', restrictToTopDomain, PasswordResetEmailRequest.get) router.post('/account/password/reset', restrictToTopDomain, bodyParser, PasswordResetEmailRequest.post) @@ -79,17 +79,17 @@ function middleware (oidc) { router.get('/account/password/change', restrictToTopDomain, PasswordChangeRequest.get) router.post('/account/password/change', restrictToTopDomain, bodyParser, PasswordChangeRequest.post) - router.get('/.well-known/solid/logout/', restrictToTopDomain, (req, res) => res.redirect('/logout')) + router.get('/.well-known/solid/logout/', (req, res) => res.redirect('/logout')) - router.get('/goodbye', restrictToTopDomain, (req, res) => { res.render('auth/goodbye') }) + router.get('/goodbye', (req, res) => { res.render('auth/goodbye') }) // The relying party callback is called at the end of the OIDC signin process - router.get('/api/oidc/rp/:issuer_id', restrictToTopDomain, AuthCallbackRequest.get) + router.get('/api/oidc/rp/:issuer_id', AuthCallbackRequest.get) // Static assets related to authentication const authAssets = [ - ['/.well-known/solid/login/', '../static/popup-redirect.html', false, true], - ['/common/', 'solid-auth-client/dist-popup/popup.html', true, true] + ['/.well-known/solid/login/', '../static/popup-redirect.html', false], + ['/common/', 'solid-auth-client/dist-popup/popup.html'] ] authAssets.map(args => routeResolvedFile(router, ...args)) diff --git a/lib/utils.js b/lib/utils.js index 9ac035620..21e5f6870 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -21,7 +21,6 @@ const url = require('url') const debug = require('./debug').fs const getSize = require('get-folder-size') var ns = require('solid-namespace')($rdf) -const restrictToTopDomainHandler = require('./handlers/restrict-to-top-domain') /** * Returns a fully qualified URL from an Express.js Request object. @@ -179,11 +178,10 @@ function stripLineEndings (obj) { /** * Adds a route that serves a static file from another Node module */ -function routeResolvedFile (router, path, file, appendFileName = true, restrictToTopDomain = false) { +function routeResolvedFile (router, path, file, appendFileName = true) { const fullPath = appendFileName ? path + file.match(/[^/]+$/) : path const fullFile = require.resolve(file) - const restrictHandler = restrictToTopDomain ? restrictToTopDomainHandler : (req, res, next) => next() - router.get(fullPath, restrictHandler, (req, res) => res.sendFile(fullFile)) + router.get(fullPath, (req, res) => res.sendFile(fullFile)) } /** From b1562ac26736a5b1593aa35cc0e908efe7eed1c8 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Tue, 19 Feb 2019 23:33:32 +0100 Subject: [PATCH 06/60] Removes acl files from list of files to match when mapping url to file Should fix https://github.com/solid/node-solid-server/issues/1104 --- lib/resource-mapper.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/resource-mapper.js b/lib/resource-mapper.js index d9811400e..2238f6595 100644 --- a/lib/resource-mapper.js +++ b/lib/resource-mapper.js @@ -68,11 +68,9 @@ class ResourceMapper { // Read all files in the corresponding folder const filename = fullPath.substr(fullPath.lastIndexOf('/') + 1) const folder = fullPath.substr(0, fullPath.length - filename.length) - const files = await this._readdir(folder) // Find a file with the same name (minus the dollar extension) - let match = !searchIndex ? '' : (files.find(f => this._removeDollarExtension(f) === filename || - (isIndex && f.startsWith(this._indexFilename + '.')))) + let match = searchIndex ? await this._getMatchingFile(folder, filename, isIndex) : '' if (match === undefined) { // Error if no match was found, // unless the URL ends with a '/', @@ -90,6 +88,14 @@ class ResourceMapper { return { path, contentType: contentType || this._defaultContentType } } + async _getMatchingFile (folder, filename, isIndex) { + const files = await this._readdir(folder) + + // Find a file with the same name (minus the dollar extension) + return (files.find(f => this._removeDollarExtension(f) === filename || + (isIndex && f.startsWith(this._indexFilename + '.') && !f.endsWith('.acl')))) + } + async getRepresentationUrlForResource (resourceUrl) { let fullPath = this.getFullPath(resourceUrl) let isIndex = fullPath.endsWith('/') From 218b36af375c974d7831ac6784a186a8ff96f489 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 20 Feb 2019 18:03:26 +0100 Subject: [PATCH 07/60] Removing hardcoded string of .acl-suffix --- lib/create-app.js | 6 +++++- lib/resource-mapper.js | 6 ++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/create-app.js b/lib/create-app.js index da2ec9980..5b9702150 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -48,7 +48,11 @@ function createApp (argv = {}) { rootUrl: argv.serverUri, rootPath: path.resolve(argv.root || process.cwd()), includeHost: argv.multiuser, - defaultContentType: argv.defaultContentType + defaultContentType: argv.defaultContentType, + fileSuffixes: { + acl: argv.suffixAcl || '.acl', + meta: argv.suffixMeta || '.meta' + } }) const configPath = config.initConfigDir(argv) diff --git a/lib/resource-mapper.js b/lib/resource-mapper.js index 2238f6595..870ce9ae4 100644 --- a/lib/resource-mapper.js +++ b/lib/resource-mapper.js @@ -15,7 +15,8 @@ class ResourceMapper { includeHost = false, defaultContentType = 'application/octet-stream', indexFilename = 'index', - overrideTypes = { acl: 'text/turtle', meta: 'text/turtle' } + overrideTypes = { acl: 'text/turtle', meta: 'text/turtle' }, + fileSuffixes = { acl: '.acl', meta: '.meta' } }) { this._rootUrl = this._removeTrailingSlash(rootUrl) this._rootPath = this._removeTrailingSlash(rootPath) @@ -24,6 +25,7 @@ class ResourceMapper { this._defaultContentType = defaultContentType this._indexFilename = indexFilename this._types = { ...types, ...overrideTypes } + this._suffixes = fileSuffixes // If the host needs to be replaced on every call, pre-split the root URL if (includeHost) { @@ -93,7 +95,7 @@ class ResourceMapper { // Find a file with the same name (minus the dollar extension) return (files.find(f => this._removeDollarExtension(f) === filename || - (isIndex && f.startsWith(this._indexFilename + '.') && !f.endsWith('.acl')))) + (isIndex && f.startsWith(this._indexFilename + '.') && !f.endsWith(this._suffixes.acl)))) } async getRepresentationUrlForResource (resourceUrl) { From acc2401cf31c032c70826e8d690ee332e4fbe7d1 Mon Sep 17 00:00:00 2001 From: Graham Klyne Date: Fri, 22 Feb 2019 18:12:13 +0000 Subject: [PATCH 08/60] Display server version at startup when not running from git repository --- bin/lib/cli.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bin/lib/cli.js b/bin/lib/cli.js index 889903bed..9131896d8 100644 --- a/bin/lib/cli.js +++ b/bin/lib/cli.js @@ -25,10 +25,15 @@ function getVersion () { // Obtain version from git const options = { cwd: __dirname, encoding: 'utf8' } const { stdout } = spawnSync('git', ['describe', '--tags'], options) - return stdout.trim() + const version = stdout.trim() + if (version === '') { + throw new Error('No git version here') + } + return version } catch (e) { // Obtain version from package.json const { version } = require(path.join(__dirname, '../../package.json')) return version } } + From 01d2a35d5ed024f5a6ac5afc54bdb52b7df00e2a Mon Sep 17 00:00:00 2001 From: Ruben Verborgh Date: Sat, 23 Feb 2019 19:27:28 +0100 Subject: [PATCH 09/60] Add proper-lockfile dependency. --- package-lock.json | 1673 ++++++++++++++++----------------------------- package.json | 1 + 2 files changed, 579 insertions(+), 1095 deletions(-) diff --git a/package-lock.json b/package-lock.json index fe37c825a..d5e1cbc8b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -495,6 +495,15 @@ "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", "dev": true }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -550,6 +559,12 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -1604,7 +1619,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -1628,7 +1643,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { "buffer-xor": "^1.0.3", @@ -1719,6 +1734,12 @@ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -1759,6 +1780,18 @@ "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==" }, + "caching-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-2.0.0.tgz", + "integrity": "sha512-tTfemGmFWe7KZ3KN6VsSgQZbd9Bgo7A40wlp4PTsJJvFu4YAnEC5YnfdiKq6Vh2i9XJLnA9n8OXD46orVpnPMw==", + "dev": true, + "requires": { + "make-dir": "^1.0.0", + "md5-hex": "^2.0.0", + "package-hash": "^2.0.0", + "write-file-atomic": "^2.0.0" + } + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -2024,6 +2057,12 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", @@ -2052,7 +2091,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -2194,7 +2233,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { "cipher-base": "^1.0.1", @@ -2206,7 +2245,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { "cipher-base": "^1.0.3", @@ -2336,8 +2375,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { "version": "0.2.0", @@ -2373,6 +2411,15 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -2495,7 +2542,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -2517,7 +2564,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { "bn.js": "^4.1.0", @@ -2625,7 +2672,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -2704,6 +2751,15 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, "es5-ext": { "version": "0.10.46", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", @@ -2715,6 +2771,12 @@ "next-tick": "1" } }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, "es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", @@ -3033,6 +3095,34 @@ "safe-buffer": "^5.1.1" } }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, "exit-hook": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", @@ -3351,12 +3441,32 @@ "path-exists": "^3.0.0" } }, + "find-cache-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" + } + }, "find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", "dev": true }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, "flat-cache": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", @@ -3414,6 +3524,15 @@ "for-in": "^1.0.1" } }, + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "dev": true, + "requires": { + "signal-exit": "^3.0.0" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -3478,7 +3597,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -3557,6 +3676,12 @@ "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, "get-folder-size": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.0.tgz", @@ -3578,6 +3703,12 @@ "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", "dev": true }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, "get-uri": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.2.tgz", @@ -3600,7 +3731,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -3740,8 +3871,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { "version": "1.0.0", @@ -3884,7 +4014,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { "depd": "~1.1.2", @@ -4147,11 +4277,26 @@ } } }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -4260,7 +4405,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -4318,8 +4463,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -4370,6 +4514,15 @@ "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", "dev": true }, + "istanbul-lib-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz", + "integrity": "sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, "istanbul-lib-instrument": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz", @@ -4385,6 +4538,37 @@ "semver": "^5.5.0" } }, + "istanbul-lib-report": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz", + "integrity": "sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.1", + "make-dir": "^1.3.0" + } + }, + "istanbul-lib-source-maps": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz", + "integrity": "sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.1", + "make-dir": "^1.3.0", + "rimraf": "^2.6.2", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.0.1.tgz", + "integrity": "sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==", + "dev": true, + "requires": { + "handlebars": "^4.0.11" + } + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -4418,6 +4602,12 @@ "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -4443,7 +4633,7 @@ }, "json5": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, "jsonfile": { @@ -4627,12 +4817,34 @@ "immediate": "~3.0.5" } }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, "localstorage-memory": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/localstorage-memory/-/localstorage-memory-1.0.3.tgz", "integrity": "sha512-t9P8WB6DcVttbw/W4PIE8HOqum8Qlvx5SjR6oInwR9Uia0EEmyUeBh7S+weKByW+l/f45Bj4L/dgZikGFDM6ng==", "dev": true }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", @@ -4668,6 +4880,12 @@ "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", "dev": true }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -4708,7 +4926,6 @@ "version": "4.1.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.4.tgz", "integrity": "sha512-EPstzZ23znHUVLKj+lcXO1KvZkrlw+ZirdwvOmnAnA/1PB4ggyXJ77LRkCqkff+ShQ+cqoxCxLQOh4cKITO5iA==", - "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^3.0.2" @@ -4765,6 +4982,21 @@ } } }, + "md5-hex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", + "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", + "dev": true, + "requires": { + "md5-o-matic": "^0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", + "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", + "dev": true + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -4793,11 +5025,29 @@ "solid-ui": ">=0.11.3" } }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -4952,7 +5202,7 @@ "dependencies": { "commander": { "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, @@ -5019,7 +5269,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -5250,6 +5500,18 @@ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-3.1.8.tgz", "integrity": "sha1-/r+sy0vSc2eEc6MJxstLSi88SOM=" }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "npm-conf": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", @@ -5259,6 +5521,15 @@ "pify": "^3.0.0" } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -5305,114 +5576,26 @@ "yargs-parser": "^9.0.2" }, "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "caching-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-2.0.0.tgz", - "integrity": "sha512-tTfemGmFWe7KZ3KN6VsSgQZbd9Bgo7A40wlp4PTsJJvFu4YAnEC5YnfdiKq6Vh2i9XJLnA9n8OXD46orVpnPMw==", - "dev": true, - "requires": { - "make-dir": "^1.0.0", - "md5-hex": "^2.0.0", - "package-hash": "^2.0.0", - "write-file-atomic": "^2.0.0" - } + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, "camelcase": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, "requires": { "center-align": "^0.1.1", "right-align": "^0.1.1", @@ -5422,30 +5605,10 @@ "wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" } } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, "convert-source-map": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", @@ -5459,7 +5622,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, "requires": { "lru-cache": "^4.0.1", "which": "^1.2.9" @@ -5469,797 +5631,55 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, "requires": { "ms": "2.0.0" } }, - "debug-log": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", - "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "strip-bom": "^3.0.0" + "is-buffer": "^1.1.5" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, - "find-cache-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", - "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", - "dev": true, - "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz", - "integrity": "sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz", - "integrity": "sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.1", - "make-dir": "^1.3.0", - "supports-color": "^5.4.0" - } - }, - "istanbul-lib-source-maps": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz", - "integrity": "sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^2.0.1", - "make-dir": "^1.3.0", - "rimraf": "^2.6.2", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.0.1.tgz", - "integrity": "sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==", - "dev": true, - "requires": { - "handlebars": "^4.0.11" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "md5-hex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", - "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", - "dev": true, - "requires": { - "md5-o-matic": "^0.1.1" - } - }, - "md5-o-matic": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", - "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "package-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", - "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "lodash.flattendeep": "^4.4.0", - "md5-hex": "^2.0.0", - "release-zalgo": "^1.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - }, - "spawn-wrap": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", - "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "string-width": { "version": "2.1.1", @@ -6280,45 +5700,18 @@ "ansi-regex": "^3.0.0" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, "requires": { "has-flag": "^3.0.0" } }, - "test-exclude": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.0.0.tgz", - "integrity": "sha512-bO3Lj5+qFa9YLfYW2ZcXMOV1pmQvw+KS/DpjqhyX6Y6UZ8zstpZJ+mA2ERkXfpOqhxsJlQiLeVXD3Smsrs6oLw==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^1.0.1" - } - }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, "requires": { "source-map": "~0.5.1", "uglify-to-browserify": "~1.0.0", @@ -6329,8 +5722,6 @@ "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, "requires": { "camelcase": "^1.0.2", "cliui": "^2.1.0", @@ -6340,132 +5731,15 @@ } } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { "version": "11.1.0", @@ -6542,23 +5816,6 @@ "dev": true } } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } } } }, @@ -6725,7 +5982,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -6757,6 +6014,36 @@ "resolved": "https://registry.npmjs.org/owasp-password-strength-test/-/owasp-password-strength-test-1.3.0.tgz", "integrity": "sha1-T2KeQpA+j20nmyMNZXq2HljkSxI=" }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, "pac-proxy-agent": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", @@ -6803,6 +6090,18 @@ "thunkify": "^2.1.2" } }, + "package-hash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", + "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "lodash.flattendeep": "^4.4.0", + "md5-hex": "^2.0.0", + "release-zalgo": "^1.0.0" + } + }, "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", @@ -6830,7 +6129,7 @@ }, "parse-asn1": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "requires": { "asn1.js": "^4.0.0", @@ -6840,6 +6139,16 @@ "pbkdf2": "^3.0.3" } }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, "parse5": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", @@ -6910,6 +6219,15 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, "pathval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", @@ -6988,6 +6306,15 @@ "xtend": "^4.0.1" } }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, "pkginfo": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", @@ -7045,6 +6372,16 @@ "integrity": "sha1-AMLa7t2iDofjeCs0Stuhzd1q1wk=", "dev": true }, + "proper-lockfile": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-3.2.0.tgz", + "integrity": "sha512-iMghHHXv2bsxl6NchhEaFck8tvX3F9cknEEh1SUpguUOBjN7PAAW9BLzmbc1g/mCD1gY3EE2EABBHPJfFdHFmA==", + "requires": { + "graceful-fs": "^4.1.11", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -7061,7 +6398,7 @@ }, "proxy-agent": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", + "resolved": "http://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", "integrity": "sha512-CNKuhC1jVtm8KJYFTS2ZRO71VCBx3QSA92So/e6NrY6GoJonkx3Irnk4047EsCcswczwqAekRj3s8qLRGahSKg==", "dev": true, "requires": { @@ -7101,8 +6438,7 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { "version": "1.1.29", @@ -7234,7 +6570,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -7256,6 +6592,27 @@ } } }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, "readable-stream": { "version": "1.1.14", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", @@ -7355,6 +6712,15 @@ "jsesc": "~0.5.0" } }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -7399,6 +6765,18 @@ } } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", @@ -7447,6 +6825,11 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", @@ -7576,6 +6959,12 @@ "send": "0.16.2" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", @@ -7604,7 +6993,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { "inherits": "^2.0.1", @@ -7683,8 +7072,7 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "simple-concat": { "version": "1.0.0", @@ -7890,7 +7278,7 @@ "dependencies": { "ansi-escapes": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, @@ -7940,7 +7328,7 @@ }, "external-editor": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { @@ -8582,6 +7970,52 @@ "os-shim": "^0.1.2" } }, + "spawn-wrap": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", + "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", + "dev": true, + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -8702,7 +8136,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8740,7 +8174,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8781,7 +8215,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8819,7 +8253,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8875,6 +8309,12 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, "strip-json-comments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", @@ -8937,7 +8377,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -9066,6 +8506,18 @@ "uuid": "^3.0.1" } }, + "test-exclude": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.0.0.tgz", + "integrity": "sha512-bO3Lj5+qFa9YLfYW2ZcXMOV1pmQvw+KS/DpjqhyX6Y6UZ8zstpZJ+mA2ERkXfpOqhxsJlQiLeVXD3Smsrs6oLw==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^1.0.1" + } + }, "text-encoder-lite": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/text-encoder-lite/-/text-encoder-lite-1.0.1.tgz", @@ -9117,7 +8569,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -9560,6 +9012,16 @@ "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=" }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "validator": { "version": "10.9.0", "resolved": "https://registry.npmjs.org/validator/-/validator-10.9.0.tgz", @@ -9646,11 +9108,16 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, "win-release": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", @@ -9673,7 +9140,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { @@ -9767,8 +9234,7 @@ "yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" }, "yargs": { "version": "3.32.0", @@ -9784,6 +9250,23 @@ "window-size": "^0.1.4", "y18n": "^3.2.0" } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } } } } diff --git a/package.json b/package.json index 8e4e7ba4b..fceca89b6 100644 --- a/package.json +++ b/package.json @@ -90,6 +90,7 @@ "nodemailer": "^3.1.4", "oidc-op-express": "^0.0.3", "owasp-password-strength-test": "^1.3.0", + "proper-lockfile": "^3.2.0", "rdflib": "^0.17.1", "recursive-readdir": "^2.1.0", "rimraf": "^2.5.0", From 90dcfe6f3c0fad17137827962d43baa166d4f25b Mon Sep 17 00:00:00 2001 From: Ruben Verborgh Date: Sat, 23 Feb 2019 19:43:29 +0100 Subject: [PATCH 10/60] Lock file during patching. Closes #1106. --- lib/handlers/patch.js | 18 +++++++++------- package-lock.json | 48 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 55 insertions(+), 11 deletions(-) diff --git a/lib/handlers/patch.js b/lib/handlers/patch.js index 3502af90d..18f5823b8 100644 --- a/lib/handlers/patch.js +++ b/lib/handlers/patch.js @@ -10,6 +10,7 @@ const $rdf = require('rdflib') const crypto = require('crypto') const overQuota = require('../utils').overQuota const getContentType = require('../utils').getContentType +const { lock } = require('proper-lockfile') // Patch parsers by request body content type const PATCH_PARSERS = { @@ -23,6 +24,7 @@ const DEFAULT_FOR_NEW_CONTENT_TYPE = 'text/turtle' async function patchHandler (req, res, next) { debug(`PATCH -- ${req.originalUrl}`) res.header('MS-Author-Via', 'SPARQL') + let releaseLock try { // Obtain details of the target resource const ldp = req.app.locals.ldp @@ -50,15 +52,13 @@ async function patchHandler (req, res, next) { throw error(415, `Unsupported patch content type: ${patch.contentType}`) } - // Parse the target graph and the patch document, - // and verify permission for performing this specific patch - const [graph, patchObject] = await Promise.all([ - readGraph(resource), - parsePatch(url, patch.uri, patch.text) - .then(patchObject => checkPermission(req, patchObject)) - ]) + // Parse the patch document and verify permissions + const patchObject = await parsePatch(url, patch.uri, patch.text) + await checkPermission(req, patchObject) // Patch the graph and write it back to the file + releaseLock = await lock(path, { retries: 10, realpath: false }) + const graph = await readGraph(resource) await applyPatch(patchObject, graph, url) const result = await writeGraph(graph, resource, ldp.resourceMapper.rootPath, ldp.serverUri) @@ -66,6 +66,10 @@ async function patchHandler (req, res, next) { res.send(result) } catch (err) { return next(err) + } finally { + if (releaseLock) { + await releaseLock() + } } return next() } diff --git a/package-lock.json b/package-lock.json index d5e1cbc8b..7fc73f216 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3530,7 +3530,20 @@ "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, "requires": { + "cross-spawn": "^4", "signal-exit": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + } } }, "forever-agent": { @@ -4545,7 +4558,19 @@ "dev": true, "requires": { "istanbul-lib-coverage": "^2.0.1", - "make-dir": "^1.3.0" + "make-dir": "^1.3.0", + "supports-color": "^5.4.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "istanbul-lib-source-maps": { @@ -4554,10 +4579,28 @@ "integrity": "sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==", "dev": true, "requires": { + "debug": "^3.1.0", "istanbul-lib-coverage": "^2.0.1", "make-dir": "^1.3.0", "rimraf": "^2.6.2", "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } } }, "istanbul-reports": { @@ -5597,8 +5640,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", "wordwrap": "0.0.2" }, "dependencies": { @@ -5714,7 +5755,6 @@ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "requires": { "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", "yargs": "~3.10.0" }, "dependencies": { From d3e6506ef4dd286ea9c947cb3103293649688805 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Thu, 28 Feb 2019 17:46:47 +0100 Subject: [PATCH 11/60] Now excluding both .acl- and .meta-files when finding default file --- lib/create-app.js | 8 ++++---- lib/resource-mapper.js | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/create-app.js b/lib/create-app.js index 5b9702150..6423d990f 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -49,10 +49,10 @@ function createApp (argv = {}) { rootPath: path.resolve(argv.root || process.cwd()), includeHost: argv.multiuser, defaultContentType: argv.defaultContentType, - fileSuffixes: { - acl: argv.suffixAcl || '.acl', - meta: argv.suffixMeta || '.meta' - } + fileSuffixes: [ + argv.suffixAcl || '.acl', + argv.suffixMeta || '.meta' + ] }) const configPath = config.initConfigDir(argv) diff --git a/lib/resource-mapper.js b/lib/resource-mapper.js index 870ce9ae4..e9e7903cc 100644 --- a/lib/resource-mapper.js +++ b/lib/resource-mapper.js @@ -16,7 +16,7 @@ class ResourceMapper { defaultContentType = 'application/octet-stream', indexFilename = 'index', overrideTypes = { acl: 'text/turtle', meta: 'text/turtle' }, - fileSuffixes = { acl: '.acl', meta: '.meta' } + fileSuffixes = ['.acl', '.meta'] }) { this._rootUrl = this._removeTrailingSlash(rootUrl) this._rootPath = this._removeTrailingSlash(rootPath) @@ -95,7 +95,7 @@ class ResourceMapper { // Find a file with the same name (minus the dollar extension) return (files.find(f => this._removeDollarExtension(f) === filename || - (isIndex && f.startsWith(this._indexFilename + '.') && !f.endsWith(this._suffixes.acl)))) + (isIndex && f.startsWith(this._indexFilename + '.') && !this._suffixes.some(suffix => f.endsWith(suffix))))) } async getRepresentationUrlForResource (resourceUrl) { From 9876274d8ce47bc4f9d06d1ad912ce73f5588743 Mon Sep 17 00:00:00 2001 From: Ruben Verborgh Date: Sat, 23 Feb 2019 19:27:28 +0100 Subject: [PATCH 12/60] Add proper-lockfile dependency. --- package-lock.json | 1673 ++++++++++++++++----------------------------- package.json | 1 + 2 files changed, 579 insertions(+), 1095 deletions(-) diff --git a/package-lock.json b/package-lock.json index fe37c825a..d5e1cbc8b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -495,6 +495,15 @@ "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", "dev": true }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -550,6 +559,12 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -1604,7 +1619,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -1628,7 +1643,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { "buffer-xor": "^1.0.3", @@ -1719,6 +1734,12 @@ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -1759,6 +1780,18 @@ "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==" }, + "caching-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-2.0.0.tgz", + "integrity": "sha512-tTfemGmFWe7KZ3KN6VsSgQZbd9Bgo7A40wlp4PTsJJvFu4YAnEC5YnfdiKq6Vh2i9XJLnA9n8OXD46orVpnPMw==", + "dev": true, + "requires": { + "make-dir": "^1.0.0", + "md5-hex": "^2.0.0", + "package-hash": "^2.0.0", + "write-file-atomic": "^2.0.0" + } + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -2024,6 +2057,12 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", @@ -2052,7 +2091,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -2194,7 +2233,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { "cipher-base": "^1.0.1", @@ -2206,7 +2245,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { "cipher-base": "^1.0.3", @@ -2336,8 +2375,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { "version": "0.2.0", @@ -2373,6 +2411,15 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -2495,7 +2542,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -2517,7 +2564,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { "bn.js": "^4.1.0", @@ -2625,7 +2672,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -2704,6 +2751,15 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, "es5-ext": { "version": "0.10.46", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", @@ -2715,6 +2771,12 @@ "next-tick": "1" } }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, "es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", @@ -3033,6 +3095,34 @@ "safe-buffer": "^5.1.1" } }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, "exit-hook": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", @@ -3351,12 +3441,32 @@ "path-exists": "^3.0.0" } }, + "find-cache-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" + } + }, "find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", "dev": true }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, "flat-cache": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", @@ -3414,6 +3524,15 @@ "for-in": "^1.0.1" } }, + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "dev": true, + "requires": { + "signal-exit": "^3.0.0" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -3478,7 +3597,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -3557,6 +3676,12 @@ "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, "get-folder-size": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.0.tgz", @@ -3578,6 +3703,12 @@ "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", "dev": true }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, "get-uri": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.2.tgz", @@ -3600,7 +3731,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -3740,8 +3871,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { "version": "1.0.0", @@ -3884,7 +4014,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { "depd": "~1.1.2", @@ -4147,11 +4277,26 @@ } } }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -4260,7 +4405,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -4318,8 +4463,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -4370,6 +4514,15 @@ "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", "dev": true }, + "istanbul-lib-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz", + "integrity": "sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, "istanbul-lib-instrument": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz", @@ -4385,6 +4538,37 @@ "semver": "^5.5.0" } }, + "istanbul-lib-report": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz", + "integrity": "sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.1", + "make-dir": "^1.3.0" + } + }, + "istanbul-lib-source-maps": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz", + "integrity": "sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.1", + "make-dir": "^1.3.0", + "rimraf": "^2.6.2", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.0.1.tgz", + "integrity": "sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==", + "dev": true, + "requires": { + "handlebars": "^4.0.11" + } + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -4418,6 +4602,12 @@ "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -4443,7 +4633,7 @@ }, "json5": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, "jsonfile": { @@ -4627,12 +4817,34 @@ "immediate": "~3.0.5" } }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, "localstorage-memory": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/localstorage-memory/-/localstorage-memory-1.0.3.tgz", "integrity": "sha512-t9P8WB6DcVttbw/W4PIE8HOqum8Qlvx5SjR6oInwR9Uia0EEmyUeBh7S+weKByW+l/f45Bj4L/dgZikGFDM6ng==", "dev": true }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", @@ -4668,6 +4880,12 @@ "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", "dev": true }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -4708,7 +4926,6 @@ "version": "4.1.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.4.tgz", "integrity": "sha512-EPstzZ23znHUVLKj+lcXO1KvZkrlw+ZirdwvOmnAnA/1PB4ggyXJ77LRkCqkff+ShQ+cqoxCxLQOh4cKITO5iA==", - "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^3.0.2" @@ -4765,6 +4982,21 @@ } } }, + "md5-hex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", + "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", + "dev": true, + "requires": { + "md5-o-matic": "^0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", + "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", + "dev": true + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -4793,11 +5025,29 @@ "solid-ui": ">=0.11.3" } }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -4952,7 +5202,7 @@ "dependencies": { "commander": { "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, @@ -5019,7 +5269,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -5250,6 +5500,18 @@ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-3.1.8.tgz", "integrity": "sha1-/r+sy0vSc2eEc6MJxstLSi88SOM=" }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "npm-conf": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", @@ -5259,6 +5521,15 @@ "pify": "^3.0.0" } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -5305,114 +5576,26 @@ "yargs-parser": "^9.0.2" }, "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "caching-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-2.0.0.tgz", - "integrity": "sha512-tTfemGmFWe7KZ3KN6VsSgQZbd9Bgo7A40wlp4PTsJJvFu4YAnEC5YnfdiKq6Vh2i9XJLnA9n8OXD46orVpnPMw==", - "dev": true, - "requires": { - "make-dir": "^1.0.0", - "md5-hex": "^2.0.0", - "package-hash": "^2.0.0", - "write-file-atomic": "^2.0.0" - } + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, "camelcase": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, "requires": { "center-align": "^0.1.1", "right-align": "^0.1.1", @@ -5422,30 +5605,10 @@ "wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" } } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, "convert-source-map": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", @@ -5459,7 +5622,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, "requires": { "lru-cache": "^4.0.1", "which": "^1.2.9" @@ -5469,797 +5631,55 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, "requires": { "ms": "2.0.0" } }, - "debug-log": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", - "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "strip-bom": "^3.0.0" + "is-buffer": "^1.1.5" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, - "find-cache-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", - "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", - "dev": true, - "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz", - "integrity": "sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz", - "integrity": "sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.1", - "make-dir": "^1.3.0", - "supports-color": "^5.4.0" - } - }, - "istanbul-lib-source-maps": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz", - "integrity": "sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^2.0.1", - "make-dir": "^1.3.0", - "rimraf": "^2.6.2", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.0.1.tgz", - "integrity": "sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==", - "dev": true, - "requires": { - "handlebars": "^4.0.11" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "md5-hex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", - "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", - "dev": true, - "requires": { - "md5-o-matic": "^0.1.1" - } - }, - "md5-o-matic": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", - "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "package-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", - "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "lodash.flattendeep": "^4.4.0", - "md5-hex": "^2.0.0", - "release-zalgo": "^1.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - }, - "spawn-wrap": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", - "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "string-width": { "version": "2.1.1", @@ -6280,45 +5700,18 @@ "ansi-regex": "^3.0.0" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, "requires": { "has-flag": "^3.0.0" } }, - "test-exclude": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.0.0.tgz", - "integrity": "sha512-bO3Lj5+qFa9YLfYW2ZcXMOV1pmQvw+KS/DpjqhyX6Y6UZ8zstpZJ+mA2ERkXfpOqhxsJlQiLeVXD3Smsrs6oLw==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^1.0.1" - } - }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, "requires": { "source-map": "~0.5.1", "uglify-to-browserify": "~1.0.0", @@ -6329,8 +5722,6 @@ "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, "requires": { "camelcase": "^1.0.2", "cliui": "^2.1.0", @@ -6340,132 +5731,15 @@ } } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { "version": "11.1.0", @@ -6542,23 +5816,6 @@ "dev": true } } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } } } }, @@ -6725,7 +5982,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -6757,6 +6014,36 @@ "resolved": "https://registry.npmjs.org/owasp-password-strength-test/-/owasp-password-strength-test-1.3.0.tgz", "integrity": "sha1-T2KeQpA+j20nmyMNZXq2HljkSxI=" }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, "pac-proxy-agent": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", @@ -6803,6 +6090,18 @@ "thunkify": "^2.1.2" } }, + "package-hash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", + "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "lodash.flattendeep": "^4.4.0", + "md5-hex": "^2.0.0", + "release-zalgo": "^1.0.0" + } + }, "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", @@ -6830,7 +6129,7 @@ }, "parse-asn1": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "requires": { "asn1.js": "^4.0.0", @@ -6840,6 +6139,16 @@ "pbkdf2": "^3.0.3" } }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, "parse5": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", @@ -6910,6 +6219,15 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, "pathval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", @@ -6988,6 +6306,15 @@ "xtend": "^4.0.1" } }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, "pkginfo": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", @@ -7045,6 +6372,16 @@ "integrity": "sha1-AMLa7t2iDofjeCs0Stuhzd1q1wk=", "dev": true }, + "proper-lockfile": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-3.2.0.tgz", + "integrity": "sha512-iMghHHXv2bsxl6NchhEaFck8tvX3F9cknEEh1SUpguUOBjN7PAAW9BLzmbc1g/mCD1gY3EE2EABBHPJfFdHFmA==", + "requires": { + "graceful-fs": "^4.1.11", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -7061,7 +6398,7 @@ }, "proxy-agent": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", + "resolved": "http://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", "integrity": "sha512-CNKuhC1jVtm8KJYFTS2ZRO71VCBx3QSA92So/e6NrY6GoJonkx3Irnk4047EsCcswczwqAekRj3s8qLRGahSKg==", "dev": true, "requires": { @@ -7101,8 +6438,7 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { "version": "1.1.29", @@ -7234,7 +6570,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -7256,6 +6592,27 @@ } } }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, "readable-stream": { "version": "1.1.14", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", @@ -7355,6 +6712,15 @@ "jsesc": "~0.5.0" } }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -7399,6 +6765,18 @@ } } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", @@ -7447,6 +6825,11 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", @@ -7576,6 +6959,12 @@ "send": "0.16.2" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", @@ -7604,7 +6993,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { "inherits": "^2.0.1", @@ -7683,8 +7072,7 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "simple-concat": { "version": "1.0.0", @@ -7890,7 +7278,7 @@ "dependencies": { "ansi-escapes": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, @@ -7940,7 +7328,7 @@ }, "external-editor": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { @@ -8582,6 +7970,52 @@ "os-shim": "^0.1.2" } }, + "spawn-wrap": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", + "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", + "dev": true, + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -8702,7 +8136,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8740,7 +8174,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8781,7 +8215,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8819,7 +8253,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8875,6 +8309,12 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, "strip-json-comments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", @@ -8937,7 +8377,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -9066,6 +8506,18 @@ "uuid": "^3.0.1" } }, + "test-exclude": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.0.0.tgz", + "integrity": "sha512-bO3Lj5+qFa9YLfYW2ZcXMOV1pmQvw+KS/DpjqhyX6Y6UZ8zstpZJ+mA2ERkXfpOqhxsJlQiLeVXD3Smsrs6oLw==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^1.0.1" + } + }, "text-encoder-lite": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/text-encoder-lite/-/text-encoder-lite-1.0.1.tgz", @@ -9117,7 +8569,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -9560,6 +9012,16 @@ "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=" }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "validator": { "version": "10.9.0", "resolved": "https://registry.npmjs.org/validator/-/validator-10.9.0.tgz", @@ -9646,11 +9108,16 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, "win-release": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", @@ -9673,7 +9140,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { @@ -9767,8 +9234,7 @@ "yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" }, "yargs": { "version": "3.32.0", @@ -9784,6 +9250,23 @@ "window-size": "^0.1.4", "y18n": "^3.2.0" } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } } } } diff --git a/package.json b/package.json index 8e4e7ba4b..fceca89b6 100644 --- a/package.json +++ b/package.json @@ -90,6 +90,7 @@ "nodemailer": "^3.1.4", "oidc-op-express": "^0.0.3", "owasp-password-strength-test": "^1.3.0", + "proper-lockfile": "^3.2.0", "rdflib": "^0.17.1", "recursive-readdir": "^2.1.0", "rimraf": "^2.5.0", From 74e546472bc24be09cd907d13a0e689863112936 Mon Sep 17 00:00:00 2001 From: Ruben Verborgh Date: Sat, 23 Feb 2019 19:43:29 +0100 Subject: [PATCH 13/60] Lock file during patching. Closes #1106. --- lib/handlers/patch.js | 18 +++++++++------- package-lock.json | 48 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 55 insertions(+), 11 deletions(-) diff --git a/lib/handlers/patch.js b/lib/handlers/patch.js index 3502af90d..18f5823b8 100644 --- a/lib/handlers/patch.js +++ b/lib/handlers/patch.js @@ -10,6 +10,7 @@ const $rdf = require('rdflib') const crypto = require('crypto') const overQuota = require('../utils').overQuota const getContentType = require('../utils').getContentType +const { lock } = require('proper-lockfile') // Patch parsers by request body content type const PATCH_PARSERS = { @@ -23,6 +24,7 @@ const DEFAULT_FOR_NEW_CONTENT_TYPE = 'text/turtle' async function patchHandler (req, res, next) { debug(`PATCH -- ${req.originalUrl}`) res.header('MS-Author-Via', 'SPARQL') + let releaseLock try { // Obtain details of the target resource const ldp = req.app.locals.ldp @@ -50,15 +52,13 @@ async function patchHandler (req, res, next) { throw error(415, `Unsupported patch content type: ${patch.contentType}`) } - // Parse the target graph and the patch document, - // and verify permission for performing this specific patch - const [graph, patchObject] = await Promise.all([ - readGraph(resource), - parsePatch(url, patch.uri, patch.text) - .then(patchObject => checkPermission(req, patchObject)) - ]) + // Parse the patch document and verify permissions + const patchObject = await parsePatch(url, patch.uri, patch.text) + await checkPermission(req, patchObject) // Patch the graph and write it back to the file + releaseLock = await lock(path, { retries: 10, realpath: false }) + const graph = await readGraph(resource) await applyPatch(patchObject, graph, url) const result = await writeGraph(graph, resource, ldp.resourceMapper.rootPath, ldp.serverUri) @@ -66,6 +66,10 @@ async function patchHandler (req, res, next) { res.send(result) } catch (err) { return next(err) + } finally { + if (releaseLock) { + await releaseLock() + } } return next() } diff --git a/package-lock.json b/package-lock.json index d5e1cbc8b..7fc73f216 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3530,7 +3530,20 @@ "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, "requires": { + "cross-spawn": "^4", "signal-exit": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + } } }, "forever-agent": { @@ -4545,7 +4558,19 @@ "dev": true, "requires": { "istanbul-lib-coverage": "^2.0.1", - "make-dir": "^1.3.0" + "make-dir": "^1.3.0", + "supports-color": "^5.4.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "istanbul-lib-source-maps": { @@ -4554,10 +4579,28 @@ "integrity": "sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==", "dev": true, "requires": { + "debug": "^3.1.0", "istanbul-lib-coverage": "^2.0.1", "make-dir": "^1.3.0", "rimraf": "^2.6.2", "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } } }, "istanbul-reports": { @@ -5597,8 +5640,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", "wordwrap": "0.0.2" }, "dependencies": { @@ -5714,7 +5755,6 @@ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "requires": { "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", "yargs": "~3.10.0" }, "dependencies": { From a4aeb9e9cd270fa900ebfb5c9ed6306514e9812e Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Thu, 28 Feb 2019 17:06:31 +0100 Subject: [PATCH 14/60] Making proper use of strictOrigins We had some faulty handling where we returned 403 even if the user wasn't authenticated. (This fixes https://github.com/solid/node-solid-server/issues/1117.) 1. I discovered some redundant tests in test/integration/authentication-oidc-test.js, and moved some tests into groups for better overview. This makes for a lot of changes, but I think it's worth it. 2. I duplicated authentication-oidc-test into authentication-oidc-with-strict-origins-turned-off-test to make sure we handle those permutations correctly as well. This required a lot of setup, which are all of the new files in this commit. 3. I tried to consolidate the use of getTrustedOrigins in create-app.js, which made a test obsolete --- lib/acl-checker.js | 13 +- lib/create-app.js | 7 +- lib/models/solid-host.js | 6 +- test/integration/acl-tls-test.js | 8 +- test/integration/authentication-oidc-test.js | 369 +++++------- ...idc-with-strict-origins-turned-off-test.js | 531 ++++++++++++++++++ .../alice/private-for-owner.txt | 1 - .../alice/.acl-override} | 4 +- .../alice/db/oidc/op/provider.json | 411 ++++++++++++++ .../alice/private-for-alice.txt | 1 + .../alice/private-for-alice.txt.acl | 12 + .../bob/.acl-override | 5 + .../bob/db/oidc/op/provider.json | 411 ++++++++++++++ .../bob/shared-with-alice.txt | 1 + .../bob/shared-with-alice.txt.acl | 15 + test/unit/solid-host-test.js | 4 - 16 files changed, 1559 insertions(+), 240 deletions(-) create mode 100644 test/integration/authentication-oidc-with-strict-origins-turned-off-test.js delete mode 100644 test/resources/accounts-scenario/alice/private-for-owner.txt rename test/resources/{accounts-scenario/alice/private-for-owner.txt.acl => accounts-strict-origin-off/alice/.acl-override} (63%) create mode 100644 test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json create mode 100644 test/resources/accounts-strict-origin-off/alice/private-for-alice.txt create mode 100644 test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl create mode 100644 test/resources/accounts-strict-origin-off/bob/.acl-override create mode 100644 test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json create mode 100644 test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt create mode 100644 test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl diff --git a/lib/acl-checker.js b/lib/acl-checker.js index 53c41f86d..4dccb3924 100644 --- a/lib/acl-checker.js +++ b/lib/acl-checker.js @@ -56,17 +56,14 @@ class ACLChecker { const aclFile = rdf.sym(acl.acl) const agent = user ? rdf.sym(user) : null const modes = [ACL(mode)] - const agentOrigin = this.agentOrigin ? rdf.sym(this.agentOrigin) : null - const trustedOrigins = this.trustedOrigins ? this.trustedOrigins.map(trustedOrigin => rdf.sym(trustedOrigin)) : null + const agentOrigin = this.strictOrigin && this.agentOrigin ? rdf.sym(this.agentOrigin) : null + const trustedOrigins = this.strictOrigin && this.trustedOrigins ? this.trustedOrigins.map(trustedOrigin => rdf.sym(trustedOrigin)) : null const accessDenied = aclCheck.accessDenied(acl.graph, resource, directory, aclFile, agent, modes, agentOrigin, trustedOrigins) - if (accessDenied && this.agentOrigin && this.resourceUrl.origin !== this.agentOrigin) { - this.messagesCached[cacheKey].push(HTTPError(403, accessDenied)) - } else if (accessDenied && user) { + + if (accessDenied && user) { this.messagesCached[cacheKey].push(HTTPError(403, accessDenied)) - } else if (accessDenied && !user) { - this.messagesCached[cacheKey].push(HTTPError(401, 'Unauthenticated')) } else if (accessDenied) { - this.messagesCached[cacheKey].push(HTTPError(401, accessDenied)) + this.messagesCached[cacheKey].push(HTTPError(401, 'Unauthenticated')) } this.aclCached[cacheKey] = Promise.resolve(!accessDenied) return this.aclCached[cacheKey] diff --git a/lib/create-app.js b/lib/create-app.js index da2ec9980..9a4338930 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -206,14 +206,17 @@ function initWebId (argv, app, ldp) { // without permission by including the credentials set by the Solid server. app.use((req, res, next) => { const origin = req.get('origin') - const trustedOrigins = argv.trustedOrigins + const trustedOrigins = ldp.getTrustedOrigins(req) const userId = req.session.userId // Exception: allow logout requests from all third-party apps // such that OIDC client can log out via cookie auth // TODO: remove this exception when OIDC clients // use Bearer token to authenticate instead of cookie // (https://github.com/solid/node-solid-server/pull/835#issuecomment-426429003) - if (!argv.host.allowsSessionFor(userId, origin, trustedOrigins) && !isLogoutRequest(req)) { + // We only want to do this check if strictOrigin is set to false, since we trust WebACL to handle origins otherwise + // If we don't allow authentication with cookies we can't handle ACLs properly wrt trusted origins + // https://github.com/solid/node-solid-server/issues/1117 + if (!argv.strictOrigin && !argv.host.allowsSessionFor(userId, origin, trustedOrigins) && !isLogoutRequest(req)) { debug.authentication(`Rejecting session for ${userId} from ${origin}`) // Destroy session data delete req.session.userId diff --git a/lib/models/solid-host.js b/lib/models/solid-host.js index 51dde215d..8d1069ad7 100644 --- a/lib/models/solid-host.js +++ b/lib/models/solid-host.js @@ -77,11 +77,7 @@ class SolidHost { const serverHost = getHostName(this.serverUri) if (originHost === serverHost) return true if (originHost.endsWith('.' + serverHost)) return true - // Allow the user's own domain - const userHost = getHostName(userId) - if (originHost === userHost) return true - if (trustedOrigins.includes(origin)) return true - return false + return !!trustedOrigins.includes(origin) } /** diff --git a/test/integration/acl-tls-test.js b/test/integration/acl-tls-test.js index 9d321b10d..c2103f669 100644 --- a/test/integration/acl-tls-test.js +++ b/test/integration/acl-tls-test.js @@ -332,7 +332,7 @@ describe('ACL with WebID+TLS', function () { request.head(options, function (error, response, body) { assert.equal(error, null) - assert.equal(response.statusCode, 403) + assert.equal(response.statusCode, 401) done() }) }) @@ -354,7 +354,7 @@ describe('ACL with WebID+TLS', function () { request.head(options, function (error, response, body) { assert.equal(error, null) - assert.equal(response.statusCode, 403) + assert.equal(response.statusCode, 401) done() }) }) @@ -433,7 +433,7 @@ describe('ACL with WebID+TLS', function () { request.head(options, function (error, response, body) { assert.equal(error, null) - assert.equal(response.statusCode, 403) + assert.equal(response.statusCode, 401) done() }) }) @@ -455,7 +455,7 @@ describe('ACL with WebID+TLS', function () { request.head(options, function (error, response, body) { assert.equal(error, null) - assert.equal(response.statusCode, 403) + assert.equal(response.statusCode, 401) done() }) }) diff --git a/test/integration/authentication-oidc-test.js b/test/integration/authentication-oidc-test.js index 54281eec3..ad4476d1e 100644 --- a/test/integration/authentication-oidc-test.js +++ b/test/integration/authentication-oidc-test.js @@ -22,8 +22,9 @@ chai.use(require('dirty-chai')) describe('Authentication API (OIDC)', () => { let alice, bob - let aliceServerUri = 'https://localhost:7000' - let aliceWebId = 'https://localhost:7000/profile/card#me' + const aliceServerPort = 7000 + const aliceServerUri = `https://localhost:${aliceServerPort}` + const aliceWebId = `https://localhost:${aliceServerPort}/profile/card#me` let configPath = path.join(__dirname, '../resources/config') let aliceDbPath = path.join(__dirname, '../resources/accounts-scenario/alice/db') @@ -31,7 +32,8 @@ describe('Authentication API (OIDC)', () => { let aliceUserStore = UserStore.from({ path: userStorePath, saltRounds: 1 }) aliceUserStore.initCollections() - let bobServerUri = 'https://localhost:7001' + const bobServerPort = 7001 + const bobServerUri = `https://localhost:${bobServerPort}` let bobDbPath = path.join(__dirname, '../resources/accounts-scenario/bob/db') @@ -70,8 +72,8 @@ describe('Authentication API (OIDC)', () => { before(async () => { await Promise.all([ - startServer(alicePod, 7000), - startServer(bobPod, 7001) + startServer(alicePod, aliceServerPort), + startServer(bobPod, bobServerPort) ]).then(() => { alice = supertest(aliceServerUri) bob = supertest(bobServerUri) @@ -146,231 +148,170 @@ describe('Authentication API (OIDC)', () => { }) describe('and performing a subsequent request', () => { - describe('without that cookie', () => { - let response - before(done => { - alice.get('/private-for-alice.txt') - .end((err, res) => { - response = res - done(err) - }) + let response + describe('without cookie', () => { + describe('and no origin set', () => { + before(done => { + alice.get('/private-for-alice.txt') + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) }) - - it('should return a 401', () => { - expect(response).to.have.property('status', 401) - }) - }) - - describe('with that cookie and a non-matching origin', () => { - let response - before(done => { - alice.get('/private-for-owner.txt') - .set('Cookie', cookie) - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 403', () => { - expect(response).to.have.property('status', 403) - }) - }) - - describe('with that cookie but without origin', () => { - let response - before(done => { - alice.get('/') - .set('Cookie', cookie) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 200', () => { - expect(response).to.have.property('status', 200) - }) - }) - - // How Mallory might set their cookie: - describe('with malicious cookie but without origin', () => { - let response - before(done => { - var malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') - alice.get('/private-for-alice.txt') - .set('Cookie', malcookie) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => { - expect(response).to.have.property('status', 401) - }) - }) - - // Our origin is trusted by default - describe('with that cookie and our origin', () => { - let response - before(done => { - alice.get('/') - .set('Cookie', cookie) - .set('Origin', aliceServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 200', () => { - expect(response).to.have.property('status', 200) - }) - }) - - // Another origin isn't trusted by default - describe('with that cookie and our origin', () => { - let response - before(done => { - alice.get('/private-for-owner.txt') - .set('Cookie', cookie) - .set('Origin', 'https://some.other.domain.com') - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 403', () => { - expect(response).to.have.property('status', 403) + describe('and our origin', () => { + // Our own origin, no agent auth + before(done => { + alice.get('/private-for-alice.txt') + .set('Origin', aliceServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) }) - }) - - // Our own origin, no agent auth - describe('without that cookie but with our origin', () => { - let response - before(done => { - alice.get('/private-for-owner.txt') - .set('Origin', aliceServerUri) - .end((err, res) => { - response = res - done(err) - }) + describe('and trusted origin', () => { + // Configuration for originsAllowed but no auth + before(done => { + alice.get('/private-for-alice.txt') + .set('Origin', 'https://apps.solid.invalid') + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) }) - - it('should return a 401', () => { - expect(response).to.have.property('status', 401) + describe('and untrusted origin', () => { + // Not authenticated but also wrong origin, + before(done => { + alice.get('/private-for-alice.txt') + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) }) }) - // Configuration for originsAllowed - describe('with that cookie but with globally configured origin', () => { - let response - before(done => { - alice.get('/') - .set('Cookie', cookie) - .set('Origin', 'https://apps.solid.invalid') - .end((err, res) => { - response = res - done(err) - }) + describe('with cookie', () => { + describe('and no origin set', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', cookie) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 200', () => expect(response).to.have.property('status', 200)) }) - - it('should return a 200', () => { - expect(response).to.have.property('status', 200) + describe('and our origin', () => { + before(done => { + alice.get('/') + .set('Cookie', cookie) + .set('Origin', aliceServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 200', () => expect(response).to.have.property('status', 200)) }) - }) - - // Configuration for originsAllowed but no auth - describe('without that cookie but with globally configured origin', () => { - let response - before(done => { - alice.get('/private-for-alice.txt') - .set('Origin', 'https://apps.solid.invalid') - .end((err, res) => { - response = res - done(err) - }) + describe('and trusted origin', () => { + before(done => { + alice.get('/') + .set('Cookie', cookie) + .set('Origin', 'https://apps.solid.invalid') + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 200', () => expect(response).to.have.property('status', 200)) }) - - it('should return a 403', () => { - expect(response).to.have.property('status', 403) // TODO: Should be 401? + describe('and untrusted origin', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', cookie) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 403', () => expect(response).to.have.property('status', 403)) }) }) - // Configuration for originsAllowed with malicious cookie - describe('with malicious cookie but with globally configured origin', () => { - let response - before(done => { - var malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') - alice.get('/private-for-alice.txt') - .set('Cookie', malcookie) - .set('Origin', 'https://apps.solid.invalid') - .end((err, res) => { - response = res - done(err) - }) + describe('with malicious cookie', () => { + let malcookie + before(() => { + // How Mallory might set their cookie: + malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') }) - - it('should return a 403', () => { - expect(response).to.have.property('status', 403) + describe('and no origin set', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', malcookie) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) }) - }) - - // Not authenticated but also wrong origin, - // 403 because authenticating wouldn't help, since the Origin is wrong - describe('without that cookie and a matching origin', () => { - let response - before(done => { - alice.get('/private-for-owner.txt') - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 403', () => { - expect(response).to.have.property('status', 403) + describe('and our origin', () => { + before(done => { + alice.get('/') + .set('Cookie', malcookie) + .set('Origin', aliceServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) }) - }) - - // Authenticated but origin not OK - describe('with that cookie and a non-matching origin', () => { - let response - before(done => { - alice.get('/private-for-owner.txt') - .set('Cookie', cookie) - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) + describe('and trusted origin', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', malcookie) + .set('Origin', 'https://apps.solid.invalid') + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) }) - - it('should return a 403', () => { - expect(response).to.have.property('status', 403) - }) - }) - - // Authenticated but origin not OK - describe('with malicious cookie and a non-matching origin', () => { - let response - before(done => { - var malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') - alice.get('/private-for-owner.txt') - .set('Cookie', malcookie) - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 403', () => { - expect(response).to.have.property('status', 403) + describe('and untrusted origin', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', malcookie) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) }) }) }) diff --git a/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js b/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js new file mode 100644 index 000000000..1fd2bad42 --- /dev/null +++ b/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js @@ -0,0 +1,531 @@ +const Solid = require('../../index') +const path = require('path') +const fs = require('fs-extra') +const { UserStore } = require('@solid/oidc-auth-manager') +const UserAccount = require('../../lib/models/user-account') +const SolidAuthOIDC = require('@solid/solid-auth-oidc') + +const fetch = require('node-fetch') +const localStorage = require('localstorage-memory') +const URL = require('whatwg-url').URL +global.URL = URL +global.URLSearchParams = require('whatwg-url').URLSearchParams +const { cleanDir, cp } = require('../utils') + +const supertest = require('supertest') +const chai = require('chai') +const expect = chai.expect +chai.use(require('dirty-chai')) + +// In this test we always assume that we are Alice + +describe('Authentication API (OIDC) - With strict origins turned off', () => { + let alice, bob + + const aliceServerPort = 7010 + const aliceServerUri = `https://localhost:${aliceServerPort}` + const aliceWebId = `https://localhost:${aliceServerPort}/profile/card#me` + let configPath = path.join(__dirname, '../resources/config') + let aliceDbPath = path.join(__dirname, '../resources/accounts-strict-origin-off/alice/db') + let userStorePath = path.join(aliceDbPath, 'oidc/users') + let aliceUserStore = UserStore.from({ path: userStorePath, saltRounds: 1 }) + aliceUserStore.initCollections() + + const bobServerPort = 7011 + const bobServerUri = `https://localhost:${bobServerPort}` + let bobDbPath = path.join(__dirname, '../resources/accounts-strict-origin-off/bob/db') + + const serverConfig = { + sslKey: path.join(__dirname, '../keys/key.pem'), + sslCert: path.join(__dirname, '../keys/cert.pem'), + auth: 'oidc', + dataBrowser: false, + webid: true, + multiuser: false, + configPath, + strictOrigin: false + } + + const aliceRootPath = path.join(__dirname, '../resources/accounts-strict-origin-off/alice') + const alicePod = Solid.createServer( + Object.assign({ + root: aliceRootPath, + serverUri: aliceServerUri, + dbPath: aliceDbPath + }, serverConfig) + ) + const bobRootPath = path.join(__dirname, '../resources/accounts-strict-origin-off/bob') + const bobPod = Solid.createServer( + Object.assign({ + root: bobRootPath, + serverUri: bobServerUri, + dbPath: bobDbPath + }, serverConfig) + ) + + function startServer (pod, port) { + return new Promise((resolve) => { + pod.listen(port, () => { resolve() }) + }) + } + + before(async () => { + await Promise.all([ + startServer(alicePod, aliceServerPort), + startServer(bobPod, bobServerPort) + ]).then(() => { + alice = supertest(aliceServerUri) + bob = supertest(bobServerUri) + }) + cp(path.join('accounts-strict-origin-off/alice', '.acl-override'), path.join('accounts-strict-origin-off/alice', '.acl')) + cp(path.join('accounts-strict-origin-off/bob', '.acl-override'), path.join('accounts-strict-origin-off/bob', '.acl')) + }) + + after(() => { + alicePod.close() + bobPod.close() + fs.removeSync(path.join(aliceDbPath, 'oidc/users')) + cleanDir(aliceRootPath) + cleanDir(bobRootPath) + }) + + describe('Login page (GET /login)', () => { + it('should load the user login form', () => alice.get('/login').expect(200)) + }) + + describe('Login by Username and Password (POST /login/password)', () => { + // Logging in as alice, to alice's pod + let aliceAccount = UserAccount.from({ webId: aliceWebId }) + let alicePassword = '12345' + + beforeEach(() => { + aliceUserStore.initCollections() + + return aliceUserStore.createUser(aliceAccount, alicePassword) + .catch(console.error.bind(console)) + }) + + afterEach(() => { + fs.removeSync(path.join(aliceDbPath, 'users/users')) + }) + + describe('after performing a correct login', () => { + let response, cookie + before(done => { + aliceUserStore.initCollections() + aliceUserStore.createUser(aliceAccount, alicePassword) + alice.post('/login/password') + .type('form') + .send({ username: 'alice' }) + .send({ password: alicePassword }) + .end((err, res) => { + response = res + cookie = response.headers['set-cookie'][0] + done(err) + }) + }) + + it('should redirect to /authorize', () => { + const loginUri = response.headers.location + expect(response).to.have.property('status', 302) + expect(loginUri.startsWith(aliceServerUri + '/authorize')) + }) + + it('should set the cookie', () => { + expect(cookie).to.match(/connect.sid=\S{65,100}/) + }) + + it('should set the cookie with HttpOnly', () => { + expect(cookie).to.match(/HttpOnly/) + }) + + it('should set the cookie with Secure', () => { + expect(cookie).to.match(/Secure/) + }) + + describe('and performing a subsequent request', () => { + let response + describe('without cookie', () => { + describe('and no origin set', () => { + before(done => { + alice.get('/private-for-alice.txt') + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + describe('and our origin', () => { + // Our own origin, no agent auth + before(done => { + alice.get('/private-for-alice.txt') + .set('Origin', aliceServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + describe('and trusted origin', () => { + // Configuration for originsAllowed but no auth + before(done => { + alice.get('/private-for-alice.txt') + .set('Origin', 'https://apps.solid.invalid') + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + describe('and untrusted origin', () => { + // Not authenticated but also wrong origin, + before(done => { + alice.get('/private-for-alice.txt') + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + }) + + describe('with cookie', () => { + describe('and no origin set', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', cookie) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 200', () => expect(response).to.have.property('status', 200)) + }) + describe('and our origin', () => { + before(done => { + alice.get('/') + .set('Cookie', cookie) + .set('Origin', aliceServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 200', () => expect(response).to.have.property('status', 200)) + }) + describe('and trusted origin', () => { + before(done => { + alice.get('/') + .set('Cookie', cookie) + .set('Origin', 'https://apps.solid.invalid') + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 200', () => expect(response).to.have.property('status', 200)) + }) + describe('and untrusted origin', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', cookie) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + }) + + describe('with malicious cookie', () => { + let malcookie + before(() => { + // How Mallory might set their cookie: + malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') + }) + describe('and no origin set', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', malcookie) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + describe('and our origin', () => { + before(done => { + alice.get('/') + .set('Cookie', malcookie) + .set('Origin', aliceServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + describe('and trusted origin', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', malcookie) + .set('Origin', 'https://apps.solid.invalid') + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + describe('and untrusted origin', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', malcookie) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + }) + }) + }) + + it('should throw a 400 if no username is provided', (done) => { + alice.post('/login/password') + .type('form') + .send({ password: alicePassword }) + .expect(400, done) + }) + + it('should throw a 400 if no password is provided', (done) => { + alice.post('/login/password') + .type('form') + .send({ username: 'alice' }) + .expect(400, done) + }) + + it('should throw a 400 if user is found but no password match', (done) => { + alice.post('/login/password') + .type('form') + .send({ username: 'alice' }) + .send({ password: 'wrongpassword' }) + .expect(400, done) + }) + }) + + describe('Browser login workflow', () => { + it('401 Unauthorized asking the user to log in', (done) => { + bob.get('/shared-with-alice.txt') + .end((err, { status, text }) => { + expect(status).to.equal(401) + expect(text).to.contain('Log in') + done(err) + }) + }) + }) + + describe('Two Pods + Web App Login Workflow', () => { + let aliceAccount = UserAccount.from({ webId: aliceWebId }) + let alicePassword = '12345' + + let auth + let authorizationUri, loginUri, authParams, callbackUri + let loginFormFields = '' + let bearerToken + + before(() => { + auth = new SolidAuthOIDC({ store: localStorage, window: { location: {} } }) + let appOptions = { + redirectUri: 'https://app.example.com/callback' + } + + aliceUserStore.initCollections() + + return aliceUserStore.createUser(aliceAccount, alicePassword) + .then(() => { + return auth.registerClient(aliceServerUri, appOptions) + }) + .then(registeredClient => { + auth.currentClient = registeredClient + }) + }) + + after(() => { + fs.removeSync(path.join(aliceDbPath, 'users/users')) + fs.removeSync(path.join(aliceDbPath, 'oidc/op/tokens')) + + let clientId = auth.currentClient.registration['client_id'] + let registration = `_key_${clientId}.json` + fs.removeSync(path.join(aliceDbPath, 'oidc/op/clients', registration)) + }) + + // Step 1: An app makes a GET request and receives a 401 + it('should get a 401 error on a REST request to a protected resource', () => { + return fetch(bobServerUri + '/shared-with-alice.txt') + .then(res => { + expect(res.status).to.equal(401) + + expect(res.headers.get('www-authenticate')) + .to.equal(`Bearer realm="${bobServerUri}", scope="openid webid"`) + }) + }) + + // Step 2: App presents the Select Provider UI to user, determine the + // preferred provider uri (here, aliceServerUri), and constructs + // an authorization uri for that provider + it('should determine the authorization uri for a preferred provider', () => { + return auth.currentClient.createRequest({}, auth.store) + .then(authUri => { + authorizationUri = authUri + + expect(authUri.startsWith(aliceServerUri + '/authorize')).to.be.true() + }) + }) + + // Step 3: App redirects user to the authorization uri for login + it('should redirect user to /authorize and /login', () => { + return fetch(authorizationUri, { redirect: 'manual' }) + .then(res => { + // Since user is not logged in, /authorize redirects to /login + expect(res.status).to.equal(302) + + loginUri = new URL(res.headers.get('location')) + expect(loginUri.toString().startsWith(aliceServerUri + '/login')) + .to.be.true() + + authParams = loginUri.searchParams + }) + }) + + // Step 4: Pod returns a /login page with appropriate hidden form fields + it('should display the /login form', () => { + return fetch(loginUri.toString()) + .then(loginPage => { + return loginPage.text() + }) + .then(pageText => { + // Login page should contain the relevant auth params as hidden fields + + authParams.forEach((value, key) => { + let hiddenField = `` + + let fieldRegex = new RegExp(hiddenField) + + expect(pageText).to.match(fieldRegex) + + loginFormFields += `${key}=` + encodeURIComponent(value) + '&' + }) + }) + }) + + // Step 5: User submits their username & password via the /login form + it('should login via the /login form', () => { + loginFormFields += `username=${'alice'}&password=${alicePassword}` + + return fetch(aliceServerUri + '/login/password', { + method: 'POST', + body: loginFormFields, + redirect: 'manual', + headers: { + 'content-type': 'application/x-www-form-urlencoded' + }, + credentials: 'include' + }) + .then(res => { + expect(res.status).to.equal(302) + let postLoginUri = res.headers.get('location') + let cookie = res.headers.get('set-cookie') + + // Successful login gets redirected back to /authorize and then + // back to app + expect(postLoginUri.startsWith(aliceServerUri + '/authorize')) + .to.be.true() + + return fetch(postLoginUri, { redirect: 'manual', headers: { cookie } }) + }) + .then(res => { + // User gets redirected back to original app + expect(res.status).to.equal(302) + callbackUri = res.headers.get('location') + expect(callbackUri.startsWith('https://app.example.com#')) + }) + }) + + // Step 6: Web App extracts tokens from the uri hash fragment, uses + // them to access protected resource + it('should use id token from the callback uri to access shared resource', () => { + auth.window.location.href = callbackUri + + let protectedResourcePath = bobServerUri + '/shared-with-alice.txt' + + return auth.initUserFromResponse(auth.currentClient) + .then(webId => { + expect(webId).to.equal(aliceWebId) + + return auth.issuePoPTokenFor(bobServerUri, auth.session) + }) + .then(popToken => { + bearerToken = popToken + + return fetch(protectedResourcePath, { + headers: { + 'Authorization': 'Bearer ' + bearerToken + } + }) + }) + .then(res => { + expect(res.status).to.equal(200) + + return res.text() + }) + .then(contents => { + expect(contents).to.equal('protected contents\n') + }) + }) + + it('should not be able to reuse the bearer token for bob server on another server', () => { + let privateAliceResourcePath = aliceServerUri + '/private-for-alice.txt' + + return fetch(privateAliceResourcePath, { + headers: { + // This is Alice's bearer token with her own Web ID + 'Authorization': 'Bearer ' + bearerToken + } + }) + .then(res => { + // It will get rejected; it was issued for Bob's server only + expect(res.status).to.equal(403) + }) + }) + }) + + describe('Post-logout page (GET /goodbye)', () => { + it('should load the post-logout page', () => { + return alice.get('/goodbye') + .expect(200) + }) + }) +}) diff --git a/test/resources/accounts-scenario/alice/private-for-owner.txt b/test/resources/accounts-scenario/alice/private-for-owner.txt deleted file mode 100644 index 5d39eb781..000000000 --- a/test/resources/accounts-scenario/alice/private-for-owner.txt +++ /dev/null @@ -1 +0,0 @@ -protected contents for owner diff --git a/test/resources/accounts-scenario/alice/private-for-owner.txt.acl b/test/resources/accounts-strict-origin-off/alice/.acl-override similarity index 63% rename from test/resources/accounts-scenario/alice/private-for-owner.txt.acl rename to test/resources/accounts-strict-origin-off/alice/.acl-override index fbc63348b..bcdd33def 100644 --- a/test/resources/accounts-scenario/alice/private-for-owner.txt.acl +++ b/test/resources/accounts-strict-origin-off/alice/.acl-override @@ -1,5 +1,5 @@ <#Owner> a ; - <./private-for-owner.txt>; - ; + <./>; + ; , , . diff --git a/test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json b/test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json new file mode 100644 index 000000000..68a3b5341 --- /dev/null +++ b/test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json @@ -0,0 +1,411 @@ +{ + "issuer": "https://localhost:7010", + "authorization_endpoint": "https://localhost:7010/authorize", + "token_endpoint": "https://localhost:7010/token", + "userinfo_endpoint": "https://localhost:7010/userinfo", + "jwks_uri": "https://localhost:7010/jwks", + "registration_endpoint": "https://localhost:7010/register", + "response_types_supported": [ + "code", + "code token", + "code id_token", + "id_token", + "id_token token", + "code id_token token", + "none" + ], + "response_modes_supported": [ + "query", + "fragment" + ], + "grant_types_supported": [ + "authorization_code", + "implicit", + "refresh_token", + "client_credentials" + ], + "subject_types_supported": [ + "public" + ], + "id_token_signing_alg_values_supported": [ + "RS256", + "RS384", + "RS512", + "none" + ], + "token_endpoint_auth_methods_supported": [ + "client_secret_basic" + ], + "token_endpoint_auth_signing_alg_values_supported": [ + "RS256" + ], + "display_values_supported": [], + "claim_types_supported": [ + "normal" + ], + "claims_supported": [], + "claims_parameter_supported": false, + "request_parameter_supported": true, + "request_uri_parameter_supported": false, + "require_request_uri_registration": false, + "check_session_iframe": "https://localhost:7010/session", + "end_session_endpoint": "https://localhost:7010/logout", + "keys": { + "descriptor": { + "id_token": { + "signing": { + "RS256": { + "alg": "RS256", + "modulusLength": 2048 + }, + "RS384": { + "alg": "RS384", + "modulusLength": 2048 + }, + "RS512": { + "alg": "RS512", + "modulusLength": 2048 + } + }, + "encryption": {} + }, + "token": { + "signing": { + "RS256": { + "alg": "RS256", + "modulusLength": 2048 + }, + "RS384": { + "alg": "RS384", + "modulusLength": 2048 + }, + "RS512": { + "alg": "RS512", + "modulusLength": 2048 + } + }, + "encryption": {} + }, + "userinfo": { + "encryption": {} + }, + "register": { + "signing": { + "RS256": { + "alg": "RS256", + "modulusLength": 2048 + } + } + } + }, + "jwks": { + "keys": [ + { + "kid": "QMa5xaKOYwI", + "kty": "RSA", + "alg": "RS256", + "n": "ol8T6mc7t55kUI3Xf4pHsx8p25VqZ3jm54TQY6xZ07FYzwU8ex02Mg_W_VABRNyVq8wdUBKubo1W8iaKtvtrr0XDOyHUAlwM6xa14332c9akB1AmTirZY4gvyobIY-b18F8LpeIkkLUcypeZmsDd-bGONEJs0sxM6LtLCY41s_lgesPdQwmHLBw4_Rw9NcjBslupWP_pSXUW9x2fj8tKHOoURqmOWL-54t9YbDdIht06uzqagzjPV3UoYtvRsu2QUJx99ExgNvCA9pA1wyiyysyhUdfeKyZpwvTfwWxkrwZrE6zb1AZICFW5R3Bgg0b9UnS96LpFxbSO7rXBRWVKOw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "66gqKTPVHyA", + "kty": "RSA", + "alg": "RS384", + "n": "rWHV18o2T_9zhO-YknvC9brSjWru496-Dw0iVCiJdEZph94aWXeZW4tYsSjYAfzCJXQUrIqfoPTx100KoYRMiUGpVUh5AgwqAitOpFV_Cxa2j4D01qALwUXWblmJTeCzY7zQFOs1-OBU_U3fhsqcHVPHVlfwO4fYhe-FrhQwTDf55JIW5OGM2bViRxpPyZ3t9nueSuz1jEDCSRlaizJq4jhDrkYWoXtXomRfoseGrZVwTGx5cslfrYs-AmLWMfLkZQWjYZMcwOaJCy3dSkTQkmas4dzGwQqrOqNbgznyCo3oTpHboWS36e0jn_lnbq95zPpZkHNsOzw-Mzq0KRj1jw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "zPdTDVkjms4", + "kty": "RSA", + "alg": "RS512", + "n": "tbVEZHw4LP21DFHmF0QjbSektUEGl8t4blGcZM871ieppUVZ_uHKlfan2ftnQ4GwBISkmjwk6KP1nc9iiONzqAhJbFheQMT4RAmYz7xPJP9cAPOiD8YbqzO2xJqBT1OMc2PDS7ICH0-t_kBXMb0IR61CTG-CmO5Tp8ecauUkshvvYg0dA3-os16Dy5ex4if3ZSpfXowmfjRrvYAKEPeFTmA9Q8lMzN0ZyuEb2nILIeMFwTAjo8Ck8D1h4keOVaY0mfTgC9KxkR1kIcAc7DELYX-vjG63AwB-8IIo735g5NMrFj22923jymMDpQDTEMui-jW1TQYNGR84ShNW_nJZGQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "8zan03XlrmI", + "kty": "RSA", + "alg": "RS256", + "n": "y3E2ffizby9vClbahFgkg8_NcpA6iYTwkA4TH2i2-usyH87nz3uM5LfRa7KIV4ZHOvY-DZr6H1MAqaFCPrciWZnPPyTRxlUlYhfb4n42g0Bwk7Oh7z-KZvIqR45x85NfniR3uB8xu47VdTWCmWJge2glMavdWC8mr5Pc8um3Fr5eMVactUFsp571SrVKuY_u5qJHN3xmn7mLpiLdCIHFlBkvvLgcAcUmXFhn8cCzHCqkrcrRgfjhd5YJmv6wxxINrTMT4_dS4jxE5u1Ezw-m6xSIWukdW21lWupFHNZEK5VvIkiCBl73Sh0vO-gv4XNJcQmPRpqMdHat8GLG7I2PHQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "5ooqXseJdoQ", + "kty": "RSA", + "alg": "RS384", + "n": "tqhzPmOds6zvDNX3IHCr7SW5kf6GlnlpW-Rm4aQot1HmtKnsXieV99VjT98EspvcFeKyT5jcJFgZMHb1n_kOtRnhygFHNZQ4ooFmFI2VP5lPUuOIGppWiO5ZxIzECdnwAGoZ7A1hu9Vh5oJJP-m_88JX3sdbHPlsEpzdXHf-THZKAqPYHGNWeNPkmQuON5PaEwiJGRWQ0dbMZtsiMoVCPjh7ZQM-1N2UjXmSAcCCxst5BaTUwQQuVmKIT-cfxP9ShPjP7_DmpRBDOp7_frMKTPkznL0HPNWqSRRewGWB6AcrdY7WtWI5hHNDx9GTdLmolFOvnL4cgtr99u9adq6vAw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "tfz-MRyl3GQ", + "kty": "RSA", + "alg": "RS512", + "n": "3vyjzgsA89bJHD7BZ2MNadjFOPUXpuGKlC7OumOspC_iOSMnJ0Kh7oCWmsBTuzGdfY_gYMaXx28NK-LVjGmaEKZxPhdCz7yzofUCMWoVXNhE4hwBdZt1mNl0abaKNzJ_8BhbtTNhourfBvRwebMYFYO0LfEkApE-hM929pFERb0G3-_ybw8A2cqQFvQ67JhYsBcFUwpf68xZvfYTbdsJzfkkoY0UgI01GU55dZskPBK-_jndzo_bNo8wdENU_cUdOllNdZUoWAemWOGoHKdNshGKy6OwZaC9xqaE_VzF-RaYEcf_jaLD7GbPrz9Xcm9sygnFV3IDlj9-0fjKOkAwqw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "FRI7f7sJKUg", + "kty": "RSA", + "alg": "RS256", + "n": "0d4up4hx3l_HZa6D2PO-YYSqgNbAWjtlIbnFWIZS-PRzVFgDKcR9bLo_9-MGm0sT0tHbyeqc4V8o5oeYF0uhNmlEuU9Do2VYiyc0fkNeW1nFrC-XJYxbnge4Pxbhl-0Jn04O8IJsP15xq16GfRZxYfjKPeFilQNeDwTb_SBqoveZASHUW998eO1bEg0bjUZs4Yy23S4R23ABZKTQMPMGMETGFVbcFNXUohu0eSYMG4eU9iaFNmh0p0G9lU7ER-UFSatczaEFle0Awazb7-EHN6iya3zL6LDt-ezlIszTzHIXa2Dhhga2SlDIyuhFUOkkEeCP3a-sFeXre-JWiYz8ZQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + ] + }, + "id_token": { + "signing": { + "RS256": { + "privateJwk": { + "kid": "hS7A2bkdhJA", + "kty": "RSA", + "alg": "RS256", + "n": "ol8T6mc7t55kUI3Xf4pHsx8p25VqZ3jm54TQY6xZ07FYzwU8ex02Mg_W_VABRNyVq8wdUBKubo1W8iaKtvtrr0XDOyHUAlwM6xa14332c9akB1AmTirZY4gvyobIY-b18F8LpeIkkLUcypeZmsDd-bGONEJs0sxM6LtLCY41s_lgesPdQwmHLBw4_Rw9NcjBslupWP_pSXUW9x2fj8tKHOoURqmOWL-54t9YbDdIht06uzqagzjPV3UoYtvRsu2QUJx99ExgNvCA9pA1wyiyysyhUdfeKyZpwvTfwWxkrwZrE6zb1AZICFW5R3Bgg0b9UnS96LpFxbSO7rXBRWVKOw", + "e": "AQAB", + "d": "KvDiH3e1v1XQSc15VG2JkMGJHF1jioHa7xec1P9bsjSQvA8yc4zCLHMr9EoYS9Hac1jD181Y_Du85sVyofnT_MKCYz0LCKS3deTHraY-a1w0fQqhVsLWQxBdMz55-JG4MR2xwukPqoV7W8jEAr1G9yYR6Zg3l3gYTuRZb-mAIlxBZOcZ-4DvB0GtEYLyWFRSMiaUl_EkqgQpssH5hKIIB7xtHZFG_FsbH2gnv0apZFdZCs1hpzyJ_FuUYoIupdaHUP92ojdGQ8E51J_t6SIYjZdtEoKhk6i2BHIPzSerxItVgAs-3RTbeYp1gEdyQGROz8Owyorsqzq-2S7gxXn_AQ", + "p": "zJtqzVrhym0DBWIK11LEIwTPU9G_prC_XYzt0H3tXuiwAlpRoFOoecAKsCJqb_bvL7mqVCjYzS-O57dzdxd36F-vpvW9xH3SgfxcoDtiVkvuoux9nGaQXLWCetjHy8jrL41SDVc55R7h4knn6KgR_yWmY2LR-w0CktrWuIlOIps", + "q": "yyfVYtGaJASgfkv1KL-HoA8yyP7OZrUsxxQcIXMuQoAUqKtvyl6gn2W4uW4opg_yzuN0jxK8ZM8EjOmzXs0_dhVWXWFBBvhmpI4ssXXQYVhJiq-QMm6WvDZFXtW-o3ikRXWuxwnUeOn0psxsIXtHrKQ7Wcf29KrCu64MYTvIoOE", + "dp": "Ptr722ww8wO8KtospGtbr7pZitFjw-yGTVHu-N7GniJzd7WRX-RzXDufzO41roG4hvvNlJ8bwyT6DLsxsIM4Jd3HU04o5wUUNzR0rBCyK_qVq91k1Tg43xIvrFeOQU9O2MPcUhbaxUVQdTjpEnMXXD-PtvZztWEQylaKIhSkOUM", + "dq": "oauPetaGrgcomZlk_gp9qfiuV5m_M6kWe08bm9sHg1BeIGRd0FRByteui5KIsq6acd480eb9GdRNML6CSf1YdWZBlopgr2VaebXTB15UeENEMyPHwvqS5jDiP7glv_2v7L7cWfUOqzKzyVGA85why9fei3JAqzCBS84UeASVgsE", + "qi": "lURMq4viaqzYCi_JF_dDZjvc6rpuiRSzhd0PyY6mdutMZqLtZJESZt8HuEqpey5GA4i481DmmUXCfNhBc-4kUOAP5PVdHJp7YttvrzpkZGtJx_xLwLLLgDn6zaheaeNnxRvHqoW0Cycx6TAAVzX2Cdsjo-vRiaRqGkOBPslOiqA", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "QMa5xaKOYwI", + "kty": "RSA", + "alg": "RS256", + "n": "ol8T6mc7t55kUI3Xf4pHsx8p25VqZ3jm54TQY6xZ07FYzwU8ex02Mg_W_VABRNyVq8wdUBKubo1W8iaKtvtrr0XDOyHUAlwM6xa14332c9akB1AmTirZY4gvyobIY-b18F8LpeIkkLUcypeZmsDd-bGONEJs0sxM6LtLCY41s_lgesPdQwmHLBw4_Rw9NcjBslupWP_pSXUW9x2fj8tKHOoURqmOWL-54t9YbDdIht06uzqagzjPV3UoYtvRsu2QUJx99ExgNvCA9pA1wyiyysyhUdfeKyZpwvTfwWxkrwZrE6zb1AZICFW5R3Bgg0b9UnS96LpFxbSO7rXBRWVKOw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + }, + "RS384": { + "privateJwk": { + "kid": "IN7Ur_i2gps", + "kty": "RSA", + "alg": "RS384", + "n": "rWHV18o2T_9zhO-YknvC9brSjWru496-Dw0iVCiJdEZph94aWXeZW4tYsSjYAfzCJXQUrIqfoPTx100KoYRMiUGpVUh5AgwqAitOpFV_Cxa2j4D01qALwUXWblmJTeCzY7zQFOs1-OBU_U3fhsqcHVPHVlfwO4fYhe-FrhQwTDf55JIW5OGM2bViRxpPyZ3t9nueSuz1jEDCSRlaizJq4jhDrkYWoXtXomRfoseGrZVwTGx5cslfrYs-AmLWMfLkZQWjYZMcwOaJCy3dSkTQkmas4dzGwQqrOqNbgznyCo3oTpHboWS36e0jn_lnbq95zPpZkHNsOzw-Mzq0KRj1jw", + "e": "AQAB", + "d": "KtxZqbuiS4phu0YjmGqh2m8xp6X8ojYpE71ydA2FVUomwmCkcOOA9MFwznLDW1JpiCq3BaRLK9YBhvDTpPP4m6Gww5Vj3J63L8wW58b-3fXicX02iWwNG90w0hyuNaNLlWdSpSk0MW77c5bxn_esOg_A4lZg28aMPyfkCxGQkvaHR2EeY9eL9xlZoNtQxtLoKOIl97fJt96C9hXwRPuygDknHywRo35_Fi9nSpdu-_wfoZxBvPvRAQA-jFmwsJwLB3XaYJEZmZoBajXLfYUVEYKCOD7bsPysdbIUCY6dFBAL9FyFl5HSCjgW6yKHql0YfUf5VabQQnkdXDZxng7OiQ", + "p": "2ZOHQkgjfkgMC0Z6gfP-nCj_jqDI2F6MpB4HIvOvpm8z-qz02mZeC6zgHzHtichOwgCPJPapS7hN9vlQdnOTl62XBWmZ2Jbz_q3shbnRPYx7J3GSARrohOHm1bsapxeagQcXoBuScx-Kvgih4B_-u-PHvHFQHHaoEzIpR_FcK-M", + "q": "zABSbkRBSpayejh_y8cvTZI5YZjz8bK_n78yKYOR4bsPrC-c2TGtxsHqv5x_5Ps5ALicul59HgrN8oD8THYJiO2V7wobNIp4HDl2J8aL9me43a2VuDRPOXHeOzxtP071_p6VZWEju0kMDihwn91Vkc2RwrgkNrPClGEQstOg12U", + "dp": "dqxTIEH8qgpeF2BPvcX53-80xPTJ18pqZ7HBLr0_10XcUiQ4QU-IiFG4xQsUhwxseMCZUw3-9UAHtmfyDUmo_Rg_wUICGfLsDsOKuL3LdQjEu5TkkBm_LYuRvo4ZUX48VZgquLeRP526rUBEGt0Ysh7heNVNXtkRf7bicU0iewU", + "dq": "yGvskF7IksJZWNCXZZostBZb_7HowOYvc3_BhZ24vkAs1qr0e0Jei25K9rOHx2y2BSpa-JMKc3CEA6OLvIcfOQLKkk2oiscb2AbwOYXMTmp66ne3J4Fk8HgZsLLeVht6fQxKlI6KL19F08cRV0552kRP1zFYitGy8lomsLpQRC0", + "qi": "scdLHtzFy5A5nhbl6XOv_g_5LxTiebV9ifCo8A_Y8T7hEPsUwOZxkIarcREgDbgo7zdJZjpKEklWrsp6sBT6KyJZf1_e_oZWCoivr7btx05ZWq7bJdn8773y-7DjL3H_HFpqVkpx-f03OKV8_AV-VspkxsVrp0FcrRGs2hpjck0", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "66gqKTPVHyA", + "kty": "RSA", + "alg": "RS384", + "n": "rWHV18o2T_9zhO-YknvC9brSjWru496-Dw0iVCiJdEZph94aWXeZW4tYsSjYAfzCJXQUrIqfoPTx100KoYRMiUGpVUh5AgwqAitOpFV_Cxa2j4D01qALwUXWblmJTeCzY7zQFOs1-OBU_U3fhsqcHVPHVlfwO4fYhe-FrhQwTDf55JIW5OGM2bViRxpPyZ3t9nueSuz1jEDCSRlaizJq4jhDrkYWoXtXomRfoseGrZVwTGx5cslfrYs-AmLWMfLkZQWjYZMcwOaJCy3dSkTQkmas4dzGwQqrOqNbgznyCo3oTpHboWS36e0jn_lnbq95zPpZkHNsOzw-Mzq0KRj1jw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + }, + "RS512": { + "privateJwk": { + "kid": "34CvC1I0fbk", + "kty": "RSA", + "alg": "RS512", + "n": "tbVEZHw4LP21DFHmF0QjbSektUEGl8t4blGcZM871ieppUVZ_uHKlfan2ftnQ4GwBISkmjwk6KP1nc9iiONzqAhJbFheQMT4RAmYz7xPJP9cAPOiD8YbqzO2xJqBT1OMc2PDS7ICH0-t_kBXMb0IR61CTG-CmO5Tp8ecauUkshvvYg0dA3-os16Dy5ex4if3ZSpfXowmfjRrvYAKEPeFTmA9Q8lMzN0ZyuEb2nILIeMFwTAjo8Ck8D1h4keOVaY0mfTgC9KxkR1kIcAc7DELYX-vjG63AwB-8IIo735g5NMrFj22923jymMDpQDTEMui-jW1TQYNGR84ShNW_nJZGQ", + "e": "AQAB", + "d": "RZybBe_8yWesu3qIrnMhK0kbtYCi2PZPPdwwEQK_RqzNNg6aiqXPqaHj7gN9LQR6_VAfiyLtdN6TUxDHC_AvN7ls_3_fI-sRvWb7zuGyZFcb1RWBCY_4u57FLw6N6Wj1jqMyh0Y7v-kTnCrj_J8Rk_wRQR0bKCFtlQJIrz73zu90rcPOOjWPH6W6LCN-lkmOC8vm0M08aHJtZclLSJcSO8VX6P4rDbbIadNubhtZ0_snOlc9ZctpWDgqGRqJGKL2FRldmVMnYr9vE4kv3jELCvkKtct35k1q6qd6pQQ2j3iL0nUnIRRCiuIVRmuiUKI11i2lmQoqnzQN0qGNKhAY3Q", + "p": "7psJPwCSpbravp7NlZQWAmvBvZEdPZ3BNk2w7_udpKZqHvnhgwr40jypwp3JdysSXsd4cDKGlzkCaCeJT3L9N26feCGbwbSjwmdf7UcSXDhlfSxAsEI2LtPPkG4SQdsAv42s3NQcPnO9Uf0ZdH-yV8tj5gwB1ibF0_MxtNcenYc", + "q": "wvRiS7lfGGQmJioCYHrkUyeJnwg2-GYbCD6LF2nDXFbsz_JWmgeI1lbSKuD5notoIy62p0R6FdX3mtwb_8dDDHFbjrHfPbOEp-MOd-cZ9f6XxKeC_uoXrkEdcLl5IthG2WtqKT_If5xIMRW4MYwRD3gTUs-DU255B-7YF3oT_F8", + "dp": "jP01QHIRNTatLLffWMRRIQsVRvNpaNA_q9vKcnOmWfUvfbA_rdQc5PWNhf8AXZco2rJZG0rvtomsP2klPLoAn_GQ70ZEp_gaT7QPvcAiPDXi2kz8yGnHZHIqEvjHdvx2e7m2bCI1sj1nn_vDP9B4zGHVXMi5iRYODUiFlYsLfx8", + "dq": "v1uxwDJMLVzgNUW234zA4P5GD1u42Ukf74-0Z17g65pHCDYO21HZ9slxsbTyT7T2mtIXZ0fHrfc_-zliIkYsgeIixIXDYoT7CO_OG9MzoEouHlFuO1j7tYckpqjnRlST9oWAxsxcuSVllwiCq9-YP17VWMtnVFVzZ14BrcmeJHE", + "qi": "4Ufn1YaM5AImU625M0Fd5r9cYU__mPw-HbJHxHoCENGDY8Mz4pB1nJqu10gI5JKgucU4y8VtV1wBzGb_s97gSS8SMmzea6of2SjoxxyR4sYcPfmJz9-1En7F8r3WahBP1IDMTDV6afbTMVPzPIbjkHowmQHyrTBmx2G3rODfStw", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "zPdTDVkjms4", + "kty": "RSA", + "alg": "RS512", + "n": "tbVEZHw4LP21DFHmF0QjbSektUEGl8t4blGcZM871ieppUVZ_uHKlfan2ftnQ4GwBISkmjwk6KP1nc9iiONzqAhJbFheQMT4RAmYz7xPJP9cAPOiD8YbqzO2xJqBT1OMc2PDS7ICH0-t_kBXMb0IR61CTG-CmO5Tp8ecauUkshvvYg0dA3-os16Dy5ex4if3ZSpfXowmfjRrvYAKEPeFTmA9Q8lMzN0ZyuEb2nILIeMFwTAjo8Ck8D1h4keOVaY0mfTgC9KxkR1kIcAc7DELYX-vjG63AwB-8IIo735g5NMrFj22923jymMDpQDTEMui-jW1TQYNGR84ShNW_nJZGQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + } + }, + "encryption": {} + }, + "token": { + "signing": { + "RS256": { + "privateJwk": { + "kid": "oYYAVkAOTqo", + "kty": "RSA", + "alg": "RS256", + "n": "y3E2ffizby9vClbahFgkg8_NcpA6iYTwkA4TH2i2-usyH87nz3uM5LfRa7KIV4ZHOvY-DZr6H1MAqaFCPrciWZnPPyTRxlUlYhfb4n42g0Bwk7Oh7z-KZvIqR45x85NfniR3uB8xu47VdTWCmWJge2glMavdWC8mr5Pc8um3Fr5eMVactUFsp571SrVKuY_u5qJHN3xmn7mLpiLdCIHFlBkvvLgcAcUmXFhn8cCzHCqkrcrRgfjhd5YJmv6wxxINrTMT4_dS4jxE5u1Ezw-m6xSIWukdW21lWupFHNZEK5VvIkiCBl73Sh0vO-gv4XNJcQmPRpqMdHat8GLG7I2PHQ", + "e": "AQAB", + "d": "Jyjwq0jfCSzhO-VCBK2OwcyTKFU431W2lJQQ_D_E0QHK0TKbjmWi1jfH2Ooxsl9HgML7aNUHBlaMzxoaTUYlF4gyy13D_2BOZNZg3fUbeyJBST0Pk6TweCZvGv0BVDhu9FrirI9cnFS_I-Ob8vhrx_VhC3GglqPk13En254_PuIoEuBgTnxRHxNyIqWSiBUQNuEjqDl2CxO1dpjczKbj6YBzbPqFIV8FkJUz6HS2SMhJOgoDhrhduOFwzqqQQ_yUhfPkP2WYodgDXkyUWdgYKuCgCA3hWrQm1YJf-WoN0l_OVvetTSIlbxiNr-Br7PCPBLOpyiGTu4O3LjFHu0cWJQ", + "p": "6AMK_ANmxrnqgQ77Mf6A1BDopCqQWIBBZ4m_Ia4Ia3ygWpKLdjp5NNM1DL5Lnuing7wSNZvj0iyc-Ra_ilYmLeyKROkyPvwoLohk8W6AVPKotvVOZZwK5nHMIN3McSSgileai0FxxZtFG2W-ZLy4ggKQkfsGDnDQ0vWVpcSQ24M", + "q": "4Hn69Uev6x7nlsAV9fR6GvpjUZDD6Np_VY85BtWEw_6VxbutsMJnI0hYqCPMcmSHfdchzEiMLCUaMIRXMvigNdNxTWF1BSL3L3c7A-uZuv0iJ7X3trNmxEeuJ0EBmcqXcukJuYxW-Lb7XzernSGYOGtambMrf1oMM2ER90egyN8", + "dp": "WnKdPKPi1EQ0TH3XpaTO-l1hJGbHgQj29nM3xNyAwc6DAOwyXDPtfo98Fey1tEyEyZFvE-EjDpN_2odownhVR__342d5xB4vV_yqRYjLlNJIvZKiLnCHu1DPwFxXUCB0SZpfUDyCKwQeC9E9SS5dS6nOTGqs8MJAVo2Q-l_IDRs", + "dq": "vM2cCMW87xNVUnRJhE-WjC5hbu9F-Aoe44XNPzRDsN3mdyN92ZgJS6HD_9fsU6K-W1eg88NpMpAaUQhel16K0fr_50e7NxDLuz6bgpac_KuAGMpyiVanbxujHR0ODZ5ad6oOJeQmGpc9Ij8ettDUyU9yKqiKQ1knvec9RzEVyR0", + "qi": "Xamq4vSnrd6jez7YaYdCU6THSykIMrmyHcXjTMrf4WpeAXxH_Wu3F-jPIFy9zTxkZByMwmCqaBqQ_IJmFuqLBvcjpZ_NQmn-wZA4eYuPDnm2ZBhqbzS9b1jhWcAMYeIm0F744vJqqcymqEQnnHYlDyM39_cfrXtmf9gazwglRPA", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "8zan03XlrmI", + "kty": "RSA", + "alg": "RS256", + "n": "y3E2ffizby9vClbahFgkg8_NcpA6iYTwkA4TH2i2-usyH87nz3uM5LfRa7KIV4ZHOvY-DZr6H1MAqaFCPrciWZnPPyTRxlUlYhfb4n42g0Bwk7Oh7z-KZvIqR45x85NfniR3uB8xu47VdTWCmWJge2glMavdWC8mr5Pc8um3Fr5eMVactUFsp571SrVKuY_u5qJHN3xmn7mLpiLdCIHFlBkvvLgcAcUmXFhn8cCzHCqkrcrRgfjhd5YJmv6wxxINrTMT4_dS4jxE5u1Ezw-m6xSIWukdW21lWupFHNZEK5VvIkiCBl73Sh0vO-gv4XNJcQmPRpqMdHat8GLG7I2PHQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + }, + "RS384": { + "privateJwk": { + "kid": "2N9QAEg-94s", + "kty": "RSA", + "alg": "RS384", + "n": "tqhzPmOds6zvDNX3IHCr7SW5kf6GlnlpW-Rm4aQot1HmtKnsXieV99VjT98EspvcFeKyT5jcJFgZMHb1n_kOtRnhygFHNZQ4ooFmFI2VP5lPUuOIGppWiO5ZxIzECdnwAGoZ7A1hu9Vh5oJJP-m_88JX3sdbHPlsEpzdXHf-THZKAqPYHGNWeNPkmQuON5PaEwiJGRWQ0dbMZtsiMoVCPjh7ZQM-1N2UjXmSAcCCxst5BaTUwQQuVmKIT-cfxP9ShPjP7_DmpRBDOp7_frMKTPkznL0HPNWqSRRewGWB6AcrdY7WtWI5hHNDx9GTdLmolFOvnL4cgtr99u9adq6vAw", + "e": "AQAB", + "d": "akN_oCk2AuS1weLsvYuvCe0rk3re88W4fMRY8iadpWDZdftxTql6_s6-0yWsxvgTxwu2rsYANIioRuC-Lw4m90cSa4Ho2ovbkvby2zwvOuvHETLb6JYnh8wan1VBa3XFwYf4grKaTDtslDzxvmQPzxEeK7YRFL8ql3147qXEZNhka8uIo4n-CdbMG0IazaUJp4oTjt9vId_8PDNqc70qGpCE46bh4Ee76GgF6DfWhnHn2rW5uSatjgQbvA7xJ957GVNlA4k-MC3U-S5DOi_cK6YytVdtNIkBY2EaRhtZQQSw0lRvFXxwenaXZsGAbdS9wOhkFfJYiokkxtbdlAkMgQ", + "p": "4-vsibMRfgglnalDkJpUxEJ1Xj4CNzAUr8FZobhqLdhKn1VPNHWIXudmsBuHT6foRLMTTS7R2kzcPWs_c5y8XeaLbETJKSgWtWDjTuBH0J7gg8_th75EInPfhzA79HKfH145DOfpIwMYAxtsDHNvGUjyBwb0Jz6r-at3oSwQncM", + "q": "zSkGydk2AqlUztzU7c2y2KEV8XKuHD8pxloNQEQf42Q9WS7dyYDjKFAfh75QkwHTHxLzzHR4IF83TlYoSslJ7ODiFVa9c_uYScsS9EpOlEtRgiADtlaAkg5o6iCGRPKEKVh9bWZKDcOIe1P-1E_7nw42WcaiHkWhHoV4FWTCVcE", + "dp": "txxX0NkYeJS7A8t1CLu01mg-OxS-WvA57mn8RL0QMPzQFupG0_KJORXXniy_rPNM28SzARNYbXXKi12agJuvihEqejVZF8OpWtcYR8pQZ_78iWmHf8MQok1NjCLoSB--T0k3tHKtDv_xTq29RNOIslu0dojTpqPnLpLfbZElWFk", + "dq": "d5IVtsa1x89Q8k-aeg6M0dzwoQwplaTqgAQz_OS3gRwG9VdvQ-WufuxTtBWjeEpz9YRiOyMWcCeOYEWurgeq4jgfDDjFqjdUho2oumAkdCGBm8l04GyB-p4TX4EdQEnn5QEB-STIvETd4qMNvkfvasApxSETk3kZcmRvnGhhKwE", + "qi": "U38wGRTDA1-NrZFFX1ipttBYz-IFo9VbniwkH0IzQh_yUOKy4iGVvcxcaQyG4X0gaVWrAVi2gUrwZa0a_BCZyX8SNYh7M8EL-9MwL0qmsEwnD6Jq0tvfxFPBll7NyZM5iTLj9I0gWOt1bdcd_WAM3Bm8xOjU8X8L_mpQ4x7WTWo", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "5ooqXseJdoQ", + "kty": "RSA", + "alg": "RS384", + "n": "tqhzPmOds6zvDNX3IHCr7SW5kf6GlnlpW-Rm4aQot1HmtKnsXieV99VjT98EspvcFeKyT5jcJFgZMHb1n_kOtRnhygFHNZQ4ooFmFI2VP5lPUuOIGppWiO5ZxIzECdnwAGoZ7A1hu9Vh5oJJP-m_88JX3sdbHPlsEpzdXHf-THZKAqPYHGNWeNPkmQuON5PaEwiJGRWQ0dbMZtsiMoVCPjh7ZQM-1N2UjXmSAcCCxst5BaTUwQQuVmKIT-cfxP9ShPjP7_DmpRBDOp7_frMKTPkznL0HPNWqSRRewGWB6AcrdY7WtWI5hHNDx9GTdLmolFOvnL4cgtr99u9adq6vAw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + }, + "RS512": { + "privateJwk": { + "kid": "b3Miw_cVIr0", + "kty": "RSA", + "alg": "RS512", + "n": "3vyjzgsA89bJHD7BZ2MNadjFOPUXpuGKlC7OumOspC_iOSMnJ0Kh7oCWmsBTuzGdfY_gYMaXx28NK-LVjGmaEKZxPhdCz7yzofUCMWoVXNhE4hwBdZt1mNl0abaKNzJ_8BhbtTNhourfBvRwebMYFYO0LfEkApE-hM929pFERb0G3-_ybw8A2cqQFvQ67JhYsBcFUwpf68xZvfYTbdsJzfkkoY0UgI01GU55dZskPBK-_jndzo_bNo8wdENU_cUdOllNdZUoWAemWOGoHKdNshGKy6OwZaC9xqaE_VzF-RaYEcf_jaLD7GbPrz9Xcm9sygnFV3IDlj9-0fjKOkAwqw", + "e": "AQAB", + "d": "vRW0fWK9Uwe-D7JzZA0NccT8MHk8rikwzskGSe19lth314WkjNkm4Uyu6NjP57uB1dhsJwQf7mCP5bf6548gsp_BBSrKX8ee92YAjxBqvwkxGB8xaZ4C0TMMURwWBgpPjLPLCFNiprjNmGMtATXJ5WyCHDcQFxE813fpY9n477xuCieCuXbZOH0NRwviXncs_TriRFErDj3DFNUxhEnlUJBgIwiAaFNIXTOmLUVDgDX7DBL0XlHEJZ-WfIixHOwGX5WTFlDlPpqE1qXyTLc0yNaS-5P3r4q1ZgDJkEtc5M6cv6uYQmtu0lQmnR22HfuutGIhTBKiHNezpBwQYsPwQQ", + "p": "-R8uHmGlVW5RsOZsWU5dcWIrDgLnwNS4pFVScEwEurQR3JyFt90TZzps8tvpBvqJ3WwgTV38TVlxt31FHQzogJUTvoCmu9kvcHo7cDPKgrbwUdeLuwCQJat-ae2Ay1PHdsGo6l0k32nAwSclurJwHOPesEnYKmVz7GrEcQeakks", + "q": "5SS8OQOsADYKG7upakUXPMzWZVlODOF_vqDaCf1cTTg3Sz84bJsOcyuCy3y1lFepkD3jL7lRXqGFeDVyp8fSQ6O6j9GV2K7FsdTQts7S6zLyG4MmfIaTX97f28gGaMA0Vfp4XghkpJrPZp3vAVXi4vHQfcEqLOv3BfWbtT8s3yE", + "dp": "v4tf1HBTxUobeZ7R9CCy7DkEzbMiKjvk9EW-KyXoBP3rNesLTYGoJ5jeqCS6GWmNkzhN5e67zWVWcDTbbSi9pA_7rGAS0yB8v0jcZrsLnFG4mdTXVSNrsesYOa4pdyylkwP4MqsHbNhNIrZM5i3I0g3K7VT55i83YLH-9MFZ8d0", + "dq": "sr_5ZLCMmI2PTRsTiabj_bX8-Yq07C9sq5RnAqv2OPbFi5mBtpcuqoEiwwJB07qet7rPYwc5hoyRxbhL_L5QNBuhCVgBgMq1xYeyWSj2OCvB2dxxRWrlxD_keVqMRWLKcNe21gPOHun1KKPDMlOBbnAcqDzrXaelR6zVDop9woE", + "qi": "cl2oEYi-L2OYO5oyXJK9Kc-Oj2098Tx4o2WbfIZXQeOO48SMz7iRa03FOmh-b0G8WrtGxm7pVWIbryvBVlaLJYEhughgR1vtiSd_nJ5XCxDAF9p8h3hEQrnr8rmO0HTNE3z9PqBmVOCKvgbzOOa9S7YL3LgMMdCrs-CZLNJixio", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "tfz-MRyl3GQ", + "kty": "RSA", + "alg": "RS512", + "n": "3vyjzgsA89bJHD7BZ2MNadjFOPUXpuGKlC7OumOspC_iOSMnJ0Kh7oCWmsBTuzGdfY_gYMaXx28NK-LVjGmaEKZxPhdCz7yzofUCMWoVXNhE4hwBdZt1mNl0abaKNzJ_8BhbtTNhourfBvRwebMYFYO0LfEkApE-hM929pFERb0G3-_ybw8A2cqQFvQ67JhYsBcFUwpf68xZvfYTbdsJzfkkoY0UgI01GU55dZskPBK-_jndzo_bNo8wdENU_cUdOllNdZUoWAemWOGoHKdNshGKy6OwZaC9xqaE_VzF-RaYEcf_jaLD7GbPrz9Xcm9sygnFV3IDlj9-0fjKOkAwqw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + } + }, + "encryption": {} + }, + "userinfo": { + "encryption": {} + }, + "register": { + "signing": { + "RS256": { + "privateJwk": { + "kid": "xaDu9yTDJwA", + "kty": "RSA", + "alg": "RS256", + "n": "0d4up4hx3l_HZa6D2PO-YYSqgNbAWjtlIbnFWIZS-PRzVFgDKcR9bLo_9-MGm0sT0tHbyeqc4V8o5oeYF0uhNmlEuU9Do2VYiyc0fkNeW1nFrC-XJYxbnge4Pxbhl-0Jn04O8IJsP15xq16GfRZxYfjKPeFilQNeDwTb_SBqoveZASHUW998eO1bEg0bjUZs4Yy23S4R23ABZKTQMPMGMETGFVbcFNXUohu0eSYMG4eU9iaFNmh0p0G9lU7ER-UFSatczaEFle0Awazb7-EHN6iya3zL6LDt-ezlIszTzHIXa2Dhhga2SlDIyuhFUOkkEeCP3a-sFeXre-JWiYz8ZQ", + "e": "AQAB", + "d": "MMLZvi0yn8NLNfHdSnwfgNLtNrAu0wg30CU0mAPlpVhOr4sfeQXhSnDfyf2inFROT85YrcpoFukgPKfGi6sT0uuUfyXOhllWwEYkqS2H79uk1QPdr2i0JLyQb4AmfEEj2jKtv-3drr-H05RL1SZww52lh8klOZAlu4Gah26PuDs5Oy4VcgdiiNFIaBAd1WzCmDxW7xd-tMc709s76eWXCa1F4ZJJny3uGCtJGVBUnfrao6d_RJNw4BX7pje5hYcwSFnZN3AiMmzzje4CP6JU7lSpMImwqOtKhIHbFEGSTfnCb4bPbwpQc0IBYaUlTrWCsXDQgYkNdsLaFiVdsvGWgQ", + "p": "7ynGMOB3sQXZ7OoW051wDUdsByiwx1_j7ecpLZ1rSTZ7-TCERMXQq0okQHkVpx6AlU8tOromhMxd_yGFEPOIHC7ZEm4o-f0-DzkDO6RPCCvhli0IaxhaGHHh0r4jAhQf7IlaTkdWt_x1wLxUTgIeS3FUiR_I3SvgeX0oBnTCPuE", + "q": "4KRx-LfdeI_Po7scXMqwbYobUgUdHIwGMKhrnerG_Kfv6b8K7PWNjfrjPYS9MR4OM1_9fs3I9xvr-Dc9oBNFU4AYn5bgTdxiPxLqwPemkKD-R4PswCEFn6bNqec7rDx_a0139SUjGTpLmHJEBk6GxESxc4cmy7B3uH0hpLnEAgU", + "dp": "GerO_XD1x4s4yIG9o4UGJYo93LC-J3zuuFM6lSTgAXkUCjcFvmYpbMaGEy6L-CZIDOYdoqWVkwKKlSFOyD173IH_KA4kBqM43HFzNj1iCyKmOZ37sY9cBBYjQLE2Hf2MUBe6X40_ioSjRhWilSmJmudXH9z_6Wfd1YyIj9qLSkE", + "dq": "V7R8duG6Sx7Cr6cW7LeJ6Ep6Xix28DVPGWI4GgCWzf_3MCiRaHB6YstoOxV_FBUq8C3y97X6V1gEafWPTtcXQwGJG425Z0y64utM0igeVOs2O8-q-FwsKOfj9gi8iINaMBef1Qs5x9i1uQArxNaV0T0MlxFWOUJdi573KqwIdc0", + "qi": "4WRsDyw9pg2iIva4THIhvg0eda_5wu-gorBCQRh5cxtJ4DwMV4GfTL-PUP6u8HRhR8Ns3XLbOk2pAfft9aPTCI9wr_ke1NUyupR1EzGOEekdfHtpgQP06hU7nhSMFbj9OMQvrw4_3k_5BXHQXsp7wqS7QtawQDWbS5BKc6O4nZA", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "FRI7f7sJKUg", + "kty": "RSA", + "alg": "RS256", + "n": "0d4up4hx3l_HZa6D2PO-YYSqgNbAWjtlIbnFWIZS-PRzVFgDKcR9bLo_9-MGm0sT0tHbyeqc4V8o5oeYF0uhNmlEuU9Do2VYiyc0fkNeW1nFrC-XJYxbnge4Pxbhl-0Jn04O8IJsP15xq16GfRZxYfjKPeFilQNeDwTb_SBqoveZASHUW998eO1bEg0bjUZs4Yy23S4R23ABZKTQMPMGMETGFVbcFNXUohu0eSYMG4eU9iaFNmh0p0G9lU7ER-UFSatczaEFle0Awazb7-EHN6iya3zL6LDt-ezlIszTzHIXa2Dhhga2SlDIyuhFUOkkEeCP3a-sFeXre-JWiYz8ZQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + } + } + }, + "jwkSet": "{\"keys\":[{\"kid\":\"QMa5xaKOYwI\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"ol8T6mc7t55kUI3Xf4pHsx8p25VqZ3jm54TQY6xZ07FYzwU8ex02Mg_W_VABRNyVq8wdUBKubo1W8iaKtvtrr0XDOyHUAlwM6xa14332c9akB1AmTirZY4gvyobIY-b18F8LpeIkkLUcypeZmsDd-bGONEJs0sxM6LtLCY41s_lgesPdQwmHLBw4_Rw9NcjBslupWP_pSXUW9x2fj8tKHOoURqmOWL-54t9YbDdIht06uzqagzjPV3UoYtvRsu2QUJx99ExgNvCA9pA1wyiyysyhUdfeKyZpwvTfwWxkrwZrE6zb1AZICFW5R3Bgg0b9UnS96LpFxbSO7rXBRWVKOw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"66gqKTPVHyA\",\"kty\":\"RSA\",\"alg\":\"RS384\",\"n\":\"rWHV18o2T_9zhO-YknvC9brSjWru496-Dw0iVCiJdEZph94aWXeZW4tYsSjYAfzCJXQUrIqfoPTx100KoYRMiUGpVUh5AgwqAitOpFV_Cxa2j4D01qALwUXWblmJTeCzY7zQFOs1-OBU_U3fhsqcHVPHVlfwO4fYhe-FrhQwTDf55JIW5OGM2bViRxpPyZ3t9nueSuz1jEDCSRlaizJq4jhDrkYWoXtXomRfoseGrZVwTGx5cslfrYs-AmLWMfLkZQWjYZMcwOaJCy3dSkTQkmas4dzGwQqrOqNbgznyCo3oTpHboWS36e0jn_lnbq95zPpZkHNsOzw-Mzq0KRj1jw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"zPdTDVkjms4\",\"kty\":\"RSA\",\"alg\":\"RS512\",\"n\":\"tbVEZHw4LP21DFHmF0QjbSektUEGl8t4blGcZM871ieppUVZ_uHKlfan2ftnQ4GwBISkmjwk6KP1nc9iiONzqAhJbFheQMT4RAmYz7xPJP9cAPOiD8YbqzO2xJqBT1OMc2PDS7ICH0-t_kBXMb0IR61CTG-CmO5Tp8ecauUkshvvYg0dA3-os16Dy5ex4if3ZSpfXowmfjRrvYAKEPeFTmA9Q8lMzN0ZyuEb2nILIeMFwTAjo8Ck8D1h4keOVaY0mfTgC9KxkR1kIcAc7DELYX-vjG63AwB-8IIo735g5NMrFj22923jymMDpQDTEMui-jW1TQYNGR84ShNW_nJZGQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"8zan03XlrmI\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"y3E2ffizby9vClbahFgkg8_NcpA6iYTwkA4TH2i2-usyH87nz3uM5LfRa7KIV4ZHOvY-DZr6H1MAqaFCPrciWZnPPyTRxlUlYhfb4n42g0Bwk7Oh7z-KZvIqR45x85NfniR3uB8xu47VdTWCmWJge2glMavdWC8mr5Pc8um3Fr5eMVactUFsp571SrVKuY_u5qJHN3xmn7mLpiLdCIHFlBkvvLgcAcUmXFhn8cCzHCqkrcrRgfjhd5YJmv6wxxINrTMT4_dS4jxE5u1Ezw-m6xSIWukdW21lWupFHNZEK5VvIkiCBl73Sh0vO-gv4XNJcQmPRpqMdHat8GLG7I2PHQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"5ooqXseJdoQ\",\"kty\":\"RSA\",\"alg\":\"RS384\",\"n\":\"tqhzPmOds6zvDNX3IHCr7SW5kf6GlnlpW-Rm4aQot1HmtKnsXieV99VjT98EspvcFeKyT5jcJFgZMHb1n_kOtRnhygFHNZQ4ooFmFI2VP5lPUuOIGppWiO5ZxIzECdnwAGoZ7A1hu9Vh5oJJP-m_88JX3sdbHPlsEpzdXHf-THZKAqPYHGNWeNPkmQuON5PaEwiJGRWQ0dbMZtsiMoVCPjh7ZQM-1N2UjXmSAcCCxst5BaTUwQQuVmKIT-cfxP9ShPjP7_DmpRBDOp7_frMKTPkznL0HPNWqSRRewGWB6AcrdY7WtWI5hHNDx9GTdLmolFOvnL4cgtr99u9adq6vAw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"tfz-MRyl3GQ\",\"kty\":\"RSA\",\"alg\":\"RS512\",\"n\":\"3vyjzgsA89bJHD7BZ2MNadjFOPUXpuGKlC7OumOspC_iOSMnJ0Kh7oCWmsBTuzGdfY_gYMaXx28NK-LVjGmaEKZxPhdCz7yzofUCMWoVXNhE4hwBdZt1mNl0abaKNzJ_8BhbtTNhourfBvRwebMYFYO0LfEkApE-hM929pFERb0G3-_ybw8A2cqQFvQ67JhYsBcFUwpf68xZvfYTbdsJzfkkoY0UgI01GU55dZskPBK-_jndzo_bNo8wdENU_cUdOllNdZUoWAemWOGoHKdNshGKy6OwZaC9xqaE_VzF-RaYEcf_jaLD7GbPrz9Xcm9sygnFV3IDlj9-0fjKOkAwqw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"FRI7f7sJKUg\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"0d4up4hx3l_HZa6D2PO-YYSqgNbAWjtlIbnFWIZS-PRzVFgDKcR9bLo_9-MGm0sT0tHbyeqc4V8o5oeYF0uhNmlEuU9Do2VYiyc0fkNeW1nFrC-XJYxbnge4Pxbhl-0Jn04O8IJsP15xq16GfRZxYfjKPeFilQNeDwTb_SBqoveZASHUW998eO1bEg0bjUZs4Yy23S4R23ABZKTQMPMGMETGFVbcFNXUohu0eSYMG4eU9iaFNmh0p0G9lU7ER-UFSatczaEFle0Awazb7-EHN6iya3zL6LDt-ezlIszTzHIXa2Dhhga2SlDIyuhFUOkkEeCP3a-sFeXre-JWiYz8ZQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true}]}" + } +} \ No newline at end of file diff --git a/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt b/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt new file mode 100644 index 000000000..3dd4d7a1a --- /dev/null +++ b/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt @@ -0,0 +1 @@ +protected contents for alice diff --git a/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl b/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl new file mode 100644 index 000000000..337ba077a --- /dev/null +++ b/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl @@ -0,0 +1,12 @@ +<#Alice> + a ; + + <./private-for-alice.txt>; + + # Alice web id + ; + + + , + , + . diff --git a/test/resources/accounts-strict-origin-off/bob/.acl-override b/test/resources/accounts-strict-origin-off/bob/.acl-override new file mode 100644 index 000000000..13df41ce6 --- /dev/null +++ b/test/resources/accounts-strict-origin-off/bob/.acl-override @@ -0,0 +1,5 @@ +<#Owner> + a ; + <./>; + ; + , , . diff --git a/test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json b/test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json new file mode 100644 index 000000000..d77cc8409 --- /dev/null +++ b/test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json @@ -0,0 +1,411 @@ +{ + "issuer": "https://localhost:7011", + "authorization_endpoint": "https://localhost:7011/authorize", + "token_endpoint": "https://localhost:7011/token", + "userinfo_endpoint": "https://localhost:7011/userinfo", + "jwks_uri": "https://localhost:7011/jwks", + "registration_endpoint": "https://localhost:7011/register", + "response_types_supported": [ + "code", + "code token", + "code id_token", + "id_token", + "id_token token", + "code id_token token", + "none" + ], + "response_modes_supported": [ + "query", + "fragment" + ], + "grant_types_supported": [ + "authorization_code", + "implicit", + "refresh_token", + "client_credentials" + ], + "subject_types_supported": [ + "public" + ], + "id_token_signing_alg_values_supported": [ + "RS256", + "RS384", + "RS512", + "none" + ], + "token_endpoint_auth_methods_supported": [ + "client_secret_basic" + ], + "token_endpoint_auth_signing_alg_values_supported": [ + "RS256" + ], + "display_values_supported": [], + "claim_types_supported": [ + "normal" + ], + "claims_supported": [], + "claims_parameter_supported": false, + "request_parameter_supported": true, + "request_uri_parameter_supported": false, + "require_request_uri_registration": false, + "check_session_iframe": "https://localhost:7011/session", + "end_session_endpoint": "https://localhost:7011/logout", + "keys": { + "descriptor": { + "id_token": { + "signing": { + "RS256": { + "alg": "RS256", + "modulusLength": 2048 + }, + "RS384": { + "alg": "RS384", + "modulusLength": 2048 + }, + "RS512": { + "alg": "RS512", + "modulusLength": 2048 + } + }, + "encryption": {} + }, + "token": { + "signing": { + "RS256": { + "alg": "RS256", + "modulusLength": 2048 + }, + "RS384": { + "alg": "RS384", + "modulusLength": 2048 + }, + "RS512": { + "alg": "RS512", + "modulusLength": 2048 + } + }, + "encryption": {} + }, + "userinfo": { + "encryption": {} + }, + "register": { + "signing": { + "RS256": { + "alg": "RS256", + "modulusLength": 2048 + } + } + } + }, + "jwks": { + "keys": [ + { + "kid": "QXv-I1cn_YU", + "kty": "RSA", + "alg": "RS256", + "n": "siMc_WZIcylWwv6_0mtLKKkH-jDLIsREie9KRannw_BxVvM96CaFlUHywVu1Nkyw_hqCYFXyr91JnQ7YN_fB7OpcBcx6rjbExlD_piewy2X_vXq5_0YN5a3aPb5P6JSmRF-nS257jdteucmEVJeFHzSqXAU2K5Y_2ZXse9hGTg9MJMnzof4jntb19q02E0qBOGeBqDoMXQU0RJB2uncqUzXp7EJeB4UVwvcS107LTYwPX7BAHwyGorpgWc_DYutZq-4DxycQgvIlO3_hGiFjaWhVOHHkO1DGcWTGOM9DcFels7Abf_XkCPIrgeALlOaqUe6dnK-yFCGwBeJhZupP_Q", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "TxrWAv0g4Yk", + "kty": "RSA", + "alg": "RS384", + "n": "7d5w1iTgbqF5L8wLqFxS72vXfhmOCRHxOzoxFuAJKDtgceguvIZKcA8Krlm4qE10_Fjm3v2BhTBqKaMWeMMqM2KPCeOOm_APcOEqHLltmU301ErcEU7XJFH90HFJVlPDMbuPvX1_0mi904J-TNQ_XX1s4d1OBgJbEn-4RfongbIQK2Fv1LRclZ3n1__dVikrnngSZEWazdidEMFDlI5KNJv6jbGdQAfPzLWzq_9Fl-wbmGu4Up6COLeQDdGybmPCv3a0id9-jVlyZRauUc2RtO3mJdQaOUZNOuDFe2WT0xmhPhoLXKEWhlF1udJGzm0beY7s0pwg4QjhGi7T75d3lQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "-tvrpKoUfPU", + "kty": "RSA", + "alg": "RS512", + "n": "sGoD0dZ3-F4NaAKQQrPhSGAbkBvJ0OsA3PQiwAhWXMrdOj0n9o2QDQfICdayIHcRwsisQaOz7B-L-pYcYFgMcdhj-yWOYVUMHXJCTqJeiz4zdGqjlCxkOF9ebauahRk_IoXp_hDyx3hqB98giajTn1gpW9G36Hcau4PutfM_jeyxi4iVeQSm8-p7qLCm-qD7ot0vzCqvsIt9cDvm9o5DVwG-LoAzeyZlEDmuDpFrLsFLz-D9rxLfSSdAethycrDA0Fhe1j7Az15NYUItJIkvyM5AsC6X0xyjO1LJWoJfbl9cbfaJQ0c3XKRc_NuxPYcDuM15gw0FaTkgUOYezuALPQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "DA4MU9NJoDo", + "kty": "RSA", + "alg": "RS256", + "n": "vaugR-F0yLkwgUyJPrIxjUrncPFoGlFyfPWYfVlU4OleYqNnEofoUNI2afIqRQlZgMgfxhknAi6IEhQKdNQGOAqzKoBxEvVK30x4XxMyVPMYYWbTCEEX2K5Kna0wJQ39rsajBWBRusxge_bLydt0dun4ZX4lv_BaCkdKn4TB6x3sQtwPyYrkOj7nykBiLzpcNGYKYbL5B5HGJHbcjXqX6ttvUn7B7E_idcyJbFfcwzrSj87Zdp5aj5LSiIqHtih8Sm2Mch5VQDT_U55UT4n8Rc9K_fJ1bQirXQdZZ9CgU4zcjXx8PnaEpeq18EcXxXsdfCN8o4EBUN7YWog1-65CLw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "re686ijoKyE", + "kty": "RSA", + "alg": "RS384", + "n": "p3SLWJT-PyQn6n-fvj_s5dNqRJQauAZCC8JFnwUUP6n_LUfCG5tpfRLzZ0yXtsaPfN-z9c8JbXIbsF0HJN3NLTaBOWaZ04yjl3S29_8y-KwOMKlOafuRbYy7sXkicvCnjXRIcV85pAewrpwwHBcI2wDPDbkflwI3m6nurThQAQBDxPWz83QnC_iQ_V3pJGoGYItUGH_sJC06mqATV05dVzHSS0VZSFhEoyEtpykZNnhzgZCOACi4V8P07y0jsxQtqdPYYpqt9qg0Tjp81r-tIIDY7LEWv949rbR3Oad-QBcQC0f4CEapT2nbcVcadODtqPv1pQzSL7sSJ42zATGSxQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "jGE5qoPDlnI", + "kty": "RSA", + "alg": "RS512", + "n": "-WuAFX1DLbsMHagMw_NDJA6yxCcIm2SDgbMmDKOwCN4dR0YWdwKzDJ31EeoakDg-T85HaU48R4Kcx1WQUYnly98vDymMFl4Xe6zS9je-Uh3IVfkYJV3pwVKr2gj1hrX7QglIktLg0o0iWulFe1K1NQ5u7Jbe7ZZhOaetlTFH8KUgS78fajfhcFtrXBliqxHTiBz2lMYCj2ntqX8K8ue3_lVLBXm53AJG3T-ymnUd-nxJ-NsdFMSIzQO1-KUona9OgxDpu1cFoQ-YzOteSz2OP58wDl3gL5urIhzK7Hvu3I3okzlL2TyCHmOhLn6HMHr2-mwEgsYYnsEQwzu6bbY8hw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "PhN1R2mze2k", + "kty": "RSA", + "alg": "RS256", + "n": "yGhTYJWPKU-n1gnPQPf1_Nr8HBJ6F-IT6PyxLJoURWrd_DvuW0EFQD1JolKAYWakuJAIWGtb8CXjRdzXrEVYNfshb-bBGYGotISxAD2z_KzEtcBya_TwywAQiMYildsAPRZR7HqvxnUw2iFUwec_gw6aBvu3rPcLnj6z2KKDJDFC1P4LHNDArh4EquhkgtzeD5h6-8cCI1iKpb-Op5nCe1DjUNg49L5NZhNtDlhCEb8P2LEbcV8vldIz9gJu0MSf94zzWu2JGsVtVQ29XPO8SQqrKQ5TKClmR1jIIGCF7t4AUoaaL6AA81F3cyEhKB3vN_D8DzEsr7tuwomLFZXmBw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + ] + }, + "id_token": { + "signing": { + "RS256": { + "privateJwk": { + "kid": "jYjEMK74CQI", + "kty": "RSA", + "alg": "RS256", + "n": "siMc_WZIcylWwv6_0mtLKKkH-jDLIsREie9KRannw_BxVvM96CaFlUHywVu1Nkyw_hqCYFXyr91JnQ7YN_fB7OpcBcx6rjbExlD_piewy2X_vXq5_0YN5a3aPb5P6JSmRF-nS257jdteucmEVJeFHzSqXAU2K5Y_2ZXse9hGTg9MJMnzof4jntb19q02E0qBOGeBqDoMXQU0RJB2uncqUzXp7EJeB4UVwvcS107LTYwPX7BAHwyGorpgWc_DYutZq-4DxycQgvIlO3_hGiFjaWhVOHHkO1DGcWTGOM9DcFels7Abf_XkCPIrgeALlOaqUe6dnK-yFCGwBeJhZupP_Q", + "e": "AQAB", + "d": "EDX50WWZekFsz9n3AuMYt96KB06hbcyGoDbSf3xyxvX-mncQTywSQ_74ZHhACWz5PmaTLskjiLWOmWhcbNtzHmhFb5GoKGp7hcChQzGheSETIN8mRgDOCvTDQ5MqGnRMnTRHOSoYvFQWTrnz_O69ApX8WttujpDhxp9KIgsQetHqnBohh2MWuDZ3aauxR9jdeeoZUGzRpqOgQxqXRNP7V0mHC6KrsClfbeq1jipMEW2EShopmWZdn_k7cnrKL2Aoo_Lox3XQhTnAcNiBj-l9kzls629lCoCarPQCZZaaV64NumhRqORUZ7QlG7csQrRHuxzT54ljbERRGiZfNlZ1UQ", + "p": "5C2Emcxi3hQ4wJOr7Vqr4nvaE0MY1TsBpfomG7h-59VDYFb11zcV4HIG1hfUd6LTwaYqMGmtS1_WFt9S-wuKZyJ1F64p76ywBOgXi6IArsV2uxG24HHO-mPoefeQU8eQtbbPkyJXZcCZJuNFlwPEP9y_NsV0ExDgVZr82U6qcpc", + "q": "x9uYjcsbRF6c2d3Ogb6Jcc3pfm0bocelg1tKfV87urYOFJuT-0ZYN-wPgj9l-IH1sobwhraTTCir0tkrBr77pUTQHO30B3eOScPUDl5p9NMIFpg1agl6tPp7z4jM7rPrnsFh0UjuGt5jHQGpDPQCNDpE5_DukuxCUxm04giNqIs", + "dp": "jRO3kH_WAQjvreGfwzj0XSvGQXKSwAOjmUN4nFsN27j313DsvwvH8uWNZIGHVBDQbEKYgyZThu7SJ4IchCs2f13Gl8WPGCjlC6OUKzkWwvhD2JWzREIZfqaW7hIqoiIZTsCgxo_NCZRzHKAYPq6NgA60CuE6Sy98BHG3M4R3zjE", + "dq": "OK6MLrLK8fIPdC7XMa7zVkZ7EXMqYhC4XW_XyYTn8MVPawLQznQd8wZNQ7htWDSrlU12DA7d6byjNrKG5Gvn_PBuQbYu_qsmvL8Adm7KiDgN1DKo-4Div09HLA31aUG38peQAYY4mYA3BfQBmP3fXiakgk-vqhW9ncntpimc248", + "qi": "raxY35RjgNgbTeIbBzD3Jm0Xz9oCW_HMf8sA3ruvx3erRqhVTeWEn3IpVwYGs_mjxO1IPGzBpGHSTTwObTiDU2Bgv8msniQHcMuld-fye50Rq1K4GBnCsv5frYM2Bw5Z3V5cTsda2zG_QczqV84gu6-vezRcLZyoWFMRXkng6hg", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "QXv-I1cn_YU", + "kty": "RSA", + "alg": "RS256", + "n": "siMc_WZIcylWwv6_0mtLKKkH-jDLIsREie9KRannw_BxVvM96CaFlUHywVu1Nkyw_hqCYFXyr91JnQ7YN_fB7OpcBcx6rjbExlD_piewy2X_vXq5_0YN5a3aPb5P6JSmRF-nS257jdteucmEVJeFHzSqXAU2K5Y_2ZXse9hGTg9MJMnzof4jntb19q02E0qBOGeBqDoMXQU0RJB2uncqUzXp7EJeB4UVwvcS107LTYwPX7BAHwyGorpgWc_DYutZq-4DxycQgvIlO3_hGiFjaWhVOHHkO1DGcWTGOM9DcFels7Abf_XkCPIrgeALlOaqUe6dnK-yFCGwBeJhZupP_Q", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + }, + "RS384": { + "privateJwk": { + "kid": "JXnna97ZRPY", + "kty": "RSA", + "alg": "RS384", + "n": "7d5w1iTgbqF5L8wLqFxS72vXfhmOCRHxOzoxFuAJKDtgceguvIZKcA8Krlm4qE10_Fjm3v2BhTBqKaMWeMMqM2KPCeOOm_APcOEqHLltmU301ErcEU7XJFH90HFJVlPDMbuPvX1_0mi904J-TNQ_XX1s4d1OBgJbEn-4RfongbIQK2Fv1LRclZ3n1__dVikrnngSZEWazdidEMFDlI5KNJv6jbGdQAfPzLWzq_9Fl-wbmGu4Up6COLeQDdGybmPCv3a0id9-jVlyZRauUc2RtO3mJdQaOUZNOuDFe2WT0xmhPhoLXKEWhlF1udJGzm0beY7s0pwg4QjhGi7T75d3lQ", + "e": "AQAB", + "d": "l-OKObOifAIv2A17BC6v5qH-IE9BGxmR6DfoUKsOLdp8Yz_XWBqIPbXdJCe2egG7ycca5RkLM3kO0TeKieJVeCpfG_lqfrhzo6ijs2PUUCgvRb_ndkXZqx-P6yHrqmwiIAecaWtRy5GGZSDWdUiyjYghlrgxsjSe4tkbWdO6ll1aNvByRPiN50iy_oIWpW2hR9zt3gJmgrhJKpimZUi4HErZtS9xoUkp-9lP4cAgTs4YqhfGI6ID1dBVsvua7ouFCZqz8ldB0Tqw2qqvwnpDe6REFLe7dSPv6yzOBrTPdyALyCl391T-teiWXLFRDpONYaoJm8ATIJ_ScEncGgqeAQ", + "p": "-oXU6Sz1EwDLGD7D0ct4SC0zIN7fvmpJSEyL_1NlewO0BfZoMr8-gum4yRttBKbqjzWvfecGWNqXSlhuoTiEfBav76vn9Ah9CTUbWXQhz7-kebT72SB2quzib-0NUzFlHB6kyepUOXZiwbhTuAbY5OF0QcudVwVLs_rJMUVugRE", + "q": "8xHJJ2-MRn_Jys6xnS_ujzvWvyUVksDYUwkzcyaXR9gQSx1r7N9FPiye-r6r-6Z7T9jSiwCDzmQeu9O4oBlmLdDb7PdYweo8K_sbIIS8gdxg3fkqX3VPPGtHcRZUM6OE1euAabfo_a_SDDXo9wU2w7POpVCjYJYUqRWhwS3DzkU", + "dp": "dtN1yme9kpbkvgo_PUpCMhHmV2f_PkURn05XdPKshq2Z_N4ETFWzo8qSECmHCxbU2LqBE7m5o_mCmwvY5XV2OZlVN9wU-AXysKRU5ZgU1YIz1FqIvlMMlkQnnykUEeqy56SNSwxviJXjf7kbVIVC6UUarH6UkYr8flCsj0c8g9E", + "dq": "OcX7csUfqU4MT4kLTFotMJw_cZVF6GivwiTIttDwWiIv1Tq8AUQcOCfw7ZZOWHT8kEDv4hwQOAkyCODM3DjNQYyICW3NCeI7xRRdIUCLca5I09m6SZAfcjPpeiadgtyV4SalkfslhM66dS6HHdd-acueDUr6WiWx6XJ7zOesx6U", + "qi": "vvHbpuUf7IvZqsHBXXKL75yA6pEOzm_klHRoafrku40DHbddXD68MSBzsifTMyEbzNNwj2N6YygWoF7OhXbl2rET2PQrDJUBrdvoaUKdg7MqUPHKASlRt_OUV81Tt5dR-UcIvZ8JnsjR_HTC5FZd5uXvxn8VLztUhKYm1UBbVtQ", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "TxrWAv0g4Yk", + "kty": "RSA", + "alg": "RS384", + "n": "7d5w1iTgbqF5L8wLqFxS72vXfhmOCRHxOzoxFuAJKDtgceguvIZKcA8Krlm4qE10_Fjm3v2BhTBqKaMWeMMqM2KPCeOOm_APcOEqHLltmU301ErcEU7XJFH90HFJVlPDMbuPvX1_0mi904J-TNQ_XX1s4d1OBgJbEn-4RfongbIQK2Fv1LRclZ3n1__dVikrnngSZEWazdidEMFDlI5KNJv6jbGdQAfPzLWzq_9Fl-wbmGu4Up6COLeQDdGybmPCv3a0id9-jVlyZRauUc2RtO3mJdQaOUZNOuDFe2WT0xmhPhoLXKEWhlF1udJGzm0beY7s0pwg4QjhGi7T75d3lQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + }, + "RS512": { + "privateJwk": { + "kid": "iArDjqR9QcE", + "kty": "RSA", + "alg": "RS512", + "n": "sGoD0dZ3-F4NaAKQQrPhSGAbkBvJ0OsA3PQiwAhWXMrdOj0n9o2QDQfICdayIHcRwsisQaOz7B-L-pYcYFgMcdhj-yWOYVUMHXJCTqJeiz4zdGqjlCxkOF9ebauahRk_IoXp_hDyx3hqB98giajTn1gpW9G36Hcau4PutfM_jeyxi4iVeQSm8-p7qLCm-qD7ot0vzCqvsIt9cDvm9o5DVwG-LoAzeyZlEDmuDpFrLsFLz-D9rxLfSSdAethycrDA0Fhe1j7Az15NYUItJIkvyM5AsC6X0xyjO1LJWoJfbl9cbfaJQ0c3XKRc_NuxPYcDuM15gw0FaTkgUOYezuALPQ", + "e": "AQAB", + "d": "Tuh8oOVvcBaRpI5Q_KT9BaSHb6QeV2ZmUm6ZBJA2IPdUkPI959hWMJ3kahIwRrk7poagFhQlLF7H--Qc-TMpDdsejX20-_BQpPMwmX-jDmFaHp58YJCim1x9Hkz9pr8uMED58vydu38u3ip9oVV0oveKOFnMCx0LRgizQ4t0SARyvQRUTcI1_MzVufsSLO_fI_eZFN4xyxEXp-oCajhBxyf7AsYfg1LLPsziZNXU8Ept40E6MrCWII7BmZ9wKsmgr9HpPwGFr55X8EEGPtXgwVRLQ1zyQvQ65mD0vuhRiNvSFZInTrSGouRIwDW-jXM4ThuISPhfnQYDA8HZNVrsQQ", + "p": "4pLFRcSFgT3IjTvKS112P7o84e5VY1mJnnMZh-oPTMTrY5-gdTfbhiYR0c7hLJllclsNPLie3kai53yh7jQbs-CTdv6ZxFzmPwv_NADwm5RMSF5EfVhu0USFyI4h85b4FWbBAh7dI4ajI-I8uS3XDqyy_ENZ6wFenMsRKDHZRik", + "q": "x1OGU2g3yID1bFk54RJvAha2cSTWy2T48IiNHva-req_RDraNDdKZOr1QDEnnAaYxP0oT80ETSbfpC5bmU56ZuRA-aZUwiugWqMU-w_A5Oe8NtEH1X05iE3sOPzjV8wtqomgRdRDmwLHmwygV5cWEOBnoiZ0lke8nI28iY_xdvU", + "dp": "YOzwv3vmsPdBSEn_rGX7JCAD05MlrC6tlL8geOhES08ic6fh-MNAgg7fKKYb5fxpTZZt_z_rlqMZJXZHv6NDBpxX-VvJZBtp1CbJsfGE_MlgKMVK_2RJY_SwVq-XDqHS1zTx9HpHl98NA1jRKVbW3Uw79XbKjKI1W1XzrQJGNKE", + "dq": "cVbEDY84EPGLG9XMfHdv2Z8ylDlfTX4XsyXiIJYrLFdL9K8GPiSmT6XuWFba7_QsT-6nSmEILhqJliCqAw1FulXVwF7c2R_XaVJL7soxY7eFJSJMsw8mdKPiSzE40EaQPOVO1gXxfyXgfAB89_E4IdaH9wKozn7x9478grfvlDU", + "qi": "o6vR6kC1LTU_6D81fEAf9tXSc-01yuvWxIHc_mRcbI-h-H7BRXBgZrj5X7j3ttPe8g3aG13FZ6y8GpNSrs4LgqNc2VGhxlV8FAV_gVnbgGkpnQaUVtecaHgz03mHOH5hBWOmqBCOLqS4De1KcrwZ1bmhinVu24FVY04Tq82Dc2k", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "-tvrpKoUfPU", + "kty": "RSA", + "alg": "RS512", + "n": "sGoD0dZ3-F4NaAKQQrPhSGAbkBvJ0OsA3PQiwAhWXMrdOj0n9o2QDQfICdayIHcRwsisQaOz7B-L-pYcYFgMcdhj-yWOYVUMHXJCTqJeiz4zdGqjlCxkOF9ebauahRk_IoXp_hDyx3hqB98giajTn1gpW9G36Hcau4PutfM_jeyxi4iVeQSm8-p7qLCm-qD7ot0vzCqvsIt9cDvm9o5DVwG-LoAzeyZlEDmuDpFrLsFLz-D9rxLfSSdAethycrDA0Fhe1j7Az15NYUItJIkvyM5AsC6X0xyjO1LJWoJfbl9cbfaJQ0c3XKRc_NuxPYcDuM15gw0FaTkgUOYezuALPQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + } + }, + "encryption": {} + }, + "token": { + "signing": { + "RS256": { + "privateJwk": { + "kid": "mBFgdSiTnAQ", + "kty": "RSA", + "alg": "RS256", + "n": "vaugR-F0yLkwgUyJPrIxjUrncPFoGlFyfPWYfVlU4OleYqNnEofoUNI2afIqRQlZgMgfxhknAi6IEhQKdNQGOAqzKoBxEvVK30x4XxMyVPMYYWbTCEEX2K5Kna0wJQ39rsajBWBRusxge_bLydt0dun4ZX4lv_BaCkdKn4TB6x3sQtwPyYrkOj7nykBiLzpcNGYKYbL5B5HGJHbcjXqX6ttvUn7B7E_idcyJbFfcwzrSj87Zdp5aj5LSiIqHtih8Sm2Mch5VQDT_U55UT4n8Rc9K_fJ1bQirXQdZZ9CgU4zcjXx8PnaEpeq18EcXxXsdfCN8o4EBUN7YWog1-65CLw", + "e": "AQAB", + "d": "A-MDetWc7gwVeWDXIyjFqS6SxZa82mU24maqBE-TVLSTkZPlpdSRJy7XnJ4wzY9efSwcspOLYBkSAsTUXgaGRhm6CDHvn0LVkPPhN5mOG32Lz1srEe07jt4re0W0Sd4ah71cU9zgb-KGS6QIEw_jOBidVX8bSO6k-bbySYiP7MB8I5HM0P_bpD8Xin7pOj6QCrU3BksG0Ql_dHz1B0npvpBzK-UAwkFlBoryL59BQeN65A5f0MjSlBhsVFoXVt-2GMy-SbyY8WJI90YCY6F66LfO9RuaEVkOfL9Efux_UwB03LPKQW4gnmjx8MLMfIz_eGYplVo1Gr2R-5qeufySwQ", + "p": "9lyv_3EC0ihvXZ7Rmv2wXrqmlzb1qGKmx4MGk03IkGijGXdVyCIZke9O5gkGHnrxlFsl8VUy08u-FfW8fe7lpiFhp32QnImOEjRAb1gih_fRN16MWOUFDq14jcuVqS1A3Ce_wsai7QlwdAXx6J2HYvqdFqT1JvCji1N1Z-oefGE", + "q": "xRcsLk-icb1q7xXOhWaSIdUBQ5sxwwC8Y9n5PfSaYuoR4YNxSTp0-WzDQ_h9OigfKJBL6Nzd0_scIys4FKZ3EkxXXMM0ksi3oks2sP8Nws0wRWPRxvQSIWSxD28OH3cpJPc-u-d0p7YagBzlb1PkeZ7CcklO9XQeMGbW401byI8", + "dp": "BCZrkJIGyiOEPL-AKGw9nFrok4OJf9ypkpLSeYjF6CjbFoK8HzLz21F8ssNUJw9LIoSmjvowcQDtotEQ684qcDH_wyKKXRi0G_plW3rQmhnCnHwrQRQakbS6YykazE7G2O6SfGV8OSH_kvTGrnR442H1Y3xD5PQIzUAKqkV3XgE", + "dq": "jqMUoHeVswdJCrsXecgf3khP3-PDgcNYlFM-ZK5PxWJtim4cYMjju1gRgXGm_53l3u9_YInoKPBFDtbKgXdwGVgSqdnEhK6q59PTQwlzphXl53I0ce5V6MD8u5S9_du5dT1Ss57w-Cd8ylcfXRCz-6kARMH1WQKujoz-3AYydNU", + "qi": "Dcb0uVC4XaXFMFV4ansHRGnp4y5zZNuK-5cQQftLfzKVgZw3AYELw6ZYgQfLWZ_tim9TtVDc62wNQJ4KEUTb0TvsScuRhQNigQABfGDx_cfkllGx6JnDmn1x7kpLKbglhZVw0IrBBL9OiklwF4r7LnXVKP-toerHCUgbJyiv6s0", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "DA4MU9NJoDo", + "kty": "RSA", + "alg": "RS256", + "n": "vaugR-F0yLkwgUyJPrIxjUrncPFoGlFyfPWYfVlU4OleYqNnEofoUNI2afIqRQlZgMgfxhknAi6IEhQKdNQGOAqzKoBxEvVK30x4XxMyVPMYYWbTCEEX2K5Kna0wJQ39rsajBWBRusxge_bLydt0dun4ZX4lv_BaCkdKn4TB6x3sQtwPyYrkOj7nykBiLzpcNGYKYbL5B5HGJHbcjXqX6ttvUn7B7E_idcyJbFfcwzrSj87Zdp5aj5LSiIqHtih8Sm2Mch5VQDT_U55UT4n8Rc9K_fJ1bQirXQdZZ9CgU4zcjXx8PnaEpeq18EcXxXsdfCN8o4EBUN7YWog1-65CLw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + }, + "RS384": { + "privateJwk": { + "kid": "DCo68-1L_bA", + "kty": "RSA", + "alg": "RS384", + "n": "p3SLWJT-PyQn6n-fvj_s5dNqRJQauAZCC8JFnwUUP6n_LUfCG5tpfRLzZ0yXtsaPfN-z9c8JbXIbsF0HJN3NLTaBOWaZ04yjl3S29_8y-KwOMKlOafuRbYy7sXkicvCnjXRIcV85pAewrpwwHBcI2wDPDbkflwI3m6nurThQAQBDxPWz83QnC_iQ_V3pJGoGYItUGH_sJC06mqATV05dVzHSS0VZSFhEoyEtpykZNnhzgZCOACi4V8P07y0jsxQtqdPYYpqt9qg0Tjp81r-tIIDY7LEWv949rbR3Oad-QBcQC0f4CEapT2nbcVcadODtqPv1pQzSL7sSJ42zATGSxQ", + "e": "AQAB", + "d": "peGcfDa0GaZeaDze6J74tL6WobK5ORzx5iYfw6RLZ7mmD5vrHF_6wqy4M9c63xOZZpFP-yuJ4kJMTYwKHKofqy84Gb2ammbSU6GJ8ud5_b6rG-dLx08uw__KmsctqgDdahIMBUrYlbYMfxw3yEvFOPV3JtgBBB1tKqXOywdisWmQgk54eBwA_3Mmm-Flt_a2PiibDjivVUAWxbBPd8Ug9y2bPbDiAXoMP6pOAT317LUqBqw7dhie9_aQWKAgOo2dGjBUADnCb51-Nr8syTJRpczYc9ahYlYOlk3miv3aEhXjQ9a7QosRxvqAMPtjVK2OgB0cQ2j46rzbSrZoYcogzQ", + "p": "z-mDM_oSHM4dhR4LAGXgKRdCmTIzBnGBCQ5Szg0yRTxlXPCqF8NrIu7mhkVB61JiGAHqgD5Y9IxPJyWj9uW9qrY21kIwuIEcEi-mTdxp4VgAjP6vaG1XOaS_fdshBfqe43seTzqHJF523vGmkF8HfOAUqhbj9bsTlCCQBBquQiM", + "q": "zi-ToMifbZweWX_HXu0XRMgLZ1vHYWPjgWdddAJD5wCHx_K6lRROhvTCHycV6f9Qrd-0jnauMRNnHJWlCuU0AGQo9CI-mKAnj66LpvMtfyA5i7WK89-ll5EEWXV5NFdXJd9c7d9mmQAXFQssC3mfPcq7EvGjnAMg_eGSFlLF4fc", + "dp": "bmxQEa_0JLZXuVaOc0SoPEqtRV4C-Z4Y8S1ZTzR1CY6dKzJqtDpG0YPejVuFOi1ECgoieMAkUKWgeGMmZT_5bwxdrYf0BloUBZinE91HorYxfLDbinPgCq50Qay7KkjEUH8YRu4HzooZSik_1JeUC3-bmgaURfN434g31OYyvM8", + "dq": "BzueBybiiNrQKb2Uxdy1U0FdPQv4K49wfKqemaI2tZTMLpRyPSaQNqXBZYxedW3ya5cMY28AX1JZ7KPHPWGa-GSLFz1YSsxbduvdlEa1kt8ThbYhoLp4uZ9psqWvUcm6keaLAQE0PSvGo4NX0TM8BdPlyh1V6vQlJSLTmBrhPDM", + "qi": "L5c_XlyLw4tTUWdrM730pvhC2eGCdSwCc6XAwnUla6q3klxJV1eNcRZoejHAN_QXLS742gpA9A_PTMBfYuBN3-lNLOe-wB3bUDJtCzwGlTthiHChkuqB0KAdq4oj8X49ZMA7Fqlr2KaTFTBsItC-ScVSbss9W2DZv8-XzyNoMyc", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "re686ijoKyE", + "kty": "RSA", + "alg": "RS384", + "n": "p3SLWJT-PyQn6n-fvj_s5dNqRJQauAZCC8JFnwUUP6n_LUfCG5tpfRLzZ0yXtsaPfN-z9c8JbXIbsF0HJN3NLTaBOWaZ04yjl3S29_8y-KwOMKlOafuRbYy7sXkicvCnjXRIcV85pAewrpwwHBcI2wDPDbkflwI3m6nurThQAQBDxPWz83QnC_iQ_V3pJGoGYItUGH_sJC06mqATV05dVzHSS0VZSFhEoyEtpykZNnhzgZCOACi4V8P07y0jsxQtqdPYYpqt9qg0Tjp81r-tIIDY7LEWv949rbR3Oad-QBcQC0f4CEapT2nbcVcadODtqPv1pQzSL7sSJ42zATGSxQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + }, + "RS512": { + "privateJwk": { + "kid": "0XGSMsImQPQ", + "kty": "RSA", + "alg": "RS512", + "n": "-WuAFX1DLbsMHagMw_NDJA6yxCcIm2SDgbMmDKOwCN4dR0YWdwKzDJ31EeoakDg-T85HaU48R4Kcx1WQUYnly98vDymMFl4Xe6zS9je-Uh3IVfkYJV3pwVKr2gj1hrX7QglIktLg0o0iWulFe1K1NQ5u7Jbe7ZZhOaetlTFH8KUgS78fajfhcFtrXBliqxHTiBz2lMYCj2ntqX8K8ue3_lVLBXm53AJG3T-ymnUd-nxJ-NsdFMSIzQO1-KUona9OgxDpu1cFoQ-YzOteSz2OP58wDl3gL5urIhzK7Hvu3I3okzlL2TyCHmOhLn6HMHr2-mwEgsYYnsEQwzu6bbY8hw", + "e": "AQAB", + "d": "fO-4TQtd5z5Wp1RScKUd8KXcLh1PVmdW6FUQriwgNZDtIZKeFicoAR3ucHbPr4Y80EUHyFwEHd3zInZdwDpO_XxiWjn5jgq7wJulYOgzUXbRrx8DVVRhjxEWPDVYp43ouf9kdwdizpUbrGZFA60-T8FXFvPL3z8AnJy9eoog-wz-otG58fosrd2Zdpo3O5PlnN2HzueP7G2vabmiZcwR7WEhSaBcI-HcFCXSdZcnAeVzv2DMOoNLNNQXOQ-DtAF_-7lrZa2LKbJccPMEYybwXJlGpRB0JTMYtiLWeZY0EWkWiG2p-lBFsDisEH29JS6yBsG30WWLR55e2XwCqBp1gQ", + "p": "_xiXor89SL9DcybJIEcg_a9nlmnS0DPRfwlRL7fMDF_YKRCVN9x-DD6LlnDss8x9NnUB69dg17QYgLGHI1DbfpV30eOP95zswUfhoyRRgGyxCVbyfB_xwnLTsyCNE3Koi33KjNSMNmDdGKIGBKGzs7Lnbms93Ylr-m9nPizBffc", + "q": "-k3CSpMNknvsVgDxcyl9-U6P2Gm3COcL2NeRzCNR4sG-ffw9xJ_NGIqps9Oddx3Vu5tlEHYiDG3cy-4yOkzxWhphS8E_u8Q1wmBUBaepDjOthoXUcGaSr7-CY7d_FH_ou54WS6rN7diNJODdWATgOSlbPFNhc-he3M8U_bwI0fE", + "dp": "M9zAF2ph_0RDZkngYhuT7X-Xw9DH92RRl05Bnz3y0iE6RT8F11GQntSodHGI7hUI7-Vh-pzTJ4eJ48A0BU4PEfE5Zwao4mKZD8KZcR2VJFL0uz1eFzY3ZJ0LxUM861NISPPOFkuwJe4ThUqLhq2JZ2NcAerzrPKfbU7w4oce34k", + "dq": "mc9OpSTYIjukbvUFag8FKj3shr_vibjwvr85CIhruTv1ItXt3vWTwpDy114iVSAwRqim4ga1xY19MJOeqdS-OvAa-cI2t9tKbbdj6lWsvN1ktFVoxelCGl1EcqI_pQk0qpXqfXToNk_r682CNqRIZNfVCKz0JZWVNXrLG2CAywE", + "qi": "upS-Z2wbbZ_Mla0QpAlORgIr3QLBTK5W0hkhRahoAqm2aGzq269FGSIBnJNxxVkFXL4koHu7diwVCdBHOn3RtnoFYRV1V0sO52Q0B8KI0M8iHM4mVYbk80TsSYBU4lYJqy7U7OnZj1pfnrV4Ky2AAvhTjp2ZbpJCqEPRGJqQlP8", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "jGE5qoPDlnI", + "kty": "RSA", + "alg": "RS512", + "n": "-WuAFX1DLbsMHagMw_NDJA6yxCcIm2SDgbMmDKOwCN4dR0YWdwKzDJ31EeoakDg-T85HaU48R4Kcx1WQUYnly98vDymMFl4Xe6zS9je-Uh3IVfkYJV3pwVKr2gj1hrX7QglIktLg0o0iWulFe1K1NQ5u7Jbe7ZZhOaetlTFH8KUgS78fajfhcFtrXBliqxHTiBz2lMYCj2ntqX8K8ue3_lVLBXm53AJG3T-ymnUd-nxJ-NsdFMSIzQO1-KUona9OgxDpu1cFoQ-YzOteSz2OP58wDl3gL5urIhzK7Hvu3I3okzlL2TyCHmOhLn6HMHr2-mwEgsYYnsEQwzu6bbY8hw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + } + }, + "encryption": {} + }, + "userinfo": { + "encryption": {} + }, + "register": { + "signing": { + "RS256": { + "privateJwk": { + "kid": "RiiZpS0yli8", + "kty": "RSA", + "alg": "RS256", + "n": "yGhTYJWPKU-n1gnPQPf1_Nr8HBJ6F-IT6PyxLJoURWrd_DvuW0EFQD1JolKAYWakuJAIWGtb8CXjRdzXrEVYNfshb-bBGYGotISxAD2z_KzEtcBya_TwywAQiMYildsAPRZR7HqvxnUw2iFUwec_gw6aBvu3rPcLnj6z2KKDJDFC1P4LHNDArh4EquhkgtzeD5h6-8cCI1iKpb-Op5nCe1DjUNg49L5NZhNtDlhCEb8P2LEbcV8vldIz9gJu0MSf94zzWu2JGsVtVQ29XPO8SQqrKQ5TKClmR1jIIGCF7t4AUoaaL6AA81F3cyEhKB3vN_D8DzEsr7tuwomLFZXmBw", + "e": "AQAB", + "d": "AlSEM6lJgtd0Qh7XFBBOAeSh7cmhNcnhJWJaxQP9nFkDv70KpnD5GKgdxQ9kgr1oyOST1ENbTE2EePl6YHxl7CrBVsW-FQfW6FJqpHATOarglqRoMC0m55VWm-CB4nArbopl5XP_uzT9nmuoyqBfsqxmyhH_LrmonuxntusczzzmFY-0vmdE8JHQcnixa70dLd9GO4Bs6vr1SfO5bb8FFEFNm00iTKZqOnqDLx0abgzcqYA_wDBxznFg3RtwdOrVOzKsIUgAaO9C6s5XzGS3ddmggEkPGTm0kQQ9xHJkYOxMNZPNRloqMqVpy1O4JbleCMzPg_-DQ8MJzAWXy5MgkQ", + "p": "_-nK2E0JvckScJUcFH9eN0pJUymgAWMH2_MjE_qJb_lT4jXHLcIfzafqu1QxH2ZbHH1V-Pu2HBwk2YMpS-MQheSSrSNXo4s8Kf4nswspClVVpZnMh8pWWLiHDbib7wMhj8cUlKYTM91J6sAooicGh_8UJtFoSlyTn0sLRSG1iUU", + "q": "yHm3dqNtMfujFwNF9yz5Tb8cDgcDQBxox-y6QGWwogmWP2QOfX76QaBYg32Ve6WUwttixu6KK127BkvGeCReC_QaFILLwPZzI7ybQStRzKNiQg-9oki5lw7iQz66O8U1rQ8jHwSy6mC-Ka3CP1v2j3sZMwmzoWSGBuEwZHfvGNs", + "dp": "MeJ55vYFaxhR3t5CDgDR9ccmSe64QOzz8D0R3mgc-FXKszK2c8X-exE7YW7E8JD8O6523sT6N7qIuFmn6CIH64Gl0dgs0jVm8eyYAn-vbVM7Eb_MLcAUWtEFings9UdP-H3fFibVYWvGZ9szUIB49nOTkwmI4c3v_MIdHUm34F0", + "dq": "lRjZFpYC7yqMJ-BaV7OOEoFwtwoGI9c9IntwJda7YDerE6gxkqouK0K6schjtVr3YVhShUsBXbFPGCahC9dYTqGUB-8i5HcmOMzb1sMGCiD1QdZ9HcXiqXL7WjG7xhosinH4l-ghvGiI5WyCTCb0H8_YdPnhK8YcW9984yvDmgM", + "qi": "UUZvIyomeQkGmtQH41T3vZV_HZSzcZEmdFYPgmjiZMXkOrB3wM1FkqOnoDF51yD8dCuTLSL-Pcq6523NTKtvRLYkum0aZFGMyfPHnK6nGbdsKxjGtHgUuccOUX9XL-WoEsn0F2UGc39JNFQNcScoaIAtgGJ5A5rjfpfvIK7c-Vo", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "PhN1R2mze2k", + "kty": "RSA", + "alg": "RS256", + "n": "yGhTYJWPKU-n1gnPQPf1_Nr8HBJ6F-IT6PyxLJoURWrd_DvuW0EFQD1JolKAYWakuJAIWGtb8CXjRdzXrEVYNfshb-bBGYGotISxAD2z_KzEtcBya_TwywAQiMYildsAPRZR7HqvxnUw2iFUwec_gw6aBvu3rPcLnj6z2KKDJDFC1P4LHNDArh4EquhkgtzeD5h6-8cCI1iKpb-Op5nCe1DjUNg49L5NZhNtDlhCEb8P2LEbcV8vldIz9gJu0MSf94zzWu2JGsVtVQ29XPO8SQqrKQ5TKClmR1jIIGCF7t4AUoaaL6AA81F3cyEhKB3vN_D8DzEsr7tuwomLFZXmBw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + } + } + }, + "jwkSet": "{\"keys\":[{\"kid\":\"QXv-I1cn_YU\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"siMc_WZIcylWwv6_0mtLKKkH-jDLIsREie9KRannw_BxVvM96CaFlUHywVu1Nkyw_hqCYFXyr91JnQ7YN_fB7OpcBcx6rjbExlD_piewy2X_vXq5_0YN5a3aPb5P6JSmRF-nS257jdteucmEVJeFHzSqXAU2K5Y_2ZXse9hGTg9MJMnzof4jntb19q02E0qBOGeBqDoMXQU0RJB2uncqUzXp7EJeB4UVwvcS107LTYwPX7BAHwyGorpgWc_DYutZq-4DxycQgvIlO3_hGiFjaWhVOHHkO1DGcWTGOM9DcFels7Abf_XkCPIrgeALlOaqUe6dnK-yFCGwBeJhZupP_Q\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"TxrWAv0g4Yk\",\"kty\":\"RSA\",\"alg\":\"RS384\",\"n\":\"7d5w1iTgbqF5L8wLqFxS72vXfhmOCRHxOzoxFuAJKDtgceguvIZKcA8Krlm4qE10_Fjm3v2BhTBqKaMWeMMqM2KPCeOOm_APcOEqHLltmU301ErcEU7XJFH90HFJVlPDMbuPvX1_0mi904J-TNQ_XX1s4d1OBgJbEn-4RfongbIQK2Fv1LRclZ3n1__dVikrnngSZEWazdidEMFDlI5KNJv6jbGdQAfPzLWzq_9Fl-wbmGu4Up6COLeQDdGybmPCv3a0id9-jVlyZRauUc2RtO3mJdQaOUZNOuDFe2WT0xmhPhoLXKEWhlF1udJGzm0beY7s0pwg4QjhGi7T75d3lQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"-tvrpKoUfPU\",\"kty\":\"RSA\",\"alg\":\"RS512\",\"n\":\"sGoD0dZ3-F4NaAKQQrPhSGAbkBvJ0OsA3PQiwAhWXMrdOj0n9o2QDQfICdayIHcRwsisQaOz7B-L-pYcYFgMcdhj-yWOYVUMHXJCTqJeiz4zdGqjlCxkOF9ebauahRk_IoXp_hDyx3hqB98giajTn1gpW9G36Hcau4PutfM_jeyxi4iVeQSm8-p7qLCm-qD7ot0vzCqvsIt9cDvm9o5DVwG-LoAzeyZlEDmuDpFrLsFLz-D9rxLfSSdAethycrDA0Fhe1j7Az15NYUItJIkvyM5AsC6X0xyjO1LJWoJfbl9cbfaJQ0c3XKRc_NuxPYcDuM15gw0FaTkgUOYezuALPQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"DA4MU9NJoDo\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"vaugR-F0yLkwgUyJPrIxjUrncPFoGlFyfPWYfVlU4OleYqNnEofoUNI2afIqRQlZgMgfxhknAi6IEhQKdNQGOAqzKoBxEvVK30x4XxMyVPMYYWbTCEEX2K5Kna0wJQ39rsajBWBRusxge_bLydt0dun4ZX4lv_BaCkdKn4TB6x3sQtwPyYrkOj7nykBiLzpcNGYKYbL5B5HGJHbcjXqX6ttvUn7B7E_idcyJbFfcwzrSj87Zdp5aj5LSiIqHtih8Sm2Mch5VQDT_U55UT4n8Rc9K_fJ1bQirXQdZZ9CgU4zcjXx8PnaEpeq18EcXxXsdfCN8o4EBUN7YWog1-65CLw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"re686ijoKyE\",\"kty\":\"RSA\",\"alg\":\"RS384\",\"n\":\"p3SLWJT-PyQn6n-fvj_s5dNqRJQauAZCC8JFnwUUP6n_LUfCG5tpfRLzZ0yXtsaPfN-z9c8JbXIbsF0HJN3NLTaBOWaZ04yjl3S29_8y-KwOMKlOafuRbYy7sXkicvCnjXRIcV85pAewrpwwHBcI2wDPDbkflwI3m6nurThQAQBDxPWz83QnC_iQ_V3pJGoGYItUGH_sJC06mqATV05dVzHSS0VZSFhEoyEtpykZNnhzgZCOACi4V8P07y0jsxQtqdPYYpqt9qg0Tjp81r-tIIDY7LEWv949rbR3Oad-QBcQC0f4CEapT2nbcVcadODtqPv1pQzSL7sSJ42zATGSxQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"jGE5qoPDlnI\",\"kty\":\"RSA\",\"alg\":\"RS512\",\"n\":\"-WuAFX1DLbsMHagMw_NDJA6yxCcIm2SDgbMmDKOwCN4dR0YWdwKzDJ31EeoakDg-T85HaU48R4Kcx1WQUYnly98vDymMFl4Xe6zS9je-Uh3IVfkYJV3pwVKr2gj1hrX7QglIktLg0o0iWulFe1K1NQ5u7Jbe7ZZhOaetlTFH8KUgS78fajfhcFtrXBliqxHTiBz2lMYCj2ntqX8K8ue3_lVLBXm53AJG3T-ymnUd-nxJ-NsdFMSIzQO1-KUona9OgxDpu1cFoQ-YzOteSz2OP58wDl3gL5urIhzK7Hvu3I3okzlL2TyCHmOhLn6HMHr2-mwEgsYYnsEQwzu6bbY8hw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"PhN1R2mze2k\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"yGhTYJWPKU-n1gnPQPf1_Nr8HBJ6F-IT6PyxLJoURWrd_DvuW0EFQD1JolKAYWakuJAIWGtb8CXjRdzXrEVYNfshb-bBGYGotISxAD2z_KzEtcBya_TwywAQiMYildsAPRZR7HqvxnUw2iFUwec_gw6aBvu3rPcLnj6z2KKDJDFC1P4LHNDArh4EquhkgtzeD5h6-8cCI1iKpb-Op5nCe1DjUNg49L5NZhNtDlhCEb8P2LEbcV8vldIz9gJu0MSf94zzWu2JGsVtVQ29XPO8SQqrKQ5TKClmR1jIIGCF7t4AUoaaL6AA81F3cyEhKB3vN_D8DzEsr7tuwomLFZXmBw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true}]}" + } +} \ No newline at end of file diff --git a/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt b/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt new file mode 100644 index 000000000..304c0b4f3 --- /dev/null +++ b/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt @@ -0,0 +1 @@ +protected contents diff --git a/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl b/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl new file mode 100644 index 000000000..acdaa2eac --- /dev/null +++ b/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl @@ -0,0 +1,15 @@ +<#Alice> + a ; + + <./shared-with-alice.txt>; + + # Alice web id + ; + + # Bob web id + ; + + + , + , + . diff --git a/test/unit/solid-host-test.js b/test/unit/solid-host-test.js index be7821bbc..21bc505e7 100644 --- a/test/unit/solid-host-test.js +++ b/test/unit/solid-host-test.js @@ -58,10 +58,6 @@ describe('SolidHost', () => { expect(host.allowsSessionFor('https://user.own/profile/card#me', '', [])).to.be.true }) - it('should allow a userId with the user subdomain as origin', () => { - expect(host.allowsSessionFor('https://user.own/profile/card#me', 'https://user.own', [])).to.be.true - }) - it('should allow a userId with the server domain as origin', () => { expect(host.allowsSessionFor('https://user.own/profile/card#me', 'https://test.local', [])).to.be.true }) From c8a23a94d3717be684f4804ca604e44dc74e7e39 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Sat, 2 Mar 2019 21:46:04 +0100 Subject: [PATCH 15/60] Fixed some faulty tests --- test/integration/authentication-oidc-test.js | 4 ++-- ...authentication-oidc-with-strict-origins-turned-off-test.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/integration/authentication-oidc-test.js b/test/integration/authentication-oidc-test.js index ad4476d1e..e0a3a528e 100644 --- a/test/integration/authentication-oidc-test.js +++ b/test/integration/authentication-oidc-test.js @@ -217,7 +217,7 @@ describe('Authentication API (OIDC)', () => { }) describe('and our origin', () => { before(done => { - alice.get('/') + alice.get('/private-for-alice.txt') .set('Cookie', cookie) .set('Origin', aliceServerUri) .end((err, res) => { @@ -276,7 +276,7 @@ describe('Authentication API (OIDC)', () => { }) describe('and our origin', () => { before(done => { - alice.get('/') + alice.get('/private-for-alice.txt') .set('Cookie', malcookie) .set('Origin', aliceServerUri) .end((err, res) => { diff --git a/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js b/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js index 1fd2bad42..5e0f1bde4 100644 --- a/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js +++ b/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js @@ -213,7 +213,7 @@ describe('Authentication API (OIDC) - With strict origins turned off', () => { }) describe('and our origin', () => { before(done => { - alice.get('/') + alice.get('/private-for-alice.txt') .set('Cookie', cookie) .set('Origin', aliceServerUri) .end((err, res) => { @@ -272,7 +272,7 @@ describe('Authentication API (OIDC) - With strict origins turned off', () => { }) describe('and our origin', () => { before(done => { - alice.get('/') + alice.get('/private-for-alice.txt') .set('Cookie', malcookie) .set('Origin', aliceServerUri) .end((err, res) => { From 01853afed5a0d1a0c2463ae1c54e8f5217973757 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Sat, 2 Mar 2019 21:54:51 +0100 Subject: [PATCH 16/60] Added RubenVerborgh explanation My previous explanation was wrong --- lib/create-app.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/create-app.js b/lib/create-app.js index 9a4338930..c510ad625 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -213,8 +213,18 @@ function initWebId (argv, app, ldp) { // TODO: remove this exception when OIDC clients // use Bearer token to authenticate instead of cookie // (https://github.com/solid/node-solid-server/pull/835#issuecomment-426429003) - // We only want to do this check if strictOrigin is set to false, since we trust WebACL to handle origins otherwise - // If we don't allow authentication with cookies we can't handle ACLs properly wrt trusted origins + // + // Authentication cookies are an optimization: + // instead of going through the process of + // fully validating authentication on every request, + // we go through this process once, + // and store its successful result in a cookie + // that will be reused upon the next request. + // However, that cookie can then be sent by any server, + // even servers that have not gone through the proper authentication mechanism. + // However, if trusted origins are enabled, + // then any origin is allowed to take the shortcut route, + // since malicious origins will be banned at the ACL checking phase. // https://github.com/solid/node-solid-server/issues/1117 if (!argv.strictOrigin && !argv.host.allowsSessionFor(userId, origin, trustedOrigins) && !isLogoutRequest(req)) { debug.authentication(`Rejecting session for ${userId} from ${origin}`) From f5d2816fb34d9e2c70448cf14d16a59c07314d9b Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Sat, 2 Mar 2019 22:03:52 +0100 Subject: [PATCH 17/60] Revert "Lock file during patching." This reverts commit 90dcfe6f3c0fad17137827962d43baa166d4f25b. --- lib/handlers/patch.js | 18 +++++++--------- package-lock.json | 48 ++++--------------------------------------- 2 files changed, 11 insertions(+), 55 deletions(-) diff --git a/lib/handlers/patch.js b/lib/handlers/patch.js index 18f5823b8..3502af90d 100644 --- a/lib/handlers/patch.js +++ b/lib/handlers/patch.js @@ -10,7 +10,6 @@ const $rdf = require('rdflib') const crypto = require('crypto') const overQuota = require('../utils').overQuota const getContentType = require('../utils').getContentType -const { lock } = require('proper-lockfile') // Patch parsers by request body content type const PATCH_PARSERS = { @@ -24,7 +23,6 @@ const DEFAULT_FOR_NEW_CONTENT_TYPE = 'text/turtle' async function patchHandler (req, res, next) { debug(`PATCH -- ${req.originalUrl}`) res.header('MS-Author-Via', 'SPARQL') - let releaseLock try { // Obtain details of the target resource const ldp = req.app.locals.ldp @@ -52,13 +50,15 @@ async function patchHandler (req, res, next) { throw error(415, `Unsupported patch content type: ${patch.contentType}`) } - // Parse the patch document and verify permissions - const patchObject = await parsePatch(url, patch.uri, patch.text) - await checkPermission(req, patchObject) + // Parse the target graph and the patch document, + // and verify permission for performing this specific patch + const [graph, patchObject] = await Promise.all([ + readGraph(resource), + parsePatch(url, patch.uri, patch.text) + .then(patchObject => checkPermission(req, patchObject)) + ]) // Patch the graph and write it back to the file - releaseLock = await lock(path, { retries: 10, realpath: false }) - const graph = await readGraph(resource) await applyPatch(patchObject, graph, url) const result = await writeGraph(graph, resource, ldp.resourceMapper.rootPath, ldp.serverUri) @@ -66,10 +66,6 @@ async function patchHandler (req, res, next) { res.send(result) } catch (err) { return next(err) - } finally { - if (releaseLock) { - await releaseLock() - } } return next() } diff --git a/package-lock.json b/package-lock.json index 7fc73f216..d5e1cbc8b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3530,20 +3530,7 @@ "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, "requires": { - "cross-spawn": "^4", "signal-exit": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - } } }, "forever-agent": { @@ -4558,19 +4545,7 @@ "dev": true, "requires": { "istanbul-lib-coverage": "^2.0.1", - "make-dir": "^1.3.0", - "supports-color": "^5.4.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "make-dir": "^1.3.0" } }, "istanbul-lib-source-maps": { @@ -4579,28 +4554,10 @@ "integrity": "sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==", "dev": true, "requires": { - "debug": "^3.1.0", "istanbul-lib-coverage": "^2.0.1", "make-dir": "^1.3.0", "rimraf": "^2.6.2", "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } } }, "istanbul-reports": { @@ -5640,6 +5597,8 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" }, "dependencies": { @@ -5755,6 +5714,7 @@ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "requires": { "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", "yargs": "~3.10.0" }, "dependencies": { From 017ca05f392b9b76b8c1241bfdebe9f8e050c342 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Sat, 2 Mar 2019 22:04:40 +0100 Subject: [PATCH 18/60] Did a faulty rebase, trying to revert commits --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index fceca89b6..8e4e7ba4b 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,6 @@ "nodemailer": "^3.1.4", "oidc-op-express": "^0.0.3", "owasp-password-strength-test": "^1.3.0", - "proper-lockfile": "^3.2.0", "rdflib": "^0.17.1", "recursive-readdir": "^2.1.0", "rimraf": "^2.5.0", From 7c0d436618a3731089fefe4acc677a2594d36589 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Sat, 2 Mar 2019 22:04:44 +0100 Subject: [PATCH 19/60] Revert "Add proper-lockfile dependency." This reverts commit 01d2a35d5ed024f5a6ac5afc54bdb52b7df00e2a. --- package-lock.json | 1699 +++++++++++++++++++++++++++++---------------- 1 file changed, 1108 insertions(+), 591 deletions(-) diff --git a/package-lock.json b/package-lock.json index d5e1cbc8b..fe37c825a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -495,15 +495,6 @@ "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", "dev": true }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -559,12 +550,6 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -1619,7 +1604,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -1643,7 +1628,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { "buffer-xor": "^1.0.3", @@ -1734,12 +1719,6 @@ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -1780,18 +1759,6 @@ "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==" }, - "caching-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-2.0.0.tgz", - "integrity": "sha512-tTfemGmFWe7KZ3KN6VsSgQZbd9Bgo7A40wlp4PTsJJvFu4YAnEC5YnfdiKq6Vh2i9XJLnA9n8OXD46orVpnPMw==", - "dev": true, - "requires": { - "make-dir": "^1.0.0", - "md5-hex": "^2.0.0", - "package-hash": "^2.0.0", - "write-file-atomic": "^2.0.0" - } - }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -2057,12 +2024,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", @@ -2091,7 +2052,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -2233,7 +2194,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { "cipher-base": "^1.0.1", @@ -2245,7 +2206,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { "cipher-base": "^1.0.3", @@ -2375,7 +2336,8 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true }, "decode-uri-component": { "version": "0.2.0", @@ -2411,15 +2373,6 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -2542,7 +2495,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -2564,7 +2517,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { "bn.js": "^4.1.0", @@ -2672,7 +2625,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -2751,15 +2704,6 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, "es5-ext": { "version": "0.10.46", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", @@ -2771,12 +2715,6 @@ "next-tick": "1" } }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, "es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", @@ -3095,34 +3033,6 @@ "safe-buffer": "^5.1.1" } }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, "exit-hook": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", @@ -3441,32 +3351,12 @@ "path-exists": "^3.0.0" } }, - "find-cache-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", - "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" - } - }, "find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", "dev": true }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, "flat-cache": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", @@ -3524,15 +3414,6 @@ "for-in": "^1.0.1" } }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "signal-exit": "^3.0.0" - } - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -3597,7 +3478,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -3676,12 +3557,6 @@ "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, "get-folder-size": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.0.tgz", @@ -3703,12 +3578,6 @@ "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", "dev": true }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, "get-uri": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.2.tgz", @@ -3731,7 +3600,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -3871,7 +3740,8 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "has-symbols": { "version": "1.0.0", @@ -4014,7 +3884,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { "depd": "~1.1.2", @@ -4277,26 +4147,11 @@ } } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -4405,7 +4260,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -4463,7 +4318,8 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isobject": { "version": "3.0.1", @@ -4514,15 +4370,6 @@ "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", "dev": true }, - "istanbul-lib-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz", - "integrity": "sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, "istanbul-lib-instrument": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz", @@ -4538,37 +4385,6 @@ "semver": "^5.5.0" } }, - "istanbul-lib-report": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz", - "integrity": "sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.1", - "make-dir": "^1.3.0" - } - }, - "istanbul-lib-source-maps": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz", - "integrity": "sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.1", - "make-dir": "^1.3.0", - "rimraf": "^2.6.2", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.0.1.tgz", - "integrity": "sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==", - "dev": true, - "requires": { - "handlebars": "^4.0.11" - } - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -4602,12 +4418,6 @@ "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -4633,7 +4443,7 @@ }, "json5": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, "jsonfile": { @@ -4817,34 +4627,12 @@ "immediate": "~3.0.5" } }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, "localstorage-memory": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/localstorage-memory/-/localstorage-memory-1.0.3.tgz", "integrity": "sha512-t9P8WB6DcVttbw/W4PIE8HOqum8Qlvx5SjR6oInwR9Uia0EEmyUeBh7S+weKByW+l/f45Bj4L/dgZikGFDM6ng==", "dev": true }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", @@ -4880,12 +4668,6 @@ "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", "dev": true }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -4926,6 +4708,7 @@ "version": "4.1.4", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.4.tgz", "integrity": "sha512-EPstzZ23znHUVLKj+lcXO1KvZkrlw+ZirdwvOmnAnA/1PB4ggyXJ77LRkCqkff+ShQ+cqoxCxLQOh4cKITO5iA==", + "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^3.0.2" @@ -4982,21 +4765,6 @@ } } }, - "md5-hex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", - "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", - "dev": true, - "requires": { - "md5-o-matic": "^0.1.1" - } - }, - "md5-o-matic": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", - "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", - "dev": true - }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -5025,29 +4793,11 @@ "solid-ui": ">=0.11.3" } }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - } - }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -5202,7 +4952,7 @@ "dependencies": { "commander": { "version": "2.15.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, @@ -5269,7 +5019,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -5500,18 +5250,6 @@ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-3.1.8.tgz", "integrity": "sha1-/r+sy0vSc2eEc6MJxstLSi88SOM=" }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, "npm-conf": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", @@ -5521,15 +5259,6 @@ "pify": "^3.0.0" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -5576,26 +5305,114 @@ "yargs-parser": "^9.0.2" }, "dependencies": { + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caching-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-2.0.0.tgz", + "integrity": "sha512-tTfemGmFWe7KZ3KN6VsSgQZbd9Bgo7A40wlp4PTsJJvFu4YAnEC5YnfdiKq6Vh2i9XJLnA9n8OXD46orVpnPMw==", + "dev": true, + "requires": { + "make-dir": "^1.0.0", + "md5-hex": "^2.0.0", + "package-hash": "^2.0.0", + "write-file-atomic": "^2.0.0" + } }, "camelcase": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, "requires": { "center-align": "^0.1.1", "right-align": "^0.1.1", @@ -5605,10 +5422,30 @@ "wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true } } }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, "convert-source-map": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", @@ -5622,6 +5459,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, "requires": { "lru-cache": "^4.0.1", "which": "^1.2.9" @@ -5631,87 +5469,856 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, "requires": { "ms": "2.0.0" } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "debug-log": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", "dev": true }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, "requires": { - "is-buffer": "^1.1.5" + "strip-bom": "^3.0.0" } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "is-arrayish": "^0.2.1" } }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "find-cache-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "dev": true, + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz", + "integrity": "sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-report": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz", + "integrity": "sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.1", + "make-dir": "^1.3.0", + "supports-color": "^5.4.0" + } + }, + "istanbul-lib-source-maps": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz", + "integrity": "sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^2.0.1", + "make-dir": "^1.3.0", + "rimraf": "^2.6.2", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.0.1.tgz", + "integrity": "sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==", + "dev": true, + "requires": { + "handlebars": "^4.0.11" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "md5-hex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", + "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=", + "dev": true, + "requires": { + "md5-o-matic": "^0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", + "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "package-hash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", + "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "lodash.flattendeep": "^4.4.0", + "md5-hex": "^2.0.0", + "release-zalgo": "^1.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + }, + "spawn-wrap": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", + "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", + "dev": true, + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, "requires": { "has-flag": "^3.0.0" } }, + "test-exclude": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.0.0.tgz", + "integrity": "sha512-bO3Lj5+qFa9YLfYW2ZcXMOV1pmQvw+KS/DpjqhyX6Y6UZ8zstpZJ+mA2ERkXfpOqhxsJlQiLeVXD3Smsrs6oLw==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^1.0.1" + } + }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, "requires": { "source-map": "~0.5.1", "uglify-to-browserify": "~1.0.0", @@ -5722,6 +6329,8 @@ "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, "requires": { "camelcase": "^1.0.2", "cliui": "^2.1.0", @@ -5731,15 +6340,132 @@ } } }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true }, "yargs": { "version": "11.1.0", @@ -5816,6 +6542,23 @@ "dev": true } } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } } } }, @@ -5982,7 +6725,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -6014,36 +6757,6 @@ "resolved": "https://registry.npmjs.org/owasp-password-strength-test/-/owasp-password-strength-test-1.3.0.tgz", "integrity": "sha1-T2KeQpA+j20nmyMNZXq2HljkSxI=" }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, "pac-proxy-agent": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", @@ -6090,18 +6803,6 @@ "thunkify": "^2.1.2" } }, - "package-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", - "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "lodash.flattendeep": "^4.4.0", - "md5-hex": "^2.0.0", - "release-zalgo": "^1.0.0" - } - }, "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", @@ -6129,7 +6830,7 @@ }, "parse-asn1": { "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "requires": { "asn1.js": "^4.0.0", @@ -6139,16 +6840,6 @@ "pbkdf2": "^3.0.3" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, "parse5": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", @@ -6219,15 +6910,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, "pathval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", @@ -6306,15 +6988,6 @@ "xtend": "^4.0.1" } }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, "pkginfo": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", @@ -6372,16 +7045,6 @@ "integrity": "sha1-AMLa7t2iDofjeCs0Stuhzd1q1wk=", "dev": true }, - "proper-lockfile": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-3.2.0.tgz", - "integrity": "sha512-iMghHHXv2bsxl6NchhEaFck8tvX3F9cknEEh1SUpguUOBjN7PAAW9BLzmbc1g/mCD1gY3EE2EABBHPJfFdHFmA==", - "requires": { - "graceful-fs": "^4.1.11", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -6398,7 +7061,7 @@ }, "proxy-agent": { "version": "2.3.1", - "resolved": "http://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", "integrity": "sha512-CNKuhC1jVtm8KJYFTS2ZRO71VCBx3QSA92So/e6NrY6GoJonkx3Irnk4047EsCcswczwqAekRj3s8qLRGahSKg==", "dev": true, "requires": { @@ -6438,7 +7101,8 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true }, "psl": { "version": "1.1.29", @@ -6570,7 +7234,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -6592,27 +7256,6 @@ } } }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, "readable-stream": { "version": "1.1.14", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", @@ -6712,15 +7355,6 @@ "jsesc": "~0.5.0" } }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -6765,18 +7399,6 @@ } } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", @@ -6825,11 +7447,6 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" - }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", @@ -6959,12 +7576,6 @@ "send": "0.16.2" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", @@ -6993,7 +7604,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { "inherits": "^2.0.1", @@ -7072,7 +7683,8 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true }, "simple-concat": { "version": "1.0.0", @@ -7278,7 +7890,7 @@ "dependencies": { "ansi-escapes": { "version": "3.1.0", - "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, @@ -7328,7 +7940,7 @@ }, "external-editor": { "version": "2.2.0", - "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { @@ -7970,52 +8582,6 @@ "os-shim": "^0.1.2" } }, - "spawn-wrap": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", - "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -8136,7 +8702,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8174,7 +8740,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8215,7 +8781,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8253,7 +8819,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8309,12 +8875,6 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-json-comments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", @@ -8377,7 +8937,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -8506,18 +9066,6 @@ "uuid": "^3.0.1" } }, - "test-exclude": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.0.0.tgz", - "integrity": "sha512-bO3Lj5+qFa9YLfYW2ZcXMOV1pmQvw+KS/DpjqhyX6Y6UZ8zstpZJ+mA2ERkXfpOqhxsJlQiLeVXD3Smsrs6oLw==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^1.0.1" - } - }, "text-encoder-lite": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/text-encoder-lite/-/text-encoder-lite-1.0.1.tgz", @@ -8569,7 +9117,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -9012,16 +9560,6 @@ "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=" }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "validator": { "version": "10.9.0", "resolved": "https://registry.npmjs.org/validator/-/validator-10.9.0.tgz", @@ -9108,16 +9646,11 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "requires": { "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "win-release": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", @@ -9140,7 +9673,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { @@ -9234,7 +9767,8 @@ "yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true }, "yargs": { "version": "3.32.0", @@ -9250,23 +9784,6 @@ "window-size": "^0.1.4", "y18n": "^3.2.0" } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } } } } From 06c5b192d06dda8653e0840bd81862c862f06695 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Sun, 3 Mar 2019 01:50:34 +0100 Subject: [PATCH 20/60] Trying to make tests less dependent on order --- test/integration/acl-oidc-test.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/test/integration/acl-oidc-test.js b/test/integration/acl-oidc-test.js index 80fa600e4..4c723141f 100644 --- a/test/integration/acl-oidc-test.js +++ b/test/integration/acl-oidc-test.js @@ -251,11 +251,11 @@ describe('ACL with WebID+OIDC over HTTP', function () { }) describe('Origin', function () { - before(function () { + let _error, _response + + before(function (done) { rm('/accounts-acl/tim.localhost/origin/test-folder/.acl') - }) - it('should PUT new ACL file', function (done) { var options = createOptions('/origin/test-folder/.acl', 'user1', 'text/turtle') options.body = '<#Owner> a ;\n' + ' ;\n' + @@ -274,13 +274,15 @@ describe('ACL with WebID+OIDC over HTTP', function () { ' <' + origin1 + '>;\n' + ' .\n' request.put(options, function (error, response, body) { - assert.equal(error, null) - assert.equal(response.statusCode, 201) + _error = error + _response = response done() - // TODO triple header - // TODO user header }) }) + + it('should be no error', () => assert.equal(_error, null)) + it('should return 200', () => assert.equal(_response.statusCode, 201)) + it('user1 should be able to access test directory', function (done) { var options = createOptions('/origin/test-folder/', 'user1') options.headers.origin = origin1 From 1998a5b6989e2a7c5357af0e9344036ac6681d09 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Sun, 3 Mar 2019 02:06:51 +0100 Subject: [PATCH 21/60] Removing the need to run tests in order --- test/integration/acl-tls-test.js | 38 +++++++++++++++----------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/test/integration/acl-tls-test.js b/test/integration/acl-tls-test.js index c2103f669..fc418a682 100644 --- a/test/integration/acl-tls-test.js +++ b/test/integration/acl-tls-test.js @@ -231,7 +231,7 @@ describe('ACL with WebID+TLS', function () { done() }) }) - it("should create test file's acl file", function (done) { + it('should create test file\'s acl file', function (done) { var options = createOptions('/acl-tls/write-acl/test-file.acl', 'user1') options.headers = { 'content-type': 'text/turtle' @@ -243,7 +243,7 @@ describe('ACL with WebID+TLS', function () { done() }) }) - it("should not access test file's acl file", function (done) { + it('should not access test file\'s acl file', function (done) { var options = createOptions('/acl-tls/write-acl/test-file.acl', 'user1') options.headers = { accept: 'text/turtle' @@ -267,12 +267,10 @@ describe('ACL with WebID+TLS', function () { }) describe('Origin', function () { - before(function () { + before(function (done) { rm('acl-tls/origin/test-folder/.acl') - }) - it('should PUT new ACL file', function (done) { - var options = createOptions('/acl-tls/origin/test-folder/.acl', 'user1', 'text/turtle') + const options = createOptions('/acl-tls/origin/test-folder/.acl', 'user1', 'text/turtle') options.headers = { 'content-type': 'text/turtle' } @@ -294,6 +292,7 @@ describe('ACL with WebID+TLS', function () { // TODO user header }) }) + it('user1 should be able to access test directory', function (done) { var options = createOptions('/acl-tls/origin/test-folder/', 'user1') options.headers.origin = origin1 @@ -365,11 +364,9 @@ describe('ACL with WebID+TLS', function () { }) describe('Mixed statement Origin', function () { - before(function () { + before(function (done) { rm('acl-tls/origin/test-folder/.acl') - }) - it('should PUT new ACL file', function (done) { var options = createOptions('/acl-tls/origin/test-folder/.acl', 'user1', 'text/turtle') options.headers = { 'content-type': 'text/turtle' @@ -379,9 +376,9 @@ describe('ACL with WebID+TLS', function () { ' <' + user1 + '>;\n' + ' , , .\n' + '<#Owner2> a ;\n' + - ' ;\n' + - ' <' + origin1 + '>;\n' + - ' , , .\n' + + ' ;\n' + + ' <' + origin1 + '>;\n' + + ' , , .\n' + '<#Public> a ;\n' + ' <./>;\n' + ' ;\n' + @@ -395,6 +392,7 @@ describe('ACL with WebID+TLS', function () { // TODO user header }) }) + it('user1 should be able to access test directory', function (done) { var options = createOptions('/acl-tls/origin/test-folder/', 'user1') options.headers.origin = origin1 @@ -582,7 +580,7 @@ describe('ACL with WebID+TLS', function () { describe('Append-only', function () { // var body = fs.readFileSync(__dirname + '/resources/acl-tls/append-acl/abc.ttl.acl') - it("user1 should be able to access test file's ACL file", function (done) { + it('user1 should be able to access test file\'s ACL file', function (done) { var options = createOptions('/acl-tls/append-acl/abc.ttl.acl', 'user1') request.head(options, function (error, response) { assert.equal(error, null) @@ -623,7 +621,7 @@ describe('ACL with WebID+TLS', function () { done() }) }) - it("user2 should not be able to access test file's ACL file", function (done) { + it('user2 should not be able to access test file\'s ACL file', function (done) { var options = createOptions('/acl-tls/append-acl/abc.ttl.acl', 'user2') request.head(options, function (error, response, body) { assert.equal(error, null) @@ -685,7 +683,7 @@ describe('ACL with WebID+TLS', function () { ' <./abc2.ttl>;\n' + ' <' + user2 + '>;\n' + ' , .\n' - it("user1 should be able to modify test file's ACL file", function (done) { + it('user1 should be able to modify test file\'s ACL file', function (done) { var options = createOptions('/acl-tls/append-acl/abc2.ttl.acl', 'user1') options.headers = { 'content-type': 'text/turtle' @@ -697,7 +695,7 @@ describe('ACL with WebID+TLS', function () { done() }) }) - it("user1 should be able to access test file's ACL file", function (done) { + it('user1 should be able to access test file\'s ACL file', function (done) { var options = createOptions('/acl-tls/append-acl/abc2.ttl.acl', 'user1') request.head(options, function (error, response, body) { assert.equal(error, null) @@ -733,7 +731,7 @@ describe('ACL with WebID+TLS', function () { done() }) }) - it("user2 should not be able to access test file's ACL file", function (done) { + it('user2 should not be able to access test file\'s ACL file', function (done) { var options = createOptions('/acl-tls/append-acl/abc2.ttl.acl', 'user2') request.head(options, function (error, response, body) { assert.equal(error, null) @@ -791,7 +789,7 @@ describe('ACL with WebID+TLS', function () { ' <./>;\n' + ' ;\n' + ' .\n' - it("user1 should be able to modify test directory's ACL file", function (done) { + it('user1 should be able to modify test directory\'s ACL file', function (done) { var options = createOptions('/acl-tls/write-acl/default-for-new/.acl', 'user1') options.headers = { 'content-type': 'text/turtle' @@ -803,7 +801,7 @@ describe('ACL with WebID+TLS', function () { done() }) }) - it("user1 should be able to access test direcotory's ACL file", function (done) { + it('user1 should be able to access test direcotory\'s ACL file', function (done) { var options = createOptions('/acl-tls/write-acl/default-for-new/.acl', 'user1') request.head(options, function (error, response, body) { assert.equal(error, null) @@ -831,7 +829,7 @@ describe('ACL with WebID+TLS', function () { done() }) }) - it("user2 should not be able to access test direcotory's ACL file", function (done) { + it('user2 should not be able to access test direcotory\'s ACL file', function (done) { var options = createOptions('/acl-tls/write-acl/default-for-new/.acl', 'user2') request.head(options, function (error, response, body) { assert.equal(error, null) From 7feecf91420317762b3139f4585ded86c8dc0fb6 Mon Sep 17 00:00:00 2001 From: Ruben Verborgh Date: Sun, 3 Mar 2019 15:05:59 +0100 Subject: [PATCH 22/60] Rename variables for consistency. --- lib/ldp.js | 83 +++++++++++++++++++++++++----------------------------- 1 file changed, 38 insertions(+), 45 deletions(-) diff --git a/lib/ldp.js b/lib/ldp.js index db7c6d38e..1f381e7b6 100644 --- a/lib/ldp.js +++ b/lib/ldp.js @@ -1,4 +1,4 @@ -const path = require('path') +const { join, dirname } = require('path') const url = require('url') const fs = require('fs') const $rdf = require('rdflib') @@ -90,18 +90,14 @@ class LDP { }) } - createReadStream (filename, start, end) { - if (start && end) { - return fs.createReadStream(filename, {'start': start, 'end': end}) - } else { - return fs.createReadStream(filename) - } + createReadStream (path, start, end) { + return fs.createReadStream(path, start && end && {start, end}) } async readResource (url) { try { const { path } = await this.resourceMapper.mapUrlToFile({ url }) - return await promisify(fs.readFile)(path, {'encoding': 'utf8'}) + return await promisify(fs.readFile)(path, {encoding: 'utf8'}) } catch (err) { throw error(err.status, err.message) } @@ -114,7 +110,7 @@ class LDP { return this.readResource(url + this.suffixMeta) } - async listContainer (filename, reqUri, containerData, hostname) { + async listContainer (container, reqUri, containerData, hostname) { const resourceGraph = $rdf.graph() try { @@ -126,14 +122,14 @@ class LDP { try { // add container stats - await ldpContainer.addContainerStats(this, reqUri, filename, resourceGraph) + await ldpContainer.addContainerStats(this, reqUri, container, resourceGraph) // read directory - const files = await ldpContainer.readdir(filename) + const files = await ldpContainer.readdir(container) // iterate through all the files await Promise.all(files.map(async file => { const { url: fileUri } = await this.resourceMapper.mapFileToUrl( - { path: path.join(filename, file), hostname }) - return await ldpContainer.addFile(this, resourceGraph, reqUri, fileUri, filename, file) + { path: join(container, file), hostname }) + return await ldpContainer.addFile(this, resourceGraph, reqUri, fileUri, container, file) })) } catch (err) { throw error(500, "Can't list container") @@ -169,7 +165,7 @@ class LDP { let originalPath = resourcePath if (container) { // Create directory by an LDP PUT to the container's .meta resource - resourcePath = path.join(originalPath, ldp.suffixMeta) + resourcePath = join(originalPath, ldp.suffixMeta) if (originalPath && !originalPath.endsWith('/')) { originalPath += '/' } @@ -241,8 +237,8 @@ class LDP { } // Second, create the enclosing directory, if necessary - const { path: filePath } = await this.resourceMapper.mapUrlToFile({ url, contentType, createIfNotExists: true }) - const dirName = path.dirname(filePath) + const { path } = await this.resourceMapper.mapUrlToFile({ url, contentType, createIfNotExists: true }) + const dirName = dirname(path) try { await promisify(mkdirp)(dirName) } catch (err) { @@ -253,12 +249,12 @@ class LDP { // Directory created, now write the file return await new Promise((resolve, reject) => { - const file = stream.pipe(fs.createWriteStream(filePath)) + const file = stream.pipe(fs.createWriteStream(path)) file.on('error', function () { reject(error(500, 'Error writing data')) }) file.on('finish', function () { - debug.handlers('PUT -- Wrote data to: ' + filePath) + debug.handlers('PUT -- Wrote data to: ' + path) resolve() }) }) @@ -335,28 +331,28 @@ class LDP { } async get (options, searchIndex = true) { - let filename, contentType, stats + let path, contentType, stats try { - ({ path: filename, contentType } = await this.resourceMapper.mapUrlToFile({ url: options, searchIndex })) - stats = await this.stat(filename) + ({ path, contentType } = await this.resourceMapper.mapUrlToFile({ url: options, searchIndex })) + stats = await this.stat(path) } catch (err) { throw error(404, 'Can\'t find file requested: ' + options) } // Just return, since resource exists if (!options.includeBody) { - return { 'stream': stats, 'contentType': contentType, 'container': stats.isDirectory() } + return { stream: stats, contentType, container: stats.isDirectory() } } // Found a container if (stats.isDirectory()) { const { url: absContainerUri } = await this.resourceMapper - .mapFileToUrl({ path: filename, hostname: options.hostname }) + .mapFileToUrl({ path, hostname: options.hostname }) const metaFile = await this.readContainerMeta(absContainerUri) .catch(() => '') // Default to an empty meta file if it is missing let data try { - data = await this.listContainer(filename, absContainerUri, metaFile, options.hostname) + data = await this.listContainer(path, absContainerUri, metaFile, options.hostname) } catch (err) { debug.handlers('GET container -- Read error:' + err.message) throw err @@ -364,32 +360,29 @@ class LDP { const stream = stringToStream(data) // TODO 'text/turtle' is fixed, should be contentType instead // This forces one more translation turtle -> desired - return { 'stream': stream, 'contentType': 'text/turtle', 'container': true } + return { stream, contentType: 'text/turtle', container: true } } else { let stream - let chunksize - let contentRange + let chunksize, contentRange, start, end if (options.range) { - const total = fs.statSync(filename).size + const total = fs.statSync(path).size const parts = options.range.replace(/bytes=/, '').split('-') const partialstart = parts[0] const partialend = parts[1] - const start = parseInt(partialstart, 10) - const end = partialend ? parseInt(partialend, 10) : total - 1 + start = parseInt(partialstart, 10) + end = partialend ? parseInt(partialend, 10) : total - 1 chunksize = (end - start) + 1 contentRange = 'bytes ' + start + '-' + end + '/' + total - stream = this.createReadStream(filename, start, end) - } else { - stream = this.createReadStream(filename) } + stream = this.createReadStream(path) return new Promise((resolve, reject) => { stream .on('error', function (err) { - debug.handlers(`GET -- error reading ${filename}: ${err.message}`) + debug.handlers(`GET -- error reading ${path}: ${err.message}`) return reject(error(err, "Can't read file " + err)) }) .on('open', function () { - debug.handlers(`GET -- Reading ${filename}`) + debug.handlers(`GET -- Reading ${path}`) return resolve({ stream, contentType, container: false, contentRange, chunksize }) }) }) @@ -398,19 +391,19 @@ class LDP { async delete (url) { // First check if the path points to a valid file - let filePath, stats + let path, stats try { - ({ path: filePath } = await this.resourceMapper.mapUrlToFile({ url })) - stats = await this.stat(filePath) + ({ path } = await this.resourceMapper.mapUrlToFile({ url })) + stats = await this.stat(path) } catch (err) { throw error(404, "Can't find " + err) } // If so, delete the directory or file if (stats.isDirectory()) { - return this.deleteContainer(filePath) + return this.deleteContainer(path) } else { - return this.deleteResource(filePath) + return this.deleteResource(path) } } @@ -440,9 +433,9 @@ class LDP { } } - async deleteResource (filename) { + async deleteResource (path) { try { - return promisify(fs.unlink)(filename) + return promisify(fs.unlink)(path) } catch (err) { debug.container('DELETE -- unlink() error: ' + err) throw error(err, 'Failed to delete resource') @@ -450,18 +443,18 @@ class LDP { } getAvailablePath (host, containerURI, { slug = uuid.v1(), extension }) { - const filename = slug + extension + const path = slug + extension function ensureNotExists (self, newPath) { // Verify whether the new path already exists return self.exists(host, newPath).then( // If it does, generate another one () => ensureNotExists(self, URI.joinPaths(containerURI, - `${uuid.v1().split('-')[0]}-${filename}`).toString()), + `${uuid.v1().split('-')[0]}-${path}`).toString()), // If not, we found an appropriate path () => newPath ) } - return ensureNotExists(this, URI.joinPaths(containerURI, filename).toString()) + return ensureNotExists(this, URI.joinPaths(containerURI, path).toString()) } getTrustedOrigins (req) { From 4e6eb10f6a1dcef473240b4b83b2144ef6fc7b76 Mon Sep 17 00:00:00 2001 From: Ruben Verborgh Date: Sun, 3 Mar 2019 15:13:24 +0100 Subject: [PATCH 23/60] Add lock on readResource. --- lib/ldp.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/ldp.js b/lib/ldp.js index 1f381e7b6..972d0f191 100644 --- a/lib/ldp.js +++ b/lib/ldp.js @@ -17,6 +17,7 @@ const parse = require('./utils').parse const fetch = require('node-fetch') const { promisify } = require('util') const URI = require('urijs') +const { lock } = require('proper-lockfile') const RDF_MIME_TYPES = new Set([ 'text/turtle', // .ttl @@ -95,11 +96,17 @@ class LDP { } async readResource (url) { + let releaseLock try { const { path } = await this.resourceMapper.mapUrlToFile({ url }) + releaseLock = await lock(path, { retries: 10 }) return await promisify(fs.readFile)(path, {encoding: 'utf8'}) } catch (err) { throw error(err.status, err.message) + } finally { + if (releaseLock) { + await releaseLock() + } } } From 3193a32482650f56c003750da19e3786f9319d8f Mon Sep 17 00:00:00 2001 From: Ruben Verborgh Date: Sun, 3 Mar 2019 15:15:30 +0100 Subject: [PATCH 24/60] Add lock on put. --- lib/ldp.js | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/lib/ldp.js b/lib/ldp.js index 972d0f191..9a978df81 100644 --- a/lib/ldp.js +++ b/lib/ldp.js @@ -255,16 +255,24 @@ class LDP { } // Directory created, now write the file - return await new Promise((resolve, reject) => { - const file = stream.pipe(fs.createWriteStream(path)) - file.on('error', function () { - reject(error(500, 'Error writing data')) - }) - file.on('finish', function () { - debug.handlers('PUT -- Wrote data to: ' + path) - resolve() + let releaseLock + try { + releaseLock = await lock(path, { retries: 10, realpath: false }) + return await new Promise((resolve, reject) => { + const file = stream.pipe(fs.createWriteStream(path)) + file.on('error', function () { + reject(error(500, 'Error writing data')) + }) + file.on('finish', function () { + debug.handlers('PUT -- Wrote data to: ' + path) + resolve() + }) }) - }) + } finally { + if (releaseLock) { + await releaseLock() + } + } } async exists (hostname, path, searchIndex = true) { From fd3b2b10fae4962505c30413131fe54d220ad674 Mon Sep 17 00:00:00 2001 From: Ruben Verborgh Date: Sun, 3 Mar 2019 15:20:16 +0100 Subject: [PATCH 25/60] Add lock on get. --- lib/ldp.js | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/lib/ldp.js b/lib/ldp.js index 9a978df81..7b46cb5bf 100644 --- a/lib/ldp.js +++ b/lib/ldp.js @@ -91,10 +91,6 @@ class LDP { }) } - createReadStream (path, start, end) { - return fs.createReadStream(path, start && end && {start, end}) - } - async readResource (url) { let releaseLock try { @@ -377,7 +373,6 @@ class LDP { // This forces one more translation turtle -> desired return { stream, contentType: 'text/turtle', container: true } } else { - let stream let chunksize, contentRange, start, end if (options.range) { const total = fs.statSync(path).size @@ -389,18 +384,26 @@ class LDP { chunksize = (end - start) + 1 contentRange = 'bytes ' + start + '-' + end + '/' + total } - stream = this.createReadStream(path) - return new Promise((resolve, reject) => { - stream - .on('error', function (err) { - debug.handlers(`GET -- error reading ${path}: ${err.message}`) - return reject(error(err, "Can't read file " + err)) - }) - .on('open', function () { - debug.handlers(`GET -- Reading ${path}`) - return resolve({ stream, contentType, container: false, contentRange, chunksize }) - }) - }) + let releaseLock + try { + releaseLock = await lock(path, { retries: 10 }) + return await new Promise((resolve, reject) => { + const stream = fs.createReadStream(path, start && end && {start, end}) + stream + .on('error', function (err) { + debug.handlers(`GET -- error reading ${path}: ${err.message}`) + return reject(error(err, "Can't read file " + err)) + }) + .on('open', function () { + debug.handlers(`GET -- Reading ${path}`) + return resolve({ stream, contentType, container: false, contentRange, chunksize }) + }) + }) + } finally { + if (releaseLock) { + await releaseLock() + } + } } } From e9c8db3f18ea70298fe0ab35684b6288729aac36 Mon Sep 17 00:00:00 2001 From: Ruben Verborgh Date: Sun, 3 Mar 2019 15:22:05 +0100 Subject: [PATCH 26/60] Add lock on deleteResource. --- lib/ldp.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/ldp.js b/lib/ldp.js index 7b46cb5bf..c66e5678b 100644 --- a/lib/ldp.js +++ b/lib/ldp.js @@ -452,11 +452,17 @@ class LDP { } async deleteResource (path) { + let releaseLock try { - return promisify(fs.unlink)(path) + releaseLock = await lock(path, { retries: 10 }) + return await promisify(fs.unlink)(path) } catch (err) { debug.container('DELETE -- unlink() error: ' + err) throw error(err, 'Failed to delete resource') + } finally { + if (releaseLock) { + await releaseLock() + } } } From dafc2289fbc2a18fead0e29eed3cbd4143600615 Mon Sep 17 00:00:00 2001 From: yova Date: Mon, 4 Mar 2019 16:16:01 +0000 Subject: [PATCH 27/60] repairs redirect due to case typo correction --- lib/create-server.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/create-server.js b/lib/create-server.js index 31216c834..33411f047 100644 --- a/lib/create-server.js +++ b/lib/create-server.js @@ -80,20 +80,20 @@ function createServer (argv, app) { } // Look for port or list of ports to redirect to argv.port - if ('redirectHTTPFrom' in argv) { - const redirectHTTPFroms = argv.redirectHTTPFrom.constructor === Array - ? argv.redirectHTTPFrom - : [argv.redirectHTTPFrom] + if ('redirectHttpFrom' in argv) { + const redirectHttpFroms = argv.redirectHttpFrom.constructor === Array + ? argv.redirectHttpFrom + : [argv.redirectHttpFrom] const portStr = argv.port === 443 ? '' : ':' + argv.port - redirectHTTPFroms.forEach(redirectHTTPFrom => { - debug.settings('will redirect from port ' + redirectHTTPFrom + ' to port ' + argv.port) + redirectHttpFroms.forEach(redirectHttpFrom => { + debug.settings('will redirect from port ' + redirectHttpFrom + ' to port ' + argv.port) let redirectingServer = express() redirectingServer.get('*', function (req, res) { let host = req.headers.host.split(':') // ignore port debug.server(host, '=> https://' + host + portStr + req.url) res.redirect('https://' + host + portStr + req.url) }) - redirectingServer.listen(redirectHTTPFrom) + redirectingServer.listen(redirectHttpFrom) }) } From 35839d5fba621ab93245ef084ee7338d069f1bd5 Mon Sep 17 00:00:00 2001 From: Dmitri Zagidulin Date: Mon, 4 Mar 2019 17:25:10 +0100 Subject: [PATCH 28/60] Extract printing debug info from ldp to config module --- lib/create-app.js | 2 ++ lib/ldp.js | 15 --------------- lib/server-config.js | 22 +++++++++++++++++++++- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/lib/create-app.js b/lib/create-app.js index da2ec9980..738f3fb67 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -54,6 +54,8 @@ function createApp (argv = {}) { const configPath = config.initConfigDir(argv) argv.templates = config.initTemplateDirs(configPath) + config.printDebugInfo(argv) + const ldp = new LDP(argv) const app = express() diff --git a/lib/ldp.js b/lib/ldp.js index db7c6d38e..1d0d03988 100644 --- a/lib/ldp.js +++ b/lib/ldp.js @@ -63,21 +63,6 @@ class LDP { this.corsProxy = '/' + this.corsProxy } - debug.settings('Server URI: ' + this.serverUri) - debug.settings('Auth method: ' + this.auth) - debug.settings('Strict origins: ' + this.strictOrigin) - debug.settings('Allowed origins: ' + this.trustedOrigins) - debug.settings('Db path: ' + this.dbPath) - debug.settings('Config path: ' + this.configPath) - debug.settings('Suffix Acl: ' + this.suffixAcl) - debug.settings('Suffix Meta: ' + this.suffixMeta) - debug.settings('Filesystem Root: ' + (this.resourceMapper ? this.resourceMapper.rootPath : 'none')) - debug.settings('Allow WebID authentication: ' + !!this.webid) - debug.settings('Live-updates: ' + !!this.live) - debug.settings('Multi-user: ' + !!this.multiuser) - debug.settings('Suppress default data browser app: ' + this.suppressDataBrowser) - debug.settings('Default data browser app file path: ' + this.dataBrowserPath) - return this } diff --git a/lib/server-config.js b/lib/server-config.js index 664d3911f..cb49386f9 100644 --- a/lib/server-config.js +++ b/lib/server-config.js @@ -9,6 +9,25 @@ const path = require('path') const templateUtils = require('./common/template-utils') const fsUtils = require('./common/fs-utils') +const debug = require('./debug') + +function printDebugInfo (options) { + debug.settings('Server URI: ' + options.serverUri) + debug.settings('Auth method: ' + options.auth) + debug.settings('Strict origins: ' + options.strictOrigin) + debug.settings('Allowed origins: ' + options.trustedOrigins) + debug.settings('Db path: ' + options.dbPath) + debug.settings('Config path: ' + options.configPath) + debug.settings('Suffix Acl: ' + options.suffixAcl) + debug.settings('Suffix Meta: ' + options.suffixMeta) + debug.settings('Filesystem Root: ' + (this.resourceMapper ? this.resourceMapper.rootPath : 'none')) + debug.settings('Allow WebID authentication: ' + !!options.webid) + debug.settings('Live-updates: ' + !!options.live) + debug.settings('Multi-user: ' + !!options.multiuser) + debug.settings('Suppress default data browser app: ' + options.suppressDataBrowser) + debug.settings('Default data browser app file path: ' + options.dataBrowserPath) +} + /** * Ensures that a directory has been copied / initialized. Used to ensure that * account templates, email templates and default apps have been copied from @@ -144,5 +163,6 @@ module.exports = { ensureWelcomePage, initConfigDir, initDefaultViews, - initTemplateDirs + initTemplateDirs, + printDebugInfo } From d7411eb1a9e5af5aa2cddead876124ea12de4d76 Mon Sep 17 00:00:00 2001 From: Dmitri Zagidulin Date: Mon, 4 Mar 2019 18:13:44 +0100 Subject: [PATCH 29/60] Expand SolidHost config constructor, plus tests --- lib/create-app.js | 2 +- lib/models/solid-host.js | 11 ++++++++++- test/unit/solid-host-test.js | 12 ++++++++++-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/lib/create-app.js b/lib/create-app.js index da2ec9980..a46596da9 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -42,7 +42,7 @@ function createApp (argv = {}) { // Override default configs (defaults) with passed-in params (argv) argv = Object.assign({}, defaults, argv) - argv.host = SolidHost.from({ port: argv.port, serverUri: argv.serverUri }) + argv.host = SolidHost.from(argv) argv.resourceMapper = new ResourceMapper({ rootUrl: argv.serverUri, diff --git a/lib/models/solid-host.js b/lib/models/solid-host.js index 51dde215d..e13f156ca 100644 --- a/lib/models/solid-host.js +++ b/lib/models/solid-host.js @@ -15,7 +15,12 @@ class SolidHost { * @param [options={}] * @param [options.port] {number} * @param [options.serverUri] {string} Fully qualified URI that this Solid - * server is listening on, e.g. `https://databox.me` + * server is listening on, e.g. `https://solid.community` + * @param [options.live] {boolean} Whether to turn on WebSockets / LDP live + * @param [options.root] {string} Path to root data directory + * @param [options.multiuser] {boolean} Multiuser mode + * @param [options.webid] {boolean} Enable WebID-related functionality + * (account creation and authentication) */ constructor (options = {}) { this.port = options.port || defaults.port @@ -24,6 +29,10 @@ class SolidHost { this.parsedUri = url.parse(this.serverUri) this.host = this.parsedUri.host this.hostname = this.parsedUri.hostname + this.live = options.live + this.root = options.root + this.multiuser = options.multiuser + this.webid = options.webid } /** diff --git a/test/unit/solid-host-test.js b/test/unit/solid-host-test.js index be7821bbc..fc2d77b6d 100644 --- a/test/unit/solid-host-test.js +++ b/test/unit/solid-host-test.js @@ -7,16 +7,24 @@ const defaults = require('../../config/defaults') describe('SolidHost', () => { describe('from()', () => { - it('should init with port, serverUri and hostname', () => { + it('should init with provided params', () => { let config = { port: 3000, - serverUri: 'https://localhost:3000' + serverUri: 'https://localhost:3000', + live: true, + root: '/data/solid/', + multiuser: true, + webid: true } let host = SolidHost.from(config) expect(host.port).to.equal(3000) expect(host.serverUri).to.equal('https://localhost:3000') expect(host.hostname).to.equal('localhost') + expect(host.live).to.be.true + expect(host.root).to.equal('/data/solid/') + expect(host.multiuser).to.be.true + expect(host.webid).to.be.true }) it('should init to default port and serverUri values', () => { From 0ece321d50d96d6e47fb0681c4f951eddb7894ed Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 6 Mar 2019 13:03:56 +0100 Subject: [PATCH 30/60] Some optimizations --- lib/acl-checker.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/acl-checker.js b/lib/acl-checker.js index 4dccb3924..44c0ae883 100644 --- a/lib/acl-checker.js +++ b/lib/acl-checker.js @@ -16,11 +16,10 @@ class ACLChecker { constructor (resource, options = {}) { this.resource = resource this.resourceUrl = new URL(resource) - this.agentOrigin = options.agentOrigin + this.agentOrigin = options.strictOrigin && options.agentOrigin ? rdf.sym(options.agentOrigin) : null this.fetch = options.fetch this.fetchGraph = options.fetchGraph - this.strictOrigin = options.strictOrigin - this.trustedOrigins = options.trustedOrigins + this.trustedOrigins = options.strictOrigin && options.trustedOrigins ? options.trustedOrigins.map(trustedOrigin => rdf.sym(trustedOrigin)) : null this.suffix = options.suffix || DEFAULT_ACL_SUFFIX this.aclCached = {} this.messagesCached = {} @@ -56,8 +55,8 @@ class ACLChecker { const aclFile = rdf.sym(acl.acl) const agent = user ? rdf.sym(user) : null const modes = [ACL(mode)] - const agentOrigin = this.strictOrigin && this.agentOrigin ? rdf.sym(this.agentOrigin) : null - const trustedOrigins = this.strictOrigin && this.trustedOrigins ? this.trustedOrigins.map(trustedOrigin => rdf.sym(trustedOrigin)) : null + const agentOrigin = this.agentOrigin + const trustedOrigins = this.trustedOrigins const accessDenied = aclCheck.accessDenied(acl.graph, resource, directory, aclFile, agent, modes, agentOrigin, trustedOrigins) if (accessDenied && user) { From 31f113ab7171c0f3898798073a3b9698b07de7d4 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 6 Mar 2019 22:52:52 +0100 Subject: [PATCH 31/60] Trying to optimize and improve readability through better abstraction Trying to optimise code, and improve abstraction for better readability Hopefully responding to the concerns of @RubenVerborgh: https://github.com/solid/node-solid-server/pull/1109#discussion_r261867910 and https://github.com/solid/node-solid-server/pull/1109#discussion_r261868054 --- lib/resource-mapper.js | 13 ++++++++----- test/unit/resource-mapper-test.js | 26 ++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/lib/resource-mapper.js b/lib/resource-mapper.js index e9e7903cc..722c07044 100644 --- a/lib/resource-mapper.js +++ b/lib/resource-mapper.js @@ -25,7 +25,7 @@ class ResourceMapper { this._defaultContentType = defaultContentType this._indexFilename = indexFilename this._types = { ...types, ...overrideTypes } - this._suffixes = fileSuffixes + this._isControlFile = new RegExp(`.(?:${fileSuffixes.join('|')})$`) // If the host needs to be replaced on every call, pre-split the root URL if (includeHost) { @@ -92,10 +92,13 @@ class ResourceMapper { async _getMatchingFile (folder, filename, isIndex) { const files = await this._readdir(folder) - - // Find a file with the same name (minus the dollar extension) - return (files.find(f => this._removeDollarExtension(f) === filename || - (isIndex && f.startsWith(this._indexFilename + '.') && !this._suffixes.some(suffix => f.endsWith(suffix))))) + const hasSameName = (f) => { + return this._removeDollarExtension(f) === filename + } + const isIndexFile = (f) => { + return isIndex && f.startsWith(this._indexFilename + '.') && !this._isControlFile.test(f) + } + return files.find(f => hasSameName(f) || isIndexFile(f)) } async getRepresentationUrlForResource (resourceUrl) { diff --git a/test/unit/resource-mapper-test.js b/test/unit/resource-mapper-test.js index 0fc912c5b..d2aa7cb4d 100644 --- a/test/unit/resource-mapper-test.js +++ b/test/unit/resource-mapper-test.js @@ -286,6 +286,18 @@ describe('ResourceMapper', () => { contentType: 'application/octet-stream' }) + itMapsUrl(mapper, 'a URL of that has an accompanying acl file, but no actual file', + { + url: 'http://localhost/space/' + }, + [ + `${rootPath}space/index.acl` + ], + { + path: `${rootPath}space/`, + contentType: 'application/octet-stream' + }) + itMapsUrl(mapper, 'a URL ending with a slash to an index file for text/html when index.html not is available', { url: 'http://localhost/space/', @@ -297,6 +309,20 @@ describe('ResourceMapper', () => { contentType: 'text/html' }) + itMapsUrl(mapper, 'a URL of that has an accompanying meta file, but no actual file', + { + url: 'http://localhost/space/', + contentType: 'text/html', + createIfNotExists: true + }, + [ + `${rootPath}space/index.meta` + ], + { + path: `${rootPath}space/index.html`, + contentType: 'text/html' + }) + itMapsUrl(mapper, 'a URL ending with a slash to a folder when index is skipped', { url: 'http://localhost/space/', From 08684fb0702fec7ef65974d3ce55e5b57d9a6876 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Thu, 7 Mar 2019 19:18:42 +0100 Subject: [PATCH 32/60] Trying to fix regex --- lib/resource-mapper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/resource-mapper.js b/lib/resource-mapper.js index 722c07044..653c1c76a 100644 --- a/lib/resource-mapper.js +++ b/lib/resource-mapper.js @@ -25,7 +25,7 @@ class ResourceMapper { this._defaultContentType = defaultContentType this._indexFilename = indexFilename this._types = { ...types, ...overrideTypes } - this._isControlFile = new RegExp(`.(?:${fileSuffixes.join('|')})$`) + this._isControlFile = new RegExp(`(?:${fileSuffixes.map(fs => fs.replace('.', '\\.')).join('|')})$`) // If the host needs to be replaced on every call, pre-split the root URL if (includeHost) { From b486abe0ce31b5766427312f4827b0536c208b21 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Thu, 7 Mar 2019 19:46:32 +0100 Subject: [PATCH 33/60] Trying to revert authentication-oidc-test manually And applying the new tests that were added additionally on the reverted file --- test/integration/authentication-oidc-test.js | 562 +++++++++++-------- 1 file changed, 342 insertions(+), 220 deletions(-) diff --git a/test/integration/authentication-oidc-test.js b/test/integration/authentication-oidc-test.js index e0a3a528e..c30497e3b 100644 --- a/test/integration/authentication-oidc-test.js +++ b/test/integration/authentication-oidc-test.js @@ -22,9 +22,8 @@ chai.use(require('dirty-chai')) describe('Authentication API (OIDC)', () => { let alice, bob - const aliceServerPort = 7000 - const aliceServerUri = `https://localhost:${aliceServerPort}` - const aliceWebId = `https://localhost:${aliceServerPort}/profile/card#me` + let aliceServerUri = 'https://localhost:7000' + let aliceWebId = 'https://localhost:7000/profile/card#me' let configPath = path.join(__dirname, '../resources/config') let aliceDbPath = path.join(__dirname, '../resources/accounts-scenario/alice/db') @@ -32,8 +31,7 @@ describe('Authentication API (OIDC)', () => { let aliceUserStore = UserStore.from({ path: userStorePath, saltRounds: 1 }) aliceUserStore.initCollections() - const bobServerPort = 7001 - const bobServerUri = `https://localhost:${bobServerPort}` + let bobServerUri = 'https://localhost:7001' let bobDbPath = path.join(__dirname, '../resources/accounts-scenario/bob/db') @@ -72,8 +70,8 @@ describe('Authentication API (OIDC)', () => { before(async () => { await Promise.all([ - startServer(alicePod, aliceServerPort), - startServer(bobPod, bobServerPort) + startServer(alicePod, 7000), + startServer(bobPod, 7001) ]).then(() => { alice = supertest(aliceServerUri) bob = supertest(bobServerUri) @@ -93,7 +91,7 @@ describe('Authentication API (OIDC)', () => { describe('Login page (GET /login)', () => { it('should load the user login form', () => { return alice.get('/login') - .expect(200) + .expect(200) }) }) @@ -106,7 +104,7 @@ describe('Authentication API (OIDC)', () => { aliceUserStore.initCollections() return aliceUserStore.createUser(aliceAccount, alicePassword) - .catch(console.error.bind(console)) + .catch(console.error.bind(console)) }) afterEach(() => { @@ -119,14 +117,14 @@ describe('Authentication API (OIDC)', () => { aliceUserStore.initCollections() aliceUserStore.createUser(aliceAccount, alicePassword) alice.post('/login/password') - .type('form') - .send({ username: 'alice' }) - .send({ password: alicePassword }) - .end((err, res) => { - response = res - cookie = response.headers['set-cookie'][0] - done(err) - }) + .type('form') + .send({ username: 'alice' }) + .send({ password: alicePassword }) + .end((err, res) => { + response = res + cookie = response.headers['set-cookie'][0] + done(err) + }) }) it('should redirect to /authorize', () => { @@ -148,170 +146,294 @@ describe('Authentication API (OIDC)', () => { }) describe('and performing a subsequent request', () => { - let response - describe('without cookie', () => { - describe('and no origin set', () => { - before(done => { - alice.get('/private-for-alice.txt') - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => expect(response).to.have.property('status', 401)) - }) - describe('and our origin', () => { - // Our own origin, no agent auth - before(done => { - alice.get('/private-for-alice.txt') - .set('Origin', aliceServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => expect(response).to.have.property('status', 401)) - }) - describe('and trusted origin', () => { - // Configuration for originsAllowed but no auth - before(done => { - alice.get('/private-for-alice.txt') - .set('Origin', 'https://apps.solid.invalid') - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => expect(response).to.have.property('status', 401)) - }) - describe('and untrusted origin', () => { - // Not authenticated but also wrong origin, - before(done => { - alice.get('/private-for-alice.txt') - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) + describe('without that cookie', () => { + let response + before(done => { + alice.get('/private-for-alice.txt') + .end((err, res) => { + response = res + done(err) + }) + }) - it('should return a 401', () => expect(response).to.have.property('status', 401)) + it('should return a 401', () => { + expect(response).to.have.property('status', 401) }) }) - describe('with cookie', () => { - describe('and no origin set', () => { - before(done => { - alice.get('/private-for-alice.txt') - .set('Cookie', cookie) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 200', () => expect(response).to.have.property('status', 200)) - }) - describe('and our origin', () => { - before(done => { - alice.get('/private-for-alice.txt') - .set('Cookie', cookie) - .set('Origin', aliceServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 200', () => expect(response).to.have.property('status', 200)) - }) - describe('and trusted origin', () => { - before(done => { - alice.get('/') - .set('Cookie', cookie) - .set('Origin', 'https://apps.solid.invalid') - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 200', () => expect(response).to.have.property('status', 200)) - }) - describe('and untrusted origin', () => { - before(done => { - alice.get('/private-for-alice.txt') - .set('Cookie', cookie) - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) + describe('with that cookie and a non-matching origin', () => { + let response + before(done => { + alice.get('/private-for-owner.txt') + .set('Cookie', cookie) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) - it('should return a 403', () => expect(response).to.have.property('status', 403)) + it('should return a 403', () => { + expect(response).to.have.property('status', 403) }) }) - describe('with malicious cookie', () => { - let malcookie - before(() => { - // How Mallory might set their cookie: - malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') - }) - describe('and no origin set', () => { - before(done => { - alice.get('/private-for-alice.txt') - .set('Cookie', malcookie) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => expect(response).to.have.property('status', 401)) - }) - describe('and our origin', () => { - before(done => { - alice.get('/private-for-alice.txt') - .set('Cookie', malcookie) - .set('Origin', aliceServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => expect(response).to.have.property('status', 401)) - }) - describe('and trusted origin', () => { - before(done => { - alice.get('/private-for-alice.txt') - .set('Cookie', malcookie) - .set('Origin', 'https://apps.solid.invalid') - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => expect(response).to.have.property('status', 401)) - }) - describe('and untrusted origin', () => { - before(done => { - alice.get('/private-for-alice.txt') - .set('Cookie', malcookie) - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) + describe('with that cookie and a non-matching origin', () => { + let response + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', cookie) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 403', () => { + expect(response).to.have.property('status', 403) + }) + }) + + describe('without that cookie and a non-matching origin', () => { + let response + before(done => { + alice.get('/private-for-alice.txt') + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => { + expect(response).to.have.property('status', 401) + }) + }) + + describe('with that cookie but without origin', () => { + let response + before(done => { + alice.get('/') + .set('Cookie', cookie) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 200', () => { + expect(response).to.have.property('status', 200) + }) + }) + + describe('with that cookie, private resource and no origin set', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', cookie) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 200', () => expect(response).to.have.property('status', 200)) + }) + + // How Mallory might set their cookie: + describe('with malicious cookie but without origin', () => { + let response + before(done => { + var malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') + alice.get('/private-for-alice.txt') + .set('Cookie', malcookie) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => { + expect(response).to.have.property('status', 401) + }) + }) + + // Our origin is trusted by default + describe('with that cookie and our origin', () => { + let response + before(done => { + alice.get('/') + .set('Cookie', cookie) + .set('Origin', aliceServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 200', () => { + expect(response).to.have.property('status', 200) + }) + }) + + // Another origin isn't trusted by default + describe('with that cookie and our origin', () => { + let response + before(done => { + alice.get('/private-for-owner.txt') + .set('Cookie', cookie) + .set('Origin', 'https://some.other.domain.com') + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 403', () => { + expect(response).to.have.property('status', 403) + }) + }) + + // Our own origin, no agent auth + describe('without that cookie but with our origin', () => { + let response + before(done => { + alice.get('/private-for-owner.txt') + .set('Origin', aliceServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) - it('should return a 401', () => expect(response).to.have.property('status', 401)) + it('should return a 401', () => { + expect(response).to.have.property('status', 401) + }) + }) + + // Configuration for originsAllowed + describe('with that cookie but with globally configured origin', () => { + let response + before(done => { + alice.get('/') + .set('Cookie', cookie) + .set('Origin', 'https://apps.solid.invalid') + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 200', () => { + expect(response).to.have.property('status', 200) + }) + }) + + // Configuration for originsAllowed but no auth + describe('without that cookie but with globally configured origin', () => { + let response + before(done => { + alice.get('/private-for-alice.txt') + .set('Origin', 'https://apps.solid.invalid') + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => { + expect(response).to.have.property('status', 401) + }) + }) + + // Configuration for originsAllowed with malicious cookie + describe('with malicious cookie but with globally configured origin', () => { + let response + before(done => { + var malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') + alice.get('/private-for-alice.txt') + .set('Cookie', malcookie) + .set('Origin', 'https://apps.solid.invalid') + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => { + expect(response).to.have.property('status', 401) + }) + }) + + // Not authenticated but also wrong origin, + // 403 because authenticating wouldn't help, since the Origin is wrong + describe('without that cookie and a matching origin', () => { + let response + before(done => { + alice.get('/private-for-owner.txt') + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => { + expect(response).to.have.property('status', 401) + }) + }) + + // Authenticated but origin not OK + describe('with that cookie and a non-matching origin', () => { + let response + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', cookie) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 403', () => { + expect(response).to.have.property('status', 403) + }) + }) + + describe('with malicious cookie and our origin', () => { + let response + before(done => { + var malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') + alice.get('/private-for-alice.txt') + .set('Cookie', malcookie) + .set('Origin', aliceServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => { + expect(response).to.have.property('status', 401) + }) + }) + + describe('with malicious cookie and a non-matching origin', () => { + let response + before(done => { + var malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') + alice.get('/private-for-owner.txt') + .set('Cookie', malcookie) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => { + expect(response).to.have.property('status', 401) }) }) }) @@ -319,35 +441,35 @@ describe('Authentication API (OIDC)', () => { it('should throw a 400 if no username is provided', (done) => { alice.post('/login/password') - .type('form') - .send({ password: alicePassword }) - .expect(400, done) + .type('form') + .send({ password: alicePassword }) + .expect(400, done) }) it('should throw a 400 if no password is provided', (done) => { alice.post('/login/password') - .type('form') - .send({ username: 'alice' }) - .expect(400, done) + .type('form') + .send({ username: 'alice' }) + .expect(400, done) }) it('should throw a 400 if user is found but no password match', (done) => { alice.post('/login/password') - .type('form') - .send({ username: 'alice' }) - .send({ password: 'wrongpassword' }) - .expect(400, done) + .type('form') + .send({ username: 'alice' }) + .send({ password: 'wrongpassword' }) + .expect(400, done) }) }) describe('Browser login workflow', () => { it('401 Unauthorized asking the user to log in', (done) => { bob.get('/shared-with-alice.txt') - .end((err, { status, text }) => { - expect(status).to.equal(401) - expect(text).to.contain('Log in') - done(err) - }) + .end((err, { status, text }) => { + expect(status).to.equal(401) + expect(text).to.contain('Log in') + done(err) + }) }) }) @@ -369,12 +491,12 @@ describe('Authentication API (OIDC)', () => { aliceUserStore.initCollections() return aliceUserStore.createUser(aliceAccount, alicePassword) - .then(() => { - return auth.registerClient(aliceServerUri, appOptions) - }) - .then(registeredClient => { - auth.currentClient = registeredClient - }) + .then(() => { + return auth.registerClient(aliceServerUri, appOptions) + }) + .then(registeredClient => { + auth.currentClient = registeredClient + }) }) after(() => { @@ -402,11 +524,11 @@ describe('Authentication API (OIDC)', () => { // an authorization uri for that provider it('should determine the authorization uri for a preferred provider', () => { return auth.currentClient.createRequest({}, auth.store) - .then(authUri => { - authorizationUri = authUri + .then(authUri => { + authorizationUri = authUri - expect(authUri.startsWith(aliceServerUri + '/authorize')).to.be.true() - }) + expect(authUri.startsWith(aliceServerUri + '/authorize')).to.be.true() + }) }) // Step 3: App redirects user to the authorization uri for login @@ -486,28 +608,28 @@ describe('Authentication API (OIDC)', () => { let protectedResourcePath = bobServerUri + '/shared-with-alice.txt' return auth.initUserFromResponse(auth.currentClient) - .then(webId => { - expect(webId).to.equal(aliceWebId) - - return auth.issuePoPTokenFor(bobServerUri, auth.session) - }) - .then(popToken => { - bearerToken = popToken - - return fetch(protectedResourcePath, { - headers: { - 'Authorization': 'Bearer ' + bearerToken - } - }) - }) - .then(res => { - expect(res.status).to.equal(200) - - return res.text() - }) - .then(contents => { - expect(contents).to.equal('protected contents\n') - }) + .then(webId => { + expect(webId).to.equal(aliceWebId) + + return auth.issuePoPTokenFor(bobServerUri, auth.session) + }) + .then(popToken => { + bearerToken = popToken + + return fetch(protectedResourcePath, { + headers: { + 'Authorization': 'Bearer ' + bearerToken + } + }) + }) + .then(res => { + expect(res.status).to.equal(200) + + return res.text() + }) + .then(contents => { + expect(contents).to.equal('protected contents\n') + }) }) it('should not be able to reuse the bearer token for bob server on another server', () => { @@ -529,7 +651,7 @@ describe('Authentication API (OIDC)', () => { describe('Post-logout page (GET /goodbye)', () => { it('should load the post-logout page', () => { return alice.get('/goodbye') - .expect(200) + .expect(200) }) }) }) From de3b0e0659061036a2a20a2286fbf0034f941ea0 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Thu, 7 Mar 2019 19:54:10 +0100 Subject: [PATCH 34/60] Fixing alignment --- test/integration/authentication-oidc-test.js | 302 +++++++++---------- 1 file changed, 151 insertions(+), 151 deletions(-) diff --git a/test/integration/authentication-oidc-test.js b/test/integration/authentication-oidc-test.js index c30497e3b..6f45100ba 100644 --- a/test/integration/authentication-oidc-test.js +++ b/test/integration/authentication-oidc-test.js @@ -91,7 +91,7 @@ describe('Authentication API (OIDC)', () => { describe('Login page (GET /login)', () => { it('should load the user login form', () => { return alice.get('/login') - .expect(200) + .expect(200) }) }) @@ -104,7 +104,7 @@ describe('Authentication API (OIDC)', () => { aliceUserStore.initCollections() return aliceUserStore.createUser(aliceAccount, alicePassword) - .catch(console.error.bind(console)) + .catch(console.error.bind(console)) }) afterEach(() => { @@ -117,14 +117,14 @@ describe('Authentication API (OIDC)', () => { aliceUserStore.initCollections() aliceUserStore.createUser(aliceAccount, alicePassword) alice.post('/login/password') - .type('form') - .send({ username: 'alice' }) - .send({ password: alicePassword }) - .end((err, res) => { - response = res - cookie = response.headers['set-cookie'][0] - done(err) - }) + .type('form') + .send({ username: 'alice' }) + .send({ password: alicePassword }) + .end((err, res) => { + response = res + cookie = response.headers['set-cookie'][0] + done(err) + }) }) it('should redirect to /authorize', () => { @@ -150,10 +150,10 @@ describe('Authentication API (OIDC)', () => { let response before(done => { alice.get('/private-for-alice.txt') - .end((err, res) => { - response = res - done(err) - }) + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 401', () => { @@ -165,12 +165,12 @@ describe('Authentication API (OIDC)', () => { let response before(done => { alice.get('/private-for-owner.txt') - .set('Cookie', cookie) - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) + .set('Cookie', cookie) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 403', () => { @@ -182,12 +182,12 @@ describe('Authentication API (OIDC)', () => { let response before(done => { alice.get('/private-for-alice.txt') - .set('Cookie', cookie) - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) + .set('Cookie', cookie) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 403', () => { @@ -199,11 +199,11 @@ describe('Authentication API (OIDC)', () => { let response before(done => { alice.get('/private-for-alice.txt') - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 401', () => { @@ -215,11 +215,11 @@ describe('Authentication API (OIDC)', () => { let response before(done => { alice.get('/') - .set('Cookie', cookie) - .end((err, res) => { - response = res - done(err) - }) + .set('Cookie', cookie) + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 200', () => { @@ -230,11 +230,11 @@ describe('Authentication API (OIDC)', () => { describe('with that cookie, private resource and no origin set', () => { before(done => { alice.get('/private-for-alice.txt') - .set('Cookie', cookie) - .end((err, res) => { - response = res - done(err) - }) + .set('Cookie', cookie) + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 200', () => expect(response).to.have.property('status', 200)) @@ -246,11 +246,11 @@ describe('Authentication API (OIDC)', () => { before(done => { var malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') alice.get('/private-for-alice.txt') - .set('Cookie', malcookie) - .end((err, res) => { - response = res - done(err) - }) + .set('Cookie', malcookie) + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 401', () => { @@ -263,12 +263,12 @@ describe('Authentication API (OIDC)', () => { let response before(done => { alice.get('/') - .set('Cookie', cookie) - .set('Origin', aliceServerUri) - .end((err, res) => { - response = res - done(err) - }) + .set('Cookie', cookie) + .set('Origin', aliceServerUri) + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 200', () => { @@ -281,12 +281,12 @@ describe('Authentication API (OIDC)', () => { let response before(done => { alice.get('/private-for-owner.txt') - .set('Cookie', cookie) - .set('Origin', 'https://some.other.domain.com') - .end((err, res) => { - response = res - done(err) - }) + .set('Cookie', cookie) + .set('Origin', 'https://some.other.domain.com') + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 403', () => { @@ -299,11 +299,11 @@ describe('Authentication API (OIDC)', () => { let response before(done => { alice.get('/private-for-owner.txt') - .set('Origin', aliceServerUri) - .end((err, res) => { - response = res - done(err) - }) + .set('Origin', aliceServerUri) + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 401', () => { @@ -316,12 +316,12 @@ describe('Authentication API (OIDC)', () => { let response before(done => { alice.get('/') - .set('Cookie', cookie) - .set('Origin', 'https://apps.solid.invalid') - .end((err, res) => { - response = res - done(err) - }) + .set('Cookie', cookie) + .set('Origin', 'https://apps.solid.invalid') + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 200', () => { @@ -334,11 +334,11 @@ describe('Authentication API (OIDC)', () => { let response before(done => { alice.get('/private-for-alice.txt') - .set('Origin', 'https://apps.solid.invalid') - .end((err, res) => { - response = res - done(err) - }) + .set('Origin', 'https://apps.solid.invalid') + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 401', () => { @@ -352,12 +352,12 @@ describe('Authentication API (OIDC)', () => { before(done => { var malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') alice.get('/private-for-alice.txt') - .set('Cookie', malcookie) - .set('Origin', 'https://apps.solid.invalid') - .end((err, res) => { - response = res - done(err) - }) + .set('Cookie', malcookie) + .set('Origin', 'https://apps.solid.invalid') + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 401', () => { @@ -371,11 +371,11 @@ describe('Authentication API (OIDC)', () => { let response before(done => { alice.get('/private-for-owner.txt') - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 401', () => { @@ -388,12 +388,12 @@ describe('Authentication API (OIDC)', () => { let response before(done => { alice.get('/private-for-alice.txt') - .set('Cookie', cookie) - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) + .set('Cookie', cookie) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 403', () => { @@ -406,12 +406,12 @@ describe('Authentication API (OIDC)', () => { before(done => { var malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') alice.get('/private-for-alice.txt') - .set('Cookie', malcookie) - .set('Origin', aliceServerUri) - .end((err, res) => { - response = res - done(err) - }) + .set('Cookie', malcookie) + .set('Origin', aliceServerUri) + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 401', () => { @@ -424,12 +424,12 @@ describe('Authentication API (OIDC)', () => { before(done => { var malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') alice.get('/private-for-owner.txt') - .set('Cookie', malcookie) - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) + .set('Cookie', malcookie) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) }) it('should return a 401', () => { @@ -441,35 +441,35 @@ describe('Authentication API (OIDC)', () => { it('should throw a 400 if no username is provided', (done) => { alice.post('/login/password') - .type('form') - .send({ password: alicePassword }) - .expect(400, done) + .type('form') + .send({ password: alicePassword }) + .expect(400, done) }) it('should throw a 400 if no password is provided', (done) => { alice.post('/login/password') - .type('form') - .send({ username: 'alice' }) - .expect(400, done) + .type('form') + .send({ username: 'alice' }) + .expect(400, done) }) it('should throw a 400 if user is found but no password match', (done) => { alice.post('/login/password') - .type('form') - .send({ username: 'alice' }) - .send({ password: 'wrongpassword' }) - .expect(400, done) + .type('form') + .send({ username: 'alice' }) + .send({ password: 'wrongpassword' }) + .expect(400, done) }) }) describe('Browser login workflow', () => { it('401 Unauthorized asking the user to log in', (done) => { bob.get('/shared-with-alice.txt') - .end((err, { status, text }) => { - expect(status).to.equal(401) - expect(text).to.contain('Log in') - done(err) - }) + .end((err, { status, text }) => { + expect(status).to.equal(401) + expect(text).to.contain('Log in') + done(err) + }) }) }) @@ -491,12 +491,12 @@ describe('Authentication API (OIDC)', () => { aliceUserStore.initCollections() return aliceUserStore.createUser(aliceAccount, alicePassword) - .then(() => { - return auth.registerClient(aliceServerUri, appOptions) - }) - .then(registeredClient => { - auth.currentClient = registeredClient - }) + .then(() => { + return auth.registerClient(aliceServerUri, appOptions) + }) + .then(registeredClient => { + auth.currentClient = registeredClient + }) }) after(() => { @@ -524,11 +524,11 @@ describe('Authentication API (OIDC)', () => { // an authorization uri for that provider it('should determine the authorization uri for a preferred provider', () => { return auth.currentClient.createRequest({}, auth.store) - .then(authUri => { - authorizationUri = authUri + .then(authUri => { + authorizationUri = authUri - expect(authUri.startsWith(aliceServerUri + '/authorize')).to.be.true() - }) + expect(authUri.startsWith(aliceServerUri + '/authorize')).to.be.true() + }) }) // Step 3: App redirects user to the authorization uri for login @@ -608,28 +608,28 @@ describe('Authentication API (OIDC)', () => { let protectedResourcePath = bobServerUri + '/shared-with-alice.txt' return auth.initUserFromResponse(auth.currentClient) - .then(webId => { - expect(webId).to.equal(aliceWebId) - - return auth.issuePoPTokenFor(bobServerUri, auth.session) - }) - .then(popToken => { - bearerToken = popToken - - return fetch(protectedResourcePath, { - headers: { - 'Authorization': 'Bearer ' + bearerToken - } - }) - }) - .then(res => { - expect(res.status).to.equal(200) - - return res.text() - }) - .then(contents => { - expect(contents).to.equal('protected contents\n') - }) + .then(webId => { + expect(webId).to.equal(aliceWebId) + + return auth.issuePoPTokenFor(bobServerUri, auth.session) + }) + .then(popToken => { + bearerToken = popToken + + return fetch(protectedResourcePath, { + headers: { + 'Authorization': 'Bearer ' + bearerToken + } + }) + }) + .then(res => { + expect(res.status).to.equal(200) + + return res.text() + }) + .then(contents => { + expect(contents).to.equal('protected contents\n') + }) }) it('should not be able to reuse the bearer token for bob server on another server', () => { @@ -651,7 +651,7 @@ describe('Authentication API (OIDC)', () => { describe('Post-logout page (GET /goodbye)', () => { it('should load the post-logout page', () => { return alice.get('/goodbye') - .expect(200) + .expect(200) }) }) }) From 4fd4f90ee07ebe70381549b6f3314fb811e2ca2b Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Thu, 7 Mar 2019 19:59:50 +0100 Subject: [PATCH 35/60] Revert "Trying to make tests less dependent on order" This reverts commit 06c5b192d06dda8653e0840bd81862c862f06695. --- test/integration/acl-oidc-test.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/test/integration/acl-oidc-test.js b/test/integration/acl-oidc-test.js index 4c723141f..80fa600e4 100644 --- a/test/integration/acl-oidc-test.js +++ b/test/integration/acl-oidc-test.js @@ -251,11 +251,11 @@ describe('ACL with WebID+OIDC over HTTP', function () { }) describe('Origin', function () { - let _error, _response - - before(function (done) { + before(function () { rm('/accounts-acl/tim.localhost/origin/test-folder/.acl') + }) + it('should PUT new ACL file', function (done) { var options = createOptions('/origin/test-folder/.acl', 'user1', 'text/turtle') options.body = '<#Owner> a ;\n' + ' ;\n' + @@ -274,15 +274,13 @@ describe('ACL with WebID+OIDC over HTTP', function () { ' <' + origin1 + '>;\n' + ' .\n' request.put(options, function (error, response, body) { - _error = error - _response = response + assert.equal(error, null) + assert.equal(response.statusCode, 201) done() + // TODO triple header + // TODO user header }) }) - - it('should be no error', () => assert.equal(_error, null)) - it('should return 200', () => assert.equal(_response.statusCode, 201)) - it('user1 should be able to access test directory', function (done) { var options = createOptions('/origin/test-folder/', 'user1') options.headers.origin = origin1 From 7b75a0bcfb2d659824b3a3aba5c0166673337dec Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Thu, 7 Mar 2019 20:02:01 +0100 Subject: [PATCH 36/60] Making changes minimal for acl-tls-test.js --- test/integration/acl-tls-test.js | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/test/integration/acl-tls-test.js b/test/integration/acl-tls-test.js index fc418a682..9d1c04e97 100644 --- a/test/integration/acl-tls-test.js +++ b/test/integration/acl-tls-test.js @@ -231,7 +231,7 @@ describe('ACL with WebID+TLS', function () { done() }) }) - it('should create test file\'s acl file', function (done) { + it("should create test file's acl file", function (done) { var options = createOptions('/acl-tls/write-acl/test-file.acl', 'user1') options.headers = { 'content-type': 'text/turtle' @@ -243,7 +243,7 @@ describe('ACL with WebID+TLS', function () { done() }) }) - it('should not access test file\'s acl file', function (done) { + it("should not access test file's acl file", function (done) { var options = createOptions('/acl-tls/write-acl/test-file.acl', 'user1') options.headers = { accept: 'text/turtle' @@ -267,10 +267,12 @@ describe('ACL with WebID+TLS', function () { }) describe('Origin', function () { - before(function (done) { + before(function () { rm('acl-tls/origin/test-folder/.acl') + }) - const options = createOptions('/acl-tls/origin/test-folder/.acl', 'user1', 'text/turtle') + it('should PUT new ACL file', function (done) { + var options = createOptions('/acl-tls/origin/test-folder/.acl', 'user1', 'text/turtle') options.headers = { 'content-type': 'text/turtle' } @@ -292,7 +294,6 @@ describe('ACL with WebID+TLS', function () { // TODO user header }) }) - it('user1 should be able to access test directory', function (done) { var options = createOptions('/acl-tls/origin/test-folder/', 'user1') options.headers.origin = origin1 @@ -364,9 +365,11 @@ describe('ACL with WebID+TLS', function () { }) describe('Mixed statement Origin', function () { - before(function (done) { + before(function () { rm('acl-tls/origin/test-folder/.acl') + }) + it('should PUT new ACL file', function (done) { var options = createOptions('/acl-tls/origin/test-folder/.acl', 'user1', 'text/turtle') options.headers = { 'content-type': 'text/turtle' @@ -392,7 +395,6 @@ describe('ACL with WebID+TLS', function () { // TODO user header }) }) - it('user1 should be able to access test directory', function (done) { var options = createOptions('/acl-tls/origin/test-folder/', 'user1') options.headers.origin = origin1 @@ -580,7 +582,7 @@ describe('ACL with WebID+TLS', function () { describe('Append-only', function () { // var body = fs.readFileSync(__dirname + '/resources/acl-tls/append-acl/abc.ttl.acl') - it('user1 should be able to access test file\'s ACL file', function (done) { + it("user1 should be able to access test file's ACL file", function (done) { var options = createOptions('/acl-tls/append-acl/abc.ttl.acl', 'user1') request.head(options, function (error, response) { assert.equal(error, null) @@ -621,7 +623,7 @@ describe('ACL with WebID+TLS', function () { done() }) }) - it('user2 should not be able to access test file\'s ACL file', function (done) { + it("user2 should not be able to access test file's ACL file", function (done) { var options = createOptions('/acl-tls/append-acl/abc.ttl.acl', 'user2') request.head(options, function (error, response, body) { assert.equal(error, null) @@ -683,7 +685,7 @@ describe('ACL with WebID+TLS', function () { ' <./abc2.ttl>;\n' + ' <' + user2 + '>;\n' + ' , .\n' - it('user1 should be able to modify test file\'s ACL file', function (done) { + it("user1 should be able to modify test file's ACL file", function (done) { var options = createOptions('/acl-tls/append-acl/abc2.ttl.acl', 'user1') options.headers = { 'content-type': 'text/turtle' @@ -695,7 +697,7 @@ describe('ACL with WebID+TLS', function () { done() }) }) - it('user1 should be able to access test file\'s ACL file', function (done) { + it("user1 should be able to access test file's ACL file", function (done) { var options = createOptions('/acl-tls/append-acl/abc2.ttl.acl', 'user1') request.head(options, function (error, response, body) { assert.equal(error, null) @@ -731,7 +733,7 @@ describe('ACL with WebID+TLS', function () { done() }) }) - it('user2 should not be able to access test file\'s ACL file', function (done) { + it("user2 should not be able to access test file's ACL file", function (done) { var options = createOptions('/acl-tls/append-acl/abc2.ttl.acl', 'user2') request.head(options, function (error, response, body) { assert.equal(error, null) @@ -789,7 +791,7 @@ describe('ACL with WebID+TLS', function () { ' <./>;\n' + ' ;\n' + ' .\n' - it('user1 should be able to modify test directory\'s ACL file', function (done) { + it("user1 should be able to modify test directory's ACL file", function (done) { var options = createOptions('/acl-tls/write-acl/default-for-new/.acl', 'user1') options.headers = { 'content-type': 'text/turtle' @@ -801,7 +803,7 @@ describe('ACL with WebID+TLS', function () { done() }) }) - it('user1 should be able to access test direcotory\'s ACL file', function (done) { + it("user1 should be able to access test direcotory's ACL file", function (done) { var options = createOptions('/acl-tls/write-acl/default-for-new/.acl', 'user1') request.head(options, function (error, response, body) { assert.equal(error, null) @@ -829,7 +831,7 @@ describe('ACL with WebID+TLS', function () { done() }) }) - it('user2 should not be able to access test direcotory\'s ACL file', function (done) { + it("user2 should not be able to access test direcotory's ACL file", function (done) { var options = createOptions('/acl-tls/write-acl/default-for-new/.acl', 'user2') request.head(options, function (error, response, body) { assert.equal(error, null) From e4cf1e2569e686d74bef5e2a3fb6b0bfa03151bf Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Thu, 7 Mar 2019 20:08:33 +0100 Subject: [PATCH 37/60] Reverting changes to solid-host Trying to limit the number of changes --- lib/models/solid-host.js | 6 +++++- test/integration/acl-tls-test.js | 6 +++--- test/integration/authentication-oidc-test.js | 2 +- test/unit/solid-host-test.js | 4 ++++ 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/models/solid-host.js b/lib/models/solid-host.js index 8d1069ad7..51dde215d 100644 --- a/lib/models/solid-host.js +++ b/lib/models/solid-host.js @@ -77,7 +77,11 @@ class SolidHost { const serverHost = getHostName(this.serverUri) if (originHost === serverHost) return true if (originHost.endsWith('.' + serverHost)) return true - return !!trustedOrigins.includes(origin) + // Allow the user's own domain + const userHost = getHostName(userId) + if (originHost === userHost) return true + if (trustedOrigins.includes(origin)) return true + return false } /** diff --git a/test/integration/acl-tls-test.js b/test/integration/acl-tls-test.js index 9d1c04e97..c2103f669 100644 --- a/test/integration/acl-tls-test.js +++ b/test/integration/acl-tls-test.js @@ -379,9 +379,9 @@ describe('ACL with WebID+TLS', function () { ' <' + user1 + '>;\n' + ' , , .\n' + '<#Owner2> a ;\n' + - ' ;\n' + - ' <' + origin1 + '>;\n' + - ' , , .\n' + + ' ;\n' + + ' <' + origin1 + '>;\n' + + ' , , .\n' + '<#Public> a ;\n' + ' <./>;\n' + ' ;\n' + diff --git a/test/integration/authentication-oidc-test.js b/test/integration/authentication-oidc-test.js index 6f45100ba..2115b4ac1 100644 --- a/test/integration/authentication-oidc-test.js +++ b/test/integration/authentication-oidc-test.js @@ -387,7 +387,7 @@ describe('Authentication API (OIDC)', () => { describe('with that cookie and a non-matching origin', () => { let response before(done => { - alice.get('/private-for-alice.txt') + alice.get('/private-for-owner.txt') .set('Cookie', cookie) .set('Origin', bobServerUri) .end((err, res) => { diff --git a/test/unit/solid-host-test.js b/test/unit/solid-host-test.js index 21bc505e7..be7821bbc 100644 --- a/test/unit/solid-host-test.js +++ b/test/unit/solid-host-test.js @@ -58,6 +58,10 @@ describe('SolidHost', () => { expect(host.allowsSessionFor('https://user.own/profile/card#me', '', [])).to.be.true }) + it('should allow a userId with the user subdomain as origin', () => { + expect(host.allowsSessionFor('https://user.own/profile/card#me', 'https://user.own', [])).to.be.true + }) + it('should allow a userId with the server domain as origin', () => { expect(host.allowsSessionFor('https://user.own/profile/card#me', 'https://test.local', [])).to.be.true }) From 872014fbf2e748121c27d9f016610cc4bee150ed Mon Sep 17 00:00:00 2001 From: Kjetil Kjernsmo Date: Fri, 8 Mar 2019 11:07:38 +0100 Subject: [PATCH 38/60] Auto-fix vulnerable deps --- package-lock.json | 1459 +++++++++++++++++++++++++++++---------------- package.json | 4 +- 2 files changed, 942 insertions(+), 521 deletions(-) diff --git a/package-lock.json b/package-lock.json index f3161f52c..6346c2c34 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,14 +14,14 @@ } }, "@babel/generator": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.5.tgz", - "integrity": "sha512-IO31r62xfMI+wBJVmgx0JR9ZOHty8HkoYpQAjRWUGG9vykBTlGHdArZ8zoFtpUu2gs17K7qTl/TtPpiSi6t+MA==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.4.tgz", + "integrity": "sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==", "dev": true, "requires": { - "@babel/types": "^7.1.5", + "@babel/types": "^7.3.4", "jsesc": "^2.5.1", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "source-map": "^0.5.0", "trim-right": "^1.0.1" }, @@ -84,9 +84,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -112,9 +112,9 @@ } }, "@babel/parser": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.5.tgz", - "integrity": "sha512-WXKf5K5HT6X0kKiCOezJZFljsfxKV1FpU8Tf1A7ZpGvyd/Q4hlrJm2EwoH2onaUq3O4tLDp+4gk0hHPsMyxmOg==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz", + "integrity": "sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==", "dev": true }, "@babel/runtime": { @@ -126,46 +126,46 @@ } }, "@babel/template": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", - "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", + "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.1.2", - "@babel/types": "^7.1.2" + "@babel/parser": "^7.2.2", + "@babel/types": "^7.2.2" } }, "@babel/traverse": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.5.tgz", - "integrity": "sha512-eU6XokWypl0MVJo+MTSPUtlfPePkrqsF26O+l1qFGlCKWwmiYAYy2Sy44Qw8m2u/LbPCsxYt90rghmqhYMGpPA==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.3.4.tgz", + "integrity": "sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.1.5", + "@babel/generator": "^7.3.4", "@babel/helper-function-name": "^7.1.0", "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.1.5", - "@babel/types": "^7.1.5", - "debug": "^3.1.0", + "@babel/parser": "^7.3.4", + "@babel/types": "^7.3.4", + "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.10" + "lodash": "^4.17.11" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" } }, "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", "dev": true }, "ms": { @@ -177,13 +177,13 @@ } }, "@babel/types": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.5.tgz", - "integrity": "sha512-sJeqa/d9eM/bax8Ivg+fXF7FpN3E/ZmTrWbkk6r+g7biVYfALMnLin4dKijsaqEhpd2xvOGfQTkQkD31YCVV4A==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", + "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", "dev": true, "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "to-fast-properties": "^2.0.0" }, "dependencies": { @@ -195,6 +195,24 @@ } } }, + "@snyk/dep-graph": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@snyk/dep-graph/-/dep-graph-1.4.0.tgz", + "integrity": "sha512-dz4Fo4L9sN0Rt8hMe+zMYZ4mAiljtyIeWvujLyCxhIT5iHSlceUYlba5TDsOFuKyuZKkuhVjORWY1oFEuRzCcA==", + "dev": true, + "requires": { + "graphlib": "^2.1.5", + "lodash": "^4", + "source-map-support": "^0.5.9", + "tslib": "^1.9.3" + } + }, + "@snyk/gemfile": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@snyk/gemfile/-/gemfile-1.2.0.tgz", + "integrity": "sha512-nI7ELxukf7pT4/VraL4iabtNNMz8mUo7EXlqCFld8O5z6mIMLX9llps24iPpaIZOwArkY3FWA+4t+ixyvtTSIA==", + "dev": true + }, "@solid/better-simple-slideshow": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@solid/better-simple-slideshow/-/better-simple-slideshow-0.1.0.tgz", @@ -442,6 +460,48 @@ "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", "dev": true }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "ansi-escapes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", @@ -599,9 +659,9 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, "ast-types": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.6.tgz", - "integrity": "sha512-nHiuV14upVGl7MWwFUYbzJ6YlfwWS084CU9EA8HajfYQjMSli5TQi3UTRygGF58LFWVkXxS1rbgRhROEqlQkXg==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.12.2.tgz", + "integrity": "sha512-8c83xDLJM/dLDyXNLiR6afRRm4dPKN6KAnKqytRK3DBJul9lA+atxdQkNDkSVPdTqea5HiRq3lnnOIZ0MBpvdg==", "dev": true }, "async": { @@ -1442,6 +1502,89 @@ "resolved": "http://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=" }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1770,6 +1913,12 @@ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000907.tgz", "integrity": "sha512-No5sQ/OB2Nmka8MNOOM6nJx+Hxt6MQ6h7t7kgJFu9oTuwjykyKRSBP/+i/QAyFHxeHB+ddE0Da1CG5ihx9oehQ==" }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1819,6 +1968,12 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -1855,6 +2010,12 @@ } } }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, "cli-cursor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", @@ -2127,6 +2288,15 @@ "elliptic": "^6.0.0" } }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -2275,6 +2445,12 @@ "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", "dev": true }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -2462,6 +2638,15 @@ "integrity": "sha1-eEleYZY19/5EIZqkyDeEm/GDFC4=", "dev": true }, + "dockerfile-ast": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/dockerfile-ast/-/dockerfile-ast-0.0.12.tgz", + "integrity": "sha512-cIV8oXkAxpIuN5XgG0TGg07nLDgrj4olkfrdT77OTA3VypscsYHBUg/FjHxW9K3oA+CyH4Th/qtoMgTVpzSobw==", + "dev": true, + "requires": { + "vscode-languageserver-types": "^3.5.0" + } + }, "doctrine": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", @@ -2531,6 +2716,12 @@ } } }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -2635,9 +2826,9 @@ }, "dependencies": { "es6-promise": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", - "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", + "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==", "dev": true } } @@ -2688,9 +2879,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", - "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", "dev": true, "requires": { "esprima": "^3.1.3", @@ -2914,6 +3105,21 @@ "safe-buffer": "^5.1.1" } }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, "exit-hook": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", @@ -3451,6 +3657,12 @@ "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", "dev": true }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, "get-uri": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.2.tgz", @@ -3523,6 +3735,15 @@ "path-is-absolute": "^1.0.0" } }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, "global-tunnel-ng": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.6.0.tgz", @@ -3561,18 +3782,37 @@ } } }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "graphlib": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.5.tgz", - "integrity": "sha512-XvtbqCcw+EM5SqQrIetIKKD+uZVNQtDPD1goIg7K73RuRZtVI5rYMdcCVSHm/AS1sCBZ7vt0p5WgXouucHQaOA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.7.tgz", + "integrity": "sha512-TyI9jIy2J4j0qgPmOOrHTCtpPqJGN/aurBwc6ZT+bRii+di1I+Wv3obRhVrmBEXet+qkMaEX67dXrwsd3QQM6w==", "dev": true, "requires": { - "lodash": "^4.11.1" + "lodash": "^4.17.5" } }, "growl": { @@ -3677,23 +3917,6 @@ } } }, - "hasbin": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/hasbin/-/hasbin-1.2.3.tgz", - "integrity": "sha1-eMWSaJPIAhXCtWiuH9P8q3omlrA=", - "dev": true, - "requires": { - "async": "~1.5" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, "hash-base": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", @@ -3869,6 +4092,12 @@ "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", "dev": true }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -4012,6 +4241,15 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -4073,6 +4311,16 @@ "is-extglob": "^2.1.1" } }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, "is-ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", @@ -4100,6 +4348,12 @@ "xtend": "^4.0.0" } }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -4167,12 +4421,24 @@ "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", "dev": true }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -4236,15 +4502,15 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", "dev": true }, "istanbul-lib-instrument": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz", - "integrity": "sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", + "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", "dev": true, "requires": { "@babel/generator": "^7.0.0", @@ -4252,7 +4518,7 @@ "@babel/template": "^7.0.0", "@babel/traverse": "^7.0.0", "@babel/types": "^7.0.0", - "istanbul-lib-coverage": "^2.0.1", + "istanbul-lib-coverage": "^2.0.3", "semver": "^5.5.0" } }, @@ -4378,55 +4644,46 @@ "dev": true }, "jszip": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", - "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.0.tgz", + "integrity": "sha512-4WjbsaEtBK/DHeDZOPiPw5nzSGLDEDDreFRDEgnoMwmknPjTqa+23XuYFk6NiGbeiAeZCctiQ/X/z0lQBmDVOQ==", "dev": true, "requires": { - "core-js": "~2.3.0", - "es6-promise": "~3.0.2", - "lie": "~3.1.0", + "lie": "~3.3.0", "pako": "~1.0.2", - "readable-stream": "~2.0.6" + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" }, "dependencies": { - "core-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", - "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", - "dev": true - }, - "es6-promise": { - "version": "3.0.2", - "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, "readable-stream": { - "version": "2.0.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } } } }, @@ -4460,6 +4717,15 @@ } } }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, "lazy-cache": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", @@ -4491,9 +4757,9 @@ "integrity": "sha1-IsWbyu+qmo7zWc91l4TkvxBq6hs=" }, "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, "requires": { "immediate": "~3.0.5" @@ -4576,10 +4842,16 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -4587,9 +4859,9 @@ } }, "macos-release": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-1.1.0.tgz", - "integrity": "sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.0.0.tgz", + "integrity": "sha512-iCM3ZGeqIzlrH7KxYK+fphlJpCCczyHXc+HhRVbEu9uNTCrzYJjvvtefzeKTCVHd5AP/aD/fzC80JZ4ZP+dQ/A==", "dev": true }, "make-dir": { @@ -4883,7 +5155,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -5123,60 +5395,52 @@ "pify": "^3.0.0" } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "nyc": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.1.0.tgz", - "integrity": "sha512-3GyY6TpQ58z9Frpv4GMExE1SV2tAgYqC7HSy2omEhNiCT3mhT9NyiOvIE8zkbuJVFzmvvNTnE4h/7/wQae7xLg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.3.0.tgz", + "integrity": "sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w==", "dev": true, "requires": { "archy": "^1.0.0", "arrify": "^1.0.1", - "caching-transform": "^2.0.0", + "caching-transform": "^3.0.1", "convert-source-map": "^1.6.0", - "debug-log": "^1.0.1", "find-cache-dir": "^2.0.0", "find-up": "^3.0.0", "foreground-child": "^1.5.6", "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.1", - "istanbul-lib-hook": "^2.0.1", - "istanbul-lib-instrument": "^3.0.0", - "istanbul-lib-report": "^2.0.2", - "istanbul-lib-source-maps": "^2.0.1", - "istanbul-reports": "^2.0.1", + "istanbul-lib-coverage": "^2.0.3", + "istanbul-lib-hook": "^2.0.3", + "istanbul-lib-instrument": "^3.1.0", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.2", + "istanbul-reports": "^2.1.1", "make-dir": "^1.3.0", "merge-source-map": "^1.1.0", "resolve-from": "^4.0.0", - "rimraf": "^2.6.2", + "rimraf": "^2.6.3", "signal-exit": "^3.0.2", "spawn-wrap": "^1.4.2", - "test-exclude": "^5.0.0", + "test-exclude": "^5.1.0", "uuid": "^3.3.2", - "yargs": "11.1.0", - "yargs-parser": "^9.0.2" + "yargs": "^12.0.5", + "yargs-parser": "^11.1.1" }, "dependencies": { - "align-text": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "amdefine": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, "ansi-regex": { "version": "3.0.0", "bundled": true, @@ -5201,9 +5465,12 @@ "dev": true }, "async": { - "version": "1.5.2", + "version": "2.6.2", "bundled": true, - "dev": true + "dev": true, + "requires": { + "lodash": "^4.17.11" + } }, "balanced-match": { "version": "1.0.0", @@ -5219,55 +5486,30 @@ "concat-map": "0.0.1" } }, - "builtin-modules": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, "caching-transform": { - "version": "2.0.0", + "version": "3.0.1", "bundled": true, "dev": true, "requires": { - "make-dir": "^1.0.0", - "md5-hex": "^2.0.0", - "package-hash": "^2.0.0", - "write-file-atomic": "^2.0.0" + "hasha": "^3.0.0", + "make-dir": "^1.3.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.3.0" } }, "camelcase": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true - }, - "center-align": { - "version": "0.1.3", + "version": "5.0.0", "bundled": true, - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } + "dev": true }, "cliui": { - "version": "2.1.0", + "version": "4.1.0", "bundled": true, "dev": true, - "optional": true, "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "bundled": true, - "dev": true, - "optional": true - } + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" } }, "code-point-at": { @@ -5275,6 +5517,12 @@ "bundled": true, "dev": true }, + "commander": { + "version": "2.17.1", + "bundled": true, + "dev": true, + "optional": true + }, "commondir": { "version": "1.0.1", "bundled": true, @@ -5303,18 +5551,13 @@ } }, "debug": { - "version": "3.1.0", + "version": "4.1.1", "bundled": true, "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "debug-log": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, "decamelize": { "version": "1.2.0", "bundled": true, @@ -5328,6 +5571,14 @@ "strip-bom": "^3.0.0" } }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, "error-ex": { "version": "1.3.2", "bundled": true, @@ -5342,12 +5593,12 @@ "dev": true }, "execa": { - "version": "0.7.0", + "version": "1.0.0", "bundled": true, "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", @@ -5356,11 +5607,13 @@ }, "dependencies": { "cross-spawn": { - "version": "5.1.0", + "version": "6.0.5", "bundled": true, "dev": true, "requires": { - "lru-cache": "^4.0.1", + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } @@ -5405,9 +5658,12 @@ "dev": true }, "get-stream": { - "version": "3.0.0", + "version": "4.1.0", "bundled": true, - "dev": true + "dev": true, + "requires": { + "pump": "^3.0.0" + } }, "glob": { "version": "7.1.3", @@ -5423,28 +5679,25 @@ } }, "graceful-fs": { - "version": "4.1.11", + "version": "4.1.15", "bundled": true, "dev": true }, "handlebars": { - "version": "4.0.11", + "version": "4.1.0", "bundled": true, "dev": true, "requires": { - "async": "^1.4.0", + "async": "^2.5.0", "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" }, "dependencies": { "source-map": { - "version": "0.4.4", + "version": "0.6.1", "bundled": true, - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } + "dev": true } } }, @@ -5453,6 +5706,14 @@ "bundled": true, "dev": true }, + "hasha": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-stream": "^1.0.1" + } + }, "hosted-git-info": { "version": "2.7.1", "bundled": true, @@ -5478,7 +5739,7 @@ "dev": true }, "invert-kv": { - "version": "1.0.0", + "version": "2.0.0", "bundled": true, "dev": true }, @@ -5487,20 +5748,6 @@ "bundled": true, "dev": true }, - "is-buffer": { - "version": "1.1.6", - "bundled": true, - "dev": true, - "optional": true - }, - "is-builtin-module": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, "is-fullwidth-code-point": { "version": "2.0.0", "bundled": true, @@ -5517,12 +5764,12 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "2.0.1", + "version": "2.0.3", "bundled": true, "dev": true }, "istanbul-lib-hook": { - "version": "2.0.1", + "version": "2.0.3", "bundled": true, "dev": true, "requires": { @@ -5530,22 +5777,32 @@ } }, "istanbul-lib-report": { - "version": "2.0.2", + "version": "2.0.4", "bundled": true, "dev": true, "requires": { - "istanbul-lib-coverage": "^2.0.1", + "istanbul-lib-coverage": "^2.0.3", "make-dir": "^1.3.0", - "supports-color": "^5.4.0" + "supports-color": "^6.0.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "istanbul-lib-source-maps": { - "version": "2.0.1", + "version": "3.0.2", "bundled": true, "dev": true, "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^2.0.1", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.3", "make-dir": "^1.3.0", "rimraf": "^2.6.2", "source-map": "^0.6.1" @@ -5559,11 +5816,11 @@ } }, "istanbul-reports": { - "version": "2.0.1", + "version": "2.1.1", "bundled": true, "dev": true, "requires": { - "handlebars": "^4.0.11" + "handlebars": "^4.1.0" } }, "json-parse-better-errors": { @@ -5571,27 +5828,12 @@ "bundled": true, "dev": true }, - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "1.0.4", - "bundled": true, - "dev": true, - "optional": true - }, "lcid": { - "version": "1.0.0", + "version": "2.0.0", "bundled": true, "dev": true, "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "^2.0.0" } }, "load-json-file": { @@ -5614,19 +5856,18 @@ "path-exists": "^3.0.0" } }, - "lodash.flattendeep": { - "version": "4.4.0", + "lodash": { + "version": "4.17.11", "bundled": true, "dev": true }, - "longest": { - "version": "1.0.1", + "lodash.flattendeep": { + "version": "4.4.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "lru-cache": { - "version": "4.1.3", + "version": "4.1.5", "bundled": true, "dev": true, "requires": { @@ -5642,25 +5883,22 @@ "pify": "^3.0.0" } }, - "md5-hex": { - "version": "2.0.0", + "map-age-cleaner": { + "version": "0.1.3", "bundled": true, "dev": true, "requires": { - "md5-o-matic": "^0.1.1" + "p-defer": "^1.0.0" } }, - "md5-o-matic": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, "mem": { - "version": "1.1.0", + "version": "4.1.0", "bundled": true, "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^2.0.0" } }, "merge-source-map": { @@ -5712,17 +5950,22 @@ } }, "ms": { - "version": "2.0.0", + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "nice-try": { + "version": "1.0.5", "bundled": true, "dev": true }, "normalize-package-data": { - "version": "2.4.0", + "version": "2.5.0", "bundled": true, "dev": true, "requires": { "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", + "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } @@ -5763,23 +6006,33 @@ "dev": true }, "os-locale": { - "version": "2.1.0", + "version": "3.1.0", "bundled": true, "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, + "p-defer": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, "p-finally": { "version": "1.0.0", "bundled": true, "dev": true }, - "p-limit": { + "p-is-promise": { "version": "2.0.0", "bundled": true, + "dev": true + }, + "p-limit": { + "version": "2.1.0", + "bundled": true, "dev": true, "requires": { "p-try": "^2.0.0" @@ -5799,13 +6052,13 @@ "dev": true }, "package-hash": { - "version": "2.0.0", + "version": "3.0.0", "bundled": true, "dev": true, "requires": { - "graceful-fs": "^4.1.11", + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", "lodash.flattendeep": "^4.4.0", - "md5-hex": "^2.0.0", "release-zalgo": "^1.0.0" } }, @@ -5833,6 +6086,11 @@ "bundled": true, "dev": true }, + "path-parse": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, "path-type": { "version": "3.0.0", "bundled": true, @@ -5859,6 +6117,15 @@ "bundled": true, "dev": true }, + "pump": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "read-pkg": { "version": "3.0.0", "bundled": true, @@ -5886,12 +6153,6 @@ "es6-error": "^4.0.1" } }, - "repeat-string": { - "version": "1.6.1", - "bundled": true, - "dev": true, - "optional": true - }, "require-directory": { "version": "2.1.1", "bundled": true, @@ -5902,26 +6163,25 @@ "bundled": true, "dev": true }, - "resolve-from": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "right-align": { - "version": "0.1.3", + "resolve": { + "version": "1.10.0", "bundled": true, "dev": true, - "optional": true, "requires": { - "align-text": "^0.1.1" + "path-parse": "^1.0.6" } }, + "resolve-from": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, "rimraf": { - "version": "2.6.2", + "version": "2.6.3", "bundled": true, "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { @@ -5930,7 +6190,7 @@ "dev": true }, "semver": { - "version": "5.5.0", + "version": "5.6.0", "bundled": true, "dev": true }, @@ -5957,12 +6217,6 @@ "bundled": true, "dev": true }, - "source-map": { - "version": "0.5.7", - "bundled": true, - "dev": true, - "optional": true - }, "spawn-wrap": { "version": "1.4.2", "bundled": true, @@ -5977,7 +6231,7 @@ } }, "spdx-correct": { - "version": "3.0.0", + "version": "3.1.0", "bundled": true, "dev": true, "requires": { @@ -5986,7 +6240,7 @@ } }, "spdx-exceptions": { - "version": "2.1.0", + "version": "2.2.0", "bundled": true, "dev": true }, @@ -6000,7 +6254,7 @@ } }, "spdx-license-ids": { - "version": "3.0.0", + "version": "3.0.3", "bundled": true, "dev": true }, @@ -6031,16 +6285,8 @@ "bundled": true, "dev": true }, - "supports-color": { - "version": "5.4.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, "test-exclude": { - "version": "5.0.0", + "version": "5.1.0", "bundled": true, "dev": true, "requires": { @@ -6051,43 +6297,30 @@ } }, "uglify-js": { - "version": "2.8.29", + "version": "3.4.9", "bundled": true, "dev": true, "optional": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "commander": "~2.17.1", + "source-map": "~0.6.1" }, "dependencies": { - "yargs": { - "version": "3.10.0", + "source-map": { + "version": "0.6.1", "bundled": true, "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } + "optional": true } } }, - "uglify-to-browserify": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, "uuid": { "version": "3.3.2", "bundled": true, "dev": true }, "validate-npm-package-license": { - "version": "3.0.3", + "version": "3.0.4", "bundled": true, "dev": true, "requires": { @@ -6108,12 +6341,6 @@ "bundled": true, "dev": true }, - "window-size": { - "version": "0.1.0", - "bundled": true, - "dev": true, - "optional": true - }, "wordwrap": { "version": "0.0.3", "bundled": true, @@ -6167,7 +6394,7 @@ "dev": true }, "write-file-atomic": { - "version": "2.3.0", + "version": "2.4.2", "bundled": true, "dev": true, "requires": { @@ -6177,7 +6404,7 @@ } }, "y18n": { - "version": "3.2.1", + "version": "4.0.0", "bundled": true, "dev": true }, @@ -6187,87 +6414,31 @@ "dev": true }, "yargs": { - "version": "11.1.0", + "version": "12.0.5", "bundled": true, "dev": true, "requires": { "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", + "os-locale": "^3.0.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", "string-width": "^2.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - }, - "dependencies": { - "cliui": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "bundled": true, - "dev": true - } + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" } }, "yargs-parser": { - "version": "9.0.2", + "version": "11.1.1", "bundled": true, "dev": true, "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "bundled": true, - "dev": true - } + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -6443,13 +6614,13 @@ } }, "os-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-2.0.1.tgz", - "integrity": "sha1-uaOGNhwXrjohc27wWZQFyajF3F4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.0.0.tgz", + "integrity": "sha512-7c74tib2FsdFbQ3W+qj8Tyd1R3Z6tuVRNNxXjJcZ4NgjIEQU9N/prVMqcW29XZPXGACqaXN3jq58/6hoaoXH6g==", "dev": true, "requires": { - "macos-release": "^1.0.0", - "win-release": "^1.0.0" + "macos-release": "^2.0.0", + "windows-release": "^3.1.0" } }, "os-shim": { @@ -6467,6 +6638,12 @@ "resolved": "https://registry.npmjs.org/owasp-password-strength-test/-/owasp-password-strength-test-1.3.0.tgz", "integrity": "sha1-T2KeQpA+j20nmyMNZXq2HljkSxI=" }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, "pac-proxy-agent": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", @@ -6513,6 +6690,18 @@ "thunkify": "^2.1.2" } }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", @@ -6548,16 +6737,6 @@ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "dev": true, - "requires": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, "path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", @@ -6700,6 +6879,12 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -6880,6 +7065,32 @@ } } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, "rdf-ns": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/rdf-ns/-/rdf-ns-0.1.0.tgz", @@ -7032,6 +7243,25 @@ "regjsparser": "^0.1.4" } }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, "regjsgen": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", @@ -7221,6 +7451,15 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", @@ -7259,6 +7498,12 @@ "send": "0.16.2" } }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", @@ -7523,53 +7768,56 @@ } }, "snyk": { - "version": "1.108.2", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.108.2.tgz", - "integrity": "sha512-VfSHSRj4ISWf4EfySTdAVqUWnDspoFUaGs4uGp7FIbjZb35+JPaQ/hqgWKcDal+ZwTtzQvxKAdPsB3WUCBoSKg==", + "version": "1.136.1", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.136.1.tgz", + "integrity": "sha512-BhUH2xUvhFR0rzHX2Zf6Eh3JiUgSt8YmLSTUSHKLkUDqyKHyXvig4cItgj/VN0v0K5XLNzzOn2+RjI/zCiAaIQ==", "dev": true, "requires": { + "@snyk/dep-graph": "1.4.0", + "@snyk/gemfile": "1.2.0", "abbrev": "^1.1.1", "ansi-escapes": "^3.1.0", "chalk": "^2.4.1", "configstore": "^3.1.2", "debug": "^3.1.0", - "hasbin": "^1.2.3", + "diff": "^4.0.1", + "get-uri": "2.0.2", "inquirer": "^3.0.0", - "lodash": "^4.17.5", + "lodash": "^4.17.11", "needle": "^2.2.4", - "opn": "^5.2.0", - "os-name": "^2.0.1", - "proxy-agent": "^2.0.0", + "opn": "^5.4.0", + "os-name": "^3.0.0", + "proxy-agent": "2.3.1", "proxy-from-env": "^1.0.0", "recursive-readdir": "^2.2.2", - "semver": "^5.5.0", - "snyk-config": "2.2.0", - "snyk-docker-plugin": "1.12.2", - "snyk-go-plugin": "1.6.0", - "snyk-gradle-plugin": "2.1.1", + "semver": "^5.6.0", + "snyk-config": "2.2.1", + "snyk-docker-plugin": "1.22.0", + "snyk-go-plugin": "1.6.1", + "snyk-gradle-plugin": "2.1.4", "snyk-module": "1.9.1", - "snyk-mvn-plugin": "2.0.0", - "snyk-nodejs-lockfile-parser": "1.7.0", - "snyk-nuget-plugin": "1.6.5", - "snyk-php-plugin": "1.5.1", - "snyk-policy": "1.13.1", - "snyk-python-plugin": "1.9.0", + "snyk-mvn-plugin": "2.0.1", + "snyk-nodejs-lockfile-parser": "1.11.0", + "snyk-nuget-plugin": "1.7.2", + "snyk-php-plugin": "1.5.2", + "snyk-policy": "1.13.3", + "snyk-python-plugin": "1.9.1", "snyk-resolve": "1.0.1", "snyk-resolve-deps": "4.0.2", - "snyk-sbt-plugin": "2.0.0", + "snyk-sbt-plugin": "2.0.1", "snyk-tree": "^1.0.0", "snyk-try-require": "1.3.1", - "source-map-support": "^0.5.9", + "source-map-support": "^0.5.10", "tempfile": "^2.0.0", "then-fs": "^2.0.0", - "undefsafe": "^2.0.0", - "uuid": "^3.2.1" + "update-notifier": "^2.5.0", + "uuid": "^3.3.2" }, "dependencies": { "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { @@ -7588,9 +7836,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -7616,9 +7864,15 @@ "ms": "^2.1.1" } }, + "diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "dev": true + }, "external-editor": { "version": "2.2.0", - "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { @@ -7695,6 +7949,12 @@ "signal-exit": "^3.0.2" } }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -7735,13 +7995,13 @@ } }, "snyk-config": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/snyk-config/-/snyk-config-2.2.0.tgz", - "integrity": "sha512-mq0wbP/AgjcmRq5i5jg2akVVV3iSYUPTowZwKn7DChRLDL8ySOzWAwan+ImXiyNbrWo87FNI/15O6MpOnTxOIg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/snyk-config/-/snyk-config-2.2.1.tgz", + "integrity": "sha512-eCsFKHHE4J2DpD/1NzAtCmkmVDK310OXRtmoW0RlLnld1ESprJ5A/QRJ5Zxx1JbA8gjuwERY5vfUFA8lEJeopA==", "dev": true, "requires": { "debug": "^3.1.0", - "lodash": "^4.17.5", + "lodash": "^4.17.11", "nconf": "^0.10.0" }, "dependencies": { @@ -7763,12 +8023,14 @@ } }, "snyk-docker-plugin": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.12.2.tgz", - "integrity": "sha512-8bEn6tDSXPtNS6d1XRM6CSRMwM0bI3N0vRzcKVMZ9E52W9sIpv2E50noYjxcMpoRFxpLWAJ4WMtamcMtLPnNeQ==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.22.0.tgz", + "integrity": "sha512-bykxNtfeWQNFjF6gv8u8w+TOa4fdr+teLm+DkvYlWkdlvaw5m4yywRI5USve4X6S9p4G+Fw4/wfjXx7LgCcxrQ==", "dev": true, "requires": { "debug": "^3", + "dockerfile-ast": "0.0.12", + "semver": "^5.6.0", "tslib": "^1" }, "dependencies": { @@ -7786,13 +8048,19 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true } } }, "snyk-go-plugin": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/snyk-go-plugin/-/snyk-go-plugin-1.6.0.tgz", - "integrity": "sha512-E6aYw7XAXSs2wJR3fU+vGQ1lVyjAw8PHIQYQwBwMkTHByhJIWPcu6Hy/jT5LcjJHlhYXlpOuk53HeLVK+kcXrQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/snyk-go-plugin/-/snyk-go-plugin-1.6.1.tgz", + "integrity": "sha512-hFOMyznfcMzF1HaZP18VmjQSqK/jBOowh0lpJY4UqmaQSZyJury3Ax+44O9oVUJi8lb8A4g7RVbxhlWl6bIqlA==", "dev": true, "requires": { "graphlib": "^2.1.1", @@ -7812,9 +8080,9 @@ } }, "snyk-gradle-plugin": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snyk-gradle-plugin/-/snyk-gradle-plugin-2.1.1.tgz", - "integrity": "sha512-aFeVC5y3XkJ5BxknHhtYo76as3xJbzSQlXACGZrQZGQ/w/UhNdM8VI1QB6Eq4uEzexleB/hcJwYxNmhI2CNCeA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/snyk-gradle-plugin/-/snyk-gradle-plugin-2.1.4.tgz", + "integrity": "sha512-EOG4OEt9KAkMgaiG3IWi1ENkfIehMhQTd/KU+uoNbEJJ9KYk3POcB+7CsRq6kJa2Th/9aMGp+ojm6HOrOkJM4w==", "dev": true, "requires": { "clone-deep": "^0.3.0" @@ -7848,42 +8116,35 @@ } }, "snyk-mvn-plugin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.0.0.tgz", - "integrity": "sha512-9jAhZhv+7YcqtoQYCYlgMoxK+dWBKlk+wkX27Ebg3vNddNop9q5jZitRXTjsXwfSUZHRt+Ptw1f8vei9kjzZVg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.0.1.tgz", + "integrity": "sha512-TBrdcFXHdYuRYFCvpyUeFC+mCi6SOV3vdxgHrP7JRNnJwO8PYaKCObLJyhpRWa8IaHv/8CjJTmnEbWIh7BPHAA==", "dev": true }, "snyk-nodejs-lockfile-parser": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.7.0.tgz", - "integrity": "sha512-57Gnw8o3HQbheb808GRsofnYPaJCbpt7n+zec+C7J/GZE6GJk+WA2u1EPsNQAsfTLQ3rxBwA1Sonhg498T4COA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.11.0.tgz", + "integrity": "sha512-eTdq5VcaHJwGoApejebTChi5hRcIDdNbO6lMwncS0zz9ZxXskoQ0C+VMdep8ELmJa0Gcz6es1sSkABPZs7frrg==", "dev": true, "requires": { "@yarnpkg/lockfile": "^1.0.2", "graphlib": "^2.1.5", - "lodash": "4.17.10", + "lodash": "^4.17.11", "source-map-support": "^0.5.7", "tslib": "^1.9.3", "uuid": "^3.3.2" - }, - "dependencies": { - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - } } }, "snyk-nuget-plugin": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/snyk-nuget-plugin/-/snyk-nuget-plugin-1.6.5.tgz", - "integrity": "sha512-3qIndzkxCxiaGvAwMkqChbChGdwhNePPyfi0WjhC/nJGwecqU3Fb/NeTW7lgyT+xoq/dFnzW0DgBJ4+AyNA2gA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/snyk-nuget-plugin/-/snyk-nuget-plugin-1.7.2.tgz", + "integrity": "sha512-zmYD9veH7OeIqGnZHiGv8c8mKtmYrxo2o7P4lNUkpHdCMMsar7moRJxGgO9WlcIrwAGjIhMdP9fUvJ+jVDEteQ==", "dev": true, "requires": { "debug": "^3.1.0", "jszip": "^3.1.5", "lodash": "^4.17.10", + "snyk-paket-parser": "1.4.3", "xml2js": "^0.4.17" }, "dependencies": { @@ -7904,15 +8165,23 @@ } } }, + "snyk-paket-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/snyk-paket-parser/-/snyk-paket-parser-1.4.3.tgz", + "integrity": "sha512-6m736zGVoeT/zS9KEtlmqTSPEPjAfLe8iYoQ3AwbyxDhzuLY49lTaV67MyZtGwjhi1x4KBe+XOgeWwyf6Avf/A==", + "dev": true, + "requires": { + "tslib": "^1.9.3" + } + }, "snyk-php-plugin": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/snyk-php-plugin/-/snyk-php-plugin-1.5.1.tgz", - "integrity": "sha512-g5QSHBsRJ2O4cNxKC4zlWwnQYiSgQ77Y6QgGmo3ihPX3VLZrc1amaZIpPsNe1jwXirnGj2rvR5Xw+jDjbzvHFw==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/snyk-php-plugin/-/snyk-php-plugin-1.5.2.tgz", + "integrity": "sha512-s/s9s7mslHjLnzin2BNLGdy/s6tNBfJ4/T/d9JBjsjIwdJFaUKY/ciWwBLNaWt2Aqtyr3DiUcqg3j/pwTKhEDg==", "dev": true, "requires": { "debug": "^3.1.0", - "lodash": "^4.17.5", - "path": "0.12.7" + "lodash": "^4.17.5" }, "dependencies": { "debug": { @@ -7933,9 +8202,9 @@ } }, "snyk-policy": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/snyk-policy/-/snyk-policy-1.13.1.tgz", - "integrity": "sha512-l9evS3Yk70xyvajjg+I6Ij7fr7gxpVRMZl0J1xNpWps/IVu4DSGih3aMmXi47VJozr4A/eFyj7R1lIr2GhqJCA==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/snyk-policy/-/snyk-policy-1.13.3.tgz", + "integrity": "sha512-6J2a+Wt9zgvTtCwi4x8rLtkDQzFNPqubfIgs3aR35ZsEXPwI4XHGo0cxnJPDriqncp2JK72vnRpNfIZ7v0L1Mw==", "dev": true, "requires": { "debug": "^3.1.0", @@ -7973,9 +8242,9 @@ } }, "snyk-python-plugin": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-1.9.0.tgz", - "integrity": "sha512-zlyOHoCpmyVym9AwkboeepzEGrY3gHsM7eWP/nJ85TgCnQO5H5orKm3RL57PNbWRY+BnDmoQQ+udQgjym2+3sg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-1.9.1.tgz", + "integrity": "sha512-4R040DBK77NSfSy3rCndmrv85YlLrKZU1ct59oZSoGb1PYdCi8kXRuq50UpSgasp6YR0yJxT22T38hNOAjTtVw==", "dev": true, "requires": { "tmp": "0.0.33" @@ -8060,9 +8329,9 @@ } }, "snyk-sbt-plugin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-2.0.0.tgz", - "integrity": "sha512-bOUqsQ1Lysnwfnvf4QQIBfC0M0ZVuhlshTKd7pNwgAJ41YEPJNrPEpzOePl/HfKtwilEEwHh5YHvjYGegEKx0A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-2.0.1.tgz", + "integrity": "sha512-AsGGMP0W3mlKygXUI5jjt54qWFttZEXT1A40+u21p8rZPXLZprwnd+QH9pZDd04d9W9aofGvON8NJeOn9KS39Q==", "dev": true }, "snyk-tree": { @@ -8258,9 +8527,9 @@ } }, "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -8582,6 +8851,12 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, "strip-json-comments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", @@ -8773,6 +9048,43 @@ "uuid": "^3.0.1" } }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, "text-encoder-lite": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/text-encoder-lite/-/text-encoder-lite-1.0.1.tgz", @@ -8824,7 +9136,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8852,6 +9164,12 @@ "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", "dev": true }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, "timers-browserify": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", @@ -8922,9 +9240,9 @@ } }, "toml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.3.tgz", - "integrity": "sha512-O7L5hhSQHxuufWUdcTRPfuTh3phKfAZ/dqfxZFoxPCj2RYmpaSGLEIs016FCXItQwNr08yefUB5TSjzRYnajTA==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", + "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==", "dev": true }, "tough-cookie": { @@ -9091,15 +9409,6 @@ "xtend": "^4.0.1" } }, - "undefsafe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", - "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", - "dev": true, - "requires": { - "debug": "^2.2.0" - } - }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -9198,6 +9507,61 @@ } } }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "urijs": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz", @@ -9224,6 +9588,15 @@ } } }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -9296,6 +9669,12 @@ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" }, + "vscode-languageserver-types": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", + "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==", + "dev": true + }, "webid": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/webid/-/webid-0.3.11.tgz", @@ -9351,13 +9730,46 @@ "isexe": "^2.0.0" } }, - "win-release": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", - "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", "dev": true, "requires": { - "semver": "^5.0.1" + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "window-size": { @@ -9366,6 +9778,15 @@ "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", "dev": true }, + "windows-release": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.1.0.tgz", + "integrity": "sha512-hBb7m7acFgQPQc222uEQTmdcGLeBmQLNLFIh0rDk3CwFOBrfjefLzEfEfmpMq8Af/n/GnFf3eYf203FY1PmudA==", + "dev": true, + "requires": { + "execa": "^0.10.0" + } + }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -9396,9 +9817,9 @@ } }, "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", + "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -9472,7 +9893,7 @@ }, "yargs": { "version": "3.32.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "dev": true, "requires": { diff --git a/package.json b/package.json index 4916d4fc8..42e4720fc 100644 --- a/package.json +++ b/package.json @@ -111,11 +111,11 @@ "mocha": "^5.1.1", "nock": "^9.0.14", "node-mocks-http": "^1.7.0", - "nyc": "^13.0.1", + "nyc": "^13.3.0", "randombytes": "^2.0.1", "sinon": "^2.1.0", "sinon-chai": "^2.8.0", - "snyk": "^1.88.2", + "snyk": "^1.136.1", "standard": "^8.6.0", "supertest": "^3.0.0", "turtle-validator": "^1.0.2", From bbff2548d75d9b4babca44097737cd84d1ea5e1f Mon Sep 17 00:00:00 2001 From: Kjetil Kjernsmo Date: Fri, 8 Mar 2019 11:14:40 +0100 Subject: [PATCH 39/60] Release version 4.4.2 of the npm package. --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6346c2c34..bb58e972a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "solid-server", - "version": "4.4.1", + "version": "4.4.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 42e4720fc..9f3805f9e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "solid-server", "description": "Solid server on top of the file-system", - "version": "4.4.1", + "version": "4.4.2", "author": { "name": "Tim Berners-Lee", "email": "timbl@w3.org" From 70ddc02a0277cd022772baaff071c26c4e4ff991 Mon Sep 17 00:00:00 2001 From: Kjetil Kjernsmo Date: Fri, 8 Mar 2019 11:48:06 +0100 Subject: [PATCH 40/60] Release version 5.0.0-beta.8 of the npm package. --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5f8f92169..e79f219bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "solid-server", - "version": "5.0.0-beta.7", + "version": "5.0.0-beta.8", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 86d1059b9..80f18a868 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "solid-server", "description": "Solid server on top of the file-system", - "version": "5.0.0-beta.7", + "version": "5.0.0-beta.8", "author": { "name": "Tim Berners-Lee", "email": "timbl@w3.org" From 6e063ea96af754bcb2bf484391228fa886dca29b Mon Sep 17 00:00:00 2001 From: Ruben Verborgh Date: Fri, 8 Mar 2019 17:14:23 +0100 Subject: [PATCH 41/60] Always pass an object as options. Fixes https://github.com/solid/node-solid-server/issues/1129. --- lib/ldp.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ldp.js b/lib/ldp.js index 803eb1bbd..6621f0a1e 100644 --- a/lib/ldp.js +++ b/lib/ldp.js @@ -373,7 +373,7 @@ class LDP { try { releaseLock = await lock(path, { retries: 10 }) return await new Promise((resolve, reject) => { - const stream = fs.createReadStream(path, start && end && {start, end}) + const stream = fs.createReadStream(path, start && end ? {start, end} : {}) stream .on('error', function (err) { debug.handlers(`GET -- error reading ${path}: ${err.message}`) From 2f9996ab8635834069f9c3f9487ec816c7c6f551 Mon Sep 17 00:00:00 2001 From: Ruben Verborgh Date: Fri, 8 Mar 2019 20:23:08 +0100 Subject: [PATCH 42/60] Only allow index.html as index file. Fixes https://github.com/solid/node-solid-server/issues/1131 --- lib/resource-mapper.js | 30 +++++++++++----------- test/unit/resource-mapper-test.js | 41 +++++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 26 deletions(-) diff --git a/lib/resource-mapper.js b/lib/resource-mapper.js index 653c1c76a..2abeeb1dd 100644 --- a/lib/resource-mapper.js +++ b/lib/resource-mapper.js @@ -14,7 +14,7 @@ class ResourceMapper { rootPath, includeHost = false, defaultContentType = 'application/octet-stream', - indexFilename = 'index', + indexFilename = 'index.html', overrideTypes = { acl: 'text/turtle', meta: 'text/turtle' }, fileSuffixes = ['.acl', '.meta'] }) { @@ -23,8 +23,9 @@ class ResourceMapper { this._includeHost = includeHost this._readdir = readdir this._defaultContentType = defaultContentType - this._indexFilename = indexFilename this._types = { ...types, ...overrideTypes } + this._indexFilename = indexFilename + this._indexContentType = this._getContentTypeByExtension(indexFilename) this._isControlFile = new RegExp(`(?:${fileSuffixes.map(fs => fs.replace('.', '\\.')).join('|')})$`) // If the host needs to be replaced on every call, pre-split the root URL @@ -41,8 +42,7 @@ class ResourceMapper { } // Maps the request for a given resource and representation format to a server file - // When the URL ends with a '/', then files with the prefix 'index.' will be matched, - // such as 'index.html' and 'index.ttl', unless searchIndex is false. + // When searchIndex is true and the URL ends with a '/', indexFilename will be matched. async mapUrlToFile ({ url, contentType, createIfNotExists, searchIndex = true }) { let fullPath = this.getFullPath(url) let isIndex = searchIndex && fullPath.endsWith('/') @@ -50,6 +50,9 @@ class ResourceMapper { // Append index filename if the URL ends with a '/' if (isIndex) { + if (createIfNotExists && contentType !== this._indexContentType) { + throw new Error(`Index file needs to have ${this._indexContentType} as content type`) + } fullPath += this._indexFilename } @@ -58,12 +61,7 @@ class ResourceMapper { path = fullPath // If the extension is not correct for the content type, append the correct extension if (searchIndex && this._getContentTypeByExtension(path) !== contentType) { - // Append a '$', unless we map for the index - // Because the index must _always_ have a proper extension when it is being created - if (!isIndex) { - path += '$' - } - path += contentType in extensions ? `.${extensions[contentType][0]}` : '.unknown' + path += `$${contentType in extensions ? `.${extensions[contentType][0]}` : '.unknown'}` } // Determine the path of an existing file } else { @@ -92,13 +90,13 @@ class ResourceMapper { async _getMatchingFile (folder, filename, isIndex) { const files = await this._readdir(folder) - const hasSameName = (f) => { - return this._removeDollarExtension(f) === filename - } - const isIndexFile = (f) => { - return isIndex && f.startsWith(this._indexFilename + '.') && !this._isControlFile.test(f) + // Search for files with the same name (disregarding a dollar extension) + if (!isIndex) { + return files.find(f => this._removeDollarExtension(f) === filename) + // Check if the index file exists + } else if (files.includes(this._indexFilename)) { + return this._indexFilename } - return files.find(f => hasSameName(f) || isIndexFile(f)) } async getRepresentationUrlForResource (resourceUrl) { diff --git a/test/unit/resource-mapper-test.js b/test/unit/resource-mapper-test.js index d2aa7cb4d..bc669fdc7 100644 --- a/test/unit/resource-mapper-test.js +++ b/test/unit/resource-mapper-test.js @@ -237,7 +237,7 @@ describe('ResourceMapper', () => { contentType: 'text/n3' }) - itMapsUrl(mapper, 'a URL ending with a slash to an index file when index.html is available', + itMapsUrl(mapper, 'a URL ending with a slash when index.html is available', { url: 'http://localhost/space/' }, @@ -250,7 +250,19 @@ describe('ResourceMapper', () => { contentType: 'text/html' }) - itMapsUrl(mapper, 'a URL ending with a slash to an index file when index$.html is available', + itMapsUrl(mapper, 'a URL ending with a slash when index.ttl is available', + { + url: 'http://localhost/space/' + }, + [ + `${rootPath}space/index.ttl` + ], + { + path: `${rootPath}space/`, + contentType: 'application/octet-stream' + }) + + itMapsUrl(mapper, 'a URL ending with a slash when index$.html is available', { url: 'http://localhost/space/' }, @@ -259,8 +271,20 @@ describe('ResourceMapper', () => { `${rootPath}space/index$.ttl` ], { - path: `${rootPath}space/index$.html`, - contentType: 'text/html' + path: `${rootPath}space/`, + contentType: 'application/octet-stream' + }) + + itMapsUrl(mapper, 'a URL ending with a slash when index$.ttl is available', + { + url: 'http://localhost/space/' + }, + [ + `${rootPath}space/index$.ttl` + ], + { + path: `${rootPath}space/`, + contentType: 'application/octet-stream' }) itMapsUrl(mapper, 'a URL ending with a slash to a folder when index.html is available but index is skipped', @@ -298,7 +322,7 @@ describe('ResourceMapper', () => { contentType: 'application/octet-stream' }) - itMapsUrl(mapper, 'a URL ending with a slash to an index file for text/html when index.html not is available', + itMapsUrl(mapper, 'a URL ending with a slash for text/html when index.html is not available', { url: 'http://localhost/space/', contentType: 'text/html', @@ -335,16 +359,13 @@ describe('ResourceMapper', () => { contentType: 'application/octet-stream' }) - itMapsUrl(mapper, 'a URL ending with a slash to an index file for text/turtle when index.ttl not is available', + itMapsUrl(mapper, 'a URL ending with a slash for text/turtle', { url: 'http://localhost/space/', contentType: 'text/turtle', createIfNotExists: true }, - { - path: `${rootPath}space/index.ttl`, - contentType: 'text/turtle' - }) + new Error('Index file needs to have text/html as content type')) // Security cases From 332e7ae07c9afaaca643b4b8fb7d7dd43e237507 Mon Sep 17 00:00:00 2001 From: Kjetil Kjernsmo Date: Fri, 8 Mar 2019 22:38:33 +0100 Subject: [PATCH 43/60] Update package-lock.json. --- package-lock.json | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index e79f219bb..024a0dbc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -230,7 +230,7 @@ "dependencies": { "rdflib": { "version": "0.12.3", - "resolved": "https://registry.npmjs.org/rdflib/-/rdflib-0.12.3.tgz", + "resolved": "http://registry.npmjs.org/rdflib/-/rdflib-0.12.3.tgz", "integrity": "sha1-K0IGamYJwGtAqQSFhJNix8uV6h4=", "requires": { "async": "^0.9.x", @@ -5008,6 +5008,14 @@ "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" + }, + "dependencies": { + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } } }, "macos-release": { @@ -5987,7 +5995,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "strip-bom": "^3.0.0" + "is-buffer": "^1.1.5" } }, "lcid": { @@ -6440,7 +6448,8 @@ }, "strip-bom": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "strip-eof": { "version": "1.0.0", @@ -10023,12 +10032,6 @@ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - }, "yargs": { "version": "3.32.0", "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", From 61d64550e4a6f1c63ddb7e1fa560dd93462cab2b Mon Sep 17 00:00:00 2001 From: Kjetil Kjernsmo Date: Fri, 8 Mar 2019 23:03:33 +0100 Subject: [PATCH 44/60] Revert "Making proper use of strictOrigins" --- lib/acl-checker.js | 18 +- lib/create-app.js | 17 +- test/integration/acl-tls-test.js | 8 +- test/integration/authentication-oidc-test.js | 81 +-- ...idc-with-strict-origins-turned-off-test.js | 531 ------------------ .../alice/private-for-owner.txt | 1 + .../alice/private-for-owner.txt.acl} | 4 +- .../alice/db/oidc/op/provider.json | 411 -------------- .../alice/private-for-alice.txt | 1 - .../alice/private-for-alice.txt.acl | 12 - .../bob/.acl-override | 5 - .../bob/db/oidc/op/provider.json | 411 -------------- .../bob/shared-with-alice.txt | 1 - .../bob/shared-with-alice.txt.acl | 15 - 14 files changed, 29 insertions(+), 1487 deletions(-) delete mode 100644 test/integration/authentication-oidc-with-strict-origins-turned-off-test.js create mode 100644 test/resources/accounts-scenario/alice/private-for-owner.txt rename test/resources/{accounts-strict-origin-off/alice/.acl-override => accounts-scenario/alice/private-for-owner.txt.acl} (63%) delete mode 100644 test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json delete mode 100644 test/resources/accounts-strict-origin-off/alice/private-for-alice.txt delete mode 100644 test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl delete mode 100644 test/resources/accounts-strict-origin-off/bob/.acl-override delete mode 100644 test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json delete mode 100644 test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt delete mode 100644 test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl diff --git a/lib/acl-checker.js b/lib/acl-checker.js index 44c0ae883..53c41f86d 100644 --- a/lib/acl-checker.js +++ b/lib/acl-checker.js @@ -16,10 +16,11 @@ class ACLChecker { constructor (resource, options = {}) { this.resource = resource this.resourceUrl = new URL(resource) - this.agentOrigin = options.strictOrigin && options.agentOrigin ? rdf.sym(options.agentOrigin) : null + this.agentOrigin = options.agentOrigin this.fetch = options.fetch this.fetchGraph = options.fetchGraph - this.trustedOrigins = options.strictOrigin && options.trustedOrigins ? options.trustedOrigins.map(trustedOrigin => rdf.sym(trustedOrigin)) : null + this.strictOrigin = options.strictOrigin + this.trustedOrigins = options.trustedOrigins this.suffix = options.suffix || DEFAULT_ACL_SUFFIX this.aclCached = {} this.messagesCached = {} @@ -55,14 +56,17 @@ class ACLChecker { const aclFile = rdf.sym(acl.acl) const agent = user ? rdf.sym(user) : null const modes = [ACL(mode)] - const agentOrigin = this.agentOrigin - const trustedOrigins = this.trustedOrigins + const agentOrigin = this.agentOrigin ? rdf.sym(this.agentOrigin) : null + const trustedOrigins = this.trustedOrigins ? this.trustedOrigins.map(trustedOrigin => rdf.sym(trustedOrigin)) : null const accessDenied = aclCheck.accessDenied(acl.graph, resource, directory, aclFile, agent, modes, agentOrigin, trustedOrigins) - - if (accessDenied && user) { + if (accessDenied && this.agentOrigin && this.resourceUrl.origin !== this.agentOrigin) { this.messagesCached[cacheKey].push(HTTPError(403, accessDenied)) - } else if (accessDenied) { + } else if (accessDenied && user) { + this.messagesCached[cacheKey].push(HTTPError(403, accessDenied)) + } else if (accessDenied && !user) { this.messagesCached[cacheKey].push(HTTPError(401, 'Unauthenticated')) + } else if (accessDenied) { + this.messagesCached[cacheKey].push(HTTPError(401, accessDenied)) } this.aclCached[cacheKey] = Promise.resolve(!accessDenied) return this.aclCached[cacheKey] diff --git a/lib/create-app.js b/lib/create-app.js index 88c2c251e..12f33ce0a 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -212,27 +212,14 @@ function initWebId (argv, app, ldp) { // without permission by including the credentials set by the Solid server. app.use((req, res, next) => { const origin = req.get('origin') - const trustedOrigins = ldp.getTrustedOrigins(req) + const trustedOrigins = argv.trustedOrigins const userId = req.session.userId // Exception: allow logout requests from all third-party apps // such that OIDC client can log out via cookie auth // TODO: remove this exception when OIDC clients // use Bearer token to authenticate instead of cookie // (https://github.com/solid/node-solid-server/pull/835#issuecomment-426429003) - // - // Authentication cookies are an optimization: - // instead of going through the process of - // fully validating authentication on every request, - // we go through this process once, - // and store its successful result in a cookie - // that will be reused upon the next request. - // However, that cookie can then be sent by any server, - // even servers that have not gone through the proper authentication mechanism. - // However, if trusted origins are enabled, - // then any origin is allowed to take the shortcut route, - // since malicious origins will be banned at the ACL checking phase. - // https://github.com/solid/node-solid-server/issues/1117 - if (!argv.strictOrigin && !argv.host.allowsSessionFor(userId, origin, trustedOrigins) && !isLogoutRequest(req)) { + if (!argv.host.allowsSessionFor(userId, origin, trustedOrigins) && !isLogoutRequest(req)) { debug.authentication(`Rejecting session for ${userId} from ${origin}`) // Destroy session data delete req.session.userId diff --git a/test/integration/acl-tls-test.js b/test/integration/acl-tls-test.js index c2103f669..9d321b10d 100644 --- a/test/integration/acl-tls-test.js +++ b/test/integration/acl-tls-test.js @@ -332,7 +332,7 @@ describe('ACL with WebID+TLS', function () { request.head(options, function (error, response, body) { assert.equal(error, null) - assert.equal(response.statusCode, 401) + assert.equal(response.statusCode, 403) done() }) }) @@ -354,7 +354,7 @@ describe('ACL with WebID+TLS', function () { request.head(options, function (error, response, body) { assert.equal(error, null) - assert.equal(response.statusCode, 401) + assert.equal(response.statusCode, 403) done() }) }) @@ -433,7 +433,7 @@ describe('ACL with WebID+TLS', function () { request.head(options, function (error, response, body) { assert.equal(error, null) - assert.equal(response.statusCode, 401) + assert.equal(response.statusCode, 403) done() }) }) @@ -455,7 +455,7 @@ describe('ACL with WebID+TLS', function () { request.head(options, function (error, response, body) { assert.equal(error, null) - assert.equal(response.statusCode, 401) + assert.equal(response.statusCode, 403) done() }) }) diff --git a/test/integration/authentication-oidc-test.js b/test/integration/authentication-oidc-test.js index d64f3ade5..bfa4a315b 100644 --- a/test/integration/authentication-oidc-test.js +++ b/test/integration/authentication-oidc-test.js @@ -179,39 +179,6 @@ describe('Authentication API (OIDC)', () => { }) }) - describe('with that cookie and a non-matching origin', () => { - let response - before(done => { - alice.get('/private-for-alice.txt') - .set('Cookie', cookie) - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 403', () => { - expect(response).to.have.property('status', 403) - }) - }) - - describe('without that cookie and a non-matching origin', () => { - let response - before(done => { - alice.get('/private-for-alice.txt') - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => { - expect(response).to.have.property('status', 401) - }) - }) - describe('with that cookie but without origin', () => { let response before(done => { @@ -228,19 +195,6 @@ describe('Authentication API (OIDC)', () => { }) }) - describe('with that cookie, private resource and no origin set', () => { - before(done => { - alice.get('/private-for-alice.txt') - .set('Cookie', cookie) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 200', () => expect(response).to.have.property('status', 200)) - }) - // How Mallory might set their cookie: describe('with malicious cookie but without origin', () => { let response @@ -342,8 +296,8 @@ describe('Authentication API (OIDC)', () => { }) }) - it('should return a 401', () => { - expect(response).to.have.property('status', 401) + it('should return a 403', () => { + expect(response).to.have.property('status', 403) // TODO: Should be 401? }) }) @@ -361,8 +315,8 @@ describe('Authentication API (OIDC)', () => { }) }) - it('should return a 401', () => { - expect(response).to.have.property('status', 401) + it('should return a 403', () => { + expect(response).to.have.property('status', 403) }) }) @@ -379,8 +333,8 @@ describe('Authentication API (OIDC)', () => { }) }) - it('should return a 401', () => { - expect(response).to.have.property('status', 401) + it('should return a 403', () => { + expect(response).to.have.property('status', 403) }) }) @@ -402,24 +356,7 @@ describe('Authentication API (OIDC)', () => { }) }) - describe('with malicious cookie and our origin', () => { - let response - before(done => { - var malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') - alice.get('/private-for-alice.txt') - .set('Cookie', malcookie) - .set('Origin', aliceServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => { - expect(response).to.have.property('status', 401) - }) - }) - + // Authenticated but origin not OK describe('with malicious cookie and a non-matching origin', () => { let response before(done => { @@ -433,8 +370,8 @@ describe('Authentication API (OIDC)', () => { }) }) - it('should return a 401', () => { - expect(response).to.have.property('status', 401) + it('should return a 403', () => { + expect(response).to.have.property('status', 403) }) }) }) diff --git a/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js b/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js deleted file mode 100644 index 5e0f1bde4..000000000 --- a/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js +++ /dev/null @@ -1,531 +0,0 @@ -const Solid = require('../../index') -const path = require('path') -const fs = require('fs-extra') -const { UserStore } = require('@solid/oidc-auth-manager') -const UserAccount = require('../../lib/models/user-account') -const SolidAuthOIDC = require('@solid/solid-auth-oidc') - -const fetch = require('node-fetch') -const localStorage = require('localstorage-memory') -const URL = require('whatwg-url').URL -global.URL = URL -global.URLSearchParams = require('whatwg-url').URLSearchParams -const { cleanDir, cp } = require('../utils') - -const supertest = require('supertest') -const chai = require('chai') -const expect = chai.expect -chai.use(require('dirty-chai')) - -// In this test we always assume that we are Alice - -describe('Authentication API (OIDC) - With strict origins turned off', () => { - let alice, bob - - const aliceServerPort = 7010 - const aliceServerUri = `https://localhost:${aliceServerPort}` - const aliceWebId = `https://localhost:${aliceServerPort}/profile/card#me` - let configPath = path.join(__dirname, '../resources/config') - let aliceDbPath = path.join(__dirname, '../resources/accounts-strict-origin-off/alice/db') - let userStorePath = path.join(aliceDbPath, 'oidc/users') - let aliceUserStore = UserStore.from({ path: userStorePath, saltRounds: 1 }) - aliceUserStore.initCollections() - - const bobServerPort = 7011 - const bobServerUri = `https://localhost:${bobServerPort}` - let bobDbPath = path.join(__dirname, '../resources/accounts-strict-origin-off/bob/db') - - const serverConfig = { - sslKey: path.join(__dirname, '../keys/key.pem'), - sslCert: path.join(__dirname, '../keys/cert.pem'), - auth: 'oidc', - dataBrowser: false, - webid: true, - multiuser: false, - configPath, - strictOrigin: false - } - - const aliceRootPath = path.join(__dirname, '../resources/accounts-strict-origin-off/alice') - const alicePod = Solid.createServer( - Object.assign({ - root: aliceRootPath, - serverUri: aliceServerUri, - dbPath: aliceDbPath - }, serverConfig) - ) - const bobRootPath = path.join(__dirname, '../resources/accounts-strict-origin-off/bob') - const bobPod = Solid.createServer( - Object.assign({ - root: bobRootPath, - serverUri: bobServerUri, - dbPath: bobDbPath - }, serverConfig) - ) - - function startServer (pod, port) { - return new Promise((resolve) => { - pod.listen(port, () => { resolve() }) - }) - } - - before(async () => { - await Promise.all([ - startServer(alicePod, aliceServerPort), - startServer(bobPod, bobServerPort) - ]).then(() => { - alice = supertest(aliceServerUri) - bob = supertest(bobServerUri) - }) - cp(path.join('accounts-strict-origin-off/alice', '.acl-override'), path.join('accounts-strict-origin-off/alice', '.acl')) - cp(path.join('accounts-strict-origin-off/bob', '.acl-override'), path.join('accounts-strict-origin-off/bob', '.acl')) - }) - - after(() => { - alicePod.close() - bobPod.close() - fs.removeSync(path.join(aliceDbPath, 'oidc/users')) - cleanDir(aliceRootPath) - cleanDir(bobRootPath) - }) - - describe('Login page (GET /login)', () => { - it('should load the user login form', () => alice.get('/login').expect(200)) - }) - - describe('Login by Username and Password (POST /login/password)', () => { - // Logging in as alice, to alice's pod - let aliceAccount = UserAccount.from({ webId: aliceWebId }) - let alicePassword = '12345' - - beforeEach(() => { - aliceUserStore.initCollections() - - return aliceUserStore.createUser(aliceAccount, alicePassword) - .catch(console.error.bind(console)) - }) - - afterEach(() => { - fs.removeSync(path.join(aliceDbPath, 'users/users')) - }) - - describe('after performing a correct login', () => { - let response, cookie - before(done => { - aliceUserStore.initCollections() - aliceUserStore.createUser(aliceAccount, alicePassword) - alice.post('/login/password') - .type('form') - .send({ username: 'alice' }) - .send({ password: alicePassword }) - .end((err, res) => { - response = res - cookie = response.headers['set-cookie'][0] - done(err) - }) - }) - - it('should redirect to /authorize', () => { - const loginUri = response.headers.location - expect(response).to.have.property('status', 302) - expect(loginUri.startsWith(aliceServerUri + '/authorize')) - }) - - it('should set the cookie', () => { - expect(cookie).to.match(/connect.sid=\S{65,100}/) - }) - - it('should set the cookie with HttpOnly', () => { - expect(cookie).to.match(/HttpOnly/) - }) - - it('should set the cookie with Secure', () => { - expect(cookie).to.match(/Secure/) - }) - - describe('and performing a subsequent request', () => { - let response - describe('without cookie', () => { - describe('and no origin set', () => { - before(done => { - alice.get('/private-for-alice.txt') - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => expect(response).to.have.property('status', 401)) - }) - describe('and our origin', () => { - // Our own origin, no agent auth - before(done => { - alice.get('/private-for-alice.txt') - .set('Origin', aliceServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => expect(response).to.have.property('status', 401)) - }) - describe('and trusted origin', () => { - // Configuration for originsAllowed but no auth - before(done => { - alice.get('/private-for-alice.txt') - .set('Origin', 'https://apps.solid.invalid') - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => expect(response).to.have.property('status', 401)) - }) - describe('and untrusted origin', () => { - // Not authenticated but also wrong origin, - before(done => { - alice.get('/private-for-alice.txt') - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => expect(response).to.have.property('status', 401)) - }) - }) - - describe('with cookie', () => { - describe('and no origin set', () => { - before(done => { - alice.get('/private-for-alice.txt') - .set('Cookie', cookie) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 200', () => expect(response).to.have.property('status', 200)) - }) - describe('and our origin', () => { - before(done => { - alice.get('/private-for-alice.txt') - .set('Cookie', cookie) - .set('Origin', aliceServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 200', () => expect(response).to.have.property('status', 200)) - }) - describe('and trusted origin', () => { - before(done => { - alice.get('/') - .set('Cookie', cookie) - .set('Origin', 'https://apps.solid.invalid') - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 200', () => expect(response).to.have.property('status', 200)) - }) - describe('and untrusted origin', () => { - before(done => { - alice.get('/private-for-alice.txt') - .set('Cookie', cookie) - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => expect(response).to.have.property('status', 401)) - }) - }) - - describe('with malicious cookie', () => { - let malcookie - before(() => { - // How Mallory might set their cookie: - malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') - }) - describe('and no origin set', () => { - before(done => { - alice.get('/private-for-alice.txt') - .set('Cookie', malcookie) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => expect(response).to.have.property('status', 401)) - }) - describe('and our origin', () => { - before(done => { - alice.get('/private-for-alice.txt') - .set('Cookie', malcookie) - .set('Origin', aliceServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => expect(response).to.have.property('status', 401)) - }) - describe('and trusted origin', () => { - before(done => { - alice.get('/private-for-alice.txt') - .set('Cookie', malcookie) - .set('Origin', 'https://apps.solid.invalid') - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => expect(response).to.have.property('status', 401)) - }) - describe('and untrusted origin', () => { - before(done => { - alice.get('/private-for-alice.txt') - .set('Cookie', malcookie) - .set('Origin', bobServerUri) - .end((err, res) => { - response = res - done(err) - }) - }) - - it('should return a 401', () => expect(response).to.have.property('status', 401)) - }) - }) - }) - }) - - it('should throw a 400 if no username is provided', (done) => { - alice.post('/login/password') - .type('form') - .send({ password: alicePassword }) - .expect(400, done) - }) - - it('should throw a 400 if no password is provided', (done) => { - alice.post('/login/password') - .type('form') - .send({ username: 'alice' }) - .expect(400, done) - }) - - it('should throw a 400 if user is found but no password match', (done) => { - alice.post('/login/password') - .type('form') - .send({ username: 'alice' }) - .send({ password: 'wrongpassword' }) - .expect(400, done) - }) - }) - - describe('Browser login workflow', () => { - it('401 Unauthorized asking the user to log in', (done) => { - bob.get('/shared-with-alice.txt') - .end((err, { status, text }) => { - expect(status).to.equal(401) - expect(text).to.contain('Log in') - done(err) - }) - }) - }) - - describe('Two Pods + Web App Login Workflow', () => { - let aliceAccount = UserAccount.from({ webId: aliceWebId }) - let alicePassword = '12345' - - let auth - let authorizationUri, loginUri, authParams, callbackUri - let loginFormFields = '' - let bearerToken - - before(() => { - auth = new SolidAuthOIDC({ store: localStorage, window: { location: {} } }) - let appOptions = { - redirectUri: 'https://app.example.com/callback' - } - - aliceUserStore.initCollections() - - return aliceUserStore.createUser(aliceAccount, alicePassword) - .then(() => { - return auth.registerClient(aliceServerUri, appOptions) - }) - .then(registeredClient => { - auth.currentClient = registeredClient - }) - }) - - after(() => { - fs.removeSync(path.join(aliceDbPath, 'users/users')) - fs.removeSync(path.join(aliceDbPath, 'oidc/op/tokens')) - - let clientId = auth.currentClient.registration['client_id'] - let registration = `_key_${clientId}.json` - fs.removeSync(path.join(aliceDbPath, 'oidc/op/clients', registration)) - }) - - // Step 1: An app makes a GET request and receives a 401 - it('should get a 401 error on a REST request to a protected resource', () => { - return fetch(bobServerUri + '/shared-with-alice.txt') - .then(res => { - expect(res.status).to.equal(401) - - expect(res.headers.get('www-authenticate')) - .to.equal(`Bearer realm="${bobServerUri}", scope="openid webid"`) - }) - }) - - // Step 2: App presents the Select Provider UI to user, determine the - // preferred provider uri (here, aliceServerUri), and constructs - // an authorization uri for that provider - it('should determine the authorization uri for a preferred provider', () => { - return auth.currentClient.createRequest({}, auth.store) - .then(authUri => { - authorizationUri = authUri - - expect(authUri.startsWith(aliceServerUri + '/authorize')).to.be.true() - }) - }) - - // Step 3: App redirects user to the authorization uri for login - it('should redirect user to /authorize and /login', () => { - return fetch(authorizationUri, { redirect: 'manual' }) - .then(res => { - // Since user is not logged in, /authorize redirects to /login - expect(res.status).to.equal(302) - - loginUri = new URL(res.headers.get('location')) - expect(loginUri.toString().startsWith(aliceServerUri + '/login')) - .to.be.true() - - authParams = loginUri.searchParams - }) - }) - - // Step 4: Pod returns a /login page with appropriate hidden form fields - it('should display the /login form', () => { - return fetch(loginUri.toString()) - .then(loginPage => { - return loginPage.text() - }) - .then(pageText => { - // Login page should contain the relevant auth params as hidden fields - - authParams.forEach((value, key) => { - let hiddenField = `` - - let fieldRegex = new RegExp(hiddenField) - - expect(pageText).to.match(fieldRegex) - - loginFormFields += `${key}=` + encodeURIComponent(value) + '&' - }) - }) - }) - - // Step 5: User submits their username & password via the /login form - it('should login via the /login form', () => { - loginFormFields += `username=${'alice'}&password=${alicePassword}` - - return fetch(aliceServerUri + '/login/password', { - method: 'POST', - body: loginFormFields, - redirect: 'manual', - headers: { - 'content-type': 'application/x-www-form-urlencoded' - }, - credentials: 'include' - }) - .then(res => { - expect(res.status).to.equal(302) - let postLoginUri = res.headers.get('location') - let cookie = res.headers.get('set-cookie') - - // Successful login gets redirected back to /authorize and then - // back to app - expect(postLoginUri.startsWith(aliceServerUri + '/authorize')) - .to.be.true() - - return fetch(postLoginUri, { redirect: 'manual', headers: { cookie } }) - }) - .then(res => { - // User gets redirected back to original app - expect(res.status).to.equal(302) - callbackUri = res.headers.get('location') - expect(callbackUri.startsWith('https://app.example.com#')) - }) - }) - - // Step 6: Web App extracts tokens from the uri hash fragment, uses - // them to access protected resource - it('should use id token from the callback uri to access shared resource', () => { - auth.window.location.href = callbackUri - - let protectedResourcePath = bobServerUri + '/shared-with-alice.txt' - - return auth.initUserFromResponse(auth.currentClient) - .then(webId => { - expect(webId).to.equal(aliceWebId) - - return auth.issuePoPTokenFor(bobServerUri, auth.session) - }) - .then(popToken => { - bearerToken = popToken - - return fetch(protectedResourcePath, { - headers: { - 'Authorization': 'Bearer ' + bearerToken - } - }) - }) - .then(res => { - expect(res.status).to.equal(200) - - return res.text() - }) - .then(contents => { - expect(contents).to.equal('protected contents\n') - }) - }) - - it('should not be able to reuse the bearer token for bob server on another server', () => { - let privateAliceResourcePath = aliceServerUri + '/private-for-alice.txt' - - return fetch(privateAliceResourcePath, { - headers: { - // This is Alice's bearer token with her own Web ID - 'Authorization': 'Bearer ' + bearerToken - } - }) - .then(res => { - // It will get rejected; it was issued for Bob's server only - expect(res.status).to.equal(403) - }) - }) - }) - - describe('Post-logout page (GET /goodbye)', () => { - it('should load the post-logout page', () => { - return alice.get('/goodbye') - .expect(200) - }) - }) -}) diff --git a/test/resources/accounts-scenario/alice/private-for-owner.txt b/test/resources/accounts-scenario/alice/private-for-owner.txt new file mode 100644 index 000000000..5d39eb781 --- /dev/null +++ b/test/resources/accounts-scenario/alice/private-for-owner.txt @@ -0,0 +1 @@ +protected contents for owner diff --git a/test/resources/accounts-strict-origin-off/alice/.acl-override b/test/resources/accounts-scenario/alice/private-for-owner.txt.acl similarity index 63% rename from test/resources/accounts-strict-origin-off/alice/.acl-override rename to test/resources/accounts-scenario/alice/private-for-owner.txt.acl index bcdd33def..fbc63348b 100644 --- a/test/resources/accounts-strict-origin-off/alice/.acl-override +++ b/test/resources/accounts-scenario/alice/private-for-owner.txt.acl @@ -1,5 +1,5 @@ <#Owner> a ; - <./>; - ; + <./private-for-owner.txt>; + ; , , . diff --git a/test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json b/test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json deleted file mode 100644 index 68a3b5341..000000000 --- a/test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json +++ /dev/null @@ -1,411 +0,0 @@ -{ - "issuer": "https://localhost:7010", - "authorization_endpoint": "https://localhost:7010/authorize", - "token_endpoint": "https://localhost:7010/token", - "userinfo_endpoint": "https://localhost:7010/userinfo", - "jwks_uri": "https://localhost:7010/jwks", - "registration_endpoint": "https://localhost:7010/register", - "response_types_supported": [ - "code", - "code token", - "code id_token", - "id_token", - "id_token token", - "code id_token token", - "none" - ], - "response_modes_supported": [ - "query", - "fragment" - ], - "grant_types_supported": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "subject_types_supported": [ - "public" - ], - "id_token_signing_alg_values_supported": [ - "RS256", - "RS384", - "RS512", - "none" - ], - "token_endpoint_auth_methods_supported": [ - "client_secret_basic" - ], - "token_endpoint_auth_signing_alg_values_supported": [ - "RS256" - ], - "display_values_supported": [], - "claim_types_supported": [ - "normal" - ], - "claims_supported": [], - "claims_parameter_supported": false, - "request_parameter_supported": true, - "request_uri_parameter_supported": false, - "require_request_uri_registration": false, - "check_session_iframe": "https://localhost:7010/session", - "end_session_endpoint": "https://localhost:7010/logout", - "keys": { - "descriptor": { - "id_token": { - "signing": { - "RS256": { - "alg": "RS256", - "modulusLength": 2048 - }, - "RS384": { - "alg": "RS384", - "modulusLength": 2048 - }, - "RS512": { - "alg": "RS512", - "modulusLength": 2048 - } - }, - "encryption": {} - }, - "token": { - "signing": { - "RS256": { - "alg": "RS256", - "modulusLength": 2048 - }, - "RS384": { - "alg": "RS384", - "modulusLength": 2048 - }, - "RS512": { - "alg": "RS512", - "modulusLength": 2048 - } - }, - "encryption": {} - }, - "userinfo": { - "encryption": {} - }, - "register": { - "signing": { - "RS256": { - "alg": "RS256", - "modulusLength": 2048 - } - } - } - }, - "jwks": { - "keys": [ - { - "kid": "QMa5xaKOYwI", - "kty": "RSA", - "alg": "RS256", - "n": "ol8T6mc7t55kUI3Xf4pHsx8p25VqZ3jm54TQY6xZ07FYzwU8ex02Mg_W_VABRNyVq8wdUBKubo1W8iaKtvtrr0XDOyHUAlwM6xa14332c9akB1AmTirZY4gvyobIY-b18F8LpeIkkLUcypeZmsDd-bGONEJs0sxM6LtLCY41s_lgesPdQwmHLBw4_Rw9NcjBslupWP_pSXUW9x2fj8tKHOoURqmOWL-54t9YbDdIht06uzqagzjPV3UoYtvRsu2QUJx99ExgNvCA9pA1wyiyysyhUdfeKyZpwvTfwWxkrwZrE6zb1AZICFW5R3Bgg0b9UnS96LpFxbSO7rXBRWVKOw", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - }, - { - "kid": "66gqKTPVHyA", - "kty": "RSA", - "alg": "RS384", - "n": "rWHV18o2T_9zhO-YknvC9brSjWru496-Dw0iVCiJdEZph94aWXeZW4tYsSjYAfzCJXQUrIqfoPTx100KoYRMiUGpVUh5AgwqAitOpFV_Cxa2j4D01qALwUXWblmJTeCzY7zQFOs1-OBU_U3fhsqcHVPHVlfwO4fYhe-FrhQwTDf55JIW5OGM2bViRxpPyZ3t9nueSuz1jEDCSRlaizJq4jhDrkYWoXtXomRfoseGrZVwTGx5cslfrYs-AmLWMfLkZQWjYZMcwOaJCy3dSkTQkmas4dzGwQqrOqNbgznyCo3oTpHboWS36e0jn_lnbq95zPpZkHNsOzw-Mzq0KRj1jw", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - }, - { - "kid": "zPdTDVkjms4", - "kty": "RSA", - "alg": "RS512", - "n": "tbVEZHw4LP21DFHmF0QjbSektUEGl8t4blGcZM871ieppUVZ_uHKlfan2ftnQ4GwBISkmjwk6KP1nc9iiONzqAhJbFheQMT4RAmYz7xPJP9cAPOiD8YbqzO2xJqBT1OMc2PDS7ICH0-t_kBXMb0IR61CTG-CmO5Tp8ecauUkshvvYg0dA3-os16Dy5ex4if3ZSpfXowmfjRrvYAKEPeFTmA9Q8lMzN0ZyuEb2nILIeMFwTAjo8Ck8D1h4keOVaY0mfTgC9KxkR1kIcAc7DELYX-vjG63AwB-8IIo735g5NMrFj22923jymMDpQDTEMui-jW1TQYNGR84ShNW_nJZGQ", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - }, - { - "kid": "8zan03XlrmI", - "kty": "RSA", - "alg": "RS256", - "n": "y3E2ffizby9vClbahFgkg8_NcpA6iYTwkA4TH2i2-usyH87nz3uM5LfRa7KIV4ZHOvY-DZr6H1MAqaFCPrciWZnPPyTRxlUlYhfb4n42g0Bwk7Oh7z-KZvIqR45x85NfniR3uB8xu47VdTWCmWJge2glMavdWC8mr5Pc8um3Fr5eMVactUFsp571SrVKuY_u5qJHN3xmn7mLpiLdCIHFlBkvvLgcAcUmXFhn8cCzHCqkrcrRgfjhd5YJmv6wxxINrTMT4_dS4jxE5u1Ezw-m6xSIWukdW21lWupFHNZEK5VvIkiCBl73Sh0vO-gv4XNJcQmPRpqMdHat8GLG7I2PHQ", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - }, - { - "kid": "5ooqXseJdoQ", - "kty": "RSA", - "alg": "RS384", - "n": "tqhzPmOds6zvDNX3IHCr7SW5kf6GlnlpW-Rm4aQot1HmtKnsXieV99VjT98EspvcFeKyT5jcJFgZMHb1n_kOtRnhygFHNZQ4ooFmFI2VP5lPUuOIGppWiO5ZxIzECdnwAGoZ7A1hu9Vh5oJJP-m_88JX3sdbHPlsEpzdXHf-THZKAqPYHGNWeNPkmQuON5PaEwiJGRWQ0dbMZtsiMoVCPjh7ZQM-1N2UjXmSAcCCxst5BaTUwQQuVmKIT-cfxP9ShPjP7_DmpRBDOp7_frMKTPkznL0HPNWqSRRewGWB6AcrdY7WtWI5hHNDx9GTdLmolFOvnL4cgtr99u9adq6vAw", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - }, - { - "kid": "tfz-MRyl3GQ", - "kty": "RSA", - "alg": "RS512", - "n": "3vyjzgsA89bJHD7BZ2MNadjFOPUXpuGKlC7OumOspC_iOSMnJ0Kh7oCWmsBTuzGdfY_gYMaXx28NK-LVjGmaEKZxPhdCz7yzofUCMWoVXNhE4hwBdZt1mNl0abaKNzJ_8BhbtTNhourfBvRwebMYFYO0LfEkApE-hM929pFERb0G3-_ybw8A2cqQFvQ67JhYsBcFUwpf68xZvfYTbdsJzfkkoY0UgI01GU55dZskPBK-_jndzo_bNo8wdENU_cUdOllNdZUoWAemWOGoHKdNshGKy6OwZaC9xqaE_VzF-RaYEcf_jaLD7GbPrz9Xcm9sygnFV3IDlj9-0fjKOkAwqw", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - }, - { - "kid": "FRI7f7sJKUg", - "kty": "RSA", - "alg": "RS256", - "n": "0d4up4hx3l_HZa6D2PO-YYSqgNbAWjtlIbnFWIZS-PRzVFgDKcR9bLo_9-MGm0sT0tHbyeqc4V8o5oeYF0uhNmlEuU9Do2VYiyc0fkNeW1nFrC-XJYxbnge4Pxbhl-0Jn04O8IJsP15xq16GfRZxYfjKPeFilQNeDwTb_SBqoveZASHUW998eO1bEg0bjUZs4Yy23S4R23ABZKTQMPMGMETGFVbcFNXUohu0eSYMG4eU9iaFNmh0p0G9lU7ER-UFSatczaEFle0Awazb7-EHN6iya3zL6LDt-ezlIszTzHIXa2Dhhga2SlDIyuhFUOkkEeCP3a-sFeXre-JWiYz8ZQ", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - } - ] - }, - "id_token": { - "signing": { - "RS256": { - "privateJwk": { - "kid": "hS7A2bkdhJA", - "kty": "RSA", - "alg": "RS256", - "n": "ol8T6mc7t55kUI3Xf4pHsx8p25VqZ3jm54TQY6xZ07FYzwU8ex02Mg_W_VABRNyVq8wdUBKubo1W8iaKtvtrr0XDOyHUAlwM6xa14332c9akB1AmTirZY4gvyobIY-b18F8LpeIkkLUcypeZmsDd-bGONEJs0sxM6LtLCY41s_lgesPdQwmHLBw4_Rw9NcjBslupWP_pSXUW9x2fj8tKHOoURqmOWL-54t9YbDdIht06uzqagzjPV3UoYtvRsu2QUJx99ExgNvCA9pA1wyiyysyhUdfeKyZpwvTfwWxkrwZrE6zb1AZICFW5R3Bgg0b9UnS96LpFxbSO7rXBRWVKOw", - "e": "AQAB", - "d": "KvDiH3e1v1XQSc15VG2JkMGJHF1jioHa7xec1P9bsjSQvA8yc4zCLHMr9EoYS9Hac1jD181Y_Du85sVyofnT_MKCYz0LCKS3deTHraY-a1w0fQqhVsLWQxBdMz55-JG4MR2xwukPqoV7W8jEAr1G9yYR6Zg3l3gYTuRZb-mAIlxBZOcZ-4DvB0GtEYLyWFRSMiaUl_EkqgQpssH5hKIIB7xtHZFG_FsbH2gnv0apZFdZCs1hpzyJ_FuUYoIupdaHUP92ojdGQ8E51J_t6SIYjZdtEoKhk6i2BHIPzSerxItVgAs-3RTbeYp1gEdyQGROz8Owyorsqzq-2S7gxXn_AQ", - "p": "zJtqzVrhym0DBWIK11LEIwTPU9G_prC_XYzt0H3tXuiwAlpRoFOoecAKsCJqb_bvL7mqVCjYzS-O57dzdxd36F-vpvW9xH3SgfxcoDtiVkvuoux9nGaQXLWCetjHy8jrL41SDVc55R7h4knn6KgR_yWmY2LR-w0CktrWuIlOIps", - "q": "yyfVYtGaJASgfkv1KL-HoA8yyP7OZrUsxxQcIXMuQoAUqKtvyl6gn2W4uW4opg_yzuN0jxK8ZM8EjOmzXs0_dhVWXWFBBvhmpI4ssXXQYVhJiq-QMm6WvDZFXtW-o3ikRXWuxwnUeOn0psxsIXtHrKQ7Wcf29KrCu64MYTvIoOE", - "dp": "Ptr722ww8wO8KtospGtbr7pZitFjw-yGTVHu-N7GniJzd7WRX-RzXDufzO41roG4hvvNlJ8bwyT6DLsxsIM4Jd3HU04o5wUUNzR0rBCyK_qVq91k1Tg43xIvrFeOQU9O2MPcUhbaxUVQdTjpEnMXXD-PtvZztWEQylaKIhSkOUM", - "dq": "oauPetaGrgcomZlk_gp9qfiuV5m_M6kWe08bm9sHg1BeIGRd0FRByteui5KIsq6acd480eb9GdRNML6CSf1YdWZBlopgr2VaebXTB15UeENEMyPHwvqS5jDiP7glv_2v7L7cWfUOqzKzyVGA85why9fei3JAqzCBS84UeASVgsE", - "qi": "lURMq4viaqzYCi_JF_dDZjvc6rpuiRSzhd0PyY6mdutMZqLtZJESZt8HuEqpey5GA4i481DmmUXCfNhBc-4kUOAP5PVdHJp7YttvrzpkZGtJx_xLwLLLgDn6zaheaeNnxRvHqoW0Cycx6TAAVzX2Cdsjo-vRiaRqGkOBPslOiqA", - "key_ops": [ - "sign" - ], - "ext": true - }, - "publicJwk": { - "kid": "QMa5xaKOYwI", - "kty": "RSA", - "alg": "RS256", - "n": "ol8T6mc7t55kUI3Xf4pHsx8p25VqZ3jm54TQY6xZ07FYzwU8ex02Mg_W_VABRNyVq8wdUBKubo1W8iaKtvtrr0XDOyHUAlwM6xa14332c9akB1AmTirZY4gvyobIY-b18F8LpeIkkLUcypeZmsDd-bGONEJs0sxM6LtLCY41s_lgesPdQwmHLBw4_Rw9NcjBslupWP_pSXUW9x2fj8tKHOoURqmOWL-54t9YbDdIht06uzqagzjPV3UoYtvRsu2QUJx99ExgNvCA9pA1wyiyysyhUdfeKyZpwvTfwWxkrwZrE6zb1AZICFW5R3Bgg0b9UnS96LpFxbSO7rXBRWVKOw", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - } - }, - "RS384": { - "privateJwk": { - "kid": "IN7Ur_i2gps", - "kty": "RSA", - "alg": "RS384", - "n": "rWHV18o2T_9zhO-YknvC9brSjWru496-Dw0iVCiJdEZph94aWXeZW4tYsSjYAfzCJXQUrIqfoPTx100KoYRMiUGpVUh5AgwqAitOpFV_Cxa2j4D01qALwUXWblmJTeCzY7zQFOs1-OBU_U3fhsqcHVPHVlfwO4fYhe-FrhQwTDf55JIW5OGM2bViRxpPyZ3t9nueSuz1jEDCSRlaizJq4jhDrkYWoXtXomRfoseGrZVwTGx5cslfrYs-AmLWMfLkZQWjYZMcwOaJCy3dSkTQkmas4dzGwQqrOqNbgznyCo3oTpHboWS36e0jn_lnbq95zPpZkHNsOzw-Mzq0KRj1jw", - "e": "AQAB", - "d": "KtxZqbuiS4phu0YjmGqh2m8xp6X8ojYpE71ydA2FVUomwmCkcOOA9MFwznLDW1JpiCq3BaRLK9YBhvDTpPP4m6Gww5Vj3J63L8wW58b-3fXicX02iWwNG90w0hyuNaNLlWdSpSk0MW77c5bxn_esOg_A4lZg28aMPyfkCxGQkvaHR2EeY9eL9xlZoNtQxtLoKOIl97fJt96C9hXwRPuygDknHywRo35_Fi9nSpdu-_wfoZxBvPvRAQA-jFmwsJwLB3XaYJEZmZoBajXLfYUVEYKCOD7bsPysdbIUCY6dFBAL9FyFl5HSCjgW6yKHql0YfUf5VabQQnkdXDZxng7OiQ", - "p": "2ZOHQkgjfkgMC0Z6gfP-nCj_jqDI2F6MpB4HIvOvpm8z-qz02mZeC6zgHzHtichOwgCPJPapS7hN9vlQdnOTl62XBWmZ2Jbz_q3shbnRPYx7J3GSARrohOHm1bsapxeagQcXoBuScx-Kvgih4B_-u-PHvHFQHHaoEzIpR_FcK-M", - "q": "zABSbkRBSpayejh_y8cvTZI5YZjz8bK_n78yKYOR4bsPrC-c2TGtxsHqv5x_5Ps5ALicul59HgrN8oD8THYJiO2V7wobNIp4HDl2J8aL9me43a2VuDRPOXHeOzxtP071_p6VZWEju0kMDihwn91Vkc2RwrgkNrPClGEQstOg12U", - "dp": "dqxTIEH8qgpeF2BPvcX53-80xPTJ18pqZ7HBLr0_10XcUiQ4QU-IiFG4xQsUhwxseMCZUw3-9UAHtmfyDUmo_Rg_wUICGfLsDsOKuL3LdQjEu5TkkBm_LYuRvo4ZUX48VZgquLeRP526rUBEGt0Ysh7heNVNXtkRf7bicU0iewU", - "dq": "yGvskF7IksJZWNCXZZostBZb_7HowOYvc3_BhZ24vkAs1qr0e0Jei25K9rOHx2y2BSpa-JMKc3CEA6OLvIcfOQLKkk2oiscb2AbwOYXMTmp66ne3J4Fk8HgZsLLeVht6fQxKlI6KL19F08cRV0552kRP1zFYitGy8lomsLpQRC0", - "qi": "scdLHtzFy5A5nhbl6XOv_g_5LxTiebV9ifCo8A_Y8T7hEPsUwOZxkIarcREgDbgo7zdJZjpKEklWrsp6sBT6KyJZf1_e_oZWCoivr7btx05ZWq7bJdn8773y-7DjL3H_HFpqVkpx-f03OKV8_AV-VspkxsVrp0FcrRGs2hpjck0", - "key_ops": [ - "sign" - ], - "ext": true - }, - "publicJwk": { - "kid": "66gqKTPVHyA", - "kty": "RSA", - "alg": "RS384", - "n": "rWHV18o2T_9zhO-YknvC9brSjWru496-Dw0iVCiJdEZph94aWXeZW4tYsSjYAfzCJXQUrIqfoPTx100KoYRMiUGpVUh5AgwqAitOpFV_Cxa2j4D01qALwUXWblmJTeCzY7zQFOs1-OBU_U3fhsqcHVPHVlfwO4fYhe-FrhQwTDf55JIW5OGM2bViRxpPyZ3t9nueSuz1jEDCSRlaizJq4jhDrkYWoXtXomRfoseGrZVwTGx5cslfrYs-AmLWMfLkZQWjYZMcwOaJCy3dSkTQkmas4dzGwQqrOqNbgznyCo3oTpHboWS36e0jn_lnbq95zPpZkHNsOzw-Mzq0KRj1jw", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - } - }, - "RS512": { - "privateJwk": { - "kid": "34CvC1I0fbk", - "kty": "RSA", - "alg": "RS512", - "n": "tbVEZHw4LP21DFHmF0QjbSektUEGl8t4blGcZM871ieppUVZ_uHKlfan2ftnQ4GwBISkmjwk6KP1nc9iiONzqAhJbFheQMT4RAmYz7xPJP9cAPOiD8YbqzO2xJqBT1OMc2PDS7ICH0-t_kBXMb0IR61CTG-CmO5Tp8ecauUkshvvYg0dA3-os16Dy5ex4if3ZSpfXowmfjRrvYAKEPeFTmA9Q8lMzN0ZyuEb2nILIeMFwTAjo8Ck8D1h4keOVaY0mfTgC9KxkR1kIcAc7DELYX-vjG63AwB-8IIo735g5NMrFj22923jymMDpQDTEMui-jW1TQYNGR84ShNW_nJZGQ", - "e": "AQAB", - "d": "RZybBe_8yWesu3qIrnMhK0kbtYCi2PZPPdwwEQK_RqzNNg6aiqXPqaHj7gN9LQR6_VAfiyLtdN6TUxDHC_AvN7ls_3_fI-sRvWb7zuGyZFcb1RWBCY_4u57FLw6N6Wj1jqMyh0Y7v-kTnCrj_J8Rk_wRQR0bKCFtlQJIrz73zu90rcPOOjWPH6W6LCN-lkmOC8vm0M08aHJtZclLSJcSO8VX6P4rDbbIadNubhtZ0_snOlc9ZctpWDgqGRqJGKL2FRldmVMnYr9vE4kv3jELCvkKtct35k1q6qd6pQQ2j3iL0nUnIRRCiuIVRmuiUKI11i2lmQoqnzQN0qGNKhAY3Q", - "p": "7psJPwCSpbravp7NlZQWAmvBvZEdPZ3BNk2w7_udpKZqHvnhgwr40jypwp3JdysSXsd4cDKGlzkCaCeJT3L9N26feCGbwbSjwmdf7UcSXDhlfSxAsEI2LtPPkG4SQdsAv42s3NQcPnO9Uf0ZdH-yV8tj5gwB1ibF0_MxtNcenYc", - "q": "wvRiS7lfGGQmJioCYHrkUyeJnwg2-GYbCD6LF2nDXFbsz_JWmgeI1lbSKuD5notoIy62p0R6FdX3mtwb_8dDDHFbjrHfPbOEp-MOd-cZ9f6XxKeC_uoXrkEdcLl5IthG2WtqKT_If5xIMRW4MYwRD3gTUs-DU255B-7YF3oT_F8", - "dp": "jP01QHIRNTatLLffWMRRIQsVRvNpaNA_q9vKcnOmWfUvfbA_rdQc5PWNhf8AXZco2rJZG0rvtomsP2klPLoAn_GQ70ZEp_gaT7QPvcAiPDXi2kz8yGnHZHIqEvjHdvx2e7m2bCI1sj1nn_vDP9B4zGHVXMi5iRYODUiFlYsLfx8", - "dq": "v1uxwDJMLVzgNUW234zA4P5GD1u42Ukf74-0Z17g65pHCDYO21HZ9slxsbTyT7T2mtIXZ0fHrfc_-zliIkYsgeIixIXDYoT7CO_OG9MzoEouHlFuO1j7tYckpqjnRlST9oWAxsxcuSVllwiCq9-YP17VWMtnVFVzZ14BrcmeJHE", - "qi": "4Ufn1YaM5AImU625M0Fd5r9cYU__mPw-HbJHxHoCENGDY8Mz4pB1nJqu10gI5JKgucU4y8VtV1wBzGb_s97gSS8SMmzea6of2SjoxxyR4sYcPfmJz9-1En7F8r3WahBP1IDMTDV6afbTMVPzPIbjkHowmQHyrTBmx2G3rODfStw", - "key_ops": [ - "sign" - ], - "ext": true - }, - "publicJwk": { - "kid": "zPdTDVkjms4", - "kty": "RSA", - "alg": "RS512", - "n": "tbVEZHw4LP21DFHmF0QjbSektUEGl8t4blGcZM871ieppUVZ_uHKlfan2ftnQ4GwBISkmjwk6KP1nc9iiONzqAhJbFheQMT4RAmYz7xPJP9cAPOiD8YbqzO2xJqBT1OMc2PDS7ICH0-t_kBXMb0IR61CTG-CmO5Tp8ecauUkshvvYg0dA3-os16Dy5ex4if3ZSpfXowmfjRrvYAKEPeFTmA9Q8lMzN0ZyuEb2nILIeMFwTAjo8Ck8D1h4keOVaY0mfTgC9KxkR1kIcAc7DELYX-vjG63AwB-8IIo735g5NMrFj22923jymMDpQDTEMui-jW1TQYNGR84ShNW_nJZGQ", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - } - } - }, - "encryption": {} - }, - "token": { - "signing": { - "RS256": { - "privateJwk": { - "kid": "oYYAVkAOTqo", - "kty": "RSA", - "alg": "RS256", - "n": "y3E2ffizby9vClbahFgkg8_NcpA6iYTwkA4TH2i2-usyH87nz3uM5LfRa7KIV4ZHOvY-DZr6H1MAqaFCPrciWZnPPyTRxlUlYhfb4n42g0Bwk7Oh7z-KZvIqR45x85NfniR3uB8xu47VdTWCmWJge2glMavdWC8mr5Pc8um3Fr5eMVactUFsp571SrVKuY_u5qJHN3xmn7mLpiLdCIHFlBkvvLgcAcUmXFhn8cCzHCqkrcrRgfjhd5YJmv6wxxINrTMT4_dS4jxE5u1Ezw-m6xSIWukdW21lWupFHNZEK5VvIkiCBl73Sh0vO-gv4XNJcQmPRpqMdHat8GLG7I2PHQ", - "e": "AQAB", - "d": "Jyjwq0jfCSzhO-VCBK2OwcyTKFU431W2lJQQ_D_E0QHK0TKbjmWi1jfH2Ooxsl9HgML7aNUHBlaMzxoaTUYlF4gyy13D_2BOZNZg3fUbeyJBST0Pk6TweCZvGv0BVDhu9FrirI9cnFS_I-Ob8vhrx_VhC3GglqPk13En254_PuIoEuBgTnxRHxNyIqWSiBUQNuEjqDl2CxO1dpjczKbj6YBzbPqFIV8FkJUz6HS2SMhJOgoDhrhduOFwzqqQQ_yUhfPkP2WYodgDXkyUWdgYKuCgCA3hWrQm1YJf-WoN0l_OVvetTSIlbxiNr-Br7PCPBLOpyiGTu4O3LjFHu0cWJQ", - "p": "6AMK_ANmxrnqgQ77Mf6A1BDopCqQWIBBZ4m_Ia4Ia3ygWpKLdjp5NNM1DL5Lnuing7wSNZvj0iyc-Ra_ilYmLeyKROkyPvwoLohk8W6AVPKotvVOZZwK5nHMIN3McSSgileai0FxxZtFG2W-ZLy4ggKQkfsGDnDQ0vWVpcSQ24M", - "q": "4Hn69Uev6x7nlsAV9fR6GvpjUZDD6Np_VY85BtWEw_6VxbutsMJnI0hYqCPMcmSHfdchzEiMLCUaMIRXMvigNdNxTWF1BSL3L3c7A-uZuv0iJ7X3trNmxEeuJ0EBmcqXcukJuYxW-Lb7XzernSGYOGtambMrf1oMM2ER90egyN8", - "dp": "WnKdPKPi1EQ0TH3XpaTO-l1hJGbHgQj29nM3xNyAwc6DAOwyXDPtfo98Fey1tEyEyZFvE-EjDpN_2odownhVR__342d5xB4vV_yqRYjLlNJIvZKiLnCHu1DPwFxXUCB0SZpfUDyCKwQeC9E9SS5dS6nOTGqs8MJAVo2Q-l_IDRs", - "dq": "vM2cCMW87xNVUnRJhE-WjC5hbu9F-Aoe44XNPzRDsN3mdyN92ZgJS6HD_9fsU6K-W1eg88NpMpAaUQhel16K0fr_50e7NxDLuz6bgpac_KuAGMpyiVanbxujHR0ODZ5ad6oOJeQmGpc9Ij8ettDUyU9yKqiKQ1knvec9RzEVyR0", - "qi": "Xamq4vSnrd6jez7YaYdCU6THSykIMrmyHcXjTMrf4WpeAXxH_Wu3F-jPIFy9zTxkZByMwmCqaBqQ_IJmFuqLBvcjpZ_NQmn-wZA4eYuPDnm2ZBhqbzS9b1jhWcAMYeIm0F744vJqqcymqEQnnHYlDyM39_cfrXtmf9gazwglRPA", - "key_ops": [ - "sign" - ], - "ext": true - }, - "publicJwk": { - "kid": "8zan03XlrmI", - "kty": "RSA", - "alg": "RS256", - "n": "y3E2ffizby9vClbahFgkg8_NcpA6iYTwkA4TH2i2-usyH87nz3uM5LfRa7KIV4ZHOvY-DZr6H1MAqaFCPrciWZnPPyTRxlUlYhfb4n42g0Bwk7Oh7z-KZvIqR45x85NfniR3uB8xu47VdTWCmWJge2glMavdWC8mr5Pc8um3Fr5eMVactUFsp571SrVKuY_u5qJHN3xmn7mLpiLdCIHFlBkvvLgcAcUmXFhn8cCzHCqkrcrRgfjhd5YJmv6wxxINrTMT4_dS4jxE5u1Ezw-m6xSIWukdW21lWupFHNZEK5VvIkiCBl73Sh0vO-gv4XNJcQmPRpqMdHat8GLG7I2PHQ", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - } - }, - "RS384": { - "privateJwk": { - "kid": "2N9QAEg-94s", - "kty": "RSA", - "alg": "RS384", - "n": "tqhzPmOds6zvDNX3IHCr7SW5kf6GlnlpW-Rm4aQot1HmtKnsXieV99VjT98EspvcFeKyT5jcJFgZMHb1n_kOtRnhygFHNZQ4ooFmFI2VP5lPUuOIGppWiO5ZxIzECdnwAGoZ7A1hu9Vh5oJJP-m_88JX3sdbHPlsEpzdXHf-THZKAqPYHGNWeNPkmQuON5PaEwiJGRWQ0dbMZtsiMoVCPjh7ZQM-1N2UjXmSAcCCxst5BaTUwQQuVmKIT-cfxP9ShPjP7_DmpRBDOp7_frMKTPkznL0HPNWqSRRewGWB6AcrdY7WtWI5hHNDx9GTdLmolFOvnL4cgtr99u9adq6vAw", - "e": "AQAB", - "d": "akN_oCk2AuS1weLsvYuvCe0rk3re88W4fMRY8iadpWDZdftxTql6_s6-0yWsxvgTxwu2rsYANIioRuC-Lw4m90cSa4Ho2ovbkvby2zwvOuvHETLb6JYnh8wan1VBa3XFwYf4grKaTDtslDzxvmQPzxEeK7YRFL8ql3147qXEZNhka8uIo4n-CdbMG0IazaUJp4oTjt9vId_8PDNqc70qGpCE46bh4Ee76GgF6DfWhnHn2rW5uSatjgQbvA7xJ957GVNlA4k-MC3U-S5DOi_cK6YytVdtNIkBY2EaRhtZQQSw0lRvFXxwenaXZsGAbdS9wOhkFfJYiokkxtbdlAkMgQ", - "p": "4-vsibMRfgglnalDkJpUxEJ1Xj4CNzAUr8FZobhqLdhKn1VPNHWIXudmsBuHT6foRLMTTS7R2kzcPWs_c5y8XeaLbETJKSgWtWDjTuBH0J7gg8_th75EInPfhzA79HKfH145DOfpIwMYAxtsDHNvGUjyBwb0Jz6r-at3oSwQncM", - "q": "zSkGydk2AqlUztzU7c2y2KEV8XKuHD8pxloNQEQf42Q9WS7dyYDjKFAfh75QkwHTHxLzzHR4IF83TlYoSslJ7ODiFVa9c_uYScsS9EpOlEtRgiADtlaAkg5o6iCGRPKEKVh9bWZKDcOIe1P-1E_7nw42WcaiHkWhHoV4FWTCVcE", - "dp": "txxX0NkYeJS7A8t1CLu01mg-OxS-WvA57mn8RL0QMPzQFupG0_KJORXXniy_rPNM28SzARNYbXXKi12agJuvihEqejVZF8OpWtcYR8pQZ_78iWmHf8MQok1NjCLoSB--T0k3tHKtDv_xTq29RNOIslu0dojTpqPnLpLfbZElWFk", - "dq": "d5IVtsa1x89Q8k-aeg6M0dzwoQwplaTqgAQz_OS3gRwG9VdvQ-WufuxTtBWjeEpz9YRiOyMWcCeOYEWurgeq4jgfDDjFqjdUho2oumAkdCGBm8l04GyB-p4TX4EdQEnn5QEB-STIvETd4qMNvkfvasApxSETk3kZcmRvnGhhKwE", - "qi": "U38wGRTDA1-NrZFFX1ipttBYz-IFo9VbniwkH0IzQh_yUOKy4iGVvcxcaQyG4X0gaVWrAVi2gUrwZa0a_BCZyX8SNYh7M8EL-9MwL0qmsEwnD6Jq0tvfxFPBll7NyZM5iTLj9I0gWOt1bdcd_WAM3Bm8xOjU8X8L_mpQ4x7WTWo", - "key_ops": [ - "sign" - ], - "ext": true - }, - "publicJwk": { - "kid": "5ooqXseJdoQ", - "kty": "RSA", - "alg": "RS384", - "n": "tqhzPmOds6zvDNX3IHCr7SW5kf6GlnlpW-Rm4aQot1HmtKnsXieV99VjT98EspvcFeKyT5jcJFgZMHb1n_kOtRnhygFHNZQ4ooFmFI2VP5lPUuOIGppWiO5ZxIzECdnwAGoZ7A1hu9Vh5oJJP-m_88JX3sdbHPlsEpzdXHf-THZKAqPYHGNWeNPkmQuON5PaEwiJGRWQ0dbMZtsiMoVCPjh7ZQM-1N2UjXmSAcCCxst5BaTUwQQuVmKIT-cfxP9ShPjP7_DmpRBDOp7_frMKTPkznL0HPNWqSRRewGWB6AcrdY7WtWI5hHNDx9GTdLmolFOvnL4cgtr99u9adq6vAw", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - } - }, - "RS512": { - "privateJwk": { - "kid": "b3Miw_cVIr0", - "kty": "RSA", - "alg": "RS512", - "n": "3vyjzgsA89bJHD7BZ2MNadjFOPUXpuGKlC7OumOspC_iOSMnJ0Kh7oCWmsBTuzGdfY_gYMaXx28NK-LVjGmaEKZxPhdCz7yzofUCMWoVXNhE4hwBdZt1mNl0abaKNzJ_8BhbtTNhourfBvRwebMYFYO0LfEkApE-hM929pFERb0G3-_ybw8A2cqQFvQ67JhYsBcFUwpf68xZvfYTbdsJzfkkoY0UgI01GU55dZskPBK-_jndzo_bNo8wdENU_cUdOllNdZUoWAemWOGoHKdNshGKy6OwZaC9xqaE_VzF-RaYEcf_jaLD7GbPrz9Xcm9sygnFV3IDlj9-0fjKOkAwqw", - "e": "AQAB", - "d": "vRW0fWK9Uwe-D7JzZA0NccT8MHk8rikwzskGSe19lth314WkjNkm4Uyu6NjP57uB1dhsJwQf7mCP5bf6548gsp_BBSrKX8ee92YAjxBqvwkxGB8xaZ4C0TMMURwWBgpPjLPLCFNiprjNmGMtATXJ5WyCHDcQFxE813fpY9n477xuCieCuXbZOH0NRwviXncs_TriRFErDj3DFNUxhEnlUJBgIwiAaFNIXTOmLUVDgDX7DBL0XlHEJZ-WfIixHOwGX5WTFlDlPpqE1qXyTLc0yNaS-5P3r4q1ZgDJkEtc5M6cv6uYQmtu0lQmnR22HfuutGIhTBKiHNezpBwQYsPwQQ", - "p": "-R8uHmGlVW5RsOZsWU5dcWIrDgLnwNS4pFVScEwEurQR3JyFt90TZzps8tvpBvqJ3WwgTV38TVlxt31FHQzogJUTvoCmu9kvcHo7cDPKgrbwUdeLuwCQJat-ae2Ay1PHdsGo6l0k32nAwSclurJwHOPesEnYKmVz7GrEcQeakks", - "q": "5SS8OQOsADYKG7upakUXPMzWZVlODOF_vqDaCf1cTTg3Sz84bJsOcyuCy3y1lFepkD3jL7lRXqGFeDVyp8fSQ6O6j9GV2K7FsdTQts7S6zLyG4MmfIaTX97f28gGaMA0Vfp4XghkpJrPZp3vAVXi4vHQfcEqLOv3BfWbtT8s3yE", - "dp": "v4tf1HBTxUobeZ7R9CCy7DkEzbMiKjvk9EW-KyXoBP3rNesLTYGoJ5jeqCS6GWmNkzhN5e67zWVWcDTbbSi9pA_7rGAS0yB8v0jcZrsLnFG4mdTXVSNrsesYOa4pdyylkwP4MqsHbNhNIrZM5i3I0g3K7VT55i83YLH-9MFZ8d0", - "dq": "sr_5ZLCMmI2PTRsTiabj_bX8-Yq07C9sq5RnAqv2OPbFi5mBtpcuqoEiwwJB07qet7rPYwc5hoyRxbhL_L5QNBuhCVgBgMq1xYeyWSj2OCvB2dxxRWrlxD_keVqMRWLKcNe21gPOHun1KKPDMlOBbnAcqDzrXaelR6zVDop9woE", - "qi": "cl2oEYi-L2OYO5oyXJK9Kc-Oj2098Tx4o2WbfIZXQeOO48SMz7iRa03FOmh-b0G8WrtGxm7pVWIbryvBVlaLJYEhughgR1vtiSd_nJ5XCxDAF9p8h3hEQrnr8rmO0HTNE3z9PqBmVOCKvgbzOOa9S7YL3LgMMdCrs-CZLNJixio", - "key_ops": [ - "sign" - ], - "ext": true - }, - "publicJwk": { - "kid": "tfz-MRyl3GQ", - "kty": "RSA", - "alg": "RS512", - "n": "3vyjzgsA89bJHD7BZ2MNadjFOPUXpuGKlC7OumOspC_iOSMnJ0Kh7oCWmsBTuzGdfY_gYMaXx28NK-LVjGmaEKZxPhdCz7yzofUCMWoVXNhE4hwBdZt1mNl0abaKNzJ_8BhbtTNhourfBvRwebMYFYO0LfEkApE-hM929pFERb0G3-_ybw8A2cqQFvQ67JhYsBcFUwpf68xZvfYTbdsJzfkkoY0UgI01GU55dZskPBK-_jndzo_bNo8wdENU_cUdOllNdZUoWAemWOGoHKdNshGKy6OwZaC9xqaE_VzF-RaYEcf_jaLD7GbPrz9Xcm9sygnFV3IDlj9-0fjKOkAwqw", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - } - } - }, - "encryption": {} - }, - "userinfo": { - "encryption": {} - }, - "register": { - "signing": { - "RS256": { - "privateJwk": { - "kid": "xaDu9yTDJwA", - "kty": "RSA", - "alg": "RS256", - "n": "0d4up4hx3l_HZa6D2PO-YYSqgNbAWjtlIbnFWIZS-PRzVFgDKcR9bLo_9-MGm0sT0tHbyeqc4V8o5oeYF0uhNmlEuU9Do2VYiyc0fkNeW1nFrC-XJYxbnge4Pxbhl-0Jn04O8IJsP15xq16GfRZxYfjKPeFilQNeDwTb_SBqoveZASHUW998eO1bEg0bjUZs4Yy23S4R23ABZKTQMPMGMETGFVbcFNXUohu0eSYMG4eU9iaFNmh0p0G9lU7ER-UFSatczaEFle0Awazb7-EHN6iya3zL6LDt-ezlIszTzHIXa2Dhhga2SlDIyuhFUOkkEeCP3a-sFeXre-JWiYz8ZQ", - "e": "AQAB", - "d": "MMLZvi0yn8NLNfHdSnwfgNLtNrAu0wg30CU0mAPlpVhOr4sfeQXhSnDfyf2inFROT85YrcpoFukgPKfGi6sT0uuUfyXOhllWwEYkqS2H79uk1QPdr2i0JLyQb4AmfEEj2jKtv-3drr-H05RL1SZww52lh8klOZAlu4Gah26PuDs5Oy4VcgdiiNFIaBAd1WzCmDxW7xd-tMc709s76eWXCa1F4ZJJny3uGCtJGVBUnfrao6d_RJNw4BX7pje5hYcwSFnZN3AiMmzzje4CP6JU7lSpMImwqOtKhIHbFEGSTfnCb4bPbwpQc0IBYaUlTrWCsXDQgYkNdsLaFiVdsvGWgQ", - "p": "7ynGMOB3sQXZ7OoW051wDUdsByiwx1_j7ecpLZ1rSTZ7-TCERMXQq0okQHkVpx6AlU8tOromhMxd_yGFEPOIHC7ZEm4o-f0-DzkDO6RPCCvhli0IaxhaGHHh0r4jAhQf7IlaTkdWt_x1wLxUTgIeS3FUiR_I3SvgeX0oBnTCPuE", - "q": "4KRx-LfdeI_Po7scXMqwbYobUgUdHIwGMKhrnerG_Kfv6b8K7PWNjfrjPYS9MR4OM1_9fs3I9xvr-Dc9oBNFU4AYn5bgTdxiPxLqwPemkKD-R4PswCEFn6bNqec7rDx_a0139SUjGTpLmHJEBk6GxESxc4cmy7B3uH0hpLnEAgU", - "dp": "GerO_XD1x4s4yIG9o4UGJYo93LC-J3zuuFM6lSTgAXkUCjcFvmYpbMaGEy6L-CZIDOYdoqWVkwKKlSFOyD173IH_KA4kBqM43HFzNj1iCyKmOZ37sY9cBBYjQLE2Hf2MUBe6X40_ioSjRhWilSmJmudXH9z_6Wfd1YyIj9qLSkE", - "dq": "V7R8duG6Sx7Cr6cW7LeJ6Ep6Xix28DVPGWI4GgCWzf_3MCiRaHB6YstoOxV_FBUq8C3y97X6V1gEafWPTtcXQwGJG425Z0y64utM0igeVOs2O8-q-FwsKOfj9gi8iINaMBef1Qs5x9i1uQArxNaV0T0MlxFWOUJdi573KqwIdc0", - "qi": "4WRsDyw9pg2iIva4THIhvg0eda_5wu-gorBCQRh5cxtJ4DwMV4GfTL-PUP6u8HRhR8Ns3XLbOk2pAfft9aPTCI9wr_ke1NUyupR1EzGOEekdfHtpgQP06hU7nhSMFbj9OMQvrw4_3k_5BXHQXsp7wqS7QtawQDWbS5BKc6O4nZA", - "key_ops": [ - "sign" - ], - "ext": true - }, - "publicJwk": { - "kid": "FRI7f7sJKUg", - "kty": "RSA", - "alg": "RS256", - "n": "0d4up4hx3l_HZa6D2PO-YYSqgNbAWjtlIbnFWIZS-PRzVFgDKcR9bLo_9-MGm0sT0tHbyeqc4V8o5oeYF0uhNmlEuU9Do2VYiyc0fkNeW1nFrC-XJYxbnge4Pxbhl-0Jn04O8IJsP15xq16GfRZxYfjKPeFilQNeDwTb_SBqoveZASHUW998eO1bEg0bjUZs4Yy23S4R23ABZKTQMPMGMETGFVbcFNXUohu0eSYMG4eU9iaFNmh0p0G9lU7ER-UFSatczaEFle0Awazb7-EHN6iya3zL6LDt-ezlIszTzHIXa2Dhhga2SlDIyuhFUOkkEeCP3a-sFeXre-JWiYz8ZQ", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - } - } - } - }, - "jwkSet": "{\"keys\":[{\"kid\":\"QMa5xaKOYwI\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"ol8T6mc7t55kUI3Xf4pHsx8p25VqZ3jm54TQY6xZ07FYzwU8ex02Mg_W_VABRNyVq8wdUBKubo1W8iaKtvtrr0XDOyHUAlwM6xa14332c9akB1AmTirZY4gvyobIY-b18F8LpeIkkLUcypeZmsDd-bGONEJs0sxM6LtLCY41s_lgesPdQwmHLBw4_Rw9NcjBslupWP_pSXUW9x2fj8tKHOoURqmOWL-54t9YbDdIht06uzqagzjPV3UoYtvRsu2QUJx99ExgNvCA9pA1wyiyysyhUdfeKyZpwvTfwWxkrwZrE6zb1AZICFW5R3Bgg0b9UnS96LpFxbSO7rXBRWVKOw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"66gqKTPVHyA\",\"kty\":\"RSA\",\"alg\":\"RS384\",\"n\":\"rWHV18o2T_9zhO-YknvC9brSjWru496-Dw0iVCiJdEZph94aWXeZW4tYsSjYAfzCJXQUrIqfoPTx100KoYRMiUGpVUh5AgwqAitOpFV_Cxa2j4D01qALwUXWblmJTeCzY7zQFOs1-OBU_U3fhsqcHVPHVlfwO4fYhe-FrhQwTDf55JIW5OGM2bViRxpPyZ3t9nueSuz1jEDCSRlaizJq4jhDrkYWoXtXomRfoseGrZVwTGx5cslfrYs-AmLWMfLkZQWjYZMcwOaJCy3dSkTQkmas4dzGwQqrOqNbgznyCo3oTpHboWS36e0jn_lnbq95zPpZkHNsOzw-Mzq0KRj1jw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"zPdTDVkjms4\",\"kty\":\"RSA\",\"alg\":\"RS512\",\"n\":\"tbVEZHw4LP21DFHmF0QjbSektUEGl8t4blGcZM871ieppUVZ_uHKlfan2ftnQ4GwBISkmjwk6KP1nc9iiONzqAhJbFheQMT4RAmYz7xPJP9cAPOiD8YbqzO2xJqBT1OMc2PDS7ICH0-t_kBXMb0IR61CTG-CmO5Tp8ecauUkshvvYg0dA3-os16Dy5ex4if3ZSpfXowmfjRrvYAKEPeFTmA9Q8lMzN0ZyuEb2nILIeMFwTAjo8Ck8D1h4keOVaY0mfTgC9KxkR1kIcAc7DELYX-vjG63AwB-8IIo735g5NMrFj22923jymMDpQDTEMui-jW1TQYNGR84ShNW_nJZGQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"8zan03XlrmI\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"y3E2ffizby9vClbahFgkg8_NcpA6iYTwkA4TH2i2-usyH87nz3uM5LfRa7KIV4ZHOvY-DZr6H1MAqaFCPrciWZnPPyTRxlUlYhfb4n42g0Bwk7Oh7z-KZvIqR45x85NfniR3uB8xu47VdTWCmWJge2glMavdWC8mr5Pc8um3Fr5eMVactUFsp571SrVKuY_u5qJHN3xmn7mLpiLdCIHFlBkvvLgcAcUmXFhn8cCzHCqkrcrRgfjhd5YJmv6wxxINrTMT4_dS4jxE5u1Ezw-m6xSIWukdW21lWupFHNZEK5VvIkiCBl73Sh0vO-gv4XNJcQmPRpqMdHat8GLG7I2PHQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"5ooqXseJdoQ\",\"kty\":\"RSA\",\"alg\":\"RS384\",\"n\":\"tqhzPmOds6zvDNX3IHCr7SW5kf6GlnlpW-Rm4aQot1HmtKnsXieV99VjT98EspvcFeKyT5jcJFgZMHb1n_kOtRnhygFHNZQ4ooFmFI2VP5lPUuOIGppWiO5ZxIzECdnwAGoZ7A1hu9Vh5oJJP-m_88JX3sdbHPlsEpzdXHf-THZKAqPYHGNWeNPkmQuON5PaEwiJGRWQ0dbMZtsiMoVCPjh7ZQM-1N2UjXmSAcCCxst5BaTUwQQuVmKIT-cfxP9ShPjP7_DmpRBDOp7_frMKTPkznL0HPNWqSRRewGWB6AcrdY7WtWI5hHNDx9GTdLmolFOvnL4cgtr99u9adq6vAw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"tfz-MRyl3GQ\",\"kty\":\"RSA\",\"alg\":\"RS512\",\"n\":\"3vyjzgsA89bJHD7BZ2MNadjFOPUXpuGKlC7OumOspC_iOSMnJ0Kh7oCWmsBTuzGdfY_gYMaXx28NK-LVjGmaEKZxPhdCz7yzofUCMWoVXNhE4hwBdZt1mNl0abaKNzJ_8BhbtTNhourfBvRwebMYFYO0LfEkApE-hM929pFERb0G3-_ybw8A2cqQFvQ67JhYsBcFUwpf68xZvfYTbdsJzfkkoY0UgI01GU55dZskPBK-_jndzo_bNo8wdENU_cUdOllNdZUoWAemWOGoHKdNshGKy6OwZaC9xqaE_VzF-RaYEcf_jaLD7GbPrz9Xcm9sygnFV3IDlj9-0fjKOkAwqw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"FRI7f7sJKUg\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"0d4up4hx3l_HZa6D2PO-YYSqgNbAWjtlIbnFWIZS-PRzVFgDKcR9bLo_9-MGm0sT0tHbyeqc4V8o5oeYF0uhNmlEuU9Do2VYiyc0fkNeW1nFrC-XJYxbnge4Pxbhl-0Jn04O8IJsP15xq16GfRZxYfjKPeFilQNeDwTb_SBqoveZASHUW998eO1bEg0bjUZs4Yy23S4R23ABZKTQMPMGMETGFVbcFNXUohu0eSYMG4eU9iaFNmh0p0G9lU7ER-UFSatczaEFle0Awazb7-EHN6iya3zL6LDt-ezlIszTzHIXa2Dhhga2SlDIyuhFUOkkEeCP3a-sFeXre-JWiYz8ZQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true}]}" - } -} \ No newline at end of file diff --git a/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt b/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt deleted file mode 100644 index 3dd4d7a1a..000000000 --- a/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt +++ /dev/null @@ -1 +0,0 @@ -protected contents for alice diff --git a/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl b/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl deleted file mode 100644 index 337ba077a..000000000 --- a/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl +++ /dev/null @@ -1,12 +0,0 @@ -<#Alice> - a ; - - <./private-for-alice.txt>; - - # Alice web id - ; - - - , - , - . diff --git a/test/resources/accounts-strict-origin-off/bob/.acl-override b/test/resources/accounts-strict-origin-off/bob/.acl-override deleted file mode 100644 index 13df41ce6..000000000 --- a/test/resources/accounts-strict-origin-off/bob/.acl-override +++ /dev/null @@ -1,5 +0,0 @@ -<#Owner> - a ; - <./>; - ; - , , . diff --git a/test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json b/test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json deleted file mode 100644 index d77cc8409..000000000 --- a/test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json +++ /dev/null @@ -1,411 +0,0 @@ -{ - "issuer": "https://localhost:7011", - "authorization_endpoint": "https://localhost:7011/authorize", - "token_endpoint": "https://localhost:7011/token", - "userinfo_endpoint": "https://localhost:7011/userinfo", - "jwks_uri": "https://localhost:7011/jwks", - "registration_endpoint": "https://localhost:7011/register", - "response_types_supported": [ - "code", - "code token", - "code id_token", - "id_token", - "id_token token", - "code id_token token", - "none" - ], - "response_modes_supported": [ - "query", - "fragment" - ], - "grant_types_supported": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "subject_types_supported": [ - "public" - ], - "id_token_signing_alg_values_supported": [ - "RS256", - "RS384", - "RS512", - "none" - ], - "token_endpoint_auth_methods_supported": [ - "client_secret_basic" - ], - "token_endpoint_auth_signing_alg_values_supported": [ - "RS256" - ], - "display_values_supported": [], - "claim_types_supported": [ - "normal" - ], - "claims_supported": [], - "claims_parameter_supported": false, - "request_parameter_supported": true, - "request_uri_parameter_supported": false, - "require_request_uri_registration": false, - "check_session_iframe": "https://localhost:7011/session", - "end_session_endpoint": "https://localhost:7011/logout", - "keys": { - "descriptor": { - "id_token": { - "signing": { - "RS256": { - "alg": "RS256", - "modulusLength": 2048 - }, - "RS384": { - "alg": "RS384", - "modulusLength": 2048 - }, - "RS512": { - "alg": "RS512", - "modulusLength": 2048 - } - }, - "encryption": {} - }, - "token": { - "signing": { - "RS256": { - "alg": "RS256", - "modulusLength": 2048 - }, - "RS384": { - "alg": "RS384", - "modulusLength": 2048 - }, - "RS512": { - "alg": "RS512", - "modulusLength": 2048 - } - }, - "encryption": {} - }, - "userinfo": { - "encryption": {} - }, - "register": { - "signing": { - "RS256": { - "alg": "RS256", - "modulusLength": 2048 - } - } - } - }, - "jwks": { - "keys": [ - { - "kid": "QXv-I1cn_YU", - "kty": "RSA", - "alg": "RS256", - "n": "siMc_WZIcylWwv6_0mtLKKkH-jDLIsREie9KRannw_BxVvM96CaFlUHywVu1Nkyw_hqCYFXyr91JnQ7YN_fB7OpcBcx6rjbExlD_piewy2X_vXq5_0YN5a3aPb5P6JSmRF-nS257jdteucmEVJeFHzSqXAU2K5Y_2ZXse9hGTg9MJMnzof4jntb19q02E0qBOGeBqDoMXQU0RJB2uncqUzXp7EJeB4UVwvcS107LTYwPX7BAHwyGorpgWc_DYutZq-4DxycQgvIlO3_hGiFjaWhVOHHkO1DGcWTGOM9DcFels7Abf_XkCPIrgeALlOaqUe6dnK-yFCGwBeJhZupP_Q", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - }, - { - "kid": "TxrWAv0g4Yk", - "kty": "RSA", - "alg": "RS384", - "n": "7d5w1iTgbqF5L8wLqFxS72vXfhmOCRHxOzoxFuAJKDtgceguvIZKcA8Krlm4qE10_Fjm3v2BhTBqKaMWeMMqM2KPCeOOm_APcOEqHLltmU301ErcEU7XJFH90HFJVlPDMbuPvX1_0mi904J-TNQ_XX1s4d1OBgJbEn-4RfongbIQK2Fv1LRclZ3n1__dVikrnngSZEWazdidEMFDlI5KNJv6jbGdQAfPzLWzq_9Fl-wbmGu4Up6COLeQDdGybmPCv3a0id9-jVlyZRauUc2RtO3mJdQaOUZNOuDFe2WT0xmhPhoLXKEWhlF1udJGzm0beY7s0pwg4QjhGi7T75d3lQ", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - }, - { - "kid": "-tvrpKoUfPU", - "kty": "RSA", - "alg": "RS512", - "n": "sGoD0dZ3-F4NaAKQQrPhSGAbkBvJ0OsA3PQiwAhWXMrdOj0n9o2QDQfICdayIHcRwsisQaOz7B-L-pYcYFgMcdhj-yWOYVUMHXJCTqJeiz4zdGqjlCxkOF9ebauahRk_IoXp_hDyx3hqB98giajTn1gpW9G36Hcau4PutfM_jeyxi4iVeQSm8-p7qLCm-qD7ot0vzCqvsIt9cDvm9o5DVwG-LoAzeyZlEDmuDpFrLsFLz-D9rxLfSSdAethycrDA0Fhe1j7Az15NYUItJIkvyM5AsC6X0xyjO1LJWoJfbl9cbfaJQ0c3XKRc_NuxPYcDuM15gw0FaTkgUOYezuALPQ", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - }, - { - "kid": "DA4MU9NJoDo", - "kty": "RSA", - "alg": "RS256", - "n": "vaugR-F0yLkwgUyJPrIxjUrncPFoGlFyfPWYfVlU4OleYqNnEofoUNI2afIqRQlZgMgfxhknAi6IEhQKdNQGOAqzKoBxEvVK30x4XxMyVPMYYWbTCEEX2K5Kna0wJQ39rsajBWBRusxge_bLydt0dun4ZX4lv_BaCkdKn4TB6x3sQtwPyYrkOj7nykBiLzpcNGYKYbL5B5HGJHbcjXqX6ttvUn7B7E_idcyJbFfcwzrSj87Zdp5aj5LSiIqHtih8Sm2Mch5VQDT_U55UT4n8Rc9K_fJ1bQirXQdZZ9CgU4zcjXx8PnaEpeq18EcXxXsdfCN8o4EBUN7YWog1-65CLw", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - }, - { - "kid": "re686ijoKyE", - "kty": "RSA", - "alg": "RS384", - "n": "p3SLWJT-PyQn6n-fvj_s5dNqRJQauAZCC8JFnwUUP6n_LUfCG5tpfRLzZ0yXtsaPfN-z9c8JbXIbsF0HJN3NLTaBOWaZ04yjl3S29_8y-KwOMKlOafuRbYy7sXkicvCnjXRIcV85pAewrpwwHBcI2wDPDbkflwI3m6nurThQAQBDxPWz83QnC_iQ_V3pJGoGYItUGH_sJC06mqATV05dVzHSS0VZSFhEoyEtpykZNnhzgZCOACi4V8P07y0jsxQtqdPYYpqt9qg0Tjp81r-tIIDY7LEWv949rbR3Oad-QBcQC0f4CEapT2nbcVcadODtqPv1pQzSL7sSJ42zATGSxQ", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - }, - { - "kid": "jGE5qoPDlnI", - "kty": "RSA", - "alg": "RS512", - "n": "-WuAFX1DLbsMHagMw_NDJA6yxCcIm2SDgbMmDKOwCN4dR0YWdwKzDJ31EeoakDg-T85HaU48R4Kcx1WQUYnly98vDymMFl4Xe6zS9je-Uh3IVfkYJV3pwVKr2gj1hrX7QglIktLg0o0iWulFe1K1NQ5u7Jbe7ZZhOaetlTFH8KUgS78fajfhcFtrXBliqxHTiBz2lMYCj2ntqX8K8ue3_lVLBXm53AJG3T-ymnUd-nxJ-NsdFMSIzQO1-KUona9OgxDpu1cFoQ-YzOteSz2OP58wDl3gL5urIhzK7Hvu3I3okzlL2TyCHmOhLn6HMHr2-mwEgsYYnsEQwzu6bbY8hw", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - }, - { - "kid": "PhN1R2mze2k", - "kty": "RSA", - "alg": "RS256", - "n": "yGhTYJWPKU-n1gnPQPf1_Nr8HBJ6F-IT6PyxLJoURWrd_DvuW0EFQD1JolKAYWakuJAIWGtb8CXjRdzXrEVYNfshb-bBGYGotISxAD2z_KzEtcBya_TwywAQiMYildsAPRZR7HqvxnUw2iFUwec_gw6aBvu3rPcLnj6z2KKDJDFC1P4LHNDArh4EquhkgtzeD5h6-8cCI1iKpb-Op5nCe1DjUNg49L5NZhNtDlhCEb8P2LEbcV8vldIz9gJu0MSf94zzWu2JGsVtVQ29XPO8SQqrKQ5TKClmR1jIIGCF7t4AUoaaL6AA81F3cyEhKB3vN_D8DzEsr7tuwomLFZXmBw", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - } - ] - }, - "id_token": { - "signing": { - "RS256": { - "privateJwk": { - "kid": "jYjEMK74CQI", - "kty": "RSA", - "alg": "RS256", - "n": "siMc_WZIcylWwv6_0mtLKKkH-jDLIsREie9KRannw_BxVvM96CaFlUHywVu1Nkyw_hqCYFXyr91JnQ7YN_fB7OpcBcx6rjbExlD_piewy2X_vXq5_0YN5a3aPb5P6JSmRF-nS257jdteucmEVJeFHzSqXAU2K5Y_2ZXse9hGTg9MJMnzof4jntb19q02E0qBOGeBqDoMXQU0RJB2uncqUzXp7EJeB4UVwvcS107LTYwPX7BAHwyGorpgWc_DYutZq-4DxycQgvIlO3_hGiFjaWhVOHHkO1DGcWTGOM9DcFels7Abf_XkCPIrgeALlOaqUe6dnK-yFCGwBeJhZupP_Q", - "e": "AQAB", - "d": "EDX50WWZekFsz9n3AuMYt96KB06hbcyGoDbSf3xyxvX-mncQTywSQ_74ZHhACWz5PmaTLskjiLWOmWhcbNtzHmhFb5GoKGp7hcChQzGheSETIN8mRgDOCvTDQ5MqGnRMnTRHOSoYvFQWTrnz_O69ApX8WttujpDhxp9KIgsQetHqnBohh2MWuDZ3aauxR9jdeeoZUGzRpqOgQxqXRNP7V0mHC6KrsClfbeq1jipMEW2EShopmWZdn_k7cnrKL2Aoo_Lox3XQhTnAcNiBj-l9kzls629lCoCarPQCZZaaV64NumhRqORUZ7QlG7csQrRHuxzT54ljbERRGiZfNlZ1UQ", - "p": "5C2Emcxi3hQ4wJOr7Vqr4nvaE0MY1TsBpfomG7h-59VDYFb11zcV4HIG1hfUd6LTwaYqMGmtS1_WFt9S-wuKZyJ1F64p76ywBOgXi6IArsV2uxG24HHO-mPoefeQU8eQtbbPkyJXZcCZJuNFlwPEP9y_NsV0ExDgVZr82U6qcpc", - "q": "x9uYjcsbRF6c2d3Ogb6Jcc3pfm0bocelg1tKfV87urYOFJuT-0ZYN-wPgj9l-IH1sobwhraTTCir0tkrBr77pUTQHO30B3eOScPUDl5p9NMIFpg1agl6tPp7z4jM7rPrnsFh0UjuGt5jHQGpDPQCNDpE5_DukuxCUxm04giNqIs", - "dp": "jRO3kH_WAQjvreGfwzj0XSvGQXKSwAOjmUN4nFsN27j313DsvwvH8uWNZIGHVBDQbEKYgyZThu7SJ4IchCs2f13Gl8WPGCjlC6OUKzkWwvhD2JWzREIZfqaW7hIqoiIZTsCgxo_NCZRzHKAYPq6NgA60CuE6Sy98BHG3M4R3zjE", - "dq": "OK6MLrLK8fIPdC7XMa7zVkZ7EXMqYhC4XW_XyYTn8MVPawLQznQd8wZNQ7htWDSrlU12DA7d6byjNrKG5Gvn_PBuQbYu_qsmvL8Adm7KiDgN1DKo-4Div09HLA31aUG38peQAYY4mYA3BfQBmP3fXiakgk-vqhW9ncntpimc248", - "qi": "raxY35RjgNgbTeIbBzD3Jm0Xz9oCW_HMf8sA3ruvx3erRqhVTeWEn3IpVwYGs_mjxO1IPGzBpGHSTTwObTiDU2Bgv8msniQHcMuld-fye50Rq1K4GBnCsv5frYM2Bw5Z3V5cTsda2zG_QczqV84gu6-vezRcLZyoWFMRXkng6hg", - "key_ops": [ - "sign" - ], - "ext": true - }, - "publicJwk": { - "kid": "QXv-I1cn_YU", - "kty": "RSA", - "alg": "RS256", - "n": "siMc_WZIcylWwv6_0mtLKKkH-jDLIsREie9KRannw_BxVvM96CaFlUHywVu1Nkyw_hqCYFXyr91JnQ7YN_fB7OpcBcx6rjbExlD_piewy2X_vXq5_0YN5a3aPb5P6JSmRF-nS257jdteucmEVJeFHzSqXAU2K5Y_2ZXse9hGTg9MJMnzof4jntb19q02E0qBOGeBqDoMXQU0RJB2uncqUzXp7EJeB4UVwvcS107LTYwPX7BAHwyGorpgWc_DYutZq-4DxycQgvIlO3_hGiFjaWhVOHHkO1DGcWTGOM9DcFels7Abf_XkCPIrgeALlOaqUe6dnK-yFCGwBeJhZupP_Q", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - } - }, - "RS384": { - "privateJwk": { - "kid": "JXnna97ZRPY", - "kty": "RSA", - "alg": "RS384", - "n": "7d5w1iTgbqF5L8wLqFxS72vXfhmOCRHxOzoxFuAJKDtgceguvIZKcA8Krlm4qE10_Fjm3v2BhTBqKaMWeMMqM2KPCeOOm_APcOEqHLltmU301ErcEU7XJFH90HFJVlPDMbuPvX1_0mi904J-TNQ_XX1s4d1OBgJbEn-4RfongbIQK2Fv1LRclZ3n1__dVikrnngSZEWazdidEMFDlI5KNJv6jbGdQAfPzLWzq_9Fl-wbmGu4Up6COLeQDdGybmPCv3a0id9-jVlyZRauUc2RtO3mJdQaOUZNOuDFe2WT0xmhPhoLXKEWhlF1udJGzm0beY7s0pwg4QjhGi7T75d3lQ", - "e": "AQAB", - "d": "l-OKObOifAIv2A17BC6v5qH-IE9BGxmR6DfoUKsOLdp8Yz_XWBqIPbXdJCe2egG7ycca5RkLM3kO0TeKieJVeCpfG_lqfrhzo6ijs2PUUCgvRb_ndkXZqx-P6yHrqmwiIAecaWtRy5GGZSDWdUiyjYghlrgxsjSe4tkbWdO6ll1aNvByRPiN50iy_oIWpW2hR9zt3gJmgrhJKpimZUi4HErZtS9xoUkp-9lP4cAgTs4YqhfGI6ID1dBVsvua7ouFCZqz8ldB0Tqw2qqvwnpDe6REFLe7dSPv6yzOBrTPdyALyCl391T-teiWXLFRDpONYaoJm8ATIJ_ScEncGgqeAQ", - "p": "-oXU6Sz1EwDLGD7D0ct4SC0zIN7fvmpJSEyL_1NlewO0BfZoMr8-gum4yRttBKbqjzWvfecGWNqXSlhuoTiEfBav76vn9Ah9CTUbWXQhz7-kebT72SB2quzib-0NUzFlHB6kyepUOXZiwbhTuAbY5OF0QcudVwVLs_rJMUVugRE", - "q": "8xHJJ2-MRn_Jys6xnS_ujzvWvyUVksDYUwkzcyaXR9gQSx1r7N9FPiye-r6r-6Z7T9jSiwCDzmQeu9O4oBlmLdDb7PdYweo8K_sbIIS8gdxg3fkqX3VPPGtHcRZUM6OE1euAabfo_a_SDDXo9wU2w7POpVCjYJYUqRWhwS3DzkU", - "dp": "dtN1yme9kpbkvgo_PUpCMhHmV2f_PkURn05XdPKshq2Z_N4ETFWzo8qSECmHCxbU2LqBE7m5o_mCmwvY5XV2OZlVN9wU-AXysKRU5ZgU1YIz1FqIvlMMlkQnnykUEeqy56SNSwxviJXjf7kbVIVC6UUarH6UkYr8flCsj0c8g9E", - "dq": "OcX7csUfqU4MT4kLTFotMJw_cZVF6GivwiTIttDwWiIv1Tq8AUQcOCfw7ZZOWHT8kEDv4hwQOAkyCODM3DjNQYyICW3NCeI7xRRdIUCLca5I09m6SZAfcjPpeiadgtyV4SalkfslhM66dS6HHdd-acueDUr6WiWx6XJ7zOesx6U", - "qi": "vvHbpuUf7IvZqsHBXXKL75yA6pEOzm_klHRoafrku40DHbddXD68MSBzsifTMyEbzNNwj2N6YygWoF7OhXbl2rET2PQrDJUBrdvoaUKdg7MqUPHKASlRt_OUV81Tt5dR-UcIvZ8JnsjR_HTC5FZd5uXvxn8VLztUhKYm1UBbVtQ", - "key_ops": [ - "sign" - ], - "ext": true - }, - "publicJwk": { - "kid": "TxrWAv0g4Yk", - "kty": "RSA", - "alg": "RS384", - "n": "7d5w1iTgbqF5L8wLqFxS72vXfhmOCRHxOzoxFuAJKDtgceguvIZKcA8Krlm4qE10_Fjm3v2BhTBqKaMWeMMqM2KPCeOOm_APcOEqHLltmU301ErcEU7XJFH90HFJVlPDMbuPvX1_0mi904J-TNQ_XX1s4d1OBgJbEn-4RfongbIQK2Fv1LRclZ3n1__dVikrnngSZEWazdidEMFDlI5KNJv6jbGdQAfPzLWzq_9Fl-wbmGu4Up6COLeQDdGybmPCv3a0id9-jVlyZRauUc2RtO3mJdQaOUZNOuDFe2WT0xmhPhoLXKEWhlF1udJGzm0beY7s0pwg4QjhGi7T75d3lQ", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - } - }, - "RS512": { - "privateJwk": { - "kid": "iArDjqR9QcE", - "kty": "RSA", - "alg": "RS512", - "n": "sGoD0dZ3-F4NaAKQQrPhSGAbkBvJ0OsA3PQiwAhWXMrdOj0n9o2QDQfICdayIHcRwsisQaOz7B-L-pYcYFgMcdhj-yWOYVUMHXJCTqJeiz4zdGqjlCxkOF9ebauahRk_IoXp_hDyx3hqB98giajTn1gpW9G36Hcau4PutfM_jeyxi4iVeQSm8-p7qLCm-qD7ot0vzCqvsIt9cDvm9o5DVwG-LoAzeyZlEDmuDpFrLsFLz-D9rxLfSSdAethycrDA0Fhe1j7Az15NYUItJIkvyM5AsC6X0xyjO1LJWoJfbl9cbfaJQ0c3XKRc_NuxPYcDuM15gw0FaTkgUOYezuALPQ", - "e": "AQAB", - "d": "Tuh8oOVvcBaRpI5Q_KT9BaSHb6QeV2ZmUm6ZBJA2IPdUkPI959hWMJ3kahIwRrk7poagFhQlLF7H--Qc-TMpDdsejX20-_BQpPMwmX-jDmFaHp58YJCim1x9Hkz9pr8uMED58vydu38u3ip9oVV0oveKOFnMCx0LRgizQ4t0SARyvQRUTcI1_MzVufsSLO_fI_eZFN4xyxEXp-oCajhBxyf7AsYfg1LLPsziZNXU8Ept40E6MrCWII7BmZ9wKsmgr9HpPwGFr55X8EEGPtXgwVRLQ1zyQvQ65mD0vuhRiNvSFZInTrSGouRIwDW-jXM4ThuISPhfnQYDA8HZNVrsQQ", - "p": "4pLFRcSFgT3IjTvKS112P7o84e5VY1mJnnMZh-oPTMTrY5-gdTfbhiYR0c7hLJllclsNPLie3kai53yh7jQbs-CTdv6ZxFzmPwv_NADwm5RMSF5EfVhu0USFyI4h85b4FWbBAh7dI4ajI-I8uS3XDqyy_ENZ6wFenMsRKDHZRik", - "q": "x1OGU2g3yID1bFk54RJvAha2cSTWy2T48IiNHva-req_RDraNDdKZOr1QDEnnAaYxP0oT80ETSbfpC5bmU56ZuRA-aZUwiugWqMU-w_A5Oe8NtEH1X05iE3sOPzjV8wtqomgRdRDmwLHmwygV5cWEOBnoiZ0lke8nI28iY_xdvU", - "dp": "YOzwv3vmsPdBSEn_rGX7JCAD05MlrC6tlL8geOhES08ic6fh-MNAgg7fKKYb5fxpTZZt_z_rlqMZJXZHv6NDBpxX-VvJZBtp1CbJsfGE_MlgKMVK_2RJY_SwVq-XDqHS1zTx9HpHl98NA1jRKVbW3Uw79XbKjKI1W1XzrQJGNKE", - "dq": "cVbEDY84EPGLG9XMfHdv2Z8ylDlfTX4XsyXiIJYrLFdL9K8GPiSmT6XuWFba7_QsT-6nSmEILhqJliCqAw1FulXVwF7c2R_XaVJL7soxY7eFJSJMsw8mdKPiSzE40EaQPOVO1gXxfyXgfAB89_E4IdaH9wKozn7x9478grfvlDU", - "qi": "o6vR6kC1LTU_6D81fEAf9tXSc-01yuvWxIHc_mRcbI-h-H7BRXBgZrj5X7j3ttPe8g3aG13FZ6y8GpNSrs4LgqNc2VGhxlV8FAV_gVnbgGkpnQaUVtecaHgz03mHOH5hBWOmqBCOLqS4De1KcrwZ1bmhinVu24FVY04Tq82Dc2k", - "key_ops": [ - "sign" - ], - "ext": true - }, - "publicJwk": { - "kid": "-tvrpKoUfPU", - "kty": "RSA", - "alg": "RS512", - "n": "sGoD0dZ3-F4NaAKQQrPhSGAbkBvJ0OsA3PQiwAhWXMrdOj0n9o2QDQfICdayIHcRwsisQaOz7B-L-pYcYFgMcdhj-yWOYVUMHXJCTqJeiz4zdGqjlCxkOF9ebauahRk_IoXp_hDyx3hqB98giajTn1gpW9G36Hcau4PutfM_jeyxi4iVeQSm8-p7qLCm-qD7ot0vzCqvsIt9cDvm9o5DVwG-LoAzeyZlEDmuDpFrLsFLz-D9rxLfSSdAethycrDA0Fhe1j7Az15NYUItJIkvyM5AsC6X0xyjO1LJWoJfbl9cbfaJQ0c3XKRc_NuxPYcDuM15gw0FaTkgUOYezuALPQ", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - } - } - }, - "encryption": {} - }, - "token": { - "signing": { - "RS256": { - "privateJwk": { - "kid": "mBFgdSiTnAQ", - "kty": "RSA", - "alg": "RS256", - "n": "vaugR-F0yLkwgUyJPrIxjUrncPFoGlFyfPWYfVlU4OleYqNnEofoUNI2afIqRQlZgMgfxhknAi6IEhQKdNQGOAqzKoBxEvVK30x4XxMyVPMYYWbTCEEX2K5Kna0wJQ39rsajBWBRusxge_bLydt0dun4ZX4lv_BaCkdKn4TB6x3sQtwPyYrkOj7nykBiLzpcNGYKYbL5B5HGJHbcjXqX6ttvUn7B7E_idcyJbFfcwzrSj87Zdp5aj5LSiIqHtih8Sm2Mch5VQDT_U55UT4n8Rc9K_fJ1bQirXQdZZ9CgU4zcjXx8PnaEpeq18EcXxXsdfCN8o4EBUN7YWog1-65CLw", - "e": "AQAB", - "d": "A-MDetWc7gwVeWDXIyjFqS6SxZa82mU24maqBE-TVLSTkZPlpdSRJy7XnJ4wzY9efSwcspOLYBkSAsTUXgaGRhm6CDHvn0LVkPPhN5mOG32Lz1srEe07jt4re0W0Sd4ah71cU9zgb-KGS6QIEw_jOBidVX8bSO6k-bbySYiP7MB8I5HM0P_bpD8Xin7pOj6QCrU3BksG0Ql_dHz1B0npvpBzK-UAwkFlBoryL59BQeN65A5f0MjSlBhsVFoXVt-2GMy-SbyY8WJI90YCY6F66LfO9RuaEVkOfL9Efux_UwB03LPKQW4gnmjx8MLMfIz_eGYplVo1Gr2R-5qeufySwQ", - "p": "9lyv_3EC0ihvXZ7Rmv2wXrqmlzb1qGKmx4MGk03IkGijGXdVyCIZke9O5gkGHnrxlFsl8VUy08u-FfW8fe7lpiFhp32QnImOEjRAb1gih_fRN16MWOUFDq14jcuVqS1A3Ce_wsai7QlwdAXx6J2HYvqdFqT1JvCji1N1Z-oefGE", - "q": "xRcsLk-icb1q7xXOhWaSIdUBQ5sxwwC8Y9n5PfSaYuoR4YNxSTp0-WzDQ_h9OigfKJBL6Nzd0_scIys4FKZ3EkxXXMM0ksi3oks2sP8Nws0wRWPRxvQSIWSxD28OH3cpJPc-u-d0p7YagBzlb1PkeZ7CcklO9XQeMGbW401byI8", - "dp": "BCZrkJIGyiOEPL-AKGw9nFrok4OJf9ypkpLSeYjF6CjbFoK8HzLz21F8ssNUJw9LIoSmjvowcQDtotEQ684qcDH_wyKKXRi0G_plW3rQmhnCnHwrQRQakbS6YykazE7G2O6SfGV8OSH_kvTGrnR442H1Y3xD5PQIzUAKqkV3XgE", - "dq": "jqMUoHeVswdJCrsXecgf3khP3-PDgcNYlFM-ZK5PxWJtim4cYMjju1gRgXGm_53l3u9_YInoKPBFDtbKgXdwGVgSqdnEhK6q59PTQwlzphXl53I0ce5V6MD8u5S9_du5dT1Ss57w-Cd8ylcfXRCz-6kARMH1WQKujoz-3AYydNU", - "qi": "Dcb0uVC4XaXFMFV4ansHRGnp4y5zZNuK-5cQQftLfzKVgZw3AYELw6ZYgQfLWZ_tim9TtVDc62wNQJ4KEUTb0TvsScuRhQNigQABfGDx_cfkllGx6JnDmn1x7kpLKbglhZVw0IrBBL9OiklwF4r7LnXVKP-toerHCUgbJyiv6s0", - "key_ops": [ - "sign" - ], - "ext": true - }, - "publicJwk": { - "kid": "DA4MU9NJoDo", - "kty": "RSA", - "alg": "RS256", - "n": "vaugR-F0yLkwgUyJPrIxjUrncPFoGlFyfPWYfVlU4OleYqNnEofoUNI2afIqRQlZgMgfxhknAi6IEhQKdNQGOAqzKoBxEvVK30x4XxMyVPMYYWbTCEEX2K5Kna0wJQ39rsajBWBRusxge_bLydt0dun4ZX4lv_BaCkdKn4TB6x3sQtwPyYrkOj7nykBiLzpcNGYKYbL5B5HGJHbcjXqX6ttvUn7B7E_idcyJbFfcwzrSj87Zdp5aj5LSiIqHtih8Sm2Mch5VQDT_U55UT4n8Rc9K_fJ1bQirXQdZZ9CgU4zcjXx8PnaEpeq18EcXxXsdfCN8o4EBUN7YWog1-65CLw", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - } - }, - "RS384": { - "privateJwk": { - "kid": "DCo68-1L_bA", - "kty": "RSA", - "alg": "RS384", - "n": "p3SLWJT-PyQn6n-fvj_s5dNqRJQauAZCC8JFnwUUP6n_LUfCG5tpfRLzZ0yXtsaPfN-z9c8JbXIbsF0HJN3NLTaBOWaZ04yjl3S29_8y-KwOMKlOafuRbYy7sXkicvCnjXRIcV85pAewrpwwHBcI2wDPDbkflwI3m6nurThQAQBDxPWz83QnC_iQ_V3pJGoGYItUGH_sJC06mqATV05dVzHSS0VZSFhEoyEtpykZNnhzgZCOACi4V8P07y0jsxQtqdPYYpqt9qg0Tjp81r-tIIDY7LEWv949rbR3Oad-QBcQC0f4CEapT2nbcVcadODtqPv1pQzSL7sSJ42zATGSxQ", - "e": "AQAB", - "d": "peGcfDa0GaZeaDze6J74tL6WobK5ORzx5iYfw6RLZ7mmD5vrHF_6wqy4M9c63xOZZpFP-yuJ4kJMTYwKHKofqy84Gb2ammbSU6GJ8ud5_b6rG-dLx08uw__KmsctqgDdahIMBUrYlbYMfxw3yEvFOPV3JtgBBB1tKqXOywdisWmQgk54eBwA_3Mmm-Flt_a2PiibDjivVUAWxbBPd8Ug9y2bPbDiAXoMP6pOAT317LUqBqw7dhie9_aQWKAgOo2dGjBUADnCb51-Nr8syTJRpczYc9ahYlYOlk3miv3aEhXjQ9a7QosRxvqAMPtjVK2OgB0cQ2j46rzbSrZoYcogzQ", - "p": "z-mDM_oSHM4dhR4LAGXgKRdCmTIzBnGBCQ5Szg0yRTxlXPCqF8NrIu7mhkVB61JiGAHqgD5Y9IxPJyWj9uW9qrY21kIwuIEcEi-mTdxp4VgAjP6vaG1XOaS_fdshBfqe43seTzqHJF523vGmkF8HfOAUqhbj9bsTlCCQBBquQiM", - "q": "zi-ToMifbZweWX_HXu0XRMgLZ1vHYWPjgWdddAJD5wCHx_K6lRROhvTCHycV6f9Qrd-0jnauMRNnHJWlCuU0AGQo9CI-mKAnj66LpvMtfyA5i7WK89-ll5EEWXV5NFdXJd9c7d9mmQAXFQssC3mfPcq7EvGjnAMg_eGSFlLF4fc", - "dp": "bmxQEa_0JLZXuVaOc0SoPEqtRV4C-Z4Y8S1ZTzR1CY6dKzJqtDpG0YPejVuFOi1ECgoieMAkUKWgeGMmZT_5bwxdrYf0BloUBZinE91HorYxfLDbinPgCq50Qay7KkjEUH8YRu4HzooZSik_1JeUC3-bmgaURfN434g31OYyvM8", - "dq": "BzueBybiiNrQKb2Uxdy1U0FdPQv4K49wfKqemaI2tZTMLpRyPSaQNqXBZYxedW3ya5cMY28AX1JZ7KPHPWGa-GSLFz1YSsxbduvdlEa1kt8ThbYhoLp4uZ9psqWvUcm6keaLAQE0PSvGo4NX0TM8BdPlyh1V6vQlJSLTmBrhPDM", - "qi": "L5c_XlyLw4tTUWdrM730pvhC2eGCdSwCc6XAwnUla6q3klxJV1eNcRZoejHAN_QXLS742gpA9A_PTMBfYuBN3-lNLOe-wB3bUDJtCzwGlTthiHChkuqB0KAdq4oj8X49ZMA7Fqlr2KaTFTBsItC-ScVSbss9W2DZv8-XzyNoMyc", - "key_ops": [ - "sign" - ], - "ext": true - }, - "publicJwk": { - "kid": "re686ijoKyE", - "kty": "RSA", - "alg": "RS384", - "n": "p3SLWJT-PyQn6n-fvj_s5dNqRJQauAZCC8JFnwUUP6n_LUfCG5tpfRLzZ0yXtsaPfN-z9c8JbXIbsF0HJN3NLTaBOWaZ04yjl3S29_8y-KwOMKlOafuRbYy7sXkicvCnjXRIcV85pAewrpwwHBcI2wDPDbkflwI3m6nurThQAQBDxPWz83QnC_iQ_V3pJGoGYItUGH_sJC06mqATV05dVzHSS0VZSFhEoyEtpykZNnhzgZCOACi4V8P07y0jsxQtqdPYYpqt9qg0Tjp81r-tIIDY7LEWv949rbR3Oad-QBcQC0f4CEapT2nbcVcadODtqPv1pQzSL7sSJ42zATGSxQ", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - } - }, - "RS512": { - "privateJwk": { - "kid": "0XGSMsImQPQ", - "kty": "RSA", - "alg": "RS512", - "n": "-WuAFX1DLbsMHagMw_NDJA6yxCcIm2SDgbMmDKOwCN4dR0YWdwKzDJ31EeoakDg-T85HaU48R4Kcx1WQUYnly98vDymMFl4Xe6zS9je-Uh3IVfkYJV3pwVKr2gj1hrX7QglIktLg0o0iWulFe1K1NQ5u7Jbe7ZZhOaetlTFH8KUgS78fajfhcFtrXBliqxHTiBz2lMYCj2ntqX8K8ue3_lVLBXm53AJG3T-ymnUd-nxJ-NsdFMSIzQO1-KUona9OgxDpu1cFoQ-YzOteSz2OP58wDl3gL5urIhzK7Hvu3I3okzlL2TyCHmOhLn6HMHr2-mwEgsYYnsEQwzu6bbY8hw", - "e": "AQAB", - "d": "fO-4TQtd5z5Wp1RScKUd8KXcLh1PVmdW6FUQriwgNZDtIZKeFicoAR3ucHbPr4Y80EUHyFwEHd3zInZdwDpO_XxiWjn5jgq7wJulYOgzUXbRrx8DVVRhjxEWPDVYp43ouf9kdwdizpUbrGZFA60-T8FXFvPL3z8AnJy9eoog-wz-otG58fosrd2Zdpo3O5PlnN2HzueP7G2vabmiZcwR7WEhSaBcI-HcFCXSdZcnAeVzv2DMOoNLNNQXOQ-DtAF_-7lrZa2LKbJccPMEYybwXJlGpRB0JTMYtiLWeZY0EWkWiG2p-lBFsDisEH29JS6yBsG30WWLR55e2XwCqBp1gQ", - "p": "_xiXor89SL9DcybJIEcg_a9nlmnS0DPRfwlRL7fMDF_YKRCVN9x-DD6LlnDss8x9NnUB69dg17QYgLGHI1DbfpV30eOP95zswUfhoyRRgGyxCVbyfB_xwnLTsyCNE3Koi33KjNSMNmDdGKIGBKGzs7Lnbms93Ylr-m9nPizBffc", - "q": "-k3CSpMNknvsVgDxcyl9-U6P2Gm3COcL2NeRzCNR4sG-ffw9xJ_NGIqps9Oddx3Vu5tlEHYiDG3cy-4yOkzxWhphS8E_u8Q1wmBUBaepDjOthoXUcGaSr7-CY7d_FH_ou54WS6rN7diNJODdWATgOSlbPFNhc-he3M8U_bwI0fE", - "dp": "M9zAF2ph_0RDZkngYhuT7X-Xw9DH92RRl05Bnz3y0iE6RT8F11GQntSodHGI7hUI7-Vh-pzTJ4eJ48A0BU4PEfE5Zwao4mKZD8KZcR2VJFL0uz1eFzY3ZJ0LxUM861NISPPOFkuwJe4ThUqLhq2JZ2NcAerzrPKfbU7w4oce34k", - "dq": "mc9OpSTYIjukbvUFag8FKj3shr_vibjwvr85CIhruTv1ItXt3vWTwpDy114iVSAwRqim4ga1xY19MJOeqdS-OvAa-cI2t9tKbbdj6lWsvN1ktFVoxelCGl1EcqI_pQk0qpXqfXToNk_r682CNqRIZNfVCKz0JZWVNXrLG2CAywE", - "qi": "upS-Z2wbbZ_Mla0QpAlORgIr3QLBTK5W0hkhRahoAqm2aGzq269FGSIBnJNxxVkFXL4koHu7diwVCdBHOn3RtnoFYRV1V0sO52Q0B8KI0M8iHM4mVYbk80TsSYBU4lYJqy7U7OnZj1pfnrV4Ky2AAvhTjp2ZbpJCqEPRGJqQlP8", - "key_ops": [ - "sign" - ], - "ext": true - }, - "publicJwk": { - "kid": "jGE5qoPDlnI", - "kty": "RSA", - "alg": "RS512", - "n": "-WuAFX1DLbsMHagMw_NDJA6yxCcIm2SDgbMmDKOwCN4dR0YWdwKzDJ31EeoakDg-T85HaU48R4Kcx1WQUYnly98vDymMFl4Xe6zS9je-Uh3IVfkYJV3pwVKr2gj1hrX7QglIktLg0o0iWulFe1K1NQ5u7Jbe7ZZhOaetlTFH8KUgS78fajfhcFtrXBliqxHTiBz2lMYCj2ntqX8K8ue3_lVLBXm53AJG3T-ymnUd-nxJ-NsdFMSIzQO1-KUona9OgxDpu1cFoQ-YzOteSz2OP58wDl3gL5urIhzK7Hvu3I3okzlL2TyCHmOhLn6HMHr2-mwEgsYYnsEQwzu6bbY8hw", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - } - } - }, - "encryption": {} - }, - "userinfo": { - "encryption": {} - }, - "register": { - "signing": { - "RS256": { - "privateJwk": { - "kid": "RiiZpS0yli8", - "kty": "RSA", - "alg": "RS256", - "n": "yGhTYJWPKU-n1gnPQPf1_Nr8HBJ6F-IT6PyxLJoURWrd_DvuW0EFQD1JolKAYWakuJAIWGtb8CXjRdzXrEVYNfshb-bBGYGotISxAD2z_KzEtcBya_TwywAQiMYildsAPRZR7HqvxnUw2iFUwec_gw6aBvu3rPcLnj6z2KKDJDFC1P4LHNDArh4EquhkgtzeD5h6-8cCI1iKpb-Op5nCe1DjUNg49L5NZhNtDlhCEb8P2LEbcV8vldIz9gJu0MSf94zzWu2JGsVtVQ29XPO8SQqrKQ5TKClmR1jIIGCF7t4AUoaaL6AA81F3cyEhKB3vN_D8DzEsr7tuwomLFZXmBw", - "e": "AQAB", - "d": "AlSEM6lJgtd0Qh7XFBBOAeSh7cmhNcnhJWJaxQP9nFkDv70KpnD5GKgdxQ9kgr1oyOST1ENbTE2EePl6YHxl7CrBVsW-FQfW6FJqpHATOarglqRoMC0m55VWm-CB4nArbopl5XP_uzT9nmuoyqBfsqxmyhH_LrmonuxntusczzzmFY-0vmdE8JHQcnixa70dLd9GO4Bs6vr1SfO5bb8FFEFNm00iTKZqOnqDLx0abgzcqYA_wDBxznFg3RtwdOrVOzKsIUgAaO9C6s5XzGS3ddmggEkPGTm0kQQ9xHJkYOxMNZPNRloqMqVpy1O4JbleCMzPg_-DQ8MJzAWXy5MgkQ", - "p": "_-nK2E0JvckScJUcFH9eN0pJUymgAWMH2_MjE_qJb_lT4jXHLcIfzafqu1QxH2ZbHH1V-Pu2HBwk2YMpS-MQheSSrSNXo4s8Kf4nswspClVVpZnMh8pWWLiHDbib7wMhj8cUlKYTM91J6sAooicGh_8UJtFoSlyTn0sLRSG1iUU", - "q": "yHm3dqNtMfujFwNF9yz5Tb8cDgcDQBxox-y6QGWwogmWP2QOfX76QaBYg32Ve6WUwttixu6KK127BkvGeCReC_QaFILLwPZzI7ybQStRzKNiQg-9oki5lw7iQz66O8U1rQ8jHwSy6mC-Ka3CP1v2j3sZMwmzoWSGBuEwZHfvGNs", - "dp": "MeJ55vYFaxhR3t5CDgDR9ccmSe64QOzz8D0R3mgc-FXKszK2c8X-exE7YW7E8JD8O6523sT6N7qIuFmn6CIH64Gl0dgs0jVm8eyYAn-vbVM7Eb_MLcAUWtEFings9UdP-H3fFibVYWvGZ9szUIB49nOTkwmI4c3v_MIdHUm34F0", - "dq": "lRjZFpYC7yqMJ-BaV7OOEoFwtwoGI9c9IntwJda7YDerE6gxkqouK0K6schjtVr3YVhShUsBXbFPGCahC9dYTqGUB-8i5HcmOMzb1sMGCiD1QdZ9HcXiqXL7WjG7xhosinH4l-ghvGiI5WyCTCb0H8_YdPnhK8YcW9984yvDmgM", - "qi": "UUZvIyomeQkGmtQH41T3vZV_HZSzcZEmdFYPgmjiZMXkOrB3wM1FkqOnoDF51yD8dCuTLSL-Pcq6523NTKtvRLYkum0aZFGMyfPHnK6nGbdsKxjGtHgUuccOUX9XL-WoEsn0F2UGc39JNFQNcScoaIAtgGJ5A5rjfpfvIK7c-Vo", - "key_ops": [ - "sign" - ], - "ext": true - }, - "publicJwk": { - "kid": "PhN1R2mze2k", - "kty": "RSA", - "alg": "RS256", - "n": "yGhTYJWPKU-n1gnPQPf1_Nr8HBJ6F-IT6PyxLJoURWrd_DvuW0EFQD1JolKAYWakuJAIWGtb8CXjRdzXrEVYNfshb-bBGYGotISxAD2z_KzEtcBya_TwywAQiMYildsAPRZR7HqvxnUw2iFUwec_gw6aBvu3rPcLnj6z2KKDJDFC1P4LHNDArh4EquhkgtzeD5h6-8cCI1iKpb-Op5nCe1DjUNg49L5NZhNtDlhCEb8P2LEbcV8vldIz9gJu0MSf94zzWu2JGsVtVQ29XPO8SQqrKQ5TKClmR1jIIGCF7t4AUoaaL6AA81F3cyEhKB3vN_D8DzEsr7tuwomLFZXmBw", - "e": "AQAB", - "key_ops": [ - "verify" - ], - "ext": true - } - } - } - }, - "jwkSet": "{\"keys\":[{\"kid\":\"QXv-I1cn_YU\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"siMc_WZIcylWwv6_0mtLKKkH-jDLIsREie9KRannw_BxVvM96CaFlUHywVu1Nkyw_hqCYFXyr91JnQ7YN_fB7OpcBcx6rjbExlD_piewy2X_vXq5_0YN5a3aPb5P6JSmRF-nS257jdteucmEVJeFHzSqXAU2K5Y_2ZXse9hGTg9MJMnzof4jntb19q02E0qBOGeBqDoMXQU0RJB2uncqUzXp7EJeB4UVwvcS107LTYwPX7BAHwyGorpgWc_DYutZq-4DxycQgvIlO3_hGiFjaWhVOHHkO1DGcWTGOM9DcFels7Abf_XkCPIrgeALlOaqUe6dnK-yFCGwBeJhZupP_Q\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"TxrWAv0g4Yk\",\"kty\":\"RSA\",\"alg\":\"RS384\",\"n\":\"7d5w1iTgbqF5L8wLqFxS72vXfhmOCRHxOzoxFuAJKDtgceguvIZKcA8Krlm4qE10_Fjm3v2BhTBqKaMWeMMqM2KPCeOOm_APcOEqHLltmU301ErcEU7XJFH90HFJVlPDMbuPvX1_0mi904J-TNQ_XX1s4d1OBgJbEn-4RfongbIQK2Fv1LRclZ3n1__dVikrnngSZEWazdidEMFDlI5KNJv6jbGdQAfPzLWzq_9Fl-wbmGu4Up6COLeQDdGybmPCv3a0id9-jVlyZRauUc2RtO3mJdQaOUZNOuDFe2WT0xmhPhoLXKEWhlF1udJGzm0beY7s0pwg4QjhGi7T75d3lQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"-tvrpKoUfPU\",\"kty\":\"RSA\",\"alg\":\"RS512\",\"n\":\"sGoD0dZ3-F4NaAKQQrPhSGAbkBvJ0OsA3PQiwAhWXMrdOj0n9o2QDQfICdayIHcRwsisQaOz7B-L-pYcYFgMcdhj-yWOYVUMHXJCTqJeiz4zdGqjlCxkOF9ebauahRk_IoXp_hDyx3hqB98giajTn1gpW9G36Hcau4PutfM_jeyxi4iVeQSm8-p7qLCm-qD7ot0vzCqvsIt9cDvm9o5DVwG-LoAzeyZlEDmuDpFrLsFLz-D9rxLfSSdAethycrDA0Fhe1j7Az15NYUItJIkvyM5AsC6X0xyjO1LJWoJfbl9cbfaJQ0c3XKRc_NuxPYcDuM15gw0FaTkgUOYezuALPQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"DA4MU9NJoDo\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"vaugR-F0yLkwgUyJPrIxjUrncPFoGlFyfPWYfVlU4OleYqNnEofoUNI2afIqRQlZgMgfxhknAi6IEhQKdNQGOAqzKoBxEvVK30x4XxMyVPMYYWbTCEEX2K5Kna0wJQ39rsajBWBRusxge_bLydt0dun4ZX4lv_BaCkdKn4TB6x3sQtwPyYrkOj7nykBiLzpcNGYKYbL5B5HGJHbcjXqX6ttvUn7B7E_idcyJbFfcwzrSj87Zdp5aj5LSiIqHtih8Sm2Mch5VQDT_U55UT4n8Rc9K_fJ1bQirXQdZZ9CgU4zcjXx8PnaEpeq18EcXxXsdfCN8o4EBUN7YWog1-65CLw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"re686ijoKyE\",\"kty\":\"RSA\",\"alg\":\"RS384\",\"n\":\"p3SLWJT-PyQn6n-fvj_s5dNqRJQauAZCC8JFnwUUP6n_LUfCG5tpfRLzZ0yXtsaPfN-z9c8JbXIbsF0HJN3NLTaBOWaZ04yjl3S29_8y-KwOMKlOafuRbYy7sXkicvCnjXRIcV85pAewrpwwHBcI2wDPDbkflwI3m6nurThQAQBDxPWz83QnC_iQ_V3pJGoGYItUGH_sJC06mqATV05dVzHSS0VZSFhEoyEtpykZNnhzgZCOACi4V8P07y0jsxQtqdPYYpqt9qg0Tjp81r-tIIDY7LEWv949rbR3Oad-QBcQC0f4CEapT2nbcVcadODtqPv1pQzSL7sSJ42zATGSxQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"jGE5qoPDlnI\",\"kty\":\"RSA\",\"alg\":\"RS512\",\"n\":\"-WuAFX1DLbsMHagMw_NDJA6yxCcIm2SDgbMmDKOwCN4dR0YWdwKzDJ31EeoakDg-T85HaU48R4Kcx1WQUYnly98vDymMFl4Xe6zS9je-Uh3IVfkYJV3pwVKr2gj1hrX7QglIktLg0o0iWulFe1K1NQ5u7Jbe7ZZhOaetlTFH8KUgS78fajfhcFtrXBliqxHTiBz2lMYCj2ntqX8K8ue3_lVLBXm53AJG3T-ymnUd-nxJ-NsdFMSIzQO1-KUona9OgxDpu1cFoQ-YzOteSz2OP58wDl3gL5urIhzK7Hvu3I3okzlL2TyCHmOhLn6HMHr2-mwEgsYYnsEQwzu6bbY8hw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"PhN1R2mze2k\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"yGhTYJWPKU-n1gnPQPf1_Nr8HBJ6F-IT6PyxLJoURWrd_DvuW0EFQD1JolKAYWakuJAIWGtb8CXjRdzXrEVYNfshb-bBGYGotISxAD2z_KzEtcBya_TwywAQiMYildsAPRZR7HqvxnUw2iFUwec_gw6aBvu3rPcLnj6z2KKDJDFC1P4LHNDArh4EquhkgtzeD5h6-8cCI1iKpb-Op5nCe1DjUNg49L5NZhNtDlhCEb8P2LEbcV8vldIz9gJu0MSf94zzWu2JGsVtVQ29XPO8SQqrKQ5TKClmR1jIIGCF7t4AUoaaL6AA81F3cyEhKB3vN_D8DzEsr7tuwomLFZXmBw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true}]}" - } -} \ No newline at end of file diff --git a/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt b/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt deleted file mode 100644 index 304c0b4f3..000000000 --- a/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt +++ /dev/null @@ -1 +0,0 @@ -protected contents diff --git a/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl b/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl deleted file mode 100644 index acdaa2eac..000000000 --- a/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl +++ /dev/null @@ -1,15 +0,0 @@ -<#Alice> - a ; - - <./shared-with-alice.txt>; - - # Alice web id - ; - - # Bob web id - ; - - - , - , - . From 46b860f799781632028ad36eae168c173c3a8f17 Mon Sep 17 00:00:00 2001 From: Kjetil Kjernsmo Date: Sun, 10 Mar 2019 23:46:11 +0100 Subject: [PATCH 45/60] Release version 5.0.0-beta.9 of the npm package. --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 024a0dbc9..353ff8f08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "solid-server", - "version": "5.0.0-beta.8", + "version": "5.0.0-beta.9", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 80f18a868..47ff05898 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "solid-server", "description": "Solid server on top of the file-system", - "version": "5.0.0-beta.8", + "version": "5.0.0-beta.9", "author": { "name": "Tim Berners-Lee", "email": "timbl@w3.org" From 5980d7535d7e7578bf7961f764b6a580acd7dfb3 Mon Sep 17 00:00:00 2001 From: Michiel de Jong Date: Tue, 12 Mar 2019 23:18:51 +0100 Subject: [PATCH 46/60] Redo #1118 --- lib/acl-checker.js | 18 +- lib/create-app.js | 17 +- package-lock.json | 74 +-- package.json | 2 +- test/integration/acl-tls-test.js | 8 +- test/integration/authentication-oidc-test.js | 109 +++- ...idc-with-strict-origins-turned-off-test.js | 562 ++++++++++++++++++ .../alice/private-for-owner.txt | 1 - .../alice/.acl-override} | 4 +- .../alice/db/oidc/op/provider.json | 411 +++++++++++++ .../alice/private-for-alice.txt | 1 + .../alice/private-for-alice.txt.acl | 12 + .../bob/.acl-override | 5 + .../bob/db/oidc/op/provider.json | 411 +++++++++++++ .../bob/shared-with-alice.txt | 1 + .../bob/shared-with-alice.txt.acl | 15 + 16 files changed, 1583 insertions(+), 68 deletions(-) create mode 100644 test/integration/authentication-oidc-with-strict-origins-turned-off-test.js delete mode 100644 test/resources/accounts-scenario/alice/private-for-owner.txt rename test/resources/{accounts-scenario/alice/private-for-owner.txt.acl => accounts-strict-origin-off/alice/.acl-override} (63%) create mode 100644 test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json create mode 100644 test/resources/accounts-strict-origin-off/alice/private-for-alice.txt create mode 100644 test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl create mode 100644 test/resources/accounts-strict-origin-off/bob/.acl-override create mode 100644 test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json create mode 100644 test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt create mode 100644 test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl diff --git a/lib/acl-checker.js b/lib/acl-checker.js index 53c41f86d..44c0ae883 100644 --- a/lib/acl-checker.js +++ b/lib/acl-checker.js @@ -16,11 +16,10 @@ class ACLChecker { constructor (resource, options = {}) { this.resource = resource this.resourceUrl = new URL(resource) - this.agentOrigin = options.agentOrigin + this.agentOrigin = options.strictOrigin && options.agentOrigin ? rdf.sym(options.agentOrigin) : null this.fetch = options.fetch this.fetchGraph = options.fetchGraph - this.strictOrigin = options.strictOrigin - this.trustedOrigins = options.trustedOrigins + this.trustedOrigins = options.strictOrigin && options.trustedOrigins ? options.trustedOrigins.map(trustedOrigin => rdf.sym(trustedOrigin)) : null this.suffix = options.suffix || DEFAULT_ACL_SUFFIX this.aclCached = {} this.messagesCached = {} @@ -56,17 +55,14 @@ class ACLChecker { const aclFile = rdf.sym(acl.acl) const agent = user ? rdf.sym(user) : null const modes = [ACL(mode)] - const agentOrigin = this.agentOrigin ? rdf.sym(this.agentOrigin) : null - const trustedOrigins = this.trustedOrigins ? this.trustedOrigins.map(trustedOrigin => rdf.sym(trustedOrigin)) : null + const agentOrigin = this.agentOrigin + const trustedOrigins = this.trustedOrigins const accessDenied = aclCheck.accessDenied(acl.graph, resource, directory, aclFile, agent, modes, agentOrigin, trustedOrigins) - if (accessDenied && this.agentOrigin && this.resourceUrl.origin !== this.agentOrigin) { - this.messagesCached[cacheKey].push(HTTPError(403, accessDenied)) - } else if (accessDenied && user) { + + if (accessDenied && user) { this.messagesCached[cacheKey].push(HTTPError(403, accessDenied)) - } else if (accessDenied && !user) { - this.messagesCached[cacheKey].push(HTTPError(401, 'Unauthenticated')) } else if (accessDenied) { - this.messagesCached[cacheKey].push(HTTPError(401, accessDenied)) + this.messagesCached[cacheKey].push(HTTPError(401, 'Unauthenticated')) } this.aclCached[cacheKey] = Promise.resolve(!accessDenied) return this.aclCached[cacheKey] diff --git a/lib/create-app.js b/lib/create-app.js index 12f33ce0a..88c2c251e 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -212,14 +212,27 @@ function initWebId (argv, app, ldp) { // without permission by including the credentials set by the Solid server. app.use((req, res, next) => { const origin = req.get('origin') - const trustedOrigins = argv.trustedOrigins + const trustedOrigins = ldp.getTrustedOrigins(req) const userId = req.session.userId // Exception: allow logout requests from all third-party apps // such that OIDC client can log out via cookie auth // TODO: remove this exception when OIDC clients // use Bearer token to authenticate instead of cookie // (https://github.com/solid/node-solid-server/pull/835#issuecomment-426429003) - if (!argv.host.allowsSessionFor(userId, origin, trustedOrigins) && !isLogoutRequest(req)) { + // + // Authentication cookies are an optimization: + // instead of going through the process of + // fully validating authentication on every request, + // we go through this process once, + // and store its successful result in a cookie + // that will be reused upon the next request. + // However, that cookie can then be sent by any server, + // even servers that have not gone through the proper authentication mechanism. + // However, if trusted origins are enabled, + // then any origin is allowed to take the shortcut route, + // since malicious origins will be banned at the ACL checking phase. + // https://github.com/solid/node-solid-server/issues/1117 + if (!argv.strictOrigin && !argv.host.allowsSessionFor(userId, origin, trustedOrigins) && !isLogoutRequest(req)) { debug.authentication(`Rejecting session for ${userId} from ${origin}`) // Destroy session data delete req.session.userId diff --git a/package-lock.json b/package-lock.json index 353ff8f08..433505a8c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "solid-server", - "version": "5.0.0-beta.9", + "version": "5.0.0-beta.8", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -230,7 +230,7 @@ "dependencies": { "rdflib": { "version": "0.12.3", - "resolved": "http://registry.npmjs.org/rdflib/-/rdflib-0.12.3.tgz", + "resolved": "https://registry.npmjs.org/rdflib/-/rdflib-0.12.3.tgz", "integrity": "sha1-K0IGamYJwGtAqQSFhJNix8uV6h4=", "requires": { "async": "^0.9.x", @@ -904,42 +904,42 @@ }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" }, "babel-plugin-syntax-class-properties": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" }, "babel-plugin-syntax-exponentiation-operator": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" }, "babel-plugin-syntax-export-extensions": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=" }, "babel-plugin-syntax-flow": { "version": "6.18.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" }, "babel-plugin-syntax-function-bind": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=" }, "babel-plugin-syntax-jsx": { "version": "6.18.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" }, "babel-plugin-syntax-trailing-function-commas": { @@ -1762,7 +1762,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -1786,7 +1786,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { "buffer-xor": "^1.0.3", @@ -2228,7 +2228,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -2379,7 +2379,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { "cipher-base": "^1.0.1", @@ -2391,7 +2391,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { "cipher-base": "^1.0.3", @@ -2695,7 +2695,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -2717,7 +2717,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { "bn.js": "^4.1.0", @@ -2825,7 +2825,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -3699,7 +3699,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -3827,7 +3827,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -4122,7 +4122,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { "depd": "~1.1.2", @@ -4529,7 +4529,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -4705,7 +4705,7 @@ }, "jsesc": { "version": "0.5.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" }, "json-schema": { @@ -5256,7 +5256,7 @@ "dependencies": { "commander": { "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, @@ -5323,7 +5323,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -6736,7 +6736,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -6859,7 +6859,7 @@ }, "parse-asn1": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "requires": { "asn1.js": "^4.0.0", @@ -7096,7 +7096,7 @@ }, "proxy-agent": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", + "resolved": "http://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", "integrity": "sha512-CNKuhC1jVtm8KJYFTS2ZRO71VCBx3QSA92So/e6NrY6GoJonkx3Irnk4047EsCcswczwqAekRj3s8qLRGahSKg==", "dev": true, "requires": { @@ -7295,7 +7295,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -7704,7 +7704,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { "inherits": "^2.0.1", @@ -8824,7 +8824,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8862,7 +8862,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8903,7 +8903,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8941,7 +8941,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -9065,7 +9065,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -9282,7 +9282,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -9941,7 +9941,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { diff --git a/package.json b/package.json index 47ff05898..80f18a868 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "solid-server", "description": "Solid server on top of the file-system", - "version": "5.0.0-beta.9", + "version": "5.0.0-beta.8", "author": { "name": "Tim Berners-Lee", "email": "timbl@w3.org" diff --git a/test/integration/acl-tls-test.js b/test/integration/acl-tls-test.js index 9d321b10d..c2103f669 100644 --- a/test/integration/acl-tls-test.js +++ b/test/integration/acl-tls-test.js @@ -332,7 +332,7 @@ describe('ACL with WebID+TLS', function () { request.head(options, function (error, response, body) { assert.equal(error, null) - assert.equal(response.statusCode, 403) + assert.equal(response.statusCode, 401) done() }) }) @@ -354,7 +354,7 @@ describe('ACL with WebID+TLS', function () { request.head(options, function (error, response, body) { assert.equal(error, null) - assert.equal(response.statusCode, 403) + assert.equal(response.statusCode, 401) done() }) }) @@ -433,7 +433,7 @@ describe('ACL with WebID+TLS', function () { request.head(options, function (error, response, body) { assert.equal(error, null) - assert.equal(response.statusCode, 403) + assert.equal(response.statusCode, 401) done() }) }) @@ -455,7 +455,7 @@ describe('ACL with WebID+TLS', function () { request.head(options, function (error, response, body) { assert.equal(error, null) - assert.equal(response.statusCode, 403) + assert.equal(response.statusCode, 401) done() }) }) diff --git a/test/integration/authentication-oidc-test.js b/test/integration/authentication-oidc-test.js index bfa4a315b..53827f5f7 100644 --- a/test/integration/authentication-oidc-test.js +++ b/test/integration/authentication-oidc-test.js @@ -179,6 +179,39 @@ describe('Authentication API (OIDC)', () => { }) }) + describe('with that cookie and a non-matching origin', () => { + let response + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', cookie) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 403', () => { + expect(response).to.have.property('status', 403) + }) + }) + + describe('without that cookie and a non-matching origin', () => { + let response + before(done => { + alice.get('/private-for-alice.txt') + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => { + expect(response).to.have.property('status', 401) + }) + }) + describe('with that cookie but without origin', () => { let response before(done => { @@ -195,6 +228,19 @@ describe('Authentication API (OIDC)', () => { }) }) + describe('with that cookie, private resource and no origin set', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', cookie) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 200', () => expect(response).to.have.property('status', 200)) + }) + // How Mallory might set their cookie: describe('with malicious cookie but without origin', () => { let response @@ -296,8 +342,8 @@ describe('Authentication API (OIDC)', () => { }) }) - it('should return a 403', () => { - expect(response).to.have.property('status', 403) // TODO: Should be 401? + it('should return a 401', () => { + expect(response).to.have.property('status', 401) }) }) @@ -315,8 +361,8 @@ describe('Authentication API (OIDC)', () => { }) }) - it('should return a 403', () => { - expect(response).to.have.property('status', 403) + it('should return a 401', () => { + expect(response).to.have.property('status', 401) }) }) @@ -333,8 +379,8 @@ describe('Authentication API (OIDC)', () => { }) }) - it('should return a 403', () => { - expect(response).to.have.property('status', 403) + it('should return a 401', () => { + expect(response).to.have.property('status', 401) }) }) @@ -356,7 +402,24 @@ describe('Authentication API (OIDC)', () => { }) }) - // Authenticated but origin not OK + describe('with malicious cookie and our origin', () => { + let response + before(done => { + var malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') + alice.get('/private-for-alice.txt') + .set('Cookie', malcookie) + .set('Origin', aliceServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => { + expect(response).to.have.property('status', 401) + }) + }) + describe('with malicious cookie and a non-matching origin', () => { let response before(done => { @@ -370,8 +433,8 @@ describe('Authentication API (OIDC)', () => { }) }) - it('should return a 403', () => { - expect(response).to.have.property('status', 403) + it('should return a 401', () => { + expect(response).to.have.property('status', 401) }) }) }) @@ -540,7 +603,7 @@ describe('Authentication API (OIDC)', () => { // Step 6: Web App extracts tokens from the uri hash fragment, uses // them to access protected resource - it('should use id token from the callback uri to access shared resource', () => { + it('should use id token from the callback uri to access shared resource (no origin)', () => { auth.window.location.href = callbackUri let protectedResourcePath = bobServerUri + '/shared-with-alice.txt' @@ -570,6 +633,32 @@ describe('Authentication API (OIDC)', () => { }) }) + it('should use id token from the callback uri to access shared resource (untrusted origin)', () => { + auth.window.location.href = callbackUri + + let protectedResourcePath = bobServerUri + '/shared-with-alice.txt' + + return auth.initUserFromResponse(auth.currentClient) + .then(webId => { + expect(webId).to.equal(aliceWebId) + + return auth.issuePoPTokenFor(bobServerUri, auth.session) + }) + .then(popToken => { + bearerToken = popToken + + return fetch(protectedResourcePath, { + headers: { + 'Authorization': 'Bearer ' + bearerToken, + 'Origin': 'https://untrusted.example.com' // shouldn't be allowed if strictOrigin is set to true + } + }) + }) + .then(res => { + expect(res.status).to.equal(403) + }) + }) + it('should not be able to reuse the bearer token for bob server on another server', () => { let privateAliceResourcePath = aliceServerUri + '/private-for-alice.txt' diff --git a/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js b/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js new file mode 100644 index 000000000..f61ca8ab6 --- /dev/null +++ b/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js @@ -0,0 +1,562 @@ +const Solid = require('../../index') +const path = require('path') +const fs = require('fs-extra') +const { UserStore } = require('@solid/oidc-auth-manager') +const UserAccount = require('../../lib/models/user-account') +const SolidAuthOIDC = require('@solid/solid-auth-oidc') + +const fetch = require('node-fetch') +const localStorage = require('localstorage-memory') +const URL = require('whatwg-url').URL +global.URL = URL +global.URLSearchParams = require('whatwg-url').URLSearchParams +const { cleanDir, cp } = require('../utils') + +const supertest = require('supertest') +const chai = require('chai') +const expect = chai.expect +chai.use(require('dirty-chai')) + +// In this test we always assume that we are Alice + +describe('Authentication API (OIDC) - With strict origins turned off', () => { + let alice, bob + + const aliceServerPort = 7010 + const aliceServerUri = `https://localhost:${aliceServerPort}` + const aliceWebId = `https://localhost:${aliceServerPort}/profile/card#me` + let configPath = path.join(__dirname, '../resources/config') + let aliceDbPath = path.join(__dirname, '../resources/accounts-strict-origin-off/alice/db') + let userStorePath = path.join(aliceDbPath, 'oidc/users') + let aliceUserStore = UserStore.from({ path: userStorePath, saltRounds: 1 }) + aliceUserStore.initCollections() + + const bobServerPort = 7011 + const bobServerUri = `https://localhost:${bobServerPort}` + let bobDbPath = path.join(__dirname, '../resources/accounts-strict-origin-off/bob/db') + + const serverConfig = { + sslKey: path.join(__dirname, '../keys/key.pem'), + sslCert: path.join(__dirname, '../keys/cert.pem'), + auth: 'oidc', + dataBrowser: false, + webid: true, + multiuser: false, + configPath, + strictOrigin: false + } + + const aliceRootPath = path.join(__dirname, '../resources/accounts-strict-origin-off/alice') + const alicePod = Solid.createServer( + Object.assign({ + root: aliceRootPath, + serverUri: aliceServerUri, + dbPath: aliceDbPath + }, serverConfig) + ) + const bobRootPath = path.join(__dirname, '../resources/accounts-strict-origin-off/bob') + const bobPod = Solid.createServer( + Object.assign({ + root: bobRootPath, + serverUri: bobServerUri, + dbPath: bobDbPath + }, serverConfig) + ) + + function startServer (pod, port) { + return new Promise((resolve) => { + pod.listen(port, () => { resolve() }) + }) + } + + before(async () => { + await Promise.all([ + startServer(alicePod, aliceServerPort), + startServer(bobPod, bobServerPort) + ]).then(() => { + alice = supertest(aliceServerUri) + bob = supertest(bobServerUri) + }) + cp(path.join('accounts-strict-origin-off/alice', '.acl-override'), path.join('accounts-strict-origin-off/alice', '.acl')) + cp(path.join('accounts-strict-origin-off/bob', '.acl-override'), path.join('accounts-strict-origin-off/bob', '.acl')) + }) + + after(() => { + alicePod.close() + bobPod.close() + fs.removeSync(path.join(aliceDbPath, 'oidc/users')) + cleanDir(aliceRootPath) + cleanDir(bobRootPath) + }) + + describe('Login page (GET /login)', () => { + it('should load the user login form', () => alice.get('/login').expect(200)) + }) + + describe('Login by Username and Password (POST /login/password)', () => { + // Logging in as alice, to alice's pod + let aliceAccount = UserAccount.from({ webId: aliceWebId }) + let alicePassword = '12345' + + beforeEach(() => { + aliceUserStore.initCollections() + + return aliceUserStore.createUser(aliceAccount, alicePassword) + .catch(console.error.bind(console)) + }) + + afterEach(() => { + fs.removeSync(path.join(aliceDbPath, 'users/users')) + }) + + describe('after performing a correct login', () => { + let response, cookie + before(done => { + aliceUserStore.initCollections() + aliceUserStore.createUser(aliceAccount, alicePassword) + alice.post('/login/password') + .type('form') + .send({ username: 'alice' }) + .send({ password: alicePassword }) + .end((err, res) => { + response = res + cookie = response.headers['set-cookie'][0] + done(err) + }) + }) + + it('should redirect to /authorize', () => { + const loginUri = response.headers.location + expect(response).to.have.property('status', 302) + expect(loginUri.startsWith(aliceServerUri + '/authorize')) + }) + + it('should set the cookie', () => { + expect(cookie).to.match(/connect.sid=\S{65,100}/) + }) + + it('should set the cookie with HttpOnly', () => { + expect(cookie).to.match(/HttpOnly/) + }) + + it('should set the cookie with Secure', () => { + expect(cookie).to.match(/Secure/) + }) + + describe('and performing a subsequent request', () => { + let response + describe('without cookie', () => { + describe('and no origin set', () => { + before(done => { + alice.get('/private-for-alice.txt') + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + describe('and our origin', () => { + // Our own origin, no agent auth + before(done => { + alice.get('/private-for-alice.txt') + .set('Origin', aliceServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + describe('and trusted origin', () => { + // Configuration for originsAllowed but no auth + before(done => { + alice.get('/private-for-alice.txt') + .set('Origin', 'https://apps.solid.invalid') + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + describe('and untrusted origin', () => { + // Not authenticated but also wrong origin, + before(done => { + alice.get('/private-for-alice.txt') + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + }) + + describe('with cookie', () => { + describe('and no origin set', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', cookie) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 200', () => expect(response).to.have.property('status', 200)) + }) + describe('and our origin', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', cookie) + .set('Origin', aliceServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 200', () => expect(response).to.have.property('status', 200)) + }) + describe('and trusted origin', () => { + before(done => { + alice.get('/') + .set('Cookie', cookie) + .set('Origin', 'https://apps.solid.invalid') // TODO: Should we configure the server with that? Should it matter? + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + describe('and untrusted origin', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', cookie) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + // Even if origin checking is disabled, then this should return a 401 because cookies should not be trusted cross-origin + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + }) + + describe('with malicious cookie', () => { + let malcookie + before(() => { + // How Mallory might set their cookie: + malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') + }) + describe('and no origin set', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', malcookie) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + describe('and our origin', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', malcookie) + .set('Origin', aliceServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + describe('and trusted origin', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', malcookie) + .set('Origin', 'https://apps.solid.invalid') + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + describe('and untrusted origin', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', malcookie) + .set('Origin', bobServerUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + }) + }) + }) + + it('should throw a 400 if no username is provided', (done) => { + alice.post('/login/password') + .type('form') + .send({ password: alicePassword }) + .expect(400, done) + }) + + it('should throw a 400 if no password is provided', (done) => { + alice.post('/login/password') + .type('form') + .send({ username: 'alice' }) + .expect(400, done) + }) + + it('should throw a 400 if user is found but no password match', (done) => { + alice.post('/login/password') + .type('form') + .send({ username: 'alice' }) + .send({ password: 'wrongpassword' }) + .expect(400, done) + }) + }) + + describe('Browser login workflow', () => { + it('401 Unauthorized asking the user to log in', (done) => { + bob.get('/shared-with-alice.txt') + .end((err, { status, text }) => { + expect(status).to.equal(401) + expect(text).to.contain('Log in') + done(err) + }) + }) + }) + + describe('Two Pods + Web App Login Workflow', () => { + let aliceAccount = UserAccount.from({ webId: aliceWebId }) + let alicePassword = '12345' + + let auth + let authorizationUri, loginUri, authParams, callbackUri + let loginFormFields = '' + let bearerToken + + before(() => { + auth = new SolidAuthOIDC({ store: localStorage, window: { location: {} } }) + let appOptions = { + redirectUri: 'https://app.example.com/callback' + } + + aliceUserStore.initCollections() + + return aliceUserStore.createUser(aliceAccount, alicePassword) + .then(() => { + return auth.registerClient(aliceServerUri, appOptions) + }) + .then(registeredClient => { + auth.currentClient = registeredClient + }) + }) + + after(() => { + fs.removeSync(path.join(aliceDbPath, 'users/users')) + fs.removeSync(path.join(aliceDbPath, 'oidc/op/tokens')) + + let clientId = auth.currentClient.registration['client_id'] + let registration = `_key_${clientId}.json` + fs.removeSync(path.join(aliceDbPath, 'oidc/op/clients', registration)) + }) + + // Step 1: An app makes a GET request and receives a 401 + it('should get a 401 error on a REST request to a protected resource', () => { + return fetch(bobServerUri + '/shared-with-alice.txt') + .then(res => { + expect(res.status).to.equal(401) + + expect(res.headers.get('www-authenticate')) + .to.equal(`Bearer realm="${bobServerUri}", scope="openid webid"`) + }) + }) + + // Step 2: App presents the Select Provider UI to user, determine the + // preferred provider uri (here, aliceServerUri), and constructs + // an authorization uri for that provider + it('should determine the authorization uri for a preferred provider', () => { + return auth.currentClient.createRequest({}, auth.store) + .then(authUri => { + authorizationUri = authUri + + expect(authUri.startsWith(aliceServerUri + '/authorize')).to.be.true() + }) + }) + + // Step 3: App redirects user to the authorization uri for login + it('should redirect user to /authorize and /login', () => { + return fetch(authorizationUri, { redirect: 'manual' }) + .then(res => { + // Since user is not logged in, /authorize redirects to /login + expect(res.status).to.equal(302) + + loginUri = new URL(res.headers.get('location')) + expect(loginUri.toString().startsWith(aliceServerUri + '/login')) + .to.be.true() + + authParams = loginUri.searchParams + }) + }) + + // Step 4: Pod returns a /login page with appropriate hidden form fields + it('should display the /login form', () => { + return fetch(loginUri.toString()) + .then(loginPage => { + return loginPage.text() + }) + .then(pageText => { + // Login page should contain the relevant auth params as hidden fields + + authParams.forEach((value, key) => { + let hiddenField = `` + + let fieldRegex = new RegExp(hiddenField) + + expect(pageText).to.match(fieldRegex) + + loginFormFields += `${key}=` + encodeURIComponent(value) + '&' + }) + }) + }) + + // Step 5: User submits their username & password via the /login form + it('should login via the /login form', () => { + loginFormFields += `username=${'alice'}&password=${alicePassword}` + + return fetch(aliceServerUri + '/login/password', { + method: 'POST', + body: loginFormFields, + redirect: 'manual', + headers: { + 'content-type': 'application/x-www-form-urlencoded' + }, + credentials: 'include' + }) + .then(res => { + expect(res.status).to.equal(302) + let postLoginUri = res.headers.get('location') + let cookie = res.headers.get('set-cookie') + + // Successful login gets redirected back to /authorize and then + // back to app + expect(postLoginUri.startsWith(aliceServerUri + '/authorize')) + .to.be.true() + + return fetch(postLoginUri, { redirect: 'manual', headers: { cookie } }) + }) + .then(res => { + // User gets redirected back to original app + expect(res.status).to.equal(302) + callbackUri = res.headers.get('location') + expect(callbackUri.startsWith('https://app.example.com#')) + }) + }) + + // Step 6: Web App extracts tokens from the uri hash fragment, uses + // them to access protected resource + it('should use id token from the callback uri to access shared resource (no origin)', () => { + auth.window.location.href = callbackUri + + let protectedResourcePath = bobServerUri + '/shared-with-alice.txt' + + return auth.initUserFromResponse(auth.currentClient) + .then(webId => { + expect(webId).to.equal(aliceWebId) + + return auth.issuePoPTokenFor(bobServerUri, auth.session) + }) + .then(popToken => { + bearerToken = popToken + + return fetch(protectedResourcePath, { + headers: { + 'Authorization': 'Bearer ' + bearerToken + } + }) + }) + .then(res => { + expect(res.status).to.equal(200) + + return res.text() + }) + .then(contents => { + expect(contents).to.equal('protected contents\n') + }) + }) + it('should use id token from the callback uri to access shared resource (untrusted origin)', () => { + auth.window.location.href = callbackUri + + let protectedResourcePath = bobServerUri + '/shared-with-alice.txt' + + return auth.initUserFromResponse(auth.currentClient) + .then(webId => { + expect(webId).to.equal(aliceWebId) + + return auth.issuePoPTokenFor(bobServerUri, auth.session) + }) + .then(popToken => { + bearerToken = popToken + + return fetch(protectedResourcePath, { + headers: { + 'Authorization': 'Bearer ' + bearerToken, + 'Origin': 'https://untrusted.example.com' // shouldn't matter if strictOrigin is set to false + } + }) + }) + .then(res => { + expect(res.status).to.equal(200) + + return res.text() + }) + .then(contents => { + expect(contents).to.equal('protected contents\n') + }) + }) + + it('should not be able to reuse the bearer token for bob server on another server', () => { + let privateAliceResourcePath = aliceServerUri + '/private-for-alice.txt' + + return fetch(privateAliceResourcePath, { + headers: { + // This is Alice's bearer token with her own Web ID + 'Authorization': 'Bearer ' + bearerToken + } + }) + .then(res => { + // It will get rejected; it was issued for Bob's server only + expect(res.status).to.equal(403) + }) + }) + }) + + describe('Post-logout page (GET /goodbye)', () => { + it('should load the post-logout page', () => { + return alice.get('/goodbye') + .expect(200) + }) + }) +}) diff --git a/test/resources/accounts-scenario/alice/private-for-owner.txt b/test/resources/accounts-scenario/alice/private-for-owner.txt deleted file mode 100644 index 5d39eb781..000000000 --- a/test/resources/accounts-scenario/alice/private-for-owner.txt +++ /dev/null @@ -1 +0,0 @@ -protected contents for owner diff --git a/test/resources/accounts-scenario/alice/private-for-owner.txt.acl b/test/resources/accounts-strict-origin-off/alice/.acl-override similarity index 63% rename from test/resources/accounts-scenario/alice/private-for-owner.txt.acl rename to test/resources/accounts-strict-origin-off/alice/.acl-override index fbc63348b..bcdd33def 100644 --- a/test/resources/accounts-scenario/alice/private-for-owner.txt.acl +++ b/test/resources/accounts-strict-origin-off/alice/.acl-override @@ -1,5 +1,5 @@ <#Owner> a ; - <./private-for-owner.txt>; - ; + <./>; + ; , , . diff --git a/test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json b/test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json new file mode 100644 index 000000000..68a3b5341 --- /dev/null +++ b/test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json @@ -0,0 +1,411 @@ +{ + "issuer": "https://localhost:7010", + "authorization_endpoint": "https://localhost:7010/authorize", + "token_endpoint": "https://localhost:7010/token", + "userinfo_endpoint": "https://localhost:7010/userinfo", + "jwks_uri": "https://localhost:7010/jwks", + "registration_endpoint": "https://localhost:7010/register", + "response_types_supported": [ + "code", + "code token", + "code id_token", + "id_token", + "id_token token", + "code id_token token", + "none" + ], + "response_modes_supported": [ + "query", + "fragment" + ], + "grant_types_supported": [ + "authorization_code", + "implicit", + "refresh_token", + "client_credentials" + ], + "subject_types_supported": [ + "public" + ], + "id_token_signing_alg_values_supported": [ + "RS256", + "RS384", + "RS512", + "none" + ], + "token_endpoint_auth_methods_supported": [ + "client_secret_basic" + ], + "token_endpoint_auth_signing_alg_values_supported": [ + "RS256" + ], + "display_values_supported": [], + "claim_types_supported": [ + "normal" + ], + "claims_supported": [], + "claims_parameter_supported": false, + "request_parameter_supported": true, + "request_uri_parameter_supported": false, + "require_request_uri_registration": false, + "check_session_iframe": "https://localhost:7010/session", + "end_session_endpoint": "https://localhost:7010/logout", + "keys": { + "descriptor": { + "id_token": { + "signing": { + "RS256": { + "alg": "RS256", + "modulusLength": 2048 + }, + "RS384": { + "alg": "RS384", + "modulusLength": 2048 + }, + "RS512": { + "alg": "RS512", + "modulusLength": 2048 + } + }, + "encryption": {} + }, + "token": { + "signing": { + "RS256": { + "alg": "RS256", + "modulusLength": 2048 + }, + "RS384": { + "alg": "RS384", + "modulusLength": 2048 + }, + "RS512": { + "alg": "RS512", + "modulusLength": 2048 + } + }, + "encryption": {} + }, + "userinfo": { + "encryption": {} + }, + "register": { + "signing": { + "RS256": { + "alg": "RS256", + "modulusLength": 2048 + } + } + } + }, + "jwks": { + "keys": [ + { + "kid": "QMa5xaKOYwI", + "kty": "RSA", + "alg": "RS256", + "n": "ol8T6mc7t55kUI3Xf4pHsx8p25VqZ3jm54TQY6xZ07FYzwU8ex02Mg_W_VABRNyVq8wdUBKubo1W8iaKtvtrr0XDOyHUAlwM6xa14332c9akB1AmTirZY4gvyobIY-b18F8LpeIkkLUcypeZmsDd-bGONEJs0sxM6LtLCY41s_lgesPdQwmHLBw4_Rw9NcjBslupWP_pSXUW9x2fj8tKHOoURqmOWL-54t9YbDdIht06uzqagzjPV3UoYtvRsu2QUJx99ExgNvCA9pA1wyiyysyhUdfeKyZpwvTfwWxkrwZrE6zb1AZICFW5R3Bgg0b9UnS96LpFxbSO7rXBRWVKOw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "66gqKTPVHyA", + "kty": "RSA", + "alg": "RS384", + "n": "rWHV18o2T_9zhO-YknvC9brSjWru496-Dw0iVCiJdEZph94aWXeZW4tYsSjYAfzCJXQUrIqfoPTx100KoYRMiUGpVUh5AgwqAitOpFV_Cxa2j4D01qALwUXWblmJTeCzY7zQFOs1-OBU_U3fhsqcHVPHVlfwO4fYhe-FrhQwTDf55JIW5OGM2bViRxpPyZ3t9nueSuz1jEDCSRlaizJq4jhDrkYWoXtXomRfoseGrZVwTGx5cslfrYs-AmLWMfLkZQWjYZMcwOaJCy3dSkTQkmas4dzGwQqrOqNbgznyCo3oTpHboWS36e0jn_lnbq95zPpZkHNsOzw-Mzq0KRj1jw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "zPdTDVkjms4", + "kty": "RSA", + "alg": "RS512", + "n": "tbVEZHw4LP21DFHmF0QjbSektUEGl8t4blGcZM871ieppUVZ_uHKlfan2ftnQ4GwBISkmjwk6KP1nc9iiONzqAhJbFheQMT4RAmYz7xPJP9cAPOiD8YbqzO2xJqBT1OMc2PDS7ICH0-t_kBXMb0IR61CTG-CmO5Tp8ecauUkshvvYg0dA3-os16Dy5ex4if3ZSpfXowmfjRrvYAKEPeFTmA9Q8lMzN0ZyuEb2nILIeMFwTAjo8Ck8D1h4keOVaY0mfTgC9KxkR1kIcAc7DELYX-vjG63AwB-8IIo735g5NMrFj22923jymMDpQDTEMui-jW1TQYNGR84ShNW_nJZGQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "8zan03XlrmI", + "kty": "RSA", + "alg": "RS256", + "n": "y3E2ffizby9vClbahFgkg8_NcpA6iYTwkA4TH2i2-usyH87nz3uM5LfRa7KIV4ZHOvY-DZr6H1MAqaFCPrciWZnPPyTRxlUlYhfb4n42g0Bwk7Oh7z-KZvIqR45x85NfniR3uB8xu47VdTWCmWJge2glMavdWC8mr5Pc8um3Fr5eMVactUFsp571SrVKuY_u5qJHN3xmn7mLpiLdCIHFlBkvvLgcAcUmXFhn8cCzHCqkrcrRgfjhd5YJmv6wxxINrTMT4_dS4jxE5u1Ezw-m6xSIWukdW21lWupFHNZEK5VvIkiCBl73Sh0vO-gv4XNJcQmPRpqMdHat8GLG7I2PHQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "5ooqXseJdoQ", + "kty": "RSA", + "alg": "RS384", + "n": "tqhzPmOds6zvDNX3IHCr7SW5kf6GlnlpW-Rm4aQot1HmtKnsXieV99VjT98EspvcFeKyT5jcJFgZMHb1n_kOtRnhygFHNZQ4ooFmFI2VP5lPUuOIGppWiO5ZxIzECdnwAGoZ7A1hu9Vh5oJJP-m_88JX3sdbHPlsEpzdXHf-THZKAqPYHGNWeNPkmQuON5PaEwiJGRWQ0dbMZtsiMoVCPjh7ZQM-1N2UjXmSAcCCxst5BaTUwQQuVmKIT-cfxP9ShPjP7_DmpRBDOp7_frMKTPkznL0HPNWqSRRewGWB6AcrdY7WtWI5hHNDx9GTdLmolFOvnL4cgtr99u9adq6vAw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "tfz-MRyl3GQ", + "kty": "RSA", + "alg": "RS512", + "n": "3vyjzgsA89bJHD7BZ2MNadjFOPUXpuGKlC7OumOspC_iOSMnJ0Kh7oCWmsBTuzGdfY_gYMaXx28NK-LVjGmaEKZxPhdCz7yzofUCMWoVXNhE4hwBdZt1mNl0abaKNzJ_8BhbtTNhourfBvRwebMYFYO0LfEkApE-hM929pFERb0G3-_ybw8A2cqQFvQ67JhYsBcFUwpf68xZvfYTbdsJzfkkoY0UgI01GU55dZskPBK-_jndzo_bNo8wdENU_cUdOllNdZUoWAemWOGoHKdNshGKy6OwZaC9xqaE_VzF-RaYEcf_jaLD7GbPrz9Xcm9sygnFV3IDlj9-0fjKOkAwqw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "FRI7f7sJKUg", + "kty": "RSA", + "alg": "RS256", + "n": "0d4up4hx3l_HZa6D2PO-YYSqgNbAWjtlIbnFWIZS-PRzVFgDKcR9bLo_9-MGm0sT0tHbyeqc4V8o5oeYF0uhNmlEuU9Do2VYiyc0fkNeW1nFrC-XJYxbnge4Pxbhl-0Jn04O8IJsP15xq16GfRZxYfjKPeFilQNeDwTb_SBqoveZASHUW998eO1bEg0bjUZs4Yy23S4R23ABZKTQMPMGMETGFVbcFNXUohu0eSYMG4eU9iaFNmh0p0G9lU7ER-UFSatczaEFle0Awazb7-EHN6iya3zL6LDt-ezlIszTzHIXa2Dhhga2SlDIyuhFUOkkEeCP3a-sFeXre-JWiYz8ZQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + ] + }, + "id_token": { + "signing": { + "RS256": { + "privateJwk": { + "kid": "hS7A2bkdhJA", + "kty": "RSA", + "alg": "RS256", + "n": "ol8T6mc7t55kUI3Xf4pHsx8p25VqZ3jm54TQY6xZ07FYzwU8ex02Mg_W_VABRNyVq8wdUBKubo1W8iaKtvtrr0XDOyHUAlwM6xa14332c9akB1AmTirZY4gvyobIY-b18F8LpeIkkLUcypeZmsDd-bGONEJs0sxM6LtLCY41s_lgesPdQwmHLBw4_Rw9NcjBslupWP_pSXUW9x2fj8tKHOoURqmOWL-54t9YbDdIht06uzqagzjPV3UoYtvRsu2QUJx99ExgNvCA9pA1wyiyysyhUdfeKyZpwvTfwWxkrwZrE6zb1AZICFW5R3Bgg0b9UnS96LpFxbSO7rXBRWVKOw", + "e": "AQAB", + "d": "KvDiH3e1v1XQSc15VG2JkMGJHF1jioHa7xec1P9bsjSQvA8yc4zCLHMr9EoYS9Hac1jD181Y_Du85sVyofnT_MKCYz0LCKS3deTHraY-a1w0fQqhVsLWQxBdMz55-JG4MR2xwukPqoV7W8jEAr1G9yYR6Zg3l3gYTuRZb-mAIlxBZOcZ-4DvB0GtEYLyWFRSMiaUl_EkqgQpssH5hKIIB7xtHZFG_FsbH2gnv0apZFdZCs1hpzyJ_FuUYoIupdaHUP92ojdGQ8E51J_t6SIYjZdtEoKhk6i2BHIPzSerxItVgAs-3RTbeYp1gEdyQGROz8Owyorsqzq-2S7gxXn_AQ", + "p": "zJtqzVrhym0DBWIK11LEIwTPU9G_prC_XYzt0H3tXuiwAlpRoFOoecAKsCJqb_bvL7mqVCjYzS-O57dzdxd36F-vpvW9xH3SgfxcoDtiVkvuoux9nGaQXLWCetjHy8jrL41SDVc55R7h4knn6KgR_yWmY2LR-w0CktrWuIlOIps", + "q": "yyfVYtGaJASgfkv1KL-HoA8yyP7OZrUsxxQcIXMuQoAUqKtvyl6gn2W4uW4opg_yzuN0jxK8ZM8EjOmzXs0_dhVWXWFBBvhmpI4ssXXQYVhJiq-QMm6WvDZFXtW-o3ikRXWuxwnUeOn0psxsIXtHrKQ7Wcf29KrCu64MYTvIoOE", + "dp": "Ptr722ww8wO8KtospGtbr7pZitFjw-yGTVHu-N7GniJzd7WRX-RzXDufzO41roG4hvvNlJ8bwyT6DLsxsIM4Jd3HU04o5wUUNzR0rBCyK_qVq91k1Tg43xIvrFeOQU9O2MPcUhbaxUVQdTjpEnMXXD-PtvZztWEQylaKIhSkOUM", + "dq": "oauPetaGrgcomZlk_gp9qfiuV5m_M6kWe08bm9sHg1BeIGRd0FRByteui5KIsq6acd480eb9GdRNML6CSf1YdWZBlopgr2VaebXTB15UeENEMyPHwvqS5jDiP7glv_2v7L7cWfUOqzKzyVGA85why9fei3JAqzCBS84UeASVgsE", + "qi": "lURMq4viaqzYCi_JF_dDZjvc6rpuiRSzhd0PyY6mdutMZqLtZJESZt8HuEqpey5GA4i481DmmUXCfNhBc-4kUOAP5PVdHJp7YttvrzpkZGtJx_xLwLLLgDn6zaheaeNnxRvHqoW0Cycx6TAAVzX2Cdsjo-vRiaRqGkOBPslOiqA", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "QMa5xaKOYwI", + "kty": "RSA", + "alg": "RS256", + "n": "ol8T6mc7t55kUI3Xf4pHsx8p25VqZ3jm54TQY6xZ07FYzwU8ex02Mg_W_VABRNyVq8wdUBKubo1W8iaKtvtrr0XDOyHUAlwM6xa14332c9akB1AmTirZY4gvyobIY-b18F8LpeIkkLUcypeZmsDd-bGONEJs0sxM6LtLCY41s_lgesPdQwmHLBw4_Rw9NcjBslupWP_pSXUW9x2fj8tKHOoURqmOWL-54t9YbDdIht06uzqagzjPV3UoYtvRsu2QUJx99ExgNvCA9pA1wyiyysyhUdfeKyZpwvTfwWxkrwZrE6zb1AZICFW5R3Bgg0b9UnS96LpFxbSO7rXBRWVKOw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + }, + "RS384": { + "privateJwk": { + "kid": "IN7Ur_i2gps", + "kty": "RSA", + "alg": "RS384", + "n": "rWHV18o2T_9zhO-YknvC9brSjWru496-Dw0iVCiJdEZph94aWXeZW4tYsSjYAfzCJXQUrIqfoPTx100KoYRMiUGpVUh5AgwqAitOpFV_Cxa2j4D01qALwUXWblmJTeCzY7zQFOs1-OBU_U3fhsqcHVPHVlfwO4fYhe-FrhQwTDf55JIW5OGM2bViRxpPyZ3t9nueSuz1jEDCSRlaizJq4jhDrkYWoXtXomRfoseGrZVwTGx5cslfrYs-AmLWMfLkZQWjYZMcwOaJCy3dSkTQkmas4dzGwQqrOqNbgznyCo3oTpHboWS36e0jn_lnbq95zPpZkHNsOzw-Mzq0KRj1jw", + "e": "AQAB", + "d": "KtxZqbuiS4phu0YjmGqh2m8xp6X8ojYpE71ydA2FVUomwmCkcOOA9MFwznLDW1JpiCq3BaRLK9YBhvDTpPP4m6Gww5Vj3J63L8wW58b-3fXicX02iWwNG90w0hyuNaNLlWdSpSk0MW77c5bxn_esOg_A4lZg28aMPyfkCxGQkvaHR2EeY9eL9xlZoNtQxtLoKOIl97fJt96C9hXwRPuygDknHywRo35_Fi9nSpdu-_wfoZxBvPvRAQA-jFmwsJwLB3XaYJEZmZoBajXLfYUVEYKCOD7bsPysdbIUCY6dFBAL9FyFl5HSCjgW6yKHql0YfUf5VabQQnkdXDZxng7OiQ", + "p": "2ZOHQkgjfkgMC0Z6gfP-nCj_jqDI2F6MpB4HIvOvpm8z-qz02mZeC6zgHzHtichOwgCPJPapS7hN9vlQdnOTl62XBWmZ2Jbz_q3shbnRPYx7J3GSARrohOHm1bsapxeagQcXoBuScx-Kvgih4B_-u-PHvHFQHHaoEzIpR_FcK-M", + "q": "zABSbkRBSpayejh_y8cvTZI5YZjz8bK_n78yKYOR4bsPrC-c2TGtxsHqv5x_5Ps5ALicul59HgrN8oD8THYJiO2V7wobNIp4HDl2J8aL9me43a2VuDRPOXHeOzxtP071_p6VZWEju0kMDihwn91Vkc2RwrgkNrPClGEQstOg12U", + "dp": "dqxTIEH8qgpeF2BPvcX53-80xPTJ18pqZ7HBLr0_10XcUiQ4QU-IiFG4xQsUhwxseMCZUw3-9UAHtmfyDUmo_Rg_wUICGfLsDsOKuL3LdQjEu5TkkBm_LYuRvo4ZUX48VZgquLeRP526rUBEGt0Ysh7heNVNXtkRf7bicU0iewU", + "dq": "yGvskF7IksJZWNCXZZostBZb_7HowOYvc3_BhZ24vkAs1qr0e0Jei25K9rOHx2y2BSpa-JMKc3CEA6OLvIcfOQLKkk2oiscb2AbwOYXMTmp66ne3J4Fk8HgZsLLeVht6fQxKlI6KL19F08cRV0552kRP1zFYitGy8lomsLpQRC0", + "qi": "scdLHtzFy5A5nhbl6XOv_g_5LxTiebV9ifCo8A_Y8T7hEPsUwOZxkIarcREgDbgo7zdJZjpKEklWrsp6sBT6KyJZf1_e_oZWCoivr7btx05ZWq7bJdn8773y-7DjL3H_HFpqVkpx-f03OKV8_AV-VspkxsVrp0FcrRGs2hpjck0", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "66gqKTPVHyA", + "kty": "RSA", + "alg": "RS384", + "n": "rWHV18o2T_9zhO-YknvC9brSjWru496-Dw0iVCiJdEZph94aWXeZW4tYsSjYAfzCJXQUrIqfoPTx100KoYRMiUGpVUh5AgwqAitOpFV_Cxa2j4D01qALwUXWblmJTeCzY7zQFOs1-OBU_U3fhsqcHVPHVlfwO4fYhe-FrhQwTDf55JIW5OGM2bViRxpPyZ3t9nueSuz1jEDCSRlaizJq4jhDrkYWoXtXomRfoseGrZVwTGx5cslfrYs-AmLWMfLkZQWjYZMcwOaJCy3dSkTQkmas4dzGwQqrOqNbgznyCo3oTpHboWS36e0jn_lnbq95zPpZkHNsOzw-Mzq0KRj1jw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + }, + "RS512": { + "privateJwk": { + "kid": "34CvC1I0fbk", + "kty": "RSA", + "alg": "RS512", + "n": "tbVEZHw4LP21DFHmF0QjbSektUEGl8t4blGcZM871ieppUVZ_uHKlfan2ftnQ4GwBISkmjwk6KP1nc9iiONzqAhJbFheQMT4RAmYz7xPJP9cAPOiD8YbqzO2xJqBT1OMc2PDS7ICH0-t_kBXMb0IR61CTG-CmO5Tp8ecauUkshvvYg0dA3-os16Dy5ex4if3ZSpfXowmfjRrvYAKEPeFTmA9Q8lMzN0ZyuEb2nILIeMFwTAjo8Ck8D1h4keOVaY0mfTgC9KxkR1kIcAc7DELYX-vjG63AwB-8IIo735g5NMrFj22923jymMDpQDTEMui-jW1TQYNGR84ShNW_nJZGQ", + "e": "AQAB", + "d": "RZybBe_8yWesu3qIrnMhK0kbtYCi2PZPPdwwEQK_RqzNNg6aiqXPqaHj7gN9LQR6_VAfiyLtdN6TUxDHC_AvN7ls_3_fI-sRvWb7zuGyZFcb1RWBCY_4u57FLw6N6Wj1jqMyh0Y7v-kTnCrj_J8Rk_wRQR0bKCFtlQJIrz73zu90rcPOOjWPH6W6LCN-lkmOC8vm0M08aHJtZclLSJcSO8VX6P4rDbbIadNubhtZ0_snOlc9ZctpWDgqGRqJGKL2FRldmVMnYr9vE4kv3jELCvkKtct35k1q6qd6pQQ2j3iL0nUnIRRCiuIVRmuiUKI11i2lmQoqnzQN0qGNKhAY3Q", + "p": "7psJPwCSpbravp7NlZQWAmvBvZEdPZ3BNk2w7_udpKZqHvnhgwr40jypwp3JdysSXsd4cDKGlzkCaCeJT3L9N26feCGbwbSjwmdf7UcSXDhlfSxAsEI2LtPPkG4SQdsAv42s3NQcPnO9Uf0ZdH-yV8tj5gwB1ibF0_MxtNcenYc", + "q": "wvRiS7lfGGQmJioCYHrkUyeJnwg2-GYbCD6LF2nDXFbsz_JWmgeI1lbSKuD5notoIy62p0R6FdX3mtwb_8dDDHFbjrHfPbOEp-MOd-cZ9f6XxKeC_uoXrkEdcLl5IthG2WtqKT_If5xIMRW4MYwRD3gTUs-DU255B-7YF3oT_F8", + "dp": "jP01QHIRNTatLLffWMRRIQsVRvNpaNA_q9vKcnOmWfUvfbA_rdQc5PWNhf8AXZco2rJZG0rvtomsP2klPLoAn_GQ70ZEp_gaT7QPvcAiPDXi2kz8yGnHZHIqEvjHdvx2e7m2bCI1sj1nn_vDP9B4zGHVXMi5iRYODUiFlYsLfx8", + "dq": "v1uxwDJMLVzgNUW234zA4P5GD1u42Ukf74-0Z17g65pHCDYO21HZ9slxsbTyT7T2mtIXZ0fHrfc_-zliIkYsgeIixIXDYoT7CO_OG9MzoEouHlFuO1j7tYckpqjnRlST9oWAxsxcuSVllwiCq9-YP17VWMtnVFVzZ14BrcmeJHE", + "qi": "4Ufn1YaM5AImU625M0Fd5r9cYU__mPw-HbJHxHoCENGDY8Mz4pB1nJqu10gI5JKgucU4y8VtV1wBzGb_s97gSS8SMmzea6of2SjoxxyR4sYcPfmJz9-1En7F8r3WahBP1IDMTDV6afbTMVPzPIbjkHowmQHyrTBmx2G3rODfStw", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "zPdTDVkjms4", + "kty": "RSA", + "alg": "RS512", + "n": "tbVEZHw4LP21DFHmF0QjbSektUEGl8t4blGcZM871ieppUVZ_uHKlfan2ftnQ4GwBISkmjwk6KP1nc9iiONzqAhJbFheQMT4RAmYz7xPJP9cAPOiD8YbqzO2xJqBT1OMc2PDS7ICH0-t_kBXMb0IR61CTG-CmO5Tp8ecauUkshvvYg0dA3-os16Dy5ex4if3ZSpfXowmfjRrvYAKEPeFTmA9Q8lMzN0ZyuEb2nILIeMFwTAjo8Ck8D1h4keOVaY0mfTgC9KxkR1kIcAc7DELYX-vjG63AwB-8IIo735g5NMrFj22923jymMDpQDTEMui-jW1TQYNGR84ShNW_nJZGQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + } + }, + "encryption": {} + }, + "token": { + "signing": { + "RS256": { + "privateJwk": { + "kid": "oYYAVkAOTqo", + "kty": "RSA", + "alg": "RS256", + "n": "y3E2ffizby9vClbahFgkg8_NcpA6iYTwkA4TH2i2-usyH87nz3uM5LfRa7KIV4ZHOvY-DZr6H1MAqaFCPrciWZnPPyTRxlUlYhfb4n42g0Bwk7Oh7z-KZvIqR45x85NfniR3uB8xu47VdTWCmWJge2glMavdWC8mr5Pc8um3Fr5eMVactUFsp571SrVKuY_u5qJHN3xmn7mLpiLdCIHFlBkvvLgcAcUmXFhn8cCzHCqkrcrRgfjhd5YJmv6wxxINrTMT4_dS4jxE5u1Ezw-m6xSIWukdW21lWupFHNZEK5VvIkiCBl73Sh0vO-gv4XNJcQmPRpqMdHat8GLG7I2PHQ", + "e": "AQAB", + "d": "Jyjwq0jfCSzhO-VCBK2OwcyTKFU431W2lJQQ_D_E0QHK0TKbjmWi1jfH2Ooxsl9HgML7aNUHBlaMzxoaTUYlF4gyy13D_2BOZNZg3fUbeyJBST0Pk6TweCZvGv0BVDhu9FrirI9cnFS_I-Ob8vhrx_VhC3GglqPk13En254_PuIoEuBgTnxRHxNyIqWSiBUQNuEjqDl2CxO1dpjczKbj6YBzbPqFIV8FkJUz6HS2SMhJOgoDhrhduOFwzqqQQ_yUhfPkP2WYodgDXkyUWdgYKuCgCA3hWrQm1YJf-WoN0l_OVvetTSIlbxiNr-Br7PCPBLOpyiGTu4O3LjFHu0cWJQ", + "p": "6AMK_ANmxrnqgQ77Mf6A1BDopCqQWIBBZ4m_Ia4Ia3ygWpKLdjp5NNM1DL5Lnuing7wSNZvj0iyc-Ra_ilYmLeyKROkyPvwoLohk8W6AVPKotvVOZZwK5nHMIN3McSSgileai0FxxZtFG2W-ZLy4ggKQkfsGDnDQ0vWVpcSQ24M", + "q": "4Hn69Uev6x7nlsAV9fR6GvpjUZDD6Np_VY85BtWEw_6VxbutsMJnI0hYqCPMcmSHfdchzEiMLCUaMIRXMvigNdNxTWF1BSL3L3c7A-uZuv0iJ7X3trNmxEeuJ0EBmcqXcukJuYxW-Lb7XzernSGYOGtambMrf1oMM2ER90egyN8", + "dp": "WnKdPKPi1EQ0TH3XpaTO-l1hJGbHgQj29nM3xNyAwc6DAOwyXDPtfo98Fey1tEyEyZFvE-EjDpN_2odownhVR__342d5xB4vV_yqRYjLlNJIvZKiLnCHu1DPwFxXUCB0SZpfUDyCKwQeC9E9SS5dS6nOTGqs8MJAVo2Q-l_IDRs", + "dq": "vM2cCMW87xNVUnRJhE-WjC5hbu9F-Aoe44XNPzRDsN3mdyN92ZgJS6HD_9fsU6K-W1eg88NpMpAaUQhel16K0fr_50e7NxDLuz6bgpac_KuAGMpyiVanbxujHR0ODZ5ad6oOJeQmGpc9Ij8ettDUyU9yKqiKQ1knvec9RzEVyR0", + "qi": "Xamq4vSnrd6jez7YaYdCU6THSykIMrmyHcXjTMrf4WpeAXxH_Wu3F-jPIFy9zTxkZByMwmCqaBqQ_IJmFuqLBvcjpZ_NQmn-wZA4eYuPDnm2ZBhqbzS9b1jhWcAMYeIm0F744vJqqcymqEQnnHYlDyM39_cfrXtmf9gazwglRPA", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "8zan03XlrmI", + "kty": "RSA", + "alg": "RS256", + "n": "y3E2ffizby9vClbahFgkg8_NcpA6iYTwkA4TH2i2-usyH87nz3uM5LfRa7KIV4ZHOvY-DZr6H1MAqaFCPrciWZnPPyTRxlUlYhfb4n42g0Bwk7Oh7z-KZvIqR45x85NfniR3uB8xu47VdTWCmWJge2glMavdWC8mr5Pc8um3Fr5eMVactUFsp571SrVKuY_u5qJHN3xmn7mLpiLdCIHFlBkvvLgcAcUmXFhn8cCzHCqkrcrRgfjhd5YJmv6wxxINrTMT4_dS4jxE5u1Ezw-m6xSIWukdW21lWupFHNZEK5VvIkiCBl73Sh0vO-gv4XNJcQmPRpqMdHat8GLG7I2PHQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + }, + "RS384": { + "privateJwk": { + "kid": "2N9QAEg-94s", + "kty": "RSA", + "alg": "RS384", + "n": "tqhzPmOds6zvDNX3IHCr7SW5kf6GlnlpW-Rm4aQot1HmtKnsXieV99VjT98EspvcFeKyT5jcJFgZMHb1n_kOtRnhygFHNZQ4ooFmFI2VP5lPUuOIGppWiO5ZxIzECdnwAGoZ7A1hu9Vh5oJJP-m_88JX3sdbHPlsEpzdXHf-THZKAqPYHGNWeNPkmQuON5PaEwiJGRWQ0dbMZtsiMoVCPjh7ZQM-1N2UjXmSAcCCxst5BaTUwQQuVmKIT-cfxP9ShPjP7_DmpRBDOp7_frMKTPkznL0HPNWqSRRewGWB6AcrdY7WtWI5hHNDx9GTdLmolFOvnL4cgtr99u9adq6vAw", + "e": "AQAB", + "d": "akN_oCk2AuS1weLsvYuvCe0rk3re88W4fMRY8iadpWDZdftxTql6_s6-0yWsxvgTxwu2rsYANIioRuC-Lw4m90cSa4Ho2ovbkvby2zwvOuvHETLb6JYnh8wan1VBa3XFwYf4grKaTDtslDzxvmQPzxEeK7YRFL8ql3147qXEZNhka8uIo4n-CdbMG0IazaUJp4oTjt9vId_8PDNqc70qGpCE46bh4Ee76GgF6DfWhnHn2rW5uSatjgQbvA7xJ957GVNlA4k-MC3U-S5DOi_cK6YytVdtNIkBY2EaRhtZQQSw0lRvFXxwenaXZsGAbdS9wOhkFfJYiokkxtbdlAkMgQ", + "p": "4-vsibMRfgglnalDkJpUxEJ1Xj4CNzAUr8FZobhqLdhKn1VPNHWIXudmsBuHT6foRLMTTS7R2kzcPWs_c5y8XeaLbETJKSgWtWDjTuBH0J7gg8_th75EInPfhzA79HKfH145DOfpIwMYAxtsDHNvGUjyBwb0Jz6r-at3oSwQncM", + "q": "zSkGydk2AqlUztzU7c2y2KEV8XKuHD8pxloNQEQf42Q9WS7dyYDjKFAfh75QkwHTHxLzzHR4IF83TlYoSslJ7ODiFVa9c_uYScsS9EpOlEtRgiADtlaAkg5o6iCGRPKEKVh9bWZKDcOIe1P-1E_7nw42WcaiHkWhHoV4FWTCVcE", + "dp": "txxX0NkYeJS7A8t1CLu01mg-OxS-WvA57mn8RL0QMPzQFupG0_KJORXXniy_rPNM28SzARNYbXXKi12agJuvihEqejVZF8OpWtcYR8pQZ_78iWmHf8MQok1NjCLoSB--T0k3tHKtDv_xTq29RNOIslu0dojTpqPnLpLfbZElWFk", + "dq": "d5IVtsa1x89Q8k-aeg6M0dzwoQwplaTqgAQz_OS3gRwG9VdvQ-WufuxTtBWjeEpz9YRiOyMWcCeOYEWurgeq4jgfDDjFqjdUho2oumAkdCGBm8l04GyB-p4TX4EdQEnn5QEB-STIvETd4qMNvkfvasApxSETk3kZcmRvnGhhKwE", + "qi": "U38wGRTDA1-NrZFFX1ipttBYz-IFo9VbniwkH0IzQh_yUOKy4iGVvcxcaQyG4X0gaVWrAVi2gUrwZa0a_BCZyX8SNYh7M8EL-9MwL0qmsEwnD6Jq0tvfxFPBll7NyZM5iTLj9I0gWOt1bdcd_WAM3Bm8xOjU8X8L_mpQ4x7WTWo", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "5ooqXseJdoQ", + "kty": "RSA", + "alg": "RS384", + "n": "tqhzPmOds6zvDNX3IHCr7SW5kf6GlnlpW-Rm4aQot1HmtKnsXieV99VjT98EspvcFeKyT5jcJFgZMHb1n_kOtRnhygFHNZQ4ooFmFI2VP5lPUuOIGppWiO5ZxIzECdnwAGoZ7A1hu9Vh5oJJP-m_88JX3sdbHPlsEpzdXHf-THZKAqPYHGNWeNPkmQuON5PaEwiJGRWQ0dbMZtsiMoVCPjh7ZQM-1N2UjXmSAcCCxst5BaTUwQQuVmKIT-cfxP9ShPjP7_DmpRBDOp7_frMKTPkznL0HPNWqSRRewGWB6AcrdY7WtWI5hHNDx9GTdLmolFOvnL4cgtr99u9adq6vAw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + }, + "RS512": { + "privateJwk": { + "kid": "b3Miw_cVIr0", + "kty": "RSA", + "alg": "RS512", + "n": "3vyjzgsA89bJHD7BZ2MNadjFOPUXpuGKlC7OumOspC_iOSMnJ0Kh7oCWmsBTuzGdfY_gYMaXx28NK-LVjGmaEKZxPhdCz7yzofUCMWoVXNhE4hwBdZt1mNl0abaKNzJ_8BhbtTNhourfBvRwebMYFYO0LfEkApE-hM929pFERb0G3-_ybw8A2cqQFvQ67JhYsBcFUwpf68xZvfYTbdsJzfkkoY0UgI01GU55dZskPBK-_jndzo_bNo8wdENU_cUdOllNdZUoWAemWOGoHKdNshGKy6OwZaC9xqaE_VzF-RaYEcf_jaLD7GbPrz9Xcm9sygnFV3IDlj9-0fjKOkAwqw", + "e": "AQAB", + "d": "vRW0fWK9Uwe-D7JzZA0NccT8MHk8rikwzskGSe19lth314WkjNkm4Uyu6NjP57uB1dhsJwQf7mCP5bf6548gsp_BBSrKX8ee92YAjxBqvwkxGB8xaZ4C0TMMURwWBgpPjLPLCFNiprjNmGMtATXJ5WyCHDcQFxE813fpY9n477xuCieCuXbZOH0NRwviXncs_TriRFErDj3DFNUxhEnlUJBgIwiAaFNIXTOmLUVDgDX7DBL0XlHEJZ-WfIixHOwGX5WTFlDlPpqE1qXyTLc0yNaS-5P3r4q1ZgDJkEtc5M6cv6uYQmtu0lQmnR22HfuutGIhTBKiHNezpBwQYsPwQQ", + "p": "-R8uHmGlVW5RsOZsWU5dcWIrDgLnwNS4pFVScEwEurQR3JyFt90TZzps8tvpBvqJ3WwgTV38TVlxt31FHQzogJUTvoCmu9kvcHo7cDPKgrbwUdeLuwCQJat-ae2Ay1PHdsGo6l0k32nAwSclurJwHOPesEnYKmVz7GrEcQeakks", + "q": "5SS8OQOsADYKG7upakUXPMzWZVlODOF_vqDaCf1cTTg3Sz84bJsOcyuCy3y1lFepkD3jL7lRXqGFeDVyp8fSQ6O6j9GV2K7FsdTQts7S6zLyG4MmfIaTX97f28gGaMA0Vfp4XghkpJrPZp3vAVXi4vHQfcEqLOv3BfWbtT8s3yE", + "dp": "v4tf1HBTxUobeZ7R9CCy7DkEzbMiKjvk9EW-KyXoBP3rNesLTYGoJ5jeqCS6GWmNkzhN5e67zWVWcDTbbSi9pA_7rGAS0yB8v0jcZrsLnFG4mdTXVSNrsesYOa4pdyylkwP4MqsHbNhNIrZM5i3I0g3K7VT55i83YLH-9MFZ8d0", + "dq": "sr_5ZLCMmI2PTRsTiabj_bX8-Yq07C9sq5RnAqv2OPbFi5mBtpcuqoEiwwJB07qet7rPYwc5hoyRxbhL_L5QNBuhCVgBgMq1xYeyWSj2OCvB2dxxRWrlxD_keVqMRWLKcNe21gPOHun1KKPDMlOBbnAcqDzrXaelR6zVDop9woE", + "qi": "cl2oEYi-L2OYO5oyXJK9Kc-Oj2098Tx4o2WbfIZXQeOO48SMz7iRa03FOmh-b0G8WrtGxm7pVWIbryvBVlaLJYEhughgR1vtiSd_nJ5XCxDAF9p8h3hEQrnr8rmO0HTNE3z9PqBmVOCKvgbzOOa9S7YL3LgMMdCrs-CZLNJixio", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "tfz-MRyl3GQ", + "kty": "RSA", + "alg": "RS512", + "n": "3vyjzgsA89bJHD7BZ2MNadjFOPUXpuGKlC7OumOspC_iOSMnJ0Kh7oCWmsBTuzGdfY_gYMaXx28NK-LVjGmaEKZxPhdCz7yzofUCMWoVXNhE4hwBdZt1mNl0abaKNzJ_8BhbtTNhourfBvRwebMYFYO0LfEkApE-hM929pFERb0G3-_ybw8A2cqQFvQ67JhYsBcFUwpf68xZvfYTbdsJzfkkoY0UgI01GU55dZskPBK-_jndzo_bNo8wdENU_cUdOllNdZUoWAemWOGoHKdNshGKy6OwZaC9xqaE_VzF-RaYEcf_jaLD7GbPrz9Xcm9sygnFV3IDlj9-0fjKOkAwqw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + } + }, + "encryption": {} + }, + "userinfo": { + "encryption": {} + }, + "register": { + "signing": { + "RS256": { + "privateJwk": { + "kid": "xaDu9yTDJwA", + "kty": "RSA", + "alg": "RS256", + "n": "0d4up4hx3l_HZa6D2PO-YYSqgNbAWjtlIbnFWIZS-PRzVFgDKcR9bLo_9-MGm0sT0tHbyeqc4V8o5oeYF0uhNmlEuU9Do2VYiyc0fkNeW1nFrC-XJYxbnge4Pxbhl-0Jn04O8IJsP15xq16GfRZxYfjKPeFilQNeDwTb_SBqoveZASHUW998eO1bEg0bjUZs4Yy23S4R23ABZKTQMPMGMETGFVbcFNXUohu0eSYMG4eU9iaFNmh0p0G9lU7ER-UFSatczaEFle0Awazb7-EHN6iya3zL6LDt-ezlIszTzHIXa2Dhhga2SlDIyuhFUOkkEeCP3a-sFeXre-JWiYz8ZQ", + "e": "AQAB", + "d": "MMLZvi0yn8NLNfHdSnwfgNLtNrAu0wg30CU0mAPlpVhOr4sfeQXhSnDfyf2inFROT85YrcpoFukgPKfGi6sT0uuUfyXOhllWwEYkqS2H79uk1QPdr2i0JLyQb4AmfEEj2jKtv-3drr-H05RL1SZww52lh8klOZAlu4Gah26PuDs5Oy4VcgdiiNFIaBAd1WzCmDxW7xd-tMc709s76eWXCa1F4ZJJny3uGCtJGVBUnfrao6d_RJNw4BX7pje5hYcwSFnZN3AiMmzzje4CP6JU7lSpMImwqOtKhIHbFEGSTfnCb4bPbwpQc0IBYaUlTrWCsXDQgYkNdsLaFiVdsvGWgQ", + "p": "7ynGMOB3sQXZ7OoW051wDUdsByiwx1_j7ecpLZ1rSTZ7-TCERMXQq0okQHkVpx6AlU8tOromhMxd_yGFEPOIHC7ZEm4o-f0-DzkDO6RPCCvhli0IaxhaGHHh0r4jAhQf7IlaTkdWt_x1wLxUTgIeS3FUiR_I3SvgeX0oBnTCPuE", + "q": "4KRx-LfdeI_Po7scXMqwbYobUgUdHIwGMKhrnerG_Kfv6b8K7PWNjfrjPYS9MR4OM1_9fs3I9xvr-Dc9oBNFU4AYn5bgTdxiPxLqwPemkKD-R4PswCEFn6bNqec7rDx_a0139SUjGTpLmHJEBk6GxESxc4cmy7B3uH0hpLnEAgU", + "dp": "GerO_XD1x4s4yIG9o4UGJYo93LC-J3zuuFM6lSTgAXkUCjcFvmYpbMaGEy6L-CZIDOYdoqWVkwKKlSFOyD173IH_KA4kBqM43HFzNj1iCyKmOZ37sY9cBBYjQLE2Hf2MUBe6X40_ioSjRhWilSmJmudXH9z_6Wfd1YyIj9qLSkE", + "dq": "V7R8duG6Sx7Cr6cW7LeJ6Ep6Xix28DVPGWI4GgCWzf_3MCiRaHB6YstoOxV_FBUq8C3y97X6V1gEafWPTtcXQwGJG425Z0y64utM0igeVOs2O8-q-FwsKOfj9gi8iINaMBef1Qs5x9i1uQArxNaV0T0MlxFWOUJdi573KqwIdc0", + "qi": "4WRsDyw9pg2iIva4THIhvg0eda_5wu-gorBCQRh5cxtJ4DwMV4GfTL-PUP6u8HRhR8Ns3XLbOk2pAfft9aPTCI9wr_ke1NUyupR1EzGOEekdfHtpgQP06hU7nhSMFbj9OMQvrw4_3k_5BXHQXsp7wqS7QtawQDWbS5BKc6O4nZA", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "FRI7f7sJKUg", + "kty": "RSA", + "alg": "RS256", + "n": "0d4up4hx3l_HZa6D2PO-YYSqgNbAWjtlIbnFWIZS-PRzVFgDKcR9bLo_9-MGm0sT0tHbyeqc4V8o5oeYF0uhNmlEuU9Do2VYiyc0fkNeW1nFrC-XJYxbnge4Pxbhl-0Jn04O8IJsP15xq16GfRZxYfjKPeFilQNeDwTb_SBqoveZASHUW998eO1bEg0bjUZs4Yy23S4R23ABZKTQMPMGMETGFVbcFNXUohu0eSYMG4eU9iaFNmh0p0G9lU7ER-UFSatczaEFle0Awazb7-EHN6iya3zL6LDt-ezlIszTzHIXa2Dhhga2SlDIyuhFUOkkEeCP3a-sFeXre-JWiYz8ZQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + } + } + }, + "jwkSet": "{\"keys\":[{\"kid\":\"QMa5xaKOYwI\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"ol8T6mc7t55kUI3Xf4pHsx8p25VqZ3jm54TQY6xZ07FYzwU8ex02Mg_W_VABRNyVq8wdUBKubo1W8iaKtvtrr0XDOyHUAlwM6xa14332c9akB1AmTirZY4gvyobIY-b18F8LpeIkkLUcypeZmsDd-bGONEJs0sxM6LtLCY41s_lgesPdQwmHLBw4_Rw9NcjBslupWP_pSXUW9x2fj8tKHOoURqmOWL-54t9YbDdIht06uzqagzjPV3UoYtvRsu2QUJx99ExgNvCA9pA1wyiyysyhUdfeKyZpwvTfwWxkrwZrE6zb1AZICFW5R3Bgg0b9UnS96LpFxbSO7rXBRWVKOw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"66gqKTPVHyA\",\"kty\":\"RSA\",\"alg\":\"RS384\",\"n\":\"rWHV18o2T_9zhO-YknvC9brSjWru496-Dw0iVCiJdEZph94aWXeZW4tYsSjYAfzCJXQUrIqfoPTx100KoYRMiUGpVUh5AgwqAitOpFV_Cxa2j4D01qALwUXWblmJTeCzY7zQFOs1-OBU_U3fhsqcHVPHVlfwO4fYhe-FrhQwTDf55JIW5OGM2bViRxpPyZ3t9nueSuz1jEDCSRlaizJq4jhDrkYWoXtXomRfoseGrZVwTGx5cslfrYs-AmLWMfLkZQWjYZMcwOaJCy3dSkTQkmas4dzGwQqrOqNbgznyCo3oTpHboWS36e0jn_lnbq95zPpZkHNsOzw-Mzq0KRj1jw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"zPdTDVkjms4\",\"kty\":\"RSA\",\"alg\":\"RS512\",\"n\":\"tbVEZHw4LP21DFHmF0QjbSektUEGl8t4blGcZM871ieppUVZ_uHKlfan2ftnQ4GwBISkmjwk6KP1nc9iiONzqAhJbFheQMT4RAmYz7xPJP9cAPOiD8YbqzO2xJqBT1OMc2PDS7ICH0-t_kBXMb0IR61CTG-CmO5Tp8ecauUkshvvYg0dA3-os16Dy5ex4if3ZSpfXowmfjRrvYAKEPeFTmA9Q8lMzN0ZyuEb2nILIeMFwTAjo8Ck8D1h4keOVaY0mfTgC9KxkR1kIcAc7DELYX-vjG63AwB-8IIo735g5NMrFj22923jymMDpQDTEMui-jW1TQYNGR84ShNW_nJZGQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"8zan03XlrmI\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"y3E2ffizby9vClbahFgkg8_NcpA6iYTwkA4TH2i2-usyH87nz3uM5LfRa7KIV4ZHOvY-DZr6H1MAqaFCPrciWZnPPyTRxlUlYhfb4n42g0Bwk7Oh7z-KZvIqR45x85NfniR3uB8xu47VdTWCmWJge2glMavdWC8mr5Pc8um3Fr5eMVactUFsp571SrVKuY_u5qJHN3xmn7mLpiLdCIHFlBkvvLgcAcUmXFhn8cCzHCqkrcrRgfjhd5YJmv6wxxINrTMT4_dS4jxE5u1Ezw-m6xSIWukdW21lWupFHNZEK5VvIkiCBl73Sh0vO-gv4XNJcQmPRpqMdHat8GLG7I2PHQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"5ooqXseJdoQ\",\"kty\":\"RSA\",\"alg\":\"RS384\",\"n\":\"tqhzPmOds6zvDNX3IHCr7SW5kf6GlnlpW-Rm4aQot1HmtKnsXieV99VjT98EspvcFeKyT5jcJFgZMHb1n_kOtRnhygFHNZQ4ooFmFI2VP5lPUuOIGppWiO5ZxIzECdnwAGoZ7A1hu9Vh5oJJP-m_88JX3sdbHPlsEpzdXHf-THZKAqPYHGNWeNPkmQuON5PaEwiJGRWQ0dbMZtsiMoVCPjh7ZQM-1N2UjXmSAcCCxst5BaTUwQQuVmKIT-cfxP9ShPjP7_DmpRBDOp7_frMKTPkznL0HPNWqSRRewGWB6AcrdY7WtWI5hHNDx9GTdLmolFOvnL4cgtr99u9adq6vAw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"tfz-MRyl3GQ\",\"kty\":\"RSA\",\"alg\":\"RS512\",\"n\":\"3vyjzgsA89bJHD7BZ2MNadjFOPUXpuGKlC7OumOspC_iOSMnJ0Kh7oCWmsBTuzGdfY_gYMaXx28NK-LVjGmaEKZxPhdCz7yzofUCMWoVXNhE4hwBdZt1mNl0abaKNzJ_8BhbtTNhourfBvRwebMYFYO0LfEkApE-hM929pFERb0G3-_ybw8A2cqQFvQ67JhYsBcFUwpf68xZvfYTbdsJzfkkoY0UgI01GU55dZskPBK-_jndzo_bNo8wdENU_cUdOllNdZUoWAemWOGoHKdNshGKy6OwZaC9xqaE_VzF-RaYEcf_jaLD7GbPrz9Xcm9sygnFV3IDlj9-0fjKOkAwqw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"FRI7f7sJKUg\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"0d4up4hx3l_HZa6D2PO-YYSqgNbAWjtlIbnFWIZS-PRzVFgDKcR9bLo_9-MGm0sT0tHbyeqc4V8o5oeYF0uhNmlEuU9Do2VYiyc0fkNeW1nFrC-XJYxbnge4Pxbhl-0Jn04O8IJsP15xq16GfRZxYfjKPeFilQNeDwTb_SBqoveZASHUW998eO1bEg0bjUZs4Yy23S4R23ABZKTQMPMGMETGFVbcFNXUohu0eSYMG4eU9iaFNmh0p0G9lU7ER-UFSatczaEFle0Awazb7-EHN6iya3zL6LDt-ezlIszTzHIXa2Dhhga2SlDIyuhFUOkkEeCP3a-sFeXre-JWiYz8ZQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true}]}" + } +} \ No newline at end of file diff --git a/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt b/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt new file mode 100644 index 000000000..3dd4d7a1a --- /dev/null +++ b/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt @@ -0,0 +1 @@ +protected contents for alice diff --git a/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl b/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl new file mode 100644 index 000000000..337ba077a --- /dev/null +++ b/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl @@ -0,0 +1,12 @@ +<#Alice> + a ; + + <./private-for-alice.txt>; + + # Alice web id + ; + + + , + , + . diff --git a/test/resources/accounts-strict-origin-off/bob/.acl-override b/test/resources/accounts-strict-origin-off/bob/.acl-override new file mode 100644 index 000000000..13df41ce6 --- /dev/null +++ b/test/resources/accounts-strict-origin-off/bob/.acl-override @@ -0,0 +1,5 @@ +<#Owner> + a ; + <./>; + ; + , , . diff --git a/test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json b/test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json new file mode 100644 index 000000000..d77cc8409 --- /dev/null +++ b/test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json @@ -0,0 +1,411 @@ +{ + "issuer": "https://localhost:7011", + "authorization_endpoint": "https://localhost:7011/authorize", + "token_endpoint": "https://localhost:7011/token", + "userinfo_endpoint": "https://localhost:7011/userinfo", + "jwks_uri": "https://localhost:7011/jwks", + "registration_endpoint": "https://localhost:7011/register", + "response_types_supported": [ + "code", + "code token", + "code id_token", + "id_token", + "id_token token", + "code id_token token", + "none" + ], + "response_modes_supported": [ + "query", + "fragment" + ], + "grant_types_supported": [ + "authorization_code", + "implicit", + "refresh_token", + "client_credentials" + ], + "subject_types_supported": [ + "public" + ], + "id_token_signing_alg_values_supported": [ + "RS256", + "RS384", + "RS512", + "none" + ], + "token_endpoint_auth_methods_supported": [ + "client_secret_basic" + ], + "token_endpoint_auth_signing_alg_values_supported": [ + "RS256" + ], + "display_values_supported": [], + "claim_types_supported": [ + "normal" + ], + "claims_supported": [], + "claims_parameter_supported": false, + "request_parameter_supported": true, + "request_uri_parameter_supported": false, + "require_request_uri_registration": false, + "check_session_iframe": "https://localhost:7011/session", + "end_session_endpoint": "https://localhost:7011/logout", + "keys": { + "descriptor": { + "id_token": { + "signing": { + "RS256": { + "alg": "RS256", + "modulusLength": 2048 + }, + "RS384": { + "alg": "RS384", + "modulusLength": 2048 + }, + "RS512": { + "alg": "RS512", + "modulusLength": 2048 + } + }, + "encryption": {} + }, + "token": { + "signing": { + "RS256": { + "alg": "RS256", + "modulusLength": 2048 + }, + "RS384": { + "alg": "RS384", + "modulusLength": 2048 + }, + "RS512": { + "alg": "RS512", + "modulusLength": 2048 + } + }, + "encryption": {} + }, + "userinfo": { + "encryption": {} + }, + "register": { + "signing": { + "RS256": { + "alg": "RS256", + "modulusLength": 2048 + } + } + } + }, + "jwks": { + "keys": [ + { + "kid": "QXv-I1cn_YU", + "kty": "RSA", + "alg": "RS256", + "n": "siMc_WZIcylWwv6_0mtLKKkH-jDLIsREie9KRannw_BxVvM96CaFlUHywVu1Nkyw_hqCYFXyr91JnQ7YN_fB7OpcBcx6rjbExlD_piewy2X_vXq5_0YN5a3aPb5P6JSmRF-nS257jdteucmEVJeFHzSqXAU2K5Y_2ZXse9hGTg9MJMnzof4jntb19q02E0qBOGeBqDoMXQU0RJB2uncqUzXp7EJeB4UVwvcS107LTYwPX7BAHwyGorpgWc_DYutZq-4DxycQgvIlO3_hGiFjaWhVOHHkO1DGcWTGOM9DcFels7Abf_XkCPIrgeALlOaqUe6dnK-yFCGwBeJhZupP_Q", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "TxrWAv0g4Yk", + "kty": "RSA", + "alg": "RS384", + "n": "7d5w1iTgbqF5L8wLqFxS72vXfhmOCRHxOzoxFuAJKDtgceguvIZKcA8Krlm4qE10_Fjm3v2BhTBqKaMWeMMqM2KPCeOOm_APcOEqHLltmU301ErcEU7XJFH90HFJVlPDMbuPvX1_0mi904J-TNQ_XX1s4d1OBgJbEn-4RfongbIQK2Fv1LRclZ3n1__dVikrnngSZEWazdidEMFDlI5KNJv6jbGdQAfPzLWzq_9Fl-wbmGu4Up6COLeQDdGybmPCv3a0id9-jVlyZRauUc2RtO3mJdQaOUZNOuDFe2WT0xmhPhoLXKEWhlF1udJGzm0beY7s0pwg4QjhGi7T75d3lQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "-tvrpKoUfPU", + "kty": "RSA", + "alg": "RS512", + "n": "sGoD0dZ3-F4NaAKQQrPhSGAbkBvJ0OsA3PQiwAhWXMrdOj0n9o2QDQfICdayIHcRwsisQaOz7B-L-pYcYFgMcdhj-yWOYVUMHXJCTqJeiz4zdGqjlCxkOF9ebauahRk_IoXp_hDyx3hqB98giajTn1gpW9G36Hcau4PutfM_jeyxi4iVeQSm8-p7qLCm-qD7ot0vzCqvsIt9cDvm9o5DVwG-LoAzeyZlEDmuDpFrLsFLz-D9rxLfSSdAethycrDA0Fhe1j7Az15NYUItJIkvyM5AsC6X0xyjO1LJWoJfbl9cbfaJQ0c3XKRc_NuxPYcDuM15gw0FaTkgUOYezuALPQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "DA4MU9NJoDo", + "kty": "RSA", + "alg": "RS256", + "n": "vaugR-F0yLkwgUyJPrIxjUrncPFoGlFyfPWYfVlU4OleYqNnEofoUNI2afIqRQlZgMgfxhknAi6IEhQKdNQGOAqzKoBxEvVK30x4XxMyVPMYYWbTCEEX2K5Kna0wJQ39rsajBWBRusxge_bLydt0dun4ZX4lv_BaCkdKn4TB6x3sQtwPyYrkOj7nykBiLzpcNGYKYbL5B5HGJHbcjXqX6ttvUn7B7E_idcyJbFfcwzrSj87Zdp5aj5LSiIqHtih8Sm2Mch5VQDT_U55UT4n8Rc9K_fJ1bQirXQdZZ9CgU4zcjXx8PnaEpeq18EcXxXsdfCN8o4EBUN7YWog1-65CLw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "re686ijoKyE", + "kty": "RSA", + "alg": "RS384", + "n": "p3SLWJT-PyQn6n-fvj_s5dNqRJQauAZCC8JFnwUUP6n_LUfCG5tpfRLzZ0yXtsaPfN-z9c8JbXIbsF0HJN3NLTaBOWaZ04yjl3S29_8y-KwOMKlOafuRbYy7sXkicvCnjXRIcV85pAewrpwwHBcI2wDPDbkflwI3m6nurThQAQBDxPWz83QnC_iQ_V3pJGoGYItUGH_sJC06mqATV05dVzHSS0VZSFhEoyEtpykZNnhzgZCOACi4V8P07y0jsxQtqdPYYpqt9qg0Tjp81r-tIIDY7LEWv949rbR3Oad-QBcQC0f4CEapT2nbcVcadODtqPv1pQzSL7sSJ42zATGSxQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "jGE5qoPDlnI", + "kty": "RSA", + "alg": "RS512", + "n": "-WuAFX1DLbsMHagMw_NDJA6yxCcIm2SDgbMmDKOwCN4dR0YWdwKzDJ31EeoakDg-T85HaU48R4Kcx1WQUYnly98vDymMFl4Xe6zS9je-Uh3IVfkYJV3pwVKr2gj1hrX7QglIktLg0o0iWulFe1K1NQ5u7Jbe7ZZhOaetlTFH8KUgS78fajfhcFtrXBliqxHTiBz2lMYCj2ntqX8K8ue3_lVLBXm53AJG3T-ymnUd-nxJ-NsdFMSIzQO1-KUona9OgxDpu1cFoQ-YzOteSz2OP58wDl3gL5urIhzK7Hvu3I3okzlL2TyCHmOhLn6HMHr2-mwEgsYYnsEQwzu6bbY8hw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + }, + { + "kid": "PhN1R2mze2k", + "kty": "RSA", + "alg": "RS256", + "n": "yGhTYJWPKU-n1gnPQPf1_Nr8HBJ6F-IT6PyxLJoURWrd_DvuW0EFQD1JolKAYWakuJAIWGtb8CXjRdzXrEVYNfshb-bBGYGotISxAD2z_KzEtcBya_TwywAQiMYildsAPRZR7HqvxnUw2iFUwec_gw6aBvu3rPcLnj6z2KKDJDFC1P4LHNDArh4EquhkgtzeD5h6-8cCI1iKpb-Op5nCe1DjUNg49L5NZhNtDlhCEb8P2LEbcV8vldIz9gJu0MSf94zzWu2JGsVtVQ29XPO8SQqrKQ5TKClmR1jIIGCF7t4AUoaaL6AA81F3cyEhKB3vN_D8DzEsr7tuwomLFZXmBw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + ] + }, + "id_token": { + "signing": { + "RS256": { + "privateJwk": { + "kid": "jYjEMK74CQI", + "kty": "RSA", + "alg": "RS256", + "n": "siMc_WZIcylWwv6_0mtLKKkH-jDLIsREie9KRannw_BxVvM96CaFlUHywVu1Nkyw_hqCYFXyr91JnQ7YN_fB7OpcBcx6rjbExlD_piewy2X_vXq5_0YN5a3aPb5P6JSmRF-nS257jdteucmEVJeFHzSqXAU2K5Y_2ZXse9hGTg9MJMnzof4jntb19q02E0qBOGeBqDoMXQU0RJB2uncqUzXp7EJeB4UVwvcS107LTYwPX7BAHwyGorpgWc_DYutZq-4DxycQgvIlO3_hGiFjaWhVOHHkO1DGcWTGOM9DcFels7Abf_XkCPIrgeALlOaqUe6dnK-yFCGwBeJhZupP_Q", + "e": "AQAB", + "d": "EDX50WWZekFsz9n3AuMYt96KB06hbcyGoDbSf3xyxvX-mncQTywSQ_74ZHhACWz5PmaTLskjiLWOmWhcbNtzHmhFb5GoKGp7hcChQzGheSETIN8mRgDOCvTDQ5MqGnRMnTRHOSoYvFQWTrnz_O69ApX8WttujpDhxp9KIgsQetHqnBohh2MWuDZ3aauxR9jdeeoZUGzRpqOgQxqXRNP7V0mHC6KrsClfbeq1jipMEW2EShopmWZdn_k7cnrKL2Aoo_Lox3XQhTnAcNiBj-l9kzls629lCoCarPQCZZaaV64NumhRqORUZ7QlG7csQrRHuxzT54ljbERRGiZfNlZ1UQ", + "p": "5C2Emcxi3hQ4wJOr7Vqr4nvaE0MY1TsBpfomG7h-59VDYFb11zcV4HIG1hfUd6LTwaYqMGmtS1_WFt9S-wuKZyJ1F64p76ywBOgXi6IArsV2uxG24HHO-mPoefeQU8eQtbbPkyJXZcCZJuNFlwPEP9y_NsV0ExDgVZr82U6qcpc", + "q": "x9uYjcsbRF6c2d3Ogb6Jcc3pfm0bocelg1tKfV87urYOFJuT-0ZYN-wPgj9l-IH1sobwhraTTCir0tkrBr77pUTQHO30B3eOScPUDl5p9NMIFpg1agl6tPp7z4jM7rPrnsFh0UjuGt5jHQGpDPQCNDpE5_DukuxCUxm04giNqIs", + "dp": "jRO3kH_WAQjvreGfwzj0XSvGQXKSwAOjmUN4nFsN27j313DsvwvH8uWNZIGHVBDQbEKYgyZThu7SJ4IchCs2f13Gl8WPGCjlC6OUKzkWwvhD2JWzREIZfqaW7hIqoiIZTsCgxo_NCZRzHKAYPq6NgA60CuE6Sy98BHG3M4R3zjE", + "dq": "OK6MLrLK8fIPdC7XMa7zVkZ7EXMqYhC4XW_XyYTn8MVPawLQznQd8wZNQ7htWDSrlU12DA7d6byjNrKG5Gvn_PBuQbYu_qsmvL8Adm7KiDgN1DKo-4Div09HLA31aUG38peQAYY4mYA3BfQBmP3fXiakgk-vqhW9ncntpimc248", + "qi": "raxY35RjgNgbTeIbBzD3Jm0Xz9oCW_HMf8sA3ruvx3erRqhVTeWEn3IpVwYGs_mjxO1IPGzBpGHSTTwObTiDU2Bgv8msniQHcMuld-fye50Rq1K4GBnCsv5frYM2Bw5Z3V5cTsda2zG_QczqV84gu6-vezRcLZyoWFMRXkng6hg", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "QXv-I1cn_YU", + "kty": "RSA", + "alg": "RS256", + "n": "siMc_WZIcylWwv6_0mtLKKkH-jDLIsREie9KRannw_BxVvM96CaFlUHywVu1Nkyw_hqCYFXyr91JnQ7YN_fB7OpcBcx6rjbExlD_piewy2X_vXq5_0YN5a3aPb5P6JSmRF-nS257jdteucmEVJeFHzSqXAU2K5Y_2ZXse9hGTg9MJMnzof4jntb19q02E0qBOGeBqDoMXQU0RJB2uncqUzXp7EJeB4UVwvcS107LTYwPX7BAHwyGorpgWc_DYutZq-4DxycQgvIlO3_hGiFjaWhVOHHkO1DGcWTGOM9DcFels7Abf_XkCPIrgeALlOaqUe6dnK-yFCGwBeJhZupP_Q", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + }, + "RS384": { + "privateJwk": { + "kid": "JXnna97ZRPY", + "kty": "RSA", + "alg": "RS384", + "n": "7d5w1iTgbqF5L8wLqFxS72vXfhmOCRHxOzoxFuAJKDtgceguvIZKcA8Krlm4qE10_Fjm3v2BhTBqKaMWeMMqM2KPCeOOm_APcOEqHLltmU301ErcEU7XJFH90HFJVlPDMbuPvX1_0mi904J-TNQ_XX1s4d1OBgJbEn-4RfongbIQK2Fv1LRclZ3n1__dVikrnngSZEWazdidEMFDlI5KNJv6jbGdQAfPzLWzq_9Fl-wbmGu4Up6COLeQDdGybmPCv3a0id9-jVlyZRauUc2RtO3mJdQaOUZNOuDFe2WT0xmhPhoLXKEWhlF1udJGzm0beY7s0pwg4QjhGi7T75d3lQ", + "e": "AQAB", + "d": "l-OKObOifAIv2A17BC6v5qH-IE9BGxmR6DfoUKsOLdp8Yz_XWBqIPbXdJCe2egG7ycca5RkLM3kO0TeKieJVeCpfG_lqfrhzo6ijs2PUUCgvRb_ndkXZqx-P6yHrqmwiIAecaWtRy5GGZSDWdUiyjYghlrgxsjSe4tkbWdO6ll1aNvByRPiN50iy_oIWpW2hR9zt3gJmgrhJKpimZUi4HErZtS9xoUkp-9lP4cAgTs4YqhfGI6ID1dBVsvua7ouFCZqz8ldB0Tqw2qqvwnpDe6REFLe7dSPv6yzOBrTPdyALyCl391T-teiWXLFRDpONYaoJm8ATIJ_ScEncGgqeAQ", + "p": "-oXU6Sz1EwDLGD7D0ct4SC0zIN7fvmpJSEyL_1NlewO0BfZoMr8-gum4yRttBKbqjzWvfecGWNqXSlhuoTiEfBav76vn9Ah9CTUbWXQhz7-kebT72SB2quzib-0NUzFlHB6kyepUOXZiwbhTuAbY5OF0QcudVwVLs_rJMUVugRE", + "q": "8xHJJ2-MRn_Jys6xnS_ujzvWvyUVksDYUwkzcyaXR9gQSx1r7N9FPiye-r6r-6Z7T9jSiwCDzmQeu9O4oBlmLdDb7PdYweo8K_sbIIS8gdxg3fkqX3VPPGtHcRZUM6OE1euAabfo_a_SDDXo9wU2w7POpVCjYJYUqRWhwS3DzkU", + "dp": "dtN1yme9kpbkvgo_PUpCMhHmV2f_PkURn05XdPKshq2Z_N4ETFWzo8qSECmHCxbU2LqBE7m5o_mCmwvY5XV2OZlVN9wU-AXysKRU5ZgU1YIz1FqIvlMMlkQnnykUEeqy56SNSwxviJXjf7kbVIVC6UUarH6UkYr8flCsj0c8g9E", + "dq": "OcX7csUfqU4MT4kLTFotMJw_cZVF6GivwiTIttDwWiIv1Tq8AUQcOCfw7ZZOWHT8kEDv4hwQOAkyCODM3DjNQYyICW3NCeI7xRRdIUCLca5I09m6SZAfcjPpeiadgtyV4SalkfslhM66dS6HHdd-acueDUr6WiWx6XJ7zOesx6U", + "qi": "vvHbpuUf7IvZqsHBXXKL75yA6pEOzm_klHRoafrku40DHbddXD68MSBzsifTMyEbzNNwj2N6YygWoF7OhXbl2rET2PQrDJUBrdvoaUKdg7MqUPHKASlRt_OUV81Tt5dR-UcIvZ8JnsjR_HTC5FZd5uXvxn8VLztUhKYm1UBbVtQ", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "TxrWAv0g4Yk", + "kty": "RSA", + "alg": "RS384", + "n": "7d5w1iTgbqF5L8wLqFxS72vXfhmOCRHxOzoxFuAJKDtgceguvIZKcA8Krlm4qE10_Fjm3v2BhTBqKaMWeMMqM2KPCeOOm_APcOEqHLltmU301ErcEU7XJFH90HFJVlPDMbuPvX1_0mi904J-TNQ_XX1s4d1OBgJbEn-4RfongbIQK2Fv1LRclZ3n1__dVikrnngSZEWazdidEMFDlI5KNJv6jbGdQAfPzLWzq_9Fl-wbmGu4Up6COLeQDdGybmPCv3a0id9-jVlyZRauUc2RtO3mJdQaOUZNOuDFe2WT0xmhPhoLXKEWhlF1udJGzm0beY7s0pwg4QjhGi7T75d3lQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + }, + "RS512": { + "privateJwk": { + "kid": "iArDjqR9QcE", + "kty": "RSA", + "alg": "RS512", + "n": "sGoD0dZ3-F4NaAKQQrPhSGAbkBvJ0OsA3PQiwAhWXMrdOj0n9o2QDQfICdayIHcRwsisQaOz7B-L-pYcYFgMcdhj-yWOYVUMHXJCTqJeiz4zdGqjlCxkOF9ebauahRk_IoXp_hDyx3hqB98giajTn1gpW9G36Hcau4PutfM_jeyxi4iVeQSm8-p7qLCm-qD7ot0vzCqvsIt9cDvm9o5DVwG-LoAzeyZlEDmuDpFrLsFLz-D9rxLfSSdAethycrDA0Fhe1j7Az15NYUItJIkvyM5AsC6X0xyjO1LJWoJfbl9cbfaJQ0c3XKRc_NuxPYcDuM15gw0FaTkgUOYezuALPQ", + "e": "AQAB", + "d": "Tuh8oOVvcBaRpI5Q_KT9BaSHb6QeV2ZmUm6ZBJA2IPdUkPI959hWMJ3kahIwRrk7poagFhQlLF7H--Qc-TMpDdsejX20-_BQpPMwmX-jDmFaHp58YJCim1x9Hkz9pr8uMED58vydu38u3ip9oVV0oveKOFnMCx0LRgizQ4t0SARyvQRUTcI1_MzVufsSLO_fI_eZFN4xyxEXp-oCajhBxyf7AsYfg1LLPsziZNXU8Ept40E6MrCWII7BmZ9wKsmgr9HpPwGFr55X8EEGPtXgwVRLQ1zyQvQ65mD0vuhRiNvSFZInTrSGouRIwDW-jXM4ThuISPhfnQYDA8HZNVrsQQ", + "p": "4pLFRcSFgT3IjTvKS112P7o84e5VY1mJnnMZh-oPTMTrY5-gdTfbhiYR0c7hLJllclsNPLie3kai53yh7jQbs-CTdv6ZxFzmPwv_NADwm5RMSF5EfVhu0USFyI4h85b4FWbBAh7dI4ajI-I8uS3XDqyy_ENZ6wFenMsRKDHZRik", + "q": "x1OGU2g3yID1bFk54RJvAha2cSTWy2T48IiNHva-req_RDraNDdKZOr1QDEnnAaYxP0oT80ETSbfpC5bmU56ZuRA-aZUwiugWqMU-w_A5Oe8NtEH1X05iE3sOPzjV8wtqomgRdRDmwLHmwygV5cWEOBnoiZ0lke8nI28iY_xdvU", + "dp": "YOzwv3vmsPdBSEn_rGX7JCAD05MlrC6tlL8geOhES08ic6fh-MNAgg7fKKYb5fxpTZZt_z_rlqMZJXZHv6NDBpxX-VvJZBtp1CbJsfGE_MlgKMVK_2RJY_SwVq-XDqHS1zTx9HpHl98NA1jRKVbW3Uw79XbKjKI1W1XzrQJGNKE", + "dq": "cVbEDY84EPGLG9XMfHdv2Z8ylDlfTX4XsyXiIJYrLFdL9K8GPiSmT6XuWFba7_QsT-6nSmEILhqJliCqAw1FulXVwF7c2R_XaVJL7soxY7eFJSJMsw8mdKPiSzE40EaQPOVO1gXxfyXgfAB89_E4IdaH9wKozn7x9478grfvlDU", + "qi": "o6vR6kC1LTU_6D81fEAf9tXSc-01yuvWxIHc_mRcbI-h-H7BRXBgZrj5X7j3ttPe8g3aG13FZ6y8GpNSrs4LgqNc2VGhxlV8FAV_gVnbgGkpnQaUVtecaHgz03mHOH5hBWOmqBCOLqS4De1KcrwZ1bmhinVu24FVY04Tq82Dc2k", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "-tvrpKoUfPU", + "kty": "RSA", + "alg": "RS512", + "n": "sGoD0dZ3-F4NaAKQQrPhSGAbkBvJ0OsA3PQiwAhWXMrdOj0n9o2QDQfICdayIHcRwsisQaOz7B-L-pYcYFgMcdhj-yWOYVUMHXJCTqJeiz4zdGqjlCxkOF9ebauahRk_IoXp_hDyx3hqB98giajTn1gpW9G36Hcau4PutfM_jeyxi4iVeQSm8-p7qLCm-qD7ot0vzCqvsIt9cDvm9o5DVwG-LoAzeyZlEDmuDpFrLsFLz-D9rxLfSSdAethycrDA0Fhe1j7Az15NYUItJIkvyM5AsC6X0xyjO1LJWoJfbl9cbfaJQ0c3XKRc_NuxPYcDuM15gw0FaTkgUOYezuALPQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + } + }, + "encryption": {} + }, + "token": { + "signing": { + "RS256": { + "privateJwk": { + "kid": "mBFgdSiTnAQ", + "kty": "RSA", + "alg": "RS256", + "n": "vaugR-F0yLkwgUyJPrIxjUrncPFoGlFyfPWYfVlU4OleYqNnEofoUNI2afIqRQlZgMgfxhknAi6IEhQKdNQGOAqzKoBxEvVK30x4XxMyVPMYYWbTCEEX2K5Kna0wJQ39rsajBWBRusxge_bLydt0dun4ZX4lv_BaCkdKn4TB6x3sQtwPyYrkOj7nykBiLzpcNGYKYbL5B5HGJHbcjXqX6ttvUn7B7E_idcyJbFfcwzrSj87Zdp5aj5LSiIqHtih8Sm2Mch5VQDT_U55UT4n8Rc9K_fJ1bQirXQdZZ9CgU4zcjXx8PnaEpeq18EcXxXsdfCN8o4EBUN7YWog1-65CLw", + "e": "AQAB", + "d": "A-MDetWc7gwVeWDXIyjFqS6SxZa82mU24maqBE-TVLSTkZPlpdSRJy7XnJ4wzY9efSwcspOLYBkSAsTUXgaGRhm6CDHvn0LVkPPhN5mOG32Lz1srEe07jt4re0W0Sd4ah71cU9zgb-KGS6QIEw_jOBidVX8bSO6k-bbySYiP7MB8I5HM0P_bpD8Xin7pOj6QCrU3BksG0Ql_dHz1B0npvpBzK-UAwkFlBoryL59BQeN65A5f0MjSlBhsVFoXVt-2GMy-SbyY8WJI90YCY6F66LfO9RuaEVkOfL9Efux_UwB03LPKQW4gnmjx8MLMfIz_eGYplVo1Gr2R-5qeufySwQ", + "p": "9lyv_3EC0ihvXZ7Rmv2wXrqmlzb1qGKmx4MGk03IkGijGXdVyCIZke9O5gkGHnrxlFsl8VUy08u-FfW8fe7lpiFhp32QnImOEjRAb1gih_fRN16MWOUFDq14jcuVqS1A3Ce_wsai7QlwdAXx6J2HYvqdFqT1JvCji1N1Z-oefGE", + "q": "xRcsLk-icb1q7xXOhWaSIdUBQ5sxwwC8Y9n5PfSaYuoR4YNxSTp0-WzDQ_h9OigfKJBL6Nzd0_scIys4FKZ3EkxXXMM0ksi3oks2sP8Nws0wRWPRxvQSIWSxD28OH3cpJPc-u-d0p7YagBzlb1PkeZ7CcklO9XQeMGbW401byI8", + "dp": "BCZrkJIGyiOEPL-AKGw9nFrok4OJf9ypkpLSeYjF6CjbFoK8HzLz21F8ssNUJw9LIoSmjvowcQDtotEQ684qcDH_wyKKXRi0G_plW3rQmhnCnHwrQRQakbS6YykazE7G2O6SfGV8OSH_kvTGrnR442H1Y3xD5PQIzUAKqkV3XgE", + "dq": "jqMUoHeVswdJCrsXecgf3khP3-PDgcNYlFM-ZK5PxWJtim4cYMjju1gRgXGm_53l3u9_YInoKPBFDtbKgXdwGVgSqdnEhK6q59PTQwlzphXl53I0ce5V6MD8u5S9_du5dT1Ss57w-Cd8ylcfXRCz-6kARMH1WQKujoz-3AYydNU", + "qi": "Dcb0uVC4XaXFMFV4ansHRGnp4y5zZNuK-5cQQftLfzKVgZw3AYELw6ZYgQfLWZ_tim9TtVDc62wNQJ4KEUTb0TvsScuRhQNigQABfGDx_cfkllGx6JnDmn1x7kpLKbglhZVw0IrBBL9OiklwF4r7LnXVKP-toerHCUgbJyiv6s0", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "DA4MU9NJoDo", + "kty": "RSA", + "alg": "RS256", + "n": "vaugR-F0yLkwgUyJPrIxjUrncPFoGlFyfPWYfVlU4OleYqNnEofoUNI2afIqRQlZgMgfxhknAi6IEhQKdNQGOAqzKoBxEvVK30x4XxMyVPMYYWbTCEEX2K5Kna0wJQ39rsajBWBRusxge_bLydt0dun4ZX4lv_BaCkdKn4TB6x3sQtwPyYrkOj7nykBiLzpcNGYKYbL5B5HGJHbcjXqX6ttvUn7B7E_idcyJbFfcwzrSj87Zdp5aj5LSiIqHtih8Sm2Mch5VQDT_U55UT4n8Rc9K_fJ1bQirXQdZZ9CgU4zcjXx8PnaEpeq18EcXxXsdfCN8o4EBUN7YWog1-65CLw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + }, + "RS384": { + "privateJwk": { + "kid": "DCo68-1L_bA", + "kty": "RSA", + "alg": "RS384", + "n": "p3SLWJT-PyQn6n-fvj_s5dNqRJQauAZCC8JFnwUUP6n_LUfCG5tpfRLzZ0yXtsaPfN-z9c8JbXIbsF0HJN3NLTaBOWaZ04yjl3S29_8y-KwOMKlOafuRbYy7sXkicvCnjXRIcV85pAewrpwwHBcI2wDPDbkflwI3m6nurThQAQBDxPWz83QnC_iQ_V3pJGoGYItUGH_sJC06mqATV05dVzHSS0VZSFhEoyEtpykZNnhzgZCOACi4V8P07y0jsxQtqdPYYpqt9qg0Tjp81r-tIIDY7LEWv949rbR3Oad-QBcQC0f4CEapT2nbcVcadODtqPv1pQzSL7sSJ42zATGSxQ", + "e": "AQAB", + "d": "peGcfDa0GaZeaDze6J74tL6WobK5ORzx5iYfw6RLZ7mmD5vrHF_6wqy4M9c63xOZZpFP-yuJ4kJMTYwKHKofqy84Gb2ammbSU6GJ8ud5_b6rG-dLx08uw__KmsctqgDdahIMBUrYlbYMfxw3yEvFOPV3JtgBBB1tKqXOywdisWmQgk54eBwA_3Mmm-Flt_a2PiibDjivVUAWxbBPd8Ug9y2bPbDiAXoMP6pOAT317LUqBqw7dhie9_aQWKAgOo2dGjBUADnCb51-Nr8syTJRpczYc9ahYlYOlk3miv3aEhXjQ9a7QosRxvqAMPtjVK2OgB0cQ2j46rzbSrZoYcogzQ", + "p": "z-mDM_oSHM4dhR4LAGXgKRdCmTIzBnGBCQ5Szg0yRTxlXPCqF8NrIu7mhkVB61JiGAHqgD5Y9IxPJyWj9uW9qrY21kIwuIEcEi-mTdxp4VgAjP6vaG1XOaS_fdshBfqe43seTzqHJF523vGmkF8HfOAUqhbj9bsTlCCQBBquQiM", + "q": "zi-ToMifbZweWX_HXu0XRMgLZ1vHYWPjgWdddAJD5wCHx_K6lRROhvTCHycV6f9Qrd-0jnauMRNnHJWlCuU0AGQo9CI-mKAnj66LpvMtfyA5i7WK89-ll5EEWXV5NFdXJd9c7d9mmQAXFQssC3mfPcq7EvGjnAMg_eGSFlLF4fc", + "dp": "bmxQEa_0JLZXuVaOc0SoPEqtRV4C-Z4Y8S1ZTzR1CY6dKzJqtDpG0YPejVuFOi1ECgoieMAkUKWgeGMmZT_5bwxdrYf0BloUBZinE91HorYxfLDbinPgCq50Qay7KkjEUH8YRu4HzooZSik_1JeUC3-bmgaURfN434g31OYyvM8", + "dq": "BzueBybiiNrQKb2Uxdy1U0FdPQv4K49wfKqemaI2tZTMLpRyPSaQNqXBZYxedW3ya5cMY28AX1JZ7KPHPWGa-GSLFz1YSsxbduvdlEa1kt8ThbYhoLp4uZ9psqWvUcm6keaLAQE0PSvGo4NX0TM8BdPlyh1V6vQlJSLTmBrhPDM", + "qi": "L5c_XlyLw4tTUWdrM730pvhC2eGCdSwCc6XAwnUla6q3klxJV1eNcRZoejHAN_QXLS742gpA9A_PTMBfYuBN3-lNLOe-wB3bUDJtCzwGlTthiHChkuqB0KAdq4oj8X49ZMA7Fqlr2KaTFTBsItC-ScVSbss9W2DZv8-XzyNoMyc", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "re686ijoKyE", + "kty": "RSA", + "alg": "RS384", + "n": "p3SLWJT-PyQn6n-fvj_s5dNqRJQauAZCC8JFnwUUP6n_LUfCG5tpfRLzZ0yXtsaPfN-z9c8JbXIbsF0HJN3NLTaBOWaZ04yjl3S29_8y-KwOMKlOafuRbYy7sXkicvCnjXRIcV85pAewrpwwHBcI2wDPDbkflwI3m6nurThQAQBDxPWz83QnC_iQ_V3pJGoGYItUGH_sJC06mqATV05dVzHSS0VZSFhEoyEtpykZNnhzgZCOACi4V8P07y0jsxQtqdPYYpqt9qg0Tjp81r-tIIDY7LEWv949rbR3Oad-QBcQC0f4CEapT2nbcVcadODtqPv1pQzSL7sSJ42zATGSxQ", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + }, + "RS512": { + "privateJwk": { + "kid": "0XGSMsImQPQ", + "kty": "RSA", + "alg": "RS512", + "n": "-WuAFX1DLbsMHagMw_NDJA6yxCcIm2SDgbMmDKOwCN4dR0YWdwKzDJ31EeoakDg-T85HaU48R4Kcx1WQUYnly98vDymMFl4Xe6zS9je-Uh3IVfkYJV3pwVKr2gj1hrX7QglIktLg0o0iWulFe1K1NQ5u7Jbe7ZZhOaetlTFH8KUgS78fajfhcFtrXBliqxHTiBz2lMYCj2ntqX8K8ue3_lVLBXm53AJG3T-ymnUd-nxJ-NsdFMSIzQO1-KUona9OgxDpu1cFoQ-YzOteSz2OP58wDl3gL5urIhzK7Hvu3I3okzlL2TyCHmOhLn6HMHr2-mwEgsYYnsEQwzu6bbY8hw", + "e": "AQAB", + "d": "fO-4TQtd5z5Wp1RScKUd8KXcLh1PVmdW6FUQriwgNZDtIZKeFicoAR3ucHbPr4Y80EUHyFwEHd3zInZdwDpO_XxiWjn5jgq7wJulYOgzUXbRrx8DVVRhjxEWPDVYp43ouf9kdwdizpUbrGZFA60-T8FXFvPL3z8AnJy9eoog-wz-otG58fosrd2Zdpo3O5PlnN2HzueP7G2vabmiZcwR7WEhSaBcI-HcFCXSdZcnAeVzv2DMOoNLNNQXOQ-DtAF_-7lrZa2LKbJccPMEYybwXJlGpRB0JTMYtiLWeZY0EWkWiG2p-lBFsDisEH29JS6yBsG30WWLR55e2XwCqBp1gQ", + "p": "_xiXor89SL9DcybJIEcg_a9nlmnS0DPRfwlRL7fMDF_YKRCVN9x-DD6LlnDss8x9NnUB69dg17QYgLGHI1DbfpV30eOP95zswUfhoyRRgGyxCVbyfB_xwnLTsyCNE3Koi33KjNSMNmDdGKIGBKGzs7Lnbms93Ylr-m9nPizBffc", + "q": "-k3CSpMNknvsVgDxcyl9-U6P2Gm3COcL2NeRzCNR4sG-ffw9xJ_NGIqps9Oddx3Vu5tlEHYiDG3cy-4yOkzxWhphS8E_u8Q1wmBUBaepDjOthoXUcGaSr7-CY7d_FH_ou54WS6rN7diNJODdWATgOSlbPFNhc-he3M8U_bwI0fE", + "dp": "M9zAF2ph_0RDZkngYhuT7X-Xw9DH92RRl05Bnz3y0iE6RT8F11GQntSodHGI7hUI7-Vh-pzTJ4eJ48A0BU4PEfE5Zwao4mKZD8KZcR2VJFL0uz1eFzY3ZJ0LxUM861NISPPOFkuwJe4ThUqLhq2JZ2NcAerzrPKfbU7w4oce34k", + "dq": "mc9OpSTYIjukbvUFag8FKj3shr_vibjwvr85CIhruTv1ItXt3vWTwpDy114iVSAwRqim4ga1xY19MJOeqdS-OvAa-cI2t9tKbbdj6lWsvN1ktFVoxelCGl1EcqI_pQk0qpXqfXToNk_r682CNqRIZNfVCKz0JZWVNXrLG2CAywE", + "qi": "upS-Z2wbbZ_Mla0QpAlORgIr3QLBTK5W0hkhRahoAqm2aGzq269FGSIBnJNxxVkFXL4koHu7diwVCdBHOn3RtnoFYRV1V0sO52Q0B8KI0M8iHM4mVYbk80TsSYBU4lYJqy7U7OnZj1pfnrV4Ky2AAvhTjp2ZbpJCqEPRGJqQlP8", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "jGE5qoPDlnI", + "kty": "RSA", + "alg": "RS512", + "n": "-WuAFX1DLbsMHagMw_NDJA6yxCcIm2SDgbMmDKOwCN4dR0YWdwKzDJ31EeoakDg-T85HaU48R4Kcx1WQUYnly98vDymMFl4Xe6zS9je-Uh3IVfkYJV3pwVKr2gj1hrX7QglIktLg0o0iWulFe1K1NQ5u7Jbe7ZZhOaetlTFH8KUgS78fajfhcFtrXBliqxHTiBz2lMYCj2ntqX8K8ue3_lVLBXm53AJG3T-ymnUd-nxJ-NsdFMSIzQO1-KUona9OgxDpu1cFoQ-YzOteSz2OP58wDl3gL5urIhzK7Hvu3I3okzlL2TyCHmOhLn6HMHr2-mwEgsYYnsEQwzu6bbY8hw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + } + }, + "encryption": {} + }, + "userinfo": { + "encryption": {} + }, + "register": { + "signing": { + "RS256": { + "privateJwk": { + "kid": "RiiZpS0yli8", + "kty": "RSA", + "alg": "RS256", + "n": "yGhTYJWPKU-n1gnPQPf1_Nr8HBJ6F-IT6PyxLJoURWrd_DvuW0EFQD1JolKAYWakuJAIWGtb8CXjRdzXrEVYNfshb-bBGYGotISxAD2z_KzEtcBya_TwywAQiMYildsAPRZR7HqvxnUw2iFUwec_gw6aBvu3rPcLnj6z2KKDJDFC1P4LHNDArh4EquhkgtzeD5h6-8cCI1iKpb-Op5nCe1DjUNg49L5NZhNtDlhCEb8P2LEbcV8vldIz9gJu0MSf94zzWu2JGsVtVQ29XPO8SQqrKQ5TKClmR1jIIGCF7t4AUoaaL6AA81F3cyEhKB3vN_D8DzEsr7tuwomLFZXmBw", + "e": "AQAB", + "d": "AlSEM6lJgtd0Qh7XFBBOAeSh7cmhNcnhJWJaxQP9nFkDv70KpnD5GKgdxQ9kgr1oyOST1ENbTE2EePl6YHxl7CrBVsW-FQfW6FJqpHATOarglqRoMC0m55VWm-CB4nArbopl5XP_uzT9nmuoyqBfsqxmyhH_LrmonuxntusczzzmFY-0vmdE8JHQcnixa70dLd9GO4Bs6vr1SfO5bb8FFEFNm00iTKZqOnqDLx0abgzcqYA_wDBxznFg3RtwdOrVOzKsIUgAaO9C6s5XzGS3ddmggEkPGTm0kQQ9xHJkYOxMNZPNRloqMqVpy1O4JbleCMzPg_-DQ8MJzAWXy5MgkQ", + "p": "_-nK2E0JvckScJUcFH9eN0pJUymgAWMH2_MjE_qJb_lT4jXHLcIfzafqu1QxH2ZbHH1V-Pu2HBwk2YMpS-MQheSSrSNXo4s8Kf4nswspClVVpZnMh8pWWLiHDbib7wMhj8cUlKYTM91J6sAooicGh_8UJtFoSlyTn0sLRSG1iUU", + "q": "yHm3dqNtMfujFwNF9yz5Tb8cDgcDQBxox-y6QGWwogmWP2QOfX76QaBYg32Ve6WUwttixu6KK127BkvGeCReC_QaFILLwPZzI7ybQStRzKNiQg-9oki5lw7iQz66O8U1rQ8jHwSy6mC-Ka3CP1v2j3sZMwmzoWSGBuEwZHfvGNs", + "dp": "MeJ55vYFaxhR3t5CDgDR9ccmSe64QOzz8D0R3mgc-FXKszK2c8X-exE7YW7E8JD8O6523sT6N7qIuFmn6CIH64Gl0dgs0jVm8eyYAn-vbVM7Eb_MLcAUWtEFings9UdP-H3fFibVYWvGZ9szUIB49nOTkwmI4c3v_MIdHUm34F0", + "dq": "lRjZFpYC7yqMJ-BaV7OOEoFwtwoGI9c9IntwJda7YDerE6gxkqouK0K6schjtVr3YVhShUsBXbFPGCahC9dYTqGUB-8i5HcmOMzb1sMGCiD1QdZ9HcXiqXL7WjG7xhosinH4l-ghvGiI5WyCTCb0H8_YdPnhK8YcW9984yvDmgM", + "qi": "UUZvIyomeQkGmtQH41T3vZV_HZSzcZEmdFYPgmjiZMXkOrB3wM1FkqOnoDF51yD8dCuTLSL-Pcq6523NTKtvRLYkum0aZFGMyfPHnK6nGbdsKxjGtHgUuccOUX9XL-WoEsn0F2UGc39JNFQNcScoaIAtgGJ5A5rjfpfvIK7c-Vo", + "key_ops": [ + "sign" + ], + "ext": true + }, + "publicJwk": { + "kid": "PhN1R2mze2k", + "kty": "RSA", + "alg": "RS256", + "n": "yGhTYJWPKU-n1gnPQPf1_Nr8HBJ6F-IT6PyxLJoURWrd_DvuW0EFQD1JolKAYWakuJAIWGtb8CXjRdzXrEVYNfshb-bBGYGotISxAD2z_KzEtcBya_TwywAQiMYildsAPRZR7HqvxnUw2iFUwec_gw6aBvu3rPcLnj6z2KKDJDFC1P4LHNDArh4EquhkgtzeD5h6-8cCI1iKpb-Op5nCe1DjUNg49L5NZhNtDlhCEb8P2LEbcV8vldIz9gJu0MSf94zzWu2JGsVtVQ29XPO8SQqrKQ5TKClmR1jIIGCF7t4AUoaaL6AA81F3cyEhKB3vN_D8DzEsr7tuwomLFZXmBw", + "e": "AQAB", + "key_ops": [ + "verify" + ], + "ext": true + } + } + } + }, + "jwkSet": "{\"keys\":[{\"kid\":\"QXv-I1cn_YU\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"siMc_WZIcylWwv6_0mtLKKkH-jDLIsREie9KRannw_BxVvM96CaFlUHywVu1Nkyw_hqCYFXyr91JnQ7YN_fB7OpcBcx6rjbExlD_piewy2X_vXq5_0YN5a3aPb5P6JSmRF-nS257jdteucmEVJeFHzSqXAU2K5Y_2ZXse9hGTg9MJMnzof4jntb19q02E0qBOGeBqDoMXQU0RJB2uncqUzXp7EJeB4UVwvcS107LTYwPX7BAHwyGorpgWc_DYutZq-4DxycQgvIlO3_hGiFjaWhVOHHkO1DGcWTGOM9DcFels7Abf_XkCPIrgeALlOaqUe6dnK-yFCGwBeJhZupP_Q\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"TxrWAv0g4Yk\",\"kty\":\"RSA\",\"alg\":\"RS384\",\"n\":\"7d5w1iTgbqF5L8wLqFxS72vXfhmOCRHxOzoxFuAJKDtgceguvIZKcA8Krlm4qE10_Fjm3v2BhTBqKaMWeMMqM2KPCeOOm_APcOEqHLltmU301ErcEU7XJFH90HFJVlPDMbuPvX1_0mi904J-TNQ_XX1s4d1OBgJbEn-4RfongbIQK2Fv1LRclZ3n1__dVikrnngSZEWazdidEMFDlI5KNJv6jbGdQAfPzLWzq_9Fl-wbmGu4Up6COLeQDdGybmPCv3a0id9-jVlyZRauUc2RtO3mJdQaOUZNOuDFe2WT0xmhPhoLXKEWhlF1udJGzm0beY7s0pwg4QjhGi7T75d3lQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"-tvrpKoUfPU\",\"kty\":\"RSA\",\"alg\":\"RS512\",\"n\":\"sGoD0dZ3-F4NaAKQQrPhSGAbkBvJ0OsA3PQiwAhWXMrdOj0n9o2QDQfICdayIHcRwsisQaOz7B-L-pYcYFgMcdhj-yWOYVUMHXJCTqJeiz4zdGqjlCxkOF9ebauahRk_IoXp_hDyx3hqB98giajTn1gpW9G36Hcau4PutfM_jeyxi4iVeQSm8-p7qLCm-qD7ot0vzCqvsIt9cDvm9o5DVwG-LoAzeyZlEDmuDpFrLsFLz-D9rxLfSSdAethycrDA0Fhe1j7Az15NYUItJIkvyM5AsC6X0xyjO1LJWoJfbl9cbfaJQ0c3XKRc_NuxPYcDuM15gw0FaTkgUOYezuALPQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"DA4MU9NJoDo\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"vaugR-F0yLkwgUyJPrIxjUrncPFoGlFyfPWYfVlU4OleYqNnEofoUNI2afIqRQlZgMgfxhknAi6IEhQKdNQGOAqzKoBxEvVK30x4XxMyVPMYYWbTCEEX2K5Kna0wJQ39rsajBWBRusxge_bLydt0dun4ZX4lv_BaCkdKn4TB6x3sQtwPyYrkOj7nykBiLzpcNGYKYbL5B5HGJHbcjXqX6ttvUn7B7E_idcyJbFfcwzrSj87Zdp5aj5LSiIqHtih8Sm2Mch5VQDT_U55UT4n8Rc9K_fJ1bQirXQdZZ9CgU4zcjXx8PnaEpeq18EcXxXsdfCN8o4EBUN7YWog1-65CLw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"re686ijoKyE\",\"kty\":\"RSA\",\"alg\":\"RS384\",\"n\":\"p3SLWJT-PyQn6n-fvj_s5dNqRJQauAZCC8JFnwUUP6n_LUfCG5tpfRLzZ0yXtsaPfN-z9c8JbXIbsF0HJN3NLTaBOWaZ04yjl3S29_8y-KwOMKlOafuRbYy7sXkicvCnjXRIcV85pAewrpwwHBcI2wDPDbkflwI3m6nurThQAQBDxPWz83QnC_iQ_V3pJGoGYItUGH_sJC06mqATV05dVzHSS0VZSFhEoyEtpykZNnhzgZCOACi4V8P07y0jsxQtqdPYYpqt9qg0Tjp81r-tIIDY7LEWv949rbR3Oad-QBcQC0f4CEapT2nbcVcadODtqPv1pQzSL7sSJ42zATGSxQ\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"jGE5qoPDlnI\",\"kty\":\"RSA\",\"alg\":\"RS512\",\"n\":\"-WuAFX1DLbsMHagMw_NDJA6yxCcIm2SDgbMmDKOwCN4dR0YWdwKzDJ31EeoakDg-T85HaU48R4Kcx1WQUYnly98vDymMFl4Xe6zS9je-Uh3IVfkYJV3pwVKr2gj1hrX7QglIktLg0o0iWulFe1K1NQ5u7Jbe7ZZhOaetlTFH8KUgS78fajfhcFtrXBliqxHTiBz2lMYCj2ntqX8K8ue3_lVLBXm53AJG3T-ymnUd-nxJ-NsdFMSIzQO1-KUona9OgxDpu1cFoQ-YzOteSz2OP58wDl3gL5urIhzK7Hvu3I3okzlL2TyCHmOhLn6HMHr2-mwEgsYYnsEQwzu6bbY8hw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true},{\"kid\":\"PhN1R2mze2k\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"n\":\"yGhTYJWPKU-n1gnPQPf1_Nr8HBJ6F-IT6PyxLJoURWrd_DvuW0EFQD1JolKAYWakuJAIWGtb8CXjRdzXrEVYNfshb-bBGYGotISxAD2z_KzEtcBya_TwywAQiMYildsAPRZR7HqvxnUw2iFUwec_gw6aBvu3rPcLnj6z2KKDJDFC1P4LHNDArh4EquhkgtzeD5h6-8cCI1iKpb-Op5nCe1DjUNg49L5NZhNtDlhCEb8P2LEbcV8vldIz9gJu0MSf94zzWu2JGsVtVQ29XPO8SQqrKQ5TKClmR1jIIGCF7t4AUoaaL6AA81F3cyEhKB3vN_D8DzEsr7tuwomLFZXmBw\",\"e\":\"AQAB\",\"key_ops\":[\"verify\"],\"ext\":true}]}" + } +} \ No newline at end of file diff --git a/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt b/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt new file mode 100644 index 000000000..304c0b4f3 --- /dev/null +++ b/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt @@ -0,0 +1 @@ +protected contents diff --git a/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl b/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl new file mode 100644 index 000000000..acdaa2eac --- /dev/null +++ b/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl @@ -0,0 +1,15 @@ +<#Alice> + a ; + + <./shared-with-alice.txt>; + + # Alice web id + ; + + # Bob web id + ; + + + , + , + . From a8b917cf52f001faf102bf75a40b3354ae6be4be Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Sat, 2 Mar 2019 21:44:02 +0100 Subject: [PATCH 47/60] Redo #1122 on top of latest release branch --- lib/acl-checker.js | 23 +++++++++- test/integration/authentication-oidc-test.js | 44 +++++++++++++++++++ ...idc-with-strict-origins-turned-off-test.js | 43 ++++++++++++++++++ .../accounts-scenario/alice/profile/card$.ttl | 4 ++ .../alice/profile/card$.ttl | 4 ++ 5 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 test/resources/accounts-scenario/alice/profile/card$.ttl create mode 100644 test/resources/accounts-strict-origin-off/alice/profile/card$.ttl diff --git a/lib/acl-checker.js b/lib/acl-checker.js index 44c0ae883..d91404036 100644 --- a/lib/acl-checker.js +++ b/lib/acl-checker.js @@ -57,7 +57,8 @@ class ACLChecker { const modes = [ACL(mode)] const agentOrigin = this.agentOrigin const trustedOrigins = this.trustedOrigins - const accessDenied = aclCheck.accessDenied(acl.graph, resource, directory, aclFile, agent, modes, agentOrigin, trustedOrigins) + const originTrustedModes = agent && agentOrigin ? await this.getOriginTrustedModes(agent, agentOrigin) : [] + const accessDenied = aclCheck.accessDenied(acl.graph, resource, directory, aclFile, agent, modes, agentOrigin, trustedOrigins, originTrustedModes) if (accessDenied && user) { this.messagesCached[cacheKey].push(HTTPError(403, accessDenied)) @@ -68,6 +69,26 @@ class ACLChecker { return this.aclCached[cacheKey] } + async getOriginTrustedModes (agent, agentOrigin) { + let agentStore + try { + this.requests[agent.uri] = this.requests[agent.uri] || this.fetch(agent.uri) + agentStore = await this.requests[agent.uri] + } catch (err) { + if (err && (err.code === 'ENOENT' || err.status === 404)) { + // If we're unable to resolve the agent, we conclude that origin has no trusted modes + this.requests[agent.uri] = Promise.resolve(null) + return Promise.resolve([]) + } + debug(err) + throw err + } + if (agentStore) { + return aclCheck.getTrustedModesForOrigin(agentStore, agent, agentOrigin) + } + return Promise.resolve([]) + } + async getError (user, mode) { const cacheKey = `${mode}-${user}` this.aclCached[cacheKey] = this.aclCached[cacheKey] || this.can(user, mode) diff --git a/test/integration/authentication-oidc-test.js b/test/integration/authentication-oidc-test.js index 53827f5f7..56a567dc9 100644 --- a/test/integration/authentication-oidc-test.js +++ b/test/integration/authentication-oidc-test.js @@ -35,6 +35,8 @@ describe('Authentication API (OIDC)', () => { let bobDbPath = path.join(__dirname, '../resources/accounts-scenario/bob/db') + const trustedAppUri = 'https://trusted.app' + const serverConfig = { sslKey: path.join(__dirname, '../keys/key.pem'), sslCert: path.join(__dirname, '../keys/cert.pem'), @@ -437,6 +439,48 @@ describe('Authentication API (OIDC)', () => { expect(response).to.have.property('status', 401) }) }) + + describe('with trusted app and no cookie', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Origin', trustedAppUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + + describe('with trusted app and malicious cookie', () => { + before(done => { + var malcookie = cookie.replace(/connect\.sid=(\S+)/, 'connect.sid=l33th4x0rzp0wn4g3;') + alice.get('/private-for-alice.txt') + .set('Cookie', malcookie) + .set('Origin', trustedAppUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + + describe('with trusted app and correct cookie', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', cookie) + .set('Origin', trustedAppUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 200', () => expect(response).to.have.property('status', 200)) + }) }) }) diff --git a/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js b/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js index f61ca8ab6..7cf97db3a 100644 --- a/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js +++ b/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js @@ -35,6 +35,8 @@ describe('Authentication API (OIDC) - With strict origins turned off', () => { const bobServerUri = `https://localhost:${bobServerPort}` let bobDbPath = path.join(__dirname, '../resources/accounts-strict-origin-off/bob/db') + const trustedAppUri = 'https://trusted.app' + const serverConfig = { sslKey: path.join(__dirname, '../keys/key.pem'), sslCert: path.join(__dirname, '../keys/cert.pem'), @@ -194,6 +196,18 @@ describe('Authentication API (OIDC) - With strict origins turned off', () => { }) }) + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) + describe('and trusted app', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Origin', trustedAppUri) + .end((err, res) => { + response = res + done(err) + }) + }) + it('should return a 401', () => expect(response).to.have.property('status', 401)) }) }) @@ -251,6 +265,21 @@ describe('Authentication API (OIDC) - With strict origins turned off', () => { // Even if origin checking is disabled, then this should return a 401 because cookies should not be trusted cross-origin it('should return a 401', () => expect(response).to.have.property('status', 401)) }) + + describe('and trusted app', () => { + // Trusted apps are not supported when strictOrigin check is turned off + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', cookie) + .set('Origin', trustedAppUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) }) describe('with malicious cookie', () => { @@ -310,6 +339,20 @@ describe('Authentication API (OIDC) - With strict origins turned off', () => { it('should return a 401', () => expect(response).to.have.property('status', 401)) }) + + describe('and trusted app', () => { + before(done => { + alice.get('/private-for-alice.txt') + .set('Cookie', malcookie) + .set('Origin', trustedAppUri) + .end((err, res) => { + response = res + done(err) + }) + }) + + it('should return a 401', () => expect(response).to.have.property('status', 401)) + }) }) }) }) diff --git a/test/resources/accounts-scenario/alice/profile/card$.ttl b/test/resources/accounts-scenario/alice/profile/card$.ttl new file mode 100644 index 000000000..a014d960e --- /dev/null +++ b/test/resources/accounts-scenario/alice/profile/card$.ttl @@ -0,0 +1,4 @@ +@prefix acl: . + +<#me> acl:trustedApp [ acl:origin ; + acl:mode acl:Read, acl:Write, acl:Append, acl:Control]. diff --git a/test/resources/accounts-strict-origin-off/alice/profile/card$.ttl b/test/resources/accounts-strict-origin-off/alice/profile/card$.ttl new file mode 100644 index 000000000..a014d960e --- /dev/null +++ b/test/resources/accounts-strict-origin-off/alice/profile/card$.ttl @@ -0,0 +1,4 @@ +@prefix acl: . + +<#me> acl:trustedApp [ acl:origin ; + acl:mode acl:Read, acl:Write, acl:Append, acl:Control]. From c328a3e7979c3589b68639b69bfdd662d359cafe Mon Sep 17 00:00:00 2001 From: Michiel de Jong Date: Wed, 13 Mar 2019 17:15:21 +0100 Subject: [PATCH 48/60] My changes on top of #1122 --- lib/acl-checker.js | 31 ++++++-------------- test/integration/authentication-oidc-test.js | 8 ++--- 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/lib/acl-checker.js b/lib/acl-checker.js index d91404036..632f2ff28 100644 --- a/lib/acl-checker.js +++ b/lib/acl-checker.js @@ -57,9 +57,16 @@ class ACLChecker { const modes = [ACL(mode)] const agentOrigin = this.agentOrigin const trustedOrigins = this.trustedOrigins - const originTrustedModes = agent && agentOrigin ? await this.getOriginTrustedModes(agent, agentOrigin) : [] + let originTrustedModes = [] + try { + this.fetch(aclFile.doc().value) + originTrustedModes = await aclCheck.getTrustedModesForOrigin(acl.graph, resource, directory, aclFile, agentOrigin, (uriNode) => { + return this.fetch(uriNode.doc().value, acl.graph) + }) + } catch (e) { + console.error(e.message) + } const accessDenied = aclCheck.accessDenied(acl.graph, resource, directory, aclFile, agent, modes, agentOrigin, trustedOrigins, originTrustedModes) - if (accessDenied && user) { this.messagesCached[cacheKey].push(HTTPError(403, accessDenied)) } else if (accessDenied) { @@ -69,26 +76,6 @@ class ACLChecker { return this.aclCached[cacheKey] } - async getOriginTrustedModes (agent, agentOrigin) { - let agentStore - try { - this.requests[agent.uri] = this.requests[agent.uri] || this.fetch(agent.uri) - agentStore = await this.requests[agent.uri] - } catch (err) { - if (err && (err.code === 'ENOENT' || err.status === 404)) { - // If we're unable to resolve the agent, we conclude that origin has no trusted modes - this.requests[agent.uri] = Promise.resolve(null) - return Promise.resolve([]) - } - debug(err) - throw err - } - if (agentStore) { - return aclCheck.getTrustedModesForOrigin(agentStore, agent, agentOrigin) - } - return Promise.resolve([]) - } - async getError (user, mode) { const cacheKey = `${mode}-${user}` this.aclCached[cacheKey] = this.aclCached[cacheKey] || this.can(user, mode) diff --git a/test/integration/authentication-oidc-test.js b/test/integration/authentication-oidc-test.js index 56a567dc9..c6ebc9c0c 100644 --- a/test/integration/authentication-oidc-test.js +++ b/test/integration/authentication-oidc-test.js @@ -3,10 +3,10 @@ const path = require('path') const fs = require('fs-extra') const { UserStore } = require('@solid/oidc-auth-manager') const UserAccount = require('../../lib/models/user-account') -const SolidAuthOIDC = require('@solid/solid-auth-oidc') +// const SolidAuthOIDC = require('@solid/solid-auth-oidc') -const fetch = require('node-fetch') -const localStorage = require('localstorage-memory') +// const fetch = require('node-fetch') +// const localStorage = require('localstorage-memory') const URL = require('whatwg-url').URL global.URL = URL global.URLSearchParams = require('whatwg-url').URLSearchParams @@ -20,7 +20,7 @@ chai.use(require('dirty-chai')) // In this test we always assume that we are Alice describe('Authentication API (OIDC)', () => { - let alice, bob + let alice, bob // eslint-disable-line no-unused-vars let aliceServerUri = 'https://localhost:7000' let aliceWebId = 'https://localhost:7000/profile/card#me' From 4927b97b7b1961b3596c5f743474ea0371d4837f Mon Sep 17 00:00:00 2001 From: Michiel de Jong Date: Fri, 15 Mar 2019 13:21:04 +0100 Subject: [PATCH 49/60] Update CHANGELOG for v5 release --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 541ca77fb..d250c0fc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,12 +21,17 @@ - The browser-reported `Origin` header will now be checked by default, and the ACL system can be used to restrict access to applications for added security. + - Users can add `trustedApp` entries to their profile using a new databrowser pane. + You will see an 'A' icon added while you view a Person's profile URL + with the data browser (might have to hit refresh in your browser and make sure you + are viewing a WebId URL like https://localhost:8443/profile/card#me). - Logging is now verbose by default so the `-v` option has been removed and a `--quiet` option has been added to mute the log. - To be bug compliant with 4.x releases, if a rule for public readable root / does not exist, it will check in /index.html.acl (see issue #1063) - Command line options are now kebab-cased rather than camelCased, config options may be both. +- Resource with no extension now have '$.ttl' appended in the filename (see upgrades notes below). - Many smaller fixes. #### 5.0.0 Upgrade Notes From 6982ec12646742ef9375fa42f46b8962991acfca Mon Sep 17 00:00:00 2001 From: Michiel de Jong Date: Fri, 15 Mar 2019 13:31:58 +0100 Subject: [PATCH 50/60] Use mashlib 0.7.18 and acl-check 0.2.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 80f18a868..5434b3345 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "bugs": "https://github.com/solid/node-solid-server/issues", "dependencies": { "@solid/oidc-auth-manager": "^0.17.1", - "@solid/acl-check": "^0.1.3", + "@solid/acl-check": "^0.2.0", "body-parser": "^1.18.3", "bootstrap": "^3.3.7", "busboy": "^0.2.12", @@ -82,7 +82,7 @@ "ip-range-check": "0.0.2", "is-ip": "^2.0.0", "li": "^1.0.1", - "mashlib": "^0.7.15", + "mashlib": "^0.7.18", "mime-types": "^2.1.11", "negotiator": "^0.6.0", "node-fetch": "^2.1.2", From ef9e8c90ba44e68985d6f638847053712078baa1 Mon Sep 17 00:00:00 2001 From: Michiel de Jong Date: Fri, 15 Mar 2019 13:39:37 +0100 Subject: [PATCH 51/60] fix commented-out requires in test --- test/integration/authentication-oidc-test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/integration/authentication-oidc-test.js b/test/integration/authentication-oidc-test.js index c6ebc9c0c..e2153a946 100644 --- a/test/integration/authentication-oidc-test.js +++ b/test/integration/authentication-oidc-test.js @@ -3,10 +3,10 @@ const path = require('path') const fs = require('fs-extra') const { UserStore } = require('@solid/oidc-auth-manager') const UserAccount = require('../../lib/models/user-account') -// const SolidAuthOIDC = require('@solid/solid-auth-oidc') +const SolidAuthOIDC = require('@solid/solid-auth-oidc') -// const fetch = require('node-fetch') -// const localStorage = require('localstorage-memory') +const fetch = require('node-fetch') +const localStorage = require('localstorage-memory') const URL = require('whatwg-url').URL global.URL = URL global.URLSearchParams = require('whatwg-url').URLSearchParams From 526dea6f093fab48bcbb12d41bf0006a73129840 Mon Sep 17 00:00:00 2001 From: Kjetil Kjernsmo Date: Fri, 15 Mar 2019 14:55:10 +0100 Subject: [PATCH 52/60] Update package-lock.json. --- package-lock.json | 72 +++++++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index 433505a8c..024a0dbc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -230,7 +230,7 @@ "dependencies": { "rdflib": { "version": "0.12.3", - "resolved": "https://registry.npmjs.org/rdflib/-/rdflib-0.12.3.tgz", + "resolved": "http://registry.npmjs.org/rdflib/-/rdflib-0.12.3.tgz", "integrity": "sha1-K0IGamYJwGtAqQSFhJNix8uV6h4=", "requires": { "async": "^0.9.x", @@ -904,42 +904,42 @@ }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" }, "babel-plugin-syntax-class-properties": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" }, "babel-plugin-syntax-exponentiation-operator": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" }, "babel-plugin-syntax-export-extensions": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=" }, "babel-plugin-syntax-flow": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" }, "babel-plugin-syntax-function-bind": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=" }, "babel-plugin-syntax-jsx": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" }, "babel-plugin-syntax-trailing-function-commas": { @@ -1762,7 +1762,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -1786,7 +1786,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { "buffer-xor": "^1.0.3", @@ -2228,7 +2228,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -2379,7 +2379,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { "cipher-base": "^1.0.1", @@ -2391,7 +2391,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { "cipher-base": "^1.0.3", @@ -2695,7 +2695,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } @@ -2717,7 +2717,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { "bn.js": "^4.1.0", @@ -2825,7 +2825,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -3699,7 +3699,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -3827,7 +3827,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -4122,7 +4122,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { "depd": "~1.1.2", @@ -4529,7 +4529,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -4705,7 +4705,7 @@ }, "jsesc": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" }, "json-schema": { @@ -5256,7 +5256,7 @@ "dependencies": { "commander": { "version": "2.15.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, @@ -5323,7 +5323,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -6736,7 +6736,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -6859,7 +6859,7 @@ }, "parse-asn1": { "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "requires": { "asn1.js": "^4.0.0", @@ -7096,7 +7096,7 @@ }, "proxy-agent": { "version": "2.3.1", - "resolved": "http://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", "integrity": "sha512-CNKuhC1jVtm8KJYFTS2ZRO71VCBx3QSA92So/e6NrY6GoJonkx3Irnk4047EsCcswczwqAekRj3s8qLRGahSKg==", "dev": true, "requires": { @@ -7295,7 +7295,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -7704,7 +7704,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { "inherits": "^2.0.1", @@ -8824,7 +8824,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8862,7 +8862,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8903,7 +8903,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -8941,7 +8941,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -9065,7 +9065,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -9282,7 +9282,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -9941,7 +9941,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { From f02094ebdd619039f8f9b04741cebec01a4487b9 Mon Sep 17 00:00:00 2001 From: Kjetil Kjernsmo Date: Fri, 15 Mar 2019 14:55:15 +0100 Subject: [PATCH 53/60] Release version 5.0.0-beta.9 of the npm package. --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 024a0dbc9..353ff8f08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "solid-server", - "version": "5.0.0-beta.8", + "version": "5.0.0-beta.9", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 80f18a868..47ff05898 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "solid-server", "description": "Solid server on top of the file-system", - "version": "5.0.0-beta.8", + "version": "5.0.0-beta.9", "author": { "name": "Tim Berners-Lee", "email": "timbl@w3.org" From dca8d65ba673a16c94a92e35aa5b84044ff8ae85 Mon Sep 17 00:00:00 2001 From: Kjetil Kjernsmo Date: Fri, 15 Mar 2019 14:56:43 +0100 Subject: [PATCH 54/60] Release version 5.0.0-beta.10 of the npm package. --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 353ff8f08..464d68326 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "solid-server", - "version": "5.0.0-beta.9", + "version": "5.0.0-beta.10", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 47ff05898..fb69c838a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "solid-server", "description": "Solid server on top of the file-system", - "version": "5.0.0-beta.9", + "version": "5.0.0-beta.10", "author": { "name": "Tim Berners-Lee", "email": "timbl@w3.org" From c8efa90ecd0785f8a28d8eac322ab90bae3e975f Mon Sep 17 00:00:00 2001 From: Michiel de Jong Date: Fri, 15 Mar 2019 15:17:05 +0100 Subject: [PATCH 55/60] package-lock.json --- package-lock.json | 94 +++++++++++++++++++++++++---------------------- 1 file changed, 50 insertions(+), 44 deletions(-) diff --git a/package-lock.json b/package-lock.json index 433505a8c..4df197663 100644 --- a/package-lock.json +++ b/package-lock.json @@ -220,9 +220,9 @@ "dev": true }, "@solid/acl-check": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@solid/acl-check/-/acl-check-0.1.3.tgz", - "integrity": "sha512-Rvdxn7SOlqo1BtiY6dcFlJAjne0QK1hrsFL1q3HUDg7yleOEXBm1ESyZ0XDM6jwqJHqKf+0l987D15k5MPyIng==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@solid/acl-check/-/acl-check-0.2.0.tgz", + "integrity": "sha512-HjnwnpjvqE16k5yBNG0A7WIX9MveELv3Ge0DOJ8Cpt7e6aJ4sOpzY3A6x+ljOCOdxxT6CpGKhNGEdztZMGm1Qg==", "requires": { "rdflib": "^0.12.1", "solid-namespace": "0.1.0" @@ -1944,9 +1944,9 @@ "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" }, "caniuse-lite": { - "version": "1.0.30000911", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000911.tgz", - "integrity": "sha512-x/E/SNwD80I0bT+fF9Y3Kbwo7Xd1xSafCAmFlpJmaVg3SQoJJOH4Ivb9fi9S0WjfqewQ6Ydt1zEVZpmMVYNeDA==" + "version": "1.0.30000948", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000948.tgz", + "integrity": "sha512-Lw4y7oz1X5MOMZm+2IFaSISqVVQvUuD+ZUSfeYK/SlYiMjkHN/eJ2PDfJehW5NA6JjrxYSSnIWfwjeObQMEjFQ==" }, "capture-stack-trace": { "version": "1.0.1", @@ -1998,16 +1998,16 @@ "dev": true }, "chat-pane": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/chat-pane/-/chat-pane-1.2.6.tgz", - "integrity": "sha512-+zPpE2zVgg4wNhb2+NxmqhEu+OXmlAEPKoHmoKXRr8oUrQOlSFWkr8jtZKuQwukziC4FltvY2u0rYRfro4KDyQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/chat-pane/-/chat-pane-1.2.7.tgz", + "integrity": "sha512-itsMQWUNjajgdEiTNaRMl/7y9FEpCNrPNldfu+Dj+iJPE5Y0OIBOwzx6hoyItiJYsQSfMcsFiGss2Ie5U4YZtQ==", "requires": { "babel-preset-env": "^1.6.1", "babel-preset-metalab": "^1.0.0", "mime-types": "^2.1.13", "pane-registry": ">1.0.0", "rdflib": ">=0.17.0", - "solid-ui": ">=0.11.3" + "solid-ui": ">=0.12.0" } }, "check-error": { @@ -2336,9 +2336,9 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", + "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==" }, "core-util-is": { "version": "1.0.2", @@ -2868,9 +2868,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.84", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz", - "integrity": "sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw==" + "version": "1.3.116", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.116.tgz", + "integrity": "sha512-NKwKAXzur5vFCZYBHpdWjTMO8QptNLNP80nItkSIgUOapPAo9Uia+RvkCaZJtO7fhQaVElSvBPWEc2ku6cKsPA==" }, "elliptic": { "version": "6.4.1", @@ -3564,9 +3564,9 @@ } }, "find-babel-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.1.0.tgz", - "integrity": "sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", + "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", "requires": { "json5": "^0.5.1", "path-exists": "^3.0.0" @@ -4642,14 +4642,14 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "issue-pane": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/issue-pane/-/issue-pane-1.0.3.tgz", - "integrity": "sha512-K/r9weoQexIFiG9vvYygzHF5IPNbKZluBZ1hERDU2sTlLsAnRKGJ9ms0Xb/Yn+MF9tYt82rno3E6OE3+satpPQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/issue-pane/-/issue-pane-1.0.4.tgz", + "integrity": "sha512-wxDXpwmq4DQ2Fb6aRsNpFhaWTtcfnx6n+puOM5fHih1Im8gHy8C+qvufNgqfq1SlipFzskXOc8Cre61tj4xEuA==", "requires": { "babel-preset-env": "^1.6.1", "babel-preset-metalab": "^1.0.0", "mime-types": "^2.1.13", - "pane-registry": ">=1.0.0", + "pane-registry": "^1.0.4", "rdflib": ">=0.17.0", "solid-ui": ">=0.11.3" } @@ -5047,12 +5047,12 @@ } }, "mashlib": { - "version": "0.7.17", - "resolved": "https://registry.npmjs.org/mashlib/-/mashlib-0.7.17.tgz", - "integrity": "sha512-asVogWGHOSaFkEb1YZZL+qOGHv26m8IaYBy83E5HYbXw0DaUA11FXxK3+hC+d1ite3y+d66JLvOZ5CyrXELQwg==", + "version": "0.7.18", + "resolved": "https://registry.npmjs.org/mashlib/-/mashlib-0.7.18.tgz", + "integrity": "sha512-PeZSqIX31WRq4WBmhUylguSHK4pyHmRduhvasumbO2FW5gvsG5QvypRQKkc4BBQtSBgh9ozE8C0ktOYU0fVpog==", "requires": { "rdflib": ">=0.19.1", - "solid-panes": ">=1.1.19" + "solid-panes": ">=1.3.1" }, "dependencies": { "rdflib": { @@ -5085,9 +5085,9 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "meeting-pane": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/meeting-pane/-/meeting-pane-1.0.2.tgz", - "integrity": "sha512-TKroX1nW9RTHKH0pULY38vFV0HL0Bgy600bPT6mori6YINCfyw09LgkbinJX9PYYVw6t6x0ZEwWAP4gc60p/kg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/meeting-pane/-/meeting-pane-1.0.4.tgz", + "integrity": "sha512-mOaWBr1p0tUfzlyDYSeZOV7M6B3kegohhqAy/auTcgi/8papnSxtME5lRyqrvmlJoXO5vsPFPDnvbeevWWfmsg==", "requires": { "babel-preset-env": "^1.6.1", "babel-preset-metalab": "^1.0.0", @@ -8588,36 +8588,37 @@ } }, "solid-panes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/solid-panes/-/solid-panes-1.2.0.tgz", - "integrity": "sha512-JjdYi0KjVYCA5aOqs4UA/aU9ZISkdO4TWpGv7btfDQQGc+cBoXdSRwlufqFGHz3SrzBnqc0JJvmHsCvEQ4FREw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/solid-panes/-/solid-panes-1.3.1.tgz", + "integrity": "sha512-SGw98zxvsp9gNzi1pv7jPWC4+O3e4xySPePFipBA7WN6BlCPweOlg+7Bm6xp7kj0jFSydu3+ckdM78W/xxuKKQ==", "requires": { "@solid/better-simple-slideshow": "^0.1.0", "babel-preset-env": "^1.6.1", "babel-preset-metalab": "^1.0.0", - "chat-pane": "^1.2.6", + "chat-pane": ">=1.2.7", "contacts-pane": "^1.0.3", "folder-pane": "^1.0.4", - "issue-pane": "^1.0.3", - "meeting-pane": "^1.0.2", + "issue-pane": "^1.0.4", + "meeting-pane": "^1.0.4", "mime-types": "^2.1.13", "pane-registry": "^1.0.4", "rdflib": ">=0.17.1", - "solid-ui": ">=0.11.5", + "solid-ui": ">=0.12.0", "source-pane": "^1.0.3" } }, "solid-ui": { - "version": "0.11.12", - "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-0.11.12.tgz", - "integrity": "sha512-Cw2EEbooJnOlCuny3VmPVaPZ6byaQq3EA67B/j2mUhNJvQOtT1bHtqey6veeF9e8LMzBH3ndVeBCdf2awPfD/A==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/solid-ui/-/solid-ui-0.12.0.tgz", + "integrity": "sha512-ImiLiBE0SZP61kZ5dWweDRKQPxHYTFI8Jmxsz4yQIyPVcQB9SGM0Tdchz4zmSDRPvuw8GRFsC3USIHwIuvxj2g==", "requires": { "escape-html": "^1.0.3", + "mime-types": "^2.1.20", "node-uuid": "^1.4.7", - "rdflib": ">=0.19.0", - "regenerate": "^1.3.2", - "solid-auth-client": "^2.2.6", - "solid-auth-tls": "^0.1.2" + "rdflib": "^0.19.1", + "solid-auth-client": "^2.2.13", + "solid-auth-tls": "^0.1.2", + "solid-namespace": "0.2.0" }, "dependencies": { "node-uuid": { @@ -8636,6 +8637,11 @@ "solid-auth-client": "^2.2.3", "xmldom": "^0.1.22" } + }, + "solid-namespace": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/solid-namespace/-/solid-namespace-0.2.0.tgz", + "integrity": "sha512-yQGQlTNDVtcMfzLz7OwL6Z8lJy9rN1ep0MgX28DPcja0DtA5pu1MzTpBVD9kvXl9X6eSEX73I7IYt0cUim0DrA==" } } }, From a5d3ad5594510174779260c80889e8780819c0c8 Mon Sep 17 00:00:00 2001 From: Michiel de Jong Date: Fri, 15 Mar 2019 15:36:29 +0100 Subject: [PATCH 56/60] refer to https://github.com/solid/acl-check/issues/23 --- lib/acl-checker.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/acl-checker.js b/lib/acl-checker.js index 632f2ff28..be3260582 100644 --- a/lib/acl-checker.js +++ b/lib/acl-checker.js @@ -64,7 +64,8 @@ class ACLChecker { return this.fetch(uriNode.doc().value, acl.graph) }) } catch (e) { - console.error(e.message) + // FIXME: https://github.com/solid/acl-check/issues/23 + // console.error(e.message) } const accessDenied = aclCheck.accessDenied(acl.graph, resource, directory, aclFile, agent, modes, agentOrigin, trustedOrigins, originTrustedModes) if (accessDenied && user) { From bafa5f6d4d0d66ae26c741d32362e3321ba401c9 Mon Sep 17 00:00:00 2001 From: Kjetil Kjernsmo Date: Fri, 15 Mar 2019 15:48:53 +0100 Subject: [PATCH 57/60] Release version 5.0.0-beta.11 of the npm package. --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7445fee9d..dfa6bd4b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "solid-server", - "version": "5.0.0-beta.10", + "version": "5.0.0-beta.11", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5004b62e8..678ca416a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "solid-server", "description": "Solid server on top of the file-system", - "version": "5.0.0-beta.10", + "version": "5.0.0-beta.11", "author": { "name": "Tim Berners-Lee", "email": "timbl@w3.org" From 63d2b813133e5e5427d645fcf51ec3036aafce7c Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Mon, 28 Jan 2019 20:07:08 +0100 Subject: [PATCH 58/60] Restricting access to API endpoints to top domain --- lib/api/accounts/user-accounts.js | 16 +++++++----- lib/api/authn/webid-oidc.js | 26 ++++++++++--------- lib/capability-discovery.js | 3 ++- lib/handlers/restrict-to-top-domain.js | 12 +++++++++ lib/utils.js | 6 +++-- .../integration/account-creation-oidc-test.js | 19 +++++++------- 6 files changed, 51 insertions(+), 31 deletions(-) create mode 100644 lib/handlers/restrict-to-top-domain.js diff --git a/lib/api/accounts/user-accounts.js b/lib/api/accounts/user-accounts.js index cc5daafd0..2d58631cd 100644 --- a/lib/api/accounts/user-accounts.js +++ b/lib/api/accounts/user-accounts.js @@ -4,6 +4,8 @@ const express = require('express') const bodyParser = require('body-parser').urlencoded({ extended: false }) const debug = require('../../debug').accounts +const restrictToTopDomain = require('../../handlers/restrict-to-top-domain') + const CreateAccountRequest = require('../../requests/create-account-request') const AddCertificateRequest = require('../../requests/add-cert-request') const DeleteAccountRequest = require('../../requests/delete-account-request') @@ -65,16 +67,16 @@ function middleware (accountManager) { router.get('/', checkAccountExists(accountManager)) - router.post('/api/accounts/new', bodyParser, CreateAccountRequest.post) - router.get(['/register', '/api/accounts/new'], CreateAccountRequest.get) + router.post('/api/accounts/new', restrictToTopDomain, bodyParser, CreateAccountRequest.post) + router.get(['/register', '/api/accounts/new'], restrictToTopDomain, CreateAccountRequest.get) - router.post('/api/accounts/cert', bodyParser, newCertificate(accountManager)) + router.post('/api/accounts/cert', restrictToTopDomain, bodyParser, newCertificate(accountManager)) - router.get('/account/delete', DeleteAccountRequest.get) - router.post('/account/delete', bodyParser, DeleteAccountRequest.post) + router.get('/account/delete', restrictToTopDomain, DeleteAccountRequest.get) + router.post('/account/delete', restrictToTopDomain, bodyParser, DeleteAccountRequest.post) - router.get('/account/delete/confirm', DeleteAccountConfirmRequest.get) - router.post('/account/delete/confirm', bodyParser, DeleteAccountConfirmRequest.post) + router.get('/account/delete/confirm', restrictToTopDomain, DeleteAccountConfirmRequest.get) + router.post('/account/delete/confirm', restrictToTopDomain, bodyParser, DeleteAccountConfirmRequest.post) return router } diff --git a/lib/api/authn/webid-oidc.js b/lib/api/authn/webid-oidc.js index f48f7d3d0..46546fdf4 100644 --- a/lib/api/authn/webid-oidc.js +++ b/lib/api/authn/webid-oidc.js @@ -9,6 +9,8 @@ const bodyParser = require('body-parser').urlencoded({ extended: false }) const OidcManager = require('../../models/oidc-manager') const { LoginRequest } = require('../../requests/login-request') +const restrictToTopDomain = require('../../handlers/restrict-to-top-domain') + const PasswordResetEmailRequest = require('../../requests/password-reset-email-request') const PasswordChangeRequest = require('../../requests/password-change-request') @@ -65,29 +67,29 @@ function middleware (oidc) { const router = express.Router('/') // User-facing Authentication API - router.get(['/login', '/signin'], LoginRequest.get) + router.get(['/login', '/signin'], restrictToTopDomain, LoginRequest.get) - router.post('/login/password', bodyParser, LoginRequest.loginPassword) + router.post('/login/password', restrictToTopDomain, bodyParser, LoginRequest.loginPassword) - router.post('/login/tls', bodyParser, LoginRequest.loginTls) + router.post('/login/tls', restrictToTopDomain, bodyParser, LoginRequest.loginTls) - router.get('/account/password/reset', PasswordResetEmailRequest.get) - router.post('/account/password/reset', bodyParser, PasswordResetEmailRequest.post) + router.get('/account/password/reset', restrictToTopDomain, PasswordResetEmailRequest.get) + router.post('/account/password/reset', restrictToTopDomain, bodyParser, PasswordResetEmailRequest.post) - router.get('/account/password/change', PasswordChangeRequest.get) - router.post('/account/password/change', bodyParser, PasswordChangeRequest.post) + router.get('/account/password/change', restrictToTopDomain, PasswordChangeRequest.get) + router.post('/account/password/change', restrictToTopDomain, bodyParser, PasswordChangeRequest.post) - router.get('/.well-known/solid/logout/', (req, res) => res.redirect('/logout')) + router.get('/.well-known/solid/logout/', restrictToTopDomain, (req, res) => res.redirect('/logout')) - router.get('/goodbye', (req, res) => { res.render('auth/goodbye') }) + router.get('/goodbye', restrictToTopDomain, (req, res) => { res.render('auth/goodbye') }) // The relying party callback is called at the end of the OIDC signin process - router.get('/api/oidc/rp/:issuer_id', AuthCallbackRequest.get) + router.get('/api/oidc/rp/:issuer_id', restrictToTopDomain, AuthCallbackRequest.get) // Static assets related to authentication const authAssets = [ - ['/.well-known/solid/login/', '../static/popup-redirect.html', false], - ['/common/', 'solid-auth-client/dist-popup/popup.html'] + ['/.well-known/solid/login/', '../static/popup-redirect.html', false, true], + ['/common/', 'solid-auth-client/dist-popup/popup.html', true, true] ] authAssets.map(args => routeResolvedFile(router, ...args)) diff --git a/lib/capability-discovery.js b/lib/capability-discovery.js index 567ee2561..6acc386dd 100644 --- a/lib/capability-discovery.js +++ b/lib/capability-discovery.js @@ -3,6 +3,7 @@ * @module capability-discovery */ const express = require('express') +const restrictToTopDomain = require('./handlers/restrict-to-top-domain') const serviceConfigDefaults = { 'api': { @@ -31,7 +32,7 @@ function capabilityDiscovery () { const router = express.Router('/') // Advertise the server capability discover endpoint - router.get('/.well-known/solid', serviceCapabilityDocument(serviceConfigDefaults)) + router.get('/.well-known/solid', restrictToTopDomain, serviceCapabilityDocument(serviceConfigDefaults)) return router } diff --git a/lib/handlers/restrict-to-top-domain.js b/lib/handlers/restrict-to-top-domain.js new file mode 100644 index 000000000..b2b770f61 --- /dev/null +++ b/lib/handlers/restrict-to-top-domain.js @@ -0,0 +1,12 @@ +const HTTPError = require('../http-error') + +module.exports = function (req, res, next) { + const locals = req.app.locals + const ldp = locals.ldp + const serverUri = locals.host.serverUri + const hostname = ldp.resourceMapper.resolveUrl(req.hostname) + if (hostname === serverUri) { + return next() + } + return next(new HTTPError(403, 'Not allowed to access top-level APIs on accounts')) +} diff --git a/lib/utils.js b/lib/utils.js index 21e5f6870..9ac035620 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -21,6 +21,7 @@ const url = require('url') const debug = require('./debug').fs const getSize = require('get-folder-size') var ns = require('solid-namespace')($rdf) +const restrictToTopDomainHandler = require('./handlers/restrict-to-top-domain') /** * Returns a fully qualified URL from an Express.js Request object. @@ -178,10 +179,11 @@ function stripLineEndings (obj) { /** * Adds a route that serves a static file from another Node module */ -function routeResolvedFile (router, path, file, appendFileName = true) { +function routeResolvedFile (router, path, file, appendFileName = true, restrictToTopDomain = false) { const fullPath = appendFileName ? path + file.match(/[^/]+$/) : path const fullFile = require.resolve(file) - router.get(fullPath, (req, res) => res.sendFile(fullFile)) + const restrictHandler = restrictToTopDomain ? restrictToTopDomainHandler : (req, res, next) => next() + router.get(fullPath, restrictHandler, (req, res) => res.sendFile(fullFile)) } /** diff --git a/test/integration/account-creation-oidc-test.js b/test/integration/account-creation-oidc-test.js index cda089586..6d2be533d 100644 --- a/test/integration/account-creation-oidc-test.js +++ b/test/integration/account-creation-oidc-test.js @@ -80,21 +80,21 @@ describe('AccountManager (OIDC account creation tests)', function () { }) it('should not create WebID if no username is given', (done) => { - let subdomain = supertest('https://nicola.' + host) + let subdomain = supertest('https://' + host) subdomain.post('/api/accounts/new') .send('username=&password=12345') .expect(400, done) }) it('should not create WebID if no password is given', (done) => { - let subdomain = supertest('https://nicola.' + host) + let subdomain = supertest('https://' + host) subdomain.post('/api/accounts/new') .send('username=nicola&password=') .expect(400, done) }) it('should not create a WebID if it already exists', function (done) { - var subdomain = supertest('https://nicola.' + host) + var subdomain = supertest('https://' + host) subdomain.post('/api/accounts/new') .send('username=nicola&password=12345&acceptToc=true') .expect(302) @@ -112,14 +112,14 @@ describe('AccountManager (OIDC account creation tests)', function () { }) it('should not create WebID if T&C is not accepted', (done) => { - let subdomain = supertest('https://nicola.' + host) + let subdomain = supertest('https://' + host) subdomain.post('/api/accounts/new') .send('username=nicola&password=12345&acceptToc=') .expect(400, done) }) it('should create the default folders', function (done) { - var subdomain = supertest('https://nicola.' + host) + var subdomain = supertest('https://' + host) subdomain.post('/api/accounts/new') .send('username=nicola&password=12345&acceptToc=true') .expect(302) @@ -150,14 +150,15 @@ describe('AccountManager (OIDC account creation tests)', function () { }).timeout(20000) it('should link WebID to the root account', function (done) { - var subdomain = supertest('https://nicola.' + host) - subdomain.post('/api/accounts/new') + const domain = supertest('https://' + host) + domain.post('/api/accounts/new') .send('username=nicola&password=12345&acceptToc=true') .expect(302) .end(function (err) { if (err) { return done(err) } + const subdomain = supertest('https://nicola.' + host) subdomain.get('/.meta') .expect(200) .end(function (err, data) { @@ -185,7 +186,7 @@ describe('AccountManager (OIDC account creation tests)', function () { describe('after setting up account', () => { beforeEach(done => { - var subdomain = supertest('https://nicola.' + host) + var subdomain = supertest('https://' + host) subdomain.post('/api/accounts/new') .send('username=nicola&password=12345&acceptToc=true') .end(done) @@ -294,7 +295,7 @@ describe('Signup page where Terms & Conditions are not being enforced', () => { }) it('should not enforce T&C upon creating account', function (done) { - var subdomain = supertest('https://nicola.' + host) + var subdomain = supertest('https://' + host) subdomain.post('/api/accounts/new') .send('username=nicola&password=12345') .expect(302, done) From 1bc05b1dfdf81ba1f496bcfe0f026cdbb9d08fa6 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Fri, 15 Feb 2019 14:11:04 +0100 Subject: [PATCH 59/60] Fixed so that capability discovery points to valid APIs Login and logout should be accessible on subdomains Restricting access to API endpoints to top domain --- lib/capability-discovery.js | 47 +++++++++++++------------- lib/handlers/restrict-to-top-domain.js | 3 +- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/lib/capability-discovery.js b/lib/capability-discovery.js index 6acc386dd..f96fe021d 100644 --- a/lib/capability-discovery.js +++ b/lib/capability-discovery.js @@ -3,23 +3,7 @@ * @module capability-discovery */ const express = require('express') -const restrictToTopDomain = require('./handlers/restrict-to-top-domain') - -const serviceConfigDefaults = { - 'api': { - 'accounts': { - // 'changePassword': '/api/account/changePassword', - // 'delete': '/api/accounts/delete', - - // Create new user (see IdentityProvider.post() in identity-provider.js) - 'new': '/api/accounts/new', - 'recover': '/api/accounts/recover', - 'signin': '/login', - 'signout': '/logout', - 'validateToken': '/api/accounts/validateToken' - } - } -} +const { URL } = require('url') module.exports = capabilityDiscovery @@ -32,7 +16,7 @@ function capabilityDiscovery () { const router = express.Router('/') // Advertise the server capability discover endpoint - router.get('/.well-known/solid', restrictToTopDomain, serviceCapabilityDocument(serviceConfigDefaults)) + router.get('/.well-known/solid', serviceCapabilityDocument()) return router } @@ -44,12 +28,27 @@ function capabilityDiscovery () { * @param res * @param next */ -function serviceCapabilityDocument (serviceConfig) { +function serviceCapabilityDocument () { return (req, res) => { - // Add the server root url - serviceConfig.root = req.app.locals.ldp.resourceMapper.resolveUrl(req.hostname, req.path) - // Add the 'apps' urls section - serviceConfig.apps = req.app.locals.appUrls - res.json(serviceConfig) + const ldp = req.app.locals.ldp + res.json({ + // Add the server root url + root: req.app.locals.ldp.resourceMapper.resolveUrl(req.hostname, req.path), + // Add the 'apps' urls section + apps: req.app.locals.appUrls, + api: { + accounts: { + // 'changePassword': '/api/account/changePassword', + // 'delete': '/api/accounts/delete', + + // Create new user (see IdentityProvider.post() in identity-provider.js) + new: new URL('/api/accounts/new', ldp.serverUri), + recover: new URL('/api/accounts/recover', ldp.serverUri), + signin: req.app.locals.ldp.resourceMapper.resolveUrl(req.hostname, '/login'), + signout: req.app.locals.ldp.resourceMapper.resolveUrl(req.hostname, '/logout'), + validateToken: new URL('/api/accounts/validateToken', ldp.serverUri) + } + } + }) } } diff --git a/lib/handlers/restrict-to-top-domain.js b/lib/handlers/restrict-to-top-domain.js index b2b770f61..2b6aecc37 100644 --- a/lib/handlers/restrict-to-top-domain.js +++ b/lib/handlers/restrict-to-top-domain.js @@ -8,5 +8,6 @@ module.exports = function (req, res, next) { if (hostname === serverUri) { return next() } - return next(new HTTPError(403, 'Not allowed to access top-level APIs on accounts')) + const isLoggedIn = !!(req.session && req.session.userId) + return next(new HTTPError(isLoggedIn ? 403 : 401, 'Not allowed to access top-level APIs on accounts')) } From b16b137d4c9de686d3eb43f14b796a845835749a Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Fri, 15 Feb 2019 14:39:07 +0100 Subject: [PATCH 60/60] Laxing a bit on the endpoints you can visit on subdomains Should be able to login and logout and keep tokens updated via endpoints on subdomain --- lib/api/authn/webid-oidc.js | 16 ++++++++-------- lib/utils.js | 6 ++---- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/lib/api/authn/webid-oidc.js b/lib/api/authn/webid-oidc.js index 46546fdf4..798bd6d47 100644 --- a/lib/api/authn/webid-oidc.js +++ b/lib/api/authn/webid-oidc.js @@ -67,11 +67,11 @@ function middleware (oidc) { const router = express.Router('/') // User-facing Authentication API - router.get(['/login', '/signin'], restrictToTopDomain, LoginRequest.get) + router.get(['/login', '/signin'], LoginRequest.get) - router.post('/login/password', restrictToTopDomain, bodyParser, LoginRequest.loginPassword) + router.post('/login/password', bodyParser, LoginRequest.loginPassword) - router.post('/login/tls', restrictToTopDomain, bodyParser, LoginRequest.loginTls) + router.post('/login/tls', bodyParser, LoginRequest.loginTls) router.get('/account/password/reset', restrictToTopDomain, PasswordResetEmailRequest.get) router.post('/account/password/reset', restrictToTopDomain, bodyParser, PasswordResetEmailRequest.post) @@ -79,17 +79,17 @@ function middleware (oidc) { router.get('/account/password/change', restrictToTopDomain, PasswordChangeRequest.get) router.post('/account/password/change', restrictToTopDomain, bodyParser, PasswordChangeRequest.post) - router.get('/.well-known/solid/logout/', restrictToTopDomain, (req, res) => res.redirect('/logout')) + router.get('/.well-known/solid/logout/', (req, res) => res.redirect('/logout')) - router.get('/goodbye', restrictToTopDomain, (req, res) => { res.render('auth/goodbye') }) + router.get('/goodbye', (req, res) => { res.render('auth/goodbye') }) // The relying party callback is called at the end of the OIDC signin process - router.get('/api/oidc/rp/:issuer_id', restrictToTopDomain, AuthCallbackRequest.get) + router.get('/api/oidc/rp/:issuer_id', AuthCallbackRequest.get) // Static assets related to authentication const authAssets = [ - ['/.well-known/solid/login/', '../static/popup-redirect.html', false, true], - ['/common/', 'solid-auth-client/dist-popup/popup.html', true, true] + ['/.well-known/solid/login/', '../static/popup-redirect.html', false], + ['/common/', 'solid-auth-client/dist-popup/popup.html'] ] authAssets.map(args => routeResolvedFile(router, ...args)) diff --git a/lib/utils.js b/lib/utils.js index 9ac035620..21e5f6870 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -21,7 +21,6 @@ const url = require('url') const debug = require('./debug').fs const getSize = require('get-folder-size') var ns = require('solid-namespace')($rdf) -const restrictToTopDomainHandler = require('./handlers/restrict-to-top-domain') /** * Returns a fully qualified URL from an Express.js Request object. @@ -179,11 +178,10 @@ function stripLineEndings (obj) { /** * Adds a route that serves a static file from another Node module */ -function routeResolvedFile (router, path, file, appendFileName = true, restrictToTopDomain = false) { +function routeResolvedFile (router, path, file, appendFileName = true) { const fullPath = appendFileName ? path + file.match(/[^/]+$/) : path const fullFile = require.resolve(file) - const restrictHandler = restrictToTopDomain ? restrictToTopDomainHandler : (req, res, next) => next() - router.get(fullPath, restrictHandler, (req, res) => res.sendFile(fullFile)) + router.get(fullPath, (req, res) => res.sendFile(fullFile)) } /**