From 8f3e604774bedb49b02ef7e5318bacb5790a74fa Mon Sep 17 00:00:00 2001 From: Dinawo Date: Tue, 2 Apr 2024 20:59:13 +0200 Subject: [PATCH] Update .gitignore and add new dependencies and routes --- .gitignore | 3 +- DockerCompse.template | 13 + Middlewares/UserIDMiddlewareAD.js | 13 +- Middlewares/authMiddleware.js | 51 ++- Middlewares/watcherMiddleware.js | 43 +- models/Passport-ActiveDirectory.js | 12 +- models/Passport-Discord.js | 14 +- models/fileCreated.js | 7 +- package-lock.json | 631 ++++++++++++++++++++++++++++- package.json | 2 + routes/auth.js | 44 +- routes/dpanel.js | 70 +++- routes/index.js | 4 +- server.js | 4 +- setup.py | 95 ----- views/paramAdmin.ejs | 4 +- 16 files changed, 823 insertions(+), 187 deletions(-) create mode 100644 DockerCompse.template delete mode 100644 setup.py diff --git a/.gitignore b/.gitignore index 757a3ba..87921b1 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ /user.json /setup.json /file_info.json -/node_modules/ \ No newline at end of file +/node_modules/ +/data/ \ No newline at end of file diff --git a/DockerCompse.template b/DockerCompse.template new file mode 100644 index 0000000..7c0a861 --- /dev/null +++ b/DockerCompse.template @@ -0,0 +1,13 @@ +version: '3' +services: + app: + image: swiftlogiclabs/cdn-app-insider:latest + ports: + - "5053:5053" + volumes: + - app-data:/app/cdn-app-insider/cdn-files + - app-data:/app/cdn-app-insider/report + - app-data:/app/cdn-app-insider/data + +volumes: + app-data: \ No newline at end of file diff --git a/Middlewares/UserIDMiddlewareAD.js b/Middlewares/UserIDMiddlewareAD.js index 2b1bb5d..19eddea 100644 --- a/Middlewares/UserIDMiddlewareAD.js +++ b/Middlewares/UserIDMiddlewareAD.js @@ -1,7 +1,7 @@ const fs = require('fs').promises; const path = require('path'); -const filePath = path.join(__dirname, '../user.json'); +const filePath = path.join(__dirname, '../data/user.json'); async function getUserData() { try { @@ -15,9 +15,14 @@ async function getUserData() { async function checkUserExistsAD(req, res, next) { let userData = await getUserData(); + console.log('User data:', userData); - if (!req.user || (!req.user.name && !req.user.id)) { - return res.status(500).send('Internal Server Error'); + if (Array.isArray(req.user)) { + req.user = req.user.find(u => u._json && u._json.sAMAccountName); + } + + if (req.user && req.user._json && req.user._json.sAMAccountName) { + req.user.name = req.user._json.sAMAccountName; } try { @@ -40,7 +45,7 @@ async function checkUserExistsAD(req, res, next) { users.push(newUser); try { - await fs.promises.writeFile(filePath, JSON.stringify(users, null, 2), 'utf8'); + await fs.writeFile(filePath, JSON.stringify(users, null, 2), 'utf8'); } catch (error) { console.error(`Failed to write to ${filePath}: ${error}`); return next(error); diff --git a/Middlewares/authMiddleware.js b/Middlewares/authMiddleware.js index f07d77e..2f6b4e7 100644 --- a/Middlewares/authMiddleware.js +++ b/Middlewares/authMiddleware.js @@ -1,30 +1,41 @@ const fs = require('fs'); +const path = require('path'); const { logger, logRequestInfo, ErrorLogger, authLogger } = require('../config/logs'); +const debug = require('debug')('app:authMiddleware'); const authMiddleware = async (req, res, next) => { - if (req.isAuthenticated() || (req.user && req.user.name)) { - const data = await fs.promises.readFile('user.json', 'utf8'); - const users = JSON.parse(data); - const user = users.find(user => user.name === req.user.name); + debug('Checking if user is authenticated...'); + if (req.isAuthenticated() || (req.session && req.session.user && req.session.user.name)) { + debug('User is authenticated, reading user data...'); + const data = await fs.promises.readFile(path.join(__dirname, '../data', 'user.json'), 'utf8'); + const users = JSON.parse(data); + debug('User data:', users); + const user = users.find(user => user.name === (req.session.user && req.session.user.name)); - if (!user) { - authLogger.info('User is not authenticated and user name is not set'); - return res.redirect('/auth/login'); - } + debug('User name from session:', req.session.user && req.session.user.name); - if (!req.session.user) { - authLogger.info('User connection attempt in progress, verification in progress...'); - authLogger.info(`Login successfully completed, logged in user is: id=${user.id}, name=${user.name}, role=${user.role}, IP: ${req.ip}, User Agent: ${req.headers['user-agent']}`); - } - - res.locals.user = user; - req.session.user = user; - req.userData = user; - return next(); - } else { - authLogger.info(`Authentication failed for IP: ${req.ip}, User Agent: ${req.headers['user-agent']}. Redirecting to login.`); - res.redirect('/auth/login'); + if (!user) { + authLogger.info('User is not authenticated and user name is not set'); + debug('User not found in user data, redirecting to login...'); + return res.redirect('/auth/login'); } + + if (!req.session.user) { + authLogger.info('User connection attempt in progress, verification in progress...'); + authLogger.info(`Login successfully completed, logged in user is: id=${user.id}, name=${user.name}, role=${user.role}, IP: ${req.ip}, User Agent: ${req.headers['user-agent']}`); + } + + debug('Setting user data in session and locals...'); + res.locals.user = user; + req.session.user = user; + req.userData = user; + debug('User data set, calling next middleware...'); + return next(); + } else { + authLogger.info(`Authentication failed for IP: ${req.ip}, User Agent: ${req.headers['user-agent']}. Redirecting to login.`); + debug('User is not authenticated, redirecting to login...'); + res.redirect('/auth/login'); + } }; module.exports = authMiddleware; \ No newline at end of file diff --git a/Middlewares/watcherMiddleware.js b/Middlewares/watcherMiddleware.js index 9c1a03a..5e5c19a 100644 --- a/Middlewares/watcherMiddleware.js +++ b/Middlewares/watcherMiddleware.js @@ -3,23 +3,46 @@ const chokidar = require('chokidar'); const fs = require('fs'); const { logger, ErrorLogger, logRequestInfo } = require('../config/logs'); -let userData = require(path.resolve(__dirname, '../user.json')); -let setupData = require(path.resolve(__dirname, '../setup.json')); +const userFilePath = path.resolve(__dirname, '../data/user.json'); +const setupFilePath = path.resolve(__dirname, '../data/setup.json'); -const watcher = chokidar.watch([path.resolve(__dirname, '../user.json'), path.resolve(__dirname, '../setup.json')], { +let userData, setupData; + +try { + userData = JSON.parse(fs.readFileSync(userFilePath, 'utf-8')); +} catch (error) { + ErrorLogger.error(`Error parsing user.json: ${error}`); +} + +try { + setupData = JSON.parse(fs.readFileSync(setupFilePath, 'utf-8')); +} catch (error) { + ErrorLogger.error(`Error parsing setup.json: ${error}`); +} + +const watcher = chokidar.watch([userFilePath, setupFilePath], { persistent: true }); watcher.on('change', (filePath) => { - delete require.cache[require.resolve(filePath)]; - - if (filePath === path.resolve(__dirname, '../user.json')) { - userData = require(filePath); - } else if (filePath === path.resolve(__dirname, '../setup.json')) { - setupData = require(filePath); + let modifiedFile; + if (filePath === userFilePath) { + try { + userData = JSON.parse(fs.readFileSync(filePath, 'utf-8')); + modifiedFile = 'user.json'; + } catch (error) { + logger.error(`Error parsing user.json: ${error}`); + } + } else if (filePath === setupFilePath) { + try { + setupData = JSON.parse(fs.readFileSync(filePath, 'utf-8')); + modifiedFile = 'setup.json'; + } catch (error) { + logger.error(`Error parsing setup.json: ${error}`); + } } - logger.info('File', filePath, 'has been changed'); + logger.info(`File ${modifiedFile} has been modified`); }); module.exports = { diff --git a/models/Passport-ActiveDirectory.js b/models/Passport-ActiveDirectory.js index 4586925..895a850 100644 --- a/models/Passport-ActiveDirectory.js +++ b/models/Passport-ActiveDirectory.js @@ -4,16 +4,17 @@ const fs = require('fs'); const path = require('path'); const { getUserData } = require('../Middlewares/watcherMiddleware'); -const setupFilePath = path.join('setup.json'); +const setupFilePath = path.join(__dirname, '../data', 'setup.json'); + const setupData = JSON.parse(fs.readFileSync(setupFilePath, 'utf-8')); passport.use('ActiveDirectory', new ActiveDirectoryStrategy({ integrated: false, ldap: { - url: setupData.ldap.url, - baseDN: setupData.ldap.baseDN, - username: setupData.ldap.username, - password: setupData.ldap.password + url: setupData[0].ldap.url, + baseDN: setupData[0].ldap.baseDN, + username: setupData[0].ldap.username, + password: setupData[0].ldap.password } }, function (profile, ad, done) { ad.isUserMemberOf(profile._json.dn, 'CDN-Access', function (err, isMember) { @@ -44,3 +45,4 @@ passport.deserializeUser(async (id, done) => { }); module.exports = passport; + diff --git a/models/Passport-Discord.js b/models/Passport-Discord.js index b384611..5b61a4a 100644 --- a/models/Passport-Discord.js +++ b/models/Passport-Discord.js @@ -3,13 +3,13 @@ const DiscordStrategy = require('passport-discord').Strategy; const fs = require('fs'); const path = require('path'); -const setupFilePath = path.join('setup.json'); +const setupFilePath = path.join(__dirname, '../data', 'setup.json'); const setupData = JSON.parse(fs.readFileSync(setupFilePath, 'utf-8')); passport.use(new DiscordStrategy({ - clientID: setupData.discord.clientID, - clientSecret: setupData.discord.clientSecret, - callbackURL: `http://${setupData.domain}/auth/discord/callback` + clientID: setupData[0].discord.clientID, + clientSecret: setupData[0].discord.clientSecret, + callbackURL: `http://${setupData[0].domain}/auth/discord/callback` }, (accessToken, refreshToken, profile, done) => { fs.readFile('user.json', 'utf8', (err, data) => { if (err) { @@ -19,7 +19,7 @@ passport.use(new DiscordStrategy({ const users = JSON.parse(data); const user = users.find(user => user.id === profile.id); - if (setupData.discord.authorizedIDs.length > 0 && !setupData.discord.authorizedIDs.includes(profile.id)) { + if (setupData[0].discord.authorizedIDs.length > 0 && !setupData[0].discord.authorizedIDs.includes(profile.id)) { return done(null, false, { message: 'L\'utilisateur n\'est pas autorisé.' }); } @@ -32,7 +32,7 @@ passport.serializeUser((user, done) => { }); passport.deserializeUser((id, done) => { - fs.readFile('user.json', 'utf8', (err, data) => { + fs.readFile('/data', 'user.json', 'utf8', (err, data) => { if (err) { return done(err); } @@ -43,4 +43,4 @@ passport.deserializeUser((id, done) => { }); }); -module.exports = passport; +module.exports = passport; \ No newline at end of file diff --git a/models/fileCreated.js b/models/fileCreated.js index 155e961..f36f7f4 100644 --- a/models/fileCreated.js +++ b/models/fileCreated.js @@ -1,11 +1,14 @@ const fs = require('fs'); +const path = require('path'); const { logger, ErrorLogger, logRequestInfo } = require('../config/logs'); +const dataFolderPath = path.join(__dirname, '../data'); const filesToCreate = ['setup.json', 'user.json', 'file_info.json']; filesToCreate.forEach((fileName) => { - if (!fs.existsSync(fileName)) { - fs.writeFileSync(fileName, '{}'); + const filePath = path.join(dataFolderPath, fileName); + if (!fs.existsSync(filePath)) { + fs.writeFileSync(filePath, '[]'); logger.info(`${fileName} created successfully.`); } else { logger.info(`${fileName} already exists.`); diff --git a/package-lock.json b/package-lock.json index cb5d7f7..930dbed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,15 @@ { "name": "@cdn/app-insider-swiftlogic-labs-dinawo", - "version": "1.0.9-beta", + "version": "1.0.0-beta.10", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@cdn/app-insider-swiftlogic-labs-dinawo", - "version": "1.0.9-beta", + "version": "1.0.0-beta.10", "license": "ISC", "dependencies": { + "@auth/express": "^0.5.1", "adm-zip": "^0.5.10", "ansi-to-html": "^0.7.2", "axios": "^1.6.3", @@ -39,6 +40,7 @@ "os-utils": "^0.0.14", "passport": "^0.6.0", "passport-activedirectory": "^1.4.0", + "passport-ad": "^0.0.3", "passport-discord": "^0.1.4", "path": "^0.12.7", "pg": "^8.11.3", @@ -70,6 +72,60 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "dependencies": { + "@panva/hkdf": "^1.1.1", + "@types/cookie": "0.6.0", + "cookie": "0.6.0", + "jose": "^5.1.3", + "oauth4webapi": "^2.4.0", + "preact": "10.11.3", + "preact-render-to-string": "5.2.3" + }, + "peerDependencies": { + "@simplewebauthn/browser": "^9.0.1", + "@simplewebauthn/server": "^9.0.2", + "nodemailer": "^6.8.0" + }, + "peerDependenciesMeta": { + "@simplewebauthn/browser": { + "optional": true + }, + "@simplewebauthn/server": { + "optional": true + }, + "nodemailer": { + "optional": true + } + } + }, + "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==", + "dependencies": { + "@auth/core": "0.28.1" + }, + "peerDependencies": { + "express": "^4.18.2" + } + }, "node_modules/@colors/colors": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", @@ -268,6 +324,14 @@ "node": ">= 8" } }, + "node_modules/@panva/hkdf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz", + "integrity": "sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -357,6 +421,20 @@ "node": ">= 0.6" } }, + "node_modules/activedirectory": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/activedirectory/-/activedirectory-0.7.2.tgz", + "integrity": "sha512-xksgl4iSV3BVw2TmM0zUrFBMS9q/j2b7U77d0RQB67AcQb+xk7BFFB10FEfASb2DEFBKUC5SoMCeMZwYRwiQ4A==", + "dependencies": { + "async": ">= 0.1.22", + "bunyan": ">= 1.3.5", + "ldapjs": ">= 0.7.1", + "underscore": ">= 1.4.3" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/activedirectory2": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/activedirectory2/-/activedirectory2-2.2.0.tgz", @@ -371,6 +449,100 @@ "node": ">=4.0" } }, + "node_modules/ad": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ad/-/ad-0.3.2.tgz", + "integrity": "sha512-I1hrkfUrHVtJVSvaBarlENNLsmNTMM/+jFFGhBR73Txk6cLLWXrGHprFwXQag9PI+agYOvXudMVInXxnjuHhcA==", + "dependencies": { + "activedirectory": "^0.7.2", + "ldapjs": "^1.0.1", + "lodash.orderby": "^4.6.0", + "node-ssha256": "^0.1.1" + } + }, + "node_modules/ad/node_modules/asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha512-6i37w/+EhlWlGUJff3T/Q8u1RGmP5wgbiwYnOnbOqvtrPxT63/sYFyP9RcpxtxGymtfA075IvmOnL7ycNOWl3w==" + }, + "node_modules/ad/node_modules/extsprintf": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz", + "integrity": "sha512-T3PYC6HucmF4OfunfZb5d1nRvTSvWYhsr/Og33HANcCuCtGPUtWVyt/tTs8SU9sR0SGh5Z/xQCuX/D72ph2H+A==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/ad/node_modules/ldap-filter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.2.2.tgz", + "integrity": "sha512-HDnDRNY/z0E3qljSjDWtu7xXCUdiXzwadz7m1jIwl3XHhPMrqUyurOd32YWH5IZ3zZMP4PrG7gKdRIB2uZHKGA==", + "dependencies": { + "assert-plus": "0.1.5" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ad/node_modules/ldap-filter/node_modules/assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha512-brU24g7ryhRwGCI2y+1dGQmQXiZF7TtIj583S96y0jjdajIe6wn8BuXyELYhvD22dtIxDQVFk04YTJwwdwOYJw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ad/node_modules/ldapjs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-1.0.2.tgz", + "integrity": "sha512-Y8fRYFXOWWKBs9I2QRNXb0FncDcG0Gjc7YU6XI3kIV9hLMRaFKH5QHi2TZeB7FrpgXuabOgL0GdYALbssHxH5Q==", + "dependencies": { + "asn1": "0.2.3", + "assert-plus": "^1.0.0", + "backoff": "^2.5.0", + "bunyan": "^1.8.3", + "dashdash": "^1.14.0", + "ldap-filter": "0.2.2", + "once": "^1.4.0", + "vasync": "^1.6.4", + "verror": "^1.8.1" + }, + "bin": { + "ldapjs-add": "bin/ldapjs-add", + "ldapjs-compare": "bin/ldapjs-compare", + "ldapjs-delete": "bin/ldapjs-delete", + "ldapjs-modify": "bin/ldapjs-modify", + "ldapjs-search": "bin/ldapjs-search" + }, + "engines": { + "node": ">=0.10" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8" + } + }, + "node_modules/ad/node_modules/vasync": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz", + "integrity": "sha512-3oQMomVgQgHzNe5iKuT8PGOhMCQcg1wfh00Nh/Kl39ERdTlw/uNS7kbrhEraDMDKWHdDdc0iBFahPEd/Ft2b+A==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "verror": "1.6.0" + } + }, + "node_modules/ad/node_modules/vasync/node_modules/verror": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz", + "integrity": "sha512-bIOaZx4+Bf6a7sIORfmYnyKLDLk/lhVym6rjYlq+vkitYKnhFmUpmPpDTCltWFrUTlGKs6sCeoDWfMA0oOOneA==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "extsprintf": "1.2.0" + } + }, "node_modules/adm-zip": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", @@ -713,6 +885,23 @@ "node": ">=4" } }, + "node_modules/bunyan": { + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "engines": [ + "node >=0.10.0" + ], + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -1072,6 +1261,17 @@ "url": "https://opencollective.com/daisyui" } }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1234,6 +1434,19 @@ "url": "https://dotenvx.com" } }, + "node_modules/dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "nan": "^2.14.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -2279,6 +2492,14 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jose": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.2.3.tgz", + "integrity": "sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -2350,6 +2571,11 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "node_modules/lodash.orderby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.orderby/-/lodash.orderby-4.6.0.tgz", + "integrity": "sha512-T0rZxKmghOOf5YPnn8EY5iLYeWCpZq8G41FfqoVHH5QDTAFaghJRmAdLiadEDq+ztgM2q5PjA+Z1fOwGrLgmtg==" + }, "node_modules/logform": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", @@ -2596,6 +2822,48 @@ "node": ">= 6.0.0" } }, + "node_modules/mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "optional": true, + "dependencies": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mv/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "optional": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mv/node_modules/rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "optional": true, + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/mysql2": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.2.tgz", @@ -2654,6 +2922,12 @@ "node": ">=12" } }, + "node_modules/nan": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", + "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==", + "optional": true + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -2714,6 +2988,15 @@ "node": "4.x || >=6.0.0" } }, + "node_modules/node-ssha256": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/node-ssha256/-/node-ssha256-0.1.1.tgz", + "integrity": "sha512-Mn2k/WpFsHoWWqLtMFre71xNUw0GpUZR/Kgrv6NNjWgdfbfG5WGnlx19rcGLMHQo3TdCJQM1b1vFz6gzPdwgZw==", + "bin": { + "ssha256_check": "bin/ssha256_check", + "ssha256_create": "bin/ssha256_create" + } + }, "node_modules/nodemailer": { "version": "6.9.11", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.11.tgz", @@ -2820,6 +3103,14 @@ "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.10.0.tgz", "integrity": "sha512-1orQ9MT1vHFGQxhuy7E/0gECD3fd2fCC+PIX+/jgmU/gI3EpRocXtmtvxCO5x3WZ443FLTLFWNDjl5MPJf9u+Q==" }, + "node_modules/oauth4webapi": { + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-2.10.4.tgz", + "integrity": "sha512-DSoj8QoChzOCQlJkRmYxAJCIpnXFW32R0Uq7avyghIeB6iJq0XAblOD7pcq3mx4WEBDwMuKr0Y1qveCBleG2Xw==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2934,6 +3225,38 @@ "passport": "^0.6.0" } }, + "node_modules/passport-ad": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/passport-ad/-/passport-ad-0.0.3.tgz", + "integrity": "sha512-HKpQQO/58urydwN/VG4XHQmyC5A0nAPD3+w2wBK3AFcPd9OYzlR27w4M5RjqPqlzA+kvuD3o7788fmjM1qergA==", + "dependencies": { + "ad": "^0.3.2", + "passport": "^0.4.1", + "passport-strategy": "^1.0.0", + "uuid": "^3.4.0" + } + }, + "node_modules/passport-ad/node_modules/passport": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", + "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/passport-ad/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/passport-discord": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/passport-discord/-/passport-discord-0.1.4.tgz", @@ -3345,6 +3668,26 @@ "node": ">=0.10.0" } }, + "node_modules/preact": { + "version": "10.11.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz", + "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/preact-render-to-string": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz", + "integrity": "sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==", + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, "node_modules/precond": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", @@ -3353,6 +3696,11 @@ "node": ">= 0.6" } }, + "node_modules/pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -3617,6 +3965,12 @@ } ] }, + "node_modules/safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true + }, "node_modules/safe-stable-stringify": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", @@ -4279,6 +4633,11 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -4686,6 +5045,40 @@ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "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==", + "requires": { + "@panva/hkdf": "^1.1.1", + "@types/cookie": "0.6.0", + "cookie": "0.6.0", + "jose": "^5.1.3", + "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==", + "requires": { + "@auth/core": "0.28.1" + } + }, "@colors/colors": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", @@ -4832,6 +5225,11 @@ "fastq": "^1.6.0" } }, + "@panva/hkdf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz", + "integrity": "sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==" + }, "@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -4906,6 +5304,17 @@ "negotiator": "0.6.3" } }, + "activedirectory": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/activedirectory/-/activedirectory-0.7.2.tgz", + "integrity": "sha512-xksgl4iSV3BVw2TmM0zUrFBMS9q/j2b7U77d0RQB67AcQb+xk7BFFB10FEfASb2DEFBKUC5SoMCeMZwYRwiQ4A==", + "requires": { + "async": ">= 0.1.22", + "bunyan": ">= 1.3.5", + "ldapjs": ">= 0.7.1", + "underscore": ">= 1.4.3" + } + }, "activedirectory2": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/activedirectory2/-/activedirectory2-2.2.0.tgz", @@ -4917,6 +5326,79 @@ "merge-options": "^2.0.0" } }, + "ad": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ad/-/ad-0.3.2.tgz", + "integrity": "sha512-I1hrkfUrHVtJVSvaBarlENNLsmNTMM/+jFFGhBR73Txk6cLLWXrGHprFwXQag9PI+agYOvXudMVInXxnjuHhcA==", + "requires": { + "activedirectory": "^0.7.2", + "ldapjs": "^1.0.1", + "lodash.orderby": "^4.6.0", + "node-ssha256": "^0.1.1" + }, + "dependencies": { + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha512-6i37w/+EhlWlGUJff3T/Q8u1RGmP5wgbiwYnOnbOqvtrPxT63/sYFyP9RcpxtxGymtfA075IvmOnL7ycNOWl3w==" + }, + "extsprintf": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz", + "integrity": "sha512-T3PYC6HucmF4OfunfZb5d1nRvTSvWYhsr/Og33HANcCuCtGPUtWVyt/tTs8SU9sR0SGh5Z/xQCuX/D72ph2H+A==" + }, + "ldap-filter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.2.2.tgz", + "integrity": "sha512-HDnDRNY/z0E3qljSjDWtu7xXCUdiXzwadz7m1jIwl3XHhPMrqUyurOd32YWH5IZ3zZMP4PrG7gKdRIB2uZHKGA==", + "requires": { + "assert-plus": "0.1.5" + }, + "dependencies": { + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha512-brU24g7ryhRwGCI2y+1dGQmQXiZF7TtIj583S96y0jjdajIe6wn8BuXyELYhvD22dtIxDQVFk04YTJwwdwOYJw==" + } + } + }, + "ldapjs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-1.0.2.tgz", + "integrity": "sha512-Y8fRYFXOWWKBs9I2QRNXb0FncDcG0Gjc7YU6XI3kIV9hLMRaFKH5QHi2TZeB7FrpgXuabOgL0GdYALbssHxH5Q==", + "requires": { + "asn1": "0.2.3", + "assert-plus": "^1.0.0", + "backoff": "^2.5.0", + "bunyan": "^1.8.3", + "dashdash": "^1.14.0", + "dtrace-provider": "~0.8", + "ldap-filter": "0.2.2", + "once": "^1.4.0", + "vasync": "^1.6.4", + "verror": "^1.8.1" + } + }, + "vasync": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz", + "integrity": "sha512-3oQMomVgQgHzNe5iKuT8PGOhMCQcg1wfh00Nh/Kl39ERdTlw/uNS7kbrhEraDMDKWHdDdc0iBFahPEd/Ft2b+A==", + "requires": { + "verror": "1.6.0" + }, + "dependencies": { + "verror": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz", + "integrity": "sha512-bIOaZx4+Bf6a7sIORfmYnyKLDLk/lhVym6rjYlq+vkitYKnhFmUpmPpDTCltWFrUTlGKs6sCeoDWfMA0oOOneA==", + "requires": { + "extsprintf": "1.2.0" + } + } + } + } + } + }, "adm-zip": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", @@ -5188,6 +5670,17 @@ "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", + "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", + "requires": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, "busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -5453,6 +5946,14 @@ "postcss-js": "^4" } }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "requires": { + "assert-plus": "^1.0.0" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -5557,6 +6058,15 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==" }, + "dtrace-provider": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", + "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "optional": true, + "requires": { + "nan": "^2.14.0" + } + }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -6342,6 +6852,11 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", "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==" + }, "json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -6402,6 +6917,11 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "lodash.orderby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.orderby/-/lodash.orderby-4.6.0.tgz", + "integrity": "sha512-T0rZxKmghOOf5YPnn8EY5iLYeWCpZq8G41FfqoVHH5QDTAFaghJRmAdLiadEDq+ztgM2q5PjA+Z1fOwGrLgmtg==" + }, "logform": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", @@ -6574,6 +7094,41 @@ "xtend": "^4.0.0" } }, + "mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "optional": true, + "requires": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "optional": true, + "requires": { + "glob": "^6.0.1" + } + } + } + }, "mysql2": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.2.tgz", @@ -6624,6 +7179,12 @@ } } }, + "nan": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", + "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==", + "optional": true + }, "nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -6660,6 +7221,11 @@ "whatwg-url": "^5.0.0" } }, + "node-ssha256": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/node-ssha256/-/node-ssha256-0.1.1.tgz", + "integrity": "sha512-Mn2k/WpFsHoWWqLtMFre71xNUw0GpUZR/Kgrv6NNjWgdfbfG5WGnlx19rcGLMHQo3TdCJQM1b1vFz6gzPdwgZw==" + }, "nodemailer": { "version": "6.9.11", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.11.tgz", @@ -6734,6 +7300,11 @@ "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.10.0.tgz", "integrity": "sha512-1orQ9MT1vHFGQxhuy7E/0gECD3fd2fCC+PIX+/jgmU/gI3EpRocXtmtvxCO5x3WZ443FLTLFWNDjl5MPJf9u+Q==" }, + "oauth4webapi": { + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-2.10.4.tgz", + "integrity": "sha512-DSoj8QoChzOCQlJkRmYxAJCIpnXFW32R0Uq7avyghIeB6iJq0XAblOD7pcq3mx4WEBDwMuKr0Y1qveCBleG2Xw==" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -6817,6 +7388,33 @@ "passport": "^0.6.0" } }, + "passport-ad": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/passport-ad/-/passport-ad-0.0.3.tgz", + "integrity": "sha512-HKpQQO/58urydwN/VG4XHQmyC5A0nAPD3+w2wBK3AFcPd9OYzlR27w4M5RjqPqlzA+kvuD3o7788fmjM1qergA==", + "requires": { + "ad": "^0.3.2", + "passport": "^0.4.1", + "passport-strategy": "^1.0.0", + "uuid": "^3.4.0" + }, + "dependencies": { + "passport": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", + "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, "passport-discord": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/passport-discord/-/passport-discord-0.1.4.tgz", @@ -7079,11 +7677,29 @@ "xtend": "^4.0.0" } }, + "preact": { + "version": "10.11.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz", + "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==" + }, + "preact-render-to-string": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz", + "integrity": "sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==", + "requires": { + "pretty-format": "^3.8.0" + } + }, "precond": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==" }, + "pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -7250,6 +7866,12 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, + "safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true + }, "safe-stable-stringify": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", @@ -7748,6 +8370,11 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, "undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", diff --git a/package.json b/package.json index 7c87f2d..37bd23d 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "author": "Dinawo - Group SwiftLogic Labs", "license": "ISC", "dependencies": { + "@auth/express": "^0.5.1", "adm-zip": "^0.5.10", "ansi-to-html": "^0.7.2", "axios": "^1.6.3", @@ -40,6 +41,7 @@ "os-utils": "^0.0.14", "passport": "^0.6.0", "passport-activedirectory": "^1.4.0", + "passport-ad": "^0.0.3", "passport-discord": "^0.1.4", "path": "^0.12.7", "pg": "^8.11.3", diff --git a/routes/auth.js b/routes/auth.js index 96e6669..456a98f 100644 --- a/routes/auth.js +++ b/routes/auth.js @@ -7,36 +7,44 @@ const { checkUserExistsDiscord } = require('../Middlewares/UserIDMiddlewareDisco const path = require('path'); const { getUserData, getSetupData } = require('../Middlewares/watcherMiddleware'); -let setupData = getSetupData(); let userData = getUserData(); - +let setupData; let adStrategy; -if (setupData.ldap !== undefined) { - adStrategy = require('../models/Passport-ActiveDirectory'); -} -let DiscordStrategy; -if (setupData.discord !== undefined) { - DiscordStrategy = require('../models/Passport-Discord'); -} +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); }); -} else { } router.use(passport.initialize()); router.use(passport.session()); router.get('/login', function(req, res) { - const setupFilePath = path.join('setup.json'); + const setupFilePath = path.join('data', 'setup.json'); const setupData = JSON.parse(fs.readFileSync(setupFilePath, 'utf-8')); - res.render('AuthLogin', { setupData, isAuthenticated: false, errorMessage: '', showActiveDirectoryForm: true, currentUrl: req.originalUrl }); + 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); }); @@ -55,9 +63,11 @@ 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 = { @@ -65,8 +75,16 @@ router.post('/activedirectory', (req, res, next) => { name: user._json.sAMAccountName, id: user._json.sAMAccountName, }; + console.log('User object:', req.user); // Debug log req.logIn(req.user, function(err) { - if (err) { return next(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); diff --git a/routes/dpanel.js b/routes/dpanel.js index bf855d4..796f1a5 100644 --- a/routes/dpanel.js +++ b/routes/dpanel.js @@ -6,7 +6,7 @@ const fileUpload = require('express-fileupload'); const authMiddleware = require('../Middlewares/authMiddleware'); const { loggers } = require('winston'); const ncp = require('ncp').ncp; -const configFile = fs.readFileSync('setup.json'); +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'); @@ -42,8 +42,10 @@ router.get('/dashboard', authMiddleware, async (req, res) => { let fileInfoNames = []; try { - const fileInfo = JSON.parse(fs.readFileSync('file_info.json', 'utf8')); + 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); } @@ -88,8 +90,20 @@ router.get('/dashboard/folder/:folderName', authMiddleware, async (req, res) => const domain = config.domain || 'mydomain.com'; const currentFolderName = folderName || ''; - const data = await fs.promises.readFile('user.json', 'utf8'); - const users = JSON.parse(data); + 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) { @@ -98,8 +112,20 @@ router.get('/dashboard/folder/:folderName', authMiddleware, async (req, res) => const userRealId = user.id; - const fileInfoData = await fs.promises.readFile('file_info.json', 'utf8'); - const fileInfo = JSON.parse(fileInfoData); + 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); @@ -219,7 +245,7 @@ router.post('/dashboard/rename', authMiddleware, async (req, res) => { try { await fs.promises.rename(currentPath, newPath); - const data = await fs.promises.readFile('file_info.json', 'utf8'); + const data = await fs.promise.readFileSync(path.join(__dirname, '../data', 'file_info.json'), 'utf-8') let fileInfo = JSON.parse(data); let found = false; @@ -232,7 +258,7 @@ router.post('/dashboard/rename', authMiddleware, async (req, res) => { } if (found) { - await fs.promises.writeFile('file_info.json', JSON.stringify(fileInfo, null, 2), 'utf8'); + 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.'); @@ -257,7 +283,7 @@ router.post('/dashboard/rename/:filePath*', authMiddleware, async (req, res) => try { await fs.promises.rename(currentPath, newPath); - const data = await fs.promises.readFile('file_info.json', 'utf8'); + const data = await fs.promises.readFile(path.join(__dirname, '../data', 'file_info.json'), 'utf8'); let fileInfo = JSON.parse(data); let found = false; @@ -270,7 +296,7 @@ router.post('/dashboard/rename/:filePath*', authMiddleware, async (req, res) => } if (found) { - await fs.promises.writeFile('file_info.json', JSON.stringify(fileInfo, null, 2), 'utf8'); + 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.'); @@ -338,7 +364,7 @@ router.post('/dashboard/movefile', authMiddleware, async (req, res) => { const fileName = req.body.fileName; const folderName = req.body.folderName; - const data = await fs.promises.readFile('user.json', 'utf8'); + 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); @@ -526,12 +552,12 @@ router.post('/upload', authMiddleware, async (req, res) => { if (expiryDate || password) { let data = []; - if (fs.existsSync('file_info.json')) { - const existingData = await fs.promises.readFile('file_info.json', 'utf8'); + 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('file_info.json', JSON.stringify(data, null, 2)); + await fs.promises.writeFile(path.join(__dirname, '../data', 'file_info.json'), JSON.stringify(data, null, 2)); } res.redirect('/dpanel/dashboard'); @@ -542,8 +568,8 @@ router.post('/upload', authMiddleware, async (req, res) => { } }); -const User = require('../user.json'); -const setup = JSON.parse(fs.readFileSync(path.join(__dirname, '../setup.json'), 'utf8')); +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 { @@ -560,7 +586,7 @@ router.get('/dashboard/admin/users', authMiddleware, async (req, res) => { let currentPage = Number(req.query.page) || 1; let limit = Number(req.query.limit) || 10; - let rawdata = fs.readFileSync(path.join(__dirname, '../user.json')); + let rawdata = fs.readFileSync(path.join(__dirname, '../data/user.json')); let users = JSON.parse(rawdata); let totalUsers = users.length; @@ -591,7 +617,7 @@ 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) => { +router.get('/dashboard/admin/stats-logs', authMiddleware, async (req, res) => { try { const uptime = os.uptime(); const memoryUsage = process.memoryUsage().heapUsed / 1024 / 1024; @@ -626,7 +652,7 @@ router.get('/dashboard/admin/stats&logs', authMiddleware, async (req, res) => { } }); -router.get('/dashboard/admin/Privacy&Security', authMiddleware, async (req, res) => { +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 => { @@ -658,7 +684,7 @@ router.post('/dashboard/update-role', authMiddleware, async (req, res) => { user.role = role; } - fs.writeFileSync(path.join(__dirname, '../user.json'), JSON.stringify(User, null, 2)); + fs.writeFileSync(path.join(__dirname, '../data/user.json'), JSON.stringify(User, null, 2)); res.redirect('/dpanel/dashboard/admin'); } catch (err) { @@ -669,7 +695,7 @@ router.post('/dashboard/update-role', authMiddleware, async (req, res) => { router.post('/dashboard/update-setup', authMiddleware, async (req, res) => { try { - let setup = JSON.parse(fs.readFileSync(path.join(__dirname, '../setup.json'))); + 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; @@ -686,7 +712,7 @@ router.post('/dashboard/update-setup', authMiddleware, async (req, res) => { setup.domain = req.body.domain; setup.uptime = req.body.uptime; - fs.writeFileSync(path.join(__dirname, '../setup.json'), JSON.stringify(setup, null, 2)); + fs.writeFileSync(path.join(__dirname, '../data', 'setup.json'), 'utf-8'), JSON.stringify(setup, null, 2); res.redirect('/dpanel/dashboard/admin'); } catch (err) { diff --git a/routes/index.js b/routes/index.js index 75cc18c..7fb32d2 100644 --- a/routes/index.js +++ b/routes/index.js @@ -71,7 +71,7 @@ router.get('/translateAll', async (req, res) => { }); router.get('/setup', (req, res) => { - fs.readFile(path.join(__dirname, '../setup.json'), 'utf8', (err, data) => { + fs.readFile(path.join(__dirname, '../data/setup.json'), 'utf8', (err, data) => { if (err) { ErrorLogger.error('Error reading setup.json:', err); return res.status(500).json({ success: false, message: 'Error reading setup.json.' }); @@ -101,7 +101,7 @@ router.post('/setup/save', (req, res) => { setupData.discord = req.body.discord; } - fs.writeFile(path.join(__dirname, '../setup.json'), JSON.stringify(setupData, null, 2), (err) => { + fs.writeFile(path.join(__dirname, '../data/setup.json'), JSON.stringify(setupData, null, 2), (err) => { if (err) { ErrorLogger.error('Error writing to setup.json:', err); return res.status(500).json({ success: false, message: 'Error writing to setup.json.' }); diff --git a/server.js b/server.js index 68d1195..a5cb6c6 100644 --- a/server.js +++ b/server.js @@ -16,7 +16,7 @@ require('./models/fileCreated.js'); let setup; try { - setup = JSON.parse(fs.readFileSync('setup.json', 'utf8')); + setup = JSON.parse(fs.readFileSync(path.join('/data', 'setup.json'), 'utf8')); } catch (err) { console.error('Error reading setup.json:', err); process.exit(1); @@ -32,7 +32,7 @@ if (setup.ldap !== undefined) { app.use(express.static(path.join(__dirname, 'public'))); -app.get(['/user.json', '/file_info.json', '/setup.json'], (req, res) => { +app.get(['/data/user.json', '/data/file_info.json', '/data/setup.json'], (req, res) => { res.status(403).send('Access Denied'); });app.use(express.urlencoded({ extended: true })); diff --git a/setup.py b/setup.py deleted file mode 100644 index 9ac8c56..0000000 --- a/setup.py +++ /dev/null @@ -1,95 +0,0 @@ -import json -import os -from getpass import getpass - -setup_file_path = '/home/cdn-app/setup.json' # Specify the full path for setup.json - -setup_data = {} - -def print_with_color(text, color): - colors = { - 'reset': '\033[0m', - 'green': '\033[92m', - 'yellow': '\033[93m', - 'cyan': '\033[96m', - 'bold': '\033[1m' - } - print(f"{colors[color]}{text}{colors['reset']}") - -def create_service(): - service_name = 'cdn.service' - # Create the service file - service_file_path = f'/etc/systemd/system/{service_name}' - with open(service_file_path, 'w') as service_file: - service_file.write(f''' -[Unit] -Description=CDN-APP, dinawoSR Inc -Documentation=https://cdn-app.dinawo.fr - -[Service] -ExecStart=/root/.nvm/versions/node/v16.9.0/bin/node /home/cdn-app/server.js -Restart=always -User=root -Environment=PATH=/usr/bin:/usr/local/bin:/root/.nvm/versions/node/v16.9.0/bin -Environment=NODE_ENV=production -WorkingDirectory=/home/cdn-app - - -[Install] -WantedBy=multi-user.target -''') - - # Restart systemd to acknowledge the new service - os.system('systemctl daemon-reload') - os.system('systemctl enable cdn.service') - os.system('systemctl start cdn.service') - - print_with_color(f"Service {service_name} created successfully.", 'green') - -# Loader -print_with_color("Welcome to server configuration script.", 'cyan') - -# Change the current working directory to /home/cdn-app -os.chdir('/home/cdn-app') - -# LDAP information input -setup_data['ldap'] = { - 'url': input("LDAP server URL (ldap://your-ip): "), - 'baseDN': input("Base DN (DC=DINAWOSRINC,DC=LAN): "), - 'username': input("Username (Account Sync): "), - 'password': getpass("Password (Password Account Sync): ") -} - -# Prompt for domain name -setup_data['domain'] = input("Enter the domain name (cdn.domain.com): ") - -# Prompt for uptime link -setup_data['uptime'] = input("Enter the uptime link (uptime.domain.com): ") - -# Check Node.js version -node_version = os.popen('node -v').read().strip() -required_node_version = 'v16.9.0' -if node_version != required_node_version: - print_with_color(f"Error: Incorrect Node.js version. Required: {required_node_version}, Found: {node_version}.", 'yellow') - exit(1) - - -# Update npm packages with proper permissions -os.system('npm install') - - -# Set full permissions for /home/cdn-app -os.system('chown -R root:root /home/cdn-app') -os.system('chmod -R 777 /home/cdn-app') - -# Check and modify file permissions -os.system('chmod +x /home/cdn-app/server.js') - -# Save information in the setup.json file -with open(setup_file_path, 'w') as file: - json.dump(setup_data, file) - -print_with_color(f"Configuration saved in the {setup_file_path} file.", 'green') - -# Create the service -create_service() diff --git a/views/paramAdmin.ejs b/views/paramAdmin.ejs index 2684e57..4e688c5 100644 --- a/views/paramAdmin.ejs +++ b/views/paramAdmin.ejs @@ -64,10 +64,10 @@ Modifier les parametres de configuration
- + Afficher les statistiques & les logs
- + Confidentialité & Sécurité