From d8003f5c06accf5cc34102c791ae069287529816 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 24 Oct 2018 08:13:28 +0200 Subject: [PATCH 01/21] Adding options to handle T&C --- bin/lib/options.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/bin/lib/options.js b/bin/lib/options.js index 4efbf07d2..245225cba 100644 --- a/bin/lib/options.js +++ b/bin/lib/options.js @@ -334,6 +334,21 @@ module.exports = [ name: 'server-logo', help: 'A logo that represents you, your brand, or your server (not required)', prompt: true + }, + { + name: 'enforceToc', + help: 'Do you want to enforce Terms & Conditions for your service?', + flag: true, + prompt: true, + default: true, + when: answers => answers.multiuser + }, + { + name: 'tocUri', + help: 'URI to your Terms & Conditions', + prompt: true, + validate: validUri, + when: answers => answers.enforceToc } ] From b02bf0d157fc9c81c1957ec404dd6189dc2cb878 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 24 Oct 2018 09:13:11 +0200 Subject: [PATCH 02/21] Added checkbox to register-form Also added handlebar-helpers --- default-views/account/register-form.hbs | 9 +++++++++ lib/create-app.js | 4 +++- lib/requests/auth-request.js | 4 ++++ lib/requests/create-account-request.js | 21 ++++++++++++++------- package.json | 1 + 5 files changed, 31 insertions(+), 8 deletions(-) diff --git a/default-views/account/register-form.hbs b/default-views/account/register-form.hbs index 12166f888..93e7d98a1 100644 --- a/default-views/account/register-form.hbs +++ b/default-views/account/register-form.hbs @@ -71,6 +71,15 @@ + {{#if (and enforceToc tocUri)}} +
+ +
+ {{/if}} + diff --git a/lib/create-app.js b/lib/create-app.js index 2a0b15da7..c2ef2c7f4 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -3,6 +3,7 @@ module.exports = createApp const express = require('express') const session = require('express-session') const handlebars = require('express-handlebars') +const handlebarsHelpers = require('handlebars-helpers') const uuid = require('uuid') const cors = require('cors') const LDP = require('./ldp') @@ -163,7 +164,8 @@ function initViews (app, configPath) { app.set('views', viewsPath) app.engine('.hbs', handlebars({ extname: '.hbs', - partialsDir: viewsPath + partialsDir: viewsPath, + helpers: handlebarsHelpers() })) app.set('view engine', '.hbs') } diff --git a/lib/requests/auth-request.js b/lib/requests/auth-request.js index cb8a532de..7f60c601b 100644 --- a/lib/requests/auth-request.js +++ b/lib/requests/auth-request.js @@ -25,6 +25,8 @@ class AuthRequest { * @param [options.returnToUrl] {string} * @param [options.authQueryParams] {Object} Key/value hashmap of parsed query * parameters that will be passed through to the /authorize endpoint. + * @param [options.enforceToc] {boolean} Whether or not to enforce the service provider's T&C + * @param [options.tocUri] {string} URI to the service provider's T&C */ constructor (options) { this.response = options.response @@ -34,6 +36,8 @@ class AuthRequest { this.returnToUrl = options.returnToUrl this.authQueryParams = options.authQueryParams || {} this.localAuth = options.localAuth + this.enforceToc = options.enforceToc + this.tocUri = options.tocUri } /** diff --git a/lib/requests/create-account-request.js b/lib/requests/create-account-request.js index 68997822c..5cdf28e4a 100644 --- a/lib/requests/create-account-request.js +++ b/lib/requests/create-account-request.js @@ -26,6 +26,8 @@ class CreateAccountRequest extends AuthRequest { * @param [options.response] {HttpResponse} * @param [options.returnToUrl] {string} If present, redirect the agent to * this url on successful account creation + * @param [options.enforceToc] {boolean} Whether or not to enforce the service provider's T&C + * @param [options.tocUri] {string} URI to the service provider's T&C */ constructor (options) { super(options) @@ -61,6 +63,10 @@ class CreateAccountRequest extends AuthRequest { options.userAccount = accountManager.userAccountFrom(body) } + const config = require('../../config') + options.enforceToc = config.enforceToc + options.tocUri = config.tocUri + switch (authMethod) { case 'oidc': options.password = body.password @@ -96,13 +102,14 @@ class CreateAccountRequest extends AuthRequest { renderForm (error) { let authMethod = this.accountManager.authMethod - let params = Object.assign({}, this.authQueryParams, - { - returnToUrl: this.returnToUrl, - loginUrl: this.loginUrl(), - registerDisabled: authMethod === 'tls', - multiuser: this.accountManager.multiuser - }) + let params = Object.assign({}, this.authQueryParams, { + enforceToc: this.enforceToc, + loginUrl: this.loginUrl(), + multiuser: this.accountManager.multiuser, + registerDisabled: authMethod === 'tls', + returnToUrl: this.returnToUrl, + tocUri: this.tocUri + }) if (error) { params.error = error.message diff --git a/package.json b/package.json index 626ae6f8f..7c8b5f667 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "glob": "^7.1.1", "global-tunnel-ng": "^2.1.0", "handlebars": "^4.0.6", + "handlebars-helpers": "^0.10.0", "http-proxy-middleware": "^0.18.0", "inquirer": "^1.0.2", "ip-range-check": "0.0.2", From f40d80eb946cec795bab99f9d67fe6d6a647d264 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 31 Oct 2018 15:48:04 +0100 Subject: [PATCH 03/21] Conditionally enforcing acceptToc when creating account --- lib/create-app.js | 2 + lib/requests/auth-request.js | 4 +- lib/requests/create-account-request.js | 38 +- package-lock.json | 749 +++++++++++++++++- .../integration/account-creation-oidc-test.js | 93 ++- 5 files changed, 854 insertions(+), 32 deletions(-) diff --git a/lib/create-app.js b/lib/create-app.js index c2ef2c7f4..8d7d8ac6d 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -124,6 +124,8 @@ function initAppLocals (app, argv, ldp) { app.locals.authMethod = argv.auth app.locals.localAuth = argv.localAuth app.locals.tokenService = new TokenService() + app.locals.enforceToc = argv.enforceToc + app.locals.tocUri = argv.tocUri if (argv.email && argv.email.host) { app.locals.emailService = new EmailService(argv.templates.email, argv.email) diff --git a/lib/requests/auth-request.js b/lib/requests/auth-request.js index 7f60c601b..7769fc8f7 100644 --- a/lib/requests/auth-request.js +++ b/lib/requests/auth-request.js @@ -88,6 +88,7 @@ class AuthRequest { let authQueryParams = AuthRequest.extractAuthParams(req) let returnToUrl = AuthRequest.parseParameter(req, 'returnToUrl') + const acceptToc = AuthRequest.parseParameter(req, 'acceptToc') let options = { response: res, @@ -96,7 +97,8 @@ class AuthRequest { accountManager, returnToUrl, authQueryParams, - localAuth + localAuth, + acceptToc } return options diff --git a/lib/requests/create-account-request.js b/lib/requests/create-account-request.js index 5cdf28e4a..12dd97825 100644 --- a/lib/requests/create-account-request.js +++ b/lib/requests/create-account-request.js @@ -28,12 +28,14 @@ class CreateAccountRequest extends AuthRequest { * this url on successful account creation * @param [options.enforceToc] {boolean} Whether or not to enforce the service provider's T&C * @param [options.tocUri] {string} URI to the service provider's T&C + * @param [options.acceptToc] {boolean} Whether or not user has accepted T&C */ constructor (options) { super(options) this.username = options.username this.userAccount = options.userAccount + this.acceptToc = options.acceptToc === 'true' } /** @@ -47,7 +49,7 @@ class CreateAccountRequest extends AuthRequest { * `userAccountFrom()`), or it encounters an unsupported authentication * scheme. * - * @return {CreateAccountRequest|CreateTlsAccountRequest} + * @return {CreateOidcAccountRequest|CreateTlsAccountRequest} */ static fromParams (req, res) { let options = AuthRequest.requestOptions(req, res) @@ -63,9 +65,8 @@ class CreateAccountRequest extends AuthRequest { options.userAccount = accountManager.userAccountFrom(body) } - const config = require('../../config') - options.enforceToc = config.enforceToc - options.tocUri = config.tocUri + options.enforceToc = locals.enforceToc + options.tocUri = locals.tocUri switch (authMethod) { case 'oidc': @@ -79,13 +80,15 @@ class CreateAccountRequest extends AuthRequest { } } - static post (req, res) { + static async post (req, res) { let request = CreateAccountRequest.fromParams(req, res) - return Promise.resolve() - .then(() => request.validate()) - .then(() => request.createAccount()) - .catch(error => request.error(error)) + try { + request.validate() + await request.createAccount() + } catch (error) { + request.error(error) + } } static get (req, res) { @@ -231,6 +234,7 @@ class CreateOidcAccountRequest extends CreateAccountRequest { * * @param [options={}] {Object} See `CreateAccountRequest` constructor docstring * @param [options.password] {string} Password, as entered by the user at signup + * @param [options.acceptToc] {boolean} Whether or not user has accepted T&C */ constructor (options) { super(options) @@ -258,6 +262,13 @@ class CreateOidcAccountRequest extends CreateAccountRequest { error.statusCode = 400 throw error } + + // console.log(this.enforceToc, this.acceptToc) + if (this.enforceToc && !this.acceptToc) { + error = new Error('Accepting Terms & Conditions are required for this service') + error.statusCode = 400 + throw error + } } /** @@ -297,6 +308,7 @@ class CreateTlsAccountRequest extends CreateAccountRequest { * * @param [options={}] {Object} See `CreateAccountRequest` constructor docstring * @param [options.spkac] {string} + * @param [options.acceptToc] {boolean} Whether or not user has accepted T&C */ constructor (options) { super(options) @@ -306,7 +318,7 @@ class CreateTlsAccountRequest extends CreateAccountRequest { } /** - * Validates the Login request (makes sure required parameters are present), + * Validates the Signup request (makes sure required parameters are present), * and throws an error if not. * * @throws {Error} If missing required params @@ -319,6 +331,12 @@ class CreateTlsAccountRequest extends CreateAccountRequest { error.statusCode = 400 throw error } + + if (this.enforceToc && !this.acceptToc) { + error = new Error('Accepting Terms & Conditions are required for this service') + error.statusCode = 400 + throw error + } } /** diff --git a/package-lock.json b/package-lock.json index 5bd3d23cb..95ae989fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -437,21 +437,278 @@ "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", "dev": true }, + "ansi-bgblack": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz", + "integrity": "sha1-poulAHiHcBtqr74/oNrf36juPKI=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgblue": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz", + "integrity": "sha1-Z73ATtybm1J4lp2hlt6j11yMNhM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgcyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz", + "integrity": "sha1-WEiUJWAL3p9VBwaN2Wnr/bUP52g=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bggreen": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz", + "integrity": "sha1-TjGRJIUplD9DIelr8THRwTgWr0k=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgmagenta": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz", + "integrity": "sha1-myhDLAduqpmUGGcqPvvhk5HCx6E=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgred": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgred/-/ansi-bgred-0.1.1.tgz", + "integrity": "sha1-p2+Sg4OCukMpCmwXeEJPmE1vEEE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgwhite": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz", + "integrity": "sha1-ZQRlE3elim7OzQMxmU5IAljhG6g=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgyellow": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz", + "integrity": "sha1-w/4usIzUdmSAKeaHTRWgs49h1E8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-black": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-black/-/ansi-black-0.1.1.tgz", + "integrity": "sha1-9hheiJNgslRaHsUMC/Bj/EMDJFM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-blue": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-blue/-/ansi-blue-0.1.1.tgz", + "integrity": "sha1-FbgEmQ6S/JyoxUds6PaZd3wh7b8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bold": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bold/-/ansi-bold-0.1.1.tgz", + "integrity": "sha1-PmOVCvWswq4uZw5vZ96xFdGl9QU=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-colors": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-0.2.0.tgz", + "integrity": "sha1-csMd4qDZoszQysMMyYI+6y9kNLU=", + "requires": { + "ansi-bgblack": "^0.1.1", + "ansi-bgblue": "^0.1.1", + "ansi-bgcyan": "^0.1.1", + "ansi-bggreen": "^0.1.1", + "ansi-bgmagenta": "^0.1.1", + "ansi-bgred": "^0.1.1", + "ansi-bgwhite": "^0.1.1", + "ansi-bgyellow": "^0.1.1", + "ansi-black": "^0.1.1", + "ansi-blue": "^0.1.1", + "ansi-bold": "^0.1.1", + "ansi-cyan": "^0.1.1", + "ansi-dim": "^0.1.1", + "ansi-gray": "^0.1.1", + "ansi-green": "^0.1.1", + "ansi-grey": "^0.1.1", + "ansi-hidden": "^0.1.1", + "ansi-inverse": "^0.1.1", + "ansi-italic": "^0.1.1", + "ansi-magenta": "^0.1.1", + "ansi-red": "^0.1.1", + "ansi-reset": "^0.1.1", + "ansi-strikethrough": "^0.1.1", + "ansi-underline": "^0.1.1", + "ansi-white": "^0.1.1", + "ansi-yellow": "^0.1.1", + "lazy-cache": "^2.0.1" + }, + "dependencies": { + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-dim": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-dim/-/ansi-dim-0.1.1.tgz", + "integrity": "sha1-QN5MYDqoCG2Oeoa4/5mNXDbu/Ww=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-escapes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-green": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz", + "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-grey": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-grey/-/ansi-grey-0.1.1.tgz", + "integrity": "sha1-WdmLasK6GfilF5jphT+6eDOaM8E=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-hidden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-hidden/-/ansi-hidden-0.1.1.tgz", + "integrity": "sha1-7WpMSY0rt8uyidvyqNHcyFZ/rg8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-inverse": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-inverse/-/ansi-inverse-0.1.1.tgz", + "integrity": "sha1-tq9Fgm/oJr+1KKbHmIV5Q1XM0mk=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-italic": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-italic/-/ansi-italic-0.1.1.tgz", + "integrity": "sha1-EEdDRj9iXBQqA2c5z4XtpoiYbyM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-magenta": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-magenta/-/ansi-magenta-0.1.1.tgz", + "integrity": "sha1-BjtboW+z8j4c/aKwfAqJ3hHkMK4=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, + "ansi-reset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-reset/-/ansi-reset-0.1.1.tgz", + "integrity": "sha1-5+cSksPH3c1NYu9KbHwFmAkRw7c=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-strikethrough": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz", + "integrity": "sha1-2Eh3FAss/wfRyT685pkE9oiF5Wg=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, + "ansi-underline": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-underline/-/ansi-underline-0.1.1.tgz", + "integrity": "sha1-38kg9Ml7WXfqFi34/7mIMIqqcaQ=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-white": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-white/-/ansi-white-0.1.1.tgz", + "integrity": "sha1-nHe3wZPF7pkuYBHTbsTJIbRXiUQ=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, + "ansi-yellow": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-yellow/-/ansi-yellow-0.1.1.tgz", + "integrity": "sha1-y5NW8vRscy8OMZnmEClVp32oPB0=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansicolors": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", @@ -517,6 +774,23 @@ "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" }, + "array-sort": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-0.1.4.tgz", + "integrity": "sha512-BNcM+RXxndPxiZ2rd76k6nyQLRZr2/B/sdi8pQ+Joafr5AH279L40dfokSUTp8O+AaqYjXWhblBWa2st2nc4fQ==", + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -628,6 +902,11 @@ "resolved": "https://registry.npmjs.org/auth-header/-/auth-header-1.0.0.tgz", "integrity": "sha512-CPPazq09YVDUNNVWo4oSPTQmtwIzHusZhQmahCKvIsk0/xH6U3QsMAv3sM+7+Q0B1K2KJ/Q38OND317uXs4NHA==" }, + "autolinker": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", + "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=" + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -2157,6 +2436,43 @@ "elliptic": "^6.0.0" } }, + "create-frame": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/create-frame/-/create-frame-1.0.0.tgz", + "integrity": "sha1-i5XyaR4ySbYIBEPjPQutn49pdao=", + "requires": { + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "isobject": "^3.0.0", + "lazy-cache": "^2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, "create-hash": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -2244,6 +2560,24 @@ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" }, + "date.js": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/date.js/-/date.js-0.3.3.tgz", + "integrity": "sha512-HgigOS3h3k6HnW011nAb43c5xx5rBXk8P2v/WIT9Zv4koIaVXiH2BURguI78VVp+5Qc076T7OR378JViCnZtBw==", + "requires": { + "debug": "~3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2297,6 +2631,21 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, "default-require-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", @@ -2609,6 +2958,11 @@ "iconv-lite": "~0.4.13" } }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2618,6 +2972,11 @@ "is-arrayish": "^0.2.1" } }, + "error-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/error-symbol/-/error-symbol-0.1.0.tgz", + "integrity": "sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y=" + }, "es5-ext": { "version": "0.10.46", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", @@ -3269,6 +3628,21 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, + "falsey": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/falsey/-/falsey-0.3.2.tgz", + "integrity": "sha512-lxEuefF5MBIVDmE6XeqCdM4BWk1+vYmGZtkbKZ/VFcg6uBBw6fXNEbWmxCjDdQlFc9hy450nkiWwM3VAW6G1qg==", + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", @@ -3426,7 +3800,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, "requires": { "for-in": "^1.0.1" } @@ -3537,6 +3910,11 @@ } } }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=" + }, "fs-extra": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", @@ -3601,6 +3979,38 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, + "get-object": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/get-object/-/get-object-0.2.0.tgz", + "integrity": "sha1-2S/31RkMZFMM2gVD2sY6PUf+jAw=", + "requires": { + "is-number": "^2.0.2", + "isobject": "^0.2.0" + }, + "dependencies": { + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-0.2.0.tgz", + "integrity": "sha1-o0MhkvObkQtfAsyYlIeDbscKqF4=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "get-stdin": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", @@ -3769,6 +4179,108 @@ } } }, + "handlebars-helper-create-frame": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/handlebars-helper-create-frame/-/handlebars-helper-create-frame-0.1.0.tgz", + "integrity": "sha1-iqUdEK62QI/MZgXUDXc1YohIegM=", + "requires": { + "create-frame": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "handlebars-helpers": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/handlebars-helpers/-/handlebars-helpers-0.10.0.tgz", + "integrity": "sha512-QiyhQz58u/DbuV41VnfpE0nhy6YCH4vB514ajysV8SoKmP+DxU+pR+fahVyNECHj+jiwEN2VrvxD/34/yHaLUg==", + "requires": { + "arr-flatten": "^1.1.0", + "array-sort": "^0.1.4", + "create-frame": "^1.0.0", + "define-property": "^1.0.0", + "falsey": "^0.3.2", + "for-in": "^1.0.2", + "for-own": "^1.0.0", + "get-object": "^0.2.0", + "get-value": "^2.0.6", + "handlebars": "^4.0.11", + "handlebars-helper-create-frame": "^0.1.0", + "handlebars-utils": "^1.0.6", + "has-value": "^1.0.0", + "helper-date": "^1.0.1", + "helper-markdown": "^1.0.0", + "helper-md": "^0.2.2", + "html-tag": "^2.0.0", + "is-even": "^1.0.0", + "is-glob": "^4.0.0", + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "lazy-cache": "^2.0.2", + "logging-helpers": "^1.0.0", + "micromatch": "^3.1.4", + "relative": "^3.0.2", + "striptags": "^3.1.0", + "to-gfm-code-block": "^0.1.1", + "year": "^0.2.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "handlebars-utils": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/handlebars-utils/-/handlebars-utils-1.0.6.tgz", + "integrity": "sha512-d5mmoQXdeEqSKMtQQZ9WkiUcO1E3tPbWxluCK9hVgIDPzQa9WsKo3Lbe/sGflTe7TomHEeZaOgwIkyIr1kfzkw==", + "requires": { + "kind-of": "^6.0.0", + "typeof-article": "^0.1.1" + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -3879,6 +4391,52 @@ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, + "helper-date": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/helper-date/-/helper-date-1.0.1.tgz", + "integrity": "sha512-wU3VOwwTJvGr/w5rZr3cprPHO+hIhlblTJHD6aFBrKLuNbf4lAmkawd2iK3c6NbJEvY7HAmDpqjOFSI5/+Ey2w==", + "requires": { + "date.js": "^0.3.1", + "handlebars-utils": "^1.0.4", + "moment": "^2.18.1" + } + }, + "helper-markdown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/helper-markdown/-/helper-markdown-1.0.0.tgz", + "integrity": "sha512-AnDqMS4ejkQK0MXze7pA9TM3pu01ZY+XXsES6gEE0RmCGk5/NIfvTn0NmItfyDOjRAzyo9z6X7YHbHX4PzIvOA==", + "requires": { + "handlebars-utils": "^1.0.2", + "highlight.js": "^9.12.0", + "remarkable": "^1.7.1" + } + }, + "helper-md": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/helper-md/-/helper-md-0.2.2.tgz", + "integrity": "sha1-wfWdflW7riM2L9ig6XFgeuxp1B8=", + "requires": { + "ent": "^2.2.0", + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "remarkable": "^1.6.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "highlight.js": { + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.13.1.tgz", + "integrity": "sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A==" + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -3905,6 +4463,15 @@ "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, + "html-tag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tag/-/html-tag-2.0.0.tgz", + "integrity": "sha512-XxzooSo6oBoxBEUazgjdXj7VwTn/iSTSZzTYKzYY6I916tkaYzypHxy+pbVU1h+0UQ9JlVf5XkNQyxOAiiQO1g==", + "requires": { + "is-self-closing": "^1.0.1", + "kind-of": "^6.0.0" + } + }, "htmlescape": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", @@ -4045,6 +4612,11 @@ "wrappy": "1" } }, + "info-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/info-symbol/-/info-symbol-0.1.0.tgz", + "integrity": "sha1-J4QdcoZ920JCzWEtecEGM4gcang=" + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -4223,6 +4795,14 @@ } } }, + "is-even": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-even/-/is-even-1.0.0.tgz", + "integrity": "sha1-drUFX7rY0pSoa2qUkBXhyXtxfAY=", + "requires": { + "is-odd": "^0.1.2" + } + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -4300,6 +4880,14 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, + "is-odd": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-0.1.2.tgz", + "integrity": "sha1-vFc7XONx7yqtbm9JeZtyvvE5eKc=", + "requires": { + "is-number": "^3.0.0" + } + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -4349,6 +4937,14 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, + "is-self-closing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-self-closing/-/is-self-closing-1.0.1.tgz", + "integrity": "sha512-E+60FomW7Blv5GXTlYee2KDrnG6srxF7Xt1SjrhWUGUEsTFIqY/nq2y3DaftCsgUMdh89V07IVfhY9KIJhLezg==", + "requires": { + "self-closing-tags": "^1.0.1" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -4843,6 +5439,38 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, + "log-ok": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz", + "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=", + "requires": { + "ansi-green": "^0.1.1", + "success-symbol": "^0.1.0" + } + }, + "log-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.2.1.tgz", + "integrity": "sha1-pMIXoN2aUFFdm5ICBgkas9TgMc8=", + "requires": { + "ansi-colors": "^0.2.0", + "error-symbol": "^0.1.0", + "info-symbol": "^0.1.0", + "log-ok": "^0.1.1", + "success-symbol": "^0.1.0", + "time-stamp": "^1.0.1", + "warning-symbol": "^0.1.0" + } + }, + "logging-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/logging-helpers/-/logging-helpers-1.0.0.tgz", + "integrity": "sha512-qyIh2goLt1sOgQQrrIWuwkRjUx4NUcEqEGAcYqD8VOnOC6ItwkrVE8/tA4smGpjzyp4Svhc6RodDp9IO5ghpyA==", + "requires": { + "isobject": "^3.0.0", + "log-utils": "^0.2.1" + } + }, "lolex": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", @@ -5202,6 +5830,11 @@ } } }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -6556,6 +7189,29 @@ } } }, + "relative": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/relative/-/relative-3.0.2.tgz", + "integrity": "sha1-Dc2OxUpdNaPBXhBFA9ZTdbWlNn8=", + "requires": { + "isobject": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -6565,6 +7221,26 @@ "es6-error": "^4.0.1" } }, + "remarkable": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.1.tgz", + "integrity": "sha1-qspJchALZqZCpjoQIcpLrBvjv/Y=", + "requires": { + "argparse": "~0.1.15", + "autolinker": "~0.15.0" + }, + "dependencies": { + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", + "requires": { + "underscore": "~1.7.0", + "underscore.string": "~2.4.0" + } + } + } + }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -6748,6 +7424,11 @@ "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=", "dev": true }, + "self-closing-tags": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/self-closing-tags/-/self-closing-tags-1.0.1.tgz", + "integrity": "sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA==" + }, "semver": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", @@ -6797,6 +7478,14 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "requires": { + "to-object-path": "^0.3.0" + } + }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", @@ -8153,6 +8842,11 @@ "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", "dev": true }, + "striptags": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.1.1.tgz", + "integrity": "sha1-yMPn/db7S7OjKjt1LltePjgJPr0=" + }, "subarg": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", @@ -8168,6 +8862,11 @@ } } }, + "success-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz", + "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc=" + }, "superagent": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", @@ -8424,6 +9123,11 @@ "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", "dev": true }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, "timers-browserify": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", @@ -8450,6 +9154,11 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, + "to-gfm-code-block": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-gfm-code-block/-/to-gfm-code-block-0.1.1.tgz", + "integrity": "sha1-JdBFpfrlUxielje1kJANpzLYqoI=" + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -8583,6 +9292,24 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typeof-article": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/typeof-article/-/typeof-article-0.1.1.tgz", + "integrity": "sha1-nwfnM8P7tkb/qeYcCN66zUYOBq8=", + "requires": { + "kind-of": "^3.1.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "uglify-js": { "version": "3.4.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", @@ -8650,6 +9377,16 @@ "debug": "^2.2.0" } }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + }, + "underscore.string": { + "version": "2.4.0", + "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=" + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -8846,6 +9583,11 @@ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" }, + "warning-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/warning-symbol/-/warning-symbol-0.1.0.tgz", + "integrity": "sha1-uzHdEbeg+dZ6su2V9Fe2WCW7rSE=" + }, "webid": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/webid/-/webid-0.3.11.tgz", @@ -9057,6 +9799,11 @@ "dev": true } } + }, + "year": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/year/-/year-0.2.1.tgz", + "integrity": "sha1-QIOuUgoxiyPshgN/MADLiSvfm7A=" } } } diff --git a/test/integration/account-creation-oidc-test.js b/test/integration/account-creation-oidc-test.js index ed0d08846..fa757d2c2 100644 --- a/test/integration/account-creation-oidc-test.js +++ b/test/integration/account-creation-oidc-test.js @@ -8,15 +8,17 @@ const path = require('path') const fs = require('fs-extra') describe('AccountManager (OIDC account creation tests)', function () { - var serverUri = 'https://localhost:3457' - var host = 'localhost:3457' - var ldpHttpsServer - let rootPath = path.join(__dirname, '../resources/accounts/') - let configPath = path.join(__dirname, '../resources/config') - let dbPath = path.join(__dirname, '../resources/accounts/db') + const port = 3457 + const serverUri = `https://localhost:${port}` + const host = `localhost:${port}` + const root = path.join(__dirname, '../resources/accounts/') + const configPath = path.join(__dirname, '../resources/config') + const dbPath = path.join(__dirname, '../resources/accounts/db') + + let ldpHttpsServer var ldp = ldnode.createServer({ - root: rootPath, + root, configPath, sslKey: path.join(__dirname, '../keys/key.pem'), sslCert: path.join(__dirname, '../keys/cert.pem'), @@ -25,19 +27,20 @@ describe('AccountManager (OIDC account creation tests)', function () { multiuser: true, strictOrigin: true, dbPath, - serverUri + serverUri, + enforceToc: true }) before(checkDnsSettings) before(function (done) { - ldpHttpsServer = ldp.listen(3457, done) + ldpHttpsServer = ldp.listen(port, done) }) after(function () { if (ldpHttpsServer) ldpHttpsServer.close() fs.removeSync(path.join(dbPath, 'oidc/users/users')) - cleanDir(path.join(rootPath, 'localhost')) + cleanDir(path.join(root, 'localhost')) }) var server = supertest(serverUri) @@ -93,14 +96,14 @@ describe('AccountManager (OIDC account creation tests)', function () { it('should not create a WebID if it already exists', function (done) { var subdomain = supertest('https://nicola.' + host) subdomain.post('/api/accounts/new') - .send('username=nicola&password=12345') + .send('username=nicola&password=12345&acceptToc=true') .expect(302) .end((err, res) => { if (err) { return done(err) } subdomain.post('/api/accounts/new') - .send('username=nicola&password=12345') + .send('username=nicola&password=12345&acceptToc=true') .expect(400) .end((err) => { done(err) @@ -108,10 +111,17 @@ 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) + subdomain.post('/api/accounts/new') + .send('username=nicola&password=12345&acceptToc=false') + .expect(400, done) + }) + it('should create the default folders', function (done) { var subdomain = supertest('https://nicola.' + host) subdomain.post('/api/accounts/new') - .send('username=nicola&password=12345') + .send('username=nicola&password=12345&acceptToc=true') .expect(302) .end(function (err) { if (err) { @@ -119,19 +129,19 @@ describe('AccountManager (OIDC account creation tests)', function () { } var domain = host.split(':')[0] var card = read(path.join('accounts/nicola.' + domain, - 'profile/card')) + 'profile/card')) var cardAcl = read(path.join('accounts/nicola.' + domain, - 'profile/card.acl')) + 'profile/card.acl')) var prefs = read(path.join('accounts/nicola.' + domain, - 'settings/prefs.ttl')) + 'settings/prefs.ttl')) var inboxAcl = read(path.join('accounts/nicola.' + domain, - 'inbox/.acl')) + 'inbox/.acl')) var rootMeta = read(path.join('accounts/nicola.' + domain, '.meta')) var rootMetaAcl = read(path.join('accounts/nicola.' + domain, - '.meta.acl')) + '.meta.acl')) if (domain && card && cardAcl && prefs && inboxAcl && rootMeta && - rootMetaAcl) { + rootMetaAcl) { done() } else { done(new Error('failed to create default files')) @@ -142,7 +152,7 @@ describe('AccountManager (OIDC account creation tests)', function () { it('should link WebID to the root account', function (done) { var subdomain = supertest('https://nicola.' + host) subdomain.post('/api/accounts/new') - .send('username=nicola&password=12345') + .send('username=nicola&password=12345&acceptToc=true') .expect(302) .end(function (err) { if (err) { @@ -236,3 +246,46 @@ describe('Single User signup page', () => { .end(done) }) }) + +describe('Signup page where Terms & Conditions are not being enforced', () => { + const port = 3457 + const host = `localhost:${port}` + const root = path.join(__dirname, '../resources/accounts/') + const configPath = path.join(__dirname, '../resources/config') + const dbPath = path.join(__dirname, '../resources/accounts/db') + const ldp = ldnode.createServer({ + port, + root, + configPath, + sslKey: path.join(__dirname, '../keys/key.pem'), + sslCert: path.join(__dirname, '../keys/cert.pem'), + auth: 'oidc', + webid: true, + multiuser: true, + strictOrigin: true, + enforceToc: false + }) + let ldpHttpsServer + + before(function (done) { + ldpHttpsServer = ldp.listen(port, done) + }) + + after(function () { + if (ldpHttpsServer) ldpHttpsServer.close() + fs.removeSync(path.join(dbPath, 'oidc/users/users')) + cleanDir(path.join(root, 'localhost')) + rm('accounts/nicola.localhost') + }) + + beforeEach(function () { + rm('accounts/nicola.localhost') + }) + + it('should not enforce T&C upon creating account', function (done) { + var subdomain = supertest('https://nicola.' + host) + subdomain.post('/api/accounts/new') + .send('username=nicola&password=12345') + .expect(302, done) + }) +}) From 2c324d9b9126771d5ef0205bc4562f21feab3933 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 31 Oct 2018 15:51:14 +0100 Subject: [PATCH 04/21] A little cleanup --- lib/requests/create-account-request.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/requests/create-account-request.js b/lib/requests/create-account-request.js index 12dd97825..3b605f944 100644 --- a/lib/requests/create-account-request.js +++ b/lib/requests/create-account-request.js @@ -263,7 +263,6 @@ class CreateOidcAccountRequest extends CreateAccountRequest { throw error } - // console.log(this.enforceToc, this.acceptToc) if (this.enforceToc && !this.acceptToc) { error = new Error('Accepting Terms & Conditions are required for this service') error.statusCode = 400 From 04babec45264a1591212c122f87777278651da83 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 31 Oct 2018 18:05:33 +0100 Subject: [PATCH 05/21] A simple, configurable solution to blacklist usernames --- README.md | 8 +++- config/usernames-blacklist.json | 4 ++ lib/common/blacklist-service.js | 33 +++++++++++++ lib/requests/create-account-request.js | 60 ++++++++++++++++-------- package-lock.json | 5 ++ package.json | 1 + test/unit/blacklist-service-test.js | 48 +++++++++++++++++++ test/unit/create-account-request-test.js | 41 ++++++++++++++++ 8 files changed, 179 insertions(+), 21 deletions(-) create mode 100644 config/usernames-blacklist.json create mode 100644 lib/common/blacklist-service.js create mode 100644 test/unit/blacklist-service-test.js diff --git a/README.md b/README.md index b0cf78752..c1af25ab3 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ Note that this example creates the `fullchain.pem` and `privkey.pem` files in a directory one level higher from the current, so that you don't accidentally commit your certificates to `solid` while you're developing. -If you would like to get rid of the browser warnings, import your fullchain.pem certificate into your 'Trusted Root Certificate' store. +If you would like to get rid of the browser warnings, import your fullchain.pem certificate into your 'Trusted Root Certificate' store. ### Run multi-user server (intermediate) @@ -375,6 +375,12 @@ In order to test a single component, you can run npm run test-(acl|formats|params|patch) ``` +## Blacklisted usernames + +By default Solid will ban [certain usernames as they might cause +confusion or allow vulnerabilies for social engineering](https://github.com/marteinn/The-Big-Username-Blacklist). +This list is configurable via `config/usernames-blacklist.json`. Solid does not +blacklist profanities by default. ## Contributing diff --git a/config/usernames-blacklist.json b/config/usernames-blacklist.json new file mode 100644 index 000000000..c1b469a1e --- /dev/null +++ b/config/usernames-blacklist.json @@ -0,0 +1,4 @@ +{ + "useTheBigUsernameBlacklist": true, + "customBlacklistedUsernames": [] +} diff --git a/lib/common/blacklist-service.js b/lib/common/blacklist-service.js new file mode 100644 index 000000000..caef80ba7 --- /dev/null +++ b/lib/common/blacklist-service.js @@ -0,0 +1,33 @@ +const blacklistConfig = require('../../config/usernames-blacklist.json') +const blacklist = require('the-big-username-blacklist').list + +class BlacklistService { + constructor () { + this.reset() + } + + addWord (word) { + this.list.push(BlacklistService._prepareWord(word)) + } + + reset (config) { + this.list = BlacklistService._initList(config) + } + + validate (word) { + return this.list.indexOf(BlacklistService._prepareWord(word)) === -1 + } + + static _initList (config = blacklistConfig) { + return [ + ...(config.useTheBigUsernameBlacklist ? blacklist : []), + ...config.customBlacklistedUsernames + ] + } + + static _prepareWord (word) { + return word.trim().toLocaleLowerCase() + } +} + +module.exports = new BlacklistService() diff --git a/lib/requests/create-account-request.js b/lib/requests/create-account-request.js index 68997822c..6c62b7739 100644 --- a/lib/requests/create-account-request.js +++ b/lib/requests/create-account-request.js @@ -3,6 +3,7 @@ const AuthRequest = require('./auth-request') const WebIdTlsCertificate = require('../models/webid-tls-certificate') const debug = require('../debug').accounts +const blacklistService = require('../common/blacklist-service') /** * Represents a 'create new user account' http request (either a POST to the @@ -115,30 +116,28 @@ class CreateAccountRequest extends AuthRequest { /** * Creates an account for a given user (from a POST to `/api/accounts/new`) * - * @throws {Error} An http 400 error if an account already exists + * @throws {Error} If errors were encountering while validating the username. * * @return {Promise} Resolves with newly created account instance */ - createAccount () { + async createAccount () { let userAccount = this.userAccount let accountManager = this.accountManager - return Promise.resolve(userAccount) - .then(this.cancelIfUsernameInvalid.bind(this)) - .then(this.cancelIfAccountExists.bind(this)) - .then(this.createAccountStorage.bind(this)) - .then(this.saveCredentialsFor.bind(this)) - .then(this.sendResponse.bind(this)) - .then(userAccount => { - // 'return' not used deliberately, no need to block and wait for email - if (userAccount && userAccount.email) { - debug('Sending Welcome email') - accountManager.sendWelcomeEmail(userAccount) - } - }) - .then(() => { - return userAccount - }) + this.cancelIfUsernameInvalid(userAccount) + this.cancelIfBlacklistedUsername(userAccount) + await this.cancelIfAccountExists(userAccount) + await this.createAccountStorage(userAccount) + await this.saveCredentialsFor(userAccount) + await this.sendResponse(userAccount) + + // 'return' not used deliberately, no need to block and wait for email + if (userAccount && userAccount.email) { + debug('Sending Welcome email') + accountManager.sendWelcomeEmail(userAccount) + } + + return userAccount } /** @@ -196,12 +195,33 @@ class CreateAccountRequest extends AuthRequest { * @throws {Error} If errors were encountering while validating the * username. * - * @return {Promise} Chainable + * @return {UserAccount} Chainable */ cancelIfUsernameInvalid (userAccount) { if (!userAccount.username || !/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(userAccount.username)) { debug('Invalid username ' + userAccount.username) - const error = new Error('Invalid username') + const error = new Error('Invalid username (contains invalid characters)') + error.status = 400 + throw error + } + + return userAccount + } + + /** + * Check if a username is a valid slug. + * + * @param userAccount {UserAccount} Instance of the account to be created + * + * @throws {Error} If username is blacklisted + * + * @return {UserAccount} Chainable + */ + cancelIfBlacklistedUsername (userAccount) { + const validUsername = blacklistService.validate(userAccount.username) + if (!validUsername) { + debug('Invalid username ' + userAccount.username) + const error = new Error('Invalid username (username is blacklisted)') error.status = 400 throw error } diff --git a/package-lock.json b/package-lock.json index 5bd3d23cb..e1def6b06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8366,6 +8366,11 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "the-big-username-blacklist": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/the-big-username-blacklist/-/the-big-username-blacklist-1.5.1.tgz", + "integrity": "sha1-uqanyWHRpJo1OdFUJMNMjTPHdtU=" + }, "then-fs": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz", diff --git a/package.json b/package.json index 626ae6f8f..5f7bc16c3 100644 --- a/package.json +++ b/package.json @@ -77,6 +77,7 @@ "solid-permissions": "^0.6.0", "solid-ws": "^0.2.3", "text-encoder-lite": "^1.0.1", + "the-big-username-blacklist": "^1.5.1", "ulid": "^0.1.0", "uuid": "^3.0.0", "valid-url": "^1.0.9", diff --git a/test/unit/blacklist-service-test.js b/test/unit/blacklist-service-test.js new file mode 100644 index 000000000..66c9d5031 --- /dev/null +++ b/test/unit/blacklist-service-test.js @@ -0,0 +1,48 @@ +'use strict' + +const chai = require('chai') +const expect = chai.expect + +const blacklist = require('the-big-username-blacklist').list +const blacklistService = require('../../lib/common/blacklist-service') + +describe('BlacklistService', () => { + afterEach(() => blacklistService.reset()) + + describe('addWord', () => { + it('allows adding words', () => { + const numberOfBlacklistedWords = blacklistService.list.length + blacklistService.addWord('foo') + expect(blacklistService.list.length).to.equal(numberOfBlacklistedWords + 1) + }) + }) + + describe('reset', () => { + it('will reset list of blacklisted words', () => { + blacklistService.addWord('foo') + blacklistService.reset() + expect(blacklistService.list.length).to.equal(blacklist.length) + }) + + it('can configure service via reset', () => { + blacklistService.reset({ + useTheBigUsernameBlacklist: false, + customBlacklistedUsernames: ['foo'] + }) + expect(blacklistService.list.length).to.equal(1) + }) + + it('is a singleton', () => { + const instanceA = blacklistService + blacklistService.reset({ customBlacklistedUsernames: ['foo'] }) + expect(instanceA.validate('foo')).to.equal(blacklistService.validate('foo')) + }) + }) + + describe('validate', () => { + it('validates given a default list of blacklisted usernames', () => { + const validWords = blacklist.reduce((memo, word) => memo + (blacklistService.validate(word) ? 1 : 0), 0) + expect(validWords).to.equal(0) + }) + }) +}) diff --git a/test/unit/create-account-request-test.js b/test/unit/create-account-request-test.js index 469fe7822..a76940106 100644 --- a/test/unit/create-account-request-test.js +++ b/test/unit/create-account-request-test.js @@ -7,12 +7,14 @@ const sinonChai = require('sinon-chai') chai.use(sinonChai) chai.should() const HttpMocks = require('node-mocks-http') +const blacklist = require('the-big-username-blacklist') const LDP = require('../../lib/ldp') const AccountManager = require('../../lib/models/account-manager') const SolidHost = require('../../lib/models/solid-host') const defaults = require('../../config/defaults') const { CreateAccountRequest } = require('../../lib/requests/create-account-request') +const blacklistService = require('../../lib/common/blacklist-service') describe('CreateAccountRequest', () => { let host, store, accountManager @@ -127,6 +129,45 @@ describe('CreateAccountRequest', () => { expect(invalidUsernamesCount).to.eq(invalidUsernames.length) }) }) + + describe('Blacklisted usernames', () => { + const invalidUsernames = [...blacklist.list, 'foo'] + + before(() => { + const accountManager = AccountManager.from({ host }) + accountManager.accountExists = sinon.stub().returns(Promise.resolve(false)) + blacklistService.addWord('foo') + }) + + after(() => blacklistService.reset()) + + it('should return a 400 error if a username is blacklisted', async () => { + const locals = { authMethod: defaults.auth, accountManager, oidc: { users: {} } } + + let invalidUsernamesCount = 0 + + const requests = invalidUsernames.map((username) => { + let req = HttpMocks.createRequest({ + app: { locals }, + body: { username, password: '1234' } + }) + let request = CreateAccountRequest.fromParams(req, res) + + return request.createAccount() + .then(() => { + throw new Error('should not happen') + }) + .catch(err => { + invalidUsernamesCount++ + expect(err.message).to.match(/Invalid username/) + expect(err.status).to.equal(400) + }) + }) + + await Promise.all(requests) + expect(invalidUsernamesCount).to.eq(invalidUsernames.length) + }) + }) }) }) From 8922bdde2998c5d4518c540fd302c10862f48eca Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 31 Oct 2018 18:11:37 +0100 Subject: [PATCH 06/21] Making test a bit more explicit --- test/unit/blacklist-service-test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/unit/blacklist-service-test.js b/test/unit/blacklist-service-test.js index 66c9d5031..976768920 100644 --- a/test/unit/blacklist-service-test.js +++ b/test/unit/blacklist-service-test.js @@ -30,6 +30,7 @@ describe('BlacklistService', () => { customBlacklistedUsernames: ['foo'] }) expect(blacklistService.list.length).to.equal(1) + expect(blacklistService.validate('admin')).to.equal(true) }) it('is a singleton', () => { From 46bdd70f291edf3d77fb8fa2ccf26d7f5fede3af Mon Sep 17 00:00:00 2001 From: Kjetil Kjernsmo Date: Thu, 1 Nov 2018 13:18:35 +0100 Subject: [PATCH 07/21] Update README.md Co-Authored-By: megoth --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c1af25ab3..e23c53912 100644 --- a/README.md +++ b/README.md @@ -377,7 +377,7 @@ npm run test-(acl|formats|params|patch) ## Blacklisted usernames -By default Solid will ban [certain usernames as they might cause +By default Solid will not allow [certain usernames as they might cause confusion or allow vulnerabilies for social engineering](https://github.com/marteinn/The-Big-Username-Blacklist). This list is configurable via `config/usernames-blacklist.json`. Solid does not blacklist profanities by default. From 5980af7262731f115c5269a239b3affe429c6156 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Thu, 1 Nov 2018 19:51:44 +0100 Subject: [PATCH 08/21] Moved all services to its own service-directory --- lib/create-app.js | 4 ++-- lib/requests/create-account-request.js | 2 +- lib/{common => services}/blacklist-service.js | 0 lib/{models => services}/email-service.js | 2 +- lib/{models => services}/token-service.js | 0 test/unit/account-manager-test.js | 2 +- test/unit/blacklist-service-test.js | 2 +- test/unit/create-account-request-test.js | 2 +- test/unit/email-service-test.js | 2 +- test/unit/email-welcome-test.js | 2 +- test/unit/token-service-test.js | 2 +- 11 files changed, 10 insertions(+), 10 deletions(-) rename lib/{common => services}/blacklist-service.js (100%) rename lib/{models => services}/email-service.js (99%) rename lib/{models => services}/token-service.js (100%) diff --git a/lib/create-app.js b/lib/create-app.js index 2a0b15da7..c8074395b 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -12,8 +12,8 @@ const authProxy = require('./handlers/auth-proxy') const SolidHost = require('./models/solid-host') const AccountManager = require('./models/account-manager') const vhost = require('vhost') -const EmailService = require('./models/email-service') -const TokenService = require('./models/token-service') +const EmailService = require('./services/email-service') +const TokenService = require('./services/token-service') const capabilityDiscovery = require('./capability-discovery') const API = require('./api') const errorPages = require('./handlers/error-pages') diff --git a/lib/requests/create-account-request.js b/lib/requests/create-account-request.js index 6c62b7739..63e8a8e2b 100644 --- a/lib/requests/create-account-request.js +++ b/lib/requests/create-account-request.js @@ -3,7 +3,7 @@ const AuthRequest = require('./auth-request') const WebIdTlsCertificate = require('../models/webid-tls-certificate') const debug = require('../debug').accounts -const blacklistService = require('../common/blacklist-service') +const blacklistService = require('../services/blacklist-service') /** * Represents a 'create new user account' http request (either a POST to the diff --git a/lib/common/blacklist-service.js b/lib/services/blacklist-service.js similarity index 100% rename from lib/common/blacklist-service.js rename to lib/services/blacklist-service.js diff --git a/lib/models/email-service.js b/lib/services/email-service.js similarity index 99% rename from lib/models/email-service.js rename to lib/services/email-service.js index 69166793a..d0fe448f7 100644 --- a/lib/models/email-service.js +++ b/lib/services/email-service.js @@ -2,7 +2,7 @@ const nodemailer = require('nodemailer') const path = require('path') -const debug = require('./../debug').email +const debug = require('../debug').email /** * Models a Nodemailer-based email sending service. diff --git a/lib/models/token-service.js b/lib/services/token-service.js similarity index 100% rename from lib/models/token-service.js rename to lib/services/token-service.js diff --git a/test/unit/account-manager-test.js b/test/unit/account-manager-test.js index 90cb8d639..6d69bd391 100644 --- a/test/unit/account-manager-test.js +++ b/test/unit/account-manager-test.js @@ -15,7 +15,7 @@ const LDP = require('../../lib/ldp') const SolidHost = require('../../lib/models/solid-host') const AccountManager = require('../../lib/models/account-manager') const UserAccount = require('../../lib/models/user-account') -const TokenService = require('../../lib/models/token-service') +const TokenService = require('../../lib/services/token-service') const WebIdTlsCertificate = require('../../lib/models/webid-tls-certificate') const testAccountsDir = path.join(__dirname, '../resources/accounts') diff --git a/test/unit/blacklist-service-test.js b/test/unit/blacklist-service-test.js index 976768920..a2db974ca 100644 --- a/test/unit/blacklist-service-test.js +++ b/test/unit/blacklist-service-test.js @@ -4,7 +4,7 @@ const chai = require('chai') const expect = chai.expect const blacklist = require('the-big-username-blacklist').list -const blacklistService = require('../../lib/common/blacklist-service') +const blacklistService = require('../../lib/services/blacklist-service') describe('BlacklistService', () => { afterEach(() => blacklistService.reset()) diff --git a/test/unit/create-account-request-test.js b/test/unit/create-account-request-test.js index a76940106..892219b37 100644 --- a/test/unit/create-account-request-test.js +++ b/test/unit/create-account-request-test.js @@ -14,7 +14,7 @@ const AccountManager = require('../../lib/models/account-manager') const SolidHost = require('../../lib/models/solid-host') const defaults = require('../../config/defaults') const { CreateAccountRequest } = require('../../lib/requests/create-account-request') -const blacklistService = require('../../lib/common/blacklist-service') +const blacklistService = require('../../lib/services/blacklist-service') describe('CreateAccountRequest', () => { let host, store, accountManager diff --git a/test/unit/email-service-test.js b/test/unit/email-service-test.js index 97de0ca80..27f08da26 100644 --- a/test/unit/email-service-test.js +++ b/test/unit/email-service-test.js @@ -1,4 +1,4 @@ -const EmailService = require('../../lib/models/email-service') +const EmailService = require('../../lib/services/email-service') const path = require('path') const sinon = require('sinon') const chai = require('chai') diff --git a/test/unit/email-welcome-test.js b/test/unit/email-welcome-test.js index 86e3935b2..7317a48c3 100644 --- a/test/unit/email-welcome-test.js +++ b/test/unit/email-welcome-test.js @@ -10,7 +10,7 @@ chai.should() const SolidHost = require('../../lib/models/solid-host') const AccountManager = require('../../lib/models/account-manager') -const EmailService = require('../../lib/models/email-service') +const EmailService = require('../../lib/services/email-service') const templatePath = path.join(__dirname, '../../default-templates/emails') diff --git a/test/unit/token-service-test.js b/test/unit/token-service-test.js index ea84fe9a7..2751a2abb 100644 --- a/test/unit/token-service-test.js +++ b/test/unit/token-service-test.js @@ -6,7 +6,7 @@ const dirtyChai = require('dirty-chai') chai.use(dirtyChai) chai.should() -const TokenService = require('../../lib/models/token-service') +const TokenService = require('../../lib/services/token-service') describe('TokenService', () => { describe('constructor()', () => { From 75c01e5fa37971a12e99463e3aa2be1386ab8dc7 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 24 Oct 2018 08:13:28 +0200 Subject: [PATCH 09/21] Adding options to handle T&C --- bin/lib/options.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/bin/lib/options.js b/bin/lib/options.js index 4efbf07d2..245225cba 100644 --- a/bin/lib/options.js +++ b/bin/lib/options.js @@ -334,6 +334,21 @@ module.exports = [ name: 'server-logo', help: 'A logo that represents you, your brand, or your server (not required)', prompt: true + }, + { + name: 'enforceToc', + help: 'Do you want to enforce Terms & Conditions for your service?', + flag: true, + prompt: true, + default: true, + when: answers => answers.multiuser + }, + { + name: 'tocUri', + help: 'URI to your Terms & Conditions', + prompt: true, + validate: validUri, + when: answers => answers.enforceToc } ] From 768536041b37c56d3dd00e0f8e7071be49ec670f Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 24 Oct 2018 09:13:11 +0200 Subject: [PATCH 10/21] Added checkbox to register-form Also added handlebar-helpers --- default-views/account/register-form.hbs | 9 +++++++++ lib/create-app.js | 4 +++- lib/requests/auth-request.js | 4 ++++ lib/requests/create-account-request.js | 21 ++++++++++++++------- package.json | 1 + 5 files changed, 31 insertions(+), 8 deletions(-) diff --git a/default-views/account/register-form.hbs b/default-views/account/register-form.hbs index 12166f888..93e7d98a1 100644 --- a/default-views/account/register-form.hbs +++ b/default-views/account/register-form.hbs @@ -71,6 +71,15 @@ + {{#if (and enforceToc tocUri)}} +
+ +
+ {{/if}} + diff --git a/lib/create-app.js b/lib/create-app.js index c8074395b..a0db761d4 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -3,6 +3,7 @@ module.exports = createApp const express = require('express') const session = require('express-session') const handlebars = require('express-handlebars') +const handlebarsHelpers = require('handlebars-helpers') const uuid = require('uuid') const cors = require('cors') const LDP = require('./ldp') @@ -163,7 +164,8 @@ function initViews (app, configPath) { app.set('views', viewsPath) app.engine('.hbs', handlebars({ extname: '.hbs', - partialsDir: viewsPath + partialsDir: viewsPath, + helpers: handlebarsHelpers() })) app.set('view engine', '.hbs') } diff --git a/lib/requests/auth-request.js b/lib/requests/auth-request.js index cb8a532de..7f60c601b 100644 --- a/lib/requests/auth-request.js +++ b/lib/requests/auth-request.js @@ -25,6 +25,8 @@ class AuthRequest { * @param [options.returnToUrl] {string} * @param [options.authQueryParams] {Object} Key/value hashmap of parsed query * parameters that will be passed through to the /authorize endpoint. + * @param [options.enforceToc] {boolean} Whether or not to enforce the service provider's T&C + * @param [options.tocUri] {string} URI to the service provider's T&C */ constructor (options) { this.response = options.response @@ -34,6 +36,8 @@ class AuthRequest { this.returnToUrl = options.returnToUrl this.authQueryParams = options.authQueryParams || {} this.localAuth = options.localAuth + this.enforceToc = options.enforceToc + this.tocUri = options.tocUri } /** diff --git a/lib/requests/create-account-request.js b/lib/requests/create-account-request.js index 63e8a8e2b..4e4bb0118 100644 --- a/lib/requests/create-account-request.js +++ b/lib/requests/create-account-request.js @@ -27,6 +27,8 @@ class CreateAccountRequest extends AuthRequest { * @param [options.response] {HttpResponse} * @param [options.returnToUrl] {string} If present, redirect the agent to * this url on successful account creation + * @param [options.enforceToc] {boolean} Whether or not to enforce the service provider's T&C + * @param [options.tocUri] {string} URI to the service provider's T&C */ constructor (options) { super(options) @@ -62,6 +64,10 @@ class CreateAccountRequest extends AuthRequest { options.userAccount = accountManager.userAccountFrom(body) } + const config = require('../../config') + options.enforceToc = config.enforceToc + options.tocUri = config.tocUri + switch (authMethod) { case 'oidc': options.password = body.password @@ -97,13 +103,14 @@ class CreateAccountRequest extends AuthRequest { renderForm (error) { let authMethod = this.accountManager.authMethod - let params = Object.assign({}, this.authQueryParams, - { - returnToUrl: this.returnToUrl, - loginUrl: this.loginUrl(), - registerDisabled: authMethod === 'tls', - multiuser: this.accountManager.multiuser - }) + let params = Object.assign({}, this.authQueryParams, { + enforceToc: this.enforceToc, + loginUrl: this.loginUrl(), + multiuser: this.accountManager.multiuser, + registerDisabled: authMethod === 'tls', + returnToUrl: this.returnToUrl, + tocUri: this.tocUri + }) if (error) { params.error = error.message diff --git a/package.json b/package.json index 5f7bc16c3..1116f4d0e 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "glob": "^7.1.1", "global-tunnel-ng": "^2.1.0", "handlebars": "^4.0.6", + "handlebars-helpers": "^0.10.0", "http-proxy-middleware": "^0.18.0", "inquirer": "^1.0.2", "ip-range-check": "0.0.2", From 8d5ee9203fa680a71ad38bd4e5c71790bc631ba8 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 31 Oct 2018 15:48:04 +0100 Subject: [PATCH 11/21] Conditionally enforcing acceptToc when creating account --- lib/create-app.js | 2 + lib/requests/auth-request.js | 4 +- lib/requests/create-account-request.js | 38 +- package-lock.json | 749 +++++++++++++++++- .../integration/account-creation-oidc-test.js | 93 ++- 5 files changed, 854 insertions(+), 32 deletions(-) diff --git a/lib/create-app.js b/lib/create-app.js index a0db761d4..e7d7ca4a8 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -124,6 +124,8 @@ function initAppLocals (app, argv, ldp) { app.locals.authMethod = argv.auth app.locals.localAuth = argv.localAuth app.locals.tokenService = new TokenService() + app.locals.enforceToc = argv.enforceToc + app.locals.tocUri = argv.tocUri if (argv.email && argv.email.host) { app.locals.emailService = new EmailService(argv.templates.email, argv.email) diff --git a/lib/requests/auth-request.js b/lib/requests/auth-request.js index 7f60c601b..7769fc8f7 100644 --- a/lib/requests/auth-request.js +++ b/lib/requests/auth-request.js @@ -88,6 +88,7 @@ class AuthRequest { let authQueryParams = AuthRequest.extractAuthParams(req) let returnToUrl = AuthRequest.parseParameter(req, 'returnToUrl') + const acceptToc = AuthRequest.parseParameter(req, 'acceptToc') let options = { response: res, @@ -96,7 +97,8 @@ class AuthRequest { accountManager, returnToUrl, authQueryParams, - localAuth + localAuth, + acceptToc } return options diff --git a/lib/requests/create-account-request.js b/lib/requests/create-account-request.js index 4e4bb0118..1a5a5ae1a 100644 --- a/lib/requests/create-account-request.js +++ b/lib/requests/create-account-request.js @@ -29,12 +29,14 @@ class CreateAccountRequest extends AuthRequest { * this url on successful account creation * @param [options.enforceToc] {boolean} Whether or not to enforce the service provider's T&C * @param [options.tocUri] {string} URI to the service provider's T&C + * @param [options.acceptToc] {boolean} Whether or not user has accepted T&C */ constructor (options) { super(options) this.username = options.username this.userAccount = options.userAccount + this.acceptToc = options.acceptToc === 'true' } /** @@ -48,7 +50,7 @@ class CreateAccountRequest extends AuthRequest { * `userAccountFrom()`), or it encounters an unsupported authentication * scheme. * - * @return {CreateAccountRequest|CreateTlsAccountRequest} + * @return {CreateOidcAccountRequest|CreateTlsAccountRequest} */ static fromParams (req, res) { let options = AuthRequest.requestOptions(req, res) @@ -64,9 +66,8 @@ class CreateAccountRequest extends AuthRequest { options.userAccount = accountManager.userAccountFrom(body) } - const config = require('../../config') - options.enforceToc = config.enforceToc - options.tocUri = config.tocUri + options.enforceToc = locals.enforceToc + options.tocUri = locals.tocUri switch (authMethod) { case 'oidc': @@ -80,13 +81,15 @@ class CreateAccountRequest extends AuthRequest { } } - static post (req, res) { + static async post (req, res) { let request = CreateAccountRequest.fromParams(req, res) - return Promise.resolve() - .then(() => request.validate()) - .then(() => request.createAccount()) - .catch(error => request.error(error)) + try { + request.validate() + await request.createAccount() + } catch (error) { + request.error(error) + } } static get (req, res) { @@ -251,6 +254,7 @@ class CreateOidcAccountRequest extends CreateAccountRequest { * * @param [options={}] {Object} See `CreateAccountRequest` constructor docstring * @param [options.password] {string} Password, as entered by the user at signup + * @param [options.acceptToc] {boolean} Whether or not user has accepted T&C */ constructor (options) { super(options) @@ -278,6 +282,13 @@ class CreateOidcAccountRequest extends CreateAccountRequest { error.statusCode = 400 throw error } + + // console.log(this.enforceToc, this.acceptToc) + if (this.enforceToc && !this.acceptToc) { + error = new Error('Accepting Terms & Conditions are required for this service') + error.statusCode = 400 + throw error + } } /** @@ -317,6 +328,7 @@ class CreateTlsAccountRequest extends CreateAccountRequest { * * @param [options={}] {Object} See `CreateAccountRequest` constructor docstring * @param [options.spkac] {string} + * @param [options.acceptToc] {boolean} Whether or not user has accepted T&C */ constructor (options) { super(options) @@ -326,7 +338,7 @@ class CreateTlsAccountRequest extends CreateAccountRequest { } /** - * Validates the Login request (makes sure required parameters are present), + * Validates the Signup request (makes sure required parameters are present), * and throws an error if not. * * @throws {Error} If missing required params @@ -339,6 +351,12 @@ class CreateTlsAccountRequest extends CreateAccountRequest { error.statusCode = 400 throw error } + + if (this.enforceToc && !this.acceptToc) { + error = new Error('Accepting Terms & Conditions are required for this service') + error.statusCode = 400 + throw error + } } /** diff --git a/package-lock.json b/package-lock.json index e1def6b06..2e7cedf0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -437,21 +437,278 @@ "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", "dev": true }, + "ansi-bgblack": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz", + "integrity": "sha1-poulAHiHcBtqr74/oNrf36juPKI=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgblue": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz", + "integrity": "sha1-Z73ATtybm1J4lp2hlt6j11yMNhM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgcyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz", + "integrity": "sha1-WEiUJWAL3p9VBwaN2Wnr/bUP52g=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bggreen": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz", + "integrity": "sha1-TjGRJIUplD9DIelr8THRwTgWr0k=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgmagenta": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz", + "integrity": "sha1-myhDLAduqpmUGGcqPvvhk5HCx6E=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgred": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgred/-/ansi-bgred-0.1.1.tgz", + "integrity": "sha1-p2+Sg4OCukMpCmwXeEJPmE1vEEE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgwhite": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz", + "integrity": "sha1-ZQRlE3elim7OzQMxmU5IAljhG6g=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgyellow": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz", + "integrity": "sha1-w/4usIzUdmSAKeaHTRWgs49h1E8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-black": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-black/-/ansi-black-0.1.1.tgz", + "integrity": "sha1-9hheiJNgslRaHsUMC/Bj/EMDJFM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-blue": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-blue/-/ansi-blue-0.1.1.tgz", + "integrity": "sha1-FbgEmQ6S/JyoxUds6PaZd3wh7b8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bold": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bold/-/ansi-bold-0.1.1.tgz", + "integrity": "sha1-PmOVCvWswq4uZw5vZ96xFdGl9QU=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-colors": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-0.2.0.tgz", + "integrity": "sha1-csMd4qDZoszQysMMyYI+6y9kNLU=", + "requires": { + "ansi-bgblack": "^0.1.1", + "ansi-bgblue": "^0.1.1", + "ansi-bgcyan": "^0.1.1", + "ansi-bggreen": "^0.1.1", + "ansi-bgmagenta": "^0.1.1", + "ansi-bgred": "^0.1.1", + "ansi-bgwhite": "^0.1.1", + "ansi-bgyellow": "^0.1.1", + "ansi-black": "^0.1.1", + "ansi-blue": "^0.1.1", + "ansi-bold": "^0.1.1", + "ansi-cyan": "^0.1.1", + "ansi-dim": "^0.1.1", + "ansi-gray": "^0.1.1", + "ansi-green": "^0.1.1", + "ansi-grey": "^0.1.1", + "ansi-hidden": "^0.1.1", + "ansi-inverse": "^0.1.1", + "ansi-italic": "^0.1.1", + "ansi-magenta": "^0.1.1", + "ansi-red": "^0.1.1", + "ansi-reset": "^0.1.1", + "ansi-strikethrough": "^0.1.1", + "ansi-underline": "^0.1.1", + "ansi-white": "^0.1.1", + "ansi-yellow": "^0.1.1", + "lazy-cache": "^2.0.1" + }, + "dependencies": { + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-dim": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-dim/-/ansi-dim-0.1.1.tgz", + "integrity": "sha1-QN5MYDqoCG2Oeoa4/5mNXDbu/Ww=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-escapes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-green": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz", + "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-grey": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-grey/-/ansi-grey-0.1.1.tgz", + "integrity": "sha1-WdmLasK6GfilF5jphT+6eDOaM8E=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-hidden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-hidden/-/ansi-hidden-0.1.1.tgz", + "integrity": "sha1-7WpMSY0rt8uyidvyqNHcyFZ/rg8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-inverse": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-inverse/-/ansi-inverse-0.1.1.tgz", + "integrity": "sha1-tq9Fgm/oJr+1KKbHmIV5Q1XM0mk=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-italic": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-italic/-/ansi-italic-0.1.1.tgz", + "integrity": "sha1-EEdDRj9iXBQqA2c5z4XtpoiYbyM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-magenta": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-magenta/-/ansi-magenta-0.1.1.tgz", + "integrity": "sha1-BjtboW+z8j4c/aKwfAqJ3hHkMK4=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, + "ansi-reset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-reset/-/ansi-reset-0.1.1.tgz", + "integrity": "sha1-5+cSksPH3c1NYu9KbHwFmAkRw7c=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-strikethrough": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz", + "integrity": "sha1-2Eh3FAss/wfRyT685pkE9oiF5Wg=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, + "ansi-underline": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-underline/-/ansi-underline-0.1.1.tgz", + "integrity": "sha1-38kg9Ml7WXfqFi34/7mIMIqqcaQ=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-white": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-white/-/ansi-white-0.1.1.tgz", + "integrity": "sha1-nHe3wZPF7pkuYBHTbsTJIbRXiUQ=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, + "ansi-yellow": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-yellow/-/ansi-yellow-0.1.1.tgz", + "integrity": "sha1-y5NW8vRscy8OMZnmEClVp32oPB0=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansicolors": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", @@ -517,6 +774,23 @@ "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" }, + "array-sort": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-0.1.4.tgz", + "integrity": "sha512-BNcM+RXxndPxiZ2rd76k6nyQLRZr2/B/sdi8pQ+Joafr5AH279L40dfokSUTp8O+AaqYjXWhblBWa2st2nc4fQ==", + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -628,6 +902,11 @@ "resolved": "https://registry.npmjs.org/auth-header/-/auth-header-1.0.0.tgz", "integrity": "sha512-CPPazq09YVDUNNVWo4oSPTQmtwIzHusZhQmahCKvIsk0/xH6U3QsMAv3sM+7+Q0B1K2KJ/Q38OND317uXs4NHA==" }, + "autolinker": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", + "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=" + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -2157,6 +2436,43 @@ "elliptic": "^6.0.0" } }, + "create-frame": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/create-frame/-/create-frame-1.0.0.tgz", + "integrity": "sha1-i5XyaR4ySbYIBEPjPQutn49pdao=", + "requires": { + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "isobject": "^3.0.0", + "lazy-cache": "^2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, "create-hash": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -2244,6 +2560,24 @@ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" }, + "date.js": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/date.js/-/date.js-0.3.3.tgz", + "integrity": "sha512-HgigOS3h3k6HnW011nAb43c5xx5rBXk8P2v/WIT9Zv4koIaVXiH2BURguI78VVp+5Qc076T7OR378JViCnZtBw==", + "requires": { + "debug": "~3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2297,6 +2631,21 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, "default-require-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", @@ -2609,6 +2958,11 @@ "iconv-lite": "~0.4.13" } }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2618,6 +2972,11 @@ "is-arrayish": "^0.2.1" } }, + "error-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/error-symbol/-/error-symbol-0.1.0.tgz", + "integrity": "sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y=" + }, "es5-ext": { "version": "0.10.46", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", @@ -3269,6 +3628,21 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, + "falsey": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/falsey/-/falsey-0.3.2.tgz", + "integrity": "sha512-lxEuefF5MBIVDmE6XeqCdM4BWk1+vYmGZtkbKZ/VFcg6uBBw6fXNEbWmxCjDdQlFc9hy450nkiWwM3VAW6G1qg==", + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", @@ -3426,7 +3800,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, "requires": { "for-in": "^1.0.1" } @@ -3537,6 +3910,11 @@ } } }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=" + }, "fs-extra": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", @@ -3601,6 +3979,38 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, + "get-object": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/get-object/-/get-object-0.2.0.tgz", + "integrity": "sha1-2S/31RkMZFMM2gVD2sY6PUf+jAw=", + "requires": { + "is-number": "^2.0.2", + "isobject": "^0.2.0" + }, + "dependencies": { + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-0.2.0.tgz", + "integrity": "sha1-o0MhkvObkQtfAsyYlIeDbscKqF4=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "get-stdin": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", @@ -3769,6 +4179,108 @@ } } }, + "handlebars-helper-create-frame": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/handlebars-helper-create-frame/-/handlebars-helper-create-frame-0.1.0.tgz", + "integrity": "sha1-iqUdEK62QI/MZgXUDXc1YohIegM=", + "requires": { + "create-frame": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "handlebars-helpers": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/handlebars-helpers/-/handlebars-helpers-0.10.0.tgz", + "integrity": "sha512-QiyhQz58u/DbuV41VnfpE0nhy6YCH4vB514ajysV8SoKmP+DxU+pR+fahVyNECHj+jiwEN2VrvxD/34/yHaLUg==", + "requires": { + "arr-flatten": "^1.1.0", + "array-sort": "^0.1.4", + "create-frame": "^1.0.0", + "define-property": "^1.0.0", + "falsey": "^0.3.2", + "for-in": "^1.0.2", + "for-own": "^1.0.0", + "get-object": "^0.2.0", + "get-value": "^2.0.6", + "handlebars": "^4.0.11", + "handlebars-helper-create-frame": "^0.1.0", + "handlebars-utils": "^1.0.6", + "has-value": "^1.0.0", + "helper-date": "^1.0.1", + "helper-markdown": "^1.0.0", + "helper-md": "^0.2.2", + "html-tag": "^2.0.0", + "is-even": "^1.0.0", + "is-glob": "^4.0.0", + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "lazy-cache": "^2.0.2", + "logging-helpers": "^1.0.0", + "micromatch": "^3.1.4", + "relative": "^3.0.2", + "striptags": "^3.1.0", + "to-gfm-code-block": "^0.1.1", + "year": "^0.2.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "handlebars-utils": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/handlebars-utils/-/handlebars-utils-1.0.6.tgz", + "integrity": "sha512-d5mmoQXdeEqSKMtQQZ9WkiUcO1E3tPbWxluCK9hVgIDPzQa9WsKo3Lbe/sGflTe7TomHEeZaOgwIkyIr1kfzkw==", + "requires": { + "kind-of": "^6.0.0", + "typeof-article": "^0.1.1" + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -3879,6 +4391,52 @@ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, + "helper-date": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/helper-date/-/helper-date-1.0.1.tgz", + "integrity": "sha512-wU3VOwwTJvGr/w5rZr3cprPHO+hIhlblTJHD6aFBrKLuNbf4lAmkawd2iK3c6NbJEvY7HAmDpqjOFSI5/+Ey2w==", + "requires": { + "date.js": "^0.3.1", + "handlebars-utils": "^1.0.4", + "moment": "^2.18.1" + } + }, + "helper-markdown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/helper-markdown/-/helper-markdown-1.0.0.tgz", + "integrity": "sha512-AnDqMS4ejkQK0MXze7pA9TM3pu01ZY+XXsES6gEE0RmCGk5/NIfvTn0NmItfyDOjRAzyo9z6X7YHbHX4PzIvOA==", + "requires": { + "handlebars-utils": "^1.0.2", + "highlight.js": "^9.12.0", + "remarkable": "^1.7.1" + } + }, + "helper-md": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/helper-md/-/helper-md-0.2.2.tgz", + "integrity": "sha1-wfWdflW7riM2L9ig6XFgeuxp1B8=", + "requires": { + "ent": "^2.2.0", + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "remarkable": "^1.6.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "highlight.js": { + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.13.1.tgz", + "integrity": "sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A==" + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -3905,6 +4463,15 @@ "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, + "html-tag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tag/-/html-tag-2.0.0.tgz", + "integrity": "sha512-XxzooSo6oBoxBEUazgjdXj7VwTn/iSTSZzTYKzYY6I916tkaYzypHxy+pbVU1h+0UQ9JlVf5XkNQyxOAiiQO1g==", + "requires": { + "is-self-closing": "^1.0.1", + "kind-of": "^6.0.0" + } + }, "htmlescape": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", @@ -4045,6 +4612,11 @@ "wrappy": "1" } }, + "info-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/info-symbol/-/info-symbol-0.1.0.tgz", + "integrity": "sha1-J4QdcoZ920JCzWEtecEGM4gcang=" + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -4223,6 +4795,14 @@ } } }, + "is-even": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-even/-/is-even-1.0.0.tgz", + "integrity": "sha1-drUFX7rY0pSoa2qUkBXhyXtxfAY=", + "requires": { + "is-odd": "^0.1.2" + } + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -4300,6 +4880,14 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, + "is-odd": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-0.1.2.tgz", + "integrity": "sha1-vFc7XONx7yqtbm9JeZtyvvE5eKc=", + "requires": { + "is-number": "^3.0.0" + } + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -4349,6 +4937,14 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, + "is-self-closing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-self-closing/-/is-self-closing-1.0.1.tgz", + "integrity": "sha512-E+60FomW7Blv5GXTlYee2KDrnG6srxF7Xt1SjrhWUGUEsTFIqY/nq2y3DaftCsgUMdh89V07IVfhY9KIJhLezg==", + "requires": { + "self-closing-tags": "^1.0.1" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -4843,6 +5439,38 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, + "log-ok": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz", + "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=", + "requires": { + "ansi-green": "^0.1.1", + "success-symbol": "^0.1.0" + } + }, + "log-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.2.1.tgz", + "integrity": "sha1-pMIXoN2aUFFdm5ICBgkas9TgMc8=", + "requires": { + "ansi-colors": "^0.2.0", + "error-symbol": "^0.1.0", + "info-symbol": "^0.1.0", + "log-ok": "^0.1.1", + "success-symbol": "^0.1.0", + "time-stamp": "^1.0.1", + "warning-symbol": "^0.1.0" + } + }, + "logging-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/logging-helpers/-/logging-helpers-1.0.0.tgz", + "integrity": "sha512-qyIh2goLt1sOgQQrrIWuwkRjUx4NUcEqEGAcYqD8VOnOC6ItwkrVE8/tA4smGpjzyp4Svhc6RodDp9IO5ghpyA==", + "requires": { + "isobject": "^3.0.0", + "log-utils": "^0.2.1" + } + }, "lolex": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", @@ -5202,6 +5830,11 @@ } } }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -6556,6 +7189,29 @@ } } }, + "relative": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/relative/-/relative-3.0.2.tgz", + "integrity": "sha1-Dc2OxUpdNaPBXhBFA9ZTdbWlNn8=", + "requires": { + "isobject": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -6565,6 +7221,26 @@ "es6-error": "^4.0.1" } }, + "remarkable": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.1.tgz", + "integrity": "sha1-qspJchALZqZCpjoQIcpLrBvjv/Y=", + "requires": { + "argparse": "~0.1.15", + "autolinker": "~0.15.0" + }, + "dependencies": { + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", + "requires": { + "underscore": "~1.7.0", + "underscore.string": "~2.4.0" + } + } + } + }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -6748,6 +7424,11 @@ "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=", "dev": true }, + "self-closing-tags": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/self-closing-tags/-/self-closing-tags-1.0.1.tgz", + "integrity": "sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA==" + }, "semver": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", @@ -6797,6 +7478,14 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "requires": { + "to-object-path": "^0.3.0" + } + }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", @@ -8153,6 +8842,11 @@ "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", "dev": true }, + "striptags": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.1.1.tgz", + "integrity": "sha1-yMPn/db7S7OjKjt1LltePjgJPr0=" + }, "subarg": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", @@ -8168,6 +8862,11 @@ } } }, + "success-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz", + "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc=" + }, "superagent": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", @@ -8429,6 +9128,11 @@ "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", "dev": true }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, "timers-browserify": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", @@ -8455,6 +9159,11 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, + "to-gfm-code-block": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-gfm-code-block/-/to-gfm-code-block-0.1.1.tgz", + "integrity": "sha1-JdBFpfrlUxielje1kJANpzLYqoI=" + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -8588,6 +9297,24 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typeof-article": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/typeof-article/-/typeof-article-0.1.1.tgz", + "integrity": "sha1-nwfnM8P7tkb/qeYcCN66zUYOBq8=", + "requires": { + "kind-of": "^3.1.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "uglify-js": { "version": "3.4.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", @@ -8655,6 +9382,16 @@ "debug": "^2.2.0" } }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + }, + "underscore.string": { + "version": "2.4.0", + "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=" + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -8851,6 +9588,11 @@ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" }, + "warning-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/warning-symbol/-/warning-symbol-0.1.0.tgz", + "integrity": "sha1-uzHdEbeg+dZ6su2V9Fe2WCW7rSE=" + }, "webid": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/webid/-/webid-0.3.11.tgz", @@ -9062,6 +9804,11 @@ "dev": true } } + }, + "year": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/year/-/year-0.2.1.tgz", + "integrity": "sha1-QIOuUgoxiyPshgN/MADLiSvfm7A=" } } } diff --git a/test/integration/account-creation-oidc-test.js b/test/integration/account-creation-oidc-test.js index ed0d08846..fa757d2c2 100644 --- a/test/integration/account-creation-oidc-test.js +++ b/test/integration/account-creation-oidc-test.js @@ -8,15 +8,17 @@ const path = require('path') const fs = require('fs-extra') describe('AccountManager (OIDC account creation tests)', function () { - var serverUri = 'https://localhost:3457' - var host = 'localhost:3457' - var ldpHttpsServer - let rootPath = path.join(__dirname, '../resources/accounts/') - let configPath = path.join(__dirname, '../resources/config') - let dbPath = path.join(__dirname, '../resources/accounts/db') + const port = 3457 + const serverUri = `https://localhost:${port}` + const host = `localhost:${port}` + const root = path.join(__dirname, '../resources/accounts/') + const configPath = path.join(__dirname, '../resources/config') + const dbPath = path.join(__dirname, '../resources/accounts/db') + + let ldpHttpsServer var ldp = ldnode.createServer({ - root: rootPath, + root, configPath, sslKey: path.join(__dirname, '../keys/key.pem'), sslCert: path.join(__dirname, '../keys/cert.pem'), @@ -25,19 +27,20 @@ describe('AccountManager (OIDC account creation tests)', function () { multiuser: true, strictOrigin: true, dbPath, - serverUri + serverUri, + enforceToc: true }) before(checkDnsSettings) before(function (done) { - ldpHttpsServer = ldp.listen(3457, done) + ldpHttpsServer = ldp.listen(port, done) }) after(function () { if (ldpHttpsServer) ldpHttpsServer.close() fs.removeSync(path.join(dbPath, 'oidc/users/users')) - cleanDir(path.join(rootPath, 'localhost')) + cleanDir(path.join(root, 'localhost')) }) var server = supertest(serverUri) @@ -93,14 +96,14 @@ describe('AccountManager (OIDC account creation tests)', function () { it('should not create a WebID if it already exists', function (done) { var subdomain = supertest('https://nicola.' + host) subdomain.post('/api/accounts/new') - .send('username=nicola&password=12345') + .send('username=nicola&password=12345&acceptToc=true') .expect(302) .end((err, res) => { if (err) { return done(err) } subdomain.post('/api/accounts/new') - .send('username=nicola&password=12345') + .send('username=nicola&password=12345&acceptToc=true') .expect(400) .end((err) => { done(err) @@ -108,10 +111,17 @@ 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) + subdomain.post('/api/accounts/new') + .send('username=nicola&password=12345&acceptToc=false') + .expect(400, done) + }) + it('should create the default folders', function (done) { var subdomain = supertest('https://nicola.' + host) subdomain.post('/api/accounts/new') - .send('username=nicola&password=12345') + .send('username=nicola&password=12345&acceptToc=true') .expect(302) .end(function (err) { if (err) { @@ -119,19 +129,19 @@ describe('AccountManager (OIDC account creation tests)', function () { } var domain = host.split(':')[0] var card = read(path.join('accounts/nicola.' + domain, - 'profile/card')) + 'profile/card')) var cardAcl = read(path.join('accounts/nicola.' + domain, - 'profile/card.acl')) + 'profile/card.acl')) var prefs = read(path.join('accounts/nicola.' + domain, - 'settings/prefs.ttl')) + 'settings/prefs.ttl')) var inboxAcl = read(path.join('accounts/nicola.' + domain, - 'inbox/.acl')) + 'inbox/.acl')) var rootMeta = read(path.join('accounts/nicola.' + domain, '.meta')) var rootMetaAcl = read(path.join('accounts/nicola.' + domain, - '.meta.acl')) + '.meta.acl')) if (domain && card && cardAcl && prefs && inboxAcl && rootMeta && - rootMetaAcl) { + rootMetaAcl) { done() } else { done(new Error('failed to create default files')) @@ -142,7 +152,7 @@ describe('AccountManager (OIDC account creation tests)', function () { it('should link WebID to the root account', function (done) { var subdomain = supertest('https://nicola.' + host) subdomain.post('/api/accounts/new') - .send('username=nicola&password=12345') + .send('username=nicola&password=12345&acceptToc=true') .expect(302) .end(function (err) { if (err) { @@ -236,3 +246,46 @@ describe('Single User signup page', () => { .end(done) }) }) + +describe('Signup page where Terms & Conditions are not being enforced', () => { + const port = 3457 + const host = `localhost:${port}` + const root = path.join(__dirname, '../resources/accounts/') + const configPath = path.join(__dirname, '../resources/config') + const dbPath = path.join(__dirname, '../resources/accounts/db') + const ldp = ldnode.createServer({ + port, + root, + configPath, + sslKey: path.join(__dirname, '../keys/key.pem'), + sslCert: path.join(__dirname, '../keys/cert.pem'), + auth: 'oidc', + webid: true, + multiuser: true, + strictOrigin: true, + enforceToc: false + }) + let ldpHttpsServer + + before(function (done) { + ldpHttpsServer = ldp.listen(port, done) + }) + + after(function () { + if (ldpHttpsServer) ldpHttpsServer.close() + fs.removeSync(path.join(dbPath, 'oidc/users/users')) + cleanDir(path.join(root, 'localhost')) + rm('accounts/nicola.localhost') + }) + + beforeEach(function () { + rm('accounts/nicola.localhost') + }) + + it('should not enforce T&C upon creating account', function (done) { + var subdomain = supertest('https://nicola.' + host) + subdomain.post('/api/accounts/new') + .send('username=nicola&password=12345') + .expect(302, done) + }) +}) From 6f0fd7b126fa91157fe089edb38c8896d688f57e Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 31 Oct 2018 15:51:14 +0100 Subject: [PATCH 12/21] A little cleanup --- lib/requests/create-account-request.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/requests/create-account-request.js b/lib/requests/create-account-request.js index 1a5a5ae1a..db89f609e 100644 --- a/lib/requests/create-account-request.js +++ b/lib/requests/create-account-request.js @@ -283,7 +283,6 @@ class CreateOidcAccountRequest extends CreateAccountRequest { throw error } - // console.log(this.enforceToc, this.acceptToc) if (this.enforceToc && !this.acceptToc) { error = new Error('Accepting Terms & Conditions are required for this service') error.statusCode = 400 From 1235e3f3add6d008bcbe82a2ad861f76b2e7c94e Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Mon, 5 Nov 2018 14:31:11 +0100 Subject: [PATCH 13/21] Fixed minor nits --- default-views/account/register-form.hbs | 2 +- lib/requests/auth-request.js | 2 +- lib/requests/create-account-request.js | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/default-views/account/register-form.hbs b/default-views/account/register-form.hbs index 93e7d98a1..721a46334 100644 --- a/default-views/account/register-form.hbs +++ b/default-views/account/register-form.hbs @@ -75,7 +75,7 @@
{{/if}} diff --git a/lib/requests/auth-request.js b/lib/requests/auth-request.js index 7769fc8f7..deb9d9bc0 100644 --- a/lib/requests/auth-request.js +++ b/lib/requests/auth-request.js @@ -88,7 +88,7 @@ class AuthRequest { let authQueryParams = AuthRequest.extractAuthParams(req) let returnToUrl = AuthRequest.parseParameter(req, 'returnToUrl') - const acceptToc = AuthRequest.parseParameter(req, 'acceptToc') + const acceptToc = AuthRequest.parseParameter(req, 'acceptToc') === 'true' let options = { response: res, diff --git a/lib/requests/create-account-request.js b/lib/requests/create-account-request.js index db89f609e..d8f493b88 100644 --- a/lib/requests/create-account-request.js +++ b/lib/requests/create-account-request.js @@ -36,7 +36,7 @@ class CreateAccountRequest extends AuthRequest { this.username = options.username this.userAccount = options.userAccount - this.acceptToc = options.acceptToc === 'true' + this.acceptToc = options.acceptToc } /** @@ -284,7 +284,7 @@ class CreateOidcAccountRequest extends CreateAccountRequest { } if (this.enforceToc && !this.acceptToc) { - error = new Error('Accepting Terms & Conditions are required for this service') + error = new Error('Accepting Terms & Conditions is required for this service') error.statusCode = 400 throw error } @@ -352,7 +352,7 @@ class CreateTlsAccountRequest extends CreateAccountRequest { } if (this.enforceToc && !this.acceptToc) { - error = new Error('Accepting Terms & Conditions are required for this service') + error = new Error('Accepting Terms & Conditions is required for this service') error.statusCode = 400 throw error } From d7475ff955075928703542a2cfa4c40cbe0e0a94 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Mon, 5 Nov 2018 15:43:36 +0100 Subject: [PATCH 14/21] Just added properties to config.json-default To make it easier for POD-providers to update their own config.json files --- config.json-default | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config.json-default b/config.json-default index 8c6d3ddda..db1176248 100644 --- a/config.json-default +++ b/config.json-default @@ -14,5 +14,7 @@ "name": "", "description": "", "logo": "" - } + }, + "enforceToc": true, + "tocUri": "https://your-toc" } From 57cfd1821b180b38c71aeeab5a598a558413c51f Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 24 Oct 2018 08:13:28 +0200 Subject: [PATCH 15/21] Adding options to handle T&C --- bin/lib/options.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/bin/lib/options.js b/bin/lib/options.js index 4efbf07d2..245225cba 100644 --- a/bin/lib/options.js +++ b/bin/lib/options.js @@ -334,6 +334,21 @@ module.exports = [ name: 'server-logo', help: 'A logo that represents you, your brand, or your server (not required)', prompt: true + }, + { + name: 'enforceToc', + help: 'Do you want to enforce Terms & Conditions for your service?', + flag: true, + prompt: true, + default: true, + when: answers => answers.multiuser + }, + { + name: 'tocUri', + help: 'URI to your Terms & Conditions', + prompt: true, + validate: validUri, + when: answers => answers.enforceToc } ] From 6d6fe00aac2e1bd06e3cec3dc9429099597f2c56 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 24 Oct 2018 09:13:11 +0200 Subject: [PATCH 16/21] Added checkbox to register-form Also added handlebar-helpers --- default-views/account/register-form.hbs | 9 +++++++++ lib/create-app.js | 4 +++- lib/requests/auth-request.js | 4 ++++ lib/requests/create-account-request.js | 21 ++++++++++++++------- package.json | 1 + 5 files changed, 31 insertions(+), 8 deletions(-) diff --git a/default-views/account/register-form.hbs b/default-views/account/register-form.hbs index 12166f888..93e7d98a1 100644 --- a/default-views/account/register-form.hbs +++ b/default-views/account/register-form.hbs @@ -71,6 +71,15 @@ + {{#if (and enforceToc tocUri)}} +
+ +
+ {{/if}} + diff --git a/lib/create-app.js b/lib/create-app.js index c8074395b..a0db761d4 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -3,6 +3,7 @@ module.exports = createApp const express = require('express') const session = require('express-session') const handlebars = require('express-handlebars') +const handlebarsHelpers = require('handlebars-helpers') const uuid = require('uuid') const cors = require('cors') const LDP = require('./ldp') @@ -163,7 +164,8 @@ function initViews (app, configPath) { app.set('views', viewsPath) app.engine('.hbs', handlebars({ extname: '.hbs', - partialsDir: viewsPath + partialsDir: viewsPath, + helpers: handlebarsHelpers() })) app.set('view engine', '.hbs') } diff --git a/lib/requests/auth-request.js b/lib/requests/auth-request.js index cb8a532de..7f60c601b 100644 --- a/lib/requests/auth-request.js +++ b/lib/requests/auth-request.js @@ -25,6 +25,8 @@ class AuthRequest { * @param [options.returnToUrl] {string} * @param [options.authQueryParams] {Object} Key/value hashmap of parsed query * parameters that will be passed through to the /authorize endpoint. + * @param [options.enforceToc] {boolean} Whether or not to enforce the service provider's T&C + * @param [options.tocUri] {string} URI to the service provider's T&C */ constructor (options) { this.response = options.response @@ -34,6 +36,8 @@ class AuthRequest { this.returnToUrl = options.returnToUrl this.authQueryParams = options.authQueryParams || {} this.localAuth = options.localAuth + this.enforceToc = options.enforceToc + this.tocUri = options.tocUri } /** diff --git a/lib/requests/create-account-request.js b/lib/requests/create-account-request.js index 63e8a8e2b..4e4bb0118 100644 --- a/lib/requests/create-account-request.js +++ b/lib/requests/create-account-request.js @@ -27,6 +27,8 @@ class CreateAccountRequest extends AuthRequest { * @param [options.response] {HttpResponse} * @param [options.returnToUrl] {string} If present, redirect the agent to * this url on successful account creation + * @param [options.enforceToc] {boolean} Whether or not to enforce the service provider's T&C + * @param [options.tocUri] {string} URI to the service provider's T&C */ constructor (options) { super(options) @@ -62,6 +64,10 @@ class CreateAccountRequest extends AuthRequest { options.userAccount = accountManager.userAccountFrom(body) } + const config = require('../../config') + options.enforceToc = config.enforceToc + options.tocUri = config.tocUri + switch (authMethod) { case 'oidc': options.password = body.password @@ -97,13 +103,14 @@ class CreateAccountRequest extends AuthRequest { renderForm (error) { let authMethod = this.accountManager.authMethod - let params = Object.assign({}, this.authQueryParams, - { - returnToUrl: this.returnToUrl, - loginUrl: this.loginUrl(), - registerDisabled: authMethod === 'tls', - multiuser: this.accountManager.multiuser - }) + let params = Object.assign({}, this.authQueryParams, { + enforceToc: this.enforceToc, + loginUrl: this.loginUrl(), + multiuser: this.accountManager.multiuser, + registerDisabled: authMethod === 'tls', + returnToUrl: this.returnToUrl, + tocUri: this.tocUri + }) if (error) { params.error = error.message diff --git a/package.json b/package.json index 5f7bc16c3..1116f4d0e 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "glob": "^7.1.1", "global-tunnel-ng": "^2.1.0", "handlebars": "^4.0.6", + "handlebars-helpers": "^0.10.0", "http-proxy-middleware": "^0.18.0", "inquirer": "^1.0.2", "ip-range-check": "0.0.2", From 25260474eab50f46244fb3065d4a400f1ffbdd2a Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 31 Oct 2018 15:48:04 +0100 Subject: [PATCH 17/21] Conditionally enforcing acceptToc when creating account --- lib/create-app.js | 2 + lib/requests/auth-request.js | 4 +- lib/requests/create-account-request.js | 38 +- package-lock.json | 749 +++++++++++++++++- .../integration/account-creation-oidc-test.js | 93 ++- 5 files changed, 854 insertions(+), 32 deletions(-) diff --git a/lib/create-app.js b/lib/create-app.js index a0db761d4..e7d7ca4a8 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -124,6 +124,8 @@ function initAppLocals (app, argv, ldp) { app.locals.authMethod = argv.auth app.locals.localAuth = argv.localAuth app.locals.tokenService = new TokenService() + app.locals.enforceToc = argv.enforceToc + app.locals.tocUri = argv.tocUri if (argv.email && argv.email.host) { app.locals.emailService = new EmailService(argv.templates.email, argv.email) diff --git a/lib/requests/auth-request.js b/lib/requests/auth-request.js index 7f60c601b..7769fc8f7 100644 --- a/lib/requests/auth-request.js +++ b/lib/requests/auth-request.js @@ -88,6 +88,7 @@ class AuthRequest { let authQueryParams = AuthRequest.extractAuthParams(req) let returnToUrl = AuthRequest.parseParameter(req, 'returnToUrl') + const acceptToc = AuthRequest.parseParameter(req, 'acceptToc') let options = { response: res, @@ -96,7 +97,8 @@ class AuthRequest { accountManager, returnToUrl, authQueryParams, - localAuth + localAuth, + acceptToc } return options diff --git a/lib/requests/create-account-request.js b/lib/requests/create-account-request.js index 4e4bb0118..1a5a5ae1a 100644 --- a/lib/requests/create-account-request.js +++ b/lib/requests/create-account-request.js @@ -29,12 +29,14 @@ class CreateAccountRequest extends AuthRequest { * this url on successful account creation * @param [options.enforceToc] {boolean} Whether or not to enforce the service provider's T&C * @param [options.tocUri] {string} URI to the service provider's T&C + * @param [options.acceptToc] {boolean} Whether or not user has accepted T&C */ constructor (options) { super(options) this.username = options.username this.userAccount = options.userAccount + this.acceptToc = options.acceptToc === 'true' } /** @@ -48,7 +50,7 @@ class CreateAccountRequest extends AuthRequest { * `userAccountFrom()`), or it encounters an unsupported authentication * scheme. * - * @return {CreateAccountRequest|CreateTlsAccountRequest} + * @return {CreateOidcAccountRequest|CreateTlsAccountRequest} */ static fromParams (req, res) { let options = AuthRequest.requestOptions(req, res) @@ -64,9 +66,8 @@ class CreateAccountRequest extends AuthRequest { options.userAccount = accountManager.userAccountFrom(body) } - const config = require('../../config') - options.enforceToc = config.enforceToc - options.tocUri = config.tocUri + options.enforceToc = locals.enforceToc + options.tocUri = locals.tocUri switch (authMethod) { case 'oidc': @@ -80,13 +81,15 @@ class CreateAccountRequest extends AuthRequest { } } - static post (req, res) { + static async post (req, res) { let request = CreateAccountRequest.fromParams(req, res) - return Promise.resolve() - .then(() => request.validate()) - .then(() => request.createAccount()) - .catch(error => request.error(error)) + try { + request.validate() + await request.createAccount() + } catch (error) { + request.error(error) + } } static get (req, res) { @@ -251,6 +254,7 @@ class CreateOidcAccountRequest extends CreateAccountRequest { * * @param [options={}] {Object} See `CreateAccountRequest` constructor docstring * @param [options.password] {string} Password, as entered by the user at signup + * @param [options.acceptToc] {boolean} Whether or not user has accepted T&C */ constructor (options) { super(options) @@ -278,6 +282,13 @@ class CreateOidcAccountRequest extends CreateAccountRequest { error.statusCode = 400 throw error } + + // console.log(this.enforceToc, this.acceptToc) + if (this.enforceToc && !this.acceptToc) { + error = new Error('Accepting Terms & Conditions are required for this service') + error.statusCode = 400 + throw error + } } /** @@ -317,6 +328,7 @@ class CreateTlsAccountRequest extends CreateAccountRequest { * * @param [options={}] {Object} See `CreateAccountRequest` constructor docstring * @param [options.spkac] {string} + * @param [options.acceptToc] {boolean} Whether or not user has accepted T&C */ constructor (options) { super(options) @@ -326,7 +338,7 @@ class CreateTlsAccountRequest extends CreateAccountRequest { } /** - * Validates the Login request (makes sure required parameters are present), + * Validates the Signup request (makes sure required parameters are present), * and throws an error if not. * * @throws {Error} If missing required params @@ -339,6 +351,12 @@ class CreateTlsAccountRequest extends CreateAccountRequest { error.statusCode = 400 throw error } + + if (this.enforceToc && !this.acceptToc) { + error = new Error('Accepting Terms & Conditions are required for this service') + error.statusCode = 400 + throw error + } } /** diff --git a/package-lock.json b/package-lock.json index e1def6b06..2e7cedf0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -437,21 +437,278 @@ "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", "dev": true }, + "ansi-bgblack": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz", + "integrity": "sha1-poulAHiHcBtqr74/oNrf36juPKI=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgblue": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz", + "integrity": "sha1-Z73ATtybm1J4lp2hlt6j11yMNhM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgcyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz", + "integrity": "sha1-WEiUJWAL3p9VBwaN2Wnr/bUP52g=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bggreen": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz", + "integrity": "sha1-TjGRJIUplD9DIelr8THRwTgWr0k=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgmagenta": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz", + "integrity": "sha1-myhDLAduqpmUGGcqPvvhk5HCx6E=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgred": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgred/-/ansi-bgred-0.1.1.tgz", + "integrity": "sha1-p2+Sg4OCukMpCmwXeEJPmE1vEEE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgwhite": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz", + "integrity": "sha1-ZQRlE3elim7OzQMxmU5IAljhG6g=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgyellow": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz", + "integrity": "sha1-w/4usIzUdmSAKeaHTRWgs49h1E8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-black": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-black/-/ansi-black-0.1.1.tgz", + "integrity": "sha1-9hheiJNgslRaHsUMC/Bj/EMDJFM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-blue": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-blue/-/ansi-blue-0.1.1.tgz", + "integrity": "sha1-FbgEmQ6S/JyoxUds6PaZd3wh7b8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bold": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bold/-/ansi-bold-0.1.1.tgz", + "integrity": "sha1-PmOVCvWswq4uZw5vZ96xFdGl9QU=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-colors": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-0.2.0.tgz", + "integrity": "sha1-csMd4qDZoszQysMMyYI+6y9kNLU=", + "requires": { + "ansi-bgblack": "^0.1.1", + "ansi-bgblue": "^0.1.1", + "ansi-bgcyan": "^0.1.1", + "ansi-bggreen": "^0.1.1", + "ansi-bgmagenta": "^0.1.1", + "ansi-bgred": "^0.1.1", + "ansi-bgwhite": "^0.1.1", + "ansi-bgyellow": "^0.1.1", + "ansi-black": "^0.1.1", + "ansi-blue": "^0.1.1", + "ansi-bold": "^0.1.1", + "ansi-cyan": "^0.1.1", + "ansi-dim": "^0.1.1", + "ansi-gray": "^0.1.1", + "ansi-green": "^0.1.1", + "ansi-grey": "^0.1.1", + "ansi-hidden": "^0.1.1", + "ansi-inverse": "^0.1.1", + "ansi-italic": "^0.1.1", + "ansi-magenta": "^0.1.1", + "ansi-red": "^0.1.1", + "ansi-reset": "^0.1.1", + "ansi-strikethrough": "^0.1.1", + "ansi-underline": "^0.1.1", + "ansi-white": "^0.1.1", + "ansi-yellow": "^0.1.1", + "lazy-cache": "^2.0.1" + }, + "dependencies": { + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-dim": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-dim/-/ansi-dim-0.1.1.tgz", + "integrity": "sha1-QN5MYDqoCG2Oeoa4/5mNXDbu/Ww=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-escapes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-green": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz", + "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-grey": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-grey/-/ansi-grey-0.1.1.tgz", + "integrity": "sha1-WdmLasK6GfilF5jphT+6eDOaM8E=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-hidden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-hidden/-/ansi-hidden-0.1.1.tgz", + "integrity": "sha1-7WpMSY0rt8uyidvyqNHcyFZ/rg8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-inverse": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-inverse/-/ansi-inverse-0.1.1.tgz", + "integrity": "sha1-tq9Fgm/oJr+1KKbHmIV5Q1XM0mk=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-italic": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-italic/-/ansi-italic-0.1.1.tgz", + "integrity": "sha1-EEdDRj9iXBQqA2c5z4XtpoiYbyM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-magenta": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-magenta/-/ansi-magenta-0.1.1.tgz", + "integrity": "sha1-BjtboW+z8j4c/aKwfAqJ3hHkMK4=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, + "ansi-reset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-reset/-/ansi-reset-0.1.1.tgz", + "integrity": "sha1-5+cSksPH3c1NYu9KbHwFmAkRw7c=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-strikethrough": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz", + "integrity": "sha1-2Eh3FAss/wfRyT685pkE9oiF5Wg=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, + "ansi-underline": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-underline/-/ansi-underline-0.1.1.tgz", + "integrity": "sha1-38kg9Ml7WXfqFi34/7mIMIqqcaQ=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-white": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-white/-/ansi-white-0.1.1.tgz", + "integrity": "sha1-nHe3wZPF7pkuYBHTbsTJIbRXiUQ=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, + "ansi-yellow": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-yellow/-/ansi-yellow-0.1.1.tgz", + "integrity": "sha1-y5NW8vRscy8OMZnmEClVp32oPB0=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansicolors": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", @@ -517,6 +774,23 @@ "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" }, + "array-sort": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-0.1.4.tgz", + "integrity": "sha512-BNcM+RXxndPxiZ2rd76k6nyQLRZr2/B/sdi8pQ+Joafr5AH279L40dfokSUTp8O+AaqYjXWhblBWa2st2nc4fQ==", + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -628,6 +902,11 @@ "resolved": "https://registry.npmjs.org/auth-header/-/auth-header-1.0.0.tgz", "integrity": "sha512-CPPazq09YVDUNNVWo4oSPTQmtwIzHusZhQmahCKvIsk0/xH6U3QsMAv3sM+7+Q0B1K2KJ/Q38OND317uXs4NHA==" }, + "autolinker": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", + "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=" + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -2157,6 +2436,43 @@ "elliptic": "^6.0.0" } }, + "create-frame": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/create-frame/-/create-frame-1.0.0.tgz", + "integrity": "sha1-i5XyaR4ySbYIBEPjPQutn49pdao=", + "requires": { + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "isobject": "^3.0.0", + "lazy-cache": "^2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, "create-hash": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -2244,6 +2560,24 @@ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" }, + "date.js": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/date.js/-/date.js-0.3.3.tgz", + "integrity": "sha512-HgigOS3h3k6HnW011nAb43c5xx5rBXk8P2v/WIT9Zv4koIaVXiH2BURguI78VVp+5Qc076T7OR378JViCnZtBw==", + "requires": { + "debug": "~3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2297,6 +2631,21 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, "default-require-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", @@ -2609,6 +2958,11 @@ "iconv-lite": "~0.4.13" } }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2618,6 +2972,11 @@ "is-arrayish": "^0.2.1" } }, + "error-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/error-symbol/-/error-symbol-0.1.0.tgz", + "integrity": "sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y=" + }, "es5-ext": { "version": "0.10.46", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", @@ -3269,6 +3628,21 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, + "falsey": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/falsey/-/falsey-0.3.2.tgz", + "integrity": "sha512-lxEuefF5MBIVDmE6XeqCdM4BWk1+vYmGZtkbKZ/VFcg6uBBw6fXNEbWmxCjDdQlFc9hy450nkiWwM3VAW6G1qg==", + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", @@ -3426,7 +3800,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, "requires": { "for-in": "^1.0.1" } @@ -3537,6 +3910,11 @@ } } }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=" + }, "fs-extra": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", @@ -3601,6 +3979,38 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, + "get-object": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/get-object/-/get-object-0.2.0.tgz", + "integrity": "sha1-2S/31RkMZFMM2gVD2sY6PUf+jAw=", + "requires": { + "is-number": "^2.0.2", + "isobject": "^0.2.0" + }, + "dependencies": { + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-0.2.0.tgz", + "integrity": "sha1-o0MhkvObkQtfAsyYlIeDbscKqF4=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "get-stdin": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", @@ -3769,6 +4179,108 @@ } } }, + "handlebars-helper-create-frame": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/handlebars-helper-create-frame/-/handlebars-helper-create-frame-0.1.0.tgz", + "integrity": "sha1-iqUdEK62QI/MZgXUDXc1YohIegM=", + "requires": { + "create-frame": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "handlebars-helpers": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/handlebars-helpers/-/handlebars-helpers-0.10.0.tgz", + "integrity": "sha512-QiyhQz58u/DbuV41VnfpE0nhy6YCH4vB514ajysV8SoKmP+DxU+pR+fahVyNECHj+jiwEN2VrvxD/34/yHaLUg==", + "requires": { + "arr-flatten": "^1.1.0", + "array-sort": "^0.1.4", + "create-frame": "^1.0.0", + "define-property": "^1.0.0", + "falsey": "^0.3.2", + "for-in": "^1.0.2", + "for-own": "^1.0.0", + "get-object": "^0.2.0", + "get-value": "^2.0.6", + "handlebars": "^4.0.11", + "handlebars-helper-create-frame": "^0.1.0", + "handlebars-utils": "^1.0.6", + "has-value": "^1.0.0", + "helper-date": "^1.0.1", + "helper-markdown": "^1.0.0", + "helper-md": "^0.2.2", + "html-tag": "^2.0.0", + "is-even": "^1.0.0", + "is-glob": "^4.0.0", + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "lazy-cache": "^2.0.2", + "logging-helpers": "^1.0.0", + "micromatch": "^3.1.4", + "relative": "^3.0.2", + "striptags": "^3.1.0", + "to-gfm-code-block": "^0.1.1", + "year": "^0.2.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "handlebars-utils": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/handlebars-utils/-/handlebars-utils-1.0.6.tgz", + "integrity": "sha512-d5mmoQXdeEqSKMtQQZ9WkiUcO1E3tPbWxluCK9hVgIDPzQa9WsKo3Lbe/sGflTe7TomHEeZaOgwIkyIr1kfzkw==", + "requires": { + "kind-of": "^6.0.0", + "typeof-article": "^0.1.1" + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -3879,6 +4391,52 @@ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, + "helper-date": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/helper-date/-/helper-date-1.0.1.tgz", + "integrity": "sha512-wU3VOwwTJvGr/w5rZr3cprPHO+hIhlblTJHD6aFBrKLuNbf4lAmkawd2iK3c6NbJEvY7HAmDpqjOFSI5/+Ey2w==", + "requires": { + "date.js": "^0.3.1", + "handlebars-utils": "^1.0.4", + "moment": "^2.18.1" + } + }, + "helper-markdown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/helper-markdown/-/helper-markdown-1.0.0.tgz", + "integrity": "sha512-AnDqMS4ejkQK0MXze7pA9TM3pu01ZY+XXsES6gEE0RmCGk5/NIfvTn0NmItfyDOjRAzyo9z6X7YHbHX4PzIvOA==", + "requires": { + "handlebars-utils": "^1.0.2", + "highlight.js": "^9.12.0", + "remarkable": "^1.7.1" + } + }, + "helper-md": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/helper-md/-/helper-md-0.2.2.tgz", + "integrity": "sha1-wfWdflW7riM2L9ig6XFgeuxp1B8=", + "requires": { + "ent": "^2.2.0", + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "remarkable": "^1.6.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "highlight.js": { + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.13.1.tgz", + "integrity": "sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A==" + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -3905,6 +4463,15 @@ "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, + "html-tag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tag/-/html-tag-2.0.0.tgz", + "integrity": "sha512-XxzooSo6oBoxBEUazgjdXj7VwTn/iSTSZzTYKzYY6I916tkaYzypHxy+pbVU1h+0UQ9JlVf5XkNQyxOAiiQO1g==", + "requires": { + "is-self-closing": "^1.0.1", + "kind-of": "^6.0.0" + } + }, "htmlescape": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", @@ -4045,6 +4612,11 @@ "wrappy": "1" } }, + "info-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/info-symbol/-/info-symbol-0.1.0.tgz", + "integrity": "sha1-J4QdcoZ920JCzWEtecEGM4gcang=" + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -4223,6 +4795,14 @@ } } }, + "is-even": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-even/-/is-even-1.0.0.tgz", + "integrity": "sha1-drUFX7rY0pSoa2qUkBXhyXtxfAY=", + "requires": { + "is-odd": "^0.1.2" + } + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -4300,6 +4880,14 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, + "is-odd": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-0.1.2.tgz", + "integrity": "sha1-vFc7XONx7yqtbm9JeZtyvvE5eKc=", + "requires": { + "is-number": "^3.0.0" + } + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -4349,6 +4937,14 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, + "is-self-closing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-self-closing/-/is-self-closing-1.0.1.tgz", + "integrity": "sha512-E+60FomW7Blv5GXTlYee2KDrnG6srxF7Xt1SjrhWUGUEsTFIqY/nq2y3DaftCsgUMdh89V07IVfhY9KIJhLezg==", + "requires": { + "self-closing-tags": "^1.0.1" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -4843,6 +5439,38 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, + "log-ok": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz", + "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=", + "requires": { + "ansi-green": "^0.1.1", + "success-symbol": "^0.1.0" + } + }, + "log-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.2.1.tgz", + "integrity": "sha1-pMIXoN2aUFFdm5ICBgkas9TgMc8=", + "requires": { + "ansi-colors": "^0.2.0", + "error-symbol": "^0.1.0", + "info-symbol": "^0.1.0", + "log-ok": "^0.1.1", + "success-symbol": "^0.1.0", + "time-stamp": "^1.0.1", + "warning-symbol": "^0.1.0" + } + }, + "logging-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/logging-helpers/-/logging-helpers-1.0.0.tgz", + "integrity": "sha512-qyIh2goLt1sOgQQrrIWuwkRjUx4NUcEqEGAcYqD8VOnOC6ItwkrVE8/tA4smGpjzyp4Svhc6RodDp9IO5ghpyA==", + "requires": { + "isobject": "^3.0.0", + "log-utils": "^0.2.1" + } + }, "lolex": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", @@ -5202,6 +5830,11 @@ } } }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -6556,6 +7189,29 @@ } } }, + "relative": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/relative/-/relative-3.0.2.tgz", + "integrity": "sha1-Dc2OxUpdNaPBXhBFA9ZTdbWlNn8=", + "requires": { + "isobject": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -6565,6 +7221,26 @@ "es6-error": "^4.0.1" } }, + "remarkable": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.1.tgz", + "integrity": "sha1-qspJchALZqZCpjoQIcpLrBvjv/Y=", + "requires": { + "argparse": "~0.1.15", + "autolinker": "~0.15.0" + }, + "dependencies": { + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", + "requires": { + "underscore": "~1.7.0", + "underscore.string": "~2.4.0" + } + } + } + }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -6748,6 +7424,11 @@ "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=", "dev": true }, + "self-closing-tags": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/self-closing-tags/-/self-closing-tags-1.0.1.tgz", + "integrity": "sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA==" + }, "semver": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", @@ -6797,6 +7478,14 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "requires": { + "to-object-path": "^0.3.0" + } + }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", @@ -8153,6 +8842,11 @@ "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", "dev": true }, + "striptags": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.1.1.tgz", + "integrity": "sha1-yMPn/db7S7OjKjt1LltePjgJPr0=" + }, "subarg": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", @@ -8168,6 +8862,11 @@ } } }, + "success-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz", + "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc=" + }, "superagent": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", @@ -8429,6 +9128,11 @@ "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", "dev": true }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, "timers-browserify": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", @@ -8455,6 +9159,11 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, + "to-gfm-code-block": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-gfm-code-block/-/to-gfm-code-block-0.1.1.tgz", + "integrity": "sha1-JdBFpfrlUxielje1kJANpzLYqoI=" + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -8588,6 +9297,24 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typeof-article": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/typeof-article/-/typeof-article-0.1.1.tgz", + "integrity": "sha1-nwfnM8P7tkb/qeYcCN66zUYOBq8=", + "requires": { + "kind-of": "^3.1.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "uglify-js": { "version": "3.4.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", @@ -8655,6 +9382,16 @@ "debug": "^2.2.0" } }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + }, + "underscore.string": { + "version": "2.4.0", + "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=" + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -8851,6 +9588,11 @@ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" }, + "warning-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/warning-symbol/-/warning-symbol-0.1.0.tgz", + "integrity": "sha1-uzHdEbeg+dZ6su2V9Fe2WCW7rSE=" + }, "webid": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/webid/-/webid-0.3.11.tgz", @@ -9062,6 +9804,11 @@ "dev": true } } + }, + "year": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/year/-/year-0.2.1.tgz", + "integrity": "sha1-QIOuUgoxiyPshgN/MADLiSvfm7A=" } } } diff --git a/test/integration/account-creation-oidc-test.js b/test/integration/account-creation-oidc-test.js index ed0d08846..fa757d2c2 100644 --- a/test/integration/account-creation-oidc-test.js +++ b/test/integration/account-creation-oidc-test.js @@ -8,15 +8,17 @@ const path = require('path') const fs = require('fs-extra') describe('AccountManager (OIDC account creation tests)', function () { - var serverUri = 'https://localhost:3457' - var host = 'localhost:3457' - var ldpHttpsServer - let rootPath = path.join(__dirname, '../resources/accounts/') - let configPath = path.join(__dirname, '../resources/config') - let dbPath = path.join(__dirname, '../resources/accounts/db') + const port = 3457 + const serverUri = `https://localhost:${port}` + const host = `localhost:${port}` + const root = path.join(__dirname, '../resources/accounts/') + const configPath = path.join(__dirname, '../resources/config') + const dbPath = path.join(__dirname, '../resources/accounts/db') + + let ldpHttpsServer var ldp = ldnode.createServer({ - root: rootPath, + root, configPath, sslKey: path.join(__dirname, '../keys/key.pem'), sslCert: path.join(__dirname, '../keys/cert.pem'), @@ -25,19 +27,20 @@ describe('AccountManager (OIDC account creation tests)', function () { multiuser: true, strictOrigin: true, dbPath, - serverUri + serverUri, + enforceToc: true }) before(checkDnsSettings) before(function (done) { - ldpHttpsServer = ldp.listen(3457, done) + ldpHttpsServer = ldp.listen(port, done) }) after(function () { if (ldpHttpsServer) ldpHttpsServer.close() fs.removeSync(path.join(dbPath, 'oidc/users/users')) - cleanDir(path.join(rootPath, 'localhost')) + cleanDir(path.join(root, 'localhost')) }) var server = supertest(serverUri) @@ -93,14 +96,14 @@ describe('AccountManager (OIDC account creation tests)', function () { it('should not create a WebID if it already exists', function (done) { var subdomain = supertest('https://nicola.' + host) subdomain.post('/api/accounts/new') - .send('username=nicola&password=12345') + .send('username=nicola&password=12345&acceptToc=true') .expect(302) .end((err, res) => { if (err) { return done(err) } subdomain.post('/api/accounts/new') - .send('username=nicola&password=12345') + .send('username=nicola&password=12345&acceptToc=true') .expect(400) .end((err) => { done(err) @@ -108,10 +111,17 @@ 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) + subdomain.post('/api/accounts/new') + .send('username=nicola&password=12345&acceptToc=false') + .expect(400, done) + }) + it('should create the default folders', function (done) { var subdomain = supertest('https://nicola.' + host) subdomain.post('/api/accounts/new') - .send('username=nicola&password=12345') + .send('username=nicola&password=12345&acceptToc=true') .expect(302) .end(function (err) { if (err) { @@ -119,19 +129,19 @@ describe('AccountManager (OIDC account creation tests)', function () { } var domain = host.split(':')[0] var card = read(path.join('accounts/nicola.' + domain, - 'profile/card')) + 'profile/card')) var cardAcl = read(path.join('accounts/nicola.' + domain, - 'profile/card.acl')) + 'profile/card.acl')) var prefs = read(path.join('accounts/nicola.' + domain, - 'settings/prefs.ttl')) + 'settings/prefs.ttl')) var inboxAcl = read(path.join('accounts/nicola.' + domain, - 'inbox/.acl')) + 'inbox/.acl')) var rootMeta = read(path.join('accounts/nicola.' + domain, '.meta')) var rootMetaAcl = read(path.join('accounts/nicola.' + domain, - '.meta.acl')) + '.meta.acl')) if (domain && card && cardAcl && prefs && inboxAcl && rootMeta && - rootMetaAcl) { + rootMetaAcl) { done() } else { done(new Error('failed to create default files')) @@ -142,7 +152,7 @@ describe('AccountManager (OIDC account creation tests)', function () { it('should link WebID to the root account', function (done) { var subdomain = supertest('https://nicola.' + host) subdomain.post('/api/accounts/new') - .send('username=nicola&password=12345') + .send('username=nicola&password=12345&acceptToc=true') .expect(302) .end(function (err) { if (err) { @@ -236,3 +246,46 @@ describe('Single User signup page', () => { .end(done) }) }) + +describe('Signup page where Terms & Conditions are not being enforced', () => { + const port = 3457 + const host = `localhost:${port}` + const root = path.join(__dirname, '../resources/accounts/') + const configPath = path.join(__dirname, '../resources/config') + const dbPath = path.join(__dirname, '../resources/accounts/db') + const ldp = ldnode.createServer({ + port, + root, + configPath, + sslKey: path.join(__dirname, '../keys/key.pem'), + sslCert: path.join(__dirname, '../keys/cert.pem'), + auth: 'oidc', + webid: true, + multiuser: true, + strictOrigin: true, + enforceToc: false + }) + let ldpHttpsServer + + before(function (done) { + ldpHttpsServer = ldp.listen(port, done) + }) + + after(function () { + if (ldpHttpsServer) ldpHttpsServer.close() + fs.removeSync(path.join(dbPath, 'oidc/users/users')) + cleanDir(path.join(root, 'localhost')) + rm('accounts/nicola.localhost') + }) + + beforeEach(function () { + rm('accounts/nicola.localhost') + }) + + it('should not enforce T&C upon creating account', function (done) { + var subdomain = supertest('https://nicola.' + host) + subdomain.post('/api/accounts/new') + .send('username=nicola&password=12345') + .expect(302, done) + }) +}) From 9c96aee3293ac75f5b6158779030173fe93da857 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Wed, 31 Oct 2018 15:51:14 +0100 Subject: [PATCH 18/21] A little cleanup --- lib/requests/create-account-request.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/requests/create-account-request.js b/lib/requests/create-account-request.js index 1a5a5ae1a..db89f609e 100644 --- a/lib/requests/create-account-request.js +++ b/lib/requests/create-account-request.js @@ -283,7 +283,6 @@ class CreateOidcAccountRequest extends CreateAccountRequest { throw error } - // console.log(this.enforceToc, this.acceptToc) if (this.enforceToc && !this.acceptToc) { error = new Error('Accepting Terms & Conditions are required for this service') error.statusCode = 400 From b18f0b86aa3412860a9e0124acbd240e4c12732d Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Mon, 5 Nov 2018 14:31:11 +0100 Subject: [PATCH 19/21] Fixed minor nits --- default-views/account/register-form.hbs | 2 +- lib/requests/auth-request.js | 2 +- lib/requests/create-account-request.js | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/default-views/account/register-form.hbs b/default-views/account/register-form.hbs index 93e7d98a1..721a46334 100644 --- a/default-views/account/register-form.hbs +++ b/default-views/account/register-form.hbs @@ -75,7 +75,7 @@
{{/if}} diff --git a/lib/requests/auth-request.js b/lib/requests/auth-request.js index 7769fc8f7..deb9d9bc0 100644 --- a/lib/requests/auth-request.js +++ b/lib/requests/auth-request.js @@ -88,7 +88,7 @@ class AuthRequest { let authQueryParams = AuthRequest.extractAuthParams(req) let returnToUrl = AuthRequest.parseParameter(req, 'returnToUrl') - const acceptToc = AuthRequest.parseParameter(req, 'acceptToc') + const acceptToc = AuthRequest.parseParameter(req, 'acceptToc') === 'true' let options = { response: res, diff --git a/lib/requests/create-account-request.js b/lib/requests/create-account-request.js index db89f609e..d8f493b88 100644 --- a/lib/requests/create-account-request.js +++ b/lib/requests/create-account-request.js @@ -36,7 +36,7 @@ class CreateAccountRequest extends AuthRequest { this.username = options.username this.userAccount = options.userAccount - this.acceptToc = options.acceptToc === 'true' + this.acceptToc = options.acceptToc } /** @@ -284,7 +284,7 @@ class CreateOidcAccountRequest extends CreateAccountRequest { } if (this.enforceToc && !this.acceptToc) { - error = new Error('Accepting Terms & Conditions are required for this service') + error = new Error('Accepting Terms & Conditions is required for this service') error.statusCode = 400 throw error } @@ -352,7 +352,7 @@ class CreateTlsAccountRequest extends CreateAccountRequest { } if (this.enforceToc && !this.acceptToc) { - error = new Error('Accepting Terms & Conditions are required for this service') + error = new Error('Accepting Terms & Conditions is required for this service') error.statusCode = 400 throw error } From 13d8ce12c920ba473caa71cfc0a1c7f1ca1ab79f Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Mon, 5 Nov 2018 15:43:36 +0100 Subject: [PATCH 20/21] Just added properties to config.json-default To make it easier for POD-providers to update their own config.json files --- config.json-default | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config.json-default b/config.json-default index 8c6d3ddda..db1176248 100644 --- a/config.json-default +++ b/config.json-default @@ -14,5 +14,7 @@ "name": "", "description": "", "logo": "" - } + }, + "enforceToc": true, + "tocUri": "https://your-toc" } From df438cc2b0d1166bab33418625028f3d0923ea05 Mon Sep 17 00:00:00 2001 From: Arne Hassel Date: Tue, 6 Nov 2018 14:14:54 +0100 Subject: [PATCH 21/21] Removed handlebars-helpers because of security vulnerability https://snyk.io/vuln/npm:underscore.string:20170908 --- default-views/account/register-form.hbs | 16 +- lib/create-app.js | 4 +- package-lock.json | 749 +----------------------- package.json | 1 - 4 files changed, 11 insertions(+), 759 deletions(-) diff --git a/default-views/account/register-form.hbs b/default-views/account/register-form.hbs index 721a46334..2bc5a2086 100644 --- a/default-views/account/register-form.hbs +++ b/default-views/account/register-form.hbs @@ -71,13 +71,15 @@ - {{#if (and enforceToc tocUri)}} -
- -
+ {{#if enforceToc}} + {{#if tocUri}} +
+ +
+ {{/if}} {{/if}} diff --git a/lib/create-app.js b/lib/create-app.js index e7d7ca4a8..db448d20b 100644 --- a/lib/create-app.js +++ b/lib/create-app.js @@ -3,7 +3,6 @@ module.exports = createApp const express = require('express') const session = require('express-session') const handlebars = require('express-handlebars') -const handlebarsHelpers = require('handlebars-helpers') const uuid = require('uuid') const cors = require('cors') const LDP = require('./ldp') @@ -166,8 +165,7 @@ function initViews (app, configPath) { app.set('views', viewsPath) app.engine('.hbs', handlebars({ extname: '.hbs', - partialsDir: viewsPath, - helpers: handlebarsHelpers() + partialsDir: viewsPath })) app.set('view engine', '.hbs') } diff --git a/package-lock.json b/package-lock.json index 2e7cedf0f..e1def6b06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -437,278 +437,21 @@ "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", "dev": true }, - "ansi-bgblack": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz", - "integrity": "sha1-poulAHiHcBtqr74/oNrf36juPKI=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgblue": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz", - "integrity": "sha1-Z73ATtybm1J4lp2hlt6j11yMNhM=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgcyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz", - "integrity": "sha1-WEiUJWAL3p9VBwaN2Wnr/bUP52g=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bggreen": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz", - "integrity": "sha1-TjGRJIUplD9DIelr8THRwTgWr0k=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgmagenta": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz", - "integrity": "sha1-myhDLAduqpmUGGcqPvvhk5HCx6E=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgred": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgred/-/ansi-bgred-0.1.1.tgz", - "integrity": "sha1-p2+Sg4OCukMpCmwXeEJPmE1vEEE=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgwhite": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz", - "integrity": "sha1-ZQRlE3elim7OzQMxmU5IAljhG6g=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bgyellow": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz", - "integrity": "sha1-w/4usIzUdmSAKeaHTRWgs49h1E8=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-black": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-black/-/ansi-black-0.1.1.tgz", - "integrity": "sha1-9hheiJNgslRaHsUMC/Bj/EMDJFM=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-blue": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-blue/-/ansi-blue-0.1.1.tgz", - "integrity": "sha1-FbgEmQ6S/JyoxUds6PaZd3wh7b8=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-bold": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-bold/-/ansi-bold-0.1.1.tgz", - "integrity": "sha1-PmOVCvWswq4uZw5vZ96xFdGl9QU=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-colors": { - "version": "0.2.0", - "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-0.2.0.tgz", - "integrity": "sha1-csMd4qDZoszQysMMyYI+6y9kNLU=", - "requires": { - "ansi-bgblack": "^0.1.1", - "ansi-bgblue": "^0.1.1", - "ansi-bgcyan": "^0.1.1", - "ansi-bggreen": "^0.1.1", - "ansi-bgmagenta": "^0.1.1", - "ansi-bgred": "^0.1.1", - "ansi-bgwhite": "^0.1.1", - "ansi-bgyellow": "^0.1.1", - "ansi-black": "^0.1.1", - "ansi-blue": "^0.1.1", - "ansi-bold": "^0.1.1", - "ansi-cyan": "^0.1.1", - "ansi-dim": "^0.1.1", - "ansi-gray": "^0.1.1", - "ansi-green": "^0.1.1", - "ansi-grey": "^0.1.1", - "ansi-hidden": "^0.1.1", - "ansi-inverse": "^0.1.1", - "ansi-italic": "^0.1.1", - "ansi-magenta": "^0.1.1", - "ansi-red": "^0.1.1", - "ansi-reset": "^0.1.1", - "ansi-strikethrough": "^0.1.1", - "ansi-underline": "^0.1.1", - "ansi-white": "^0.1.1", - "ansi-yellow": "^0.1.1", - "lazy-cache": "^2.0.1" - }, - "dependencies": { - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-dim": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-dim/-/ansi-dim-0.1.1.tgz", - "integrity": "sha1-QN5MYDqoCG2Oeoa4/5mNXDbu/Ww=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-escapes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-green": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz", - "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-grey": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-grey/-/ansi-grey-0.1.1.tgz", - "integrity": "sha1-WdmLasK6GfilF5jphT+6eDOaM8E=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-hidden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-hidden/-/ansi-hidden-0.1.1.tgz", - "integrity": "sha1-7WpMSY0rt8uyidvyqNHcyFZ/rg8=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-inverse": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-inverse/-/ansi-inverse-0.1.1.tgz", - "integrity": "sha1-tq9Fgm/oJr+1KKbHmIV5Q1XM0mk=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-italic": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-italic/-/ansi-italic-0.1.1.tgz", - "integrity": "sha1-EEdDRj9iXBQqA2c5z4XtpoiYbyM=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-magenta": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-magenta/-/ansi-magenta-0.1.1.tgz", - "integrity": "sha1-BjtboW+z8j4c/aKwfAqJ3hHkMK4=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, - "ansi-reset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-reset/-/ansi-reset-0.1.1.tgz", - "integrity": "sha1-5+cSksPH3c1NYu9KbHwFmAkRw7c=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-strikethrough": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz", - "integrity": "sha1-2Eh3FAss/wfRyT685pkE9oiF5Wg=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, - "ansi-underline": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-underline/-/ansi-underline-0.1.1.tgz", - "integrity": "sha1-38kg9Ml7WXfqFi34/7mIMIqqcaQ=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-white": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-white/-/ansi-white-0.1.1.tgz", - "integrity": "sha1-nHe3wZPF7pkuYBHTbsTJIbRXiUQ=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" - }, - "ansi-yellow": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-yellow/-/ansi-yellow-0.1.1.tgz", - "integrity": "sha1-y5NW8vRscy8OMZnmEClVp32oPB0=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansicolors": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", @@ -774,23 +517,6 @@ "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" }, - "array-sort": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-0.1.4.tgz", - "integrity": "sha512-BNcM+RXxndPxiZ2rd76k6nyQLRZr2/B/sdi8pQ+Joafr5AH279L40dfokSUTp8O+AaqYjXWhblBWa2st2nc4fQ==", - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -902,11 +628,6 @@ "resolved": "https://registry.npmjs.org/auth-header/-/auth-header-1.0.0.tgz", "integrity": "sha512-CPPazq09YVDUNNVWo4oSPTQmtwIzHusZhQmahCKvIsk0/xH6U3QsMAv3sM+7+Q0B1K2KJ/Q38OND317uXs4NHA==" }, - "autolinker": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", - "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=" - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -2436,43 +2157,6 @@ "elliptic": "^6.0.0" } }, - "create-frame": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/create-frame/-/create-frame-1.0.0.tgz", - "integrity": "sha1-i5XyaR4ySbYIBEPjPQutn49pdao=", - "requires": { - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "isobject": "^3.0.0", - "lazy-cache": "^2.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, "create-hash": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -2560,24 +2244,6 @@ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" }, - "date.js": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/date.js/-/date.js-0.3.3.tgz", - "integrity": "sha512-HgigOS3h3k6HnW011nAb43c5xx5rBXk8P2v/WIT9Zv4koIaVXiH2BURguI78VVp+5Qc076T7OR378JViCnZtBw==", - "requires": { - "debug": "~3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2631,21 +2297,6 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, "default-require-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", @@ -2958,11 +2609,6 @@ "iconv-lite": "~0.4.13" } }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2972,11 +2618,6 @@ "is-arrayish": "^0.2.1" } }, - "error-symbol": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/error-symbol/-/error-symbol-0.1.0.tgz", - "integrity": "sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y=" - }, "es5-ext": { "version": "0.10.46", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", @@ -3628,21 +3269,6 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, - "falsey": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/falsey/-/falsey-0.3.2.tgz", - "integrity": "sha512-lxEuefF5MBIVDmE6XeqCdM4BWk1+vYmGZtkbKZ/VFcg6uBBw6fXNEbWmxCjDdQlFc9hy450nkiWwM3VAW6G1qg==", - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", @@ -3800,6 +3426,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, "requires": { "for-in": "^1.0.1" } @@ -3910,11 +3537,6 @@ } } }, - "fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=" - }, "fs-extra": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", @@ -3979,38 +3601,6 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, - "get-object": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/get-object/-/get-object-0.2.0.tgz", - "integrity": "sha1-2S/31RkMZFMM2gVD2sY6PUf+jAw=", - "requires": { - "is-number": "^2.0.2", - "isobject": "^0.2.0" - }, - "dependencies": { - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-0.2.0.tgz", - "integrity": "sha1-o0MhkvObkQtfAsyYlIeDbscKqF4=" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "get-stdin": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", @@ -4179,108 +3769,6 @@ } } }, - "handlebars-helper-create-frame": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/handlebars-helper-create-frame/-/handlebars-helper-create-frame-0.1.0.tgz", - "integrity": "sha1-iqUdEK62QI/MZgXUDXc1YohIegM=", - "requires": { - "create-frame": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "handlebars-helpers": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/handlebars-helpers/-/handlebars-helpers-0.10.0.tgz", - "integrity": "sha512-QiyhQz58u/DbuV41VnfpE0nhy6YCH4vB514ajysV8SoKmP+DxU+pR+fahVyNECHj+jiwEN2VrvxD/34/yHaLUg==", - "requires": { - "arr-flatten": "^1.1.0", - "array-sort": "^0.1.4", - "create-frame": "^1.0.0", - "define-property": "^1.0.0", - "falsey": "^0.3.2", - "for-in": "^1.0.2", - "for-own": "^1.0.0", - "get-object": "^0.2.0", - "get-value": "^2.0.6", - "handlebars": "^4.0.11", - "handlebars-helper-create-frame": "^0.1.0", - "handlebars-utils": "^1.0.6", - "has-value": "^1.0.0", - "helper-date": "^1.0.1", - "helper-markdown": "^1.0.0", - "helper-md": "^0.2.2", - "html-tag": "^2.0.0", - "is-even": "^1.0.0", - "is-glob": "^4.0.0", - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "lazy-cache": "^2.0.2", - "logging-helpers": "^1.0.0", - "micromatch": "^3.1.4", - "relative": "^3.0.2", - "striptags": "^3.1.0", - "to-gfm-code-block": "^0.1.1", - "year": "^0.2.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" - }, - "lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", - "requires": { - "set-getter": "^0.1.0" - } - } - } - }, - "handlebars-utils": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/handlebars-utils/-/handlebars-utils-1.0.6.tgz", - "integrity": "sha512-d5mmoQXdeEqSKMtQQZ9WkiUcO1E3tPbWxluCK9hVgIDPzQa9WsKo3Lbe/sGflTe7TomHEeZaOgwIkyIr1kfzkw==", - "requires": { - "kind-of": "^6.0.0", - "typeof-article": "^0.1.1" - } - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -4391,52 +3879,6 @@ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, - "helper-date": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/helper-date/-/helper-date-1.0.1.tgz", - "integrity": "sha512-wU3VOwwTJvGr/w5rZr3cprPHO+hIhlblTJHD6aFBrKLuNbf4lAmkawd2iK3c6NbJEvY7HAmDpqjOFSI5/+Ey2w==", - "requires": { - "date.js": "^0.3.1", - "handlebars-utils": "^1.0.4", - "moment": "^2.18.1" - } - }, - "helper-markdown": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/helper-markdown/-/helper-markdown-1.0.0.tgz", - "integrity": "sha512-AnDqMS4ejkQK0MXze7pA9TM3pu01ZY+XXsES6gEE0RmCGk5/NIfvTn0NmItfyDOjRAzyo9z6X7YHbHX4PzIvOA==", - "requires": { - "handlebars-utils": "^1.0.2", - "highlight.js": "^9.12.0", - "remarkable": "^1.7.1" - } - }, - "helper-md": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/helper-md/-/helper-md-0.2.2.tgz", - "integrity": "sha1-wfWdflW7riM2L9ig6XFgeuxp1B8=", - "requires": { - "ent": "^2.2.0", - "extend-shallow": "^2.0.1", - "fs-exists-sync": "^0.1.0", - "remarkable": "^1.6.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "highlight.js": { - "version": "9.13.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.13.1.tgz", - "integrity": "sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A==" - }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -4463,15 +3905,6 @@ "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, - "html-tag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-tag/-/html-tag-2.0.0.tgz", - "integrity": "sha512-XxzooSo6oBoxBEUazgjdXj7VwTn/iSTSZzTYKzYY6I916tkaYzypHxy+pbVU1h+0UQ9JlVf5XkNQyxOAiiQO1g==", - "requires": { - "is-self-closing": "^1.0.1", - "kind-of": "^6.0.0" - } - }, "htmlescape": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", @@ -4612,11 +4045,6 @@ "wrappy": "1" } }, - "info-symbol": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/info-symbol/-/info-symbol-0.1.0.tgz", - "integrity": "sha1-J4QdcoZ920JCzWEtecEGM4gcang=" - }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -4795,14 +4223,6 @@ } } }, - "is-even": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-even/-/is-even-1.0.0.tgz", - "integrity": "sha1-drUFX7rY0pSoa2qUkBXhyXtxfAY=", - "requires": { - "is-odd": "^0.1.2" - } - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -4880,14 +4300,6 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, - "is-odd": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-0.1.2.tgz", - "integrity": "sha1-vFc7XONx7yqtbm9JeZtyvvE5eKc=", - "requires": { - "is-number": "^3.0.0" - } - }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -4937,14 +4349,6 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, - "is-self-closing": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-self-closing/-/is-self-closing-1.0.1.tgz", - "integrity": "sha512-E+60FomW7Blv5GXTlYee2KDrnG6srxF7Xt1SjrhWUGUEsTFIqY/nq2y3DaftCsgUMdh89V07IVfhY9KIJhLezg==", - "requires": { - "self-closing-tags": "^1.0.1" - } - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -5439,38 +4843,6 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, - "log-ok": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz", - "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=", - "requires": { - "ansi-green": "^0.1.1", - "success-symbol": "^0.1.0" - } - }, - "log-utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.2.1.tgz", - "integrity": "sha1-pMIXoN2aUFFdm5ICBgkas9TgMc8=", - "requires": { - "ansi-colors": "^0.2.0", - "error-symbol": "^0.1.0", - "info-symbol": "^0.1.0", - "log-ok": "^0.1.1", - "success-symbol": "^0.1.0", - "time-stamp": "^1.0.1", - "warning-symbol": "^0.1.0" - } - }, - "logging-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/logging-helpers/-/logging-helpers-1.0.0.tgz", - "integrity": "sha512-qyIh2goLt1sOgQQrrIWuwkRjUx4NUcEqEGAcYqD8VOnOC6ItwkrVE8/tA4smGpjzyp4Svhc6RodDp9IO5ghpyA==", - "requires": { - "isobject": "^3.0.0", - "log-utils": "^0.2.1" - } - }, "lolex": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", @@ -5830,11 +5202,6 @@ } } }, - "moment": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -7189,29 +6556,6 @@ } } }, - "relative": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/relative/-/relative-3.0.2.tgz", - "integrity": "sha1-Dc2OxUpdNaPBXhBFA9ZTdbWlNn8=", - "requires": { - "isobject": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -7221,26 +6565,6 @@ "es6-error": "^4.0.1" } }, - "remarkable": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.1.tgz", - "integrity": "sha1-qspJchALZqZCpjoQIcpLrBvjv/Y=", - "requires": { - "argparse": "~0.1.15", - "autolinker": "~0.15.0" - }, - "dependencies": { - "argparse": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", - "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", - "requires": { - "underscore": "~1.7.0", - "underscore.string": "~2.4.0" - } - } - } - }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -7424,11 +6748,6 @@ "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=", "dev": true }, - "self-closing-tags": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/self-closing-tags/-/self-closing-tags-1.0.1.tgz", - "integrity": "sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA==" - }, "semver": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", @@ -7478,14 +6797,6 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "set-getter": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", - "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", - "requires": { - "to-object-path": "^0.3.0" - } - }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", @@ -8842,11 +8153,6 @@ "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", "dev": true }, - "striptags": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.1.1.tgz", - "integrity": "sha1-yMPn/db7S7OjKjt1LltePjgJPr0=" - }, "subarg": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", @@ -8862,11 +8168,6 @@ } } }, - "success-symbol": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz", - "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc=" - }, "superagent": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", @@ -9128,11 +8429,6 @@ "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", "dev": true }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" - }, "timers-browserify": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", @@ -9159,11 +8455,6 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, - "to-gfm-code-block": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-gfm-code-block/-/to-gfm-code-block-0.1.1.tgz", - "integrity": "sha1-JdBFpfrlUxielje1kJANpzLYqoI=" - }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -9297,24 +8588,6 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, - "typeof-article": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/typeof-article/-/typeof-article-0.1.1.tgz", - "integrity": "sha1-nwfnM8P7tkb/qeYcCN66zUYOBq8=", - "requires": { - "kind-of": "^3.1.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "uglify-js": { "version": "3.4.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", @@ -9382,16 +8655,6 @@ "debug": "^2.2.0" } }, - "underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" - }, - "underscore.string": { - "version": "2.4.0", - "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", - "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=" - }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -9588,11 +8851,6 @@ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" }, - "warning-symbol": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/warning-symbol/-/warning-symbol-0.1.0.tgz", - "integrity": "sha1-uzHdEbeg+dZ6su2V9Fe2WCW7rSE=" - }, "webid": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/webid/-/webid-0.3.11.tgz", @@ -9804,11 +9062,6 @@ "dev": true } } - }, - "year": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/year/-/year-0.2.1.tgz", - "integrity": "sha1-QIOuUgoxiyPshgN/MADLiSvfm7A=" } } } diff --git a/package.json b/package.json index 1116f4d0e..5f7bc16c3 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,6 @@ "glob": "^7.1.1", "global-tunnel-ng": "^2.1.0", "handlebars": "^4.0.6", - "handlebars-helpers": "^0.10.0", "http-proxy-middleware": "^0.18.0", "inquirer": "^1.0.2", "ip-range-check": "0.0.2",