From 3b0e3e1e825dd3a958d5a5f8e3636154a56043a6 Mon Sep 17 00:00:00 2001 From: OrionStark Date: Mon, 10 Feb 2020 18:54:47 +0700 Subject: [PATCH] Update the gateway for nearly final progress --- app/gateway_conf.yml | 23 +- app/server.js | 4 +- app/src/core/index.js | 8 +- app/src/core/management.js | 49 ++ app/src/core/request_forwarding.js | 76 +- app/src/core/request_resolver.js | 116 ++- app/src/data/models/consumer/index.js | 45 ++ app/src/data/models/consumer/schema.js | 8 + app/src/data/models/index.js | 14 +- app/src/data/models/services/index.js | 41 -- app/src/data/models/services/schema.js | 16 - app/src/helpers/index.js | 3 - .../validation/http_signature_validation.js | 15 - app/src/helpers/webhooks/http_headers_grab.js | 29 - app/src/middlewares/gateway_middleware.js | 67 +- app/utils/configs/config.js | 3 +- app/utils/database.js | 3 +- package-lock.json | 662 ++++++++++++++---- package.json | 4 +- 19 files changed, 845 insertions(+), 341 deletions(-) create mode 100644 app/src/core/management.js create mode 100644 app/src/data/models/consumer/index.js create mode 100644 app/src/data/models/consumer/schema.js delete mode 100644 app/src/data/models/services/index.js delete mode 100644 app/src/data/models/services/schema.js delete mode 100644 app/src/helpers/index.js delete mode 100644 app/src/helpers/validation/http_signature_validation.js delete mode 100644 app/src/helpers/webhooks/http_headers_grab.js diff --git a/app/gateway_conf.yml b/app/gateway_conf.yml index c8f8910..5ef7ad4 100644 --- a/app/gateway_conf.yml +++ b/app/gateway_conf.yml @@ -1,5 +1,5 @@ services: - main-services: + firstService: port: 3422 base_url: http://localhost endpoints: @@ -9,14 +9,25 @@ services: - /testing put: - /user/*/*/fdf - - /item/:query/:query + - /item/*/* delete: - /user/ - /item/ post: - /user/create - /item/create - enable_auth: false - ip_blacklist: - - "103.77.77.91" - - "103.77.78.111" \ No newline at end of file + secret_key: mainServiceIsRestrictedOnly + secondService: + port: 3400 + base_url: http://localhost + endpoints: + get: + - /hello + - /user/* + put: + - /user/hello + delete: + - /user/delete/* + post: + - /user/create + secret_key: mainServiceIsRestrictedOnly \ No newline at end of file diff --git a/app/server.js b/app/server.js index 7310e17..0cf4875 100644 --- a/app/server.js +++ b/app/server.js @@ -1,14 +1,12 @@ const express = require('express') const cors = require('cors') -const helmet = require('helmet') const morgan = require('morgan') const bodyParser =require('body-parser') const {PORT} = require('./utils/configs/config') -const { openDatabaseConnection, mongoose } = require('./utils/database') +const { openDatabaseConnection } = require('./utils/database') const midlleware = require('./src/middlewares/gateway_middleware') const app = express() -app.use(helmet()) app.use(cors()) app.use(morgan('dev')) app.use(bodyParser.json()) diff --git a/app/src/core/index.js b/app/src/core/index.js index e431241..bf2b304 100644 --- a/app/src/core/index.js +++ b/app/src/core/index.js @@ -1,11 +1,13 @@ -const mongoose = require('mongoose') const { forwardRequest } = require('./request_forwarding') -const { logModel } = require('../data/models/index')(mongoose) +const { logModel } = require('../data/models/index') const { resolveRequest } = require('./request_resolver')(logModel) const { resolveResponse } = require('./response_resolver') +const { register, getAllUsers } = require('./management') module.exports = { forwardRequest, resolveRequest, - resolveResponse + resolveResponse, + register, + getAllUsers } \ No newline at end of file diff --git a/app/src/core/management.js b/app/src/core/management.js new file mode 100644 index 0000000..b07119b --- /dev/null +++ b/app/src/core/management.js @@ -0,0 +1,49 @@ +const { userModel } = require('../data/models/index') +const { SECRET_KEY, SALT_ROUND } = require('../../utils/configs/config') +const bcrypt = require('bcrypt') +const crypto = require('crypto') + +function __hashAnything(key) { + return new Promise((resolve, reject) => { + bcrypt.genSalt(SALT_ROUND, (err, salt) => { + if ( err ) { reject(err) } + bcrypt.hash(key, salt, (err, hash) => { + if ( err ) { reject(err) } + resolve(hash) + }) + }) + }) +} + +function register(data) { + return new Promise((resolve, reject) => { + var passwordTmp = data.password + __hashAnything(passwordTmp) + .then(hashedPassword => { + data.password = hashedPassword + __hashAnything(hashedPassword) + .then(hashedBasicAuth => { + let user = new userModel({ + username: data.username, + password: data.password, + basic_auth: hashedBasicAuth + }) + userModel.insertNewUser(user) + .then(result => { resolve(result) }) + .catch(err => { reject(err) }) + }) + .catch(err => { reject(err) }) + }) + .catch(err => { reject(err) }) + }) +} + +function getAllUsers() { + return new Promise((resolve, reject) => { + userModel.getAll() + .then(docs => { resolve(docs) }) + .catch(err => { reject(err) }) + }) +} + +module.exports = { register, getAllUsers } \ No newline at end of file diff --git a/app/src/core/request_forwarding.js b/app/src/core/request_forwarding.js index 1edcf6e..4be8b3d 100644 --- a/app/src/core/request_forwarding.js +++ b/app/src/core/request_forwarding.js @@ -1,40 +1,52 @@ const axios = require('axios').default +const { SECRET_KEY } = require('../../utils/configs/config') +const jwt = require('jsonwebtoken') + +function __generateGatewaySignature(serviceSecretKey, callback) { + jwt.sign({ + gateway: 'ORION_GATEWAY', + gateway_secret: SECRET_KEY + }, serviceSecretKey, callback) +} function forwardRequest(request, service) { return new Promise((resolve, reject) => { const method = request.method.toLowerCase() - if ( method === 'get' ) { - axios({ - method: method, - baseURL: service.base_url + ':' + service.port, - url: request.path, - responseType: 'json' - }) - .then(response => { - resolve(response) - }) - .catch(err => { - reject(err) - }) - } else { - axios({ - method: method, - baseURL: service.base_url + ':' + service.port, - url: request.path, - responseType: 'json', - data: request.body, - params: request.params - }) - .then(response => { - resolve(response) - }) - .catch(err => { - reject(err) - }) - } + __generateGatewaySignature(service.secret_key, (err, token) => { + if ( err ) { reject(err) } // If token sign got error + if ( method === 'get' ) { + axios({ + method: method, + baseURL: service.base_url + ':' + service.port, + url: request.path, + responseType: 'json', + headers: { + gateway_signature: token , + authorization: request.authorization + } + }) + .then(response => { + resolve(response.data) + }) + .catch(err => { reject(err) }) + } else { + axios({ + method: method, + baseURL: service.base_url + ':' + service.port, + url: request.path, + responseType: 'json', + data: request.body, + params: request.params, + headers: { + gateway_signature: token, + authorization: request.authorization + } + }) + .then(response => { resolve(response) }) + .catch(err => { reject(err) }) + } + }) }) } -module.exports = { - forwardRequest -} \ No newline at end of file +module.exports = { forwardRequest } \ No newline at end of file diff --git a/app/src/core/request_resolver.js b/app/src/core/request_resolver.js index d07a4e0..cddde18 100644 --- a/app/src/core/request_resolver.js +++ b/app/src/core/request_resolver.js @@ -1,7 +1,45 @@ -const {validateAPIKey, grabRequest} = require('../helpers/index') // Helpers +const { userModel } = require('../data/models/index') const fs = require('fs') const yaml = require('yaml') +function __validateConsumerBasicAuth(userKey, userModel) { + return new Promise((resolve, reject) => { + userModel.findByBasicToken(userKey) + .then(result => { + if ( result ) { + resolve() + } else { + reject('Your key isn\'t valid') + } + }) + .catch(_ => { + reject('Couldn\'t process the request at the moment') + }) + }) +} + +function __grabRequest(req) { + const ipAddress = (req.headers['x-forwarded-for'] || '').split(',').pop() || + req.connection.remoteAddress || + req.socket.remoteAddress || + req.connection.socket.remoteAddress + const apiSignatureKey = req.headers['basic_auth'] || '' + return { + ip_address: ipAddress, + basic_auth: apiSignatureKey, + host: req.headers['host'], + user_agent: req.headers['user-agent'] || '', + method: req.method, + path: req.path, + originalUrl: req.originalUrl, + query: req.query, + params: req.params, + app_id: req.headers['app_id'], + body: req.body, + authorization: req.headers['Authorization'] || '' + } +} + function __getServiceInformation(service_name) { return new Promise((resolve, reject) => { @@ -13,7 +51,7 @@ function __getServiceInformation(service_name) { const err = { type: 'NOT_FOUND', module_source: 'request_resolver', - message: 'Service method is not found.' + message: 'Invalid service access. Please check your request again/' } reject(err) } @@ -21,37 +59,43 @@ function __getServiceInformation(service_name) { } function __resolveRequest(req, logModel, callback) { - let request = grabRequest(req) - __getServiceInformation(request.app_id || '') - .then(service => { - let flag = false - const availableEndPoints = service.endpoints[request.method.toLowerCase()] || [] - const splittedRequestPath = request.path.replace(/^\/|\/$/g, '').split('/') - for ( let i = 0; i < availableEndPoints.length; i++ ) { - let splittedEndPointPath = availableEndPoints[i].replace(/^\/|\/$/g, '').split('/') - if ( splittedRequestPath.length === splittedEndPointPath.length ) { - let fractalCheckFlag = true - for ( let j = 0; j < splittedEndPointPath.length; j++ ) { - if ( splittedEndPointPath[j] !== splittedRequestPath[j] && splittedEndPointPath[j] !== '*' ) { - fractalCheckFlag = false + let request = __grabRequest(req) + // Check if basic auth key is not specified + if ( request.basic_auth === '' ) { + const err = { + type: 'UNAUTHORIZED', + module_source: 'request_resolver', + message: 'You\'re not allowed to access this network' + } + callback(null, null, err) + } + + __validateConsumerBasicAuth(request.basic_auth, userModel) + .then(() => { + // Get service information from the configuration file + __getServiceInformation(request.app_id || '') + .then(service => { + let flag = false + + const availableEndPoints = service.endpoints[request.method.toLowerCase()] || [] + const splittedRequestPath = request.path.replace(/^\/|\/$/g, '').split('/') + for ( let i = 0; i < availableEndPoints.length; i++ ) { + let splittedEndPointPath = availableEndPoints[i].replace(/^\/|\/$/g, '').split('/') + if ( splittedRequestPath.length === splittedEndPointPath.length ) { + let fractalCheckFlag = true + for ( let j = 0; j < splittedEndPointPath.length; j++ ) { + if ( splittedEndPointPath[j] !== splittedRequestPath[j] && splittedEndPointPath[j] !== '*' ) { + fractalCheckFlag = false + break + } + } + if ( fractalCheckFlag ) { + flag = true break } } - if ( fractalCheckFlag ) { - flag = true - break - } - } - } - if ( service.enable_auth && !validateAPIKey(request.api_key) ) { - const err = { - type: 'UNAUTHORIZED', - module_source: 'request_resolver', - message: 'You\'re not allowed to do this action.' } - callback(null, null, err) - } else { - if ( flag ) { + if ( flag ) { // If method found logModel.addLog(new logModel({ path: request.path, service: request.app_id, @@ -66,10 +110,17 @@ function __resolveRequest(req, logModel, callback) { } callback(null, null, err) } - } + }) + .catch(err => { + callback(null, null, err) + }) }) - .catch(err => { - console.log(err) + .catch( _ => { + const err = { + type: 'UNAUTHORIZED', + module_source: 'request_resolver', + message: 'Your signature is not valid.' + } callback(null, null, err) }) } @@ -80,5 +131,4 @@ module.exports = (logModel) => { return __resolveRequest(req, logModel, callback) } } - } \ No newline at end of file diff --git a/app/src/data/models/consumer/index.js b/app/src/data/models/consumer/index.js new file mode 100644 index 0000000..e6a5fbf --- /dev/null +++ b/app/src/data/models/consumer/index.js @@ -0,0 +1,45 @@ +function __createModel(mongoose) { + const schema = require('./schema')(mongoose) + schema.statics.getAll = function() { + return new Promise((resolve, reject) => { + this.find({}) + .then(docs => { resolve(docs) }) + .catch(err => { reject(err) }) + }) + } + schema.statics.insertNewUser = function(userData) { + return new Promise((resolve, reject) => { + userData.save() + .then(result => { resolve(result) }) + .catch(err => { reject(err) }) + }) + } + schema.statics.findByBasicToken = function(basicToken) { + return new Promise((resolve, reject) => { + this.findOne({basic_auth: basicToken}) + .then(result => { resolve(result) }) + .catch(err => { reject(err) }) + }) + } + schema.statics.deleteUserByBasicToken = function(basicToken) { + return new Promise((resolve, reject) => { + this.deleteOne({basic_auth: basicToken}) + .then(result => { resolve(result) }) + .catch(err => { reject(err) }) + }) + } + schema.statics.updateUserData = function(userData, basicToken) { + return new Promise((resolve, reject) => { + this.updateOne({basic_auth: basicToken}, userData) + .then(result => { resolve(result) }) + .catch(err => { reject(err) }) + }) + } + + return schema +} + +module.exports = (mongoose) => { + const schema = __createModel(mongoose) + return mongoose.model('user_model', schema) +} \ No newline at end of file diff --git a/app/src/data/models/consumer/schema.js b/app/src/data/models/consumer/schema.js new file mode 100644 index 0000000..c50cf88 --- /dev/null +++ b/app/src/data/models/consumer/schema.js @@ -0,0 +1,8 @@ +module.exports = (mongoose) => { + return new mongoose.Schema({ + username: { type: String, required: true }, + password: { type: String, required: true }, + token_access: {type: String, default: ''}, + basic_auth: {type: String, default: ''} + }, {collection: 'user'}) +} \ No newline at end of file diff --git a/app/src/data/models/index.js b/app/src/data/models/index.js index edcd653..74f05e6 100644 --- a/app/src/data/models/index.js +++ b/app/src/data/models/index.js @@ -1,10 +1,8 @@ -const logModel = require('./logs/index') +const mongoose = require('mongoose') +const logModel = require('./logs/index')(mongoose) +const userModel = require('./consumer/index')(mongoose) -function __getLogModel(mongoose) { return logModel(mongoose) } -function __getServiceModel(mongoose) { return serviceModel(mongoose) } - -module.exports = (mongoose) => { - return { - logModel: __getLogModel(mongoose) - } +module.exports = { + logModel, + userModel } \ No newline at end of file diff --git a/app/src/data/models/services/index.js b/app/src/data/models/services/index.js deleted file mode 100644 index dcc430d..0000000 --- a/app/src/data/models/services/index.js +++ /dev/null @@ -1,41 +0,0 @@ -/** - * This is the data service model for saving the service route. - */ -function __createModel(mongoose) { - const schema = require('./schema')(mongoose) - schema.statics.getAll = function() { - return Promise((resolve, reject) => { - this.find({}) - .then(docs => { resolve(docs) }) - .catch(err => { reject(err) }) - }) - } - schema.statics.getByID = function(id) { - return Promise((resolve, reject) => { - this.findOne({_id: id}) - .then(doc => { resolve(doc) }) - .catch(err => { reject(err) }) - }) - } - schema.statics.addService = function(log) { - return new Promise((resolve, reject) => { - log.save() - .then(result => {resolve(result)}) - .catch(err => {reject(err)}) - }) - } - schema.statics.deleteService = function(id) { - return new Promise((resolve, reject) => { - this.deleteOne({_id: id}) - .then(result => { resolve(result) }) - .catch(err => { reject(err) }) - }) - } - - return schema -} - -module.exports = (mongoose) => { - const schema = __createModel(mongoose) - return mongoose.model('service_model', schema) -} diff --git a/app/src/data/models/services/schema.js b/app/src/data/models/services/schema.js deleted file mode 100644 index 638b1bf..0000000 --- a/app/src/data/models/services/schema.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = (mongoose) => { - return new mongoose.Schema({ - service_name: {type: String, required: true}, - host: {type: String, required: true}, - port: {type: String, required: true}, - resourcePaths: { - type: [ - { - path: { type: String, required: String }, - method: { type: String, required: true } - } - ], - default: [] - } - }, {collection: 'services'}) -} \ No newline at end of file diff --git a/app/src/helpers/index.js b/app/src/helpers/index.js deleted file mode 100644 index b079d91..0000000 --- a/app/src/helpers/index.js +++ /dev/null @@ -1,3 +0,0 @@ -const { validateAPIKey } = require('./validation/http_signature_validation') -const { grabRequest } = require('./webhooks/http_headers_grab') -module.exports = { validateAPIKey, grabRequest } \ No newline at end of file diff --git a/app/src/helpers/validation/http_signature_validation.js b/app/src/helpers/validation/http_signature_validation.js deleted file mode 100644 index dc383c9..0000000 --- a/app/src/helpers/validation/http_signature_validation.js +++ /dev/null @@ -1,15 +0,0 @@ -const {SECRET_KEY, CRYPT_ALGORITHM, API_KEY} = require('../../../utils/configs/config') -const crypto = require('crypto-js') - -function validateAPIKey(key) { - let decryptedTextTemporary = '' - if ( CRYPT_ALGORITHM === 'AES' ) { - const decrypted = crypto.AES.decrypt(key, SECRET_KEY) - decryptedTextTemporary = decrypted.toString(crypto.enc.Utf8) - } - return decryptedTextTemporary === API_KEY -} - -module.exports = { - validateAPIKey -} \ No newline at end of file diff --git a/app/src/helpers/webhooks/http_headers_grab.js b/app/src/helpers/webhooks/http_headers_grab.js deleted file mode 100644 index c786995..0000000 --- a/app/src/helpers/webhooks/http_headers_grab.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * This module would take necessary data from the HTTP Request Data and Request Headers - * After we collect all the data we need. We passing it for validation from the validation module. - * Such as http signature validation and ip whitelist validation or etc. - */ -function grabRequest(req) { - const ipAddress = (req.headers['x-forwarded-for'] || '').split(',').pop() || - req.connection.remoteAddress || - req.socket.remoteAddress || - req.connection.socket.remoteAddress - const apiSignatureKey = req.headers['api_key'] || '' - return { - ip_address: ipAddress, - api_key: apiSignatureKey, - host: req.headers['host'], - user_Agent: req.headers['user-agent'] || '', - method: req.method, - path: req.path, - originalUrl: req.originalUrl, - query: req.query, - params: req.params, - app_id: req.headers['app_id'], - body: req.body - } -} - -module.exports = { - grabRequest -} \ No newline at end of file diff --git a/app/src/middlewares/gateway_middleware.js b/app/src/middlewares/gateway_middleware.js index 48dbb43..e810c6d 100644 --- a/app/src/middlewares/gateway_middleware.js +++ b/app/src/middlewares/gateway_middleware.js @@ -1,35 +1,60 @@ const { forwardRequest, resolveRequest, - resolveResponse } = require('../core/index') + resolveResponse, register, getAllUsers } = require('../core/index') const router = require('express').Router() +const constants = require('../../utils/configs/config') router.all('*', (req, res) => { - resolveRequest(req, (request, service, error) => { + if ( req.path === '/consumer/management/register' && req.method.toUpperCase() === 'POST' ) { + let data = req.body + register(data) + .then(result => { + res.status(201).json(result) + }) + .catch(err => { res.status(500).json(err) }) + } else if ( req.path === '/consumer/management/users' && req.method.toUpperCase() === 'GET' ) { + let accessToken = req.headers['admin-access'] + if ( constants.SECRET_KEY === accessToken ) { + getAllUsers() + .then(docs => { + res.json({data: docs}) + }) + .catch(err => { + res.status(500).json(err) + }) + } else { + res.status(401).json({ + message: 'You\'re not allowed to do this action.' + }) + } + } else { resolveResponse(res) - if ( error ) { - let status_code - if ( error.hasOwnProperty('type') ) { - if ( error.type === 'UNAUTHORIZED' ) { - status_code = 401 - } else if ( error.type === 'NOT_FOUND' ) { - status_code = 404 + resolveRequest(req, (request, service, error) => { + if ( error ) { + let status_code + if ( error.hasOwnProperty('type') ) { + if ( error.type === 'UNAUTHORIZED' ) { + status_code = 401 + } else if ( error.type === 'NOT_FOUND' ) { + status_code = 404 + } else { + status_code = 500 + } } else { status_code = 500 } + res.status(status_code).json(error) } else { - status_code = 500 + forwardRequest(request, service) + .then(response => { + res.json(response) + }) + .catch(err => { + res.status(500).json(err) + }) } - res.status(status_code).json(error) - } else { - forwardRequest(request, service) - .then(response => { - res.json(response) - }) - .catch(err => { - res.status(500).json(err) - }) - } - }) + }) + } }) module.exports = router \ No newline at end of file diff --git a/app/utils/configs/config.js b/app/utils/configs/config.js index 13dad93..1907d9c 100644 --- a/app/utils/configs/config.js +++ b/app/utils/configs/config.js @@ -2,6 +2,5 @@ module.exports = { DB_NAME: 'GATEWAY_DB', PORT: 8080, SECRET_KEY: 'Thanos_is_fucked_up+=$^532$#%^3422-YggDrasil-OrionStark_=-423053', - CRYPT_ALGORITHM: 'AES', - API_KEY: 'deef690f-7dd2-4eea-b4ed-3371c7a52a13' + SALT_ROUND: 15 } \ No newline at end of file diff --git a/app/utils/database.js b/app/utils/database.js index 8f1ef5c..7e6ac54 100644 --- a/app/utils/database.js +++ b/app/utils/database.js @@ -13,6 +13,5 @@ module.exports = { console.log(err) throw Error(err) }) - }, - mongoose + } } diff --git a/package-lock.json b/package-lock.json index 54266fe..8b666a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,11 @@ "regenerator-runtime": "^0.13.2" } }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -21,6 +26,25 @@ "negotiator": "0.6.2" } }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -34,6 +58,11 @@ "follow-redirects": "1.5.10" } }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, "basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -42,6 +71,15 @@ "safe-buffer": "5.1.2" } }, + "bcrypt": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-3.0.7.tgz", + "integrity": "sha512-K5UglF9VQvBMHl/1elNyyFvAfOY9Bj+rpKrCSR9sFwcW8FywAYJSRwTURNej5TaAK2TEJkcJ6r6lh1YPmspx5Q==", + "requires": { + "nan": "2.14.0", + "node-pre-gyp": "0.13.0" + } + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -64,25 +102,49 @@ "type-is": "~1.6.17" } }, - "bowser": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.8.1.tgz", - "integrity": "sha512-FxxltGKqMHkVa3KtpA+kdnxH0caHPDewccyrK3vW1bsMw6Zco4vRPmMunowX0pXlDZqhxkKSpToADQI2Sk4OeQ==" + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, "bson": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.3.tgz", "integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg==" }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, - "camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "content-disposition": { "version": "0.5.3", @@ -92,11 +154,6 @@ "safe-buffer": "5.1.2" } }, - "content-security-policy-builder": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz", - "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==" - }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -112,6 +169,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -121,16 +183,6 @@ "vary": "^1" } }, - "crypto-js": { - "version": "3.1.9-1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz", - "integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg=" - }, - "dasherize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", - "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -139,6 +191,16 @@ "ms": "2.0.0" } }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -149,21 +211,24 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "dns-prefetch-control": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.2.0.tgz", - "integrity": "sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q==" - }, - "dont-sniff-mimetype": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", - "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==" + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, "double-ended-queue": { "version": "2.1.0-0", "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -184,11 +249,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "expect-ct": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.2.0.tgz", - "integrity": "sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g==" - }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -226,11 +286,6 @@ "vary": "~1.1.2" } }, - "feature-policy": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", - "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==" - }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -268,86 +323,57 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, - "frameguard": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.1.0.tgz", - "integrity": "sha512-TxgSKM+7LTA6sidjOiSZK9wxY0ffMPY3Wta//MqwmX0nZuEHc8QrkV8Fh3ZhMJeiH+Uyh/tcaarImRy8u77O7g==" - }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, - "helmet": { - "version": "3.21.2", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.21.2.tgz", - "integrity": "sha512-okUo+MeWgg00cKB8Csblu8EXgcIoDyb5ZS/3u0W4spCimeVuCUvVZ6Vj3O2VJ1Sxpyb8jCDvzu0L1KKT11pkIg==", - "requires": { - "depd": "2.0.0", - "dns-prefetch-control": "0.2.0", - "dont-sniff-mimetype": "1.1.0", - "expect-ct": "0.2.0", - "feature-policy": "0.3.0", - "frameguard": "3.1.0", - "helmet-crossdomain": "0.4.0", - "helmet-csp": "2.9.4", - "hide-powered-by": "1.1.0", - "hpkp": "2.0.0", - "hsts": "2.2.0", - "ienoopen": "1.1.0", - "nocache": "2.1.0", - "referrer-policy": "1.2.0", - "x-xss-protection": "1.3.0" - }, - "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - } + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" } }, - "helmet-crossdomain": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz", - "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==" + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "helmet-csp": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.9.4.tgz", - "integrity": "sha512-qUgGx8+yk7Xl8XFEGI4MFu1oNmulxhQVTlV8HP8tV3tpfslCs30OZz/9uQqsWPvDISiu/NwrrCowsZBhFADYqg==", + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { - "bowser": "^2.7.0", - "camelize": "1.0.0", - "content-security-policy-builder": "2.1.0", - "dasherize": "2.0.0" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, - "hide-powered-by": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", - "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==" - }, - "hpkp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", - "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" - }, - "hsts": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", - "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "requires": { - "depd": "2.0.0" - }, - "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - } + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -368,26 +394,134 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "ienoopen": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz", - "integrity": "sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ==" + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, "ipaddr.js": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "kareem": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -427,6 +561,44 @@ "mime-db": "1.43.0" } }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, "mongodb": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.4.1.tgz", @@ -517,15 +689,105 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "needle": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, - "nocache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", - "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==" + "node-pre-gyp": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.13.0.tgz", + "integrity": "sha512-Md1D3xnEne8b/HGVQkZZwV27WUi1ZRuZBij24TNaZwUPU3ZAFtvT6xxJGaUVillfmMKnn5oD1HoGsp2Ftik7SQ==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "object-assign": { "version": "4.1.1", @@ -545,16 +807,53 @@ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "proxy-addr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", @@ -585,6 +884,38 @@ "unpipe": "1.0.0" } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "redis": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", @@ -605,11 +936,6 @@ "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=" }, - "referrer-policy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", - "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==" - }, "regenerator-runtime": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", @@ -634,6 +960,14 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -653,6 +987,11 @@ "sparse-bitfield": "^3.0.3" } }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -696,6 +1035,11 @@ "send": "0.17.1" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -706,6 +1050,11 @@ "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, "sliced": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", @@ -725,6 +1074,51 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -744,6 +1138,11 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -754,10 +1153,23 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, - "x-xss-protection": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz", - "integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg==" + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yaml": { "version": "1.7.2", diff --git a/package.json b/package.json index 152bb1d..409a294 100644 --- a/package.json +++ b/package.json @@ -11,12 +11,12 @@ "license": "MIT", "dependencies": { "axios": "^0.19.1", + "bcrypt": "^3.0.7", "bluebird": "^3.7.2", "body-parser": "^1.19.0", "cors": "^2.8.5", - "crypto-js": "^3.1.9-1", "express": "^4.17.1", - "helmet": "^3.21.2", + "jsonwebtoken": "^8.5.1", "mongoose": "^5.8.7", "morgan": "^1.9.1", "redis": "^2.8.0",