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 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 (Array.isArray(setupData)) { %>
+ <% setupData.forEach(config => { %>
+ <% if (config.hasOwnProperty('discord') && config.discord.enabled === 'on') { %>
+ <% if (config.hasOwnProperty('ldap') && config.ldap.enabled === 'on') { %>
+
Ou
+ <% } %>
+
+
+ Discord
+
+ Se connecter avec Discord
+
+ <% } %>
+ <% }); %>
+ <% } %>
+
+
+ Changer de Thème
+
@@ -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 @@
-
+
-
- Nom du fichier
- Taille
- Action
-
+
+ Nom du fichier
+ Taille
+ Action
+
- <% files.forEach(file => { %>
-
- <% if (fileInfoNames.includes(file.name)) { %>
- <%= file.name %>
+ <% files.forEach(file => { %>
+
+ <% if (fileInfoNames.includes(file.name)) { %>
+ <%= file.name %>
+ <% } else { %>
+ <%= file.name %>
+ <% } %>
+
+ <% if (file.type === 'folder') { %>
+ Dossier
<% } else { %>
- <%= file.name %>
+ <%
+ 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') { %>
- 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 { %>
+
+ Renommer
+
+
+
-
- <% }); %>
+
+
+
+
+
+ Déplacer vers...
+ <% allFolders.forEach(folder => { %>
+ <%= folder %>
+ <% }); %>
+
+ Déplacer
+
+ <% } %>
+
+
+ <% }); %>
@@ -167,27 +166,31 @@
-
+
Améliorations :
- Améliorations mineures et corrections mineures.AMÉLIORATION MINEURE
- Déplacement de fichier d'un dossier à la racineAMÉLIORATION MAJEUR
+ Améliorations mineures et corrections mineures sur tous les niveaux de l'application.AMÉLIORATION MINEURE
+ Déplacement de fichier d'un dossier à la racine.AMÉLIORATION MAJEURE
+ Suppression chargement login avec la connexion active directory.AMÉLIORATION MAJEURE
+ Modification de la suppression des fichiers à la racine.AMÉLIORATION MINEURE
+ Modification déplacement fichier sans destination.AMÉLIORATION MINEURE
-
+
-
Ajout :
+
Modifications :
- Ajout des endpoints d'api manquant externe à l'applicationAJOUT EXPERIENCE MAJEUR
+ Correction majeure d'un bug de sécurité.MODIFICATION MAJEURE
+ Modification du message "move file" réponse JSON.MODIFICATION MINEURE
-
+
Remarque : Nous apprécions vos retours d'expérience et vos rapports de bogues pour continuer à améliorer notre plateforme. Merci pour votre soutien continu !
@@ -198,6 +201,7 @@
+
@@ -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 @@
-
-
-
-
- Déplacer vers...
- Dossier Racine
- <% allFolders.forEach(folder => { %>
- <%= folder %>
- <% }); %>
-
- Déplacer
-
+
+
+
+
+
+ Déplacer vers...
+ Dossier Racine
+ <% allFolders.forEach(folder => { %>
+ <%= folder %>
+ <% }); %>
+
+ Déplacer
+
<% } %>
@@ -173,9 +174,9 @@
- © 2024 SwiftLogic Labs
+ © 2024 Myaxrin Labs
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 @@