A simple file sharing site with an easy to use API and online panel.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
2.8KB

  1. const https = require('https');
  2. const fs = require('fs');
  3. const express = require('express');
  4. const bodyParser = require('body-parser');
  5. const methodOverride = require('method-override');
  6. const mongoose = require('mongoose');
  7. const morgan = require('morgan');
  8. const passport = require('passport');
  9. const session = require('express-session');
  10. const sanitizer = require('express-sanitizer');
  11. const helmet = require('helmet');
  12. const rateLimit = require('express-rate-limit');
  13. const app = express();
  14. const config = require('config');
  15. // MongoDB
  16. const dbHost = config.get('Database.host');
  17. let db;
  18. mongoose.connect(dbHost, {useNewUrlParser: true})
  19. .then(() => {
  20. console.log('Connected to database ' + dbHost + '\n');
  21. db = mongoose.connection;
  22. });
  23. const MongoStore = require('connect-mongo')(session);
  24. const mongoStore = new MongoStore({url: dbHost});
  25. // HTTP Request Logging
  26. if (config.get('Log.http'))
  27. app.use(morgan(config.get('Log.httpLevel')));
  28. // Session setup
  29. app.use(helmet());
  30. app.set('trust proxy', 1);
  31. app.use(session({
  32. secret: 'secret',
  33. name: 'session.id',
  34. resave: false,
  35. saveUninitialized: false,
  36. store: mongoStore,
  37. cookie: {
  38. //secure: true,
  39. httpOnly: true,
  40. //domain: 'shrimpa.rocks',
  41. maxAge: 1000 * 60 * 60
  42. }
  43. }));
  44. // Middleware
  45. app.use(passport.initialize(null));
  46. app.use(passport.session(null));
  47. app.use(bodyParser.json());
  48. app.use(bodyParser.json({ type: 'application/*+json' }));
  49. app.use(bodyParser.urlencoded({ extended: true }));
  50. app.use(bodyParser.text());
  51. app.use(sanitizer());
  52. app.use(methodOverride('X-HTTP-Method-Override'));
  53. // Rate limiter
  54. const global_limiter = rateLimit({
  55. windowMs: 60 * 1000, // 1 minute
  56. max: 60 // limit to 1 request/second
  57. });
  58. if (config.get('RateLimit.enable'))
  59. app.use(global_limiter);
  60. // Static directories and favicon
  61. //app.use(favicon(__dirname + '/public/img/favicon.ico'));
  62. app.use(express.static(__dirname + '/public'));
  63. // Install routes and configure authentication strategy
  64. require('./app/routes/routes.js')(app);
  65. require('./config/passport.js');
  66. // Error handler
  67. app.use((err, req, res, next) => {
  68. console.error('Unhandled error!');
  69. console.error(err);
  70. res.status(500).json({'message': 'Internal server error.'});
  71. });
  72. app.set('trust proxy', config.get('Server.trustProxy'));
  73. // Start app
  74. const port = config.get('Server.port');
  75. let server;
  76. if (config.get('Server.tls')) {
  77. const options = {
  78. cert: fs.readFileSync('./cert.pem'),
  79. key: fs.readFileSync('./privkey.pem'),
  80. };
  81. server = https.createServer(options, app).listen(port, () =>
  82. console.log(`Listening on port ${port}...`));
  83. } else {
  84. server = app.listen(port, () =>
  85. console.log(`Listening on port ${port}...`));
  86. }
  87. // Expose app
  88. module.exports.app = app;
  89. module.exports.server = server;