From be3b4f69f1a62e491bf118afc6d23a363a350b22 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Sat, 8 Apr 2023 23:50:30 -0400
Subject: [PATCH 001/229] tests_added
---
package-lock.json | 69 +++++++++++++++++++----
package.json | 1 +
src/__tests__/ldap_authentication.test.js | 20 +++++++
src/__tests__/ldap_connection.js | 41 --------------
src/__tests__/ldap_connection2.js | 61 --------------------
src/__tests__/ldap_integration.test.js | 34 +++++++++++
6 files changed, 113 insertions(+), 113 deletions(-)
create mode 100644 src/__tests__/ldap_authentication.test.js
delete mode 100644 src/__tests__/ldap_connection.js
delete mode 100644 src/__tests__/ldap_connection2.js
create mode 100644 src/__tests__/ldap_integration.test.js
diff --git a/package-lock.json b/package-lock.json
index 649399a0..5d15daf7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,6 +10,7 @@
"license": "MIT",
"dependencies": {
"@hapi/boom": "^10.0.1",
+ "axios": "^1.3.5",
"bcryptjs": "^2.4.3",
"body-parser": "^1.20.2",
"cors": "^2.8.5",
@@ -1558,8 +1559,17 @@
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
- "dev": true
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ },
+ "node_modules/axios": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.5.tgz",
+ "integrity": "sha512-glL/PvG/E+xCWwV8S6nCHcrfg1exGx7vxyUIivIA1iL7BIh6bePylCfVHwp6k13ao7SATxB6imau2kqY+I67kw==",
+ "dependencies": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
},
"node_modules/babel-jest": {
"version": "29.5.0",
@@ -2108,7 +2118,6 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
"dependencies": {
"delayed-stream": "~1.0.0"
},
@@ -2373,7 +2382,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true,
"engines": {
"node": ">=0.4.0"
}
@@ -2975,11 +2983,29 @@
"resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
"integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
},
+ "node_modules/follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
"node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "dev": true,
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
@@ -5530,6 +5556,11 @@
"node": ">= 0.10"
}
},
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
"node_modules/psl": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@@ -8270,8 +8301,17 @@
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
- "dev": true
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ },
+ "axios": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.5.tgz",
+ "integrity": "sha512-glL/PvG/E+xCWwV8S6nCHcrfg1exGx7vxyUIivIA1iL7BIh6bePylCfVHwp6k13ao7SATxB6imau2kqY+I67kw==",
+ "requires": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
},
"babel-jest": {
"version": "29.5.0",
@@ -8667,7 +8707,6 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
"requires": {
"delayed-stream": "~1.0.0"
}
@@ -8873,8 +8912,7 @@
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"denque": {
"version": "2.0.1",
@@ -9307,11 +9345,15 @@
"resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
"integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
},
+ "follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
+ },
"form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "dev": true,
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
@@ -11253,6 +11295,11 @@
"ipaddr.js": "1.9.1"
}
},
+ "proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
"psl": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
diff --git a/package.json b/package.json
index 84e338a6..f66dd832 100644
--- a/package.json
+++ b/package.json
@@ -17,6 +17,7 @@
],
"dependencies": {
"@hapi/boom": "^10.0.1",
+ "axios": "^1.3.5",
"bcryptjs": "^2.4.3",
"body-parser": "^1.20.2",
"cors": "^2.8.5",
diff --git a/src/__tests__/ldap_authentication.test.js b/src/__tests__/ldap_authentication.test.js
new file mode 100644
index 00000000..0ec992b3
--- /dev/null
+++ b/src/__tests__/ldap_authentication.test.js
@@ -0,0 +1,20 @@
+const axios = require('axios')
+
+const loginUrl = 'http://127.0.0.1:4000/login'
+
+describe('Prueba de autenticación de usuario', () => {
+ test('La autenticacion debe funcionar con los usuarios que estan en el LDAP y devolver un JWT', async () => {
+ //Peticion correcta
+ const loginData = {
+ username: 'agonzalezb',
+ password: '00092068426',
+ }
+ const respuesta = await axios.post(loginUrl, loginData) // Realizar una petición POST al endpoint de login
+ expect(respuesta.status).toBe(200) // Verificar que la respuesta tenga un estado 200 (OK)
+ expect(respuesta.data.data === undefined).toBeFalse // Verificar que la respuesta tenga un cuerpo (no sea nula o vacía)
+
+ const token = respuesta.data.data.token
+ expect(token === undefined || token === null).toBeFalse
+ expect(token.length).toBeGreaterThan(0)
+ })
+})
diff --git a/src/__tests__/ldap_connection.js b/src/__tests__/ldap_connection.js
deleted file mode 100644
index 1d0861c6..00000000
--- a/src/__tests__/ldap_connection.js
+++ /dev/null
@@ -1,41 +0,0 @@
-import SimpleLDAP from 'simple-ldap-search'
-
-const config = {
- url: 'ldap://10.8.176.9',
- base: 'dc=cujae,dc=edu,dc=cu',
- dn: 'uid=agonzalezb,ou=usuarios,ou=informatica,dc=cujae,dc=edu,dc=cu',
- password: '00092068426',
- // optionally pass tls options to ldapjs
- tlsOptions: {
- // tls options ...
- },
-}
-
-// create a new client
-const ldap = new SimpleLDAP(config)
-ldap.bindDN()
-
-// setup a filter and attributes for your LDAP query
-const filter = '(objectclass=iesEducationalStaff)'
-const attributes = ['uid', 'displayName', 'CI']
-
-// using async/await
-const getUsers = async () => {
- console.log('filters: ', filter)
- console.log('atts: ', attributes)
- ldap
- .search(filter,attributes)
- .then((res) => {
- console.log('Response', res)
- })
- .catch((err) => console.log('ERROR EN RESPONSE', err))
-}
-getUsers()
-// [{
-// dn: 'uid=artvandelay, dc=users, dc=localhost',
-// idNumber: 1234567,
-// uid: 'artvandelay',
-// givenName: 'Art',
-// sn: 'Vandelay',
-// telephoneNumber: '555-123-4567',
-// }]
diff --git a/src/__tests__/ldap_connection2.js b/src/__tests__/ldap_connection2.js
deleted file mode 100644
index 98aa9527..00000000
--- a/src/__tests__/ldap_connection2.js
+++ /dev/null
@@ -1,61 +0,0 @@
-const LDAP = require('LDAP')
-
-var options = {
- uri: 'ldap://10.8.176.9', // string
- version: 3, // integer, default is 3,
- starttls: false, // boolean, default is false
- connecttimeout: -1, // seconds, default is -1 (infinite timeout), connect timeout
- timeout: 5000, // milliseconds, default is 5000 (infinite timeout is unsupported), operation timeout
- reconnect: true, // boolean, default is true,
- backoffmax: 32, // seconds, default is 32, reconnect timeout
-}
-
-const ldap = new LDAP()
-
-ldap.open(options, function (err, client) {
- if (err) {
- console.log('Error: ' + err)
- } else {
- console.log('Connected')
- client.bind(
- 'uid=agonzalezb,ou=usuarios,ou=informatica,dc=cujae,dc=edu,dc=cu',
- '00092068426',
- function (err) {
- if (err) {
- console.log('Error: ' + err)
- } else {
- console.log('Binded')
- client.search(
- 'dc=cujae,dc=edu,dc=cu',
- { filter: '(uid=agonzalezb)' },
- function (err, res) {
- if (err) {
- console.log('Error: ' + err)
- } else {
- res.on('searchEntry', function (entry) {
- console.log('entry: ' + JSON.stringify(entry.object))
- })
- res.on('searchReference', function (referral) {
- console.log('referral: ' + referral.uris.join())
- })
- res.on('error', function (err) {
- console.log('error: ' + err.message)
- })
- res.on('end', function (result) {
- console.log('status: ' + result.status)
- client.unbind(function (err) {
- if (err) {
- console.log('Error: ' + err)
- } else {
- console.log('Unbinded')
- }
- })
- })
- }
- }
- )
- }
- }
- )
- }
-})
diff --git a/src/__tests__/ldap_integration.test.js b/src/__tests__/ldap_integration.test.js
new file mode 100644
index 00000000..e615655d
--- /dev/null
+++ b/src/__tests__/ldap_integration.test.js
@@ -0,0 +1,34 @@
+const axios = require('axios')
+
+const loginUrl = 'http://127.0.0.1:4000/login'
+const usersUrl = 'http://127.0.0.1:4000/users/'
+
+
+
+describe('Prueba de integracion con el LDAP', () => {
+ test('La integracion con el LDAP debe funcionar y devolver usuarios dentro del servidor', async () => {
+ const loginData = {
+ username: 'agonzalezb',
+ password: '00092068426',
+ }
+ const respuesta = await axios.post(loginUrl, loginData)
+ const token = respuesta.data.data.token
+ // Realizar una petición GET al endpoint de "Get User By Username"
+ const response = await axios.get(usersUrl + 'agonzalezb', {
+ headers: {
+ Authorization: 'Bearer ' + token,
+ },
+ })
+ //verificar que el estado de la peticion no sea 401
+ expect(response.status).toEqual(200)
+ //verificar que la propiedad success sea true
+ expect(response.data.success).toEqual(true)
+ //verificar que el mensaje de la peticion sea "data fetched succesfully"
+ expect(response.data.message).toEqual('data fetched succesfully')
+ //verificar que el usuario solicitado sea el correcto
+ expect(response.data.data.objectName).toEqual(
+ 'uid=agonzalezb,ou=usuarios,ou=informatica,dc=cujae,dc=edu,dc=cu'
+ )
+ })
+})
+
From 03d54d8fc0c854f09050a0d76c9f4fbef200da86 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Sun, 9 Apr 2023 17:35:01 -0400
Subject: [PATCH 002/229] server-sanitation
---
server.js | 64 ++++---------------------------
src/middlewares/logger.handler.js | 31 ++++++++++++++-
src/utils/ldap_initialization.js | 27 +++++++++++++
3 files changed, 65 insertions(+), 57 deletions(-)
create mode 100644 src/utils/ldap_initialization.js
diff --git a/server.js b/server.js
index 2de4329e..94bb629e 100644
--- a/server.js
+++ b/server.js
@@ -1,15 +1,14 @@
/* jshint node:true */
/* global require */
const CONFIG = require('./src/config/config.js')
-const mongoose = require('mongoose')
const bodyParser = require('body-parser')
-const logger = require('./src/middlewares/logger.handler.js')
const express = require('express')
-const morgan = require('morgan')
const addRoutes = require('./src/routes/routes.js')
-const LdapAuth = require('./src/modules/authentication/LdapAuth.js')
const sessionMiddleWare = require('./src/middlewares/session.handler.js')
-const User = require('./src/schemas/user.schema.js').User
+const addLoggerMiddleware = require('./src/middlewares/logger.handler.js')
+const ldap_initialization = require('./src/utils/ldap_initialization.js')
+const path = require('path')
+
//app initialization
const app = express()
@@ -19,63 +18,16 @@ app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
app.use(express.json())
app.use(sessionMiddleWare)
-
-morgan.token('user', (req) => {
- return req.user ? req.user.uid : 'anonymous'
-})
-app.use(
- morgan(function (tokens, req, res) {
- const log = {
- method: tokens.method(req, res),
- url: tokens.url(req, res),
- status: tokens.status(req, res),
- content_length: tokens.res(req, res, 'content-length'),
- response_time: tokens['response-time'](req, res),
- user: (tokens.user = req.user.uid),
- }
- logger.info({ ...log })
-
- return [
- `method:${log.method}`,
- `url:${log.url}`,
- `status:${log.status}`,
- `content-lenght:${log.content_length}`,
- `response-time:${log.response_time}ms`,
- `user_uid:${log.user}`,
- ].join(' ')
- })
-)
+addLoggerMiddleware(app)
//LDAP initialization
-const { usernameAttr, userOptions } = require('./src/constants/ldap_options.js')
-LdapAuth.initialize(
- userOptions,
- app,
- (id) => User.findOne({ username: id }).exec(),
- async (user) => {
- console.log(`${user[usernameAttr]} has logged in`)
- let foundUser = await User.findOneAndUpdate(
- { username: user[usernameAttr] },
- user,
- {
- upsert: true,
- new: true,
- }
- ).exec()
- console.log(`${foundUser.username} is retrieved from database`)
- return foundUser
- }
-)
+ldap_initialization(app)
//add routes to application
addRoutes(app)
-// use the library express-passport-ldap-mongoose
-// backward compatible mode
-/*LdapAuth.init(CONFIG.ldap.dn, CONFIG.ldap.url, app,
- (id) => User.findOne({ uid: id }).exec(),
- (user) => User.findOneAndUpdate({ uid: user.uid }, user, { upsert: true, new: true }).exec()
-)*/
+// Configure app to require modules from "src" directory
+app.set('~', path.join(__dirname, 'src'))
// serve static pages
app.use(express.static('./src/public'))
diff --git a/src/middlewares/logger.handler.js b/src/middlewares/logger.handler.js
index 0c04ffd7..c28ab996 100644
--- a/src/middlewares/logger.handler.js
+++ b/src/middlewares/logger.handler.js
@@ -1,6 +1,7 @@
const winston = require('winston')
const { MongoDB } = require('winston-mongodb')
const config = require('../config/config')
+const morgan = require('morgan')
const logger = winston.createLogger({
level: 'info',
@@ -19,4 +20,32 @@ const logger = winston.createLogger({
],
})
-module.exports = logger
+const addLoggerMiddleware = (app) => {
+ morgan.token('user', (req) => {
+ return req.user ? req.user.uid : 'anonymous'
+ })
+ app.use(
+ morgan(function (tokens, req, res) {
+ const log = {
+ method: tokens.method(req, res),
+ url: tokens.url(req, res),
+ status: tokens.status(req, res),
+ content_length: tokens.res(req, res, 'content-length'),
+ response_time: tokens['response-time'](req, res),
+ user: (tokens.user = req.user.uid),
+ }
+ logger.info({ ...log })
+
+ return [
+ `method:${log.method}`,
+ `url:${log.url}`,
+ `status:${log.status}`,
+ `content-lenght:${log.content_length}`,
+ `response-time:${log.response_time}ms`,
+ `user_uid:${log.user}`,
+ ].join(' ')
+ })
+ )
+}
+
+module.exports = addLoggerMiddleware
diff --git a/src/utils/ldap_initialization.js b/src/utils/ldap_initialization.js
new file mode 100644
index 00000000..cd621bb1
--- /dev/null
+++ b/src/utils/ldap_initialization.js
@@ -0,0 +1,27 @@
+const LdapAuth = require('./../modules/authentication/LdapAuth')
+const { usernameAttr, userOptions } = require('./../constants/ldap_options')
+const User = require('../schemas/user.schema').User
+
+const ldap_initialization = (app) => {
+ //LDAP initialization
+ LdapAuth.initialize(
+ userOptions,
+ app,
+ (id) => User.findOne({ username: id }).exec(),
+ async (user) => {
+ console.log(`${user[usernameAttr]} has logged in`)
+ let foundUser = await User.findOneAndUpdate(
+ { username: user[usernameAttr] },
+ user,
+ {
+ upsert: true,
+ new: true,
+ }
+ ).exec()
+ console.log(`${foundUser.username} is retrieved from database`)
+ return foundUser
+ }
+ )
+}
+
+module.exports = ldap_initialization
From fdfa6133292085bc17997088928c69042e154d48 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 10 Apr 2023 14:11:17 -0400
Subject: [PATCH 003/229] pagination_and_querys_added
---
server.js | 3 +
src/connections/LDAP_client.js | 2 +-
src/middlewares/logger.handler.js | 2 +-
src/modules/authentication/LdapAuth.js | 2 +-
src/routes/tree.routes.js | 30 -------
src/routes/user.routes.js | 27 ++++++-
src/schemas/response.schema.js | 20 +++--
src/services/user.services.js | 108 ++++++++++++++++++++++---
src/utils/ldap_search_utils.js | 60 +++++++-------
9 files changed, 176 insertions(+), 78 deletions(-)
diff --git a/server.js b/server.js
index 94bb629e..b335b4d9 100644
--- a/server.js
+++ b/server.js
@@ -8,10 +8,13 @@ const sessionMiddleWare = require('./src/middlewares/session.handler.js')
const addLoggerMiddleware = require('./src/middlewares/logger.handler.js')
const ldap_initialization = require('./src/utils/ldap_initialization.js')
const path = require('path')
+const cors = require('cors')
//app initialization
const app = express()
+app.use(cors())
+
// load app middlewares
// The order of the following middleware is very important!!
app.use(bodyParser.json())
diff --git a/src/connections/LDAP_client.js b/src/connections/LDAP_client.js
index 28d5caad..439f596f 100644
--- a/src/connections/LDAP_client.js
+++ b/src/connections/LDAP_client.js
@@ -1,11 +1,11 @@
const ldap = require('ldapjs')
const config = require('../config/config')
var assert = require('assert')
-const { promisify } = require('util')
const client = ldap.createClient({
url: [`${config.ldap.url}:${config.ldap.port}`],
connectTimeout: 60000,
+ reconnect: true,
})
client.on('connectError', (err) => {
diff --git a/src/middlewares/logger.handler.js b/src/middlewares/logger.handler.js
index c28ab996..a778c951 100644
--- a/src/middlewares/logger.handler.js
+++ b/src/middlewares/logger.handler.js
@@ -32,7 +32,7 @@ const addLoggerMiddleware = (app) => {
status: tokens.status(req, res),
content_length: tokens.res(req, res, 'content-length'),
response_time: tokens['response-time'](req, res),
- user: (tokens.user = req.user.uid),
+ user: req.user.sub,
}
logger.info({ ...log })
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index c77cc97a..4f1e1db0 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -200,7 +200,7 @@ var login = function (req, res, next) {
ci: user.CI,
roles: ['user'],
}
- const token = signToken(payload, { expiresIn: '15 minutes' })
+ const token = signToken(payload, { expiresIn: '45 minutes' })
const refreshToken = signToken(payload, { expiresIn: '1 day' })
req.login(user, (loginErr) => {
diff --git a/src/routes/tree.routes.js b/src/routes/tree.routes.js
index 880fa988..93e167c9 100644
--- a/src/routes/tree.routes.js
+++ b/src/routes/tree.routes.js
@@ -11,18 +11,6 @@ const service = TreeServices()
const PROFESSORS_CLASS = config.ldap.objectClasses[5].name
const STUDENT_CLASS = config.ldap.objectClasses[3].name
-router.get('/estudiantes', checkAuth, validateResponse, (req, res) => {
- service
- .getAllStudents()
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
-})
-router.get('/profesores', checkAuth, validateResponse, (req, res) => {
- service
- .getAllProffesors()
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
-})
router.get('/year/:year', checkAuth, validateResponse, (req, res) => {
service
.getUsersByYear(req.params.year)
@@ -35,23 +23,5 @@ router.get('/branch/:branch', checkAuth, validateResponse, (req, res) => {
.then((data) => responseSuccess(res, 'data fetched succesfully', data))
.catch((err) => responseError(res, err.message, err.errors))
})
-//get students by year and branch
-router.get('/estudiantes/', checkAuth, validateResponse, (req, res) => {
- const year = req.query.year
- const branch = req.query.branch
- service
- .getUsersByYearAndBranch(year, branch, STUDENT_CLASS)
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
-})
-//get professors by year and branch
-router.get('/profesores/', checkAuth, validateResponse, (req, res) => {
- const year = req.query.year
- const branch = req.query.branch
- service
- .getUsersByYearAndBranch(year, branch, PROFESSORS_CLASS)
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
-})
module.exports = router
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index cc3e563c..c706dd30 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -6,9 +6,34 @@ const validateResponse = require('../middlewares/validateResponse')
const { checkAuth } = require('../middlewares/auth.handler')
const service = UserServices()
+//Get all users
router.get('/', checkAuth, validateResponse, (req, res) => {
+ const page = req.query.page || undefined
+ const branch = req.query.branch || undefined
service
- .getAll()
+ .getAll(page, branch)
+ .then((data) => responseSuccess(res, 'data fetched succesfully', data))
+ .catch((err) => responseError(res, err.message, err.errors))
+})
+//Get students
+router.get('/students', checkAuth, validateResponse, (req, res) => {
+ const page = req.query.page || undefined
+ const branch = req.query.branch || undefined
+ const group = req.query.group || undefined
+ service
+ .getStudents(page, branch, group)
+ .then((data) => responseSuccess(res, 'data fetched succesfully', data))
+ .catch((err) => responseError(res, err.message, err.errors))
+})
+//Get professors
+router.get('/professors', checkAuth, validateResponse, (req, res) => {
+ const page = req.query.page || undefined
+ const branch = req.query.branch || undefined
+ const orgRole = req.query.orgRole || undefined
+ const PCC = req.query.PCC || undefined
+ const researchGroup = req.query.researchGroup || undefined
+ service
+ .getProfessors(page, branch, orgRole, PCC, researchGroup)
.then((data) => responseSuccess(res, 'data fetched succesfully', data))
.catch((err) => responseError(res, err.message, err.errors))
})
diff --git a/src/schemas/response.schema.js b/src/schemas/response.schema.js
index 6f699946..7bd3f59f 100644
--- a/src/schemas/response.schema.js
+++ b/src/schemas/response.schema.js
@@ -1,10 +1,16 @@
const responseSuccess = (res, message, data) => {
- res.status(200).json({
- success: true,
- message: message,
- data: data,
- })
-
+ data.length > 1
+ ? res.status(200).json({
+ success: true,
+ message: message,
+ length: data.length,
+ data: data,
+ })
+ : res.status(200).json({
+ success: true,
+ message: message,
+ data: data,
+ })
return res
}
@@ -18,7 +24,7 @@ const responseError = (res, message, errors) => {
return res
}
-module.exports = {
+module.exports = {
responseSuccess,
responseError,
}
diff --git a/src/services/user.services.js b/src/services/user.services.js
index 95b55ac6..4987e887 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -5,30 +5,116 @@ const LDAP = require('ldapjs')
const config = require('../config/config')
const assert = require('assert')
const searchSchema = require('../utils/ldap_search_utils')
-
ldap.bind(config.ldap.username_bind, config.ldap.password_bind, (err) => {
assert.ifError(err)
})
const UserServices = () => {
- const getAll = () => {
- const filter = `(objectclass=*)`
- return searchSchema(filter)
+ const getAll = (page, branch) => {
+ const dn =
+ branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
+ const opts = {
+ filter: '(objectClass=person)',
+ scope: 'sub',
+ attributes: ['uid', 'cn', 'mail', 'ci'],
+ paged: page === undefined ? false : true,
+ pageNum: page === undefined ? undefined : parseInt(page),
+ sizeLimit: page === undefined ? 500 : undefined,
+ }
+ return searchSchema(dn, opts)
+ }
+
+ const getStudents = (page, branch, group) => {
+ const dn =
+ branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
+ const opts = {
+ filter:
+ group !== undefined
+ ? `(studentClassGroup=${parseInt(group)})`
+ : `(objectClass=iesStudent)`,
+ scope: 'sub',
+ attributes: [
+ 'uid',
+ 'cn',
+ 'mail',
+ 'ci',
+ 'studentClassGroup',
+ 'displayName',
+ ],
+ paged: page === undefined ? false : true,
+ pageNum: page === undefined ? undefined : parseInt(page),
+ sizeLimit: page === undefined ? 500 : undefined,
+ }
+ return searchSchema(dn, opts)
+ }
+
+ const getProfessors = (
+ page,
+ branch,
+ orgRole = undefined,
+ PCC = undefined,
+ researchGroup = undefined
+ ) => {
+ const dn =
+ branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
+
+ var pccValue = PCC
+ console.log('PCC VALUE', pccValue)
+
+ if (PCC !== undefined) {
+ pccValue = PCC === true ? 'TRUE' : 'FALSE'
+ }
+ const basefilter = '(objectClass=iesEducationalStaff)'
+ const pCCfilter = PCC !== undefined ? `(PCC=${pccValue})` : ''
+ const roleFilter = orgRole !== undefined ? `(orgRole=${orgRole})` : ''
+ const researchGroupFilter =
+ researchGroup !== undefined ? `(researchGroup=${researchGroup})` : ''
+
+ const filters = `(&${basefilter}${pCCfilter}${roleFilter}${researchGroupFilter})`
+
+ const opts = {
+ filter: filters,
+ scope: 'sub',
+ attributes: [
+ 'uid',
+ 'cn',
+ 'mail',
+ 'ci',
+ 'displayName',
+ 'orgRole',
+ 'PCC',
+ 'researchGroup',
+ ],
+ paged: page === undefined ? false : true,
+ pageNum: page === undefined ? undefined : parseInt(page),
+ sizeLimit: page === undefined ? 500 : undefined,
+ }
+ return searchSchema(dn, opts)
}
const getByUsername = (username) => {
- const filter = `(uid=${username})`
- return searchSchema(filter)
+ const opts = {
+ filter: `(uid=${username})`,
+ scope: 'sub',
+ timeLimit: 60,
+ }
+ return searchSchema(config.ldap.dn, opts)
}
const getByCI = (ci) => {
- const filter = `(ci=${ci})`
- return searchSchema(filter)
+ const opts = {
+ filter: `(ci=${ci})`,
+ scope: 'sub',
+ }
+ return searchSchema(config.ldap.dn, opts)
}
const getByEmail = (email) => {
- const filter = `(maildrop=${email})`
- return searchSchema(filter)
+ const opts = {
+ filter: `(maildrop=${email})`,
+ scope: 'sub',
+ }
+ return searchSchema(config.ldap.dn, opts)
}
return {
@@ -36,6 +122,8 @@ const UserServices = () => {
getByUsername,
getByCI,
getByEmail,
+ getStudents,
+ getProfessors,
}
}
diff --git a/src/utils/ldap_search_utils.js b/src/utils/ldap_search_utils.js
index 69d43e4a..61b6fccd 100644
--- a/src/utils/ldap_search_utils.js
+++ b/src/utils/ldap_search_utils.js
@@ -2,37 +2,43 @@ const config = require('../config/config')
const transformData = require('./transform_user_schema')
const ldap = require('../connections/LDAP_client')
-const searchSchema = (filter, customDN) => {
- const dn =
- customDN !== null && customDN !== undefined ? customDN : config.ldap.dn
- const attributes = ['uid', 'displayName', 'CI']
- const search_options = {
- scope: 'sub',
- filter: filter,
- attrs: attributes,
- }
-
+const searchSchema = (dn, opt) => {
const results = []
return new Promise((resolve, reject) => {
- ldap.search(dn, search_options, (err, res) => {
- if (err) {
- return reject(new Error(`Search failed: ${err.message}`))
- }
- return res
- .on('searchEntry', (entry) =>
- results.push({
- objectName: entry.pojo.objectName,
- attributes: transformData(entry),
- })
- )
- .once('error', (resError) =>
- reject(new Error(`Search error: ${resError}`))
- )
- .on('end', (result) => {
- console.log('status: ' + result.status)
+ ldap.search(dn, opt, (err, res) => {
+ res.on('searchEntry', (entry) => {
+ if (opt.sizeLimit !== undefined) {
+ if (results.length === opt.sizeLimit - 1) {
+ resolve(results.length === 1 ? results[0] : results)
+ }
+ }
+ results.push({
+ objectName: entry.pojo.objectName,
+ attributes: transformData(entry),
})
- .once('end', () => resolve(results[0]))
+ })
+ res.on('page', (result, cb) => {
+ console.log('page finish')
+ opt.pageNum * 100 === results.length
+ ? resolve(
+ results.length === 1
+ ? results[0]
+ : results.slice(opt.pageNum * 100 - 100, opt.pageNum * 100)
+ )
+ : null
+ })
+ res.on('searchReference', (referral) => {
+ console.log('referral: ' + referral.uris.join())
+ })
+ res.on('error', (resError) =>
+ reject(new Error(`Search error: ${resError}`))
+ )
+ res.on('end', (result) => {
+ console.log('status: ' + result.status)
+ console.log('RESULTS', results.length)
+ resolve(results.length === 1 ? results[0] : results)
+ })
})
})
}
From cd27ca534d7c3541132e23280ebd8a47c81f5787 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 10 Apr 2023 18:57:49 -0400
Subject: [PATCH 004/229] adding group routes
---
src/connections/LDAP_client.js | 4 ++
src/routes/groups.routes.js | 6 +--
src/routes/routes.js | 2 +
src/routes/tree.routes.js | 13 ------
src/services/group.services.js | 82 ++++++++--------------------------
5 files changed, 27 insertions(+), 80 deletions(-)
diff --git a/src/connections/LDAP_client.js b/src/connections/LDAP_client.js
index 439f596f..7c8bec44 100644
--- a/src/connections/LDAP_client.js
+++ b/src/connections/LDAP_client.js
@@ -12,6 +12,10 @@ client.on('connectError', (err) => {
assert.ifError(err)
})
+client.on('connection', (stream) => {
+ console.log('someone connected!')
+})
+
client.bind(config.ldap.username_bind, config.ldap.password_bind, (err) => {
assert.ifError(err)
})
diff --git a/src/routes/groups.routes.js b/src/routes/groups.routes.js
index e487f6b6..721d2e0e 100644
--- a/src/routes/groups.routes.js
+++ b/src/routes/groups.routes.js
@@ -1,7 +1,5 @@
const express = require('express')
const router = express.Router()
-
-const { responseSuccess, responseError } = require('../schemas/response.schema')
const { responseSuccess, responseError } = require('../schemas/response.schema')
const validateResponse = require('../middlewares/validateResponse')
const { checkAuth } = require('../middlewares/auth.handler')
@@ -10,8 +8,10 @@ const GroupServices = require('../services/group.services')
const service = GroupServices()
router.get('/:group', checkAuth, validateResponse, (req, res) => {
+ const group = req.params.group
+ const branch = req.query.branch
service
- .getUserByGroup(req.params.group)
+ .getAll(group, branch)
.then((data) => responseSuccess(res, 'data fetched succesfully', data))
.catch((err) => responseError(res, err.message, err.errors))
})
diff --git a/src/routes/routes.js b/src/routes/routes.js
index 18919335..e4c8a599 100644
--- a/src/routes/routes.js
+++ b/src/routes/routes.js
@@ -1,11 +1,13 @@
const AuthRoutes = require('./auth.routes')
const TreeRoutes = require('./tree.routes')
const UserRoutes = require('./user.routes')
+const GroupRoutes = require('./groups.routes')
const addRoutes = (app) => {
app.use('/', AuthRoutes)
app.use('/tree', TreeRoutes)
app.use('/users', UserRoutes)
+ app.use('groups', GroupRoutes)
}
module.exports = addRoutes
diff --git a/src/routes/tree.routes.js b/src/routes/tree.routes.js
index 93e167c9..2e65bfc5 100644
--- a/src/routes/tree.routes.js
+++ b/src/routes/tree.routes.js
@@ -11,17 +11,4 @@ const service = TreeServices()
const PROFESSORS_CLASS = config.ldap.objectClasses[5].name
const STUDENT_CLASS = config.ldap.objectClasses[3].name
-router.get('/year/:year', checkAuth, validateResponse, (req, res) => {
- service
- .getUsersByYear(req.params.year)
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
-})
-router.get('/branch/:branch', checkAuth, validateResponse, (req, res) => {
- service
- .getUserByBranch(req.params.branch)
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
-})
-
module.exports = router
diff --git a/src/services/group.services.js b/src/services/group.services.js
index 38cd0e87..51c930f9 100644
--- a/src/services/group.services.js
+++ b/src/services/group.services.js
@@ -1,76 +1,30 @@
-const boom = require('@hapi/boom')
const ldap = require('../connections/LDAP_client')
-const LDAP = require('ldapjs')
const config = require('../config/config')
const assert = require('assert')
+const searchSchema = require('../utils/ldap_search_utils')
-ldap.bind(
- 'uid=agonzalezb,ou=usuarios,ou=informatica,dc=cujae,dc=edu,dc=cu',
- '00092068426',
- (err) => {
- assert.ifError(err)
- }
-)
-
-const STUDENT_CLASS = config.ldap.objectClasses[3].name
+ldap.bind(config.ldap.username_bind, config.ldap.password_bind, (err) => {
+ assert.ifError(err)
+})
const GroupServices = () => {
- const searchAtt = (atts, value) => {
- let values = {}
- atts.map((att) => {
- if (att.type === value) {
- values = att.values
- }
- })
- return values[0]
- }
-
- const getAll = (group) => {
- const filter = `(studentClassGroup=${group})`
- const attributes = ['uid', 'displayName', 'CI']
- const search_options = {
+ const getAll = (group, branch) => {
+ const page = undefined
+ const dn =
+ branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
+ console.log(dn)
+ const opts = {
+ filter: `(&(objectClass=posixGroup)(cn=${group}))`,
scope: 'sub',
- filter: filter,
- attrs: attributes,
+ attributes: ['cn', 'memberUid'],
+ paged: page === undefined ? false : true,
+ pageNum: page === undefined ? undefined : parseInt(page),
+ sizeLimit: page === undefined ? 500 : undefined,
}
+ console.log(dn)
+ console.log(opts)
- const results = []
-
- const promise = new Promise((resolve, reject) => {
- ldap.search(config.ldap.dn, search_options, (err, res) => {
- if (err) {
- return reject(new Error(`Search failed: ${err.message}`))
- }
- return res
- .on('searchEntry', (entry) =>
- results.push({
- objectName: entry.pojo.objectName,
- attributes: {
- uid: searchAtt(entry.pojo.attributes, 'uid'),
- givenName: searchAtt(entry.pojo.attributes, 'givenName'),
- cn: searchAtt(entry.pojo.attributes, 'cn'),
- sn: searchAtt(entry.pojo.attributes, 'sn'),
- ci: searchAtt(entry.pojo.attributes, 'CI'),
- area: searchAtt(entry.pojo.attributes, 'area'),
- displayName: searchAtt(entry.pojo.attributes, 'displayName'),
- maildrop: searchAtt(entry.pojo.attributes, 'maildrop'),
- email: searchAtt(entry.pojo.attributes, 'email'),
- mailService: searchAtt(entry.pojo.attributes, 'mailService'),
- type: searchAtt(entry.pojo.attributes, 'type'),
- },
- })
- )
- .once('error', (resError) =>
- reject(new Error(`Search error: ${resError}`))
- )
- .on('end', (result) => {
- console.log('status: ' + result.status)
- })
- .once('end', () => resolve(results))
- })
- })
-
- return promise
+ return searchSchema(config.ldap.dn, opts)
}
return {
From 6abac7e3a5728b3aca7bc1316ac425b558009e24 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 10 Apr 2023 19:12:12 -0400
Subject: [PATCH 005/229] helmet middleware added
---
package-lock.json | 14 ++++++++++++++
package.json | 1 +
server.js | 3 +++
3 files changed, 18 insertions(+)
diff --git a/package-lock.json b/package-lock.json
index 5d15daf7..ae3ce921 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,6 +17,7 @@
"dotenv": "^16.0.3",
"express-rate-limit": "^6.7.0",
"handlebars": "^4.7.7",
+ "helmet": "^6.1.3",
"jest-fetch-mock": "^3.0.3",
"joi": "^13.0.2",
"jsonwebtoken": "^9.0.0",
@@ -3233,6 +3234,14 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/helmet": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/helmet/-/helmet-6.1.3.tgz",
+ "integrity": "sha512-W92WikLkFSwuQ+bvdSayleIwFu9kbYmGcOlVz5EPnrB5iP2ezAiP0+sWxndta1Nn2r4zFhxGygIU/gVKrxIrUg==",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/hexoid": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz",
@@ -9508,6 +9517,11 @@
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
},
+ "helmet": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/helmet/-/helmet-6.1.3.tgz",
+ "integrity": "sha512-W92WikLkFSwuQ+bvdSayleIwFu9kbYmGcOlVz5EPnrB5iP2ezAiP0+sWxndta1Nn2r4zFhxGygIU/gVKrxIrUg=="
+ },
"hexoid": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz",
diff --git a/package.json b/package.json
index f66dd832..8503f40f 100644
--- a/package.json
+++ b/package.json
@@ -24,6 +24,7 @@
"dotenv": "^16.0.3",
"express-rate-limit": "^6.7.0",
"handlebars": "^4.7.7",
+ "helmet": "^6.1.3",
"jest-fetch-mock": "^3.0.3",
"joi": "^13.0.2",
"jsonwebtoken": "^9.0.0",
diff --git a/server.js b/server.js
index b335b4d9..146dc464 100644
--- a/server.js
+++ b/server.js
@@ -9,11 +9,14 @@ const addLoggerMiddleware = require('./src/middlewares/logger.handler.js')
const ldap_initialization = require('./src/utils/ldap_initialization.js')
const path = require('path')
const cors = require('cors')
+const helmet = require('helmet')
//app initialization
const app = express()
+//security middlewares
app.use(cors())
+app.use(helmet())
// load app middlewares
// The order of the following middleware is very important!!
From efb1af845160cef67f5192ba58732e0de9766559 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 10 Apr 2023 19:24:51 -0400
Subject: [PATCH 006/229] added express-rate-limit middleware
---
server.js | 12 +++++++-----
src/middlewares/rate_limiter.handler.js | 8 ++++++++
2 files changed, 15 insertions(+), 5 deletions(-)
create mode 100644 src/middlewares/rate_limiter.handler.js
diff --git a/server.js b/server.js
index 146dc464..f4b2d893 100644
--- a/server.js
+++ b/server.js
@@ -10,23 +10,25 @@ const ldap_initialization = require('./src/utils/ldap_initialization.js')
const path = require('path')
const cors = require('cors')
const helmet = require('helmet')
+const limiter = require('./src/middlewares/rate_limiter.handler.js')
//app initialization
const app = express()
-//security middlewares
-app.use(cors())
-app.use(helmet())
-
// load app middlewares
// The order of the following middleware is very important!!
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
app.use(express.json())
+
+//security middlewares
+app.use(cors())
+app.use(helmet())
+app.use(limiter)
app.use(sessionMiddleWare)
addLoggerMiddleware(app)
-//LDAP initialization
+//LDAP and passport initialization
ldap_initialization(app)
//add routes to application
diff --git a/src/middlewares/rate_limiter.handler.js b/src/middlewares/rate_limiter.handler.js
new file mode 100644
index 00000000..ff13feeb
--- /dev/null
+++ b/src/middlewares/rate_limiter.handler.js
@@ -0,0 +1,8 @@
+const rateLimit = require('express-rate-limit')
+
+const limiter = rateLimit({
+ windowMs: 15 * 60 * 1000, // 15 minutes
+ max: 100, // limit each IP to 100 requests per windowMs
+})
+
+module.exports = limiter
From 174af713bf48d4bfa2a50533872196ad76c98952 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 12 Apr 2023 14:51:19 -0400
Subject: [PATCH 007/229] ldap_binding_admin
---
src/config/config.js | 4 ++++
src/connections/LDAP_client.js | 6 +-----
src/routes/routes.js | 4 ++--
src/services/user.services.js | 9 +++------
src/utils/ldap_search_utils.js | 14 ++++++--------
5 files changed, 16 insertions(+), 21 deletions(-)
diff --git a/src/config/config.js b/src/config/config.js
index 12019964..e78abc5d 100644
--- a/src/config/config.js
+++ b/src/config/config.js
@@ -20,5 +20,9 @@ module.exports = {
password: process.env.LDAP_PASS,
password_bind: process.env.LDAP_PASS_BIND,
username_bind: process.env.LDAP_USER_BIND,
+ admin: {
+ username: process.env.ADMIN_USER,
+ password: process.env.ADMIN_PASS,
+ },
},
}
diff --git a/src/connections/LDAP_client.js b/src/connections/LDAP_client.js
index 7c8bec44..64397a19 100644
--- a/src/connections/LDAP_client.js
+++ b/src/connections/LDAP_client.js
@@ -12,11 +12,7 @@ client.on('connectError', (err) => {
assert.ifError(err)
})
-client.on('connection', (stream) => {
- console.log('someone connected!')
-})
-
-client.bind(config.ldap.username_bind, config.ldap.password_bind, (err) => {
+client.bind(config.ldap.admin.username, config.ldap.admin.password, (err) => {
assert.ifError(err)
})
diff --git a/src/routes/routes.js b/src/routes/routes.js
index e4c8a599..3c785053 100644
--- a/src/routes/routes.js
+++ b/src/routes/routes.js
@@ -1,13 +1,13 @@
const AuthRoutes = require('./auth.routes')
const TreeRoutes = require('./tree.routes')
const UserRoutes = require('./user.routes')
-const GroupRoutes = require('./groups.routes')
+//const GroupRoutes = require('./groups.routes')
const addRoutes = (app) => {
app.use('/', AuthRoutes)
app.use('/tree', TreeRoutes)
app.use('/users', UserRoutes)
- app.use('groups', GroupRoutes)
+ // app.use('/groups', GroupRoutes)
}
module.exports = addRoutes
diff --git a/src/services/user.services.js b/src/services/user.services.js
index 4987e887..19591e28 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -5,9 +5,6 @@ const LDAP = require('ldapjs')
const config = require('../config/config')
const assert = require('assert')
const searchSchema = require('../utils/ldap_search_utils')
-ldap.bind(config.ldap.username_bind, config.ldap.password_bind, (err) => {
- assert.ifError(err)
-})
const UserServices = () => {
const getAll = (page, branch) => {
@@ -17,10 +14,10 @@ const UserServices = () => {
filter: '(objectClass=person)',
scope: 'sub',
attributes: ['uid', 'cn', 'mail', 'ci'],
- paged: page === undefined ? false : true,
- pageNum: page === undefined ? undefined : parseInt(page),
- sizeLimit: page === undefined ? 500 : undefined,
+ paged: true,
}
+
+ console.log(opts)
return searchSchema(dn, opts)
}
diff --git a/src/utils/ldap_search_utils.js b/src/utils/ldap_search_utils.js
index 61b6fccd..dd6d7dd8 100644
--- a/src/utils/ldap_search_utils.js
+++ b/src/utils/ldap_search_utils.js
@@ -3,11 +3,14 @@ const transformData = require('./transform_user_schema')
const ldap = require('../connections/LDAP_client')
const searchSchema = (dn, opt) => {
- const results = []
+ let results = []
+ let pageCount = 0
return new Promise((resolve, reject) => {
ldap.search(dn, opt, (err, res) => {
res.on('searchEntry', (entry) => {
+ console.log('LIMIT', opt.sizeLimit)
+ console.log('LENGTH', results.length)
if (opt.sizeLimit !== undefined) {
if (results.length === opt.sizeLimit - 1) {
resolve(results.length === 1 ? results[0] : results)
@@ -20,13 +23,8 @@ const searchSchema = (dn, opt) => {
})
res.on('page', (result, cb) => {
console.log('page finish')
- opt.pageNum * 100 === results.length
- ? resolve(
- results.length === 1
- ? results[0]
- : results.slice(opt.pageNum * 100 - 100, opt.pageNum * 100)
- )
- : null
+ pageCount = pageCount + 1
+ resolve(results.length === 1 ? results[0] : results)
})
res.on('searchReference', (referral) => {
console.log('referral: ' + referral.uris.join())
From 84c93345cec0970a9abbb57e4492ba1694f87682 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 12 Apr 2023 15:02:48 -0400
Subject: [PATCH 008/229] change_login_response_to_incorrect_credentials
---
src/modules/authentication/LdapAuth.js | 6 +++---
src/utils/ldap_search_utils.js | 2 --
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 4f1e1db0..b38a5608 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -7,8 +7,6 @@ const CustomStrategy = require('passport-custom').Strategy
const JwtStrategy = require('../../utils/authentication/strategies/jwtStrategy')
const { authenticate } = require('ldap-authentication')
const TreeServices = require('../../services/user.services')
-const logger = require('../../middlewares/logger.handler')
-const morgan = require('morgan')
const { signToken } = require('../../utils/authentication/tokens/token_sign')
const {
@@ -74,6 +72,9 @@ var init = function (
let username = req.body.username
let password = req.body.password
let response = await service.getByUsername(username)
+ if (response.attributes === undefined) {
+ throw new Error('username or password incorrect')
+ }
const branch = response.objectName
.toString()
.split(',')[2]
@@ -196,7 +197,6 @@ var login = function (req, res, next) {
lastname: user.sn,
fullname: user.cn,
email: user.mail,
- password: user.userPassword,
ci: user.CI,
roles: ['user'],
}
diff --git a/src/utils/ldap_search_utils.js b/src/utils/ldap_search_utils.js
index dd6d7dd8..a7b2ca1c 100644
--- a/src/utils/ldap_search_utils.js
+++ b/src/utils/ldap_search_utils.js
@@ -9,8 +9,6 @@ const searchSchema = (dn, opt) => {
return new Promise((resolve, reject) => {
ldap.search(dn, opt, (err, res) => {
res.on('searchEntry', (entry) => {
- console.log('LIMIT', opt.sizeLimit)
- console.log('LENGTH', results.length)
if (opt.sizeLimit !== undefined) {
if (results.length === opt.sizeLimit - 1) {
resolve(results.length === 1 ? results[0] : results)
From 7ad4783fd82688285ceef08d3b3d318d87ea0be8 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 12 Apr 2023 16:17:22 -0400
Subject: [PATCH 009/229] adding_roles_on_jwt
---
src/modules/authentication/LdapAuth.js | 23 ++++++++++---
.../{groups.routes.js => group.routes.js} | 16 +++++++---
src/routes/routes.js | 4 +--
src/services/group.services.js | 32 +++++++++----------
src/utils/ldap_search_utils.js | 1 +
src/utils/transform_user_schema.js | 6 ++--
6 files changed, 50 insertions(+), 32 deletions(-)
rename src/routes/{groups.routes.js => group.routes.js} (60%)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index b38a5608..1c5ef92e 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -6,7 +6,11 @@ const passport = require('passport')
const CustomStrategy = require('passport-custom').Strategy
const JwtStrategy = require('../../utils/authentication/strategies/jwtStrategy')
const { authenticate } = require('ldap-authentication')
-const TreeServices = require('../../services/user.services')
+const UserServices = require('../../services/user.services')
+const GroupServices = require('../../services/group.services')
+
+//helpers
+const get_dn_from_user = require('../../helpers/get_dn_from_user')
const { signToken } = require('../../utils/authentication/tokens/token_sign')
const {
@@ -15,7 +19,8 @@ const {
} = require('../../schemas/response.schema')
const validateResponse = require('../../middlewares/validateResponse')
-const service = TreeServices()
+const userService = UserServices()
+const groupService = GroupServices()
var _backwardCompatible = false
var _dn
@@ -71,7 +76,8 @@ var init = function (
}
let username = req.body.username
let password = req.body.password
- let response = await service.getByUsername(username)
+ let response = await userService.getByUsername(username)
+ // if user doesn't exists
if (response.attributes === undefined) {
throw new Error('username or password incorrect')
}
@@ -182,7 +188,7 @@ var initialize = function (
* on successful authenticate, or {success: false} on failed authenticate
*/
var login = function (req, res, next) {
- passport.authenticate('ldap', (err, user) => {
+ passport.authenticate('ldap', async (err, user) => {
if (err) {
res.status(401).json({ success: false, message: err.message })
return
@@ -190,6 +196,13 @@ var login = function (req, res, next) {
if (!user) {
res.status(401).json({ success: false, message: 'User cannot be found' })
} else {
+ console.log('USER', user)
+ const userUID = user.uid
+ const userDN = user.member
+ const branch = userDN.split(',')[1].replace('ou=', '')
+ const response = await groupService.getAdminsGroups(branch)
+ const isAdmin = response.attributes.memberUid.includes(userUID)
+
const payload = {
sub: user.uid,
dn: user.dn,
@@ -198,7 +211,7 @@ var login = function (req, res, next) {
fullname: user.cn,
email: user.mail,
ci: user.CI,
- roles: ['user'],
+ roles: isAdmin ? ['admin', 'user'] : ['user'],
}
const token = signToken(payload, { expiresIn: '45 minutes' })
const refreshToken = signToken(payload, { expiresIn: '1 day' })
diff --git a/src/routes/groups.routes.js b/src/routes/group.routes.js
similarity index 60%
rename from src/routes/groups.routes.js
rename to src/routes/group.routes.js
index 721d2e0e..3dd8625e 100644
--- a/src/routes/groups.routes.js
+++ b/src/routes/group.routes.js
@@ -1,17 +1,23 @@
const express = require('express')
const router = express.Router()
+const GroupServices = require('../services/group.services')
const { responseSuccess, responseError } = require('../schemas/response.schema')
const validateResponse = require('../middlewares/validateResponse')
const { checkAuth } = require('../middlewares/auth.handler')
-
-const GroupServices = require('../services/group.services')
const service = GroupServices()
-router.get('/:group', checkAuth, validateResponse, (req, res) => {
- const group = req.params.group
+//Get all users
+router.get('/', checkAuth, validateResponse, (req, res) => {
+ const branch = req.query.branch
+ service
+ .getAll(branch)
+ .then((data) => responseSuccess(res, 'data fetched succesfully', data))
+ .catch((err) => responseError(res, err.message, err.errors))
+})
+router.get('/admins', checkAuth, validateResponse, (req, res) => {
const branch = req.query.branch
service
- .getAll(group, branch)
+ .getAdminsGroups(branch)
.then((data) => responseSuccess(res, 'data fetched succesfully', data))
.catch((err) => responseError(res, err.message, err.errors))
})
diff --git a/src/routes/routes.js b/src/routes/routes.js
index 3c785053..14d1abb3 100644
--- a/src/routes/routes.js
+++ b/src/routes/routes.js
@@ -1,13 +1,13 @@
const AuthRoutes = require('./auth.routes')
const TreeRoutes = require('./tree.routes')
const UserRoutes = require('./user.routes')
-//const GroupRoutes = require('./groups.routes')
+const GroupRoutes = require('./group.routes')
const addRoutes = (app) => {
app.use('/', AuthRoutes)
app.use('/tree', TreeRoutes)
app.use('/users', UserRoutes)
- // app.use('/groups', GroupRoutes)
+ app.use('/groups', GroupRoutes)
}
module.exports = addRoutes
diff --git a/src/services/group.services.js b/src/services/group.services.js
index 51c930f9..d57afd38 100644
--- a/src/services/group.services.js
+++ b/src/services/group.services.js
@@ -1,34 +1,34 @@
+const boom = require('@hapi/boom')
+require('dotenv').config({ path: __dirname + '/../../.env' })
const ldap = require('../connections/LDAP_client')
+const LDAP = require('ldapjs')
const config = require('../config/config')
const assert = require('assert')
const searchSchema = require('../utils/ldap_search_utils')
-ldap.bind(config.ldap.username_bind, config.ldap.password_bind, (err) => {
- assert.ifError(err)
-})
-
const GroupServices = () => {
- const getAll = (group, branch) => {
- const page = undefined
+ const getAll = (branch) => {
const dn =
branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
- console.log(dn)
const opts = {
- filter: `(&(objectClass=posixGroup)(cn=${group}))`,
+ filter: `(objectClass=posixGroup)`,
scope: 'sub',
- attributes: ['cn', 'memberUid'],
- paged: page === undefined ? false : true,
- pageNum: page === undefined ? undefined : parseInt(page),
- sizeLimit: page === undefined ? 500 : undefined,
}
- console.log(dn)
- console.log(opts)
-
- return searchSchema(config.ldap.dn, opts)
+ return searchSchema(dn, opts)
}
+ const getAdminsGroups = (branch) => {
+ const dn =
+ branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
+ const opts = {
+ filter: `(cn=admins)`,
+ scope: 'sub',
+ }
+ return searchSchema(dn, opts)
+ }
return {
getAll,
+ getAdminsGroups,
}
}
diff --git a/src/utils/ldap_search_utils.js b/src/utils/ldap_search_utils.js
index a7b2ca1c..b176c423 100644
--- a/src/utils/ldap_search_utils.js
+++ b/src/utils/ldap_search_utils.js
@@ -9,6 +9,7 @@ const searchSchema = (dn, opt) => {
return new Promise((resolve, reject) => {
ldap.search(dn, opt, (err, res) => {
res.on('searchEntry', (entry) => {
+ console.log("ENTRO")
if (opt.sizeLimit !== undefined) {
if (results.length === opt.sizeLimit - 1) {
resolve(results.length === 1 ? results[0] : results)
diff --git a/src/utils/transform_user_schema.js b/src/utils/transform_user_schema.js
index 414e2774..30a58943 100644
--- a/src/utils/transform_user_schema.js
+++ b/src/utils/transform_user_schema.js
@@ -7,10 +7,8 @@ const getObject = (arr) => {
}
const transform = (entry) => {
- const data = {
- objectName: entry.pojo.objectName,
- attributes: getObject(entry.pojo.attributes),
- }
+ const data = getObject(entry.pojo.attributes)
+
return data
}
From e461eb81e2bbdc4a83b431746eb72ae34c2c547e Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 12 Apr 2023 16:26:07 -0400
Subject: [PATCH 010/229] roles_middleware_added
---
src/middlewares/auth.handler.js | 25 +++++++++++++++++++++++++
src/modules/authentication/LdapAuth.js | 3 ---
src/routes/user.routes.js | 4 ++--
3 files changed, 27 insertions(+), 5 deletions(-)
diff --git a/src/middlewares/auth.handler.js b/src/middlewares/auth.handler.js
index 99b7e870..a0d73335 100644
--- a/src/middlewares/auth.handler.js
+++ b/src/middlewares/auth.handler.js
@@ -1,12 +1,37 @@
const passport = require('passport')
const { verifyToken } = require('../utils/authentication/tokens/token_verify')
const boom = require('@hapi/boom')
+const { responseError } = require('../schemas/response.schema')
const checkAuth = (req, res, next) => {
const auth = passport.authenticate('jwt', { session: false })
auth(req, res, next)
}
+const checkRoles = (...roles) => {
+ return (req, res, next) => {
+ const payload = verifyToken(req.headers.authorization.split(' ')[1])
+ if (!payload) {
+ const error = boom.unauthorized('Token is not valid')
+ next(error)
+ }
+ const { roles: userRoles } = payload
+ const hasRole = roles.some((role) => userRoles.includes(role))
+ if (hasRole) {
+ next()
+ } else {
+ responseError(
+ res,
+ `You don't have permission to access`,
+ boom.unauthorized(
+ 'Invalid token, you are not authorized to perform this action'
+ )
+ )
+ }
+ }
+}
+
module.exports = {
checkAuth,
+ checkRoles,
}
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 1c5ef92e..4ea90ae6 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -9,9 +9,6 @@ const { authenticate } = require('ldap-authentication')
const UserServices = require('../../services/user.services')
const GroupServices = require('../../services/group.services')
-//helpers
-const get_dn_from_user = require('../../helpers/get_dn_from_user')
-
const { signToken } = require('../../utils/authentication/tokens/token_sign')
const {
responseSuccess,
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index c706dd30..abe39fbd 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -3,7 +3,7 @@ const router = express.Router()
const UserServices = require('../services/user.services')
const { responseSuccess, responseError } = require('../schemas/response.schema')
const validateResponse = require('../middlewares/validateResponse')
-const { checkAuth } = require('../middlewares/auth.handler')
+const { checkAuth, checkRoles } = require('../middlewares/auth.handler')
const service = UserServices()
//Get all users
@@ -37,7 +37,7 @@ router.get('/professors', checkAuth, validateResponse, (req, res) => {
.then((data) => responseSuccess(res, 'data fetched succesfully', data))
.catch((err) => responseError(res, err.message, err.errors))
})
-router.get('/:username', checkAuth, validateResponse, (req, res) => {
+router.get('/:username', checkAuth,checkRoles("admin"), validateResponse, (req, res) => {
service
.getByUsername(req.params.username)
.then((data) => responseSuccess(res, 'data fetched succesfully', data))
From 2c4e7feb7b347523c053a64b5b47428f30b99233 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Tue, 25 Apr 2023 19:18:28 -0400
Subject: [PATCH 011/229] added pagination and students filters
---
package-lock.json | 53 +++++++++
package.json | 1 +
server.js | 4 +
src/config/config.js | 1 +
src/modules/authentication/LdapAuth.js | 3 +-
src/routes/user.routes.js | 150 +++++++++++++++++--------
src/schemas/response.schema.js | 20 ++--
src/services/user.services.js | 29 +++--
src/utils/ldap_search_utils.js | 12 +-
src/utils/paginateResults.js | 25 +++++
10 files changed, 220 insertions(+), 78 deletions(-)
create mode 100644 src/utils/paginateResults.js
diff --git a/package-lock.json b/package-lock.json
index ae3ce921..17146128 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,6 +15,7 @@
"body-parser": "^1.20.2",
"cors": "^2.8.5",
"dotenv": "^16.0.3",
+ "express-paginate": "^1.0.2",
"express-rate-limit": "^6.7.0",
"handlebars": "^4.7.7",
"helmet": "^6.1.3",
@@ -2782,6 +2783,17 @@
"node": ">= 0.10.0"
}
},
+ "node_modules/express-paginate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/express-paginate/-/express-paginate-1.0.2.tgz",
+ "integrity": "sha512-z0VTaLrsMe4PJFifjJCC4Q11cwrveSOejicYOgFi6RzqUMPd8kIlK95x/xq6g6k6urCI2Fd3gadj3AZ9AGqguw==",
+ "dependencies": {
+ "lodash.assign": "^4.2.0",
+ "lodash.clone": "^4.5.0",
+ "lodash.isobject": "^3.0.2",
+ "qs": "^6.5.1"
+ }
+ },
"node_modules/express-rate-limit": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz",
@@ -4620,6 +4632,21 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
"integrity": "sha512-6X37Sq9KCpLSXEh8uM12AKYlviHPNNk4RxiGBn4cmKGJinbXBneWIV7iE/nXkM928O7ytHcHb6+X6Svl0f4hXg=="
},
+ "node_modules/lodash.assign": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+ "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw=="
+ },
+ "node_modules/lodash.clone": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
+ "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg=="
+ },
+ "node_modules/lodash.isobject": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
+ "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA=="
+ },
"node_modules/logform": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz",
@@ -9243,6 +9270,17 @@
}
}
},
+ "express-paginate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/express-paginate/-/express-paginate-1.0.2.tgz",
+ "integrity": "sha512-z0VTaLrsMe4PJFifjJCC4Q11cwrveSOejicYOgFi6RzqUMPd8kIlK95x/xq6g6k6urCI2Fd3gadj3AZ9AGqguw==",
+ "requires": {
+ "lodash.assign": "^4.2.0",
+ "lodash.clone": "^4.5.0",
+ "lodash.isobject": "^3.0.2",
+ "qs": "^6.5.1"
+ }
+ },
"express-rate-limit": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz",
@@ -10583,6 +10621,21 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
"integrity": "sha512-6X37Sq9KCpLSXEh8uM12AKYlviHPNNk4RxiGBn4cmKGJinbXBneWIV7iE/nXkM928O7ytHcHb6+X6Svl0f4hXg=="
},
+ "lodash.assign": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+ "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw=="
+ },
+ "lodash.clone": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
+ "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg=="
+ },
+ "lodash.isobject": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
+ "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA=="
+ },
"logform": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz",
diff --git a/package.json b/package.json
index 8503f40f..597b4ceb 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,7 @@
"body-parser": "^1.20.2",
"cors": "^2.8.5",
"dotenv": "^16.0.3",
+ "express-paginate": "^1.0.2",
"express-rate-limit": "^6.7.0",
"handlebars": "^4.7.7",
"helmet": "^6.1.3",
diff --git a/server.js b/server.js
index f4b2d893..5d0f0c2f 100644
--- a/server.js
+++ b/server.js
@@ -11,6 +11,7 @@ const path = require('path')
const cors = require('cors')
const helmet = require('helmet')
const limiter = require('./src/middlewares/rate_limiter.handler.js')
+const paginate = require('express-paginate')
//app initialization
const app = express()
@@ -31,6 +32,9 @@ addLoggerMiddleware(app)
//LDAP and passport initialization
ldap_initialization(app)
+//pagination middleware
+app.use(paginate.middleware(100, CONFIG.ldap.sizeLimit))
+
//add routes to application
addRoutes(app)
diff --git a/src/config/config.js b/src/config/config.js
index e78abc5d..5f4368e7 100644
--- a/src/config/config.js
+++ b/src/config/config.js
@@ -24,5 +24,6 @@ module.exports = {
username: process.env.ADMIN_USER,
password: process.env.ADMIN_PASS,
},
+ sizeLimit: parseInt(process.env.LDAP_SIZE_LIMIT),
},
}
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 4ea90ae6..594fea94 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -192,8 +192,7 @@ var login = function (req, res, next) {
}
if (!user) {
res.status(401).json({ success: false, message: 'User cannot be found' })
- } else {
- console.log('USER', user)
+ } else {
const userUID = user.uid
const userDN = user.member
const branch = userDN.split(',')[1].replace('ou=', '')
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index abe39fbd..f6bc5f42 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -5,57 +5,111 @@ const { responseSuccess, responseError } = require('../schemas/response.schema')
const validateResponse = require('../middlewares/validateResponse')
const { checkAuth, checkRoles } = require('../middlewares/auth.handler')
const service = UserServices()
+const paginateResults = require('../utils/paginateResults')
//Get all users
-router.get('/', checkAuth, validateResponse, (req, res) => {
- const page = req.query.page || undefined
- const branch = req.query.branch || undefined
- service
- .getAll(page, branch)
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
-})
+router.get(
+ '/',
+ checkAuth,
+ checkRoles('admin'),
+ validateResponse,
+ (req, res) => {
+ const branch = req.query.branch || undefined
+ service
+ .getAll(branch)
+ .then((data) =>
+ responseSuccess(
+ res,
+ 'data fetched succesfully',
+ paginateResults(data, req)
+ )
+ )
+ .catch((err) => responseError(res, err.message, err.errors))
+ }
+)
//Get students
-router.get('/students', checkAuth, validateResponse, (req, res) => {
- const page = req.query.page || undefined
- const branch = req.query.branch || undefined
- const group = req.query.group || undefined
- service
- .getStudents(page, branch, group)
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
-})
+router.get(
+ '/students',
+ checkAuth,
+ checkRoles('admin'),
+ validateResponse,
+ (req, res) => {
+ const branch = req.query.branch || undefined
+ const group = req.query.group || undefined
+ const year = req.query.year || undefined
+ service
+ .getStudents(branch, group, year)
+ .then((data) =>
+ responseSuccess(
+ res,
+ 'data fetched succesfully',
+ paginateResults(data, req)
+ )
+ )
+ .catch((err) => responseError(res, err.message, err.errors))
+ }
+)
//Get professors
-router.get('/professors', checkAuth, validateResponse, (req, res) => {
- const page = req.query.page || undefined
- const branch = req.query.branch || undefined
- const orgRole = req.query.orgRole || undefined
- const PCC = req.query.PCC || undefined
- const researchGroup = req.query.researchGroup || undefined
- service
- .getProfessors(page, branch, orgRole, PCC, researchGroup)
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
-})
-router.get('/:username', checkAuth,checkRoles("admin"), validateResponse, (req, res) => {
- service
- .getByUsername(req.params.username)
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => {
- responseError(res, err.message, err.errors)
- })
-})
-router.get('/ci/:ci', checkAuth, validateResponse, (req, res) => {
- service
- .getByCI(req.params.ci)
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
-})
-router.get('/email/:email', checkAuth, validateResponse, (req, res) => {
- service
- .getByEmail(req.params.email)
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
-})
+router.get(
+ '/professors',
+ checkAuth,
+ checkRoles('admin'),
+ validateResponse,
+ (req, res) => {
+ const page = req.query.page || undefined
+ const branch = req.query.branch || undefined
+ const orgRole = req.query.orgRole || undefined
+ const PCC = req.query.PCC || undefined
+ const researchGroup = req.query.researchGroup || undefined
+ service
+ .getProfessors(page, branch, orgRole, PCC, researchGroup)
+ .then((data) => responseSuccess(res, 'data fetched succesfully', data))
+ .catch((err) => responseError(res, err.message, err.errors))
+ }
+)
+router.get(
+ '/:username',
+ checkAuth,
+ checkRoles('admin'),
+ validateResponse,
+ (req, res) => {
+ service
+ .getByUsername(req.params.username)
+ .then((data) =>
+ responseSuccess(
+ res,
+ 'data fetched succesfully',
+ paginateResults(data, req)
+ )
+ )
+ .catch((err) => {
+ responseError(res, err.message, err.errors)
+ })
+ }
+)
+router.get(
+ '/ci/:ci',
+ checkAuth,
+ checkRoles('admin'),
+ validateResponse,
+ (req, res) => {
+ service
+ .getByCI(req.params.ci)
+ .then((data) => responseSuccess(res, 'data fetched succesfully', data))
+ .catch((err) => responseError(res, err.message, err.errors))
+ }
+)
+router.get(
+ '/email/:email',
+ checkAuth,
+ checkRoles('admin'),
+ validateResponse,
+ (req, res) => {
+ service
+ .getByEmail(req.params.email)
+ .then((data) => responseSuccess(res, 'data fetched succesfully', data))
+ .catch((err) => responseError(res, err.message, err.errors))
+ }
+)
module.exports = router
diff --git a/src/schemas/response.schema.js b/src/schemas/response.schema.js
index 7bd3f59f..589a6f56 100644
--- a/src/schemas/response.schema.js
+++ b/src/schemas/response.schema.js
@@ -1,16 +1,12 @@
const responseSuccess = (res, message, data) => {
- data.length > 1
- ? res.status(200).json({
- success: true,
- message: message,
- length: data.length,
- data: data,
- })
- : res.status(200).json({
- success: true,
- message: message,
- data: data,
- })
+ const isPaginated = data.results !== undefined
+ res.status(200).json({
+ success: true,
+ message: message,
+ length: isPaginated ? data.results.length : data.length,
+ data: data,
+ })
+
return res
}
diff --git a/src/services/user.services.js b/src/services/user.services.js
index 19591e28..3edbbe44 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -7,28 +7,36 @@ const assert = require('assert')
const searchSchema = require('../utils/ldap_search_utils')
const UserServices = () => {
- const getAll = (page, branch) => {
+ const getAll = (branch) => {
const dn =
branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
const opts = {
filter: '(objectClass=person)',
scope: 'sub',
attributes: ['uid', 'cn', 'mail', 'ci'],
- paged: true,
+ sizeLimit: config.ldap.sizeLimit,
}
-
console.log(opts)
+
return searchSchema(dn, opts)
}
- const getStudents = (page, branch, group) => {
+ const getStudents = (branch, group, year) => {
+ const getfilter = () => {
+ let filter = ''
+ if (group !== undefined) {
+ filter = `(studentClassGroup=${parseInt(group)})`
+ } else if (year !== undefined) {
+ filter = `(studentClassGroup=${year}*)`
+ } else {
+ filter = `(objectClass=iesStudent)`
+ }
+ return filter
+ }
const dn =
branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
const opts = {
- filter:
- group !== undefined
- ? `(studentClassGroup=${parseInt(group)})`
- : `(objectClass=iesStudent)`,
+ filter: getfilter(),
scope: 'sub',
attributes: [
'uid',
@@ -38,9 +46,7 @@ const UserServices = () => {
'studentClassGroup',
'displayName',
],
- paged: page === undefined ? false : true,
- pageNum: page === undefined ? undefined : parseInt(page),
- sizeLimit: page === undefined ? 500 : undefined,
+ sizeLimit: config.ldap.sizeLimit,
}
return searchSchema(dn, opts)
}
@@ -56,7 +62,6 @@ const UserServices = () => {
branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
var pccValue = PCC
- console.log('PCC VALUE', pccValue)
if (PCC !== undefined) {
pccValue = PCC === true ? 'TRUE' : 'FALSE'
diff --git a/src/utils/ldap_search_utils.js b/src/utils/ldap_search_utils.js
index b176c423..d7dffc46 100644
--- a/src/utils/ldap_search_utils.js
+++ b/src/utils/ldap_search_utils.js
@@ -5,11 +5,11 @@ const ldap = require('../connections/LDAP_client')
const searchSchema = (dn, opt) => {
let results = []
let pageCount = 0
+ let pagedEntries = []
return new Promise((resolve, reject) => {
ldap.search(dn, opt, (err, res) => {
res.on('searchEntry', (entry) => {
- console.log("ENTRO")
if (opt.sizeLimit !== undefined) {
if (results.length === opt.sizeLimit - 1) {
resolve(results.length === 1 ? results[0] : results)
@@ -19,11 +19,17 @@ const searchSchema = (dn, opt) => {
objectName: entry.pojo.objectName,
attributes: transformData(entry),
})
+ pagedEntries.push({
+ objectName: entry.pojo.objectName,
+ attributes: transformData(entry),
+ })
})
res.on('page', (result, cb) => {
console.log('page finish')
pageCount = pageCount + 1
- resolve(results.length === 1 ? results[0] : results)
+ pageCount === opt.pageNum
+ ? resolve(pagedEntries.length === 1 ? pagedEntries[0] : pagedEntries)
+ : (pagedEntries = [])
})
res.on('searchReference', (referral) => {
console.log('referral: ' + referral.uris.join())
@@ -32,8 +38,6 @@ const searchSchema = (dn, opt) => {
reject(new Error(`Search error: ${resError}`))
)
res.on('end', (result) => {
- console.log('status: ' + result.status)
- console.log('RESULTS', results.length)
resolve(results.length === 1 ? results[0] : results)
})
})
diff --git a/src/utils/paginateResults.js b/src/utils/paginateResults.js
new file mode 100644
index 00000000..852bc055
--- /dev/null
+++ b/src/utils/paginateResults.js
@@ -0,0 +1,25 @@
+function paginateResults(array, req) {
+ const page = parseInt(req.query.page) || 1
+ const limit = parseInt(req.query.limit) || 10
+ const startIndex = (page - 1) * limit
+ const endIndex = page * limit
+ const results = {}
+
+ results.results = array.slice(startIndex, endIndex)
+
+ if (endIndex < array.length) {
+ results.next = {
+ page: page + 1,
+ limit: limit,
+ }
+ }
+ if (startIndex > 0) {
+ results.previous = {
+ page: page - 1,
+ limit: limit,
+ }
+ }
+ return results
+}
+
+module.exports = paginateResults
From 722bf9d9703857b59661dd7550751d77595d3585 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Tue, 25 Apr 2023 20:29:32 -0400
Subject: [PATCH 012/229] add user endpoint
---
src/routes/user.routes.js | 25 +++++++++++++++++++
src/schemas/newUser.schema.js | 15 ++++++++++++
src/services/user.services.js | 46 +++++++++++++++++++++++++++++++++--
3 files changed, 84 insertions(+), 2 deletions(-)
create mode 100644 src/schemas/newUser.schema.js
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index f6bc5f42..52fededc 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -6,6 +6,7 @@ const validateResponse = require('../middlewares/validateResponse')
const { checkAuth, checkRoles } = require('../middlewares/auth.handler')
const service = UserServices()
const paginateResults = require('../utils/paginateResults')
+const newUserSchema = require('../schemas/newUser.schema')
//Get all users
router.get(
@@ -112,4 +113,28 @@ router.get(
}
)
+//Add Users
+router.post(
+ '/',
+ checkAuth,
+ checkRoles('admin'),
+ validateResponse,
+ (req, res) => {
+ const user = req.body
+ const branch = req.query.branch || undefined
+ if (!branch) {
+ responseError(res, 'branch is required')
+ }
+ newUserSchema
+ .validate(user)
+ .then(() => {
+ service
+ .addNewUser(user, branch)
+ .then((data) => responseSuccess(res, 'user added succesfully', data))
+ .catch((err) => responseError(res, err.message, err.errors))
+ })
+ .catch((err) => responseError(res, err.message, err.errors))
+ }
+)
+
module.exports = router
diff --git a/src/schemas/newUser.schema.js b/src/schemas/newUser.schema.js
new file mode 100644
index 00000000..3d230a52
--- /dev/null
+++ b/src/schemas/newUser.schema.js
@@ -0,0 +1,15 @@
+const joi = require('joi')
+
+const newUserSchema = joi.object({
+ uid: joi.string(),
+ cn: joi.string(),
+ sn: joi.string(),
+ email: joi.string(),
+ ci: joi.string(),
+ studentClassGroup: joi.string(),
+ displayName: joi.string(),
+ password: joi.string(),
+ confirmPassword: joi.string(),
+})
+
+module.exports = newUserSchema
diff --git a/src/services/user.services.js b/src/services/user.services.js
index 3edbbe44..3aa2f1b3 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -1,10 +1,10 @@
const boom = require('@hapi/boom')
require('dotenv').config({ path: __dirname + '/../../.env' })
-const ldap = require('../connections/LDAP_client')
-const LDAP = require('ldapjs')
const config = require('../config/config')
const assert = require('assert')
const searchSchema = require('../utils/ldap_search_utils')
+const ldapClient = require('../connections/LDAP_client')
+var bytes = new Uint8Array(1024)
const UserServices = () => {
const getAll = (branch) => {
@@ -119,6 +119,47 @@ const UserServices = () => {
return searchSchema(config.ldap.dn, opts)
}
+ const addNewUser = (user, branch) => {
+ const dn = `uid=${user.uid},ou=usuarios,ou=${branch},${config.ldap.dn}`
+
+ const entry = {
+ ...user,
+ objectclass: [
+ 'top',
+ 'person',
+ 'posixAccount',
+ 'iesServices',
+ 'sambaSamAccount',
+ 'radiusprofile',
+ 'CourierMailAlias',
+ ],
+ homeDirectory: `/home/${user.uid}`,
+ gidNumber: [1000],
+ sambaSID: ['S-1-5-21-1255719363-1350762778-3568053751-513'],
+ sambaLMPassword: [new TextEncoder().encode('sambaLMPassword')],
+ sambaNTPassword: [new TextEncoder().encode('sambaNTPassword')],
+ loginShell: [new TextEncoder().encode('/bin/nosh')],
+ sambaacctflags: [new TextEncoder().encode('[U ]')],
+ sambapasswordhistory: [
+ new TextEncoder().encode(
+ '000000000000000000000000000000000000000000000000000000 0000000000'
+ ),
+ ],
+ sambaprimarygroupsid: ['S-1-5-21-1255719363-1350762778-3568053751-513'],
+ sambapwdlastset: [new TextEncoder().encode('1308584948')],
+ }
+ console.log(branch)
+ return new Promise((resolve, reject) => {
+ ldapClient.add(dn, entry, (err) => {
+ if (err) {
+ console.log("ERROR",err)
+ reject(boom.badImplementation(err))
+ }
+ resolve({ message: 'User added successfully' })
+ })
+ })
+ }
+
return {
getAll,
getByUsername,
@@ -126,6 +167,7 @@ const UserServices = () => {
getByEmail,
getStudents,
getProfessors,
+ addNewUser,
}
}
From e3174c76500c1c97b975b9dec3d51ade75a21ae7 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 26 Apr 2023 02:05:29 -0400
Subject: [PATCH 013/229] updating profile
---
src/routes/profile.routes.js | 35 ++++++++++++++++++
src/routes/routes.js | 2 ++
src/schemas/response.schema.js | 21 ++++++-----
src/services/profile.services.js | 52 +++++++++++++++++++++++++++
src/services/user.services.js | 14 ++++++--
src/utils/ldap_search_utils.js | 1 +
src/utils/searchSchemaWithNoFormat.js | 47 ++++++++++++++++++++++++
7 files changed, 162 insertions(+), 10 deletions(-)
create mode 100644 src/routes/profile.routes.js
create mode 100644 src/utils/searchSchemaWithNoFormat.js
diff --git a/src/routes/profile.routes.js b/src/routes/profile.routes.js
new file mode 100644
index 00000000..2e49e352
--- /dev/null
+++ b/src/routes/profile.routes.js
@@ -0,0 +1,35 @@
+const express = require('express')
+const router = express.Router()
+const ProfileServices = require('../services/profile.services')
+const { responseSuccess, responseError } = require('../schemas/response.schema')
+const validateResponse = require('../middlewares/validateResponse')
+const { checkAuth, checkRoles } = require('../middlewares/auth.handler')
+const service = ProfileServices()
+
+//Get all users
+router.get('/', checkAuth, checkRoles('user'), validateResponse, (req, res) => {
+ service
+ .getProfile(req)
+ .then((data) => responseSuccess(res, 'data fetched succesfully', data))
+ .catch((err) => responseError(res, err.message, err.errors))
+})
+
+router.put('/', checkAuth, checkRoles('user'), validateResponse, (req, res) => {
+ const { email, password, confirmPassword } = req.body
+ console.log({ email, password, confirmPassword })
+ if (!email && !password) {
+ console.log('entro')
+ responseError(res, 'fields cannot be empty', null)
+ } else if (password) {
+ if (password !== confirmPassword) {
+ responseError(res, 'passwords must be the same')
+ }
+ } else {
+ service
+ .updateProfile(email, password, req)
+ .then((data) => responseSuccess(res, 'data fetched succesfully', data))
+ .catch((err) => responseError(res, err.message, err.errors))
+ }
+})
+
+module.exports = router
diff --git a/src/routes/routes.js b/src/routes/routes.js
index 14d1abb3..7770e2e3 100644
--- a/src/routes/routes.js
+++ b/src/routes/routes.js
@@ -2,12 +2,14 @@ const AuthRoutes = require('./auth.routes')
const TreeRoutes = require('./tree.routes')
const UserRoutes = require('./user.routes')
const GroupRoutes = require('./group.routes')
+const ProfileRoutes = require('./profile.routes')
const addRoutes = (app) => {
app.use('/', AuthRoutes)
app.use('/tree', TreeRoutes)
app.use('/users', UserRoutes)
app.use('/groups', GroupRoutes)
+ app.use('/profile', ProfileRoutes)
}
module.exports = addRoutes
diff --git a/src/schemas/response.schema.js b/src/schemas/response.schema.js
index 589a6f56..71326ce1 100644
--- a/src/schemas/response.schema.js
+++ b/src/schemas/response.schema.js
@@ -1,12 +1,17 @@
const responseSuccess = (res, message, data) => {
- const isPaginated = data.results !== undefined
- res.status(200).json({
- success: true,
- message: message,
- length: isPaginated ? data.results.length : data.length,
- data: data,
- })
-
+ console.log(data)
+ data.length > 1
+ ? res.status(200).json({
+ success: true,
+ message: message,
+ length: data?.results.length ?? data.length,
+ data: data,
+ })
+ : res.status(200).json({
+ success: true,
+ message: message,
+ data: data,
+ })
return res
}
diff --git a/src/services/profile.services.js b/src/services/profile.services.js
index e69de29b..47e38db4 100644
--- a/src/services/profile.services.js
+++ b/src/services/profile.services.js
@@ -0,0 +1,52 @@
+const boom = require('@hapi/boom')
+require('dotenv').config({ path: __dirname + '/../../.env' })
+const ldapClient = require('../connections/LDAP_client')
+const UserServices = require('./user.services')
+const service = UserServices()
+const { verifyToken } = require('../utils/authentication/tokens/token_verify')
+const ldap = require('ldapjs')
+
+const ProfileServices = () => {
+ const getProfile = (req) => {
+ const token = req.headers.authorization.split(' ')[1]
+ const payload = verifyToken(token)
+ const { sub } = payload
+ return service.getByUsername(sub)
+ }
+
+ const updateProfile = async (email, password, req) => {
+ const token = req.headers.authorization.split(' ')[1]
+ const payload = verifyToken(token)
+ const { dn, sub } = payload
+
+ const user = await service.getByUsername(sub)
+ if (user.dn !== dn) {
+ return boom.unauthorized('Unauthorized')
+ } else {
+ const change = new ldap.Change({
+ operation: 'replace',
+ modification: new ldap.Attribute(
+ {
+ type: 'maildrop',
+ value: [`=${email}`],
+ },
+ {
+ type: 'password',
+ value: [`=${password}`],
+ }
+ ),
+ })
+
+ return ldapClient.modify(dn, change, (err) => {
+ boom.badImplementation(err)
+ })
+ }
+ }
+
+ return {
+ getProfile,
+ updateProfile,
+ }
+}
+
+module.exports = ProfileServices
diff --git a/src/services/user.services.js b/src/services/user.services.js
index 3aa2f1b3..34976fe8 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -3,8 +3,8 @@ require('dotenv').config({ path: __dirname + '/../../.env' })
const config = require('../config/config')
const assert = require('assert')
const searchSchema = require('../utils/ldap_search_utils')
+const searchSchemaWithoutFormat = require('../utils/searchSchemaWithNoFormat')
const ldapClient = require('../connections/LDAP_client')
-var bytes = new Uint8Array(1024)
const UserServices = () => {
const getAll = (branch) => {
@@ -103,6 +103,15 @@ const UserServices = () => {
return searchSchema(config.ldap.dn, opts)
}
+ const getByUsernameWithNoFormat = (username) => {
+ const opts = {
+ filter: `(uid=${username})`,
+ scope: 'sub',
+ timeLimit: 60,
+ }
+ return searchSchemaWithoutFormat(config.ldap.dn, opts)
+ }
+
const getByCI = (ci) => {
const opts = {
filter: `(ci=${ci})`,
@@ -152,7 +161,7 @@ const UserServices = () => {
return new Promise((resolve, reject) => {
ldapClient.add(dn, entry, (err) => {
if (err) {
- console.log("ERROR",err)
+ console.log('ERROR', err)
reject(boom.badImplementation(err))
}
resolve({ message: 'User added successfully' })
@@ -163,6 +172,7 @@ const UserServices = () => {
return {
getAll,
getByUsername,
+ getByUsernameWithNoFormat,
getByCI,
getByEmail,
getStudents,
diff --git a/src/utils/ldap_search_utils.js b/src/utils/ldap_search_utils.js
index d7dffc46..1a3d837c 100644
--- a/src/utils/ldap_search_utils.js
+++ b/src/utils/ldap_search_utils.js
@@ -44,4 +44,5 @@ const searchSchema = (dn, opt) => {
})
}
+
module.exports = searchSchema
diff --git a/src/utils/searchSchemaWithNoFormat.js b/src/utils/searchSchemaWithNoFormat.js
new file mode 100644
index 00000000..7fdf634b
--- /dev/null
+++ b/src/utils/searchSchemaWithNoFormat.js
@@ -0,0 +1,47 @@
+const config = require('../config/config')
+const transformData = require('./transform_user_schema')
+const ldap = require('../connections/LDAP_client')
+
+const searchSchemaWithoutFormat = (dn, opt) => {
+ let results = []
+ let pageCount = 0
+ let pagedEntries = []
+
+ return new Promise((resolve, reject) => {
+ ldap.search(dn, opt, (err, res) => {
+ res.on('searchEntry', (entry) => {
+ if (opt.sizeLimit !== undefined) {
+ if (results.length === opt.sizeLimit - 1) {
+ resolve(results.length === 1 ? results[0] : results)
+ }
+ }
+ results.push({
+ objectName: entry.pojo.objectName,
+ attributes: entry.pojo,
+ })
+ pagedEntries.push({
+ objectName: entry.pojo.objectName,
+ attributes: entry.pojo,
+ })
+ })
+ res.on('page', (result, cb) => {
+ console.log('page finish')
+ pageCount = pageCount + 1
+ pageCount === opt.pageNum
+ ? resolve(pagedEntries.length === 1 ? pagedEntries[0] : pagedEntries)
+ : (pagedEntries = [])
+ })
+ res.on('searchReference', (referral) => {
+ console.log('referral: ' + referral.uris.join())
+ })
+ res.on('error', (resError) =>
+ reject(new Error(`Search error: ${resError}`))
+ )
+ res.on('end', (result) => {
+ resolve(results.length === 1 ? results[0] : results)
+ })
+ })
+ })
+}
+
+module.exports = searchSchemaWithoutFormat
From ef60416b9de78033e5aeeaee6cfbb03efa4ccd22 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 26 Apr 2023 02:16:06 -0400
Subject: [PATCH 014/229] adding server-monitor
---
package-lock.json | 675 +++++++++++++++++++++++++++++-
package.json | 1 +
server.js | 1 +
src/middlewares/logger.handler.js | 2 +-
4 files changed, 674 insertions(+), 5 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 17146128..c1668c2c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,6 +17,7 @@
"dotenv": "^16.0.3",
"express-paginate": "^1.0.2",
"express-rate-limit": "^6.7.0",
+ "express-status-monitor": "^1.3.4",
"handlebars": "^4.7.7",
"helmet": "^6.1.3",
"jest-fetch-mock": "^3.0.3",
@@ -1413,6 +1414,11 @@
"node": ">=0.4.0"
}
},
+ "node_modules/after": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+ "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA=="
+ },
"node_modules/agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
@@ -1519,6 +1525,11 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
+ "node_modules/arraybuffer.slice": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
+ "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog=="
+ },
"node_modules/asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
@@ -1664,6 +1675,11 @@
"@babel/core": "^7.0.0"
}
},
+ "node_modules/backo2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+ "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA=="
+ },
"node_modules/backoff": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz",
@@ -1681,6 +1697,14 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
+ "node_modules/base64-arraybuffer": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
+ "integrity": "sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -1743,6 +1767,11 @@
"safe-buffer": "^5.1.1"
}
},
+ "node_modules/blob": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
+ "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig=="
+ },
"node_modules/bn.js": {
"version": "4.12.0",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
@@ -2127,11 +2156,20 @@
"node": ">= 0.8"
}
},
+ "node_modules/component-bind": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+ "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw=="
+ },
"node_modules/component-emitter": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
- "dev": true
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+ },
+ "node_modules/component-inherit": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+ "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA=="
},
"node_modules/concat-map": {
"version": "0.0.1",
@@ -2532,6 +2570,64 @@
"node": ">=10.0.0"
}
},
+ "node_modules/engine.io-client": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.3.tgz",
+ "integrity": "sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw==",
+ "dependencies": {
+ "component-emitter": "~1.3.0",
+ "component-inherit": "0.0.3",
+ "debug": "~3.1.0",
+ "engine.io-parser": "~2.2.0",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "parseqs": "0.0.6",
+ "parseuri": "0.0.6",
+ "ws": "~7.4.2",
+ "xmlhttprequest-ssl": "~1.6.2",
+ "yeast": "0.1.2"
+ }
+ },
+ "node_modules/engine.io-client/node_modules/debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/engine.io-client/node_modules/engine.io-parser": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz",
+ "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==",
+ "dependencies": {
+ "after": "0.8.2",
+ "arraybuffer.slice": "~0.0.7",
+ "base64-arraybuffer": "0.1.4",
+ "blob": "0.0.5",
+ "has-binary2": "~1.0.2"
+ }
+ },
+ "node_modules/engine.io-client/node_modules/ws": {
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
"node_modules/engine.io-parser": {
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz",
@@ -2694,6 +2790,19 @@
"node": ">= 0.6"
}
},
+ "node_modules/event-loop-stats": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/event-loop-stats/-/event-loop-stats-1.2.0.tgz",
+ "integrity": "sha512-h/leAlXqoEf+D9w1dnFG0srR5vfIq59rLm9PHzcl3/GwFppd+UR46UMuLdp/mvJvuA+MjSd/dNShmuM2/dPFFw==",
+ "hasInstallScript": true,
+ "optional": true,
+ "dependencies": {
+ "nan": "^2.14.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
"node_modules/execa": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
@@ -2853,6 +2962,148 @@
}
]
},
+ "node_modules/express-status-monitor": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/express-status-monitor/-/express-status-monitor-1.3.4.tgz",
+ "integrity": "sha512-EyqHvgX57ujN4fqfUT+x6Bv2xwRyzQdv3AJvWQxcG+jK4TcF9vhrKVqGcE0T6bhT4rstpvOKRuxHBwC/Q6AXQg==",
+ "dependencies": {
+ "axios": "0.26.0",
+ "debug": "4.1.1",
+ "handlebars": "^4.7.7",
+ "on-headers": "1.0.2",
+ "pidusage": "2.0.18",
+ "socket.io": "^2.4.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "http://dynobase.com/buy"
+ },
+ "optionalDependencies": {
+ "event-loop-stats": "1.2.0"
+ }
+ },
+ "node_modules/express-status-monitor/node_modules/axios": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz",
+ "integrity": "sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==",
+ "dependencies": {
+ "follow-redirects": "^1.14.8"
+ }
+ },
+ "node_modules/express-status-monitor/node_modules/component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA=="
+ },
+ "node_modules/express-status-monitor/node_modules/cookie": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+ "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express-status-monitor/node_modules/debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/express-status-monitor/node_modules/engine.io": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.6.1.tgz",
+ "integrity": "sha512-dfs8EVg/i7QjFsXxn7cCRQ+Wai1G1TlEvHhdYEi80fxn5R1vZ2K661O6v/rezj1FP234SZ14r9CmJke99iYDGg==",
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "base64id": "2.0.0",
+ "cookie": "~0.4.1",
+ "debug": "~4.1.0",
+ "engine.io-parser": "~2.2.0",
+ "ws": "~7.4.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/express-status-monitor/node_modules/engine.io-parser": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz",
+ "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==",
+ "dependencies": {
+ "after": "0.8.2",
+ "arraybuffer.slice": "~0.0.7",
+ "base64-arraybuffer": "0.1.4",
+ "blob": "0.0.5",
+ "has-binary2": "~1.0.2"
+ }
+ },
+ "node_modules/express-status-monitor/node_modules/isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ=="
+ },
+ "node_modules/express-status-monitor/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/express-status-monitor/node_modules/socket.io": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.5.0.tgz",
+ "integrity": "sha512-gGunfS0od3VpwDBpGwVkzSZx6Aqo9uOcf1afJj2cKnKFAoyl16fvhpsUhmUFd4Ldbvl5JvRQed6eQw6oQp6n8w==",
+ "dependencies": {
+ "debug": "~4.1.0",
+ "engine.io": "~3.6.0",
+ "has-binary2": "~1.0.2",
+ "socket.io-adapter": "~1.1.0",
+ "socket.io-client": "2.5.0",
+ "socket.io-parser": "~3.4.0"
+ }
+ },
+ "node_modules/express-status-monitor/node_modules/socket.io-adapter": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz",
+ "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g=="
+ },
+ "node_modules/express-status-monitor/node_modules/socket.io-parser": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.2.tgz",
+ "integrity": "sha512-QFZBaZDNqZXeemwejc7D39jrq2eGK/qZuVDiMPKzZK1hLlNvjGilGt4ckfQZeVX4dGmuPzCytN9ZW1nQlEWjgA==",
+ "dependencies": {
+ "component-emitter": "1.2.1",
+ "debug": "~4.1.0",
+ "isarray": "2.0.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/express-status-monitor/node_modules/ws": {
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
"node_modules/express/node_modules/body-parser": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
@@ -3226,6 +3477,24 @@
"node": ">= 0.4.0"
}
},
+ "node_modules/has-binary2": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
+ "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
+ "dependencies": {
+ "isarray": "2.0.1"
+ }
+ },
+ "node_modules/has-binary2/node_modules/isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ=="
+ },
+ "node_modules/has-cors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+ "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA=="
+ },
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -3472,6 +3741,11 @@
"node": ">=0.8.19"
}
},
+ "node_modules/indexof": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+ "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg=="
+ },
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -4979,6 +5253,12 @@
"node": ">= 6.0.0"
}
},
+ "node_modules/nan": {
+ "version": "2.17.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
+ "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==",
+ "optional": true
+ },
"node_modules/natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
@@ -5374,6 +5654,16 @@
"url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
+ "node_modules/parseqs": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
+ "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w=="
+ },
+ "node_modules/parseuri": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
+ "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow=="
+ },
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -5488,6 +5778,17 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/pidusage": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.18.tgz",
+ "integrity": "sha512-Y/VfKfh3poHjMEINxU+gJTeVOBjiThQeFAmzR7z56HSNiMx+etl+yBhk42nRPciPYt/VZl8DQLVXNC6P5vH11A==",
+ "dependencies": {
+ "safe-buffer": "^5.1.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/pirates": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
@@ -6082,6 +6383,47 @@
}
}
},
+ "node_modules/socket.io-client": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.5.0.tgz",
+ "integrity": "sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==",
+ "dependencies": {
+ "backo2": "1.0.2",
+ "component-bind": "1.0.0",
+ "component-emitter": "~1.3.0",
+ "debug": "~3.1.0",
+ "engine.io-client": "~3.5.0",
+ "has-binary2": "~1.0.2",
+ "indexof": "0.0.1",
+ "parseqs": "0.0.6",
+ "parseuri": "0.0.6",
+ "socket.io-parser": "~3.3.0",
+ "to-array": "0.1.4"
+ }
+ },
+ "node_modules/socket.io-client/node_modules/debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/socket.io-client/node_modules/isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ=="
+ },
+ "node_modules/socket.io-client/node_modules/socket.io-parser": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.3.tgz",
+ "integrity": "sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==",
+ "dependencies": {
+ "component-emitter": "~1.3.0",
+ "debug": "~3.1.0",
+ "isarray": "2.0.1"
+ }
+ },
"node_modules/socket.io-parser": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz",
@@ -6435,6 +6777,11 @@
"integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
"dev": true
},
+ "node_modules/to-array": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+ "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A=="
+ },
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -7044,6 +7391,14 @@
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
"dev": true
},
+ "node_modules/xmlhttprequest-ssl": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz",
+ "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -7093,6 +7448,11 @@
"node": ">=12"
}
},
+ "node_modules/yeast": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+ "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg=="
+ },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
@@ -8219,6 +8579,11 @@
"integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
"dev": true
},
+ "after": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+ "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA=="
+ },
"agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
@@ -8298,6 +8663,11 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
+ "arraybuffer.slice": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
+ "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog=="
+ },
"asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
@@ -8419,6 +8789,11 @@
"babel-preset-current-node-syntax": "^1.0.0"
}
},
+ "backo2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+ "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA=="
+ },
"backoff": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz",
@@ -8433,6 +8808,11 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
+ "base64-arraybuffer": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
+ "integrity": "sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg=="
+ },
"base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -8472,6 +8852,11 @@
"safe-buffer": "^5.1.1"
}
},
+ "blob": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
+ "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig=="
+ },
"bn.js": {
"version": "4.12.0",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
@@ -8747,11 +9132,20 @@
"delayed-stream": "~1.0.0"
}
},
+ "component-bind": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+ "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw=="
+ },
"component-emitter": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
- "dev": true
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+ },
+ "component-inherit": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+ "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA=="
},
"concat-map": {
"version": "0.0.1",
@@ -9086,6 +9480,52 @@
}
}
},
+ "engine.io-client": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.3.tgz",
+ "integrity": "sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw==",
+ "requires": {
+ "component-emitter": "~1.3.0",
+ "component-inherit": "0.0.3",
+ "debug": "~3.1.0",
+ "engine.io-parser": "~2.2.0",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "parseqs": "0.0.6",
+ "parseuri": "0.0.6",
+ "ws": "~7.4.2",
+ "xmlhttprequest-ssl": "~1.6.2",
+ "yeast": "0.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "engine.io-parser": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz",
+ "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==",
+ "requires": {
+ "after": "0.8.2",
+ "arraybuffer.slice": "~0.0.7",
+ "base64-arraybuffer": "0.1.4",
+ "blob": "0.0.5",
+ "has-binary2": "~1.0.2"
+ }
+ },
+ "ws": {
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
+ "requires": {}
+ }
+ }
+ },
"engine.io-parser": {
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz",
@@ -9159,6 +9599,15 @@
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
},
+ "event-loop-stats": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/event-loop-stats/-/event-loop-stats-1.2.0.tgz",
+ "integrity": "sha512-h/leAlXqoEf+D9w1dnFG0srR5vfIq59rLm9PHzcl3/GwFppd+UR46UMuLdp/mvJvuA+MjSd/dNShmuM2/dPFFw==",
+ "optional": true,
+ "requires": {
+ "nan": "^2.14.0"
+ }
+ },
"execa": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
@@ -9317,6 +9766,117 @@
}
}
},
+ "express-status-monitor": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/express-status-monitor/-/express-status-monitor-1.3.4.tgz",
+ "integrity": "sha512-EyqHvgX57ujN4fqfUT+x6Bv2xwRyzQdv3AJvWQxcG+jK4TcF9vhrKVqGcE0T6bhT4rstpvOKRuxHBwC/Q6AXQg==",
+ "requires": {
+ "axios": "0.26.0",
+ "debug": "4.1.1",
+ "event-loop-stats": "1.2.0",
+ "handlebars": "^4.7.7",
+ "on-headers": "1.0.2",
+ "pidusage": "2.0.18",
+ "socket.io": "^2.4.1"
+ },
+ "dependencies": {
+ "axios": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.0.tgz",
+ "integrity": "sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==",
+ "requires": {
+ "follow-redirects": "^1.14.8"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA=="
+ },
+ "cookie": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+ "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
+ },
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "engine.io": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.6.1.tgz",
+ "integrity": "sha512-dfs8EVg/i7QjFsXxn7cCRQ+Wai1G1TlEvHhdYEi80fxn5R1vZ2K661O6v/rezj1FP234SZ14r9CmJke99iYDGg==",
+ "requires": {
+ "accepts": "~1.3.4",
+ "base64id": "2.0.0",
+ "cookie": "~0.4.1",
+ "debug": "~4.1.0",
+ "engine.io-parser": "~2.2.0",
+ "ws": "~7.4.2"
+ }
+ },
+ "engine.io-parser": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz",
+ "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==",
+ "requires": {
+ "after": "0.8.2",
+ "arraybuffer.slice": "~0.0.7",
+ "base64-arraybuffer": "0.1.4",
+ "blob": "0.0.5",
+ "has-binary2": "~1.0.2"
+ }
+ },
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ=="
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "socket.io": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.5.0.tgz",
+ "integrity": "sha512-gGunfS0od3VpwDBpGwVkzSZx6Aqo9uOcf1afJj2cKnKFAoyl16fvhpsUhmUFd4Ldbvl5JvRQed6eQw6oQp6n8w==",
+ "requires": {
+ "debug": "~4.1.0",
+ "engine.io": "~3.6.0",
+ "has-binary2": "~1.0.2",
+ "socket.io-adapter": "~1.1.0",
+ "socket.io-client": "2.5.0",
+ "socket.io-parser": "~3.4.0"
+ }
+ },
+ "socket.io-adapter": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz",
+ "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g=="
+ },
+ "socket.io-parser": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.2.tgz",
+ "integrity": "sha512-QFZBaZDNqZXeemwejc7D39jrq2eGK/qZuVDiMPKzZK1hLlNvjGilGt4ckfQZeVX4dGmuPzCytN9ZW1nQlEWjgA==",
+ "requires": {
+ "component-emitter": "1.2.1",
+ "debug": "~4.1.0",
+ "isarray": "2.0.1"
+ }
+ },
+ "ws": {
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
+ "requires": {}
+ }
+ }
+ },
"extsprintf": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz",
@@ -9544,6 +10104,26 @@
"function-bind": "^1.1.1"
}
},
+ "has-binary2": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
+ "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
+ "requires": {
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ=="
+ }
+ }
+ },
+ "has-cors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+ "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA=="
+ },
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -9709,6 +10289,11 @@
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true
},
+ "indexof": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+ "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg=="
+ },
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -10898,6 +11483,12 @@
"xtend": "^4.0.0"
}
},
+ "nan": {
+ "version": "2.17.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
+ "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==",
+ "optional": true
+ },
"natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
@@ -11200,6 +11791,16 @@
"entities": "^4.4.0"
}
},
+ "parseqs": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
+ "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w=="
+ },
+ "parseuri": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
+ "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow=="
+ },
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -11283,6 +11884,14 @@
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true
},
+ "pidusage": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.18.tgz",
+ "integrity": "sha512-Y/VfKfh3poHjMEINxU+gJTeVOBjiThQeFAmzR7z56HSNiMx+etl+yBhk42nRPciPYt/VZl8DQLVXNC6P5vH11A==",
+ "requires": {
+ "safe-buffer": "^5.1.2"
+ }
+ },
"pirates": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
@@ -11759,6 +12368,49 @@
}
}
},
+ "socket.io-client": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.5.0.tgz",
+ "integrity": "sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==",
+ "requires": {
+ "backo2": "1.0.2",
+ "component-bind": "1.0.0",
+ "component-emitter": "~1.3.0",
+ "debug": "~3.1.0",
+ "engine.io-client": "~3.5.0",
+ "has-binary2": "~1.0.2",
+ "indexof": "0.0.1",
+ "parseqs": "0.0.6",
+ "parseuri": "0.0.6",
+ "socket.io-parser": "~3.3.0",
+ "to-array": "0.1.4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ=="
+ },
+ "socket.io-parser": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.3.tgz",
+ "integrity": "sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==",
+ "requires": {
+ "component-emitter": "~1.3.0",
+ "debug": "~3.1.0",
+ "isarray": "2.0.1"
+ }
+ }
+ }
+ },
"socket.io-parser": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz",
@@ -12009,6 +12661,11 @@
"integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
"dev": true
},
+ "to-array": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+ "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A=="
+ },
"to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -12446,6 +13103,11 @@
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
"dev": true
},
+ "xmlhttprequest-ssl": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz",
+ "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q=="
+ },
"xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -12483,6 +13145,11 @@
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"dev": true
},
+ "yeast": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+ "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg=="
+ },
"yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/package.json b/package.json
index 597b4ceb..437dc27a 100644
--- a/package.json
+++ b/package.json
@@ -24,6 +24,7 @@
"dotenv": "^16.0.3",
"express-paginate": "^1.0.2",
"express-rate-limit": "^6.7.0",
+ "express-status-monitor": "^1.3.4",
"handlebars": "^4.7.7",
"helmet": "^6.1.3",
"jest-fetch-mock": "^3.0.3",
diff --git a/server.js b/server.js
index 5d0f0c2f..875cea59 100644
--- a/server.js
+++ b/server.js
@@ -16,6 +16,7 @@ const paginate = require('express-paginate')
//app initialization
const app = express()
+app.use(require('express-status-monitor')())
// load app middlewares
// The order of the following middleware is very important!!
app.use(bodyParser.json())
diff --git a/src/middlewares/logger.handler.js b/src/middlewares/logger.handler.js
index a778c951..9446e027 100644
--- a/src/middlewares/logger.handler.js
+++ b/src/middlewares/logger.handler.js
@@ -32,7 +32,7 @@ const addLoggerMiddleware = (app) => {
status: tokens.status(req, res),
content_length: tokens.res(req, res, 'content-length'),
response_time: tokens['response-time'](req, res),
- user: req.user.sub,
+ user: req.user === undefined ? 'anonimus' : req.user.sub,
}
logger.info({ ...log })
From 474596053d8f98c75914b47825f550aa118d4e54 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Thu, 27 Apr 2023 01:21:03 -0400
Subject: [PATCH 015/229] integration test passed
---
package-lock.json | 153 +++++++++++-----------
package.json | 4 +-
server.js | 2 +
src/__tests__/integration.test.js | 35 +++++
src/__tests__/ldap_authentication.test.js | 20 ---
src/__tests__/ldap_integration.test.js | 34 -----
src/__tests__/unit.test.js | 101 ++++++++++++++
src/routes/profile.routes.js | 1 -
src/schemas/response.schema.js | 3 +-
src/services/user.services.js | 3 +-
10 files changed, 220 insertions(+), 136 deletions(-)
create mode 100644 src/__tests__/integration.test.js
delete mode 100644 src/__tests__/ldap_authentication.test.js
delete mode 100644 src/__tests__/ldap_integration.test.js
create mode 100644 src/__tests__/unit.test.js
diff --git a/package-lock.json b/package-lock.json
index c1668c2c..214e72c7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -50,7 +50,7 @@
"mongoose": "^6.5.2",
"nodemon": "^2.0.22",
"superagent": "^8.0.0",
- "supertest": "^6.2.4"
+ "supertest": "^6.3.3"
}
},
"node_modules/@ampproject/remapping": {
@@ -1533,7 +1533,7 @@
"node_modules/asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
"dev": true
},
"node_modules/asn1": {
@@ -2288,9 +2288,9 @@
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"node_modules/cookiejar": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz",
- "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==",
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz",
+ "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==",
"dev": true
},
"node_modules/core-util-is": {
@@ -2462,9 +2462,9 @@
}
},
"node_modules/dezalgo": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz",
- "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
+ "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
"dev": true,
"dependencies": {
"asap": "^2.0.0",
@@ -3280,25 +3280,28 @@
}
},
"node_modules/formidable": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz",
- "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz",
+ "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==",
"dev": true,
"dependencies": {
- "dezalgo": "1.0.3",
- "hexoid": "1.0.0",
- "once": "1.4.0",
- "qs": "6.9.3"
+ "dezalgo": "^1.0.4",
+ "hexoid": "^1.0.0",
+ "once": "^1.4.0",
+ "qs": "^6.11.0"
},
"funding": {
"url": "https://ko-fi.com/tunnckoCore/commissions"
}
},
"node_modules/formidable/node_modules/qs": {
- "version": "6.9.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz",
- "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==",
+ "version": "6.11.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz",
+ "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==",
"dev": true,
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
"engines": {
"node": ">=0.6"
},
@@ -6639,22 +6642,21 @@
}
},
"node_modules/superagent": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.0.tgz",
- "integrity": "sha512-iudipXEel+SzlP9y29UBWGDjB+Zzag+eeA1iLosaR2YHBRr1Q1kC29iBrF2zIVD9fqVbpZnXkN/VJmwFMVyNWg==",
+ "version": "8.0.9",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.9.tgz",
+ "integrity": "sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA==",
"dev": true,
"dependencies": {
"component-emitter": "^1.3.0",
- "cookiejar": "^2.1.3",
+ "cookiejar": "^2.1.4",
"debug": "^4.3.4",
"fast-safe-stringify": "^2.1.1",
"form-data": "^4.0.0",
- "formidable": "^2.0.1",
+ "formidable": "^2.1.2",
"methods": "^1.1.2",
"mime": "2.6.0",
- "qs": "^6.10.3",
- "readable-stream": "^3.6.0",
- "semver": "^7.3.7"
+ "qs": "^6.11.0",
+ "semver": "^7.3.8"
},
"engines": {
"node": ">=6.4.0 <13 || >=14"
@@ -6695,28 +6697,29 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
- "node_modules/superagent/node_modules/readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "node_modules/superagent/node_modules/qs": {
+ "version": "6.11.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz",
+ "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==",
"dev": true,
"dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
+ "side-channel": "^1.0.4"
},
"engines": {
- "node": ">= 6"
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/supertest": {
- "version": "6.2.4",
- "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.4.tgz",
- "integrity": "sha512-M8xVnCNv+q2T2WXVzxDECvL2695Uv2uUj2O0utxsld/HRyJvOU8W9f1gvsYxSNU4wmIe0/L/ItnpU4iKq0emDA==",
+ "version": "6.3.3",
+ "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz",
+ "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==",
"dev": true,
"dependencies": {
"methods": "^1.1.2",
- "superagent": "^8.0.0"
+ "superagent": "^8.0.5"
},
"engines": {
"node": ">=6.4.0"
@@ -8671,7 +8674,7 @@
"asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
"dev": true
},
"asn1": {
@@ -9228,9 +9231,9 @@
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"cookiejar": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz",
- "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==",
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz",
+ "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==",
"dev": true
},
"core-util-is": {
@@ -9367,9 +9370,9 @@
"dev": true
},
"dezalgo": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz",
- "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
+ "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
"dev": true,
"requires": {
"asap": "^2.0.0",
@@ -9968,22 +9971,25 @@
}
},
"formidable": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz",
- "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz",
+ "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==",
"dev": true,
"requires": {
- "dezalgo": "1.0.3",
- "hexoid": "1.0.0",
- "once": "1.4.0",
- "qs": "6.9.3"
+ "dezalgo": "^1.0.4",
+ "hexoid": "^1.0.0",
+ "once": "^1.4.0",
+ "qs": "^6.11.0"
},
"dependencies": {
"qs": {
- "version": "6.9.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz",
- "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==",
- "dev": true
+ "version": "6.11.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz",
+ "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==",
+ "dev": true,
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
}
}
},
@@ -12556,22 +12562,21 @@
"dev": true
},
"superagent": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.0.tgz",
- "integrity": "sha512-iudipXEel+SzlP9y29UBWGDjB+Zzag+eeA1iLosaR2YHBRr1Q1kC29iBrF2zIVD9fqVbpZnXkN/VJmwFMVyNWg==",
+ "version": "8.0.9",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.9.tgz",
+ "integrity": "sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA==",
"dev": true,
"requires": {
"component-emitter": "^1.3.0",
- "cookiejar": "^2.1.3",
+ "cookiejar": "^2.1.4",
"debug": "^4.3.4",
"fast-safe-stringify": "^2.1.1",
"form-data": "^4.0.0",
- "formidable": "^2.0.1",
+ "formidable": "^2.1.2",
"methods": "^1.1.2",
"mime": "2.6.0",
- "qs": "^6.10.3",
- "readable-stream": "^3.6.0",
- "semver": "^7.3.7"
+ "qs": "^6.11.0",
+ "semver": "^7.3.8"
},
"dependencies": {
"debug": {
@@ -12595,27 +12600,25 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "qs": {
+ "version": "6.11.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz",
+ "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==",
"dev": true,
"requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
+ "side-channel": "^1.0.4"
}
}
}
},
"supertest": {
- "version": "6.2.4",
- "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.2.4.tgz",
- "integrity": "sha512-M8xVnCNv+q2T2WXVzxDECvL2695Uv2uUj2O0utxsld/HRyJvOU8W9f1gvsYxSNU4wmIe0/L/ItnpU4iKq0emDA==",
+ "version": "6.3.3",
+ "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz",
+ "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==",
"dev": true,
"requires": {
"methods": "^1.1.2",
- "superagent": "^8.0.0"
+ "superagent": "^8.0.5"
}
},
"supports-color": {
diff --git a/package.json b/package.json
index 437dc27a..2ae3086d 100644
--- a/package.json
+++ b/package.json
@@ -57,10 +57,10 @@
"mongoose": "^6.5.2",
"nodemon": "^2.0.22",
"superagent": "^8.0.0",
- "supertest": "^6.2.4"
+ "supertest": "^6.3.3"
},
"scripts": {
- "test": "jest",
+ "test": "jest --forceExit --detectOpenHandles --watchAll --maxWorkers=1",
"test:watch": "jest --watch",
"start": "node server.js",
"dev": "nodemon server.js"
diff --git a/server.js b/server.js
index 875cea59..ecceebf1 100644
--- a/server.js
+++ b/server.js
@@ -49,3 +49,5 @@ app.use(express.static('./src/public'))
let port = CONFIG.server.port || 4000
console.log(`server listen on port ${port}`)
app.listen(port, CONFIG.server.host || '127.0.0.1')
+
+module.exports = app
diff --git a/src/__tests__/integration.test.js b/src/__tests__/integration.test.js
new file mode 100644
index 00000000..cc2fd051
--- /dev/null
+++ b/src/__tests__/integration.test.js
@@ -0,0 +1,35 @@
+const request = require('supertest')
+const app = require('../../server') // your Express app
+const UserServices = require('../services/user.services')
+const mongoose = require('mongoose')
+const User = require('../schemas/user.schema').User
+const config = require('../config/config')
+const ldapClient = require('../connections/LDAP_client')
+
+describe('Prueba de Integración: Verifique que el servidor pueda comunicarse correctamente con la base de datos y el servidor LDAP', () => {
+ it('should correctly communicate with the database and the LDAP server', async () => {
+ // Get all users from the 'users' collection in the 'ldapDB' database
+ const users = await User.find({})
+
+ for (const user of users) {
+ // For each user, check if their 'username' attribute matches a 'uid' in the LDAP server
+ const searchOptions = {
+ filter: `(uid=${user.username})`,
+ scope: 'sub',
+ }
+
+ await new Promise((resolve, reject) => {
+ ldapClient.search(config.ldap.dn, searchOptions, (err, res) => {
+ if (err) return reject(err)
+
+ res.on('searchEntry', (entry) => {
+ const uid = entry.pojo.attributes[0].values[0]
+ expect(uid).toBe(user.username)
+ })
+
+ res.on('end', resolve)
+ })
+ })
+ }
+ })
+})
diff --git a/src/__tests__/ldap_authentication.test.js b/src/__tests__/ldap_authentication.test.js
deleted file mode 100644
index 0ec992b3..00000000
--- a/src/__tests__/ldap_authentication.test.js
+++ /dev/null
@@ -1,20 +0,0 @@
-const axios = require('axios')
-
-const loginUrl = 'http://127.0.0.1:4000/login'
-
-describe('Prueba de autenticación de usuario', () => {
- test('La autenticacion debe funcionar con los usuarios que estan en el LDAP y devolver un JWT', async () => {
- //Peticion correcta
- const loginData = {
- username: 'agonzalezb',
- password: '00092068426',
- }
- const respuesta = await axios.post(loginUrl, loginData) // Realizar una petición POST al endpoint de login
- expect(respuesta.status).toBe(200) // Verificar que la respuesta tenga un estado 200 (OK)
- expect(respuesta.data.data === undefined).toBeFalse // Verificar que la respuesta tenga un cuerpo (no sea nula o vacía)
-
- const token = respuesta.data.data.token
- expect(token === undefined || token === null).toBeFalse
- expect(token.length).toBeGreaterThan(0)
- })
-})
diff --git a/src/__tests__/ldap_integration.test.js b/src/__tests__/ldap_integration.test.js
deleted file mode 100644
index e615655d..00000000
--- a/src/__tests__/ldap_integration.test.js
+++ /dev/null
@@ -1,34 +0,0 @@
-const axios = require('axios')
-
-const loginUrl = 'http://127.0.0.1:4000/login'
-const usersUrl = 'http://127.0.0.1:4000/users/'
-
-
-
-describe('Prueba de integracion con el LDAP', () => {
- test('La integracion con el LDAP debe funcionar y devolver usuarios dentro del servidor', async () => {
- const loginData = {
- username: 'agonzalezb',
- password: '00092068426',
- }
- const respuesta = await axios.post(loginUrl, loginData)
- const token = respuesta.data.data.token
- // Realizar una petición GET al endpoint de "Get User By Username"
- const response = await axios.get(usersUrl + 'agonzalezb', {
- headers: {
- Authorization: 'Bearer ' + token,
- },
- })
- //verificar que el estado de la peticion no sea 401
- expect(response.status).toEqual(200)
- //verificar que la propiedad success sea true
- expect(response.data.success).toEqual(true)
- //verificar que el mensaje de la peticion sea "data fetched succesfully"
- expect(response.data.message).toEqual('data fetched succesfully')
- //verificar que el usuario solicitado sea el correcto
- expect(response.data.data.objectName).toEqual(
- 'uid=agonzalezb,ou=usuarios,ou=informatica,dc=cujae,dc=edu,dc=cu'
- )
- })
-})
-
diff --git a/src/__tests__/unit.test.js b/src/__tests__/unit.test.js
new file mode 100644
index 00000000..e9fa145f
--- /dev/null
+++ b/src/__tests__/unit.test.js
@@ -0,0 +1,101 @@
+const app = require('../../server')
+const supertest = require('supertest')
+const config = require('../config/config')
+
+describe('Pruebas de funcionalidad', () => {
+
+ describe('Caso de uso 1: Verificar que la API pueda autenticar a los usuarios en el directorio LDAP', () => {
+ it('debería autenticar a un usuario con credenciales válidas', async () => {
+ const request = supertest(app)
+ const response = await request.post('/login').send({
+ username: config.ldap.username_bind,
+ password: config.ldap.password_bind,
+ })
+
+ expect(response.status).toBe(200)
+ expect(response.body).toHaveProperty('data')
+ })
+
+ it('no debería autenticar a un usuario con credenciales inválidas', async () => {
+ const request = supertest(app)
+ const response = await request
+ .post('/login')
+ .send({ username: 'invalid-username', password: 'invalid-password' })
+
+ expect(response.status).toBe(401)
+ expect(response.body).toStrictEqual({
+ success: false,
+ message: 'username or password incorrect',
+ })
+ })
+
+ it('no debería autenticar a un usuario sin credenciales', async () => {
+ const request = supertest(app)
+ const response = await request.post('/login').send({})
+
+ expect(response.status).toBe(401)
+ expect(response.body).toStrictEqual({
+ success: false,
+ message: 'username and password must be both provided',
+ })
+ })
+ })
+})
+
+
+ describe('Caso de uso 2: Comprobar que la API pueda realizar búsquedas en el directorio LDAP y devolver resultados precisos', () => {
+ it('debería realizar una búsqueda de todos los estudiantes del grupo 31 y de la facultad de Ing. Informatica', async () => {
+ const request = supertest(app)
+ const { body } = await request.post('/login').send({
+ username: config.ldap.username_bind,
+ password: config.ldap.password_bind,
+ })
+ const { data } = body
+ const { token } = data
+ const response = await request
+ .get('/users/students')
+ .set('Authorization', `Bearer ${token}`)
+ .query({ group: '31', branch: 'informatica' })
+
+ expect(response.status).toBe(200)
+ expect(response.body.message).toEqual('data fetched succesfully')
+ })
+
+ it('debería realizar una búsqueda de todos los profesores que pertenezcan al PCC y su grupo de investigacion sea IA', async () => {
+ const request = supertest(app)
+ const { body } = await request.post('/login').send({
+ username: config.ldap.username_bind,
+ password: config.ldap.password_bind,
+ })
+ const { data } = body
+ const { token } = data
+ const response = await request
+ .get('/users/professors')
+ .set('Authorization', `Bearer ${token}`)
+ .query({ PCC: 'true', researchGroup: 'IA' })
+ expect(response.status).toBe(200)
+ expect(response.body.message).toEqual('data fetched succesfully')
+ })
+
+})
+
+
+ describe('Caso de uso 3: verificar que la API puede proporcionar información de perfil personal del usuario a través de su JWT', () => {
+ it('debe proporcionar información de perfil personal del usuario a través de su JWT', async () => {
+ const request = supertest(app)
+ const { body } = await request.post('/login').send({
+ username: config.ldap.username_bind,
+ password: config.ldap.password_bind,
+ })
+ const { data } = body
+ const { token } = data
+
+ const response = await request
+ .get('/profile')
+ .set('Authorization', `Bearer ${token}`)
+
+ expect(response.status).toBe(200)
+ expect(response.body.message).toEqual('data fetched succesfully')
+ })
+ })
+
diff --git a/src/routes/profile.routes.js b/src/routes/profile.routes.js
index 2e49e352..fa745ea0 100644
--- a/src/routes/profile.routes.js
+++ b/src/routes/profile.routes.js
@@ -16,7 +16,6 @@ router.get('/', checkAuth, checkRoles('user'), validateResponse, (req, res) => {
router.put('/', checkAuth, checkRoles('user'), validateResponse, (req, res) => {
const { email, password, confirmPassword } = req.body
- console.log({ email, password, confirmPassword })
if (!email && !password) {
console.log('entro')
responseError(res, 'fields cannot be empty', null)
diff --git a/src/schemas/response.schema.js b/src/schemas/response.schema.js
index 71326ce1..80d9c9fe 100644
--- a/src/schemas/response.schema.js
+++ b/src/schemas/response.schema.js
@@ -1,10 +1,9 @@
const responseSuccess = (res, message, data) => {
- console.log(data)
data.length > 1
? res.status(200).json({
success: true,
message: message,
- length: data?.results.length ?? data.length,
+ length: data.results !== undefined ? data.results.length : data.length,
data: data,
})
: res.status(200).json({
diff --git a/src/services/user.services.js b/src/services/user.services.js
index 34976fe8..7d194695 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -64,7 +64,7 @@ const UserServices = () => {
var pccValue = PCC
if (PCC !== undefined) {
- pccValue = PCC === true ? 'TRUE' : 'FALSE'
+ pccValue = PCC === "true" ? 'TRUE' : 'FALSE'
}
const basefilter = '(objectClass=iesEducationalStaff)'
const pCCfilter = PCC !== undefined ? `(PCC=${pccValue})` : ''
@@ -157,7 +157,6 @@ const UserServices = () => {
sambaprimarygroupsid: ['S-1-5-21-1255719363-1350762778-3568053751-513'],
sambapwdlastset: [new TextEncoder().encode('1308584948')],
}
- console.log(branch)
return new Promise((resolve, reject) => {
ldapClient.add(dn, entry, (err) => {
if (err) {
From fa43ecf8391cdae897c3b1f96b55549629917a31 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Thu, 8 Jun 2023 22:03:40 -0400
Subject: [PATCH 016/229] authentication working with new ldap
---
package-lock.json | 37 +++++++++++++++++++
package.json | 3 ++
src/__tests__/performance/artillery.yml | 27 ++++++++++++++
src/__tests__/performance/performance.test.js | 0
src/__tests__/shapiro.test.js | 3 ++
src/connections/LDAP_client.js | 2 +-
src/middlewares/session.handler.js | 1 +
src/modules/authentication/LdapAuth.js | 10 +++--
src/routes/user.routes.js | 29 ++++++++++++++-
src/services/tree.services.js | 4 +-
10 files changed, 108 insertions(+), 8 deletions(-)
create mode 100644 src/__tests__/performance/artillery.yml
create mode 100644 src/__tests__/performance/performance.test.js
create mode 100644 src/__tests__/shapiro.test.js
diff --git a/package-lock.json b/package-lock.json
index 214e72c7..c13fdfbe 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,9 +20,11 @@
"express-status-monitor": "^1.3.4",
"handlebars": "^4.7.7",
"helmet": "^6.1.3",
+ "jerzy": "^0.2.1",
"jest-fetch-mock": "^3.0.3",
"joi": "^13.0.2",
"jsonwebtoken": "^9.0.0",
+ "jstat": "^1.9.6",
"LDAP": "^1.2.1",
"ldap-authentication": "^2.3.1",
"ldapjs": "^3.0.1",
@@ -35,6 +37,7 @@
"passport-custom": "^1.1.1",
"passport-jwt": "^4.0.1",
"simple-ldap-search": "^3.1.2",
+ "simple-statistics": "^7.8.3",
"socket.io": "^4.6.1",
"winston": "^3.8.2",
"winston-mongodb": "^5.1.1"
@@ -4012,6 +4015,12 @@
"integrity": "sha512-qybtBUesniQdW6n+QIHMng2vDOHscIC/dEXjW+JzO9+LoAZMb03RCUC5xFOv/btSKPm1xL42fn+RjlU4oB42Lg==",
"dev": true
},
+ "node_modules/jerzy": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/jerzy/-/jerzy-0.2.1.tgz",
+ "integrity": "sha512-NHuYTuLgwwBrGKNORh+mSqnvJUeXe9OX9HLP60CT4iRQPgi+OPKBjThOLvwc5SA4yfjTQ/RpyhPfczfavS+Gsg==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."
+ },
"node_modules/jest": {
"version": "29.5.0",
"resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz",
@@ -4746,6 +4755,11 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
+ "node_modules/jstat": {
+ "version": "1.9.6",
+ "resolved": "https://registry.npmjs.org/jstat/-/jstat-1.9.6.tgz",
+ "integrity": "sha512-rPBkJbK2TnA8pzs93QcDDPlKcrtZWuuCo2dVR0TFLOJSxhqfWOVCSp8aV3/oSbn+4uY4yw1URtLpHQedtmXfug=="
+ },
"node_modules/jwa": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
@@ -6274,6 +6288,14 @@
"node": ">=10.13.0"
}
},
+ "node_modules/simple-statistics": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/simple-statistics/-/simple-statistics-7.8.3.tgz",
+ "integrity": "sha512-JFvMY00t6SBGtwMuJ+nqgsx9ylkMiJ5JlK9bkj8AdvniIe5615wWQYkKHXe84XtSuc40G/tlrPu0A5/NlJvv8A==",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
@@ -10505,6 +10527,11 @@
"integrity": "sha512-qybtBUesniQdW6n+QIHMng2vDOHscIC/dEXjW+JzO9+LoAZMb03RCUC5xFOv/btSKPm1xL42fn+RjlU4oB42Lg==",
"dev": true
},
+ "jerzy": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/jerzy/-/jerzy-0.2.1.tgz",
+ "integrity": "sha512-NHuYTuLgwwBrGKNORh+mSqnvJUeXe9OX9HLP60CT4iRQPgi+OPKBjThOLvwc5SA4yfjTQ/RpyhPfczfavS+Gsg=="
+ },
"jest": {
"version": "29.5.0",
"resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz",
@@ -11072,6 +11099,11 @@
}
}
},
+ "jstat": {
+ "version": "1.9.6",
+ "resolved": "https://registry.npmjs.org/jstat/-/jstat-1.9.6.tgz",
+ "integrity": "sha512-rPBkJbK2TnA8pzs93QcDDPlKcrtZWuuCo2dVR0TFLOJSxhqfWOVCSp8aV3/oSbn+4uY4yw1URtLpHQedtmXfug=="
+ },
"jwa": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
@@ -12271,6 +12303,11 @@
}
}
},
+ "simple-statistics": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/simple-statistics/-/simple-statistics-7.8.3.tgz",
+ "integrity": "sha512-JFvMY00t6SBGtwMuJ+nqgsx9ylkMiJ5JlK9bkj8AdvniIe5615wWQYkKHXe84XtSuc40G/tlrPu0A5/NlJvv8A=="
+ },
"simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
diff --git a/package.json b/package.json
index 2ae3086d..ee5c6cf6 100644
--- a/package.json
+++ b/package.json
@@ -27,9 +27,11 @@
"express-status-monitor": "^1.3.4",
"handlebars": "^4.7.7",
"helmet": "^6.1.3",
+ "jerzy": "^0.2.1",
"jest-fetch-mock": "^3.0.3",
"joi": "^13.0.2",
"jsonwebtoken": "^9.0.0",
+ "jstat": "^1.9.6",
"LDAP": "^1.2.1",
"ldap-authentication": "^2.3.1",
"ldapjs": "^3.0.1",
@@ -42,6 +44,7 @@
"passport-custom": "^1.1.1",
"passport-jwt": "^4.0.1",
"simple-ldap-search": "^3.1.2",
+ "simple-statistics": "^7.8.3",
"socket.io": "^4.6.1",
"winston": "^3.8.2",
"winston-mongodb": "^5.1.1"
diff --git a/src/__tests__/performance/artillery.yml b/src/__tests__/performance/artillery.yml
new file mode 100644
index 00000000..e1c134e3
--- /dev/null
+++ b/src/__tests__/performance/artillery.yml
@@ -0,0 +1,27 @@
+config:
+ target: 'http://127.0.0.1:4000' # URL base de tu API
+ phases:
+ - duration: 60 # Duración de la prueba en segundos
+ arrivalRate: 20 # Número de solicitudes por segundo
+ variables:
+ jwt: '' # Variable para almacenar el JWT capturado en el login
+scenarios:
+ - flow:
+ - post:
+ url: '/login' # Endpoint para iniciar sesión y obtener un JWT
+ json:
+ username: 'agonzalezb'
+ password: '00092068426'
+ capture:
+ json: '$.data.token'
+ as: 'jwt'
+ - get:
+ url: '/users' # Endpoint para obtener información de usuarios utilizando un JWT
+ headers:
+ Authorization: 'Bearer {{ jwt }}'
+ - post:
+ url: '/users/artillery' # Endpoint para crear un nuevo usuario en el directorio LDAP
+ json:
+ username: 'newuser'
+ password: 'password'
+ email: 'newuser@example.com'
\ No newline at end of file
diff --git a/src/__tests__/performance/performance.test.js b/src/__tests__/performance/performance.test.js
new file mode 100644
index 00000000..e69de29b
diff --git a/src/__tests__/shapiro.test.js b/src/__tests__/shapiro.test.js
new file mode 100644
index 00000000..cd784af3
--- /dev/null
+++ b/src/__tests__/shapiro.test.js
@@ -0,0 +1,3 @@
+const jerzy = require('jerzy')
+var v = new jerzy.Vector([1, 2, 3, 4, 20])
+console.log(JSON.stringify(jerzy.Normality.shapiroWilk(v), null, 4))
diff --git a/src/connections/LDAP_client.js b/src/connections/LDAP_client.js
index 64397a19..374115ca 100644
--- a/src/connections/LDAP_client.js
+++ b/src/connections/LDAP_client.js
@@ -9,7 +9,7 @@ const client = ldap.createClient({
})
client.on('connectError', (err) => {
- assert.ifError(err)
+ console.log("ERROR")
})
client.bind(config.ldap.admin.username, config.ldap.admin.password, (err) => {
diff --git a/src/middlewares/session.handler.js b/src/middlewares/session.handler.js
index 58a6ce85..f5d2e4ce 100644
--- a/src/middlewares/session.handler.js
+++ b/src/middlewares/session.handler.js
@@ -13,6 +13,7 @@ const mongoClientPromise = mongoose
authSource: 'admin',
})
.then((m) => m.connection.getClient())
+ .catch((e)=>console.log(e))
const sessionMiddleWare = session({
secret: CONFIG.sessionSecret,
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 594fea94..7305fae4 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -192,12 +192,14 @@ var login = function (req, res, next) {
}
if (!user) {
res.status(401).json({ success: false, message: 'User cannot be found' })
- } else {
+ } else {
const userUID = user.uid
- const userDN = user.member
- const branch = userDN.split(',')[1].replace('ou=', '')
+ const userDN = user.dn
+ const branch = userDN.split(',')[2].replace('ou=', '')
const response = await groupService.getAdminsGroups(branch)
- const isAdmin = response.attributes.memberUid.includes(userUID)
+ console.log("RESPONSE", response)
+ console.log("User", user)
+ const isAdmin = user.right === 'Todos'
const payload = {
sub: user.uid,
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index 52fededc..fcca7bb7 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -7,6 +7,33 @@ const { checkAuth, checkRoles } = require('../middlewares/auth.handler')
const service = UserServices()
const paginateResults = require('../utils/paginateResults')
const newUserSchema = require('../schemas/newUser.schema')
+const mongoose = require('mongoose')
+const Schema = mongoose.Schema
+// test
+const Person = mongoose.model(
+ 'Person',
+ Schema({
+ name: String,
+ email: String,
+ password: String,
+ })
+)
+
+router.post('/artillery', async (req, res) => {
+ const user = req.body
+ const person = Person({
+ name: user.name,
+ email: user.email,
+ password: user.password,
+ })
+
+ await person.save()
+ res.status(200).json({
+ success: true,
+ message: 'user added',
+ data: user,
+ })
+})
//Get all users
router.get(
@@ -32,7 +59,7 @@ router.get(
router.get(
'/students',
checkAuth,
- checkRoles('admin'),
+ checkRoles('admino'),
validateResponse,
(req, res) => {
const branch = req.query.branch || undefined
diff --git a/src/services/tree.services.js b/src/services/tree.services.js
index 64ebf659..970ec244 100644
--- a/src/services/tree.services.js
+++ b/src/services/tree.services.js
@@ -6,8 +6,8 @@ const LDAP = require('ldapjs')
const searchSchema = require('../utils/ldap_search_utils')
ldap.bind(
- 'uid=agonzalezb,ou=usuarios,ou=informatica,dc=cujae,dc=edu,dc=cu',
- '00092068426',
+ config.ldap.admin.username,
+ config.ldap.admin.password,
(err) => {
assert.ifError(err)
}
From 3370ce9bb385f76f9dee72f217c1bd378846786e Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 26 Jun 2023 13:02:01 -0400
Subject: [PATCH 017/229] limit query working fine
---
package-lock.json | 323 +++++++++++++++++++++++++
package.json | 3 +
server.js | 6 +
src/helpers/dnHelper.js | 6 +
src/modules/authentication/LdapAuth.js | 8 +-
src/public/index.html | 1 -
src/routes/profile.routes.js | 1 -
src/routes/user.routes.js | 3 +-
src/utils/ldap_search_utils.js | 14 +-
src/utils/paginateResults.js | 6 +-
10 files changed, 356 insertions(+), 15 deletions(-)
create mode 100644 src/helpers/dnHelper.js
diff --git a/package-lock.json b/package-lock.json
index c13fdfbe..887135d5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,6 +13,8 @@
"axios": "^1.3.5",
"bcryptjs": "^2.4.3",
"body-parser": "^1.20.2",
+ "cluster": "^0.7.7",
+ "compression": "^1.7.4",
"cors": "^2.8.5",
"dotenv": "^16.0.3",
"express-paginate": "^1.0.2",
@@ -33,6 +35,7 @@
"multer": "^1.4.5-lts.1",
"nodemailer": "^6.9.1",
"nodemailer-smtp-transport": "^2.7.4",
+ "os": "^0.1.2",
"passport": "^0.6.0",
"passport-custom": "^1.1.1",
"passport-jwt": "^4.0.1",
@@ -2075,6 +2078,18 @@
"node": ">=12"
}
},
+ "node_modules/cluster": {
+ "version": "0.7.7",
+ "resolved": "https://registry.npmjs.org/cluster/-/cluster-0.7.7.tgz",
+ "integrity": "sha512-16LzEZSoBUgRHSN7NA46ntGnI9tf0NnxTm3KCDvHd6aj4EsBqUbYDN3ImCfjYegBXJZiutULF5rWkcRusMIozQ==",
+ "dependencies": {
+ "log": ">= 1.2.0",
+ "mkdirp": ">= 0.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -2174,6 +2189,42 @@
"resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
"integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA=="
},
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+ "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+ "dependencies": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.16",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2347,6 +2398,20 @@
"node": ">=14"
}
},
+ "node_modules/d": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+ "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
+ "dependencies": {
+ "es5-ext": "^0.10.50",
+ "type": "^1.0.1"
+ }
+ },
+ "node_modules/d/node_modules/type": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
+ },
"node_modules/data-urls": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz",
@@ -2503,6 +2568,15 @@
"node": ">=12"
}
},
+ "node_modules/duration": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz",
+ "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==",
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "~0.10.46"
+ }
+ },
"node_modules/ecdsa-sig-formatter": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
@@ -2709,6 +2783,39 @@
"is-arrayish": "^0.2.1"
}
},
+ "node_modules/es5-ext": {
+ "version": "0.10.62",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz",
+ "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.3",
+ "next-tick": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "node_modules/es6-symbol": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
+ "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
+ "dependencies": {
+ "d": "^1.0.1",
+ "ext": "^1.1.2"
+ }
+ },
"node_modules/escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -2793,6 +2900,15 @@
"node": ">= 0.6"
}
},
+ "node_modules/event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "~0.10.14"
+ }
+ },
"node_modules/event-loop-stats": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/event-loop-stats/-/event-loop-stats-1.2.0.tgz",
@@ -3163,6 +3279,14 @@
}
]
},
+ "node_modules/ext": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
+ "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+ "dependencies": {
+ "type": "^2.7.2"
+ }
+ },
"node_modules/extsprintf": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz",
@@ -4938,6 +5062,20 @@
"resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
"integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA=="
},
+ "node_modules/log": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/log/-/log-6.3.1.tgz",
+ "integrity": "sha512-McG47rJEWOkXTDioZzQNydAVvZNeEkSyLJ1VWkFwfW+o1knW+QSi8D1KjPn/TnctV+q99lkvJNe1f0E1IjfY2A==",
+ "dependencies": {
+ "d": "^1.0.1",
+ "duration": "^0.2.2",
+ "es5-ext": "^0.10.53",
+ "event-emitter": "^0.3.5",
+ "sprintf-kit": "^2.0.1",
+ "type": "^2.5.0",
+ "uni-global": "^1.0.0"
+ }
+ },
"node_modules/logform": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz",
@@ -5295,6 +5433,11 @@
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
},
+ "node_modules/next-tick": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
+ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
+ },
"node_modules/node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
@@ -5590,6 +5733,11 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/os": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz",
+ "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ=="
+ },
"node_modules/p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -6550,6 +6698,14 @@
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true
},
+ "node_modules/sprintf-kit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.1.tgz",
+ "integrity": "sha512-2PNlcs3j5JflQKcg4wpdqpZ+AjhQJ2OZEo34NXDtlB0tIPG84xaaXhpA8XFacFiwjKA4m49UOYG83y3hbMn/gQ==",
+ "dependencies": {
+ "es5-ext": "^0.10.53"
+ }
+ },
"node_modules/stack-trace": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
@@ -6895,6 +7051,11 @@
"resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
"integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
},
+ "node_modules/type": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
+ "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
+ },
"node_modules/type-check": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
@@ -6980,6 +7141,14 @@
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
"integrity": "sha512-cp0oQQyZhUM1kpJDLdGO1jPZHgS/MpzoWYfe9+CM2h/QGDZlqwT2T3YGukuBdaNJ/CAPoeyAZRRHz8JFo176vA=="
},
+ "node_modules/uni-global": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/uni-global/-/uni-global-1.0.0.tgz",
+ "integrity": "sha512-WWM3HP+siTxzIWPNUg7hZ4XO8clKi6NoCAJJWnuRL+BAqyFXF8gC03WNyTefGoUXYc47uYgXxpKLIEvo65PEHw==",
+ "dependencies": {
+ "type": "^2.5.0"
+ }
+ },
"node_modules/universalify": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
@@ -9081,6 +9250,15 @@
"wrap-ansi": "^7.0.0"
}
},
+ "cluster": {
+ "version": "0.7.7",
+ "resolved": "https://registry.npmjs.org/cluster/-/cluster-0.7.7.tgz",
+ "integrity": "sha512-16LzEZSoBUgRHSN7NA46ntGnI9tf0NnxTm3KCDvHd6aj4EsBqUbYDN3ImCfjYegBXJZiutULF5rWkcRusMIozQ==",
+ "requires": {
+ "log": ">= 1.2.0",
+ "mkdirp": ">= 0.0.1"
+ }
+ },
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -9172,6 +9350,35 @@
"resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
"integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA=="
},
+ "compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "requires": {
+ "mime-db": ">= 1.43.0 < 2"
+ }
+ },
+ "compression": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+ "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+ "requires": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.16",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw=="
+ }
+ }
+ },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -9300,6 +9507,22 @@
"rrweb-cssom": "^0.6.0"
}
},
+ "d": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+ "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
+ "requires": {
+ "es5-ext": "^0.10.50",
+ "type": "^1.0.1"
+ },
+ "dependencies": {
+ "type": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
+ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
+ }
+ }
+ },
"data-urls": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz",
@@ -9421,6 +9644,15 @@
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
"integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="
},
+ "duration": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz",
+ "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==",
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.46"
+ }
+ },
"ecdsa-sig-formatter": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
@@ -9571,6 +9803,35 @@
"is-arrayish": "^0.2.1"
}
},
+ "es5-ext": {
+ "version": "0.10.62",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz",
+ "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==",
+ "requires": {
+ "es6-iterator": "^2.0.3",
+ "es6-symbol": "^3.1.3",
+ "next-tick": "^1.1.0"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+ "requires": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "es6-symbol": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
+ "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
+ "requires": {
+ "d": "^1.0.1",
+ "ext": "^1.1.2"
+ }
+ },
"escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -9624,6 +9885,15 @@
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
},
+ "event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+ "requires": {
+ "d": "1",
+ "es5-ext": "~0.10.14"
+ }
+ },
"event-loop-stats": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/event-loop-stats/-/event-loop-stats-1.2.0.tgz",
@@ -9902,6 +10172,14 @@
}
}
},
+ "ext": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
+ "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+ "requires": {
+ "type": "^2.7.2"
+ }
+ },
"extsprintf": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz",
@@ -11259,6 +11537,20 @@
"resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
"integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA=="
},
+ "log": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/log/-/log-6.3.1.tgz",
+ "integrity": "sha512-McG47rJEWOkXTDioZzQNydAVvZNeEkSyLJ1VWkFwfW+o1knW+QSi8D1KjPn/TnctV+q99lkvJNe1f0E1IjfY2A==",
+ "requires": {
+ "d": "^1.0.1",
+ "duration": "^0.2.2",
+ "es5-ext": "^0.10.53",
+ "event-emitter": "^0.3.5",
+ "sprintf-kit": "^2.0.1",
+ "type": "^2.5.0",
+ "uni-global": "^1.0.0"
+ }
+ },
"logform": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz",
@@ -11543,6 +11835,11 @@
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
},
+ "next-tick": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
+ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
+ },
"node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
@@ -11773,6 +12070,11 @@
"word-wrap": "~1.2.3"
}
},
+ "os": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz",
+ "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ=="
+ },
"p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -12518,6 +12820,14 @@
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true
},
+ "sprintf-kit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.1.tgz",
+ "integrity": "sha512-2PNlcs3j5JflQKcg4wpdqpZ+AjhQJ2OZEo34NXDtlB0tIPG84xaaXhpA8XFacFiwjKA4m49UOYG83y3hbMn/gQ==",
+ "requires": {
+ "es5-ext": "^0.10.53"
+ }
+ },
"stack-trace": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
@@ -12776,6 +13086,11 @@
"resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
"integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
},
+ "type": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
+ "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
+ },
"type-check": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
@@ -12837,6 +13152,14 @@
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
"integrity": "sha512-cp0oQQyZhUM1kpJDLdGO1jPZHgS/MpzoWYfe9+CM2h/QGDZlqwT2T3YGukuBdaNJ/CAPoeyAZRRHz8JFo176vA=="
},
+ "uni-global": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/uni-global/-/uni-global-1.0.0.tgz",
+ "integrity": "sha512-WWM3HP+siTxzIWPNUg7hZ4XO8clKi6NoCAJJWnuRL+BAqyFXF8gC03WNyTefGoUXYc47uYgXxpKLIEvo65PEHw==",
+ "requires": {
+ "type": "^2.5.0"
+ }
+ },
"universalify": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
diff --git a/package.json b/package.json
index ee5c6cf6..75482544 100644
--- a/package.json
+++ b/package.json
@@ -20,6 +20,8 @@
"axios": "^1.3.5",
"bcryptjs": "^2.4.3",
"body-parser": "^1.20.2",
+ "cluster": "^0.7.7",
+ "compression": "^1.7.4",
"cors": "^2.8.5",
"dotenv": "^16.0.3",
"express-paginate": "^1.0.2",
@@ -40,6 +42,7 @@
"multer": "^1.4.5-lts.1",
"nodemailer": "^6.9.1",
"nodemailer-smtp-transport": "^2.7.4",
+ "os": "^0.1.2",
"passport": "^0.6.0",
"passport-custom": "^1.1.1",
"passport-jwt": "^4.0.1",
diff --git a/server.js b/server.js
index ecceebf1..31dbb9dc 100644
--- a/server.js
+++ b/server.js
@@ -12,6 +12,7 @@ const cors = require('cors')
const helmet = require('helmet')
const limiter = require('./src/middlewares/rate_limiter.handler.js')
const paginate = require('express-paginate')
+const compression = require('compression')
//app initialization
const app = express()
@@ -23,10 +24,15 @@ app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
app.use(express.json())
+// Middleware para la compresión de respuestas
+app.use(compression())
+
//security middlewares
app.use(cors())
app.use(helmet())
+// Middleware para limitar el numero de solicitudes
app.use(limiter)
+// Middleware para el registro de solicitudes
app.use(sessionMiddleWare)
addLoggerMiddleware(app)
diff --git a/src/helpers/dnHelper.js b/src/helpers/dnHelper.js
new file mode 100644
index 00000000..354f313b
--- /dev/null
+++ b/src/helpers/dnHelper.js
@@ -0,0 +1,6 @@
+const getFacultyFromDN = (dn) => {
+ const branch = dn.toString().split(',')[2].replace('ou=', '')
+ return branch
+}
+
+module.exports = { getFacultyFromDN }
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 7305fae4..36b736e3 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -197,8 +197,6 @@ var login = function (req, res, next) {
const userDN = user.dn
const branch = userDN.split(',')[2].replace('ou=', '')
const response = await groupService.getAdminsGroups(branch)
- console.log("RESPONSE", response)
- console.log("User", user)
const isAdmin = user.right === 'Todos'
const payload = {
@@ -219,8 +217,10 @@ var login = function (req, res, next) {
return next(loginErr)
}
_insertFunc(user).then((user) => {
- var userObj =
- typeof user.toObject === 'function' ? user.toObject() : user
+ var userObj = {
+ user,
+ }
+
const data = {
token: token,
refreshToken: refreshToken,
diff --git a/src/public/index.html b/src/public/index.html
index 783feb01..ef605e27 100644
--- a/src/public/index.html
+++ b/src/public/index.html
@@ -39,7 +39,6 @@
.then((response) => {
if (response.success) {
alert('Login succeed')
- console.log(response.user)
} else {
alert('login failed. Message: ' + response.message)
}
diff --git a/src/routes/profile.routes.js b/src/routes/profile.routes.js
index fa745ea0..0318bbeb 100644
--- a/src/routes/profile.routes.js
+++ b/src/routes/profile.routes.js
@@ -17,7 +17,6 @@ router.get('/', checkAuth, checkRoles('user'), validateResponse, (req, res) => {
router.put('/', checkAuth, checkRoles('user'), validateResponse, (req, res) => {
const { email, password, confirmPassword } = req.body
if (!email && !password) {
- console.log('entro')
responseError(res, 'fields cannot be empty', null)
} else if (password) {
if (password !== confirmPassword) {
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index fcca7bb7..7f51bcb6 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -43,6 +43,7 @@ router.get(
validateResponse,
(req, res) => {
const branch = req.query.branch || undefined
+ console.log('req', req.query)
service
.getAll(branch)
.then((data) =>
@@ -59,7 +60,7 @@ router.get(
router.get(
'/students',
checkAuth,
- checkRoles('admino'),
+ checkRoles('admin'),
validateResponse,
(req, res) => {
const branch = req.query.branch || undefined
diff --git a/src/utils/ldap_search_utils.js b/src/utils/ldap_search_utils.js
index 1a3d837c..e8ed6ac4 100644
--- a/src/utils/ldap_search_utils.js
+++ b/src/utils/ldap_search_utils.js
@@ -25,11 +25,14 @@ const searchSchema = (dn, opt) => {
})
})
res.on('page', (result, cb) => {
- console.log('page finish')
- pageCount = pageCount + 1
- pageCount === opt.pageNum
- ? resolve(pagedEntries.length === 1 ? pagedEntries[0] : pagedEntries)
- : (pagedEntries = [])
+ if (!!opt.pageNum) {
+ pageCount = pageCount + 1
+ pageCount === opt.pageNum
+ ? resolve(
+ pagedEntries.length === 1 ? pagedEntries[0] : pagedEntries
+ )
+ : (pagedEntries = [])
+ }
})
res.on('searchReference', (referral) => {
console.log('referral: ' + referral.uris.join())
@@ -44,5 +47,4 @@ const searchSchema = (dn, opt) => {
})
}
-
module.exports = searchSchema
diff --git a/src/utils/paginateResults.js b/src/utils/paginateResults.js
index 852bc055..4545e523 100644
--- a/src/utils/paginateResults.js
+++ b/src/utils/paginateResults.js
@@ -1,22 +1,24 @@
function paginateResults(array, req) {
const page = parseInt(req.query.page) || 1
const limit = parseInt(req.query.limit) || 10
+ console.log('page', page)
+ console.log('limit', limit)
+
const startIndex = (page - 1) * limit
const endIndex = page * limit
const results = {}
results.results = array.slice(startIndex, endIndex)
+ results.length = results.results.length
if (endIndex < array.length) {
results.next = {
page: page + 1,
- limit: limit,
}
}
if (startIndex > 0) {
results.previous = {
page: page - 1,
- limit: limit,
}
}
return results
From e576b28afc0b695c62a67fbf1f876af1145e07af Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 26 Jun 2023 13:05:42 -0400
Subject: [PATCH 018/229] get by username working ok
---
src/routes/user.routes.js | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index 7f51bcb6..3750388b 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -104,13 +104,9 @@ router.get(
(req, res) => {
service
.getByUsername(req.params.username)
- .then((data) =>
- responseSuccess(
- res,
- 'data fetched succesfully',
- paginateResults(data, req)
- )
- )
+ .then((data) => {
+ responseSuccess(res, 'data fetched succesfully', data)
+ })
.catch((err) => {
responseError(res, err.message, err.errors)
})
From a264ff4037c957e7b958172b8e9c42147ba5396b Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 26 Jun 2023 13:16:20 -0400
Subject: [PATCH 019/229] get users by year working fine
---
src/routes/user.routes.js | 25 +++++++++++++++++++++++++
src/services/user.services.js | 15 +++++++++++++--
2 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index 3750388b..b8c8e4d5 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -112,6 +112,8 @@ router.get(
})
}
)
+
+/* get user by ci */
router.get(
'/ci/:ci',
checkAuth,
@@ -124,6 +126,8 @@ router.get(
.catch((err) => responseError(res, err.message, err.errors))
}
)
+
+/* get user by email */
router.get(
'/email/:email',
checkAuth,
@@ -137,6 +141,27 @@ router.get(
}
)
+/* get users by year */
+router.get(
+ '/year/:year',
+ checkAuth,
+ checkRoles('admin'),
+ validateResponse,
+ (req, res) => {
+ const branch = req.query.branch
+ service
+ .getByYear(req.params.year, branch)
+ .then((data) =>
+ responseSuccess(
+ res,
+ 'data fetched succesfully',
+ paginateResults(data, req)
+ )
+ )
+ .catch((err) => responseError(res, err.message, err.errors))
+ }
+)
+
//Add Users
router.post(
'/',
diff --git a/src/services/user.services.js b/src/services/user.services.js
index 7d194695..0bb3d5d8 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -16,8 +16,18 @@ const UserServices = () => {
attributes: ['uid', 'cn', 'mail', 'ci'],
sizeLimit: config.ldap.sizeLimit,
}
- console.log(opts)
+ return searchSchema(dn, opts)
+ }
+ const getByYear = (year = 1, branch) => {
+ const dn =
+ branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
+ const opts = {
+ filter: `(studentYear=${year})`,
+ scope: 'sub',
+ attributes: ['uid', 'cn', 'mail', 'ci'],
+ sizeLimit: config.ldap.sizeLimit,
+ }
return searchSchema(dn, opts)
}
@@ -64,7 +74,7 @@ const UserServices = () => {
var pccValue = PCC
if (PCC !== undefined) {
- pccValue = PCC === "true" ? 'TRUE' : 'FALSE'
+ pccValue = PCC === 'true' ? 'TRUE' : 'FALSE'
}
const basefilter = '(objectClass=iesEducationalStaff)'
const pCCfilter = PCC !== undefined ? `(PCC=${pccValue})` : ''
@@ -170,6 +180,7 @@ const UserServices = () => {
return {
getAll,
+ getByYear,
getByUsername,
getByUsernameWithNoFormat,
getByCI,
From d258fb8c2e6352b20a4cb2334a3a4dce7dc2a6e4 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 26 Jun 2023 23:06:32 -0400
Subject: [PATCH 020/229] cache middleware added
---
package-lock.json | 139 ++++++++++++++++++++++++++++++----------------
package.json | 2 +
server.js | 4 ++
3 files changed, 97 insertions(+), 48 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 887135d5..34b7ade8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,6 +17,7 @@
"compression": "^1.7.4",
"cors": "^2.8.5",
"dotenv": "^16.0.3",
+ "express-cache-ctrl": "^1.1.0",
"express-paginate": "^1.0.2",
"express-rate-limit": "^6.7.0",
"express-status-monitor": "^1.3.4",
@@ -33,6 +34,7 @@
"lodash": "^4.17.4",
"morgan": "^1.10.0",
"multer": "^1.4.5-lts.1",
+ "node-cache": "^5.1.2",
"nodemailer": "^6.9.1",
"nodemailer-smtp-transport": "^2.7.4",
"os": "^0.1.2",
@@ -1807,20 +1809,6 @@
"npm": "1.2.8000 || >= 1.4.16"
}
},
- "node_modules/body-parser/node_modules/qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
- "dependencies": {
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -2078,6 +2066,14 @@
"node": ">=12"
}
},
+ "node_modules/clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
"node_modules/cluster": {
"version": "0.7.7",
"resolved": "https://registry.npmjs.org/cluster/-/cluster-0.7.7.tgz",
@@ -2971,13 +2967,13 @@
}
},
"node_modules/express": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
- "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
+ "version": "4.18.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
+ "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
- "body-parser": "1.20.0",
+ "body-parser": "1.20.1",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.5.0",
@@ -2996,7 +2992,7 @@
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.7",
- "qs": "6.10.3",
+ "qs": "6.11.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "0.18.0",
@@ -3011,6 +3007,23 @@
"node": ">= 0.10.0"
}
},
+ "node_modules/express-cache-ctrl": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/express-cache-ctrl/-/express-cache-ctrl-1.1.0.tgz",
+ "integrity": "sha512-lCpcHbgvWJPA8FVAOjKVMy6/Hn73etTpZvRfkYfv1m0MID16UObxHYnoObd8k24m7ZU+z/QINm/hv8jINFcYBA==",
+ "dependencies": {
+ "express": "^4.18.2",
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">= 12.0"
+ }
+ },
+ "node_modules/express-cache-ctrl/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
"node_modules/express-paginate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/express-paginate/-/express-paginate-1.0.2.tgz",
@@ -3224,9 +3237,9 @@
}
},
"node_modules/express/node_modules/body-parser": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
- "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
+ "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.4",
@@ -3236,7 +3249,7 @@
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
- "qs": "6.10.3",
+ "qs": "6.11.0",
"raw-body": "2.5.1",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
@@ -5438,6 +5451,17 @@
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
},
+ "node_modules/node-cache": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz",
+ "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==",
+ "dependencies": {
+ "clone": "2.x"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
"node_modules/node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
@@ -6100,9 +6124,9 @@
]
},
"node_modules/qs": {
- "version": "6.10.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
- "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"dependencies": {
"side-channel": "^1.0.4"
},
@@ -9074,16 +9098,6 @@
"raw-body": "2.5.2",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
- },
- "dependencies": {
- "qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
- "requires": {
- "side-channel": "^1.0.4"
- }
- }
}
},
"brace-expansion": {
@@ -9250,6 +9264,11 @@
"wrap-ansi": "^7.0.0"
}
},
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="
+ },
"cluster": {
"version": "0.7.7",
"resolved": "https://registry.npmjs.org/cluster/-/cluster-0.7.7.tgz",
@@ -9940,13 +9959,13 @@
}
},
"express": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
- "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
+ "version": "4.18.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
+ "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
"requires": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
- "body-parser": "1.20.0",
+ "body-parser": "1.20.1",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.5.0",
@@ -9965,7 +9984,7 @@
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.7",
- "qs": "6.10.3",
+ "qs": "6.11.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "0.18.0",
@@ -9978,9 +9997,9 @@
},
"dependencies": {
"body-parser": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
- "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
+ "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
"requires": {
"bytes": "3.1.2",
"content-type": "~1.0.4",
@@ -9990,7 +10009,7 @@
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
- "qs": "6.10.3",
+ "qs": "6.11.0",
"raw-body": "2.5.1",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
@@ -10014,6 +10033,22 @@
}
}
},
+ "express-cache-ctrl": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/express-cache-ctrl/-/express-cache-ctrl-1.1.0.tgz",
+ "integrity": "sha512-lCpcHbgvWJPA8FVAOjKVMy6/Hn73etTpZvRfkYfv1m0MID16UObxHYnoObd8k24m7ZU+z/QINm/hv8jINFcYBA==",
+ "requires": {
+ "express": "^4.18.2",
+ "ms": "^2.1.3"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ }
+ }
+ },
"express-paginate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/express-paginate/-/express-paginate-1.0.2.tgz",
@@ -11840,6 +11875,14 @@
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
},
+ "node-cache": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz",
+ "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==",
+ "requires": {
+ "clone": "2.x"
+ }
+ },
"node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
@@ -12340,9 +12383,9 @@
"dev": true
},
"qs": {
- "version": "6.10.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
- "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"requires": {
"side-channel": "^1.0.4"
}
diff --git a/package.json b/package.json
index 75482544..28bc8fc4 100644
--- a/package.json
+++ b/package.json
@@ -24,6 +24,7 @@
"compression": "^1.7.4",
"cors": "^2.8.5",
"dotenv": "^16.0.3",
+ "express-cache-ctrl": "^1.1.0",
"express-paginate": "^1.0.2",
"express-rate-limit": "^6.7.0",
"express-status-monitor": "^1.3.4",
@@ -40,6 +41,7 @@
"lodash": "^4.17.4",
"morgan": "^1.10.0",
"multer": "^1.4.5-lts.1",
+ "node-cache": "^5.1.2",
"nodemailer": "^6.9.1",
"nodemailer-smtp-transport": "^2.7.4",
"os": "^0.1.2",
diff --git a/server.js b/server.js
index 31dbb9dc..69541d76 100644
--- a/server.js
+++ b/server.js
@@ -13,6 +13,7 @@ const helmet = require('helmet')
const limiter = require('./src/middlewares/rate_limiter.handler.js')
const paginate = require('express-paginate')
const compression = require('compression')
+const cache = require('express-cache-ctrl')
//app initialization
const app = express()
@@ -42,6 +43,9 @@ ldap_initialization(app)
//pagination middleware
app.use(paginate.middleware(100, CONFIG.ldap.sizeLimit))
+// Middleware de caché
+app.use(cache.private(3600)); //
+
//add routes to application
addRoutes(app)
From 864c6b2a20171666fa192f5e7a538cd052e26768 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 2 Aug 2023 18:43:07 -0400
Subject: [PATCH 021/229] add cache middleware
---
server.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server.js b/server.js
index 69541d76..33be2d8c 100644
--- a/server.js
+++ b/server.js
@@ -44,7 +44,7 @@ ldap_initialization(app)
app.use(paginate.middleware(100, CONFIG.ldap.sizeLimit))
// Middleware de caché
-app.use(cache.private(3600)); //
+app.use(cache.private(3600))
//add routes to application
addRoutes(app)
From 0a27bbe9a7eb0dbaed6d7bdc6b2d90189d13fbe7 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 2 Aug 2023 18:43:53 -0400
Subject: [PATCH 022/229] query to filters
---
src/routes/user.routes.js | 6 ++++--
src/services/user.services.js | 8 +++++---
src/utils/getQueryToFilters.js | 27 +++++++++++++++++++++++++++
3 files changed, 36 insertions(+), 5 deletions(-)
create mode 100644 src/utils/getQueryToFilters.js
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index b8c8e4d5..b2bdd40d 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -9,6 +9,8 @@ const paginateResults = require('../utils/paginateResults')
const newUserSchema = require('../schemas/newUser.schema')
const mongoose = require('mongoose')
const Schema = mongoose.Schema
+const getQueryToFilters = require('../utils/getQueryToFilters')
+
// test
const Person = mongoose.model(
'Person',
@@ -43,9 +45,9 @@ router.get(
validateResponse,
(req, res) => {
const branch = req.query.branch || undefined
- console.log('req', req.query)
+ const filter = getQueryToFilters(req)
service
- .getAll(branch)
+ .getAll(branch, filter)
.then((data) =>
responseSuccess(
res,
diff --git a/src/services/user.services.js b/src/services/user.services.js
index 0bb3d5d8..27e91a0e 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -7,14 +7,16 @@ const searchSchemaWithoutFormat = require('../utils/searchSchemaWithNoFormat')
const ldapClient = require('../connections/LDAP_client')
const UserServices = () => {
- const getAll = (branch) => {
+ const getAll = (branch, filter) => {
+ console.log('filter', filter)
const dn =
branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
const opts = {
- filter: '(objectClass=person)',
+ filter: filter,
scope: 'sub',
- attributes: ['uid', 'cn', 'mail', 'ci'],
+ attributes: ['uid', 'cn', 'mail', 'ci', 'sex', 'year'],
sizeLimit: config.ldap.sizeLimit,
+ timeLimit: 50000,
}
return searchSchema(dn, opts)
}
diff --git a/src/utils/getQueryToFilters.js b/src/utils/getQueryToFilters.js
new file mode 100644
index 00000000..b9b6fe0a
--- /dev/null
+++ b/src/utils/getQueryToFilters.js
@@ -0,0 +1,27 @@
+const getQueryToFilters = (req) => {
+ let filters = []
+ const { sex, condition, status, type, year, country, group, UJC, skinColor } =
+ req.query
+ if (sex !== undefined) filters.push(`sex=${sex.toString().toUpperCase()}`)
+ else if (condition !== undefined)
+ filters.push(`userCondition=${condition.toString().capitalize()}`)
+ else if (status !== undefined)
+ filters.push(`userStatus=${status.toString().capitalize()}`)
+ else if (type !== undefined)
+ filters.push(`userType=${type.toString().capitalize()}`)
+ else if (year !== undefined) filters.push(`studentYear=${year.toString()}`)
+ else if (country !== undefined)
+ filters.push(`contry=${country.toString().capitalize()}`)
+ else if (group !== undefined)
+ filters.push(`studentClassGroup=${group.toString()}`)
+ else if (UJC !== undefined) filters.push(`UJC=${UJC}`)
+ else if (skinColor !== undefined)
+ filters.push(`skinColor=${skinColor.toString().capitalize()}`)
+
+ const filter = filters.join(',')
+ return filter === '' || filter === undefined
+ ? '(objectClass=person)'
+ : `(${filter})`
+}
+
+module.exports = getQueryToFilters
From d7e2ad26f49202b3f4b9ef821af65d18fa142115 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 2 Aug 2023 18:51:56 -0400
Subject: [PATCH 023/229] return entire user on login
---
src/modules/authentication/LdapAuth.js | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 36b736e3..8d014619 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -8,6 +8,7 @@ const JwtStrategy = require('../../utils/authentication/strategies/jwtStrategy')
const { authenticate } = require('ldap-authentication')
const UserServices = require('../../services/user.services')
const GroupServices = require('../../services/group.services')
+const User = require('../../schemas/user.schema').User
const { signToken } = require('../../utils/authentication/tokens/token_sign')
const {
@@ -196,9 +197,8 @@ var login = function (req, res, next) {
const userUID = user.uid
const userDN = user.dn
const branch = userDN.split(',')[2].replace('ou=', '')
- const response = await groupService.getAdminsGroups(branch)
+ /* const response = await groupService.getAdminsGroups(branch) */
const isAdmin = user.right === 'Todos'
-
const payload = {
sub: user.uid,
dn: user.dn,
@@ -209,6 +209,7 @@ var login = function (req, res, next) {
ci: user.CI,
roles: isAdmin ? ['admin', 'user'] : ['user'],
}
+ const userObj = { ...user }
const token = signToken(payload, { expiresIn: '45 minutes' })
const refreshToken = signToken(payload, { expiresIn: '1 day' })
@@ -217,10 +218,6 @@ var login = function (req, res, next) {
return next(loginErr)
}
_insertFunc(user).then((user) => {
- var userObj = {
- user,
- }
-
const data = {
token: token,
refreshToken: refreshToken,
From 78e4f82e136747d459d26d9aaa2ad0b2113e8ecb Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Thu, 3 Aug 2023 19:55:44 -0400
Subject: [PATCH 024/229] showing user uid on log middleware
---
src/middlewares/logger.handler.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/middlewares/logger.handler.js b/src/middlewares/logger.handler.js
index 9446e027..f0ec43be 100644
--- a/src/middlewares/logger.handler.js
+++ b/src/middlewares/logger.handler.js
@@ -32,7 +32,7 @@ const addLoggerMiddleware = (app) => {
status: tokens.status(req, res),
content_length: tokens.res(req, res, 'content-length'),
response_time: tokens['response-time'](req, res),
- user: req.user === undefined ? 'anonimus' : req.user.sub,
+ user: req.user === undefined ? 'anonimus' : req.user.uid,
}
logger.info({ ...log })
From 516042915b88c86bfc0c1cbd00b885ec84ee09a4 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Thu, 3 Aug 2023 21:07:52 -0400
Subject: [PATCH 025/229] add filtering logs endpoints
---
src/routes/logs.routes.js | 31 ++++++++++++++++++++++++++++
src/routes/routes.js | 2 ++
src/schemas/logs.schema.js | 28 ++++++++++++++++++++++++++
src/services/logs.services.js | 38 +++++++++++++++++++++++++++++++++++
4 files changed, 99 insertions(+)
create mode 100644 src/routes/logs.routes.js
create mode 100644 src/schemas/logs.schema.js
create mode 100644 src/services/logs.services.js
diff --git a/src/routes/logs.routes.js b/src/routes/logs.routes.js
new file mode 100644
index 00000000..447a7f8c
--- /dev/null
+++ b/src/routes/logs.routes.js
@@ -0,0 +1,31 @@
+const express = require('express')
+const LogService = require('../services/logs.services')
+const router = express.Router()
+const { responseSuccess, responseError } = require('../schemas/response.schema')
+const validateResponse = require('../middlewares/validateResponse')
+const { checkAuth, checkRoles } = require('../middlewares/auth.handler')
+
+// Controller function to get logs filtered by method, url, status, and user
+router.get(
+ '/',
+ checkAuth,
+ checkRoles('user'),
+ validateResponse,
+ async (req, res) => {
+ try {
+ const filters = {
+ method: req.query.method,
+ url: req.query.url,
+ status: req.query.status,
+ user: req.query.user,
+ }
+ const logs = await LogService.filterLogs(filters)
+ res.json(logs)
+ } catch (error) {
+ console.error('Error fetching filtered logs:', error)
+ res.status(500).json({ error: 'Internal Server Error' })
+ }
+ }
+)
+
+module.exports = router
diff --git a/src/routes/routes.js b/src/routes/routes.js
index 7770e2e3..5f37134e 100644
--- a/src/routes/routes.js
+++ b/src/routes/routes.js
@@ -3,6 +3,7 @@ const TreeRoutes = require('./tree.routes')
const UserRoutes = require('./user.routes')
const GroupRoutes = require('./group.routes')
const ProfileRoutes = require('./profile.routes')
+const LogsRoutes = require('./logs.routes')
const addRoutes = (app) => {
app.use('/', AuthRoutes)
@@ -10,6 +11,7 @@ const addRoutes = (app) => {
app.use('/users', UserRoutes)
app.use('/groups', GroupRoutes)
app.use('/profile', ProfileRoutes)
+ app.use('/logs', LogsRoutes)
}
module.exports = addRoutes
diff --git a/src/schemas/logs.schema.js b/src/schemas/logs.schema.js
new file mode 100644
index 00000000..a14cf9a2
--- /dev/null
+++ b/src/schemas/logs.schema.js
@@ -0,0 +1,28 @@
+const mongoose = require('mongoose')
+
+const logSchema = new mongoose.Schema(
+ {
+ timestamp: {
+ type: Date,
+ required: true,
+ },
+ level: {
+ type: String,
+ required: true,
+ },
+ message: {
+ type: String,
+ required: true,
+ },
+ meta: {
+ type: mongoose.Schema.Types.Mixed,
+ },
+ },
+ {
+ versionKey: false,
+ }
+)
+
+const Log = mongoose.model('Log', logSchema)
+
+module.exports = Log
diff --git a/src/services/logs.services.js b/src/services/logs.services.js
new file mode 100644
index 00000000..ee37c8c1
--- /dev/null
+++ b/src/services/logs.services.js
@@ -0,0 +1,38 @@
+const Log = require('../schemas/logs.schema')
+
+const createLog = async (logData) => {
+ return await Log.create(logData)
+}
+
+const getAllLogs = async () => {
+ return await Log.find()
+}
+
+const filterLogs = async (query) => {
+ // Construir un objeto de filtro basado en el query recibido
+ const filter = {}
+ if (query.method) filter.message = new RegExp(`method: '${query.method}'`)
+ if (query.url) filter.message = new RegExp(`url: '${query.url}'`)
+ if (query.status) filter.message = new RegExp(`status: '${query.status}'`)
+ if (query.user) filter.message = new RegExp(`user: '${query.user}'`)
+
+ // Realizar la búsqueda de logs con el filtro
+ const logs = await Log.find(filter)
+
+ // Si deseas filtrar múltiples campos a la vez (por ejemplo, method y url), puedes usar el operador $and
+ // const logs = await Log.find({
+ // $and: [
+ // { message: new RegExp(`method: '${query.method}'`) },
+ // { message: new RegExp(`url: '${query.url}'`) }
+ // ]
+ // });
+
+ // Devolver los logs filtrados
+ return logs
+}
+
+module.exports = {
+ createLog,
+ getAllLogs,
+ filterLogs,
+}
From 00dedd07498785e5fccc7910586be7c83bee4f6c Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Thu, 3 Aug 2023 21:10:57 -0400
Subject: [PATCH 026/229] add uid to jwt payload
---
src/modules/authentication/LdapAuth.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 8d014619..55148eb8 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -202,6 +202,7 @@ var login = function (req, res, next) {
const payload = {
sub: user.uid,
dn: user.dn,
+ uid: user.uid,
firstname: user.givenName,
lastname: user.sn,
fullname: user.cn,
From a9dd13d15db01228d278a776c2eb8504c19d7e61 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 21 Aug 2023 10:52:32 -0400
Subject: [PATCH 027/229] protect database connection in case of error
---
src/middlewares/logger.handler.js | 60 ++++++++++++++++++-------------
1 file changed, 35 insertions(+), 25 deletions(-)
diff --git a/src/middlewares/logger.handler.js b/src/middlewares/logger.handler.js
index f0ec43be..7b8831bb 100644
--- a/src/middlewares/logger.handler.js
+++ b/src/middlewares/logger.handler.js
@@ -20,32 +20,42 @@ const logger = winston.createLogger({
],
})
+morgan.token('user', (req) => {
+ return req.user ? req.user.uid : 'anonymous'
+})
+
+const logFormat = (tokens, req, res) => {
+ const log = {
+ method: tokens.method(req, res),
+ url: tokens.url(req, res),
+ status: tokens.status(req, res),
+ content_length: tokens.res(req, res, 'content-length'),
+ response_time: tokens['response-time'](req, res),
+ user: req.user === undefined ? 'anonymous' : req.user.uid,
+ }
+
+ logger.info({ ...log })
+
+ return [
+ `method:${log.method}`,
+ `url:${log.url}`,
+ `status:${log.status}`,
+ `content-length:${log.content_length}`,
+ `response-time:${log.response_time}ms`,
+ `user_uid:${log.user}`,
+ ].join(' ')
+}
+
const addLoggerMiddleware = (app) => {
- morgan.token('user', (req) => {
- return req.user ? req.user.uid : 'anonymous'
- })
- app.use(
- morgan(function (tokens, req, res) {
- const log = {
- method: tokens.method(req, res),
- url: tokens.url(req, res),
- status: tokens.status(req, res),
- content_length: tokens.res(req, res, 'content-length'),
- response_time: tokens['response-time'](req, res),
- user: req.user === undefined ? 'anonimus' : req.user.uid,
- }
- logger.info({ ...log })
-
- return [
- `method:${log.method}`,
- `url:${log.url}`,
- `status:${log.status}`,
- `content-lenght:${log.content_length}`,
- `response-time:${log.response_time}ms`,
- `user_uid:${log.user}`,
- ].join(' ')
- })
- )
+ try {
+ // Attempt to establish the database connection and configure logger
+ winston.add(logger.transports[0])
+
+ // Register the morgan middleware
+ app.use(morgan(logFormat))
+ } catch (error) {
+ console.error('Error connecting to the database:', error.message)
+ }
}
module.exports = addLoggerMiddleware
From 63e476253f4be947664fc0a88e8aa2414cda4933 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 21 Aug 2023 11:03:26 -0400
Subject: [PATCH 028/229] Validate ldap connection error
---
src/connections/LDAP_client.js | 41 ++++++++++++++++++++++++----------
1 file changed, 29 insertions(+), 12 deletions(-)
diff --git a/src/connections/LDAP_client.js b/src/connections/LDAP_client.js
index 374115ca..e612a036 100644
--- a/src/connections/LDAP_client.js
+++ b/src/connections/LDAP_client.js
@@ -2,18 +2,35 @@ const ldap = require('ldapjs')
const config = require('../config/config')
var assert = require('assert')
-const client = ldap.createClient({
- url: [`${config.ldap.url}:${config.ldap.port}`],
- connectTimeout: 60000,
- reconnect: true,
-})
+const initializeLDAPConnection = () => {
+ try {
+ const client = ldap.createClient({
+ url: [`${config.ldap.url}:${config.ldap.port}`],
+ connectTimeout: 60000,
+ reconnect: true,
+ })
-client.on('connectError', (err) => {
- console.log("ERROR")
-})
+ client.on('connectError', (err) => {
+ console.log('LDAP Connection Error:', err.message)
+ })
-client.bind(config.ldap.admin.username, config.ldap.admin.password, (err) => {
- assert.ifError(err)
-})
+ client.bind(
+ config.ldap.admin.username,
+ config.ldap.admin.password,
+ (err) => {
+ if (err) {
+ console.error('LDAP Bind Error:', err.message)
+ } else {
+ console.log('LDAP Connection Successful')
+ }
+ }
+ )
-module.exports = client
+ return client
+ } catch (error) {
+ console.error('Error initializing LDAP connection:', error.message)
+ return null // Return null or a default client if the connection setup fails
+ }
+}
+
+module.exports = initializeLDAPConnection
From 2f09ca2f3767740debe396f275cc1c85fbffe589 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 21 Aug 2023 13:29:45 -0400
Subject: [PATCH 029/229] Go back on ldap connection
---
src/connections/LDAP_client.js | 41 ++++++++++------------------------
1 file changed, 12 insertions(+), 29 deletions(-)
diff --git a/src/connections/LDAP_client.js b/src/connections/LDAP_client.js
index e612a036..374115ca 100644
--- a/src/connections/LDAP_client.js
+++ b/src/connections/LDAP_client.js
@@ -2,35 +2,18 @@ const ldap = require('ldapjs')
const config = require('../config/config')
var assert = require('assert')
-const initializeLDAPConnection = () => {
- try {
- const client = ldap.createClient({
- url: [`${config.ldap.url}:${config.ldap.port}`],
- connectTimeout: 60000,
- reconnect: true,
- })
+const client = ldap.createClient({
+ url: [`${config.ldap.url}:${config.ldap.port}`],
+ connectTimeout: 60000,
+ reconnect: true,
+})
- client.on('connectError', (err) => {
- console.log('LDAP Connection Error:', err.message)
- })
+client.on('connectError', (err) => {
+ console.log("ERROR")
+})
- client.bind(
- config.ldap.admin.username,
- config.ldap.admin.password,
- (err) => {
- if (err) {
- console.error('LDAP Bind Error:', err.message)
- } else {
- console.log('LDAP Connection Successful')
- }
- }
- )
+client.bind(config.ldap.admin.username, config.ldap.admin.password, (err) => {
+ assert.ifError(err)
+})
- return client
- } catch (error) {
- console.error('Error initializing LDAP connection:', error.message)
- return null // Return null or a default client if the connection setup fails
- }
-}
-
-module.exports = initializeLDAPConnection
+module.exports = client
From aaf491b40c37b9b713bd6106f397ab15646f7cd1 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 21 Aug 2023 13:30:19 -0400
Subject: [PATCH 030/229] Retrieve last time logged from DB on login
---
src/modules/authentication/LdapAuth.js | 7 +++++
src/services/profile.services.js | 41 ++++++++++++++++++++++++++
2 files changed, 48 insertions(+)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 55148eb8..be9f9d9b 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -9,6 +9,7 @@ const { authenticate } = require('ldap-authentication')
const UserServices = require('../../services/user.services')
const GroupServices = require('../../services/group.services')
const User = require('../../schemas/user.schema').User
+const ProfileServices = require('../../services/profile.services')
const { signToken } = require('../../utils/authentication/tokens/token_sign')
const {
@@ -19,6 +20,7 @@ const validateResponse = require('../../middlewares/validateResponse')
const userService = UserServices()
const groupService = GroupServices()
+const profileService = ProfileServices()
var _backwardCompatible = false
var _dn
@@ -199,6 +201,9 @@ var login = function (req, res, next) {
const branch = userDN.split(',')[2].replace('ou=', '')
/* const response = await groupService.getAdminsGroups(branch) */
const isAdmin = user.right === 'Todos'
+ const last_time_logged = await profileService.getLastLoginByUsername(
+ user.uid
+ )
const payload = {
sub: user.uid,
dn: user.dn,
@@ -209,6 +214,7 @@ var login = function (req, res, next) {
email: user.mail,
ci: user.CI,
roles: isAdmin ? ['admin', 'user'] : ['user'],
+ last_time_logged,
}
const userObj = { ...user }
const token = signToken(payload, { expiresIn: '45 minutes' })
@@ -224,6 +230,7 @@ var login = function (req, res, next) {
refreshToken: refreshToken,
user: userObj,
}
+ profileService.updateLastTimeLogged(user.uid)
return responseSuccess(res, 'authentication succeeded', data)
})
})
diff --git a/src/services/profile.services.js b/src/services/profile.services.js
index 47e38db4..e0621240 100644
--- a/src/services/profile.services.js
+++ b/src/services/profile.services.js
@@ -5,6 +5,7 @@ const UserServices = require('./user.services')
const service = UserServices()
const { verifyToken } = require('../utils/authentication/tokens/token_verify')
const ldap = require('ldapjs')
+const { User } = require('../schemas/user.schema')
const ProfileServices = () => {
const getProfile = (req) => {
@@ -43,9 +44,49 @@ const ProfileServices = () => {
}
}
+ async function getLastLoginByUsername(username) {
+ try {
+ const user = await User.findOne({ username })
+ .sort({ updatedAt: -1 })
+ .exec()
+
+ if (!user) {
+ return 'User not found'
+ }
+
+ return user.updatedAt
+ } catch (error) {
+ console.error('Error fetching last login:', error)
+ return null
+ }
+ }
+
+ async function updateLastTimeLogged(username) {
+ try {
+ const currentDate = new Date()
+
+ const updatedUser = await User.findOneAndUpdate(
+ { username },
+ { updatedAt: currentDate },
+ { new: true } // Return the updated document
+ ).exec()
+
+ if (!updatedUser) {
+ return 'User not found'
+ }
+ const lastLoginDate = updatedUser.updatedAt.toLocaleString()
+ return lastLoginDate
+ } catch (error) {
+ console.error('Error updating last login:', error)
+ return null
+ }
+ }
+
return {
getProfile,
updateProfile,
+ getLastLoginByUsername,
+ updateLastTimeLogged,
}
}
From 8db50d9606271a67bcc6a1aac0fbd9dd174a9901 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 21 Aug 2023 15:04:46 -0400
Subject: [PATCH 031/229] add registry and deserialization
---
src/modules/authentication/LdapAuth.js | 116 ++++++++++++++-----------
src/schemas/user.schema.js | 38 +++++---
src/services/profile.services.js | 15 +++-
3 files changed, 107 insertions(+), 62 deletions(-)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index be9f9d9b..005b91a0 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -144,16 +144,19 @@ var init = function (
}
})
- passport.deserializeUser((id, done) => {
- _findFunc(id).then((user) => {
+ passport.deserializeUser(async (id, done) => {
+ try {
+ const user = await User.findOne({
+ username: id,
+ })
if (!user) {
- done(
- new Error(`Deserialize user failed. ${id} is deleted from local DB`)
- )
- } else {
- done(null, user)
+ // User does not exist
+ return done(null, user)
}
- })
+ return done(null, user)
+ } catch (error) {
+ return done(error)
+ }
})
router.use(passport.initialize())
@@ -188,54 +191,67 @@ var initialize = function (
* on successful authenticate, or {success: false} on failed authenticate
*/
var login = function (req, res, next) {
- passport.authenticate('ldap', async (err, user) => {
- if (err) {
- res.status(401).json({ success: false, message: err.message })
- return
- }
- if (!user) {
- res.status(401).json({ success: false, message: 'User cannot be found' })
- } else {
- const userUID = user.uid
- const userDN = user.dn
- const branch = userDN.split(',')[2].replace('ou=', '')
- /* const response = await groupService.getAdminsGroups(branch) */
- const isAdmin = user.right === 'Todos'
- const last_time_logged = await profileService.getLastLoginByUsername(
- user.uid
- )
- const payload = {
- sub: user.uid,
- dn: user.dn,
- uid: user.uid,
- firstname: user.givenName,
- lastname: user.sn,
- fullname: user.cn,
- email: user.mail,
- ci: user.CI,
- roles: isAdmin ? ['admin', 'user'] : ['user'],
- last_time_logged,
+ passport.authenticate(
+ 'ldap',
+ {
+ successRedirect: '/dashboard',
+ failureRedirect: '/login',
+ failureFlash: true,
+ },
+ async (err, user) => {
+ if (err) {
+ res.status(401).json({ success: false, message: err.message })
+ return
}
- const userObj = { ...user }
- const token = signToken(payload, { expiresIn: '45 minutes' })
- const refreshToken = signToken(payload, { expiresIn: '1 day' })
+ if (!user) {
+ res
+ .status(401)
+ .json({ success: false, message: 'User cannot be found' })
+ } else {
+ const userUID = user.uid
+ const userDN = user.dn
+ const branch = userDN.split(',')[2].replace('ou=', '')
+ /* const response = await groupService.getAdminsGroups(branch) */
+ const isAdmin = user.right === 'Todos'
+ const last_time_logged = await profileService.getLastLoginByUsername(
+ user.uid
+ )
+ const loginInfo = await profileService.updateLastTimeLogged(user.uid)
+ console.log('loginInfo', loginInfo)
- req.login(user, (loginErr) => {
- if (loginErr) {
- return next(loginErr)
+ const payload = {
+ sub: user.uid,
+ dn: user.dn,
+ uid: user.uid,
+ firstname: user.givenName,
+ lastname: user.sn,
+ fullname: user.cn,
+ email: user.mail,
+ ci: user.CI,
+ roles: isAdmin ? ['admin', 'user'] : ['user'],
+ last_time_logged,
}
- _insertFunc(user).then((user) => {
- const data = {
- token: token,
- refreshToken: refreshToken,
- user: userObj,
+
+ const userObj = { ...user }
+ const token = signToken(payload, { expiresIn: '45 minutes' })
+ const refreshToken = signToken(payload, { expiresIn: '1 day' })
+
+ req.login(user, (loginErr) => {
+ if (loginErr) {
+ return next(loginErr)
}
- profileService.updateLastTimeLogged(user.uid)
- return responseSuccess(res, 'authentication succeeded', data)
+ _insertFunc(user).then((user) => {
+ const data = {
+ token: token,
+ refreshToken: refreshToken,
+ user: userObj,
+ }
+ return responseSuccess(res, 'authentication succeeded', data)
+ })
})
- })
+ }
}
- })(req, res, next)
+ )(req, res, next)
}
module.exports.init = init
diff --git a/src/schemas/user.schema.js b/src/schemas/user.schema.js
index 53b77444..2639182b 100644
--- a/src/schemas/user.schema.js
+++ b/src/schemas/user.schema.js
@@ -1,19 +1,35 @@
-let mongoose = require('mongoose')
+const mongoose = require('mongoose')
-///////////////////
-let userSchema = mongoose.Schema(
+const loginRecordSchema = new mongoose.Schema(
{
- // these fields are from ldap
+ timestamp: { type: Date, required: true },
+ },
+ {
+ _id: false, // Disable automatic generation of _id for subdocuments
+ }
+)
+
+const userSchema = new mongoose.Schema(
+ {
+ // Fields from LDAP
username: { type: String, lowercase: true },
- cn: { type: String},
- sn: { type: String},
- dn: {type: String},
- mail: { type: String, lowercase: true}
+ cn: { type: String },
+ sn: { type: String },
+ dn: { type: String },
+ mail: { type: String, lowercase: true },
+
+ // Array of login records
+ registry: [
+ {
+ timestamp: { type: Date, required: true },
+ },
+ ],
},
{
- timestamps: true
+ timestamps: true,
}
)
-let User = mongoose.model('User', userSchema)
-module.exports.User = User
\ No newline at end of file
+const User = mongoose.model('User', userSchema)
+
+module.exports.User = User
diff --git a/src/services/profile.services.js b/src/services/profile.services.js
index e0621240..bc1a7351 100644
--- a/src/services/profile.services.js
+++ b/src/services/profile.services.js
@@ -67,13 +67,26 @@ const ProfileServices = () => {
const updatedUser = await User.findOneAndUpdate(
{ username },
- { updatedAt: currentDate },
+ {
+ updatedAt: currentDate,
+ $push: {
+ registry: {
+ timestamp: currentDate,
+ },
+ }, // Add new login record
+ },
{ new: true } // Return the updated document
).exec()
if (!updatedUser) {
return 'User not found'
}
+
+ // Ensure that loginRecords is an array (initialize if needed)
+ if (!Array.isArray(updatedUser.loginRecords)) {
+ updatedUser.loginRecords = []
+ }
+
const lastLoginDate = updatedUser.updatedAt.toLocaleString()
return lastLoginDate
} catch (error) {
From 9dea5da469c95647410d121a72cd1f4bd6fdf429 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 21 Aug 2023 20:06:18 -0400
Subject: [PATCH 032/229] Send login Info by jwt
---
src/modules/authentication/LdapAuth.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 005b91a0..d3541b4c 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -217,7 +217,6 @@ var login = function (req, res, next) {
user.uid
)
const loginInfo = await profileService.updateLastTimeLogged(user.uid)
- console.log('loginInfo', loginInfo)
const payload = {
sub: user.uid,
@@ -230,6 +229,7 @@ var login = function (req, res, next) {
ci: user.CI,
roles: isAdmin ? ['admin', 'user'] : ['user'],
last_time_logged,
+ loginInfo,
}
const userObj = { ...user }
From 1ebb9d26484231d08892ad639803334c507ef479 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Tue, 29 Aug 2023 15:22:52 -0400
Subject: [PATCH 033/229] add dnHelpers and pass groups, base and uid by jwt
---
src/helpers/dnHelper.js | 31 +++++++++++++++++++++++++-
src/modules/authentication/LdapAuth.js | 13 +++++++++++
2 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/src/helpers/dnHelper.js b/src/helpers/dnHelper.js
index 354f313b..e5aae28f 100644
--- a/src/helpers/dnHelper.js
+++ b/src/helpers/dnHelper.js
@@ -3,4 +3,33 @@ const getFacultyFromDN = (dn) => {
return branch
}
-module.exports = { getFacultyFromDN }
+// Function to extract uid from an LDAP DN
+function extractUidFromDn(dn) {
+ const uidMatches = dn.match(/uid=([^,]+)/)
+ return uidMatches ? uidMatches[1] : null
+}
+
+// Function to extract groups from an LDAP DN
+function extractGroupsFromDn(dn) {
+ const groupMatches = dn.match(/ou=([^,]+)/g)
+ if (groupMatches) {
+ return groupMatches.map((group) => group.replace('ou=', ''))
+ }
+ return []
+}
+
+// Function to extract the base from an LDAP DN
+function extractBaseFromDn(dn) {
+ const baseMatches = dn.match(/dc=[^,]+/g)
+ if (baseMatches) {
+ return baseMatches.join(',')
+ }
+ return ''
+}
+
+module.exports = {
+ extractBaseFromDn,
+ extractUidFromDn,
+ extractGroupsFromDn,
+ getFacultyFromDN,
+}
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index d3541b4c..a538f641 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -11,6 +11,13 @@ const GroupServices = require('../../services/group.services')
const User = require('../../schemas/user.schema').User
const ProfileServices = require('../../services/profile.services')
+/* helpers */
+const {
+ extractBaseFromDn,
+ extractGroupsFromDn,
+ extractUidFromDn,
+} = require('../../helpers/dnHelper')
+
const { signToken } = require('../../utils/authentication/tokens/token_sign')
const {
responseSuccess,
@@ -217,11 +224,17 @@ var login = function (req, res, next) {
user.uid
)
const loginInfo = await profileService.updateLastTimeLogged(user.uid)
+ // Example usage
+ const ldapDn = user.dn
+ const groups = extractGroupsFromDn(ldapDn)
+ const base = extractBaseFromDn(ldapDn)
const payload = {
sub: user.uid,
dn: user.dn,
uid: user.uid,
+ groups: groups,
+ base: base,
firstname: user.givenName,
lastname: user.sn,
fullname: user.cn,
From 3c36f542382d35922b1d4369a7b4e21e24b5bf09 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Tue, 29 Aug 2023 17:31:49 -0400
Subject: [PATCH 034/229] add src require alias
---
server.js => index.js | 1 +
package-lock.json | 392 +++++++++++++++++++++++++++++-------------
package.json | 11 +-
3 files changed, 278 insertions(+), 126 deletions(-)
rename server.js => index.js (98%)
diff --git a/server.js b/index.js
similarity index 98%
rename from server.js
rename to index.js
index 33be2d8c..18703278 100644
--- a/server.js
+++ b/index.js
@@ -1,5 +1,6 @@
/* jshint node:true */
/* global require */
+require('module-alias/register')
const CONFIG = require('./src/config/config.js')
const bodyParser = require('body-parser')
const express = require('express')
diff --git a/package-lock.json b/package-lock.json
index 34b7ade8..d2b9fe40 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -55,6 +55,7 @@
"jest": "^29.5.0",
"jsdom": "^21.1.1",
"jsdom-global": "^3.0.2",
+ "module-alias": "^2.2.3",
"mongoose": "^6.5.2",
"nodemon": "^2.0.22",
"superagent": "^8.0.0",
@@ -75,17 +76,89 @@
}
},
"node_modules/@babel/code-frame": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
- "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "version": "7.22.13",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
+ "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
"dev": true,
"dependencies": {
- "@babel/highlight": "^7.18.6"
+ "@babel/highlight": "^7.22.13",
+ "chalk": "^2.4.2"
},
"engines": {
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/code-frame/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/@babel/code-frame/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/@babel/compat-data": {
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz",
@@ -164,12 +237,12 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.21.3",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz",
- "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==",
+ "version": "7.22.10",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz",
+ "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.21.3",
+ "@babel/types": "^7.22.10",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
@@ -236,34 +309,34 @@
"dev": true
},
"node_modules/@babel/helper-environment-visitor": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
- "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz",
+ "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-function-name": {
- "version": "7.21.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
- "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz",
+ "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==",
"dev": true,
"dependencies": {
- "@babel/template": "^7.20.7",
- "@babel/types": "^7.21.0"
+ "@babel/template": "^7.22.5",
+ "@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-hoist-variables": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
- "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.18.6"
+ "@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
@@ -322,30 +395,30 @@
}
},
"node_modules/@babel/helper-split-export-declaration": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
- "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.18.6"
+ "@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
- "version": "7.19.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
- "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+ "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
- "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
+ "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
"dev": true,
"engines": {
"node": ">=6.9.0"
@@ -375,13 +448,13 @@
}
},
"node_modules/@babel/highlight": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
- "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "version": "7.22.13",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz",
+ "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==",
"dev": true,
"dependencies": {
- "@babel/helper-validator-identifier": "^7.18.6",
- "chalk": "^2.0.0",
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "chalk": "^2.4.2",
"js-tokens": "^4.0.0"
},
"engines": {
@@ -460,9 +533,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.21.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz",
- "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==",
+ "version": "7.22.13",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.13.tgz",
+ "integrity": "sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@@ -649,33 +722,33 @@
}
},
"node_modules/@babel/template": {
- "version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
- "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz",
+ "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==",
"dev": true,
"dependencies": {
- "@babel/code-frame": "^7.18.6",
- "@babel/parser": "^7.20.7",
- "@babel/types": "^7.20.7"
+ "@babel/code-frame": "^7.22.5",
+ "@babel/parser": "^7.22.5",
+ "@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.21.3",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz",
- "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.21.3",
- "@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-function-name": "^7.21.0",
- "@babel/helper-hoist-variables": "^7.18.6",
- "@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/parser": "^7.21.3",
- "@babel/types": "^7.21.3",
+ "version": "7.22.11",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz",
+ "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.22.10",
+ "@babel/generator": "^7.22.10",
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-function-name": "^7.22.5",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.22.11",
+ "@babel/types": "^7.22.11",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
@@ -707,13 +780,13 @@
"dev": true
},
"node_modules/@babel/types": {
- "version": "7.21.3",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz",
- "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==",
+ "version": "7.22.11",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz",
+ "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==",
"dev": true,
"dependencies": {
- "@babel/helper-string-parser": "^7.19.4",
- "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/helper-string-parser": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.5",
"to-fast-properties": "^2.0.0"
},
"engines": {
@@ -5273,6 +5346,12 @@
"mkdirp": "bin/cmd.js"
}
},
+ "node_modules/module-alias": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.3.tgz",
+ "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==",
+ "dev": true
+ },
"node_modules/mongodb": {
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.8.1.tgz",
@@ -7696,12 +7775,71 @@
}
},
"@babel/code-frame": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
- "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "version": "7.22.13",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
+ "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
"dev": true,
"requires": {
- "@babel/highlight": "^7.18.6"
+ "@babel/highlight": "^7.22.13",
+ "chalk": "^2.4.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
}
},
"@babel/compat-data": {
@@ -7763,12 +7901,12 @@
}
},
"@babel/generator": {
- "version": "7.21.3",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz",
- "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==",
+ "version": "7.22.10",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz",
+ "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==",
"dev": true,
"requires": {
- "@babel/types": "^7.21.3",
+ "@babel/types": "^7.22.10",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
@@ -7824,28 +7962,28 @@
}
},
"@babel/helper-environment-visitor": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
- "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz",
+ "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==",
"dev": true
},
"@babel/helper-function-name": {
- "version": "7.21.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
- "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz",
+ "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==",
"dev": true,
"requires": {
- "@babel/template": "^7.20.7",
- "@babel/types": "^7.21.0"
+ "@babel/template": "^7.22.5",
+ "@babel/types": "^7.22.5"
}
},
"@babel/helper-hoist-variables": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
- "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
"dev": true,
"requires": {
- "@babel/types": "^7.18.6"
+ "@babel/types": "^7.22.5"
}
},
"@babel/helper-module-imports": {
@@ -7889,24 +8027,24 @@
}
},
"@babel/helper-split-export-declaration": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
- "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
"dev": true,
"requires": {
- "@babel/types": "^7.18.6"
+ "@babel/types": "^7.22.5"
}
},
"@babel/helper-string-parser": {
- "version": "7.19.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
- "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+ "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
"dev": true
},
"@babel/helper-validator-identifier": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
- "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
+ "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
"dev": true
},
"@babel/helper-validator-option": {
@@ -7927,13 +8065,13 @@
}
},
"@babel/highlight": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
- "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "version": "7.22.13",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz",
+ "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.18.6",
- "chalk": "^2.0.0",
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "chalk": "^2.4.2",
"js-tokens": "^4.0.0"
},
"dependencies": {
@@ -7996,9 +8134,9 @@
}
},
"@babel/parser": {
- "version": "7.21.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz",
- "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==",
+ "version": "7.22.13",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.13.tgz",
+ "integrity": "sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw==",
"dev": true
},
"@babel/plugin-syntax-async-generators": {
@@ -8128,30 +8266,30 @@
}
},
"@babel/template": {
- "version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
- "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz",
+ "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.18.6",
- "@babel/parser": "^7.20.7",
- "@babel/types": "^7.20.7"
+ "@babel/code-frame": "^7.22.5",
+ "@babel/parser": "^7.22.5",
+ "@babel/types": "^7.22.5"
}
},
"@babel/traverse": {
- "version": "7.21.3",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz",
- "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.21.3",
- "@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-function-name": "^7.21.0",
- "@babel/helper-hoist-variables": "^7.18.6",
- "@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/parser": "^7.21.3",
- "@babel/types": "^7.21.3",
+ "version": "7.22.11",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz",
+ "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.22.10",
+ "@babel/generator": "^7.22.10",
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-function-name": "^7.22.5",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.22.11",
+ "@babel/types": "^7.22.11",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
@@ -8174,13 +8312,13 @@
}
},
"@babel/types": {
- "version": "7.21.3",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz",
- "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==",
+ "version": "7.22.11",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz",
+ "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==",
"dev": true,
"requires": {
- "@babel/helper-string-parser": "^7.19.4",
- "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/helper-string-parser": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.5",
"to-fast-properties": "^2.0.0"
}
},
@@ -11729,6 +11867,12 @@
"minimist": "^1.2.6"
}
},
+ "module-alias": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.3.tgz",
+ "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==",
+ "dev": true
+ },
"mongodb": {
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.8.1.tgz",
diff --git a/package.json b/package.json
index 28bc8fc4..6da63b5a 100644
--- a/package.json
+++ b/package.json
@@ -62,6 +62,7 @@
"jest": "^29.5.0",
"jsdom": "^21.1.1",
"jsdom-global": "^3.0.2",
+ "module-alias": "^2.2.3",
"mongoose": "^6.5.2",
"nodemon": "^2.0.22",
"superagent": "^8.0.0",
@@ -70,7 +71,13 @@
"scripts": {
"test": "jest --forceExit --detectOpenHandles --watchAll --maxWorkers=1",
"test:watch": "jest --watch",
- "start": "node server.js",
- "dev": "nodemon server.js"
+ "start": "node index.js",
+ "dev": "nodemon index.js"
+ },
+ "_moduleAliases": {
+ "@root" : ".",
+ "@deep" : "src/some/very/deep/directory/or/file",
+ "@src" : "src",
+ "something" : "src/foo"
}
}
From 8114d34d65c49d2fed186b002664b8cf1869bb6e Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Tue, 29 Aug 2023 18:44:11 -0400
Subject: [PATCH 035/229] filter users by group
---
jsconfig.json | 9 ++
src/helpers/ldapUtils.js | 73 +++++++++
src/routes/user.routes.js | 273 ++++++++++++----------------------
src/services/user.services.js | 143 ++----------------
4 files changed, 191 insertions(+), 307 deletions(-)
create mode 100644 jsconfig.json
create mode 100644 src/helpers/ldapUtils.js
diff --git a/jsconfig.json b/jsconfig.json
new file mode 100644
index 00000000..acb5b353
--- /dev/null
+++ b/jsconfig.json
@@ -0,0 +1,9 @@
+{
+ "compilerOptions": {
+ "baseUrl": "./",
+ "paths": {
+ "@src/*": ["src/*"]
+ }
+ }
+ }
+
\ No newline at end of file
diff --git a/src/helpers/ldapUtils.js b/src/helpers/ldapUtils.js
new file mode 100644
index 00000000..d616a215
--- /dev/null
+++ b/src/helpers/ldapUtils.js
@@ -0,0 +1,73 @@
+const ldapClient = require('@src/connections/LDAP_client')
+const config = require('@src/config/config')
+
+// Bind to the LDAP server using appropriate credentials
+const bindLdapClient = () => {
+ return new Promise((resolve, reject) => {
+ ldapClient.bind(
+ config.ldap.admin.username,
+ config.ldap.admin.password,
+ (err) => {
+ if (err) {
+ reject(err)
+ } else {
+ resolve()
+ }
+ }
+ )
+ })
+}
+
+// Unbind the LDAP client to release resources
+const unbindLdapClient = () => {
+ ldapClient.unbind()
+}
+
+const getObject = (arr) => {
+ const newObj = {}
+ arr.forEach((obj) => {
+ newObj[obj.type] = obj.values.length === 1 ? obj.values[0] : obj.values
+ })
+ return newObj
+}
+
+const transform = (entry) => {
+ const data = getObject(entry.pojo.attributes)
+
+ return data
+}
+
+// Perform a search using the provided filter and return the results
+const performLdapSearch = async (baseDn, filter, attributes) => {
+ await bindLdapClient() // Bind before search
+
+ const searchOptions = {
+ filter: filter,
+ scope: 'sub',
+ attributes,
+ }
+
+ return new Promise((resolve, reject) => {
+ const searchResults = []
+
+ ldapClient.search(baseDn, searchOptions, (err, searchResponse) => {
+ if (err) {
+ reject(err)
+ return
+ }
+
+ searchResponse.on('searchEntry', (entry) => {
+ searchResults.push(transform(entry))
+ })
+
+ searchResponse.on('end', () => {
+ resolve(searchResults)
+ })
+ })
+ })
+}
+
+module.exports = {
+ performLdapSearch,
+ unbindLdapClient,
+}
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index b2bdd40d..4bf1e284 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -1,191 +1,116 @@
const express = require('express')
const router = express.Router()
-const UserServices = require('../services/user.services')
-const { responseSuccess, responseError } = require('../schemas/response.schema')
-const validateResponse = require('../middlewares/validateResponse')
-const { checkAuth, checkRoles } = require('../middlewares/auth.handler')
+const UserServices = require('@src/services/user.services.js')
+const {
+ responseSuccess,
+ responseError,
+} = require('@src/schemas/response.schema')
+const validateResponse = require('@src/middlewares/validateResponse')
+const { checkAuth, checkRoles } = require('@src/middlewares/auth.handler')
const service = UserServices()
-const paginateResults = require('../utils/paginateResults')
-const newUserSchema = require('../schemas/newUser.schema')
+const paginateResults = require('@src/utils/paginateResults')
const mongoose = require('mongoose')
const Schema = mongoose.Schema
-const getQueryToFilters = require('../utils/getQueryToFilters')
+const getQueryToFilters = require('@src/utils/getQueryToFilters')
+const { performLdapSearch } = require('@src/helpers/ldapUtils')
+const config = require('@src/config/config')
-// test
-const Person = mongoose.model(
- 'Person',
- Schema({
- name: String,
- email: String,
- password: String,
- })
-)
+// Middleware for routes requiring checkAuth and checkRoles('admin')
+router.use(checkAuth, checkRoles('admin'))
-router.post('/artillery', async (req, res) => {
- const user = req.body
- const person = Person({
- name: user.name,
- email: user.email,
- password: user.password,
- })
+// Middleware to handle common success and error responses
+router.use(validateResponse)
- await person.save()
- res.status(200).json({
- success: true,
- message: 'user added',
- data: user,
- })
+// Route handler for getting all users
+router.get('/', (req, res) => {
+ const branch = req.query.branch || undefined
+ const filter = getQueryToFilters(req)
+ service
+ .getAll(branch, filter)
+ .then((data) =>
+ responseSuccess(
+ res,
+ 'data fetched successfully',
+ paginateResults(data, req)
+ )
+ )
+ .catch((err) => responseError(res, err.message, err.errors))
})
-//Get all users
-router.get(
- '/',
- checkAuth,
- checkRoles('admin'),
- validateResponse,
- (req, res) => {
- const branch = req.query.branch || undefined
- const filter = getQueryToFilters(req)
- service
- .getAll(branch, filter)
- .then((data) =>
- responseSuccess(
- res,
- 'data fetched succesfully',
- paginateResults(data, req)
- )
- )
- .catch((err) => responseError(res, err.message, err.errors))
- }
-)
-//Get students
-router.get(
- '/students',
- checkAuth,
- checkRoles('admin'),
- validateResponse,
- (req, res) => {
- const branch = req.query.branch || undefined
- const group = req.query.group || undefined
- const year = req.query.year || undefined
- service
- .getStudents(branch, group, year)
- .then((data) =>
- responseSuccess(
- res,
- 'data fetched succesfully',
- paginateResults(data, req)
- )
- )
- .catch((err) => responseError(res, err.message, err.errors))
- }
-)
-//Get professors
-router.get(
- '/professors',
- checkAuth,
- checkRoles('admin'),
- validateResponse,
- (req, res) => {
- const page = req.query.page || undefined
- const branch = req.query.branch || undefined
- const orgRole = req.query.orgRole || undefined
- const PCC = req.query.PCC || undefined
- const researchGroup = req.query.researchGroup || undefined
- service
- .getProfessors(page, branch, orgRole, PCC, researchGroup)
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
- }
-)
-router.get(
- '/:username',
- checkAuth,
- checkRoles('admin'),
- validateResponse,
- (req, res) => {
- service
- .getByUsername(req.params.username)
- .then((data) => {
- responseSuccess(res, 'data fetched succesfully', data)
- })
- .catch((err) => {
- responseError(res, err.message, err.errors)
- })
- }
-)
+// Get users by groups
+router.get('/group/:group', async (req, res) => {
+ try {
+ const baseDN = `ou=usuarios,ou=${req.params.group},${config.ldap.base}`
+ const filter = 'objectClass=person'
-/* get user by ci */
-router.get(
- '/ci/:ci',
- checkAuth,
- checkRoles('admin'),
- validateResponse,
- (req, res) => {
- service
- .getByCI(req.params.ci)
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
- }
-)
+ // Define the LDAP attributes you want to retrieve
+ const attributes = [
+ 'uid',
+ 'cn',
+ 'sn',
+ 'givenName',
+ 'mail',
+ 'telephoneNumber',
+ ]
-/* get user by email */
-router.get(
- '/email/:email',
- checkAuth,
- checkRoles('admin'),
- validateResponse,
- (req, res) => {
- service
- .getByEmail(req.params.email)
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
+ // Call the performLdapSearch function to retrieve users matching the group filters
+ const searchResults = await service.handleFilteredSearch(
+ baseDN,
+ filter,
+ attributes
+ )
+ // Send the search results
+ res.json({
+ success: true,
+ length: searchResults.length,
+ data: searchResults,
+ })
+ } catch (error) {
+ res.status(500).json({
+ success: false,
+ message: 'Error fetching users',
+ error: error.message,
+ })
}
-)
+})
-/* get users by year */
-router.get(
- '/year/:year',
- checkAuth,
- checkRoles('admin'),
- validateResponse,
- (req, res) => {
- const branch = req.query.branch
- service
- .getByYear(req.params.year, branch)
- .then((data) =>
- responseSuccess(
- res,
- 'data fetched succesfully',
- paginateResults(data, req)
- )
- )
- .catch((err) => responseError(res, err.message, err.errors))
- }
-)
+// Route handler for getting user by username
+router.get('/:username', (req, res) => {
+ service
+ .getByUsername(req.params.username)
+ .then((data) => responseSuccess(res, 'data fetched successfully', data))
+ .catch((err) => responseError(res, err.message, err.errors))
+})
-//Add Users
-router.post(
- '/',
- checkAuth,
- checkRoles('admin'),
- validateResponse,
- (req, res) => {
- const user = req.body
- const branch = req.query.branch || undefined
- if (!branch) {
- responseError(res, 'branch is required')
- }
- newUserSchema
- .validate(user)
- .then(() => {
- service
- .addNewUser(user, branch)
- .then((data) => responseSuccess(res, 'user added succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
- })
- .catch((err) => responseError(res, err.message, err.errors))
- }
-)
+// Route handler for getting user by CI
+router.get('/ci/:ci', (req, res) => {
+ service
+ .getByCI(req.params.ci)
+ .then((data) => responseSuccess(res, 'data fetched successfully', data))
+ .catch((err) => responseError(res, err.message, err.errors))
+})
+
+// Route handler for getting user by email
+router.get('/email/:email', (req, res) => {
+ service
+ .getByEmail(req.params.email)
+ .then((data) => responseSuccess(res, 'data fetched successfully', data))
+ .catch((err) => responseError(res, err.message, err.errors))
+})
+
+// Route handler for getting users by year
+router.get('/year/:year', (req, res) => {
+ const branch = req.query.branch
+ service
+ .getByYear(req.params.year, branch)
+ .then((data) =>
+ responseSuccess(
+ res,
+ 'data fetched successfully',
+ paginateResults(data, req)
+ )
+ )
+ .catch((err) => responseError(res, err.message, err.errors))
+})
module.exports = router
diff --git a/src/services/user.services.js b/src/services/user.services.js
index 27e91a0e..0eacd6c9 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -1,14 +1,13 @@
-const boom = require('@hapi/boom')
require('dotenv').config({ path: __dirname + '/../../.env' })
-const config = require('../config/config')
+const config = require('@src/config/config')
const assert = require('assert')
-const searchSchema = require('../utils/ldap_search_utils')
-const searchSchemaWithoutFormat = require('../utils/searchSchemaWithNoFormat')
-const ldapClient = require('../connections/LDAP_client')
+const searchSchema = require('@src/utils/ldap_search_utils')
+const searchSchemaWithoutFormat = require('@src/utils/searchSchemaWithNoFormat')
+const ldapClient = require('@src/connections/LDAP_client')
+const { performLdapSearch } = require('@src/helpers/ldapUtils')
const UserServices = () => {
const getAll = (branch, filter) => {
- console.log('filter', filter)
const dn =
branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
const opts = {
@@ -21,89 +20,9 @@ const UserServices = () => {
return searchSchema(dn, opts)
}
- const getByYear = (year = 1, branch) => {
- const dn =
- branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
- const opts = {
- filter: `(studentYear=${year})`,
- scope: 'sub',
- attributes: ['uid', 'cn', 'mail', 'ci'],
- sizeLimit: config.ldap.sizeLimit,
- }
- return searchSchema(dn, opts)
- }
-
- const getStudents = (branch, group, year) => {
- const getfilter = () => {
- let filter = ''
- if (group !== undefined) {
- filter = `(studentClassGroup=${parseInt(group)})`
- } else if (year !== undefined) {
- filter = `(studentClassGroup=${year}*)`
- } else {
- filter = `(objectClass=iesStudent)`
- }
- return filter
- }
- const dn =
- branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
- const opts = {
- filter: getfilter(),
- scope: 'sub',
- attributes: [
- 'uid',
- 'cn',
- 'mail',
- 'ci',
- 'studentClassGroup',
- 'displayName',
- ],
- sizeLimit: config.ldap.sizeLimit,
- }
- return searchSchema(dn, opts)
- }
-
- const getProfessors = (
- page,
- branch,
- orgRole = undefined,
- PCC = undefined,
- researchGroup = undefined
- ) => {
- const dn =
- branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
-
- var pccValue = PCC
-
- if (PCC !== undefined) {
- pccValue = PCC === 'true' ? 'TRUE' : 'FALSE'
- }
- const basefilter = '(objectClass=iesEducationalStaff)'
- const pCCfilter = PCC !== undefined ? `(PCC=${pccValue})` : ''
- const roleFilter = orgRole !== undefined ? `(orgRole=${orgRole})` : ''
- const researchGroupFilter =
- researchGroup !== undefined ? `(researchGroup=${researchGroup})` : ''
-
- const filters = `(&${basefilter}${pCCfilter}${roleFilter}${researchGroupFilter})`
-
- const opts = {
- filter: filters,
- scope: 'sub',
- attributes: [
- 'uid',
- 'cn',
- 'mail',
- 'ci',
- 'displayName',
- 'orgRole',
- 'PCC',
- 'researchGroup',
- ],
- paged: page === undefined ? false : true,
- pageNum: page === undefined ? undefined : parseInt(page),
- sizeLimit: page === undefined ? 500 : undefined,
- }
- return searchSchema(dn, opts)
+ const handleFilteredSearch = (baseDN = config.ldap.base, ldapFilter, att) => {
+ const attributes = att === undefined ? ['dn', 'uid', 'cn'] : att
+ return performLdapSearch(baseDN, ldapFilter, attributes)
}
const getByUsername = (username) => {
@@ -140,56 +59,14 @@ const UserServices = () => {
return searchSchema(config.ldap.dn, opts)
}
- const addNewUser = (user, branch) => {
- const dn = `uid=${user.uid},ou=usuarios,ou=${branch},${config.ldap.dn}`
-
- const entry = {
- ...user,
- objectclass: [
- 'top',
- 'person',
- 'posixAccount',
- 'iesServices',
- 'sambaSamAccount',
- 'radiusprofile',
- 'CourierMailAlias',
- ],
- homeDirectory: `/home/${user.uid}`,
- gidNumber: [1000],
- sambaSID: ['S-1-5-21-1255719363-1350762778-3568053751-513'],
- sambaLMPassword: [new TextEncoder().encode('sambaLMPassword')],
- sambaNTPassword: [new TextEncoder().encode('sambaNTPassword')],
- loginShell: [new TextEncoder().encode('/bin/nosh')],
- sambaacctflags: [new TextEncoder().encode('[U ]')],
- sambapasswordhistory: [
- new TextEncoder().encode(
- '000000000000000000000000000000000000000000000000000000 0000000000'
- ),
- ],
- sambaprimarygroupsid: ['S-1-5-21-1255719363-1350762778-3568053751-513'],
- sambapwdlastset: [new TextEncoder().encode('1308584948')],
- }
- return new Promise((resolve, reject) => {
- ldapClient.add(dn, entry, (err) => {
- if (err) {
- console.log('ERROR', err)
- reject(boom.badImplementation(err))
- }
- resolve({ message: 'User added successfully' })
- })
- })
- }
-
return {
getAll,
- getByYear,
+
getByUsername,
getByUsernameWithNoFormat,
getByCI,
getByEmail,
- getStudents,
- getProfessors,
- addNewUser,
+ handleFilteredSearch,
}
}
From d19063cfdf2523eea3079d2bf5368247c11584a6 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Tue, 29 Aug 2023 18:48:03 -0400
Subject: [PATCH 036/229] fix imports on test
---
src/__tests__/integration.test.js | 2 +-
src/__tests__/unit.test.js | 39 ++++++++++++++-----------------
2 files changed, 18 insertions(+), 23 deletions(-)
diff --git a/src/__tests__/integration.test.js b/src/__tests__/integration.test.js
index cc2fd051..58464b77 100644
--- a/src/__tests__/integration.test.js
+++ b/src/__tests__/integration.test.js
@@ -1,5 +1,5 @@
const request = require('supertest')
-const app = require('../../server') // your Express app
+const app = require('../../index') // your Express app
const UserServices = require('../services/user.services')
const mongoose = require('mongoose')
const User = require('../schemas/user.schema').User
diff --git a/src/__tests__/unit.test.js b/src/__tests__/unit.test.js
index e9fa145f..39cf8037 100644
--- a/src/__tests__/unit.test.js
+++ b/src/__tests__/unit.test.js
@@ -1,9 +1,8 @@
-const app = require('../../server')
+const app = require('../../index')
const supertest = require('supertest')
const config = require('../config/config')
describe('Pruebas de funcionalidad', () => {
-
describe('Caso de uso 1: Verificar que la API pueda autenticar a los usuarios en el directorio LDAP', () => {
it('debería autenticar a un usuario con credenciales válidas', async () => {
const request = supertest(app)
@@ -42,8 +41,7 @@ describe('Pruebas de funcionalidad', () => {
})
})
-
- describe('Caso de uso 2: Comprobar que la API pueda realizar búsquedas en el directorio LDAP y devolver resultados precisos', () => {
+describe('Caso de uso 2: Comprobar que la API pueda realizar búsquedas en el directorio LDAP y devolver resultados precisos', () => {
it('debería realizar una búsqueda de todos los estudiantes del grupo 31 y de la facultad de Ing. Informatica', async () => {
const request = supertest(app)
const { body } = await request.post('/login').send({
@@ -76,26 +74,23 @@ describe('Pruebas de funcionalidad', () => {
expect(response.status).toBe(200)
expect(response.body.message).toEqual('data fetched succesfully')
})
-
})
+describe('Caso de uso 3: verificar que la API puede proporcionar información de perfil personal del usuario a través de su JWT', () => {
+ it('debe proporcionar información de perfil personal del usuario a través de su JWT', async () => {
+ const request = supertest(app)
+ const { body } = await request.post('/login').send({
+ username: config.ldap.username_bind,
+ password: config.ldap.password_bind,
+ })
+ const { data } = body
+ const { token } = data
- describe('Caso de uso 3: verificar que la API puede proporcionar información de perfil personal del usuario a través de su JWT', () => {
- it('debe proporcionar información de perfil personal del usuario a través de su JWT', async () => {
- const request = supertest(app)
- const { body } = await request.post('/login').send({
- username: config.ldap.username_bind,
- password: config.ldap.password_bind,
- })
- const { data } = body
- const { token } = data
-
- const response = await request
- .get('/profile')
- .set('Authorization', `Bearer ${token}`)
+ const response = await request
+ .get('/profile')
+ .set('Authorization', `Bearer ${token}`)
- expect(response.status).toBe(200)
- expect(response.body.message).toEqual('data fetched succesfully')
- })
+ expect(response.status).toBe(200)
+ expect(response.body.message).toEqual('data fetched succesfully')
})
-
+})
From 6986a0cdca31f8bf4601ccb2a7411ea20bc1667b Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Tue, 29 Aug 2023 20:10:34 -0400
Subject: [PATCH 037/229] apply pagination on user service
---
src/routes/user.routes.js | 6 +++++-
src/services/user.services.js | 12 ++++++++++--
2 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index 4bf1e284..e3554a18 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -14,6 +14,7 @@ const Schema = mongoose.Schema
const getQueryToFilters = require('@src/utils/getQueryToFilters')
const { performLdapSearch } = require('@src/helpers/ldapUtils')
const config = require('@src/config/config')
+const paginate = require('express-paginate')
// Middleware for routes requiring checkAuth and checkRoles('admin')
router.use(checkAuth, checkRoles('admin'))
@@ -57,13 +58,16 @@ router.get('/group/:group', async (req, res) => {
const searchResults = await service.handleFilteredSearch(
baseDN,
filter,
- attributes
+ attributes,
+ req.query.page,
+ req.query.limit
)
// Send the search results
res.json({
success: true,
length: searchResults.length,
data: searchResults,
+
})
} catch (error) {
res.status(500).json({
diff --git a/src/services/user.services.js b/src/services/user.services.js
index 0eacd6c9..539cbb28 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -20,9 +20,17 @@ const UserServices = () => {
return searchSchema(dn, opts)
}
- const handleFilteredSearch = (baseDN = config.ldap.base, ldapFilter, att) => {
+ const handleFilteredSearch = async (
+ baseDN = config.ldap.base,
+ ldapFilter,
+ att,
+ page = 1,
+ limit = 10
+ ) => {
const attributes = att === undefined ? ['dn', 'uid', 'cn'] : att
- return performLdapSearch(baseDN, ldapFilter, attributes)
+ const startIndex = (page - 1) * limit
+ const results = await performLdapSearch(baseDN, ldapFilter, attributes)
+ return results.slice(startIndex, limit * page)
}
const getByUsername = (username) => {
From 4913e381f03b837a15c8de2a759fbd468a4d5330 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Tue, 29 Aug 2023 20:37:21 -0400
Subject: [PATCH 038/229] convert query to filter function added : )
---
src/helpers/convertQueryToFilter.js | 19 ++++++++++
src/routes/user.routes.js | 55 ++++++++++++++++++++++-------
2 files changed, 61 insertions(+), 13 deletions(-)
create mode 100644 src/helpers/convertQueryToFilter.js
diff --git a/src/helpers/convertQueryToFilter.js b/src/helpers/convertQueryToFilter.js
new file mode 100644
index 00000000..b4d7685b
--- /dev/null
+++ b/src/helpers/convertQueryToFilter.js
@@ -0,0 +1,19 @@
+/* thank you chatgpt */
+const createLdapFilterFromQuery = (query) => {
+ const filters = []
+
+ if (query.uid) {
+ filters.push(`uid=${query.uid}`)
+ }
+
+ if (query.cn) {
+ filters.push(`cn=${query.cn}`)
+ }
+
+ // Combine multiple filters using logical AND
+ const ldapFilter = `(${filters.join('')})`
+
+ return ldapFilter
+}
+
+module.exports = { createLdapFilterFromQuery }
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index e3554a18..e2d5a4ea 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -15,6 +15,9 @@ const getQueryToFilters = require('@src/utils/getQueryToFilters')
const { performLdapSearch } = require('@src/helpers/ldapUtils')
const config = require('@src/config/config')
const paginate = require('express-paginate')
+const {
+ createLdapFilterFromQuery,
+} = require('@src/helpers/convertQueryToFilter')
// Middleware for routes requiring checkAuth and checkRoles('admin')
router.use(checkAuth, checkRoles('admin'))
@@ -23,19 +26,46 @@ router.use(checkAuth, checkRoles('admin'))
router.use(validateResponse)
// Route handler for getting all users
-router.get('/', (req, res) => {
- const branch = req.query.branch || undefined
- const filter = getQueryToFilters(req)
- service
- .getAll(branch, filter)
- .then((data) =>
- responseSuccess(
- res,
- 'data fetched successfully',
- paginateResults(data, req)
- )
+router.get('/', async (req, res) => {
+ try {
+ const baseDN = `${config.ldap.base}`
+ const queryFilter = createLdapFilterFromQuery(req.query)
+ const ldapFilter = `(&(objectClass=person)${queryFilter})`
+
+ console.log('queryFilter', queryFilter)
+ console.log('ldapFilter', ldapFilter)
+
+ // Define the LDAP attributes you want to retrieve
+ const attributes = [
+ 'uid',
+ 'cn',
+ 'sn',
+ 'givenName',
+ 'mail',
+ 'telephoneNumber',
+ ]
+
+ // Call the performLdapSearch function to retrieve users matching the group filters
+ const searchResults = await service.handleFilteredSearch(
+ baseDN,
+ ldapFilter,
+ attributes,
+ req.query.page,
+ req.query.limit
)
- .catch((err) => responseError(res, err.message, err.errors))
+ // Send the search results
+ res.json({
+ success: true,
+ length: searchResults.length,
+ data: searchResults,
+ })
+ } catch (error) {
+ res.status(500).json({
+ success: false,
+ message: 'Error fetching users',
+ error: error.message,
+ })
+ }
})
// Get users by groups
@@ -67,7 +97,6 @@ router.get('/group/:group', async (req, res) => {
success: true,
length: searchResults.length,
data: searchResults,
-
})
} catch (error) {
res.status(500).json({
From b93ad4d4961c36bb60bdf118a769329d8e1d022f Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Tue, 29 Aug 2023 23:09:12 -0400
Subject: [PATCH 039/229] replace get by username endpoint for generic query
---
src/helpers/convertQueryToFilter.js | 4 ++++
src/routes/user.routes.js | 11 -----------
src/services/user.services.js | 18 ------------------
3 files changed, 4 insertions(+), 29 deletions(-)
diff --git a/src/helpers/convertQueryToFilter.js b/src/helpers/convertQueryToFilter.js
index b4d7685b..37e19b8d 100644
--- a/src/helpers/convertQueryToFilter.js
+++ b/src/helpers/convertQueryToFilter.js
@@ -10,6 +10,10 @@ const createLdapFilterFromQuery = (query) => {
filters.push(`cn=${query.cn}`)
}
+ if (query.username) {
+ filters.push(`uid=${query.username}`)
+ }
+
// Combine multiple filters using logical AND
const ldapFilter = `(${filters.join('')})`
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index e2d5a4ea..51c34b65 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -32,9 +32,6 @@ router.get('/', async (req, res) => {
const queryFilter = createLdapFilterFromQuery(req.query)
const ldapFilter = `(&(objectClass=person)${queryFilter})`
- console.log('queryFilter', queryFilter)
- console.log('ldapFilter', ldapFilter)
-
// Define the LDAP attributes you want to retrieve
const attributes = [
'uid',
@@ -107,14 +104,6 @@ router.get('/group/:group', async (req, res) => {
}
})
-// Route handler for getting user by username
-router.get('/:username', (req, res) => {
- service
- .getByUsername(req.params.username)
- .then((data) => responseSuccess(res, 'data fetched successfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
-})
-
// Route handler for getting user by CI
router.get('/ci/:ci', (req, res) => {
service
diff --git a/src/services/user.services.js b/src/services/user.services.js
index 539cbb28..a3f477b0 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -33,24 +33,6 @@ const UserServices = () => {
return results.slice(startIndex, limit * page)
}
- const getByUsername = (username) => {
- const opts = {
- filter: `(uid=${username})`,
- scope: 'sub',
- timeLimit: 60,
- }
- return searchSchema(config.ldap.dn, opts)
- }
-
- const getByUsernameWithNoFormat = (username) => {
- const opts = {
- filter: `(uid=${username})`,
- scope: 'sub',
- timeLimit: 60,
- }
- return searchSchemaWithoutFormat(config.ldap.dn, opts)
- }
-
const getByCI = (ci) => {
const opts = {
filter: `(ci=${ci})`,
From 5b45f944b0e20878e0c308cbdd696022d6ef0091 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Tue, 29 Aug 2023 23:13:03 -0400
Subject: [PATCH 040/229] replace get by CI endpoint for generic query
---
src/helpers/convertQueryToFilter.js | 4 ++++
src/routes/user.routes.js | 8 --------
src/services/user.services.js | 8 +++-----
3 files changed, 7 insertions(+), 13 deletions(-)
diff --git a/src/helpers/convertQueryToFilter.js b/src/helpers/convertQueryToFilter.js
index 37e19b8d..3e312ca0 100644
--- a/src/helpers/convertQueryToFilter.js
+++ b/src/helpers/convertQueryToFilter.js
@@ -14,6 +14,10 @@ const createLdapFilterFromQuery = (query) => {
filters.push(`uid=${query.username}`)
}
+ if (query.ci) {
+ filters.push(`ci=${query.ci}`)
+ }
+
// Combine multiple filters using logical AND
const ldapFilter = `(${filters.join('')})`
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index 51c34b65..af00e9a8 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -104,14 +104,6 @@ router.get('/group/:group', async (req, res) => {
}
})
-// Route handler for getting user by CI
-router.get('/ci/:ci', (req, res) => {
- service
- .getByCI(req.params.ci)
- .then((data) => responseSuccess(res, 'data fetched successfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
-})
-
// Route handler for getting user by email
router.get('/email/:email', (req, res) => {
service
diff --git a/src/services/user.services.js b/src/services/user.services.js
index a3f477b0..75599628 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -33,10 +33,11 @@ const UserServices = () => {
return results.slice(startIndex, limit * page)
}
- const getByCI = (ci) => {
+ const getByUsername = (username) => {
const opts = {
- filter: `(ci=${ci})`,
+ filter: `(uid=${username})`,
scope: 'sub',
+ timeLimit: 60,
}
return searchSchema(config.ldap.dn, opts)
}
@@ -51,10 +52,7 @@ const UserServices = () => {
return {
getAll,
-
getByUsername,
- getByUsernameWithNoFormat,
- getByCI,
getByEmail,
handleFilteredSearch,
}
From cecbb546c4f3fbc7737df564f04c8e369dbbe728 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Tue, 29 Aug 2023 23:15:41 -0400
Subject: [PATCH 041/229] replace get by email endpoint for generic query
---
src/helpers/convertQueryToFilter.js | 4 ++++
src/routes/user.routes.js | 8 --------
src/services/user.services.js | 9 ---------
3 files changed, 4 insertions(+), 17 deletions(-)
diff --git a/src/helpers/convertQueryToFilter.js b/src/helpers/convertQueryToFilter.js
index 3e312ca0..8886fdda 100644
--- a/src/helpers/convertQueryToFilter.js
+++ b/src/helpers/convertQueryToFilter.js
@@ -18,6 +18,10 @@ const createLdapFilterFromQuery = (query) => {
filters.push(`ci=${query.ci}`)
}
+ if (query.email) {
+ filters.push(`maildrop=${query.email}`)
+ }
+
// Combine multiple filters using logical AND
const ldapFilter = `(${filters.join('')})`
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index af00e9a8..b017fae3 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -104,14 +104,6 @@ router.get('/group/:group', async (req, res) => {
}
})
-// Route handler for getting user by email
-router.get('/email/:email', (req, res) => {
- service
- .getByEmail(req.params.email)
- .then((data) => responseSuccess(res, 'data fetched successfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
-})
-
// Route handler for getting users by year
router.get('/year/:year', (req, res) => {
const branch = req.query.branch
diff --git a/src/services/user.services.js b/src/services/user.services.js
index 75599628..09e6b45b 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -42,18 +42,9 @@ const UserServices = () => {
return searchSchema(config.ldap.dn, opts)
}
- const getByEmail = (email) => {
- const opts = {
- filter: `(maildrop=${email})`,
- scope: 'sub',
- }
- return searchSchema(config.ldap.dn, opts)
- }
-
return {
getAll,
getByUsername,
- getByEmail,
handleFilteredSearch,
}
}
From d97a95eea778ee87b8022345e78fc29f8761e954 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Tue, 29 Aug 2023 23:54:44 -0400
Subject: [PATCH 042/229] get all endpoint implemented
---
src/config/config.js | 1 +
src/connections/LDAP_client.js | 2 +-
src/helpers/convertQueryToFilter.js | 4 +++
src/helpers/ldapUtils.js | 43 ++++++++++++++++-------------
src/services/user.services.js | 25 +++++++++++------
5 files changed, 46 insertions(+), 29 deletions(-)
diff --git a/src/config/config.js b/src/config/config.js
index 5f4368e7..62146caf 100644
--- a/src/config/config.js
+++ b/src/config/config.js
@@ -25,5 +25,6 @@ module.exports = {
password: process.env.ADMIN_PASS,
},
sizeLimit: parseInt(process.env.LDAP_SIZE_LIMIT),
+ timeLimit: parseInt(process.env.LDAP_TIME_LIMIT),
},
}
diff --git a/src/connections/LDAP_client.js b/src/connections/LDAP_client.js
index 374115ca..2994aac9 100644
--- a/src/connections/LDAP_client.js
+++ b/src/connections/LDAP_client.js
@@ -9,7 +9,7 @@ const client = ldap.createClient({
})
client.on('connectError', (err) => {
- console.log("ERROR")
+ console.log('Error trying to connect to LDAP', err)
})
client.bind(config.ldap.admin.username, config.ldap.admin.password, (err) => {
diff --git a/src/helpers/convertQueryToFilter.js b/src/helpers/convertQueryToFilter.js
index 8886fdda..35bd99e5 100644
--- a/src/helpers/convertQueryToFilter.js
+++ b/src/helpers/convertQueryToFilter.js
@@ -2,6 +2,10 @@
const createLdapFilterFromQuery = (query) => {
const filters = []
+ if (query && Object.keys(query).length === 2) {
+ return ''
+ }
+
if (query.uid) {
filters.push(`uid=${query.uid}`)
}
diff --git a/src/helpers/ldapUtils.js b/src/helpers/ldapUtils.js
index d616a215..b1b785dc 100644
--- a/src/helpers/ldapUtils.js
+++ b/src/helpers/ldapUtils.js
@@ -39,31 +39,36 @@ const transform = (entry) => {
// Perform a search using the provided filter and return the results
const performLdapSearch = async (baseDn, filter, attributes) => {
- await bindLdapClient() // Bind before search
-
- const searchOptions = {
- filter: filter,
- scope: 'sub',
- attributes,
- }
-
return new Promise((resolve, reject) => {
- const searchResults = []
+ try {
+ bindLdapClient() // Bind before search
- ldapClient.search(baseDn, searchOptions, (err, searchResponse) => {
- if (err) {
- reject(err)
- return
+ const searchOptions = {
+ filter: filter,
+ scope: 'sub',
+ attributes,
+ timeLimit: config.ldap.timeLimit,
}
- searchResponse.on('searchEntry', (entry) => {
- searchResults.push(transform(entry))
- })
+ const searchResults = []
+
+ ldapClient.search(baseDn, searchOptions, (err, searchResponse) => {
+ if (err) {
+ reject(err)
+ return // Exit the function early in case of error
+ }
+
+ searchResponse.on('searchEntry', (entry) => {
+ searchResults.push(transform(entry))
+ })
- searchResponse.on('end', () => {
- resolve(searchResults)
+ searchResponse.on('end', () => {
+ resolve(searchResults)
+ })
})
- })
+ } catch (err) {
+ reject(err)
+ }
})
}
diff --git a/src/services/user.services.js b/src/services/user.services.js
index 09e6b45b..ac933d6c 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -29,17 +29,24 @@ const UserServices = () => {
) => {
const attributes = att === undefined ? ['dn', 'uid', 'cn'] : att
const startIndex = (page - 1) * limit
- const results = await performLdapSearch(baseDN, ldapFilter, attributes)
- return results.slice(startIndex, limit * page)
- }
- const getByUsername = (username) => {
- const opts = {
- filter: `(uid=${username})`,
- scope: 'sub',
- timeLimit: 60,
+ try {
+ const results = await performLdapSearch(baseDN, ldapFilter, attributes)
+
+ return results.slice(startIndex, limit * page)
+ } catch (err) {
+ console.error(err)
+ throw err
}
- return searchSchema(config.ldap.dn, opts)
+ }
+
+ const getByUsername = async (username) => {
+ const results = await performLdapSearch(
+ config.ldap.base,
+ `(uid=${username})`
+ )
+ console.log('results', results)
+ return results
}
return {
From d5a75c602e6b5008f940380b663e78af86c1604f Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 30 Aug 2023 00:30:10 -0400
Subject: [PATCH 043/229] auth login fixed
---
src/helpers/ldapUtils.js | 3 ++-
src/modules/authentication/LdapAuth.js | 16 ++++++++--------
src/services/user.services.js | 9 +++++++--
3 files changed, 17 insertions(+), 11 deletions(-)
diff --git a/src/helpers/ldapUtils.js b/src/helpers/ldapUtils.js
index b1b785dc..3d6ac46a 100644
--- a/src/helpers/ldapUtils.js
+++ b/src/helpers/ldapUtils.js
@@ -33,7 +33,8 @@ const getObject = (arr) => {
const transform = (entry) => {
const data = getObject(entry.pojo.attributes)
-
+ data.objectName = entry.pojo.objectName
+ data.dn = entry.pojo.objectName
return data
}
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index a538f641..4e66b2b7 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -83,16 +83,13 @@ var init = function (
}
let username = req.body.username
let password = req.body.password
- let response = await userService.getByUsername(username)
+ let res = await userService.getByUsername(username)
+ const response = res[0]
+
// if user doesn't exists
- if (response.attributes === undefined) {
+ if (response === undefined) {
throw new Error('username or password incorrect')
}
- const branch = response.objectName
- .toString()
- .split(',')[2]
- .replace('ou=', '')
- // construct the parameter to pass in authenticate() function
let options
if (_backwardCompatible) {
_usernameAttributeName = 'uid'
@@ -119,7 +116,10 @@ var init = function (
if (opt.userDn) {
options.userDn = opt.userDn
.replace('{{username}}', username)
- .replace('{{branch}}', branch)
+ .replace(
+ '{{branch}}',
+ response.objectName.split(',')[2].replace('ou=', '')
+ )
}
if (opt.adminDn) {
options.adminDn = opt.adminDn
diff --git a/src/services/user.services.js b/src/services/user.services.js
index ac933d6c..7ef0282c 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -31,7 +31,13 @@ const UserServices = () => {
const startIndex = (page - 1) * limit
try {
- const results = await performLdapSearch(baseDN, ldapFilter, attributes)
+ const results = await performLdapSearch(
+ baseDN,
+ ldapFilter,
+ attributes,
+ page,
+ limit
+ )
return results.slice(startIndex, limit * page)
} catch (err) {
@@ -45,7 +51,6 @@ const UserServices = () => {
config.ldap.base,
`(uid=${username})`
)
- console.log('results', results)
return results
}
From 7c8707c141d79067c79ef659ea34ec0aa35e577e Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 30 Aug 2023 01:16:13 -0400
Subject: [PATCH 044/229] add query filtering to groups endpoint
---
src/routes/user.routes.js | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index b017fae3..e5f23b8b 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -69,7 +69,8 @@ router.get('/', async (req, res) => {
router.get('/group/:group', async (req, res) => {
try {
const baseDN = `ou=usuarios,ou=${req.params.group},${config.ldap.base}`
- const filter = 'objectClass=person'
+ const queryFilter = createLdapFilterFromQuery(req.query)
+ const ldapFilter = `(&(objectClass=person)${queryFilter})`
// Define the LDAP attributes you want to retrieve
const attributes = [
@@ -84,7 +85,7 @@ router.get('/group/:group', async (req, res) => {
// Call the performLdapSearch function to retrieve users matching the group filters
const searchResults = await service.handleFilteredSearch(
baseDN,
- filter,
+ ldapFilter,
attributes,
req.query.page,
req.query.limit
From b8ceb64319142612c62c8f01837bd7265d112c57 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 30 Aug 2023 10:49:09 -0400
Subject: [PATCH 045/229] return all attributes on search
---
src/routes/user.routes.js | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index e5f23b8b..6d94a553 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -33,14 +33,7 @@ router.get('/', async (req, res) => {
const ldapFilter = `(&(objectClass=person)${queryFilter})`
// Define the LDAP attributes you want to retrieve
- const attributes = [
- 'uid',
- 'cn',
- 'sn',
- 'givenName',
- 'mail',
- 'telephoneNumber',
- ]
+ const attributes = null
// Call the performLdapSearch function to retrieve users matching the group filters
const searchResults = await service.handleFilteredSearch(
From 17932b852599411f24894c27b8b5bd15e8a6bb20 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 30 Aug 2023 10:49:33 -0400
Subject: [PATCH 046/229] search group by name endpoint
---
src/routes/group.routes.js | 22 ++++++++++++++++------
src/services/group.services.js | 29 ++++++++++++++++++-----------
2 files changed, 34 insertions(+), 17 deletions(-)
diff --git a/src/routes/group.routes.js b/src/routes/group.routes.js
index 3dd8625e..7d4123f2 100644
--- a/src/routes/group.routes.js
+++ b/src/routes/group.routes.js
@@ -7,13 +7,23 @@ const { checkAuth } = require('../middlewares/auth.handler')
const service = GroupServices()
//Get all users
-router.get('/', checkAuth, validateResponse, (req, res) => {
- const branch = req.query.branch
- service
- .getAll(branch)
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
+router.get('/:group', checkAuth, validateResponse, async (req, res) => {
+ try {
+ const group = req.params.group
+ const response = await service.getGroup(group)
+ res.json({
+ success: true,
+ data: response,
+ })
+ } catch (error) {
+ res.status(500).json({
+ success: false,
+ message: 'Error fetching group',
+ error: `It seems that the group does not exist.`,
+ })
+ }
})
+
router.get('/admins', checkAuth, validateResponse, (req, res) => {
const branch = req.query.branch
service
diff --git a/src/services/group.services.js b/src/services/group.services.js
index d57afd38..abdbc8b7 100644
--- a/src/services/group.services.js
+++ b/src/services/group.services.js
@@ -1,20 +1,27 @@
const boom = require('@hapi/boom')
require('dotenv').config({ path: __dirname + '/../../.env' })
-const ldap = require('../connections/LDAP_client')
+const ldap = require('@src/connections/LDAP_client')
const LDAP = require('ldapjs')
-const config = require('../config/config')
+const config = require('@src/config/config')
const assert = require('assert')
-const searchSchema = require('../utils/ldap_search_utils')
+const searchSchema = require('@src/utils/ldap_search_utils')
+const { performLdapSearch } = require('@src/helpers/ldapUtils')
const GroupServices = () => {
- const getAll = (branch) => {
- const dn =
- branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
- const opts = {
- filter: `(objectClass=posixGroup)`,
- scope: 'sub',
+ const getGroup = async (group) => {
+ try {
+ const baseDN = config.ldap.base
+ const ldapFilter = `(ou=${group})`
+ const results = await performLdapSearch(baseDN, ldapFilter)
+ if (results[0] === undefined) {
+ throw new Error('No existe ese grupo')
+ } else {
+ return results
+ }
+ } catch (err) {
+ console.error(err)
+ throw err
}
- return searchSchema(dn, opts)
}
const getAdminsGroups = (branch) => {
@@ -27,8 +34,8 @@ const GroupServices = () => {
return searchSchema(dn, opts)
}
return {
- getAll,
getAdminsGroups,
+ getGroup,
}
}
From 79e1ec5d59c20846a486d26cf9db3c4e3ede3fec Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 30 Aug 2023 11:23:11 -0400
Subject: [PATCH 047/229] get by baseDN endpoint added
---
src/modules/authentication/LdapAuth.js | 8 ++++--
src/routes/user.routes.js | 35 ++++++++++++++++++++++++++
2 files changed, 41 insertions(+), 2 deletions(-)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 4e66b2b7..356de583 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -227,14 +227,18 @@ var login = function (req, res, next) {
// Example usage
const ldapDn = user.dn
const groups = extractGroupsFromDn(ldapDn)
- const base = extractBaseFromDn(ldapDn)
+ const rootBaseDN = extractBaseFromDn(ldapDn)
+ const localBaseDN = user.dn.replace(`uid=${user.uid},`, '')
+
+ console.log('user.dn')
const payload = {
sub: user.uid,
dn: user.dn,
uid: user.uid,
groups: groups,
- base: base,
+ base: rootBaseDN,
+ localBase: localBaseDN,
firstname: user.givenName,
lastname: user.sn,
fullname: user.cn,
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index 6d94a553..cb9fa4eb 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -98,6 +98,41 @@ router.get('/group/:group', async (req, res) => {
}
})
+router.get('/baseDN', async (req, res) => {
+ try {
+ const baseDN = req.body.baseDN
+ if (!baseDN) {
+ throw new Error('Value of the baseDN has not been sent correctly')
+ }
+ const queryFilter = createLdapFilterFromQuery(req.query)
+ const ldapFilter = `(&(objectClass=person)${queryFilter})`
+
+ // Define the LDAP attributes you want to retrieve
+ const attributes = null
+
+ // Call the performLdapSearch function to retrieve users matching the group filters
+ const searchResults = await service.handleFilteredSearch(
+ baseDN,
+ ldapFilter,
+ attributes,
+ req.query.page,
+ req.query.limit
+ )
+ // Send the search results
+ res.json({
+ success: true,
+ length: searchResults.length,
+ data: searchResults,
+ })
+ } catch (error) {
+ res.status(500).json({
+ success: false,
+ message: 'Error fetching users',
+ error: error.message,
+ })
+ }
+})
+
// Route handler for getting users by year
router.get('/year/:year', (req, res) => {
const branch = req.query.branch
From eb3915be50d9b1dd1d6fa6d689baddc57e46b0a5 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 30 Aug 2023 11:55:52 -0400
Subject: [PATCH 048/229] update get by baseDN to be a post petition
---
src/routes/user.routes.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index cb9fa4eb..3e410654 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -98,7 +98,7 @@ router.get('/group/:group', async (req, res) => {
}
})
-router.get('/baseDN', async (req, res) => {
+router.post('/baseDN', async (req, res) => {
try {
const baseDN = req.body.baseDN
if (!baseDN) {
From 0de394621a07e8130d4c197b222d14fce3266f58 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 30 Aug 2023 13:26:41 -0400
Subject: [PATCH 049/229] massive file clean
---
index.js | 12 +--
src/__tests__/integration.test.js | 35 -------
src/__tests__/performance/artillery.yml | 27 ------
src/__tests__/performance/performance.test.js | 0
src/__tests__/shapiro.test.js | 3 -
src/__tests__/unit.test.js | 96 -------------------
src/modules/authentication/LdapAuth.js | 1 -
src/routes/auth.routes.js | 10 --
src/routes/group.routes.js | 8 --
src/routes/routes.js | 4 -
src/routes/tree.routes.js | 14 ---
src/routes/user.routes.js | 21 ----
src/schemas/newUser.schema.js | 15 ---
src/services/auth.services.js | 6 --
src/services/group.services.js | 19 ----
src/services/tree.services.js | 54 -----------
src/services/user.services.js | 18 ----
src/utils/getQueryToFilters.js | 27 ------
src/utils/ldap_search_utils.js | 50 ----------
src/utils/paginateResults.js | 27 ------
src/utils/searchSchemaWithNoFormat.js | 47 ---------
src/utils/transform_user_schema.js | 15 ---
22 files changed, 6 insertions(+), 503 deletions(-)
delete mode 100644 src/__tests__/integration.test.js
delete mode 100644 src/__tests__/performance/artillery.yml
delete mode 100644 src/__tests__/performance/performance.test.js
delete mode 100644 src/__tests__/shapiro.test.js
delete mode 100644 src/__tests__/unit.test.js
delete mode 100644 src/routes/auth.routes.js
delete mode 100644 src/routes/tree.routes.js
delete mode 100644 src/schemas/newUser.schema.js
delete mode 100644 src/services/auth.services.js
delete mode 100644 src/services/tree.services.js
delete mode 100644 src/utils/getQueryToFilters.js
delete mode 100644 src/utils/ldap_search_utils.js
delete mode 100644 src/utils/paginateResults.js
delete mode 100644 src/utils/searchSchemaWithNoFormat.js
delete mode 100644 src/utils/transform_user_schema.js
diff --git a/index.js b/index.js
index 18703278..44c620ad 100644
--- a/index.js
+++ b/index.js
@@ -1,17 +1,17 @@
/* jshint node:true */
/* global require */
require('module-alias/register')
-const CONFIG = require('./src/config/config.js')
+const CONFIG = require('@src/config/config.js')
const bodyParser = require('body-parser')
const express = require('express')
-const addRoutes = require('./src/routes/routes.js')
-const sessionMiddleWare = require('./src/middlewares/session.handler.js')
-const addLoggerMiddleware = require('./src/middlewares/logger.handler.js')
-const ldap_initialization = require('./src/utils/ldap_initialization.js')
+const addRoutes = require('@src/routes/routes.js')
+const sessionMiddleWare = require('@src/middlewares/session.handler.js')
+const addLoggerMiddleware = require('@src/middlewares/logger.handler.js')
+const ldap_initialization = require('@src/utils/ldap_initialization.js')
const path = require('path')
const cors = require('cors')
const helmet = require('helmet')
-const limiter = require('./src/middlewares/rate_limiter.handler.js')
+const limiter = require('@src/middlewares/rate_limiter.handler.js')
const paginate = require('express-paginate')
const compression = require('compression')
const cache = require('express-cache-ctrl')
diff --git a/src/__tests__/integration.test.js b/src/__tests__/integration.test.js
deleted file mode 100644
index 58464b77..00000000
--- a/src/__tests__/integration.test.js
+++ /dev/null
@@ -1,35 +0,0 @@
-const request = require('supertest')
-const app = require('../../index') // your Express app
-const UserServices = require('../services/user.services')
-const mongoose = require('mongoose')
-const User = require('../schemas/user.schema').User
-const config = require('../config/config')
-const ldapClient = require('../connections/LDAP_client')
-
-describe('Prueba de Integración: Verifique que el servidor pueda comunicarse correctamente con la base de datos y el servidor LDAP', () => {
- it('should correctly communicate with the database and the LDAP server', async () => {
- // Get all users from the 'users' collection in the 'ldapDB' database
- const users = await User.find({})
-
- for (const user of users) {
- // For each user, check if their 'username' attribute matches a 'uid' in the LDAP server
- const searchOptions = {
- filter: `(uid=${user.username})`,
- scope: 'sub',
- }
-
- await new Promise((resolve, reject) => {
- ldapClient.search(config.ldap.dn, searchOptions, (err, res) => {
- if (err) return reject(err)
-
- res.on('searchEntry', (entry) => {
- const uid = entry.pojo.attributes[0].values[0]
- expect(uid).toBe(user.username)
- })
-
- res.on('end', resolve)
- })
- })
- }
- })
-})
diff --git a/src/__tests__/performance/artillery.yml b/src/__tests__/performance/artillery.yml
deleted file mode 100644
index e1c134e3..00000000
--- a/src/__tests__/performance/artillery.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-config:
- target: 'http://127.0.0.1:4000' # URL base de tu API
- phases:
- - duration: 60 # Duración de la prueba en segundos
- arrivalRate: 20 # Número de solicitudes por segundo
- variables:
- jwt: '' # Variable para almacenar el JWT capturado en el login
-scenarios:
- - flow:
- - post:
- url: '/login' # Endpoint para iniciar sesión y obtener un JWT
- json:
- username: 'agonzalezb'
- password: '00092068426'
- capture:
- json: '$.data.token'
- as: 'jwt'
- - get:
- url: '/users' # Endpoint para obtener información de usuarios utilizando un JWT
- headers:
- Authorization: 'Bearer {{ jwt }}'
- - post:
- url: '/users/artillery' # Endpoint para crear un nuevo usuario en el directorio LDAP
- json:
- username: 'newuser'
- password: 'password'
- email: 'newuser@example.com'
\ No newline at end of file
diff --git a/src/__tests__/performance/performance.test.js b/src/__tests__/performance/performance.test.js
deleted file mode 100644
index e69de29b..00000000
diff --git a/src/__tests__/shapiro.test.js b/src/__tests__/shapiro.test.js
deleted file mode 100644
index cd784af3..00000000
--- a/src/__tests__/shapiro.test.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const jerzy = require('jerzy')
-var v = new jerzy.Vector([1, 2, 3, 4, 20])
-console.log(JSON.stringify(jerzy.Normality.shapiroWilk(v), null, 4))
diff --git a/src/__tests__/unit.test.js b/src/__tests__/unit.test.js
deleted file mode 100644
index 39cf8037..00000000
--- a/src/__tests__/unit.test.js
+++ /dev/null
@@ -1,96 +0,0 @@
-const app = require('../../index')
-const supertest = require('supertest')
-const config = require('../config/config')
-
-describe('Pruebas de funcionalidad', () => {
- describe('Caso de uso 1: Verificar que la API pueda autenticar a los usuarios en el directorio LDAP', () => {
- it('debería autenticar a un usuario con credenciales válidas', async () => {
- const request = supertest(app)
- const response = await request.post('/login').send({
- username: config.ldap.username_bind,
- password: config.ldap.password_bind,
- })
-
- expect(response.status).toBe(200)
- expect(response.body).toHaveProperty('data')
- })
-
- it('no debería autenticar a un usuario con credenciales inválidas', async () => {
- const request = supertest(app)
- const response = await request
- .post('/login')
- .send({ username: 'invalid-username', password: 'invalid-password' })
-
- expect(response.status).toBe(401)
- expect(response.body).toStrictEqual({
- success: false,
- message: 'username or password incorrect',
- })
- })
-
- it('no debería autenticar a un usuario sin credenciales', async () => {
- const request = supertest(app)
- const response = await request.post('/login').send({})
-
- expect(response.status).toBe(401)
- expect(response.body).toStrictEqual({
- success: false,
- message: 'username and password must be both provided',
- })
- })
- })
-})
-
-describe('Caso de uso 2: Comprobar que la API pueda realizar búsquedas en el directorio LDAP y devolver resultados precisos', () => {
- it('debería realizar una búsqueda de todos los estudiantes del grupo 31 y de la facultad de Ing. Informatica', async () => {
- const request = supertest(app)
- const { body } = await request.post('/login').send({
- username: config.ldap.username_bind,
- password: config.ldap.password_bind,
- })
- const { data } = body
- const { token } = data
- const response = await request
- .get('/users/students')
- .set('Authorization', `Bearer ${token}`)
- .query({ group: '31', branch: 'informatica' })
-
- expect(response.status).toBe(200)
- expect(response.body.message).toEqual('data fetched succesfully')
- })
-
- it('debería realizar una búsqueda de todos los profesores que pertenezcan al PCC y su grupo de investigacion sea IA', async () => {
- const request = supertest(app)
- const { body } = await request.post('/login').send({
- username: config.ldap.username_bind,
- password: config.ldap.password_bind,
- })
- const { data } = body
- const { token } = data
- const response = await request
- .get('/users/professors')
- .set('Authorization', `Bearer ${token}`)
- .query({ PCC: 'true', researchGroup: 'IA' })
- expect(response.status).toBe(200)
- expect(response.body.message).toEqual('data fetched succesfully')
- })
-})
-
-describe('Caso de uso 3: verificar que la API puede proporcionar información de perfil personal del usuario a través de su JWT', () => {
- it('debe proporcionar información de perfil personal del usuario a través de su JWT', async () => {
- const request = supertest(app)
- const { body } = await request.post('/login').send({
- username: config.ldap.username_bind,
- password: config.ldap.password_bind,
- })
- const { data } = body
- const { token } = data
-
- const response = await request
- .get('/profile')
- .set('Authorization', `Bearer ${token}`)
-
- expect(response.status).toBe(200)
- expect(response.body.message).toEqual('data fetched succesfully')
- })
-})
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 356de583..7622f68e 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -218,7 +218,6 @@ var login = function (req, res, next) {
const userUID = user.uid
const userDN = user.dn
const branch = userDN.split(',')[2].replace('ou=', '')
- /* const response = await groupService.getAdminsGroups(branch) */
const isAdmin = user.right === 'Todos'
const last_time_logged = await profileService.getLastLoginByUsername(
user.uid
diff --git a/src/routes/auth.routes.js b/src/routes/auth.routes.js
deleted file mode 100644
index 15740443..00000000
--- a/src/routes/auth.routes.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const express = require('express')
-const passport = require('passport')
-const CustomStrategy = require('passport-custom').Strategy
-const { authenticate } = require('ldap-authentication')
-const AuthServices = require('../services/auth.services')
-const service = AuthServices()
-
-const router = express.Router()
-
-module.exports = router
diff --git a/src/routes/group.routes.js b/src/routes/group.routes.js
index 7d4123f2..03712780 100644
--- a/src/routes/group.routes.js
+++ b/src/routes/group.routes.js
@@ -24,12 +24,4 @@ router.get('/:group', checkAuth, validateResponse, async (req, res) => {
}
})
-router.get('/admins', checkAuth, validateResponse, (req, res) => {
- const branch = req.query.branch
- service
- .getAdminsGroups(branch)
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
-})
-
module.exports = router
diff --git a/src/routes/routes.js b/src/routes/routes.js
index 5f37134e..5a829622 100644
--- a/src/routes/routes.js
+++ b/src/routes/routes.js
@@ -1,13 +1,9 @@
-const AuthRoutes = require('./auth.routes')
-const TreeRoutes = require('./tree.routes')
const UserRoutes = require('./user.routes')
const GroupRoutes = require('./group.routes')
const ProfileRoutes = require('./profile.routes')
const LogsRoutes = require('./logs.routes')
const addRoutes = (app) => {
- app.use('/', AuthRoutes)
- app.use('/tree', TreeRoutes)
app.use('/users', UserRoutes)
app.use('/groups', GroupRoutes)
app.use('/profile', ProfileRoutes)
diff --git a/src/routes/tree.routes.js b/src/routes/tree.routes.js
deleted file mode 100644
index 2e65bfc5..00000000
--- a/src/routes/tree.routes.js
+++ /dev/null
@@ -1,14 +0,0 @@
-const express = require('express')
-const router = express.Router()
-const config = require('../config/config')
-const { responseSuccess, responseError } = require('../schemas/response.schema')
-const validateResponse = require('../middlewares/validateResponse')
-const { checkAuth } = require('../middlewares/auth.handler')
-
-const TreeServices = require('../services/tree.services')
-const service = TreeServices()
-
-const PROFESSORS_CLASS = config.ldap.objectClasses[5].name
-const STUDENT_CLASS = config.ldap.objectClasses[3].name
-
-module.exports = router
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index 3e410654..69e5dd67 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -8,13 +8,7 @@ const {
const validateResponse = require('@src/middlewares/validateResponse')
const { checkAuth, checkRoles } = require('@src/middlewares/auth.handler')
const service = UserServices()
-const paginateResults = require('@src/utils/paginateResults')
-const mongoose = require('mongoose')
-const Schema = mongoose.Schema
-const getQueryToFilters = require('@src/utils/getQueryToFilters')
-const { performLdapSearch } = require('@src/helpers/ldapUtils')
const config = require('@src/config/config')
-const paginate = require('express-paginate')
const {
createLdapFilterFromQuery,
} = require('@src/helpers/convertQueryToFilter')
@@ -133,19 +127,4 @@ router.post('/baseDN', async (req, res) => {
}
})
-// Route handler for getting users by year
-router.get('/year/:year', (req, res) => {
- const branch = req.query.branch
- service
- .getByYear(req.params.year, branch)
- .then((data) =>
- responseSuccess(
- res,
- 'data fetched successfully',
- paginateResults(data, req)
- )
- )
- .catch((err) => responseError(res, err.message, err.errors))
-})
-
module.exports = router
diff --git a/src/schemas/newUser.schema.js b/src/schemas/newUser.schema.js
deleted file mode 100644
index 3d230a52..00000000
--- a/src/schemas/newUser.schema.js
+++ /dev/null
@@ -1,15 +0,0 @@
-const joi = require('joi')
-
-const newUserSchema = joi.object({
- uid: joi.string(),
- cn: joi.string(),
- sn: joi.string(),
- email: joi.string(),
- ci: joi.string(),
- studentClassGroup: joi.string(),
- displayName: joi.string(),
- password: joi.string(),
- confirmPassword: joi.string(),
-})
-
-module.exports = newUserSchema
diff --git a/src/services/auth.services.js b/src/services/auth.services.js
deleted file mode 100644
index 2cbdac60..00000000
--- a/src/services/auth.services.js
+++ /dev/null
@@ -1,6 +0,0 @@
-const boom = require('@hapi/boom')
-const passport = require('passport')
-
-const AuthServices = () => {}
-
-module.exports = AuthServices
diff --git a/src/services/group.services.js b/src/services/group.services.js
index abdbc8b7..e3e680aa 100644
--- a/src/services/group.services.js
+++ b/src/services/group.services.js
@@ -1,10 +1,5 @@
-const boom = require('@hapi/boom')
require('dotenv').config({ path: __dirname + '/../../.env' })
-const ldap = require('@src/connections/LDAP_client')
-const LDAP = require('ldapjs')
const config = require('@src/config/config')
-const assert = require('assert')
-const searchSchema = require('@src/utils/ldap_search_utils')
const { performLdapSearch } = require('@src/helpers/ldapUtils')
const GroupServices = () => {
@@ -23,20 +18,6 @@ const GroupServices = () => {
throw err
}
}
-
- const getAdminsGroups = (branch) => {
- const dn =
- branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
- const opts = {
- filter: `(cn=admins)`,
- scope: 'sub',
- }
- return searchSchema(dn, opts)
- }
- return {
- getAdminsGroups,
- getGroup,
- }
}
module.exports = GroupServices
diff --git a/src/services/tree.services.js b/src/services/tree.services.js
deleted file mode 100644
index 970ec244..00000000
--- a/src/services/tree.services.js
+++ /dev/null
@@ -1,54 +0,0 @@
-const boom = require('@hapi/boom')
-const ldap = require('../connections/LDAP_client')
-const config = require('../config/config')
-const assert = require('assert')
-const LDAP = require('ldapjs')
-const searchSchema = require('../utils/ldap_search_utils')
-
-ldap.bind(
- config.ldap.admin.username,
- config.ldap.admin.password,
- (err) => {
- assert.ifError(err)
- }
-)
-const PROFESSORS_CLASS = config.ldap.objectClasses[5].name
-const STUDENT_CLASS = config.ldap.objectClasses[3].name
-
-const TreeServices = () => {
- const getAllProffesors = () => {
- const filter = `(objectclass=${PROFESSORS_CLASS})`
- return searchSchema(filter)
- }
-
- const getAllStudents = () => {
- const filter = `(objectclass=${STUDENT_CLASS})`
- return searchSchema(filter)
- }
-
- const getUsersByYear = (year) => {
- const filter = `(userYears=${year})`
- return searchSchema(filter)
- }
-
- const getUsersByBranch = (branch) => {
- const dnByBranch = `ou=${branch},${config.ldap.dn}`
- const filter = `objectclass=*`
- return searchSchema(filter, dnByBranch)
- }
-
- const getUsersByYearAndBranch = (year, branch, type) => {
- const dnByBranch = `ou=${branch},${config.ldap.dn}`
- const filter = `objectclass=${type} AND studentClassGroup>=${year * 10}`
- }
-
- return {
- getAllProffesors,
- getAllStudents,
- getUsersByYear,
- getUsersByBranch,
- getUsersByYearAndBranch,
- }
-}
-
-module.exports = TreeServices
diff --git a/src/services/user.services.js b/src/services/user.services.js
index 7ef0282c..940182c0 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -1,25 +1,8 @@
require('dotenv').config({ path: __dirname + '/../../.env' })
const config = require('@src/config/config')
-const assert = require('assert')
-const searchSchema = require('@src/utils/ldap_search_utils')
-const searchSchemaWithoutFormat = require('@src/utils/searchSchemaWithNoFormat')
-const ldapClient = require('@src/connections/LDAP_client')
const { performLdapSearch } = require('@src/helpers/ldapUtils')
const UserServices = () => {
- const getAll = (branch, filter) => {
- const dn =
- branch === undefined ? config.ldap.dn : `ou=${branch},${config.ldap.dn}`
- const opts = {
- filter: filter,
- scope: 'sub',
- attributes: ['uid', 'cn', 'mail', 'ci', 'sex', 'year'],
- sizeLimit: config.ldap.sizeLimit,
- timeLimit: 50000,
- }
- return searchSchema(dn, opts)
- }
-
const handleFilteredSearch = async (
baseDN = config.ldap.base,
ldapFilter,
@@ -55,7 +38,6 @@ const UserServices = () => {
}
return {
- getAll,
getByUsername,
handleFilteredSearch,
}
diff --git a/src/utils/getQueryToFilters.js b/src/utils/getQueryToFilters.js
deleted file mode 100644
index b9b6fe0a..00000000
--- a/src/utils/getQueryToFilters.js
+++ /dev/null
@@ -1,27 +0,0 @@
-const getQueryToFilters = (req) => {
- let filters = []
- const { sex, condition, status, type, year, country, group, UJC, skinColor } =
- req.query
- if (sex !== undefined) filters.push(`sex=${sex.toString().toUpperCase()}`)
- else if (condition !== undefined)
- filters.push(`userCondition=${condition.toString().capitalize()}`)
- else if (status !== undefined)
- filters.push(`userStatus=${status.toString().capitalize()}`)
- else if (type !== undefined)
- filters.push(`userType=${type.toString().capitalize()}`)
- else if (year !== undefined) filters.push(`studentYear=${year.toString()}`)
- else if (country !== undefined)
- filters.push(`contry=${country.toString().capitalize()}`)
- else if (group !== undefined)
- filters.push(`studentClassGroup=${group.toString()}`)
- else if (UJC !== undefined) filters.push(`UJC=${UJC}`)
- else if (skinColor !== undefined)
- filters.push(`skinColor=${skinColor.toString().capitalize()}`)
-
- const filter = filters.join(',')
- return filter === '' || filter === undefined
- ? '(objectClass=person)'
- : `(${filter})`
-}
-
-module.exports = getQueryToFilters
diff --git a/src/utils/ldap_search_utils.js b/src/utils/ldap_search_utils.js
deleted file mode 100644
index e8ed6ac4..00000000
--- a/src/utils/ldap_search_utils.js
+++ /dev/null
@@ -1,50 +0,0 @@
-const config = require('../config/config')
-const transformData = require('./transform_user_schema')
-const ldap = require('../connections/LDAP_client')
-
-const searchSchema = (dn, opt) => {
- let results = []
- let pageCount = 0
- let pagedEntries = []
-
- return new Promise((resolve, reject) => {
- ldap.search(dn, opt, (err, res) => {
- res.on('searchEntry', (entry) => {
- if (opt.sizeLimit !== undefined) {
- if (results.length === opt.sizeLimit - 1) {
- resolve(results.length === 1 ? results[0] : results)
- }
- }
- results.push({
- objectName: entry.pojo.objectName,
- attributes: transformData(entry),
- })
- pagedEntries.push({
- objectName: entry.pojo.objectName,
- attributes: transformData(entry),
- })
- })
- res.on('page', (result, cb) => {
- if (!!opt.pageNum) {
- pageCount = pageCount + 1
- pageCount === opt.pageNum
- ? resolve(
- pagedEntries.length === 1 ? pagedEntries[0] : pagedEntries
- )
- : (pagedEntries = [])
- }
- })
- res.on('searchReference', (referral) => {
- console.log('referral: ' + referral.uris.join())
- })
- res.on('error', (resError) =>
- reject(new Error(`Search error: ${resError}`))
- )
- res.on('end', (result) => {
- resolve(results.length === 1 ? results[0] : results)
- })
- })
- })
-}
-
-module.exports = searchSchema
diff --git a/src/utils/paginateResults.js b/src/utils/paginateResults.js
deleted file mode 100644
index 4545e523..00000000
--- a/src/utils/paginateResults.js
+++ /dev/null
@@ -1,27 +0,0 @@
-function paginateResults(array, req) {
- const page = parseInt(req.query.page) || 1
- const limit = parseInt(req.query.limit) || 10
- console.log('page', page)
- console.log('limit', limit)
-
- const startIndex = (page - 1) * limit
- const endIndex = page * limit
- const results = {}
-
- results.results = array.slice(startIndex, endIndex)
- results.length = results.results.length
-
- if (endIndex < array.length) {
- results.next = {
- page: page + 1,
- }
- }
- if (startIndex > 0) {
- results.previous = {
- page: page - 1,
- }
- }
- return results
-}
-
-module.exports = paginateResults
diff --git a/src/utils/searchSchemaWithNoFormat.js b/src/utils/searchSchemaWithNoFormat.js
deleted file mode 100644
index 7fdf634b..00000000
--- a/src/utils/searchSchemaWithNoFormat.js
+++ /dev/null
@@ -1,47 +0,0 @@
-const config = require('../config/config')
-const transformData = require('./transform_user_schema')
-const ldap = require('../connections/LDAP_client')
-
-const searchSchemaWithoutFormat = (dn, opt) => {
- let results = []
- let pageCount = 0
- let pagedEntries = []
-
- return new Promise((resolve, reject) => {
- ldap.search(dn, opt, (err, res) => {
- res.on('searchEntry', (entry) => {
- if (opt.sizeLimit !== undefined) {
- if (results.length === opt.sizeLimit - 1) {
- resolve(results.length === 1 ? results[0] : results)
- }
- }
- results.push({
- objectName: entry.pojo.objectName,
- attributes: entry.pojo,
- })
- pagedEntries.push({
- objectName: entry.pojo.objectName,
- attributes: entry.pojo,
- })
- })
- res.on('page', (result, cb) => {
- console.log('page finish')
- pageCount = pageCount + 1
- pageCount === opt.pageNum
- ? resolve(pagedEntries.length === 1 ? pagedEntries[0] : pagedEntries)
- : (pagedEntries = [])
- })
- res.on('searchReference', (referral) => {
- console.log('referral: ' + referral.uris.join())
- })
- res.on('error', (resError) =>
- reject(new Error(`Search error: ${resError}`))
- )
- res.on('end', (result) => {
- resolve(results.length === 1 ? results[0] : results)
- })
- })
- })
-}
-
-module.exports = searchSchemaWithoutFormat
diff --git a/src/utils/transform_user_schema.js b/src/utils/transform_user_schema.js
deleted file mode 100644
index 30a58943..00000000
--- a/src/utils/transform_user_schema.js
+++ /dev/null
@@ -1,15 +0,0 @@
-const getObject = (arr) => {
- const newObj = {}
- arr.forEach((obj) => {
- newObj[obj.type] = obj.values.length === 1 ? obj.values[0] : obj.values
- })
- return newObj
-}
-
-const transform = (entry) => {
- const data = getObject(entry.pojo.attributes)
-
- return data
-}
-
-module.exports = transform
From f82804bcfc258f07fffb4892b1147524c133fbd6 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 30 Aug 2023 13:37:59 -0400
Subject: [PATCH 050/229] refactor auth method
---
src/modules/authentication/LdapAuth.js | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 7622f68e..3e9aae9f 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -15,18 +15,14 @@ const ProfileServices = require('../../services/profile.services')
const {
extractBaseFromDn,
extractGroupsFromDn,
- extractUidFromDn,
} = require('../../helpers/dnHelper')
const { signToken } = require('../../utils/authentication/tokens/token_sign')
const {
responseSuccess,
- responseError,
} = require('../../schemas/response.schema')
-const validateResponse = require('../../middlewares/validateResponse')
const userService = UserServices()
-const groupService = GroupServices()
const profileService = ProfileServices()
var _backwardCompatible = false
@@ -215,9 +211,6 @@ var login = function (req, res, next) {
.status(401)
.json({ success: false, message: 'User cannot be found' })
} else {
- const userUID = user.uid
- const userDN = user.dn
- const branch = userDN.split(',')[2].replace('ou=', '')
const isAdmin = user.right === 'Todos'
const last_time_logged = await profileService.getLastLoginByUsername(
user.uid
@@ -229,8 +222,6 @@ var login = function (req, res, next) {
const rootBaseDN = extractBaseFromDn(ldapDn)
const localBaseDN = user.dn.replace(`uid=${user.uid},`, '')
- console.log('user.dn')
-
const payload = {
sub: user.uid,
dn: user.dn,
From f4f2f727b43b616431507f26ad894e86006a1190 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 30 Aug 2023 17:53:38 -0400
Subject: [PATCH 051/229] clean imports on user routes
---
src/routes/user.routes.js | 4 ----
1 file changed, 4 deletions(-)
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index 69e5dd67..bc183dbb 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -1,10 +1,6 @@
const express = require('express')
const router = express.Router()
const UserServices = require('@src/services/user.services.js')
-const {
- responseSuccess,
- responseError,
-} = require('@src/schemas/response.schema')
const validateResponse = require('@src/middlewares/validateResponse')
const { checkAuth, checkRoles } = require('@src/middlewares/auth.handler')
const service = UserServices()
From 262a3e0d3268daaa9bf91246f31dbb0a2a90ec1d Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 30 Aug 2023 18:33:15 -0400
Subject: [PATCH 052/229] add userType filter endpoint
---
src/constants/userTypes.js | 8 ++++++++
src/helpers/convertQueryToFilter.js | 24 ++++++++++++++++++------
2 files changed, 26 insertions(+), 6 deletions(-)
create mode 100644 src/constants/userTypes.js
diff --git a/src/constants/userTypes.js b/src/constants/userTypes.js
new file mode 100644
index 00000000..0c9d26fa
--- /dev/null
+++ b/src/constants/userTypes.js
@@ -0,0 +1,8 @@
+const userTypes = ['Estudiante', 'Trabajador Docente', 'Trabajador']
+
+const user_types_query = ['student', 'employee', 'docent_employee']
+
+module.exports = {
+ userTypes,
+ user_types_query,
+}
diff --git a/src/helpers/convertQueryToFilter.js b/src/helpers/convertQueryToFilter.js
index 35bd99e5..cc0f78b0 100644
--- a/src/helpers/convertQueryToFilter.js
+++ b/src/helpers/convertQueryToFilter.js
@@ -1,4 +1,12 @@
/* thank you chatgpt */
+const { userTypes } = require('@src/constants/userTypes')
+
+const userTypeFilters = {
+ student: userTypes[0],
+ employee: userTypes[1],
+ docent_employee: userTypes[2],
+}
+
const createLdapFilterFromQuery = (query) => {
const filters = []
@@ -7,27 +15,31 @@ const createLdapFilterFromQuery = (query) => {
}
if (query.uid) {
- filters.push(`uid=${query.uid}`)
+ filters.push(`(uid=${query.uid})`)
}
if (query.cn) {
- filters.push(`cn=${query.cn}`)
+ filters.push(`(cn=${query.cn})`)
}
if (query.username) {
- filters.push(`uid=${query.username}`)
+ filters.push(`(uid=${query.username})`)
}
if (query.ci) {
- filters.push(`ci=${query.ci}`)
+ filters.push(`(ci=${query.ci})`)
}
if (query.email) {
- filters.push(`maildrop=${query.email}`)
+ filters.push(`(maildrop=${query.email})`)
+ }
+
+ if (query.userType && userTypeFilters[query.userType]) {
+ filters.push(`(userType=${userTypeFilters[query.userType]})`)
}
// Combine multiple filters using logical AND
- const ldapFilter = `(${filters.join('')})`
+ const ldapFilter = `${filters.join('')}`
return ldapFilter
}
From e68b75932f97a60fed2a4c42ad6cbf6072acd611 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 30 Aug 2023 18:44:46 -0400
Subject: [PATCH 053/229] refact convet query to filter helper
---
src/helpers/convertQueryToFilter.js | 47 ++++++++++++-----------------
1 file changed, 19 insertions(+), 28 deletions(-)
diff --git a/src/helpers/convertQueryToFilter.js b/src/helpers/convertQueryToFilter.js
index cc0f78b0..9865d29a 100644
--- a/src/helpers/convertQueryToFilter.js
+++ b/src/helpers/convertQueryToFilter.js
@@ -1,45 +1,36 @@
-/* thank you chatgpt */
const { userTypes } = require('@src/constants/userTypes')
+const attributeFilters = {
+ uid: (value) => `uid=${value}`,
+ cn: (value) => `cn=${value}`,
+ username: (value) => `uid=${value}`,
+ ci: (value) => `ci=${value}`,
+ email: (value) => `maildrop=${value}`,
+}
+
const userTypeFilters = {
student: userTypes[0],
- employee: userTypes[1],
- docent_employee: userTypes[2],
+ docent_employee: userTypes[1],
+ employee: userTypes[2],
}
const createLdapFilterFromQuery = (query) => {
const filters = []
- if (query && Object.keys(query).length === 2) {
- return ''
- }
-
- if (query.uid) {
- filters.push(`(uid=${query.uid})`)
- }
-
- if (query.cn) {
- filters.push(`(cn=${query.cn})`)
+ for (const key in query) {
+ if (attributeFilters[key] && query[key]) {
+ filters.push(`(${attributeFilters[key](query[key])})`)
+ } else if (key === 'userType' && userTypeFilters[query[key]]) {
+ filters.push(`(userType=${userTypeFilters[query[key]]})`)
+ }
}
- if (query.username) {
- filters.push(`(uid=${query.username})`)
- }
-
- if (query.ci) {
- filters.push(`(ci=${query.ci})`)
- }
-
- if (query.email) {
- filters.push(`(maildrop=${query.email})`)
- }
-
- if (query.userType && userTypeFilters[query.userType]) {
- filters.push(`(userType=${userTypeFilters[query.userType]})`)
+ if (filters.length === 0) {
+ return ''
}
// Combine multiple filters using logical AND
- const ldapFilter = `${filters.join('')}`
+ const ldapFilter = filters.join('')
return ldapFilter
}
From 5f1edb0d1769e54c28e7ff29585e7fb3ca8e5f96 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 30 Aug 2023 18:59:50 -0400
Subject: [PATCH 054/229] add query validator middleware
---
src/middlewares/queryValidator.js | 43 +++++++++++++++++++++++++++++++
src/routes/user.routes.js | 2 ++
2 files changed, 45 insertions(+)
create mode 100644 src/middlewares/queryValidator.js
diff --git a/src/middlewares/queryValidator.js b/src/middlewares/queryValidator.js
new file mode 100644
index 00000000..ee001d7a
--- /dev/null
+++ b/src/middlewares/queryValidator.js
@@ -0,0 +1,43 @@
+// queryValidator.js
+
+const { user_types_query } = require('@src/constants/userTypes')
+
+const isValidEmail = (email) => {
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
+ return emailRegex.test(email)
+}
+
+const isValidUsername = (username) => {
+ const usernameRegex = /^[a-z]+\.[a-z]+$/
+ return usernameRegex.test(username)
+}
+
+const validateUserType = (userType) => {
+ if (!!userType && !user_types_query.includes(userType)) {
+ throw new Error(
+ `Invalid userType, only "${user_types_query[0]}", "${user_types_query[1]}", and "${user_types_query[2]}" are allowed.`
+ )
+ }
+}
+
+const validateQuery = (query) => {
+ validateUserType(query.userType)
+
+ if (query.ci && !/^\d{8,10}$/.test(query.ci)) {
+ throw new Error('Invalid ci parameter')
+ }
+
+ if (query.email && !isValidEmail(query.email)) {
+ throw new Error('Invalid email parameter')
+ }
+
+ if (query.username && !isValidUsername(query.username)) {
+ throw new Error('Invalid username parameter')
+ }
+
+ // Add more validations as needed
+
+ return true
+}
+
+module.exports = validateQuery
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index bc183dbb..bc938c4c 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -8,6 +8,7 @@ const config = require('@src/config/config')
const {
createLdapFilterFromQuery,
} = require('@src/helpers/convertQueryToFilter')
+const validateQuery = require('@src/middlewares/queryValidator')
// Middleware for routes requiring checkAuth and checkRoles('admin')
router.use(checkAuth, checkRoles('admin'))
@@ -19,6 +20,7 @@ router.use(validateResponse)
router.get('/', async (req, res) => {
try {
const baseDN = `${config.ldap.base}`
+ const isValid = validateQuery(req.query)
const queryFilter = createLdapFilterFromQuery(req.query)
const ldapFilter = `(&(objectClass=person)${queryFilter})`
From 0bde674b4a30758ab1e431362d8c1834ae089151 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 30 Aug 2023 19:30:16 -0400
Subject: [PATCH 055/229] add query validation middleware to baseDN endpoint
---
src/routes/user.routes.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index bc938c4c..c4dc027a 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -54,6 +54,7 @@ router.get('/', async (req, res) => {
router.get('/group/:group', async (req, res) => {
try {
const baseDN = `ou=usuarios,ou=${req.params.group},${config.ldap.base}`
+ const isValid = validateQuery(req.query)
const queryFilter = createLdapFilterFromQuery(req.query)
const ldapFilter = `(&(objectClass=person)${queryFilter})`
@@ -96,6 +97,7 @@ router.post('/baseDN', async (req, res) => {
if (!baseDN) {
throw new Error('Value of the baseDN has not been sent correctly')
}
+ const isValid = validateQuery(req.query)
const queryFilter = createLdapFilterFromQuery(req.query)
const ldapFilter = `(&(objectClass=person)${queryFilter})`
From f0ab6321a08726795c1410d47c59913eb1420349 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 4 Sep 2023 10:25:24 -0400
Subject: [PATCH 056/229] add db connection error validation to logger midd
---
src/middlewares/logger.handler.js | 10 ++++++
src/middlewares/session.handler.js | 50 ++++++++++++++++--------------
2 files changed, 36 insertions(+), 24 deletions(-)
diff --git a/src/middlewares/logger.handler.js b/src/middlewares/logger.handler.js
index 7b8831bb..22c8d5ac 100644
--- a/src/middlewares/logger.handler.js
+++ b/src/middlewares/logger.handler.js
@@ -53,6 +53,16 @@ const addLoggerMiddleware = (app) => {
// Register the morgan middleware
app.use(morgan(logFormat))
+
+ // Add error connection handler
+ app.on('error', (err) => {
+ if (
+ err.name === 'ServerSelectionError' &&
+ err.message === 'connection timed out'
+ ) {
+ console.error('Error connecting to the database:', err.message)
+ }
+ })
} catch (error) {
console.error('Error connecting to the database:', error.message)
}
diff --git a/src/middlewares/session.handler.js b/src/middlewares/session.handler.js
index f5d2e4ce..f86e1266 100644
--- a/src/middlewares/session.handler.js
+++ b/src/middlewares/session.handler.js
@@ -3,31 +3,33 @@ const MongoStore = require('connect-mongo')
const CONFIG = require('../config/config')
const mongoose = require('mongoose')
-
//MONGODB configuration
mongoose.Promise = Promise
-const mongoClientPromise = mongoose
- .connect(CONFIG.mongodb.url, {
- user: CONFIG.mongodb.user,
- pass: CONFIG.mongodb.pass,
- authSource: 'admin',
- })
- .then((m) => m.connection.getClient())
- .catch((e)=>console.log(e))
+try {
+ const mongoClientPromise = mongoose
+ .connect(CONFIG.mongodb.url, {
+ user: CONFIG.mongodb.user,
+ pass: CONFIG.mongodb.pass,
+ authSource: 'admin',
+ })
+ .then((m) => m.connection.getClient())
-const sessionMiddleWare = session({
- secret: CONFIG.sessionSecret,
- store: MongoStore.create({
- clientPromise: mongoClientPromise,
- }),
- resave: true,
- saveUninitialized: true,
- unset: 'destroy',
- cookie: {
- httpOnly: false,
- maxAge: 1000 * 3600 * 24,
- secure: false, // this need to be false if https is not used. Otherwise, cookie will not be sent.
- },
-})
+ const sessionMiddleWare = session({
+ secret: CONFIG.sessionSecret,
+ store: MongoStore.create({
+ clientPromise: mongoClientPromise,
+ }),
+ resave: true,
+ saveUninitialized: true,
+ unset: 'destroy',
+ cookie: {
+ httpOnly: false,
+ maxAge: 1000 * 3600 * 24,
+ secure: false, // this need to be false if https is not used. Otherwise, cookie will not be sent.
+ },
+ })
-module.exports = sessionMiddleWare
+ module.exports = sessionMiddleWare
+} catch (e) {
+ throw new Error(e)
+}
From 2e364cc1f94abd6bbd1487131e7b0d74b929cff6 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 4 Sep 2023 10:26:13 -0400
Subject: [PATCH 057/229] add error on reauthentication in less than 15 min
---
src/modules/authentication/LdapAuth.js | 22 ++++++++++++++++++----
1 file changed, 18 insertions(+), 4 deletions(-)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 3e9aae9f..edc5e2f4 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -18,9 +18,7 @@ const {
} = require('../../helpers/dnHelper')
const { signToken } = require('../../utils/authentication/tokens/token_sign')
-const {
- responseSuccess,
-} = require('../../schemas/response.schema')
+const { responseSuccess } = require('../../schemas/response.schema')
const userService = UserServices()
const profileService = ProfileServices()
@@ -47,6 +45,20 @@ var _usernameAttributeName
* @param {string} [loginUrl] - path to login page. Default: /login
* @param {string} [logoutUrl] - path to logout page. Default: /logout
*/
+
+var sessionStore = new Map()
+
+function checkLastAuthentication(req, res, next) {
+ const userId = req.body.username
+ console.log('sessionStore', sessionStore)
+ console.log('userID', userId)
+ const lastAuthTimestamp = sessionStore.get(userId)
+ if (!lastAuthTimestamp || Date.now() - lastAuthTimestamp >= 15 * 60 * 1000) {
+ next()
+ } else {
+ res.status(401).json({ message: 'Logout first before re-authenticating.' })
+ }
+}
var init = function (
opt,
ldapurl,
@@ -165,7 +177,7 @@ var init = function (
router.use(passport.initialize())
router.use(passport.session())
// login
- router.post(_loginUrl, login)
+ router.post(_loginUrl, checkLastAuthentication, login)
}
/**
@@ -222,6 +234,8 @@ var login = function (req, res, next) {
const rootBaseDN = extractBaseFromDn(ldapDn)
const localBaseDN = user.dn.replace(`uid=${user.uid},`, '')
+ sessionStore.set(user.uid, Date.now())
+
const payload = {
sub: user.uid,
dn: user.dn,
From 7d464b149cba8b09ecf1d5cf1863c771afdddbe7 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 4 Sep 2023 10:38:00 -0400
Subject: [PATCH 058/229] change let declarations to const
---
src/modules/authentication/LdapAuth.js | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index edc5e2f4..ce66f960 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -46,12 +46,10 @@ var _usernameAttributeName
* @param {string} [logoutUrl] - path to logout page. Default: /logout
*/
-var sessionStore = new Map()
+const sessionStore = new Map()
function checkLastAuthentication(req, res, next) {
const userId = req.body.username
- console.log('sessionStore', sessionStore)
- console.log('userID', userId)
const lastAuthTimestamp = sessionStore.get(userId)
if (!lastAuthTimestamp || Date.now() - lastAuthTimestamp >= 15 * 60 * 1000) {
next()
@@ -89,16 +87,16 @@ var init = function (
if (!req.body.username || !req.body.password) {
throw new Error('username and password must be both provided')
}
- let username = req.body.username
- let password = req.body.password
- let res = await userService.getByUsername(username)
+ const username = req.body.username
+ const password = req.body.password
+ const res = await userService.getByUsername(username)
const response = res[0]
// if user doesn't exists
if (response === undefined) {
throw new Error('username or password incorrect')
}
- let options
+ let options = {}
if (_backwardCompatible) {
_usernameAttributeName = 'uid'
options = {
@@ -137,7 +135,7 @@ var init = function (
}
}
// ldap authenticate the user
- let user = await authenticate(options)
+ const user = await authenticate(options)
// success
done(null, user)
} catch (error) {
@@ -190,7 +188,7 @@ var init = function (
* @param {string} [loginUrl] - path to login page. Default: /login
* @param {string} [logoutUrl] - path to logout page. Default: /logout
*/
-var initialize = function (
+const initialize = function (
opt,
router,
findFunc,
@@ -205,7 +203,7 @@ var initialize = function (
* Customized login authentication handler to send {success: true}
* on successful authenticate, or {success: false} on failed authenticate
*/
-var login = function (req, res, next) {
+const login = function (req, res, next) {
passport.authenticate(
'ldap',
{
From 3f2225a966fede09092cc9dcdf13e0e1b87f864c Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 6 Sep 2023 11:01:30 -0400
Subject: [PATCH 059/229] add redis client
---
package-lock.json | 146 ++++++++++++++++++++++++++++++++
package.json | 9 +-
src/config/config.js | 4 +
src/connections/redis_client.js | 41 +++++++++
4 files changed, 196 insertions(+), 4 deletions(-)
create mode 100644 src/connections/redis_client.js
diff --git a/package-lock.json b/package-lock.json
index d2b9fe40..63ca48aa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -41,6 +41,7 @@
"passport": "^0.6.0",
"passport-custom": "^1.1.1",
"passport-jwt": "^4.0.1",
+ "redis": "^4.6.8",
"simple-ldap-search": "^3.1.2",
"simple-statistics": "^7.8.3",
"socket.io": "^4.6.1",
@@ -1257,6 +1258,59 @@
"resolved": "https://registry.npmjs.org/@ldapjs/protocol/-/protocol-1.2.1.tgz",
"integrity": "sha512-O89xFDLW2gBoZWNXuXpBSM32/KealKCTb3JGtJdtUQc7RjAk8XzrRgyz02cPAwGKwKPxy0ivuC7UP9bmN87egQ=="
},
+ "node_modules/@redis/bloom": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz",
+ "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==",
+ "peerDependencies": {
+ "@redis/client": "^1.0.0"
+ }
+ },
+ "node_modules/@redis/client": {
+ "version": "1.5.9",
+ "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.9.tgz",
+ "integrity": "sha512-SffgN+P1zdWJWSXBvJeynvEnmnZrYmtKSRW00xl8pOPFOMJjxRR9u0frSxJpPR6Y4V+k54blJjGW7FgxbTI7bQ==",
+ "dependencies": {
+ "cluster-key-slot": "1.1.2",
+ "generic-pool": "3.9.0",
+ "yallist": "4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@redis/graph": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz",
+ "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==",
+ "peerDependencies": {
+ "@redis/client": "^1.0.0"
+ }
+ },
+ "node_modules/@redis/json": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz",
+ "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==",
+ "peerDependencies": {
+ "@redis/client": "^1.0.0"
+ }
+ },
+ "node_modules/@redis/search": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.3.tgz",
+ "integrity": "sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==",
+ "peerDependencies": {
+ "@redis/client": "^1.0.0"
+ }
+ },
+ "node_modules/@redis/time-series": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.5.tgz",
+ "integrity": "sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==",
+ "peerDependencies": {
+ "@redis/client": "^1.0.0"
+ }
+ },
"node_modules/@sinclair/typebox": {
"version": "0.25.24",
"resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz",
@@ -2159,6 +2213,14 @@
"node": "*"
}
},
+ "node_modules/cluster-key-slot": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz",
+ "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -3563,6 +3625,14 @@
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
+ "node_modules/generic-pool": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz",
+ "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -6285,6 +6355,19 @@
"node": ">=8.10.0"
}
},
+ "node_modules/redis": {
+ "version": "4.6.8",
+ "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.8.tgz",
+ "integrity": "sha512-S7qNkPUYrsofQ0ztWlTHSaK0Qqfl1y+WMIxrzeAGNG+9iUZB4HGeBgkHxE6uJJ6iXrkvLd1RVJ2nvu6H1sAzfQ==",
+ "dependencies": {
+ "@redis/bloom": "1.2.0",
+ "@redis/client": "1.5.9",
+ "@redis/graph": "1.1.0",
+ "@redis/json": "1.0.4",
+ "@redis/search": "1.1.3",
+ "@redis/time-series": "1.0.5"
+ }
+ },
"node_modules/require-at": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz",
@@ -8712,6 +8795,46 @@
"resolved": "https://registry.npmjs.org/@ldapjs/protocol/-/protocol-1.2.1.tgz",
"integrity": "sha512-O89xFDLW2gBoZWNXuXpBSM32/KealKCTb3JGtJdtUQc7RjAk8XzrRgyz02cPAwGKwKPxy0ivuC7UP9bmN87egQ=="
},
+ "@redis/bloom": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz",
+ "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==",
+ "requires": {}
+ },
+ "@redis/client": {
+ "version": "1.5.9",
+ "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.9.tgz",
+ "integrity": "sha512-SffgN+P1zdWJWSXBvJeynvEnmnZrYmtKSRW00xl8pOPFOMJjxRR9u0frSxJpPR6Y4V+k54blJjGW7FgxbTI7bQ==",
+ "requires": {
+ "cluster-key-slot": "1.1.2",
+ "generic-pool": "3.9.0",
+ "yallist": "4.0.0"
+ }
+ },
+ "@redis/graph": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz",
+ "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==",
+ "requires": {}
+ },
+ "@redis/json": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz",
+ "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==",
+ "requires": {}
+ },
+ "@redis/search": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.3.tgz",
+ "integrity": "sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==",
+ "requires": {}
+ },
+ "@redis/time-series": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.5.tgz",
+ "integrity": "sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==",
+ "requires": {}
+ },
"@sinclair/typebox": {
"version": "0.25.24",
"resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz",
@@ -9416,6 +9539,11 @@
"mkdirp": ">= 0.0.1"
}
},
+ "cluster-key-slot": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz",
+ "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="
+ },
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -10494,6 +10622,11 @@
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
+ "generic-pool": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz",
+ "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g=="
+ },
"gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -12591,6 +12724,19 @@
"picomatch": "^2.2.1"
}
},
+ "redis": {
+ "version": "4.6.8",
+ "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.8.tgz",
+ "integrity": "sha512-S7qNkPUYrsofQ0ztWlTHSaK0Qqfl1y+WMIxrzeAGNG+9iUZB4HGeBgkHxE6uJJ6iXrkvLd1RVJ2nvu6H1sAzfQ==",
+ "requires": {
+ "@redis/bloom": "1.2.0",
+ "@redis/client": "1.5.9",
+ "@redis/graph": "1.1.0",
+ "@redis/json": "1.0.4",
+ "@redis/search": "1.1.3",
+ "@redis/time-series": "1.0.5"
+ }
+ },
"require-at": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz",
diff --git a/package.json b/package.json
index 6da63b5a..20512497 100644
--- a/package.json
+++ b/package.json
@@ -48,6 +48,7 @@
"passport": "^0.6.0",
"passport-custom": "^1.1.1",
"passport-jwt": "^4.0.1",
+ "redis": "^4.6.8",
"simple-ldap-search": "^3.1.2",
"simple-statistics": "^7.8.3",
"socket.io": "^4.6.1",
@@ -75,9 +76,9 @@
"dev": "nodemon index.js"
},
"_moduleAliases": {
- "@root" : ".",
- "@deep" : "src/some/very/deep/directory/or/file",
- "@src" : "src",
- "something" : "src/foo"
+ "@root": ".",
+ "@deep": "src/some/very/deep/directory/or/file",
+ "@src": "src",
+ "something": "src/foo"
}
}
diff --git a/src/config/config.js b/src/config/config.js
index 62146caf..70396bf7 100644
--- a/src/config/config.js
+++ b/src/config/config.js
@@ -27,4 +27,8 @@ module.exports = {
sizeLimit: parseInt(process.env.LDAP_SIZE_LIMIT),
timeLimit: parseInt(process.env.LDAP_TIME_LIMIT),
},
+ redis: {
+ host: process.env.REDIS_HOST,
+ port: process.env.REDIS_PORT,
+ },
}
diff --git a/src/connections/redis_client.js b/src/connections/redis_client.js
new file mode 100644
index 00000000..6560ac97
--- /dev/null
+++ b/src/connections/redis_client.js
@@ -0,0 +1,41 @@
+const redis = require('redis')
+const config = require('@src/config/config')
+
+// Create a Redis client
+const client = redis.createClient({
+ host: config.redis.host, // Docker Desktop container runs on localhost
+ port: parseInt(config.redis.port), // Default Redis port
+})
+
+// Test the connection
+client.on('connect', () => {
+ console.log('Connected to Redis server')
+})
+
+// Handle errors
+client.on('error', (err) => {
+ console.error('Redis Error:', err)
+})
+
+// Example: Set a key-value pair
+/* client.set('myKey', 'myValue', (err, reply) => {
+ if (err) {
+ console.error('Redis Set Error:', err)
+ } else {
+ console.log('Set result:', reply)
+ }
+})
+
+// Example: Get a value by key
+client.get('myKey', (err, reply) => {
+ if (err) {
+ console.error('Redis Get Error:', err)
+ } else {
+ console.log('Get result:', reply)
+ }
+}) */
+
+// Close the Redis connection (when needed)
+// client.quit();
+
+module.exports = { client }
From 7a7c849c30dbfb857673e25050de3a18b43fba3f Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 6 Sep 2023 15:30:24 -0400
Subject: [PATCH 060/229] update method added
---
src/helpers/ldapUtils.js | 33 +++++++++++++++++++++++++++++++++
src/routes/user.routes.js | 22 ++++++++++++++++++++++
src/services/user.services.js | 21 +++++++++++++++++++--
3 files changed, 74 insertions(+), 2 deletions(-)
diff --git a/src/helpers/ldapUtils.js b/src/helpers/ldapUtils.js
index 3d6ac46a..7679d098 100644
--- a/src/helpers/ldapUtils.js
+++ b/src/helpers/ldapUtils.js
@@ -1,5 +1,7 @@
+const ldap = require('ldapjs')
const ldapClient = require('@src/connections/LDAP_client')
const config = require('@src/config/config')
+var assert = require('assert')
// Bind to the LDAP server using appropriate credentials
const bindLdapClient = () => {
@@ -40,6 +42,7 @@ const transform = (entry) => {
// Perform a search using the provided filter and return the results
const performLdapSearch = async (baseDn, filter, attributes) => {
+ console.log('filter', filter)
return new Promise((resolve, reject) => {
try {
bindLdapClient() // Bind before search
@@ -73,7 +76,37 @@ const performLdapSearch = async (baseDn, filter, attributes) => {
})
}
+const performLdapUpdate = async (userDN, att, value) => {
+ console.log('userDN', userDN)
+ return new Promise((resolve, reject) => {
+ try {
+ bindLdapClient() // Bind before search
+
+ const change = new ldap.Change({
+ operation: 'replace',
+ modification: {
+ type: att,
+ values: [value],
+ },
+ })
+
+ ldapClient.modify(userDN, change, (err) => {
+ if (err) {
+ console.log('error', err)
+ assert.ifError(err)
+ } else {
+ console.log('updated user')
+ resolve('updated User')
+ }
+ })
+ } catch (err) {
+ reject(err)
+ }
+ })
+}
+
module.exports = {
performLdapSearch,
unbindLdapClient,
+ performLdapUpdate,
}
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index c4dc027a..461d8037 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -127,4 +127,26 @@ router.post('/baseDN', async (req, res) => {
}
})
+router.put('/:username', async (req, res) => {
+ try {
+ const { att, value } = req.body
+ const username = req.params.username
+
+ const updatedUser = await service.updateUser(username, att, value)
+
+ // Send the search results
+ res.json({
+ success: true,
+ message: 'User updated correctly',
+ data: updatedUser,
+ })
+ } catch (error) {
+ res.status(500).json({
+ success: false,
+ message: 'Error updating users',
+ error: error.message,
+ })
+ }
+})
+
module.exports = router
diff --git a/src/services/user.services.js b/src/services/user.services.js
index 940182c0..49a151a3 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -1,6 +1,9 @@
require('dotenv').config({ path: __dirname + '/../../.env' })
const config = require('@src/config/config')
-const { performLdapSearch } = require('@src/helpers/ldapUtils')
+const {
+ performLdapSearch,
+ performLdapUpdate,
+} = require('@src/helpers/ldapUtils')
const UserServices = () => {
const handleFilteredSearch = async (
@@ -32,14 +35,28 @@ const UserServices = () => {
const getByUsername = async (username) => {
const results = await performLdapSearch(
config.ldap.base,
- `(uid=${username})`
+ `(uid=${username})`,
+ null
)
return results
}
+ const updateUser = async (username, att, value) => {
+ const results = await performLdapSearch(
+ config.ldap.base,
+ `(uid=${username})`,
+ []
+ )
+ const user = results[0]
+
+ const updatedUser = await performLdapUpdate(user.dn, att, value)
+ return updatedUser
+ }
+
return {
getByUsername,
handleFilteredSearch,
+ updateUser,
}
}
From d3e816b1162e71725a784544266453c44cd5dcd1 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 6 Sep 2023 15:31:40 -0400
Subject: [PATCH 061/229] heckLastAuthentication commented
---
src/modules/authentication/LdapAuth.js | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index ce66f960..50784306 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -49,13 +49,14 @@ var _usernameAttributeName
const sessionStore = new Map()
function checkLastAuthentication(req, res, next) {
- const userId = req.body.username
+ /* const userId = req.body.username
const lastAuthTimestamp = sessionStore.get(userId)
if (!lastAuthTimestamp || Date.now() - lastAuthTimestamp >= 15 * 60 * 1000) {
next()
} else {
res.status(401).json({ message: 'Logout first before re-authenticating.' })
- }
+ } */
+ next()
}
var init = function (
opt,
From 94cd3521818f8e7e16c6000c8f005ef0072fa646 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 6 Sep 2023 17:31:25 -0400
Subject: [PATCH 062/229] redis test connection passed
---
package-lock.json | 2301 ++++++++++++-----------
package.json | 4 +-
src/connections/__tests__/redis.test.js | 29 +
3 files changed, 1244 insertions(+), 1090 deletions(-)
create mode 100644 src/connections/__tests__/redis.test.js
diff --git a/package-lock.json b/package-lock.json
index 63ca48aa..69abebc3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -41,7 +41,7 @@
"passport": "^0.6.0",
"passport-custom": "^1.1.1",
"passport-jwt": "^4.0.1",
- "redis": "^4.6.8",
+ "redis-om": "^0.4.2",
"simple-ldap-search": "^3.1.2",
"simple-statistics": "^7.8.3",
"socket.io": "^4.6.1",
@@ -53,7 +53,7 @@
"express": "^4.18.1",
"express-session": "^1.17.3",
"jasmine": "^4.3.0",
- "jest": "^29.5.0",
+ "jest": "^29.6.4",
"jsdom": "^21.1.1",
"jsdom-global": "^3.0.2",
"module-alias": "^2.2.3",
@@ -64,12 +64,12 @@
}
},
"node_modules/@ampproject/remapping": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
- "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+ "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
"dev": true,
"dependencies": {
- "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9"
},
"engines": {
@@ -161,35 +161,35 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.21.0",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz",
- "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==",
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz",
+ "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.21.3",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz",
- "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz",
+ "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==",
"dev": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.21.3",
- "@babel/helper-compilation-targets": "^7.20.7",
- "@babel/helper-module-transforms": "^7.21.2",
- "@babel/helpers": "^7.21.0",
- "@babel/parser": "^7.21.3",
- "@babel/template": "^7.20.7",
- "@babel/traverse": "^7.21.3",
- "@babel/types": "^7.21.3",
+ "@babel/code-frame": "^7.22.13",
+ "@babel/generator": "^7.22.15",
+ "@babel/helper-compilation-targets": "^7.22.15",
+ "@babel/helper-module-transforms": "^7.22.15",
+ "@babel/helpers": "^7.22.15",
+ "@babel/parser": "^7.22.15",
+ "@babel/template": "^7.22.15",
+ "@babel/traverse": "^7.22.15",
+ "@babel/types": "^7.22.15",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
- "json5": "^2.2.2",
- "semver": "^6.3.0"
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
},
"engines": {
"node": ">=6.9.0"
@@ -229,21 +229,21 @@
"dev": true
},
"node_modules/@babel/core/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/generator": {
- "version": "7.22.10",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz",
- "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz",
+ "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.22.10",
+ "@babel/types": "^7.22.15",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
@@ -252,37 +252,20 @@
"node": ">=6.9.0"
}
},
- "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
- "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
- "dev": true,
- "dependencies": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/@babel/helper-compilation-targets": {
- "version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
- "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz",
+ "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==",
"dev": true,
"dependencies": {
- "@babel/compat-data": "^7.20.5",
- "@babel/helper-validator-option": "^7.18.6",
- "browserslist": "^4.21.3",
+ "@babel/compat-data": "^7.22.9",
+ "@babel/helper-validator-option": "^7.22.15",
+ "browserslist": "^4.21.9",
"lru-cache": "^5.1.1",
- "semver": "^6.3.0"
+ "semver": "^6.3.1"
},
"engines": {
"node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
@@ -295,9 +278,9 @@
}
},
"node_modules/@babel/helper-compilation-targets/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
@@ -344,52 +327,52 @@
}
},
"node_modules/@babel/helper-module-imports": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
- "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
+ "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.18.6"
+ "@babel/types": "^7.22.15"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.21.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz",
- "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz",
+ "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==",
"dev": true,
"dependencies": {
- "@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-module-imports": "^7.18.6",
- "@babel/helper-simple-access": "^7.20.2",
- "@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/helper-validator-identifier": "^7.19.1",
- "@babel/template": "^7.20.7",
- "@babel/traverse": "^7.21.2",
- "@babel/types": "^7.21.2"
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-module-imports": "^7.22.15",
+ "@babel/helper-simple-access": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/helper-validator-identifier": "^7.22.15"
},
"engines": {
"node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-plugin-utils": {
- "version": "7.20.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
- "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
+ "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-simple-access": {
- "version": "7.20.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
- "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+ "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.20.2"
+ "@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
@@ -417,32 +400,32 @@
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
- "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz",
+ "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option": {
- "version": "7.21.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
- "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz",
+ "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
- "version": "7.21.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz",
- "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz",
+ "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==",
"dev": true,
"dependencies": {
- "@babel/template": "^7.20.7",
- "@babel/traverse": "^7.21.0",
- "@babel/types": "^7.21.0"
+ "@babel/template": "^7.22.15",
+ "@babel/traverse": "^7.22.15",
+ "@babel/types": "^7.22.15"
},
"engines": {
"node": ">=6.9.0"
@@ -534,9 +517,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.22.13",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.13.tgz",
- "integrity": "sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz",
+ "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@@ -606,12 +589,12 @@
}
},
"node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz",
- "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz",
+ "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.18.6"
+ "@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
@@ -708,12 +691,12 @@
}
},
"node_modules/@babel/plugin-syntax-typescript": {
- "version": "7.20.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz",
- "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz",
+ "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.19.0"
+ "@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
@@ -723,33 +706,33 @@
}
},
"node_modules/@babel/template": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz",
- "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
+ "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
"dev": true,
"dependencies": {
- "@babel/code-frame": "^7.22.5",
- "@babel/parser": "^7.22.5",
- "@babel/types": "^7.22.5"
+ "@babel/code-frame": "^7.22.13",
+ "@babel/parser": "^7.22.15",
+ "@babel/types": "^7.22.15"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.22.11",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz",
- "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz",
+ "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==",
"dev": true,
"dependencies": {
- "@babel/code-frame": "^7.22.10",
- "@babel/generator": "^7.22.10",
+ "@babel/code-frame": "^7.22.13",
+ "@babel/generator": "^7.22.15",
"@babel/helper-environment-visitor": "^7.22.5",
"@babel/helper-function-name": "^7.22.5",
"@babel/helper-hoist-variables": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/parser": "^7.22.11",
- "@babel/types": "^7.22.11",
+ "@babel/parser": "^7.22.15",
+ "@babel/types": "^7.22.15",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
@@ -781,13 +764,13 @@
"dev": true
},
"node_modules/@babel/types": {
- "version": "7.22.11",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz",
- "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz",
+ "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==",
"dev": true,
"dependencies": {
"@babel/helper-string-parser": "^7.22.5",
- "@babel/helper-validator-identifier": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.15",
"to-fast-properties": "^2.0.0"
},
"engines": {
@@ -857,16 +840,16 @@
}
},
"node_modules/@jest/console": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz",
- "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz",
+ "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==",
"dev": true,
"dependencies": {
- "@jest/types": "^29.5.0",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
"chalk": "^4.0.0",
- "jest-message-util": "^29.5.0",
- "jest-util": "^29.5.0",
+ "jest-message-util": "^29.6.3",
+ "jest-util": "^29.6.3",
"slash": "^3.0.0"
},
"engines": {
@@ -874,37 +857,37 @@
}
},
"node_modules/@jest/core": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz",
- "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz",
+ "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==",
"dev": true,
"dependencies": {
- "@jest/console": "^29.5.0",
- "@jest/reporters": "^29.5.0",
- "@jest/test-result": "^29.5.0",
- "@jest/transform": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/console": "^29.6.4",
+ "@jest/reporters": "^29.6.4",
+ "@jest/test-result": "^29.6.4",
+ "@jest/transform": "^29.6.4",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
"ansi-escapes": "^4.2.1",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
"exit": "^0.1.2",
"graceful-fs": "^4.2.9",
- "jest-changed-files": "^29.5.0",
- "jest-config": "^29.5.0",
- "jest-haste-map": "^29.5.0",
- "jest-message-util": "^29.5.0",
- "jest-regex-util": "^29.4.3",
- "jest-resolve": "^29.5.0",
- "jest-resolve-dependencies": "^29.5.0",
- "jest-runner": "^29.5.0",
- "jest-runtime": "^29.5.0",
- "jest-snapshot": "^29.5.0",
- "jest-util": "^29.5.0",
- "jest-validate": "^29.5.0",
- "jest-watcher": "^29.5.0",
+ "jest-changed-files": "^29.6.3",
+ "jest-config": "^29.6.4",
+ "jest-haste-map": "^29.6.4",
+ "jest-message-util": "^29.6.3",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.6.4",
+ "jest-resolve-dependencies": "^29.6.4",
+ "jest-runner": "^29.6.4",
+ "jest-runtime": "^29.6.4",
+ "jest-snapshot": "^29.6.4",
+ "jest-util": "^29.6.3",
+ "jest-validate": "^29.6.3",
+ "jest-watcher": "^29.6.4",
"micromatch": "^4.0.4",
- "pretty-format": "^29.5.0",
+ "pretty-format": "^29.6.3",
"slash": "^3.0.0",
"strip-ansi": "^6.0.0"
},
@@ -921,89 +904,89 @@
}
},
"node_modules/@jest/environment": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz",
- "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz",
+ "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==",
"dev": true,
"dependencies": {
- "@jest/fake-timers": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/fake-timers": "^29.6.4",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
- "jest-mock": "^29.5.0"
+ "jest-mock": "^29.6.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/expect": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz",
- "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz",
+ "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==",
"dev": true,
"dependencies": {
- "expect": "^29.5.0",
- "jest-snapshot": "^29.5.0"
+ "expect": "^29.6.4",
+ "jest-snapshot": "^29.6.4"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/expect-utils": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz",
- "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz",
+ "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==",
"dev": true,
"dependencies": {
- "jest-get-type": "^29.4.3"
+ "jest-get-type": "^29.6.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/fake-timers": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz",
- "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz",
+ "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==",
"dev": true,
"dependencies": {
- "@jest/types": "^29.5.0",
+ "@jest/types": "^29.6.3",
"@sinonjs/fake-timers": "^10.0.2",
"@types/node": "*",
- "jest-message-util": "^29.5.0",
- "jest-mock": "^29.5.0",
- "jest-util": "^29.5.0"
+ "jest-message-util": "^29.6.3",
+ "jest-mock": "^29.6.3",
+ "jest-util": "^29.6.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/globals": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz",
- "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz",
+ "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==",
"dev": true,
"dependencies": {
- "@jest/environment": "^29.5.0",
- "@jest/expect": "^29.5.0",
- "@jest/types": "^29.5.0",
- "jest-mock": "^29.5.0"
+ "@jest/environment": "^29.6.4",
+ "@jest/expect": "^29.6.4",
+ "@jest/types": "^29.6.3",
+ "jest-mock": "^29.6.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/reporters": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz",
- "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz",
+ "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==",
"dev": true,
"dependencies": {
"@bcoe/v8-coverage": "^0.2.3",
- "@jest/console": "^29.5.0",
- "@jest/test-result": "^29.5.0",
- "@jest/transform": "^29.5.0",
- "@jest/types": "^29.5.0",
- "@jridgewell/trace-mapping": "^0.3.15",
+ "@jest/console": "^29.6.4",
+ "@jest/test-result": "^29.6.4",
+ "@jest/transform": "^29.6.4",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
"@types/node": "*",
"chalk": "^4.0.0",
"collect-v8-coverage": "^1.0.0",
@@ -1011,13 +994,13 @@
"glob": "^7.1.3",
"graceful-fs": "^4.2.9",
"istanbul-lib-coverage": "^3.0.0",
- "istanbul-lib-instrument": "^5.1.0",
+ "istanbul-lib-instrument": "^6.0.0",
"istanbul-lib-report": "^3.0.0",
"istanbul-lib-source-maps": "^4.0.0",
"istanbul-reports": "^3.1.3",
- "jest-message-util": "^29.5.0",
- "jest-util": "^29.5.0",
- "jest-worker": "^29.5.0",
+ "jest-message-util": "^29.6.3",
+ "jest-util": "^29.6.3",
+ "jest-worker": "^29.6.4",
"slash": "^3.0.0",
"string-length": "^4.0.1",
"strip-ansi": "^6.0.0",
@@ -1036,24 +1019,24 @@
}
},
"node_modules/@jest/schemas": {
- "version": "29.4.3",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz",
- "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
"dev": true,
"dependencies": {
- "@sinclair/typebox": "^0.25.16"
+ "@sinclair/typebox": "^0.27.8"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/source-map": {
- "version": "29.4.3",
- "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz",
- "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
+ "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
"dev": true,
"dependencies": {
- "@jridgewell/trace-mapping": "^0.3.15",
+ "@jridgewell/trace-mapping": "^0.3.18",
"callsites": "^3.0.0",
"graceful-fs": "^4.2.9"
},
@@ -1062,13 +1045,13 @@
}
},
"node_modules/@jest/test-result": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz",
- "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz",
+ "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==",
"dev": true,
"dependencies": {
- "@jest/console": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/console": "^29.6.4",
+ "@jest/types": "^29.6.3",
"@types/istanbul-lib-coverage": "^2.0.0",
"collect-v8-coverage": "^1.0.0"
},
@@ -1077,14 +1060,14 @@
}
},
"node_modules/@jest/test-sequencer": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz",
- "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz",
+ "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==",
"dev": true,
"dependencies": {
- "@jest/test-result": "^29.5.0",
+ "@jest/test-result": "^29.6.4",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.5.0",
+ "jest-haste-map": "^29.6.4",
"slash": "^3.0.0"
},
"engines": {
@@ -1092,22 +1075,22 @@
}
},
"node_modules/@jest/transform": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz",
- "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz",
+ "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==",
"dev": true,
"dependencies": {
"@babel/core": "^7.11.6",
- "@jest/types": "^29.5.0",
- "@jridgewell/trace-mapping": "^0.3.15",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
"babel-plugin-istanbul": "^6.1.1",
"chalk": "^4.0.0",
"convert-source-map": "^2.0.0",
"fast-json-stable-stringify": "^2.1.0",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.5.0",
- "jest-regex-util": "^29.4.3",
- "jest-util": "^29.5.0",
+ "jest-haste-map": "^29.6.4",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.6.3",
"micromatch": "^4.0.4",
"pirates": "^4.0.4",
"slash": "^3.0.0",
@@ -1118,12 +1101,12 @@
}
},
"node_modules/@jest/types": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz",
- "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
"dev": true,
"dependencies": {
- "@jest/schemas": "^29.4.3",
+ "@jest/schemas": "^29.6.3",
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
"@types/node": "*",
@@ -1135,22 +1118,23 @@
}
},
"node_modules/@jridgewell/gen-mapping": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
- "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
"dev": true,
"dependencies": {
- "@jridgewell/set-array": "^1.0.0",
- "@jridgewell/sourcemap-codec": "^1.4.10"
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
"dev": true,
"engines": {
"node": ">=6.0.0"
@@ -1166,19 +1150,19 @@
}
},
"node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
"dev": true
},
"node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.17",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
- "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+ "version": "0.3.19",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
+ "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
"dev": true,
"dependencies": {
- "@jridgewell/resolve-uri": "3.1.0",
- "@jridgewell/sourcemap-codec": "1.4.14"
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@ldapjs/asn1": {
@@ -1312,27 +1296,27 @@
}
},
"node_modules/@sinclair/typebox": {
- "version": "0.25.24",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz",
- "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==",
+ "version": "0.27.8",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
"dev": true
},
"node_modules/@sinonjs/commons": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
- "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz",
+ "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==",
"dev": true,
"dependencies": {
"type-detect": "4.0.8"
}
},
"node_modules/@sinonjs/fake-timers": {
- "version": "10.0.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz",
- "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==",
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
"dev": true,
"dependencies": {
- "@sinonjs/commons": "^2.0.0"
+ "@sinonjs/commons": "^3.0.0"
}
},
"node_modules/@socket.io/component-emitter": {
@@ -1350,9 +1334,9 @@
}
},
"node_modules/@types/babel__core": {
- "version": "7.20.0",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz",
- "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==",
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz",
+ "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==",
"dev": true,
"dependencies": {
"@babel/parser": "^7.20.7",
@@ -1382,12 +1366,12 @@
}
},
"node_modules/@types/babel__traverse": {
- "version": "7.18.3",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz",
- "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==",
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz",
+ "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.3.0"
+ "@babel/types": "^7.20.7"
}
},
"node_modules/@types/cookie": {
@@ -1441,12 +1425,6 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.28.tgz",
"integrity": "sha512-UYmIeBnB0On70dN1iGCinsL1qH5JmIEJwa+3KX0Xw4HQJ8KA16ULlyTCNmnzfyzj/BlxZKmZLqp4TYdssnov1w=="
},
- "node_modules/@types/prettier": {
- "version": "2.7.2",
- "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
- "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==",
- "dev": true
- },
"node_modules/@types/stack-utils": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
@@ -1475,9 +1453,9 @@
}
},
"node_modules/@types/yargs": {
- "version": "17.0.23",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.23.tgz",
- "integrity": "sha512-yuogunc04OnzGQCrfHx+Kk883Q4X0aSwmYZhKjI21m+SVYzjIbrWl8dOOwSv5hf2Um2pdCOXWo9isteZTNXUZQ==",
+ "version": "17.0.24",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz",
+ "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==",
"dev": true,
"dependencies": {
"@types/yargs-parser": "*"
@@ -1720,15 +1698,15 @@
}
},
"node_modules/babel-jest": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz",
- "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz",
+ "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==",
"dev": true,
"dependencies": {
- "@jest/transform": "^29.5.0",
+ "@jest/transform": "^29.6.4",
"@types/babel__core": "^7.1.14",
"babel-plugin-istanbul": "^6.1.1",
- "babel-preset-jest": "^29.5.0",
+ "babel-preset-jest": "^29.6.3",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
"slash": "^3.0.0"
@@ -1756,10 +1734,35 @@
"node": ">=8"
}
},
+ "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-istanbul/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
"node_modules/babel-plugin-jest-hoist": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz",
- "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
+ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
"dev": true,
"dependencies": {
"@babel/template": "^7.3.3",
@@ -1795,12 +1798,12 @@
}
},
"node_modules/babel-preset-jest": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz",
- "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
+ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
"dev": true,
"dependencies": {
- "babel-plugin-jest-hoist": "^29.5.0",
+ "babel-plugin-jest-hoist": "^29.6.3",
"babel-preset-current-node-syntax": "^1.0.0"
},
"engines": {
@@ -1959,9 +1962,9 @@
}
},
"node_modules/browserslist": {
- "version": "4.21.5",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
- "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
+ "version": "4.21.10",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz",
+ "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==",
"dev": true,
"funding": [
{
@@ -1971,13 +1974,17 @@
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
}
],
"dependencies": {
- "caniuse-lite": "^1.0.30001449",
- "electron-to-chromium": "^1.4.284",
- "node-releases": "^2.0.8",
- "update-browserslist-db": "^1.0.10"
+ "caniuse-lite": "^1.0.30001517",
+ "electron-to-chromium": "^1.4.477",
+ "node-releases": "^2.0.13",
+ "update-browserslist-db": "^1.0.11"
},
"bin": {
"browserslist": "cli.js"
@@ -2091,9 +2098,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001470",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001470.tgz",
- "integrity": "sha512-065uNwY6QtHCBOExzbV6m236DDhYCCtPmQUCoQtwkVqzud8v5QPidoMr6CoMkC2nfp6nksjttqWQRRh75LqUmA==",
+ "version": "1.0.30001527",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz",
+ "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==",
"dev": true,
"funding": [
{
@@ -2103,6 +2110,10 @@
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
}
]
},
@@ -2174,9 +2185,9 @@
}
},
"node_modules/cjs-module-lexer": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
- "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz",
+ "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==",
"dev": true
},
"node_modules/cliui": {
@@ -2232,9 +2243,9 @@
}
},
"node_modules/collect-v8-coverage": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
- "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
+ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
"dev": true
},
"node_modules/color": {
@@ -2597,10 +2608,18 @@
"dev": true
},
"node_modules/dedent": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
- "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
- "dev": true
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz",
+ "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==",
+ "dev": true,
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
},
"node_modules/deep-is": {
"version": "0.1.4",
@@ -2671,9 +2690,9 @@
}
},
"node_modules/diff-sequences": {
- "version": "29.4.3",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz",
- "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
"dev": true,
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -2722,9 +2741,9 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"node_modules/electron-to-chromium": {
- "version": "1.4.340",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.340.tgz",
- "integrity": "sha512-zx8hqumOqltKsv/MF50yvdAlPF9S/4PXbyfzJS6ZGhbddGkRegdwImmfSVqCkEziYzrIGZ/TlrzBND4FysfkDg==",
+ "version": "1.4.508",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz",
+ "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==",
"dev": true
},
"node_modules/emittery": {
@@ -3086,16 +3105,16 @@
}
},
"node_modules/expect": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz",
- "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz",
+ "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==",
"dev": true,
"dependencies": {
- "@jest/expect-utils": "^29.5.0",
- "jest-get-type": "^29.4.3",
- "jest-matcher-utils": "^29.5.0",
- "jest-message-util": "^29.5.0",
- "jest-util": "^29.5.0"
+ "@jest/expect-utils": "^29.6.4",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.6.4",
+ "jest-message-util": "^29.6.3",
+ "jest-util": "^29.6.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -4080,9 +4099,9 @@
}
},
"node_modules/is-core-module": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
- "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+ "version": "2.13.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
+ "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
"dev": true,
"dependencies": {
"has": "^1.0.3"
@@ -4188,42 +4207,48 @@
}
},
"node_modules/istanbul-lib-instrument": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
- "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz",
+ "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==",
"dev": true,
"dependencies": {
"@babel/core": "^7.12.3",
"@babel/parser": "^7.14.7",
"@istanbuljs/schema": "^0.1.2",
"istanbul-lib-coverage": "^3.2.0",
- "semver": "^6.3.0"
+ "semver": "^7.5.4"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
}
},
"node_modules/istanbul-lib-instrument/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
"bin": {
"semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
}
},
"node_modules/istanbul-lib-report": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
- "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
"dev": true,
"dependencies": {
"istanbul-lib-coverage": "^3.0.0",
- "make-dir": "^3.0.0",
+ "make-dir": "^4.0.0",
"supports-color": "^7.1.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
}
},
"node_modules/istanbul-lib-source-maps": {
@@ -4264,9 +4289,9 @@
"dev": true
},
"node_modules/istanbul-reports": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
- "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz",
+ "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==",
"dev": true,
"dependencies": {
"html-escaper": "^2.0.0",
@@ -4302,15 +4327,15 @@
"deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."
},
"node_modules/jest": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz",
- "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz",
+ "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==",
"dev": true,
"dependencies": {
- "@jest/core": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/core": "^29.6.4",
+ "@jest/types": "^29.6.3",
"import-local": "^3.0.2",
- "jest-cli": "^29.5.0"
+ "jest-cli": "^29.6.4"
},
"bin": {
"jest": "bin/jest.js"
@@ -4328,12 +4353,13 @@
}
},
"node_modules/jest-changed-files": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz",
- "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz",
+ "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==",
"dev": true,
"dependencies": {
"execa": "^5.0.0",
+ "jest-util": "^29.6.3",
"p-limit": "^3.1.0"
},
"engines": {
@@ -4341,28 +4367,28 @@
}
},
"node_modules/jest-circus": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz",
- "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz",
+ "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==",
"dev": true,
"dependencies": {
- "@jest/environment": "^29.5.0",
- "@jest/expect": "^29.5.0",
- "@jest/test-result": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/environment": "^29.6.4",
+ "@jest/expect": "^29.6.4",
+ "@jest/test-result": "^29.6.4",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
"chalk": "^4.0.0",
"co": "^4.6.0",
- "dedent": "^0.7.0",
+ "dedent": "^1.0.0",
"is-generator-fn": "^2.0.0",
- "jest-each": "^29.5.0",
- "jest-matcher-utils": "^29.5.0",
- "jest-message-util": "^29.5.0",
- "jest-runtime": "^29.5.0",
- "jest-snapshot": "^29.5.0",
- "jest-util": "^29.5.0",
+ "jest-each": "^29.6.3",
+ "jest-matcher-utils": "^29.6.4",
+ "jest-message-util": "^29.6.3",
+ "jest-runtime": "^29.6.4",
+ "jest-snapshot": "^29.6.4",
+ "jest-util": "^29.6.3",
"p-limit": "^3.1.0",
- "pretty-format": "^29.5.0",
+ "pretty-format": "^29.6.3",
"pure-rand": "^6.0.0",
"slash": "^3.0.0",
"stack-utils": "^2.0.3"
@@ -4372,21 +4398,21 @@
}
},
"node_modules/jest-cli": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz",
- "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz",
+ "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==",
"dev": true,
"dependencies": {
- "@jest/core": "^29.5.0",
- "@jest/test-result": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/core": "^29.6.4",
+ "@jest/test-result": "^29.6.4",
+ "@jest/types": "^29.6.3",
"chalk": "^4.0.0",
"exit": "^0.1.2",
"graceful-fs": "^4.2.9",
"import-local": "^3.0.2",
- "jest-config": "^29.5.0",
- "jest-util": "^29.5.0",
- "jest-validate": "^29.5.0",
+ "jest-config": "^29.6.4",
+ "jest-util": "^29.6.3",
+ "jest-validate": "^29.6.3",
"prompts": "^2.0.1",
"yargs": "^17.3.1"
},
@@ -4406,31 +4432,31 @@
}
},
"node_modules/jest-config": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz",
- "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz",
+ "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==",
"dev": true,
"dependencies": {
"@babel/core": "^7.11.6",
- "@jest/test-sequencer": "^29.5.0",
- "@jest/types": "^29.5.0",
- "babel-jest": "^29.5.0",
+ "@jest/test-sequencer": "^29.6.4",
+ "@jest/types": "^29.6.3",
+ "babel-jest": "^29.6.4",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
"deepmerge": "^4.2.2",
"glob": "^7.1.3",
"graceful-fs": "^4.2.9",
- "jest-circus": "^29.5.0",
- "jest-environment-node": "^29.5.0",
- "jest-get-type": "^29.4.3",
- "jest-regex-util": "^29.4.3",
- "jest-resolve": "^29.5.0",
- "jest-runner": "^29.5.0",
- "jest-util": "^29.5.0",
- "jest-validate": "^29.5.0",
+ "jest-circus": "^29.6.4",
+ "jest-environment-node": "^29.6.4",
+ "jest-get-type": "^29.6.3",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.6.4",
+ "jest-runner": "^29.6.4",
+ "jest-util": "^29.6.3",
+ "jest-validate": "^29.6.3",
"micromatch": "^4.0.4",
"parse-json": "^5.2.0",
- "pretty-format": "^29.5.0",
+ "pretty-format": "^29.6.3",
"slash": "^3.0.0",
"strip-json-comments": "^3.1.1"
},
@@ -4451,24 +4477,24 @@
}
},
"node_modules/jest-diff": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz",
- "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz",
+ "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==",
"dev": true,
"dependencies": {
"chalk": "^4.0.0",
- "diff-sequences": "^29.4.3",
- "jest-get-type": "^29.4.3",
- "pretty-format": "^29.5.0"
+ "diff-sequences": "^29.6.3",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.6.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-docblock": {
- "version": "29.4.3",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz",
- "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz",
+ "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==",
"dev": true,
"dependencies": {
"detect-newline": "^3.0.0"
@@ -4478,33 +4504,33 @@
}
},
"node_modules/jest-each": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz",
- "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz",
+ "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==",
"dev": true,
"dependencies": {
- "@jest/types": "^29.5.0",
+ "@jest/types": "^29.6.3",
"chalk": "^4.0.0",
- "jest-get-type": "^29.4.3",
- "jest-util": "^29.5.0",
- "pretty-format": "^29.5.0"
+ "jest-get-type": "^29.6.3",
+ "jest-util": "^29.6.3",
+ "pretty-format": "^29.6.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-environment-node": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz",
- "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz",
+ "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==",
"dev": true,
"dependencies": {
- "@jest/environment": "^29.5.0",
- "@jest/fake-timers": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/environment": "^29.6.4",
+ "@jest/fake-timers": "^29.6.4",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
- "jest-mock": "^29.5.0",
- "jest-util": "^29.5.0"
+ "jest-mock": "^29.6.3",
+ "jest-util": "^29.6.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -4520,29 +4546,29 @@
}
},
"node_modules/jest-get-type": {
- "version": "29.4.3",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz",
- "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
"dev": true,
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-haste-map": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz",
- "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz",
+ "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==",
"dev": true,
"dependencies": {
- "@jest/types": "^29.5.0",
+ "@jest/types": "^29.6.3",
"@types/graceful-fs": "^4.1.3",
"@types/node": "*",
"anymatch": "^3.0.3",
"fb-watchman": "^2.0.0",
"graceful-fs": "^4.2.9",
- "jest-regex-util": "^29.4.3",
- "jest-util": "^29.5.0",
- "jest-worker": "^29.5.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.6.3",
+ "jest-worker": "^29.6.4",
"micromatch": "^4.0.4",
"walker": "^1.0.8"
},
@@ -4554,46 +4580,46 @@
}
},
"node_modules/jest-leak-detector": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz",
- "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz",
+ "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==",
"dev": true,
"dependencies": {
- "jest-get-type": "^29.4.3",
- "pretty-format": "^29.5.0"
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.6.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-matcher-utils": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz",
- "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz",
+ "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==",
"dev": true,
"dependencies": {
"chalk": "^4.0.0",
- "jest-diff": "^29.5.0",
- "jest-get-type": "^29.4.3",
- "pretty-format": "^29.5.0"
+ "jest-diff": "^29.6.4",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.6.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-message-util": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz",
- "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz",
+ "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.12.13",
- "@jest/types": "^29.5.0",
+ "@jest/types": "^29.6.3",
"@types/stack-utils": "^2.0.0",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
"micromatch": "^4.0.4",
- "pretty-format": "^29.5.0",
+ "pretty-format": "^29.6.3",
"slash": "^3.0.0",
"stack-utils": "^2.0.3"
},
@@ -4602,14 +4628,14 @@
}
},
"node_modules/jest-mock": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz",
- "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz",
+ "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==",
"dev": true,
"dependencies": {
- "@jest/types": "^29.5.0",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
- "jest-util": "^29.5.0"
+ "jest-util": "^29.6.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -4633,26 +4659,26 @@
}
},
"node_modules/jest-regex-util": {
- "version": "29.4.3",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz",
- "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
+ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
"dev": true,
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-resolve": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz",
- "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz",
+ "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==",
"dev": true,
"dependencies": {
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.5.0",
+ "jest-haste-map": "^29.6.4",
"jest-pnp-resolver": "^1.2.2",
- "jest-util": "^29.5.0",
- "jest-validate": "^29.5.0",
+ "jest-util": "^29.6.3",
+ "jest-validate": "^29.6.3",
"resolve": "^1.20.0",
"resolve.exports": "^2.0.0",
"slash": "^3.0.0"
@@ -4662,43 +4688,43 @@
}
},
"node_modules/jest-resolve-dependencies": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz",
- "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz",
+ "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==",
"dev": true,
"dependencies": {
- "jest-regex-util": "^29.4.3",
- "jest-snapshot": "^29.5.0"
+ "jest-regex-util": "^29.6.3",
+ "jest-snapshot": "^29.6.4"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-runner": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz",
- "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz",
+ "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==",
"dev": true,
"dependencies": {
- "@jest/console": "^29.5.0",
- "@jest/environment": "^29.5.0",
- "@jest/test-result": "^29.5.0",
- "@jest/transform": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/console": "^29.6.4",
+ "@jest/environment": "^29.6.4",
+ "@jest/test-result": "^29.6.4",
+ "@jest/transform": "^29.6.4",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
"chalk": "^4.0.0",
"emittery": "^0.13.1",
"graceful-fs": "^4.2.9",
- "jest-docblock": "^29.4.3",
- "jest-environment-node": "^29.5.0",
- "jest-haste-map": "^29.5.0",
- "jest-leak-detector": "^29.5.0",
- "jest-message-util": "^29.5.0",
- "jest-resolve": "^29.5.0",
- "jest-runtime": "^29.5.0",
- "jest-util": "^29.5.0",
- "jest-watcher": "^29.5.0",
- "jest-worker": "^29.5.0",
+ "jest-docblock": "^29.6.3",
+ "jest-environment-node": "^29.6.4",
+ "jest-haste-map": "^29.6.4",
+ "jest-leak-detector": "^29.6.3",
+ "jest-message-util": "^29.6.3",
+ "jest-resolve": "^29.6.4",
+ "jest-runtime": "^29.6.4",
+ "jest-util": "^29.6.3",
+ "jest-watcher": "^29.6.4",
+ "jest-worker": "^29.6.4",
"p-limit": "^3.1.0",
"source-map-support": "0.5.13"
},
@@ -4707,31 +4733,31 @@
}
},
"node_modules/jest-runtime": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz",
- "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==",
- "dev": true,
- "dependencies": {
- "@jest/environment": "^29.5.0",
- "@jest/fake-timers": "^29.5.0",
- "@jest/globals": "^29.5.0",
- "@jest/source-map": "^29.4.3",
- "@jest/test-result": "^29.5.0",
- "@jest/transform": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz",
+ "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "^29.6.4",
+ "@jest/fake-timers": "^29.6.4",
+ "@jest/globals": "^29.6.4",
+ "@jest/source-map": "^29.6.3",
+ "@jest/test-result": "^29.6.4",
+ "@jest/transform": "^29.6.4",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
"chalk": "^4.0.0",
"cjs-module-lexer": "^1.0.0",
"collect-v8-coverage": "^1.0.0",
"glob": "^7.1.3",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.5.0",
- "jest-message-util": "^29.5.0",
- "jest-mock": "^29.5.0",
- "jest-regex-util": "^29.4.3",
- "jest-resolve": "^29.5.0",
- "jest-snapshot": "^29.5.0",
- "jest-util": "^29.5.0",
+ "jest-haste-map": "^29.6.4",
+ "jest-message-util": "^29.6.3",
+ "jest-mock": "^29.6.3",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.6.4",
+ "jest-snapshot": "^29.6.4",
+ "jest-util": "^29.6.3",
"slash": "^3.0.0",
"strip-bom": "^4.0.0"
},
@@ -4740,46 +4766,58 @@
}
},
"node_modules/jest-snapshot": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz",
- "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz",
+ "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==",
"dev": true,
"dependencies": {
"@babel/core": "^7.11.6",
"@babel/generator": "^7.7.2",
"@babel/plugin-syntax-jsx": "^7.7.2",
"@babel/plugin-syntax-typescript": "^7.7.2",
- "@babel/traverse": "^7.7.2",
"@babel/types": "^7.3.3",
- "@jest/expect-utils": "^29.5.0",
- "@jest/transform": "^29.5.0",
- "@jest/types": "^29.5.0",
- "@types/babel__traverse": "^7.0.6",
- "@types/prettier": "^2.1.5",
+ "@jest/expect-utils": "^29.6.4",
+ "@jest/transform": "^29.6.4",
+ "@jest/types": "^29.6.3",
"babel-preset-current-node-syntax": "^1.0.0",
"chalk": "^4.0.0",
- "expect": "^29.5.0",
+ "expect": "^29.6.4",
"graceful-fs": "^4.2.9",
- "jest-diff": "^29.5.0",
- "jest-get-type": "^29.4.3",
- "jest-matcher-utils": "^29.5.0",
- "jest-message-util": "^29.5.0",
- "jest-util": "^29.5.0",
+ "jest-diff": "^29.6.4",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.6.4",
+ "jest-message-util": "^29.6.3",
+ "jest-util": "^29.6.3",
"natural-compare": "^1.4.0",
- "pretty-format": "^29.5.0",
- "semver": "^7.3.5"
+ "pretty-format": "^29.6.3",
+ "semver": "^7.5.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
+ "node_modules/jest-snapshot/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/jest-util": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz",
- "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz",
+ "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==",
"dev": true,
"dependencies": {
- "@jest/types": "^29.5.0",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
@@ -4791,17 +4829,17 @@
}
},
"node_modules/jest-validate": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz",
- "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz",
+ "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==",
"dev": true,
"dependencies": {
- "@jest/types": "^29.5.0",
+ "@jest/types": "^29.6.3",
"camelcase": "^6.2.0",
"chalk": "^4.0.0",
- "jest-get-type": "^29.4.3",
+ "jest-get-type": "^29.6.3",
"leven": "^3.1.0",
- "pretty-format": "^29.5.0"
+ "pretty-format": "^29.6.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -4820,18 +4858,18 @@
}
},
"node_modules/jest-watcher": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz",
- "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz",
+ "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==",
"dev": true,
"dependencies": {
- "@jest/test-result": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/test-result": "^29.6.4",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
"ansi-escapes": "^4.2.1",
"chalk": "^4.0.0",
"emittery": "^0.13.1",
- "jest-util": "^29.5.0",
+ "jest-util": "^29.6.3",
"string-length": "^4.0.1"
},
"engines": {
@@ -4839,13 +4877,13 @@
}
},
"node_modules/jest-worker": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz",
- "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz",
+ "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==",
"dev": true,
"dependencies": {
"@types/node": "*",
- "jest-util": "^29.5.0",
+ "jest-util": "^29.6.3",
"merge-stream": "^2.0.0",
"supports-color": "^8.0.0"
},
@@ -5010,6 +5048,14 @@
"node": ">=6"
}
},
+ "node_modules/jsonpath-plus": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz",
+ "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
"node_modules/jsonwebtoken": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
@@ -5040,6 +5086,11 @@
"resolved": "https://registry.npmjs.org/jstat/-/jstat-1.9.6.tgz",
"integrity": "sha512-rPBkJbK2TnA8pzs93QcDDPlKcrtZWuuCo2dVR0TFLOJSxhqfWOVCSp8aV3/oSbn+4uY4yw1URtLpHQedtmXfug=="
},
+ "node_modules/just-clone": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/just-clone/-/just-clone-6.2.0.tgz",
+ "integrity": "sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA=="
+ },
"node_modules/jwa": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
@@ -5262,27 +5313,33 @@
}
},
"node_modules/make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
"dev": true,
"dependencies": {
- "semver": "^6.0.0"
+ "semver": "^7.5.3"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/make-dir/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
"bin": {
"semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
}
},
"node_modules/makeerror": {
@@ -5656,9 +5713,9 @@
"dev": true
},
"node_modules/node-releases": {
- "version": "2.0.10",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
- "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
+ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==",
"dev": true
},
"node_modules/nodemailer": {
@@ -6128,9 +6185,9 @@
}
},
"node_modules/pirates": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
- "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
"dev": true,
"engines": {
"node": ">= 6"
@@ -6166,12 +6223,12 @@
}
},
"node_modules/pretty-format": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz",
- "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz",
+ "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==",
"dev": true,
"dependencies": {
- "@jest/schemas": "^29.4.3",
+ "@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
"react-is": "^18.0.0"
},
@@ -6257,9 +6314,9 @@
}
},
"node_modules/pure-rand": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz",
- "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==",
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.3.tgz",
+ "integrity": "sha512-KddyFewCsO0j3+np81IQ+SweXLDnDQTs5s67BOnrYmYe/yNmUhttQyGsYzy8yUnoljGAQ9sl38YB4vH8ur7Y+w==",
"dev": true,
"funding": [
{
@@ -6368,6 +6425,20 @@
"@redis/time-series": "1.0.5"
}
},
+ "node_modules/redis-om": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/redis-om/-/redis-om-0.4.2.tgz",
+ "integrity": "sha512-sBah+ljGQY4Zm1f9/+l7HjtIuTQH/rzIX3JSLizymbr6VlTZ2ibt+U3xYKNjIA0tv/D9toEMF7HFXHMtT+l+1A==",
+ "dependencies": {
+ "jsonpath-plus": "^7.2.0",
+ "just-clone": "^6.1.1",
+ "redis": "^4.6.4",
+ "ulid": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/require-at": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz",
@@ -6392,12 +6463,12 @@
"dev": true
},
"node_modules/resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "version": "1.22.4",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz",
+ "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==",
"dev": true,
"dependencies": {
- "is-core-module": "^2.9.0",
+ "is-core-module": "^2.13.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
@@ -7316,6 +7387,14 @@
"node": ">= 0.8"
}
},
+ "node_modules/ulid": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz",
+ "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==",
+ "bin": {
+ "ulid": "bin/cli.js"
+ }
+ },
"node_modules/undefsafe": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
@@ -7353,9 +7432,9 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
- "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+ "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
"dev": true,
"funding": [
{
@@ -7365,6 +7444,10 @@
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
}
],
"dependencies": {
@@ -7372,7 +7455,7 @@
"picocolors": "^1.0.0"
},
"bin": {
- "browserslist-lint": "cli.js"
+ "update-browserslist-db": "cli.js"
},
"peerDependencies": {
"browserslist": ">= 4.21.0"
@@ -7802,9 +7885,9 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/yargs": {
- "version": "17.7.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
- "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
"dependencies": {
"cliui": "^8.0.1",
@@ -7848,12 +7931,12 @@
},
"dependencies": {
"@ampproject/remapping": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
- "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+ "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
"dev": true,
"requires": {
- "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9"
}
},
@@ -7926,32 +8009,32 @@
}
},
"@babel/compat-data": {
- "version": "7.21.0",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz",
- "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==",
+ "version": "7.22.9",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz",
+ "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==",
"dev": true
},
"@babel/core": {
- "version": "7.21.3",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz",
- "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz",
+ "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==",
"dev": true,
"requires": {
"@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.21.3",
- "@babel/helper-compilation-targets": "^7.20.7",
- "@babel/helper-module-transforms": "^7.21.2",
- "@babel/helpers": "^7.21.0",
- "@babel/parser": "^7.21.3",
- "@babel/template": "^7.20.7",
- "@babel/traverse": "^7.21.3",
- "@babel/types": "^7.21.3",
+ "@babel/code-frame": "^7.22.13",
+ "@babel/generator": "^7.22.15",
+ "@babel/helper-compilation-targets": "^7.22.15",
+ "@babel/helper-module-transforms": "^7.22.15",
+ "@babel/helpers": "^7.22.15",
+ "@babel/parser": "^7.22.15",
+ "@babel/template": "^7.22.15",
+ "@babel/traverse": "^7.22.15",
+ "@babel/types": "^7.22.15",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
- "json5": "^2.2.2",
- "semver": "^6.3.0"
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
},
"dependencies": {
"convert-source-map": {
@@ -7976,49 +8059,36 @@
"dev": true
},
"semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true
}
}
},
"@babel/generator": {
- "version": "7.22.10",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz",
- "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz",
+ "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==",
"dev": true,
"requires": {
- "@babel/types": "^7.22.10",
+ "@babel/types": "^7.22.15",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
- },
- "dependencies": {
- "@jridgewell/gen-mapping": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
- "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
- "dev": true,
- "requires": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- }
}
},
"@babel/helper-compilation-targets": {
- "version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
- "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz",
+ "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.20.5",
- "@babel/helper-validator-option": "^7.18.6",
- "browserslist": "^4.21.3",
+ "@babel/compat-data": "^7.22.9",
+ "@babel/helper-validator-option": "^7.22.15",
+ "browserslist": "^4.21.9",
"lru-cache": "^5.1.1",
- "semver": "^6.3.0"
+ "semver": "^6.3.1"
},
"dependencies": {
"lru-cache": {
@@ -8031,9 +8101,9 @@
}
},
"semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true
},
"yallist": {
@@ -8070,43 +8140,40 @@
}
},
"@babel/helper-module-imports": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
- "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
+ "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
"dev": true,
"requires": {
- "@babel/types": "^7.18.6"
+ "@babel/types": "^7.22.15"
}
},
"@babel/helper-module-transforms": {
- "version": "7.21.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz",
- "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz",
+ "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==",
"dev": true,
"requires": {
- "@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-module-imports": "^7.18.6",
- "@babel/helper-simple-access": "^7.20.2",
- "@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/helper-validator-identifier": "^7.19.1",
- "@babel/template": "^7.20.7",
- "@babel/traverse": "^7.21.2",
- "@babel/types": "^7.21.2"
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-module-imports": "^7.22.15",
+ "@babel/helper-simple-access": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/helper-validator-identifier": "^7.22.15"
}
},
"@babel/helper-plugin-utils": {
- "version": "7.20.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
- "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
+ "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
"dev": true
},
"@babel/helper-simple-access": {
- "version": "7.20.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
- "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+ "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
"dev": true,
"requires": {
- "@babel/types": "^7.20.2"
+ "@babel/types": "^7.22.5"
}
},
"@babel/helper-split-export-declaration": {
@@ -8125,26 +8192,26 @@
"dev": true
},
"@babel/helper-validator-identifier": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
- "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz",
+ "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==",
"dev": true
},
"@babel/helper-validator-option": {
- "version": "7.21.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
- "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz",
+ "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==",
"dev": true
},
"@babel/helpers": {
- "version": "7.21.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz",
- "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz",
+ "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==",
"dev": true,
"requires": {
- "@babel/template": "^7.20.7",
- "@babel/traverse": "^7.21.0",
- "@babel/types": "^7.21.0"
+ "@babel/template": "^7.22.15",
+ "@babel/traverse": "^7.22.15",
+ "@babel/types": "^7.22.15"
}
},
"@babel/highlight": {
@@ -8217,9 +8284,9 @@
}
},
"@babel/parser": {
- "version": "7.22.13",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.13.tgz",
- "integrity": "sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz",
+ "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==",
"dev": true
},
"@babel/plugin-syntax-async-generators": {
@@ -8268,12 +8335,12 @@
}
},
"@babel/plugin-syntax-jsx": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz",
- "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz",
+ "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.18.6"
+ "@babel/helper-plugin-utils": "^7.22.5"
}
},
"@babel/plugin-syntax-logical-assignment-operators": {
@@ -8340,39 +8407,39 @@
}
},
"@babel/plugin-syntax-typescript": {
- "version": "7.20.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz",
- "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz",
+ "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.19.0"
+ "@babel/helper-plugin-utils": "^7.22.5"
}
},
"@babel/template": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz",
- "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
+ "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.22.5",
- "@babel/parser": "^7.22.5",
- "@babel/types": "^7.22.5"
+ "@babel/code-frame": "^7.22.13",
+ "@babel/parser": "^7.22.15",
+ "@babel/types": "^7.22.15"
}
},
"@babel/traverse": {
- "version": "7.22.11",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz",
- "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz",
+ "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.22.10",
- "@babel/generator": "^7.22.10",
+ "@babel/code-frame": "^7.22.13",
+ "@babel/generator": "^7.22.15",
"@babel/helper-environment-visitor": "^7.22.5",
"@babel/helper-function-name": "^7.22.5",
"@babel/helper-hoist-variables": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/parser": "^7.22.11",
- "@babel/types": "^7.22.11",
+ "@babel/parser": "^7.22.15",
+ "@babel/types": "^7.22.15",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
@@ -8395,13 +8462,13 @@
}
},
"@babel/types": {
- "version": "7.22.11",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz",
- "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==",
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz",
+ "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==",
"dev": true,
"requires": {
"@babel/helper-string-parser": "^7.22.5",
- "@babel/helper-validator-identifier": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.15",
"to-fast-properties": "^2.0.0"
}
},
@@ -8459,124 +8526,124 @@
"dev": true
},
"@jest/console": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz",
- "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz",
+ "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==",
"dev": true,
"requires": {
- "@jest/types": "^29.5.0",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
"chalk": "^4.0.0",
- "jest-message-util": "^29.5.0",
- "jest-util": "^29.5.0",
+ "jest-message-util": "^29.6.3",
+ "jest-util": "^29.6.3",
"slash": "^3.0.0"
}
},
"@jest/core": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz",
- "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz",
+ "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==",
"dev": true,
"requires": {
- "@jest/console": "^29.5.0",
- "@jest/reporters": "^29.5.0",
- "@jest/test-result": "^29.5.0",
- "@jest/transform": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/console": "^29.6.4",
+ "@jest/reporters": "^29.6.4",
+ "@jest/test-result": "^29.6.4",
+ "@jest/transform": "^29.6.4",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
"ansi-escapes": "^4.2.1",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
"exit": "^0.1.2",
"graceful-fs": "^4.2.9",
- "jest-changed-files": "^29.5.0",
- "jest-config": "^29.5.0",
- "jest-haste-map": "^29.5.0",
- "jest-message-util": "^29.5.0",
- "jest-regex-util": "^29.4.3",
- "jest-resolve": "^29.5.0",
- "jest-resolve-dependencies": "^29.5.0",
- "jest-runner": "^29.5.0",
- "jest-runtime": "^29.5.0",
- "jest-snapshot": "^29.5.0",
- "jest-util": "^29.5.0",
- "jest-validate": "^29.5.0",
- "jest-watcher": "^29.5.0",
+ "jest-changed-files": "^29.6.3",
+ "jest-config": "^29.6.4",
+ "jest-haste-map": "^29.6.4",
+ "jest-message-util": "^29.6.3",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.6.4",
+ "jest-resolve-dependencies": "^29.6.4",
+ "jest-runner": "^29.6.4",
+ "jest-runtime": "^29.6.4",
+ "jest-snapshot": "^29.6.4",
+ "jest-util": "^29.6.3",
+ "jest-validate": "^29.6.3",
+ "jest-watcher": "^29.6.4",
"micromatch": "^4.0.4",
- "pretty-format": "^29.5.0",
+ "pretty-format": "^29.6.3",
"slash": "^3.0.0",
"strip-ansi": "^6.0.0"
}
},
"@jest/environment": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz",
- "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz",
+ "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==",
"dev": true,
"requires": {
- "@jest/fake-timers": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/fake-timers": "^29.6.4",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
- "jest-mock": "^29.5.0"
+ "jest-mock": "^29.6.3"
}
},
"@jest/expect": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz",
- "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz",
+ "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==",
"dev": true,
"requires": {
- "expect": "^29.5.0",
- "jest-snapshot": "^29.5.0"
+ "expect": "^29.6.4",
+ "jest-snapshot": "^29.6.4"
}
},
"@jest/expect-utils": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz",
- "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz",
+ "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==",
"dev": true,
"requires": {
- "jest-get-type": "^29.4.3"
+ "jest-get-type": "^29.6.3"
}
},
"@jest/fake-timers": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz",
- "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz",
+ "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==",
"dev": true,
"requires": {
- "@jest/types": "^29.5.0",
+ "@jest/types": "^29.6.3",
"@sinonjs/fake-timers": "^10.0.2",
"@types/node": "*",
- "jest-message-util": "^29.5.0",
- "jest-mock": "^29.5.0",
- "jest-util": "^29.5.0"
+ "jest-message-util": "^29.6.3",
+ "jest-mock": "^29.6.3",
+ "jest-util": "^29.6.3"
}
},
"@jest/globals": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz",
- "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz",
+ "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==",
"dev": true,
"requires": {
- "@jest/environment": "^29.5.0",
- "@jest/expect": "^29.5.0",
- "@jest/types": "^29.5.0",
- "jest-mock": "^29.5.0"
+ "@jest/environment": "^29.6.4",
+ "@jest/expect": "^29.6.4",
+ "@jest/types": "^29.6.3",
+ "jest-mock": "^29.6.3"
}
},
"@jest/reporters": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz",
- "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz",
+ "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==",
"dev": true,
"requires": {
"@bcoe/v8-coverage": "^0.2.3",
- "@jest/console": "^29.5.0",
- "@jest/test-result": "^29.5.0",
- "@jest/transform": "^29.5.0",
- "@jest/types": "^29.5.0",
- "@jridgewell/trace-mapping": "^0.3.15",
+ "@jest/console": "^29.6.4",
+ "@jest/test-result": "^29.6.4",
+ "@jest/transform": "^29.6.4",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
"@types/node": "*",
"chalk": "^4.0.0",
"collect-v8-coverage": "^1.0.0",
@@ -8584,13 +8651,13 @@
"glob": "^7.1.3",
"graceful-fs": "^4.2.9",
"istanbul-lib-coverage": "^3.0.0",
- "istanbul-lib-instrument": "^5.1.0",
+ "istanbul-lib-instrument": "^6.0.0",
"istanbul-lib-report": "^3.0.0",
"istanbul-lib-source-maps": "^4.0.0",
"istanbul-reports": "^3.1.3",
- "jest-message-util": "^29.5.0",
- "jest-util": "^29.5.0",
- "jest-worker": "^29.5.0",
+ "jest-message-util": "^29.6.3",
+ "jest-util": "^29.6.3",
+ "jest-worker": "^29.6.4",
"slash": "^3.0.0",
"string-length": "^4.0.1",
"strip-ansi": "^6.0.0",
@@ -8598,66 +8665,66 @@
}
},
"@jest/schemas": {
- "version": "29.4.3",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz",
- "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
"dev": true,
"requires": {
- "@sinclair/typebox": "^0.25.16"
+ "@sinclair/typebox": "^0.27.8"
}
},
"@jest/source-map": {
- "version": "29.4.3",
- "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz",
- "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
+ "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
"dev": true,
"requires": {
- "@jridgewell/trace-mapping": "^0.3.15",
+ "@jridgewell/trace-mapping": "^0.3.18",
"callsites": "^3.0.0",
"graceful-fs": "^4.2.9"
}
},
"@jest/test-result": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz",
- "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz",
+ "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==",
"dev": true,
"requires": {
- "@jest/console": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/console": "^29.6.4",
+ "@jest/types": "^29.6.3",
"@types/istanbul-lib-coverage": "^2.0.0",
"collect-v8-coverage": "^1.0.0"
}
},
"@jest/test-sequencer": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz",
- "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz",
+ "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==",
"dev": true,
"requires": {
- "@jest/test-result": "^29.5.0",
+ "@jest/test-result": "^29.6.4",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.5.0",
+ "jest-haste-map": "^29.6.4",
"slash": "^3.0.0"
}
},
"@jest/transform": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz",
- "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz",
+ "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==",
"dev": true,
"requires": {
"@babel/core": "^7.11.6",
- "@jest/types": "^29.5.0",
- "@jridgewell/trace-mapping": "^0.3.15",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
"babel-plugin-istanbul": "^6.1.1",
"chalk": "^4.0.0",
"convert-source-map": "^2.0.0",
"fast-json-stable-stringify": "^2.1.0",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.5.0",
- "jest-regex-util": "^29.4.3",
- "jest-util": "^29.5.0",
+ "jest-haste-map": "^29.6.4",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.6.3",
"micromatch": "^4.0.4",
"pirates": "^4.0.4",
"slash": "^3.0.0",
@@ -8665,12 +8732,12 @@
}
},
"@jest/types": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz",
- "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
"dev": true,
"requires": {
- "@jest/schemas": "^29.4.3",
+ "@jest/schemas": "^29.6.3",
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
"@types/node": "*",
@@ -8679,19 +8746,20 @@
}
},
"@jridgewell/gen-mapping": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
- "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
"dev": true,
"requires": {
- "@jridgewell/set-array": "^1.0.0",
- "@jridgewell/sourcemap-codec": "^1.4.10"
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
}
},
"@jridgewell/resolve-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
"dev": true
},
"@jridgewell/set-array": {
@@ -8701,19 +8769,19 @@
"dev": true
},
"@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
"dev": true
},
"@jridgewell/trace-mapping": {
- "version": "0.3.17",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
- "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+ "version": "0.3.19",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
+ "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
"dev": true,
"requires": {
- "@jridgewell/resolve-uri": "3.1.0",
- "@jridgewell/sourcemap-codec": "1.4.14"
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"@ldapjs/asn1": {
@@ -8836,27 +8904,27 @@
"requires": {}
},
"@sinclair/typebox": {
- "version": "0.25.24",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz",
- "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==",
+ "version": "0.27.8",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
"dev": true
},
"@sinonjs/commons": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
- "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz",
+ "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==",
"dev": true,
"requires": {
"type-detect": "4.0.8"
}
},
"@sinonjs/fake-timers": {
- "version": "10.0.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz",
- "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==",
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
"dev": true,
"requires": {
- "@sinonjs/commons": "^2.0.0"
+ "@sinonjs/commons": "^3.0.0"
}
},
"@socket.io/component-emitter": {
@@ -8871,9 +8939,9 @@
"dev": true
},
"@types/babel__core": {
- "version": "7.20.0",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz",
- "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==",
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz",
+ "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==",
"dev": true,
"requires": {
"@babel/parser": "^7.20.7",
@@ -8903,12 +8971,12 @@
}
},
"@types/babel__traverse": {
- "version": "7.18.3",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz",
- "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==",
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz",
+ "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==",
"dev": true,
"requires": {
- "@babel/types": "^7.3.0"
+ "@babel/types": "^7.20.7"
}
},
"@types/cookie": {
@@ -8962,12 +9030,6 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.28.tgz",
"integrity": "sha512-UYmIeBnB0On70dN1iGCinsL1qH5JmIEJwa+3KX0Xw4HQJ8KA16ULlyTCNmnzfyzj/BlxZKmZLqp4TYdssnov1w=="
},
- "@types/prettier": {
- "version": "2.7.2",
- "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
- "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==",
- "dev": true
- },
"@types/stack-utils": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
@@ -8996,9 +9058,9 @@
}
},
"@types/yargs": {
- "version": "17.0.23",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.23.tgz",
- "integrity": "sha512-yuogunc04OnzGQCrfHx+Kk883Q4X0aSwmYZhKjI21m+SVYzjIbrWl8dOOwSv5hf2Um2pdCOXWo9isteZTNXUZQ==",
+ "version": "17.0.24",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz",
+ "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==",
"dev": true,
"requires": {
"@types/yargs-parser": "*"
@@ -9199,15 +9261,15 @@
}
},
"babel-jest": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz",
- "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz",
+ "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==",
"dev": true,
"requires": {
- "@jest/transform": "^29.5.0",
+ "@jest/transform": "^29.6.4",
"@types/babel__core": "^7.1.14",
"babel-plugin-istanbul": "^6.1.1",
- "babel-preset-jest": "^29.5.0",
+ "babel-preset-jest": "^29.6.3",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
"slash": "^3.0.0"
@@ -9224,12 +9286,33 @@
"@istanbuljs/schema": "^0.1.2",
"istanbul-lib-instrument": "^5.0.4",
"test-exclude": "^6.0.0"
+ },
+ "dependencies": {
+ "istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ }
+ },
+ "semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true
+ }
}
},
"babel-plugin-jest-hoist": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz",
- "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
+ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
"dev": true,
"requires": {
"@babel/template": "^7.3.3",
@@ -9259,12 +9342,12 @@
}
},
"babel-preset-jest": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz",
- "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
+ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
"dev": true,
"requires": {
- "babel-plugin-jest-hoist": "^29.5.0",
+ "babel-plugin-jest-hoist": "^29.6.3",
"babel-preset-current-node-syntax": "^1.0.0"
}
},
@@ -9381,15 +9464,15 @@
}
},
"browserslist": {
- "version": "4.21.5",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
- "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
+ "version": "4.21.10",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz",
+ "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001449",
- "electron-to-chromium": "^1.4.284",
- "node-releases": "^2.0.8",
- "update-browserslist-db": "^1.0.10"
+ "caniuse-lite": "^1.0.30001517",
+ "electron-to-chromium": "^1.4.477",
+ "node-releases": "^2.0.13",
+ "update-browserslist-db": "^1.0.11"
}
},
"bser": {
@@ -9465,9 +9548,9 @@
"dev": true
},
"caniuse-lite": {
- "version": "1.0.30001470",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001470.tgz",
- "integrity": "sha512-065uNwY6QtHCBOExzbV6m236DDhYCCtPmQUCoQtwkVqzud8v5QPidoMr6CoMkC2nfp6nksjttqWQRRh75LqUmA==",
+ "version": "1.0.30001527",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz",
+ "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==",
"dev": true
},
"chalk": {
@@ -9509,9 +9592,9 @@
"dev": true
},
"cjs-module-lexer": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
- "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz",
+ "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==",
"dev": true
},
"cliui": {
@@ -9551,9 +9634,9 @@
"dev": true
},
"collect-v8-coverage": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
- "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
+ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
"dev": true
},
"color": {
@@ -9855,10 +9938,11 @@
"dev": true
},
"dedent": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
- "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
- "dev": true
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz",
+ "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==",
+ "dev": true,
+ "requires": {}
},
"deep-is": {
"version": "0.1.4",
@@ -9910,9 +9994,9 @@
}
},
"diff-sequences": {
- "version": "29.4.3",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz",
- "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
"dev": true
},
"domexception": {
@@ -9952,9 +10036,9 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"electron-to-chromium": {
- "version": "1.4.340",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.340.tgz",
- "integrity": "sha512-zx8hqumOqltKsv/MF50yvdAlPF9S/4PXbyfzJS6ZGhbddGkRegdwImmfSVqCkEziYzrIGZ/TlrzBND4FysfkDg==",
+ "version": "1.4.508",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz",
+ "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==",
"dev": true
},
"emittery": {
@@ -10212,16 +10296,16 @@
"dev": true
},
"expect": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz",
- "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz",
+ "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==",
"dev": true,
"requires": {
- "@jest/expect-utils": "^29.5.0",
- "jest-get-type": "^29.4.3",
- "jest-matcher-utils": "^29.5.0",
- "jest-message-util": "^29.5.0",
- "jest-util": "^29.5.0"
+ "@jest/expect-utils": "^29.6.4",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.6.4",
+ "jest-message-util": "^29.6.3",
+ "jest-util": "^29.6.3"
}
},
"express": {
@@ -10948,9 +11032,9 @@
}
},
"is-core-module": {
- "version": "2.11.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
- "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+ "version": "2.13.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
+ "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
"dev": true,
"requires": {
"has": "^1.0.3"
@@ -11026,34 +11110,37 @@
"dev": true
},
"istanbul-lib-instrument": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
- "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz",
+ "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==",
"dev": true,
"requires": {
"@babel/core": "^7.12.3",
"@babel/parser": "^7.14.7",
"@istanbuljs/schema": "^0.1.2",
"istanbul-lib-coverage": "^3.2.0",
- "semver": "^6.3.0"
+ "semver": "^7.5.4"
},
"dependencies": {
"semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
}
}
},
"istanbul-lib-report": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
- "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
"dev": true,
"requires": {
"istanbul-lib-coverage": "^3.0.0",
- "make-dir": "^3.0.0",
+ "make-dir": "^4.0.0",
"supports-color": "^7.1.0"
}
},
@@ -11086,9 +11173,9 @@
}
},
"istanbul-reports": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
- "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz",
+ "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==",
"dev": true,
"requires": {
"html-escaper": "^2.0.0",
@@ -11117,151 +11204,152 @@
"integrity": "sha512-NHuYTuLgwwBrGKNORh+mSqnvJUeXe9OX9HLP60CT4iRQPgi+OPKBjThOLvwc5SA4yfjTQ/RpyhPfczfavS+Gsg=="
},
"jest": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz",
- "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz",
+ "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==",
"dev": true,
"requires": {
- "@jest/core": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/core": "^29.6.4",
+ "@jest/types": "^29.6.3",
"import-local": "^3.0.2",
- "jest-cli": "^29.5.0"
+ "jest-cli": "^29.6.4"
}
},
"jest-changed-files": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz",
- "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz",
+ "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==",
"dev": true,
"requires": {
"execa": "^5.0.0",
+ "jest-util": "^29.6.3",
"p-limit": "^3.1.0"
}
},
"jest-circus": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz",
- "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz",
+ "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==",
"dev": true,
"requires": {
- "@jest/environment": "^29.5.0",
- "@jest/expect": "^29.5.0",
- "@jest/test-result": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/environment": "^29.6.4",
+ "@jest/expect": "^29.6.4",
+ "@jest/test-result": "^29.6.4",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
"chalk": "^4.0.0",
"co": "^4.6.0",
- "dedent": "^0.7.0",
+ "dedent": "^1.0.0",
"is-generator-fn": "^2.0.0",
- "jest-each": "^29.5.0",
- "jest-matcher-utils": "^29.5.0",
- "jest-message-util": "^29.5.0",
- "jest-runtime": "^29.5.0",
- "jest-snapshot": "^29.5.0",
- "jest-util": "^29.5.0",
+ "jest-each": "^29.6.3",
+ "jest-matcher-utils": "^29.6.4",
+ "jest-message-util": "^29.6.3",
+ "jest-runtime": "^29.6.4",
+ "jest-snapshot": "^29.6.4",
+ "jest-util": "^29.6.3",
"p-limit": "^3.1.0",
- "pretty-format": "^29.5.0",
+ "pretty-format": "^29.6.3",
"pure-rand": "^6.0.0",
"slash": "^3.0.0",
"stack-utils": "^2.0.3"
}
},
"jest-cli": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz",
- "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz",
+ "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==",
"dev": true,
"requires": {
- "@jest/core": "^29.5.0",
- "@jest/test-result": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/core": "^29.6.4",
+ "@jest/test-result": "^29.6.4",
+ "@jest/types": "^29.6.3",
"chalk": "^4.0.0",
"exit": "^0.1.2",
"graceful-fs": "^4.2.9",
"import-local": "^3.0.2",
- "jest-config": "^29.5.0",
- "jest-util": "^29.5.0",
- "jest-validate": "^29.5.0",
+ "jest-config": "^29.6.4",
+ "jest-util": "^29.6.3",
+ "jest-validate": "^29.6.3",
"prompts": "^2.0.1",
"yargs": "^17.3.1"
}
},
"jest-config": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz",
- "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz",
+ "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==",
"dev": true,
"requires": {
"@babel/core": "^7.11.6",
- "@jest/test-sequencer": "^29.5.0",
- "@jest/types": "^29.5.0",
- "babel-jest": "^29.5.0",
+ "@jest/test-sequencer": "^29.6.4",
+ "@jest/types": "^29.6.3",
+ "babel-jest": "^29.6.4",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
"deepmerge": "^4.2.2",
"glob": "^7.1.3",
"graceful-fs": "^4.2.9",
- "jest-circus": "^29.5.0",
- "jest-environment-node": "^29.5.0",
- "jest-get-type": "^29.4.3",
- "jest-regex-util": "^29.4.3",
- "jest-resolve": "^29.5.0",
- "jest-runner": "^29.5.0",
- "jest-util": "^29.5.0",
- "jest-validate": "^29.5.0",
+ "jest-circus": "^29.6.4",
+ "jest-environment-node": "^29.6.4",
+ "jest-get-type": "^29.6.3",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.6.4",
+ "jest-runner": "^29.6.4",
+ "jest-util": "^29.6.3",
+ "jest-validate": "^29.6.3",
"micromatch": "^4.0.4",
"parse-json": "^5.2.0",
- "pretty-format": "^29.5.0",
+ "pretty-format": "^29.6.3",
"slash": "^3.0.0",
"strip-json-comments": "^3.1.1"
}
},
"jest-diff": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz",
- "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz",
+ "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==",
"dev": true,
"requires": {
"chalk": "^4.0.0",
- "diff-sequences": "^29.4.3",
- "jest-get-type": "^29.4.3",
- "pretty-format": "^29.5.0"
+ "diff-sequences": "^29.6.3",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.6.3"
}
},
"jest-docblock": {
- "version": "29.4.3",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz",
- "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz",
+ "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==",
"dev": true,
"requires": {
"detect-newline": "^3.0.0"
}
},
"jest-each": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz",
- "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz",
+ "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==",
"dev": true,
"requires": {
- "@jest/types": "^29.5.0",
+ "@jest/types": "^29.6.3",
"chalk": "^4.0.0",
- "jest-get-type": "^29.4.3",
- "jest-util": "^29.5.0",
- "pretty-format": "^29.5.0"
+ "jest-get-type": "^29.6.3",
+ "jest-util": "^29.6.3",
+ "pretty-format": "^29.6.3"
}
},
"jest-environment-node": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz",
- "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz",
+ "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==",
"dev": true,
"requires": {
- "@jest/environment": "^29.5.0",
- "@jest/fake-timers": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/environment": "^29.6.4",
+ "@jest/fake-timers": "^29.6.4",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
- "jest-mock": "^29.5.0",
- "jest-util": "^29.5.0"
+ "jest-mock": "^29.6.3",
+ "jest-util": "^29.6.3"
}
},
"jest-fetch-mock": {
@@ -11274,79 +11362,79 @@
}
},
"jest-get-type": {
- "version": "29.4.3",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz",
- "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
"dev": true
},
"jest-haste-map": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz",
- "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz",
+ "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==",
"dev": true,
"requires": {
- "@jest/types": "^29.5.0",
+ "@jest/types": "^29.6.3",
"@types/graceful-fs": "^4.1.3",
"@types/node": "*",
"anymatch": "^3.0.3",
"fb-watchman": "^2.0.0",
"fsevents": "^2.3.2",
"graceful-fs": "^4.2.9",
- "jest-regex-util": "^29.4.3",
- "jest-util": "^29.5.0",
- "jest-worker": "^29.5.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.6.3",
+ "jest-worker": "^29.6.4",
"micromatch": "^4.0.4",
"walker": "^1.0.8"
}
},
"jest-leak-detector": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz",
- "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz",
+ "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==",
"dev": true,
"requires": {
- "jest-get-type": "^29.4.3",
- "pretty-format": "^29.5.0"
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.6.3"
}
},
"jest-matcher-utils": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz",
- "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz",
+ "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==",
"dev": true,
"requires": {
"chalk": "^4.0.0",
- "jest-diff": "^29.5.0",
- "jest-get-type": "^29.4.3",
- "pretty-format": "^29.5.0"
+ "jest-diff": "^29.6.4",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.6.3"
}
},
"jest-message-util": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz",
- "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz",
+ "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.12.13",
- "@jest/types": "^29.5.0",
+ "@jest/types": "^29.6.3",
"@types/stack-utils": "^2.0.0",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
"micromatch": "^4.0.4",
- "pretty-format": "^29.5.0",
+ "pretty-format": "^29.6.3",
"slash": "^3.0.0",
"stack-utils": "^2.0.3"
}
},
"jest-mock": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz",
- "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz",
+ "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==",
"dev": true,
"requires": {
- "@jest/types": "^29.5.0",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
- "jest-util": "^29.5.0"
+ "jest-util": "^29.6.3"
}
},
"jest-pnp-resolver": {
@@ -11357,135 +11445,143 @@
"requires": {}
},
"jest-regex-util": {
- "version": "29.4.3",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz",
- "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
+ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
"dev": true
},
"jest-resolve": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz",
- "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz",
+ "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==",
"dev": true,
"requires": {
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.5.0",
+ "jest-haste-map": "^29.6.4",
"jest-pnp-resolver": "^1.2.2",
- "jest-util": "^29.5.0",
- "jest-validate": "^29.5.0",
+ "jest-util": "^29.6.3",
+ "jest-validate": "^29.6.3",
"resolve": "^1.20.0",
"resolve.exports": "^2.0.0",
"slash": "^3.0.0"
}
},
"jest-resolve-dependencies": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz",
- "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz",
+ "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==",
"dev": true,
"requires": {
- "jest-regex-util": "^29.4.3",
- "jest-snapshot": "^29.5.0"
+ "jest-regex-util": "^29.6.3",
+ "jest-snapshot": "^29.6.4"
}
},
"jest-runner": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz",
- "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz",
+ "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==",
"dev": true,
"requires": {
- "@jest/console": "^29.5.0",
- "@jest/environment": "^29.5.0",
- "@jest/test-result": "^29.5.0",
- "@jest/transform": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/console": "^29.6.4",
+ "@jest/environment": "^29.6.4",
+ "@jest/test-result": "^29.6.4",
+ "@jest/transform": "^29.6.4",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
"chalk": "^4.0.0",
"emittery": "^0.13.1",
"graceful-fs": "^4.2.9",
- "jest-docblock": "^29.4.3",
- "jest-environment-node": "^29.5.0",
- "jest-haste-map": "^29.5.0",
- "jest-leak-detector": "^29.5.0",
- "jest-message-util": "^29.5.0",
- "jest-resolve": "^29.5.0",
- "jest-runtime": "^29.5.0",
- "jest-util": "^29.5.0",
- "jest-watcher": "^29.5.0",
- "jest-worker": "^29.5.0",
+ "jest-docblock": "^29.6.3",
+ "jest-environment-node": "^29.6.4",
+ "jest-haste-map": "^29.6.4",
+ "jest-leak-detector": "^29.6.3",
+ "jest-message-util": "^29.6.3",
+ "jest-resolve": "^29.6.4",
+ "jest-runtime": "^29.6.4",
+ "jest-util": "^29.6.3",
+ "jest-watcher": "^29.6.4",
+ "jest-worker": "^29.6.4",
"p-limit": "^3.1.0",
"source-map-support": "0.5.13"
}
},
"jest-runtime": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz",
- "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==",
- "dev": true,
- "requires": {
- "@jest/environment": "^29.5.0",
- "@jest/fake-timers": "^29.5.0",
- "@jest/globals": "^29.5.0",
- "@jest/source-map": "^29.4.3",
- "@jest/test-result": "^29.5.0",
- "@jest/transform": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz",
+ "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==",
+ "dev": true,
+ "requires": {
+ "@jest/environment": "^29.6.4",
+ "@jest/fake-timers": "^29.6.4",
+ "@jest/globals": "^29.6.4",
+ "@jest/source-map": "^29.6.3",
+ "@jest/test-result": "^29.6.4",
+ "@jest/transform": "^29.6.4",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
"chalk": "^4.0.0",
"cjs-module-lexer": "^1.0.0",
"collect-v8-coverage": "^1.0.0",
"glob": "^7.1.3",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.5.0",
- "jest-message-util": "^29.5.0",
- "jest-mock": "^29.5.0",
- "jest-regex-util": "^29.4.3",
- "jest-resolve": "^29.5.0",
- "jest-snapshot": "^29.5.0",
- "jest-util": "^29.5.0",
+ "jest-haste-map": "^29.6.4",
+ "jest-message-util": "^29.6.3",
+ "jest-mock": "^29.6.3",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.6.4",
+ "jest-snapshot": "^29.6.4",
+ "jest-util": "^29.6.3",
"slash": "^3.0.0",
"strip-bom": "^4.0.0"
}
},
"jest-snapshot": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz",
- "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz",
+ "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==",
"dev": true,
"requires": {
"@babel/core": "^7.11.6",
"@babel/generator": "^7.7.2",
"@babel/plugin-syntax-jsx": "^7.7.2",
"@babel/plugin-syntax-typescript": "^7.7.2",
- "@babel/traverse": "^7.7.2",
"@babel/types": "^7.3.3",
- "@jest/expect-utils": "^29.5.0",
- "@jest/transform": "^29.5.0",
- "@jest/types": "^29.5.0",
- "@types/babel__traverse": "^7.0.6",
- "@types/prettier": "^2.1.5",
+ "@jest/expect-utils": "^29.6.4",
+ "@jest/transform": "^29.6.4",
+ "@jest/types": "^29.6.3",
"babel-preset-current-node-syntax": "^1.0.0",
"chalk": "^4.0.0",
- "expect": "^29.5.0",
+ "expect": "^29.6.4",
"graceful-fs": "^4.2.9",
- "jest-diff": "^29.5.0",
- "jest-get-type": "^29.4.3",
- "jest-matcher-utils": "^29.5.0",
- "jest-message-util": "^29.5.0",
- "jest-util": "^29.5.0",
+ "jest-diff": "^29.6.4",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.6.4",
+ "jest-message-util": "^29.6.3",
+ "jest-util": "^29.6.3",
"natural-compare": "^1.4.0",
- "pretty-format": "^29.5.0",
- "semver": "^7.3.5"
+ "pretty-format": "^29.6.3",
+ "semver": "^7.5.3"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
}
},
"jest-util": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz",
- "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz",
+ "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==",
"dev": true,
"requires": {
- "@jest/types": "^29.5.0",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
@@ -11494,17 +11590,17 @@
}
},
"jest-validate": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz",
- "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz",
+ "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==",
"dev": true,
"requires": {
- "@jest/types": "^29.5.0",
+ "@jest/types": "^29.6.3",
"camelcase": "^6.2.0",
"chalk": "^4.0.0",
- "jest-get-type": "^29.4.3",
+ "jest-get-type": "^29.6.3",
"leven": "^3.1.0",
- "pretty-format": "^29.5.0"
+ "pretty-format": "^29.6.3"
},
"dependencies": {
"camelcase": {
@@ -11516,29 +11612,29 @@
}
},
"jest-watcher": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz",
- "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz",
+ "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==",
"dev": true,
"requires": {
- "@jest/test-result": "^29.5.0",
- "@jest/types": "^29.5.0",
+ "@jest/test-result": "^29.6.4",
+ "@jest/types": "^29.6.3",
"@types/node": "*",
"ansi-escapes": "^4.2.1",
"chalk": "^4.0.0",
"emittery": "^0.13.1",
- "jest-util": "^29.5.0",
+ "jest-util": "^29.6.3",
"string-length": "^4.0.1"
}
},
"jest-worker": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz",
- "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==",
+ "version": "29.6.4",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz",
+ "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==",
"dev": true,
"requires": {
"@types/node": "*",
- "jest-util": "^29.5.0",
+ "jest-util": "^29.6.3",
"merge-stream": "^2.0.0",
"supports-color": "^8.0.0"
},
@@ -11660,6 +11756,11 @@
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"dev": true
},
+ "jsonpath-plus": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz",
+ "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA=="
+ },
"jsonwebtoken": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
@@ -11688,6 +11789,11 @@
"resolved": "https://registry.npmjs.org/jstat/-/jstat-1.9.6.tgz",
"integrity": "sha512-rPBkJbK2TnA8pzs93QcDDPlKcrtZWuuCo2dVR0TFLOJSxhqfWOVCSp8aV3/oSbn+4uY4yw1URtLpHQedtmXfug=="
},
+ "just-clone": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/just-clone/-/just-clone-6.2.0.tgz",
+ "integrity": "sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA=="
+ },
"jwa": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
@@ -11886,19 +11992,22 @@
}
},
"make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
"dev": true,
"requires": {
- "semver": "^6.0.0"
+ "semver": "^7.5.3"
},
"dependencies": {
"semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
}
}
},
@@ -12196,9 +12305,9 @@
"dev": true
},
"node-releases": {
- "version": "2.0.10",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
- "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
+ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==",
"dev": true
},
"nodemailer": {
@@ -12553,9 +12662,9 @@
}
},
"pirates": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
- "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
"dev": true
},
"pkg-dir": {
@@ -12579,12 +12688,12 @@
"dev": true
},
"pretty-format": {
- "version": "29.5.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz",
- "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==",
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz",
+ "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==",
"dev": true,
"requires": {
- "@jest/schemas": "^29.4.3",
+ "@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
"react-is": "^18.0.0"
},
@@ -12654,9 +12763,9 @@
"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA=="
},
"pure-rand": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz",
- "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==",
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.3.tgz",
+ "integrity": "sha512-KddyFewCsO0j3+np81IQ+SweXLDnDQTs5s67BOnrYmYe/yNmUhttQyGsYzy8yUnoljGAQ9sl38YB4vH8ur7Y+w==",
"dev": true
},
"qs": {
@@ -12737,6 +12846,17 @@
"@redis/time-series": "1.0.5"
}
},
+ "redis-om": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/redis-om/-/redis-om-0.4.2.tgz",
+ "integrity": "sha512-sBah+ljGQY4Zm1f9/+l7HjtIuTQH/rzIX3JSLizymbr6VlTZ2ibt+U3xYKNjIA0tv/D9toEMF7HFXHMtT+l+1A==",
+ "requires": {
+ "jsonpath-plus": "^7.2.0",
+ "just-clone": "^6.1.1",
+ "redis": "^4.6.4",
+ "ulid": "^2.3.0"
+ }
+ },
"require-at": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz",
@@ -12755,12 +12875,12 @@
"dev": true
},
"resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "version": "1.22.4",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz",
+ "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==",
"dev": true,
"requires": {
- "is-core-module": "^2.9.0",
+ "is-core-module": "^2.13.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
}
@@ -13474,6 +13594,11 @@
"random-bytes": "~1.0.0"
}
},
+ "ulid": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz",
+ "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw=="
+ },
"undefsafe": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
@@ -13505,9 +13630,9 @@
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
},
"update-browserslist-db": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
- "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+ "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
"dev": true,
"requires": {
"escalade": "^3.1.1",
@@ -13821,9 +13946,9 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"yargs": {
- "version": "17.7.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
- "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
"requires": {
"cliui": "^8.0.1",
diff --git a/package.json b/package.json
index 20512497..03a90b42 100644
--- a/package.json
+++ b/package.json
@@ -48,7 +48,7 @@
"passport": "^0.6.0",
"passport-custom": "^1.1.1",
"passport-jwt": "^4.0.1",
- "redis": "^4.6.8",
+ "redis-om": "^0.4.2",
"simple-ldap-search": "^3.1.2",
"simple-statistics": "^7.8.3",
"socket.io": "^4.6.1",
@@ -60,7 +60,7 @@
"express": "^4.18.1",
"express-session": "^1.17.3",
"jasmine": "^4.3.0",
- "jest": "^29.5.0",
+ "jest": "^29.6.4",
"jsdom": "^21.1.1",
"jsdom-global": "^3.0.2",
"module-alias": "^2.2.3",
diff --git a/src/connections/__tests__/redis.test.js b/src/connections/__tests__/redis.test.js
new file mode 100644
index 00000000..6a434bb5
--- /dev/null
+++ b/src/connections/__tests__/redis.test.js
@@ -0,0 +1,29 @@
+const { Client } = require('redis-om')
+
+const url = process.env.REDIS_URL
+
+// Jest test suite
+describe('Redis Database Tests', () => {
+ it('should connect to Redis', async () => {
+ // Create a Redis client and specify the host and port
+ const client = new Client()
+
+ // Define the Redis connection URL (e.g., 'redis://localhost:6379')
+ const redisUrl = url || 'redis://localhost:6379'
+
+ console.log('Connecting to Redis using URL:', redisUrl)
+
+ // Attempt to connect to Redis using the specified URL
+ await client.open(redisUrl)
+
+ // Check if the client is open (connected)
+ const isOpen = client.isOpen()
+ console.log('Redis client is open:', isOpen)
+
+ // Close the Redis client to release resources
+ await client.close()
+
+ // Wait for the connection to be established
+ expect(isOpen).toBeTruthy()
+ })
+})
From 2de6aeb3879414dca3ae8a5648daff422029368d Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 6 Sep 2023 17:39:42 -0400
Subject: [PATCH 063/229] ldap connection test added
---
src/connections/LDAP_client.js | 6 +++++-
src/connections/__tests__/ldap.test.js | 16 ++++++++++++++++
2 files changed, 21 insertions(+), 1 deletion(-)
create mode 100644 src/connections/__tests__/ldap.test.js
diff --git a/src/connections/LDAP_client.js b/src/connections/LDAP_client.js
index 2994aac9..ea97c216 100644
--- a/src/connections/LDAP_client.js
+++ b/src/connections/LDAP_client.js
@@ -13,7 +13,11 @@ client.on('connectError', (err) => {
})
client.bind(config.ldap.admin.username, config.ldap.admin.password, (err) => {
- assert.ifError(err)
+ if (err) {
+ assert.ifError(err)
+ } else {
+ console.log('Binded to LDAP')
+ }
})
module.exports = client
diff --git a/src/connections/__tests__/ldap.test.js b/src/connections/__tests__/ldap.test.js
new file mode 100644
index 00000000..c7b19aff
--- /dev/null
+++ b/src/connections/__tests__/ldap.test.js
@@ -0,0 +1,16 @@
+const ldapClient = require('../LDAP_client')
+const config = require('../../config/config.js')
+
+describe('LDAP Connection', () => {
+ // This test case will check if the LDAP client is connected successfully
+ it('should connect to LDAP', (done) => {
+ ldapClient.on('connect', () => {
+ console.log('Connected to LDAP')
+ done()
+ })
+
+ ldapClient.on('error', (err) => {
+ done.fail(`Failed to connect to LDAP: ${err}`)
+ })
+ })
+})
From c27768618fc086002a842581fd1e54327ed7cdc5 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 6 Sep 2023 17:45:39 -0400
Subject: [PATCH 064/229] move ldapUtils from helpers to utils
---
src/services/group.services.js | 2 +-
src/services/user.services.js | 2 +-
src/{helpers => utils}/ldapUtils.js | 0
3 files changed, 2 insertions(+), 2 deletions(-)
rename src/{helpers => utils}/ldapUtils.js (100%)
diff --git a/src/services/group.services.js b/src/services/group.services.js
index e3e680aa..a8e4169f 100644
--- a/src/services/group.services.js
+++ b/src/services/group.services.js
@@ -1,6 +1,6 @@
require('dotenv').config({ path: __dirname + '/../../.env' })
const config = require('@src/config/config')
-const { performLdapSearch } = require('@src/helpers/ldapUtils')
+const { performLdapSearch } = require('@src/utils/ldapUtils')
const GroupServices = () => {
const getGroup = async (group) => {
diff --git a/src/services/user.services.js b/src/services/user.services.js
index 49a151a3..bb2cc4f3 100644
--- a/src/services/user.services.js
+++ b/src/services/user.services.js
@@ -3,7 +3,7 @@ const config = require('@src/config/config')
const {
performLdapSearch,
performLdapUpdate,
-} = require('@src/helpers/ldapUtils')
+} = require('@src/utils/ldapUtils')
const UserServices = () => {
const handleFilteredSearch = async (
diff --git a/src/helpers/ldapUtils.js b/src/utils/ldapUtils.js
similarity index 100%
rename from src/helpers/ldapUtils.js
rename to src/utils/ldapUtils.js
From 4b565818f695ccc7e23774fd90818331b52f1cf3 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 6 Sep 2023 18:35:28 -0400
Subject: [PATCH 065/229] migrate client and test to redis instead redis-om
---
package-lock.json | 1 +
package.json | 1 +
src/connections/__tests__/redis.test.js | 45 ++++++++++-------
src/connections/redis_client.js | 67 +++++++++++++------------
4 files changed, 63 insertions(+), 51 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 69abebc3..8b4d0d7a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -41,6 +41,7 @@
"passport": "^0.6.0",
"passport-custom": "^1.1.1",
"passport-jwt": "^4.0.1",
+ "redis": "^4.6.8",
"redis-om": "^0.4.2",
"simple-ldap-search": "^3.1.2",
"simple-statistics": "^7.8.3",
diff --git a/package.json b/package.json
index 03a90b42..d7950abd 100644
--- a/package.json
+++ b/package.json
@@ -48,6 +48,7 @@
"passport": "^0.6.0",
"passport-custom": "^1.1.1",
"passport-jwt": "^4.0.1",
+ "redis": "^4.6.8",
"redis-om": "^0.4.2",
"simple-ldap-search": "^3.1.2",
"simple-statistics": "^7.8.3",
diff --git a/src/connections/__tests__/redis.test.js b/src/connections/__tests__/redis.test.js
index 6a434bb5..3522abe4 100644
--- a/src/connections/__tests__/redis.test.js
+++ b/src/connections/__tests__/redis.test.js
@@ -1,29 +1,36 @@
-const { Client } = require('redis-om')
-
-const url = process.env.REDIS_URL
+const redisClient = require('../redis_client')
// Jest test suite
describe('Redis Database Tests', () => {
- it('should connect to Redis', async () => {
- // Create a Redis client and specify the host and port
- const client = new Client()
-
- // Define the Redis connection URL (e.g., 'redis://localhost:6379')
- const redisUrl = url || 'redis://localhost:6379'
+ beforeAll(async () => {
+ // Create and connect to the Redis client
+ await redisClient.client.connect()
+ console.log(' redisClient.ping()', redisClient.client.ping())
+ })
- console.log('Connecting to Redis using URL:', redisUrl)
+ afterAll(async () => {
+ // Disconnect the Redis client and release resources
+ redisClient.client.quit()
+ })
- // Attempt to connect to Redis using the specified URL
- await client.open(redisUrl)
+ it('should connect to Redis', async () => {
+ // Check if the Redis client is connected
+ const isConnected = redisClient.client.isOpen
+ expect(isConnected).toBeTruthy()
+ })
- // Check if the client is open (connected)
- const isOpen = client.isOpen()
- console.log('Redis client is open:', isOpen)
+ it('should set and get a value from Redis', async () => {
+ // Set a key-value pair
+ await redisClient.client.hSet('key', 'field', 'perro')
- // Close the Redis client to release resources
- await client.close()
+ // Get the value by key
+ const value = await redisClient.client.hGetAll('key')
+ console.log('value', value)
- // Wait for the connection to be established
- expect(isOpen).toBeTruthy()
+ expect(value).toEqual({
+ field: 'perro',
+ })
})
+
+ // Add more tests as needed
})
diff --git a/src/connections/redis_client.js b/src/connections/redis_client.js
index 6560ac97..8f529cb2 100644
--- a/src/connections/redis_client.js
+++ b/src/connections/redis_client.js
@@ -1,41 +1,44 @@
-const redis = require('redis')
-const config = require('@src/config/config')
+const { createClient } = require('redis')
+const { promisify } = require('util')
-// Create a Redis client
-const client = redis.createClient({
- host: config.redis.host, // Docker Desktop container runs on localhost
- port: parseInt(config.redis.port), // Default Redis port
-})
+// Function to create and configure a Redis client
+function createRedisClient() {
+ const redisUrl = process.env.REDIS_URL || 'redis://localhost:6379'
+ const client = createClient({
+ url: redisUrl,
+ })
-// Test the connection
-client.on('connect', () => {
- console.log('Connected to Redis server')
-})
+ // Promisify Redis client methods for async/await support
+ const getAsync = promisify(client.get).bind(client)
+ const setAsync = promisify(client.set).bind(client)
-// Handle errors
-client.on('error', (err) => {
- console.error('Redis Error:', err)
-})
+ // Connect to Redis
+ async function connect() {
+ return new Promise((resolve, reject) => {
+ client.on('error', (err) => {
+ reject(err)
+ })
-// Example: Set a key-value pair
-/* client.set('myKey', 'myValue', (err, reply) => {
- if (err) {
- console.error('Redis Set Error:', err)
- } else {
- console.log('Set result:', reply)
+ client.on('connect', () => {
+ resolve()
+ })
+ })
}
-})
-// Example: Get a value by key
-client.get('myKey', (err, reply) => {
- if (err) {
- console.error('Redis Get Error:', err)
- } else {
- console.log('Get result:', reply)
+ // Close the Redis client to release resources
+ function disconnect() {
+ client.quit()
}
-}) */
-// Close the Redis connection (when needed)
-// client.quit();
+ // Return the Redis client and utility functions
+ return {
+ client,
+ connect,
+ disconnect,
+ isConnected: client.isOpen,
+ getAsync,
+ setAsync,
+ }
+}
-module.exports = { client }
+module.exports = createRedisClient()
From bd9837a7f8e1fc5a5ba0326b25e0a5780f9079eb Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 6 Sep 2023 22:46:57 -0400
Subject: [PATCH 066/229] add auth services test
---
src/connections/__tests__/redis.test.js | 2 --
src/services/__tests__/auth.services.test.js | 35 ++++++++++++++++++++
src/services/auth.services.js | 21 ++++++++++++
3 files changed, 56 insertions(+), 2 deletions(-)
create mode 100644 src/services/__tests__/auth.services.test.js
create mode 100644 src/services/auth.services.js
diff --git a/src/connections/__tests__/redis.test.js b/src/connections/__tests__/redis.test.js
index 3522abe4..d4bee4c8 100644
--- a/src/connections/__tests__/redis.test.js
+++ b/src/connections/__tests__/redis.test.js
@@ -5,7 +5,6 @@ describe('Redis Database Tests', () => {
beforeAll(async () => {
// Create and connect to the Redis client
await redisClient.client.connect()
- console.log(' redisClient.ping()', redisClient.client.ping())
})
afterAll(async () => {
@@ -25,7 +24,6 @@ describe('Redis Database Tests', () => {
// Get the value by key
const value = await redisClient.client.hGetAll('key')
- console.log('value', value)
expect(value).toEqual({
field: 'perro',
diff --git a/src/services/__tests__/auth.services.test.js b/src/services/__tests__/auth.services.test.js
new file mode 100644
index 00000000..22c97330
--- /dev/null
+++ b/src/services/__tests__/auth.services.test.js
@@ -0,0 +1,35 @@
+const redisClient = require('../../connections/redis_client')
+
+describe('addToBlackList Service', () => {
+ beforeAll(async () => {
+ // Create and connect to the Redis client
+ await redisClient.client.connect()
+ })
+
+ it('should connect to Redis', async () => {
+ // Check if the Redis client is connected
+ const isConnected = redisClient.client.isOpen
+ expect(isConnected).toBeTruthy()
+ })
+
+ afterAll(async () => {
+ // Disconnect the Redis client and release resources
+ redisClient.client.quit()
+ })
+
+ it('should add a token to the blacklist when connected', async () => {
+ const token = 'your_jwt_token_here'
+ const expirationInSeconds = 3600 // 1 hour
+ const defaultValue = '1'
+
+ redisClient.client.hSet(token, expirationInSeconds, defaultValue)
+
+ const value = await redisClient.client.hGetAll(token)
+
+ console.log(value)
+
+ expect(value).toEqual({
+ 3600: defaultValue,
+ })
+ })
+})
diff --git a/src/services/auth.services.js b/src/services/auth.services.js
new file mode 100644
index 00000000..60d56812
--- /dev/null
+++ b/src/services/auth.services.js
@@ -0,0 +1,21 @@
+const {
+ client,
+ connect,
+ isConnected,
+ disconnect,
+} = require('../connections/redis_client')
+
+const addToBlackList = async (token, expirationInSeconds) => {
+ try {
+ await connect()
+ if (isConnected) {
+ client.hSet(token, expirationInSeconds, '1')
+ } else {
+ throw new Error('Error connecting to redis DB')
+ }
+ } catch (error) {}
+}
+
+module.exports = {
+ addToBlackList,
+}
From a0cdb4f31298831d04cbc7f12c4098952af68ff6 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 6 Sep 2023 23:13:21 -0400
Subject: [PATCH 067/229] logout method added
---
src/modules/authentication/LdapAuth.js | 30 +++++++++++++++++++++++---
src/services/auth.services.js | 16 ++++++++++----
2 files changed, 39 insertions(+), 7 deletions(-)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 50784306..6373cb6a 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -10,6 +10,8 @@ const UserServices = require('../../services/user.services')
const GroupServices = require('../../services/group.services')
const User = require('../../schemas/user.schema').User
const ProfileServices = require('../../services/profile.services')
+const { addToBlackList } = require('@src/services/auth.services')
+const { checkAuth, checkRoles } = require('@src/middlewares/auth.handler')
/* helpers */
const {
@@ -49,13 +51,13 @@ var _usernameAttributeName
const sessionStore = new Map()
function checkLastAuthentication(req, res, next) {
- /* const userId = req.body.username
+ const userId = req.body.username
const lastAuthTimestamp = sessionStore.get(userId)
if (!lastAuthTimestamp || Date.now() - lastAuthTimestamp >= 15 * 60 * 1000) {
next()
} else {
res.status(401).json({ message: 'Logout first before re-authenticating.' })
- } */
+ }
next()
}
var init = function (
@@ -176,7 +178,8 @@ var init = function (
router.use(passport.initialize())
router.use(passport.session())
// login
- router.post(_loginUrl, checkLastAuthentication, login)
+ router.post(_loginUrl, login)
+ router.post(_logoutUrl, checkAuth, logout)
}
/**
@@ -274,5 +277,26 @@ const login = function (req, res, next) {
)(req, res, next)
}
+const logout = function (req, res, next) {
+ try {
+ const token = req.headers.authorization.split(' ')[1]
+ const isLogout = addToBlackList(token)
+ if (isLogout) {
+ res.status(200).json({
+ success: true,
+ message: 'user logged out correctly',
+ })
+ } else {
+ res.status(500).json({
+ success: false,
+ error: 'Invalid token',
+ message: `this token hasn't been used yet`,
+ })
+ }
+ } catch (error) {
+ res.status(401).json({ success: false, message: 'Invalid token' })
+ }
+}
+
module.exports.init = init
module.exports.initialize = initialize
diff --git a/src/services/auth.services.js b/src/services/auth.services.js
index 60d56812..b610ca19 100644
--- a/src/services/auth.services.js
+++ b/src/services/auth.services.js
@@ -5,15 +5,23 @@ const {
disconnect,
} = require('../connections/redis_client')
-const addToBlackList = async (token, expirationInSeconds) => {
+const addToBlackList = async (token, expirationInSeconds = 3600) => {
try {
- await connect()
- if (isConnected) {
+ await client.connect()
+ if (client.isOpen) {
client.hSet(token, expirationInSeconds, '1')
+ disconnect()
+ return true
} else {
+ disconnect()
throw new Error('Error connecting to redis DB')
}
- } catch (error) {}
+ } catch (err) {
+ disconnect()
+ console.log('error', err)
+ throw new Error('Error connecting to redis DB')
+ }
+ return falsef
}
module.exports = {
From 0576f513595427228cee5950a9b5b3b54e98670f Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 6 Sep 2023 23:24:59 -0400
Subject: [PATCH 068/229] add method to check is blacklisted token
---
src/services/auth.services.js | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/src/services/auth.services.js b/src/services/auth.services.js
index b610ca19..cdd570d2 100644
--- a/src/services/auth.services.js
+++ b/src/services/auth.services.js
@@ -9,6 +9,10 @@ const addToBlackList = async (token, expirationInSeconds = 3600) => {
try {
await client.connect()
if (client.isOpen) {
+ const exists = await client.exists(token)
+ if (exists > 0) {
+ throw new Error('Already logged out')
+ }
client.hSet(token, expirationInSeconds, '1')
disconnect()
return true
@@ -21,9 +25,31 @@ const addToBlackList = async (token, expirationInSeconds = 3600) => {
console.log('error', err)
throw new Error('Error connecting to redis DB')
}
- return falsef
}
+const isBlackListed = async (token) => {
+ try {
+ await client.connect()
+ if (client.isOpen) {
+ const exists = await client.exists(token)
+ disconnect()
+ return exists === 0 ? false : true
+ } else {
+ disconnect()
+ throw new Error('Error connecting to redis DB')
+ }
+ } catch (error) {
+ disconnect()
+ console.log('error', err)
+ throw new Error('Error connecting to redis DB')
+ }
+}
+
+isBlackListed(
+ 'yJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhaG1lZGl2YW4uZ29uemFsZXoiLCJkbiI6InVpZD1haG1lZGl2YW4uZ29uemFsZXosb3U9dXN1YXJpb3Msb3U9aW5mb3JtYXRpY2EsZGM9Y3VqYWUsZGM9ZWR1LGRjPWN1IiwidWlkIjoiYWhtZWRpdmFuLmdvbnphbGV6IiwiZ3JvdXBzIjpbInVzdWFyaW9zIiwiaW5mb3JtYXRpY2EiXSwiYmFzZSI6ImRjPWN1amFlLGRjPWVkdSxkYz1jdSIsImxvY2FsQmFzZSI6Im91PXVzdWFyaW9zLG91PWluZm9ybWF0aWNhLGRjPWN1amFlLGRjPWVkdSxkYz1jdSIsImZpcnN0bmFtZSI6ImFobWVkaXZhbi5nb256YWxleiIsImxhc3RuYW1lIjoiR29uesOhbGV6IEJldGFuY291cnQiLCJmdWxsbmFtZSI6IkFobWVkIEl2w6FuIiwiZW1haWwiOiJhaG1lZGl2YW4uZ29uemFsZXpAY3VqYWUuZWR1LmN1IiwiY2kiOiIwMDA5MjA2ODQyNiIsInJvbGVzIjpbImFkbWluIiwidXNlciJdLCJsYXN0X3RpbWVfbG9nZ2VkIjoiMjAyMy0wOS0wNlQxOTozMToyNS43ODNaIiwibG9naW5JbmZvIjoiOS82LzIwMjMsIDEwOjU0OjM3IFBNIiwiaWF0IjoxNjk0MDU1Mjc4LCJleHAiOjE2OTQwNTc5Nzh9.0WKdygQ10i7I9Tu4yIPhmJZeyJ7RoJ0IYybe2Wlh0SM'
+)
+
module.exports = {
addToBlackList,
+ isBlackListed,
}
From f3e52af7e5e4aa352d7e47d6369e6b5d56684a40 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Wed, 6 Sep 2023 23:47:21 -0400
Subject: [PATCH 069/229] add expired token middleware
---
src/middlewares/auth.handler.js | 30 ++++++++++++++
src/modules/authentication/LdapAuth.js | 8 ++--
src/routes/profile.routes.js | 56 +++++++++++++++++---------
src/routes/user.routes.js | 8 +++-
src/services/auth.services.js | 12 +++---
5 files changed, 83 insertions(+), 31 deletions(-)
diff --git a/src/middlewares/auth.handler.js b/src/middlewares/auth.handler.js
index a0d73335..cc2ff473 100644
--- a/src/middlewares/auth.handler.js
+++ b/src/middlewares/auth.handler.js
@@ -2,6 +2,7 @@ const passport = require('passport')
const { verifyToken } = require('../utils/authentication/tokens/token_verify')
const boom = require('@hapi/boom')
const { responseError } = require('../schemas/response.schema')
+const { isBlackListed } = require('@src/services/auth.services')
const checkAuth = (req, res, next) => {
const auth = passport.authenticate('jwt', { session: false })
@@ -31,7 +32,36 @@ const checkRoles = (...roles) => {
}
}
+// Middleware to check if a JWT token is blacklisted
+const checkBlacklist = async (req, res, next) => {
+ const token = req.headers.authorization.split(' ')[1] // Assuming the token is in the Authorization header
+
+ if (!token) {
+ return res.status(401).json({ message: 'Unauthorized' })
+ }
+
+ try {
+ const isBlacklisted = await isBlackListed(token)
+ console.log('isBlacklisted', isBlacklisted)
+
+ if (isBlacklisted) {
+ return res.status(401).json({
+ success: false,
+ error: 'Token is expired',
+ message: 'Try to Log In again',
+ })
+ }
+
+ // Token is not blacklisted, continue with the request
+ next()
+ } catch (error) {
+ console.error('Error checking token blacklist:', error)
+ return res.status(500).json({ message: 'Internal Server Error' })
+ }
+}
+
module.exports = {
checkAuth,
checkRoles,
+ checkBlacklist,
}
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 6373cb6a..1f17690c 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -277,10 +277,11 @@ const login = function (req, res, next) {
)(req, res, next)
}
-const logout = function (req, res, next) {
+const logout = async function (req, res, next) {
try {
const token = req.headers.authorization.split(' ')[1]
- const isLogout = addToBlackList(token)
+ const isLogout = await addToBlackList(token)
+ console.log('isLogout', isLogout)
if (isLogout) {
res.status(200).json({
success: true,
@@ -290,10 +291,9 @@ const logout = function (req, res, next) {
res.status(500).json({
success: false,
error: 'Invalid token',
- message: `this token hasn't been used yet`,
})
}
- } catch (error) {
+ } catch (err) {
res.status(401).json({ success: false, message: 'Invalid token' })
}
}
diff --git a/src/routes/profile.routes.js b/src/routes/profile.routes.js
index 0318bbeb..b0bb7fc6 100644
--- a/src/routes/profile.routes.js
+++ b/src/routes/profile.routes.js
@@ -3,31 +3,49 @@ const router = express.Router()
const ProfileServices = require('../services/profile.services')
const { responseSuccess, responseError } = require('../schemas/response.schema')
const validateResponse = require('../middlewares/validateResponse')
-const { checkAuth, checkRoles } = require('../middlewares/auth.handler')
+const {
+ checkAuth,
+ checkRoles,
+ checkBlacklist,
+} = require('../middlewares/auth.handler')
const service = ProfileServices()
//Get all users
-router.get('/', checkAuth, checkRoles('user'), validateResponse, (req, res) => {
- service
- .getProfile(req)
- .then((data) => responseSuccess(res, 'data fetched succesfully', data))
- .catch((err) => responseError(res, err.message, err.errors))
-})
-
-router.put('/', checkAuth, checkRoles('user'), validateResponse, (req, res) => {
- const { email, password, confirmPassword } = req.body
- if (!email && !password) {
- responseError(res, 'fields cannot be empty', null)
- } else if (password) {
- if (password !== confirmPassword) {
- responseError(res, 'passwords must be the same')
- }
- } else {
+router.get(
+ '/',
+ checkAuth,
+ checkBlacklist,
+ checkRoles('user'),
+ validateResponse,
+ (req, res) => {
service
- .updateProfile(email, password, req)
+ .getProfile(req)
.then((data) => responseSuccess(res, 'data fetched succesfully', data))
.catch((err) => responseError(res, err.message, err.errors))
}
-})
+)
+
+router.put(
+ '/',
+ checkAuth,
+ checkBlacklist,
+ checkRoles('user'),
+ validateResponse,
+ (req, res) => {
+ const { email, password, confirmPassword } = req.body
+ if (!email && !password) {
+ responseError(res, 'fields cannot be empty', null)
+ } else if (password) {
+ if (password !== confirmPassword) {
+ responseError(res, 'passwords must be the same')
+ }
+ } else {
+ service
+ .updateProfile(email, password, req)
+ .then((data) => responseSuccess(res, 'data fetched succesfully', data))
+ .catch((err) => responseError(res, err.message, err.errors))
+ }
+ }
+)
module.exports = router
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index 461d8037..1b755c92 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -2,7 +2,11 @@ const express = require('express')
const router = express.Router()
const UserServices = require('@src/services/user.services.js')
const validateResponse = require('@src/middlewares/validateResponse')
-const { checkAuth, checkRoles } = require('@src/middlewares/auth.handler')
+const {
+ checkAuth,
+ checkRoles,
+ checkBlacklist,
+} = require('@src/middlewares/auth.handler')
const service = UserServices()
const config = require('@src/config/config')
const {
@@ -11,7 +15,7 @@ const {
const validateQuery = require('@src/middlewares/queryValidator')
// Middleware for routes requiring checkAuth and checkRoles('admin')
-router.use(checkAuth, checkRoles('admin'))
+router.use(checkAuth, checkBlacklist, checkRoles('admin'))
// Middleware to handle common success and error responses
router.use(validateResponse)
diff --git a/src/services/auth.services.js b/src/services/auth.services.js
index cdd570d2..b5e72438 100644
--- a/src/services/auth.services.js
+++ b/src/services/auth.services.js
@@ -11,7 +11,8 @@ const addToBlackList = async (token, expirationInSeconds = 3600) => {
if (client.isOpen) {
const exists = await client.exists(token)
if (exists > 0) {
- throw new Error('Already logged out')
+ disconnect()
+ return false
}
client.hSet(token, expirationInSeconds, '1')
disconnect()
@@ -28,12 +29,15 @@ const addToBlackList = async (token, expirationInSeconds = 3600) => {
}
const isBlackListed = async (token) => {
+ console.log('token', token)
try {
await client.connect()
if (client.isOpen) {
const exists = await client.exists(token)
+ console.log('exists', exists)
disconnect()
- return exists === 0 ? false : true
+ if (exists === 0) return false
+ else return true
} else {
disconnect()
throw new Error('Error connecting to redis DB')
@@ -45,10 +49,6 @@ const isBlackListed = async (token) => {
}
}
-isBlackListed(
- 'yJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhaG1lZGl2YW4uZ29uemFsZXoiLCJkbiI6InVpZD1haG1lZGl2YW4uZ29uemFsZXosb3U9dXN1YXJpb3Msb3U9aW5mb3JtYXRpY2EsZGM9Y3VqYWUsZGM9ZWR1LGRjPWN1IiwidWlkIjoiYWhtZWRpdmFuLmdvbnphbGV6IiwiZ3JvdXBzIjpbInVzdWFyaW9zIiwiaW5mb3JtYXRpY2EiXSwiYmFzZSI6ImRjPWN1amFlLGRjPWVkdSxkYz1jdSIsImxvY2FsQmFzZSI6Im91PXVzdWFyaW9zLG91PWluZm9ybWF0aWNhLGRjPWN1amFlLGRjPWVkdSxkYz1jdSIsImZpcnN0bmFtZSI6ImFobWVkaXZhbi5nb256YWxleiIsImxhc3RuYW1lIjoiR29uesOhbGV6IEJldGFuY291cnQiLCJmdWxsbmFtZSI6IkFobWVkIEl2w6FuIiwiZW1haWwiOiJhaG1lZGl2YW4uZ29uemFsZXpAY3VqYWUuZWR1LmN1IiwiY2kiOiIwMDA5MjA2ODQyNiIsInJvbGVzIjpbImFkbWluIiwidXNlciJdLCJsYXN0X3RpbWVfbG9nZ2VkIjoiMjAyMy0wOS0wNlQxOTozMToyNS43ODNaIiwibG9naW5JbmZvIjoiOS82LzIwMjMsIDEwOjU0OjM3IFBNIiwiaWF0IjoxNjk0MDU1Mjc4LCJleHAiOjE2OTQwNTc5Nzh9.0WKdygQ10i7I9Tu4yIPhmJZeyJ7RoJ0IYybe2Wlh0SM'
-)
-
module.exports = {
addToBlackList,
isBlackListed,
From ee09835b58ecd995a065e53236167f8b3e58fb33 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Thu, 7 Sep 2023 14:05:18 -0400
Subject: [PATCH 070/229] set session expiredTime to 15 min instead 1 day
---
src/middlewares/session.handler.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/middlewares/session.handler.js b/src/middlewares/session.handler.js
index f86e1266..41ea6f43 100644
--- a/src/middlewares/session.handler.js
+++ b/src/middlewares/session.handler.js
@@ -24,7 +24,7 @@ try {
unset: 'destroy',
cookie: {
httpOnly: false,
- maxAge: 1000 * 3600 * 24,
+ maxAge: 900000, // 15 minutes in milliseconds
secure: false, // this need to be false if https is not used. Otherwise, cookie will not be sent.
},
})
From f7b8960c2d8d493f7057694a597872c06629fbe6 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Thu, 7 Sep 2023 14:05:54 -0400
Subject: [PATCH 071/229] forbit users to log in if already has a session
---
src/modules/authentication/LdapAuth.js | 18 ++++--------------
1 file changed, 4 insertions(+), 14 deletions(-)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 1f17690c..f880ebc3 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -48,18 +48,6 @@ var _usernameAttributeName
* @param {string} [logoutUrl] - path to logout page. Default: /logout
*/
-const sessionStore = new Map()
-
-function checkLastAuthentication(req, res, next) {
- const userId = req.body.username
- const lastAuthTimestamp = sessionStore.get(userId)
- if (!lastAuthTimestamp || Date.now() - lastAuthTimestamp >= 15 * 60 * 1000) {
- next()
- } else {
- res.status(401).json({ message: 'Logout first before re-authenticating.' })
- }
- next()
-}
var init = function (
opt,
ldapurl,
@@ -92,6 +80,10 @@ var init = function (
}
const username = req.body.username
const password = req.body.password
+
+ if (req.session.passport !== undefined)
+ throw new Error('log out before logging back in')
+
const res = await userService.getByUsername(username)
const response = res[0]
@@ -236,8 +228,6 @@ const login = function (req, res, next) {
const rootBaseDN = extractBaseFromDn(ldapDn)
const localBaseDN = user.dn.replace(`uid=${user.uid},`, '')
- sessionStore.set(user.uid, Date.now())
-
const payload = {
sub: user.uid,
dn: user.dn,
From 485ff1f18817ba694f24ab2a87ff77295fd4cc32 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Thu, 7 Sep 2023 14:06:05 -0400
Subject: [PATCH 072/229] add session middleware test
---
.../__tests__/authMiddleware.test.js | 53 +++++++++++++++++++
1 file changed, 53 insertions(+)
create mode 100644 src/modules/authentication/__tests__/authMiddleware.test.js
diff --git a/src/modules/authentication/__tests__/authMiddleware.test.js b/src/modules/authentication/__tests__/authMiddleware.test.js
new file mode 100644
index 00000000..63d21c3e
--- /dev/null
+++ b/src/modules/authentication/__tests__/authMiddleware.test.js
@@ -0,0 +1,53 @@
+const request = require('supertest')
+const express = require('express')
+
+// Importa tu aplicación Express con la ruta protegida
+const app = express()
+
+// Configura tu aplicación Express con el middleware de sesión
+const authMiddleware = (req, res, next) => {
+ if (req.headers.cookie && req.headers.cookie !== undefined) {
+ // El usuario está autenticado
+ next()
+ } else {
+ // El usuario no está autenticado
+ res.status(401).json({ message: 'No autorizado' })
+ }
+}
+
+app.use(authMiddleware)
+
+// Define una ruta de prueba protegida con el middleware de autenticación
+app.get('/ruta-protegida', (req, res) => {
+ res.json({ message: 'Ruta protegida' })
+})
+
+describe('Pruebas de autenticación', () => {
+ it('Debería permitir el acceso a la ruta protegida si el usuario está autenticado', async () => {
+ // Simula una sesión autenticada
+ const authenticatedSession = {
+ passport: { user: 'usuario-autenticado' },
+ }
+
+ // Crea una sesión de prueba con el usuario autenticado
+ const sessionCookie = Buffer.from(
+ JSON.stringify(authenticatedSession)
+ ).toString('base64')
+
+ const response = await request(app)
+ .get('/ruta-protegida')
+ .set('Cookie', [`session=${sessionCookie}`])
+
+ // Debería responder con un código 200 si el usuario está autenticado
+ expect(response.status).toBe(200)
+ expect(response.body.message).toBe('Ruta protegida')
+ })
+
+ it('Debería denegar el acceso a la ruta protegida si el usuario no está autenticado', async () => {
+ const response = await request(app).get('/ruta-protegida')
+
+ // Debería responder con un código 401 si el usuario no está autenticado
+ expect(response.status).toBe(401)
+ expect(response.body.message).toBe('No autorizado')
+ })
+})
From f21513de97231d933236862350e0dae42268ab4a Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Thu, 7 Sep 2023 19:55:56 -0400
Subject: [PATCH 073/229] destroy user session on logout
---
src/modules/authentication/LdapAuth.js | 26 ++------------
src/modules/authentication/functions/index.js | 36 +++++++++++++++++++
2 files changed, 38 insertions(+), 24 deletions(-)
create mode 100644 src/modules/authentication/functions/index.js
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index f880ebc3..e0fa07f7 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -7,11 +7,10 @@ const CustomStrategy = require('passport-custom').Strategy
const JwtStrategy = require('../../utils/authentication/strategies/jwtStrategy')
const { authenticate } = require('ldap-authentication')
const UserServices = require('../../services/user.services')
-const GroupServices = require('../../services/group.services')
const User = require('../../schemas/user.schema').User
const ProfileServices = require('../../services/profile.services')
-const { addToBlackList } = require('@src/services/auth.services')
const { checkAuth, checkRoles } = require('@src/middlewares/auth.handler')
+const { logout } = require('./functions/index.js')
/* helpers */
const {
@@ -246,7 +245,7 @@ const login = function (req, res, next) {
}
const userObj = { ...user }
- const token = signToken(payload, { expiresIn: '45 minutes' })
+ const token = signToken(payload, { expiresIn: '15 minutes' })
const refreshToken = signToken(payload, { expiresIn: '1 day' })
req.login(user, (loginErr) => {
@@ -267,26 +266,5 @@ const login = function (req, res, next) {
)(req, res, next)
}
-const logout = async function (req, res, next) {
- try {
- const token = req.headers.authorization.split(' ')[1]
- const isLogout = await addToBlackList(token)
- console.log('isLogout', isLogout)
- if (isLogout) {
- res.status(200).json({
- success: true,
- message: 'user logged out correctly',
- })
- } else {
- res.status(500).json({
- success: false,
- error: 'Invalid token',
- })
- }
- } catch (err) {
- res.status(401).json({ success: false, message: 'Invalid token' })
- }
-}
-
module.exports.init = init
module.exports.initialize = initialize
diff --git a/src/modules/authentication/functions/index.js b/src/modules/authentication/functions/index.js
new file mode 100644
index 00000000..d20e94ce
--- /dev/null
+++ b/src/modules/authentication/functions/index.js
@@ -0,0 +1,36 @@
+const { addToBlackList } = require('@src/services/auth.services')
+
+const clearSession = (req) => {
+ return new Promise((resolve, reject) => {
+ req.session.destroy((err) => {
+ if (err) {
+ reject(err)
+ } else {
+ resolve()
+ }
+ })
+ })
+}
+
+const logout = async function (req, res, next) {
+ try {
+ await clearSession(req)
+ const token = req.headers.authorization.split(' ')[1]
+ const isLogout = await addToBlackList(token)
+ if (isLogout) {
+ res.status(200).json({
+ success: true,
+ message: 'user logged out correctly',
+ })
+ } else {
+ res.status(500).json({
+ success: false,
+ error: 'Invalid token',
+ })
+ }
+ } catch (err) {
+ res.status(401).json({ success: false, message: 'Invalid token' })
+ }
+}
+
+module.exports = { logout }
From cce386e94be794d5324fb47f1e19b07231266c0e Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Thu, 7 Sep 2023 20:45:40 -0400
Subject: [PATCH 074/229] save and delete refreshToken on login and logout
---
src/modules/authentication/LdapAuth.js | 8 ++-
src/modules/authentication/functions/index.js | 8 ++-
src/services/auth.services.js | 70 ++++++++++++++++++-
3 files changed, 81 insertions(+), 5 deletions(-)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index e0fa07f7..eb879d67 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -9,8 +9,12 @@ const { authenticate } = require('ldap-authentication')
const UserServices = require('../../services/user.services')
const User = require('../../schemas/user.schema').User
const ProfileServices = require('../../services/profile.services')
-const { checkAuth, checkRoles } = require('@src/middlewares/auth.handler')
+const { checkAuth } = require('@src/middlewares/auth.handler')
const { logout } = require('./functions/index.js')
+const {
+ storeRefreshToken,
+ getRefreshToken,
+} = require('@src/services/auth.services')
/* helpers */
const {
@@ -248,6 +252,8 @@ const login = function (req, res, next) {
const token = signToken(payload, { expiresIn: '15 minutes' })
const refreshToken = signToken(payload, { expiresIn: '1 day' })
+ await storeRefreshToken(user.uid, refreshToken)
+
req.login(user, (loginErr) => {
if (loginErr) {
return next(loginErr)
diff --git a/src/modules/authentication/functions/index.js b/src/modules/authentication/functions/index.js
index d20e94ce..236aabcb 100644
--- a/src/modules/authentication/functions/index.js
+++ b/src/modules/authentication/functions/index.js
@@ -1,4 +1,7 @@
-const { addToBlackList } = require('@src/services/auth.services')
+const {
+ addToBlackList,
+ deleteRefreshToken,
+} = require('@src/services/auth.services')
const clearSession = (req) => {
return new Promise((resolve, reject) => {
@@ -14,9 +17,10 @@ const clearSession = (req) => {
const logout = async function (req, res, next) {
try {
- await clearSession(req)
const token = req.headers.authorization.split(' ')[1]
const isLogout = await addToBlackList(token)
+ await clearSession(req)
+ await deleteRefreshToken(req.user.uid)
if (isLogout) {
res.status(200).json({
success: true,
diff --git a/src/services/auth.services.js b/src/services/auth.services.js
index b5e72438..d2569e30 100644
--- a/src/services/auth.services.js
+++ b/src/services/auth.services.js
@@ -29,12 +29,10 @@ const addToBlackList = async (token, expirationInSeconds = 3600) => {
}
const isBlackListed = async (token) => {
- console.log('token', token)
try {
await client.connect()
if (client.isOpen) {
const exists = await client.exists(token)
- console.log('exists', exists)
disconnect()
if (exists === 0) return false
else return true
@@ -49,7 +47,75 @@ const isBlackListed = async (token) => {
}
}
+const storeRefreshToken = async (userId, refreshToken) => {
+ try {
+ await client.connect()
+ if (client.isOpen) {
+ client.set(`refreshToken:${userId}`, refreshToken, (err) => {
+ if (err) {
+ disconnect()
+ console.error('Error storing refresh token:', err)
+ } else {
+ disconnect()
+ console.log('Refresh token stored successfully.')
+ }
+ })
+ disconnect()
+ } else {
+ disconnect()
+ throw new Error('Error connecting to redis DB')
+ }
+ } catch (error) {
+ disconnect()
+ console.error('Error storing refresh token:', error)
+ }
+}
+
+const deleteRefreshToken = async (userId) => {
+ try {
+ await client.connect()
+ if (client.isOpen) {
+ const data = await client.del(`refreshToken:${userId}`)
+ console.log('Refresh token deleted successfully.')
+ disconnect()
+ return data
+ } else {
+ disconnect()
+ throw new Error('Error connecting to redis DB')
+ }
+ } catch (error) {
+ disconnect()
+ console.error('Error deleting refresh token:', error)
+ throw error // Re-throw the error to propagate it further if needed
+ }
+}
+
+const getRefreshToken = async (userId, callback) => {
+ try {
+ await client.connect()
+
+ client.get(`refreshToken:${userId}`, (err, refreshToken) => {
+ if (err) {
+ disconnect()
+ console.error('Error retrieving refresh token:', err)
+ callback(err)
+ } else {
+ disconnect()
+ console.log('Refresh token retrieved successfully.')
+ callback(null, refreshToken)
+ }
+ })
+ } catch (error) {
+ disconnect()
+ console.error('Error retrieving refresh token:', error)
+ callback(error)
+ }
+}
+
module.exports = {
addToBlackList,
isBlackListed,
+ getRefreshToken,
+ storeRefreshToken,
+ deleteRefreshToken,
}
From b295af875f44845addd6a7a3f09b9b95cb13693f Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Fri, 8 Sep 2023 19:19:59 -0400
Subject: [PATCH 075/229] logout working ok
---
src/modules/authentication/functions/index.js | 26 +++++-----------
src/services/auth.services.js | 31 ++++++++-----------
2 files changed, 20 insertions(+), 37 deletions(-)
diff --git a/src/modules/authentication/functions/index.js b/src/modules/authentication/functions/index.js
index 236aabcb..07fe3813 100644
--- a/src/modules/authentication/functions/index.js
+++ b/src/modules/authentication/functions/index.js
@@ -15,26 +15,14 @@ const clearSession = (req) => {
})
}
-const logout = async function (req, res, next) {
- try {
- const token = req.headers.authorization.split(' ')[1]
- const isLogout = await addToBlackList(token)
- await clearSession(req)
- await deleteRefreshToken(req.user.uid)
- if (isLogout) {
- res.status(200).json({
- success: true,
- message: 'user logged out correctly',
- })
- } else {
- res.status(500).json({
- success: false,
- error: 'Invalid token',
- })
- }
- } catch (err) {
- res.status(401).json({ success: false, message: 'Invalid token' })
+const logout = (req, res) => {
+ const accessToken = req.body.accessToken // You can adjust this based on how you send the token in the request
+ clearSession(req)
+ if (!accessToken) {
+ return res.status(400).json({ message: 'Access token is required.' })
}
+ addToBlackList(req.user.uid, accessToken)
+ return res.status(200).json({ message: 'User logged out successfully.' })
}
module.exports = { logout }
diff --git a/src/services/auth.services.js b/src/services/auth.services.js
index d2569e30..3ae860ca 100644
--- a/src/services/auth.services.js
+++ b/src/services/auth.services.js
@@ -5,45 +5,40 @@ const {
disconnect,
} = require('../connections/redis_client')
-const addToBlackList = async (token, expirationInSeconds = 3600) => {
+const isBlackListed = async (token) => {
try {
await client.connect()
+
if (client.isOpen) {
- const exists = await client.exists(token)
- if (exists > 0) {
- disconnect()
- return false
- }
- client.hSet(token, expirationInSeconds, '1')
+ const userId = await client.get(`blackList:${token}`)
disconnect()
- return true
+
+ // If userId is not null, it means the token exists in the blacklist
+ return userId !== null
} else {
disconnect()
throw new Error('Error connecting to redis DB')
}
- } catch (err) {
+ } catch (error) {
disconnect()
- console.log('error', err)
- throw new Error('Error connecting to redis DB')
+ console.error('Error checking token in blacklist:', error)
+ throw error
}
}
-const isBlackListed = async (token) => {
+const addToBlackList = async (userId, token) => {
try {
await client.connect()
if (client.isOpen) {
- const exists = await client.exists(token)
+ await client.set(`blackList:${token}`, userId)
disconnect()
- if (exists === 0) return false
- else return true
} else {
disconnect()
throw new Error('Error connecting to redis DB')
}
} catch (error) {
disconnect()
- console.log('error', err)
- throw new Error('Error connecting to redis DB')
+ console.error('Error storing refresh token:', error)
}
}
@@ -114,8 +109,8 @@ const getRefreshToken = async (userId, callback) => {
module.exports = {
addToBlackList,
- isBlackListed,
getRefreshToken,
storeRefreshToken,
deleteRefreshToken,
+ isBlackListed,
}
From b975eb87711a0f421edd5272639ef4b9ca103197 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Fri, 8 Sep 2023 19:22:45 -0400
Subject: [PATCH 076/229] refactor auth services
---
src/services/auth.services.js | 24 +++---------------------
1 file changed, 3 insertions(+), 21 deletions(-)
diff --git a/src/services/auth.services.js b/src/services/auth.services.js
index 3ae860ca..c8f60349 100644
--- a/src/services/auth.services.js
+++ b/src/services/auth.services.js
@@ -46,15 +46,7 @@ const storeRefreshToken = async (userId, refreshToken) => {
try {
await client.connect()
if (client.isOpen) {
- client.set(`refreshToken:${userId}`, refreshToken, (err) => {
- if (err) {
- disconnect()
- console.error('Error storing refresh token:', err)
- } else {
- disconnect()
- console.log('Refresh token stored successfully.')
- }
- })
+ await client.set(`refreshToken:${userId}`, refreshToken)
disconnect()
} else {
disconnect()
@@ -88,18 +80,8 @@ const deleteRefreshToken = async (userId) => {
const getRefreshToken = async (userId, callback) => {
try {
await client.connect()
-
- client.get(`refreshToken:${userId}`, (err, refreshToken) => {
- if (err) {
- disconnect()
- console.error('Error retrieving refresh token:', err)
- callback(err)
- } else {
- disconnect()
- console.log('Refresh token retrieved successfully.')
- callback(null, refreshToken)
- }
- })
+ const refreshToken = await client.get(`refreshToken:${userId}`)
+ return refreshToken
} catch (error) {
disconnect()
console.error('Error retrieving refresh token:', error)
From 4853a30b3ab076a81a85db6d2d637a6cabd110dd Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Fri, 8 Sep 2023 19:58:25 -0400
Subject: [PATCH 077/229] retrieve new token and refreshToken on refresh
endpoint
---
src/modules/authentication/LdapAuth.js | 5 +-
src/modules/authentication/functions/index.js | 74 ++++++++++++++++++-
src/services/auth.services.js | 1 +
3 files changed, 77 insertions(+), 3 deletions(-)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index eb879d67..762489a3 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -10,7 +10,7 @@ const UserServices = require('../../services/user.services')
const User = require('../../schemas/user.schema').User
const ProfileServices = require('../../services/profile.services')
const { checkAuth } = require('@src/middlewares/auth.handler')
-const { logout } = require('./functions/index.js')
+const { logout, refresh } = require('./functions/index.js')
const {
storeRefreshToken,
getRefreshToken,
@@ -174,7 +174,8 @@ var init = function (
router.use(passport.session())
// login
router.post(_loginUrl, login)
- router.post(_logoutUrl, checkAuth, logout)
+ router.post(_logoutUrl, logout)
+ router.post('/refresh', refresh)
}
/**
diff --git a/src/modules/authentication/functions/index.js b/src/modules/authentication/functions/index.js
index 07fe3813..7e0171b1 100644
--- a/src/modules/authentication/functions/index.js
+++ b/src/modules/authentication/functions/index.js
@@ -1,8 +1,23 @@
const {
addToBlackList,
deleteRefreshToken,
+ getRefreshToken,
+ storeRefreshToken,
} = require('@src/services/auth.services')
+const UserServices = require('@src/services/user.services')
+const ProfileServices = require('@src/services/profile.services')
+
+const {
+ extractBaseFromDn,
+ extractGroupsFromDn,
+} = require('@src/helpers/dnHelper')
+
+const { signToken } = require('@src/utils/authentication/tokens/token_sign')
+
+const userService = UserServices()
+const profileService = ProfileServices()
+
const clearSession = (req) => {
return new Promise((resolve, reject) => {
req.session.destroy((err) => {
@@ -25,4 +40,61 @@ const logout = (req, res) => {
return res.status(200).json({ message: 'User logged out successfully.' })
}
-module.exports = { logout }
+const refresh = async (req, res) => {
+ const { username } = req.body
+
+ const refreshToken = await getRefreshToken(username)
+
+ if (!refreshToken) {
+ return res.status(401).json({ message: 'Refresh token not found' })
+ }
+
+ const response = await userService.getByUsername(username)
+ const user = response[0]
+
+ if (!user) {
+ return res.status(401).json({ message: 'User not found' })
+ }
+
+ const ldapDn = user.dn
+ const groups = extractGroupsFromDn(ldapDn)
+ const rootBaseDN = extractBaseFromDn(ldapDn)
+ const localBaseDN = user.dn.replace(`uid=${user.uid},`, '')
+
+ const last_time_logged = await profileService.getLastLoginByUsername(user.uid)
+ const loginInfo = await profileService.updateLastTimeLogged(user.uid)
+
+ const isAdmin = true
+
+ const payload = {
+ sub: user.uid,
+ dn: user.dn,
+ uid: user.uid,
+ groups: groups,
+ base: rootBaseDN,
+ localBase: localBaseDN,
+ firstname: user.givenName,
+ lastname: user.sn,
+ fullname: user.cn,
+ email: user.mail,
+ ci: user.CI,
+ roles: isAdmin ? ['admin', 'user'] : ['user'],
+ last_time_logged,
+ loginInfo,
+ }
+
+ const newToken = signToken(payload, { expiresIn: '15 minutes' })
+ const newRefreshToken = signToken(payload, { expiresIn: '1 day' })
+
+ await deleteRefreshToken(username)
+ setTimeout(async () => {
+ storeRefreshToken(user.uid, newRefreshToken)
+ }, 100)
+
+ res.status(200).json({
+ newToken,
+ newRefreshToken,
+ })
+}
+
+module.exports = { logout, refresh }
diff --git a/src/services/auth.services.js b/src/services/auth.services.js
index c8f60349..ef92bced 100644
--- a/src/services/auth.services.js
+++ b/src/services/auth.services.js
@@ -81,6 +81,7 @@ const getRefreshToken = async (userId, callback) => {
try {
await client.connect()
const refreshToken = await client.get(`refreshToken:${userId}`)
+ disconnect()
return refreshToken
} catch (error) {
disconnect()
From 05c768bd04cbf2f9cf2681f8805ae7f681b6423b Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Fri, 8 Sep 2023 20:11:31 -0400
Subject: [PATCH 078/229] check undefined on logger when refresh token
---
src/middlewares/logger.handler.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/middlewares/logger.handler.js b/src/middlewares/logger.handler.js
index 22c8d5ac..ec6b2ef7 100644
--- a/src/middlewares/logger.handler.js
+++ b/src/middlewares/logger.handler.js
@@ -31,7 +31,7 @@ const logFormat = (tokens, req, res) => {
status: tokens.status(req, res),
content_length: tokens.res(req, res, 'content-length'),
response_time: tokens['response-time'](req, res),
- user: req.user === undefined ? 'anonymous' : req.user.uid,
+ user: req.user === undefined ? 'anonymous' : req?.user?.uid,
}
logger.info({ ...log })
From 6ca333819ea25ca0706aea5a78a5812b1e060946 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 11 Sep 2023 10:56:01 -0400
Subject: [PATCH 079/229] add jest.config file
---
jest.config.js | 7 +++++++
1 file changed, 7 insertions(+)
create mode 100644 jest.config.js
diff --git a/jest.config.js b/jest.config.js
new file mode 100644
index 00000000..f966e82c
--- /dev/null
+++ b/jest.config.js
@@ -0,0 +1,7 @@
+// jest.config.js
+module.exports = {
+ // ...
+ moduleNameMapper: {
+ '^@src/(.*)$': '/src/$1',
+ },
+}
From e4b1ebad78650d788c8ccd03b2994bbf52a8b7c4 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 11 Sep 2023 10:56:52 -0400
Subject: [PATCH 080/229] add get group by CN endpoint
---
src/routes/group.routes.js | 23 +++++++++++++++++++++++
src/services/group.services.js | 34 +++++++++++++++++++++++++++++++++-
2 files changed, 56 insertions(+), 1 deletion(-)
diff --git a/src/routes/group.routes.js b/src/routes/group.routes.js
index 03712780..db6f2d4d 100644
--- a/src/routes/group.routes.js
+++ b/src/routes/group.routes.js
@@ -24,4 +24,27 @@ router.get('/:group', checkAuth, validateResponse, async (req, res) => {
}
})
+router.get('/byType/:type', checkAuth, validateResponse, async (req, res) => {
+ try {
+ const type = req.params.type
+ const baseDN = req.body.dn
+ if (!type) {
+ throw new Error(`It seems that the type is missing.`)
+ }
+
+ const response = await service.getGroupByCN(baseDN, type)
+
+ res.json({
+ success: true,
+ data: response,
+ })
+ } catch (error) {
+ res.status(500).json({
+ success: false,
+ message: 'Error fetching group',
+ error: `It seems that the group does not exist.`,
+ })
+ }
+})
+
module.exports = router
diff --git a/src/services/group.services.js b/src/services/group.services.js
index a8e4169f..0c12ac14 100644
--- a/src/services/group.services.js
+++ b/src/services/group.services.js
@@ -1,5 +1,5 @@
require('dotenv').config({ path: __dirname + '/../../.env' })
-const config = require('@src/config/config')
+const config = require('../config/config')
const { performLdapSearch } = require('@src/utils/ldapUtils')
const GroupServices = () => {
@@ -18,6 +18,38 @@ const GroupServices = () => {
throw err
}
}
+
+ const getAdminGroup = async (baseDN = config.ldap.base) => {
+ const ldapFilter = `(objectClass=*)`
+ const dn = `cn=admin,${baseDN}`
+ try {
+ const results = await performLdapSearch(dn, ldapFilter)
+ return results
+ } catch (error) {
+ console.error('Error in getAdminGroup:', error)
+ // Optionally, you can throw the error again to propagate it to the caller
+ throw error
+ }
+ }
+
+ const getGroupByCN = async (baseDN = config.ldap.base, cn = 'admin') => {
+ const ldapFilter = `(objectClass=*)`
+ const customDN = `cn=${cn},${baseDN}`
+ console.log('ldapFilter', ldapFilter)
+ try {
+ const results = await performLdapSearch(customDN, ldapFilter)
+ return results
+ } catch (error) {
+ console.error('Error in getGroupByCN:', error)
+ throw error
+ }
+ }
+
+ return {
+ getAdminGroup,
+ getGroup,
+ getGroupByCN,
+ }
}
module.exports = GroupServices
From d0c89a7c18a0a58c2821d607efc7c20d106f0cb9 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 11 Sep 2023 11:34:42 -0400
Subject: [PATCH 081/229] add admin and superadmin roles fetched from ldap
---
src/modules/authentication/LdapAuth.js | 20 +++++++++++------
src/services/auth.services.js | 30 ++++++++++++++++++++++++++
src/services/group.services.js | 1 -
3 files changed, 43 insertions(+), 8 deletions(-)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 762489a3..925c2f26 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -6,9 +6,10 @@ const passport = require('passport')
const CustomStrategy = require('passport-custom').Strategy
const JwtStrategy = require('../../utils/authentication/strategies/jwtStrategy')
const { authenticate } = require('ldap-authentication')
-const UserServices = require('../../services/user.services')
+const userService = require('../../services/user.services')()
+const { isSuperAdmin, isAdmin } = require('@src/services/auth.services')
const User = require('../../schemas/user.schema').User
-const ProfileServices = require('../../services/profile.services')
+const profileService = require('../../services/profile.services')()
const { checkAuth } = require('@src/middlewares/auth.handler')
const { logout, refresh } = require('./functions/index.js')
const {
@@ -25,9 +26,6 @@ const {
const { signToken } = require('../../utils/authentication/tokens/token_sign')
const { responseSuccess } = require('../../schemas/response.schema')
-const userService = UserServices()
-const profileService = ProfileServices()
-
var _backwardCompatible = false
var _dn
var _findFunc
@@ -221,7 +219,6 @@ const login = function (req, res, next) {
.status(401)
.json({ success: false, message: 'User cannot be found' })
} else {
- const isAdmin = user.right === 'Todos'
const last_time_logged = await profileService.getLastLoginByUsername(
user.uid
)
@@ -232,6 +229,15 @@ const login = function (req, res, next) {
const rootBaseDN = extractBaseFromDn(ldapDn)
const localBaseDN = user.dn.replace(`uid=${user.uid},`, '')
+ let roles = ['user']
+ const isSpAdmin = await isSuperAdmin(user.uid)
+ if (isSpAdmin) {
+ roles = [...roles, 'admin', 'superadmin']
+ } else {
+ const isAdm = await isAdmin(user.uid, localBaseDN)
+ isAdm ? (roles = [...roles, 'admin']) : [...roles]
+ }
+
const payload = {
sub: user.uid,
dn: user.dn,
@@ -244,7 +250,7 @@ const login = function (req, res, next) {
fullname: user.cn,
email: user.mail,
ci: user.CI,
- roles: isAdmin ? ['admin', 'user'] : ['user'],
+ roles: roles,
last_time_logged,
loginInfo,
}
diff --git a/src/services/auth.services.js b/src/services/auth.services.js
index ef92bced..7c951266 100644
--- a/src/services/auth.services.js
+++ b/src/services/auth.services.js
@@ -4,6 +4,8 @@ const {
isConnected,
disconnect,
} = require('../connections/redis_client')
+const config = require('@src/config/config')
+const { performLdapSearch } = require('@src/utils/ldapUtils')
const isBlackListed = async (token) => {
try {
@@ -90,10 +92,38 @@ const getRefreshToken = async (userId, callback) => {
}
}
+const isSuperAdmin = async (uid) => {
+ const ldapFilter = `(objectClass=posixGroup)`
+ const customDN = `cn=admin,${config.ldap.base}`
+ try {
+ const response = await performLdapSearch(customDN, ldapFilter)
+ const adminGroup = response[0]
+ return adminGroup.memberUid.includes(uid)
+ } catch (error) {
+ console.error('Error in isSuperAdmin:', error)
+ throw error
+ }
+}
+
+const isAdmin = async (uid, baseDN = config.ldap.base) => {
+ const ldapFilter = `(objectClass=posixGroup)`
+ const customDN = `cn=admin,${baseDN.replace('usuarios', 'grupos')}`
+ try {
+ const response = await performLdapSearch(customDN, ldapFilter)
+ const adminGroup = response[0]
+ return adminGroup.memberUid.includes(uid)
+ } catch (error) {
+ console.error('Error in isSuperAdmin:', error)
+ throw error
+ }
+}
+
module.exports = {
addToBlackList,
getRefreshToken,
storeRefreshToken,
deleteRefreshToken,
isBlackListed,
+ isSuperAdmin,
+ isAdmin,
}
diff --git a/src/services/group.services.js b/src/services/group.services.js
index 0c12ac14..35903e28 100644
--- a/src/services/group.services.js
+++ b/src/services/group.services.js
@@ -35,7 +35,6 @@ const GroupServices = () => {
const getGroupByCN = async (baseDN = config.ldap.base, cn = 'admin') => {
const ldapFilter = `(objectClass=*)`
const customDN = `cn=${cn},${baseDN}`
- console.log('ldapFilter', ldapFilter)
try {
const results = await performLdapSearch(customDN, ldapFilter)
return results
From 40cd6dca7cf3bfe80743947bf9cb9af9f832cd01 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 11 Sep 2023 12:47:24 -0400
Subject: [PATCH 082/229] update active session error handleling in log in
---
src/modules/authentication/LdapAuth.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/modules/authentication/LdapAuth.js b/src/modules/authentication/LdapAuth.js
index 925c2f26..dfff2754 100644
--- a/src/modules/authentication/LdapAuth.js
+++ b/src/modules/authentication/LdapAuth.js
@@ -82,7 +82,9 @@ var init = function (
const username = req.body.username
const password = req.body.password
- if (req.session.passport !== undefined)
+ const localSession = { user: username }
+
+ if (localSession.user === req.session?.passport?.user)
throw new Error('log out before logging back in')
const res = await userService.getByUsername(username)
From 23b02dda5c306b611a228d730c6ad5d3c0233b22 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 11 Sep 2023 12:47:50 -0400
Subject: [PATCH 083/229] allow to search only in localBranch
---
src/routes/user.routes.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/routes/user.routes.js b/src/routes/user.routes.js
index 1b755c92..1748bdde 100644
--- a/src/routes/user.routes.js
+++ b/src/routes/user.routes.js
@@ -15,7 +15,7 @@ const {
const validateQuery = require('@src/middlewares/queryValidator')
// Middleware for routes requiring checkAuth and checkRoles('admin')
-router.use(checkAuth, checkBlacklist, checkRoles('admin'))
+router.use(checkAuth, checkRoles('admin'))
// Middleware to handle common success and error responses
router.use(validateResponse)
@@ -23,7 +23,7 @@ router.use(validateResponse)
// Route handler for getting all users
router.get('/', async (req, res) => {
try {
- const baseDN = `${config.ldap.base}`
+ const { localBase } = req.user
const isValid = validateQuery(req.query)
const queryFilter = createLdapFilterFromQuery(req.query)
const ldapFilter = `(&(objectClass=person)${queryFilter})`
@@ -33,7 +33,7 @@ router.get('/', async (req, res) => {
// Call the performLdapSearch function to retrieve users matching the group filters
const searchResults = await service.handleFilteredSearch(
- baseDN,
+ localBase,
ldapFilter,
attributes,
req.query.page,
From 021bbf297a1b131231309ff90ff046b9600da068 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 11 Sep 2023 15:29:47 -0400
Subject: [PATCH 084/229] add mongoose connection file
---
src/connections/mongoose.js | 15 +++++++++++++++
1 file changed, 15 insertions(+)
create mode 100644 src/connections/mongoose.js
diff --git a/src/connections/mongoose.js b/src/connections/mongoose.js
new file mode 100644
index 00000000..d362cb48
--- /dev/null
+++ b/src/connections/mongoose.js
@@ -0,0 +1,15 @@
+const mongoose = require('mongoose')
+const config = require('@src/config/config')
+
+mongoose.connect(config.mongodb.url, {
+ useNewUrlParser: true,
+ useUnifiedTopology: true,
+})
+
+const db = mongoose.connection
+
+// Handle MongoDB connection events
+db.on('error', console.error.bind(console, 'MongoDB connection error:'))
+db.once('open', () => {
+ console.log('Connected to MongoDB (ldapDB)')
+})
From 87001247b3d557d5c28b703df9cf77628676d772 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 11 Sep 2023 15:30:00 -0400
Subject: [PATCH 085/229] add aditional dependencies
---
package-lock.json | 96 +++++++++++++++++++++++++++++++++++++++--------
package.json | 4 ++
2 files changed, 84 insertions(+), 16 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 8b4d0d7a..01f85073 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,6 +21,8 @@
"express-paginate": "^1.0.2",
"express-rate-limit": "^6.7.0",
"express-status-monitor": "^1.3.4",
+ "express-validator": "^7.0.1",
+ "fs": "^0.0.1-security",
"handlebars": "^4.7.7",
"helmet": "^6.1.3",
"jerzy": "^0.2.1",
@@ -41,11 +43,13 @@
"passport": "^0.6.0",
"passport-custom": "^1.1.1",
"passport-jwt": "^4.0.1",
+ "password-validator": "^5.3.0",
"redis": "^4.6.8",
"redis-om": "^0.4.2",
"simple-ldap-search": "^3.1.2",
"simple-statistics": "^7.8.3",
"socket.io": "^4.6.1",
+ "ssha": "^1.0.1",
"winston": "^3.8.2",
"winston-mongodb": "^5.1.1"
},
@@ -3391,6 +3395,18 @@
}
}
},
+ "node_modules/express-validator": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-7.0.1.tgz",
+ "integrity": "sha512-oB+z9QOzQIE8FnlINqyIFA8eIckahC6qc8KtqLdLJcU3/phVyuhXH3bA4qzcrhme+1RYaCSwrq+TlZ/kAKIARA==",
+ "dependencies": {
+ "lodash": "^4.17.21",
+ "validator": "^13.9.0"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
"node_modules/express/node_modules/body-parser": {
"version": "1.20.1",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
@@ -3620,6 +3636,11 @@
"node": ">= 0.6"
}
},
+ "node_modules/fs": {
+ "version": "0.0.1-security",
+ "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
+ "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w=="
+ },
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -5072,11 +5093,6 @@
"npm": ">=6"
}
},
- "node_modules/jsonwebtoken/node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
"node_modules/jsonwebtoken/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -5251,9 +5267,9 @@
}
},
"node_modules/lodash": {
- "version": "4.17.4",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
- "integrity": "sha512-6X37Sq9KCpLSXEh8uM12AKYlviHPNNk4RxiGBn4cmKGJinbXBneWIV7iE/nXkM928O7ytHcHb6+X6Svl0f4hXg=="
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"node_modules/lodash.assign": {
"version": "4.2.0",
@@ -6113,6 +6129,14 @@
"node": ">= 0.4.0"
}
},
+ "node_modules/password-validator": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/password-validator/-/password-validator-5.3.0.tgz",
+ "integrity": "sha512-Q+bSEM5pjokZqzWGoQaoylkeWeH4+9uMYlVImiPD0EOJClQ2RPBhrJ5h0OjhMKtwOmu5rRcLaTZo5Gk9RBl0ig==",
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -6964,6 +6988,14 @@
"es5-ext": "^0.10.53"
}
},
+ "node_modules/ssha": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ssha/-/ssha-1.0.1.tgz",
+ "integrity": "sha512-Ugp2lmTmtTScqZHTFw2qayc0td0bzGwnttOONmcZOcM1wpq1YV+1P3U+oeJgu2/JBDTy/Qc+d+9blh5L13bI5Q==",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/stack-trace": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
@@ -7505,6 +7537,14 @@
"integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
"dev": true
},
+ "node_modules/validator": {
+ "version": "13.11.0",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz",
+ "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -10558,6 +10598,15 @@
}
}
},
+ "express-validator": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-7.0.1.tgz",
+ "integrity": "sha512-oB+z9QOzQIE8FnlINqyIFA8eIckahC6qc8KtqLdLJcU3/phVyuhXH3bA4qzcrhme+1RYaCSwrq+TlZ/kAKIARA==",
+ "requires": {
+ "lodash": "^4.17.21",
+ "validator": "^13.9.0"
+ }
+ },
"ext": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
@@ -10689,6 +10738,11 @@
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
},
+ "fs": {
+ "version": "0.0.1-security",
+ "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
+ "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w=="
+ },
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -11773,11 +11827,6 @@
"semver": "^7.3.8"
},
"dependencies": {
- "lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -11931,9 +11980,9 @@
}
},
"lodash": {
- "version": "4.17.4",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
- "integrity": "sha512-6X37Sq9KCpLSXEh8uM12AKYlviHPNNk4RxiGBn4cmKGJinbXBneWIV7iE/nXkM928O7ytHcHb6+X6Svl0f4hXg=="
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"lodash.assign": {
"version": "4.2.0",
@@ -12608,6 +12657,11 @@
"resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
"integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ="
},
+ "password-validator": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/password-validator/-/password-validator-5.3.0.tgz",
+ "integrity": "sha512-Q+bSEM5pjokZqzWGoQaoylkeWeH4+9uMYlVImiPD0EOJClQ2RPBhrJ5h0OjhMKtwOmu5rRcLaTZo5Gk9RBl0ig=="
+ },
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -13282,6 +13336,11 @@
"es5-ext": "^0.10.53"
}
},
+ "ssha": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ssha/-/ssha-1.0.1.tgz",
+ "integrity": "sha512-Ugp2lmTmtTScqZHTFw2qayc0td0bzGwnttOONmcZOcM1wpq1YV+1P3U+oeJgu2/JBDTy/Qc+d+9blh5L13bI5Q=="
+ },
"stack-trace": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
@@ -13679,6 +13738,11 @@
}
}
},
+ "validator": {
+ "version": "13.11.0",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz",
+ "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ=="
+ },
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
diff --git a/package.json b/package.json
index d7950abd..9704e783 100644
--- a/package.json
+++ b/package.json
@@ -28,6 +28,8 @@
"express-paginate": "^1.0.2",
"express-rate-limit": "^6.7.0",
"express-status-monitor": "^1.3.4",
+ "express-validator": "^7.0.1",
+ "fs": "^0.0.1-security",
"handlebars": "^4.7.7",
"helmet": "^6.1.3",
"jerzy": "^0.2.1",
@@ -48,11 +50,13 @@
"passport": "^0.6.0",
"passport-custom": "^1.1.1",
"passport-jwt": "^4.0.1",
+ "password-validator": "^5.3.0",
"redis": "^4.6.8",
"redis-om": "^0.4.2",
"simple-ldap-search": "^3.1.2",
"simple-statistics": "^7.8.3",
"socket.io": "^4.6.1",
+ "ssha": "^1.0.1",
"winston": "^3.8.2",
"winston-mongodb": "^5.1.1"
},
From 61c477a3c9c08a2430e43e5c4939fd0f5e7900f1 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 11 Sep 2023 15:30:11 -0400
Subject: [PATCH 086/229] add email template
---
.../templates/reset-password-email.html | 44 +++++++++++++++++++
1 file changed, 44 insertions(+)
create mode 100644 src/modules/forgot-password/templates/reset-password-email.html
diff --git a/src/modules/forgot-password/templates/reset-password-email.html b/src/modules/forgot-password/templates/reset-password-email.html
new file mode 100644
index 00000000..61081223
--- /dev/null
+++ b/src/modules/forgot-password/templates/reset-password-email.html
@@ -0,0 +1,44 @@
+
+
+
+
+ Restablecimiento de Contraseña
+
+
+
+
+
+ Restablecimiento de Contraseña
+ |
+
+
+ |
+ Hola, {{name}}!
+
+ Has solicitado restablecer tu contraseña. Haz clic en el siguiente
+ enlace para restablecer tu contraseña:
+
+
+ Restablecer Contraseña
+
+ Si no solicitaste esto, puedes ignorar este correo.
+ |
+
+
+ |
+ Equipo de Administración LDAP Cujae
+ |
+
+
+
+
From b448a3f21bb5b4d6303e21cde8d6559cfd0ebc7d Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 11 Sep 2023 19:18:16 -0400
Subject: [PATCH 087/229] remove fynamic link fomr html template
---
src/modules/forgot-password/templates/reset-password-email.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/modules/forgot-password/templates/reset-password-email.html b/src/modules/forgot-password/templates/reset-password-email.html
index 61081223..046c0ec3 100644
--- a/src/modules/forgot-password/templates/reset-password-email.html
+++ b/src/modules/forgot-password/templates/reset-password-email.html
@@ -20,7 +20,7 @@ Restablecimiento de Contraseña
Hola, {{name}}!
- Has solicitado restablecer tu contraseña. Haz clic en el siguiente
- enlace para restablecer tu contraseña:
-
-
- Restablecer Contraseña
+ Has solicitado restablecer tu contraseña. Copia el siguiente código
+ en el formulario que te enviamos para restablecer tu contraseña:
+ {{code}}
Si no solicitaste esto, puedes ignorar este correo.
From 9783a2962a71c30008f26f2eec93e1a3e582360d Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 11 Sep 2023 20:07:56 -0400
Subject: [PATCH 095/229] add password validation middleware
---
.../schemas/passwordValidation.schema.js | 19 +++---
.../forgot-password/utils/passwordUtils.js | 63 +++++++++++++++++++
2 files changed, 75 insertions(+), 7 deletions(-)
create mode 100644 src/modules/forgot-password/utils/passwordUtils.js
diff --git a/src/modules/forgot-password/schemas/passwordValidation.schema.js b/src/modules/forgot-password/schemas/passwordValidation.schema.js
index e32efd31..5985bf3e 100644
--- a/src/modules/forgot-password/schemas/passwordValidation.schema.js
+++ b/src/modules/forgot-password/schemas/passwordValidation.schema.js
@@ -1,14 +1,12 @@
-var passwordValidator = require('password-validator')
+const passwordValidator = require('password-validator')
-// Create a schema
-var schema = new passwordValidator()
+const passwordSchema = new passwordValidator()
-// Add properties to it
-schema
+passwordSchema
.is()
- .min(8) // Minimum length 8
+ .min(8)
.is()
- .max(100) // Maximum length 100
+ .max(100) // You can adjust the maximum length as needed
.has()
.uppercase() // Must have uppercase letters
.has()
@@ -16,8 +14,15 @@ schema
.has()
.digits(2) // Must have at least 2 digits
.has()
+ .symbols(1) // Must have at least 1 special symbol
+ .has()
.not()
.spaces() // Should not have spaces
.is()
.not()
.oneOf(['Passw0rd', 'Password123', '123', 'admin', 'admin1234', '1234']) // Blacklist these values
+ .is()
+ .not()
+ .oneOf(['AnotherWeakPassword', '12345678', 'qwerty']) // Add more weak passwords here
+
+module.exports = passwordSchema
diff --git a/src/modules/forgot-password/utils/passwordUtils.js b/src/modules/forgot-password/utils/passwordUtils.js
new file mode 100644
index 00000000..7e854333
--- /dev/null
+++ b/src/modules/forgot-password/utils/passwordUtils.js
@@ -0,0 +1,63 @@
+const passwordSchema = require('../schemas/passwordValidation.schema')
+
+const passwordValidationMiddleware = (req, res, next) => {
+ // Retrieve the new password from the request body
+ const newPassword = req.body.newPassword
+
+ // Validate the new password against the schema
+ const isPasswordValid = passwordSchema.validate(newPassword)
+
+ if (!isPasswordValid) {
+ // Password doesn't meet the requirements
+ const validationErrors = passwordSchema.validate(newPassword, {
+ list: true,
+ })
+
+ // Construct an error message based on the validation specifics
+ const errorMessages = []
+
+ if (validationErrors.includes('min')) {
+ errorMessages.push('Password must be at least 8 characters long.')
+ }
+
+ if (validationErrors.includes('max')) {
+ errorMessages.push('Password cannot exceed 100 characters.')
+ }
+
+ if (validationErrors.includes('uppercase')) {
+ errorMessages.push('Password must contain at least one uppercase letter.')
+ }
+
+ if (validationErrors.includes('lowercase')) {
+ errorMessages.push('Password must contain at least one lowercase letter.')
+ }
+
+ if (validationErrors.includes('digits')) {
+ errorMessages.push('Password must contain at least 2 digits.')
+ }
+
+ if (validationErrors.includes('symbols')) {
+ errorMessages.push('Password must contain at least 1 special symbol.')
+ }
+
+ if (validationErrors.includes('spaces')) {
+ errorMessages.push('Password should not contain spaces.')
+ }
+
+ if (validationErrors.includes('oneOf')) {
+ errorMessages.push('Password cannot be one of the common weak passwords.')
+ }
+
+ // Respond with error messages and suggestions
+ return res.status(400).json({
+ message: 'Invalid password format.',
+ errors: errorMessages,
+ suggestion: 'Suggested password format: Sample@Pass123', // Customize as needed
+ })
+ }
+
+ // Password is valid; proceed to the next middleware or route handler
+ next()
+}
+
+module.exports = { passwordValidationMiddleware }
From 6b63cdcab1e56da9362bb7ffe875191fc9e604f7 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 11 Sep 2023 20:08:14 -0400
Subject: [PATCH 096/229] validate password before update
---
.../routes/recovery_password.routes.js | 35 +++----------------
.../services/restore-password.service.js | 2 +-
.../utils/{index.js => emailUtils.js} | 3 ++
3 files changed, 8 insertions(+), 32 deletions(-)
rename src/modules/forgot-password/utils/{index.js => emailUtils.js} (99%)
diff --git a/src/modules/forgot-password/routes/recovery_password.routes.js b/src/modules/forgot-password/routes/recovery_password.routes.js
index 1ccadd9a..b399632b 100644
--- a/src/modules/forgot-password/routes/recovery_password.routes.js
+++ b/src/modules/forgot-password/routes/recovery_password.routes.js
@@ -6,8 +6,8 @@ const {
generateRecoveryCode,
sendRecoveryPasswordEmailTo,
} = require('../services/restore-password.service')
-const { validationResult } = require('express-validator')
-const { body } = require('express-validator')
+const { validationResult, body } = require('express-validator')
+const { passwordValidationMiddleware } = require('../utils/passwordUtils')
// Validation rules for the email or username
const validateEmailOrUsername = [
@@ -46,39 +46,12 @@ router.post('/forgot-password', validateEmailOrUsername, async (req, res) => {
res.status(500).json({ message: 'Internal Server Error' })
}
})
-router.post('/reset-password', (req, res) => {
+router.post('/reset-password', passwordValidationMiddleware, (req, res) => {
// Retrieve the reset token and new password from the request body
- const { token, newPassword } = req.body
+ const { recoveryCode, newPassword } = req.body
try {
- // Verify the reset token
- const decodedToken = jwt.verify(token, secretKey)
-
- // Check if the token is still valid
- redisClient.get(token, (error, storedEmailOrUsername) => {
- if (error) {
- throw new Error('Error retrieving token from Redis.')
- }
-
- if (storedEmailOrUsername === decodedToken.emailOrUsername) {
- // Token is valid, update the user's password in your database
- // Replace this with your password update logic
- // For example, you might hash the new password and update it in the database
- // const hashedPassword = hashPassword(newPassword);
- // updateUserPassword(decodedToken.emailOrUsername, hashedPassword);
-
- // Respond with a success message
- res.json({ message: 'Password reset successful.' })
-
- // Delete the token from Redis (optional)
- redisClient.del(token)
- } else {
- // Token does not match the stored value
- throw new Error('Invalid or expired token.')
- }
- })
} catch (error) {
- // Handle token verification errors
console.error('Error resetting password:', error)
res.status(400).json({ message: 'Invalid or expired token.' })
}
diff --git a/src/modules/forgot-password/services/restore-password.service.js b/src/modules/forgot-password/services/restore-password.service.js
index 2ab1adbe..091f93b6 100644
--- a/src/modules/forgot-password/services/restore-password.service.js
+++ b/src/modules/forgot-password/services/restore-password.service.js
@@ -6,7 +6,7 @@ const fs = require('fs')
const userServices = require('@src/services/user.services')()
const path = require('path')
const UserAndRecoveryCode = require('../schemas/user&recoveryCode.schema')
-const { generateRandomSixDigitNumber, readHTMLFile } = require('../utils/index')
+const { generateRandomSixDigitNumber, readHTMLFile } = require('../utils/emailUtils')
const generateRecoveryCode = async (user, expiration) => {
try {
diff --git a/src/modules/forgot-password/utils/index.js b/src/modules/forgot-password/utils/emailUtils.js
similarity index 99%
rename from src/modules/forgot-password/utils/index.js
rename to src/modules/forgot-password/utils/emailUtils.js
index 3de7047b..f55e0fe9 100644
--- a/src/modules/forgot-password/utils/index.js
+++ b/src/modules/forgot-password/utils/emailUtils.js
@@ -20,4 +20,7 @@ function readHTMLFile(path, callback) {
})
}
+
+
+
module.exports = { generateRandomSixDigitNumber, readHTMLFile }
From 859750ab58f5cd86e275e270e533a200d5945255 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 11 Sep 2023 20:15:55 -0400
Subject: [PATCH 097/229] send token on forgot password
---
.../routes/recovery_password.routes.js | 35 ++++++++++++++-----
1 file changed, 26 insertions(+), 9 deletions(-)
diff --git a/src/modules/forgot-password/routes/recovery_password.routes.js b/src/modules/forgot-password/routes/recovery_password.routes.js
index b399632b..46de37e0 100644
--- a/src/modules/forgot-password/routes/recovery_password.routes.js
+++ b/src/modules/forgot-password/routes/recovery_password.routes.js
@@ -8,6 +8,8 @@ const {
} = require('../services/restore-password.service')
const { validationResult, body } = require('express-validator')
const { passwordValidationMiddleware } = require('../utils/passwordUtils')
+const { signToken } = require('@src/utils/authentication/tokens/token_sign')
+const { checkAuth, checkBlacklist } = require('@src/middlewares/auth.handler')
// Validation rules for the email or username
const validateEmailOrUsername = [
@@ -37,24 +39,39 @@ router.post('/forgot-password', validateEmailOrUsername, async (req, res) => {
return res.status(404).json({ message: 'User not found.' })
}
+ const payload = {
+ username: user.uid,
+ email: user.maildrop,
+ }
+
+ const token = signToken(payload, { expiresIn: '15 minutes' })
+
const recoveryCode = await generateRecoveryCode(user, new Date(900000)) //15 min
await sendRecoveryPasswordEmailTo(user, recoveryCode)
- res.json({ message: 'Password reset email sent successfully.' })
+ res.json({
+ message: 'Password reset email sent successfully.',
+ token: token,
+ })
} catch (error) {
console.error('Error in /forgot-password:', error)
res.status(500).json({ message: 'Internal Server Error' })
}
})
-router.post('/reset-password', passwordValidationMiddleware, (req, res) => {
- // Retrieve the reset token and new password from the request body
- const { recoveryCode, newPassword } = req.body
+router.post(
+ '/reset-password',
+ checkAuth,
+ passwordValidationMiddleware,
+ (req, res) => {
+ // Retrieve the reset token and new password from the request body
+ const { recoveryCode, newPassword } = req.body
- try {
- } catch (error) {
- console.error('Error resetting password:', error)
- res.status(400).json({ message: 'Invalid or expired token.' })
+ try {
+ } catch (error) {
+ console.error('Error resetting password:', error)
+ res.status(400).json({ message: 'Invalid or expired token.' })
+ }
}
-})
+)
module.exports = router
From 6b9917cf0374e977de5831d2649b5b13095843d9 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 11 Sep 2023 20:38:34 -0400
Subject: [PATCH 098/229] add check recovery code validation
---
.../routes/recovery_password.routes.js | 32 ++++++++++---
.../services/restore-password.service.js | 46 ++++++++++++++++++-
2 files changed, 70 insertions(+), 8 deletions(-)
diff --git a/src/modules/forgot-password/routes/recovery_password.routes.js b/src/modules/forgot-password/routes/recovery_password.routes.js
index 46de37e0..fa3a407b 100644
--- a/src/modules/forgot-password/routes/recovery_password.routes.js
+++ b/src/modules/forgot-password/routes/recovery_password.routes.js
@@ -5,11 +5,14 @@ const userService = require('@src/services/user.services')()
const {
generateRecoveryCode,
sendRecoveryPasswordEmailTo,
+ checkRecoveryCode,
} = require('../services/restore-password.service')
const { validationResult, body } = require('express-validator')
const { passwordValidationMiddleware } = require('../utils/passwordUtils')
const { signToken } = require('@src/utils/authentication/tokens/token_sign')
+const { verifyToken } = require('@src/utils/authentication/tokens/token_verify')
const { checkAuth, checkBlacklist } = require('@src/middlewares/auth.handler')
+const boom = require('@hapi/boom')
// Validation rules for the email or username
const validateEmailOrUsername = [
@@ -46,7 +49,10 @@ router.post('/forgot-password', validateEmailOrUsername, async (req, res) => {
const token = signToken(payload, { expiresIn: '15 minutes' })
- const recoveryCode = await generateRecoveryCode(user, new Date(900000)) //15 min
+ const currentTime = new Date()
+ const expiration = new Date(currentTime.getTime() + 15 * 60 * 1000) // 15 minutes in milliseconds
+
+ const recoveryCode = await generateRecoveryCode(user, expiration)
await sendRecoveryPasswordEmailTo(user, recoveryCode)
res.json({
@@ -62,14 +68,28 @@ router.post(
'/reset-password',
checkAuth,
passwordValidationMiddleware,
- (req, res) => {
- // Retrieve the reset token and new password from the request body
- const { recoveryCode, newPassword } = req.body
-
+ async (req, res) => {
try {
+ const { recoveryCode, newPassword } = req.body
+ const payload = verifyToken(req.headers.authorization.split(' ')[1])
+ console.log('payload', payload)
+
+ if (!payload) {
+ const error = boom.unauthorized('Token is not valid')
+ throw error
+ }
+
+ const checkedCode = await checkRecoveryCode(
+ payload.username,
+ recoveryCode
+ )
+ if (!checkedCode.isValid) {
+ const error = boom.unauthorized(checkedCode.isValid.message)
+ throw error
+ }
} catch (error) {
console.error('Error resetting password:', error)
- res.status(400).json({ message: 'Invalid or expired token.' })
+ res.status(400).json({ message: 'Invalid or expired recovery code.' })
}
}
)
diff --git a/src/modules/forgot-password/services/restore-password.service.js b/src/modules/forgot-password/services/restore-password.service.js
index 091f93b6..df341f7b 100644
--- a/src/modules/forgot-password/services/restore-password.service.js
+++ b/src/modules/forgot-password/services/restore-password.service.js
@@ -6,7 +6,10 @@ const fs = require('fs')
const userServices = require('@src/services/user.services')()
const path = require('path')
const UserAndRecoveryCode = require('../schemas/user&recoveryCode.schema')
-const { generateRandomSixDigitNumber, readHTMLFile } = require('../utils/emailUtils')
+const {
+ generateRandomSixDigitNumber,
+ readHTMLFile,
+} = require('../utils/emailUtils')
const generateRecoveryCode = async (user, expiration) => {
try {
@@ -95,4 +98,43 @@ const sendRecoveryPasswordEmailTo = async (user, code) => {
}
}
-module.exports = { generateRecoveryCode, sendRecoveryPasswordEmailTo }
+async function checkRecoveryCode(username, recoveryCode) {
+ try {
+ // Find a user by username
+ const user = await UserAndRecoveryCode.findOne({ username })
+
+ // Check if the user exists and has a recovery code set
+ if (!user || !user.recoveryCode || !user.recoveryCode.code) {
+ return {
+ isValid: false,
+ message: 'User not found or no recovery code set.',
+ }
+ }
+
+ // Check if the recovery code matches
+ if (user.recoveryCode.code !== recoveryCode) {
+ return { isValid: false, message: 'Invalid recovery code.' }
+ }
+
+ // Check if the recovery code has expired
+ const currentTime = new Date()
+ if (
+ user.recoveryCode.expiresAt &&
+ currentTime > user.recoveryCode.expiresAt
+ ) {
+ return { isValid: false, message: 'Recovery code has expired.' }
+ }
+
+ // Recovery code is valid
+ return { isValid: true, message: 'Recovery code is valid.' }
+ } catch (error) {
+ console.error('Error checking recovery code:', error)
+ throw error
+ }
+}
+
+module.exports = {
+ generateRecoveryCode,
+ sendRecoveryPasswordEmailTo,
+ checkRecoveryCode,
+}
From 2758c002144336e1ca19a8d193c243a3b3fc8185 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 11 Sep 2023 21:06:35 -0400
Subject: [PATCH 099/229] update password method finished
---
.../routes/recovery_password.routes.js | 17 +++++++++++++++--
.../forgot-password/utils/passwordUtils.js | 13 ++++++++++++-
2 files changed, 27 insertions(+), 3 deletions(-)
diff --git a/src/modules/forgot-password/routes/recovery_password.routes.js b/src/modules/forgot-password/routes/recovery_password.routes.js
index fa3a407b..c85289f6 100644
--- a/src/modules/forgot-password/routes/recovery_password.routes.js
+++ b/src/modules/forgot-password/routes/recovery_password.routes.js
@@ -8,7 +8,11 @@ const {
checkRecoveryCode,
} = require('../services/restore-password.service')
const { validationResult, body } = require('express-validator')
-const { passwordValidationMiddleware } = require('../utils/passwordUtils')
+const {
+ passwordValidationMiddleware,
+ hashPassword,
+ verifyPassword,
+} = require('../utils/passwordUtils')
const { signToken } = require('@src/utils/authentication/tokens/token_sign')
const { verifyToken } = require('@src/utils/authentication/tokens/token_verify')
const { checkAuth, checkBlacklist } = require('@src/middlewares/auth.handler')
@@ -72,7 +76,6 @@ router.post(
try {
const { recoveryCode, newPassword } = req.body
const payload = verifyToken(req.headers.authorization.split(' ')[1])
- console.log('payload', payload)
if (!payload) {
const error = boom.unauthorized('Token is not valid')
@@ -87,6 +90,16 @@ router.post(
const error = boom.unauthorized(checkedCode.isValid.message)
throw error
}
+
+ const encriptedPassword = hashPassword(newPassword)
+ const updatedUser = await userService.updateUser(
+ payload.username,
+ 'userPassword',
+ encriptedPassword
+ )
+ if (!!updatedUser) {
+ res.status(200).json({ success: true, message: 'updated user' })
+ }
} catch (error) {
console.error('Error resetting password:', error)
res.status(400).json({ message: 'Invalid or expired recovery code.' })
diff --git a/src/modules/forgot-password/utils/passwordUtils.js b/src/modules/forgot-password/utils/passwordUtils.js
index 7e854333..c5828ab7 100644
--- a/src/modules/forgot-password/utils/passwordUtils.js
+++ b/src/modules/forgot-password/utils/passwordUtils.js
@@ -1,4 +1,6 @@
const passwordSchema = require('../schemas/passwordValidation.schema')
+const assert = require('assert')
+const ssha = require('ssha')
const passwordValidationMiddleware = (req, res, next) => {
// Retrieve the new password from the request body
@@ -60,4 +62,13 @@ const passwordValidationMiddleware = (req, res, next) => {
next()
}
-module.exports = { passwordValidationMiddleware }
+const hashPassword = (password) => ssha.create(password)
+
+const verifyPassword = (password, encriptedPassword) =>
+ ssha.verify(password, encriptedPassword)
+
+module.exports = {
+ passwordValidationMiddleware,
+ hashPassword,
+ verifyPassword,
+}
From e7d827a42ef26274d5be9069b102903fccef053f Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 11 Sep 2023 21:26:43 -0400
Subject: [PATCH 100/229] add email notification to password change
---
.../forgot-password/images/favicon.png | Bin 0 -> 4193 bytes
.../routes/recovery_password.routes.js | 3 +
.../services/restore-password.service.js | 51 +++++++++++
.../templates/reset-password-email.html | 86 +++++++++++++-----
.../templates/successful-password-change.html | 61 +++++++++++++
5 files changed, 177 insertions(+), 24 deletions(-)
create mode 100644 src/modules/forgot-password/images/favicon.png
create mode 100644 src/modules/forgot-password/templates/successful-password-change.html
diff --git a/src/modules/forgot-password/images/favicon.png b/src/modules/forgot-password/images/favicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..6007eb10435bb7ae321cf002f8ec4ccf34ec9152
GIT binary patch
literal 4193
zcmX9?c|26zA0GRbo$T8fk}V{>w#JxY4B4{9AVeb>>oi36r5Wo?i0peRqO3!flBLBO
z3RyC?lx0MOx8L>t{K|LQU5`D
zvWKuw(#4xY%O}T#lGUBV?SDJBj*ec1=)hQo=W1Tg3{VX80;}pozl{5Mz+Zz@XNN27
zbmYl+!_Qs$%JXf!IZ2`*Pyi9O=^xT?{d;Kc858*|77GY(0#9)L54E#h#T@28MWhv(
z^`|&N(wPp>R@QBUO#E;;vP(UiO)icQD&pra7;X?P8{DPLc;;)5sc1)3G1NJhL+gXo
zL!umh=xxH{lzLt_Jb1OlyIq?O6ehbhHOywoGBO=kAU0kPxyZrre7)SSG*rblDu_2+
zCYk~DL}@0g0m}18wf>k}CO!_@P#);2n
z>Nw+J>nI4GOShFn4S~BRZN)goUhw?Q@y^xl4+SitICKdIiB*O=ahw*mx=Zi$V=tyh
z*bWF&dJPmnB^jtPJ)bLPNMF*tkhOw%cR>|wb=zeMt0#49Er>3F`1(;E_rhkD=9Pzf
zABlER`w_I`Dttrdk1oTO-O?oXOCf6*<-DTAd{e8D3X4blgU&99$+IgShv_(|MZx^c
zp|z}z1oXsepeTz_AhN6Zuvk-W%%vDB*M>N(*ZdTtjYvES>VRc%6qmBoLUv}n8f
z3fVa=ihBDMs~&1P*U^7z6l>FjoSasqjpZ~s*;6h*`$xg4_i%mP{elCo9gz(_e~E=D
zRaZ6oEplV6h(NMe_Gp9ce^WG>}T;&^xI#SqV2D=BX+l)%
z$zK~Jg(8*Yrp><8muio0yPAcptWJM$PP^8`XqnA5Tm5ti8XKh>R_$Bmu&nZ~`K(@W
z$Rn46Kpk;4;WKL071uv6$Pj&5m0*zHcRB+(M!r_eXfUHyy?J?a1+|6OwsFI#5V
zIp$}&v^I!W-L0gYh97iZnX@+olf6H
zevc!xEftp&A15b%Xm*y=I6KM8xN|3}ucSdZ92ZwXPbfX~U0CQrYULZdZNlWqqWyX>
z!a``b_*XHJ6H|}KSty7#5AKPHLTTlz|DjZ5N(d#uA+MS*br?n5lH5di(UyVd?mRwnFYp
zJ{cR()8`si2boz
zXw07w>-vL;f2sEWAt+}4L(!H*QLbsz6LzYY>FmMb3iqB(1_(EvKTL_7^tfM7BoQnd9jIKpf|u@aE3VpKyB6T4NSl
zg`oaatt*!&A1)nF3N#!Fc-s&Lu|BM?9GmZl1yLAINYG-0`fr`(Lx+u|UFqKFvCrhz^y
z3ZOLQ$OTjPg#AYokfBW9+OSTVn%BmG9f;Ti<22`bAY`ElB1Cd4SNnCUUpZRaF&DaM
zlnrM4NY7X9^|g48PA&Fz+7o!0hi(K$Lu|`h_z4eTS$eq~L(-)*y<@bMBnp~I*CMGA
zFPf83)>NogHs)t)vbt)sluM#r3>Z;XVQI0vc`)(yep(uiyXayTp$tJEGdHS^?(=Vv
zH85ZRFiXj%f@$snP8zND-}
zJZ9t38QG4D
zS5)7u-#sT{b3&xDxt5-$*CGd5$baEQO@4>6b98(usF;B9LC_NFti8x4Ay=y`-`4ZW
ze*P{1(^TS1w)w2Osn*iAC0YW
z4hLliUe4fCGijYHD4Z;RTtC%(6e3UNUSqGk2@t4e0{<46CfH`W@A-Zw-mNPmTPw-x
z`vuqDBpTn3m-cO)-4W5|y8MJuEGK7He6gm(uaBT%p09f!PcC+};bkUZCauY()>m`n~Cv1*8zh^yh~u
zhr_*yfhKy~V)kj1(fiMfqDopW8I<5m#(+1T;Pq1hK8^I-N-FNHn^YhdjfvlkWkjR7
z_8ZTgPtLAel@AUIBP}4D9?a?~1d@i^F_rQ
z-^B_)4j8-;k`odGF}4(P3&@jAw(m+pmc+*Lkc!E5u+8SA5mu-h0VGepwO(H<^AZYl
zLG6fdWy-P~#t|yO7%ttgD)B9QNzM&+DnSwcO(%VPx3O$$CtdA1v`E4DCU;n!nDYMJ
z*4;g_o~tMs0_1l*l`#e}lr!Nz{)
zB$lq}nn&VPjy=Oe?=V?zz=^%`7Q{w-oX?6vLqkU1EfsrAv?QbHYo4Ws8w+~0Uj!KB
zk=QU)Mb5Vuc4)53q)KU_Y?AXXUAYrU`^x)658sDdw?=qSF4}d038no^OqUB_wD;x>
z$K?|q!&bkn8@lhFiPnF?ax_%P_9e?xXS5fn%#$nbZdu9P=G@?ODi4%%btUBEZJH+t
z>G&TFIUZIYeSvAVJIHWmsRv+eA?yLfI0Od1U!`6DbA;}A{~Yx$>L*liegsQmLYvIG+asDd^vhSdMURcvQyl__k0NI7_mdZxu9w$8fm{y>T0
zD`UU4RmVPtN5wBDJMZTgp)I(?l{gQM*Bfh1c9tZ9OWOs_&V00z+t;;lJ`|$P=1#7+
z5~okmTa?JT047(T{U_Zy86k=rNq-%KetTUF{bguoed%Nd;&fgvipQ-rt#s9|FA_=FQ->TO&
z*Bulmu=Y6J>e*zaB(Qpvx5jf_3|9~Q_{bmf
z)1zG$xi2eq(+b5rd>_*tNLnbQ$(&mI`@L>KVS%2yl5JjE7R=@DtGA+3{=*g1yZo9~
zrY{X9XX~X&18#PliCSS9f1v!)o&GGr6L3W4^RBVA+2>-h(-IjYx|%GNzopV2uIMMQ
zy?M^@WJ|aaDS(f9qQeeI7)34tZzUF=88X$0u
zq|TCp%}WOkEY~8*Y&e7nlQAU~p|yaYHhtoq*&09U;7^vGkd@k=W{*knKz
znqUX%#-Zz%ySqpy8G=v?aV5Nlj3!4+E%Pb+{hI|!W?VGH0HUmQxOjhyu^TvDV1c@z
zez_Y~xv7AghkP{Z%)A0&_iIUDt~pJs9ht?wza{^aW4Gb?cg^=!u5b(`2HS6j*G`ZRk)%d)zHQq?r?<4A>UbVX?X1Cjp&|pgZUh
zw#HiZkP&1@>q5|%;LHmGGJJ{4=jIdiSPo$}U^>TXmFHX2&o+YGtrC3b2%`;j8Tf(3
zZ}77EAVHzh+kQxbC!%Z(hfZ9P4zbXmi(25`9KOr`I|P^T4N)epAd4r6GOCaeY1Y-nZUSoqb1_C~%J7Xup%G?V
z8vIMcwf2|FL`VuK2}iamK&LU55Tfn03JMG4>;o{~Zy(hdlaZdiH$UkN;H@C&r!$@=
z=w3eW+hMF4D#KSfgq1a)>PXsKc4x>0f=2q`mQTztJ&cbmRU#>D-g*Dqn@m0TiYo2C
zW(!$BwI@bVQ1z=;p&hd4RQO+Fi=I4bPRd$y_-}vRHnhI)-LA#_2|Ie4X6OaJxA*i~
z9|Q^BmDH>p=Ao*FS)6J_51ai0ZL-Gwe+Zp~V+~fPdJuq9Bk9KSz! {
const payload = {
username: user.uid,
+ name: user.name,
email: user.maildrop,
}
@@ -98,6 +100,7 @@ router.post(
encriptedPassword
)
if (!!updatedUser) {
+ await sendSuccessPasswordEmailTo(payload.name, payload.email)
res.status(200).json({ success: true, message: 'updated user' })
}
} catch (error) {
diff --git a/src/modules/forgot-password/services/restore-password.service.js b/src/modules/forgot-password/services/restore-password.service.js
index df341f7b..896c05cc 100644
--- a/src/modules/forgot-password/services/restore-password.service.js
+++ b/src/modules/forgot-password/services/restore-password.service.js
@@ -133,8 +133,59 @@ async function checkRecoveryCode(username, recoveryCode) {
}
}
+const sendSuccessPasswordEmailTo = async (username, email) => {
+ try {
+ const transporter = nodemailer.createTransport(
+ smtpTransport({
+ service: process.env.EMAIL_SERVICE,
+ host: process.env.EMAIL_HOST,
+ secure: true,
+ auth: {
+ user: process.env.EMAIL_USER,
+ pass: process.env.EMAIL_PASSWORD,
+ },
+ })
+ )
+
+ readHTMLFile(
+ path.join(__dirname, '../templates/successful-password-change.html'),
+ function (err, html) {
+ if (err) {
+ console.log('error reading file', err)
+ return
+ }
+
+ const template = handlebars.compile(html)
+ const replacements = {
+ username,
+ }
+ const htmlToSend = template(replacements)
+
+ const mailOptions = {
+ from: process.env.EMAIL_USER,
+ to: email,
+ subject: 'Reestablecimiento de Contrasena',
+ html: htmlToSend,
+ }
+
+ transporter.sendMail(mailOptions, function (error, info) {
+ if (error) {
+ console.log(error)
+ } else {
+ console.log('Email sent: ' + info.response)
+ }
+ })
+ }
+ )
+ } catch (error) {
+ console.error(error)
+ throw new Error('Error on sending email')
+ }
+}
+
module.exports = {
generateRecoveryCode,
sendRecoveryPasswordEmailTo,
checkRecoveryCode,
+ sendSuccessPasswordEmailTo,
}
diff --git a/src/modules/forgot-password/templates/reset-password-email.html b/src/modules/forgot-password/templates/reset-password-email.html
index 4e280e0d..1763b64e 100644
--- a/src/modules/forgot-password/templates/reset-password-email.html
+++ b/src/modules/forgot-password/templates/reset-password-email.html
@@ -1,32 +1,70 @@
-
Restablecimiento de Contraseña
+
+
-
-
-
- Restablecimiento de Contraseña
- |
-
-
- |
- Hola, {{name}}!
-
- Has solicitado restablecer tu contraseña. Copia el siguiente código
- en el formulario que te enviamos para restablecer tu contraseña:
-
- {{code}}
- Si no solicitaste esto, puedes ignorar este correo.
- |
-
-
- |
- Equipo de Administración LDAP Cujae
- |
-
-
+
+
+
+
+ Restablecimiento de Contraseña
+
+
+
+ Hola, {{name}}!
+
+ Has solicitado restablecer tu contraseña. Copia el siguiente código en
+ el formulario que te enviamos para restablecer tu contraseña:
+
+ {{code}}
+ Si no solicitaste esto, puedes ignorar este correo.
+
+
+
+
diff --git a/src/modules/forgot-password/templates/successful-password-change.html b/src/modules/forgot-password/templates/successful-password-change.html
new file mode 100644
index 00000000..e425cabe
--- /dev/null
+++ b/src/modules/forgot-password/templates/successful-password-change.html
@@ -0,0 +1,61 @@
+
+
+
+ Cambio de Contraseña Exitoso
+
+
+
+
+
+
+ Cambio de Contraseña Exitoso
+
+
+
+ Tu contraseña ha sido cambiada exitosamente.
+
+ Si no solicitaste este cambio, por favor, contacta a nuestro equipo de
+ soporte de inmediato.
+
+
+
+
+
+
+
From 2cec98337dd993a76d1c031c262bd44a3b99e531 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Mon, 11 Sep 2023 21:27:16 -0400
Subject: [PATCH 101/229] change blue color for cujae green
---
.../forgot-password/templates/reset-password-email.html | 4 ++--
.../forgot-password/templates/successful-password-change.html | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/modules/forgot-password/templates/reset-password-email.html b/src/modules/forgot-password/templates/reset-password-email.html
index 1763b64e..5065dec0 100644
--- a/src/modules/forgot-password/templates/reset-password-email.html
+++ b/src/modules/forgot-password/templates/reset-password-email.html
@@ -20,7 +20,7 @@
}
header {
- background-color: #007bff;
+ background-color: #006633;
color: #fff;
text-align: center;
padding: 20px;
@@ -36,7 +36,7 @@
}
footer {
- background-color: #007bff;
+ background-color: #006633;
color: #fff;
text-align: center;
padding: 10px;
diff --git a/src/modules/forgot-password/templates/successful-password-change.html b/src/modules/forgot-password/templates/successful-password-change.html
index e425cabe..d6a4a507 100644
--- a/src/modules/forgot-password/templates/successful-password-change.html
+++ b/src/modules/forgot-password/templates/successful-password-change.html
@@ -24,7 +24,7 @@
Date: Mon, 11 Sep 2023 21:41:13 -0400
Subject: [PATCH 102/229] delete unnecessary dependencies
---
package-lock.json | 1655 +--------------------------------------------
package.json | 13 -
2 files changed, 2 insertions(+), 1666 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 01f85073..40b78ffa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,9 +11,7 @@
"dependencies": {
"@hapi/boom": "^10.0.1",
"axios": "^1.3.5",
- "bcryptjs": "^2.4.3",
"body-parser": "^1.20.2",
- "cluster": "^0.7.7",
"compression": "^1.7.4",
"cors": "^2.8.5",
"dotenv": "^16.0.3",
@@ -25,18 +23,13 @@
"fs": "^0.0.1-security",
"handlebars": "^4.7.7",
"helmet": "^6.1.3",
- "jerzy": "^0.2.1",
- "jest-fetch-mock": "^3.0.3",
"joi": "^13.0.2",
"jsonwebtoken": "^9.0.0",
- "jstat": "^1.9.6",
"LDAP": "^1.2.1",
"ldap-authentication": "^2.3.1",
"ldapjs": "^3.0.1",
- "lodash": "^4.17.4",
"morgan": "^1.10.0",
"multer": "^1.4.5-lts.1",
- "node-cache": "^5.1.2",
"nodemailer": "^6.9.1",
"nodemailer-smtp-transport": "^2.7.4",
"os": "^0.1.2",
@@ -45,9 +38,6 @@
"passport-jwt": "^4.0.1",
"password-validator": "^5.3.0",
"redis": "^4.6.8",
- "redis-om": "^0.4.2",
- "simple-ldap-search": "^3.1.2",
- "simple-statistics": "^7.8.3",
"socket.io": "^4.6.1",
"ssha": "^1.0.1",
"winston": "^3.8.2",
@@ -59,12 +49,9 @@
"express-session": "^1.17.3",
"jasmine": "^4.3.0",
"jest": "^29.6.4",
- "jsdom": "^21.1.1",
- "jsdom-global": "^3.0.2",
"module-alias": "^2.2.3",
"mongoose": "^6.5.2",
"nodemon": "^2.0.22",
- "superagent": "^8.0.0",
"supertest": "^6.3.3"
}
},
@@ -1329,15 +1316,6 @@
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
"integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
},
- "node_modules/@tootallnate/once": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
- "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
- "dev": true,
- "engines": {
- "node": ">= 10"
- }
- },
"node_modules/@types/babel__core": {
"version": "7.20.1",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz",
@@ -1472,12 +1450,6 @@
"integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==",
"dev": true
},
- "node_modules/abab": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
- "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
- "dev": true
- },
"node_modules/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -1501,77 +1473,11 @@
"node": ">= 0.6"
}
},
- "node_modules/acorn": {
- "version": "8.8.2",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
- "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-globals": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
- "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
- "dev": true,
- "dependencies": {
- "acorn": "^8.1.0",
- "acorn-walk": "^8.0.2"
- }
- },
- "node_modules/acorn-walk": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
- "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
- "dev": true,
- "engines": {
- "node": ">=0.4.0"
- }
- },
"node_modules/after": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
"integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA=="
},
- "node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "dev": true,
- "dependencies": {
- "debug": "4"
- },
- "engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/agent-base/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/agent-base/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
"node_modules/ansi-escapes": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
@@ -1887,11 +1793,6 @@
"node": ">= 0.8"
}
},
- "node_modules/bcryptjs": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
- "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ=="
- },
"node_modules/binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
@@ -2209,26 +2110,6 @@
"node": ">=12"
}
},
- "node_modules/clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/cluster": {
- "version": "0.7.7",
- "resolved": "https://registry.npmjs.org/cluster/-/cluster-0.7.7.tgz",
- "integrity": "sha512-16LzEZSoBUgRHSN7NA46ntGnI9tf0NnxTm3KCDvHd6aj4EsBqUbYDN3ImCfjYegBXJZiutULF5rWkcRusMIozQ==",
- "dependencies": {
- "log": ">= 1.2.0",
- "mkdirp": ">= 0.0.1"
- },
- "engines": {
- "node": "*"
- }
- },
"node_modules/cluster-key-slot": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz",
@@ -2511,14 +2392,6 @@
"node": ">= 0.10"
}
},
- "node_modules/cross-fetch": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
- "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
- "dependencies": {
- "node-fetch": "2.6.7"
- }
- },
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -2533,71 +2406,6 @@
"node": ">= 8"
}
},
- "node_modules/cssstyle": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz",
- "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==",
- "dev": true,
- "dependencies": {
- "rrweb-cssom": "^0.6.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/d": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
- "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
- "dependencies": {
- "es5-ext": "^0.10.50",
- "type": "^1.0.1"
- }
- },
- "node_modules/d/node_modules/type": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
- "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
- },
- "node_modules/data-urls": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz",
- "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==",
- "dev": true,
- "dependencies": {
- "abab": "^2.0.6",
- "whatwg-mimetype": "^3.0.0",
- "whatwg-url": "^12.0.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/data-urls/node_modules/tr46": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
- "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
- "dev": true,
- "dependencies": {
- "punycode": "^2.3.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/data-urls/node_modules/whatwg-url": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz",
- "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==",
- "dev": true,
- "dependencies": {
- "tr46": "^4.1.1",
- "webidl-conversions": "^7.0.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
"node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -2606,12 +2414,6 @@
"ms": "2.0.0"
}
},
- "node_modules/decimal.js": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
- "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
- "dev": true
- },
"node_modules/dedent": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz",
@@ -2626,12 +2428,6 @@
}
}
},
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
- },
"node_modules/deepmerge": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
@@ -2703,18 +2499,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/domexception": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
- "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
- "dev": true,
- "dependencies": {
- "webidl-conversions": "^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/dotenv": {
"version": "16.0.3",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
@@ -2723,15 +2507,6 @@
"node": ">=12"
}
},
- "node_modules/duration": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz",
- "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==",
- "dependencies": {
- "d": "1",
- "es5-ext": "~0.10.46"
- }
- },
"node_modules/ecdsa-sig-formatter": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
@@ -2917,18 +2692,6 @@
}
}
},
- "node_modules/entities": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
- "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
- "dev": true,
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
"node_modules/error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -2938,39 +2701,6 @@
"is-arrayish": "^0.2.1"
}
},
- "node_modules/es5-ext": {
- "version": "0.10.62",
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz",
- "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==",
- "hasInstallScript": true,
- "dependencies": {
- "es6-iterator": "^2.0.3",
- "es6-symbol": "^3.1.3",
- "next-tick": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/es6-iterator": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
- "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
- "dependencies": {
- "d": "1",
- "es5-ext": "^0.10.35",
- "es6-symbol": "^3.1.1"
- }
- },
- "node_modules/es6-symbol": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
- "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
- "dependencies": {
- "d": "^1.0.1",
- "ext": "^1.1.2"
- }
- },
"node_modules/escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -2994,28 +2724,6 @@
"node": ">=8"
}
},
- "node_modules/escodegen": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
- "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
- "dev": true,
- "dependencies": {
- "esprima": "^4.0.1",
- "estraverse": "^5.2.0",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
- },
- "engines": {
- "node": ">=6.0"
- },
- "optionalDependencies": {
- "source-map": "~0.6.1"
- }
- },
"node_modules/esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
@@ -3029,24 +2737,6 @@
"node": ">=4"
}
},
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
@@ -3055,15 +2745,6 @@
"node": ">= 0.6"
}
},
- "node_modules/event-emitter": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
- "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
- "dependencies": {
- "d": "1",
- "es5-ext": "~0.10.14"
- }
- },
"node_modules/event-loop-stats": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/event-loop-stats/-/event-loop-stats-1.2.0.tgz",
@@ -3463,14 +3144,6 @@
}
]
},
- "node_modules/ext": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
- "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
- "dependencies": {
- "type": "^2.7.2"
- }
- },
"node_modules/extsprintf": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz",
@@ -3485,12 +3158,6 @@
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
},
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true
- },
"node_modules/fast-safe-stringify": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
@@ -3868,18 +3535,6 @@
"node": ">=8.9.0"
}
},
- "node_modules/html-encoding-sniffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
- "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
- "dev": true,
- "dependencies": {
- "whatwg-encoding": "^2.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -3901,43 +3556,6 @@
"node": ">= 0.8"
}
},
- "node_modules/http-proxy-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
- "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
- "dev": true,
- "dependencies": {
- "@tootallnate/once": "2",
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/http-proxy-agent/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/http-proxy-agent/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
"node_modules/httpntlm": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz",
@@ -3958,42 +3576,6 @@
"node": ">= 6.15.1"
}
},
- "node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
- "dev": true,
- "dependencies": {
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/https-proxy-agent/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/https-proxy-agent/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
"node_modules/human-signals": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
@@ -4180,12 +3762,6 @@
"node": ">=0.12.0"
}
},
- "node_modules/is-potential-custom-element-name": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
- "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
- "dev": true
- },
"node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
@@ -4342,12 +3918,6 @@
"integrity": "sha512-qybtBUesniQdW6n+QIHMng2vDOHscIC/dEXjW+JzO9+LoAZMb03RCUC5xFOv/btSKPm1xL42fn+RjlU4oB42Lg==",
"dev": true
},
- "node_modules/jerzy": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/jerzy/-/jerzy-0.2.1.tgz",
- "integrity": "sha512-NHuYTuLgwwBrGKNORh+mSqnvJUeXe9OX9HLP60CT4iRQPgi+OPKBjThOLvwc5SA4yfjTQ/RpyhPfczfavS+Gsg==",
- "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."
- },
"node_modules/jest": {
"version": "29.6.4",
"resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz",
@@ -4558,15 +4128,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/jest-fetch-mock": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz",
- "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==",
- "dependencies": {
- "cross-fetch": "^3.0.4",
- "promise-polyfill": "^8.1.3"
- }
- },
"node_modules/jest-get-type": {
"version": "29.6.3",
"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
@@ -4961,85 +4522,6 @@
"js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/jsdom": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.1.tgz",
- "integrity": "sha512-Jjgdmw48RKcdAIQyUD1UdBh2ecH7VqwaXPN3ehoZN6MqgVbMn+lRm1aAT1AsdJRAJpwfa4IpwgzySn61h2qu3w==",
- "dev": true,
- "dependencies": {
- "abab": "^2.0.6",
- "acorn": "^8.8.2",
- "acorn-globals": "^7.0.0",
- "cssstyle": "^3.0.0",
- "data-urls": "^4.0.0",
- "decimal.js": "^10.4.3",
- "domexception": "^4.0.0",
- "escodegen": "^2.0.0",
- "form-data": "^4.0.0",
- "html-encoding-sniffer": "^3.0.0",
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.1",
- "is-potential-custom-element-name": "^1.0.1",
- "nwsapi": "^2.2.2",
- "parse5": "^7.1.2",
- "rrweb-cssom": "^0.6.0",
- "saxes": "^6.0.0",
- "symbol-tree": "^3.2.4",
- "tough-cookie": "^4.1.2",
- "w3c-xmlserializer": "^4.0.0",
- "webidl-conversions": "^7.0.0",
- "whatwg-encoding": "^2.0.0",
- "whatwg-mimetype": "^3.0.0",
- "whatwg-url": "^12.0.1",
- "ws": "^8.13.0",
- "xml-name-validator": "^4.0.0"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "canvas": "^2.5.0"
- },
- "peerDependenciesMeta": {
- "canvas": {
- "optional": true
- }
- }
- },
- "node_modules/jsdom-global": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/jsdom-global/-/jsdom-global-3.0.2.tgz",
- "integrity": "sha512-t1KMcBkz/pT5JrvcJbpUR2u/w1kO9jXctaaGJ0vZDzwFnIvGWw9IDSRciT83kIs8Bnw4qpOl8bQK08V01YgMPg==",
- "dev": true,
- "peerDependencies": {
- "jsdom": ">=10.0.0"
- }
- },
- "node_modules/jsdom/node_modules/tr46": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
- "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
- "dev": true,
- "dependencies": {
- "punycode": "^2.3.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/jsdom/node_modules/whatwg-url": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz",
- "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==",
- "dev": true,
- "dependencies": {
- "tr46": "^4.1.1",
- "webidl-conversions": "^7.0.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
"node_modules/jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -5070,14 +4552,6 @@
"node": ">=6"
}
},
- "node_modules/jsonpath-plus": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz",
- "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==",
- "engines": {
- "node": ">=12.0.0"
- }
- },
"node_modules/jsonwebtoken": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
@@ -5098,16 +4572,6 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
- "node_modules/jstat": {
- "version": "1.9.6",
- "resolved": "https://registry.npmjs.org/jstat/-/jstat-1.9.6.tgz",
- "integrity": "sha512-rPBkJbK2TnA8pzs93QcDDPlKcrtZWuuCo2dVR0TFLOJSxhqfWOVCSp8aV3/oSbn+4uY4yw1URtLpHQedtmXfug=="
- },
- "node_modules/just-clone": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/just-clone/-/just-clone-6.2.0.tgz",
- "integrity": "sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA=="
- },
"node_modules/jwa": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
@@ -5235,19 +4699,6 @@
"node": ">=6"
}
},
- "node_modules/levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
- "dev": true,
- "dependencies": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/lines-and-columns": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
@@ -5286,20 +4737,6 @@
"resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
"integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA=="
},
- "node_modules/log": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/log/-/log-6.3.1.tgz",
- "integrity": "sha512-McG47rJEWOkXTDioZzQNydAVvZNeEkSyLJ1VWkFwfW+o1knW+QSi8D1KjPn/TnctV+q99lkvJNe1f0E1IjfY2A==",
- "dependencies": {
- "d": "^1.0.1",
- "duration": "^0.2.2",
- "es5-ext": "^0.10.53",
- "event-emitter": "^0.3.5",
- "sprintf-kit": "^2.0.1",
- "type": "^2.5.0",
- "uni-global": "^1.0.0"
- }
- },
"node_modules/logform": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz",
@@ -5669,60 +5106,6 @@
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
},
- "node_modules/next-tick": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
- "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
- },
- "node_modules/node-cache": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz",
- "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==",
- "dependencies": {
- "clone": "2.x"
- },
- "engines": {
- "node": ">= 8.0.0"
- }
- },
- "node_modules/node-fetch": {
- "version": "2.6.7",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
- "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
- }
- },
- "node_modules/node-fetch/node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
- },
- "node_modules/node-fetch/node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
- },
- "node_modules/node-fetch/node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- },
"node_modules/node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
@@ -5880,12 +5263,6 @@
"node": ">=8"
}
},
- "node_modules/nwsapi": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz",
- "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==",
- "dev": true
- },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -5963,23 +5340,6 @@
"node": ">=4"
}
},
- "node_modules/optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
- "dev": true,
- "dependencies": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/os": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz",
@@ -6048,22 +5408,10 @@
"lines-and-columns": "^1.1.6"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/parse5": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
- "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
- "dev": true,
- "dependencies": {
- "entities": "^4.4.0"
+ "node": ">=8"
},
"funding": {
- "url": "https://github.com/inikulin/parse5?sponsor=1"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/parseqs": {
@@ -6238,15 +5586,6 @@
"node": ">= 0.6"
}
},
- "node_modules/prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/pretty-format": {
"version": "29.6.3",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz",
@@ -6283,11 +5622,6 @@
"resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.1.0.tgz",
"integrity": "sha512-9C20RLxrZU/rFnxWncDkuF6O999NdIf3E1ws4B0ZeY3sRVPzWBMsYDE2lxjxhiXxg464cQTgKUGm8/i6y2YGXg=="
},
- "node_modules/promise-polyfill": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.3.0.tgz",
- "integrity": "sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg=="
- },
"node_modules/prompts": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
@@ -6318,12 +5652,6 @@
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
- "node_modules/psl": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
- "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
- "dev": true
- },
"node_modules/pstree.remy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
@@ -6368,12 +5696,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/querystringify": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
- "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
- "dev": true
- },
"node_modules/random-bytes": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
@@ -6450,20 +5772,6 @@
"@redis/time-series": "1.0.5"
}
},
- "node_modules/redis-om": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/redis-om/-/redis-om-0.4.2.tgz",
- "integrity": "sha512-sBah+ljGQY4Zm1f9/+l7HjtIuTQH/rzIX3JSLizymbr6VlTZ2ibt+U3xYKNjIA0tv/D9toEMF7HFXHMtT+l+1A==",
- "dependencies": {
- "jsonpath-plus": "^7.2.0",
- "just-clone": "^6.1.1",
- "redis": "^4.6.4",
- "ulid": "^2.3.0"
- },
- "engines": {
- "node": ">= 14"
- }
- },
"node_modules/require-at": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz",
@@ -6481,12 +5789,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
- "dev": true
- },
"node_modules/resolve": {
"version": "1.22.4",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz",
@@ -6534,12 +5836,6 @@
"node": ">=10"
}
},
- "node_modules/rrweb-cssom": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz",
- "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==",
- "dev": true
- },
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -6570,18 +5866,6 @@
"node": ">=6"
}
},
- "node_modules/saxes": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
- "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
- "dev": true,
- "dependencies": {
- "xmlchars": "^2.2.0"
- },
- "engines": {
- "node": ">=v12.22.7"
- }
- },
"node_modules/semver": {
"version": "7.3.8",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -6689,43 +5973,6 @@
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"dev": true
},
- "node_modules/simple-ldap-search": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/simple-ldap-search/-/simple-ldap-search-3.1.2.tgz",
- "integrity": "sha512-/9b5f4VJhFiI2V2ZtZbFbTv+3PCamV7MGKgMLea/1mKvtY1GSVbZQKclOnqaoxkZ3i/yAPTF1eURykBNFKi36g==",
- "dependencies": {
- "ldapjs": "^2.3.1"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- }
- },
- "node_modules/simple-ldap-search/node_modules/ldapjs": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.3.tgz",
- "integrity": "sha512-75QiiLJV/PQqtpH+HGls44dXweviFwQ6SiIK27EqzKQ5jU/7UFrl2E5nLdQ3IYRBzJ/AVFJI66u0MZ0uofKYwg==",
- "dependencies": {
- "abstract-logging": "^2.0.0",
- "asn1": "^0.2.4",
- "assert-plus": "^1.0.0",
- "backoff": "^2.5.0",
- "ldap-filter": "^0.3.3",
- "once": "^1.4.0",
- "vasync": "^2.2.0",
- "verror": "^1.8.1"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/simple-statistics": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/simple-statistics/-/simple-statistics-7.8.3.tgz",
- "integrity": "sha512-JFvMY00t6SBGtwMuJ+nqgsx9ylkMiJ5JlK9bkj8AdvniIe5615wWQYkKHXe84XtSuc40G/tlrPu0A5/NlJvv8A==",
- "engines": {
- "node": "*"
- }
- },
"node_modules/simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
@@ -6980,14 +6227,6 @@
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true
},
- "node_modules/sprintf-kit": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.1.tgz",
- "integrity": "sha512-2PNlcs3j5JflQKcg4wpdqpZ+AjhQJ2OZEo34NXDtlB0tIPG84xaaXhpA8XFacFiwjKA4m49UOYG83y3hbMn/gQ==",
- "dependencies": {
- "es5-ext": "^0.10.53"
- }
- },
"node_modules/ssha": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ssha/-/ssha-1.0.1.tgz",
@@ -7217,12 +6456,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/symbol-tree": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
- "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
- "dev": true
- },
"node_modules/test-exclude": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
@@ -7309,21 +6542,6 @@
"nodetouch": "bin/nodetouch.js"
}
},
- "node_modules/tough-cookie": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
- "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
- "dev": true,
- "dependencies": {
- "psl": "^1.1.33",
- "punycode": "^2.1.1",
- "universalify": "^0.2.0",
- "url-parse": "^1.5.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/tr46": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
@@ -7341,23 +6559,6 @@
"resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
"integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
},
- "node_modules/type": {
- "version": "2.7.2",
- "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
- "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
- },
- "node_modules/type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
- "dev": true,
- "dependencies": {
- "prelude-ls": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/type-detect": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
@@ -7420,14 +6621,6 @@
"node": ">= 0.8"
}
},
- "node_modules/ulid": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz",
- "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==",
- "bin": {
- "ulid": "bin/cli.js"
- }
- },
"node_modules/undefsafe": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
@@ -7439,23 +6632,6 @@
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
"integrity": "sha512-cp0oQQyZhUM1kpJDLdGO1jPZHgS/MpzoWYfe9+CM2h/QGDZlqwT2T3YGukuBdaNJ/CAPoeyAZRRHz8JFo176vA=="
},
- "node_modules/uni-global": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/uni-global/-/uni-global-1.0.0.tgz",
- "integrity": "sha512-WWM3HP+siTxzIWPNUg7hZ4XO8clKi6NoCAJJWnuRL+BAqyFXF8gC03WNyTefGoUXYc47uYgXxpKLIEvo65PEHw==",
- "dependencies": {
- "type": "^2.5.0"
- }
- },
- "node_modules/universalify": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
- "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -7494,16 +6670,6 @@
"browserslist": ">= 4.21.0"
}
},
- "node_modules/url-parse": {
- "version": "1.5.10",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
- "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
- "dev": true,
- "dependencies": {
- "querystringify": "^2.1.1",
- "requires-port": "^1.0.0"
- }
- },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -7590,18 +6756,6 @@
"node": ">=0.6.0"
}
},
- "node_modules/w3c-xmlserializer": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
- "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
- "dev": true,
- "dependencies": {
- "xml-name-validator": "^4.0.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
"node_modules/walker": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
@@ -7620,39 +6774,6 @@
"node": ">=12"
}
},
- "node_modules/whatwg-encoding": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
- "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
- "dev": true,
- "dependencies": {
- "iconv-lite": "0.6.3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/whatwg-encoding/node_modules/iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "dev": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/whatwg-mimetype": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
- "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
- "dev": true,
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/whatwg-url": {
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
@@ -7810,15 +6931,6 @@
"node": ">= 6"
}
},
- "node_modules/word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
@@ -7859,42 +6971,6 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
- "node_modules/ws": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
- "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
- "dev": true,
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/xml-name-validator": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
- "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
- "dev": true,
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/xmlchars": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
- "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
- "dev": true
- },
"node_modules/xmlhttprequest-ssl": {
"version": "1.6.3",
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz",
@@ -8973,12 +8049,6 @@
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
"integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
},
- "@tootallnate/once": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
- "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
- "dev": true
- },
"@types/babel__core": {
"version": "7.20.1",
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz",
@@ -9113,12 +8183,6 @@
"integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==",
"dev": true
},
- "abab": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
- "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
- "dev": true
- },
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -9139,59 +8203,11 @@
"negotiator": "0.6.3"
}
},
- "acorn": {
- "version": "8.8.2",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
- "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
- "dev": true
- },
- "acorn-globals": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
- "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
- "dev": true,
- "requires": {
- "acorn": "^8.1.0",
- "acorn-walk": "^8.0.2"
- }
- },
- "acorn-walk": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
- "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
- "dev": true
- },
"after": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
"integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA=="
},
- "agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "dev": true,
- "requires": {
- "debug": "4"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
"ansi-escapes": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
@@ -9435,11 +8451,6 @@
"safe-buffer": "5.1.2"
}
},
- "bcryptjs": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
- "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ=="
- },
"binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
@@ -9649,20 +8660,6 @@
"wrap-ansi": "^7.0.0"
}
},
- "clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="
- },
- "cluster": {
- "version": "0.7.7",
- "resolved": "https://registry.npmjs.org/cluster/-/cluster-0.7.7.tgz",
- "integrity": "sha512-16LzEZSoBUgRHSN7NA46ntGnI9tf0NnxTm3KCDvHd6aj4EsBqUbYDN3ImCfjYegBXJZiutULF5rWkcRusMIozQ==",
- "requires": {
- "log": ">= 1.2.0",
- "mkdirp": ">= 0.0.1"
- }
- },
"cluster-key-slot": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz",
@@ -9888,14 +8885,6 @@
"vary": "^1"
}
},
- "cross-fetch": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
- "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
- "requires": {
- "node-fetch": "2.6.7"
- }
- },
"cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -9907,63 +8896,6 @@
"which": "^2.0.1"
}
},
- "cssstyle": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz",
- "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==",
- "dev": true,
- "requires": {
- "rrweb-cssom": "^0.6.0"
- }
- },
- "d": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
- "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
- "requires": {
- "es5-ext": "^0.10.50",
- "type": "^1.0.1"
- },
- "dependencies": {
- "type": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
- "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
- }
- }
- },
- "data-urls": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz",
- "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==",
- "dev": true,
- "requires": {
- "abab": "^2.0.6",
- "whatwg-mimetype": "^3.0.0",
- "whatwg-url": "^12.0.0"
- },
- "dependencies": {
- "tr46": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
- "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
- "dev": true,
- "requires": {
- "punycode": "^2.3.0"
- }
- },
- "whatwg-url": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz",
- "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==",
- "dev": true,
- "requires": {
- "tr46": "^4.1.1",
- "webidl-conversions": "^7.0.0"
- }
- }
- }
- },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -9972,12 +8904,6 @@
"ms": "2.0.0"
}
},
- "decimal.js": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
- "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
- "dev": true
- },
"dedent": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz",
@@ -9985,12 +8911,6 @@
"dev": true,
"requires": {}
},
- "deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
- },
"deepmerge": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
@@ -10040,29 +8960,11 @@
"integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
"dev": true
},
- "domexception": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
- "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
- "dev": true,
- "requires": {
- "webidl-conversions": "^7.0.0"
- }
- },
"dotenv": {
"version": "16.0.3",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
"integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="
},
- "duration": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz",
- "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==",
- "requires": {
- "d": "1",
- "es5-ext": "~0.10.46"
- }
- },
"ecdsa-sig-formatter": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
@@ -10198,12 +9100,6 @@
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz",
"integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw=="
},
- "entities": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
- "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
- "dev": true
- },
"error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -10213,35 +9109,6 @@
"is-arrayish": "^0.2.1"
}
},
- "es5-ext": {
- "version": "0.10.62",
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz",
- "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==",
- "requires": {
- "es6-iterator": "^2.0.3",
- "es6-symbol": "^3.1.3",
- "next-tick": "^1.1.0"
- }
- },
- "es6-iterator": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
- "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
- "requires": {
- "d": "1",
- "es5-ext": "^0.10.35",
- "es6-symbol": "^3.1.1"
- }
- },
- "es6-symbol": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
- "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
- "requires": {
- "d": "^1.0.1",
- "ext": "^1.1.2"
- }
- },
"escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -10259,51 +9126,17 @@
"integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
"dev": true
},
- "escodegen": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
- "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
- "dev": true,
- "requires": {
- "esprima": "^4.0.1",
- "estraverse": "^5.2.0",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1",
- "source-map": "~0.6.1"
- }
- },
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
- "estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true
- },
- "esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true
- },
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
},
- "event-emitter": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
- "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
- "requires": {
- "d": "1",
- "es5-ext": "~0.10.14"
- }
- },
"event-loop-stats": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/event-loop-stats/-/event-loop-stats-1.2.0.tgz",
@@ -10607,14 +9440,6 @@
"validator": "^13.9.0"
}
},
- "ext": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
- "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
- "requires": {
- "type": "^2.7.2"
- }
- },
"extsprintf": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz",
@@ -10626,12 +9451,6 @@
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
},
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true
- },
"fast-safe-stringify": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
@@ -10902,15 +9721,6 @@
"resolved": "https://registry.npmjs.org/hoek/-/hoek-5.0.4.tgz",
"integrity": "sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w=="
},
- "html-encoding-sniffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
- "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
- "dev": true,
- "requires": {
- "whatwg-encoding": "^2.0.0"
- }
- },
"html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -10929,34 +9739,6 @@
"toidentifier": "1.0.1"
}
},
- "http-proxy-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
- "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
- "dev": true,
- "requires": {
- "@tootallnate/once": "2",
- "agent-base": "6",
- "debug": "4"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
"httpntlm": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz",
@@ -10971,33 +9753,6 @@
"resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.5.2.tgz",
"integrity": "sha512-2Jm+x9WkExDOeFRrdBCBSpLPT5SokTcRHkunV3pjKmX/cx6av8zQ0WtHUMDrYb6O4hBFzNU6sxJEypvRUVYKnw=="
},
- "https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
- "dev": true,
- "requires": {
- "agent-base": "6",
- "debug": "4"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
- }
- },
"human-signals": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
@@ -11128,12 +9883,6 @@
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
- "is-potential-custom-element-name": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
- "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
- "dev": true
- },
"is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
@@ -11253,11 +10002,6 @@
"integrity": "sha512-qybtBUesniQdW6n+QIHMng2vDOHscIC/dEXjW+JzO9+LoAZMb03RCUC5xFOv/btSKPm1xL42fn+RjlU4oB42Lg==",
"dev": true
},
- "jerzy": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/jerzy/-/jerzy-0.2.1.tgz",
- "integrity": "sha512-NHuYTuLgwwBrGKNORh+mSqnvJUeXe9OX9HLP60CT4iRQPgi+OPKBjThOLvwc5SA4yfjTQ/RpyhPfczfavS+Gsg=="
- },
"jest": {
"version": "29.6.4",
"resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz",
@@ -11407,15 +10151,6 @@
"jest-util": "^29.6.3"
}
},
- "jest-fetch-mock": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz",
- "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==",
- "requires": {
- "cross-fetch": "^3.0.4",
- "promise-polyfill": "^8.1.3"
- }
- },
"jest-get-type": {
"version": "29.6.3",
"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
@@ -11731,68 +10466,6 @@
"esprima": "^4.0.0"
}
},
- "jsdom": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.1.tgz",
- "integrity": "sha512-Jjgdmw48RKcdAIQyUD1UdBh2ecH7VqwaXPN3ehoZN6MqgVbMn+lRm1aAT1AsdJRAJpwfa4IpwgzySn61h2qu3w==",
- "dev": true,
- "requires": {
- "abab": "^2.0.6",
- "acorn": "^8.8.2",
- "acorn-globals": "^7.0.0",
- "cssstyle": "^3.0.0",
- "data-urls": "^4.0.0",
- "decimal.js": "^10.4.3",
- "domexception": "^4.0.0",
- "escodegen": "^2.0.0",
- "form-data": "^4.0.0",
- "html-encoding-sniffer": "^3.0.0",
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.1",
- "is-potential-custom-element-name": "^1.0.1",
- "nwsapi": "^2.2.2",
- "parse5": "^7.1.2",
- "rrweb-cssom": "^0.6.0",
- "saxes": "^6.0.0",
- "symbol-tree": "^3.2.4",
- "tough-cookie": "^4.1.2",
- "w3c-xmlserializer": "^4.0.0",
- "webidl-conversions": "^7.0.0",
- "whatwg-encoding": "^2.0.0",
- "whatwg-mimetype": "^3.0.0",
- "whatwg-url": "^12.0.1",
- "ws": "^8.13.0",
- "xml-name-validator": "^4.0.0"
- },
- "dependencies": {
- "tr46": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
- "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
- "dev": true,
- "requires": {
- "punycode": "^2.3.0"
- }
- },
- "whatwg-url": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz",
- "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==",
- "dev": true,
- "requires": {
- "tr46": "^4.1.1",
- "webidl-conversions": "^7.0.0"
- }
- }
- }
- },
- "jsdom-global": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/jsdom-global/-/jsdom-global-3.0.2.tgz",
- "integrity": "sha512-t1KMcBkz/pT5JrvcJbpUR2u/w1kO9jXctaaGJ0vZDzwFnIvGWw9IDSRciT83kIs8Bnw4qpOl8bQK08V01YgMPg==",
- "dev": true,
- "requires": {}
- },
"jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -11811,11 +10484,6 @@
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"dev": true
},
- "jsonpath-plus": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz",
- "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA=="
- },
"jsonwebtoken": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
@@ -11834,16 +10502,6 @@
}
}
},
- "jstat": {
- "version": "1.9.6",
- "resolved": "https://registry.npmjs.org/jstat/-/jstat-1.9.6.tgz",
- "integrity": "sha512-rPBkJbK2TnA8pzs93QcDDPlKcrtZWuuCo2dVR0TFLOJSxhqfWOVCSp8aV3/oSbn+4uY4yw1URtLpHQedtmXfug=="
- },
- "just-clone": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/just-clone/-/just-clone-6.2.0.tgz",
- "integrity": "sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA=="
- },
"jwa": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
@@ -11954,16 +10612,6 @@
"integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
"dev": true
},
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
- "dev": true,
- "requires": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- }
- },
"lines-and-columns": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
@@ -11999,20 +10647,6 @@
"resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
"integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA=="
},
- "log": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/log/-/log-6.3.1.tgz",
- "integrity": "sha512-McG47rJEWOkXTDioZzQNydAVvZNeEkSyLJ1VWkFwfW+o1knW+QSi8D1KjPn/TnctV+q99lkvJNe1f0E1IjfY2A==",
- "requires": {
- "d": "^1.0.1",
- "duration": "^0.2.2",
- "es5-ext": "^0.10.53",
- "event-emitter": "^0.3.5",
- "sprintf-kit": "^2.0.1",
- "type": "^2.5.0",
- "uni-global": "^1.0.0"
- }
- },
"logform": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz",
@@ -12306,48 +10940,6 @@
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
},
- "next-tick": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
- "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
- },
- "node-cache": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz",
- "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==",
- "requires": {
- "clone": "2.x"
- }
- },
- "node-fetch": {
- "version": "2.6.7",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
- "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
- "requires": {
- "whatwg-url": "^5.0.0"
- },
- "dependencies": {
- "tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
- },
- "webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
- },
- "whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
- "requires": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- }
- }
- },
"node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
@@ -12473,12 +11065,6 @@
"path-key": "^3.0.0"
}
},
- "nwsapi": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz",
- "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==",
- "dev": true
- },
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -12535,20 +11121,6 @@
"require-at": "^1.0.6"
}
},
- "optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
- "dev": true,
- "requires": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
- }
- },
"os": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz",
@@ -12601,15 +11173,6 @@
"lines-and-columns": "^1.1.6"
}
},
- "parse5": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
- "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
- "dev": true,
- "requires": {
- "entities": "^4.4.0"
- }
- },
"parseqs": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
@@ -12736,12 +11299,6 @@
"resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz",
"integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ=="
},
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
- "dev": true
- },
"pretty-format": {
"version": "29.6.3",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz",
@@ -12771,11 +11328,6 @@
"resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.1.0.tgz",
"integrity": "sha512-9C20RLxrZU/rFnxWncDkuF6O999NdIf3E1ws4B0ZeY3sRVPzWBMsYDE2lxjxhiXxg464cQTgKUGm8/i6y2YGXg=="
},
- "promise-polyfill": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.3.0.tgz",
- "integrity": "sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg=="
- },
"prompts": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
@@ -12800,12 +11352,6 @@
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
- "psl": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
- "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
- "dev": true
- },
"pstree.remy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
@@ -12831,12 +11377,6 @@
"side-channel": "^1.0.4"
}
},
- "querystringify": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
- "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
- "dev": true
- },
"random-bytes": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
@@ -12901,17 +11441,6 @@
"@redis/time-series": "1.0.5"
}
},
- "redis-om": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/redis-om/-/redis-om-0.4.2.tgz",
- "integrity": "sha512-sBah+ljGQY4Zm1f9/+l7HjtIuTQH/rzIX3JSLizymbr6VlTZ2ibt+U3xYKNjIA0tv/D9toEMF7HFXHMtT+l+1A==",
- "requires": {
- "jsonpath-plus": "^7.2.0",
- "just-clone": "^6.1.1",
- "redis": "^4.6.4",
- "ulid": "^2.3.0"
- }
- },
"require-at": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz",
@@ -12923,12 +11452,6 @@
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"dev": true
},
- "requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
- "dev": true
- },
"resolve": {
"version": "1.22.4",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz",
@@ -12961,12 +11484,6 @@
"integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
"dev": true
},
- "rrweb-cssom": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz",
- "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==",
- "dev": true
- },
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -12991,15 +11508,6 @@
"sparse-bitfield": "^3.0.3"
}
},
- "saxes": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
- "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
- "dev": true,
- "requires": {
- "xmlchars": "^2.2.0"
- }
- },
"semver": {
"version": "7.3.8",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
@@ -13088,36 +11596,6 @@
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"dev": true
},
- "simple-ldap-search": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/simple-ldap-search/-/simple-ldap-search-3.1.2.tgz",
- "integrity": "sha512-/9b5f4VJhFiI2V2ZtZbFbTv+3PCamV7MGKgMLea/1mKvtY1GSVbZQKclOnqaoxkZ3i/yAPTF1eURykBNFKi36g==",
- "requires": {
- "ldapjs": "^2.3.1"
- },
- "dependencies": {
- "ldapjs": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.3.tgz",
- "integrity": "sha512-75QiiLJV/PQqtpH+HGls44dXweviFwQ6SiIK27EqzKQ5jU/7UFrl2E5nLdQ3IYRBzJ/AVFJI66u0MZ0uofKYwg==",
- "requires": {
- "abstract-logging": "^2.0.0",
- "asn1": "^0.2.4",
- "assert-plus": "^1.0.0",
- "backoff": "^2.5.0",
- "ldap-filter": "^0.3.3",
- "once": "^1.4.0",
- "vasync": "^2.2.0",
- "verror": "^1.8.1"
- }
- }
- }
- },
- "simple-statistics": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/simple-statistics/-/simple-statistics-7.8.3.tgz",
- "integrity": "sha512-JFvMY00t6SBGtwMuJ+nqgsx9ylkMiJ5JlK9bkj8AdvniIe5615wWQYkKHXe84XtSuc40G/tlrPu0A5/NlJvv8A=="
- },
"simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
@@ -13328,14 +11806,6 @@
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true
},
- "sprintf-kit": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.1.tgz",
- "integrity": "sha512-2PNlcs3j5JflQKcg4wpdqpZ+AjhQJ2OZEo34NXDtlB0tIPG84xaaXhpA8XFacFiwjKA4m49UOYG83y3hbMn/gQ==",
- "requires": {
- "es5-ext": "^0.10.53"
- }
- },
"ssha": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ssha/-/ssha-1.0.1.tgz",
@@ -13496,12 +11966,6 @@
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true
},
- "symbol-tree": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
- "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
- "dev": true
- },
"test-exclude": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
@@ -13573,18 +12037,6 @@
"nopt": "~1.0.10"
}
},
- "tough-cookie": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
- "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
- "dev": true,
- "requires": {
- "psl": "^1.1.33",
- "punycode": "^2.1.1",
- "universalify": "^0.2.0",
- "url-parse": "^1.5.3"
- }
- },
"tr46": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
@@ -13599,20 +12051,6 @@
"resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
"integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
},
- "type": {
- "version": "2.7.2",
- "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
- "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
- },
- "type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
- "dev": true,
- "requires": {
- "prelude-ls": "~1.1.2"
- }
- },
"type-detect": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
@@ -13654,11 +12092,6 @@
"random-bytes": "~1.0.0"
}
},
- "ulid": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz",
- "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw=="
- },
"undefsafe": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
@@ -13670,20 +12103,6 @@
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
"integrity": "sha512-cp0oQQyZhUM1kpJDLdGO1jPZHgS/MpzoWYfe9+CM2h/QGDZlqwT2T3YGukuBdaNJ/CAPoeyAZRRHz8JFo176vA=="
},
- "uni-global": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/uni-global/-/uni-global-1.0.0.tgz",
- "integrity": "sha512-WWM3HP+siTxzIWPNUg7hZ4XO8clKi6NoCAJJWnuRL+BAqyFXF8gC03WNyTefGoUXYc47uYgXxpKLIEvo65PEHw==",
- "requires": {
- "type": "^2.5.0"
- }
- },
- "universalify": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
- "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
- "dev": true
- },
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -13699,16 +12118,6 @@
"picocolors": "^1.0.0"
}
},
- "url-parse": {
- "version": "1.5.10",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
- "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
- "dev": true,
- "requires": {
- "querystringify": "^2.1.1",
- "requires-port": "^1.0.0"
- }
- },
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -13778,15 +12187,6 @@
"extsprintf": "^1.2.0"
}
},
- "w3c-xmlserializer": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
- "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
- "dev": true,
- "requires": {
- "xml-name-validator": "^4.0.0"
- }
- },
"walker": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
@@ -13802,32 +12202,6 @@
"integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
"dev": true
},
- "whatwg-encoding": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
- "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
- "dev": true,
- "requires": {
- "iconv-lite": "0.6.3"
- },
- "dependencies": {
- "iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "dev": true,
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- }
- }
- }
- },
- "whatwg-mimetype": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
- "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
- "dev": true
- },
"whatwg-url": {
"version": "11.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
@@ -13933,12 +12307,6 @@
}
}
},
- "word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
- "dev": true
- },
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
@@ -13970,25 +12338,6 @@
"signal-exit": "^3.0.7"
}
},
- "ws": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
- "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
- "dev": true,
- "requires": {}
- },
- "xml-name-validator": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
- "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
- "dev": true
- },
- "xmlchars": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
- "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
- "dev": true
- },
"xmlhttprequest-ssl": {
"version": "1.6.3",
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz",
diff --git a/package.json b/package.json
index 9704e783..1de14938 100644
--- a/package.json
+++ b/package.json
@@ -18,9 +18,7 @@
"dependencies": {
"@hapi/boom": "^10.0.1",
"axios": "^1.3.5",
- "bcryptjs": "^2.4.3",
"body-parser": "^1.20.2",
- "cluster": "^0.7.7",
"compression": "^1.7.4",
"cors": "^2.8.5",
"dotenv": "^16.0.3",
@@ -32,18 +30,13 @@
"fs": "^0.0.1-security",
"handlebars": "^4.7.7",
"helmet": "^6.1.3",
- "jerzy": "^0.2.1",
- "jest-fetch-mock": "^3.0.3",
"joi": "^13.0.2",
"jsonwebtoken": "^9.0.0",
- "jstat": "^1.9.6",
"LDAP": "^1.2.1",
"ldap-authentication": "^2.3.1",
"ldapjs": "^3.0.1",
- "lodash": "^4.17.4",
"morgan": "^1.10.0",
"multer": "^1.4.5-lts.1",
- "node-cache": "^5.1.2",
"nodemailer": "^6.9.1",
"nodemailer-smtp-transport": "^2.7.4",
"os": "^0.1.2",
@@ -52,9 +45,6 @@
"passport-jwt": "^4.0.1",
"password-validator": "^5.3.0",
"redis": "^4.6.8",
- "redis-om": "^0.4.2",
- "simple-ldap-search": "^3.1.2",
- "simple-statistics": "^7.8.3",
"socket.io": "^4.6.1",
"ssha": "^1.0.1",
"winston": "^3.8.2",
@@ -66,12 +56,9 @@
"express-session": "^1.17.3",
"jasmine": "^4.3.0",
"jest": "^29.6.4",
- "jsdom": "^21.1.1",
- "jsdom-global": "^3.0.2",
"module-alias": "^2.2.3",
"mongoose": "^6.5.2",
"nodemon": "^2.0.22",
- "superagent": "^8.0.0",
"supertest": "^6.3.3"
},
"scripts": {
From c3f1dab516f7a8a4819f22dda989a479ad6cd09f Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Tue, 12 Sep 2023 15:26:49 -0400
Subject: [PATCH 103/229] rename password module
---
.../images/favicon.png | Bin
.../routes/recovery_password.routes.js | 0
.../schemas/passwordValidation.schema.js | 0
.../schemas/user&recoveryCode.schema.js | 0
.../services/restore-password.service.js | 0
.../templates/reset-password-email.html | 0
.../templates/successful-password-change.html | 0
.../utils/emailUtils.js | 0
.../utils/passwordUtils.js | 0
src/routes/routes.js | 5 +++--
10 files changed, 3 insertions(+), 2 deletions(-)
rename src/modules/{forgot-password => passwordManagement}/images/favicon.png (100%)
rename src/modules/{forgot-password => passwordManagement}/routes/recovery_password.routes.js (100%)
rename src/modules/{forgot-password => passwordManagement}/schemas/passwordValidation.schema.js (100%)
rename src/modules/{forgot-password => passwordManagement}/schemas/user&recoveryCode.schema.js (100%)
rename src/modules/{forgot-password => passwordManagement}/services/restore-password.service.js (100%)
rename src/modules/{forgot-password => passwordManagement}/templates/reset-password-email.html (100%)
rename src/modules/{forgot-password => passwordManagement}/templates/successful-password-change.html (100%)
rename src/modules/{forgot-password => passwordManagement}/utils/emailUtils.js (100%)
rename src/modules/{forgot-password => passwordManagement}/utils/passwordUtils.js (100%)
diff --git a/src/modules/forgot-password/images/favicon.png b/src/modules/passwordManagement/images/favicon.png
similarity index 100%
rename from src/modules/forgot-password/images/favicon.png
rename to src/modules/passwordManagement/images/favicon.png
diff --git a/src/modules/forgot-password/routes/recovery_password.routes.js b/src/modules/passwordManagement/routes/recovery_password.routes.js
similarity index 100%
rename from src/modules/forgot-password/routes/recovery_password.routes.js
rename to src/modules/passwordManagement/routes/recovery_password.routes.js
diff --git a/src/modules/forgot-password/schemas/passwordValidation.schema.js b/src/modules/passwordManagement/schemas/passwordValidation.schema.js
similarity index 100%
rename from src/modules/forgot-password/schemas/passwordValidation.schema.js
rename to src/modules/passwordManagement/schemas/passwordValidation.schema.js
diff --git a/src/modules/forgot-password/schemas/user&recoveryCode.schema.js b/src/modules/passwordManagement/schemas/user&recoveryCode.schema.js
similarity index 100%
rename from src/modules/forgot-password/schemas/user&recoveryCode.schema.js
rename to src/modules/passwordManagement/schemas/user&recoveryCode.schema.js
diff --git a/src/modules/forgot-password/services/restore-password.service.js b/src/modules/passwordManagement/services/restore-password.service.js
similarity index 100%
rename from src/modules/forgot-password/services/restore-password.service.js
rename to src/modules/passwordManagement/services/restore-password.service.js
diff --git a/src/modules/forgot-password/templates/reset-password-email.html b/src/modules/passwordManagement/templates/reset-password-email.html
similarity index 100%
rename from src/modules/forgot-password/templates/reset-password-email.html
rename to src/modules/passwordManagement/templates/reset-password-email.html
diff --git a/src/modules/forgot-password/templates/successful-password-change.html b/src/modules/passwordManagement/templates/successful-password-change.html
similarity index 100%
rename from src/modules/forgot-password/templates/successful-password-change.html
rename to src/modules/passwordManagement/templates/successful-password-change.html
diff --git a/src/modules/forgot-password/utils/emailUtils.js b/src/modules/passwordManagement/utils/emailUtils.js
similarity index 100%
rename from src/modules/forgot-password/utils/emailUtils.js
rename to src/modules/passwordManagement/utils/emailUtils.js
diff --git a/src/modules/forgot-password/utils/passwordUtils.js b/src/modules/passwordManagement/utils/passwordUtils.js
similarity index 100%
rename from src/modules/forgot-password/utils/passwordUtils.js
rename to src/modules/passwordManagement/utils/passwordUtils.js
diff --git a/src/routes/routes.js b/src/routes/routes.js
index ef9c39af..4e001862 100644
--- a/src/routes/routes.js
+++ b/src/routes/routes.js
@@ -2,14 +2,15 @@ const UserRoutes = require('./user.routes')
const GroupRoutes = require('./group.routes')
const ProfileRoutes = require('./profile.routes')
const LogsRoutes = require('./logs.routes')
-const RecoveryPassword = require('@src/modules/forgot-password/routes/recovery_password.routes')
+const RecoveryPassword = require('@src/modules/passwordManagement/routes/recovery_password.routes')
+const UpdatePassword = require('@src/modules/passwordManagement/routes/updated_password.routes')
const addRoutes = (app) => {
app.use('/users', UserRoutes)
app.use('/groups', GroupRoutes)
app.use('/profile', ProfileRoutes)
app.use('/logs', LogsRoutes)
- app.use('/', RecoveryPassword)
+ app.use('/', RecoveryPassword, UpdatePassword)
}
module.exports = addRoutes
From a92374bdc84b9f8a8f8f0b8a3a9c213703dfdf96 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Tue, 12 Sep 2023 15:35:42 -0400
Subject: [PATCH 104/229] update password endpoint added
---
.../routes/updated_password.routes.js | 73 +++++++++++++++++++
1 file changed, 73 insertions(+)
create mode 100644 src/modules/passwordManagement/routes/updated_password.routes.js
diff --git a/src/modules/passwordManagement/routes/updated_password.routes.js b/src/modules/passwordManagement/routes/updated_password.routes.js
new file mode 100644
index 00000000..dd3e124f
--- /dev/null
+++ b/src/modules/passwordManagement/routes/updated_password.routes.js
@@ -0,0 +1,73 @@
+const express = require('express')
+const router = express.Router()
+const userService = require('@src/services/user.services')()
+const {
+ sendSuccessPasswordEmailTo,
+} = require('../services/restore-password.service')
+const { validationResult, body } = require('express-validator')
+const {
+ passwordValidationMiddleware,
+ hashPassword,
+ verifyPassword,
+} = require('../utils/passwordUtils')
+const { verifyToken } = require('@src/utils/authentication/tokens/token_verify')
+const { checkAuth, checkBlacklist } = require('@src/middlewares/auth.handler')
+const boom = require('@hapi/boom')
+
+router.post(
+ '/update-password',
+ checkAuth,
+ passwordValidationMiddleware,
+ async (req, res) => {
+ try {
+ const { newPassword, confirmPassword, oldPassword } = req.body
+
+ if (!newPassword || !confirmPassword) {
+ throw boom.unauthorized(
+ 'New password and confirm password are required'
+ )
+ }
+ if (!oldPassword) {
+ throw boom.unauthorized('Password is required')
+ }
+
+ if (newPassword !== confirmPassword) {
+ throw boom.unauthorized('Passwords must be equal')
+ }
+
+ const token = req.headers.authorization.split(' ')[1]
+ const payload = verifyToken(token)
+
+ if (!payload) {
+ throw boom.unauthorized('Token is not valid')
+ }
+
+ const user = await userService.getByUsername(payload.uid)
+
+ if (!user) {
+ throw boom.unauthorized('User not found')
+ }
+
+ if (!verifyPassword(oldPassword, user.userPassword)) {
+ throw boom.unauthorized('Invalid password')
+ }
+
+ const encryptedPassword = hashPassword(newPassword)
+ const updatedUser = await userService.updateUser(
+ payload.uid,
+ 'userPassword',
+ encryptedPassword
+ )
+
+ if (!!updatedUser) {
+ await sendSuccessPasswordEmailTo(payload.name, payload.email)
+ res.status(200).json({ success: true, message: 'Updated user' })
+ }
+ } catch (error) {
+ console.error('Error updating password:', error)
+ res.status(500).json({ message: 'Error updating password' })
+ }
+ }
+)
+
+module.exports = router
From 8ad8e35ffb2163495af04affbdcae352e5642a71 Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Tue, 12 Sep 2023 15:40:31 -0400
Subject: [PATCH 105/229] add email notification to update password endpoint
---
.../passwordManagement/routes/updated_password.routes.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/modules/passwordManagement/routes/updated_password.routes.js b/src/modules/passwordManagement/routes/updated_password.routes.js
index dd3e124f..d803938b 100644
--- a/src/modules/passwordManagement/routes/updated_password.routes.js
+++ b/src/modules/passwordManagement/routes/updated_password.routes.js
@@ -60,7 +60,7 @@ router.post(
)
if (!!updatedUser) {
- await sendSuccessPasswordEmailTo(payload.name, payload.email)
+ await sendSuccessPasswordEmailTo(user.name, user.maildrop)
res.status(200).json({ success: true, message: 'Updated user' })
}
} catch (error) {
From 85e5b0bfe33b650d749eac78b7e58f8ecfe3477b Mon Sep 17 00:00:00 2001
From: Ahmedglez
Date: Tue, 12 Sep 2023 15:40:55 -0400
Subject: [PATCH 106/229] update password change template
---
.../templates/successful-password-change.html | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/modules/passwordManagement/templates/successful-password-change.html b/src/modules/passwordManagement/templates/successful-password-change.html
index d6a4a507..30972fe6 100644
--- a/src/modules/passwordManagement/templates/successful-password-change.html
+++ b/src/modules/passwordManagement/templates/successful-password-change.html
@@ -33,7 +33,8 @@
Cambio de Contraseña Exitoso
@@ -54,7 +55,7 @@ Cambio de Contraseña Exitoso
padding: 10px;
"
>
- © 2023 Tu Empresa. Todos los derechos reservados.
+ Equipo de Administración LDAP Cujae