middlewares.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. var debug = require('debug')('crowi:lib:middlewares');
  2. exports.loginChecker = function(app, models) {
  3. return function(req, res, next) {
  4. // session に user object が入ってる
  5. if (req.session.user && '_id' in req.session.user) {
  6. models.User.findById(req.session.user._id, function(err, userData) {
  7. if (err) {
  8. next();
  9. } else {
  10. req.user = req.session.user = userData;
  11. res.locals.user = req.user;
  12. next();
  13. }
  14. });
  15. } else {
  16. req.user = req.session.user = false;
  17. res.locals.user = req.user;
  18. next();
  19. }
  20. };
  21. };
  22. exports.swigFunctions = function(app) {
  23. return function(req, res, next) {
  24. require('../util/swigFunctions')(app, res.locals);
  25. next();
  26. };
  27. };
  28. exports.swigFilters = function(app, swig) {
  29. return function(req, res, next) {
  30. swig.setFilter('path2name', function(string) {
  31. return string.replace(/.+\/(.+)?$/, '$1');
  32. });
  33. swig.setFilter('datetz', function(input, format) {
  34. // timezone
  35. var swigFilters = require('swig/lib/filters');
  36. return swigFilters.date(input, format, app.get('tzoffset'));
  37. });
  38. swig.setFilter('presentation', function(string) {
  39. // 手抜き
  40. return string
  41. .replace(/[\n]+#/g, '\n\n\n#')
  42. .replace(/\s(https?.+(jpe?g|png|gif))\s/, '\n\n\n![]($1)\n\n\n');
  43. });
  44. swig.setFilter('picture', function(user) {
  45. if (!user) {
  46. return '';
  47. }
  48. user.fbId = user.userId; // migration
  49. if (user.image && user.image != '/images/userpicture.png') {
  50. return user.image;
  51. } else if (user.fbId) {
  52. return '//graph.facebook.com/' + user.fbId + '/picture?size=square';
  53. } else {
  54. return '/images/userpicture.png';
  55. }
  56. });
  57. next();
  58. };
  59. };
  60. exports.adminRequired = function() {
  61. return function(req, res, next) {
  62. if (req.user && '_id' in req.user) {
  63. if (req.user.admin) {
  64. next();
  65. return;
  66. }
  67. return res.redirect('/');
  68. }
  69. return res.redirect('/login');
  70. };
  71. };
  72. exports.loginRequired = function(app) {
  73. return function(req, res, next) {
  74. var models = app.set('models');
  75. if (req.user && '_id' in req.user) {
  76. if (req.user.status === models.User.STATUS_ACTIVE) {
  77. // Active の人だけ先に進める
  78. return next();
  79. } else if (req.user.status === models.User.STATUS_REGISTERED) {
  80. return res.redirect('/login/error/registered');
  81. } else if (req.user.status === models.User.STATUS_SUSPENDED) {
  82. return res.redirect('/login/error/suspended');
  83. } else if (req.user.status === models.User.STATUS_INVITED) {
  84. return res.redirect('/login/invited');
  85. }
  86. }
  87. req.session.jumpTo = req.originalUrl;
  88. return res.redirect('/login');
  89. };
  90. };
  91. // this is for Installer
  92. exports.applicationNotInstalled = function() {
  93. return function(req, res, next) {
  94. var config = req.config;
  95. if (Object.keys(config.crowi).length !== 1) {
  96. return res.render('500', { error: 'Application already installed.' });
  97. }
  98. return next();
  99. };
  100. };
  101. exports.applicationInstalled = function() {
  102. return function(req, res, next) {
  103. var config = req.config;
  104. console.log(config);
  105. if (Object.keys(config.crowi).length === 1) { // app:url is set by process
  106. return res.redirect('/installer');
  107. }
  108. return next();
  109. };
  110. };
  111. exports.awsEnabled = function() {
  112. return function (req, res, next) {
  113. var config = req.config;
  114. if (config.crowi['aws:region'] !== '' && config.crowi['aws:bucket'] !== '' && config.crowi['aws:accessKeyId'] !== '' && config.crowi['aws:secretAccessKey'] !== '') {
  115. req.flash('globalError', 'AWS settings required to use this function. Please ask the administrator.');
  116. return res.redirect('/');
  117. }
  118. return next();
  119. };
  120. };