This commit is contained in:
263
server.js
263
server.js
@@ -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 };
|
||||
Reference in New Issue
Block a user