From 44631acfc6d63bfee639238d700fa9a36dcf866a Mon Sep 17 00:00:00 2001 From: Dinawo Date: Fri, 12 Jul 2024 18:13:03 +0200 Subject: [PATCH] Urgent correction of version v1.0.0-beta.14 due to crash issues when acting on the CDN. --- .drone.yml | 2 +- .idea/.gitignore | 5 + .idea/CDN-APP-INSIDER.iml | 12 + .idea/discord.xml | 7 + .idea/jsLibraryMappings.xml | 6 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + Middlewares/UserIDMiddlewareAD.js | 6 +- Middlewares/UserIDMiddlewareDiscord.js | 29 ++- Middlewares/watcherMiddleware.js | 4 +- models/Passport-ActiveDirectory.js | 4 +- models/Passport-Discord.js | 108 ++++++--- models/UserManagment.js | 47 ---- package-lock.json | 18 +- package.json | 7 +- public/css/upload.css | 33 ++- public/js/dashboard.js | 189 +++++---------- routes/Auth/ActiveDirectory.js | 26 ++- routes/Auth/Discord.js | 71 +++--- routes/BuildMetaData.js | 6 +- server.js | 9 +- views/AuthLogin.ejs | 305 ++++++++++++++++++------- views/acces-denied.ejs | 46 +++- views/dashboard.ejs | 174 +++++++------- views/folder.ejs | 29 +-- views/paramAdmin.ejs | 48 ++-- views/paramAdminUser.ejs | 33 ++- 27 files changed, 704 insertions(+), 534 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/CDN-APP-INSIDER.iml create mode 100644 .idea/discord.xml create mode 100644 .idea/jsLibraryMappings.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml delete mode 100644 models/UserManagment.js diff --git a/.drone.yml b/.drone.yml index a33dd31..b072763 100644 --- a/.drone.yml +++ b/.drone.yml @@ -20,7 +20,7 @@ steps: repo: swiftlogiclabs/cdn-app-insider tags: - latest - - v1.0.0-beta.13 + - v1.0.0-beta.14 dockerfile: Dockerfile username: from_secret: docker_username diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..b58b603 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/CDN-APP-INSIDER.iml b/.idea/CDN-APP-INSIDER.iml new file mode 100644 index 0000000..0c8867d --- /dev/null +++ b/.idea/CDN-APP-INSIDER.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml new file mode 100644 index 0000000..d8e9561 --- /dev/null +++ b/.idea/discord.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml new file mode 100644 index 0000000..d23208f --- /dev/null +++ b/.idea/jsLibraryMappings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..7588260 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Middlewares/UserIDMiddlewareAD.js b/Middlewares/UserIDMiddlewareAD.js index cf852a8..faef4af 100644 --- a/Middlewares/UserIDMiddlewareAD.js +++ b/Middlewares/UserIDMiddlewareAD.js @@ -33,9 +33,9 @@ async function checkUserExistsAD(req, res, next) { } else if (req.user.id) { existingUser = users.find(u => u.id === req.user.id); } - + if (!existingUser) { - const id = Math.floor(Math.random() * 1e19); + const id = Math.floor(Math.random() * 1e19); const newUser = { id: id.toString(), name: req.user.name || req.user.id, @@ -55,7 +55,7 @@ async function checkUserExistsAD(req, res, next) { } else { req.user = existingUser; req.session.userId = existingUser.id; - res.render('AuthLogin', { isAuthenticated: true, setupData: {}, currentUrl: req.originalUrl, errorMessage: '' }); + res.status(200).render('AuthLogin', { isAuthenticated: true, setupData: {}, currentUrl: req.originalUrl, errorMessage: '' }); } return next(); diff --git a/Middlewares/UserIDMiddlewareDiscord.js b/Middlewares/UserIDMiddlewareDiscord.js index 00f83aa..7baa69d 100644 --- a/Middlewares/UserIDMiddlewareDiscord.js +++ b/Middlewares/UserIDMiddlewareDiscord.js @@ -12,7 +12,17 @@ async function getUserData() { throw err; } } -let userData = getUserData(); + +let userData; + +(async () => { + try { + userData = await getUserData(); + } catch (err) { + console.error(`Failed to initialize userData: ${err}`); + process.exit(1); + } +})(); async function checkUserExistsDiscord(req, res, next) { if (!req.user || (!req.user.username && !req.user.id)) { @@ -20,19 +30,18 @@ async function checkUserExistsDiscord(req, res, next) { } try { - let users = userData; + let userData = await getUserData(); let existingUser; if (req.user.username) { - existingUser = users.find(u => u.name === req.user.username); + existingUser = userData.find(u => u.name === req.user.username); } else if (req.user.id) { - existingUser = users.find(u => u.id === req.user.id); + existingUser = userData.find(u => u.id === req.user.id); } if (existingUser) { req.user.id = existingUser.id; - res.redirect('/dpanel/dashboard'); - return; + return res.redirect('/dpanel/dashboard'); } const newUser = { @@ -40,9 +49,10 @@ async function checkUserExistsDiscord(req, res, next) { name: req.user.username, role: "user" }; - users.push(newUser); - await fs.writeFile(filePath, JSON.stringify(users, null, 2), 'utf8'); + userData.push(newUser); + + await fs.writeFile(filePath, JSON.stringify(userData, null, 2), 'utf8'); req.user.id = newUser.id; @@ -52,4 +62,5 @@ async function checkUserExistsDiscord(req, res, next) { } } -module.exports = { checkUserExistsDiscord }; \ No newline at end of file + +module.exports = { checkUserExistsDiscord }; diff --git a/Middlewares/watcherMiddleware.js b/Middlewares/watcherMiddleware.js index 5e5c19a..70ac5b6 100644 --- a/Middlewares/watcherMiddleware.js +++ b/Middlewares/watcherMiddleware.js @@ -28,14 +28,14 @@ watcher.on('change', (filePath) => { let modifiedFile; if (filePath === userFilePath) { try { - userData = JSON.parse(fs.readFileSync(filePath, 'utf-8')); + 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')); + setupData = JSON.parse(fs.readFileSync(filePath, 'utf-8')); modifiedFile = 'setup.json'; } catch (error) { logger.error(`Error parsing setup.json: ${error}`); diff --git a/models/Passport-ActiveDirectory.js b/models/Passport-ActiveDirectory.js index a3c30fe..ac1c421 100644 --- a/models/Passport-ActiveDirectory.js +++ b/models/Passport-ActiveDirectory.js @@ -34,9 +34,9 @@ passport.serializeUser((user, done) => { passport.deserializeUser(async (id, done) => { const users = await getUserData(); - + const user = users.find(u => u.name === id || u.name === `.${id}`); - + if (user) { return done(null, user); } else { diff --git a/models/Passport-Discord.js b/models/Passport-Discord.js index 5b61a4a..f36dceb 100644 --- a/models/Passport-Discord.js +++ b/models/Passport-Discord.js @@ -3,44 +3,94 @@ const DiscordStrategy = require('passport-discord').Strategy; const fs = require('fs'); const path = require('path'); -const setupFilePath = path.join(__dirname, '../data', 'setup.json'); -const setupData = JSON.parse(fs.readFileSync(setupFilePath, 'utf-8')); +const setupFilePath = path.join(__dirname, '../data', 'setup.json'); + +let setupData; +try { + setupData = JSON.parse(fs.readFileSync(setupFilePath, 'utf-8')); + console.log('Setup data loaded:', setupData); +} catch (err) { + console.error('Error reading setup.json:', err); +} + +const callbackURL = `http://${setupData[0].domain}/auth/discord/callback`; +console.log(`Callback URL: ${callbackURL}`); passport.use(new DiscordStrategy({ - 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) { - return done(err); - } - - const users = JSON.parse(data); - const user = users.find(user => user.id === profile.id); + clientID: setupData[0].discord.clientID, + clientSecret: setupData[0].discord.clientSecret, + callbackURL: callbackURL +}, (accessToken, refreshToken, profile, done) => { + console.log('Discord profile received:', profile); - 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é.' }); - } + fs.readFile(path.join(__dirname, '../data', 'user.json'), 'utf8', (err, data) => { + if (err) { + console.error('Error reading user.json:', err); + return done(err); + } - done(null, user); + let users; + try { + users = JSON.parse(data); + } catch (parseErr) { + console.error('Failed to parse user.json:', parseErr); + return done(parseErr); + } + + let existingUser = users.find(user => user.id === profile.id); + + if (existingUser) { + console.log('Existing user found:', existingUser); + return done(null, existingUser); + } + + const newUser = { + id: profile.id, + name: profile.username, + role: "user" + }; + + users.push(newUser); + + fs.writeFile(path.join(__dirname, '../data', 'user.json'), JSON.stringify(users, null, 2), 'utf8', (err) => { + if (err) { + console.error('Error writing to user.json:', err); + return done(err); + } + console.log('New user created:', newUser); + done(null, newUser); + }); }); - })); - +})); + passport.serializeUser((user, done) => { - done(null, user); + console.log('Serializing user:', user); + done(null, user.id); }); passport.deserializeUser((id, done) => { - fs.readFile('/data', 'user.json', 'utf8', (err, data) => { - if (err) { - return done(err); - } + fs.readFile(path.join(__dirname, '../data', 'user.json'), 'utf8', (err, data) => { + if (err) { + return done(err); + } - const users = JSON.parse(data); - const user = users.find(user => user.id === id); - done(null, user); - }); + let users; + try { + users = JSON.parse(data); + } catch (parseErr) { + console.error('Failed to parse user data:', parseErr); + return done(parseErr); + } + + const user = users.find(user => user.id === id); + + if (!user) { + return done(null, false, { message: 'User not found.' }); + } + + console.log('Deserializing user:', user); + done(null, user); + }); }); -module.exports = passport; \ No newline at end of file +module.exports = passport; diff --git a/models/UserManagment.js b/models/UserManagment.js deleted file mode 100644 index b49ae3d..0000000 --- a/models/UserManagment.js +++ /dev/null @@ -1,47 +0,0 @@ -const mysql = require('mysql2/promise'); -const pool = require('../config/database'); - -const userSchema = { - username: { - type: 'VARCHAR(255)', - allowNull: false, - unique: true - }, - password: { - type: 'VARCHAR(255)', - allowNull: false - }, - isAdmin: { - type: 'BOOLEAN', - allowNull: false, - defaultValue: false - } -}; - -async function createUser(username, password, isAdmin) { - const connection = await pool.getConnection(); - try { - const [rows] = await connection.execute( - 'INSERT INTO cdn (username, password, isAdmin) VALUES (?, ?, ?)', - [username, password, isAdmin] - ); - return rows.insertId; - } finally { - connection.release(); - } -} - -async function getUserByUsername(username) { - const connection = await pool.getConnection(); - try { - const [rows] = await connection.execute('SELECT * FROM users WHERE username = ?', [username]); - return rows[0]; - } finally { - connection.release(); - } -} - -module.exports = { - createUser, - getUserByUsername -}; diff --git a/package-lock.json b/package-lock.json index db9f8ea..195d46e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@cdn-app/insider-swiftlogic-labs-dinawo", - "version": "1.0.0-beta.12", + "version": "1.0.0-beta.14", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@cdn-app/insider-swiftlogic-labs-dinawo", - "version": "1.0.0-beta.12", + "version": "1.0.0-beta.14", "license": "ISC", "dependencies": { "@auth/express": "^0.5.1", @@ -48,6 +48,7 @@ "path": "^0.12.7", "pg": "^8.11.3", "pg-promise": "^11.5.4", + "progress": "^2.0.3", "public-ip": "^6.0.1", "semver": "^7.5.4", "slugify": "^1.6.6", @@ -3895,6 +3896,14 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -8157,6 +8166,11 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", diff --git a/package.json b/package.json index f6418c4..e0907a7 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { - "name": "@cdn-app/insider-swiftlogic-labs-dinawo", - "version": "1.0.0-beta.13", + "name": "@cdn-app/insider-myaxrin-labs-dinawo", + "version": "1.0.0-beta.14", "description": "", "main": "server.js", "scripts": { "start": "node server.js" }, - "author": "Dinawo - Group SwiftLogic Labs", + "author": "Dinawo - Group Myaxrin Labs", "license": "ISC", "dependencies": { "@auth/express": "^0.5.1", @@ -48,6 +48,7 @@ "path": "^0.12.7", "pg": "^8.11.3", "pg-promise": "^11.5.4", + "progress": "^2.0.3", "public-ip": "^6.0.1", "semver": "^7.5.4", "slugify": "^1.6.6", diff --git a/public/css/upload.css b/public/css/upload.css index 6269ef6..0970f2f 100644 --- a/public/css/upload.css +++ b/public/css/upload.css @@ -82,23 +82,22 @@ body.dark-mode { } .custom-btn { - transition: transform 0.3s ease, background-color 0.3s ease, border-color 0.3s ease; - color: #007BFF; - background-color: transparent; - padding: 8px 16px; - text-decoration: none; - display: inline-block; - font-size: 14px; - margin: 4px 2px; - border-radius: 50px; + display: inline-flex; + align-items: center; + justify-content: center; + font-family: inherit; + font-weight: 500; + font-size: 14px; /* réduit la taille de la police */ + padding: 0.6em 1.2em; /* réduit le padding */ + color: white; + background: linear-gradient(0deg, rgba(77,54,208,1) 0%, rgba(132,116,254,1) 100%); + border: none; + box-shadow: 0 0.7em 1.5em -0.5em #4d36d0be; + letter-spacing: 0.05em; + border-radius: 15em; /* réduit le rayon de la bordure */ cursor: pointer; - box-shadow: 0 2px 5px rgba(0,0,0,0.25); - border: 2px solid #007BFF; -} - -.custom-btn:hover { - transform: scale(1.15); - background-color: #007BFF; - color: #fff; + transition: all 0.3s ease; + position: relative; + overflow: hidden; } diff --git a/public/js/dashboard.js b/public/js/dashboard.js index b7d0104..6e34042 100644 --- a/public/js/dashboard.js +++ b/public/js/dashboard.js @@ -1,4 +1,4 @@ - + document.addEventListener('DOMContentLoaded', function () { const copyButtons = document.querySelectorAll('.copy-button'); @@ -60,28 +60,6 @@ styleSwitcherButton.addEventListener('click', toggleDarkMode); - filterForm.addEventListener('submit', function (event) { - event.preventDefault(); - - const selectedExtension = extensionFilter.value.toLowerCase(); - const searchQuery = fileSearchInput.value.toLowerCase(); - - const fileList = document.querySelectorAll('tr[data-extension]'); - - fileList.forEach(file => { - const fileExtension = file.getAttribute('data-extension').toLowerCase(); - const fileName = file.querySelector('td:first-child').textContent.toLowerCase(); - - const extensionMatch = selectedExtension === '' || selectedExtension === fileExtension; - const searchMatch = fileName.includes(searchQuery); - - if (extensionMatch && searchMatch) { - file.style.display = ''; - } else { - file.style.display = 'none'; - } - }); - }); }); document.addEventListener('DOMContentLoaded', function () { @@ -204,111 +182,6 @@ } }; - function performUpdate() { - fetch('/applyupdate') - .then(response => response.json()) - .then(result => { - if (result.success) { - Swal.fire({ - title: 'Mise à jour réussie', - text: 'Votre application a été mise à jour avec succès.', - icon: 'success', - toast: true, - position: 'bottom-right', - showConfirmButton: false, - timer: 5000 - }); - } else { - Swal.fire({ - title: 'Mise à jour échouée', - text: 'Une erreur s\'est produite lors de la mise à jour de votre application.', - icon: 'error', - toast: true, - position: 'bottom-right', - showConfirmButton: false, - timer: 5000 - }); - } - }) - .catch(error => { - console.error('Erreur lors de la mise à jour :', error); - Swal.fire({ - text: 'Erreur lors de la mise à jour.', - icon: 'error', - toast: true, - position: 'bottom-right', - showConfirmButton: false, - timer: 5000 - }); - }); - } - - function checkUpdates() { - fetch('/checkupdate') - .then(response => response.json()) - .then(result => { - if (result.updateAvailable) { - Swal.fire({ - title: 'Nouvelle mise à jour disponible', - text: 'Voulez-vous mettre à jour votre application?', - icon: 'info', - showCancelButton: true, - confirmButtonText: 'Oui', - cancelButtonText: 'Non', - position: 'bottom-right', - toast: true, - }).then((result) => { - if (result.isConfirmed) { - performUpdate(); - } - }); - } else { - Swal.fire({ - title: 'Application à jour', - text: 'Votre application est à jour.', - icon: 'success', - toast: true, - position: 'bottom-right', - showConfirmButton: false, - timer: 5000 - }); - } - }) - .catch(error => { - console.error('Erreur lors de la vérification des mises à jour :', error); - Swal.fire({ - text: 'Erreur lors de la vérification des mises à jour.', - icon: 'error', - toast: true, - position: 'bottom-right', - showConfirmButton: false, - timer: 5000 - }); - }); - } - document.getElementById('checkUpdateButton').addEventListener('click', async function() { - const userName = await getLoggedInUserName(); - - fs.readFile('user.json', (err, data) => { - if (err) throw err; - let users = JSON.parse(data); - - const user = users.find(user => user.name === userName); - - if (user && user.role === 'admin') { - checkUpdates(); - } else { - Swal.fire({ - position: 'top', - icon: 'warning', - title: 'Vous n\'avez pas les droits pour effectuer cette action.', - showConfirmButton: false, - timer: 2600, - toast: true - }); - } - }); - }); var modal = document.getElementById('patchNoteModal'); @@ -386,7 +259,7 @@ function renameFile(folderName, currentName) { const fileExtensionIndex = currentName.lastIndexOf('.'); const fileExtension = currentName.substring(fileExtensionIndex); - + Swal.fire({ title: 'Entrez le nouveau nom', input: 'text', @@ -399,13 +272,13 @@ setTimeout(() => { const input = Swal.getInput(); const pos = input.value.lastIndexOf('.'); - input.setSelectionRange(0, pos); + input.setSelectionRange(0, pos); }, 0); } }).then((result) => { if (result.isConfirmed) { const newName = result.value; - + fetch(`/api/dpanel/dashboard/rename/${folderName}`, { method: 'POST', headers: { @@ -617,3 +490,57 @@ function closeModal() { const modal = document.getElementById('metadataModal'); modal.style.display = 'none'; } + + function moveFile(folderName, fileName) { + Swal.fire({ + title: 'Confirmer le déplacement du fichier', + text: `Voulez-vous déplacer le fichier ${fileName} vers ${folderName} ?`, + icon: 'warning', + showCancelButton: true, + confirmButtonText: 'Déplacer', + cancelButtonText: 'Annuler', + }).then((result) => { + if (result.isConfirmed) { + fetch('/api/dpanel/dashboard/movefile', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ fileName: fileName, folderName: folderName }), + }) + .then(response => { + if (!response.ok) { + throw new Error('Network response was not ok'); + } + return response.json(); + }) + .then(data => { + if (data.message === "File moved successfully") { + Swal.fire({ + position: 'top', + icon: 'success', + title: 'Le fichier a été déplacé avec succès.', + showConfirmButton: false, + timer: 1800, + toast: true, + }).then(() => { + location.reload(); + }); + } else { + throw new Error(data.error || 'Une erreur est survenue'); + } + }) + .catch((error) => { + Swal.fire({ + position: 'top', + icon: 'error', + title: 'Erreur lors du déplacement du fichier.', + showConfirmButton: false, + timer: 1800, + toast: true, + }); + }); + } + }); + } + diff --git a/routes/Auth/ActiveDirectory.js b/routes/Auth/ActiveDirectory.js index 5cf311b..9715670 100644 --- a/routes/Auth/ActiveDirectory.js +++ b/routes/Auth/ActiveDirectory.js @@ -14,10 +14,23 @@ const limiter = rateLimit({ router.post('/', limiter, (req, res, next) => { passport.authenticate('ActiveDirectory', (err, user) => { if (err) { - return res.json({ isAuthenticated: false, errorMessage: err.message, setupData: {}, showActiveDirectoryForm: true, currentUrl: req.originalUrl }); + console.error("Authentication error:", err); + return res.status(401).json({ + isAuthenticated: false, + errorMessage: err.message, + setupData: {}, + showActiveDirectoryForm: true, + currentUrl: req.originalUrl + }); } - if (!user) { - return res.json({ isAuthenticated: false, errorMessage: 'User is not authorized.', setupData: {}, showActiveDirectoryForm: true, currentUrl: req.originalUrl }); + if (!user) { + return res.status(401).json({ + isAuthenticated: false, + errorMessage: 'User is not authorized.', + setupData: {}, + showActiveDirectoryForm: true, + currentUrl: req.originalUrl + }); } req.user = { ...user._json, @@ -25,15 +38,16 @@ router.post('/', limiter, (req, res, next) => { id: user._json.sAMAccountName, }; req.logIn(req.user, function(err) { - if (err) { - return next(err); + if (err) { + return next(err); } req.session.user = req.user; - return next(); + return res.redirect('/dpanel/dashboard'); }); })(req, res, next); }, checkUserExistsAD); + module.exports = router; \ No newline at end of file diff --git a/routes/Auth/Discord.js b/routes/Auth/Discord.js index d95b7f3..25b9bce 100644 --- a/routes/Auth/Discord.js +++ b/routes/Auth/Discord.js @@ -4,26 +4,34 @@ const passport = require('passport'); const { checkUserExistsDiscord } = require('../../Middlewares/UserIDMiddlewareDiscord'); const { getUserData, getSetupData } = require('../../Middlewares/watcherMiddleware'); -let userData = getUserData(); let setupData; +let user; -getSetupData().then(data => { - setupData = data; +Promise.all([ + getSetupData(), + getUserData() +]).then(([setup, userData]) => { + setupData = setup; + user = userData; if (setupData[0].discord !== undefined) { const DiscordStrategy = require('../../models/Passport-Discord'); } - getUserData().then(user => { - if (user.identifyURL) { - router.get("/auth/discord", (req, res) => { - res.redirect(user.identifyURL); - }); + router.get("/auth/discord", (req, res) => { + if (user && user.identifyURL) { + res.redirect(user.identifyURL); + } else { + res.redirect('/auth/login'); } + }); - router.get("/", (req, res) => { + router.get("/", (req, res) => { + if (setupData && setupData.discord && setupData.discord.identifyURL) { res.redirect(setupData.discord.identifyURL); - }); + } else { + res.redirect('/auth/login'); + } }); }); @@ -34,35 +42,22 @@ passport.deserializeUser((user, done) => { done(null, user); }); -router.get('/callback', (req, res, next) => { - passport.authenticate('discord', (err, user, info) => { - if (err) { - return next(err); - } - - if (!user) { - return res.redirect('/auth/login'); - } - - req.logIn(user, (loginErr) => { - if (loginErr) { - return next(loginErr); - } - - checkUserExistsDiscord(req, res, () => { - if (req.userExists) { - return res.redirect('/dpanel/dashboard'); - } else { - createUser(req.user, (createErr) => { - if (createErr) { - return next(createErr); - } - return res.redirect('/dpanel/dashboard'); - }); +router.get('/callback', passport.authenticate('discord', { + failureRedirect: '/auth/login' +}), (req, res, next) => { + checkUserExistsDiscord(req, res, () => { + if (req.userExists) { + return res.redirect('/dpanel/dashboard'); + } else { + createUser(req.user, (createErr) => { + if (createErr) { + return next(createErr); } + return res.redirect('/dpanel/dashboard'); }); - }); - })(req, res, next); + } + }); }); -module.exports = router; \ No newline at end of file + +module.exports = router; diff --git a/routes/BuildMetaData.js b/routes/BuildMetaData.js index 7fdb031..9d54cf5 100644 --- a/routes/BuildMetaData.js +++ b/routes/BuildMetaData.js @@ -5,6 +5,7 @@ const child_process = require('child_process'); const packageJson = require('../package.json'); const fs = require('fs'); const path = require('path'); +const crypto = require('crypto'); function getAllFiles(dirPath, arrayOfFiles) { const files = fs.readdirSync(dirPath); @@ -51,11 +52,14 @@ router.get('/', async (req, res) => { build_version: version, node_version: process.version, express_version: expressVersion, - build_sha: child_process.execSync('git rev-parse HEAD').toString().trim(), + build_sha: '', os_type: os.type(), os_release: os.release(), }; + const hash = crypto.createHash('md5'); + hash.update(buildMetadata.build_version); + buildMetadata.build_sha = hash.digest('hex').substring(0, 32); res.json(buildMetadata); } catch (error) { diff --git a/server.js b/server.js index de33ab3..68b88a2 100644 --- a/server.js +++ b/server.js @@ -129,10 +129,9 @@ function getAllFiles(dirPath, arrayOfFiles) { const allFiles = getAllFiles(__dirname); - -const PORT = process.env.PORT || 5053; -app.listen(PORT, () => { - +const SERVER = process.env.PORT || 5053; +app.listen(SERVER, () => { + SERVER.timeout = 300000 allFiles.forEach(file => { console.log(`[ ${chalk.green('OK')} ] Loaded file: ${file}`); @@ -141,7 +140,7 @@ app.listen(PORT, () => { console.clear(); if (logger) { logger.info(`☀️ Welcome to the Content Delivery Network Server`); - logger.info(`🚀 Your server is available and running on port ${PORT}`); + 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(''); diff --git a/views/AuthLogin.ejs b/views/AuthLogin.ejs index 58fb831..57bf683 100644 --- a/views/AuthLogin.ejs +++ b/views/AuthLogin.ejs @@ -13,82 +13,162 @@ -
-

Connexion

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

Connexion avec Active Directory

-
- <% if (typeof errorMessage !== 'undefined' && errorMessage) { %> - <% } %> - -
- - -
- -
- - -
- - -
- <% } %> - <% if (typeof setupData.discord !== 'undefined') { %> - <% if (typeof setupData.ldap !== 'undefined') { %> -

Ou

+
+

Connexion

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

Connexion avec Active Directory

+
+ <% if (typeof errorMessage !== 'undefined' && errorMessage) { %> <% } %> - - <% } %> -
-
- -
+
+ <% } %> + <% if (Array.isArray(setupData)) { %> + <% setupData.forEach(config => { %> + <% if (config.hasOwnProperty('discord') && config.discord.enabled === 'on') { %> + <% if (config.hasOwnProperty('ldap') && config.ldap.enabled === 'on') { %> +

Ou

+ <% } %> + + <% } %> + <% }); %> + <% } %> +
+
+
+
@@ -114,34 +194,89 @@ }); }); - var isAuthenticated = "<%= isAuthenticated %>" === "true"; - var errorMessage = '<%= errorMessage %>'; + document.addEventListener('DOMContentLoaded', function() { + const loginForm = document.getElementById('loginForm'); + const loginButton = document.getElementById('loginButton'); - if (isAuthenticated) { - Swal.fire({ - position: 'top', - icon: 'success', - title: 'Authentification réussie!', - text: 'Vous allez être redirigé vers le tableau de bord.', - showConfirmButton: false, - timer: 1800, - timerProgressBar: true, - toast: true, - willClose: () => { - window.location.replace('/dpanel/dashboard'); + loginForm.addEventListener('submit', function(e) { + e.preventDefault(); + + const username = document.getElementById('username').value; + const password = document.getElementById('password').value; + + loginButton.disabled = true; + loginButton.innerHTML = 'Connexion en cours...'; + loginButton.classList.add('processing'); + + fetch('/auth/activedirectory', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ username, password }), + redirect: 'follow', + }) + .then(response => { + console.log('Statut de la réponse:', response.status); + console.log('URL finale:', response.url); + if (response.url.includes('/dpanel/dashboard')) { + handleAuthResult(loginButton, true); + } else { + return response.text().then(text => { + console.log('Texte reçu:', text); + handleAuthResult(loginButton, false); + }); + } + }) + .catch(error => { + console.error('Erreur:', error); + handleAuthResult(loginButton, false); + }); + }); + + function handleAuthResult(loginButton, isSuccess) { + loginButton.classList.remove('processing'); + loginButton.classList.add(isSuccess ? 'success' : 'failure'); + + const iconSVG = isSuccess ? ` + + + + + ` : ` + + + + + `; + + loginButton.innerHTML = iconSVG; + + if (isSuccess) { + setTimeout(() => { + console.log("Redirection vers /dpanel/dashboard"); + window.location.replace('/dpanel/dashboard'); + }, 1000); + } else { + setTimeout(() => { + loginButton.classList.remove('failure'); + loginButton.innerHTML = 'Se connecter'; + loginButton.disabled = false; + }, 1500); } - }); - } else if (errorMessage) { - Swal.fire({ - position: 'top', - icon: 'error', - title: 'Erreur lors de l\'authentification!', - text: 'Merci de reessayer.', - showConfirmButton: false, - timer: 2200, - timerProgressBar: true, - toast: true, - }); + } + }); + + function redirectToDiscord(url) { + const discordButton = document.getElementById('discordButton'); + + discordButton.classList.add('btn-fill'); + discordButton.innerHTML = 'Redirection en cours...'; + discordButton.disabled = true; + + setTimeout(() => { + window.location.href = url; + }, 1000); } diff --git a/views/acces-denied.ejs b/views/acces-denied.ejs index 7161f11..70bd24b 100644 --- a/views/acces-denied.ejs +++ b/views/acces-denied.ejs @@ -1,14 +1,38 @@ - - - - 401 Authorization Required + + + + + + 403 ERROR + -

