middlewares.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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. var name = string.replace(/(\/)$/, '');
  33. if (name.match(/.+\/([^/]+\/\d{4}\/\d{2}\/\d{2})$/)) { // /.../hoge/YYYY/MM/DD 形式のページ
  34. return name.replace(/.+\/([^/]+\/\d{4}\/\d{2}\/\d{2})$/, '$1');
  35. }
  36. if (name.match(/.+\/([^/]+\/\d{4}\/\d{2})$/)) { // /.../hoge/YYYY/MM 形式のページ
  37. return name.replace(/.+\/([^/]+\/\d{4}\/\d{2})$/, '$1');
  38. }
  39. if (name.match(/.+\/([^/]+\/\d{4})$/)) { // /.../hoge/YYYY 形式のページ
  40. return name.replace(/.+\/([^/]+\/\d{4})$/, '$1');
  41. }
  42. return name.replace(/.+\/(.+)?$/, '$1'); // ページの末尾を拾う
  43. });
  44. swig.setFilter('datetz', function(input, format) {
  45. // timezone
  46. var swigFilters = require('swig/lib/filters');
  47. return swigFilters.date(input, format, app.get('tzoffset'));
  48. });
  49. swig.setFilter('nl2br', function(string) {
  50. return string
  51. .replace(/\n/g, '<br>');
  52. });
  53. swig.setFilter('insertSpaceToEachSlashes', function(string) {
  54. if (string == '/') {
  55. return string;
  56. }
  57. return string.replace(/\//g, ' / ');
  58. });
  59. swig.setFilter('removeLastSlash', function(string) {
  60. if (string == '/') {
  61. return string;
  62. }
  63. return string.substr(0, string.length - 1);
  64. });
  65. swig.setFilter('presentation', function(string) {
  66. // 手抜き
  67. return string
  68. .replace(/[\n]+#/g, '\n\n\n#')
  69. .replace(/\s(https?.+(jpe?g|png|gif))\s/, '\n\n\n![]($1)\n\n\n');
  70. });
  71. swig.setFilter('picture', function(user) {
  72. if (!user) {
  73. return '';
  74. }
  75. user.fbId = user.userId; // migration
  76. if (user.image && user.image != '/images/userpicture.png') {
  77. return user.image;
  78. } else if (user.fbId) {
  79. return '//graph.facebook.com/' + user.fbId + '/picture?size=square';
  80. } else {
  81. return '/images/userpicture.png';
  82. }
  83. });
  84. next();
  85. };
  86. };
  87. exports.adminRequired = function() {
  88. return function(req, res, next) {
  89. if (req.user && '_id' in req.user) {
  90. if (req.user.admin) {
  91. next();
  92. return;
  93. }
  94. return res.redirect('/');
  95. }
  96. return res.redirect('/login');
  97. };
  98. };
  99. exports.loginRequired = function(crowi, app) {
  100. return function(req, res, next) {
  101. var User = crowi.model('User')
  102. if (req.user && '_id' in req.user) {
  103. if (req.user.status === User.STATUS_ACTIVE) {
  104. // Active の人だけ先に進める
  105. return next();
  106. } else if (req.user.status === User.STATUS_REGISTERED) {
  107. return res.redirect('/login/error/registered');
  108. } else if (req.user.status === User.STATUS_SUSPENDED) {
  109. return res.redirect('/login/error/suspended');
  110. } else if (req.user.status === User.STATUS_INVITED) {
  111. return res.redirect('/login/invited');
  112. }
  113. }
  114. req.session.jumpTo = req.originalUrl;
  115. return res.redirect('/login');
  116. };
  117. };
  118. exports.accessTokenParser = function(crowi, app) {
  119. return function(req, res, next) {
  120. var accessToken = req.query.access_token;
  121. if (!accessToken) {
  122. return next();
  123. }
  124. var User = crowi.model('User')
  125. User.findUserByApiToken(accessToken)
  126. .then(function(userData) {
  127. req.user = userData;
  128. next();
  129. }).catch(function(err) {
  130. next();
  131. });
  132. };
  133. };
  134. // this is for Installer
  135. exports.applicationNotInstalled = function() {
  136. return function(req, res, next) {
  137. var config = req.config;
  138. if (Object.keys(config.crowi).length !== 1) {
  139. return res.render('500', { error: 'Application already installed.' });
  140. }
  141. return next();
  142. };
  143. };
  144. exports.applicationInstalled = function() {
  145. return function(req, res, next) {
  146. var config = req.config;
  147. if (Object.keys(config.crowi).length === 1) { // app:url is set by process
  148. return res.redirect('/installer');
  149. }
  150. return next();
  151. };
  152. };
  153. exports.awsEnabled = function() {
  154. return function (req, res, next) {
  155. var config = req.config;
  156. if (config.crowi['aws:region'] !== '' && config.crowi['aws:bucket'] !== '' && config.crowi['aws:accessKeyId'] !== '' && config.crowi['aws:secretAccessKey'] !== '') {
  157. req.flash('globalError', 'AWS settings required to use this function. Please ask the administrator.');
  158. return res.redirect('/');
  159. }
  160. return next();
  161. };
  162. };