From ed0338be7f9329d5075b41d7e5f51bb065547e4a Mon Sep 17 00:00:00 2001 From: Brian Canini <canini.16@osu.edu> Date: Wed, 4 Mar 2020 10:54:25 -0500 Subject: [PATCH] Updating drupal/field_permissions (1.0.0-beta1 => 1.0.0-rc2) --- composer.json | 4 +- composer.lock | 20 +++--- vendor/composer/installed.json | 20 +++--- web/modules/field_permissions/CHANGELOG.md | 60 ++++++++++++++++++ web/modules/field_permissions/CHANGELOG.txt | 27 -------- web/modules/field_permissions/README.md | 2 +- .../field_permissions.api.php | 25 ++++++++ .../field_permissions.info.yml | 9 +-- .../field_permissions.links.menu.yml | 2 +- .../field_permissions.module | 47 ++++++++++---- .../field_permissions.services.yml | 0 .../src/Annotation/FieldPermissionType.php | 8 +-- .../Controller/FieldPermissionsController.php | 12 ++-- .../src/FieldPermissionsService.php | 61 +++++++++++++------ .../src/FieldPermissionsServiceInterface.php | 30 ++++----- .../src/Plugin/FieldPermissionType/Base.php | 34 ++++++++++- .../FieldPermissionType/CustomAccess.php | 14 ++++- .../Plugin/FieldPermissionType/Manager.php | 13 +++- .../FieldPermissionType/PrivateAccess.php | 7 +++ .../Plugin/FieldPermissionTypeInterface.php | 2 +- .../process/FieldPermissionSettings.php | 40 ++++++++++++ .../field_permissions_test.info.yml | 8 +-- .../Plugin/FieldPermissionType/TestAccess.php | 9 ++- .../FieldPermissionsCommentTest.php | 4 +- .../Functional/FieldPermissionsNodeTest.php | 2 +- .../tests/src/Functional/FieldReportTest.php | 4 +- .../tests/src/Kernel/ViewsFieldAccessTest.php | 2 +- .../src/Unit/FieldPermissionsServiceTest.php | 18 ++++-- .../FieldPermissionType/CustomAccessTest.php | 4 +- 29 files changed, 345 insertions(+), 143 deletions(-) create mode 100644 web/modules/field_permissions/CHANGELOG.md delete mode 100644 web/modules/field_permissions/CHANGELOG.txt create mode 100644 web/modules/field_permissions/field_permissions.api.php mode change 100644 => 100755 web/modules/field_permissions/field_permissions.services.yml create mode 100644 web/modules/field_permissions/src/Plugin/migrate/process/FieldPermissionSettings.php diff --git a/composer.json b/composer.json index 8de26d8ad5..0c51552162 100644 --- a/composer.json +++ b/composer.json @@ -122,7 +122,7 @@ "drupal/externalauth": "1.1", "drupal/features": "3.8", "drupal/field_group": "3.0-rc1", - "drupal/field_permissions": "1.0-beta1", + "drupal/field_permissions": "1.0-rc2", "drupal/file_browser": "1.1", "drupal/focal_point": "1.0-beta6", "drupal/geolocation": "1.10", @@ -316,4 +316,4 @@ "php": "7.0.8" } } -} \ No newline at end of file +} diff --git a/composer.lock b/composer.lock index e304ef53bb..0cfd75acf6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9cebdfa2dca9a89bb18005ed1f9db499", + "content-hash": "52071dadc015f88a3c5443dc3c882e23", "packages": [ { "name": "alchemy/zippy", @@ -4712,17 +4712,17 @@ }, { "name": "drupal/field_permissions", - "version": "1.0.0-beta1", + "version": "1.0.0-rc2", "source": { "type": "git", "url": "https://git.drupalcode.org/project/field_permissions.git", - "reference": "8.x-1.0-beta1" + "reference": "8.x-1.0-rc2" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/field_permissions-8.x-1.0-beta1.zip", - "reference": "8.x-1.0-beta1", - "shasum": "f9d7c39734c01e52412de95a671992ec781d6652" + "url": "https://ftp.drupal.org/files/projects/field_permissions-8.x-1.0-rc2.zip", + "reference": "8.x-1.0-rc2", + "shasum": "bbc0d4215b24f2613a02a365a22f2039ebcea421" }, "require": { "drupal/core": "~8.0" @@ -4733,11 +4733,11 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0-beta1", - "datestamp": "1495836183", + "version": "8.x-1.0-rc2", + "datestamp": "1545332280", "security-coverage": { "status": "not-covered", - "message": "Beta releases are not covered by Drupal security advisories." + "message": "RC releases are not covered by Drupal security advisories." } } }, @@ -4766,7 +4766,7 @@ "description": "The Field Permissions module allows site administrators to set field-level permissions to edit, view and create fields on any entity.", "homepage": "https://www.drupal.org/project/field_permissions", "support": { - "source": "http://cgit.drupalcode.org/field_permissions", + "source": "https://git.drupalcode.org/project/field_permissions", "issues": "https://www.drupal.org/project/issues/field_permissions" } }, diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 899a4506a1..63596afbc9 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -4854,18 +4854,18 @@ }, { "name": "drupal/field_permissions", - "version": "1.0.0-beta1", - "version_normalized": "1.0.0.0-beta1", + "version": "1.0.0-rc2", + "version_normalized": "1.0.0.0-RC2", "source": { "type": "git", "url": "https://git.drupalcode.org/project/field_permissions.git", - "reference": "8.x-1.0-beta1" + "reference": "8.x-1.0-rc2" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/field_permissions-8.x-1.0-beta1.zip", - "reference": "8.x-1.0-beta1", - "shasum": "f9d7c39734c01e52412de95a671992ec781d6652" + "url": "https://ftp.drupal.org/files/projects/field_permissions-8.x-1.0-rc2.zip", + "reference": "8.x-1.0-rc2", + "shasum": "bbc0d4215b24f2613a02a365a22f2039ebcea421" }, "require": { "drupal/core": "~8.0" @@ -4876,11 +4876,11 @@ "dev-1.x": "1.x-dev" }, "drupal": { - "version": "8.x-1.0-beta1", - "datestamp": "1495836183", + "version": "8.x-1.0-rc2", + "datestamp": "1545332280", "security-coverage": { "status": "not-covered", - "message": "Beta releases are not covered by Drupal security advisories." + "message": "RC releases are not covered by Drupal security advisories." } } }, @@ -4910,7 +4910,7 @@ "description": "The Field Permissions module allows site administrators to set field-level permissions to edit, view and create fields on any entity.", "homepage": "https://www.drupal.org/project/field_permissions", "support": { - "source": "http://cgit.drupalcode.org/field_permissions", + "source": "https://git.drupalcode.org/project/field_permissions", "issues": "https://www.drupal.org/project/issues/field_permissions" } }, diff --git a/web/modules/field_permissions/CHANGELOG.md b/web/modules/field_permissions/CHANGELOG.md new file mode 100644 index 0000000000..9b8783a7e5 --- /dev/null +++ b/web/modules/field_permissions/CHANGELOG.md @@ -0,0 +1,60 @@ +## 8.x-1.0-beta1 + +* Remove old 7.x .info file. +* Convert README to markdown +* Move README to markdown. +* [#2768867](/node/2768867) by [jhedstrom](/u/jhedstrom): Utilize the UserCreationTrait +* [#2765049](/node/2765049) by [jhedstrom](/u/jhedstrom): Add some additional unit tests +* Add a composer.json file. +* Removing the LICENSE file + +## 8.x-1.0-alpha1 + +* Coding standards fixes. +* [#2764479](/node/2764479) by [jhedstrom](/u/jhedstrom): Split admin form methods into separate interface from FieldPermissionTypeInterface +* [#2764425](/node/2764425) by [jhedstrom](/u/jhedstrom): Cleanup the report logic to make use of plugins +* [#2764405](/node/2764405) by [jhedstrom](/u/jhedstrom): Add explicit tests for views integration +* [#2757267](/node/2757267) by [jhedstrom](/u/jhedstrom): Convert the field permissions types to plugins +* [#2758785](/node/2758785) by [jhedstrom](/u/jhedstrom): Remove underscore in permission names +* [#2758783](/node/2758783) by [jhedstrom](/u/jhedstrom): Rename some service methods for clarity +* [#2758139](/node/2758139) by [jhedstrom](/u/jhedstrom): Test the field permission report controller +* [#2758757](/node/2758757) by [jhedstrom](/u/jhedstrom): Fix the field permissions report page +* [#2757433](/node/2757433) by [jhedstrom](/u/jhedstrom): Utilize 3rd party settings API instead of config for field permissions +* [#2758059](/node/2758059) by [jhedstrom](/u/jhedstrom): Move web tests to BrowserTestBase +* [#2757431](/node/2757431): Move away from static methods in field permission service +* [#2757299](/node/2757299) by [jhedstrom](/u/jhedstrom): The comment module is currently required +* [#2756685](/node/2756685) by [jhedstrom](/u/jhedstrom): Test cleanup +* [#2756593](/node/2756593) by [jhedstrom](/u/jhedstrom): Interface cleanup +* Some automated cleanup via phpcbf. +* Remove old admin files +* Remove 7.x tests +* Remove redundant constant define statements. +* Remove old install file +* Merge branch '8.x-1.x' of https://github.com/drugo32/field_permissions into 8.x-1.x-initial +* [#1321050](/node/1321050) by [fangel](/u/fangel), [david_rothstein](/u/david_rothstein), [rob-loach-|-thekevinday](/u/rob-loach-|-thekevinday): Additional safe-guard for entities other than nodes when it comes to entity ownership. +* [#1063960](/node/1063960): Prepare 7.x-1.0-beta1. +* [#1312596](/node/1312596): Clean up. +* [#1312596](/node/1312596): Merge settings.css into admin.css and access.inc into .module. +* [#1312596](/node/1312596) by [rob-loach](/u/rob-loach): Clean up the module structure. +* [#1307312](/node/1307312) by [rob-loach](/u/rob-loach): Remove troubleshooting interface. +* [#876550](/node/876550) by [rob-loach](/u/rob-loach): Ignore the Drupal core thrown exception with a TODO to fix the core bug. +* [#1230284](/node/1230284) by [zhgenti](/u/zhgenti), [david_rothstein-|-dboulet](/u/david_rothstein-|-dboulet): Use form_load_include() instead of module_load_include() to fix form submits. +* [#1298966](/node/1298966) by [david_rothstein](/u/david_rothstein): Passing tests. +* [#1308210](/node/1308210) by [david_rothstein](/u/david_rothstein): Update the README.txt for the new user interface. +* [#1114134](/node/1114134) by [geerlingguy](/u/geerlingguy), [joelstein](/u/joelstein): Added Remove dependency on Fields UI. +* [#876550](/node/876550) by [sebcorbin](/u/sebcorbin), [david_rothstein-|-abbasmousavi](/u/david_rothstein-|-abbasmousavi): Fix for objects other than nodes. +* [#1306780](/node/1306780) by [david_rothstein](/u/david_rothstein): Private fields should allow administrators view access. +* [#1298966](/node/1298966) by [gabor-hojtsy](/u/gabor-hojtsy): Initial tests. +* [#1279712](/node/1279712) and [#1141330](/node/1141330) by [david_rothstein](/u/david_rothstein), [jeff-noyes](/u/jeff-noyes), [stellina-mckinney](/u/stellina-mckinney), [gabor-hojtsy](/u/gabor-hojtsy): Revamp Field Permissions UI. +* [#1073284](/node/1073284) by [joelstein](/u/joelstein), [rob-loach](/u/rob-loach): Assign administrator role permissions when new field permissions are opened. +* [#1063960](/node/1063960): Prepare for 7.x-1.0-alpha1. +* [#1043522](/node/1043522) by [erikwebb](/u/erikwebb): Permissions administration link wrong on Edit Field page. +* [#1063162](/node/1063162) by [jide](/u/jide), [rob-loach](/u/rob-loach): Field Permissions not accessible for some fields. +* [#965110](/node/965110) by [danic](/u/danic): Move Field Permissions UI to Reports. +* [#965094](/node/965094) by [danic](/u/danic), [rob-loach](/u/rob-loach): Group Title and Description in modules page. +* Stripping CVS keywords +* Fix node revisions table name. +* Sync code base from 6.x-1.0 release. +* Added support for create field permission. - Every permission type can be enabled independently. - Warning: This branch does not work yet! +* Initial port to D7. +* Initial checkin for the Field Permissions module. diff --git a/web/modules/field_permissions/CHANGELOG.txt b/web/modules/field_permissions/CHANGELOG.txt deleted file mode 100644 index bfac63bdc2..0000000000 --- a/web/modules/field_permissions/CHANGELOG.txt +++ /dev/null @@ -1,27 +0,0 @@ -7.x-1.0-beta1 -============== -- #1312596 by Rob Loach: Clean up the module file structure. -- #1307312 by Rob Loach: Remove troubleshooting interface as we now have tests. -- #1230284 by zhgenti, David_Rothstein | dboulet: Use form_load_include() - instead of module_load_include() to fix form submits. -- #1306780 by David_Rothstein: Private fields should allow administrators view - access. -- #1298966 by David_Rothstein: Fix static caching in tests. -- #1298966 by Gabor Hojtsy: Initial tests. -- #1279712 by David_Rothstein, Jeff Noyes, Stellina McKinney, Gabor Hojtsy: - Revamp Field Permissions user interface to make it more intuitive. -- #1141330 by David_Rothstein: Fix Field Permissions support with Views. -- #1073284 by joelstein, Rob Loach: Administrator permissions for new fields. - - -7.x-1.0-alpha1 -============== -- #1063162 by jide, Rob Loach: Field Permissions not accessible for some fields. -- #965110 by Danic: Move Field Permissions UI to Reports. -- #965094 by Danic, Rob Loach: Group Title and Description in modules page. -- #1043522 by erikwebb: Permissions administration link wrong on Edit Field page. -- Small documentation changes. -- Added support for create field permission. -- Every permission type can be enabled independently. -- Sync code base from 6.x-1.0 release. -- Fix node revisions table name. diff --git a/web/modules/field_permissions/README.md b/web/modules/field_permissions/README.md index 33fb1b2528..f2bbbc1472 100644 --- a/web/modules/field_permissions/README.md +++ b/web/modules/field_permissions/README.md @@ -33,7 +33,7 @@ Once Field Permissions module is installed, you need to edit the field settings form to enable permissions for each field where you need this feature. You can choose from three options: - * Public (author and administrators can edit, everyone can view) + * Not set (Field inherits content permissions.) * Private (only author and administrators can edit and view) * Custom permissions diff --git a/web/modules/field_permissions/field_permissions.api.php b/web/modules/field_permissions/field_permissions.api.php new file mode 100644 index 0000000000..3da27078d6 --- /dev/null +++ b/web/modules/field_permissions/field_permissions.api.php @@ -0,0 +1,25 @@ +<?php + +/** + * @file + * Hooks for the field_permissions module. + */ + +/** + * @addtogroup hooks + * @{ + */ + +/** + * Alters discovered field_permission_type plugins. + * + * @param array $definitions + * Discovered definitions. + */ +function hook_field_permission_type_plugin_alter(array &$definitions) { + unset($definitions['private']); +} + +/** + * @} End of "addtogroup hooks". + */ diff --git a/web/modules/field_permissions/field_permissions.info.yml b/web/modules/field_permissions/field_permissions.info.yml index c01f5b088b..21a91b420c 100644 --- a/web/modules/field_permissions/field_permissions.info.yml +++ b/web/modules/field_permissions/field_permissions.info.yml @@ -1,15 +1,12 @@ name: Field Permissions type: module -hidden: false description: 'Set field-level permissions to create, update or view fields.' configure: field_permissions.reports package: field -# version: 8.x-1.x-dev # core: '8.x' -# datestamp: 1449315106 -# Information added by Drupal.org packaging script on 2016-07-19 -version: '8.x-1.0-beta1' +# Information added by Drupal.org packaging script on 2018-12-20 +version: '8.x-1.0-rc2' core: '8.x' project: 'field_permissions' -datestamp: 1468958040 +datestamp: 1545332284 diff --git a/web/modules/field_permissions/field_permissions.links.menu.yml b/web/modules/field_permissions/field_permissions.links.menu.yml index 49d051edcf..f7abbeb860 100644 --- a/web/modules/field_permissions/field_permissions.links.menu.yml +++ b/web/modules/field_permissions/field_permissions.links.menu.yml @@ -1,5 +1,5 @@ field_permissions.reports: title: 'Report all field permissions' - parent: system.admin_structure + parent: system.admin_reports description: 'Report all permissions set.' route_name: field_permissions.reports diff --git a/web/modules/field_permissions/field_permissions.module b/web/modules/field_permissions/field_permissions.module index 728e7d754a..036d8c362c 100644 --- a/web/modules/field_permissions/field_permissions.module +++ b/web/modules/field_permissions/field_permissions.module @@ -5,25 +5,26 @@ * Contains field_permissions.module. */ +use Drupal\field\FieldConfigInterface; use Drupal\Core\Access\AccessResult; use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Routing\RouteMatchInterface; +use Drupal\Core\Session\AccountInterface; use Drupal\field_permissions\FieldPermissionsService; use Drupal\field_permissions\Plugin\FieldPermissionTypeInterface; use Drupal\field_permissions\Plugin\AdminFormSettingsInterface; - /** * Implements hook_help(). */ function field_permissions_help($route_name, RouteMatchInterface $route_match) { switch ($route_name) { case 'help.page.field_permissions': - return '<p>' . t('Set field-level permissions to edit or view fields in any node, edit field during node creation, and edit or view permissions for nodes owned by the current user.') . '</p>'; - - default: + $output = '<h3>' . t('About') . '</h3>'; + $output .= '<p>' . t('Set field-level permissions to edit or view fields in any entity type (content, users, taxonomy, etc), edit field during entity creation, and edit or view permissions for content owned by the current user.') . '</p>'; + return $output; } } @@ -42,6 +43,27 @@ function field_permissions_entity_field_access($operation, FieldDefinitionInterf return AccessResult::neutral(); } +/** + * Implements hook_jsonapi_entity_field_filter_access(). + */ +function field_permissions_jsonapi_entity_field_filter_access(FieldDefinitionInterface $field_definition, AccountInterface $account) { + if (!$field_definition->isDisplayConfigurable('display')) { + return AccessResult::neutral(); + } + + /** @var \Drupal\field_permissions\FieldPermissionsServiceInterface $service */ + $service = \Drupal::service('field_permissions.permissions_service'); + if ($service instanceof FieldPermissionsService) { + $access = $service->hasFieldViewAccessForEveryEntity($account, $field_definition); + } + else { + $permission_type = $service->fieldGetPermissionType($field_definition->getFieldStorageDefinition()); + $access = ($permission_type == FieldPermissionTypeInterface::ACCESS_PUBLIC); + } + + return $access ? AccessResult::neutral() : AccessResult::forbidden(); +} + /** * Implements hook_form_FORM_ID_alter(). * @@ -64,13 +86,13 @@ function field_permissions_form_field_config_edit_form_alter(&$form, FormStateIn '#weight' => -10, ]; - // Always add the public option, which isn't implemented as a plugin. + // Always add the 'not set' option, which isn't implemented as a plugin. $options = [ - FieldPermissionTypeInterface::ACCESS_PUBLIC => t('Public'), + FieldPermissionTypeInterface::ACCESS_PUBLIC => t('Not set'), ]; $descriptions = [ FieldPermissionTypeInterface::ACCESS_PUBLIC => [ - '#description' => t('Author and administrators can edit, everyone can view.'), + '#description' => t('Field inherits content permissions.'), ], ]; $definitions = \Drupal::service('plugin.field_permissions.types.manager')->getDefinitions(); @@ -83,9 +105,10 @@ function field_permissions_form_field_config_edit_form_alter(&$form, FormStateIn $form['field']['field_permissions']['type'] = [ '#title' => t('Field visibility and permissions'), + '#description' => t('<strong>These permissions apply to all instances of this field.</strong>'), '#type' => 'radios', '#options' => $options, - '#default_value' => $field->getFieldStorageDefinition()->getThirdPartySetting('field_permissions', 'permission_type', FieldPermissionTypeInterface::ACCESS_PUBLIC), + '#default_value' => \Drupal::service('field_permissions.permissions_service')->fieldGetPermissionType($field->getFieldStorageDefinition()), ]; // Add in the descriptions. @@ -108,17 +131,19 @@ function field_permissions_form_field_config_edit_form_alter(&$form, FormStateIn * * @see field_permissions_form_field_config_edit_form_alter */ -function field_permissions_field_config_edit_form_builder($entity_type, \Drupal\field\FieldConfigInterface $field, array &$form, FormStateInterface $form_state) { +function field_permissions_field_config_edit_form_builder($entity_type, FieldConfigInterface $field, array &$form, FormStateInterface $form_state) { $storage = $field->getFieldStorageDefinition(); $storage->setThirdPartySetting('field_permissions', 'permission_type', $form_state->getValue('type')); $storage->save(); } /** - * Implements hook_form_submit(). + * Submit handler for the field configuration form. + * + * @see field_permissions_form_field_config_edit_form_alter() */ function field_permission_field_config_edit_form_submit(array &$form, FormStateInterface $form_state) { - /** @var FieldDefinitionInterface $field */ + /** @var \Drupal\Core\Field\FieldDefinitionInterface $field */ $field = $form_state->getFormObject()->getEntity(); // Allow all plugin types to react to the submitted form. diff --git a/web/modules/field_permissions/field_permissions.services.yml b/web/modules/field_permissions/field_permissions.services.yml old mode 100644 new mode 100755 diff --git a/web/modules/field_permissions/src/Annotation/FieldPermissionType.php b/web/modules/field_permissions/src/Annotation/FieldPermissionType.php index 2f9e31d03e..6c387e80ac 100644 --- a/web/modules/field_permissions/src/Annotation/FieldPermissionType.php +++ b/web/modules/field_permissions/src/Annotation/FieldPermissionType.php @@ -21,18 +21,18 @@ class FieldPermissionType extends Plugin { /** * The human-readable title. * - * @ingroup plugin_translatable - * * @var \Drupal\Core\Annotation\Translation + * + * @ingroup plugin_translatable */ public $title; /** * The permission type description. * - * @ingroup plugin_translatable - * * @var \Drupal\Core\Annotation\Translation + * + * @ingroup plugin_translatable */ public $description; diff --git a/web/modules/field_permissions/src/Controller/FieldPermissionsController.php b/web/modules/field_permissions/src/Controller/FieldPermissionsController.php index b544f24749..49239d7456 100644 --- a/web/modules/field_permissions/src/Controller/FieldPermissionsController.php +++ b/web/modules/field_permissions/src/Controller/FieldPermissionsController.php @@ -21,7 +21,7 @@ class FieldPermissionsController extends ControllerBase { /** * The entity type manager service. * - * @var EntityTypeManagerInterface + * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ protected $entityTypeManager; @@ -42,7 +42,7 @@ class FieldPermissionsController extends ControllerBase { /** * Construct the field permission controller. * - * @param FieldPermissionsServiceInterface $field_permissions_service + * @param \Drupal\field_permissions\FieldPermissionsServiceInterface $field_permissions_service * Field permissions services. * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * The entity type manager service. @@ -113,7 +113,7 @@ public function getTitle() { * Build table rows. */ protected function buildRows() { - /** @var FieldStorageConfigInterface $instances */ + /** @var \Drupal\field\FieldStorageConfigInterface $instances */ $instances = $this->entityTypeManager->getStorage('field_storage_config')->loadMultiple(); $rows = []; foreach ($instances as $key => $instance) { @@ -125,7 +125,7 @@ protected function buildRows() { /** * Build a single row. * - * @param FieldStorageConfigInterface $field_storage + * @param \Drupal\field\FieldStorageConfigInterface $field_storage * Field to populate row. * * @return array @@ -135,7 +135,7 @@ protected function buildRow(FieldStorageConfigInterface $field_storage) { $row = []; if ($field_storage->isLocked()) { $row[0]['class'] = ['menu-disabled']; - $row[0]['data']['id'] = $this->t('@field_name (Locked)', ['@field_name' => $field_storage->getName()]); + $row[0]['data'] = $this->t('@field_name (Locked)', ['@field_name' => $field_storage->getName()]); } else { $row[0]['data'] = $field_storage->getName(); @@ -147,7 +147,7 @@ protected function buildRow(FieldStorageConfigInterface $field_storage) { $default_type = $this->fieldPermissions->fieldGetPermissionType($field_storage); $field_permissions = $this->fieldPermissions->getPermissionsByRole(); if ($default_type === FieldPermissionTypeInterface::ACCESS_PUBLIC) { - $row[4]['data'] = $this->t('Public (Author and administrators can edit, everyone can view.)'); + $row[4]['data'] = $this->t('Not set (Field inherits content permissions.)'); $row[4]['colspan'] = 5; } else { diff --git a/web/modules/field_permissions/src/FieldPermissionsService.php b/web/modules/field_permissions/src/FieldPermissionsService.php index 2fd7a43bc9..ed06c81a51 100644 --- a/web/modules/field_permissions/src/FieldPermissionsService.php +++ b/web/modules/field_permissions/src/FieldPermissionsService.php @@ -8,6 +8,7 @@ use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Session\AccountInterface; use Drupal\field\FieldStorageConfigInterface; +use Drupal\field_permissions\Plugin\FieldPermissionType\Base; use Drupal\field_permissions\Plugin\FieldPermissionType\Manager; use Drupal\field_permissions\Plugin\FieldPermissionTypeInterface; use Drupal\field_permissions\Plugin\CustomPermissionsInterface; @@ -83,22 +84,6 @@ public static function getList($field_label = '') { ]; } - /** - * {@inheritdoc} - */ - public function getPermissionList(FieldStorageConfigInterface $field) { - $permissions = []; - $permission_list = $this->getList($field->getName()); - foreach ($permission_list as $permission_type => $permission_info) { - $permission = $permission_type . ' ' . $field->getName(); - $permissions[$permission] = [ - 'title' => $permission_info['title'], - 'description' => $permission_info['label'], - ]; - } - return $permissions; - } - /** * {@inheritdoc} */ @@ -132,11 +117,11 @@ public function getPermissionsByRole() { */ public function getAllPermissions() { $permissions = []; - /** @var FieldStorageConfigInterface[] $fields */ + /** @var \Drupal\field\FieldStorageConfigInterface[] $fields */ $fields = $this->entityTypeManager->getStorage('field_storage_config')->loadMultiple(); foreach ($fields as $key => $field) { // Check if this plugin defines custom permissions. - $permission_type = static::fieldGetPermissionType($field); + $permission_type = $this->fieldGetPermissionType($field); if ($permission_type !== FieldPermissionTypeInterface::ACCESS_PUBLIC) { $plugin = $this->permissionTypeManager->createInstance($permission_type, [], $field); if ($plugin instanceof CustomPermissionsInterface) { @@ -189,4 +174,44 @@ public function getFieldAccess($operation, FieldItemListInterface $items, Accoun return $plugin->hasFieldAccess($operation, $items->getEntity(), $account); } + /** + * Determines if the given account may view the field, regardless of entity. + * + * This should only return TRUE if + * @code + * $this->getFieldAccess('view', $items, $account, $field_definition); + * @endcode + * returns TRUE for all possible values of $items. + * + * @param \Drupal\Core\Session\AccountInterface $account + * Account for which to check access. + * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition + * Field for which to check access. + * + * @return bool + * The access result. + * + * @todo Move this to an interface: either FieldPermissionsServiceInterface + * or a new one. + */ + public function hasFieldViewAccessForEveryEntity(AccountInterface $account, FieldDefinitionInterface $field_definition) { + $permission_type = $this->fieldGetPermissionType($field_definition->getFieldStorageDefinition()); + if (in_array('administrator', $account->getRoles()) || $permission_type == FieldPermissionTypeInterface::ACCESS_PUBLIC) { + return TRUE; + } + // Field add to comment entity. + if (static::isCommentField($field_definition)) { + return TRUE; + } + + // Pass access control to the plugin. + $plugin = $this->permissionTypeManager->createInstance($permission_type, [], $field_definition->getFieldStorageDefinition()); + if ($plugin instanceof Base) { + return $plugin->hasFieldViewAccessForEveryEntity($account); + } + else { + return FALSE; + } + } + } diff --git a/web/modules/field_permissions/src/FieldPermissionsServiceInterface.php b/web/modules/field_permissions/src/FieldPermissionsServiceInterface.php index de9c1dc8cb..d6bb265a11 100644 --- a/web/modules/field_permissions/src/FieldPermissionsServiceInterface.php +++ b/web/modules/field_permissions/src/FieldPermissionsServiceInterface.php @@ -28,26 +28,18 @@ interface FieldPermissionsServiceInterface { * plugin. However, since it is used in the report page, it would be * difficult to abstract down to the plugin level the way the report * currently works. - */ - public static function getList($field_label = ''); - - /** - * Returns permissions for a given field. * - * @param \Drupal\field\FieldStorageConfigInterface $field - * The field to return permissions for. - * - * @return array - * An array of permissions for a given field, keyed by the permission - * machine name. + * @deprecated This function will be removed before 8.x-1.0 */ - public function getPermissionList(FieldStorageConfigInterface $field); + public static function getList($field_label = ''); /** * Get all field permissions keyed by role ID. * * @return array * An array of permission information keyed by role ID. + * + * @deprecated This function will be removed before 8.x-1.0 */ public function getPermissionsByRole(); @@ -59,6 +51,8 @@ public function getPermissionsByRole(); * @return array * An array of all permissions for all fields that implement the custom * permission type. + * + * @deprecated This function will be removed before 8.x-1.0 */ public function getAllPermissions(); @@ -73,7 +67,7 @@ public function fieldGetPermissionType(FieldStorageConfigInterface $field); /** * Field is attached to comment entity. * - * @param FieldDefinitionInterface $field_definition + * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition * Fields to get permissions. * * @return bool @@ -85,12 +79,12 @@ public static function isCommentField(FieldDefinitionInterface $field_definition * Get access for field by operations and account permisisons. * * @param string $operation - * String operation on field. - * @param FieldItemListInterface $items + * String operation on field. + * @param \Drupal\Core\Field\FieldItemListInterface $items * The entity field object on which to check access. - * @param AccountInterface $account - * Account to get permissions. - * @param FieldDefinitionInterface $field_definition + * @param \Drupal\Core\Session\AccountInterface $account + * Account to get permissions. + * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition * Fields to get permissions. */ public function getFieldAccess($operation, FieldItemListInterface $items, AccountInterface $account, FieldDefinitionInterface $field_definition); diff --git a/web/modules/field_permissions/src/Plugin/FieldPermissionType/Base.php b/web/modules/field_permissions/src/Plugin/FieldPermissionType/Base.php index 82ad418b25..5989427c72 100644 --- a/web/modules/field_permissions/src/Plugin/FieldPermissionType/Base.php +++ b/web/modules/field_permissions/src/Plugin/FieldPermissionType/Base.php @@ -4,6 +4,7 @@ use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\Core\Plugin\PluginBase; +use Drupal\Core\Session\AccountInterface; use Drupal\field\FieldStorageConfigInterface; use Drupal\field_permissions\Plugin\FieldPermissionTypeInterface; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -16,14 +17,20 @@ abstract class Base extends PluginBase implements FieldPermissionTypeInterface, /** * The field storage. * - * @var FieldStorageConfigInterface + * @var \Drupal\field\FieldStorageConfigInterface */ protected $fieldStorage; /** - * {@inheritdoc} + * Constructs the plugin. * - * @param FieldStorageConfigInterface $field_storage + * @param array $configuration + * A configuration array containing information about the plugin instance. + * @param string $plugin_id + * The plugin_id for the plugin instance. + * @param mixed $plugin_definition + * The plugin implementation definition. + * @param \Drupal\field\FieldStorageConfigInterface $field_storage * The field storage. */ public function __construct(array $configuration, $plugin_id, $plugin_definition, FieldStorageConfigInterface $field_storage) { @@ -57,4 +64,25 @@ public function getDescription() { return $this->pluginDefinition['description']; } + /** + * Determines if the given account may view the field, regardless of entity. + * + * This should only return TRUE if + * @code + * $this->hasFieldAccess('view', $entity, $account); + * @endcode + * returns TRUE for all possible $entity values. + * + * @param \Drupal\Core\Session\AccountInterface $account + * The user to check access for. + * + * @return bool + * The access result. + * + * @todo Move this to an interface: either FieldPermissionTypeInterface or a + * new one. + */ + public function hasFieldViewAccessForEveryEntity(AccountInterface $account) { + return FALSE; + } } diff --git a/web/modules/field_permissions/src/Plugin/FieldPermissionType/CustomAccess.php b/web/modules/field_permissions/src/Plugin/FieldPermissionType/CustomAccess.php index eb6e39965c..239f5e3270 100644 --- a/web/modules/field_permissions/src/Plugin/FieldPermissionType/CustomAccess.php +++ b/web/modules/field_permissions/src/Plugin/FieldPermissionType/CustomAccess.php @@ -28,7 +28,7 @@ class CustomAccess extends Base implements CustomPermissionsInterface, AdminForm * {@inheritdoc} */ public function hasFieldAccess($operation, EntityInterface $entity, AccountInterface $account) { - assert('in_array($operation, ["edit", "view"])', 'The operation is either "edit" or "view", "' . $operation . '" given instead.'); + assert(in_array($operation, ["edit", "view"]), 'The operation is either "edit" or "view", "' . $operation . '" given instead.'); $field_name = $this->fieldStorage->getName(); if ($operation === 'edit' && $entity->isNew()) { @@ -52,6 +52,14 @@ public function hasFieldAccess($operation, EntityInterface $entity, AccountInter return FALSE; } + /** + * {@inheritdoc} + */ + public function hasFieldViewAccessForEveryEntity(AccountInterface $account) { + $field_name = $this->fieldStorage->getName(); + return $account->hasPermission('view ' . $field_name); + } + /** * {@inheritdoc} */ @@ -128,9 +136,9 @@ protected function addPermissionsGrid(array &$form, FormStateInterface $form_sta '#attributes' => ['class' => ['permissions', 'js-permissions']], '#sticky' => TRUE, ]; - foreach (array_keys($roles) as $name) { + foreach ($roles as $role) { $form['permissions']['#header'][] = [ - 'data' => $name, + 'data' => $role->label(), 'class' => ['checkbox'], ]; } diff --git a/web/modules/field_permissions/src/Plugin/FieldPermissionType/Manager.php b/web/modules/field_permissions/src/Plugin/FieldPermissionType/Manager.php index a528d7f4ff..91b437f22d 100644 --- a/web/modules/field_permissions/src/Plugin/FieldPermissionType/Manager.php +++ b/web/modules/field_permissions/src/Plugin/FieldPermissionType/Manager.php @@ -8,6 +8,8 @@ use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\Core\Plugin\DefaultPluginManager; use Drupal\field\FieldStorageConfigInterface; +use Drupal\field_permissions\Annotation\FieldPermissionType; +use Drupal\field_permissions\Plugin\FieldPermissionTypeInterface; /** * Field permission type plugin manager. @@ -26,20 +28,25 @@ class Manager extends DefaultPluginManager { * The module handler to invoke the alter hook with. */ public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) { - parent::__construct('Plugin/FieldPermissionType', $namespaces, $module_handler, 'Drupal\field_permissions\Plugin\FieldPermissionTypeInterface', 'Drupal\field_permissions\Annotation\FieldPermissionType'); + parent::__construct('Plugin/FieldPermissionType', $namespaces, $module_handler, FieldPermissionTypeInterface::class, FieldPermissionType::class); $this->setCacheBackend($cache_backend, 'field_permission_type_plugins'); + $this->alterInfo('field_permission_type_plugin'); } /** - * {@inheritdoc} - * * Allow the field storage to be passed into the plugin. * + * @param string $plugin_id + * The plugin ID. + * @param array $configuration + * The plugin configuration. * @param \Drupal\field\FieldStorageConfigInterface $field_storage * The field storage. * * @return \Drupal\field_permissions\Plugin\FieldPermissionTypeInterface * The field permission type plugin instance. + * + * @throws \Drupal\Component\Plugin\Exception\PluginException */ public function createInstance($plugin_id, array $configuration = [], FieldStorageConfigInterface $field_storage = NULL) { $plugin_definition = $this->getDefinition($plugin_id); diff --git a/web/modules/field_permissions/src/Plugin/FieldPermissionType/PrivateAccess.php b/web/modules/field_permissions/src/Plugin/FieldPermissionType/PrivateAccess.php index 3b4dc03ae6..4a8357312b 100644 --- a/web/modules/field_permissions/src/Plugin/FieldPermissionType/PrivateAccess.php +++ b/web/modules/field_permissions/src/Plugin/FieldPermissionType/PrivateAccess.php @@ -43,4 +43,11 @@ public function hasFieldAccess($operation, EntityInterface $entity, AccountInter return TRUE; } + /** + * {@inheritdoc} + */ + public function hasFieldViewAccessForEveryEntity(AccountInterface $account) { + return $account->hasPermission('access private fields'); + } + } diff --git a/web/modules/field_permissions/src/Plugin/FieldPermissionTypeInterface.php b/web/modules/field_permissions/src/Plugin/FieldPermissionTypeInterface.php index b89445e275..76d7a9cb73 100644 --- a/web/modules/field_permissions/src/Plugin/FieldPermissionTypeInterface.php +++ b/web/modules/field_permissions/src/Plugin/FieldPermissionTypeInterface.php @@ -13,7 +13,7 @@ interface FieldPermissionTypeInterface extends PluginInspectionInterface, DerivativeInspectionInterface { /** - * Indicates that a field does not have any access control. + * Indicates that a field does not have field-specific access control. * * Public field access is not implemented as a plugin because it effectively * means this module does not process any access control for fields with this diff --git a/web/modules/field_permissions/src/Plugin/migrate/process/FieldPermissionSettings.php b/web/modules/field_permissions/src/Plugin/migrate/process/FieldPermissionSettings.php new file mode 100644 index 0000000000..b322a9a739 --- /dev/null +++ b/web/modules/field_permissions/src/Plugin/migrate/process/FieldPermissionSettings.php @@ -0,0 +1,40 @@ +<?php + +namespace Drupal\field_permissions\Plugin\migrate\process; + +use Drupal\migrate\MigrateExecutableInterface; +use Drupal\migrate\ProcessPluginBase; +use Drupal\migrate\Row; +use Drupal\field_permissions\Plugin\FieldPermissionTypeInterface; + +/** + * Migration plugin for field permission settings. + * + * @MigrateProcessPlugin( + * id = "d7_field_permission_settings" + * ) + */ +class FieldPermissionSettings extends ProcessPluginBase { + + /** + * {@inheritdoc} + */ + public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) { + $value = $row->getSourceProperty('field_permissions'); + switch ($value['type']) { + case 0: + $permission_type = FieldPermissionTypeInterface::ACCESS_PUBLIC; + break; + + case 1: + $permission_type = FieldPermissionTypeInterface::ACCESS_PRIVATE; + break; + + case 2: + $permission_type = FieldPermissionTypeInterface::ACCESS_CUSTOM; + break; + } + return ['field_permissions' => ['permission_type' => $permission_type]]; + } + +} diff --git a/web/modules/field_permissions/tests/modules/field_permissions_test/field_permissions_test.info.yml b/web/modules/field_permissions/tests/modules/field_permissions_test/field_permissions_test.info.yml index ae0bcbfba6..42585e101d 100644 --- a/web/modules/field_permissions/tests/modules/field_permissions_test/field_permissions_test.info.yml +++ b/web/modules/field_permissions/tests/modules/field_permissions_test/field_permissions_test.info.yml @@ -4,10 +4,10 @@ description: 'Provides a test field permission plugin type.' package: Testing # core: '8.x' dependencies: - - field_permissions + - field_permissions:field_permissions -# Information added by Drupal.org packaging script on 2016-07-19 -version: '8.x-1.0-beta1' +# Information added by Drupal.org packaging script on 2018-12-20 +version: '8.x-1.0-rc2' core: '8.x' project: 'field_permissions' -datestamp: 1468958040 +datestamp: 1545332284 diff --git a/web/modules/field_permissions/tests/modules/field_permissions_test/src/Plugin/FieldPermissionType/TestAccess.php b/web/modules/field_permissions/tests/modules/field_permissions_test/src/Plugin/FieldPermissionType/TestAccess.php index 27bc3d3fbd..f91c895273 100644 --- a/web/modules/field_permissions/tests/modules/field_permissions_test/src/Plugin/FieldPermissionType/TestAccess.php +++ b/web/modules/field_permissions/tests/modules/field_permissions_test/src/Plugin/FieldPermissionType/TestAccess.php @@ -13,7 +13,7 @@ * @FieldPermissionType( * id = "test_access", * title = "Test type", - * description = "Denies access if the field name starts with 'test_' and this is an edit operation.", + * description = "Denies access with 'test_' and this is an edit operation.", * weight = 42 * ) */ @@ -29,6 +29,13 @@ public function hasFieldAccess($operation, EntityInterface $entity, AccountInter return strpos($this->fieldStorage->getName(), 'test_') === FALSE; } + /** + * {@inheritdoc} + */ + public function hasFieldViewAccessForEveryEntity(AccountInterface $account) { + return $account->hasPermission('foo access'); + } + /** * {@inheritdoc} */ diff --git a/web/modules/field_permissions/tests/src/Functional/FieldPermissionsCommentTest.php b/web/modules/field_permissions/tests/src/Functional/FieldPermissionsCommentTest.php index e67df06f48..a09f197a2a 100644 --- a/web/modules/field_permissions/tests/src/Functional/FieldPermissionsCommentTest.php +++ b/web/modules/field_permissions/tests/src/Functional/FieldPermissionsCommentTest.php @@ -71,7 +71,7 @@ public function testFieldPermissionComment() { * Configure a comment field on the article node type. */ protected function addCommentField() { - $entity_manager = \Drupal::entityManager(); + $entity_manager = \Drupal::entityTypeManager(); $bundle = 'article'; $comment_type_storage = $entity_manager->getStorage('comment_type'); @@ -86,8 +86,6 @@ protected function addCommentField() { 'description' => 'Default comment field', ])->save(); - $comment_type = $comment_type_storage->load($comment_type_id); - $entity_manager->getStorage('field_storage_config')->create([ 'entity_type' => $entity_type, 'field_name' => $field_name, diff --git a/web/modules/field_permissions/tests/src/Functional/FieldPermissionsNodeTest.php b/web/modules/field_permissions/tests/src/Functional/FieldPermissionsNodeTest.php index 3f911835bf..aa2b6416ac 100644 --- a/web/modules/field_permissions/tests/src/Functional/FieldPermissionsNodeTest.php +++ b/web/modules/field_permissions/tests/src/Functional/FieldPermissionsNodeTest.php @@ -50,7 +50,7 @@ public function testNodeFieldPermissions() { * * @todo Directly set the field permissions rather than using the UI. */ - protected function setNodeFieldPermissions($perm, $custom_permission = []) { + protected function setNodeFieldPermissions($perm, array $custom_permission = []) { $current_user = $this->loggedInUser; $this->drupalLogin($this->adminUser); $this->drupalGet('admin/structure/types/manage/article/fields/node.article.body'); diff --git a/web/modules/field_permissions/tests/src/Functional/FieldReportTest.php b/web/modules/field_permissions/tests/src/Functional/FieldReportTest.php index f2a5ad45cd..5b4a885525 100644 --- a/web/modules/field_permissions/tests/src/Functional/FieldReportTest.php +++ b/web/modules/field_permissions/tests/src/Functional/FieldReportTest.php @@ -70,7 +70,7 @@ public function testReportPage() { $this->assertSession()->statusCodeEquals(200); // Initially, no fields should be private or custom. - $this->assertSession()->pageTextContains('Public (Author and administrators can edit, everyone can view.)'); + $this->assertSession()->pageTextContains('Not set (Field inherits content permissions.)'); $this->assertSession()->pageTextNotContains('Private (Only author and administrators can edit and view.)'); $this->assertSession()->pageTextNotContains('Not all users have this permission'); $this->assertSession()->pageTextNotContains('All users have this permission'); @@ -91,7 +91,7 @@ public function testReportPage() { // Grant anonymous and authenticated view permission. foreach ([RoleInterface::ANONYMOUS_ID, RoleInterface::AUTHENTICATED_ID] as $role_id) { - /** @var RoleInterface $role */ + /** @var \Drupal\user\RoleInterface $role */ $role = $this->container->get('entity_type.manager') ->getStorage('user_role') ->load($role_id); diff --git a/web/modules/field_permissions/tests/src/Kernel/ViewsFieldAccessTest.php b/web/modules/field_permissions/tests/src/Kernel/ViewsFieldAccessTest.php index 352189ad81..d503c34edf 100644 --- a/web/modules/field_permissions/tests/src/Kernel/ViewsFieldAccessTest.php +++ b/web/modules/field_permissions/tests/src/Kernel/ViewsFieldAccessTest.php @@ -81,7 +81,7 @@ class ViewsFieldAccessTest extends ViewsKernelTestBase { /** * An entity to test with. * - * @var EntityTest + * @var \Drupal\entity_test\Entity\EntityTest */ protected $entity; diff --git a/web/modules/field_permissions/tests/src/Unit/FieldPermissionsServiceTest.php b/web/modules/field_permissions/tests/src/Unit/FieldPermissionsServiceTest.php index 3634a79b4f..ccab25ae8e 100644 --- a/web/modules/field_permissions/tests/src/Unit/FieldPermissionsServiceTest.php +++ b/web/modules/field_permissions/tests/src/Unit/FieldPermissionsServiceTest.php @@ -86,7 +86,13 @@ public function providerTestGetFieldAccess() { $storage = $this->prophesize(FieldStorageConfigInterface::class); $storage->getThirdPartySetting('field_permissions', 'permission_type', FieldPermissionTypeInterface::ACCESS_PUBLIC)->willReturn('foo'); $field_definition->getFieldStorageDefinition()->willReturn($storage->reveal()); - $cases[] = ['view', $field_item_list, $account->reveal(), $field_definition->reveal(), TRUE]; + $cases[] = [ + 'view', + $field_item_list, + $account->reveal(), + $field_definition->reveal(), + TRUE, + ]; // No admin roles, but public access. $account = $this->prophesize(AccountInterface::class); @@ -95,9 +101,13 @@ public function providerTestGetFieldAccess() { $storage = $this->prophesize(FieldStorageConfigInterface::class); $storage->getThirdPartySetting('field_permissions', 'permission_type', FieldPermissionTypeInterface::ACCESS_PUBLIC)->willReturn(FieldPermissionTypeInterface::ACCESS_PUBLIC); $field_definition->getFieldStorageDefinition()->willReturn($storage->reveal()); - $cases[] = ['view', $field_item_list, $account->reveal(), $field_definition->reveal(), TRUE]; - - // @todo More complex cases. + $cases[] = [ + 'view', + $field_item_list, + $account->reveal(), + $field_definition->reveal(), + TRUE, + ]; return $cases; } diff --git a/web/modules/field_permissions/tests/src/Unit/Plugin/FieldPermissionType/CustomAccessTest.php b/web/modules/field_permissions/tests/src/Unit/Plugin/FieldPermissionType/CustomAccessTest.php index 029a6f60f3..ee4feeafbf 100644 --- a/web/modules/field_permissions/tests/src/Unit/Plugin/FieldPermissionType/CustomAccessTest.php +++ b/web/modules/field_permissions/tests/src/Unit/Plugin/FieldPermissionType/CustomAccessTest.php @@ -53,14 +53,12 @@ public function testHasFieldAccess($operation, EntityInterface $entity, AccountI * Test an invalid operation. * * @covers ::hasFieldAccess - * - * @expectedException \AssertionError - * @expectedExceptionMessage The operation is either "edit" or "view", "bad operation" given instead. */ public function testInvalidOperation() { // Edit|view access allowed. $account = $this->prophesize(AccountInterface::class); $entity = $this->prophesize(EntityInterface::class); + $this->setExpectedException(\AssertionError::class, 'The operation is either "edit" or "view", "bad operation" given instead.'); $this->plugin->hasFieldAccess('bad operation', $entity->reveal(), $account->reveal()); } -- GitLab