var fs = require('fs'); var app = require('express')(); var https = require('https').Server( { key: fs.readFileSync(__dirname + '/../ssl/server.key'), cert: fs.readFileSync(__dirname + '/../ssl/server.cert'), // TLS Versions maxVersion: 'TLSv1.3', minVersion: 'TLSv1.2', // Hardened configuration ciphers: 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384', honorCipherOrder: false, }, app, ); app.disable('x-powered-by'); var io = require('socket.io')(https, { cors: { origin: '*', }, }); var bodyParser = require('body-parser'); var cookieParser = require('cookie-parser'); var utils = require('./lib/utils'); // Get configuration var env = process.env.NODE_ENV || 'dev'; var config = require('./config/config.json')[env]; global.__basedir = __dirname; // Database connection var mongoose = require('mongoose'); // Use native promises mongoose.Promise = global.Promise; // Trim all Strings mongoose.Schema.Types.String.set('trim', true); mongoose.connect( `mongodb://${config.database.server}:${config.database.port}/${config.database.name}`, {}, ); // Models import require('./models/user'); require('./models/audit'); require('./models/client'); require('./models/company'); require('./models/template'); require('./models/vulnerability'); require('./models/vulnerability-update'); require('./models/language'); require('./models/audit-type'); require('./models/vulnerability-type'); require('./models/vulnerability-category'); require('./models/custom-section'); require('./models/custom-field'); require('./models/image'); require('./models/settings'); // Socket IO configuration io.on('connection', socket => { socket.on('join', data => { console.log( `user ${data.username.replace(/\n|\r/g, '')} joined room ${data.room.replace(/\n|\r/g, '')}`, ); socket.username = data.username; do { socket.color = '#' + (0x1000000 + Math.random() * 0xffffff).toString(16).substr(1, 6); } while (socket.color === '#77c84e'); socket.join(data.room); io.to(data.room).emit('updateUsers'); }); socket.on('leave', data => { console.log( `user ${data.username.replace(/\n|\r/g, '')} left room ${data.room.replace(/\n|\r/g, '')}`, ); socket.leave(data.room); io.to(data.room).emit('updateUsers'); }); socket.on('updateUsers', data => { var userList = [ ...new Set( utils.getSockets(io, data.room).map(s => { var user = {}; user.username = s.username; user.color = s.color; user.menu = s.menu; if (s.finding) user.finding = s.finding; if (s.section) user.section = s.section; return user; }), ), ]; io.to(data.room).emit('roomUsers', userList); }); socket.on('menu', data => { socket.menu = data.menu; data.finding ? (socket.finding = data.finding) : delete socket.finding; data.section ? (socket.section = data.section) : delete socket.section; io.to(data.room).emit('updateUsers'); }); socket.on('disconnect', () => { socket.broadcast.emit('updateUsers'); }); }); // CORS app.use(function (req, res, next) { res.header('Access-Control-Allow-Origin', req.headers.origin); res.header('Access-Control-Allow-Methods', 'GET,POST,DELETE,PUT,OPTIONS'); res.header( 'Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept', ); res.header('Access-Control-Expose-Headers', 'Content-Disposition'); res.header('Access-Control-Allow-Credentials', 'true'); next(); }); // CSP app.use(function (req, res, next) { res.header( 'Content-Security-Policy', "default-src 'none'; form-action 'none'; base-uri 'self'; frame-ancestors 'none'; sandbox; require-trusted-types-for 'script';", ); next(); }); app.use(bodyParser.json({ limit: '100mb' })); app.use( bodyParser.urlencoded({ limit: '10mb', extended: false, // do not need to take care about images, videos -> false: only strings }), ); app.use(cookieParser()); // Routes import require('./routes/user')(app); require('./routes/audit')(app, io); require('./routes/client')(app); require('./routes/company')(app); require('./routes/vulnerability')(app); require('./routes/template')(app); require('./routes/vulnerability')(app); require('./routes/data')(app); require('./routes/image')(app); require('./routes/settings')(app); require('./routes/cwe')(app); require('./routes/cvss')(app); require('./routes/check-cwe-update')(app); require('./routes/update-cwe-model')(app); app.get('*', function (req, res) { res.status(404).json({ status: 'error', data: 'Route undefined' }); }); // Start server https.listen(config.port, config.host); module.exports = app;