Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/CarnetApp/CarnetNextcloud.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/nelexa/zip/src/PhpZip/Model/ZipInfo.php')
-rw-r--r--vendor/nelexa/zip/src/PhpZip/Model/ZipInfo.php594
1 files changed, 594 insertions, 0 deletions
diff --git a/vendor/nelexa/zip/src/PhpZip/Model/ZipInfo.php b/vendor/nelexa/zip/src/PhpZip/Model/ZipInfo.php
new file mode 100644
index 0000000..6434703
--- /dev/null
+++ b/vendor/nelexa/zip/src/PhpZip/Model/ZipInfo.php
@@ -0,0 +1,594 @@
+<?php
+
+namespace PhpZip\Model;
+
+use PhpZip\Extra\Fields\NtfsExtraField;
+use PhpZip\Extra\Fields\WinZipAesEntryExtraField;
+use PhpZip\Util\FilesUtil;
+use PhpZip\ZipFileInterface;
+
+/**
+ * Zip info
+ *
+ * @author Ne-Lexa alexey@nelexa.ru
+ * @license MIT
+ */
+class ZipInfo
+{
+ // made by constants
+ const MADE_BY_MS_DOS = 0;
+ const MADE_BY_AMIGA = 1;
+ const MADE_BY_OPEN_VMS = 2;
+ const MADE_BY_UNIX = 3;
+ const MADE_BY_VM_CMS = 4;
+ const MADE_BY_ATARI = 5;
+ const MADE_BY_OS_2 = 6;
+ const MADE_BY_MACINTOSH = 7;
+ const MADE_BY_Z_SYSTEM = 8;
+ const MADE_BY_CP_M = 9;
+ const MADE_BY_WINDOWS_NTFS = 10;
+ const MADE_BY_MVS = 11;
+ const MADE_BY_VSE = 12;
+ const MADE_BY_ACORN_RISC = 13;
+ const MADE_BY_VFAT = 14;
+ const MADE_BY_ALTERNATE_MVS = 15;
+ const MADE_BY_BEOS = 16;
+ const MADE_BY_TANDEM = 17;
+ const MADE_BY_OS_400 = 18;
+ const MADE_BY_OS_X = 19;
+ const MADE_BY_UNKNOWN = 20;
+
+ const UNX_IFMT = 0170000; /* Unix file type mask */
+ const UNX_IFREG = 0100000; /* Unix regular file */
+ const UNX_IFSOCK = 0140000; /* Unix socket (BSD, not SysV or Amiga) */
+ const UNX_IFLNK = 0120000; /* Unix symbolic link (not SysV, Amiga) */
+ const UNX_IFBLK = 0060000; /* Unix block special (not Amiga) */
+ const UNX_IFDIR = 0040000; /* Unix directory */
+ const UNX_IFCHR = 0020000; /* Unix character special (not Amiga) */
+ const UNX_IFIFO = 0010000; /* Unix fifo (BCC, not MSC or Amiga) */
+ const UNX_ISUID = 04000; /* Unix set user id on execution */
+ const UNX_ISGID = 02000; /* Unix set group id on execution */
+ const UNX_ISVTX = 01000; /* Unix directory permissions control */
+ const UNX_ENFMT = self::UNX_ISGID; /* Unix record locking enforcement flag */
+ const UNX_IRWXU = 00700; /* Unix read, write, execute: owner */
+ const UNX_IRUSR = 00400; /* Unix read permission: owner */
+ const UNX_IWUSR = 00200; /* Unix write permission: owner */
+ const UNX_IXUSR = 00100; /* Unix execute permission: owner */
+ const UNX_IRWXG = 00070; /* Unix read, write, execute: group */
+ const UNX_IRGRP = 00040; /* Unix read permission: group */
+ const UNX_IWGRP = 00020; /* Unix write permission: group */
+ const UNX_IXGRP = 00010; /* Unix execute permission: group */
+ const UNX_IRWXO = 00007; /* Unix read, write, execute: other */
+ const UNX_IROTH = 00004; /* Unix read permission: other */
+ const UNX_IWOTH = 00002; /* Unix write permission: other */
+ const UNX_IXOTH = 00001; /* Unix execute permission: other */
+
+ private static $valuesMadeBy = [
+ self::MADE_BY_MS_DOS => 'FAT',
+ self::MADE_BY_AMIGA => 'Amiga',
+ self::MADE_BY_OPEN_VMS => 'OpenVMS',
+ self::MADE_BY_UNIX => 'UNIX',
+ self::MADE_BY_VM_CMS => 'VM/CMS',
+ self::MADE_BY_ATARI => 'Atari ST',
+ self::MADE_BY_OS_2 => 'OS/2 H.P.F.S.',
+ self::MADE_BY_MACINTOSH => 'Macintosh',
+ self::MADE_BY_Z_SYSTEM => 'Z-System',
+ self::MADE_BY_CP_M => 'CP/M',
+ self::MADE_BY_WINDOWS_NTFS => 'Windows NTFS',
+ self::MADE_BY_MVS => 'MVS (OS/390 - Z/OS)',
+ self::MADE_BY_VSE => 'VSE',
+ self::MADE_BY_ACORN_RISC => 'Acorn Risc',
+ self::MADE_BY_VFAT => 'VFAT',
+ self::MADE_BY_ALTERNATE_MVS => 'Alternate MVS',
+ self::MADE_BY_BEOS => 'BeOS',
+ self::MADE_BY_TANDEM => 'Tandem',
+ self::MADE_BY_OS_400 => 'OS/400',
+ self::MADE_BY_OS_X => 'Mac OS X',
+ ];
+
+ private static $valuesCompressionMethod = [
+ ZipEntry::UNKNOWN => 'unknown',
+ ZipFileInterface::METHOD_STORED => 'no compression',
+ 1 => 'shrink',
+ 2 => 'reduce level 1',
+ 3 => 'reduce level 2',
+ 4 => 'reduce level 3',
+ 5 => 'reduce level 4',
+ 6 => 'implode',
+ 7 => 'reserved for Tokenizing compression algorithm',
+ ZipFileInterface::METHOD_DEFLATED => 'deflate',
+ 9 => 'deflate64',
+ 10 => 'PKWARE Data Compression Library Imploding (old IBM TERSE)',
+ 11 => 'reserved by PKWARE',
+ 12 => 'bzip2',
+ 13 => 'reserved by PKWARE',
+ 14 => 'LZMA (EFS)',
+ 15 => 'reserved by PKWARE',
+ 16 => 'reserved by PKWARE',
+ 17 => 'reserved by PKWARE',
+ 18 => 'IBM TERSE',
+ 19 => 'IBM LZ77 z Architecture (PFS)',
+ 97 => 'WavPack',
+ 98 => 'PPMd version I, Rev 1',
+ ZipEntry::METHOD_WINZIP_AES => 'WinZip AES',
+ ];
+
+ /**
+ * @var string
+ */
+ private $name;
+ /**
+ * @var bool
+ */
+ private $folder;
+ /**
+ * @var int
+ */
+ private $size;
+ /**
+ * @var int
+ */
+ private $compressedSize;
+ /**
+ * @var int
+ */
+ private $mtime;
+ /**
+ * @var int|null
+ */
+ private $ctime;
+ /**
+ * @var int|null
+ */
+ private $atime;
+ /**
+ * @var bool
+ */
+ private $encrypted;
+ /**
+ * @var string|null
+ */
+ private $comment;
+ /**
+ * @var int
+ */
+ private $crc;
+ /**
+ * @var string
+ */
+ private $methodName;
+ /**
+ * @var int
+ */
+ private $compressionMethod;
+ /**
+ * @var string
+ */
+ private $platform;
+ /**
+ * @var int
+ */
+ private $version;
+ /**
+ * @var string
+ */
+ private $attributes;
+ /**
+ * @var int|null
+ */
+ private $encryptionMethod;
+ /**
+ * @var int|null
+ */
+ private $compressionLevel;
+
+ /**
+ * ZipInfo constructor.
+ *
+ * @param ZipEntry $entry
+ */
+ public function __construct(ZipEntry $entry)
+ {
+ $mtime = $entry->getTime();
+ $atime = null;
+ $ctime = null;
+
+ $field = $entry->getExtraFieldsCollection()->get(NtfsExtraField::getHeaderId());
+ if (null !== $field && $field instanceof NtfsExtraField) {
+ /**
+ * @var NtfsExtraField $field
+ */
+ $atime = $field->getAtime();
+ $ctime = $field->getCtime();
+ $mtime = $field->getMtime();
+ }
+
+ $this->name = $entry->getName();
+ $this->folder = $entry->isDirectory();
+ $this->size = PHP_INT_SIZE === 4 ?
+ sprintf('%u', $entry->getSize()) :
+ $entry->getSize();
+ $this->compressedSize = PHP_INT_SIZE === 4 ?
+ sprintf('%u', $entry->getCompressedSize()) :
+ $entry->getCompressedSize();
+ $this->mtime = $mtime;
+ $this->ctime = $ctime;
+ $this->atime = $atime;
+ $this->encrypted = $entry->isEncrypted();
+ $this->encryptionMethod = $entry->getEncryptionMethod();
+ $this->comment = $entry->getComment();
+ $this->crc = $entry->getCrc();
+ $this->compressionMethod = self::getMethodId($entry);
+ $this->methodName = self::getEntryMethodName($entry);
+ $this->platform = self::getPlatformName($entry);
+ $this->version = $entry->getVersionNeededToExtract();
+ $this->compressionLevel = $entry->getCompressionLevel();
+
+ $attributes = str_repeat(" ", 12);
+ $externalAttributes = $entry->getExternalAttributes();
+ $externalAttributes = PHP_INT_SIZE === 4 ?
+ sprintf('%u', $externalAttributes) :
+ $externalAttributes;
+ $xattr = (($externalAttributes >> 16) & 0xFFFF);
+ switch ($entry->getPlatform()) {
+ case self::MADE_BY_MS_DOS:
+ // no break
+ /** @noinspection PhpMissingBreakStatementInspection */
+ case self::MADE_BY_WINDOWS_NTFS:
+ if ($entry->getPlatform() != self::MADE_BY_MS_DOS ||
+ ($xattr & 0700) !=
+ (0400 |
+ (!($externalAttributes & 1) << 7) |
+ (($externalAttributes & 0x10) << 2))
+ ) {
+ $xattr = $externalAttributes & 0xFF;
+ $attributes = ".r.-... ";
+ $attributes[2] = ($xattr & 0x01) ? '-' : 'w';
+ $attributes[5] = ($xattr & 0x02) ? 'h' : '-';
+ $attributes[6] = ($xattr & 0x04) ? 's' : '-';
+ $attributes[4] = ($xattr & 0x20) ? 'a' : '-';
+ if ($xattr & 0x10) {
+ $attributes[0] = 'd';
+ $attributes[3] = 'x';
+ } else {
+ $attributes[0] = '-';
+ }
+ if ($xattr & 0x08) {
+ $attributes[0] = 'V';
+ } else {
+ $ext = strtolower(pathinfo($entry->getName(), PATHINFO_EXTENSION));
+ if (in_array($ext, ["com", "exe", "btm", "cmd", "bat"])) {
+ $attributes[3] = 'x';
+ }
+ }
+ break;
+ } /* else: fall through! */
+
+ // no break
+ default: /* assume Unix-like */
+ switch ($xattr & self::UNX_IFMT) {
+ case self::UNX_IFDIR:
+ $attributes[0] = 'd';
+ break;
+ case self::UNX_IFREG:
+ $attributes[0] = '-';
+ break;
+ case self::UNX_IFLNK:
+ $attributes[0] = 'l';
+ break;
+ case self::UNX_IFBLK:
+ $attributes[0] = 'b';
+ break;
+ case self::UNX_IFCHR:
+ $attributes[0] = 'c';
+ break;
+ case self::UNX_IFIFO:
+ $attributes[0] = 'p';
+ break;
+ case self::UNX_IFSOCK:
+ $attributes[0] = 's';
+ break;
+ default:
+ $attributes[0] = '?';
+ break;
+ }
+ $attributes[1] = ($xattr & self::UNX_IRUSR) ? 'r' : '-';
+ $attributes[4] = ($xattr & self::UNX_IRGRP) ? 'r' : '-';
+ $attributes[7] = ($xattr & self::UNX_IROTH) ? 'r' : '-';
+ $attributes[2] = ($xattr & self::UNX_IWUSR) ? 'w' : '-';
+ $attributes[5] = ($xattr & self::UNX_IWGRP) ? 'w' : '-';
+ $attributes[8] = ($xattr & self::UNX_IWOTH) ? 'w' : '-';
+
+ if ($xattr & self::UNX_IXUSR) {
+ $attributes[3] = ($xattr & self::UNX_ISUID) ? 's' : 'x';
+ } else {
+ $attributes[3] = ($xattr & self::UNX_ISUID) ? 'S' : '-';
+ } /* S==undefined */
+ if ($xattr & self::UNX_IXGRP) {
+ $attributes[6] = ($xattr & self::UNX_ISGID) ? 's' : 'x';
+ } /* == UNX_ENFMT */
+ else {
+ $attributes[6] = ($xattr & self::UNX_ISGID) ? 'S' : '-';
+ } /* SunOS 4.1.x */
+ if ($xattr & self::UNX_IXOTH) {
+ $attributes[9] = ($xattr & self::UNX_ISVTX) ? 't' : 'x';
+ } /* "sticky bit" */
+ else {
+ $attributes[9] = ($xattr & self::UNX_ISVTX) ? 'T' : '-';
+ } /* T==undefined */
+ }
+ $this->attributes = trim($attributes);
+ }
+
+ /**
+ * @param ZipEntry $entry
+ * @return int
+ */
+ private static function getMethodId(ZipEntry $entry)
+ {
+ $method = $entry->getMethod();
+ if ($entry->isEncrypted()) {
+ if ($entry->getMethod() === ZipEntry::METHOD_WINZIP_AES) {
+ $field = $entry->getExtraFieldsCollection()->get(WinZipAesEntryExtraField::getHeaderId());
+ if (null !== $field) {
+ /**
+ * @var WinZipAesEntryExtraField $field
+ */
+ $method = $field->getMethod();
+ }
+ }
+ }
+ return $method;
+ }
+
+ /**
+ * @param ZipEntry $entry
+ * @return string
+ */
+ private static function getEntryMethodName(ZipEntry $entry)
+ {
+ $return = '';
+ if ($entry->isEncrypted()) {
+ if ($entry->getMethod() === ZipEntry::METHOD_WINZIP_AES) {
+ $return = ucfirst(self::$valuesCompressionMethod[$entry->getMethod()]);
+ $field = $entry->getExtraFieldsCollection()->get(WinZipAesEntryExtraField::getHeaderId());
+ if (null !== $field) {
+ /**
+ * @var WinZipAesEntryExtraField $field
+ */
+ $return .= '-' . $field->getKeyStrength();
+ if (isset(self::$valuesCompressionMethod[$field->getMethod()])) {
+ $return .= ' ' . ucfirst(self::$valuesCompressionMethod[$field->getMethod()]);
+ }
+ }
+ } else {
+ $return .= 'ZipCrypto';
+ if (isset(self::$valuesCompressionMethod[$entry->getMethod()])) {
+ $return .= ' ' . ucfirst(self::$valuesCompressionMethod[$entry->getMethod()]);
+ }
+ }
+ } elseif (isset(self::$valuesCompressionMethod[$entry->getMethod()])) {
+ $return = ucfirst(self::$valuesCompressionMethod[$entry->getMethod()]);
+ } else {
+ $return = 'unknown';
+ }
+ return $return;
+ }
+
+ /**
+ * @param ZipEntry $entry
+ * @return string
+ */
+ public static function getPlatformName(ZipEntry $entry)
+ {
+ if (isset(self::$valuesMadeBy[$entry->getPlatform()])) {
+ return self::$valuesMadeBy[$entry->getPlatform()];
+ } else {
+ return 'unknown';
+ }
+ }
+
+ /**
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * @return string
+ * @deprecated use \PhpZip\Model\ZipInfo::getName()
+ */
+ public function getPath()
+ {
+ return $this->getName();
+ }
+
+ /**
+ * @return boolean
+ */
+ public function isFolder()
+ {
+ return $this->folder;
+ }
+
+ /**
+ * @return int
+ */
+ public function getSize()
+ {
+ return $this->size;
+ }
+
+ /**
+ * @return int
+ */
+ public function getCompressedSize()
+ {
+ return $this->compressedSize;
+ }
+
+ /**
+ * @return int
+ */
+ public function getMtime()
+ {
+ return $this->mtime;
+ }
+
+ /**
+ * @return int|null
+ */
+ public function getCtime()
+ {
+ return $this->ctime;
+ }
+
+ /**
+ * @return int|null
+ */
+ public function getAtime()
+ {
+ return $this->atime;
+ }
+
+ /**
+ * @return string
+ */
+ public function getAttributes()
+ {
+ return $this->attributes;
+ }
+
+ /**
+ * @return boolean
+ */
+ public function isEncrypted()
+ {
+ return $this->encrypted;
+ }
+
+ /**
+ * @return null|string
+ */
+ public function getComment()
+ {
+ return $this->comment;
+ }
+
+ /**
+ * @return int
+ */
+ public function getCrc()
+ {
+ return $this->crc;
+ }
+
+ /**
+ * @return string
+ * @deprecated use \PhpZip\Model\ZipInfo::getMethodName()
+ */
+ public function getMethod()
+ {
+ return $this->getMethodName();
+ }
+
+ /**
+ * @return string
+ */
+ public function getMethodName()
+ {
+ return $this->methodName;
+ }
+
+ /**
+ * @return string
+ */
+ public function getPlatform()
+ {
+ return $this->platform;
+ }
+
+ /**
+ * @return int
+ */
+ public function getVersion()
+ {
+ return $this->version;
+ }
+
+ /**
+ * @return int|null
+ */
+ public function getEncryptionMethod()
+ {
+ return $this->encryptionMethod;
+ }
+
+ /**
+ * @return int|null
+ */
+ public function getCompressionLevel()
+ {
+ return $this->compressionLevel;
+ }
+
+ /**
+ * @return int
+ */
+ public function getCompressionMethod()
+ {
+ return $this->compressionMethod;
+ }
+
+ /**
+ * @return array
+ */
+ public function toArray()
+ {
+ return [
+ 'name' => $this->getName(),
+ 'path' => $this->getName(), // deprecated
+ 'folder' => $this->isFolder(),
+ 'size' => $this->getSize(),
+ 'compressed_size' => $this->getCompressedSize(),
+ 'modified' => $this->getMtime(),
+ 'created' => $this->getCtime(),
+ 'accessed' => $this->getAtime(),
+ 'attributes' => $this->getAttributes(),
+ 'encrypted' => $this->isEncrypted(),
+ 'encryption_method' => $this->getEncryptionMethod(),
+ 'comment' => $this->getComment(),
+ 'crc' => $this->getCrc(),
+ 'method' => $this->getMethodName(), // deprecated
+ 'method_name' => $this->getMethodName(),
+ 'compression_method' => $this->getCompressionMethod(),
+ 'platform' => $this->getPlatform(),
+ 'version' => $this->getVersion()
+ ];
+ }
+
+ /**
+ * @return string
+ */
+ public function __toString()
+ {
+ return __CLASS__ . ' {'
+ . 'Name="' . $this->getName() . '", '
+ . ($this->isFolder() ? 'Folder, ' : '')
+ . 'Size="' . FilesUtil::humanSize($this->getSize()) . '"'
+ . ', Compressed size="' . FilesUtil::humanSize($this->getCompressedSize()) . '"'
+ . ', Modified time="' . date(DATE_W3C, $this->getMtime()) . '", '
+ . ($this->getCtime() !== null ? 'Created time="' . date(DATE_W3C, $this->getCtime()) . '", ' : '')
+ . ($this->getAtime() !== null ? 'Accessed time="' . date(DATE_W3C, $this->getAtime()) . '", ' : '')
+ . ($this->isEncrypted() ? 'Encrypted, ' : '')
+ . (!empty($this->comment) ? 'Comment="' . $this->getComment() . '", ' : '')
+ . (!empty($this->crc) ? 'Crc=0x' . dechex($this->getCrc()) . ', ' : '')
+ . 'Method name="' . $this->getMethodName() . '", '
+ . 'Attributes="' . $this->getAttributes() . '", '
+ . 'Platform="' . $this->getPlatform() . '", '
+ . 'Version=' . $this->getVersion()
+ . '}';
+ }
+}