Update .gitignore and add new dependencies and routes
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2024-04-02 20:59:13 +02:00
parent aa75d50361
commit 8f3e604774
16 changed files with 823 additions and 187 deletions

3
.gitignore vendored
View File

@@ -4,4 +4,5 @@
/user.json
/setup.json
/file_info.json
/node_modules/
/node_modules/
/data/

13
DockerCompse.template Normal file
View File

@@ -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:

View File

@@ -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);

View File

@@ -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;

View File

@@ -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 = {

View File

@@ -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;

View File

@@ -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;

View File

@@ -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.`);

631
package-lock.json generated
View File

@@ -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",

View File

@@ -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",

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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.' });

View File

@@ -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 }));

View File

@@ -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()

View File

@@ -64,10 +64,10 @@
<a class="dropdown-item text-center text-white no-hover custom-btn" href="/dpanel/dashboard/admin/settingsetup" id="adminLink2">
<i class="fas fa-cogs"></i> Modifier les parametres de configuration
</a><br>
<a class="dropdown-item text-center text-white no-hover custom-btn" href="/dpanel/dashboard/admin/stats&logs" id="adminLink3">
<a class="dropdown-item text-center text-white no-hover custom-btn" href="/dpanel/dashboard/admin/stats-logs" id="adminLink3">
<i class="fas fa-chart-bar"></i> Afficher les statistiques & les logs
</a><br>
<a class="dropdown-item text-center text-white no-hover custom-btn" href="/dpanel/dashboard/admin/Privacy&Security" id="adminLink4">
<a class="dropdown-item text-center text-white no-hover custom-btn" href="/dpanel/dashboard/admin/Privacy-Security" id="adminLink4">
<i class="fas fa-shield-alt"></i> Confidentialité & Sécurité
</a><br><br>
<a class="dropdown-item text-center text-white no-hover custom-btn" href="/dpanel/dashboard/" id="adminLink5">