Update Dockerfile, Passport-ActiveDirectory.js, package-lock.json, dpanel.js, index.js, and server.js
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -18,4 +18,6 @@ RUN [ ! -f user.json ] && echo '{}' > user.json || true
|
||||
|
||||
EXPOSE 5053
|
||||
|
||||
VOLUME /app/cdn-app-insider
|
||||
|
||||
CMD [ "npm", "start" ]
|
||||
@@ -34,10 +34,7 @@ passport.serializeUser((user, done) => {
|
||||
passport.deserializeUser((id, done) => {
|
||||
const users = getUserData();
|
||||
|
||||
console.log('id:', id);
|
||||
console.log('users:', users);
|
||||
|
||||
const user = users.find(u => u.name === id.name || u.name === `.${id.name}`);
|
||||
const user = users.find(u => u.name === id || u.name === `.${id}`);
|
||||
|
||||
if (user) {
|
||||
return done(null, user);
|
||||
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"name": "CDN-APP DinawoSR INC",
|
||||
"name": "@cdn/app-insider-swiftlogic-labs-dinawo",
|
||||
"version": "1.0.9-beta",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "CDN-APP DinawoSR INC",
|
||||
"name": "@cdn/app-insider-swiftlogic-labs-dinawo",
|
||||
"version": "1.0.9-beta",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
|
||||
@@ -669,7 +669,7 @@ router.post('/dashboard/update-role', authMiddleware, async (req, res) => {
|
||||
|
||||
router.post('/dashboard/update-setup', authMiddleware, async (req, res) => {
|
||||
try {
|
||||
let setup = JSON.parse(fs.readFileSync(path.join(__dirname, '../../setup.json')));
|
||||
let setup = JSON.parse(fs.readFileSync(path.join(__dirname, '../setup.json')));
|
||||
|
||||
if (!req.body.ldap || !req.body.ldap.enabled) {
|
||||
delete setup.ldap;
|
||||
@@ -686,7 +686,7 @@ router.post('/dashboard/update-setup', authMiddleware, async (req, res) => {
|
||||
setup.domain = req.body.domain;
|
||||
setup.uptime = req.body.uptime;
|
||||
|
||||
fs.writeFileSync(path.join(__dirname, '../../setup.json'), JSON.stringify(setup, null, 2));
|
||||
fs.writeFileSync(path.join(__dirname, '../setup.json'), JSON.stringify(setup, null, 2));
|
||||
|
||||
res.redirect('/dpanel/dashboard/admin');
|
||||
} catch (err) {
|
||||
|
||||
@@ -9,6 +9,8 @@ const exec = util.promisify(require('child_process').exec);
|
||||
const authMiddleware = require('../Middlewares/authMiddleware');
|
||||
const fs = require('fs');
|
||||
|
||||
router.use(express.json());
|
||||
|
||||
router.get('/', (req, res) => {
|
||||
res.render('acces-denied');
|
||||
});
|
||||
@@ -19,6 +21,47 @@ router.get('/attachments', (req, res) => {
|
||||
|
||||
router.get('/checkupdate',authMiddleware, checkUpdates);
|
||||
|
||||
router.get('/setup', (req, res) => {
|
||||
fs.readFile(path.join(__dirname, '../setup.json'), 'utf8', (err, data) => {
|
||||
if (err) {
|
||||
ErrorLogger.error('Error reading setup.json:', err);
|
||||
return res.status(500).json({ success: false, message: 'Error reading setup.json.' });
|
||||
}
|
||||
|
||||
const setup = JSON.parse(data);
|
||||
|
||||
if (Object.keys(setup).length === 0 && setup.constructor === Object) {
|
||||
res.render('setup', { setup });
|
||||
} else {
|
||||
res.status(200).json({ message: 'CDN setup is already done.' });
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
router.post('/setup/save', (req, res) => {
|
||||
const setupData = {
|
||||
domain: req.body.domain ?? '',
|
||||
uptime: req.body.uptime ?? ''
|
||||
};
|
||||
|
||||
if (!areAllFieldsEmpty(req.body.ldap)) {
|
||||
setupData.ldap = req.body.ldap;
|
||||
}
|
||||
|
||||
if (!areAllFieldsEmpty(req.body.discord)) {
|
||||
setupData.discord = req.body.discord;
|
||||
}
|
||||
|
||||
fs.writeFile(path.join(__dirname, '../setup.json'), JSON.stringify(setupData, null, 2), (err) => {
|
||||
if (err) {
|
||||
ErrorLogger.error('Error writing to setup.json:', err);
|
||||
return res.status(500).json({ success: false, message: 'Error writing to setup.json.' });
|
||||
}
|
||||
|
||||
res.json({ success: true, message: 'Configuration data has been successfully saved.' });
|
||||
});
|
||||
});
|
||||
|
||||
router.get('/applyupdate',authMiddleware, async (req, res) => {
|
||||
const updateUrl = 'https://apollon.dinawo.fr/api/download/all';
|
||||
const updateFolder = path.join(__dirname, '..');
|
||||
@@ -30,12 +73,12 @@ router.get('/applyupdate',authMiddleware, async (req, res) => {
|
||||
logger.info('------After applying the update------');
|
||||
res.json({
|
||||
success: true,
|
||||
message: 'Mise à jour appliquée avec succès. Pensé à redémarrer le serveur pour que la MàJ soit prise en compte. (systemctl restart cdn).'
|
||||
message: 'Update applied successfully. Remember to restart the server for the update to take effect. (systemctl restart cdn).'
|
||||
});
|
||||
} catch (error) {
|
||||
ErrorLogger.error('Error applying update:', error);
|
||||
|
||||
return res.status(500).json({ success: false, message: 'Erreur lors de l\'application de la mise à jour.' });
|
||||
return res.status(500).json({ success: false, message: 'Error applying the update.' });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -63,9 +106,8 @@ router.get('/translateAll', async (req, res) => {
|
||||
|
||||
res.json(translatedFiles);
|
||||
} catch (error) {
|
||||
console.error('Erreur lors de la traduction de tous les fichiers EJS :', error.message);
|
||||
res.status(500).json({ error: 'Erreur de traduction' });
|
||||
console.error('Error translating all EJS files:', error.message);
|
||||
res.status(500).json({ error: 'Translation error' });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
|
||||
25
server.js
25
server.js
@@ -12,18 +12,12 @@ const flash = require('connect-flash');
|
||||
const fs = require('fs');
|
||||
const SystemReport = require('./models/reportManager.js');
|
||||
|
||||
let setup = {};
|
||||
try {
|
||||
if (fs.existsSync('setup.json')) {
|
||||
setup = JSON.parse(fs.readFileSync('setup.json', 'utf8'));
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Error reading setup.json:', err);
|
||||
}
|
||||
let setup;
|
||||
try {
|
||||
setup = JSON.parse(fs.readFileSync('setup.json', 'utf8'));
|
||||
} catch (err) {
|
||||
console.error('Error reading setup.json:', err);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if (setup.discord !== undefined) {
|
||||
@@ -34,22 +28,11 @@ if (setup.ldap !== undefined) {
|
||||
require('./models/Passport-ActiveDirectory.js');
|
||||
}
|
||||
|
||||
let user = {};
|
||||
try {
|
||||
if (fs.existsSync('user.json')) {
|
||||
const data = fs.readFileSync('user.json', 'utf8');
|
||||
user = data ? JSON.parse(data) : {};
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Error reading user.json:', err);
|
||||
}
|
||||
|
||||
app.use(express.static(path.join(__dirname, 'public')));
|
||||
|
||||
app.get(['/user.json', '/file_info.json', '/setup.json'], (req, res) => {
|
||||
res.status(403).json({ error: 'Access Denied' });
|
||||
});
|
||||
app.use(express.urlencoded({ extended: true }));
|
||||
res.status(403).send('Access Denied');
|
||||
});app.use(express.urlencoded({ extended: true }));
|
||||
|
||||
app.use(session({
|
||||
secret: '63a69c252dfe0bb20650b6365b48dc99ad6c7eac19faed62670e73a071c54236e2faf04ee009919592def437b98d3c726c40a56ef1d8759878c1703a93244aa3',
|
||||
|
||||
249
views/setup.ejs
Normal file
249
views/setup.ejs
Normal file
@@ -0,0 +1,249 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
|
||||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@10"></script>
|
||||
<link rel="stylesheet" href="/public/css/login.css">
|
||||
<title>Setup CDN</title>
|
||||
<link rel="icon" href="/public/assets/homelab_logo.png" />
|
||||
|
||||
<style>
|
||||
.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:hover {
|
||||
transform: scale(1.15);
|
||||
background-color: #007BFF;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
input[type="text"] {
|
||||
width: 100%;
|
||||
padding: 5px 15px;
|
||||
margin: 8px 0;
|
||||
box-sizing: border-box;
|
||||
border: none;
|
||||
border-bottom: 2px solid #007BFF;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
input[type="text"]:focus {
|
||||
border-bottom: 2px solid #555;
|
||||
}
|
||||
|
||||
.switch {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 60px;
|
||||
height: 34px;
|
||||
}
|
||||
|
||||
.switch input {
|
||||
opacity: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.slider {
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-color: #ccc;
|
||||
-webkit-transition: .4s;
|
||||
transition: .4s;
|
||||
}
|
||||
|
||||
.slider:before {
|
||||
position: absolute;
|
||||
content: "";
|
||||
height: 26px;
|
||||
width: 26px;
|
||||
left: 4px;
|
||||
bottom: 4px;
|
||||
background-color: white;
|
||||
-webkit-transition: .4s;
|
||||
transition: .4s;
|
||||
}
|
||||
|
||||
input:checked + .slider {
|
||||
background-color: #2196F3;
|
||||
}
|
||||
|
||||
input:focus + .slider {
|
||||
box-shadow: 0 0 1px #2196F3;
|
||||
}
|
||||
|
||||
input:checked + .slider:before {
|
||||
-webkit-transform: translateX(26px);
|
||||
-ms-transform: translateX(26px);
|
||||
transform: translateX(26px);
|
||||
}
|
||||
|
||||
/* Rounded sliders */
|
||||
.slider.round {
|
||||
border-radius: 34px;
|
||||
}
|
||||
|
||||
.slider.round:before {
|
||||
border-radius: 50%;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body class="light-mode animate">
|
||||
<div class="container mt-4 table-container animate">
|
||||
<h2 class="text-center">Gestion de la configuration</h2><br>
|
||||
<div class="table-responsive">
|
||||
|
||||
<form action="/setup/save" method="POST">
|
||||
<table class="table w-100">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Paramètre</th>
|
||||
<th>Valeur</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="2"><h2>LDAP Settings</h2></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Activer LDAP:</td>
|
||||
<td>
|
||||
<label class="switch">
|
||||
<input type="checkbox" name="ldap[enabled]" <%= setup.ldap ? 'checked' : '' %>
|
||||
onchange="toggleForm('ldapForm', this)">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tbody id="ldapForm" style="display: block">
|
||||
<tr>
|
||||
<td>URL:</td>
|
||||
<td><input type="text" name="ldap[url]" value="<%= setup.ldap ? setup.ldap.url : '' %>"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Base DN:</td>
|
||||
<td><input type="text" name="ldap[baseDN]" value="<%= setup.ldap ? setup.ldap.baseDN : '' %>"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Username:</td>
|
||||
<td><input type="text" name="ldap[username]" value="<%= setup.ldap ? setup.ldap.username : '' %>"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Password:</td>
|
||||
<td><input type="text" name="ldap[password]" value="<%= setup.ldap ? setup.ldap.password : '' %>"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
||||
<tr>
|
||||
<td colspan="2"><h2>Discord Settings</h2></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Activer Discord:</td>
|
||||
<td>
|
||||
<label class="switch">
|
||||
<input type="checkbox" name="discord[enabled]" <%= setup.discord ? 'checked' : '' %>
|
||||
onchange="toggleForm('discordForm', this)">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tbody id="discordForm" style="display: block">
|
||||
<tr>
|
||||
<td>Client ID:</td>
|
||||
<td><input type="text" name="discord[clientID]" value="<%= setup.discord ? setup.discord.clientID : '' %>"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Client Secret:</td>
|
||||
<td><input type="text" name="discord[clientSecret]" value="<%= setup.discord ? setup.discord.clientSecret : '' %>"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Identify URL:</td>
|
||||
<td><input type="text" name="discord[identifyURL]" value="<%= setup.discord ? setup.discord.identifyURL : '' %>"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Authorized IDs:</td>
|
||||
<td><input type="text" name="discord[authorizedIDs]" value="<%= setup.discord ? setup.discord.authorizedIDs : '' %>">
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
||||
<tr>
|
||||
<td colspan="2"><h2>Other Settings</h2></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Domain:</td>
|
||||
<td><input type="text" name="domain" value="<%= setup.domain %>"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Uptime:</td>
|
||||
<td><input type="text" name="uptime" value="<%= setup.uptime %>"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="text-center">
|
||||
<button type="submit" class="btn btn-primary custom-btn">Mettre à jour</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="d-flex justify-content-center animate">
|
||||
<button id="themeSwitcher" class="btn btn-warning mt-3 animate ">Changer de Thème</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
|
||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
|
||||
|
||||
<script>
|
||||
const body = document.body;
|
||||
|
||||
document.getElementById('themeSwitcher').addEventListener('click', function () {
|
||||
if (body.classList.contains('dark-mode')) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
});
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const darkModeSwitch = document.getElementById('darkModeSwitch');
|
||||
|
||||
const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
||||
|
||||
body.classList.toggle('dark-mode', darkModeMediaQuery.matches);
|
||||
|
||||
darkModeMediaQuery.addListener(function (e) {
|
||||
body.classList.toggle('dark-mode', e.matches);
|
||||
});
|
||||
});
|
||||
|
||||
function toggleForm(formId, checkbox) {
|
||||
const form = document.getElementById(formId);
|
||||
form.style.display = checkbox.checked ? 'block' : 'none';
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
Reference in New Issue
Block a user