Files
NetDomainManager/index.js
T

118 lines
2.8 KiB
JavaScript
Raw Normal View History

2026-05-12 19:29:45 -04:00
// Main App
const express = require('express');
const app = express();
const exphbs = require ('express-handlebars');
const { SetupEnvironment } = require('./environ');
const SetupRouter = require('./router');
2026-05-13 19:27:59 -04:00
const bodyParser = require("body-parser");
const sessionMw = require('./session');
const csrf = require("./csrf");
// Setup the environment
SetupEnvironment();
2026-05-12 19:29:45 -04:00
// Database
const database = require('./database');
// Session
const session = require('express-session');
const SequelizeStore = require('connect-session-sequelize')(session.Store);
const cookieParser = require('cookie-parser');
// Error Handling
const { GenericErrorByCode, FormatForAPI } = require('./errors');
// Helpers
const { HBSHelpers } = require('./helpers');
// Security
const helmet = require('helmet');
// Get what we need for starting the server
const serverPort = process.env.SRV_PORT;
2026-05-14 11:41:00 -04:00
const serverInterface = process.env.SRV_IF;
2026-05-12 19:29:45 -04:00
// Database Setup
const db = database.db;
const sessionStore = new SequelizeStore({
db: db,
2026-05-13 19:27:59 -04:00
tableName: 'Session'
2026-05-12 19:29:45 -04:00
})
2026-05-13 19:27:59 -04:00
// Body parsing
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
2026-05-12 19:29:45 -04:00
// Helmet setup
app.use(
helmet.contentSecurityPolicy({
2026-05-13 19:27:59 -04:00
directives: (req, res) => ({
2026-05-12 19:29:45 -04:00
defaultSrc: ["'self'"],
2026-05-13 19:27:59 -04:00
scriptSrc: ["'strict-dynamic'", `'nonce-${res.locals.nonce}'`],
2026-05-12 19:29:45 -04:00
objectSrc: ["'none'"],
styleSrc: ["'self'", "'unsafe-inline'"],
imgSrc: ["'self'", 'data:', '*'],
mediaSrc: ["'self'", 'data:', '*'],
connectSrc: ["'self'", 'data:', '*']
2026-05-13 19:27:59 -04:00
}),
2026-05-12 19:29:45 -04:00
})
);
// Handlebars Setup
const hbs = exphbs.create({
helpers: HBSHelpers,
defaultLayout: 'main',
extname: '.handlebars',
runtimeOptions: {
allowProtoPropertiesByDefault: true,
allowProtoMethodsByDefault: true,
},
});
app.engine('handlebars', hbs.engine);
app.set('view engine', 'handlebars');
// Cookie parsing
app.use(cookieParser(process.env.CKYKEY));
// Session
app.use(session({
name: 'session',
secret: process.env.SESSKEY,
resave: false,
saveUninitialized: false,
store: sessionStore,
cookie: {
httpOnly: true,
2026-05-13 19:27:59 -04:00
secure: false,
sameSite: 'lax',
path: '/'
2026-05-12 19:29:45 -04:00
},
}));
// Setup Assets
app.use(express.static('assets'));
2026-05-13 19:27:59 -04:00
// Session middlware
app.use(sessionMw.PersistSession);
// CSRF protection
app.use(csrf.csrfSynchronisedProtection);
2026-05-12 19:29:45 -04:00
// Setup Router
SetupRouter(app);
db.sync().then(() => {
app.use((req, res, next) => {
next(GenericErrorByCode(404));
});
app.use((err, req, res, next) => {
res.status(err.status || 500);
res.json(FormatForAPI(err.message || 'Internal Server Error'));
});
2026-05-14 11:41:00 -04:00
app.listen(serverPort, serverInterface, () => {
console.log(`NDM running @ ${serverInterface}:${serverPort}`);
2026-05-12 19:29:45 -04:00
});
});