Merge remote-tracking branch 'origin/master'

This commit is contained in:
Weblate 2018-02-14 04:59:58 +01:00
commit 095c3a8fe9
6 changed files with 82 additions and 51 deletions

View File

@ -417,8 +417,9 @@ class Export
public static function compress($dump_buffer, $compression, $filename)
{
if ($compression == 'zip' && @function_exists('gzcompress')) {
$zipExtension = new ZipExtension();
$filename = substr($filename, 0, -4); // remove extension (.zip)
$dump_buffer = ZipExtension::createFile($dump_buffer, $filename);
$dump_buffer = $zipExtension->createFile($dump_buffer, $filename);
} elseif ($compression == 'gzip' && self::gzencodeNeeded()) {
// without the optional parameter level because it bugs
$dump_buffer = gzencode($dump_buffer);

View File

@ -77,6 +77,11 @@ class File
*/
var $_charset = null;
/**
* @var ZipExtension
*/
private $zipExtension;
/**
* constructor
*
@ -89,6 +94,8 @@ class File
if ($name && is_string($name)) {
$this->setName($name);
}
$this->zipExtension = new ZipExtension();
}
/**
@ -662,7 +669,7 @@ class File
*/
public function openZip($specific_entry = null)
{
$result = ZipExtension::getContents($this->getName(), $specific_entry);
$result = $this->zipExtension->getContents($this->getName(), $specific_entry);
if (! empty($result['error'])) {
$this->_error_message = Message::rawError($result['error']);
return false;

View File

@ -171,6 +171,7 @@ EOT;
'META-INF/manifest.xml'
);
return ZipExtension::createFile($data, $name);
$zipExtension = new ZipExtension();
return $zipExtension->createFile($data, $name);
}
}

View File

@ -28,12 +28,18 @@ use PhpMyAdmin\ZipExtension;
*/
class ImportShp extends ImportPlugin
{
/**
* @var ZipExtension
*/
private $zipExtension;
/**
* Constructor
*/
public function __construct()
{
$this->setProperties();
$this->zipExtension = new ZipExtension();
}
/**
@ -73,7 +79,7 @@ class ImportShp extends ImportPlugin
// If the zip archive has more than one file,
// get the correct content to the buffer from .shp file.
if ($compression == 'application/zip'
&& ZipExtension::getNumberOfFiles($import_file) > 1
&& $this->zipExtension->getNumberOfFiles($import_file) > 1
) {
if ($GLOBALS['import_handle']->openZip('/^.*\.shp$/i') === false) {
$message = Message::error(
@ -92,14 +98,14 @@ class ImportShp extends ImportPlugin
// If we can extract the zip archive to 'TempDir'
// and use the files in it for import
if ($compression == 'application/zip' && ! is_null($temp)) {
$dbf_file_name = ZipExtension::findFile(
$dbf_file_name = $this->zipExtension->findFile(
$import_file,
'/^.*\.dbf$/i'
);
// If the corresponding .dbf file is in the zip archive
if ($dbf_file_name) {
// Extract the .dbf file and point to it.
$extracted = ZipExtension::extract(
$extracted = $this->zipExtension->extract(
$import_file,
$dbf_file_name
);

View File

@ -16,6 +16,19 @@ use ZipArchive;
*/
class ZipExtension
{
/**
* @var ZipArchive
*/
private $zip;
/**
* Constructor
*/
public function __construct()
{
$this->zip = new ZipArchive();
}
/**
* Gets zip file contents
*
@ -25,7 +38,7 @@ class ZipExtension
* @return array ($error_message, $file_data); $error_message
* is empty if no error
*/
public static function getContents($file, $specific_entry = null)
public function getContents($file, $specific_entry = null)
{
/**
* This function is used to "import" a SQL file which has been exported earlier
@ -36,33 +49,32 @@ class ZipExtension
$error_message = '';
$file_data = '';
$zip = new ZipArchive;
$res = $zip->open($file);
$res = $this->zip->open($file);
if ($res === true) {
if ($zip->numFiles === 0) {
if ($this->zip->numFiles === 0) {
$error_message = __('No files found inside ZIP archive!');
$zip->close();
$this->zip->close();
return (array('error' => $error_message, 'data' => $file_data));
}
/* Is the the zip really an ODS file? */
$ods_mime = 'application/vnd.oasis.opendocument.spreadsheet';
$first_zip_entry = $zip->getFromIndex(0);
$first_zip_entry = $this->zip->getFromIndex(0);
if (!strcmp($ods_mime, $first_zip_entry)) {
$specific_entry = '/^content\.xml$/';
}
if (!isset($specific_entry)) {
$file_data = $first_zip_entry;
$zip->close();
$this->zip->close();
return (array('error' => $error_message, 'data' => $file_data));
}
/* Return the correct contents, not just the first entry */
for ($i = 0; $i < $zip->numFiles; $i++) {
if (@preg_match($specific_entry, $zip->getNameIndex($i))) {
$file_data = $zip->getFromIndex($i);
for ($i = 0; $i < $this->zip->numFiles; $i++) {
if (@preg_match($specific_entry, $this->zip->getNameIndex($i))) {
$file_data = $this->zip->getFromIndex($i);
break;
}
}
@ -73,11 +85,11 @@ class ZipExtension
. ' Could not find "' . $specific_entry . '"';
}
$zip->close();
$this->zip->close();
return (array('error' => $error_message, 'data' => $file_data));
} else {
$error_message = __('Error in ZIP archive:') . ' ' . $zip->getStatusString();
$zip->close();
$error_message = __('Error in ZIP archive:') . ' ' . $this->zip->getStatusString();
$this->zip->close();
return (array('error' => $error_message, 'data' => $file_data));
}
}
@ -90,16 +102,15 @@ class ZipExtension
*
* @return string the file name of the first file that matches the given regular expression
*/
public static function findFile($file, $regex)
public function findFile($file, $regex)
{
$zip = new ZipArchive;
$res = $zip->open($file);
$res = $this->zip->open($file);
if ($res === true) {
for ($i = 0; $i < $zip->numFiles; $i++) {
if (preg_match($regex, $zip->getNameIndex($i))) {
$filename = $zip->getNameIndex($i);
$zip->close();
for ($i = 0; $i < $this->zip->numFiles; $i++) {
if (preg_match($regex, $this->zip->getNameIndex($i))) {
$filename = $this->zip->getNameIndex($i);
$this->zip->close();
return $filename;
}
}
@ -114,14 +125,13 @@ class ZipExtension
*
* @return int the number of files in the zip archive or 0, either if there wern't any files or an error occured.
*/
public static function getNumberOfFiles($file)
public function getNumberOfFiles($file)
{
$num = 0;
$zip = new ZipArchive;
$res = $zip->open($file);
$res = $this->zip->open($file);
if ($res === true) {
$num = $zip->numFiles;
$num = $this->zip->numFiles;
}
return $num;
}
@ -134,12 +144,11 @@ class ZipExtension
*
* @return string|bool data on sucess, false otherwise
*/
public static function extract($file, $entry)
public function extract($file, $entry)
{
$zip = new ZipArchive;
if ($zip->open($file) === true) {
$result = $zip->getFromName($entry);
$zip->close();
if ($this->zip->open($file) === true) {
$result = $this->zip->getFromName($entry);
$this->zip->close();
return $result;
}
return false;
@ -156,7 +165,7 @@ class ZipExtension
*
* @return string|bool the ZIP file contents, or false if there was an error.
*/
public static function createFile($data, $name, $time = 0)
public function createFile($data, $name, $time = 0)
{
$datasec = array(); // Array to store compressed data
$ctrl_dir = array(); // Central directory

View File

@ -17,8 +17,15 @@ use ZipArchive;
*/
class ZipExtensionTest extends PmaTestCase
{
private $zipExtension;
protected function setUp()
{
$this->zipExtension = new ZipExtension();
}
/**
* Test for ZipExtension::getContents
* Test for getContents
*
* @param string $file path to zip file
* @param string $specific_entry regular expression to match a file
@ -30,7 +37,7 @@ class ZipExtensionTest extends PmaTestCase
public function testGetContents($file, $specific_entry, $output)
{
$this->assertEquals(
ZipExtension::getContents($file, $specific_entry),
$this->zipExtension->getContents($file, $specific_entry),
$output
);
}
@ -63,7 +70,7 @@ class ZipExtensionTest extends PmaTestCase
}
/**
* Test for ZipExtension::findFile
* Test for findFile
*
* @param string $file path to zip file
* @param string $file_regexp regular expression for the file name to match
@ -75,7 +82,7 @@ class ZipExtensionTest extends PmaTestCase
public function testFindFile($file, $file_regexp, $output)
{
$this->assertEquals(
ZipExtension::findFile($file, $file_regexp),
$this->zipExtension->findFile($file, $file_regexp),
$output
);
}
@ -97,20 +104,20 @@ class ZipExtensionTest extends PmaTestCase
}
/**
* Test for ZipExtension::getNumberOfFiles
* Test for getNumberOfFiles
*
* @return void
*/
public function testGetNumberOfFiles()
{
$this->assertEquals(
ZipExtension::getNumberOfFiles('./test/test_data/test.zip'),
$this->zipExtension->getNumberOfFiles('./test/test_data/test.zip'),
1
);
}
/**
* Test for ZipExtension::extract
* Test for extract
*
* @return void
*/
@ -118,13 +125,13 @@ class ZipExtensionTest extends PmaTestCase
{
$this->assertEquals(
false,
ZipExtension::extract(
$this->zipExtension->extract(
'./test/test_data/test.zip', 'wrongName'
)
);
$this->assertEquals(
"TEST FILE\n",
ZipExtension::extract(
$this->zipExtension->extract(
'./test/test_data/test.zip', 'test.file'
)
);
@ -153,13 +160,13 @@ class ZipExtensionTest extends PmaTestCase
}
/**
* Test for ZipExtension::createFile
* Test for createFile
*
* @return void
*/
public function testCreateSingleFile()
{
$file = ZipExtension::createFile("Test content", "test.txt");
$file = $this->zipExtension->createFile("Test content", "test.txt");
$this->assertNotEmpty($file);
$zip = $this->getZip($file);
@ -168,7 +175,7 @@ class ZipExtensionTest extends PmaTestCase
}
/**
* Test for ZipExtension::createFile
* Test for createFile
*
* @return void
*/
@ -176,7 +183,7 @@ class ZipExtensionTest extends PmaTestCase
{
$this->assertEquals(
false,
ZipExtension::createFile(
$this->zipExtension->createFile(
"Content",
array("name1.txt", "name2.txt")
)
@ -184,13 +191,13 @@ class ZipExtensionTest extends PmaTestCase
}
/**
* Test for ZipExtension::createFile
* Test for createFile
*
* @return void
*/
public function testCreateMultiFile()
{
$file = ZipExtension::createFile(
$file = $this->zipExtension->createFile(
array("Content", 'Content2'),
array("name1.txt", "name2.txt")
);