middlewares.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. var debug = require('debug')('crowi:lib:middlewares');
  2. exports.loginChecker = function(crowi, app) {
  3. return function(req, res, next) {
  4. var User = crowi.model('User');
  5. // session に user object が入ってる
  6. if (req.session.user && '_id' in req.session.user) {
  7. 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(crowi, app) {
  24. return function(req, res, next) {
  25. require('../util/swigFunctions')(crowi, app, res.locals);
  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
  42. .replace(/[\n]+#/g, '\n\n\n#')
  43. .replace(/\s(https?.+(jpe?g|png|gif))\s/, '\n\n\n![]($1)\n\n\n');
  44. });
  45. swig.setFilter('picture', function(user) {
  46. if (!user) {
  47. return '';
  48. }
  49. user.fbId = user.userId; // migration
  50. if (user.image && user.image != '/images/userpicture.png') {
  51. return user.image;
  52. } else if (user.fbId) {
  53. return '//graph.facebook.com/' + user.fbId + '/picture?size=square';
  54. } else {
  55. return '/images/userpicture.png';
  56. }
  57. });
  58. next();
  59. };
  60. };
  61. exports.adminRequired = function() {
  62. return function(req, res, next) {
  63. if (req.user && '_id' in req.user) {
  64. if (req.user.admin) {
  65. next();
  66. return;
  67. }
  68. return res.redirect('/');
  69. }
  70. return res.redirect('/login');
  71. };
  72. };
  73. exports.loginRequired = function(crowi, app) {
  74. return function(req, res, next) {
  75. var User = crowi.model('User')
  76. if (req.user && '_id' in req.user) {
  77. if (req.user.status === User.STATUS_ACTIVE) {
  78. // Active の人だけ先に進める
  79. return next();
  80. } else if (req.user.status === User.STATUS_REGISTERED) {
  81. return res.redirect('/login/error/registered');
  82. } else if (req.user.status === User.STATUS_SUSPENDED) {
  83. return res.redirect('/login/error/suspended');
  84. } else if (req.user.status === User.STATUS_INVITED) {
  85. return res.redirect('/login/invited');
  86. }
  87. }
  88. req.session.jumpTo = req.originalUrl;
  89. return res.redirect('/login');
  90. };
  91. };
  92. // this is for Installer
  93. exports.applicationNotInstalled = function() {
  94. return function(req, res, next) {
  95. var config = req.config;
  96. if (Object.keys(config.crowi).length !== 1) {
  97. return res.render('500', { error: 'Application already installed.' });
  98. }
  99. return next();
  100. };
  101. };
  102. exports.applicationInstalled = function() {
  103. return function(req, res, next) {
  104. var config = req.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. };