space_helpers.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. 'use strict';
  2. const db = require('../models/db');
  3. var config = require('config');
  4. module.exports = (req, res, next) => {
  5. let spaceId = req.params.id;
  6. let finalizeReq = (space, role) => {
  7. if (role === "none") {
  8. res.status(403).json({
  9. "error": "access denied"
  10. });
  11. } else {
  12. req['space'] = space;
  13. req['spaceRole'] = role;
  14. res.header("x-spacedeck-space-role", req['spaceRole']);
  15. next();
  16. }
  17. };
  18. var finalizeAnonymousLogin = function(space, spaceAuth) {
  19. var role = "none";
  20. if (spaceAuth && (spaceAuth === space.edit_hash)) {
  21. role = "editor";
  22. } else {
  23. if (space.access_mode == "public") {
  24. role = "viewer";
  25. } else {
  26. role = "none";
  27. }
  28. }
  29. if (req.user) {
  30. db.getUserRoleInSpace(space, req.user, function(newRole) {
  31. if (newRole == "admin" && (role == "editor" || role == "viewer")) {
  32. finalizeReq(space, newRole);
  33. } else if (newRole == "editor" && (role == "viewer")) {
  34. finalizeReq(space, newRole);
  35. } else {
  36. finalizeReq(space, role);
  37. }
  38. });
  39. } else {
  40. finalizeReq(space, role);
  41. }
  42. };
  43. var userMapping = {
  44. '_id': 1,
  45. 'nickname': 1,
  46. 'email': 1
  47. };
  48. db.Space.findOne({where: {
  49. "_id": spaceId
  50. }}).then(function(space) {
  51. //.populate("creator", userMapping)
  52. //if (err) {
  53. // res.status(400).json(err);
  54. //} else {
  55. if (space) {
  56. if (space.access_mode == "public") {
  57. if (space.password) {
  58. if (req.spacePassword) {
  59. if (req.spacePassword === space.password) {
  60. finalizeAnonymousLogin(space, req["spaceAuth"]);
  61. } else {
  62. res.status(403).json({
  63. "error": "password_wrong"
  64. });
  65. }
  66. } else {
  67. res.status(401).json({
  68. "error": "password_required"
  69. });
  70. }
  71. } else {
  72. finalizeAnonymousLogin(space, req["spaceAuth"]);
  73. }
  74. } else {
  75. // space is private
  76. // special permission for screenshot/pdf export from backend
  77. if (req.query['api_token'] && req.query['api_token'] == config.get('phantom_api_secret')) {
  78. finalizeReq(space, "viewer");
  79. return;
  80. }
  81. if (req.user) {
  82. db.getUserRoleInSpace(space, req.user, function(role) {
  83. if (role == "none") {
  84. finalizeAnonymousLogin(space, req["spaceAuth"]);
  85. } else {
  86. finalizeReq(space, role);
  87. }
  88. });
  89. } else {
  90. if (req.spaceAuth && space.edit_hash) {
  91. finalizeAnonymousLogin(space, req["spaceAuth"]);
  92. } else {
  93. res.status(403).json({
  94. "error": "auth_required"
  95. });
  96. }
  97. }
  98. }
  99. } else {
  100. res.status(404).json({
  101. "error": "space_not_found"
  102. });
  103. }
  104. });
  105. }