Commit 0485c1d9 authored by mark burdett's avatar mark burdett
Browse files

Issue #1910372 by mfb: Add functionality to help prevent upload of duplicate files

parent b6e731b1
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -80,3 +80,11 @@ field.formatter.settings.filehash_table:
    use_description_as_link_text:
      type: boolean
      label: 'Replace the file name by its description when available'

field.field.*.*.*.third_party.filehash:
  type: mapping
  label: 'File Hash settings'
  mapping:
    dedupe:
      type: integer
      label: 'Disallow duplicate files'
+8 −6
Original line number Diff line number Diff line
@@ -74,15 +74,17 @@ function filehash_entity_storage_load($files, $entity_type) {
}

/**
 * Implements hook_field_widget_single_element_WIDGET_TYPE_form_alter().
 * Implements hook_field_widget_single_element_form_alter().
 */
function filehash_field_widget_single_element_managed_file_form_alter(&$element, FormStateInterface $form_state, $context) {
function filehash_field_widget_single_element_form_alter(&$element, FormStateInterface $form_state, $context) {
  if (isset($element['#type']) && $element['#type'] === 'managed_file') {
    $settings = $context['items']->getFieldDefinition()->getThirdPartySettings('filehash');
    if (!empty($settings['dedupe'])) {
      $strict = FileHashInterface::STRICT_DEDUPE == $settings['dedupe'];
      $element['#upload_validators']['filehash_validate_dedupe'] = [$strict];
    }
  }
}

/**
 * Implements hook_ENTITY_TYPE_create().
+1 −1
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@ use Drush\TestTraits\DrushTestTrait;
/**
 * @coversDefaultClass \Drupal\filehash\Commands\FileHashCommands
 *
 * @group File Hash
 * @group filehash
 */
class DrushTest extends BrowserTestBase {

+24 −1
Original line number Diff line number Diff line
@@ -10,7 +10,7 @@ use Drupal\Tests\file\Functional\FileFieldTestBase;
/**
 * File Hash tests.
 *
 * @group File Hash
 * @group filehash
 */
class FileHashTest extends FileFieldTestBase implements FileHashTestInterface {

@@ -150,6 +150,29 @@ class FileHashTest extends FileFieldTestBase implements FileHashTestInterface {
    $this->drupalGet("node/$nid/edit");
    $this->submitForm([], 'Save');
    $this->assertSession()->addressEquals("node/$nid");

    // Disable global dedupe setting.
    $this->drupalGet('admin/config/media/filehash');
    $fields = ['dedupe' => 0];
    $this->submitForm($fields, 'Save configuration');

    // Test field-level dedupe enabled.
    $this->drupalGet("admin/structure/types/manage/article/fields/node.article.$field_name");
    $fields = ['third_party_settings[filehash][dedupe]' => 2];
    $this->submitForm($fields, 'Save settings');

    $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
    $this->assertSession()->addressEquals("node/$nid/edit");
    $this->assertSession()->pageTextContains(strtr('The specified file %name could not be uploaded.', ['%name' => $test_file->getFilename()]));
    $this->assertSession()->pageTextContains('Sorry, duplicate files are not permitted.');

    // Test field-level dedupe disabled.
    $this->drupalGet("admin/structure/types/manage/article/fields/node.article.$field_name");
    $fields = ['third_party_settings[filehash][dedupe]' => 0];
    $this->submitForm($fields, 'Save settings');

    $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
    $this->assertSession()->addressEquals("node/$nid");
  }

  /**
+2 −0
Original line number Diff line number Diff line
@@ -9,6 +9,8 @@ use Drupal\Tests\filehash\Functional\FileHashTestInterface;

/**
 * Using kernel tests rather than functional for speediness.
 *
 * @group filehash
 */
class FileHashTest extends KernelTestBase implements FileHashTestInterface {