BlueSpice MediaWiki REL1_27
 All Classes Namespaces Files Functions Variables Groups Pages
ZipDirectoryReader Class Reference

Public Member Functions

 execute ()
 
 error ($code, $debugMessage)
 
 readEndOfCentralDirectoryRecord ()
 
 readZip64EndOfCentralDirectoryLocator ()
 
 readZip64EndOfCentralDirectoryRecord ()
 
 findOldCentralDirectory ()
 
 findZip64CentralDirectory ()
 
 readCentralDirectory ($offset, $size)
 
 unpackZip64Extra ($extraField)
 
 getFileLength ()
 
 getBlock ($start, $length=null)
 
 getSegment ($segIndex)
 
 getStructSize ($struct)
 
 unpack ($string, $struct, $offset=0)
 
 testBit ($value, $bitIndex)
 
 hexDump ($s)
 

Static Public Member Functions

static read ($fileName, $callback, $options=[])
 

Public Attributes

 $eocdr64
 
 $eocdr64Locator
 
const ZIP64_EXTRA_HEADER = 0x0001
 
const SEGSIZE = 16384
 
const GENERAL_UTF8 = 11
 
const GENERAL_CD_ENCRYPTED = 13
 

Protected Member Functions

 __construct ($fileName, $callback, $options)
 

Protected Attributes

 $fileName
 
 $file
 
 $fileLength
 
 $buffer
 
 $callback
 
 $zip64 = false
 
 $eocdr
 
 $data
 

Detailed Description

A class for reading ZIP file directories, for the purposes of upload verification.

Only a functional interface is provided: ZipFileReader::read(). No access is given to object instances.

Constructor & Destructor Documentation

ZipDirectoryReader::__construct (   $fileName,
  $callback,
  $options 
)
protected

Private constructor

Parameters
string$fileName
callable$callback
array$options

Member Function Documentation

ZipDirectoryReader::error (   $code,
  $debugMessage 
)

Throw an error, and log a debug message

Parameters
mixed$code
string$debugMessage
Exceptions
ZipDirectoryReaderError
ZipDirectoryReader::execute ( )

Read the directory according to settings in $this.

Returns
Status
ZipDirectoryReader::findOldCentralDirectory ( )

Find the location of the central directory, as would be seen by a non-ZIP64 reader.

Returns
array List containing offset, size and end position.
ZipDirectoryReader::findZip64CentralDirectory ( )

Find the location of the central directory, as would be seen by a ZIP64-compliant reader.

Returns
array List containing offset, size and end position.
ZipDirectoryReader::getBlock (   $start,
  $length = null 
)

Get the file contents from a given offset. If there are not enough bytes in the file to satisfy the request, an exception will be thrown.

Parameters
int$startThe byte offset of the start of the block.
int$lengthThe number of bytes to return. If omitted, the remainder of the file will be returned.
Returns
string
ZipDirectoryReader::getFileLength ( )

Get the length of the file.

Returns
int
ZipDirectoryReader::getSegment (   $segIndex)

Get a section of the file starting at position $segIndex * self::SEGSIZE, of length self::SEGSIZE. The result is cached. This is a helper function for getBlock().

If there are not enough bytes in the file to satisfy the request, the return value will be truncated. If a request is made for a segment beyond the end of the file, an empty string will be returned.

Parameters
int$segIndex
Returns
string
ZipDirectoryReader::getStructSize (   $struct)

Get the size of a structure in bytes. See unpack() for the format of $struct.

Parameters
array$struct
Returns
int
ZipDirectoryReader::hexDump (   $s)

Debugging helper function which dumps a string in hexdump -C format.

Parameters
string$s
static ZipDirectoryReader::read (   $fileName,
  $callback,
  $options = [] 
)
static

Read a ZIP file and call a function for each file discovered in it.

Because this class is aimed at verification, an error is raised on suspicious or ambiguous input, instead of emulating some standard behavior.

Parameters
string$fileNameThe archive file name
array$callbackThe callback function. It will be called for each file with a single associative array each time, with members:
  • name: The file name. Directories conventionally have a trailing slash.
  • mtime: The file modification time, in MediaWiki 14-char format
  • size: The uncompressed file size
