diff --git a/core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceItemTest.php b/core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceItemTest.php index 2d98de66d3..6dce67b45f 100644 --- a/core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceItemTest.php +++ b/core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceItemTest.php @@ -524,7 +524,6 @@ public function testAutocreateValidation() { $file = File::create([ 'filename' => $filename, 'status' => 0, - 'uid' => 1, ]); $entity = EntityTest::create([ diff --git a/core/modules/file/src/Entity/File.php b/core/modules/file/src/Entity/File.php index b8c130728c..a68b9bae9b 100644 --- a/core/modules/file/src/Entity/File.php +++ b/core/modules/file/src/Entity/File.php @@ -234,7 +234,6 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { $fields['uid'] = BaseFieldDefinition::create('entity_reference') ->setLabel(t('User ID')) ->setDescription(t('The user ID of the file.')) - ->setDefaultValueCallback('\Drupal\file\Entity\File::getCurrentUserId') ->setSetting('target_type', 'user'); $fields['filename'] = BaseFieldDefinition::create('string') @@ -275,16 +274,4 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { return $fields; } - /** - * Default value callback for 'uid' base field definition. - * - * @see \Drupal\file\Entity\File::baseFieldDefinitions::baseFieldDefinitions(). - * - * @return array - * An array of default values. - */ - public static function getCurrentUserId() { - return array(\Drupal::currentUser()->id()); - } - } diff --git a/core/modules/file/src/Plugin/rest/resource/FileUploadResource.php b/core/modules/file/src/Plugin/rest/resource/FileUploadResource.php index 1177f9a961..83286804af 100644 --- a/core/modules/file/src/Plugin/rest/resource/FileUploadResource.php +++ b/core/modules/file/src/Plugin/rest/resource/FileUploadResource.php @@ -2,7 +2,6 @@ namespace Drupal\file\Plugin\rest\resource; -use Drupal\Component\Plugin\DependentPluginInterface; use Drupal\Component\Utility\Bytes; use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Session\AccountInterface; @@ -38,9 +37,11 @@ * } * ) */ -class FileUploadResource extends ResourceBase implements DependentPluginInterface { +class FileUploadResource extends ResourceBase { - use EntityResourceValidationTrait; + use EntityResourceValidationTrait { + validate as resourceValidate; + } /** * @var \Drupal\Core\File\FileSystem @@ -68,6 +69,11 @@ class FileUploadResource extends ResourceBase implements DependentPluginInterfac protected $mimeTypeGuesser; /** + * @var \Drupal\Core\Utility\Token|Token + */ + protected $token; + + /** * Constructs a FileUploadResource instance. * * @param array $configuration @@ -88,14 +94,17 @@ class FileUploadResource extends ResourceBase implements DependentPluginInterfac * The currently authenticated user. * @param \Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface $mime_type_guesser * The MIME type guesser. + * @param \Drupal\Core\Utility\Token $token + * The token replacement instance. * */ - public function __construct(array $configuration, $plugin_id, $plugin_definition,$serializer_formats, LoggerInterface $logger, FileSystem $file_system, EntityFieldManagerInterface $entity_field_manager, AccountInterface $current_user, MimeTypeGuesserInterface $mime_type_guesser) { + public function __construct(array $configuration, $plugin_id, $plugin_definition,$serializer_formats, LoggerInterface $logger, FileSystem $file_system, EntityFieldManagerInterface $entity_field_manager, AccountInterface $current_user, MimeTypeGuesserInterface $mime_type_guesser, Token $token) { parent::__construct($configuration, $plugin_id, $plugin_definition, $serializer_formats, $logger); $this->fileSystem = $file_system; $this->entityFieldManager = $entity_field_manager; $this->currentUser = $current_user; $this->mimeTypeGuesser = $mime_type_guesser; + $this->token = $token; } /** @@ -111,42 +120,22 @@ public static function create(ContainerInterface $container, array $configuratio $container->get('file_system'), $container->get('entity_field.manager'), $container->get('current_user'), - $container->get('file.mime_type.guesser') + $container->get('file.mime_type.guesser'). + $container->get('token') ); } /** - * {@inheritdoc} - */ - public function calculateDependencies() { - return [ - 'module' => ['file'] - ]; - } - - /** * Creates a file from endpoint. * * @param \Symfony\Component\HttpFoundation\Request $request * @param \Drupal\file\FileInterface $file */ public function post(Request $request, $entity_type_id, $bundle, $field_name) { - $this->validateOctetStream($request); + $this->validateOctetStreamContentType($request); // @todo Validate for file name too. - $field_definitions = $this->entityFieldManager->getFieldDefinitions($entity_type_id, $bundle); - - if (!isset($field_definitions[$field_name])) { - throw new BadRequestHttpException(sprintf('Field "%s" does not exist', $field_name)); - } - - // @todo check the definition is a file field. - $field_definition = $field_definitions[$field_name]; - - // Check access. - if (!$field_definition->access('create')) { - throw new AccessDeniedException(sprintf('Access denied for field "%s"', $field_name)); - } + $field_definition = $this->validateAndLoadFieldDefinition($entity_type_id, $bundle, $field_name); $destination = $this->getUploadLocation($field_definition->getFieldStorageDefinition()->getSettings()); @@ -182,10 +171,7 @@ public function post(Request $request, $entity_type_id, $bundle, $field_name) { $values['filemime'] = $this->mimeTypeGuesser->guess($values['filename']); $file = File::create($values); - $this->validateFile($file, $field_definition); - - $this->validate($file); - + $this->validate($file, $field_definition); $file->save(); @@ -227,6 +213,39 @@ protected function streamUploadData($destination_uri) { } /** + * Validates and loads a field definition instance. + * + * @param string $entity_type_id + * The entity type ID the field is attached to. + * @param string $bundle + * The bundle the field is attached to. + * @param string $field_name + * The field name. + * + * @return \Drupal\Core\Field\FieldDefinitionInterface + * + * @throws \Symfony\Component\HttpKernel\Exception\BadRequestHttpException + * @throws \Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException + */ + protected function validateAndLoadFieldDefinition($entity_type_id, $bundle, $field_name) { + $field_definitions = $this->entityFieldManager->getFieldDefinitions($entity_type_id, $bundle); + + if (!isset($field_definitions[$field_name])) { + throw new BadRequestHttpException(sprintf('Field "%s" does not exist', $field_name)); + } + + // @todo check the definition is a file field. + $field_definition = $field_definitions[$field_name]; + + // Check access. + if (!$field_definition->access('create')) { + throw new AccessDeniedException(sprintf('Access denied for field "%s"', $field_name)); + } + + return $field_definition; + } + + /** * Validates the Content-Type header for the request. * * @param \Symfony\Component\HttpKernel\Request $request @@ -234,7 +253,7 @@ protected function streamUploadData($destination_uri) { * * @throws \Symfony\Component\HttpKernel\Exception\UnsupportedMediaTypeHttpException */ - protected function validateOctetStream(Request $request) { + protected function validateOctetStreamContentType(Request $request) { if ($request->headers->get('Content-Type') !== 'application/octet-stream') { throw new UnsupportedMediaTypeHttpException('The "application/octet-stream" content type must be used to send binary file data'); } @@ -250,7 +269,9 @@ protected function validateOctetStream(Request $request) { * * @throws \Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException */ - protected function validateFile(FileInterface $file, FieldDefinitionInterface $field_definition) { + protected function validate(FileInterface $file, FieldDefinitionInterface $field_definition) { + $this->resourceValidate($file); + // Validate the file based on the field definition configuration. $errors = file_validate($file, $this->getUploadValidators($field_definition)); @@ -277,7 +298,7 @@ protected function getUploadLocation(array $settings) { // Replace tokens. As the tokens might contain HTML we convert it to plain // text. - $destination = PlainTextOutput::renderFromHtml(\Drupal::token()->replace($destination, $data)); + $destination = PlainTextOutput::renderFromHtml($this->token->replace($destination, [])); return $settings['uri_scheme'] . '://' . $destination; }