Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
CRAP | |
0.00% |
0 / 24 |
FileAccessControlHandler | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
132 | |
0.00% |
0 / 24 |
checkAccess | |
0.00% |
0 / 1 |
110 | |
0.00% |
0 / 22 |
|||
getFileReferences | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\file\FileAccessControlHandler. | |
*/ | |
namespace Drupal\file; | |
use Drupal\Core\Access\AccessResult; | |
use Drupal\Core\Entity\EntityAccessControlHandler; | |
use Drupal\Core\Entity\EntityInterface; | |
use Drupal\Core\Entity\EntityStorageInterface; | |
use Drupal\Core\Session\AccountInterface; | |
/** | |
* Provides a File access control handler. | |
*/ | |
class FileAccessControlHandler extends EntityAccessControlHandler { | |
/** | |
* {@inheritdoc} | |
*/ | |
protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) { | |
/** @var \Drupal\file\FileInterface $entity */ | |
if ($operation == 'download' || $operation == 'view') { | |
if (\Drupal::service('file_system')->uriScheme($entity->getFileUri()) === 'public') { | |
// Always allow access to file in public file system. | |
return AccessResult::allowed(); | |
} | |
elseif ($references = $this->getFileReferences($entity)) { | |
foreach ($references as $field_name => $entity_map) { | |
foreach ($entity_map as $referencing_entity_type => $referencing_entities) { | |
/** @var \Drupal\Core\Entity\EntityInterface $referencing_entity */ | |
foreach ($referencing_entities as $referencing_entity) { | |
$entity_and_field_access = $referencing_entity->access('view', $account, TRUE)->andIf($referencing_entity->$field_name->access('view', $account, TRUE)); | |
if ($entity_and_field_access->isAllowed()) { | |
return $entity_and_field_access; | |
} | |
} | |
} | |
} | |
} | |
elseif ($entity->getOwnerId() == $account->id()) { | |
// This case handles new nodes, or detached files. The user who uploaded | |
// the file can always access if it's not yet used. | |
return AccessResult::allowed(); | |
} | |
} | |
// No opinion. | |
return AccessResult::neutral(); | |
} | |
/** | |
* Wrapper for file_get_file_references(). | |
* | |
* @param \Drupal\file\FileInterface $file | |
* The file object for which to get references. | |
* | |
* @return array | |
* A multidimensional array. The keys are field_name, entity_type, | |
* entity_id and the value is an entity referencing this file. | |
* | |
* @see file_get_file_references() | |
*/ | |
protected function getFileReferences(FileInterface $file) { | |
return file_get_file_references($file, NULL, EntityStorageInterface::FIELD_LOAD_REVISION, NULL); | |
} | |
} |