401 Authorization Required

-
-
-
- SwiftLogic Labs -
+

403 ERROR

+

The request could not be satisfied.

+

Request blocked. We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner.

+

Generated by Myaxrin Nexus (Security Department)

+

Request ID:

+

Timestamp:

- \ No newline at end of file + diff --git a/views/dashboard.ejs b/views/dashboard.ejs index 2e94c44..ab93e68 100644 --- a/views/dashboard.ejs +++ b/views/dashboard.ejs @@ -67,8 +67,8 @@ Administration du site - <% } %> - + <% } %> +

Déconnexion
@@ -76,88 +76,87 @@ - +
- - - - - + + + + + - <% files.forEach(file => { %> - - <% if (fileInfoNames.includes(file.name)) { %> - + <% files.forEach(file => { %> + + <% if (fileInfoNames.includes(file.name)) { %> + + <% } else { %> + + <% } %> + + <% + const fileSizeInBytes = file.size; + let fileSize; + if (fileSizeInBytes < 1024 * 1024) { + fileSize = `${(fileSizeInBytes / 1024).toFixed(2)} Ko`; + } else if (fileSizeInBytes < 1024 * 1024 * 1024) { + fileSize = `${(fileSizeInBytes / (1024 * 1024)).toFixed(2)} Mo`; + } else { + fileSize = `${(fileSizeInBytes / (1024 * 1024 * 1024)).toFixed(2)} Go`; + } + %> + <%= fileSize %> <% } %> - - + - - <% }); %> + + + + + + + + <% } %> + + + <% }); %>
Nom du fichierTailleAction
Nom du fichierTailleAction
<%= file.name %>
<%= file.name %><%= file.name %> + <% if (file.type === 'folder') { %> + Dossier <% } else { %> - <%= file.name %> - <% if (file.type === 'folder') { %> - Dossier - <% } else { %> - <% - const fileSizeInBytes = file.size; - let fileSize; - if (fileSizeInBytes < 1024 * 1024) { - fileSize = `${(fileSizeInBytes / 1024).toFixed(2)} Ko`; - } else if (fileSizeInBytes < 1024 * 1024 * 1024) { - fileSize = `${(fileSizeInBytes / (1024 * 1024)).toFixed(2)} Mo`; - } else { - fileSize = `${(fileSizeInBytes / (1024 * 1024 * 1024)).toFixed(2)} Go`; - } - %> - <%= fileSize %> - <% } %> - - <% if (file.type === 'folder') { %> -
- -
+ <% if (file.type === 'folder') { %> + + + + + + Accéder + + <% } else { %> + +
+ + + +
+
+
@@ -167,27 +166,31 @@
+ @@ -230,12 +234,12 @@
-

© 2024 SwiftLogic Labs

+

© 2024 Myaxrin Labs

diff --git a/views/folder.ejs b/views/folder.ejs index 68acea0..2656947 100644 --- a/views/folder.ejs +++ b/views/folder.ejs @@ -140,18 +140,19 @@ -
- - - - -
+
+ + + + + +
<% } %> @@ -173,9 +174,9 @@
diff --git a/views/paramAdmin.ejs b/views/paramAdmin.ejs index 4e688c5..fa16601 100644 --- a/views/paramAdmin.ejs +++ b/views/paramAdmin.ejs @@ -13,32 +13,28 @@