A simple file sharing site with an easy to use API and online panel.
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

105 wiersze
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;