MediaAccessControlHandler.php 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <?php
  2. namespace Drupal\media;
  3. use Drupal\Core\Access\AccessResult;
  4. use Drupal\Core\Entity\EntityAccessControlHandler;
  5. use Drupal\Core\Entity\EntityInterface;
  6. use Drupal\Core\Session\AccountInterface;
  7. /**
  8. * Defines an access control handler for media items.
  9. */
  10. class MediaAccessControlHandler extends EntityAccessControlHandler {
  11. /**
  12. * {@inheritdoc}
  13. */
  14. protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) {
  15. if ($account->hasPermission('administer media')) {
  16. return AccessResult::allowed()->cachePerPermissions();
  17. }
  18. $type = $entity->bundle();
  19. $is_owner = ($account->id() && $account->id() === $entity->getOwnerId());
  20. switch ($operation) {
  21. case 'view':
  22. $access_result = AccessResult::allowedIf($account->hasPermission('view media') && $entity->isPublished())
  23. ->cachePerPermissions()
  24. ->addCacheableDependency($entity);
  25. if (!$access_result->isAllowed()) {
  26. $access_result->setReason("The 'view media' permission is required and the media item must be published.");
  27. }
  28. return $access_result;
  29. case 'update':
  30. if ($account->hasPermission('edit any ' . $type . ' media')) {
  31. return AccessResult::allowed()->cachePerPermissions();
  32. }
  33. if ($account->hasPermission('edit own ' . $type . ' media') && $is_owner) {
  34. return AccessResult::allowed()->cachePerPermissions()->cachePerUser()->addCacheableDependency($entity);
  35. }
  36. // @todo Deprecate this permission in
  37. // https://www.drupal.org/project/drupal/issues/2925459.
  38. if ($account->hasPermission('update any media')) {
  39. return AccessResult::allowed()->cachePerPermissions();
  40. }
  41. if ($account->hasPermission('update media') && $is_owner) {
  42. return AccessResult::allowed()->cachePerPermissions()->cachePerUser()->addCacheableDependency($entity);
  43. }
  44. return AccessResult::neutral("The following permissions are required: 'update any media' OR 'update own media' OR '$type: edit any media' OR '$type: edit own media'.")->cachePerPermissions();
  45. case 'delete':
  46. if ($account->hasPermission('delete any ' . $type . ' media')) {
  47. return AccessResult::allowed()->cachePerPermissions();
  48. }
  49. if ($account->hasPermission('delete own ' . $type . ' media') && $is_owner) {
  50. return AccessResult::allowed()->cachePerPermissions()->cachePerUser()->addCacheableDependency($entity);
  51. }
  52. // @todo Deprecate this permission in
  53. // https://www.drupal.org/project/drupal/issues/2925459.
  54. if ($account->hasPermission('delete any media')) {
  55. return AccessResult::allowed()->cachePerPermissions();
  56. }
  57. if ($account->hasPermission('delete media') && $is_owner) {
  58. return AccessResult::allowed()->cachePerPermissions()->cachePerUser()->addCacheableDependency($entity);
  59. }
  60. return AccessResult::neutral("The following permissions are required: 'delete any media' OR 'delete own media' OR '$type: delete any media' OR '$type: delete own media'.")->cachePerPermissions();
  61. default:
  62. return AccessResult::neutral()->cachePerPermissions();
  63. }
  64. }
  65. /**
  66. * {@inheritdoc}
  67. */
  68. protected function checkCreateAccess(AccountInterface $account, array $context, $entity_bundle = NULL) {
  69. $permissions = [
  70. 'administer media',
  71. 'create media',
  72. 'create ' . $entity_bundle . ' media',
  73. ];
  74. return AccessResult::allowedIfHasPermissions($account, $permissions, 'OR');
  75. }
  76. }