Verified Commit 70700fcc authored by Alex Pott's avatar Alex Pott
Browse files

Issue #2850794 by cilefen, rahulrasgon, borisson_, andypost, collinhaines,...

Issue #2850794 by cilefen, rahulrasgon, borisson_, andypost, collinhaines, mr.baileys, averagejoe3000, sdstyles, Pavan B S, alexpott, idebr: Unable to open Zip archive using ArchiverZip
parent 586900ec
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@ public function __construct(\Traversable $namespaces, CacheBackendInterface $cac
  public function createInstance($plugin_id, array $configuration = []) {
    $plugin_definition = $this->getDefinition($plugin_id);
    $plugin_class = DefaultFactory::getPluginClass($plugin_id, $plugin_definition, 'Drupal\Core\Archiver\ArchiverInterface');
    return new $plugin_class($this->fileSystem->realpath($configuration['filepath']));
    return new $plugin_class($this->fileSystem->realpath($configuration['filepath']), $configuration);
  }

  /**
+9 −2
Original line number Diff line number Diff line
@@ -21,11 +21,18 @@ class Tar implements ArchiverInterface {
   *   The full system path of the archive to manipulate. Only local files
   *   are supported. If the file does not yet exist, it will be created if
   *   appropriate.
   * @param array $configuration
   *   (Optional) settings to open the archive with the following keys:
   *   - 'compress': Indicates if the 'gzip', 'bz2', or 'lzma2' compression is
   *     required.
   *   - 'buffer_length': Length of the read buffer in bytes.
   *
   * @throws \Drupal\Core\Archiver\ArchiverException
   */
  public function __construct($file_path) {
    $this->tar = new ArchiveTar($file_path);
  public function __construct($file_path, array $configuration = []) {
    $compress = $configuration['compress'] ?? NULL;
    $buffer = $configuration['buffer_length'] ?? 512;
    $this->tar = new ArchiveTar($file_path, $compress, $buffer);
  }

  /**
+5 −2
Original line number Diff line number Diff line
@@ -23,12 +23,15 @@ class Zip implements ArchiverInterface {
   *   The full system path of the archive to manipulate. Only local files
   *   are supported. If the file does not yet exist, it will be created if
   *   appropriate.
   * @param array $configuration
   *   (Optional) settings to open the archive with the following keys:
   *   - 'flags': The mode to open the archive with \ZipArchive::open().
   *
   * @throws \Drupal\Core\Archiver\ArchiverException
   */
  public function __construct($file_path) {
  public function __construct($file_path, array $configuration = []) {
    $this->zip = new \ZipArchive();
    if ($this->zip->open($file_path) !== TRUE) {
    if ($this->zip->open($file_path, $configuration['flags'] ?? 0) !== TRUE) {
      throw new ArchiverException("Cannot open '$file_path'");
    }
  }
+1 −0
Original line number Diff line number Diff line
@@ -645,6 +645,7 @@ lstitle
ltitle
ltlanguage
lundi
lzma
lzop
maailma
macbinary
+74 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\KernelTests\Core\Archiver;

use Drupal\KernelTests\Core\File\FileTestBase;
use Drupal\Tests\TestFileCreationTrait;

/**
 * Base class for archive tests that adds some additional archive specific
 * assertions and helper properties.
 */
abstract class ArchiverTestBase extends FileTestBase {
  use TestFileCreationTrait;

  /**
   * The archiver plugin identifier.
   *
   * @var string
   */
  protected $archiverPluginId;

  /**
   * The file system service.
   *
   * @var \Drupal\Core\File\FileSystemInterface
   */
  protected $fileSystem;

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();

    $this->fileSystem = $this->container->get('file_system');
  }

  /**
   * Asserts an archive contains a given file.
   *
   * @param string $path
   *   Absolute file path to an archived file.
   * @param string $file
   *   File to assert does exist within the archived file.
   * @param array $configuration
   *   Optional configuration to pass to the archiver plugin.
   */
  protected function assertArchiveContainsFile($path, $file, array $configuration = []) {
    $configuration['filepath'] = $path;
    /** @var \Drupal\Core\Archiver\ArchiverManager $manager */
    $manager = $this->container->get('plugin.manager.archiver');
    $archive = $manager->createInstance($this->archiverPluginId, $configuration);
    $this->assertContains($file, $archive->listContents(), sprintf('The "%s" archive contains the "%s" file.', $path, $file));
  }

  /**
   * Asserts an archive does not contain a given file.
   *
   * @param string $path
   *   Absolute file path to an archived file.
   * @param string $file
   *   File to assert does not exist within the archived file.
   * @param array $configuration
   *   Optional configuration to pass to the archiver plugin.
   */
  protected function assertArchiveNotContainsFile($path, $file, array $configuration = []) {
    $configuration['filepath'] = $path;
    /** @var \Drupal\Core\Archiver\ArchiverManager $manager */
    $manager = $this->container->get('plugin.manager.archiver');
    $archive = $manager->createInstance($this->archiverPluginId, $configuration);
    $this->assertNotContains($file, $archive->listContents(), sprintf('The "%s" archive does not contain the "%s" file.', $path, $file));
  }

}
Loading