Files
radixOS/server.js
manuel.sowada 63931bc4d5 style fixes
2026-05-12 15:58:46 +02:00

251 lines
11 KiB
JavaScript

//#region Modules
const { dirname } = require('path');
const path = require('path');
const https = require('https');
var express = require('express');
var app = express();
var { create } = require('express-handlebars');
const cookieParser = require('cookie-parser');
var fs = require('fs');
var os = require('os');
var favicon = require('serve-favicon');
const Sequelize = require('sequelize');
const { Server } = require('socket.io');
const { on } = require('cluster');
// const { start } = require('repl');
// const WebSocket = require('ws');
//#endregion
require('module-alias/register'); // define paths in package.json
const { localPath, cache, runtimeFile } = require('@root/globalize.js');
process.env.TZ = 'Europe/Berlin';
//#region Nesessary json files
const jsonFiles = ['configuration.json', 'stylesheet.json'];
for (var i = 0; i < jsonFiles.length; i++) {
if(!fs.existsSync(`${localPath.source}/models/${jsonFiles[i]}`)) {
fs.copyFileSync(`${localPath.source}/backups/${jsonFiles[i]}.temp`, `${localPath.source}/models/${jsonFiles[i]}`);
}
}
(async () => {
const securePath = `${localPath.source}/secure`;
const certConfig = runtimeFile.configuration.live.certificate;
let httpsOptions = {};
if (certConfig.pfx) {
httpsOptions = {
pfx: fs.readFileSync(`${securePath}/${certConfig.pfx}`),
passphrase: certConfig.passphrase
};
} else {
httpsOptions = {
key: fs.readFileSync(`${securePath}/${certConfig.key}`),
cert: fs.readFileSync(`${securePath}/${certConfig.chain}`)
};
}
const server = https.createServer(httpsOptions, app);
// const wss = new WebSocket.Server({ server });
// wss.on('connection', socket => {
// socket.send('HELLO')
// });
const io = new Server(server, {
// pingInterval: 1000, // alle 25s Ping senden
// pingTimeout: 200, // 20s ohne Pong => disconnect
maxHttpBufferSize: 1e8, // 100 MB
});
//#endregion
//#region Services/DatabaseModel
let service = new Map();
let databaseModel = new Map();
let SocketManager = require(`@services/socketManager.js`);
let SqlManager = require(`@services/sqlManager.js`);
let EventManager = require(`@services/eventManager.js`);
let NotifyTrayManager = require(`@services/notifyTrayManager.js`);
let PluginManager = require(`@services/pluginManager.js`);
let FileSystemManager = require(`@services/fileSystemManager.js`);
let AuthenticationManager = require(`@services/authenticationManager.js`);
let ActiveDirectory = require(`@services/activeDirectoryManager.js`);
let VaultifyManager = require(`@services/vaultifyManager.js`);
let RBACManager = require(`@services/rbacManager.js`);
service.set('socketManager', new SocketManager(io));
await service.get('socketManager').addAsync('/');
await service.get('socketManager').addAsync('admin');
service.set('sqlManager', new SqlManager());
service.get('sqlManager').addInstance('main', runtimeFile.configuration.live.integration.sql.connect);
databaseModel.set('eventlog', require(`${localPath.source}/models/eventlogModel`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('eventlogView', require(`@models/eventlogView`)(service.get('sqlManager').getInstance('main')));
service.set('eventManager', new EventManager(app, databaseModel.get('eventlog'), databaseModel.get('eventlogView'), service.get('socketManager')));
databaseModel.set('notifyTrayModel', require(`@models/notifyTrayModel`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('notifyTrayObjectModel', require(`@models/notifyTrayObjectsModel`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('notifyTrayView', require(`@models/notifyTrayView`)(service.get('sqlManager').getInstance('main')));
service.set('notifyTray', new NotifyTrayManager(databaseModel.get('notifyTrayModel'), databaseModel.get('notifyTrayView'), databaseModel.get('notifyTrayObjectModel')) );
databaseModel.set('plugin', require(`@models/pluginModel`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('authentication', require(`@models/authenticationModel`)(service.get('sqlManager').getInstance('main')));
service.set('fileSystemManager', new FileSystemManager());
databaseModel.set('vault', require(`@models/vaultModel`)(service.get('sqlManager').getInstance('main')));
service.set('vaultifyManager', new VaultifyManager(databaseModel.get('vault'), "123"));
databaseModel.set('authenticationGroupsModel', require(`@models/authenticationGroupsModel`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('authenticationRolesModel', require(`@models/authenticationRolesModel`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('groupClosureModel', require(`@models/groupClosureModel`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('group', require(`@models/groupModel`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('groupRolesModel', require(`@models/groupRolesModel`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('objectSourceModel', require(`@models/objectSourceModel`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('permissionModel', require(`@models/permissionModel`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('roleModel', require(`@models/roleModel`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('rolePermissionsModel', require(`@models/rolePermissionsModel`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('authenticationOverviewView', require(`@models/authenticationOverviewView`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('groupOverviewView', require(`@models/groupOverviewView`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('roleOverviewView', require(`@models/roleOverviewView`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('permissionTraceView', require(`@models/permissionTraceView`)(service.get('sqlManager').getInstance('main')));
databaseModel.set('permissionOverviewView', require(`@models/permissionOverviewView`)(service.get('sqlManager').getInstance('main')));
service.set('activeDirectoryManager', new ActiveDirectory(runtimeFile.configuration.live.integration.activedirectory))
service.set('rbacManager', new RBACManager(databaseModel, runtimeFile.configuration.live.integration.token.secret, service));
service.set('authenticationManager', new AuthenticationManager(databaseModel.get('authentication'), runtimeFile.configuration.live.integration.token.secret));
// everytime last created service!
service.set('pluginManager', new PluginManager(app, databaseModel.get('plugin'), localPath.plugins, runtimeFile.configuration.live.plugin.chown, service));
exports.databaseModel = databaseModel;
exports.service = service;
exports.path = localPath;
//#endregion
require(`${localPath.root}/utils.js`);
let helpers = service.get('fileSystemManager').loadAllFiles(`${localPath.public}/helpers`, '.js');
exports.helpers = helpers;
// app.use(service.get('vaultifyManager').createMiddleware());
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(cookieParser());
app.use(favicon(`${localPath.public}/images/radix_os_icon.ico`));
app.use(express.static(localPath.root));
app.use(express.static(localPath.public));
app.use(express.static(localPath.source));
//#region Service-Registration/Middleware/Utils/Helpers
app.use(service.get('rbacManager').authenticate());
app.use(service.get('rbacManager').requirePermissionMiddleware());
app.use(function(request, response, next) {
if (!request.secure) {
return response.redirect("https://" + request.headers.host + request.url + runtimeFile.configuration.live.server.port);
}
next(); // Http redirection to secure protocol
})
//#endregion
//#region App config values
app.set('view engine', '.hbs');
app.set('views', [
`${localPath.public}/views`,
`${localPath.public}/views/integrated`
]);
app.set('trust proxy', true)
//#endregion
//#region Error exception handling
app.on('uncaughtException', (err) => service.get('eventManager').write(null, 8, null, err ));
process.on('uncaughtException', (err) => service.get('eventManager').write(null, 8, null, err ));
process.on('unhandledRejection', (reason, promise) => service.get('eventManager').write(null, 8, null, reason ));
//#endregion
app.engine('hbs', create({
extname: 'hbs',
helpers: helpers,
partialsDir: `${localPath.public}/views/partials`,
layoutsDir: `${localPath.public}/views/layouts`,
defaultLayout: `${localPath.public}/views/layouts/default.hbs`
}).engine)
server.listen(runtimeFile.configuration.live.server.port, () => {
(async () => {
const databaseTest = await service.get('sqlManager').test("main"); // Check if database connection is established
service.get('eventManager').write(null, databaseTest.levelId, null, databaseTest.message);
// Loading plugins
const plugins = await service.get('pluginManager').loadAll()
plugins.forEach(plugin => {
service.get('eventManager').write(null, plugin.levelId, null, `${plugin.pluginName} v${plugin.metadata.version} ${plugin.message}`);
});
//#region Menu-Generator
app.use(async (req, res, next) => {
next();
});
//#endregion
//#region Implement routes
require(`${localPath.source}/routes/loginRoutes.js`).route(app, service); // #1 - no token security! important: first!!!
require(`${localPath.source}/routes/indexRoutes.js`).route(app, service); // #2 - token security enabled at this point
require(`${localPath.source}/routes/adminRoutes.js`).route(app, service); // #3 - token security always enabled
//#endregion
//#region Implements sockets
require(`${localPath.source}/sockets/mainSocket.js`)(
app,
service.get('socketManager'),
'/',
service.get('pluginManager'),
databaseModel.get('authentication'),
service.get('fileSystemManager'),
service.get('eventManager'),
service.get('activeDirectoryManager')
);
require(`${localPath.source}/sockets/adminSocket.js`)(
app,
service.get('socketManager'),
'admin',
service.get('eventManager')
);
//#endregion
})();
setTimeout(() => {
service.get('eventManager').write(null, 1, null,
`${runtimeFile.configuration.live.server.name} is running`,
`fqdn: https://${os.hostname()}:${runtimeFile.configuration.live.server.port}/`,
`process id: ${process.pid}`,
`url: ${os.hostname()}`,
`port: ${runtimeFile.configuration.live.server.port}`
)
}, 1000);
});
})();