middlewares.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. var debug = require('debug')('crowi:lib:middlewares')
  2. ;
  3. exports.loginChecker = function(app, models) {
  4. return function(req, res, next) {
  5. // session に user object が入ってる
  6. if (req.session.user && '_id' in req.session.user) {
  7. models.User.findById(req.session.user._id, function(err, userData) {
  8. if (err) {
  9. next()
  10. } else {
  11. req.user = req.session.user = userData;
  12. res.locals({user: req.user});
  13. next();
  14. }
  15. });
  16. } else {
  17. req.user = req.session.user = false;
  18. res.locals({user: req.user});
  19. next();
  20. }
  21. };
  22. };
  23. exports.swigFunctions = function(app) {
  24. return function(req, res, next) {
  25. res.locals(require('../lib/swigFunctions')(app));
  26. next();
  27. };
  28. };
  29. exports.swigFilters = function(app, swig) {
  30. return function(req, res, next) {
  31. swig.setFilter('path2name', function(string) {
  32. return string.replace(/.+\/(.+)?$/, '$1');
  33. });
  34. swig.setFilter('datetz', function(input, format) {
  35. // timezone
  36. var swigFilters = require('swig/lib/filters')
  37. return swigFilters.date(input, format, app.get('tzoffset'));
  38. });
  39. swig.setFilter('presentation', function(string) {
  40. // 手抜き
  41. return string.replace(/[\n]+#/g, '\n\n\n#');
  42. });
  43. swig.setFilter('picture', function(user) {
  44. if (!user) {
  45. return '';
  46. }
  47. user.fbId = user.userId; // migration
  48. if (user.image && user.image != '/images/userpicture.png') {
  49. return user.image;
  50. } else if (user.fbId) {
  51. return '//graph.facebook.com/' + user.fbId + '/picture?size=square';
  52. } else {
  53. return '/images/userpicture.png';
  54. }
  55. });
  56. next();
  57. };
  58. };
  59. exports.adminRequired = function() {
  60. return function(req, res, next) {
  61. if (req.user && '_id' in req.user) {
  62. if (req.user.admin) {
  63. next();
  64. return;
  65. }
  66. return res.redirect('/');
  67. }
  68. return res.redirect('/login');
  69. };
  70. };
  71. exports.loginRequired = function() {
  72. return function(req, res, next) {
  73. if (req.user && '_id' in req.user) {
  74. // TODO 移行おわったら削除
  75. if (req.user.email && !req.user.password && req.route.path != '/me/password') {
  76. return res.redirect('/me/password');
  77. }
  78. return next();
  79. }
  80. req.session.jumpTo = req.originalUrl;
  81. return res.redirect('/login');
  82. };
  83. };
  84. // this is for Installer
  85. exports.applicationNotInstalled = function() {
  86. return function(req, res, next) {
  87. var config = req.config;
  88. debug('config.crowi', Object.keys(config.crowi).length);
  89. if (Object.keys(config.crowi).length != 0) {
  90. return res.render('500', { error: 'Application already installed.' });
  91. }
  92. return next();
  93. };
  94. };
  95. exports.applicationInstalled = function() {
  96. return function(req, res, next) {
  97. var config = req.config;
  98. if (Object.keys(config.crowi).length == 0) {
  99. return res.redirect('/installer');
  100. }
  101. return next();
  102. };
  103. };