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.

98 lines
2.6 KiB

  1. const express = require('express');
  2. const mustacheExpress = require('mustache-express');
  3. const portfinder = require('portfinder');
  4. const session = require('express-session');
  5. const jwt = require('jsonwebtoken');
  6. const config = require('./config');
  7. const setupExpress = (port) => {
  8. const app = express();
  9. app.engine('mustache', mustacheExpress());
  10. app.set('view engine', 'mustache');
  11. app.set('views', __dirname + '/views');
  12. app.set('trust proxy', 1);
  13. app.use(session({
  14. secret: 'somesecret',
  15. resave: false,
  16. saveUninitialized: true,
  17. cookie: { secure: false }
  18. }));
  19. app.use(express.static('public'));
  20. app.use(express.urlencoded({ extended: false }));
  21. setupRoutes(app);
  22. app.listen(port, () => console.log(`Tiny Drive starter project is now available at: http://localhost:${port}/`));
  23. };
  24. const setupRoutes = (app) => {
  25. app.get('/', (req, res) => {
  26. res.render('index');
  27. });
  28. app.get('/editor', (req, res) => {
  29. if (req.session.user) {
  30. res.render('editor', { apiKey: config.apiKey, user: req.session.user });
  31. } else {
  32. res.redirect('/');
  33. }
  34. });
  35. app.get('/logout', (req, res) => {
  36. req.session.destroy();
  37. res.redirect('/');
  38. });
  39. app.post('/jwt', (req, res) => {
  40. const user = req.session.user;
  41. if (user) {
  42. const payload = {
  43. sub: user.login, // Unique user id string
  44. name: user.name, // Full name of user
  45. exp: Math.floor(Date.now() / 1000) + (60 * 10) // 10 minutes expiration
  46. };
  47. // Scopes the path to a specific user directory
  48. if (config.scopeUser) {
  49. payload['https://claims.tiny.cloud/drive/root'] = `/${user.login}`;
  50. }
  51. try {
  52. const privateKey = fs.readFileSync(config.privateKeyFile);
  53. const token = jwt.sign(payload, privateKey, { algorithm: 'RS256'});
  54. res.json({ token });
  55. } catch (e) {
  56. res.status(500);
  57. res.send('Failed generate jwt token.');
  58. }
  59. } else {
  60. res.status(401);
  61. res.send('Could not produce a jwt token since the user is not logged in.');
  62. }
  63. });
  64. app.post('/', (req, res) => {
  65. const user = config.users.find(({ login, password }) => login === req.body.login && password === req.body.password);
  66. if (user) {
  67. req.session.user = user;
  68. res.redirect('/editor');
  69. } else {
  70. res.render('index', { error: 'Incorrect username or password.' })
  71. }
  72. });
  73. };
  74. portfinder.getPort({
  75. port: 3000,
  76. stopPort: 4000
  77. }, (err, port) => {
  78. if (err) {
  79. console.error('Error:', err.message);
  80. process.exit(-1);
  81. } else {
  82. setupExpress(port);
  83. }
  84. });