Parameters
array$optionsAn associative array of read options, with the option name in the key. This may currently contain:
  • zip64: If this is set to true, then we will emulate a library with ZIP64 support, like OpenJDK 7. If it is set to false, then we will emulate a library with no knowledge of ZIP64.

    NOTE: The ZIP64 code is untested and probably doesn't work. It turned out to be easier to just reject ZIP64 archive uploads, since they are likely to be very rare. Confirming safety of a ZIP64 file is fairly complex. What do you do with a file that is ambiguous and broken when read with a non-ZIP64 reader, but valid when read with a ZIP64 reader? This situation is normal for a valid ZIP64 file, and working out what non-ZIP64 readers will make of such a file is not trivial.

Returns
Status A Status object. The following fatal errors are defined:
 - zip-file-open-error: The file could not be opened.

 - zip-wrong-format: The file does not appear to be a ZIP file.

 - zip-bad: There was something wrong or ambiguous about the file
   data.

 - zip-unsupported: The ZIP file uses features which
   ZipDirectoryReader does not support.

The default messages for those fatal errors are written in a way that makes sense for upload verification.

If a fatal error is returned, more information about the error will be available in the debug log.

Note that the callback function may be called any number of times before a fatal error is returned. If this occurs, the data sent to the callback function should be discarded.

ZipDirectoryReader::readCentralDirectory (   $offset,
  $size 
)

Read the central directory at the given location

Parameters
int$offset
int$size
ZipDirectoryReader::readEndOfCentralDirectoryRecord ( )

Read the header which is at the end of the central directory, unimaginatively called the "end of central directory record" by the ZIP spec.

ZipDirectoryReader::readZip64EndOfCentralDirectoryLocator ( )

Read the header called the "ZIP64 end of central directory locator". An error will be raised if it does not exist.

ZipDirectoryReader::readZip64EndOfCentralDirectoryRecord ( )

Read the header called the "ZIP64 end of central directory record". It may replace the regular "end of central directory record" in ZIP64 files.

ZipDirectoryReader::testBit (   $value,
  $bitIndex 
)

Returns a bit from a given position in an integer value, converted to boolean.

Parameters
int$value
int$bitIndexThe index of the bit, where 0 is the LSB.
Returns
bool
ZipDirectoryReader::unpack (   $string,
  $struct,
  $offset = 0 
)

Unpack a binary structure. This is like the built-in unpack() function except nicer.

Parameters
string$stringThe binary data input
array$structAn associative array giving structure members and their types. In the key is the field name. The value may be either an integer, in which case the field is a little-endian unsigned integer encoded in the given number of bytes, or an array, in which case the first element of the array is the type name, and the subsequent elements are type-dependent parameters. Only one such type is defined:
  • "string": The second array element gives the length of string. Not null terminated.
int$offsetThe offset into the string at which to start unpacking.
Exceptions
MWException
Returns
array Unpacked associative array. Note that large integers in the input may be represented as floating point numbers in the return value, so the use of weak comparison is advised.
ZipDirectoryReader::unpackZip64Extra (   $extraField)

Interpret ZIP64 "extra field" data and return an associative array.

Parameters
string$extraField
Returns
array|bool

Member Data Documentation

ZipDirectoryReader::$buffer
protected

A segmented cache of the file contents

ZipDirectoryReader::$callback
protected

The file data callback

ZipDirectoryReader::$eocdr
protected

Stored headers

ZipDirectoryReader::$file
protected

The opened file resource

ZipDirectoryReader::$fileLength
protected

The cached length of the file, or null if it has not been loaded yet.

ZipDirectoryReader::$fileName
protected

The file name

ZipDirectoryReader::$zip64 = false
protected

The ZIP64 mode

const ZipDirectoryReader::GENERAL_CD_ENCRYPTED = 13

The index of the "general field" bit for central directory encryption

const ZipDirectoryReader::GENERAL_UTF8 = 11

The index of the "general field" bit for UTF-8 file names

const ZipDirectoryReader::SEGSIZE = 16384

The segment size for the file contents cache

const ZipDirectoryReader::ZIP64_EXTRA_HEADER = 0x0001

The "extra field" ID for ZIP64 central directory entries


The documentation for this class was generated from the following file: