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 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 } } + 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/lib/acl-checker.js b/lib/acl-checker.js index 53c41f86d..be3260582 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,23 @@ 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 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) { + const agentOrigin = this.agentOrigin + const trustedOrigins = this.trustedOrigins + 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) { + // 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) { 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/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..798bd6d47 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') @@ -71,11 +73,11 @@ function middleware (oidc) { router.post('/login/tls', 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')) diff --git a/lib/capability-discovery.js b/lib/capability-discovery.js index 567ee2561..f96fe021d 100644 --- a/lib/capability-discovery.js +++ b/lib/capability-discovery.js @@ -3,22 +3,7 @@ * @module capability-discovery */ const express = require('express') - -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 @@ -31,7 +16,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', serviceCapabilityDocument()) return router } @@ -43,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/create-app.js b/lib/create-app.js index da2ec9980..9b4be11e8 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -42,18 +42,24 @@ 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, rootPath: path.resolve(argv.root || process.cwd()), includeHost: argv.multiuser, - defaultContentType: argv.defaultContentType + defaultContentType: argv.defaultContentType, + fileSuffixes: [ + argv.suffixAcl || '.acl', + argv.suffixMeta || '.meta' + ] }) const configPath = config.initConfigDir(argv) argv.templates = config.initTemplateDirs(configPath) + config.printDebugInfo(argv) + const ldp = new LDP(argv) const app = express() @@ -206,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/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) }) } 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/lib/handlers/restrict-to-top-domain.js b/lib/handlers/restrict-to-top-domain.js new file mode 100644 index 000000000..2b6aecc37 --- /dev/null +++ b/lib/handlers/restrict-to-top-domain.js @@ -0,0 +1,13 @@ +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() + } + const isLoggedIn = !!(req.session && req.session.userId) + return next(new HTTPError(isLoggedIn ? 403 : 401, 'Not allowed to access top-level APIs on accounts')) +} diff --git a/lib/ldp.js b/lib/ldp.js index db7c6d38e..6621f0a1e 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') @@ -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 @@ -63,21 +64,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 } @@ -90,20 +76,18 @@ class LDP { }) } - createReadStream (filename, start, end) { - if (start && end) { - return fs.createReadStream(filename, {'start': start, 'end': end}) - } else { - return fs.createReadStream(filename) - } - } - async readResource (url) { + let releaseLock try { const { path } = await this.resourceMapper.mapUrlToFile({ url }) - return await promisify(fs.readFile)(path, {'encoding': 'utf8'}) + 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() + } } } @@ -114,7 +98,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 +110,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 +153,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 +225,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) { @@ -252,16 +236,24 @@ class LDP { } // Directory created, now write the file - return await new Promise((resolve, reject) => { - const file = stream.pipe(fs.createWriteStream(filePath)) - file.on('error', function () { - reject(error(500, 'Error writing data')) - }) - file.on('finish', function () { - debug.handlers('PUT -- Wrote data to: ' + filePath) - 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) { @@ -335,28 +327,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,53 +356,57 @@ 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) } - return new Promise((resolve, reject) => { - stream - .on('error', function (err) { - debug.handlers(`GET -- error reading ${filename}: ${err.message}`) - return reject(error(err, "Can't read file " + err)) - }) - .on('open', function () { - debug.handlers(`GET -- Reading ${filename}`) - 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() + } + } } } 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,28 +436,34 @@ class LDP { } } - async deleteResource (filename) { + async deleteResource (path) { + let releaseLock try { - return promisify(fs.unlink)(filename) + 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() + } } } 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) { 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/lib/resource-mapper.js b/lib/resource-mapper.js index d9811400e..2abeeb1dd 100644 --- a/lib/resource-mapper.js +++ b/lib/resource-mapper.js @@ -14,16 +14,19 @@ class ResourceMapper { rootPath, includeHost = false, defaultContentType = 'application/octet-stream', - indexFilename = 'index', - overrideTypes = { acl: 'text/turtle', meta: 'text/turtle' } + indexFilename = 'index.html', + overrideTypes = { acl: 'text/turtle', meta: 'text/turtle' }, + fileSuffixes = ['.acl', '.meta'] }) { this._rootUrl = this._removeTrailingSlash(rootUrl) this._rootPath = this._removeTrailingSlash(rootPath) 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 if (includeHost) { @@ -39,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('/') @@ -48,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 } @@ -56,23 +61,16 @@ 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 { // 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,17 @@ class ResourceMapper { return { path, contentType: contentType || this._defaultContentType } } + async _getMatchingFile (folder, filename, isIndex) { + const files = await this._readdir(folder) + // 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 + } + } + async getRepresentationUrlForResource (resourceUrl) { let fullPath = this.getFullPath(resourceUrl) let isIndex = fullPath.endsWith('/') 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 } diff --git a/package-lock.json b/package-lock.json index fe37c825a..dfa6bd4b8 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.11", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -14,14 +14,14 @@ } }, "@babel/generator": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.6.tgz", - "integrity": "sha512-brwPBtVvdYdGxtenbQgfCdDPmtkmUBZPjUoK5SXJEBuHaA5BCubh9ly65fzXz7R6o5rA76Rs22ES8Z+HCc0YIQ==", + "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.6", + "@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" }, @@ -90,9 +90,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", @@ -118,9 +118,9 @@ } }, "@babel/parser": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.6.tgz", - "integrity": "sha512-dWP6LJm9nKT6ALaa+bnL247GHHMWir3vSlZ2+IHgHgktZQx0L3Uvq2uAWcuzIe+fujRsYWBW2q622C5UvGK9iQ==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz", + "integrity": "sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==", "dev": true }, "@babel/runtime": { @@ -132,46 +132,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.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", - "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", + "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.6", + "@babel/generator": "^7.3.4", "@babel/helper-function-name": "^7.1.0", "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.1.6", - "@babel/types": "^7.1.6", + "@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": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "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": { @@ -183,13 +183,13 @@ } }, "@babel/types": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.6.tgz", - "integrity": "sha512-DMiUzlY9DSjVsOylJssxLHSgj6tWM9PRFJOGW/RaOglVOK9nzTxoOMfTfRQXGUCUQ/HmlG2efwC+XqUEJ5ay4w==", + "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": { @@ -201,10 +201,28 @@ } } }, + "@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/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" @@ -474,6 +492,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", @@ -495,6 +555,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 +619,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", @@ -610,9 +685,9 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, "ast-types": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.7.tgz", - "integrity": "sha512-2mP3TwtkY/aTv5X3ZsMpNAbOnyoC/aMJwJSoaELPkHId0nSQgFcnU4dRW3isxiz7+zBexk0ym3WNVjMiQBnJSw==", + "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": { @@ -1462,6 +1537,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", @@ -1786,9 +1944,15 @@ "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", + "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", @@ -1834,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": { @@ -1865,6 +2029,12 @@ "parse5": "^3.0.1" } }, + "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", @@ -1901,6 +2071,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", @@ -2160,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", @@ -2192,6 +2368,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", @@ -2367,12 +2552,27 @@ "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", "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", @@ -2647,6 +2847,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", @@ -2662,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", @@ -2755,9 +2961,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 } } @@ -2808,9 +3014,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", @@ -3033,6 +3239,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", @@ -3343,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" @@ -3578,6 +3799,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", @@ -3650,6 +3877,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.7.1", "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", @@ -3666,18 +3902,37 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" }, + "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.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, "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": { @@ -3687,9 +3942,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", @@ -3698,11 +3953,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" } } } @@ -3777,23 +4032,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", @@ -4002,6 +4240,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", @@ -4152,6 +4396,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", @@ -4213,6 +4466,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", @@ -4240,6 +4503,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", @@ -4264,6 +4533,15 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -4283,12 +4561,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", @@ -4352,28 +4642,28 @@ "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" } }, "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", @@ -4381,7 +4671,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" } }, @@ -4506,55 +4796,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" + } } } }, @@ -4588,7 +4869,16 @@ } } }, - "lazy-cache": { + "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", "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", @@ -4619,9 +4909,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" @@ -4704,20 +4994,34 @@ "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.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.4.tgz", - "integrity": "sha512-EPstzZ23znHUVLKj+lcXO1KvZkrlw+ZirdwvOmnAnA/1PB4ggyXJ77LRkCqkff+ShQ+cqoxCxLQOh4cKITO5iA==", + "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", - "yallist": "^3.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": { - "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": { @@ -4743,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": { @@ -4781,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", @@ -5259,6 +5563,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", @@ -5273,177 +5586,109 @@ "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", - "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==", + "async": { + "version": "2.6.2", + "bundled": true, "dev": true, "requires": { - "default-require-extensions": "^2.0.0" + "lodash": "^4.17.11" } }, - "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=", + "bundled": true, "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==", + "bundled": true, "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==", + "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", - "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" - } + "version": "5.0.0", + "bundled": true, + "dev": true }, "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "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", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" } }, "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 + "bundled": true + }, + "commander": { + "version": "2.17.1", + "bundled": true, + "dev": true, + "optional": true }, "commondir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "bundled": true, "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=", + "bundled": true, "dev": true }, "convert-source-map": { @@ -5466,39 +5711,28 @@ } }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "bundled": true, "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "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=", - "dev": true + "bundled": 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=", + "end-of-stream": { + "version": "1.4.1", + "bundled": true, "dev": true, "requires": { - "strip-bom": "^3.0.0" + "once": "^1.4.0" } }, "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==", + "bundled": true, "dev": true, "requires": { "is-arrayish": "^0.2.1" @@ -5506,18 +5740,16 @@ }, "es6-error": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "bundled": true, "dev": true }, "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "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", @@ -5526,12 +5758,13 @@ }, "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=", + "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" } @@ -5540,8 +5773,7 @@ }, "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==", + "bundled": true, "dev": true, "requires": { "commondir": "^1.0.1", @@ -5551,8 +5783,7 @@ }, "find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "bundled": true, "dev": true, "requires": { "locate-path": "^3.0.0" @@ -5560,8 +5791,7 @@ }, "foreground-child": { "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "bundled": true, "dev": true, "requires": { "cross-spawn": "^4", @@ -5570,26 +5800,25 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "bundled": true, "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==", + "bundled": true, "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 + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "pump": "^3.0.0" + } }, "glob": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "bundled": true, "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -5601,56 +5830,65 @@ } }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "version": "4.1.15", + "bundled": true, "dev": true }, "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "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", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", "dev": true, + "optional": true, "requires": { - "amdefine": ">=0.0.4" + "commander": "~2.17.1", + "source-map": "~0.6.1" } } } }, "has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "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", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "bundled": true, "dev": true }, "imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "bundled": true, "dev": true }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "bundled": true, "dev": true, "requires": { "once": "^1.3.0", @@ -5659,89 +5897,74 @@ }, "inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "bundled": true, "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=", + "version": "2.0.0", + "bundled": true, "dev": true }, "is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "bundled": true, "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=", + "bundled": true, "dev": true }, "is-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "bundled": true, "dev": true }, "isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "bundled": true, "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==", + "version": "2.0.3", + "bundled": true, "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==", + "version": "2.0.3", + "bundled": true, "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==", + "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", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz", - "integrity": "sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==", + "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" @@ -5749,56 +5972,43 @@ "dependencies": { "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "bundled": true, "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==", + "version": "2.1.1", + "bundled": true, "dev": true, "requires": { - "handlebars": "^4.0.11" + "handlebars": "^4.1.0" } }, "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==", + "bundled": true, "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=", + "version": "2.0.0", + "bundled": true, "dev": true, "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "^2.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=", + "bundled": true, "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -5809,30 +6019,26 @@ }, "locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "bundled": true, "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=", + "lodash": { + "version": "4.17.11", + "bundled": true, "dev": true }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "lodash.flattendeep": { + "version": "4.4.0", + "bundled": true, "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", + "bundled": true, "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -5841,41 +6047,33 @@ }, "make-dir": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "bundled": true, "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=", + "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", - "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=", + "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": { "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==", + "bundled": true, "dev": true, "requires": { "source-map": "^0.6.1" @@ -5883,22 +6081,19 @@ "dependencies": { "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "bundled": true, "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==", + "bundled": true, "dev": true }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "bundled": true, "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -5906,14 +6101,12 @@ }, "minimist": { "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "bundled": true, "dev": true }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "bundled": true, "dev": true, "requires": { "minimist": "0.0.8" @@ -5921,34 +6114,35 @@ "dependencies": { "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "bundled": true, "dev": true } } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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", - "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==", + "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" } }, "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=", + "bundled": true, "dev": true, "requires": { "path-key": "^2.0.0" @@ -5956,14 +6150,11 @@ }, "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 + "bundled": true }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "bundled": true, "dev": true, "requires": { "wrappy": "1" @@ -5971,8 +6162,7 @@ }, "optimist": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "bundled": true, "dev": true, "requires": { "minimist": "~0.0.1", @@ -5981,31 +6171,37 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "bundled": true, "dev": true }, "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "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", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "bundled": true, "dev": true }, - "p-limit": { + "p-is-promise": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "2.1.0", + "bundled": true, "dev": true, "requires": { "p-try": "^2.0.0" @@ -6013,8 +6209,7 @@ }, "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==", + "bundled": true, "dev": true, "requires": { "p-limit": "^2.0.0" @@ -6022,26 +6217,23 @@ }, "p-try": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "bundled": true, "dev": true }, "package-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", - "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=", + "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" } }, "parse-json": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "bundled": true, "dev": true, "requires": { "error-ex": "^1.3.1", @@ -6050,26 +6242,27 @@ }, "path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "bundled": true, "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=", + "bundled": true, "dev": true }, "path-key": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "bundled": true, + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "bundled": true, "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==", + "bundled": true, "dev": true, "requires": { "pify": "^3.0.0" @@ -6077,14 +6270,12 @@ }, "pify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "bundled": true, "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==", + "bundled": true, "dev": true, "requires": { "find-up": "^3.0.0" @@ -6092,14 +6283,21 @@ }, "pseudomap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "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", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "bundled": true, "dev": true, "requires": { "load-json-file": "^4.0.0", @@ -6109,8 +6307,7 @@ }, "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==", + "bundled": true, "dev": true, "requires": { "find-up": "^3.0.0", @@ -6119,78 +6316,61 @@ }, "release-zalgo": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "bundled": true, "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=", + "bundled": true, "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=", + "bundled": true, "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=", + "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", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "bundled": true, "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "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==", + "bundled": true, "dev": true }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "version": "5.6.0", + "bundled": true, "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=", + "bundled": true, "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=", + "bundled": true, "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -6198,27 +6378,17 @@ }, "shebang-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "bundled": true, "dev": true }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "bundled": true, "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==", + "bundled": true, "dev": true, "requires": { "foreground-child": "^1.5.6", @@ -6230,9 +6400,8 @@ } }, "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==", + "version": "3.1.0", + "bundled": true, "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -6240,15 +6409,13 @@ } }, "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "version": "2.2.0", + "bundled": true, "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==", + "bundled": true, "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -6256,9 +6423,8 @@ } }, "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==", + "version": "3.0.3", + "bundled": true, "dev": true }, "string-width": { @@ -6282,29 +6448,17 @@ }, "strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "bundled": true, "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=", + "bundled": true, "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==", + "version": "5.1.0", + "bundled": true, "dev": true, "requires": { "arrify": "^1.0.1", @@ -6317,11 +6471,7 @@ "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", "yargs": "~3.10.0" }, "dependencies": { @@ -6329,34 +6479,20 @@ "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", - "decamelize": "^1.0.0", - "window-size": "0.1.0" + "decamelize": "^1.0.0" } } } }, - "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==", + "bundled": true, "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==", + "version": "3.0.4", + "bundled": true, "dev": true, "requires": { "spdx-correct": "^3.0.0", @@ -6365,8 +6501,7 @@ }, "which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "bundled": true, "dev": true, "requires": { "isexe": "^2.0.0" @@ -6374,80 +6509,22 @@ }, "which-module": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "bundled": true, "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=", + "bundled": true, "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=", + "bundled": true, "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==", + "version": "2.4.2", + "bundled": true, "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -6456,108 +6533,42 @@ } }, "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=", - "dev": true - }, - "yargs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.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", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - } + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "bundled": true, + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "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 || ^4.0.0", + "yargs-parser": "^11.1.1" } }, "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "version": "11.1.1", + "bundled": true, "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 - } + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -6733,13 +6744,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": { @@ -6757,6 +6768,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", @@ -6803,6 +6820,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", @@ -6858,16 +6887,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", @@ -7010,6 +7029,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", @@ -7045,6 +7070,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", @@ -7190,6 +7225,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", @@ -7342,6 +7403,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", @@ -7447,6 +7527,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", @@ -7538,6 +7623,15 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, + "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", @@ -7576,6 +7670,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", @@ -7683,8 +7783,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", @@ -7845,53 +7944,56 @@ } }, "snyk": { - "version": "1.110.2", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.110.2.tgz", - "integrity": "sha512-SQE4sudrscd48EoRJqy5h5S6c8YBiOw0r0Se3rfg1l6ElJGgCB9je6XEzfe+UmfES06D7ueFYepiQPxTwH4Qww==", + "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.3", - "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.1", - "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": { @@ -7910,9 +8012,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", @@ -7938,6 +8040,12 @@ "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": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", @@ -8017,6 +8125,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", @@ -8057,13 +8171,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": { @@ -8085,13 +8199,14 @@ } }, "snyk-docker-plugin": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.12.3.tgz", - "integrity": "sha512-ZbvaFCPCd0wxhqxjzU/iyf39tKlq2nvI9nPW32uZV3RGdHrkQH55BzCtBCF9d0dapxX+PKgae/4u2BKNw8hd9Q==", + "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": { @@ -8109,13 +8224,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", @@ -8135,9 +8256,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" @@ -8171,42 +8292,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.1", - "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.7.1.tgz", - "integrity": "sha512-0gHELqMhzUxb/t3Tg6d6G9LTDioOXCrEMt9aetOeV8wD/ZRL5VFNjwcdrm8qILLqzDFaFjFIyMc66c0OL4zFAQ==", + "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": { @@ -8227,15 +8341,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": { @@ -8256,9 +8378,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", @@ -8290,9 +8412,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" @@ -8377,9 +8499,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": { @@ -8466,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": { @@ -8514,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==" } } }, @@ -8546,9 +8674,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", @@ -8875,6 +9003,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", @@ -9066,6 +9200,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", @@ -9145,6 +9316,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", @@ -9215,9 +9392,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": { @@ -9377,15 +9554,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", @@ -9484,6 +9652,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" + } + } + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -9518,6 +9741,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", @@ -9591,9 +9823,9 @@ "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" }, "vscode-languageserver-types": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.13.0.tgz", - "integrity": "sha512-BnJIxS+5+8UWiNKCP7W3g9FlE7fErFw0ofP5BXJe7c2tl0VeWh+nNHFbwAS2vmVC4a5kYxHBjRy0UeOtziemVA==", + "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": { @@ -9651,13 +9883,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": { @@ -9666,6 +9931,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", @@ -9696,9 +9970,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", @@ -9764,12 +10038,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", diff --git a/package.json b/package.json index 8e4e7ba4b..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.7", + "version": "5.0.0-beta.11", "author": { "name": "Tim Berners-Lee", "email": "timbl@w3.org" @@ -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", @@ -76,13 +76,13 @@ "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", "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", @@ -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", @@ -117,11 +118,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", 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) 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..e2153a946 100644 --- a/test/integration/authentication-oidc-test.js +++ b/test/integration/authentication-oidc-test.js @@ -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' @@ -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'), @@ -42,7 +44,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') @@ -178,6 +181,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 => { @@ -194,6 +230,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 @@ -295,8 +344,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) }) }) @@ -314,8 +363,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) }) }) @@ -332,8 +381,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) }) }) @@ -355,7 +404,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 => { @@ -369,9 +435,51 @@ 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) + }) + }) + + 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)) }) }) }) @@ -539,7 +647,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' @@ -569,6 +677,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..7cf97db3a --- /dev/null +++ b/test/integration/authentication-oidc-with-strict-origins-turned-off-test.js @@ -0,0 +1,605 @@ +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 trustedAppUri = 'https://trusted.app' + + 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('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)) + }) + }) + + 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('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', () => { + 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)) + }) + + 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)) + }) + }) + }) + }) + + 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/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-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/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]. 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/resource-mapper-test.js b/test/unit/resource-mapper-test.js index 0fc912c5b..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', @@ -286,12 +310,38 @@ 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 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 for text/html when index.html is not available', + { + url: 'http://localhost/space/', + contentType: 'text/html', + createIfNotExists: true + }, + { + path: `${rootPath}space/index.html`, + 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' @@ -309,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 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', () => {