ParseCLP.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  7. var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
  8. var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
  9. var _ParseRole = _interopRequireDefault(require("./ParseRole"));
  10. var _ParseUser = _interopRequireDefault(require("./ParseUser"));
  11. var PUBLIC_KEY = '*';
  12. var VALID_PERMISSIONS = new Map();
  13. VALID_PERMISSIONS.set('get', {});
  14. VALID_PERMISSIONS.set('find', {});
  15. VALID_PERMISSIONS.set('count', {});
  16. VALID_PERMISSIONS.set('create', {});
  17. VALID_PERMISSIONS.set('update', {});
  18. VALID_PERMISSIONS.set('delete', {});
  19. VALID_PERMISSIONS.set('addField', {});
  20. var VALID_PERMISSIONS_EXTENDED = new Map();
  21. VALID_PERMISSIONS_EXTENDED.set('protectedFields', {});
  22. var ParseCLP = function () {
  23. function ParseCLP(userId) {
  24. var _this = this;
  25. (0, _classCallCheck2.default)(this, ParseCLP);
  26. this.permissionsMap = {};
  27. var _loop = function _loop(operation) {
  28. _this.permissionsMap[operation] = Object.assign({}, group);
  29. var action = operation.charAt(0).toUpperCase() + operation.slice(1);
  30. _this[`get${action}RequiresAuthentication`] = function () {
  31. return this._getAccess(operation, 'requiresAuthentication');
  32. };
  33. _this[`set${action}RequiresAuthentication`] = function (allowed) {
  34. this._setAccess(operation, 'requiresAuthentication', allowed);
  35. };
  36. _this[`get${action}PointerFields`] = function () {
  37. return this._getAccess(operation, 'pointerFields', false);
  38. };
  39. _this[`set${action}PointerFields`] = function (pointerFields) {
  40. this._setArrayAccess(operation, 'pointerFields', pointerFields);
  41. };
  42. _this[`get${action}Access`] = function (entity) {
  43. return this._getAccess(operation, entity);
  44. };
  45. _this[`set${action}Access`] = function (entity, allowed) {
  46. this._setAccess(operation, entity, allowed);
  47. };
  48. _this[`getPublic${action}Access`] = function () {
  49. return this[`get${action}Access`](PUBLIC_KEY);
  50. };
  51. _this[`setPublic${action}Access`] = function (allowed) {
  52. this[`set${action}Access`](PUBLIC_KEY, allowed);
  53. };
  54. _this[`getRole${action}Access`] = function (role) {
  55. return this[`get${action}Access`](this._getRoleName(role));
  56. };
  57. _this[`setRole${action}Access`] = function (role, allowed) {
  58. this[`set${action}Access`](this._getRoleName(role), allowed);
  59. };
  60. };
  61. for (var _ref of VALID_PERMISSIONS.entries()) {
  62. var _ref2 = (0, _slicedToArray2.default)(_ref, 2);
  63. var operation = _ref2[0];
  64. var group = _ref2[1];
  65. _loop(operation);
  66. }
  67. for (var _ref3 of VALID_PERMISSIONS_EXTENDED.entries()) {
  68. var _ref4 = (0, _slicedToArray2.default)(_ref3, 2);
  69. var _operation = _ref4[0];
  70. var _group = _ref4[1];
  71. this.permissionsMap[_operation] = Object.assign({}, _group);
  72. }
  73. if (userId && typeof userId === 'object') {
  74. if (userId instanceof _ParseUser.default) {
  75. this.setReadAccess(userId, true);
  76. this.setWriteAccess(userId, true);
  77. } else if (userId instanceof _ParseRole.default) {
  78. this.setRoleReadAccess(userId, true);
  79. this.setRoleWriteAccess(userId, true);
  80. } else {
  81. for (var _permission in userId) {
  82. var users = userId[_permission];
  83. var isValidPermission = !!VALID_PERMISSIONS.get(_permission);
  84. var isValidPermissionExtended = !!VALID_PERMISSIONS_EXTENDED.get(_permission);
  85. var isValidGroupPermission = ['readUserFields', 'writeUserFields'].includes(_permission);
  86. if (typeof _permission !== 'string' || !(isValidPermission || isValidPermissionExtended || isValidGroupPermission)) {
  87. throw new TypeError('Tried to create an CLP with an invalid permission type.');
  88. }
  89. if (isValidGroupPermission) {
  90. if (users.every(function (pointer) {
  91. return typeof pointer === 'string';
  92. })) {
  93. this.permissionsMap[_permission] = users;
  94. continue;
  95. } else {
  96. throw new TypeError('Tried to create an CLP with an invalid permission value.');
  97. }
  98. }
  99. for (var user in users) {
  100. var allowed = users[user];
  101. if (typeof allowed !== 'boolean' && !isValidPermissionExtended && user !== 'pointerFields') {
  102. throw new TypeError('Tried to create an CLP with an invalid permission value.');
  103. }
  104. this.permissionsMap[_permission][user] = allowed;
  105. }
  106. }
  107. }
  108. } else if (typeof userId === 'function') {
  109. throw new TypeError('ParseCLP constructed with a function. Did you forget ()?');
  110. }
  111. }
  112. (0, _createClass2.default)(ParseCLP, [{
  113. key: "toJSON",
  114. value: function toJSON() {
  115. return Object.assign({}, this.permissionsMap);
  116. }
  117. }, {
  118. key: "equals",
  119. value: function equals(other) {
  120. if (!(other instanceof ParseCLP)) {
  121. return false;
  122. }
  123. var permissions = Object.keys(this.permissionsMap);
  124. var otherPermissions = Object.keys(other.permissionsMap);
  125. if (permissions.length !== otherPermissions.length) {
  126. return false;
  127. }
  128. for (var _permission2 in this.permissionsMap) {
  129. if (!other.permissionsMap[_permission2]) {
  130. return false;
  131. }
  132. var users = Object.keys(this.permissionsMap[_permission2]);
  133. var otherUsers = Object.keys(other.permissionsMap[_permission2]);
  134. if (users.length !== otherUsers.length) {
  135. return false;
  136. }
  137. for (var user in this.permissionsMap[_permission2]) {
  138. if (!other.permissionsMap[_permission2][user]) {
  139. return false;
  140. }
  141. if (this.permissionsMap[_permission2][user] !== other.permissionsMap[_permission2][user]) {
  142. return false;
  143. }
  144. }
  145. }
  146. return true;
  147. }
  148. }, {
  149. key: "_getRoleName",
  150. value: function _getRoleName(role) {
  151. var name = role;
  152. if (role instanceof _ParseRole.default) {
  153. name = role.getName();
  154. }
  155. if (typeof name !== 'string') {
  156. throw new TypeError('role must be a Parse.Role or a String');
  157. }
  158. return `role:${name}`;
  159. }
  160. }, {
  161. key: "_parseEntity",
  162. value: function _parseEntity(entity) {
  163. var userId = entity;
  164. if (userId instanceof _ParseUser.default) {
  165. userId = userId.id;
  166. if (!userId) {
  167. throw new Error('Cannot get access for a Parse.User without an id.');
  168. }
  169. } else if (userId instanceof _ParseRole.default) {
  170. userId = this._getRoleName(userId);
  171. }
  172. if (typeof userId !== 'string') {
  173. throw new TypeError('userId must be a string.');
  174. }
  175. return userId;
  176. }
  177. }, {
  178. key: "_setAccess",
  179. value: function _setAccess(permission, userId, allowed) {
  180. userId = this._parseEntity(userId);
  181. if (typeof allowed !== 'boolean') {
  182. throw new TypeError('allowed must be either true or false.');
  183. }
  184. var permissions = this.permissionsMap[permission][userId];
  185. if (!permissions) {
  186. if (!allowed) {
  187. return;
  188. } else {
  189. this.permissionsMap[permission][userId] = {};
  190. }
  191. }
  192. if (allowed) {
  193. this.permissionsMap[permission][userId] = true;
  194. } else {
  195. delete this.permissionsMap[permission][userId];
  196. }
  197. }
  198. }, {
  199. key: "_getAccess",
  200. value: function _getAccess(permission, userId) {
  201. var returnBoolean = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  202. userId = this._parseEntity(userId);
  203. var permissions = this.permissionsMap[permission][userId];
  204. if (returnBoolean) {
  205. if (!permissions) {
  206. return false;
  207. }
  208. return !!this.permissionsMap[permission][userId];
  209. }
  210. return permissions;
  211. }
  212. }, {
  213. key: "_setArrayAccess",
  214. value: function _setArrayAccess(permission, userId, fields) {
  215. userId = this._parseEntity(userId);
  216. var permissions = this.permissionsMap[permission][userId];
  217. if (!permissions) {
  218. this.permissionsMap[permission][userId] = [];
  219. }
  220. if (!fields || Array.isArray(fields) && fields.length === 0) {
  221. delete this.permissionsMap[permission][userId];
  222. } else if (Array.isArray(fields) && fields.every(function (field) {
  223. return typeof field === 'string';
  224. })) {
  225. this.permissionsMap[permission][userId] = fields;
  226. } else {
  227. throw new TypeError('fields must be an array of strings or undefined.');
  228. }
  229. }
  230. }, {
  231. key: "_setGroupPointerPermission",
  232. value: function _setGroupPointerPermission(operation, pointerFields) {
  233. var fields = this.permissionsMap[operation];
  234. if (!fields) {
  235. this.permissionsMap[operation] = [];
  236. }
  237. if (!pointerFields || Array.isArray(pointerFields) && pointerFields.length === 0) {
  238. delete this.permissionsMap[operation];
  239. } else if (Array.isArray(pointerFields) && pointerFields.every(function (field) {
  240. return typeof field === 'string';
  241. })) {
  242. this.permissionsMap[operation] = pointerFields;
  243. } else {
  244. throw new TypeError(`${operation}.pointerFields must be an array of strings or undefined.`);
  245. }
  246. }
  247. }, {
  248. key: "_getGroupPointerPermissions",
  249. value: function _getGroupPointerPermissions(operation) {
  250. return this.permissionsMap[operation];
  251. }
  252. }, {
  253. key: "setReadUserFields",
  254. value: function setReadUserFields(pointerFields) {
  255. this._setGroupPointerPermission('readUserFields', pointerFields);
  256. }
  257. }, {
  258. key: "getReadUserFields",
  259. value: function getReadUserFields() {
  260. return this._getGroupPointerPermissions('readUserFields');
  261. }
  262. }, {
  263. key: "setWriteUserFields",
  264. value: function setWriteUserFields(pointerFields) {
  265. this._setGroupPointerPermission('writeUserFields', pointerFields);
  266. }
  267. }, {
  268. key: "getWriteUserFields",
  269. value: function getWriteUserFields() {
  270. return this._getGroupPointerPermissions('writeUserFields');
  271. }
  272. }, {
  273. key: "setProtectedFields",
  274. value: function setProtectedFields(userId, fields) {
  275. this._setArrayAccess('protectedFields', userId, fields);
  276. }
  277. }, {
  278. key: "getProtectedFields",
  279. value: function getProtectedFields(userId) {
  280. return this._getAccess('protectedFields', userId, false);
  281. }
  282. }, {
  283. key: "setReadAccess",
  284. value: function setReadAccess(userId, allowed) {
  285. this._setAccess('find', userId, allowed);
  286. this._setAccess('get', userId, allowed);
  287. this._setAccess('count', userId, allowed);
  288. }
  289. }, {
  290. key: "getReadAccess",
  291. value: function getReadAccess(userId) {
  292. return this._getAccess('find', userId) && this._getAccess('get', userId) && this._getAccess('count', userId);
  293. }
  294. }, {
  295. key: "setWriteAccess",
  296. value: function setWriteAccess(userId, allowed) {
  297. this._setAccess('create', userId, allowed);
  298. this._setAccess('update', userId, allowed);
  299. this._setAccess('delete', userId, allowed);
  300. this._setAccess('addField', userId, allowed);
  301. }
  302. }, {
  303. key: "getWriteAccess",
  304. value: function getWriteAccess(userId) {
  305. return this._getAccess('create', userId) && this._getAccess('update', userId) && this._getAccess('delete', userId) && this._getAccess('addField', userId);
  306. }
  307. }, {
  308. key: "setPublicReadAccess",
  309. value: function setPublicReadAccess(allowed) {
  310. this.setReadAccess(PUBLIC_KEY, allowed);
  311. }
  312. }, {
  313. key: "getPublicReadAccess",
  314. value: function getPublicReadAccess() {
  315. return this.getReadAccess(PUBLIC_KEY);
  316. }
  317. }, {
  318. key: "setPublicWriteAccess",
  319. value: function setPublicWriteAccess(allowed) {
  320. this.setWriteAccess(PUBLIC_KEY, allowed);
  321. }
  322. }, {
  323. key: "getPublicWriteAccess",
  324. value: function getPublicWriteAccess() {
  325. return this.getWriteAccess(PUBLIC_KEY);
  326. }
  327. }, {
  328. key: "setPublicProtectedFields",
  329. value: function setPublicProtectedFields(fields) {
  330. this.setProtectedFields(PUBLIC_KEY, fields);
  331. }
  332. }, {
  333. key: "getPublicProtectedFields",
  334. value: function getPublicProtectedFields() {
  335. return this.getProtectedFields(PUBLIC_KEY);
  336. }
  337. }, {
  338. key: "getRoleReadAccess",
  339. value: function getRoleReadAccess(role) {
  340. return this.getReadAccess(this._getRoleName(role));
  341. }
  342. }, {
  343. key: "getRoleWriteAccess",
  344. value: function getRoleWriteAccess(role) {
  345. return this.getWriteAccess(this._getRoleName(role));
  346. }
  347. }, {
  348. key: "setRoleReadAccess",
  349. value: function setRoleReadAccess(role, allowed) {
  350. this.setReadAccess(this._getRoleName(role), allowed);
  351. }
  352. }, {
  353. key: "setRoleWriteAccess",
  354. value: function setRoleWriteAccess(role, allowed) {
  355. this.setWriteAccess(this._getRoleName(role), allowed);
  356. }
  357. }, {
  358. key: "getRoleProtectedFields",
  359. value: function getRoleProtectedFields(role) {
  360. return this.getProtectedFields(this._getRoleName(role));
  361. }
  362. }, {
  363. key: "setRoleProtectedFields",
  364. value: function setRoleProtectedFields(role, fields) {
  365. this.setProtectedFields(this._getRoleName(role), fields);
  366. }
  367. }]);
  368. return ParseCLP;
  369. }();
  370. var _default = ParseCLP;
  371. exports.default = _default;