initial files

This commit is contained in:
2026-04-22 11:55:23 +02:00
commit 92444ff38c
85 changed files with 16324 additions and 0 deletions

175
src/routes/adminRoutes.js Normal file
View File

@@ -0,0 +1,175 @@
const { exec } = require('child_process');
const fs = require('fs');
const path = require('path');
const { service } = require('@root/server.js');
const configurationFile = path.join(require('@root/server.js').path.source, 'models', 'configuration.json');
const stylesheetFile = path.join(require('@root/server.js').path.source, 'models', 'stylesheet.json');
const serverInfoFile = path.join(require('@root/server.js').path.root, 'package.json');
module.exports = {
route(app, authenticationManager, pluginManager, eventManager, socketManager, activeDirectoryManager, stylesheetJson) {
// JSON configuration abrufen
app.post('/api/getConfig', (req, res) => {
fs.readFile(configurationFile, 'utf8', (err, data) => {
if (err) return res.status(500).send(err);
res.status(200).send(JSON.parse(data));
});
});
// JSON configuration speichern
app.post('/config', (req, res) => {
fs.writeFile(configurationFile, JSON.stringify(req.body, null, 2), (err) => {
if (err) return res.status(500).send(err);
res.status(200).send({ status: 'ok' });
});
});
// JSON stylesheet abrufen
app.post('/api/getStyles', (req, res) => {
fs.readFile(stylesheetFile, 'utf8', (err, data) => {
if (err) return res.status(500).send(err);
res.status(200).send(JSON.parse(data));
});
});
// JSON stylesheet speichern
app.post('/style', (req, res) => {
fs.writeFile(stylesheetFile, JSON.stringify(req.body, null, 2), (err) => {
if (err) return res.status(500).send(err);
res.status(200).send({ status: 'ok' });
});
});
// JSON package.json abrufen
app.post('/api/getServerInfo', (req, res) => {
fs.readFile(serverInfoFile, 'utf8', (err, data) => {
if (err) { return res.status(500).send(err); }
res.status(200).send({ package: JSON.parse(data), pid: process.pid, releaseNotes: global.json.releaseNotes.live });
});
});
// JSON package.json speichern
app.post('/serverinfo', (req, res) => {
fs.writeFile(serverInfoFile, JSON.stringify(req.body, null, 2), (err) => {
if (err) return res.status(500).send(err);
res.status(200).send({ status: 'ok' });
});
});
app.post('/api/eventlog/clearlog', (req, res) => {
eventManager.clear();
res.status(200).send({ status: 'ok' })
})
app.post('/api/eventlog/getLogs', async (req, res) => {
res.status(200).json(await service.get('eventManager').getAllEventLogs());
})
app.post('/api/shutdown', (req, res) => {
exec(`kill -9 ${process.pid}`, (error, stdout, stderr) => {
if (error) {
service.get('eventManager').write(req.cookies.ObjectGUID, 4, null, error.message);
return res.status(500).send({ status: 'error', message: error.message });
}
service.get('eventManager').write(req.cookies.ObjectGUID, 0, null, `Server heruntergefahren`);
res.status(200).send({ status: 'ok' });
});
});
app.post('/api/restart', (req, res) => {
service.get('eventManager').write(req.cookies.ObjectGUID, 2, null, `Der Neustart ist noch nicht implementiert`);
res.status(200).send({ status: 'ok' });
// exec(`kill -9 ${process.pid}`, (error, stdout, stderr) => {
// if (error) {
// service.get('eventManager').write(req.cookies.ObjectGUID, 4, null, error.message);
// return res.status(500).send({ status: 'error', message: error.message });
// }
// service.get('eventManager').write(req.cookies.ObjectGUID, 0, null, `Server neu gestartet`);
// res.status(200).send({ status: 'ok' });
// });
});
app.post('/api/plugins/activation', async (req, res) => {
const { name, state } = req.body;
let result = null;
if(state) {
result = await pluginManager.load(name, true);
} else {
result = await pluginManager.unload(name);
}
console.log(result)
// result = { ...result, authorized: result.metadata.permissions.some(async permission => { await activeDirectoryManager.getGroup(permission) != null && await activeDirectoryManager.isUserMemberOfRecursive(req.cookies.sAMAccountName, permission)}) }
eventManager.write(null, result.levelId, name, result.message);
// socketManager.broadcast('admin', 'plugin_status', result);
socketManager.broadcast('/', 'plugin_status', result);
res.status(200).json(result);
});
app.post('/api/plugins/getAll', async (req, res) => {
try {
const plugins = await pluginManager.getStatus();
res.status(200).json(plugins);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.post('/api/plugins/:name/update', async (req, res) => {
const { name } = req.params;
try {
const { updates } = req.body;
const result = await pluginManager.update(name, updates);
// result = { ...result, authorized: result.metadata.permissions.some(async permission => { await activeDirectoryManager.getGroup(permission) != null && await activeDirectoryManager.isUserMemberOfRecursive(req.cookies.sAMAccountName, permission)}) }
service.get('eventManager').writeLog(req.cookies.ObjectGUID, result.levelId, name, result.message);
// socketManager.broadcast('admin', 'plugin_status', result);
// socketManager.broadcast('/', 'plugin_status', result);
res.status(200).json(result);
} catch (error) {
service.get('eventManager').write(req.cookies.ObjectGUID, 4, name, `Fehler beim Aktualisieren des Plugins: ${error}`);
res.status(500).json({ error: error.message });
}
});
app.post('/api/plugins/:name/rename', async (req, res) => {
const { name } = req.params;
const { newName } = req.body;
const result = await service.get('pluginManager').rename(name, newName);
// const result = { levelId: 0, pluginName: name, message: `Plugin erstellt` };
// await pluginManager.create(name);
// res.status(200).json(result);
eventManager.writeLog(null, result.levelId, name, result.message);
// socketManager.broadcast('admin', 'plugin_status', result);
});
app.post('/api/plugins/:name/create', async (req, res) => {
const { name } = req.params;
const result = { levelId: 0, pluginName: name, message: `Plugin erstellt` };
await pluginManager.create(name);
eventManager.writeLog(null, result.levelId, name, result.message);
res.status(200).json(result);
// socketManager.broadcast('admin', 'plugin_status', result);
});
app.post('/admin/plugins/:name/delete', async (req, res) => {
const { name } = req.params;
const result = { status: 'delete', pluginName: name, levelId: 0, message: `Plugin ${name} gelöscht` }; //await pluginManager.delete(name);
res.status(200).json(result);
eventManager.write(null, result.levelId, name, result.message);
socketManager.broadcast('admin', 'plugin_status', result);
});
}
};

125
src/routes/indexRoutes.js Normal file
View File

@@ -0,0 +1,125 @@
const fs = require('fs');
const path = require('path');
const { renderWindow } = require('@services/renderWindow.js');
const { service } = require('@root/server.js');
const { File: HotReload } = require(`@services/hotReload.js`);
const { doesNotReject } = require('assert');
// let startMenuItemContext = require('@models/integratedStartmenuItems.js')
module.exports = {
route: function(app, service) {
app.get('/', service.get('authenticationManager').authenticate(), async (req, res) => {
const startMenuItems = await global.startMenuItems(
app,
req.cookies.sAMAccountName,
service
);
res.render('desktop', { layout: 'default', startMenuItems: startMenuItems });
});
app.post('/api/open_app', (req, res) => {
const { name, view, viewLabel, location, size, state, zIndex } = req.body;
const pluginPath = path.join(global.path.plugins, name, 'plugin.json');
let context = fs.existsSync(pluginPath)
? service.get('fileSystemManager').loadJSON(pluginPath)
: (global.json.startMenuItems.live).find(item => item.name == name);
context.defaultSize =
context.menu.items.find(item => item.label == viewLabel)?.defaultSize ||
{ width: 800, height: 600 };
delete context.config;
res.json({ name, view, viewLabel, context, location, size, state, zIndex });
});
app.get('/api/NotifyTray/getTrays', async (req, res) => {
const objectGuid = req.cookies.ObjectGUID;
// console.log(await service.get('notifyTray').getOpenNotifications(objectGuid))
res.status(200).json(await service.get('notifyTray').getOpenNotifications(objectGuid));
})
app.post('/api/NotifyTray/markAsSeen', async (req, res) => {
const objectGuid = req.cookies.ObjectGUID;
const notificationId = req.body.id;
const notificationValue = req.body.value;
await service.get('notifyTray').markAsSeen(objectGuid, notificationId, notificationValue);
res.status(204).send();
})
app.post('/api/Plugins/loadScripts', service.get('authenticationManager').authenticate(), async(req, res) => {
const scripts = service.get('pluginManager').getStatus().map(plugin => {
const exists = service.get('fileSystemManager').exists(path.join(plugin.pluginPath, 'public', 'javascript', 'main.js'))
if (exists && exists.status) {
return path.join('/', plugin.name, 'javascript', 'main.js');
}
return null;
})
.filter(script => script !== null);
res.status(200).send(scripts);
});
app.post('/window/EventLog/eventlog', async (req, res) => {
await renderWindow(app, 'eventlog.hbs', { }, { }, res)
});
app.post('/window/Server/styleconfig', async (req, res) => {
await renderWindow(app, 'styleconfig.hbs', { }, { }, res)
});
app.post('/window/Plugins/plugindashboard', async (req, res) => {
await renderWindow(app, 'plugindashboard.hbs', { }, { }, res)
});
app.post('/window/Info/serverinfo', async (req, res) => {
await renderWindow(app, 'serverinfo.hbs', { }, { }, res)
});
app.post('/window/Server/serverconfig', async (req, res) => {
await renderWindow(app, 'serverconfig.hbs', { }, { }, res)
});
app.post('/window/Einstellungen/usersettings', async (req, res) => {
await renderWindow(app, 'usersettings.hbs', { }, { }, res)
});
app.post('/window/Hilfe/help', async (req, res) => {
await renderWindow(app, 'help.hbs', { }, { }, res)
});
app.get('/api/help/getTabs', async (req, res) => {
const tabNames = (await startMenuItems(app, req.cookies.sAMAccountName))
.filter(plugin => plugin.active && plugin.menu.items.some(i => i.authorized))
.map(plugin => ({ name: plugin.menu.label }));
res.status(200).json(tabNames);
});
app.post('/api/help/getHelp', async (req, res) => {
const { name } = req.body;
const props = (await startMenuItems(app, req.cookies.sAMAccountName))
.filter(plugin => plugin.name === name && plugin.active && plugin.menu.items.some(i => i.authorized))
.map(async plugin => (
{
name: plugin.menu.label,
version: plugin.version,
description: plugin.description,
html: await fs.promises.readFile(plugin.section === 'Plugin' ? path.join(plugin.pluginPath, 'docs', 'help.html') : path.join(app.locals.path.public, 'views', 'help', plugin.name + '.html'), 'utf-8')
}
));
res.status(200).send(await props[0]);
});
}
};

79
src/routes/loginRoutes.js Normal file
View File

@@ -0,0 +1,79 @@
const { verify } = require("jsonwebtoken");
module.exports = {
route(app, authenticationManager, socketManager, eventManager) {
app.get(`/login`, (req, res) => {
res.render(`login`, { layout: 'default' });
})
app.post('/login', async (req, res) => {
const { sAMAccountName, password } = req.body;
const userModel = await authenticationManager.Authentication.findOne({
where: { sAMAccountName: sAMAccountName }, attributes: ['ObjectGUID'],
raw: true
});
const objectGuid = userModel !== null ? userModel.ObjectGUID : sAMAccountName;
try {
// set safety cookies
res.cookie('sAMAccountName', sAMAccountName, {
httpOnly: false,
secure: true,
sameSite: 'Strict',
maxAge: 1000 * 60 * 60 * 24 * 365
})
res.cookie('ObjectGUID', objectGuid, {
httpOnly: false,
secure: true,
sameSite: 'Strict',
maxAge: 1000 * 60 * 60 * 24 * 365
})
const login = await authenticationManager.login(sAMAccountName, password);
eventManager.writeLog(objectGuid, login.levelId, null, login.message);
res.status(login.levelId == 0 ? 200 : 401).json(login);
} catch (err) {
res.status(500).json(login);
}
});
// Geschützte Route
app.get('/me', authenticationManager.authenticate(), (req, res) => {
res.json(JSON.stringify({
user: {
name: req.user
}
}, null, 4));
});
app.post('/checkLoginName', async (req, res) => {
const { sAMAccountName } = req.body;
const userExists = await authenticationManager.Authentication.findOne({ where: { sAMAccountName: sAMAccountName } });
const auth = { objectGuid: userExists != null ? userExists.ObjectGUID : sAMAccountName, sAMAccountName: sAMAccountName };
res.status(userExists ? 200 : 404).json({ exists: userExists != null });
});
app.get('/verifying', async (req, res, next) => {
const verify = await authenticationManager.verifyUserToken();
eventManager.write(req.user.objectGuid, verify.levelId, null, verify.message);
next();
});
// Logout
app.post('/logout', authenticationManager.authenticate(), async (req, res) => {
const logout = await authenticationManager.logout(req.user.sAMAccountName);
socketManager.sendTo('/', req.user.objectGuid, 'login_status', { levelId: logout.levelId, message: logout.message } )
eventManager.write(req.user.objectGuid, logout.levelId, null, logout.message);
res.clearCookie('sAMAccountName');
res.clearCookie('ObjectGUID');
setTimeout(() => res.render('login', { layout: false, title: app.locals.configuration.server.name }), 3000);
// res.json({ message: 'Logout erfolgreich' });
});
}
};