diff --git a/public/css/styles.css b/public/css/styles.css
index 95246a7..35dc5b8 100644
--- a/public/css/styles.css
+++ b/public/css/styles.css
@@ -122,46 +122,24 @@ body.dark-theme .navbar-toggler-icon {
filter: invert(1);
}
-#logoutLink {
- 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;
- cursor: pointer;
- box-shadow: 0 2px 5px rgba(0,0,0,0.25);
- border: 2px solid #007BFF;
-}
-
-#logoutLink:hover {
- transform: scale(1.15);
- background-color: #007BFF;
- color: #fff;
-}
-
.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;
}
.btn-icon {
@@ -171,30 +149,48 @@ body.dark-theme .navbar-toggler-icon {
.custom-dropdown,
.animated-button {
- position: relative;
- background: #1d2429;
+ 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;
- padding: 10px 20px;
- font-size: 1em;
- color: #17a2b8;
transition: all 0.3s ease;
+ position: relative;
+ overflow: hidden;
}
-body.white-theme .custom-dropdown,
-body.white-theme .animated-button {
- color: #6c757d;
- background: #e9ecef;
+body .custom-dropdown:focus,
+body .animated-button:focus {
+ color: #ffffff !important; /* Change the text color to white */
+ background: linear-gradient(0deg, rgba(77,54,208,1) 0%, rgba(132,116,254,1) 100%) !important; /* Keep the background color as the button color */
}
-.custom-dropdown:hover,
-.animated-button:hover {
- background: #343a40;
- color: #fff;
+body.white-theme .custom-dropdown:focus,
+body.white-theme .animated-button:focus {
+ color: #ffffff !important; /* Change the text color to white */
+ background: linear-gradient(0deg, rgba(77,54,208,1) 0%, rgba(132,116,254,1) 100%) !important; /* Keep the background color as the button color */
}
-body.white-theme .custom-dropdown:hover,
-body.white-theme .animated-button:hover {
- background: #343a40;
- color: #fff;
+@keyframes rainbowBorder {
+ 0% { box-shadow: 0 0 0 3px rgba(255, 0, 0, 0.7); }
+ 14% { box-shadow: 0 0 0 3px rgba(255, 127, 0, 0.7); }
+ 28% { box-shadow: 0 0 0 3px rgba(255, 255, 0, 0.7); }
+ 42% { box-shadow: 0 0 0 3px rgba(0, 255, 0, 0.7); }
+ 57% { box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.7); }
+ 71% { box-shadow: 0 0 0 3px rgba(75, 0, 130, 0.7); }
+ 85% { box-shadow: 0 0 0 3px rgba(143, 0, 255, 0.7); }
+ 100% { box-shadow: 0 0 0 3px rgba(255, 0, 0, 0.7); }
+}
+
+.rainbow-effect {
+ animation: rainbowBorder 2s linear infinite;
}
\ No newline at end of file
diff --git a/public/js/folder.js b/public/js/folder.js
index aa729b0..728680d 100644
--- a/public/js/folder.js
+++ b/public/js/folder.js
@@ -337,4 +337,78 @@ async function showFileInfo(fileName) {
html: html,
confirmButtonText: 'Fermer'
});
-}
\ No newline at end of file
+}document.addEventListener('DOMContentLoaded', function () {
+ const moveFileForm = document.getElementById('moveFileForm');
+
+ moveFileForm.addEventListener('submit', function (event) {
+ event.preventDefault(); // Empêche la soumission par défaut du formulaire
+
+ const fileName = this.querySelector('input[name="fileName"]').value;
+ const userName = this.querySelector('input[name="userName"]').value;
+ const oldFolderName = this.querySelector('input[name="oldFolderName"]').value;
+ const newFolderName = this.querySelector('select[name="newFolderName"]').value;
+
+ if (!newFolderName || newFolderName === "Déplacer vers...") {
+ Swal.fire({
+ position: 'top',
+ icon: 'error',
+ title: 'Veuillez sélectionner un dossier de destination',
+ showConfirmButton: false,
+ timer: 1800,
+ toast: true
+ });
+ return;
+ }
+
+ Swal.fire({
+ title: 'Confirmer le déplacement du fichier',
+ text: `Voulez-vous déplacer le fichier ${fileName} vers ${newFolderName} ?`,
+ icon: 'warning',
+ showCancelButton: true,
+ confirmButtonText: 'Déplacer',
+ cancelButtonText: 'Annuler',
+ }).then((result) => {
+ if (result.isConfirmed) {
+ fetch(`/api/dpanel/dashboard/movefile/${oldFolderName}`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({ fileName, userName, newFolderName }),
+ })
+ .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/Dpanel/API/DeleteFile.js b/routes/Dpanel/API/DeleteFile.js
index 9e4ea54..8d5136e 100644
--- a/routes/Dpanel/API/DeleteFile.js
+++ b/routes/Dpanel/API/DeleteFile.js
@@ -99,6 +99,12 @@ router.use(bodyParser.json());
function authenticateToken(req, res, next) {
+ if (req.session.user) {
+ req.user = req.session.user;
+ req.userData = req.session.user;
+ return next();
+ }
+
let token = null;
const authHeader = req.headers['authorization'];
@@ -125,6 +131,8 @@ function authenticateToken(req, res, next) {
return res.status(401).json({ message: 'Unauthorized: Invalid token' });
}
+ // Enregistrer l'utilisateur dans la session
+ req.session.user = user;
req.user = user;
req.userData = user;
next();
diff --git a/routes/Dpanel/API/DeleteFolfder.js b/routes/Dpanel/API/DeleteFolfder.js
index 4f04592..34a4009 100644
--- a/routes/Dpanel/API/DeleteFolfder.js
+++ b/routes/Dpanel/API/DeleteFolfder.js
@@ -129,9 +129,9 @@ function authenticateToken(req, res, next) {
return res.status(401).json({ message: 'Unauthorized' });
}
- fs.readFile(path.join(__dirname, '../../../data', 'user.json'), 'utf8', (err, data) => {
+ fs.readFile(path.join(__dirname, '../../../data', 'user.jso,'), 'utf8', (err, data) => {
if (err) {
- console.error('Error reading user.json:', err);
+ console.error('Error reading user.jso,:', err);
return res.status(401).json({ message: 'Unauthorized' });
}
diff --git a/routes/Dpanel/API/MoveFile.js b/routes/Dpanel/API/MoveFile.js
index 8d2a91b..434bbb6 100644
--- a/routes/Dpanel/API/MoveFile.js
+++ b/routes/Dpanel/API/MoveFile.js
@@ -118,7 +118,7 @@ function authenticateToken(req, res, next) {
fs.readFile(path.join(__dirname, '../../../data', 'user.json'), 'utf8', (err, data) => {
if (err) {
- console.error('Error reading user.json:', err);
+ console.error('Error reading user.js:', err);
return res.status(401).json({ message: 'Unauthorized' });
}
@@ -145,61 +145,62 @@ router.post('/', authenticateToken, async (req, res) => {
const folderName = req.body.folderName;
if (!fileName || fileName.trim() === '') {
- return res.status(400).send('No file selected for moving.');
+ return res.status(400).json({ error: 'No file selected for moving.' });
}
- const data = await fs.readFileSync(path.join(__dirname, '../../../data', 'user.json'), 'utf-8')
- const users = JSON.parse(data);
- const user = users.find(user => user.id === req.user.id);
-
- if (!user) {
- console.error('User not found in user.json');
- return res.status(500).send('Error moving the file.');
- }
-
- const userId = user.name;
-
- if (!fileName || !userId) {
- console.error('fileName or userId is undefined');
- return res.status(500).send('Error moving the file.');
- }
-
- const sourcePath = path.join('cdn-files', userId, fileName);
-
- let destinationDir;
- if (folderName && folderName.trim() !== '') {
- destinationDir = path.join('cdn-files', userId, folderName);
- } else {
- destinationDir = path.join('cdn-files', userId);
- }
-
- const destinationPath = path.join(destinationDir, fileName);
-
try {
+ const data = await fs.promises.readFile(path.join(__dirname, '../../../data', 'user.json'), 'utf-8');
+ const users = JSON.parse(data);
+ const user = users.find(user => user.id === req.user.id);
+
+ if (!user) {
+ console.error('User not found in user.json');
+ return res.status(500).json({ error: 'Error moving the file.' });
+ }
+
+ const userId = user.name;
+
+ if (!fileName || !userId) {
+ console.error('fileName or userId is undefined');
+ return res.status(500).json({ error: 'Error moving the file.' });
+ }
+
+ const sourcePath = path.join('cdn-files', userId, fileName);
+
+ let destinationDir;
+ if (folderName && folderName.trim() !== '') {
+ destinationDir = path.join('cdn-files', userId, folderName);
+ } else {
+ destinationDir = path.join('cdn-files', userId);
+ }
+
+ const destinationPath = path.join(destinationDir, fileName);
+
+ if (!destinationPath.startsWith(path.join('cdn-files', userId))) {
+ return res.status(403).json({ error: 'Unauthorized: Cannot move file outside of user directory.' });
+ }
+
const normalizedSourcePath = path.normalize(sourcePath);
- console.log('Full Source Path:', normalizedSourcePath);
-
+
if (fs.existsSync(normalizedSourcePath)) {
await fs.promises.access(destinationDir);
-
await ncpAsync(normalizedSourcePath, destinationPath);
-
await fs.promises.unlink(normalizedSourcePath);
} else {
- console.log('File does not exist');
+ return res.status(404).json({ error: 'File not found.' });
}
res.status(200).json({ message: 'File moved successfully' });
} catch (err) {
console.error(err);
- return res.status(500).send('Error moving the file.');
+ return res.status(500).json({ error: 'Error moving the file.' });
}
});
router.post('/:folderName', authenticateToken, async (req, res) => {
const fileName = req.body.fileName;
let newFolderName = req.body.newFolderName;
- const oldFolderName = req.params.folderName;
+ const oldFolderName = req.params.folderName;
const userName = req.body.userName;
if (newFolderName === 'root') {
@@ -208,7 +209,11 @@ router.post('/:folderName', authenticateToken, async (req, res) => {
if (fileName === undefined || userName === undefined || oldFolderName === undefined || newFolderName === undefined) {
console.error('fileName, userName, oldFolderName, or newFolderName is undefined');
- return res.status(500).send('Error moving the file.');
+ return res.status(500).json({ error: 'Error moving the file.' });
+ }
+
+ if (userName !== req.user.name) {
+ return res.status(403).json({ error: 'Unauthorized: Cannot move files for other users.' });
}
const userDir = path.join(process.cwd(), 'cdn-files', userName);
@@ -218,25 +223,23 @@ router.post('/:folderName', authenticateToken, async (req, res) => {
if (!sourcePath.startsWith(userDir) || !destinationPath.startsWith(userDir)) {
ErrorLogger.error('Unauthorized directory access attempt');
- return res.status(403).send('Unauthorized directory access attempt');
+ return res.status(403).json({ error: 'Unauthorized directory access attempt' });
}
try {
const normalizedSourcePath = path.normalize(sourcePath);
- console.log('Full Source Path:', normalizedSourcePath);
-
+
if (fs.existsSync(normalizedSourcePath)) {
await fs.promises.access(destinationDir, fs.constants.W_OK);
-
await fs.promises.rename(normalizedSourcePath, destinationPath);
} else {
- console.log('File does not exist');
+ return res.status(404).json({ error: 'File not found.' });
}
- res.redirect('/dpanel/dashboard');
+ res.status(200).json({ message: 'File moved successfully', redirectTo: '/dpanel/dashboard' });
} catch (err) {
console.error(err);
- return res.status(500).send('Error moving the file.');
+ return res.status(500).json({ error: 'Error moving the file.' });
}
});
diff --git a/routes/Dpanel/API/NewFolder.js b/routes/Dpanel/API/NewFolder.js
index a823cca..341fa14 100644
--- a/routes/Dpanel/API/NewFolder.js
+++ b/routes/Dpanel/API/NewFolder.js
@@ -105,7 +105,7 @@ function authenticateToken(req, res, next) {
return res.status(401).json({ message: 'Unauthorized' });
}
- fs.readFile(path.join(__dirname, '../../../data', 'user.json'), 'utf8', (err, data) => {
+ fs.readFile(path.join(__dirname, '../../../data', 'user.jso,'), 'utf8', (err, data) => {
if (err) {
console.error('Error reading user.json:', err);
return res.status(401).json({ message: 'Unauthorized' });
diff --git a/routes/Dpanel/API/RenameFile.js b/routes/Dpanel/API/RenameFile.js
index 67df6c5..30c68b7 100644
--- a/routes/Dpanel/API/RenameFile.js
+++ b/routes/Dpanel/API/RenameFile.js
@@ -107,7 +107,7 @@ function authenticateToken(req, res, next) {
}
}
- fs.readFile(path.join(__dirname, '../../../data', 'user.json'), 'utf8', (err, data) => {
+ fs.readFile(path.join(__dirname, '../../../data', 'user.jso,'), 'utf8', (err, data) => {
if (err) {
console.error('Error reading user.json:', err);
return res.status(401).json({ message: 'Unauthorized' });
diff --git a/routes/Dpanel/API/Upload-Role-Admin.js b/routes/Dpanel/API/Upload-Role-Admin.js
index 21d42d7..7111b4e 100644
--- a/routes/Dpanel/API/Upload-Role-Admin.js
+++ b/routes/Dpanel/API/Upload-Role-Admin.js
@@ -40,7 +40,7 @@ router.post('/', authMiddleware, async (req, res) => {
user.role = role;
}
- fs.writeFileSync(path.join(__dirname, '../../../data/user.json'), JSON.stringify(User, null, 2));
+ fs.writeFileSync(path.join(__dirname, '../../../data/user.js'), JSON.stringify(User, null, 2));
res.redirect('/dpanel/dashboard/admin');
} catch (err) {
diff --git a/routes/Dpanel/API/Upload.js b/routes/Dpanel/API/Upload.js
index 54093f8..b8f8841 100644
--- a/routes/Dpanel/API/Upload.js
+++ b/routes/Dpanel/API/Upload.js
@@ -112,9 +112,9 @@ function authenticateToken(req, res, next) {
}
}
- fs.readFile(path.join(__dirname, '../../../data', 'user.json'), 'utf8', (err, data) => {
+ fs.readFile(path.join(__dirname, '../../../data', 'user.jso,'), 'utf8', (err, data) => {
if (err) {
- console.error('Error reading user.json:', err);
+ console.error('Error reading user.jso,:', err);
return res.status(401).json({ message: 'Unauthorized' });
}
diff --git a/routes/attachments.js b/routes/attachments.js
index 513b742..221ecfc 100644
--- a/routes/attachments.js
+++ b/routes/attachments.js
@@ -2,6 +2,7 @@ const express = require('express');
const router = express.Router();
const path = require('path');
const fs = require('fs').promises;
+const fsStandard = require('fs');
const mime = require('mime-types');
const { logger, ErrorLogger } = require('../config/logs');
const bcrypt = require('bcrypt');
@@ -27,7 +28,12 @@ async function findFileInUserDir(userId, filename) {
}
async function findFileInDir(dir, filename) {
- const files = await fs.readdir(dir, { withFileTypes: true });
+ let files;
+ try {
+ files = await fs.readdir(dir, { withFileTypes: true });
+ } catch (err) {
+ return null; // Directory does not exist
+ }
for (const file of files) {
const filePath = path.join(dir, file.name);
@@ -65,15 +71,16 @@ router.get('/:userId/:filename', async (req, res) => {
fileInfoArray = JSON.parse(data);
} catch (error) {
console.error('Error parsing file_info.json:', error);
+ return res.status(500).send('Error reading file info.');
}
if (!Array.isArray(fileInfoArray)) {
console.error('fileInfoArray is not an array');
- fileInfoArray = [];
+ return res.status(500).send('Invalid file info format.');
}
const fileInfo = fileInfoArray.find(info => info.fileName === filename && info.Id === userId);
-
+
if (fileInfo) {
const expiryDate = new Date(fileInfo.expiryDate);
const now = new Date();
@@ -88,26 +95,11 @@ router.get('/:userId/:filename', async (req, res) => {
}
}
- const fileContent = await fs.readFile(filePath);
- let mimeType = mime.lookup(filePath);
+ const readStream = fsStandard.createReadStream(filePath);
+ let mimeType = mime.lookup(filePath) || 'application/octet-stream';
- if (!mimeType) {
- if (filePath.endsWith('.txt')) {
- mimeType = 'text/plain';
- } else if (filePath.endsWith('.pdf')) {
- mimeType = 'application/pdf';
- }
- }
-
- if (mimeType) {
- res.setHeader('Content-Type', mimeType);
- }
-
- if (mimeType === 'text/plain') {
- res.end(fileContent);
- } else {
- res.send(fileContent);
- }
+ res.setHeader('Content-Type', mimeType);
+ readStream.pipe(res);
if (fileInfo) {
req.session.passwordVerified = false;
@@ -129,11 +121,12 @@ router.post('/:userId/:filename', async (req, res) => {
fileInfoArray = JSON.parse(data);
} catch (error) {
console.error('Error parsing file_info.json:', error);
+ return res.status(500).send('Error reading file info.');
}
if (!Array.isArray(fileInfoArray)) {
console.error('fileInfoArray is not an array');
- fileInfoArray = [];
+ return res.status(500).send('Invalid file info format.');
}
const fileInfo = fileInfoArray.find(info => info.fileName === filename && info.Id === userId);
@@ -142,21 +135,21 @@ router.post('/:userId/:filename', async (req, res) => {
return res.json({ success: false, message: 'File not found' });
}
- if (bcrypt.compareSync(enteredPassword, fileInfo.password)) {
+ const passwordMatch = await bcrypt.compare(enteredPassword, fileInfo.password);
+ if (passwordMatch) {
req.session.passwordVerified = true;
const filePath = await findFileInUserDir(userId, filename);
- const fileContent = await fs.readFile(filePath);
- let mimeType = mime.lookup(filePath);
+ const readStream = fsStandard.createReadStream(filePath);
+ let mimeType = mime.lookup(filePath) || 'application/octet-stream';
- if (!mimeType) {
- if (filePath.endsWith('.txt')) {
- mimeType = 'text/plain';
- } else if (filePath.endsWith('.pdf')) {
- mimeType = 'application/pdf';
- }
- }
+ let fileContent = '';
+ readStream.on('data', chunk => {
+ fileContent += chunk.toString('base64');
+ });
- res.json({ success: true, fileContent: fileContent.toString('base64'), mimeType });
+ readStream.on('end', () => {
+ res.json({ success: true, fileContent, mimeType });
+ });
} else {
res.json({ success: false, message: 'Incorrect password' });
}
@@ -167,24 +160,31 @@ router.post('/:userId/:filename', async (req, res) => {
});
async function deleteExpiredFiles() {
- let data = await fs.readFile(path.join(__dirname, '../data', 'file_info.json'), 'utf8');
+ let data;
+ try {
+ data = await fs.readFile(path.join(__dirname, '../data', 'file_info.json'), 'utf8');
+ } catch (error) {
+ console.error('Error reading file_info.json:', error);
+ return;
+ }
+
let fileInfoArray;
try {
fileInfoArray = JSON.parse(data);
} catch (error) {
console.error('Error parsing file_info.json:', error);
+ return;
}
if (!Array.isArray(fileInfoArray)) {
console.error('fileInfoArray is not an array');
- fileInfoArray = [];
+ return;
}
const now = new Date();
let newFileInfoArray = [];
- for (let i = 0; i < fileInfoArray.length; i++) {
- const fileInfo = fileInfoArray[i];
+ for (const fileInfo of fileInfoArray) {
let expiryDate;
if (fileInfo.expiryDate && fileInfo.expiryDate.trim() !== '') {
expiryDate = new Date(fileInfo.expiryDate);
@@ -193,10 +193,10 @@ async function deleteExpiredFiles() {
}
if (expiryDate < now) {
- const samaccountname = await getSamAccountNameFromUserId(fileInfo.userId);
- const userDir = path.join(baseDir, samaccountname);
- const filePath = path.join(userDir, fileInfo.fileName);
try {
+ const samaccountname = await getSamAccountNameFromUserId(fileInfo.userId);
+ const userDir = path.join(baseDir, samaccountname);
+ const filePath = path.join(userDir, fileInfo.fileName);
await fs.unlink(filePath);
} catch (err) {
ErrorLogger.error('Error deleting file:', err);
@@ -207,7 +207,7 @@ async function deleteExpiredFiles() {
}
try {
- await fs.writeFile(path.join(__dirname, '../data', 'file_info.json'), JSON.stringify(newFileInfoArray, null, 2), 'utf8');
+ await fs.writeFile(path.join(__dirname, '../data', 'file_info.json'), JSON.stringify(newFileInfoArray, null, 2), 'utf8');
} catch (err) {
ErrorLogger.error('Error writing to file_info.json:', err);
}
@@ -215,4 +215,4 @@ async function deleteExpiredFiles() {
setInterval(deleteExpiredFiles, 24 * 60 * 60 * 1000);
-module.exports = router;
\ No newline at end of file
+module.exports = router;
diff --git a/routes/routes.js b/routes/routes.js
index 9fe6e05..999b6c3 100644
--- a/routes/routes.js
+++ b/routes/routes.js
@@ -55,7 +55,7 @@ router.use('/api/dpanel/dashboard/newfolder',discordWebhookSuspisiousAlertMiddle
router.use('/api/dpanel/dashboard/rename',discordWebhookSuspisiousAlertMiddleware, logApiRequest, RenameFileRoute);
router.use('/api/dpanel/dashboard/delete',discordWebhookSuspisiousAlertMiddleware, logApiRequest, DeleteFileRoute);
router.use('/api/dpanel/dashboard/movefile',discordWebhookSuspisiousAlertMiddleware, logApiRequest, MoveFileRoute);
-router.use('/api/dpanel/upload',discordWebhookSuspisiousAlertMiddleware, logApiRequest, UploadRoute);
+router.use('/api/dpanel/upload', UploadRoute);
router.use('/api/dpanel/dashboard/admin/update-role',discordWebhookSuspisiousAlertMiddleware, logApiRequest, UpdateRoleAdminRoute);
router.use('/api/dpanel/dashboard/admin/update-setup',discordWebhookSuspisiousAlertMiddleware, logApiRequest, UpdateSetupAdminRoute);
router.use('/api/dpanel/dashboard/deletefolder',discordWebhookSuspisiousAlertMiddleware, logApiRequest, DeleteFolderRoute);
diff --git a/views/paramAdminPrivacy&Security.ejs b/views/paramAdminPrivacy&Security.ejs
index 536785f..8686a7b 100644
--- a/views/paramAdminPrivacy&Security.ejs
+++ b/views/paramAdminPrivacy&Security.ejs
@@ -48,28 +48,28 @@
color: #000;
text-decoration: none;
cursor: pointer;
- }
-
- .custom-btn {
- transition: transform 0.3s ease, background-color 0.3s ease, border-color 0.3s ease;
- color: #007BFF;
- background-color: transparent;
- padding: 5px 10px;
- text-decoration: none;
- display: inline-block;
- font-size: 14px;
- margin: 4px 2px;
- border-radius: 50px;
- cursor: pointer;
- box-shadow: 0 2px 5px rgba(0,0,0,0.25);
- border: 2px solid #007BFF;
- }
+ }
+
+ .custom-btn {
+ 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;
+ transition: all 0.3s ease;
+ position: relative;
+ overflow: hidden;
+ }
- .custom-btn:hover {
- transform: scale(1.15);
- background-color: #007BFF;
- color: #fff;
- }
diff --git a/views/paramAdminSettingSetup.ejs b/views/paramAdminSettingSetup.ejs
index 89b1e74..2b86e6f 100644
--- a/views/paramAdminSettingSetup.ejs
+++ b/views/paramAdminSettingSetup.ejs
@@ -11,26 +11,26 @@
diff --git a/views/upload.ejs b/views/upload.ejs
index 256aa55..73b42ac 100644
--- a/views/upload.ejs
+++ b/views/upload.ejs
@@ -83,6 +83,8 @@
return;
}
+ const originalFileName = file.name;
+
const expiryDate = document.getElementById('expiryDate').value;
const password = document.getElementById('password').value;
const formData = new FormData();
@@ -105,7 +107,7 @@
Swal.fire({
position: 'top',
icon: 'success',
- title: 'Votre fichier a été téléchargé avec succès.',
+ title: `Votre fichier ${originalFileName} a été téléchargé avec succès.`,
showConfirmButton: false,
timer: 1800,
toast: true,