Update v1.1.0-beta.1
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
2024-12-21 18:16:25 +01:00
parent f7658eca22
commit 51d11a6c36
20 changed files with 2688 additions and 935 deletions

263
server.js
View File

@@ -1,151 +1,176 @@
require('dotenv').config();
const express = require('express');
const session = require('express-session');
const passport = require('passport');
const bodyParser = require('body-parser');
const { logger, logRequestInfo, ErrorLogger } = require('./config/logs');
const path = require("path");
const { version } = require('./package.json');
const axios = require('axios');
const path = require('path');
const flash = require('connect-flash');
const crypto = require('crypto');
const fs = require('fs');
const SystemReport = require('./models/reportManager.js');
const routes = require('./routes/routes.js');
const fs = require('fs').promises;
const cron = require('node-cron');
const chalk = require('chalk');
require('dotenv').config();
// Import des services et configurations
const { logger, logRequestInfo, ErrorLogger } = require('./config/logs');
const { version } = require('./package.json');
const routes = require('./routes/routes.js');
const fileCleanup = require('./services/fileCleanupService');
const reportManager = require('./services/reportService.js');
// Configuration de l'application
const app = express();
const PORT = process.env.PORT || 5053;
app.set('trust proxy', 1);
// Import des modèles requis
require('./models/fileCreated.js');
let setup;
try {
setup = JSON.parse(fs.readFileSync(path.join(__dirname, 'data', 'setup.json'), 'utf8'));
} catch (err) {
console.error('Error reading setup.json:', err);
setup = {};
}
if (setup.discord !== undefined) {
require('./models/Passport-Discord.js');
}
if (setup.ldap !== undefined) {
require('./models/Passport-ActiveDirectory.js');
}
app.use(express.static(path.join(__dirname, 'public')));
app.get(['/data/user.json', '/data/file_info.json', '/data/setup.json'], (req, res) => {
res.status(403).json({ error: 'Access Denied. You do not have permission to access this resource.' });
});
app.use(express.urlencoded({ extended: true }));
function generateSecretKey() {
return crypto.randomBytes(64).toString('hex');
}
app.use(session({
secret: generateSecretKey(),
resave: false,
saveUninitialized: true,
cookie: { secure: false }
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(flash());
app.use('/public', express.static(path.join(__dirname, 'public')));
app.set('view engine', 'ejs');
app.set('views', __dirname + '/views');
app.use(routes);
app.use(logRequestInfo);
cron.schedule('00 03 * * *', async () => {
// Lecture du fichier de configuration
const loadSetup = async () => {
try {
const report = await SystemReport.generate();
if (report !== null) {
logger.info('System error report generated successfully');
}
const setupPath = path.join(__dirname, 'data', 'setup.json');
const setupData = await fs.readFile(setupPath, 'utf8');
return JSON.parse(setupData);
} catch (err) {
ErrorLogger.error('Error generating report :', err);
logger.error('Error reading setup.json:', err);
return {};
}
});
};
cron.schedule('0 * * * *', async () => {
try {
const fileInfoData = await fs.promises.readFile(path.join(__dirname, '/data/', 'file_info.json'), 'utf8');
const fileInfo = JSON.parse(fileInfoData);
// Configuration de l'application
const configureApp = async () => {
const setup = await loadSetup();
const now = new Date();
// Configuration des stratégies d'authentification
if (setup.discord) require('./models/Passport-Discord.js');
if (setup.ldap) require('./models/Passport-ActiveDirectory.js');
for (let index = fileInfo.length - 1; index >= 0; index--) {
const file = fileInfo[index];
const expiry = new Date(file.expiryDate);
// Middleware de base
app.set('trust proxy', 1);
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
if ((file.expiryDate && expiry <= now) || !(await fileExists(file.path))) {
fileInfo.splice(index, 1);
}
// Gestionnaire de favicon.ico
app.get('/favicon.ico', (req, res) => {
res.status(204).end();
});
// Protection des fichiers sensibles
app.get(['/data/user.json', '/data/file_info.json', '/data/setup.json'],
(req, res) => res.status(403).json({ error: 'Access Denied' }));
// Configuration des middlewares
app.use(express.static(path.join(__dirname, 'public')));
app.use('/public', express.static(path.join(__dirname, 'public')));
app.use(express.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(session({
secret: crypto.randomBytes(64).toString('hex'),
resave: false,
saveUninitialized: true,
cookie: {
secure: process.env.NODE_ENV === 'production',
maxAge: 24 * 60 * 60 * 1000
}
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
app.use(logRequestInfo);
app.use(routes);
logger.info('Successfully checked file expirations and updated file_info.json');
} catch (err) {
ErrorLogger.error(`Failed to check file expirations: ${err}`);
}
});
async function fileExists(filePath) {
try {
await fs.promises.access(filePath);
return true;
} catch {
return false;
}
}
function getAllFiles(dirPath, arrayOfFiles) {
const files = fs.readdirSync(dirPath);
arrayOfFiles = arrayOfFiles || [];
files.forEach(function(file) {
if (fs.statSync(dirPath + "/" + file).isDirectory()) {
arrayOfFiles = getAllFiles(dirPath + "/" + file, arrayOfFiles);
app.use((req, res, next) => {
if (req.accepts('html')) {
res.status(404).render('unauthorized', { url: req.url });
} else {
arrayOfFiles.push(path.join(dirPath, "/", file));
// Pour les requêtes API ou autres
res.status(404).json({ error: 'Not Found' });
}
});
return arrayOfFiles;
}
app.use((err, req, res, next) => {
ErrorLogger.error('Unhandled error:', err);
res.status(500).json(response);
});
};
const allFiles = getAllFiles(__dirname);
process.removeAllListeners('warning');
process.on('warning', (warning) => {
if (warning.name === 'DeprecationWarning' && warning.message.includes('punycode')) {
return;
}
console.warn(warning.name, warning.message);
});
const SERVER = process.env.PORT || 5053;
app.listen(SERVER, () => {
SERVER.timeout = 300000
allFiles.forEach(file => {
// Configuration des tâches planifiées
const configureCronJobs = () => {
console.log(`[ ${chalk.green('OK')} ] Loaded file: ${file}`);
// Service de nettoyage des fichiers
fileCleanup.start();
// Service de rreport système
reportManager.start();
};
// Utilitaires pour la vérification des fichiers
const fileUtils = {
async fileExists(filePath) {
try {
await fs.access(filePath);
return true;
} catch {
return false;
}
}
};
// Démarrage du serveur
const startServer = () => {
const server = app.listen(PORT, () => {
server.timeout = 300000;
console.clear()
if (logger) {
logger.info('☀️ Welcome to the Content Delivery Network Server');
logger.info(`🚀 Server running on port ${PORT}`);
logger.info(`⚜️ Application developed by Dinawo, part of the Myaxrin Labs group`);
logger.info(`♨️ Version: ${version}`);
} else {
console.error('🔴 Logger is not initialized');
}
});
console.clear();
if (logger) {
logger.info(`☀️ Welcome to the Content Delivery Network Server`);
logger.info(`🚀 Your server is available and running on port ${SERVER}`);
logger.info(`⚜️ Application developed by Dinawo, part of the Myaxrin Labs group`);
logger.info(`♨️ Version: ${version}`);
console.log('');
} else {
console.error('🔴 Logger is not initialized');
return server;
};
// Gestion des erreurs globales
const configureErrorHandling = () => {
process.on('uncaughtException', (err) => {
ErrorLogger.error('Uncaught Exception:', err);
});
process.on('unhandledRejection', (reason, promise) => {
ErrorLogger.error('Unhandled Rejection at:', promise, 'reason:', reason);
});
};
// Initialisation de l'application
const initializeApp = async () => {
try {
configureErrorHandling();
await configureApp();
configureCronJobs();
const server = startServer();
return server;
} catch (err) {
logger.error('Failed to initialize application:', err);
process.exit(1);
}
});
};
// Démarrage de l'application
initializeApp();
// Export pour les tests
module.exports = { app, fileUtils };