diff -u b/core/modules/editor/editor.module b/core/modules/editor/editor.module --- b/core/modules/editor/editor.module +++ b/core/modules/editor/editor.module @@ -478,7 +478,9 @@ function editor_file_download($uri) { // Get the file record based on the URI. If not in the database just return. /** @var \Drupal\file\FileInterface[] $files */ - $files = entity_load_multiple_by_properties('file', array('uri' => $uri)); + $files = \Drupal::entityTypeManager() + ->getStorage('file') + ->loadByProperties(['uri' => $uri]); if (count($files)) { foreach ($files as $item) { // Since some database servers sometimes use a case-insensitive comparison @@ -495,28 +497,26 @@ // Temporary files are handled by file_file_download(), so nothing to do here // about them. + // @see file_file_download() - // Find out which (if any) fields of this type contain the file. - $references = editor_get_file_references($file, EntityStorageInterface::FIELD_LOAD_CURRENT); + // Find out if any editor-backed field contains the file. + $usage_list = \Drupal::service('file.usage')->listUsage($file); // Stop processing if there are no references in order to avoid returning // headers for files controlled by other modules. Make an exception for // temporary files where the host entity has not yet been saved (for example, - // an image preview on a node/add form) in which case, allow download by the - // file's owner. - if (empty($references) && ($file->isPermanent() || $file->getOwnerId() != \Drupal::currentUser()->id())) { + // an image preview on a node creation form) in which case, allow download by + // the file's owner. + if (empty($usage_list['editor']) && ($file->isPermanent() || $file->getOwnerId() != \Drupal::currentUser()->id())) { return; } // Editor.module MUST NOT call $file->access() here (like file_file_download() // does) as checking the 'download' access to a file entity would end up in // FileAccessControlHandler->checkAccess() and ->getFileReferences(), which - // calls file_get_file_references() again. This latter one would allow - // downloading files only handled by the file.module, which is exactly not the - // case right here. -// if (!($return = $file->access('download', NULL, TRUE))) { -// return -1; -// } + // calls file_get_file_references(). This latter one would allow downloading + // files only handled by the file.module, which is exactly not the case right + // here. // Access is granted. $headers = file_get_content_headers($file); @@ -524,77 +524,6 @@ } /** - * Retrieves a list of references to a file uploaded via EditorImageDialog. - * - * @param \Drupal\file\FileInterface $file - * A file entity. - * @param int $age - * (optional) A constant that specifies which references to count. Use - * EntityStorageInterface::FIELD_LOAD_REVISION (the default) to retrieve all - * references within all revisions or - * EntityStorageInterface::FIELD_LOAD_CURRENT to retrieve references only in - * the current revisions of all entities that have references to this file. - * - * @return array - * A multidimensional array. The keys are field_name, entity_type, - * entity_id and the value is an entity referencing this file. - * - * @ingroup file - * @see file_get_file_references() - */ -function editor_get_file_references(FileInterface $file, $age = EntityStorageInterface::FIELD_LOAD_REVISION) { - $references = &drupal_static(__FUNCTION__, array()); - - // Fill the static cache, disregard $field and $field_type for now. - if (!isset($references[$file->id()][$age])) { - $references[$file->id()][$age] = array(); - $usage_list = \Drupal::service('file.usage')->listUsage($file); - $file_usage_list = isset($usage_list['editor']) ? $usage_list['editor'] : array(); - foreach ($file_usage_list as $entity_type_id => $entity_ids) { - $entities = entity_load_multiple($entity_type_id, array_keys($entity_ids)); - /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */ - foreach ($entities as $entity) { - $bundle = $entity->bundle(); - - // We need to find editor fields for this entity type and bundle. - if (!isset($editor_fields[$entity_type_id][$bundle])) { - $editor_fields[$entity_type_id][$bundle] = _editor_get_formatted_text_fields($entity); - } - foreach ($editor_fields[$entity_type_id][$bundle] as $field_name) { - // Iterate over the field items to find the referenced file and field - // name. This will fail if the usage checked is in a non-current - // revision because field items are from the current - // revision. - // We also iterate over all translations because a file can be linked - // to a language other than the default. - foreach ($entity->getTranslationLanguages() as $langcode => $language) { - /** @var \Drupal\text\Plugin\Field\FieldType\TextItemBase $item */ - foreach ($entity->getTranslation($langcode)->get($field_name) as $item) { - // Check if the file is referenced in either - // $item->values['value'] or $item->values['summary'] (if the - // latter exists at all). - $value = $item->getValue(); - foreach (['summary', 'value'] as $subfield) { - if (isset($value[$subfield])) { - $xpath = new \DOMXPath(Html::load($value['value'])); - /** @var DOMNodeList $query */ - $query = $xpath->query('//*[@data-entity-type="file" and @data-entity-uuid="' . $file->uuid() . '"]'); - if ($query->length) { - $references[$file->id()][$age][$field_name][$entity_type_id][$entity->id()] = $entity; - break; - } - } - } - } - } - } - } - } - } - return $references[$file->id()][$age]; -} - -/** * Finds all files referenced (data-entity-uuid) by formatted text fields. * * @param EntityInterface $entity diff -u b/core/modules/editor/src/Tests/EditorPrivateFileReferenceFilterTest.php b/core/modules/editor/src/Tests/EditorPrivateFileReferenceFilterTest.php --- b/core/modules/editor/src/Tests/EditorPrivateFileReferenceFilterTest.php +++ b/core/modules/editor/src/Tests/EditorPrivateFileReferenceFilterTest.php @@ -37,7 +37,7 @@ */ function testEditorPrivateFileReferenceFilter() { // Create a content type with a body field. - $this->drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page')); + $this->drupalCreateContentType(['type' => 'page', 'name' => 'Basic page']); // Create a file in the 'private:// ' stream. $filename = 'test.png';