diff --git a/DockerCompse.template b/DockerCompose.template similarity index 100% rename from DockerCompse.template rename to DockerCompose.template diff --git a/models/Passport-ActiveDirectory.js b/models/Passport-ActiveDirectory.js index 895a850..a3c30fe 100644 --- a/models/Passport-ActiveDirectory.js +++ b/models/Passport-ActiveDirectory.js @@ -8,7 +8,7 @@ const setupFilePath = path.join(__dirname, '../data', 'setup.json'); const setupData = JSON.parse(fs.readFileSync(setupFilePath, 'utf-8')); -passport.use('ActiveDirectory', new ActiveDirectoryStrategy({ +passport.use(new ActiveDirectoryStrategy({ integrated: false, ldap: { url: setupData[0].ldap.url, diff --git a/package-lock.json b/package-lock.json index 930dbed..08c9b4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "@cdn/app-insider-swiftlogic-labs-dinawo", + "name": "@cdn-app/insider-swiftlogic-labs-dinawo", "version": "1.0.0-beta.10", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "@cdn/app-insider-swiftlogic-labs-dinawo", + "name": "@cdn-app/insider-swiftlogic-labs-dinawo", "version": "1.0.0-beta.10", "license": "ISC", "dependencies": { @@ -73,9 +73,9 @@ } }, "node_modules/@auth/core": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.28.1.tgz", - "integrity": "sha512-gvp74mypYZADpTlfGRp6HE0G3pIHWvtJpy+KZ+8FvY0cmlIpHog+jdMOdd29dQtLtN25kF2YbfHsesCFuGUQbg==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.29.0.tgz", + "integrity": "sha512-MdfEjU6WRjUnPG1+XeBWrTIlAsLZU6V0imCIqVDDDPxLI6UZWldXVqAA2EsDazGofV78jqiCLHaN85mJITDqdg==", "dependencies": { "@panva/hkdf": "^1.1.1", "@types/cookie": "0.6.0", @@ -102,25 +102,12 @@ } } }, - "node_modules/@auth/core/node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" - }, - "node_modules/@auth/core/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/@auth/express": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@auth/express/-/express-0.5.1.tgz", - "integrity": "sha512-Vn5cuy/QVDwnWtzk91pS3pOVOI9ly9jf8KKOu2/SvucHWQlfhbD5r9Gaih1OVxHuh/5UyI5TiAhNVn9XYS6OxA==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@auth/express/-/express-0.5.2.tgz", + "integrity": "sha512-Z2t56JGhBrn2pHPjFGbqx+atXBKWx24OhlbBZiYBOw29d52OaBc6Ewyh1AQJ8sLWD6peiX3GrLV436qvtI1Stg==", "dependencies": { - "@auth/core": "0.28.1" + "@auth/core": "0.29.0" }, "peerDependencies": { "express": "^4.18.2" @@ -250,9 +237,9 @@ } }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", @@ -273,25 +260,6 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -353,9 +321,9 @@ } }, "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.1.tgz", + "integrity": "sha512-dzJtaDAAoXx4GCOJpbB2eG/Qj8VDpdwkLsWGzGm+0L7E8/434RyMbAHmk9ubXWVAb9nXmc44jUf8GKqVDiKezg==" }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", @@ -369,9 +337,9 @@ } }, "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" }, "node_modules/@types/cors": { "version": "2.8.17", @@ -387,9 +355,9 @@ "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" }, "node_modules/@types/node": { - "version": "20.11.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", - "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", "dependencies": { "undici-types": "~5.26.4" } @@ -544,9 +512,9 @@ } }, "node_modules/adm-zip": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", - "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.12.tgz", + "integrity": "sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==", "engines": { "node": ">=6.0" } @@ -704,11 +672,11 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -763,6 +731,14 @@ "node": ">=0.10.0" } }, + "node_modules/axios-debug/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/backoff": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", @@ -809,11 +785,14 @@ } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/body-parser": { @@ -877,14 +856,6 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", - "engines": { - "node": ">=4" - } - }, "node_modules/bunyan": { "version": "1.8.15", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", @@ -1006,17 +977,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -1158,9 +1118,9 @@ } }, "node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -1177,6 +1137,14 @@ "node": ">= 0.8.0" } }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -1243,9 +1211,9 @@ } }, "node_modules/daisyui": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.7.2.tgz", - "integrity": "sha512-9UCss12Zmyk/22u+JbkVrHHxOzFOyY17HuqP5LeswI4hclbj6qbjJTovdj2zRy8cCH6/n6Wh0lTLjriGnyGh0g==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.10.1.tgz", + "integrity": "sha512-Ds0Z0Fv+Xf6ZEqV4Q5JIOeKfg83xxnww0Lzid0V94vPtlQ0yYmucEa33zSctsX2VEgBALtmk5zVEqd59pnUbuQ==", "dev": true, "dependencies": { "css-selector-tokenizer": "^0.8", @@ -1376,9 +1344,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "engines": { "node": ">=8" } @@ -1458,9 +1426,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dependencies": { "jake": "^10.8.5" }, @@ -1517,6 +1485,19 @@ "node": ">=10.0.0" } }, + "node_modules/engine.io/node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/engine.io/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/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", @@ -1569,16 +1550,16 @@ } }, "node_modules/express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -1610,9 +1591,9 @@ } }, "node_modules/express-fileupload": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.4.3.tgz", - "integrity": "sha512-vRzZo2YELm68DfR/CX8RMXgeK9BTAANxigrKACPjCXFGEzkCt/QWbqaIXP3W61uaX/hLj0CAo3/EVelpSQXkqA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.5.0.tgz", + "integrity": "sha512-jSW3w9evqM37VWkEPkL2Ck5wUo2a8qa03MH+Ou/0ZSTpNlQFBvSLjU12k2nYcHhaMPv4JVvv6+Ac1OuLgUZb7w==", "dependencies": { "busboy": "^1.6.0" }, @@ -1643,14 +1624,6 @@ "node": ">= 0.8.0" } }, - "node_modules/express-session/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/express-session/node_modules/cookie-signature": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", @@ -1669,14 +1642,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1713,17 +1678,6 @@ "node": ">=8.6.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fastparse": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", @@ -1825,9 +1779,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -2048,14 +2002,14 @@ } }, "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 6" } }, "node_modules/gopd": { @@ -2118,11 +2072,12 @@ } }, "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "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": ">=8" + "node": ">=4" } }, "node_modules/has-property-descriptors": { @@ -2164,9 +2119,9 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -2473,6 +2428,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/jake/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2493,9 +2456,9 @@ } }, "node_modules/jose": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.2.3.tgz", - "integrity": "sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.2.4.tgz", + "integrity": "sha512-6ScbIk2WWCeXkmzF6bRPmEuaqy1m8SbsRFMa/FLrSCkGIhj8OLVG/IH+XHVmNMx/KUo8cVWEE6oKR4dJ+S0Rkg==", "funding": { "url": "https://github.com/sponsors/panva" } @@ -2865,9 +2828,9 @@ } }, "node_modules/mysql2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.2.tgz", - "integrity": "sha512-3Cwg/UuRkAv/wm6RhtPE5L7JlPB877vwSF6gfLAS68H+zhH+u5oa3AieqEd0D0/kC3W7qIhYbH419f7O9i/5nw==", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.4.tgz", + "integrity": "sha512-OEESQuwxMza803knC1YSt7NMuc1BrK9j7gZhCSs2WAyxr1vfiI7QLaLOKTh5c9SWGz98qVyQUbK8/WckevNQhg==", "dependencies": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -2978,14 +2941,22 @@ } }, "node_modules/node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "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-ssha256": { @@ -2998,9 +2969,9 @@ } }, "node_modules/nodemailer": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.11.tgz", - "integrity": "sha512-UiAkgiERuG94kl/3bKfE8o10epvDnl0vokNEtZDPTq9BWzIl6EFT9336SbIT4oaTBD8NmmUTLsQyXHV82eXSWg==", + "version": "6.9.13", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.13.tgz", + "integrity": "sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA==", "engines": { "node": ">=6.0.0" } @@ -3033,27 +3004,6 @@ "url": "https://opencollective.com/nodemon" } }, - "node_modules/nodemon/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/nodemon/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/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -3077,9 +3027,9 @@ } }, "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "engines": { "node": ">=14.16" }, @@ -3186,11 +3136,6 @@ "node": ">=12.20" } }, - "node_modules/packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -3323,11 +3268,11 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { @@ -3356,15 +3301,13 @@ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, "node_modules/pg": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", - "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", + "version": "8.11.5", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.5.tgz", + "integrity": "sha512-jqgNHSKL5cbDjFlHyYsCXmQDrfIX/3RsNwYqpd4N0Kt8niLuNoRNH+aazv6cOd43gPh9Y4DjQCtb+X0MH0Hvnw==", "dependencies": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "^2.6.2", - "pg-pool": "^3.6.1", - "pg-protocol": "^1.6.0", + "pg-connection-string": "^2.6.4", + "pg-pool": "^3.6.2", + "pg-protocol": "^1.6.1", "pg-types": "^2.1.0", "pgpass": "1.x" }, @@ -3390,9 +3333,9 @@ "optional": true }, "node_modules/pg-connection-string": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", - "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", + "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" }, "node_modules/pg-int8": { "version": "1.0.1", @@ -3411,20 +3354,20 @@ } }, "node_modules/pg-pool": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", - "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", + "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-promise": { - "version": "11.5.4", - "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-11.5.4.tgz", - "integrity": "sha512-esYSkDt2h6NQOkfotGAm1Ld5OjoITJLpB88Z1PIlcAU/RQ0XQE2PxW0bLJEOMHPGV5iaRnj1Y7ARznXbgN4FNw==", + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-11.6.0.tgz", + "integrity": "sha512-NDRPMfkv3ia89suWlJ4iGvP6X5YFrLJ2+9AIVISeBFFZ29Eb4FNXX9JaVb1p1OrpQkE2yT7igmXPL7UYQhk+6A==", "dependencies": { "assert-options": "0.8.1", - "pg": "8.11.3", + "pg": "8.11.5", "pg-minify": "1.6.3", "spex": "3.3.0" }, @@ -3433,9 +3376,9 @@ } }, "node_modules/pg-protocol": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", - "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", + "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==" }, "node_modules/pg-types": { "version": "2.2.0", @@ -3493,9 +3436,9 @@ } }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -3513,7 +3456,7 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -3617,9 +3560,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3738,9 +3681,9 @@ "dev": true }, "node_modules/public-ip": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/public-ip/-/public-ip-6.0.1.tgz", - "integrity": "sha512-1/Mxa1MKrAQ4jF5IalECSBtB0W1FAtnG+9c5X16jjvV/Gx9fiRy7xXIrHlBGYjnTlai0zdZkM3LrpmASavmAEg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/public-ip/-/public-ip-6.0.2.tgz", + "integrity": "sha512-+6bkjnf0yQ4+tZV0zJv1017DiIF7y6R4yg17Mrhhkc25L7dtQtXWHgSCrz9BbLL4OeTFbPK4EALXqJUrwCIWXw==", "dependencies": { "aggregate-error": "^4.0.1", "dns-socket": "^4.2.2", @@ -4075,16 +4018,16 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "define-data-property": "^1.1.2", + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4165,9 +4108,9 @@ } }, "node_modules/socket.io": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.4.tgz", - "integrity": "sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", @@ -4203,9 +4146,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { "node": ">=0.10.0" } @@ -4351,15 +4294,15 @@ } }, "node_modules/sucrase/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -4372,9 +4315,9 @@ } }, "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4385,12 +4328,24 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "node_modules/sucrase/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "engines": { - "node": ">=0.8.0" + "node": ">=16 || 14 >=14.17" + } + }, + "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/supports-preserve-symlinks-flag": { @@ -4405,18 +4360,18 @@ } }, "node_modules/sweetalert2": { - "version": "11.10.5", - "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.10.5.tgz", - "integrity": "sha512-q9eE3EKhMcpIDU/Xcz7z5lk8axCGkgxwK47gXGrrfncnBJWxHPPHnBVAjfsVXcTt8Yi8U6HNEcBRSu+qGeyFdA==", + "version": "11.10.7", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.10.7.tgz", + "integrity": "sha512-5Jlzrmaitay6KzU+2+LhYu9q+L4v/dZ8oZyEDH14ep0C/QilCnFLHmqAyD/Lhq/lm5DiwsOs6Tr58iv8k3wyGg==", "funding": { "type": "individual", "url": "https://github.com/sponsors/limonte" } }, "node_modules/systeminformation": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.22.0.tgz", - "integrity": "sha512-oAP80ymt8ssrAzjX8k3frbL7ys6AotqC35oikG6/SG15wBw+tG9nCk4oPaXIhEaAOAZ8XngxUv3ORq2IuR3r4Q==", + "version": "5.22.7", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.22.7.tgz", + "integrity": "sha512-AWxlP05KeHbpGdgvZkcudJpsmChc2Y5Eo/GvxG/iUA/Aws5LZKHAMSeAo+V+nD+nxWZaxrwpWcnx4SH3oxNL3A==", "os": [ "darwin", "linux", @@ -4439,9 +4394,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", - "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -4451,7 +4406,7 @@ "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.19.1", + "jiti": "^1.21.0", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", @@ -4474,10 +4429,21 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -4785,9 +4751,9 @@ } }, "node_modules/winston": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.12.0.tgz", - "integrity": "sha512-OwbxKaOlESDi01mC9rkM0dQqQt2I8DAUMRLZ/HpbwvDXm85IryEHgoogy5fziQy38PntgZsLlhAYHz//UPHZ5w==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", + "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", @@ -5028,9 +4994,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.0.tgz", - "integrity": "sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", "bin": { "yaml": "bin.mjs" }, @@ -5046,9 +5012,9 @@ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" }, "@auth/core": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.28.1.tgz", - "integrity": "sha512-gvp74mypYZADpTlfGRp6HE0G3pIHWvtJpy+KZ+8FvY0cmlIpHog+jdMOdd29dQtLtN25kF2YbfHsesCFuGUQbg==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.29.0.tgz", + "integrity": "sha512-MdfEjU6WRjUnPG1+XeBWrTIlAsLZU6V0imCIqVDDDPxLI6UZWldXVqAA2EsDazGofV78jqiCLHaN85mJITDqdg==", "requires": { "@panva/hkdf": "^1.1.1", "@types/cookie": "0.6.0", @@ -5057,26 +5023,14 @@ "oauth4webapi": "^2.4.0", "preact": "10.11.3", "preact-render-to-string": "5.2.3" - }, - "dependencies": { - "@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" - }, - "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" - } } }, "@auth/express": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@auth/express/-/express-0.5.1.tgz", - "integrity": "sha512-Vn5cuy/QVDwnWtzk91pS3pOVOI9ly9jf8KKOu2/SvucHWQlfhbD5r9Gaih1OVxHuh/5UyI5TiAhNVn9XYS6OxA==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@auth/express/-/express-0.5.2.tgz", + "integrity": "sha512-Z2t56JGhBrn2pHPjFGbqx+atXBKWx24OhlbBZiYBOw29d52OaBc6Ewyh1AQJ8sLWD6peiX3GrLV436qvtI1Stg==", "requires": { - "@auth/core": "0.28.1" + "@auth/core": "0.29.0" } }, "@colors/colors": { @@ -5172,9 +5126,9 @@ } }, "@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, "@mapbox/node-pre-gyp": { "version": "1.0.11", @@ -5190,16 +5144,6 @@ "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.11" - }, - "dependencies": { - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "requires": { - "whatwg-url": "^5.0.0" - } - } } }, "@nodelib/fs.scandir": { @@ -5242,9 +5186,9 @@ "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==" }, "@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.1.tgz", + "integrity": "sha512-dzJtaDAAoXx4GCOJpbB2eG/Qj8VDpdwkLsWGzGm+0L7E8/434RyMbAHmk9ubXWVAb9nXmc44jUf8GKqVDiKezg==" }, "@szmarczak/http-timer": { "version": "5.0.1", @@ -5255,9 +5199,9 @@ } }, "@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" }, "@types/cors": { "version": "2.8.17", @@ -5273,9 +5217,9 @@ "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" }, "@types/node": { - "version": "20.11.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", - "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", "requires": { "undici-types": "~5.26.4" } @@ -5400,9 +5344,9 @@ } }, "adm-zip": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", - "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==" + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.12.tgz", + "integrity": "sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==" }, "agent-base": { "version": "6.0.2", @@ -5523,11 +5467,11 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "requires": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -5569,6 +5513,11 @@ "requires": { "ansi-regex": "^2.0.0" } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==" } } }, @@ -5605,9 +5554,9 @@ } }, "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==" }, "body-parser": { "version": "1.20.2", @@ -5665,11 +5614,6 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" - }, "bunyan": { "version": "1.8.15", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", @@ -5748,16 +5692,6 @@ "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - } } }, "chownr": { @@ -5871,9 +5805,9 @@ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" }, "cookie-parser": { "version": "1.4.6", @@ -5882,6 +5816,13 @@ "requires": { "cookie": "0.4.1", "cookie-signature": "1.0.6" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + } } }, "cookie-signature": { @@ -5935,9 +5876,9 @@ "dev": true }, "daisyui": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.7.2.tgz", - "integrity": "sha512-9UCss12Zmyk/22u+JbkVrHHxOzFOyY17HuqP5LeswI4hclbj6qbjJTovdj2zRy8cCH6/n6Wh0lTLjriGnyGh0g==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.10.1.tgz", + "integrity": "sha512-Ds0Z0Fv+Xf6ZEqV4Q5JIOeKfg83xxnww0Lzid0V94vPtlQ0yYmucEa33zSctsX2VEgBALtmk5zVEqd59pnUbuQ==", "dev": true, "requires": { "css-selector-tokenizer": "^0.8", @@ -6018,9 +5959,9 @@ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==" }, "didyoumean": { "version": "1.2.2", @@ -6078,9 +6019,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "requires": { "jake": "^10.8.5" } @@ -6115,6 +6056,18 @@ "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.11.0" + }, + "dependencies": { + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + } } }, "engine.io-parser": { @@ -6156,16 +6109,16 @@ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -6193,11 +6146,6 @@ "vary": "~1.1.2" }, "dependencies": { - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -6214,9 +6162,9 @@ } }, "express-fileupload": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.4.3.tgz", - "integrity": "sha512-vRzZo2YELm68DfR/CX8RMXgeK9BTAANxigrKACPjCXFGEzkCt/QWbqaIXP3W61uaX/hLj0CAo3/EVelpSQXkqA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.5.0.tgz", + "integrity": "sha512-jSW3w9evqM37VWkEPkL2Ck5wUo2a8qa03MH+Ou/0ZSTpNlQFBvSLjU12k2nYcHhaMPv4JVvv6+Ac1OuLgUZb7w==", "requires": { "busboy": "^1.6.0" } @@ -6241,11 +6189,6 @@ "uid-safe": "~2.1.5" }, "dependencies": { - "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" - }, "cookie-signature": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", @@ -6281,16 +6224,6 @@ "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - } } }, "fastparse": { @@ -6389,9 +6322,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, "foreground-child": { "version": "3.1.1", @@ -6538,11 +6471,11 @@ } }, "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" } }, "gopd": { @@ -6592,9 +6525,10 @@ } }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "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 }, "has-property-descriptors": { "version": "1.0.2", @@ -6620,9 +6554,9 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, "hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "requires": { "function-bind": "^1.1.2" } @@ -6837,6 +6771,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6853,9 +6792,9 @@ "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==" }, "jose": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.2.3.tgz", - "integrity": "sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA==" + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.2.4.tgz", + "integrity": "sha512-6ScbIk2WWCeXkmzF6bRPmEuaqy1m8SbsRFMa/FLrSCkGIhj8OLVG/IH+XHVmNMx/KUo8cVWEE6oKR4dJ+S0Rkg==" }, "json-buffer": { "version": "3.0.1", @@ -7130,9 +7069,9 @@ } }, "mysql2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.2.tgz", - "integrity": "sha512-3Cwg/UuRkAv/wm6RhtPE5L7JlPB877vwSF6gfLAS68H+zhH+u5oa3AieqEd0D0/kC3W7qIhYbH419f7O9i/5nw==", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.4.tgz", + "integrity": "sha512-OEESQuwxMza803knC1YSt7NMuc1BrK9j7gZhCSs2WAyxr1vfiI7QLaLOKTh5c9SWGz98qVyQUbK8/WckevNQhg==", "requires": { "denque": "^2.1.0", "generate-function": "^2.3.1", @@ -7214,9 +7153,9 @@ } }, "node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "requires": { "whatwg-url": "^5.0.0" } @@ -7227,9 +7166,9 @@ "integrity": "sha512-Mn2k/WpFsHoWWqLtMFre71xNUw0GpUZR/Kgrv6NNjWgdfbfG5WGnlx19rcGLMHQo3TdCJQM1b1vFz6gzPdwgZw==" }, "nodemailer": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.11.tgz", - "integrity": "sha512-UiAkgiERuG94kl/3bKfE8o10epvDnl0vokNEtZDPTq9BWzIl6EFT9336SbIT4oaTBD8NmmUTLsQyXHV82eXSWg==" + "version": "6.9.13", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.13.tgz", + "integrity": "sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA==" }, "nodemon": { "version": "3.1.0", @@ -7247,23 +7186,6 @@ "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" - }, - "dependencies": { - "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" - } - } } }, "nopt": { @@ -7280,9 +7202,9 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==" + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==" }, "npmlog": { "version": "5.0.1", @@ -7359,11 +7281,6 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==" }, - "packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -7465,11 +7382,11 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", "requires": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "dependencies": { @@ -7491,16 +7408,14 @@ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, "pg": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", - "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", + "version": "8.11.5", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.5.tgz", + "integrity": "sha512-jqgNHSKL5cbDjFlHyYsCXmQDrfIX/3RsNwYqpd4N0Kt8niLuNoRNH+aazv6cOd43gPh9Y4DjQCtb+X0MH0Hvnw==", "requires": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", "pg-cloudflare": "^1.1.1", - "pg-connection-string": "^2.6.2", - "pg-pool": "^3.6.1", - "pg-protocol": "^1.6.0", + "pg-connection-string": "^2.6.4", + "pg-pool": "^3.6.2", + "pg-protocol": "^1.6.1", "pg-types": "^2.1.0", "pgpass": "1.x" } @@ -7512,9 +7427,9 @@ "optional": true }, "pg-connection-string": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", - "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", + "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" }, "pg-int8": { "version": "1.0.1", @@ -7527,26 +7442,26 @@ "integrity": "sha512-NoSsPqXxbkD8RIe+peQCqiea4QzXgosdTKY8p7PsbbGsh2F8TifDj/vJxfuR8qJwNYrijdSs7uf0tAe6WOyCsQ==" }, "pg-pool": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", - "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", + "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", "requires": {} }, "pg-promise": { - "version": "11.5.4", - "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-11.5.4.tgz", - "integrity": "sha512-esYSkDt2h6NQOkfotGAm1Ld5OjoITJLpB88Z1PIlcAU/RQ0XQE2PxW0bLJEOMHPGV5iaRnj1Y7ARznXbgN4FNw==", + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-11.6.0.tgz", + "integrity": "sha512-NDRPMfkv3ia89suWlJ4iGvP6X5YFrLJ2+9AIVISeBFFZ29Eb4FNXX9JaVb1p1OrpQkE2yT7igmXPL7UYQhk+6A==", "requires": { "assert-options": "0.8.1", - "pg": "8.11.3", + "pg": "8.11.5", "pg-minify": "1.6.3", "spex": "3.3.0" } }, "pg-protocol": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", - "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", + "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==" }, "pg-types": { "version": "2.2.0", @@ -7589,13 +7504,13 @@ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==" }, "postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "requires": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" } }, "postcss-import": { @@ -7641,9 +7556,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -7731,9 +7646,9 @@ "dev": true }, "public-ip": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/public-ip/-/public-ip-6.0.1.tgz", - "integrity": "sha512-1/Mxa1MKrAQ4jF5IalECSBtB0W1FAtnG+9c5X16jjvV/Gx9fiRy7xXIrHlBGYjnTlai0zdZkM3LrpmASavmAEg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/public-ip/-/public-ip-6.0.2.tgz", + "integrity": "sha512-+6bkjnf0yQ4+tZV0zJv1017DiIF7y6R4yg17Mrhhkc25L7dtQtXWHgSCrz9BbLL4OeTFbPK4EALXqJUrwCIWXw==", "requires": { "aggregate-error": "^4.0.1", "dns-socket": "^4.2.2", @@ -7964,16 +7879,16 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "requires": { - "define-data-property": "^1.1.2", + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" } }, "setprototypeof": { @@ -8033,9 +7948,9 @@ "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==" }, "socket.io": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.4.tgz", - "integrity": "sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", "requires": { "accepts": "~1.3.4", "base64id": "~2.0.0", @@ -8065,9 +7980,9 @@ } }, "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==" }, "spex": { "version": "3.3.0", @@ -8173,31 +8088,40 @@ } }, "glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "requires": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" } }, "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "requires": { "brace-expansion": "^2.0.1" } + }, + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==" } } }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==" + "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" + } }, "supports-preserve-symlinks-flag": { "version": "1.0.0", @@ -8205,19 +8129,19 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "sweetalert2": { - "version": "11.10.5", - "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.10.5.tgz", - "integrity": "sha512-q9eE3EKhMcpIDU/Xcz7z5lk8axCGkgxwK47gXGrrfncnBJWxHPPHnBVAjfsVXcTt8Yi8U6HNEcBRSu+qGeyFdA==" + "version": "11.10.7", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.10.7.tgz", + "integrity": "sha512-5Jlzrmaitay6KzU+2+LhYu9q+L4v/dZ8oZyEDH14ep0C/QilCnFLHmqAyD/Lhq/lm5DiwsOs6Tr58iv8k3wyGg==" }, "systeminformation": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.22.0.tgz", - "integrity": "sha512-oAP80ymt8ssrAzjX8k3frbL7ys6AotqC35oikG6/SG15wBw+tG9nCk4oPaXIhEaAOAZ8XngxUv3ORq2IuR3r4Q==" + "version": "5.22.7", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.22.7.tgz", + "integrity": "sha512-AWxlP05KeHbpGdgvZkcudJpsmChc2Y5Eo/GvxG/iUA/Aws5LZKHAMSeAo+V+nD+nxWZaxrwpWcnx4SH3oxNL3A==" }, "tailwindcss": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", - "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "requires": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -8227,7 +8151,7 @@ "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.19.1", + "jiti": "^1.21.0", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", @@ -8241,12 +8165,22 @@ "postcss-selector-parser": "^6.0.11", "resolve": "^1.22.2", "sucrase": "^3.32.0" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + } } }, "tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -8498,9 +8432,9 @@ } }, "winston": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.12.0.tgz", - "integrity": "sha512-OwbxKaOlESDi01mC9rkM0dQqQt2I8DAUMRLZ/HpbwvDXm85IryEHgoogy5fziQy38PntgZsLlhAYHz//UPHZ5w==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", + "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", "requires": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", @@ -8667,9 +8601,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.0.tgz", - "integrity": "sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ==" + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==" } } } diff --git a/package.json b/package.json index 37bd23d..ff1723d 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "@cdn/app-insider-swiftlogic-labs-dinawo", + "name": "@cdn-app/insider-swiftlogic-labs-dinawo", "version": "1.0.0-beta.10", "description": "", "main": "server.js", diff --git a/public/js/dashboard.js b/public/js/dashboard.js index 20a4c27..4136cd1 100644 --- a/public/js/dashboard.js +++ b/public/js/dashboard.js @@ -104,7 +104,7 @@ }).then(async (result) => { if (result.isConfirmed) { try { - const response = await fetch(`/dpanel/dashboard/deletefolder/${folderName}`, { + const response = await fetch(`/api/dpanel/dashboard/deletefolder/${folderName}`, { method: 'DELETE', }); @@ -160,7 +160,7 @@ }).then(result => { if (result.isConfirmed) { const folderName = result.value.trim(); - fetch('/dpanel/dashboard/newfolder', { + fetch('/api/dpanel/dashboard/newfolder', { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -342,7 +342,7 @@ }).then(async (result) => { if (result.isConfirmed) { try { - const response = await fetch('/dpanel/dashboard/delete', { + const response = await fetch('/api/dpanel/dashboard/delete', { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -405,7 +405,7 @@ if (result.isConfirmed) { const newName = result.value; - fetch(`/dpanel/dashboard/rename/${folderName}`, { + fetch(`/api/dpanel/dashboard/rename/${folderName}`, { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/public/js/folder.js b/public/js/folder.js index 9dfcd21..aa729b0 100644 --- a/public/js/folder.js +++ b/public/js/folder.js @@ -115,7 +115,7 @@ async function confirmDeleteFile(folderName, filename) { if (confirmationResult.isConfirmed) { try { - const response = await fetch(`/dpanel/dashboard/deletefile/${folderName}`, { + const response = await fetch(`/api/dpanel/dashboard/deletefile/${folderName}`, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -186,7 +186,7 @@ function getCurrentFolderName() { function renameFolder(currentName, newName) { try { const currentFolderName = getCurrentFolderName(); - const renameURL = `/dpanel/dashboard/renamefile/${currentFolderName}`; + const renameURL = `/api/dpanel/dashboard/renamefile/${currentFolderName}`; fetch(renameURL, { method: 'POST', @@ -251,7 +251,7 @@ function renameFile(folderName, currentName) { if (result.isConfirmed) { const newName = result.value; - fetch(`/dpanel/dashboard/rename/${folderName}`, { + fetch(`/api/dpanel/dashboard/rename/${folderName}`, { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/routes/Auth/ActiveDirectory.js b/routes/Auth/ActiveDirectory.js new file mode 100644 index 0000000..726928e --- /dev/null +++ b/routes/Auth/ActiveDirectory.js @@ -0,0 +1,32 @@ +const express = require('express'); +const router = express.Router(); +const passport = require('passport'); +require('../../models/Passport-ActiveDirectory'); +const { checkUserExistsAD } = require('../../Middlewares/UserIDMiddlewareAD'); + +router.post('/', (req, res, next) => { + passport.authenticate('ActiveDirectory', (err, user) => { + if (err) { + return res.render('AuthLogin', { isAuthenticated: false, errorMessage: err.message, setupData: {}, showActiveDirectoryForm: true, currentUrl: req.originalUrl }); + } + if (!user) { + return res.render('AuthLogin', { isAuthenticated: false, errorMessage: 'L\'utilisateur n\'est pas autorisé.', setupData: {}, showActiveDirectoryForm: true, currentUrl: req.originalUrl }); + } + req.user = { + ...user._json, + name: user._json.sAMAccountName, + id: user._json.sAMAccountName, + }; + req.logIn(req.user, function(err) { + if (err) { + return next(err); + } + + req.session.user = req.user; + + return next(); + }); + })(req, res, next); +}, checkUserExistsAD); + +module.exports = router; \ No newline at end of file diff --git a/routes/Auth/Discord.js b/routes/Auth/Discord.js new file mode 100644 index 0000000..f562fdb --- /dev/null +++ b/routes/Auth/Discord.js @@ -0,0 +1,67 @@ +const express = require('express'); +const router = express.Router(); +const passport = require('passport'); +const { checkUserExistsDiscord } = require('../../Middlewares/UserIDMiddlewareDiscord'); +const { getUserData, getSetupData } = require('../../Middlewares/watcherMiddleware'); + +let userData = getUserData(); +let setupData; + +getSetupData().then(data => { + setupData = data; + + if (setupData[0].discord !== undefined) { + const DiscordStrategy = require('../../models/Passport-Discord'); + } +}); + +let user = userData; +if (user.identifyURL) { + router.get("/auth/discord", (req, res) => { + res.redirect(user.identifyURL); + }); +} + +router.use(passport.initialize()); +router.use(passport.session()); + +passport.deserializeUser((user, done) => { + done(null, user); +}); + +router.get("/", (req, res) => { + res.redirect(setupData.discord.identifyURL); +}); + +router.get('/callback', (req, res, next) => { + passport.authenticate('discord', (err, user, info) => { + if (err) { + return next(err); + } + + if (!user) { + return res.redirect('/auth/login'); + } + + req.logIn(user, (loginErr) => { + if (loginErr) { + return next(loginErr); + } + + checkUserExistsDiscord(req, res, () => { + if (req.userExists) { + return res.redirect('/dpanel/dashboard'); + } else { + createUser(req.user, (createErr) => { + if (createErr) { + return next(createErr); + } + return res.redirect('/dpanel/dashboard'); + }); + } + }); + }); + })(req, res, next); +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/Auth/Login.js b/routes/Auth/Login.js new file mode 100644 index 0000000..db29193 --- /dev/null +++ b/routes/Auth/Login.js @@ -0,0 +1,14 @@ +const express = require('express'); +const router = express.Router(); +const fs = require('fs'); +const path = require('path'); + +router.get('/', function(req, res) { + const setupFilePath = path.join('data', 'setup.json'); + const setupData = JSON.parse(fs.readFileSync(setupFilePath, 'utf-8')); + const showActiveDirectoryForm = setupData[0].ldap && setupData[0].ldap.enabled === 'on'; + + res.render('AuthLogin', { setupData, isAuthenticated: false, errorMessage: '', showActiveDirectoryForm, currentUrl: req.originalUrl }); +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/Auth/Logout.js b/routes/Auth/Logout.js new file mode 100644 index 0000000..344e7f0 --- /dev/null +++ b/routes/Auth/Logout.js @@ -0,0 +1,17 @@ +const express = require('express'); +const router = express.Router(); +const fs = require('fs'); +const path = require('path'); + +router.get('/', (req, res) => { + req.logout(function(err) { + if (err) { + return next(err); + } + res.redirect('/auth/login'); + }); + }); + + var opts = { failWithError: true } + +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/API/DeleteFile.js b/routes/Dpanel/API/DeleteFile.js new file mode 100644 index 0000000..be7d7b1 --- /dev/null +++ b/routes/Dpanel/API/DeleteFile.js @@ -0,0 +1,89 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp').ncp; +const configFile = fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8') +const config = JSON.parse(configFile); +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware'); +const { logger, logRequestInfo, ErrorLogger, authLogger } = require('../../../config/logs'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +router.get('/', (req, res) => { + res.status(400).json({ error: 'Bad Request. The request cannot be fulfilled due to bad syntax or missing parameters.' }); +}); + +router.post('/', authMiddleware, (req, res) => { + const userId = req.userData.name; + const { filename } = req.body; + + if (!userId || !filename) { + return res.status(400).json({ message: 'Identifiant d\'utilisateur ou nom de fichier manquant pour la suppression du fichier.' }); + } + + const userFolderPath = path.join('cdn-files', userId); + + function findAndDeleteFile(folderPath) { + const filesInFolder = fs.readdirSync(folderPath); + + for (const file of filesInFolder) { + const filePath = path.join(folderPath, file); + + if (!filePath.startsWith(userFolderPath)) { + console.error('Unauthorized directory access attempt'); + return false; + } + + if (fs.statSync(filePath).isDirectory()) { + findAndDeleteFile(filePath); + } else if (file === filename) { + try { + fs.unlinkSync(filePath); + console.log('File deleted:', filePath); + return true; + } catch (error) { + console.error('Error deleting file:', error); + return false; + } + } + } + + return false; + } + + const fileDeleted = findAndDeleteFile(userFolderPath); + + if (fileDeleted) { + res.status(200).json({ status: 'success', message: 'Le fichier a été supprimé avec succès.' }); + } else { + res.status(404).json({ status: 'error', message: 'Le fichier que vous essayez de supprimer n\'existe pas.' }); + } +}); + +const ncpAsync = (source, destination) => { + const userFolderPath = path.join('cdn-files', userId); + if (!source.startsWith(userFolderPath) || !destination.startsWith(userFolderPath)) { + throw new Error('Unauthorized directory access attempt'); + } + + return new Promise((resolve, reject) => { + ncp(source, destination, (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); +}; + +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/API/DeleteFileFolder.js b/routes/Dpanel/API/DeleteFileFolder.js new file mode 100644 index 0000000..4195c3d --- /dev/null +++ b/routes/Dpanel/API/DeleteFileFolder.js @@ -0,0 +1,45 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp').ncp; +const configFile = fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8') +const config = JSON.parse(configFile); +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware'); +const { logger, logRequestInfo, ErrorLogger, authLogger } = require('../../../config/logs'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +router.get('/', (req, res) => { + res.status(400).json({ error: 'Bad Request. The request cannot be fulfilled due to bad syntax or missing parameters.' }); +}); + +router.post('/:folderName', authMiddleware, (req, res) => { + const userId = req.userData.name; + const { filename } = req.body; + + const userFolderPath = path.join('cdn-files', userId || ''); +const filePath = path.join(userFolderPath, req.params.folderName, filename || ''); + + if (!fs.existsSync(filePath)) { + return res.status(404).json({ error: 'Le fichier spécifié n\'existe pas.' }); + } + + fs.unlink(filePath, (err) => { + if (err) { + console.error(err); + return res.status(500).json({ error: 'Erreur lors de la suppression du fichier.' }); + } + res.json({ deleted: true, success: 'Fichier supprimé avec succès.' }); + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/API/DeleteFolfder.js b/routes/Dpanel/API/DeleteFolfder.js new file mode 100644 index 0000000..9dcfcd2 --- /dev/null +++ b/routes/Dpanel/API/DeleteFolfder.js @@ -0,0 +1,48 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp').ncp; +const configFile = fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8') +const config = JSON.parse(configFile); +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware'); +const { logger, logRequestInfo, ErrorLogger, authLogger } = require('../../../config/logs'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +router.get('/', (req, res) => { + res.status(400).json({ error: 'Bad Request. The request cannot be fulfilled due to bad syntax or missing parameters.' }); +}); + +router.delete('/:folderName', authMiddleware, (req, res) => { + const userId = req.userData.name; + const folderName = req.params.folderName; + const userFolderPath = path.join('cdn-files', userId); + const folderPath = path.join(userFolderPath, folderName); + + if (!fs.existsSync(folderPath)) { + return res.status(404).json({ error: 'Le dossier spécifié n\'existe pas.' }); + } + + if (!folderPath.startsWith(userFolderPath)) { + return res.status(403).json({ error: 'Vous n\'avez pas la permission de supprimer ce dossier.' }); + } + + fs.rmdir(folderPath, { recursive: true }, (err) => { + if (err) { + console.error(err); + return res.status(500).json({ error: 'Erreur lors de la suppression du dossier.' }); + } + res.json({ deleted: true, success: 'Dossier supprimé avec succès.' }); + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/API/MoveFile.js b/routes/Dpanel/API/MoveFile.js new file mode 100644 index 0000000..eaa4f3b --- /dev/null +++ b/routes/Dpanel/API/MoveFile.js @@ -0,0 +1,119 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp'); +const util = require('util'); +const ncpAsync = util.promisify(ncp.ncp); +const configFile = fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8') +const config = JSON.parse(configFile); +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware'); +const { logger, logRequestInfo, ErrorLogger, authLogger } = require('../../../config/logs'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +router.get('/', (req, res) => { + res.status(400).json({ error: 'Bad Request. The request cannot be fulfilled due to bad syntax or missing parameters.' }); +}); + +router.post('/', authMiddleware, async (req, res) => { + const fileName = req.body.fileName; + const folderName = req.body.folderName; + + const data = await fs.readFileSync(path.join(__dirname, '../../../data', 'user.json'), 'utf-8') + const users = JSON.parse(data); + const user = users.find(user => user.id === req.user.id); + + if (!user) { + console.error('User not found in user.json'); + return res.status(500).send('Erreur lors du déplacement du fichier.'); + } + + const userId = user.name; + + if (!fileName || !userId) { + console.error('fileName or userId is undefined'); + return res.status(500).send('Erreur lors du déplacement du fichier.'); + } + + const sourcePath = path.join('cdn-files', userId, fileName); + + let destinationDir; + if (folderName && folderName.trim() !== '') { + destinationDir = path.join('cdn-files', userId, folderName); + } else { + destinationDir = path.join('cdn-files', userId); + } + + const destinationPath = path.join(destinationDir, fileName); + + try { + const normalizedSourcePath = path.normalize(sourcePath); + console.log('Full Source Path:', normalizedSourcePath); + + if (fs.existsSync(normalizedSourcePath)) { + await fs.promises.access(destinationDir); + + await ncpAsync(normalizedSourcePath, destinationPath); + + await fs.promises.unlink(normalizedSourcePath); + } else { + console.log('File does not exist'); + } + + res.redirect('/dpanel/dashboard'); + } catch (err) { + console.error(err); + return res.status(500).send('Erreur lors du déplacement du fichier.'); + } +}); + +router.post('/:folderName', authMiddleware, async (req, res) => { + const fileName = req.body.fileName; + const newFolderName = req.body.folderName; + const oldFolderName = req.params.folderName; + const userId = req.user && req.user._json ? req.userData.name : undefined; + + if (!fileName || !userId || !oldFolderName || !newFolderName) { + console.error('fileName, userId, oldFolderName, or newFolderName is undefined'); + return res.status(500).send('Erreur lors du déplacement du fichier.'); + } + + const userDir = path.join(process.cwd(), 'cdn-files', userId); + const sourcePath = path.join(userDir, oldFolderName, fileName); + const destinationDir = path.join(userDir, newFolderName); + const destinationPath = path.join(destinationDir, fileName); + + if (!sourcePath.startsWith(userDir) || !destinationPath.startsWith(userDir)) { + ErrorLogger.error('Unauthorized directory access attempt'); + return res.status(403).send('Unauthorized directory access attempt'); + } + + try { + const normalizedSourcePath = path.normalize(sourcePath); + console.log('Full Source Path:', normalizedSourcePath); + + if (fs.existsSync(normalizedSourcePath)) { + await fs.promises.access(destinationDir, fs.constants.W_OK); + + await fs.promises.rename(normalizedSourcePath, destinationPath); + } else { + console.log('File does not exist'); + } + + res.redirect('/dpanel/dashboard'); + } catch (err) { + console.error(err); + return res.status(500).send('Erreur lors du déplacement du fichier.'); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/API/NewFolder.js b/routes/Dpanel/API/NewFolder.js new file mode 100644 index 0000000..17cbcab --- /dev/null +++ b/routes/Dpanel/API/NewFolder.js @@ -0,0 +1,66 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp').ncp; +const configFile = fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8') +const config = JSON.parse(configFile); +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware'); +const { logger, logRequestInfo, ErrorLogger, authLogger } = require('../../../config/logs'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +router.get('/', (req, res) => { + res.status(400).json({ error: 'Bad Request. The request cannot be fulfilled due to bad syntax or missing parameters.' }); +}); + +router.post('/', authMiddleware, (req, res) => { + try { + logger.info('Received POST request to create a new folder.'); + + const userId = req.userData.name; + let { folderName } = req.body; + + logger.info('Received folderName:', folderName); + + if (!folderName || typeof folderName !== 'string') { + ErrorLogger.error('Invalid folderName:', folderName); + return res.status(400).json({ message: 'Le nom du dossier ne peut pas être vide.' }); + } + + folderName = path.basename(folderName.trim()); + + if (!folderName) { + return res.status(400).json({ message: 'Le nom du dossier ne peut pas être vide.' }); + } + + const folderPath = path.join('cdn-files', userId, folderName); + + if (fs.existsSync(folderPath)) { + logger.info('Folder already exists:', folderPath); + return res.status(400).json({ message: 'Le dossier existe déjà.' }); + } + + fs.mkdir(folderPath, (err) => { + if (err) { + ErrorLogger.error(err); + return res.status(500).json({ message: 'Erreur lors de la création du dossier.', error: err }); + } + logger.info('Folder created successfully:', folderPath); + res.status(200).json({ message: 'Dossier créé avec succès.' }); + }); + } catch (error) { + ErrorLogger.error('Error creating folder:', error); + return res.status(500).json({ message: 'Erreur lors de la création du dossier.', error: error }); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/API/RenameFile.js b/routes/Dpanel/API/RenameFile.js new file mode 100644 index 0000000..04bb4fd --- /dev/null +++ b/routes/Dpanel/API/RenameFile.js @@ -0,0 +1,106 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp').ncp; +const configFile = fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8') +const config = JSON.parse(configFile); +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware'); +const { logger, logRequestInfo, ErrorLogger, authLogger } = require('../../../config/logs'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +router.get('/', (req, res) => { + res.status(400).json({ error: 'Bad Request. The request cannot be fulfilled due to bad syntax or missing parameters.' }); +}); + +router.post('/', authMiddleware, async (req, res) => { + const userId = req.userData.name; + const { currentName, newName } = req.body; + + if (!currentName || !newName) { + return res.status(400).send('Both currentName and newName must be provided.'); + } + + const currentPath = path.join('cdn-files', userId || '', currentName); + const newPath = path.join('cdn-files', userId, newName); + + try { + await fs.promises.rename(currentPath, newPath); + + const data = await fs.promises.readFile(path.join(__dirname, '../../../data', 'file_info.json'), 'utf-8') + let fileInfo = JSON.parse(data); + + let found = false; + for (let i = 0; i < fileInfo.length; i++) { + if (fileInfo[i].fileName === currentName) { + fileInfo[i].fileName = newName; + found = true; + break; + } + } + + if (found) { + await fs.promises.writeFile(path.join(__dirname, '../../../data', 'file_info.json'), JSON.stringify(fileInfo, null, 2), 'utf8'); + } + + res.status(200).send('L\'opération a été effectuée avec succès.'); + } catch (err) { + console.error(err); + return res.status(500).send('Erreur lors du changement de nom du fichier.'); + } +}); + +router.post('/:filePath*', authMiddleware, async (req, res) => { + const userId = req.userData.name; + const { currentName, newName } = req.body; + const filePath = path.join(req.params.filePath, req.params[0] || ''); + + if (!currentName || !newName) { + return res.status(400).send('Both currentName and newName must be provided.'); + } + + const userDir = path.join('cdn-files', userId); + const currentPath = path.join(userDir, filePath, currentName); + const newPath = path.join(userDir, filePath, newName); + + if (!currentPath.startsWith(userDir) || !newPath.startsWith(userDir)) { + ErrorLogger.error('Unauthorized directory access attempt'); + return res.status(403).send('Unauthorized directory access attempt'); + } + + try { + await fs.promises.rename(currentPath, newPath); + + const data = await fs.promises.readFile(path.join(__dirname, '../../../data', 'file_info.json'), 'utf8'); + let fileInfo = JSON.parse(data); + + let found = false; + for (let i = 0; i < fileInfo.length; i++) { + if (fileInfo[i].fileName === currentName) { + fileInfo[i].fileName = newName; + found = true; + break; + } + } + + if (found) { + await fs.promises.writeFile(path.join(__dirname, '../../../data', 'file_info.json'), JSON.stringify(fileInfo, null, 2), 'utf8'); + } + + res.status(200).send('L\'opération a été effectuée avec succès.'); + } catch (err) { + console.error(err); + return res.status(500).send('Erreur lors du changement de nom du fichier.'); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/API/Update-Setup-Admin.js b/routes/Dpanel/API/Update-Setup-Admin.js new file mode 100644 index 0000000..53a1aab --- /dev/null +++ b/routes/Dpanel/API/Update-Setup-Admin.js @@ -0,0 +1,62 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp'); +const util = require('util'); +const ncpAsync = util.promisify(ncp.ncp); +const configFile = fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8') +const config = JSON.parse(configFile); +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const osUtils = require('os-utils'); +const Convert = require('ansi-to-html'); +const convert = new Convert() +const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware'); +const { logger, logRequestInfo, ErrorLogger, authLogger } = require('../../../config/logs'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +const User = require('../../../data/user.json'); +const setup = JSON.parse(fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8')); + +router.get('/', (req, res) => { + res.status(400).json({ error: 'Bad Request. The request cannot be fulfilled due to bad syntax or missing parameters.' }); +}); + + +router.post('/', authMiddleware, async (req, res) => { + try { + let setup = JSON.parse(fs.readFileSync(path.join(__dirname, '../data', 'setup.json'), 'utf-8')); + + if (!req.body.ldap || !req.body.ldap.enabled) { + delete setup.ldap; + } else { + setup.ldap = req.body.ldap; + } + + if (!req.body.discord || !req.body.discord.enabled) { + delete setup.discord; + } else { + setup.discord = req.body.discord; + } + + setup.domain = req.body.domain; + setup.uptime = req.body.uptime; + + fs.writeFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8'), JSON.stringify(setup, null, 2); + + res.redirect('/dpanel/dashboard/admin'); + } catch (err) { + console.error(err); + res.status(500).send('Server Error'); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/API/Upload-Role-Admin.js b/routes/Dpanel/API/Upload-Role-Admin.js new file mode 100644 index 0000000..21d42d7 --- /dev/null +++ b/routes/Dpanel/API/Upload-Role-Admin.js @@ -0,0 +1,52 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp'); +const util = require('util'); +const ncpAsync = util.promisify(ncp.ncp); +const configFile = fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8') +const config = JSON.parse(configFile); +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const osUtils = require('os-utils'); +const Convert = require('ansi-to-html'); +const convert = new Convert() +const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware'); +const { logger, logRequestInfo, ErrorLogger, authLogger } = require('../../../config/logs'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +const User = require('../../../data/user.json'); +const setup = JSON.parse(fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8')); + +router.get('/', (req, res) => { + res.status(400).json({ error: 'Bad Request. The request cannot be fulfilled due to bad syntax or missing parameters.' }); +}); + +router.post('/', authMiddleware, async (req, res) => { + try { + const { id, role } = req.body; + + const user = User.find(user => user.id === id); + + if (user) { + user.role = role; + } + + fs.writeFileSync(path.join(__dirname, '../../../data/user.json'), JSON.stringify(User, null, 2)); + + res.redirect('/dpanel/dashboard/admin'); + } catch (err) { + console.error(err); + res.status(500).send('Server Error'); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/API/Upload.js b/routes/Dpanel/API/Upload.js new file mode 100644 index 0000000..2eb9d34 --- /dev/null +++ b/routes/Dpanel/API/Upload.js @@ -0,0 +1,95 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp'); +const util = require('util'); +const ncpAsync = util.promisify(ncp.ncp); +const configFile = fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8') +const config = JSON.parse(configFile); +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware'); +const { logger, logRequestInfo, ErrorLogger, authLogger } = require('../../../config/logs'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +router.get('/', (req, res) => { + res.status(400).json({ error: 'Bad Request. The request cannot be fulfilled due to bad syntax or missing parameters.' }); +}); + +router.use(fileUpload({ + limits: { fileSize: 15 * 1024 * 1024 * 1024 }, +})); + +router.post('/', authMiddleware, async (req, res) => { + try { + if (!req.files || Object.keys(req.files).length === 0) { + return res.status(400).send('5410 - Erreur de téléchargement, veuillez retenter ultérieurement.'); + } + + const file = req.files.file; + const userId = req.userData.name; + const Id = req.userData.id; + const uploadDir = path.join('cdn-files', userId); + const originalFileName = file.name; + const domain = config.domain || 'mydomain.com'; + let expiryDate = req.body.expiryDate; + let password = req.body.password; + + if (!fs.existsSync(uploadDir)) { + fs.mkdirSync(uploadDir, { recursive: true }); + } + + file.mv(path.join(uploadDir, originalFileName), async (err) => { + if (err) { + console.error(err); + return res.status(500).send({ message: 'Erreur lors du téléchargement du fichier.' }); + } + + const fileExtension = path.extname(originalFileName).toLowerCase(); + + const bcrypt = require('bcrypt'); + const saltRounds = 10; + + let hashedPassword = ''; + if (password) { + hashedPassword = bcrypt.hashSync(password, saltRounds); + } + + const fileInfo = { + fileName: originalFileName, + expiryDate: expiryDate || '', + password: hashedPassword, + Id: Id, + path: path.join(uploadDir, originalFileName) + }; + + if (expiryDate || password) { + let data = []; + if (fs.existsSync(path.join(__dirname, '../../../data', 'file_info.json'))) { + const existingData = await fs.promises.readFile(path.join(__dirname, '../../../data', 'file_info.json'), 'utf8'); + data = JSON.parse(existingData); + if (!Array.isArray(data)) { + data = []; + } + } + data.push(fileInfo); + await fs.promises.writeFile(path.join(__dirname, '../../../data', 'file_info.json'), JSON.stringify(data, null, 2)); + } + + res.redirect('/dpanel/dashboard'); + }); + } catch (error) { + console.error(error); + return res.status(500).send({ message: 'Erreur lors du téléchargement du fichier.' }); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/Admin/Privacy-Security.js b/routes/Dpanel/Admin/Privacy-Security.js new file mode 100644 index 0000000..ef00d7f --- /dev/null +++ b/routes/Dpanel/Admin/Privacy-Security.js @@ -0,0 +1,61 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp'); +const util = require('util'); +const ncpAsync = util.promisify(ncp.ncp); +const configFile = fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8') +const config = JSON.parse(configFile); +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const osUtils = require('os-utils'); +const Convert = require('ansi-to-html'); +const convert = new Convert() +const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware'); +const { logger, logRequestInfo, ErrorLogger, authLogger } = require('../../../config/logs'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +const User = require('../../../data/user.json'); +const setup = JSON.parse(fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8')); + +router.get('/', authMiddleware, async (req, res) => { + try { + const data = fs.readFileSync(path.join(__dirname, '../../../data', 'user.json'), 'utf8'); + const users = JSON.parse(data); + + const user = users.find(user => user.name === req.user.name); + + if (!user || user.role !== 'admin') { + console.log('Access denied'); + return res.status(403).json({ message: "You do not have the necessary rights to access this resource." }); + } + + const files = await fs.promises.readdir('./report'); + const reports = files.filter(file => file.endsWith('.json')).map(file => { + return fs.promises.readFile(path.join('./report', file), 'utf8') + .then(content => { + return { name: file, content: content }; + }) + .catch(err => { + console.error(err); + }); + }); + + Promise.all([Promise.all(reports)]).then(([completedReports]) => { + res.render('paramAdminPrivacy&Security', { users: User, reports: completedReports }); + }); + } catch (err) { + console.error(err); + res.status(500).send('Server Error'); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/Admin/SettingSetup.js b/routes/Dpanel/Admin/SettingSetup.js new file mode 100644 index 0000000..c664b03 --- /dev/null +++ b/routes/Dpanel/Admin/SettingSetup.js @@ -0,0 +1,44 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp'); +const util = require('util'); +const ncpAsync = util.promisify(ncp.ncp); +const configFile = fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8') +const config = JSON.parse(configFile); +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware'); +const { logger, logRequestInfo, ErrorLogger, authLogger } = require('../../../config/logs'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +const User = require('../../../data/user.json'); +const setup = JSON.parse(fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8')); + +router.get('/', authMiddleware, async (req, res) => { + try { + const data = fs.readFileSync(path.join(__dirname, '../../../data', 'user.json'), 'utf8'); + const users = JSON.parse(data); + + const user = users.find(user => user.name === req.user.name); + + if (!user || user.role !== 'admin') { + console.log('Access denied'); + return res.status(403).json({ message: "You do not have the necessary rights to access this resource." }); + } + + res.render('paramAdminSettingSetup', { users: User, setup: setup }); + } catch (err) { + console.error(err); + res.status(500).send('Server Error'); + } +}); +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/Admin/Stats-Logs.js b/routes/Dpanel/Admin/Stats-Logs.js new file mode 100644 index 0000000..b233d35 --- /dev/null +++ b/routes/Dpanel/Admin/Stats-Logs.js @@ -0,0 +1,74 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp'); +const util = require('util'); +const ncpAsync = util.promisify(ncp.ncp); +const configFile = fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8') +const config = JSON.parse(configFile); +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const osUtils = require('os-utils'); +const Convert = require('ansi-to-html'); +const convert = new Convert() +const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware'); +const { logger, logRequestInfo, ErrorLogger, authLogger } = require('../../../config/logs'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +const User = require('../../../data/user.json'); +const setup = JSON.parse(fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8')); + +router.get('/', authMiddleware, async (req, res) => { + try { + const data = fs.readFileSync(path.join(__dirname, '../../../data', 'user.json'), 'utf8'); + const users = JSON.parse(data); + + const user = users.find(user => user.name === req.user.name); + + if (!user || user.role !== 'admin') { + console.log('Access denied'); + return res.status(403).json({ message: "You do not have the necessary rights to access this resource." }); + } + + const uptime = os.uptime(); + const memoryUsage = process.memoryUsage().heapUsed / 1024 / 1024; + + osUtils.cpuUsage(function(cpuUsage) { + fs.readdir('./logs', (err, files) => { + if (err) { + console.error(err); + res.status(500).send('Error reading logs'); + return; + } + + const logs = files.map(file => { + return fs.promises.readFile(path.join('./logs', file), 'utf8') + .then(content => { + content = convert.toHtml(content); + return { name: file, content: content }; + }) + .catch(err => { + console.error(err); + }); + }); + + Promise.all(logs).then(completed => { + res.render('paramAdminStats&Logs', { users: User, setup: setup, uptime, memoryUsage, cpuUsage, logs: completed }); + }); + }); + }); + } catch (err) { + console.error(err); + res.status(500).send('Server Error'); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/Admin/User.js b/routes/Dpanel/Admin/User.js new file mode 100644 index 0000000..024133d --- /dev/null +++ b/routes/Dpanel/Admin/User.js @@ -0,0 +1,55 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp'); +const util = require('util'); +const ncpAsync = util.promisify(ncp.ncp); +const configFile = fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8') +const config = JSON.parse(configFile); +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware'); +const { logger, logRequestInfo, ErrorLogger, authLogger } = require('../../../config/logs'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +const User = require('../../../data/user.json'); +const setup = JSON.parse(fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8')); + +router.get('/', authMiddleware, async (req, res) => { + try { + const data = fs.readFileSync(path.join(__dirname, '../../../data', 'user.json'), 'utf8'); + const users = JSON.parse(data); + + const user = users.find(user => user.name === req.user.name); + + if (!user || user.role !== 'admin') { + console.log('Access denied'); + return res.status(403).json({ message: "You do not have the necessary rights to access this resource." }); + } + + let currentPage = Number(req.query.page) || 1; + let limit = Number(req.query.limit) || 10; + + let totalUsers = users.length; + let pages = Math.ceil(totalUsers / limit); + + let start = (currentPage - 1) * limit; + let end = start + limit; + let usersForPage = users.slice(start, end); + + res.render('paramAdminUser', { users: usersForPage, setup: setup, pages: pages, currentPage: currentPage, limit: limit }); + } catch (err) { + console.error(err); + res.status(500).send('Server Error'); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/Admin/index.js b/routes/Dpanel/Admin/index.js new file mode 100644 index 0000000..5d5b0de --- /dev/null +++ b/routes/Dpanel/Admin/index.js @@ -0,0 +1,46 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp'); +const util = require('util'); +const ncpAsync = util.promisify(ncp.ncp); +const configFile = fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8') +const config = JSON.parse(configFile); +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware'); +const { logger, logRequestInfo, ErrorLogger, authLogger } = require('../../../config/logs'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +const User = require('../../../data/user.json'); +const setup = JSON.parse(fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8')); + +router.get('/', authMiddleware, async (req, res) => { + try { + const data = fs.readFileSync(path.join(__dirname, '../../../data', 'user.json'), 'utf8'); + const users = JSON.parse(data); + + + const user = users.find(user => user.name === req.user.name); + + if (!user || user.role !== 'admin') { + console.log('Access denied'); + return res.status(403).json({ message: "You do not have the necessary rights to access this resource." }); + } + + res.render('paramAdmin', { users: User, setup: setup }); + } catch (err) { + console.error(err); + res.status(500).send('Server Error'); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/Dashboard/index.js b/routes/Dpanel/Dashboard/index.js new file mode 100644 index 0000000..fb432db --- /dev/null +++ b/routes/Dpanel/Dashboard/index.js @@ -0,0 +1,93 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp').ncp; +let configFile = fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8') +let config = JSON.parse(configFile)[0]; +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +router.get('/', authMiddleware, async (req, res) => { + const folderName = req.params.folderName || ''; + + if (!req.userData || !req.userData.name) { + return res.render('error-recovery-file', { error: 'User data is undefined or incomplete' }); + } + + const userId = req.userData.id; + const userName = req.userData.name; + const downloadDir = path.join('cdn-files', userName); + const domain = config.domain || 'swiftlogic-labs.com'; + + if (!config.domain) { + console.error('Domain is not defined in setup.json'); + config.domain = 'swiftlogic-labs.com'; + } + + if (!fs.existsSync(downloadDir)) { + fs.mkdirSync(downloadDir, { recursive: true }); + } + + try { + fs.accessSync(downloadDir, fs.constants.R_OK | fs.constants.W_OK); + } catch (err) { + console.error('No access!', err); + return res.render('error-recovery-file', { error: 'No access to directory' }); + } + + let fileInfoNames = []; + try { + const fileInfo = JSON.parse(fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8')) + + if (!Array.isArray(fileInfo)) { + console.error('fileInfo is not an array. Check the contents of file_info.json'); + } else { + fileInfoNames = fileInfo.map(file => file.fileName); + } + } catch (err) { + console.error('Error reading file_info.json:', err); + } + + try { + const files = await fs.promises.readdir(downloadDir); + + const folders = files.filter(file => fs.statSync(path.join(downloadDir, file)).isDirectory()); + + const fileDetails = files.map(file => { + const filePath = path.join(downloadDir, file); + const stats = fs.statSync(filePath); + const fileExtension = path.extname(file).toLowerCase(); + const encodedFileName = encodeURIComponent(file); + const fileLink = `https://${domain}/attachments/${userId}/${encodedFileName}`; + + const fileType = stats.isDirectory() ? 'folder' : 'file'; + + return { + name: file, + size: stats.size, + url: fileLink, + extension: fileExtension, + type: fileType + }; + }); + + const availableExtensions = Array.from(new Set(fileDetails.map(file => file.extension))); + + res.render('dashboard', { files: fileDetails, folders, extensions: availableExtensions, allFolders: folders, folderName: folderName, fileInfoNames: fileInfoNames }); + } catch (err) { + console.error('Error reading directory:', err); + return res.render('error-recovery-file', { error: err.message }); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/Folder/index.js b/routes/Dpanel/Folder/index.js new file mode 100644 index 0000000..b74ce92 --- /dev/null +++ b/routes/Dpanel/Folder/index.js @@ -0,0 +1,127 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp').ncp; +const configFile = fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8') +const config = JSON.parse(configFile)[0]; +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +router.get('/:folderName', authMiddleware, async (req, res) => { + const userId = req.userData.name; + const folderName = req.params.folderName || ''; + const folderPath = path.join('cdn-files', userId, folderName); + const userFolderPath = path.join('cdn-files', userId); + const domain = config.domain || 'swiftlogic-labs.com'; + const currentFolderName = folderName || ''; + + const data = await fs.readFileSync(path.join(__dirname, '../../../data', 'user.json'), 'utf-8') + let users; + try { + users = JSON.parse(data); + } catch (error) { + console.error('Error parsing user.json:', error); + users = []; + } + + if (!Array.isArray(users)) { + console.error('Error: users is not an array. Check the contents of setup.json'); + users = []; + } + + const user = users.find(user => user.name === userId); + + if (!user) { + console.error(`User with ID ${userId} not found in user.json`); + return res.status(500).send(`User with ID ${userId} not found in user.json`); + } + + const userRealId = user.id; + + const fileInfoData = await fs.readFileSync(path.join(__dirname, '../../../data', 'file_info.json'), 'utf-8') + let fileInfo; + try { + fileInfo = JSON.parse(fileInfoData); + } catch (error) { + console.error('Error parsing file_info.json:', error); + fileInfo = []; + } + + if (!Array.isArray(fileInfo)) { + console.error('Error: fileInfo is not an array. Check the contents of file_info.json'); + fileInfo = []; + } + + const fileInfoNames = fileInfo.map(file => file.fileName); + + fs.readdir(folderPath, { withFileTypes: true }, (err, entries) => { + if (err) { + console.error('Error reading directory:', err); + return res.render('error-recovery-file'); + } + + const folders = entries + .filter(entry => entry.isDirectory()) + .map(entry => entry.name); + + fs.readdir(userFolderPath, { withFileTypes: true }, (err, allEntries) => { + if (err) { + console.error('Error reading user directory:', err); + return res.render('error-recovery-file'); + } + + const allFolders = allEntries + .filter(entry => entry.isDirectory()) + .map(entry => entry.name); + + const fileDetailsPromises = entries.map(entry => { + const filePath = path.join(folderPath, entry.name); + + return new Promise((resolve, reject) => { + fs.stat(filePath, (err, stats) => { + if (err) { + console.error('Error getting file stats:', err); + return reject(err); + } + + const encodedFileName = encodeURIComponent(entry.name); + const fileLink = `https://${domain}/attachments/${userRealId}/${encodedFileName}`; + + const fileType = entry.isDirectory() ? 'folder' : 'file'; + + resolve({ + name: entry.name, + size: stats.size, + url: fileLink, + extension: path.extname(entry.name).toLowerCase(), + type: fileType + }); + }); + }); + }); + + Promise.all(fileDetailsPromises) + .then(fileDetails => { + const availableExtensions = Array.from(new Set(fileDetails.map(file => file.extension))); + + res.render('folder', { files: fileDetails, folders, allFolders, extensions: availableExtensions, currentFolder: currentFolderName, folderName: folderName, fileInfoNames }); + }) + .catch(error => { + console.error('Error processing file details:', error); + res.status(500).send('Erreur lors du traitement des détails des fichiers.'); + }); + }); + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/Dpanel/Upload.js b/routes/Dpanel/Upload.js new file mode 100644 index 0000000..e99ab22 --- /dev/null +++ b/routes/Dpanel/Upload.js @@ -0,0 +1,27 @@ +const express = require('express'); +const fs = require('fs'); +const path = require('path'); +const router = express.Router(); +const fileUpload = require('express-fileupload'); +const authMiddleware = require('../../Middlewares/authMiddleware'); +const { loggers } = require('winston'); +const ncp = require('ncp'); +const util = require('util'); +const ncpAsync = util.promisify(ncp.ncp); +const configFile = fs.readFileSync(path.join(__dirname, '../../data', 'setup.json'), 'utf-8') +const config = JSON.parse(configFile); +const bodyParser = require('body-parser'); +const crypto = require('crypto'); +const os = require('os'); +const { getUserData, getSetupData } = require('../../Middlewares/watcherMiddleware'); +const { logger, logRequestInfo, ErrorLogger, authLogger } = require('../../config/logs'); + +let setupData = getSetupData(); +let userData = getUserData(); +router.use(bodyParser.json()); + +router.get('/', authMiddleware, (req, res) => { + res.render('upload'); +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/attachments.js b/routes/attachments.js index b4aa1d0..513b742 100644 --- a/routes/attachments.js +++ b/routes/attachments.js @@ -4,12 +4,13 @@ const path = require('path'); const fs = require('fs').promises; const mime = require('mime-types'); const { logger, ErrorLogger } = require('../config/logs'); -const crypto = require('crypto'); +const bcrypt = require('bcrypt'); +const saltRounds = 10; const baseDir = 'cdn-files'; async function getSamAccountNameFromUserId(userId) { - const data = await fs.readFile(path.join(__dirname, '../user.json'), 'utf8'); + const data = await fs.readFile(path.join(__dirname, '../data', 'user.json'), 'utf8'); const users = JSON.parse(data); const user = users.find(user => user.id === userId); if (user) { @@ -48,7 +49,6 @@ router.get('/:userId', (req, res) => { res.render('unauthorized'); }); - router.get('/:userId/:filename', async (req, res) => { const { userId, filename } = req.params; @@ -59,8 +59,18 @@ router.get('/:userId/:filename', async (req, res) => { return res.render('file-not-found'); } - const data = await fs.readFile('file_info.json', 'utf8'); - const fileInfoArray = JSON.parse(data); + const data = await fs.readFile(path.join(__dirname, '../data', 'file_info.json'), 'utf8'); + let fileInfoArray; + try { + fileInfoArray = JSON.parse(data); + } catch (error) { + console.error('Error parsing file_info.json:', error); + } + + if (!Array.isArray(fileInfoArray)) { + console.error('fileInfoArray is not an array'); + fileInfoArray = []; + } const fileInfo = fileInfoArray.find(info => info.fileName === filename && info.Id === userId); @@ -113,8 +123,18 @@ router.post('/:userId/:filename', async (req, res) => { const enteredPassword = req.body.password; try { - const data = await fs.readFile('file_info.json', 'utf8'); - const fileInfoArray = JSON.parse(data); + const data = await fs.readFile(path.join(__dirname, '../data', 'file_info.json'), 'utf8'); + let fileInfoArray; + try { + fileInfoArray = JSON.parse(data); + } catch (error) { + console.error('Error parsing file_info.json:', error); + } + + if (!Array.isArray(fileInfoArray)) { + console.error('fileInfoArray is not an array'); + fileInfoArray = []; + } const fileInfo = fileInfoArray.find(info => info.fileName === filename && info.Id === userId); @@ -122,13 +142,7 @@ router.post('/:userId/:filename', async (req, res) => { return res.json({ success: false, message: 'File not found' }); } - const algorithm = 'aes-256-cbc'; - const key = crypto.scryptSync(enteredPassword, 'salt', 32); - const iv = Buffer.alloc(16, 0); - const cipher = crypto.createCipheriv(algorithm, key, iv); - const encryptedPassword = cipher.update('', 'utf8', 'hex') + cipher.final('hex'); - - if (fileInfo.password === encryptedPassword) { + if (bcrypt.compareSync(enteredPassword, fileInfo.password)) { req.session.passwordVerified = true; const filePath = await findFileInUserDir(userId, filename); const fileContent = await fs.readFile(filePath); @@ -153,8 +167,18 @@ router.post('/:userId/:filename', async (req, res) => { }); async function deleteExpiredFiles() { - let data = await fs.readFile('file_info.json', 'utf8'); - let fileInfoArray = JSON.parse(data); + let data = await fs.readFile(path.join(__dirname, '../data', 'file_info.json'), 'utf8'); + let fileInfoArray; + try { + fileInfoArray = JSON.parse(data); + } catch (error) { + console.error('Error parsing file_info.json:', error); + } + + if (!Array.isArray(fileInfoArray)) { + console.error('fileInfoArray is not an array'); + fileInfoArray = []; + } const now = new Date(); let newFileInfoArray = []; @@ -183,7 +207,7 @@ async function deleteExpiredFiles() { } try { - await fs.writeFile('file_info.json', JSON.stringify(newFileInfoArray, null, 2), 'utf8'); + await fs.writeFile(path.join(__dirname, '../data', 'file_info.json'), JSON.stringify(newFileInfoArray, null, 2), 'utf8'); } catch (err) { ErrorLogger.error('Error writing to file_info.json:', err); } diff --git a/routes/auth.js b/routes/auth.js deleted file mode 100644 index 456a98f..0000000 --- a/routes/auth.js +++ /dev/null @@ -1,128 +0,0 @@ -const express = require('express'); -const router = express.Router(); -const passport = require('passport'); -const fs = require('fs'); -const { checkUserExistsAD } = require('../Middlewares/UserIDMiddlewareAD'); -const { checkUserExistsDiscord } = require('../Middlewares/UserIDMiddlewareDiscord'); -const path = require('path'); -const { getUserData, getSetupData } = require('../Middlewares/watcherMiddleware'); - -let userData = getUserData(); -let setupData; -let adStrategy; - -getSetupData().then(data => { - setupData = data; - - if (setupData[0].ldap !== undefined) { - adStrategy = require('../models/Passport-ActiveDirectory'); - adStrategy.name = 'active-directory'; - passport.use(adStrategy); - } else { - console.log('LDAP data is not defined in setup data'); - } - - if (setupData[0].discord !== undefined) { - const DiscordStrategy = require('../models/Passport-Discord'); - } -}); - -let user = userData; -if (user.identifyURL) { - app.get("/auth/discord", (req, res) => { - res.redirect(user.identifyURL); - }); -} - -router.use(passport.initialize()); -router.use(passport.session()); - -router.get('/login', function(req, res) { - const setupFilePath = path.join('data', 'setup.json'); - const setupData = JSON.parse(fs.readFileSync(setupFilePath, 'utf-8')); - const showActiveDirectoryForm = setupData.ldap && setupData.ldap.enabled === 'on'; - res.render('AuthLogin', { setupData, isAuthenticated: false, errorMessage: '', showActiveDirectoryForm, currentUrl: req.originalUrl }); -}); - - -passport.deserializeUser((user, done) => { - done(null, user); -}); - -router.get('/logout', (req, res) => { - req.logout(function(err) { - if (err) { - return next(err); - } - res.redirect('/auth/login'); - }); -}); - -var opts = { failWithError: true } - -router.post('/activedirectory', (req, res, next) => { - passport.authenticate('ActiveDirectory', (err, user) => { - if (err) { - console.log('Authentication error:', err); // Debug log - return res.render('AuthLogin', { isAuthenticated: false, errorMessage: err.message, setupData: {}, showActiveDirectoryForm: true, currentUrl: req.originalUrl }); - } - if (!user) { - console.log('User not authorized'); // Debug log - return res.render('AuthLogin', { isAuthenticated: false, errorMessage: 'L\'utilisateur n\'est pas autorisé.', setupData: {}, showActiveDirectoryForm: true, currentUrl: req.originalUrl }); - } - req.user = { - ...user._json, - name: user._json.sAMAccountName, - id: user._json.sAMAccountName, - }; - console.log('User object:', req.user); // Debug log - req.logIn(req.user, function(err) { - if (err) { - console.log('Login error:', err); // Debug log - return next(err); - } - console.log('User logged in successfully'); // Debug log - - req.session.user = req.user; - - return next(); - }); - })(req, res, next); -}, checkUserExistsAD); - -router.get("/discord", (req, res) => { - res.redirect(setupData.discord.identifyURL); -}); - -router.get('/discord/callback', (req, res, next) => { - passport.authenticate('discord', (err, user, info) => { - if (err) { - return next(err); - } - - if (!user) { - return res.redirect('/auth/login'); - } - - req.logIn(user, (loginErr) => { - if (loginErr) { - return next(loginErr); - } - - checkUserExistsDiscord(req, res, () => { - if (req.userExists) { - return res.redirect('/dpanel/dashboard'); - } else { - createUser(req.user, (createErr) => { - if (createErr) { - return next(createErr); - } - return res.redirect('/dpanel/dashboard'); - }); - } - }); - }); - })(req, res, next); -}); - -module.exports = router; \ No newline at end of file diff --git a/routes/dpanel.js b/routes/dpanel.js deleted file mode 100644 index 796f1a5..0000000 --- a/routes/dpanel.js +++ /dev/null @@ -1,724 +0,0 @@ -const express = require('express'); -const fs = require('fs'); -const path = require('path'); -const router = express.Router(); -const fileUpload = require('express-fileupload'); -const authMiddleware = require('../Middlewares/authMiddleware'); -const { loggers } = require('winston'); -const ncp = require('ncp').ncp; -const configFile = fs.readFileSync(path.join(__dirname, '../data', 'setup.json'), 'utf-8') -const config = JSON.parse(configFile); -const bodyParser = require('body-parser'); -const crypto = require('crypto'); -const os = require('os'); -const { getUserData, getSetupData } = require('../Middlewares/watcherMiddleware'); - -let setupData = getSetupData(); -let userData = getUserData(); -router.use(bodyParser.json()); - -router.get('/dashboard', authMiddleware, async (req, res) => { - const folderName = req.params.folderName || ''; - - if (!req.userData || !req.userData.name) { - return res.render('error-recovery-file', { error: 'User data is undefined or incomplete' }); - } - - const userId = req.userData.id; - const userName = req.userData.name; - const downloadDir = path.join('cdn-files', userName); - const domain = config.domain || 'mydomain.com'; - - if (!fs.existsSync(downloadDir)) { - fs.mkdirSync(downloadDir, { recursive: true }); - } - - try { - fs.accessSync(downloadDir, fs.constants.R_OK | fs.constants.W_OK); - } catch (err) { - console.error('No access!', err); - return res.render('error-recovery-file', { error: 'No access to directory' }); - } - - let fileInfoNames = []; - try { - const fileInfo = JSON.parse(fs.readFileSync(path.join(__dirname, '../data', 'setup.json'), 'utf-8')) - fileInfoNames = fileInfo.map(file => file.fileName); - - fileInfo.map(/* ... */); - } catch (err) { - console.error('Error reading file_info.json:', err); - } - - try { - const files = await fs.promises.readdir(downloadDir); - - const folders = files.filter(file => fs.statSync(path.join(downloadDir, file)).isDirectory()); - - const fileDetails = files.map(file => { - const filePath = path.join(downloadDir, file); - const stats = fs.statSync(filePath); - const fileExtension = path.extname(file).toLowerCase(); - const encodedFileName = encodeURIComponent(file); - const fileLink = `https://${domain}/attachments/${userId}/${encodedFileName}`; - - const fileType = stats.isDirectory() ? 'folder' : 'file'; - - return { - name: file, - size: stats.size, - url: fileLink, - extension: fileExtension, - type: fileType - }; - }); - - const availableExtensions = Array.from(new Set(fileDetails.map(file => file.extension))); - - res.render('dashboard', { files: fileDetails, folders, extensions: availableExtensions, allFolders: folders, folderName: folderName, fileInfoNames: fileInfoNames }); - } catch (err) { - console.error('Error reading directory:', err); - return res.render('error-recovery-file', { error: err.message }); - } -}); - -router.get('/dashboard/folder/:folderName', authMiddleware, async (req, res) => { - const userId = req.userData.name; - const folderName = req.params.folderName || ''; - const folderPath = path.join('cdn-files', userId, folderName); - const userFolderPath = path.join('cdn-files', userId); - const domain = config.domain || 'mydomain.com'; - const currentFolderName = folderName || ''; - - const data = await fs.readFileSync(path.join(__dirname, '../data', 'setup.json'), 'utf-8') - let users; - try { - users = JSON.parse(data); - } catch (error) { - console.error('Error parsing setup.json:', error); - users = []; - } - - if (!Array.isArray(users)) { - console.error('Error: users is not an array. Check the contents of setup.json'); - users = []; - } - - const user = users.find(user => user.name === userId); - - if (!user) { - return res.status(500).send('User not found in user.json'); - } - - const userRealId = user.id; - - const fileInfoData = await fs.readFileSync(path.join(__dirname, '../data', 'file_info.json'), 'utf-8') - let fileInfo; - try { - fileInfo = JSON.parse(fileInfoData); - } catch (error) { - console.error('Error parsing file_info.json:', error); - fileInfo = []; - } - - // Check if fileInfo is an array - if (!Array.isArray(fileInfo)) { - console.error('Error: fileInfo is not an array. Check the contents of file_info.json'); - fileInfo = []; // Default to an empty array to prevent further errors - } - - const fileInfoNames = fileInfo.map(file => file.fileName); - - fs.readdir(folderPath, { withFileTypes: true }, (err, entries) => { - if (err) { - console.error('Error reading directory:', err); - return res.render('error-recovery-file'); - } - - const folders = entries - .filter(entry => entry.isDirectory()) - .map(entry => entry.name); - - fs.readdir(userFolderPath, { withFileTypes: true }, (err, allEntries) => { - if (err) { - console.error('Error reading user directory:', err); - return res.render('error-recovery-file'); - } - - const allFolders = allEntries - .filter(entry => entry.isDirectory()) - .map(entry => entry.name); - - const fileDetailsPromises = entries.map(entry => { - const filePath = path.join(folderPath, entry.name); - - return new Promise((resolve, reject) => { - fs.stat(filePath, (err, stats) => { - if (err) { - console.error('Error getting file stats:', err); - return reject(err); - } - - const encodedFileName = encodeURIComponent(entry.name); - const fileLink = `https://${domain}/attachments/${userRealId}/${encodedFileName}`; - - const fileType = entry.isDirectory() ? 'folder' : 'file'; - - resolve({ - name: entry.name, - size: stats.size, - url: fileLink, - extension: path.extname(entry.name).toLowerCase(), - type: fileType - }); - }); - }); - }); - - Promise.all(fileDetailsPromises) - .then(fileDetails => { - const availableExtensions = Array.from(new Set(fileDetails.map(file => file.extension))); - - res.render('folder', { files: fileDetails, folders, allFolders, extensions: availableExtensions, currentFolder: currentFolderName, folderName: folderName, fileInfoNames }); - }) - .catch(error => { - console.error('Error processing file details:', error); - res.status(500).send('Erreur lors du traitement des détails des fichiers.'); - }); - }); - }); -}); - -router.post('/dashboard/newfolder', authMiddleware, (req, res) => { - try { - console.log('Received POST request to create a new folder.'); - - const userId = req.userData.name; - let { folderName } = req.body; - - console.log('Received folderName:', folderName); - - if (!folderName || typeof folderName !== 'string') { - console.log('Invalid folderName:', folderName); - return res.status(400).json({ message: 'Le nom du dossier ne peut pas être vide.' }); - } - - folderName = folderName.trim(); - - if (!folderName) { - console.log('Trimmed folderName is empty.'); - return res.status(400).json({ message: 'Le nom du dossier ne peut pas être vide.' }); - } - - const folderPath = path.join('cdn-files', userId, folderName); - - if (fs.existsSync(folderPath)) { - console.log('Folder already exists:', folderPath); - return res.status(400).json({ message: 'Le dossier existe déjà.' }); - } - - fs.mkdir(folderPath, (err) => { - if (err) { - console.error(err); - return res.status(500).json({ message: 'Erreur lors de la création du dossier.', error: err }); - } - console.log('Folder created successfully:', folderPath); - res.status(200).json({ message: 'Dossier créé avec succès.' }); - }); - } catch (error) { - console.error('Error creating folder:', error); - return res.status(500).json({ message: 'Erreur lors de la création du dossier.', error: error }); - } -}); - -router.post('/dashboard/rename', authMiddleware, async (req, res) => { - const userId = req.userData.name; - const { currentName, newName } = req.body; - - if (!currentName || !newName) { - return res.status(400).send('Both currentName and newName must be provided.'); - } - - const currentPath = path.join('cdn-files', userId || '', currentName); - const newPath = path.join('cdn-files', userId, newName); - - try { - await fs.promises.rename(currentPath, newPath); - - const data = await fs.promise.readFileSync(path.join(__dirname, '../data', 'file_info.json'), 'utf-8') - let fileInfo = JSON.parse(data); - - let found = false; - for (let i = 0; i < fileInfo.length; i++) { - if (fileInfo[i].fileName === currentName) { - fileInfo[i].fileName = newName; - found = true; - break; - } - } - - if (found) { - await fs.promises.writeFile(path.join(__dirname, '../data', 'file_info.json'), JSON.stringify(fileInfo, null, 2), 'utf8'); - } - - res.status(200).send('L\'opération a été effectuée avec succès.'); - } catch (err) { - console.error(err); - return res.status(500).send('Erreur lors du changement de nom du fichier.'); - } -}); - -router.post('/dashboard/rename/:filePath*', authMiddleware, async (req, res) => { - const userId = req.userData.name; - const { currentName, newName } = req.body; - const filePath = path.join(req.params.filePath, req.params[0] || ''); - - if (!currentName || !newName) { - return res.status(400).send('Both currentName and newName must be provided.'); - } - - const currentPath = path.join('cdn-files', userId || '', filePath, currentName); - const newPath = path.join('cdn-files', userId, filePath, newName); - - try { - await fs.promises.rename(currentPath, newPath); - - const data = await fs.promises.readFile(path.join(__dirname, '../data', 'file_info.json'), 'utf8'); - let fileInfo = JSON.parse(data); - - let found = false; - for (let i = 0; i < fileInfo.length; i++) { - if (fileInfo[i].fileName === currentName) { - fileInfo[i].fileName = newName; - found = true; - break; - } - } - - if (found) { - await fs.promises.writeFile(path.join(__dirname, '../data', 'file_info.json'), JSON.stringify(fileInfo, null, 2), 'utf8'); - } - - res.status(200).send('L\'opération a été effectuée avec succès.'); - } catch (err) { - console.error(err); - return res.status(500).send('Erreur lors du changement de nom du fichier.'); - } -}); - -router.post('/dashboard/delete', authMiddleware, (req, res) => { - const userId = req.userData.name; - const { filename } = req.body; - - if (!userId || !filename) { - return res.status(400).json({ message: 'Identifiant d\'utilisateur ou nom de fichier manquant pour la suppression du fichier.' }); - } - - const userFolderPath = path.join('cdn-files', userId); - - function findAndDeleteFile(folderPath) { - const filesInFolder = fs.readdirSync(folderPath); - - for (const file of filesInFolder) { - const filePath = path.join(folderPath, file); - - if (fs.statSync(filePath).isDirectory()) { - findAndDeleteFile(filePath); - } else if (file === filename) { - try { - fs.unlinkSync(filePath); - console.log('File deleted:', filePath); - return true; - } catch (error) { - console.error('Error deleting file:', error); - return false; - } - } - } - - return false; - } - - const fileDeleted = findAndDeleteFile(userFolderPath); - - if (fileDeleted) { - res.status(200).json({ status: 'success', message: 'Le fichier a été supprimé avec succès.' }); - } else { - res.status(404).json({ status: 'error', message: 'Le fichier que vous essayez de supprimer n\'existe pas.' }); - } -}); - -const ncpAsync = (source, destination) => { - return new Promise((resolve, reject) => { - ncp(source, destination, (err) => { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }); -}; - -router.post('/dashboard/movefile', authMiddleware, async (req, res) => { - const fileName = req.body.fileName; - const folderName = req.body.folderName; - - const data = await fs.readFileSync(path.join(__dirname, '../data', 'user.json.json'), 'utf-8') - const users = JSON.parse(data); - const user = users.find(user => user.id === req.user.id); - - if (!user) { - console.error('User not found in user.json'); - return res.status(500).send('Erreur lors du déplacement du fichier.'); - } - - const userId = user.name; - - if (!fileName || !userId) { - console.error('fileName or userId is undefined'); - return res.status(500).send('Erreur lors du déplacement du fichier.'); - } - - const sourcePath = path.join('cdn-files', userId, fileName); - - let destinationDir; - if (folderName && folderName.trim() !== '') { - destinationDir = path.join('cdn-files', userId, folderName); - } else { - destinationDir = path.join('cdn-files', userId); - } - - const destinationPath = path.join(destinationDir, fileName); - - try { - const normalizedSourcePath = path.normalize(sourcePath); - console.log('Full Source Path:', normalizedSourcePath); - - if (fs.existsSync(normalizedSourcePath)) { - await fs.promises.access(destinationDir); - - await ncpAsync(normalizedSourcePath, destinationPath); - - await fs.promises.unlink(normalizedSourcePath); - } else { - console.log('File does not exist'); - } - - res.redirect('/dpanel/dashboard'); - } catch (err) { - console.error(err); - return res.status(500).send('Erreur lors du déplacement du fichier.'); - } -}); - -router.post('/dashboard/movefile/:folderName', authMiddleware, async (req, res) => { - - const fileName = req.body.fileName; - const newFolderName = req.body.folderName; - const oldFolderName = req.params.folderName; - const userId = req.user && req.user._json ? req.userData.name : undefined; - - if (!fileName || !userId || !oldFolderName || !newFolderName) { - console.error('fileName, userId, oldFolderName, or newFolderName is undefined'); - return res.status(500).send('Erreur lors du déplacement du fichier.'); - } - - const sourcePath = path.join(process.cwd(), 'cdn-files', userId, oldFolderName, fileName); - const destinationDir = path.join(process.cwd(), 'cdn-files', userId, newFolderName); - const destinationPath = path.join(destinationDir, fileName); - - try { - const normalizedSourcePath = path.normalize(sourcePath); - console.log('Full Source Path:', normalizedSourcePath); - - if (fs.existsSync(normalizedSourcePath)) { - await fs.promises.access(destinationDir, fs.constants.W_OK); - - await fs.promises.rename(normalizedSourcePath, destinationPath); - } else { - console.log('File does not exist'); - } - - res.redirect('/dpanel/dashboard'); - } catch (err) { - console.error(err); - return res.status(500).send('Erreur lors du déplacement du fichier.'); - } -}); - -router.delete('/dashboard/deletefolder/:folderName', authMiddleware, (req, res) => { - const userId = req.userData.name; - const { filename } = req.body; - - const userFolderPath = path.join('cdn-files', userId || ''); - const folderPath = path.join(userFolderPath, req.params.folderName || ''); - - if (!fs.existsSync(folderPath)) { - return res.status(404).json({ error: 'Le dossier spécifié n\'existe pas.' }); - } - - fs.rmdirSync(folderPath, { recursive: true }); - - res.json({ deleted: true, success: 'Dossier supprimé avec succès.' }); -}); - -router.delete('/dashboard/deletefolder/:folderName', authMiddleware, (req, res) => { - const userId = req.userData.name; - const folderName = req.params.folderName; - const folderPath = path.join('cdn-files', userId, folderName); - - fs.rmdir(folderPath, { recursive: true }, (err) => { - if (err) { - console.error(err); - return res.status(500).json({ error: 'Erreur lors de la suppression du dossier.' }); - } - res.json({ deleted: true, success: 'Dossier supprimé avec succès.' }); - }); -}); - -router.post('/dashboard/deletefile/:folderName', authMiddleware, (req, res) => { - const userId = req.userData.name; - const { filename } = req.body; - - const userFolderPath = path.join('cdn-files', userId || ''); - const filePath = path.join(userFolderPath, req.params.folderName, filename || ''); - - if (!fs.existsSync(filePath)) { - return res.status(404).json({ error: 'Le fichier spécifié n\'existe pas.' }); - } - - fs.unlink(filePath, (err) => { - if (err) { - console.error(err); - return res.status(500).json({ error: 'Erreur lors de la suppression du fichier.' }); - } - res.json({ deleted: true, success: 'Fichier supprimé avec succès.' }); - }); -}); - -router.get('/upload', authMiddleware, (req, res) => { - res.render('upload'); -}); - -router.use(fileUpload({ - limits: { fileSize: 15 * 1024 * 1024 * 1024 }, -})); - -router.post('/upload', authMiddleware, async (req, res) => { - try { - if (!req.files || Object.keys(req.files).length === 0) { - return res.status(400).send('5410 - Erreur de téléchargement, veuillez retenter ultérieurement.'); - } - - const file = req.files.file; - const userId = req.userData.name; - const Id = req.userData.id; - const uploadDir = path.join('cdn-files', userId); - const originalFileName = file.name; - const domain = config.domain || 'mydomain.com'; - let expiryDate = req.body.expiryDate; - let password = req.body.password; - - if (!fs.existsSync(uploadDir)) { - fs.mkdirSync(uploadDir, { recursive: true }); - } - - file.mv(path.join(uploadDir, originalFileName), async (err) => { - if (err) { - console.error(err); - return res.status(500).send({ message: 'Erreur lors du téléchargement du fichier.' }); - } - - const fileExtension = path.extname(originalFileName).toLowerCase(); - - let encryptedPassword = ''; - if (password) { - const algorithm = 'aes-256-cbc'; - const key = crypto.scryptSync(password, 'salt', 32); - const iv = Buffer.alloc(16, 0); - const cipher = crypto.createCipheriv(algorithm, key, iv); - encryptedPassword = cipher.update('', 'utf8', 'hex'); - encryptedPassword += cipher.final('hex'); - } - - const fileInfo = { - fileName: originalFileName, - expiryDate: expiryDate || '', - password: encryptedPassword, - Id: Id, - path: path.join(uploadDir, originalFileName) - }; - - if (expiryDate || password) { - let data = []; - if (fs.existsSync(path.join(__dirname, '../data', 'file_info.json'))) { - const existingData = await fs.promises.readFile(path.join(__dirname, '../data', 'file_info.json'), 'utf8'); - data = JSON.parse(existingData); - } - data.push(fileInfo); - await fs.promises.writeFile(path.join(__dirname, '../data', 'file_info.json'), JSON.stringify(data, null, 2)); - } - - res.redirect('/dpanel/dashboard'); - }); - } catch (error) { - console.error(error); - return res.status(500).send({ message: 'Erreur lors du téléchargement du fichier.' }); - } -}); - -const User = require('../data/user.json'); -const setup = JSON.parse(fs.readFileSync(path.join(__dirname, '../data', 'setup.json'), 'utf-8')); - -router.get('/dashboard/admin', authMiddleware, async (req, res) => { - try { - res.render('paramAdmin', { users: User, setup: setup }); - } catch (err) { - console.error(err); - res.status(500).send('Server Error'); - } -}); - - -router.get('/dashboard/admin/users', authMiddleware, async (req, res) => { - try { - let currentPage = Number(req.query.page) || 1; - let limit = Number(req.query.limit) || 10; - - let rawdata = fs.readFileSync(path.join(__dirname, '../data/user.json')); - let users = JSON.parse(rawdata); - - let totalUsers = users.length; - let pages = Math.ceil(totalUsers / limit); - - let start = (currentPage - 1) * limit; - let end = start + limit; - let usersForPage = users.slice(start, end); - - res.render('paramAdminUser', { users: usersForPage, setup: setup, pages: pages, currentPage: currentPage, limit: limit }); - } catch (err) { - console.error(err); - res.status(500).send('Server Error'); - } -}); - -router.get('/dashboard/admin/settingsetup', authMiddleware, async (req, res) => { - try { - res.render('paramAdminSettingSetup', { users: User, setup: setup }); - } catch (err) { - console.error(err); - res.status(500).send('Server Error'); - } -}); - -const osUtils = require('os-utils'); - -const Convert = require('ansi-to-html'); -const convert = new Convert(); - -router.get('/dashboard/admin/stats-logs', authMiddleware, async (req, res) => { - try { - const uptime = os.uptime(); - const memoryUsage = process.memoryUsage().heapUsed / 1024 / 1024; - - osUtils.cpuUsage(function(cpuUsage) { - fs.readdir('./logs', (err, files) => { - if (err) { - console.error(err); - res.status(500).send('Error reading logs'); - return; - } - - const logs = files.map(file => { - return fs.promises.readFile(path.join('./logs', file), 'utf8') - .then(content => { - content = convert.toHtml(content); - return { name: file, content: content }; - }) - .catch(err => { - console.error(err); - }); - }); - - Promise.all(logs).then(completed => { - res.render('paramAdminStats&Logs', { users: User, setup: setup, uptime, memoryUsage, cpuUsage, logs: completed }); - }); - }); - }); - } catch (err) { - console.error(err); - res.status(500).send('Server Error'); - } -}); - -router.get('/dashboard/admin/Privacy-Security', authMiddleware, async (req, res) => { - try { - const files = await fs.promises.readdir('./report'); - const reports = files.filter(file => file.endsWith('.json')).map(file => { - return fs.promises.readFile(path.join('./report', file), 'utf8') - .then(content => { - return { name: file, content: content }; - }) - .catch(err => { - console.error(err); - }); - }); - - Promise.all([Promise.all(reports)]).then(([completedReports]) => { - res.render('paramAdminPrivacy&Security', { users: User, reports: completedReports }); - }); - } catch (err) { - console.error(err); - res.status(500).send('Server Error'); - } -}); - -router.post('/dashboard/update-role', authMiddleware, async (req, res) => { - try { - const { id, role } = req.body; - - const user = User.find(user => user.id === id); - - if (user) { - user.role = role; - } - - fs.writeFileSync(path.join(__dirname, '../data/user.json'), JSON.stringify(User, null, 2)); - - res.redirect('/dpanel/dashboard/admin'); - } catch (err) { - console.error(err); - res.status(500).send('Server Error'); - } -}); - -router.post('/dashboard/update-setup', authMiddleware, async (req, res) => { - try { - let setup = JSON.parse(fs.readFileSync(path.join(__dirname, '../data', 'setup.json'), 'utf-8')); - - if (!req.body.ldap || !req.body.ldap.enabled) { - delete setup.ldap; - } else { - setup.ldap = req.body.ldap; - } - - if (!req.body.discord || !req.body.discord.enabled) { - delete setup.discord; - } else { - setup.discord = req.body.discord; - } - - setup.domain = req.body.domain; - setup.uptime = req.body.uptime; - - fs.writeFileSync(path.join(__dirname, '../data', 'setup.json'), 'utf-8'), JSON.stringify(setup, null, 2); - - res.redirect('/dpanel/dashboard/admin'); - } catch (err) { - console.error(err); - res.status(500).send('Server Error'); - } -}); - -module.exports = router; diff --git a/routes/routes.js b/routes/routes.js new file mode 100644 index 0000000..d8b1b45 --- /dev/null +++ b/routes/routes.js @@ -0,0 +1,59 @@ +const express = require('express'); +const router = express.Router(); +const path = require('path'); + +const indexRoute = require('./index.js'); +const DpanelDashboardRoute = require('./Dpanel/Dashboard/index.js'); +const DpanelFolderRoute = require('./Dpanel/Folder/index.js'); +const DpanelUploadRoute = require('./Dpanel/Upload.js'); +const AttachmentsRoute = require('./attachments.js'); + +const NewFolderRoute = require('./Dpanel/API/NewFolder.js'); +const RenameFileRoute = require('./Dpanel/API/RenameFile.js'); +const DeleteFileRoute = require('./Dpanel/API/DeleteFile.js'); +const MoveFileRoute = require('./Dpanel/API/MoveFile.js'); +const UploadRoute = require('./Dpanel/API/Upload.js'); +const UpdateRoleAdminRoute = require('./Dpanel/API/Upload-Role-Admin.js'); +const UpdateSetupAdminRoute = require('./Dpanel/API/Update-Setup-Admin.js'); +const DeleteFolderRoute = require('./Dpanel/API/DeleteFolfder.js'); +const DeleteFileFolderRoute = require('./Dpanel/API/DeleteFileFolder.js'); + +const loginRoute = require('./Auth/Login.js'); +const logoutRoute = require('./Auth/Logout.js'); +const activeDirectoryRoute = require('./Auth/ActiveDirectory.js'); +const discordRoute = require('./Auth/Discord.js'); + +const AdminDpanelRoute = require('./Dpanel/Admin/index.js'); +const AdminUsersDpanelRoute = require('./Dpanel/Admin/User.js'); +const AdminSettingSetupDpanelRoute = require('./Dpanel/Admin/SettingSetup.js'); +const AdminStatsLogsDpanelRoute = require('./Dpanel/Admin/Stats-Logs.js'); +const AdminPrivacySecurityDpanelRoute = require('./Dpanel/Admin/Privacy-Security.js'); + +router.use('/', indexRoute); +router.use('/attachments', AttachmentsRoute); + +router.use('/dpanel/dashboard', DpanelDashboardRoute); +router.use('/dpanel/upload', DpanelUploadRoute); +router.use('/dpanel/dashboard/folder', DpanelFolderRoute); +router.use('/dpanel/dashboard/admin', AdminDpanelRoute); +router.use('/dpanel/dashboard/admin/users', AdminUsersDpanelRoute); +router.use('/dpanel/dashboard/admin/settingsetup', AdminSettingSetupDpanelRoute) +router.use('/dpanel/dashboard/admin/stats-logs', AdminStatsLogsDpanelRoute);; +router.use('/dpanel/dashboard/admin/Privacy-Security', AdminPrivacySecurityDpanelRoute); + +router.use('/api/dpanel/dashboard/newfolder', NewFolderRoute); +router.use('/api/dpanel/dashboard/rename', RenameFileRoute); +router.use('/api/dpanel/dashboard/delete', DeleteFileRoute); +router.use('/api/dpanel/dashboard/movefile', MoveFileRoute); +router.use('/api/dpanel/upload', UploadRoute); +router.use('/api/dpanel/dashboard/admin/update-role', UpdateRoleAdminRoute); +router.use('/api/dpanel/dashboard/admin/update-setup', UpdateSetupAdminRoute); +router.use('/api/dpanel/dashboard/deletefolder', DeleteFolderRoute); +router.use('/api/dpanel/dashboard/deletefile/', DeleteFileFolderRoute); + +router.use('/auth/login', loginRoute); +router.use('/auth/logout', logoutRoute); +router.use('/auth/activedirectory', activeDirectoryRoute); +router.use('/auth/discord', discordRoute); + +module.exports = router; \ No newline at end of file diff --git a/server.js b/server.js index a5cb6c6..3c16c10 100644 --- a/server.js +++ b/server.js @@ -33,7 +33,7 @@ if (setup.ldap !== undefined) { app.use(express.static(path.join(__dirname, 'public'))); app.get(['/data/user.json', '/data/file_info.json', '/data/setup.json'], (req, res) => { - res.status(403).send('Access Denied'); +res.status(403).json({ error: 'Access Denied. You do not have permission to access this resource.' }); });app.use(express.urlencoded({ extended: true })); function generateSecretKey() { @@ -54,19 +54,11 @@ app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use(flash()); -const indexRoute = require('./routes/index.js'); -const AuthRoute = require('./routes/auth.js'); -const DpanelRoute = require('./routes/dpanel.js'); -const AttachmentsRoute = require('./routes/attachments.js'); - +const routes = require('./routes/routes.js'); +app.use('/public', express.static(path.join(__dirname, 'public'))); app.set('view engine', 'ejs'); app.set('views', __dirname + '/views'); - -app.use('/', indexRoute); -app.use('/auth', AuthRoute); -app.use('/dpanel', DpanelRoute); -app.use('/attachments', AttachmentsRoute); -app.use('/public', express.static(path.join(__dirname, 'public'))); +app.use(routes); app.use(logRequestInfo); @@ -85,7 +77,7 @@ cron.schedule('00 03 * * *', async () => { cron.schedule('0 * * * *', async () => { try { - const fileInfoData = await fs.promises.readFile(path.join(__dirname, 'file_info.json'), 'utf8'); + const fileInfoData = await fs.promises.readFile(path.join(__dirname,'/data/', 'file_info.json'), 'utf8'); const fileInfo = JSON.parse(fileInfoData); const now = new Date(); diff --git a/views/AuthLogin.ejs b/views/AuthLogin.ejs index d55964b..58fb831 100644 --- a/views/AuthLogin.ejs +++ b/views/AuthLogin.ejs @@ -51,7 +51,7 @@

Connexion

- <% if (currentUrl === '/auth/activedirectory' || setupData.hasOwnProperty('ldap')) { %> + <% if (currentUrl === '/auth/activedirectory' || (setupData[0] && setupData[0].hasOwnProperty('ldap'))) { %>

Connexion avec Active Directory

<% if (typeof errorMessage !== 'undefined' && errorMessage) { %> diff --git a/views/dashboard.ejs b/views/dashboard.ejs index 016dcba..a10e344 100644 --- a/views/dashboard.ejs +++ b/views/dashboard.ejs @@ -127,7 +127,7 @@ - +
-
+
-
+