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

This commit is contained in:
2024-03-27 20:06:02 +01:00
parent 96466073a5
commit 1d456a588a
7 changed files with 307 additions and 34 deletions

View File

@@ -18,4 +18,6 @@ RUN [ ! -f user.json ] && echo '{}' > user.json || true
EXPOSE 5053
VOLUME /app/cdn-app-insider
CMD [ "npm", "start" ]

View File

@@ -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
View File

@@ -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": {

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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
View 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>