From acad3b8873f5771ad35740cf5174099b57db5442 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Tue, 24 Jan 2017 12:28:42 +0100 Subject: [PATCH] Migrate to bcrypt (#8446) * start migrating to bcrypt * added method to convert the password to bcrypt when logging in, added method to compare password without knowing the hashing algorhytm, remove default * travis: try to upgrade to container based infrastructure * travis: add deps to build bcrypt.js * travis: add deps to build bcrypt.js * travis: add deps to build bcrypt.js * travis: add deps to build bcrypt.js * use bcryptjs until bcrypt can be installed on travis, see https://github.com/kelektiv/node.bcrypt.js/issues/476 * correct sha1 unit tests * try different mongodb repo * try without mognodb services * try again with bcrypt * disable request logging in travis * migrate missing routes * simplify code * remove bcryptjs * fix typo * fix typo * fix typo in comment * add unit tests for new passwords utility emthods * travis: back to old infrastructure, containers often have timeouts * add integration test for passwordHashMethod * update shrinkwrap * clarify code and add comments * add integration tests * fix linting * fix integration tests --- .travis.yml | 11 + npm-shrinkwrap.json | 1562 ++++++++++------- package.json | 1 + .../v3/integration/user/DELETE-user.test.js | 28 + test/api/v3/integration/user/GET-user.test.js | 1 + .../user/auth/POST-login-local.test.js | 36 + .../auth/POST-user_reset_password.test.js | 31 + .../user/auth/PUT-user_update_email.test.js | 40 + .../auth/PUT-user_update_password.test.js | 37 + .../auth/PUT-user_update_username.test.js | 40 + test/api/v3/unit/libs/password.test.js | 241 ++- test/helpers/mongo.js | 2 +- website/server/controllers/api-v3/auth.js | 72 +- website/server/controllers/api-v3/user.js | 6 +- website/server/libs/password.js | 51 +- website/server/middlewares/index.js | 2 +- 16 files changed, 1439 insertions(+), 722 deletions(-) diff --git a/.travis.yml b/.travis.yml index 92469e9339..3262fcc22a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,15 @@ language: node_js node_js: - '6' +sudo: required +addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-4.8 before_install: + - $CXX --version - npm install -g npm@4 - if [ $REQUIRES_SERVER ]; then sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10; echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list; sudo apt-get update; sudo apt-get install mongodb-org-server; fi before_script: @@ -12,6 +20,9 @@ after_script: - ./node_modules/.bin/lcov-result-merger 'coverage/**/*.info' | ./node_modules/coveralls/bin/coveralls.js script: npm run $TEST env: + global: + - CXX=g++-4.8 + - DISABLE_REQUEST_LOGGING=true matrix: - TEST="lint" - TEST="test:api-v3" REQUIRES_SERVER=true diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index a92d4df51a..8d42f64e77 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -8,15 +8,15 @@ "resolved": "https://registry.npmjs.org/@slack/client/-/client-3.6.0.tgz", "dependencies": { "lodash": { - "version": "4.17.2", + "version": "4.17.4", "from": "lodash@>=4.13.1 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" } } }, "abbrev": { "version": "1.0.9", - "from": "abbrev@>=1.0.4 <1.1.0", + "from": "abbrev@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz" }, "accepts": { @@ -78,9 +78,9 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.0.1.tgz" }, "ajv": { - "version": "4.10.4", + "version": "4.11.2", "from": "ajv@>=4.7.0 <5.0.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.10.4.tgz", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.2.tgz", "dev": true, "dependencies": { "co": { @@ -98,9 +98,9 @@ } }, "ajv-keywords": { - "version": "1.5.0", + "version": "1.5.1", "from": "ajv-keywords@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.0.tgz", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", "dev": true }, "align-text": { @@ -274,9 +274,9 @@ "dev": true }, "ansi-regex": { - "version": "2.0.0", + "version": "2.1.1", "from": "ansi-regex@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" }, "ansi-styles": { "version": "2.2.1", @@ -342,6 +342,11 @@ "from": "apn@>=1.7.6 <2.0.0", "resolved": "https://registry.npmjs.org/apn/-/apn-1.7.8.tgz" }, + "aproba": { + "version": "1.0.4", + "from": "aproba@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.0.4.tgz" + }, "archive-type": { "version": "3.2.0", "from": "archive-type@>=3.0.1 <4.0.0", @@ -352,6 +357,11 @@ "from": "archy@0.0.2", "resolved": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz" }, + "are-we-there-yet": { + "version": "1.1.2", + "from": "are-we-there-yet@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz" + }, "argparse": { "version": "1.0.9", "from": "argparse@>=1.0.7 <2.0.0", @@ -440,9 +450,9 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" }, "asn1.js": { - "version": "4.9.0", + "version": "4.9.1", "from": "asn1.js@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.0.tgz" + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz" }, "assert": { "version": "1.3.0", @@ -467,9 +477,9 @@ "dev": true }, "ast-types": { - "version": "0.9.2", + "version": "0.9.4", "from": "ast-types@>=0.0.0 <1.0.0", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.2.tgz", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.4.tgz", "dev": true }, "astw": { @@ -504,26 +514,14 @@ "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz" }, "autoprefixer": { - "version": "6.6.1", - "from": "autoprefixer@6.6.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.6.1.tgz", - "dependencies": { - "postcss": { - "version": "5.2.10", - "from": "postcss@>=5.2.8 <6.0.0", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.10.tgz" - }, - "supports-color": { - "version": "3.1.2", - "from": "supports-color@>=3.1.2 <4.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz" - } - } + "version": "6.7.0", + "from": "autoprefixer@>=6.4.0 <7.0.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.0.tgz" }, "aws-sdk": { - "version": "2.7.21", - "from": "aws-sdk@2.7.21", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.7.21.tgz", + "version": "2.7.27", + "from": "aws-sdk@>=2.0.25 <3.0.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.7.27.tgz", "dependencies": { "lodash": { "version": "3.5.0", @@ -564,131 +562,116 @@ }, "axios": { "version": "0.15.3", - "from": "axios@latest", + "from": "axios@>=0.15.3 <0.16.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.15.3.tgz" }, "babel-code-frame": { - "version": "6.20.0", - "from": "babel-code-frame@>=6.20.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.20.0.tgz" + "version": "6.22.0", + "from": "babel-code-frame@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz" }, "babel-core": { - "version": "6.21.0", - "from": "babel-core@6.21.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.21.0.tgz", + "version": "6.22.1", + "from": "babel-core@>=6.0.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.22.1.tgz", "dependencies": { - "babel-traverse": { - "version": "6.21.0", - "from": "babel-traverse@>=6.21.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.21.0.tgz" - }, - "babel-types": { - "version": "6.21.0", - "from": "babel-types@>=6.21.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.21.0.tgz" - }, "lodash": { - "version": "4.17.2", + "version": "4.17.4", "from": "lodash@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" } } }, "babel-generator": { - "version": "6.21.0", - "from": "babel-generator@>=6.21.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.21.0.tgz", + "version": "6.22.0", + "from": "babel-generator@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.22.0.tgz", "dependencies": { - "babel-types": { - "version": "6.21.0", - "from": "babel-types@^6.21.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.21.0.tgz" - }, "lodash": { - "version": "4.17.2", + "version": "4.17.4", "from": "lodash@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" } } }, "babel-helper-call-delegate": { - "version": "6.18.0", - "from": "babel-helper-call-delegate@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz" + "version": "6.22.0", + "from": "babel-helper-call-delegate@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.22.0.tgz" }, "babel-helper-define-map": { - "version": "6.18.0", - "from": "babel-helper-define-map@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz", + "version": "6.22.0", + "from": "babel-helper-define-map@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.22.0.tgz", "dependencies": { "lodash": { - "version": "4.17.2", + "version": "4.17.4", "from": "lodash@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" } } }, "babel-helper-function-name": { - "version": "6.18.0", - "from": "babel-helper-function-name@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz" + "version": "6.22.0", + "from": "babel-helper-function-name@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.22.0.tgz" }, "babel-helper-get-function-arity": { - "version": "6.18.0", - "from": "babel-helper-get-function-arity@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz" + "version": "6.22.0", + "from": "babel-helper-get-function-arity@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.22.0.tgz" }, "babel-helper-hoist-variables": { - "version": "6.18.0", - "from": "babel-helper-hoist-variables@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz" + "version": "6.22.0", + "from": "babel-helper-hoist-variables@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.22.0.tgz" }, "babel-helper-optimise-call-expression": { - "version": "6.18.0", - "from": "babel-helper-optimise-call-expression@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz" + "version": "6.22.0", + "from": "babel-helper-optimise-call-expression@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.22.0.tgz" }, "babel-helper-regex": { - "version": "6.18.0", - "from": "babel-helper-regex@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz", + "version": "6.22.0", + "from": "babel-helper-regex@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.22.0.tgz", "dependencies": { "lodash": { - "version": "4.17.2", + "version": "4.17.4", "from": "lodash@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" } } }, "babel-helper-remap-async-to-generator": { - "version": "6.20.3", - "from": "babel-helper-remap-async-to-generator@>=6.16.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.20.3.tgz" + "version": "6.22.0", + "from": "babel-helper-remap-async-to-generator@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.22.0.tgz" }, "babel-helper-replace-supers": { - "version": "6.18.0", - "from": "babel-helper-replace-supers@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz" + "version": "6.22.0", + "from": "babel-helper-replace-supers@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.22.0.tgz" }, "babel-helpers": { - "version": "6.16.0", - "from": "babel-helpers@>=6.16.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.16.0.tgz" + "version": "6.22.0", + "from": "babel-helpers@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.22.0.tgz" }, "babel-loader": { "version": "6.2.10", - "from": "babel-loader@6.2.10", + "from": "babel-loader@>=6.0.0 <7.0.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.2.10.tgz" }, "babel-messages": { - "version": "6.8.0", - "from": "babel-messages@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.8.0.tgz" + "version": "6.22.0", + "from": "babel-messages@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.22.0.tgz" }, "babel-plugin-check-es2015-constants": { - "version": "6.8.0", - "from": "babel-plugin-check-es2015-constants@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-check-es2015-constants@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz" }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", @@ -701,9 +684,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz" }, "babel-plugin-transform-async-to-module-method": { - "version": "6.16.0", + "version": "6.22.0", "from": "babel-plugin-transform-async-to-module-method@>=6.8.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-module-method/-/babel-plugin-transform-async-to-module-method-6.16.0.tgz" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-module-method/-/babel-plugin-transform-async-to-module-method-6.22.0.tgz" }, "babel-plugin-transform-cjs-system-require": { "version": "0.1.1", @@ -716,121 +699,121 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-cjs-system-wrapper/-/babel-plugin-transform-cjs-system-wrapper-0.2.1.tgz" }, "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.8.0", - "from": "babel-plugin-transform-es2015-arrow-functions@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-arrow-functions@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz" }, "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.8.0", - "from": "babel-plugin-transform-es2015-block-scoped-functions@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-block-scoped-functions@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz" }, "babel-plugin-transform-es2015-block-scoping": { - "version": "6.20.0", - "from": "babel-plugin-transform-es2015-block-scoping@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.20.0.tgz", + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-block-scoping@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.22.0.tgz", "dependencies": { "lodash": { - "version": "4.17.2", + "version": "4.17.4", "from": "lodash@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" } } }, "babel-plugin-transform-es2015-classes": { - "version": "6.18.0", - "from": "babel-plugin-transform-es2015-classes@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-classes@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.22.0.tgz" }, "babel-plugin-transform-es2015-computed-properties": { - "version": "6.8.0", - "from": "babel-plugin-transform-es2015-computed-properties@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-computed-properties@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.22.0.tgz" }, "babel-plugin-transform-es2015-destructuring": { - "version": "6.19.0", - "from": "babel-plugin-transform-es2015-destructuring@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.19.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-destructuring@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.22.0.tgz" }, "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.8.0", - "from": "babel-plugin-transform-es2015-duplicate-keys@>=6.6.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-duplicate-keys@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.22.0.tgz" }, "babel-plugin-transform-es2015-for-of": { - "version": "6.18.0", - "from": "babel-plugin-transform-es2015-for-of@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-for-of@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.22.0.tgz" }, "babel-plugin-transform-es2015-function-name": { - "version": "6.9.0", - "from": "babel-plugin-transform-es2015-function-name@>=6.9.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-function-name@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.22.0.tgz" }, "babel-plugin-transform-es2015-literals": { - "version": "6.8.0", - "from": "babel-plugin-transform-es2015-literals@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-literals@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz" }, "babel-plugin-transform-es2015-modules-amd": { - "version": "6.18.0", - "from": "babel-plugin-transform-es2015-modules-amd@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.18.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-modules-amd@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.22.0.tgz" }, "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.18.0", - "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.22.0.tgz" }, "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.19.0", - "from": "babel-plugin-transform-es2015-modules-systemjs@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.19.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-modules-systemjs@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.22.0.tgz" }, "babel-plugin-transform-es2015-modules-umd": { - "version": "6.18.0", - "from": "babel-plugin-transform-es2015-modules-umd@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.18.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-modules-umd@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.22.0.tgz" }, "babel-plugin-transform-es2015-object-super": { - "version": "6.8.0", - "from": "babel-plugin-transform-es2015-object-super@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-object-super@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.22.0.tgz" }, "babel-plugin-transform-es2015-parameters": { - "version": "6.18.0", - "from": "babel-plugin-transform-es2015-parameters@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.18.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-parameters@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.22.0.tgz" }, "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.18.0", - "from": "babel-plugin-transform-es2015-shorthand-properties@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-shorthand-properties@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.22.0.tgz" }, "babel-plugin-transform-es2015-spread": { - "version": "6.8.0", - "from": "babel-plugin-transform-es2015-spread@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-spread@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz" }, "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.8.0", - "from": "babel-plugin-transform-es2015-sticky-regex@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-sticky-regex@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.22.0.tgz" }, "babel-plugin-transform-es2015-template-literals": { - "version": "6.8.0", - "from": "babel-plugin-transform-es2015-template-literals@>=6.6.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-template-literals@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz" }, "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.18.0", - "from": "babel-plugin-transform-es2015-typeof-symbol@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.18.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-typeof-symbol@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.22.0.tgz" }, "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.11.0", - "from": "babel-plugin-transform-es2015-unicode-regex@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-es2015-unicode-regex@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.22.0.tgz" }, "babel-plugin-transform-global-system-wrapper": { "version": "0.0.1", @@ -838,19 +821,19 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-global-system-wrapper/-/babel-plugin-transform-global-system-wrapper-0.0.1.tgz" }, "babel-plugin-transform-object-rest-spread": { - "version": "6.20.2", + "version": "6.22.0", "from": "babel-plugin-transform-object-rest-spread@>=6.16.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.20.2.tgz" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.22.0.tgz" }, "babel-plugin-transform-regenerator": { - "version": "6.21.0", - "from": "babel-plugin-transform-regenerator@6.21.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.21.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-regenerator@>=6.16.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.22.0.tgz" }, "babel-plugin-transform-strict-mode": { - "version": "6.18.0", - "from": "babel-plugin-transform-strict-mode@>=6.18.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz" + "version": "6.22.0", + "from": "babel-plugin-transform-strict-mode@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.22.0.tgz" }, "babel-plugin-transform-system-register": { "version": "0.0.1", @@ -858,65 +841,65 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-system-register/-/babel-plugin-transform-system-register-0.0.1.tgz" }, "babel-polyfill": { - "version": "6.20.0", + "version": "6.22.0", "from": "babel-polyfill@>=6.6.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.20.0.tgz" + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.22.0.tgz" }, "babel-preset-es2015": { - "version": "6.18.0", + "version": "6.22.0", "from": "babel-preset-es2015@>=6.6.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.18.0.tgz" + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.22.0.tgz" }, "babel-register": { - "version": "6.18.0", + "version": "6.22.0", "from": "babel-register@>=6.6.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.18.0.tgz", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.22.0.tgz", "dependencies": { "lodash": { - "version": "4.17.2", + "version": "4.17.4", "from": "lodash@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" } } }, "babel-runtime": { - "version": "6.20.0", + "version": "6.22.0", "from": "babel-runtime@>=6.11.6 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.20.0.tgz" + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.22.0.tgz" }, "babel-template": { - "version": "6.16.0", - "from": "babel-template@>=6.16.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.16.0.tgz", + "version": "6.22.0", + "from": "babel-template@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.22.0.tgz", "dependencies": { "lodash": { - "version": "4.17.2", + "version": "4.17.4", "from": "lodash@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" } } }, "babel-traverse": { - "version": "6.20.0", - "from": "babel-traverse@>=6.20.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.20.0.tgz", + "version": "6.22.1", + "from": "babel-traverse@>=6.22.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.22.1.tgz", "dependencies": { "lodash": { - "version": "4.17.2", + "version": "4.17.4", "from": "lodash@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" } } }, "babel-types": { - "version": "6.20.0", - "from": "babel-types@>=6.20.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.20.0.tgz", + "version": "6.22.0", + "from": "babel-types@>=6.22.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.22.0.tgz", "dependencies": { "lodash": { - "version": "4.17.2", + "version": "4.17.4", "from": "lodash@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" } } }, @@ -926,9 +909,9 @@ "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz" }, "babylon": { - "version": "6.14.1", + "version": "6.15.0", "from": "babylon@>=6.11.0 <7.0.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.14.1.tgz" + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.15.0.tgz" }, "backo2": { "version": "1.0.2", @@ -968,6 +951,11 @@ "from": "basic-auth@>=1.0.3 <1.1.0", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.4.tgz" }, + "bcrypt": { + "version": "1.0.2", + "from": "bcrypt@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-1.0.2.tgz" + }, "bcrypt-pbkdf": { "version": "1.0.0", "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0", @@ -1049,6 +1037,11 @@ "from": "binary-extensions@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz" }, + "bindings": { + "version": "1.2.1", + "from": "bindings@1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz" + }, "bl": { "version": "1.1.2", "from": "bl@>=1.1.2 <1.2.0", @@ -1060,9 +1053,14 @@ "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", "dev": true }, + "block-stream": { + "version": "0.0.9", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz" + }, "bluebird": { "version": "3.4.7", - "from": "bluebird@3.4.7", + "from": "bluebird@>=3.3.5 <4.0.0", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz" }, "bn.js": { @@ -1071,31 +1069,9 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" }, "body-parser": { - "version": "1.15.2", + "version": "1.16.0", "from": "body-parser@>=1.15.0 <2.0.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.15.2.tgz", - "dependencies": { - "debug": { - "version": "2.2.0", - "from": "debug@>=2.2.0 <2.3.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz" - }, - "iconv-lite": { - "version": "0.4.13", - "from": "iconv-lite@0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" - }, - "ms": { - "version": "0.7.1", - "from": "ms@0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - }, - "qs": { - "version": "6.2.0", - "from": "qs@6.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz" - } - } + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.16.0.tgz" }, "boolbase": { "version": "1.0.0", @@ -1333,6 +1309,11 @@ "from": "bower-json@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/bower-json/-/bower-json-0.4.0.tgz", "dependencies": { + "deep-extend": { + "version": "0.2.11", + "from": "deep-extend@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" + }, "graceful-fs": { "version": "2.0.3", "from": "graceful-fs@>=2.0.0 <2.1.0", @@ -1528,7 +1509,14 @@ "browser-resolve": { "version": "1.11.2", "from": "browser-resolve@>=1.11.0 <2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz" + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "dependencies": { + "resolve": { + "version": "1.1.7", + "from": "resolve@1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" + } + } }, "browserify": { "version": "12.0.2", @@ -1612,9 +1600,9 @@ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz" }, "browserslist": { - "version": "1.5.2", - "from": "browserslist@>=1.5.1 <1.6.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.5.2.tgz" + "version": "1.6.0", + "from": "browserslist@>=1.6.0 <1.7.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.6.0.tgz" }, "bser": { "version": "1.0.2", @@ -1671,16 +1659,9 @@ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" }, "buildmail": { - "version": "4.0.0", - "from": "buildmail@4.0.0", - "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-4.0.0.tgz", - "dependencies": { - "punycode": { - "version": "2.0.1", - "from": "punycode@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.0.1.tgz" - } - } + "version": "4.0.1", + "from": "buildmail@4.0.1", + "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-4.0.1.tgz" }, "builtin-modules": { "version": "1.1.1", @@ -1688,9 +1669,9 @@ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" }, "builtin-status-codes": { - "version": "2.0.0", - "from": "builtin-status-codes@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-2.0.0.tgz" + "version": "3.0.0", + "from": "builtin-status-codes@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz" }, "byline": { "version": "4.2.2", @@ -1740,10 +1721,32 @@ "from": "camelcase-keys@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz" }, + "caniuse-api": { + "version": "1.5.2", + "from": "caniuse-api@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.5.2.tgz", + "dependencies": { + "glob": { + "version": "7.1.1", + "from": "glob@>=7.0.0 <8.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz" + }, + "lodash.memoize": { + "version": "4.1.2", + "from": "lodash.memoize@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + }, + "shelljs": { + "version": "0.7.6", + "from": "shelljs@>=0.7.0 <0.8.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.6.tgz" + } + } + }, "caniuse-db": { - "version": "1.0.30000611", - "from": "caniuse-db@>=1.0.30000604 <2.0.0", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000611.tgz" + "version": "1.0.30000613", + "from": "caniuse-db@>=1.0.30000613 <2.0.0", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000613.tgz" }, "capture-stack-trace": { "version": "1.0.0", @@ -1902,7 +1905,7 @@ }, "chromedriver": { "version": "2.27.2", - "from": "chromedriver@2.27.2", + "from": "chromedriver@>=2.21.2 <3.0.0", "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-2.27.2.tgz", "dev": true }, @@ -1913,7 +1916,7 @@ }, "circular-json": { "version": "0.3.1", - "from": "circular-json@>=0.3.0 <0.4.0", + "from": "circular-json@>=0.3.1 <0.4.0", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz", "dev": true }, @@ -2003,9 +2006,9 @@ "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz" }, "color-convert": { - "version": "1.8.2", + "version": "1.9.0", "from": "color-convert@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.8.2.tgz" + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz" }, "color-name": { "version": "1.1.1", @@ -2075,9 +2078,9 @@ "dev": true, "dependencies": { "esprima": { - "version": "3.1.2", + "version": "3.1.3", "from": "esprima@>=3.1.0 <3.2.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "dev": true }, "glob": { @@ -2087,9 +2090,9 @@ "dev": true }, "recast": { - "version": "0.11.18", + "version": "0.11.20", "from": "recast@>=0.11.17 <0.12.0", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.18.tgz", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.20.tgz", "dev": true } } @@ -2206,6 +2209,11 @@ "from": "console-browserify@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz" }, + "console-control-strings": { + "version": "1.1.0", + "from": "console-control-strings@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + }, "console-stream": { "version": "0.1.1", "from": "console-stream@>=0.1.1 <0.2.0", @@ -2465,9 +2473,9 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz" }, "cssnano": { - "version": "3.9.1", + "version": "3.10.0", "from": "cssnano@>=2.6.1 <4.0.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.9.1.tgz" + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz" }, "csso": { "version": "2.2.1", @@ -2503,7 +2511,7 @@ }, "cwait": { "version": "1.0.1", - "from": "cwait@1.0.1", + "from": "cwait@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/cwait/-/cwait-1.0.1.tgz" }, "cwise": { @@ -2581,14 +2589,21 @@ "resolved": "https://registry.npmjs.org/deap/-/deap-1.0.0.tgz" }, "debug": { - "version": "2.3.3", + "version": "2.6.0", "from": "debug@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz" + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz" }, "debug-fabulous": { "version": "0.0.4", "from": "debug-fabulous@>=0.0.0 <0.1.0", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-0.0.4.tgz" + "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-0.0.4.tgz", + "dependencies": { + "object-assign": { + "version": "4.1.0", + "from": "object-assign@4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz" + } + } }, "decamelize": { "version": "1.2.0", @@ -2606,9 +2621,9 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" }, "glob-parent": { - "version": "3.0.1", + "version": "3.1.0", "from": "glob-parent@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.0.1.tgz" + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz" }, "glob-stream": { "version": "5.3.5", @@ -2871,9 +2886,9 @@ } }, "deep-extend": { - "version": "0.2.11", - "from": "deep-extend@>=0.2.5 <0.3.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" + "version": "0.4.1", + "from": "deep-extend@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz" }, "deep-is": { "version": "0.1.3", @@ -2930,9 +2945,9 @@ "dev": true, "dependencies": { "esprima": { - "version": "3.1.2", + "version": "3.1.3", "from": "esprima@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "dev": true } } @@ -2962,6 +2977,11 @@ "from": "delayed-stream@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" }, + "delegates": { + "version": "1.0.0", + "from": "delegates@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + }, "depd": { "version": "1.1.0", "from": "depd@>=1.1.0 <1.2.0", @@ -3108,9 +3128,9 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" }, "glob-parent": { - "version": "3.0.1", + "version": "3.1.0", "from": "glob-parent@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.0.1.tgz" + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz" }, "glob-stream": { "version": "5.3.5", @@ -3159,16 +3179,16 @@ "from": "json-stable-stringify@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" }, - "node-status-codes": { - "version": "1.0.0", - "from": "node-status-codes@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz" - }, "ordered-read-streams": { "version": "0.3.0", "from": "ordered-read-streams@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz" }, + "timed-out": { + "version": "3.1.3", + "from": "timed-out@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz" + }, "unique-stream": { "version": "2.2.1", "from": "unique-stream@>=2.0.2 <3.0.0", @@ -3250,6 +3270,11 @@ "resolved": "https://registry.npmjs.org/ejs/-/ejs-0.8.8.tgz", "dev": true }, + "electron-to-chromium": { + "version": "1.2.0", + "from": "electron-to-chromium@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.2.0.tgz" + }, "elliptic": { "version": "6.3.2", "from": "elliptic@>=6.0.0 <7.0.0", @@ -3287,13 +3312,29 @@ "version": "1.8.2", "from": "engine.io@1.8.2", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.2.tgz", - "dev": true + "dev": true, + "dependencies": { + "debug": { + "version": "2.3.3", + "from": "debug@2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "dev": true + } + } }, "engine.io-client": { "version": "1.8.2", "from": "engine.io-client@1.8.2", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.2.tgz", - "dev": true + "dev": true, + "dependencies": { + "debug": { + "version": "2.3.3", + "from": "debug@2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "dev": true + } + } }, "engine.io-parser": { "version": "1.3.2", @@ -3447,9 +3488,9 @@ } }, "eslint": { - "version": "3.13.1", - "from": "eslint@3.13.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.13.1.tgz", + "version": "3.14.0", + "from": "eslint@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.14.0.tgz", "dev": true, "dependencies": { "glob": { @@ -3516,13 +3557,13 @@ }, "eslint-config-habitrpg": { "version": "2.0.2", - "from": "eslint-config-habitrpg@2.0.2", + "from": "eslint-config-habitrpg@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/eslint-config-habitrpg/-/eslint-config-habitrpg-2.0.2.tgz", "dev": true }, "eslint-friendly-formatter": { "version": "2.0.7", - "from": "eslint-friendly-formatter@2.0.7", + "from": "eslint-friendly-formatter@>=2.0.5 <3.0.0", "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-2.0.7.tgz", "dev": true, "dependencies": { @@ -3562,7 +3603,7 @@ }, "eslint-plugin-mocha": { "version": "4.8.0", - "from": "eslint-plugin-mocha@4.8.0", + "from": "eslint-plugin-mocha@>=4.7.0 <5.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-4.8.0.tgz", "dev": true }, @@ -3863,14 +3904,14 @@ } }, "fancy-log": { - "version": "1.2.0", + "version": "1.3.0", "from": "fancy-log@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.2.0.tgz" + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz" }, "fast-levenshtein": { - "version": "2.0.5", + "version": "2.0.6", "from": "fast-levenshtein@>=2.0.4 <2.1.0", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "dev": true }, "fastparse": { @@ -4093,9 +4134,9 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz" }, "lodash": { - "version": "4.17.2", + "version": "4.17.4", "from": "lodash@>=4.14.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" } } }, @@ -4106,9 +4147,9 @@ "dev": true }, "formidable": { - "version": "1.0.17", + "version": "1.1.1", "from": "formidable@>=1.0.17 <2.0.0", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.17.tgz" + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz" }, "forwarded": { "version": "0.1.0", @@ -4146,9 +4187,9 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" }, "fsevents": { - "version": "1.0.15", + "version": "1.0.17", "from": "fsevents@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.15.tgz", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.17.tgz", "optional": true, "dependencies": { "abbrev": { @@ -4192,10 +4233,10 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", "optional": true }, - "async": { - "version": "1.5.2", - "from": "async@>=1.5.2 <2.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "asynckit": { + "version": "0.4.0", + "from": "asynckit@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "optional": true }, "aws-sign2": { @@ -4205,9 +4246,9 @@ "optional": true }, "aws4": { - "version": "1.4.1", + "version": "1.5.0", "from": "aws4@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.5.0.tgz", "optional": true }, "balanced-match": { @@ -4215,19 +4256,11 @@ "from": "balanced-match@>=0.4.1 <0.5.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" }, - "bl": { - "version": "1.1.2", - "from": "bl@>=1.1.2 <1.2.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", - "optional": true, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "from": "readable-stream@>=2.0.5 <2.1.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "optional": true - } - } + "bcrypt-pbkdf": { + "version": "1.0.0", + "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz", + "optional": true }, "block-stream": { "version": "0.0.9", @@ -4240,9 +4273,9 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" }, "brace-expansion": { - "version": "1.1.5", + "version": "1.1.6", "from": "brace-expansion@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz" + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz" }, "buffer-shims": { "version": "1.0.0", @@ -4259,12 +4292,20 @@ "version": "1.1.3", "from": "chalk@>=1.1.1 <2.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "optional": true + "optional": true, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "from": "supports-color@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "optional": true + } + } }, "code-point-at": { - "version": "1.0.0", + "version": "1.1.0", "from": "code-point-at@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" }, "combined-stream": { "version": "1.0.5", @@ -4299,9 +4340,9 @@ "optional": true }, "dashdash": { - "version": "1.14.0", + "version": "1.14.1", "from": "dashdash@>=1.12.0 <2.0.0", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "optional": true, "dependencies": { "assert-plus": { @@ -4365,9 +4406,9 @@ "optional": true }, "form-data": { - "version": "1.0.0-rc4", - "from": "form-data@>=1.0.0-rc4 <1.1.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", + "version": "2.1.2", + "from": "form-data@>=2.1.1 <2.2.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz", "optional": true }, "fs.realpath": { @@ -4387,9 +4428,9 @@ "optional": true }, "gauge": { - "version": "2.6.0", - "from": "gauge@>=2.6.0 <2.7.0", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.6.0.tgz", + "version": "2.7.2", + "from": "gauge@>=2.7.1 <2.8.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.2.tgz", "optional": true }, "generate-function": { @@ -4419,14 +4460,14 @@ } }, "glob": { - "version": "7.0.5", + "version": "7.1.1", "from": "glob@>=7.0.5 <8.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz" + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz" }, "graceful-fs": { - "version": "4.1.4", + "version": "4.1.11", "from": "graceful-fs@>=4.1.2 <5.0.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz" + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" }, "graceful-readlink": { "version": "1.0.1", @@ -4446,12 +4487,6 @@ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "optional": true }, - "has-color": { - "version": "0.1.7", - "from": "has-color@>=0.1.7 <0.2.0", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "optional": true - }, "has-unicode": { "version": "2.0.1", "from": "has-unicode@>=2.0.0 <3.0.0", @@ -4476,14 +4511,14 @@ "optional": true }, "inflight": { - "version": "1.0.5", + "version": "1.0.6", "from": "inflight@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz" + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" }, "inherits": { - "version": "2.0.1", + "version": "2.0.3", "from": "inherits@>=2.0.1 <2.1.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" }, "ini": { "version": "1.3.4", @@ -4497,9 +4532,9 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" }, "is-my-json-valid": { - "version": "2.13.1", + "version": "2.15.0", "from": "is-my-json-valid@>=2.12.4 <3.0.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz", "optional": true }, "is-property": { @@ -4538,9 +4573,9 @@ "optional": true }, "json-schema": { - "version": "0.2.2", - "from": "json-schema@0.2.2", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz", + "version": "0.2.3", + "from": "json-schema@0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "optional": true }, "json-stringify-safe": { @@ -4550,31 +4585,31 @@ "optional": true }, "jsonpointer": { - "version": "2.0.0", - "from": "jsonpointer@2.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", + "version": "4.0.1", + "from": "jsonpointer@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", "optional": true }, "jsprim": { - "version": "1.3.0", + "version": "1.3.1", "from": "jsprim@>=1.2.2 <2.0.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.0.tgz", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz", "optional": true }, "mime-db": { - "version": "1.23.0", - "from": "mime-db@>=1.23.0 <1.24.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" + "version": "1.25.0", + "from": "mime-db@>=1.25.0 <1.26.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.25.0.tgz" }, "mime-types": { - "version": "2.1.11", + "version": "2.1.13", "from": "mime-types@>=2.1.7 <2.2.0", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz" + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.13.tgz" }, "minimatch": { - "version": "3.0.2", + "version": "3.0.3", "from": "minimatch@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz" + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz" }, "minimist": { "version": "0.0.8", @@ -4583,7 +4618,7 @@ }, "mkdirp": { "version": "0.5.1", - "from": "mkdirp@>=0.5.0 <0.6.0", + "from": "mkdirp@>=0.5.1 <0.6.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" }, "ms": { @@ -4593,33 +4628,27 @@ "optional": true }, "node-pre-gyp": { - "version": "0.6.29", + "version": "0.6.32", "from": "node-pre-gyp@>=0.6.29 <0.7.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.29.tgz", - "optional": true - }, - "node-uuid": { - "version": "1.4.7", - "from": "node-uuid@>=1.4.7 <1.5.0", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz", "optional": true }, "nopt": { "version": "3.0.6", - "from": "nopt@>=3.0.1 <3.1.0", + "from": "nopt@>=3.0.6 <3.1.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "optional": true }, "npmlog": { - "version": "3.1.2", - "from": "npmlog@>=3.1.2 <3.2.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-3.1.2.tgz", + "version": "4.0.2", + "from": "npmlog@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.2.tgz", "optional": true }, "number-is-nan": { - "version": "1.0.0", + "version": "1.0.1", "from": "number-is-nan@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" }, "oauth-sign": { "version": "0.8.2", @@ -4634,14 +4663,14 @@ "optional": true }, "once": { - "version": "1.3.3", + "version": "1.4.0", "from": "once@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz" + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" }, "path-is-absolute": { - "version": "1.0.0", + "version": "1.0.1", "from": "path-is-absolute@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" }, "pinkie": { "version": "2.0.4", @@ -4660,15 +4689,21 @@ "from": "process-nextick-args@>=1.0.6 <1.1.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, + "punycode": { + "version": "1.4.1", + "from": "punycode@>=1.4.1 <2.0.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "optional": true + }, "qs": { - "version": "6.2.0", - "from": "qs@>=6.2.0 <6.3.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz", + "version": "6.3.0", + "from": "qs@>=6.3.0 <6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.0.tgz", "optional": true }, "rc": { "version": "1.1.6", - "from": "rc@>=1.1.0 <1.2.0", + "from": "rc@>=1.1.6 <1.2.0", "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.6.tgz", "optional": true, "dependencies": { @@ -4681,25 +4716,26 @@ } }, "readable-stream": { - "version": "2.1.4", + "version": "2.2.2", "from": "readable-stream@>=2.0.0 <3.0.0||>=1.1.13 <2.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.4.tgz" + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.2.tgz", + "optional": true }, "request": { - "version": "2.73.0", - "from": "request@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.73.0.tgz", + "version": "2.79.0", + "from": "request@>=2.79.0 <3.0.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", "optional": true }, "rimraf": { - "version": "2.5.3", - "from": "rimraf@>=2.5.0 <2.6.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.3.tgz" + "version": "2.5.4", + "from": "rimraf@>=2.5.4 <2.6.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz" }, "semver": { - "version": "5.2.0", - "from": "semver@>=5.2.0 <5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.2.0.tgz", + "version": "5.3.0", + "from": "semver@>=5.3.0 <5.4.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", "optional": true }, "set-blocking": { @@ -4709,9 +4745,9 @@ "optional": true }, "signal-exit": { - "version": "3.0.0", + "version": "3.0.2", "from": "signal-exit@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "optional": true }, "sntp": { @@ -4721,9 +4757,9 @@ "optional": true }, "sshpk": { - "version": "1.8.3", + "version": "1.10.1", "from": "sshpk@>=1.7.0 <2.0.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.8.3.tgz", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.1.tgz", "optional": true, "dependencies": { "assert-plus": { @@ -4740,9 +4776,9 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, "string-width": { - "version": "1.0.1", + "version": "1.0.2", "from": "string-width@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" }, "stringstream": { "version": "0.0.5", @@ -4762,26 +4798,40 @@ "optional": true }, "supports-color": { - "version": "2.0.0", - "from": "supports-color@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "version": "0.2.0", + "from": "supports-color@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", "optional": true }, "tar": { "version": "2.2.1", - "from": "tar@>=2.2.0 <2.3.0", + "from": "tar@>=2.2.1 <2.3.0", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz" }, "tar-pack": { - "version": "3.1.4", - "from": "tar-pack@>=3.1.0 <3.2.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.4.tgz", - "optional": true + "version": "3.3.0", + "from": "tar-pack@>=3.3.0 <3.4.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.3.0.tgz", + "optional": true, + "dependencies": { + "once": { + "version": "1.3.3", + "from": "once@>=1.3.3 <1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "optional": true + }, + "readable-stream": { + "version": "2.1.5", + "from": "readable-stream@>=2.1.4 <2.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "optional": true + } + } }, "tough-cookie": { - "version": "2.2.2", - "from": "tough-cookie@>=2.2.0 <2.3.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz", + "version": "2.3.2", + "from": "tough-cookie@>=2.3.0 <2.4.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", "optional": true }, "tunnel-agent": { @@ -4791,9 +4841,9 @@ "optional": true }, "tweetnacl": { - "version": "0.13.3", - "from": "tweetnacl@>=0.13.0 <0.14.0", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz", + "version": "0.14.5", + "from": "tweetnacl@>=0.14.0 <0.15.0", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "optional": true }, "uid-number": { @@ -4807,6 +4857,12 @@ "from": "util-deprecate@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" }, + "uuid": { + "version": "3.0.1", + "from": "uuid@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "optional": true + }, "verror": { "version": "1.3.6", "from": "verror@1.3.6", @@ -4834,12 +4890,12 @@ }, "fstream": { "version": "1.0.10", - "from": "fstream@>=1.0.2 <1.1.0", + "from": "fstream@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz" }, "fstream-ignore": { "version": "1.0.5", - "from": "fstream-ignore@>=1.0.1 <1.1.0", + "from": "fstream-ignore@>=1.0.5 <1.1.0", "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz" }, "ftp": { @@ -4867,6 +4923,18 @@ "from": "function-bind@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz" }, + "gauge": { + "version": "2.7.2", + "from": "gauge@>=2.7.1 <2.8.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.2.tgz", + "dependencies": { + "supports-color": { + "version": "0.2.0", + "from": "supports-color@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" + } + } + }, "gaze": { "version": "0.5.2", "from": "gaze@>=0.5.1 <0.6.0", @@ -5085,15 +5153,8 @@ }, "got": { "version": "6.7.1", - "from": "got@6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "dependencies": { - "timed-out": { - "version": "4.0.0", - "from": "timed-out@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.0.tgz" - } - } + "from": "got@>=6.1.1 <7.0.0", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz" }, "graceful-fs": { "version": "4.1.11", @@ -5403,9 +5464,9 @@ "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", "dependencies": { "ansi-regex": { - "version": "2.0.0", + "version": "2.1.1", "from": "ansi-regex@^2.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" }, "ansi-styles": { "version": "2.2.1", @@ -5677,6 +5738,11 @@ "from": "js-yaml@>=3.5.2 <3.6.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz" }, + "resolve": { + "version": "1.1.7", + "from": "resolve@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" + }, "rimraf": { "version": "2.2.8", "from": "rimraf@>=2.2.8 <2.3.0", @@ -5718,12 +5784,12 @@ }, "gulp-sourcemaps": { "version": "1.11.0", - "from": "gulp-sourcemaps@1.11.0", + "from": "gulp-sourcemaps@>=1.6.0 <2.0.0", "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.11.0.tgz", "dependencies": { "acorn": { "version": "4.0.4", - "from": "acorn@4.X", + "from": "acorn@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.4.tgz" }, "vinyl": { @@ -5751,14 +5817,14 @@ } }, "gulp-util": { - "version": "3.0.7", + "version": "3.0.8", "from": "gulp-util@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", "dependencies": { "dateformat": { - "version": "1.0.12", - "from": "dateformat@>=1.0.11 <2.0.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz" + "version": "2.0.0", + "from": "dateformat@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz" }, "minimist": { "version": "1.2.0", @@ -5919,9 +5985,9 @@ "resolved": "https://registry.npmjs.org/habitica-markdown/-/habitica-markdown-1.3.0.tgz", "dependencies": { "linkify-it": { - "version": "2.0.2", + "version": "2.0.3", "from": "linkify-it@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.2.tgz" + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz" }, "markdown-it": { "version": "8.0.0", @@ -6002,6 +6068,11 @@ "from": "has-gulplog@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz" }, + "has-unicode": { + "version": "2.0.1", + "from": "has-unicode@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + }, "hash-sum": { "version": "1.0.2", "from": "hash-sum@>=1.0.2 <2.0.0", @@ -6023,9 +6094,9 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz" }, "he": { - "version": "1.1.0", + "version": "1.1.1", "from": "he@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.0.tgz" + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz" }, "hoek": { "version": "2.16.3", @@ -6070,7 +6141,7 @@ }, "html-minifier": { "version": "3.2.3", - "from": "html-minifier@>=3.1.0 <4.0.0", + "from": "html-minifier@>=3.2.3 <4.0.0", "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.2.3.tgz", "dependencies": { "async": { @@ -6079,9 +6150,9 @@ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "clean-css": { - "version": "3.4.23", + "version": "3.4.24", "from": "clean-css@>=3.4.0 <3.5.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.23.tgz", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.24.tgz", "dependencies": { "commander": { "version": "2.8.1", @@ -6111,7 +6182,7 @@ }, "html-webpack-plugin": { "version": "2.26.0", - "from": "html-webpack-plugin@2.26.0", + "from": "html-webpack-plugin@>=2.8.1 <3.0.0", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.26.0.tgz", "dependencies": { "lodash": { @@ -6150,7 +6221,7 @@ }, "http-errors": { "version": "1.5.1", - "from": "http-errors@>=1.5.0 <1.6.0", + "from": "http-errors@>=1.5.1 <1.6.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz" }, "http-proxy": { @@ -6230,7 +6301,7 @@ }, "ignore": { "version": "3.2.0", - "from": "ignore@>=3.1.2 <4.0.0", + "from": "ignore@>=3.2.0 <4.0.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.2.0.tgz", "dev": true }, @@ -6255,9 +6326,9 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" }, "glob-parent": { - "version": "3.0.1", + "version": "3.1.0", "from": "glob-parent@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.0.1.tgz" + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz" }, "glob-stream": { "version": "5.3.5", @@ -6485,7 +6556,7 @@ }, "ini": { "version": "1.3.4", - "from": "ini@>=1.2.0 <2.0.0", + "from": "ini@>=1.3.0 <1.4.0", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" }, "inject-loader": { @@ -6645,9 +6716,9 @@ "optional": true }, "ipaddr.js": { - "version": "1.1.1", - "from": "ipaddr.js@1.1.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.1.1.tgz" + "version": "1.2.0", + "from": "ipaddr.js@1.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.2.0.tgz" }, "irregular-plurals": { "version": "1.2.0", @@ -6705,9 +6776,9 @@ "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", "dependencies": { "acorn": { - "version": "4.0.3", + "version": "4.0.4", "from": "acorn@>=4.0.2 <4.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.3.tgz" + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.4.tgz" } } }, @@ -6996,10 +7067,16 @@ } } }, + "resolve": { + "version": "1.1.7", + "from": "resolve@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "dev": true + }, "supports-color": { - "version": "3.1.2", + "version": "3.2.3", "from": "supports-color@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "dev": true }, "uglify-js": { @@ -7109,6 +7186,12 @@ } } }, + "resolve": { + "version": "1.1.7", + "from": "resolve@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "dev": true + }, "source-map": { "version": "0.2.0", "from": "source-map@>=0.2.0 <0.3.0", @@ -7117,9 +7200,9 @@ "optional": true }, "supports-color": { - "version": "3.1.2", + "version": "3.2.3", "from": "supports-color@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "dev": true }, "uglify-js": { @@ -7170,9 +7253,9 @@ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "clean-css": { - "version": "3.4.22", + "version": "3.4.24", "from": "clean-css@>=3.1.9 <4.0.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.22.tgz", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.24.tgz", "dependencies": { "commander": { "version": "2.8.1", @@ -7254,9 +7337,9 @@ "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.1.2.tgz" }, "jpegtran-bin": { - "version": "3.1.0", + "version": "3.2.0", "from": "jpegtran-bin@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz", "optional": true }, "jquery": { @@ -7270,9 +7353,9 @@ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz" }, "js-beautify": { - "version": "1.6.4", + "version": "1.6.8", "from": "js-beautify@>=1.6.3 <2.0.0", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.6.4.tgz" + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.6.8.tgz" }, "js-stringify": { "version": "1.0.2", @@ -7280,9 +7363,9 @@ "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz" }, "js-tokens": { - "version": "2.0.0", - "from": "js-tokens@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-2.0.0.tgz" + "version": "3.0.0", + "from": "js-tokens@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.0.tgz" }, "js-yaml": { "version": "3.7.0", @@ -7359,19 +7442,19 @@ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" }, "jsonparse": { - "version": "1.2.0", + "version": "1.3.0", "from": "jsonparse@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz" + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.0.tgz" }, "jsonpointer": { - "version": "4.0.0", + "version": "4.0.1", "from": "jsonpointer@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.0.tgz" + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz" }, "JSONStream": { - "version": "1.2.1", + "version": "1.3.0", "from": "JSONStream@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.2.1.tgz" + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.0.tgz" }, "jspm": { "version": "0.17.0-beta.32", @@ -7430,15 +7513,15 @@ } }, "pump": { - "version": "1.0.1", + "version": "1.0.2", "from": "pump@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", "optional": true }, "tar-fs": { - "version": "1.14.0", + "version": "1.15.0", "from": "tar-fs@>=1.13.0 <2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.14.0.tgz", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.15.0.tgz", "optional": true }, "tar-stream": { @@ -7468,15 +7551,15 @@ } }, "pump": { - "version": "1.0.1", + "version": "1.0.2", "from": "pump@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", "optional": true }, "tar-fs": { - "version": "1.14.0", + "version": "1.15.0", "from": "tar-fs@>=1.13.0 <2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.14.0.tgz", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.15.0.tgz", "optional": true }, "tar-stream": { @@ -7529,7 +7612,7 @@ }, "karma": { "version": "1.4.0", - "from": "karma@1.4.0", + "from": "karma@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/karma/-/karma-1.4.0.tgz", "dev": true, "dependencies": { @@ -7541,7 +7624,7 @@ }, "glob": { "version": "7.1.1", - "from": "glob@>=7.0.3 <8.0.0", + "from": "glob@>=7.1.1 <8.0.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", "dev": true }, @@ -7564,9 +7647,9 @@ "dev": true }, "useragent": { - "version": "2.1.10", + "version": "2.1.11", "from": "useragent@>=2.1.10 <3.0.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.1.10.tgz", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.1.11.tgz", "dev": true } } @@ -7674,10 +7757,16 @@ "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", "dev": true }, + "resolve": { + "version": "1.1.7", + "from": "resolve@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "dev": true + }, "supports-color": { - "version": "3.1.2", + "version": "3.2.3", "from": "supports-color@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "dev": true }, "uglify-js": { @@ -7737,9 +7826,9 @@ "dev": true, "dependencies": { "lodash": { - "version": "4.17.2", + "version": "4.17.4", "from": "lodash@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", "dev": true } } @@ -7772,7 +7861,7 @@ }, "karma-webpack": { "version": "1.8.1", - "from": "karma-webpack@1.8.1", + "from": "karma-webpack@>=1.7.0 <2.0.0", "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-1.8.1.tgz", "dev": true, "dependencies": { @@ -7877,9 +7966,9 @@ "dev": true }, "glob-parent": { - "version": "3.0.1", + "version": "3.1.0", "from": "glob-parent@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "dev": true }, "glob-stream": { @@ -7960,7 +8049,7 @@ }, "less": { "version": "2.7.2", - "from": "less@2.7.2", + "from": "less@>=2.7.1 <3.0.0", "resolved": "https://registry.npmjs.org/less/-/less-2.7.2.tgz", "dependencies": { "asap": { @@ -8294,9 +8383,9 @@ "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz" }, "lodash.isequal": { - "version": "4.4.0", + "version": "4.5.0", "from": "lodash.isequal@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.4.0.tgz" + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" }, "lodash.isfunction": { "version": "2.4.1", @@ -8400,6 +8489,11 @@ "from": "lodash.toplainobject@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.toplainobject/-/lodash.toplainobject-3.0.0.tgz" }, + "lodash.uniq": { + "version": "4.5.0", + "from": "lodash.uniq@>=4.3.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + }, "lodash.values": { "version": "2.4.1", "from": "lodash.values@>=2.4.1 <2.5.0", @@ -8472,9 +8566,9 @@ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz" }, "loose-envify": { - "version": "1.3.0", + "version": "1.3.1", "from": "loose-envify@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.0.tgz" + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" }, "loud-rejection": { "version": "1.6.0", @@ -8519,9 +8613,9 @@ "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz" }, "mailcomposer": { - "version": "4.0.0", - "from": "mailcomposer@4.0.0", - "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.0.tgz" + "version": "4.0.1", + "from": "mailcomposer@4.0.1", + "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.1.tgz" }, "makeerror": { "version": "1.0.11", @@ -8565,9 +8659,9 @@ "resolved": "https://registry.npmjs.org/markdown-it-linkify-images/-/markdown-it-linkify-images-1.0.0.tgz" }, "math-expression-evaluator": { - "version": "1.2.14", + "version": "1.2.15", "from": "math-expression-evaluator@>=1.2.14 <2.0.0", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.14.tgz" + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.15.tgz" }, "maxmin": { "version": "0.2.2", @@ -8662,7 +8756,14 @@ "method-override": { "version": "2.3.7", "from": "method-override@>=2.3.5 <3.0.0", - "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.3.7.tgz" + "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.3.7.tgz", + "dependencies": { + "debug": { + "version": "2.3.3", + "from": "debug@2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz" + } + } }, "methods": { "version": "1.1.2", @@ -8685,14 +8786,14 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" }, "mime-db": { - "version": "1.25.0", - "from": "mime-db@>=1.25.0 <1.26.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.25.0.tgz" + "version": "1.26.0", + "from": "mime-db@>=1.26.0 <1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.26.0.tgz" }, "mime-types": { - "version": "2.1.13", + "version": "2.1.14", "from": "mime-types@>=2.1.7 <2.2.0", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.13.tgz" + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.14.tgz" }, "mimic-fn": { "version": "1.1.0", @@ -8901,62 +9002,38 @@ "version": "2.2.21", "from": "mongodb@2.2.21", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.21.tgz", - "dev": true, "dependencies": { "es6-promise": { "version": "3.2.1", "from": "es6-promise@3.2.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz" }, "readable-stream": { "version": "2.1.5", "from": "readable-stream@2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz" } } }, "mongodb-core": { "version": "2.1.6", "from": "mongodb-core@2.1.6", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.6.tgz", - "dev": true + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.6.tgz" }, "mongoose": { - "version": "4.7.6", - "from": "mongoose@4.7.6", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.7.6.tgz", + "version": "4.7.7", + "from": "mongoose@>=4.7.1 <5.0.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.7.7.tgz", "dependencies": { "async": { "version": "2.1.4", "from": "async@2.1.4", "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz" }, - "es6-promise": { - "version": "3.2.1", - "from": "es6-promise@3.2.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz" - }, "lodash": { "version": "4.17.4", "from": "lodash@>=4.14.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" - }, - "mongodb": { - "version": "2.2.16", - "from": "mongodb@2.2.16", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.16.tgz" - }, - "mongodb-core": { - "version": "2.1.2", - "from": "mongodb-core@2.1.2", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.2.tgz" - }, - "readable-stream": { - "version": "2.1.5", - "from": "readable-stream@2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz" } } }, @@ -8973,7 +9050,7 @@ }, "monk": { "version": "3.1.3", - "from": "monk@3.1.3", + "from": "monk@>=3.1.3 <4.0.0", "resolved": "https://registry.npmjs.org/monk/-/monk-3.1.3.tgz", "dev": true }, @@ -9079,10 +9156,9 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz" }, "nan": { - "version": "2.4.0", - "from": "nan@>=2.3.0 <3.0.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz", - "optional": true + "version": "2.5.0", + "from": "nan@2.5.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.5.0.tgz" }, "natives": { "version": "1.1.0", @@ -9187,7 +9263,7 @@ }, "newrelic": { "version": "1.36.1", - "from": "newrelic@1.36.1", + "from": "newrelic@>=1.27.2 <2.0.0", "resolved": "https://registry.npmjs.org/newrelic/-/newrelic-1.36.1.tgz", "dependencies": { "concat-stream": { @@ -9374,9 +9450,9 @@ "resolved": "https://registry.npmjs.org/node-bitmap/-/node-bitmap-0.0.1.tgz" }, "node-forge": { - "version": "0.6.46", + "version": "0.6.47", "from": "node-forge@>=0.6.20 <0.7.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.46.tgz" + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.47.tgz" }, "node-gcm": { "version": "0.14.4", @@ -9445,15 +9521,52 @@ } } }, + "node-pre-gyp": { + "version": "0.6.32", + "from": "node-pre-gyp@0.6.32", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz", + "dependencies": { + "form-data": { + "version": "2.1.2", + "from": "form-data@>=2.1.1 <2.2.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz" + }, + "qs": { + "version": "6.3.0", + "from": "qs@>=6.3.0 <6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.0.tgz" + }, + "request": { + "version": "2.79.0", + "from": "request@>=2.79.0 <3.0.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz" + }, + "semver": { + "version": "5.3.0", + "from": "semver@>=5.3.0 <5.4.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz" + }, + "uuid": { + "version": "3.0.1", + "from": "uuid@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz" + } + } + }, + "node-status-codes": { + "version": "1.0.0", + "from": "node-status-codes@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz" + }, "node-uuid": { "version": "1.4.7", "from": "node-uuid@>=1.4.7 <1.5.0", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" }, "nodemailer": { - "version": "2.7.0", + "version": "2.7.2", "from": "nodemailer@>=2.3.2 <3.0.0", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.0.tgz" + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.2.tgz" }, "nodemailer-direct-transport": { "version": "3.3.2", @@ -9614,7 +9727,7 @@ }, "nopt": { "version": "3.0.6", - "from": "nopt@>=3.0.0 <3.1.0", + "from": "nopt@>=3.0.6 <3.1.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" }, "noptify": { @@ -9645,9 +9758,9 @@ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" }, "normalize-url": { - "version": "1.8.0", + "version": "1.9.0", "from": "normalize-url@>=1.4.0 <2.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.8.0.tgz" + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.0.tgz" }, "npmconf": { "version": "2.1.2", @@ -9663,9 +9776,19 @@ "version": "4.3.6", "from": "semver@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0||>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" + }, + "uid-number": { + "version": "0.0.5", + "from": "uid-number@0.0.5", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz" } } }, + "npmlog": { + "version": "4.0.2", + "from": "npmlog@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.2.tgz" + }, "nth-check": { "version": "1.0.1", "from": "nth-check@>=1.0.1 <1.1.0", @@ -9682,9 +9805,9 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" }, "oauth": { - "version": "0.9.14", + "version": "0.9.15", "from": "oauth@>=0.9.0 <0.10.0", - "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.14.tgz" + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz" }, "oauth-sign": { "version": "0.8.2", @@ -9697,9 +9820,9 @@ "resolved": "https://registry.npmjs.org/obj-extend/-/obj-extend-0.1.0.tgz" }, "object-assign": { - "version": "4.1.0", + "version": "4.1.1", "from": "object-assign@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz" + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" }, "object-component": { "version": "0.0.3", @@ -9775,7 +9898,7 @@ }, "optionator": { "version": "0.8.2", - "from": "optionator@>=0.8.1 <0.9.0", + "from": "optionator@>=0.8.2 <0.9.0", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "dev": true, "dependencies": { @@ -9930,7 +10053,7 @@ }, "pageres": { "version": "4.3.0", - "from": "pageres@4.3.0", + "from": "pageres@>=4.1.1 <5.0.0", "resolved": "https://registry.npmjs.org/pageres/-/pageres-4.3.0.tgz", "dependencies": { "lodash.template": { @@ -10034,9 +10157,9 @@ "resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-1.0.0.tgz" }, "passport-oauth2": { - "version": "1.3.0", + "version": "1.4.0", "from": "passport-oauth2@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.3.0.tgz" + "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.4.0.tgz" }, "passport-strategy": { "version": "1.0.0", @@ -10266,14 +10389,14 @@ "resolved": "https://registry.npmjs.org/pngjs2/-/pngjs2-1.2.0.tgz" }, "postcss": { - "version": "5.2.6", - "from": "postcss@>=5.2.5 <6.0.0", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.6.tgz", + "version": "5.2.11", + "from": "postcss@>=5.2.11 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.11.tgz", "dependencies": { "supports-color": { - "version": "3.1.2", - "from": "supports-color@>=3.1.2 <4.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz" + "version": "3.2.3", + "from": "supports-color@>=3.2.3 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" } } }, @@ -10288,9 +10411,9 @@ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.1.tgz" }, "postcss-convert-values": { - "version": "2.5.0", + "version": "2.6.0", "from": "postcss-convert-values@>=2.3.4 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.5.0.tgz" + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.0.tgz" }, "postcss-discard-comments": { "version": "2.0.4", @@ -10338,14 +10461,14 @@ "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz" }, "postcss-merge-longhand": { - "version": "2.0.1", + "version": "2.0.2", "from": "postcss-merge-longhand@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.1.tgz" + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz" }, "postcss-merge-rules": { - "version": "2.0.11", + "version": "2.1.1", "from": "postcss-merge-rules@>=2.0.3 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.0.11.tgz" + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.1.tgz" }, "postcss-message-helpers": { "version": "2.0.0", @@ -10363,14 +10486,14 @@ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz" }, "postcss-minify-params": { - "version": "1.0.5", + "version": "1.2.2", "from": "postcss-minify-params@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.0.5.tgz" + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz" }, "postcss-minify-selectors": { - "version": "2.0.7", + "version": "2.1.1", "from": "postcss-minify-selectors@>=2.0.4 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.0.7.tgz" + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz" }, "postcss-modules-extract-imports": { "version": "1.0.1", @@ -10422,24 +10545,24 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz" }, "postcss-normalize-url": { - "version": "3.0.7", + "version": "3.0.8", "from": "postcss-normalize-url@>=3.0.7 <4.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.7.tgz" + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz" }, "postcss-ordered-values": { - "version": "2.2.2", + "version": "2.2.3", "from": "postcss-ordered-values@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.2.tgz" + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz" }, "postcss-reduce-idents": { - "version": "2.3.1", + "version": "2.4.0", "from": "postcss-reduce-idents@>=2.2.2 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.3.1.tgz" + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz" }, "postcss-reduce-initial": { - "version": "1.0.0", + "version": "1.0.1", "from": "postcss-reduce-initial@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz" }, "postcss-reduce-transforms": { "version": "1.0.4", @@ -10448,13 +10571,13 @@ }, "postcss-selector-parser": { "version": "2.2.2", - "from": "postcss-selector-parser@>=2.0.0 <3.0.0", + "from": "postcss-selector-parser@>=2.2.2 <3.0.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.2.tgz" }, "postcss-svgo": { - "version": "2.1.5", + "version": "2.1.6", "from": "postcss-svgo@>=2.1.1 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.5.tgz" + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz" }, "postcss-unique-selectors": { "version": "2.0.2", @@ -10605,9 +10728,9 @@ } }, "proxy-addr": { - "version": "1.1.2", + "version": "1.1.3", "from": "proxy-addr@>=1.1.2 <1.2.0", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.2.tgz" + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.3.tgz" }, "proxy-agent": { "version": "2.0.0", @@ -10696,9 +10819,9 @@ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, "clean-css": { - "version": "3.4.22", + "version": "3.4.24", "from": "clean-css@>=3.3.0 <4.0.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.22.tgz" + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.24.tgz" }, "commander": { "version": "2.8.1", @@ -10796,7 +10919,7 @@ "push-notify": { "version": "1.2.0", "from": "habitrpg/push-notify#v1.2.0", - "resolved": "git://github.com/habitrpg/push-notify.git#6bc2b5fdb1bdc9649b9ec1964d79ca50187fc8a9", + "resolved": "git+https://github.com/habitrpg/push-notify.git#6bc2b5fdb1bdc9649b9ec1964d79ca50187fc8a9", "dependencies": { "lodash": { "version": "4.17.4", @@ -10827,9 +10950,9 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.1.tgz" }, "query-string": { - "version": "4.2.3", + "version": "4.3.1", "from": "query-string@>=4.1.0 <5.0.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.2.3.tgz" + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.1.tgz" }, "querystring": { "version": "0.2.0", @@ -10895,27 +11018,15 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" }, "raw-body": { - "version": "2.1.7", - "from": "raw-body@>=2.1.7 <2.2.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", - "dependencies": { - "iconv-lite": { - "version": "0.4.13", - "from": "iconv-lite@0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" - } - } + "version": "2.2.0", + "from": "raw-body@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz" }, "rc": { "version": "1.1.6", - "from": "rc@>=1.1.2 <2.0.0", + "from": "rc@>=1.1.6 <1.2.0", "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.6.tgz", "dependencies": { - "deep-extend": { - "version": "0.4.1", - "from": "deep-extend@>=0.4.0 <0.5.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz" - }, "minimist": { "version": "1.2.0", "from": "minimist@>=1.2.0 <2.0.0", @@ -11166,11 +11277,6 @@ "from": "require_optional@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.0.tgz", "dependencies": { - "resolve-from": { - "version": "2.0.0", - "from": "resolve-from@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz" - }, "semver": { "version": "5.3.0", "from": "semver@>=5.1.0 <6.0.0", @@ -11188,7 +11294,15 @@ "version": "1.0.3", "from": "require-uncached@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "dev": true + "dev": true, + "dependencies": { + "resolve-from": { + "version": "1.0.1", + "from": "resolve-from@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "dev": true + } + } }, "requires-port": { "version": "1.0.0", @@ -11197,9 +11311,9 @@ "dev": true }, "resolve": { - "version": "1.1.7", + "version": "1.2.0", "from": "resolve@>=1.1.4 <2.0.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.2.0.tgz" }, "resolve-dir": { "version": "0.1.1", @@ -11207,10 +11321,9 @@ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz" }, "resolve-from": { - "version": "1.0.1", - "from": "resolve-from@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "dev": true + "version": "2.0.0", + "from": "resolve-from@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz" }, "resolve-url": { "version": "0.2.1", @@ -11304,9 +11417,9 @@ "dev": true }, "sane": { - "version": "1.4.1", + "version": "1.5.0", "from": "sane@>=1.3.3 <2.0.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-1.4.1.tgz", + "resolved": "https://registry.npmjs.org/sane/-/sane-1.5.0.tgz", "optional": true, "dependencies": { "minimist": { @@ -11469,9 +11582,38 @@ "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.3.2.tgz" }, "serve-static": { - "version": "1.11.1", + "version": "1.11.2", "from": "serve-static@>=1.11.1 <1.12.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.11.1.tgz" + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.11.2.tgz", + "dependencies": { + "debug": { + "version": "2.2.0", + "from": "debug@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "dependencies": { + "ms": { + "version": "0.7.1", + "from": "ms@0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + } + }, + "mime": { + "version": "1.3.4", + "from": "mime@1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" + }, + "send": { + "version": "0.14.2", + "from": "send@0.14.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.14.2.tgz" + } + } + }, + "set-blocking": { + "version": "2.0.0", + "from": "set-blocking@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" }, "set-immediate-shim": { "version": "1.0.1", @@ -11537,7 +11679,7 @@ }, "sinon": { "version": "1.17.7", - "from": "sinon@1.17.7", + "from": "sinon@>=1.17.2 <2.0.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", "dev": true, "dependencies": { @@ -11583,9 +11725,9 @@ "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" }, "smart-buffer": { - "version": "1.0.11", + "version": "1.0.13", "from": "smart-buffer@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.0.11.tgz" + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.0.13.tgz" }, "smtp-connection": { "version": "2.12.0", @@ -11601,19 +11743,49 @@ "version": "1.7.2", "from": "socket.io@1.7.2", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.2.tgz", - "dev": true + "dev": true, + "dependencies": { + "debug": { + "version": "2.3.3", + "from": "debug@2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "from": "object-assign@4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "dev": true + } + } }, "socket.io-adapter": { "version": "0.5.0", "from": "socket.io-adapter@0.5.0", "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", - "dev": true + "dev": true, + "dependencies": { + "debug": { + "version": "2.3.3", + "from": "debug@2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "dev": true + } + } }, "socket.io-client": { "version": "1.7.2", "from": "socket.io-client@1.7.2", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.2.tgz", - "dev": true + "dev": true, + "dependencies": { + "debug": { + "version": "2.3.3", + "from": "debug@2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "dev": true + } + } }, "socket.io-parser": { "version": "2.3.1", @@ -11664,9 +11836,9 @@ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz" }, "source-list-map": { - "version": "0.1.7", + "version": "0.1.8", "from": "source-list-map@>=0.1.4 <0.2.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.7.tgz" + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz" }, "source-map": { "version": "0.5.6", @@ -11679,9 +11851,9 @@ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz" }, "source-map-support": { - "version": "0.4.6", + "version": "0.4.10", "from": "source-map-support@>=0.4.2 <0.5.0", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.6.tgz" + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.10.tgz" }, "source-map-url": { "version": "0.3.0", @@ -11770,9 +11942,9 @@ "optional": true }, "sshpk": { - "version": "1.10.1", + "version": "1.10.2", "from": "sshpk@>=1.7.0 <2.0.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.1.tgz", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.2.tgz", "dependencies": { "assert-plus": { "version": "1.0.0", @@ -11896,9 +12068,9 @@ "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz" }, "stream-http": { - "version": "2.5.0", + "version": "2.6.3", "from": "stream-http@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.5.0.tgz", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.6.3.tgz", "dependencies": { "readable-stream": { "version": "2.2.2", @@ -12041,9 +12213,9 @@ "resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz" }, "stripe": { - "version": "4.14.0", + "version": "4.15.0", "from": "stripe@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/stripe/-/stripe-4.14.0.tgz", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-4.15.0.tgz", "dependencies": { "bluebird": { "version": "2.11.0", @@ -12121,6 +12293,11 @@ "from": "form-data@1.0.0-rc3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz" }, + "formidable": { + "version": "1.0.17", + "from": "formidable@>=1.0.14 <1.1.0", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.17.tgz" + }, "isarray": { "version": "0.0.1", "from": "isarray@0.0.1", @@ -12256,11 +12433,43 @@ "from": "tapable@>=0.1.8 <0.2.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz" }, + "tar": { + "version": "2.2.1", + "from": "tar@>=2.2.1 <2.3.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz" + }, "tar-fs": { "version": "0.5.2", "from": "tar-fs@0.5.2", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-0.5.2.tgz" }, + "tar-pack": { + "version": "3.3.0", + "from": "tar-pack@>=3.3.0 <3.4.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.3.0.tgz", + "dependencies": { + "debug": { + "version": "2.2.0", + "from": "debug@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz" + }, + "ms": { + "version": "0.7.1", + "from": "ms@0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + }, + "once": { + "version": "1.3.3", + "from": "once@>=1.3.3 <1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz" + }, + "readable-stream": { + "version": "2.1.5", + "from": "readable-stream@>=2.1.4 <2.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz" + } + } + }, "tar-stream": { "version": "0.4.7", "from": "tar-stream@>=0.4.6 <0.5.0", @@ -12350,9 +12559,9 @@ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.0.1.tgz" }, "timed-out": { - "version": "3.0.0", - "from": "timed-out@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.0.0.tgz" + "version": "4.0.1", + "from": "timed-out@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz" }, "timers-browserify": { "version": "1.4.2", @@ -12553,9 +12762,9 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" }, "tweetnacl": { - "version": "0.14.4", + "version": "0.14.5", "from": "tweetnacl@>=0.14.0 <0.15.0", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.4.tgz", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "optional": true }, "type-check": { @@ -12572,7 +12781,7 @@ }, "type-is": { "version": "1.6.14", - "from": "type-is@>=1.6.13 <1.7.0", + "from": "type-is@>=1.6.14 <1.7.0", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.14.tgz" }, "typedarray": { @@ -12622,9 +12831,9 @@ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz" }, "uid-number": { - "version": "0.0.5", - "from": "uid-number@0.0.5", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz" + "version": "0.0.6", + "from": "uid-number@>=0.0.6 <0.1.0", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz" }, "uid2": { "version": "0.0.3", @@ -12667,9 +12876,9 @@ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" }, "uniqid": { - "version": "4.1.0", + "version": "4.1.1", "from": "uniqid@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.0.tgz" + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz" }, "uniqs": { "version": "2.0.0", @@ -13077,9 +13286,9 @@ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" }, "vue": { - "version": "2.1.8", - "from": "vue@2.1.8", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.1.8.tgz" + "version": "2.1.10", + "from": "vue@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.1.10.tgz" }, "vue-hot-reload-api": { "version": "1.3.3", @@ -13097,16 +13306,16 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz" }, "vue-hot-reload-api": { - "version": "2.0.6", + "version": "2.0.8", "from": "vue-hot-reload-api@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.0.6.tgz" + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.0.8.tgz" } } }, "vue-router": { - "version": "2.1.1", + "version": "2.1.3", "from": "vue-router@>=2.0.0-rc.5 <3.0.0", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-2.1.1.tgz" + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-2.1.3.tgz" }, "vue-style-loader": { "version": "1.0.0", @@ -13114,14 +13323,14 @@ "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-1.0.0.tgz" }, "vue-template-compiler": { - "version": "2.1.8", - "from": "vue-template-compiler@2.1.8", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.1.8.tgz" + "version": "2.1.10", + "from": "vue-template-compiler@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.1.10.tgz" }, "vue-template-es2015-compiler": { - "version": "1.3.2", + "version": "1.5.0", "from": "vue-template-es2015-compiler@>=1.2.2 <2.0.0", - "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.3.2.tgz" + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.5.0.tgz" }, "w3counter": { "version": "3.0.1", @@ -13173,9 +13382,9 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz" }, "supports-color": { - "version": "3.1.2", + "version": "3.2.3", "from": "supports-color@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz" + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" }, "uglify-js": { "version": "2.7.5", @@ -13205,7 +13414,7 @@ }, "webpack-dev-middleware": { "version": "1.9.0", - "from": "webpack-dev-middleware@1.9.0", + "from": "webpack-dev-middleware@>=1.4.0 <2.0.0", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.9.0.tgz", "dev": true, "dependencies": { @@ -13225,7 +13434,7 @@ }, "webpack-hot-middleware": { "version": "2.15.0", - "from": "webpack-hot-middleware@2.15.0", + "from": "webpack-hot-middleware@>=2.6.0 <3.0.0", "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.15.0.tgz", "dev": true }, @@ -13242,9 +13451,9 @@ } }, "webpack-sources": { - "version": "0.1.3", + "version": "0.1.4", "from": "webpack-sources@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.1.3.tgz" + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.1.4.tgz" }, "when": { "version": "3.7.7", @@ -13261,6 +13470,11 @@ "from": "which@>=1.0.5 <1.1.0", "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz" }, + "wide-align": { + "version": "1.1.0", + "from": "wide-align@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz" + }, "win-release": { "version": "1.1.1", "from": "win-release@>=1.0.0 <2.0.0", @@ -13272,9 +13486,9 @@ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" }, "winston": { - "version": "2.3.0", + "version": "2.3.1", "from": "winston@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.3.1.tgz", "dependencies": { "async": { "version": "1.0.0", @@ -13325,9 +13539,9 @@ "dev": true }, "write-file-atomic": { - "version": "1.2.0", + "version": "1.3.1", "from": "write-file-atomic@>=1.1.2 <2.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.2.0.tgz" + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.1.tgz" }, "ws": { "version": "1.1.1", @@ -13361,9 +13575,9 @@ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", "dependencies": { "lodash": { - "version": "4.17.2", + "version": "4.17.4", "from": "lodash@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" }, "xmlbuilder": { "version": "4.2.1", diff --git a/package.json b/package.json index 6cdf28e474..dfa2c807d8 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "babel-register": "^6.6.0", "babel-runtime": "^6.11.6", "babelify": "^7.2.0", + "bcrypt": "^1.0.2", "bluebird": "^3.3.5", "body-parser": "^1.15.0", "bower": "~1.3.12", diff --git a/test/api/v3/integration/user/DELETE-user.test.js b/test/api/v3/integration/user/DELETE-user.test.js index 2a284add53..d0e4504135 100644 --- a/test/api/v3/integration/user/DELETE-user.test.js +++ b/test/api/v3/integration/user/DELETE-user.test.js @@ -11,6 +11,10 @@ import { map, } from 'lodash'; import Bluebird from 'bluebird'; +import { + sha1MakeSalt, + sha1Encrypt as sha1EncryptPassword, +} from '../../../../../website/server/libs/password'; describe('DELETE /user', () => { let user; @@ -67,6 +71,30 @@ describe('DELETE /user', () => { await expect(checkExistence('users', user._id)).to.eventually.eql(false); }); + it('deletes the user with a legacy sha1 password', async () => { + let textPassword = 'mySecretPassword'; + let salt = sha1MakeSalt(); + let sha1HashedPassword = sha1EncryptPassword(textPassword, salt); + + await user.update({ + 'auth.local.hashed_password': sha1HashedPassword, + 'auth.local.passwordHashMethod': 'sha1', + 'auth.local.salt': salt, + }); + + await user.sync(); + + expect(user.auth.local.passwordHashMethod).to.equal('sha1'); + expect(user.auth.local.salt).to.equal(salt); + expect(user.auth.local.hashed_password).to.equal(sha1HashedPassword); + + // delete the user + await user.del('/user', { + password: textPassword, + }); + await expect(checkExistence('users', user._id)).to.eventually.eql(false); + }); + context('last member of a party', () => { let party; diff --git a/test/api/v3/integration/user/GET-user.test.js b/test/api/v3/integration/user/GET-user.test.js index d23b8dea6a..f828d4fbb2 100644 --- a/test/api/v3/integration/user/GET-user.test.js +++ b/test/api/v3/integration/user/GET-user.test.js @@ -23,6 +23,7 @@ describe('GET /user', () => { let returnedUser = await user.get('/user'); expect(returnedUser.auth.local.hashed_password).to.not.exist; + expect(returnedUser.auth.local.passwordHashMethod).to.not.exist; expect(returnedUser.auth.local.salt).to.not.exist; expect(returnedUser.apiToken).to.not.exist; }); diff --git a/test/api/v3/integration/user/auth/POST-login-local.test.js b/test/api/v3/integration/user/auth/POST-login-local.test.js index 86a49ff548..718aed3a6f 100644 --- a/test/api/v3/integration/user/auth/POST-login-local.test.js +++ b/test/api/v3/integration/user/auth/POST-login-local.test.js @@ -3,6 +3,11 @@ import { requester, translate as t, } from '../../../../../helpers/api-integration/v3'; +import { + bcryptCompare, + sha1MakeSalt, + sha1Encrypt as sha1EncryptPassword, +} from '../../../../../../website/server/libs/password'; describe('POST /user/auth/local/login', () => { let api; @@ -72,4 +77,35 @@ describe('POST /user/auth/local/login', () => { message: t('invalidReqParams'), }); }); + + it('converts user with SHA1 encrypted password to bcrypt encryption', async () => { + let textPassword = 'mySecretPassword'; + let salt = sha1MakeSalt(); + let sha1HashedPassword = sha1EncryptPassword(textPassword, salt); + + await user.update({ + 'auth.local.hashed_password': sha1HashedPassword, + 'auth.local.passwordHashMethod': 'sha1', + 'auth.local.salt': salt, + }); + + await user.sync(); + expect(user.auth.local.passwordHashMethod).to.equal('sha1'); + expect(user.auth.local.salt).to.equal(salt); + expect(user.auth.local.hashed_password).to.equal(sha1HashedPassword); + + // login + await api.post(endpoint, { + username: user.auth.local.email, + password: textPassword, + }); + + await user.sync(); + expect(user.auth.local.passwordHashMethod).to.equal('bcrypt'); + expect(user.auth.local.salt).to.be.undefined; + expect(user.auth.local.hashed_password).not.to.equal(sha1HashedPassword); + + let isValidPassword = await bcryptCompare(textPassword, user.auth.local.hashed_password); + expect(isValidPassword).to.equal(true); + }); }); diff --git a/test/api/v3/integration/user/auth/POST-user_reset_password.test.js b/test/api/v3/integration/user/auth/POST-user_reset_password.test.js index 773d199db6..bc10c9a06d 100644 --- a/test/api/v3/integration/user/auth/POST-user_reset_password.test.js +++ b/test/api/v3/integration/user/auth/POST-user_reset_password.test.js @@ -2,6 +2,10 @@ import { generateUser, translate as t, } from '../../../../../helpers/api-integration/v3'; +import { + sha1MakeSalt, + sha1Encrypt as sha1EncryptPassword, +} from '../../../../../../website/server/libs/password'; describe('POST /user/reset-password', async () => { let endpoint = '/user/reset-password'; @@ -21,6 +25,33 @@ describe('POST /user/reset-password', async () => { expect(user.auth.local.hashed_password).to.not.eql(previousPassword); }); + it('converts user with SHA1 encrypted password to bcrypt encryption', async () => { + let textPassword = 'mySecretPassword'; + let salt = sha1MakeSalt(); + let sha1HashedPassword = sha1EncryptPassword(textPassword, salt); + + await user.update({ + 'auth.local.hashed_password': sha1HashedPassword, + 'auth.local.passwordHashMethod': 'sha1', + 'auth.local.salt': salt, + }); + + await user.sync(); + expect(user.auth.local.passwordHashMethod).to.equal('sha1'); + expect(user.auth.local.salt).to.equal(salt); + expect(user.auth.local.hashed_password).to.equal(sha1HashedPassword); + + // update email + await user.post(endpoint, { + email: user.auth.local.email, + }); + + await user.sync(); + expect(user.auth.local.passwordHashMethod).to.equal('bcrypt'); + expect(user.auth.local.salt).to.be.undefined; + expect(user.auth.local.hashed_password).not.to.equal(sha1HashedPassword); + }); + it('same message on error as on success', async () => { let response = await user.post(endpoint, { email: 'nonExistent@email.com', diff --git a/test/api/v3/integration/user/auth/PUT-user_update_email.test.js b/test/api/v3/integration/user/auth/PUT-user_update_email.test.js index 4a3086cbe9..bc842f292d 100644 --- a/test/api/v3/integration/user/auth/PUT-user_update_email.test.js +++ b/test/api/v3/integration/user/auth/PUT-user_update_email.test.js @@ -2,6 +2,11 @@ import { generateUser, translate as t, } from '../../../../../helpers/api-v3-integration.helper'; +import { + bcryptCompare, + sha1MakeSalt, + sha1Encrypt as sha1EncryptPassword, +} from '../../../../../../website/server/libs/password'; const ENDPOINT = '/user/auth/update-email'; @@ -66,6 +71,41 @@ describe('PUT /user/auth/update-email', () => { message: t('cannotFulfillReq'), }); }); + + it('converts user with SHA1 encrypted password to bcrypt encryption', async () => { + let textPassword = 'mySecretPassword'; + let salt = sha1MakeSalt(); + let sha1HashedPassword = sha1EncryptPassword(textPassword, salt); + let myNewEmail = 'my-new-random-email@example.net'; + + await user.update({ + 'auth.local.hashed_password': sha1HashedPassword, + 'auth.local.passwordHashMethod': 'sha1', + 'auth.local.salt': salt, + }); + + await user.sync(); + expect(user.auth.local.passwordHashMethod).to.equal('sha1'); + expect(user.auth.local.salt).to.equal(salt); + expect(user.auth.local.hashed_password).to.equal(sha1HashedPassword); + + // update email + let response = await user.put(ENDPOINT, { + newEmail: myNewEmail, + password: textPassword, + }); + expect(response).to.eql({ email: myNewEmail }); + + await user.sync(); + + expect(user.auth.local.email).to.equal(myNewEmail); + expect(user.auth.local.passwordHashMethod).to.equal('bcrypt'); + expect(user.auth.local.salt).to.be.undefined; + expect(user.auth.local.hashed_password).not.to.equal(sha1HashedPassword); + + let isValidPassword = await bcryptCompare(textPassword, user.auth.local.hashed_password); + expect(isValidPassword).to.equal(true); + }); }); context('Social Login User', async () => { diff --git a/test/api/v3/integration/user/auth/PUT-user_update_password.test.js b/test/api/v3/integration/user/auth/PUT-user_update_password.test.js index 6821e18d3e..1cba7feb4f 100644 --- a/test/api/v3/integration/user/auth/PUT-user_update_password.test.js +++ b/test/api/v3/integration/user/auth/PUT-user_update_password.test.js @@ -2,6 +2,11 @@ import { generateUser, translate as t, } from '../../../../../helpers/api-v3-integration.helper'; +import { + bcryptCompare, + sha1MakeSalt, + sha1Encrypt as sha1EncryptPassword, +} from '../../../../../../website/server/libs/password'; const ENDPOINT = '/user/auth/update-password'; @@ -89,4 +94,36 @@ describe('PUT /user/auth/update-password', async () => { message: t('invalidReqParams'), }); }); + + it('converts user with SHA1 encrypted password to bcrypt encryption', async () => { + let textPassword = 'mySecretPassword'; + let salt = sha1MakeSalt(); + let sha1HashedPassword = sha1EncryptPassword(textPassword, salt); + + await user.update({ + 'auth.local.hashed_password': sha1HashedPassword, + 'auth.local.passwordHashMethod': 'sha1', + 'auth.local.salt': salt, + }); + + user.sync(); + expect(user.auth.local.passwordHashMethod).to.equal('sha1'); + expect(user.auth.local.salt).to.equal(salt); + expect(user.auth.local.hashed_password).to.equal(sha1HashedPassword); + + // update email + await user.put(ENDPOINT, { + password: textPassword, + newPassword, + confirmPassword: newPassword, + }); + + await user.sync(); + expect(user.auth.local.passwordHashMethod).to.equal('bcrypt'); + expect(user.auth.local.salt).to.be.undefined; + expect(user.auth.local.hashed_password).not.to.equal(sha1HashedPassword); + + let isValidPassword = await bcryptCompare(newPassword, user.auth.local.hashed_password); + expect(isValidPassword).to.equal(true); + }); }); diff --git a/test/api/v3/integration/user/auth/PUT-user_update_username.test.js b/test/api/v3/integration/user/auth/PUT-user_update_username.test.js index 372248db84..85a9c37395 100644 --- a/test/api/v3/integration/user/auth/PUT-user_update_username.test.js +++ b/test/api/v3/integration/user/auth/PUT-user_update_username.test.js @@ -2,6 +2,11 @@ import { generateUser, translate as t, } from '../../../../../helpers/api-v3-integration.helper'; +import { + bcryptCompare, + sha1MakeSalt, + sha1Encrypt as sha1EncryptPassword, +} from '../../../../../../website/server/libs/password'; const ENDPOINT = '/user/auth/update-username'; @@ -24,6 +29,41 @@ describe('PUT /user/auth/update-username', async () => { expect(user.auth.local.username).to.eql(newUsername); }); + it('converts user with SHA1 encrypted password to bcrypt encryption', async () => { + let myNewUsername = 'my-new-username'; + let textPassword = 'mySecretPassword'; + let salt = sha1MakeSalt(); + let sha1HashedPassword = sha1EncryptPassword(textPassword, salt); + + await user.update({ + 'auth.local.hashed_password': sha1HashedPassword, + 'auth.local.passwordHashMethod': 'sha1', + 'auth.local.salt': salt, + }); + + await user.sync(); + expect(user.auth.local.passwordHashMethod).to.equal('sha1'); + expect(user.auth.local.salt).to.equal(salt); + expect(user.auth.local.hashed_password).to.equal(sha1HashedPassword); + + // update email + let response = await user.put(ENDPOINT, { + username: myNewUsername, + password: textPassword, + }); + expect(response).to.eql({ username: myNewUsername }); + + await user.sync(); + + expect(user.auth.local.username).to.eql(myNewUsername); + expect(user.auth.local.passwordHashMethod).to.equal('bcrypt'); + expect(user.auth.local.salt).to.be.undefined; + expect(user.auth.local.hashed_password).not.to.equal(sha1HashedPassword); + + let isValidPassword = await bcryptCompare(textPassword, user.auth.local.hashed_password); + expect(isValidPassword).to.equal(true); + }); + context('errors', async () => { it('prevents username update if new username is already taken', async () => { let existingUsername = 'existing-username'; diff --git a/test/api/v3/unit/libs/password.test.js b/test/api/v3/unit/libs/password.test.js index 29de44676c..6d79f805ed 100644 --- a/test/api/v3/unit/libs/password.test.js +++ b/test/api/v3/unit/libs/password.test.js @@ -1,41 +1,240 @@ +/* eslint-disable camelcase */ + import { - encrypt as encryptPassword, - makeSalt, + sha1Encrypt as sha1EncryptPassword, + sha1MakeSalt, + bcryptHash, + bcryptCompare, + compare, + convertToBcrypt, } from '../../../../../website/server/libs/password'; describe('Password Utilities', () => { - describe('Encrypt', () => { - it('always encrypt the same password to the same value when using the same salt', () => { + describe('compare', () => { + it('can compare a correct password hashed with SHA1', async () => { let textPassword = 'mySecretPassword'; - let salt = makeSalt(); - let encryptedPassword = encryptPassword(textPassword, salt); + let salt = sha1MakeSalt(); + let hashedPassword = sha1EncryptPassword(textPassword, salt); - expect(encryptPassword(textPassword, salt)).to.eql(encryptedPassword); + let user = { + auth: { + local: { + hashed_password: hashedPassword, + salt, + passwordHashMethod: 'sha1', + }, + }, + }; + + let isValidPassword = await compare(user, textPassword); + expect(isValidPassword).to.eql(true); }); - it('never encrypt the same password to the same value when using a different salt', () => { + it('can compare an invalid password hashed with SHA1', async () => { let textPassword = 'mySecretPassword'; - let aSalt = makeSalt(); - let anotherSalt = makeSalt(); - let anEncryptedPassword = encryptPassword(textPassword, aSalt); - let anotherEncryptedPassword = encryptPassword(textPassword, anotherSalt); + let salt = sha1MakeSalt(); + let hashedPassword = sha1EncryptPassword(textPassword, salt); - expect(anEncryptedPassword).not.to.eql(anotherEncryptedPassword); + let user = { + auth: { + local: { + hashed_password: hashedPassword, + salt, + passwordHashMethod: 'sha1', + }, + }, + }; + + let isValidPassword = await compare(user, 'wrongPassword'); + expect(isValidPassword).to.eql(false); + }); + + it('can compare a correct password hashed with bcrypt', async () => { + let textPassword = 'mySecretPassword'; + let hashedPassword = await bcryptHash(textPassword); + + let user = { + auth: { + local: { + hashed_password: hashedPassword, + passwordHashMethod: 'bcrypt', + }, + }, + }; + + let isValidPassword = await compare(user, textPassword); + expect(isValidPassword).to.eql(true); + }); + + it('can compare an invalid password hashed with bcrypt', async () => { + let textPassword = 'mySecretPassword'; + let hashedPassword = await bcryptHash(textPassword); + + let user = { + auth: { + local: { + hashed_password: hashedPassword, + passwordHashMethod: 'bcrypt', + }, + }, + }; + + let isValidPassword = await compare(user, 'wrongPassword'); + expect(isValidPassword).to.eql(false); + }); + + it('throws an error if user is missing', async () => { + try { + await compare(null, 'some password'); + } catch (e) { + expect(e.toString()).to.equal('Error: user and passwordToCheck are required parameters.'); + } + }); + + it('throws an error if passwordToCheck is missing', async () => { + try { + await compare({a: true}); + } catch (e) { + expect(e.toString()).to.equal('Error: user and passwordToCheck are required parameters.'); + } + }); + + it('throws an error if an invalid hashing method is used', async () => { + try { + await compare({ + auth: { + local: { + passwordHashMethod: 'invalid', + }, + }, + }, 'pass'); + } catch (e) { + expect(e.toString()).to.equal('Error: Invalid password hash method.'); + } + }); + + it('returns true if comparing the same password', async () => { + let textPassword = 'mySecretPassword'; + let hashedPassword = await bcryptHash(textPassword); + + let isValidPassword = await bcryptCompare(textPassword, hashedPassword); + expect(isValidPassword).to.eql(true); + }); + + it('returns true if comparing a different password', async () => { + let textPassword = 'mySecretPassword'; + let hashedPassword = await bcryptHash(textPassword); + + let isValidPassword = await bcryptCompare('anotherPassword', hashedPassword); + expect(isValidPassword).to.eql(false); }); }); - describe('Make Salt', () => { - it('creates a salt with length 10 by default', () => { - let salt = makeSalt(); + describe('convertToBcrypt', () => { + it('converts an user password hashed with sha1 to bcrypt', async () => { + let textPassword = 'mySecretPassword'; + let salt = sha1MakeSalt(); + let hashedPassword = sha1EncryptPassword(textPassword, salt); - expect(salt.length).to.eql(10); + let user = { + auth: { + local: { + hashed_password: hashedPassword, + salt, + passwordHashMethod: 'sha1', + }, + }, + }; + + await convertToBcrypt(user, textPassword); + expect(user.auth.local.salt).to.be.undefined; + expect(user.auth.local.passwordHashMethod).to.equal('bcrypt'); + expect(user.auth.local.hashed_password).to.be.a.string; + + let isValidPassword = await compare(user, textPassword); + expect(isValidPassword).to.eql(true); }); - it('can create a salt of any length', () => { - let length = 24; - let salt = makeSalt(length); + it('throws an error if user is missing', async () => { + try { + await convertToBcrypt(null, 'string'); + } catch (e) { + expect(e.toString()).to.equal('Error: user and plainTextPassword are required parameters.'); + } + }); - expect(salt.length).to.eql(length); + it('throws an error if plainTextPassword is missing', async () => { + try { + await convertToBcrypt({a: true}); + } catch (e) { + expect(e.toString()).to.equal('Error: user and plainTextPassword are required parameters.'); + } + }); + }); + + describe('bcrypt', () => { + describe('Hash', () => { + it('returns a hashed string', async () => { + let textPassword = 'mySecretPassword'; + let hashedPassword = await bcryptHash(textPassword); + + expect(hashedPassword).to.be.a.string; + }); + }); + + describe('Compare', () => { + it('returns true if comparing the same password', async () => { + let textPassword = 'mySecretPassword'; + let hashedPassword = await bcryptHash(textPassword); + + let isValidPassword = await bcryptCompare(textPassword, hashedPassword); + expect(isValidPassword).to.eql(true); + }); + + it('returns true if comparing a different password', async () => { + let textPassword = 'mySecretPassword'; + let hashedPassword = await bcryptHash(textPassword); + + let isValidPassword = await bcryptCompare('anotherPassword', hashedPassword); + expect(isValidPassword).to.eql(false); + }); + }); + }); + + describe('SHA1', () => { + describe('Encrypt', () => { + it('always encrypt the same password to the same value when using the same salt', () => { + let textPassword = 'mySecretPassword'; + let salt = sha1MakeSalt(); + let encryptedPassword = sha1EncryptPassword(textPassword, salt); + + expect(sha1EncryptPassword(textPassword, salt)).to.eql(encryptedPassword); + }); + + it('never encrypt the same password to the same value when using a different salt', () => { + let textPassword = 'mySecretPassword'; + let aSalt = sha1MakeSalt(); + let anotherSalt = sha1MakeSalt(); + let anEncryptedPassword = sha1EncryptPassword(textPassword, aSalt); + let anotherEncryptedPassword = sha1EncryptPassword(textPassword, anotherSalt); + + expect(anEncryptedPassword).not.to.eql(anotherEncryptedPassword); + }); + }); + + describe('Make Salt', () => { + it('creates a salt with length 10 by default', () => { + let salt = sha1MakeSalt(); + + expect(salt.length).to.eql(10); + }); + + it('can create a salt of any length', () => { + let length = 24; + let salt = sha1MakeSalt(length); + + expect(salt.length).to.eql(length); + }); }); }); }); diff --git a/test/helpers/mongo.js b/test/helpers/mongo.js index c0720d412a..e0a1d639ab 100644 --- a/test/helpers/mongo.js +++ b/test/helpers/mongo.js @@ -55,8 +55,8 @@ export async function resetHabiticaDB () { username: 'username', lowerCaseUsername: 'username', email: 'username@email.com', - salt: 'salt', hashed_password: 'hashed_password', // eslint-disable-line camelcase + passwordHashMethod: 'bcrypt', }, }, }, (insertErr) => { diff --git a/website/server/controllers/api-v3/auth.js b/website/server/controllers/api-v3/auth.js index fd277377bf..f33cbfbf7e 100644 --- a/website/server/controllers/api-v3/auth.js +++ b/website/server/controllers/api-v3/auth.js @@ -115,17 +115,15 @@ api.registerLocal = { if (lowerCaseUsername === user.auth.local.lowerCaseUsername) throw new NotAuthorized(res.t('usernameTaken')); } - let salt = passwordUtils.makeSalt(); - let hashed_password = passwordUtils.encrypt(password, salt); // eslint-disable-line camelcase + let hashed_password = await passwordUtils.bcryptHash(password); // eslint-disable-line camelcase let newUser = { auth: { local: { username, lowerCaseUsername, email, - salt, - hashed_password, // eslint-disable-line camelcase - passwordHashMethod: 'sha1', + hashed_password, // eslint-disable-line camelcase, + passwordHashMethod: 'bcrypt', }, }, preferences: { @@ -223,6 +221,7 @@ api.loginLocal = { let login; let username = req.body.username; + let password = req.body.password; if (validator.isEmail(username)) { login = {'auth.local.email': username.toLowerCase()}; // Emails are stored lowercase @@ -230,10 +229,25 @@ api.loginLocal = { login = {'auth.local.username': username}; } - let user = await User.findOne(login, {auth: 1, apiToken: 1}).exec(); - let isValidPassword = user && user.auth.local.hashed_password === passwordUtils.encrypt(req.body.password, user.auth.local.salt); + // load the entire user because we may have to save it to convert the password to bcrypt + let user = await User.findOne(login).exec(); + + let isValidPassword; + + if (!user) { + isValidPassword = false; + } else { + isValidPassword = await passwordUtils.compare(user, password); + } + if (!isValidPassword) throw new NotAuthorized(res.t('invalidLoginCredentialsLong')); + // convert the hashed password to bcrypt from sha1 + if (user.auth.local.passwordHashMethod === 'sha1') { + await passwordUtils.convertToBcrypt(user, password); + await user.save(); + } + res.analytics.track('login', { category: 'behaviour', type: 'local', @@ -433,12 +447,18 @@ api.updateUsername = { if (!user.auth.local.username) throw new BadRequest(res.t('userHasNoLocalRegistration')); - let oldPassword = passwordUtils.encrypt(req.body.password, user.auth.local.salt); - if (oldPassword !== user.auth.local.hashed_password) throw new NotAuthorized(res.t('wrongPassword')); + let password = req.body.password; + let isValidPassword = await passwordUtils.compare(user, password); + if (!isValidPassword) throw new NotAuthorized(res.t('wrongPassword')); let count = await User.count({ 'auth.local.lowerCaseUsername': req.body.username.toLowerCase() }); if (count > 0) throw new BadRequest(res.t('usernameTaken')); + // if password is using old sha1 encryption, change it + if (user.auth.local.passwordHashMethod === 'sha1') { + await passwordUtils.convertToBcrypt(user, password); // user is saved a few lines below + } + // save username user.auth.local.lowerCaseUsername = req.body.username.toLowerCase(); user.auth.local.username = req.body.username; @@ -487,13 +507,17 @@ api.updatePassword = { throw validationErrors; } - let oldPassword = passwordUtils.encrypt(req.body.password, user.auth.local.salt); - if (oldPassword !== user.auth.local.hashed_password) throw new NotAuthorized(res.t('wrongPassword')); + let oldPassword = req.body.password; + let isValidPassword = await passwordUtils.compare(user, oldPassword); + if (!isValidPassword) throw new NotAuthorized(res.t('wrongPassword')); - if (req.body.newPassword !== req.body.confirmPassword) throw new NotAuthorized(res.t('passwordConfirmationMatch')); + let newPassword = req.body.newPassword; + if (newPassword !== req.body.confirmPassword) throw new NotAuthorized(res.t('passwordConfirmationMatch')); - user.auth.local.hashed_password = passwordUtils.encrypt(req.body.newPassword, user.auth.local.salt); // eslint-disable-line camelcase + // set new password and make sure it's using bcrypt for hashing + await passwordUtils.convertToBcrypt(user, newPassword); await user.save(); + res.respond(200, {}); }, }; @@ -522,15 +546,15 @@ api.resetPassword = { if (validationErrors) throw validationErrors; let email = req.body.email.toLowerCase(); - let salt = passwordUtils.makeSalt(); - let newPassword = passwordUtils.makeSalt(); // use a salt as the new password too (they'll change it later) - let hashedPassword = passwordUtils.encrypt(newPassword, salt); - let user = await User.findOne({ 'auth.local.email': email }).exec(); if (user) { - user.auth.local.salt = salt; - user.auth.local.hashed_password = hashedPassword; // eslint-disable-line camelcase + // use a salt as the new password too (they'll change it later) + let newPassword = passwordUtils.sha1MakeSalt(); + + // set new password and make sure it's using bcrypt for hashing + await passwordUtils.convertToBcrypt(user, newPassword); // user is saved a few lines below + sendEmail({ from: 'Habitica ', to: email, @@ -585,8 +609,14 @@ api.updateEmail = { if (emailAlreadyInUse) throw new NotAuthorized(res.t('cannotFulfillReq')); - let candidatePassword = passwordUtils.encrypt(req.body.password, user.auth.local.salt); - if (candidatePassword !== user.auth.local.hashed_password) throw new NotAuthorized(res.t('wrongPassword')); + let password = req.body.password; + let isValidPassword = await passwordUtils.compare(user, password); + if (!isValidPassword) throw new NotAuthorized(res.t('wrongPassword')); + + // if password is using old sha1 encryption, change it + if (user.auth.local.passwordHashMethod === 'sha1') { + await passwordUtils.convertToBcrypt(user, password); + } user.auth.local.email = req.body.newEmail; await user.save(); diff --git a/website/server/controllers/api-v3/user.js b/website/server/controllers/api-v3/user.js index a11ccbb052..e9e6a24a01 100644 --- a/website/server/controllers/api-v3/user.js +++ b/website/server/controllers/api-v3/user.js @@ -200,8 +200,9 @@ api.deleteUser = { let validationErrors = req.validationErrors(); if (validationErrors) throw validationErrors; - let oldPassword = passwordUtils.encrypt(req.body.password, user.auth.local.salt); - if (oldPassword !== user.auth.local.hashed_password) throw new NotAuthorized(res.t('wrongPassword')); + let password = req.body.password; + let isValidPassword = await passwordUtils.compare(user, password); + if (!isValidPassword) throw new NotAuthorized(res.t('wrongPassword')); if (plan && plan.customerId && !plan.dateTerminated) { throw new NotAuthorized(res.t('cannotDeleteActiveAccount')); @@ -256,6 +257,7 @@ api.getUserAnonymized = { if (user.auth) { delete user.auth.local; delete user.auth.facebook; + delete user.auth.google; } delete user.newMessages; delete user.profile; diff --git a/website/server/libs/password.js b/website/server/libs/password.js index 95b7cef7db..6e9f3ad57e 100644 --- a/website/server/libs/password.js +++ b/website/server/libs/password.js @@ -1,8 +1,22 @@ // Utilities for working with passwords import crypto from 'crypto'; +import bcrypt from 'bcrypt'; + +const BCRYPT_SALT_ROUNDS = 10; + +// Hash a plain text password +export function bcryptHash (passwordToHash) { + return bcrypt.hash(passwordToHash, BCRYPT_SALT_ROUNDS); // returns a promise +} + +// Check if a plain text password matches a hash +export function bcryptCompare (passwordToCheck, hashedPassword) { + return bcrypt.compare(passwordToCheck, hashedPassword); // returns a promise +} // Return the encrypted version of a password (using sha1) given a salt -export function encrypt (password, salt) { +// Used for legacy passwords that have not yet been migrated to bcrypt +export function sha1Encrypt (password, salt) { return crypto .createHmac('sha1', salt) .update(password) @@ -10,9 +24,42 @@ export function encrypt (password, salt) { } // Create a salt, default length is 10 -export function makeSalt (len = 10) { +export function sha1MakeSalt (len = 10) { return crypto .randomBytes(Math.ceil(len / 2)) .toString('hex') .substring(0, len); } + +// Compare the password for an user +// Works with bcrypt and sha1 indipendently +// An async function is used so that a promise is always returned +// even for comparing sha1 hashed passwords that use a sync method +export async function compare (user, passwordToCheck) { + if (!user || !passwordToCheck) throw new Error('user and passwordToCheck are required parameters.'); + + let passwordHashMethod = user.auth.local.passwordHashMethod; + let passwordHash = user.auth.local.hashed_password; + let passwordSalt = user.auth.local.salt; // Only used for SHA1 + + if (passwordHashMethod === 'bcrypt') { + return await bcryptCompare(passwordToCheck, passwordHash); + // default to sha1 if the user has a salt but no passwordHashMethod + } else if (passwordHashMethod === 'sha1' || !passwordHashMethod && passwordSalt) { + return passwordHash === sha1Encrypt(passwordToCheck, passwordSalt); + } else { + throw new Error('Invalid password hash method.'); + } +} + +// Convert an user to use bcrypt from sha1 for password hashing +// needs to save the user separately. +// NOTE: before calling this method it should be verified that the supplied plain text password +// is indeed hashed with sha1 and is valid +export async function convertToBcrypt (user, plainTextPassword) { + if (!user || !plainTextPassword) throw new Error('user and plainTextPassword are required parameters.'); + + user.auth.local.salt = undefined; + user.auth.local.passwordHashMethod = 'bcrypt'; + user.auth.local.hashed_password = await bcryptHash(plainTextPassword); // eslint-disable-line camelcase +} diff --git a/website/server/middlewares/index.js b/website/server/middlewares/index.js index 1d852fa2fe..92b5266feb 100644 --- a/website/server/middlewares/index.js +++ b/website/server/middlewares/index.js @@ -28,7 +28,7 @@ import { } from './language'; const IS_PROD = nconf.get('IS_PROD'); -const DISABLE_LOGGING = nconf.get('DISABLE_REQUEST_LOGGING'); +const DISABLE_LOGGING = nconf.get('DISABLE_REQUEST_LOGGING') === 'true'; const PUBLIC_DIR = path.join(__dirname, '/../../client-old'); const SESSION_SECRET = nconf.get('SESSION_SECRET');