diff --git a/src/components/PermissionsDialog/PermissionsDialog.example.js b/src/components/PermissionsDialog/PermissionsDialog.example.js index 5e43c279ae..1316fc6fbe 100644 --- a/src/components/PermissionsDialog/PermissionsDialog.example.js +++ b/src/components/PermissionsDialog/PermissionsDialog.example.js @@ -74,8 +74,8 @@ class DialogDemo extends React.Component { confirmText='Save ACL' details={Learn more about ACLs and app security} permissions={{ - read: {'*': true}, - write: {'*': true}, + read: {'*': true, 'role:admin': true, 'role:user': true, 's0meU5er1d':true}, + write: {'*': true, 'role:admin':true }, }} validateEntry={validateSimple} onCancel={() => { @@ -93,14 +93,15 @@ class DialogDemo extends React.Component { confirmText='Save CLP' details={Learn more about CLPs and app security} permissions={{ - get: {'*': false, '1234asdf': true, 'role:admin': true}, - find: {'*': true, '1234asdf': true, 'role:admin': true}, - create: {'*': true}, - update: {'*': true}, - delete: {'*': true}, - addField: {'*': true}, - readUserFields: ['owner'], - writeUserFields: ['owner'] + get: {'*': false, '1234asdf': true, 'role:admin': true,}, + find: {'*': true, '1234asdf': true, 'role:admin': true, }, + create: {'*': true, }, + update: {'*': true, pointerFields: ['user']}, + delete: {'*': true, }, + addField: {'*': true, 'requiresAuthentication': true}, + readUserFields: ['owner', 'user'], + writeUserFields: ['owner'], + protectedFields: {'*': ['password', 'email'], 'userField:owner': []} }} validateEntry={validateAdvanced} onCancel={() => { diff --git a/src/components/PermissionsDialog/PermissionsDialog.react.js b/src/components/PermissionsDialog/PermissionsDialog.react.js index bd13051c42..90335ba992 100644 --- a/src/components/PermissionsDialog/PermissionsDialog.react.js +++ b/src/components/PermissionsDialog/PermissionsDialog.react.js @@ -8,7 +8,7 @@ import Button from 'components/Button/Button.react'; import Checkbox from 'components/Checkbox/Checkbox.react'; import Icon from 'components/Icon/Icon.react'; -import { Map } from 'immutable'; +import { Map, fromJS } from 'immutable'; import Pill from 'components/Pill/Pill.react'; import Popover from 'components/Popover/Popover.react'; import Position from 'lib/Position'; @@ -23,109 +23,233 @@ import { let origin = new Position(0, 0); +function resolvePermission(perms, rowId, column){ + + let isPublicRow = rowId === '*'; + let isAuthRow = rowId === 'requiresAuthentication'; // exists only on CLP + let isEntryRow = !isAuthRow && !isPublicRow; + + let publicAccess = perms.get(column).get('*'); + let auth = perms.get(column).get('requiresAuthentication') + let checked = perms.get(column).get(rowId); + + let forceChecked = publicAccess && !auth + let indeterminate = isPublicRow && auth; + // the logic is: + // Checkbox is shown for: + // - Public row: always + // - Authn row: always + // - Entry row: when requires auth OR not Public + let editable = isPublicRow + || isAuthRow + || ( isEntryRow && !forceChecked ) + + return { + checked, editable, indeterminate + } +} + +function resolvePointerPermission(perms, pointerPerms, rowId, column) { + let publicAccess = perms.get(column) && perms.get(column).get("*"); + let auth = perms.get(column).get("requiresAuthentication"); + + // Pointer permission can be grouped as read/write + let permsGroup; + + if (["get", "find", "count"].includes(column)) { + permsGroup = "read"; + } + + if (["create", "update", "delete", "addField"].includes(column)) { + permsGroup = "write"; + } + + let checked = pointerPerms.get(permsGroup) || pointerPerms.get(column); //pointerPerms.get(permsGroup) && pointerPerms.get(permsGroup).get(rowId); + + let forceChecked = publicAccess && !auth; + + // Checkbox is shown for: + // - Public row: always + // - Authn row: always + // - Entry row: when requires auth OR not Public + let editable = !forceChecked; + + return { + checked, + editable, + }; +} + function renderAdvancedCheckboxes(rowId, perms, advanced, onChange) { - const get = perms.get('get').get(rowId) || perms.get('get').get('*'); - const find = perms.get('find').get(rowId) || perms.get('find').get('*'); - const count = perms.get('count').get(rowId) || perms.get('count').get('*'); - const create = perms.get('create').get(rowId) || perms.get('create').get('*'); - const update = perms.get('update').get(rowId) || perms.get('update').get('*'); - const del = perms.get('delete').get(rowId) || perms.get('delete').get('*'); + let get = resolvePermission(perms, rowId, "get"); + let find = resolvePermission(perms, rowId, "find"); + let count = resolvePermission(perms, rowId, "count"); + let create = resolvePermission(perms, rowId, "create"); + let update = resolvePermission(perms, rowId, "update"); + let del = resolvePermission(perms, rowId, "delete"); + let addField = resolvePermission(perms, rowId, "addField"); if (advanced) { return [ -