//#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, { pingTimeout: 60000, 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('groupModel', 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'))); service.set('rbacManager', new RBACManager(databaseModel, runtimeFile.configuration.live.integration.token.secret)); service.set('authenticationManager', new AuthenticationManager(databaseModel.get('authentication'), runtimeFile.configuration.live.integration.token.secret)); service.set('activeDirectoryManager', new ActiveDirectory(runtimeFile.configuration.live.integration.activedirectory)) // 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); }); })();