ParseCLP.js 16 KB

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