Chris@18
|
1 <?php
|
Chris@18
|
2 namespace TYPO3\PharStreamWrapper\Phar;
|
Chris@18
|
3
|
Chris@18
|
4 /*
|
Chris@18
|
5 * This file is part of the TYPO3 project.
|
Chris@18
|
6 *
|
Chris@18
|
7 * It is free software; you can redistribute it and/or modify it under the terms
|
Chris@18
|
8 * of the MIT License (MIT). For the full copyright and license information,
|
Chris@18
|
9 * please read the LICENSE file that was distributed with this source code.
|
Chris@18
|
10 *
|
Chris@18
|
11 * The TYPO3 project - inspiring people to share!
|
Chris@18
|
12 */
|
Chris@18
|
13
|
Chris@18
|
14 use Brumann\Polyfill\Unserialize;
|
Chris@18
|
15
|
Chris@18
|
16 class Manifest
|
Chris@18
|
17 {
|
Chris@18
|
18 /**
|
Chris@18
|
19 * @param string $content
|
Chris@18
|
20 * @return self
|
Chris@18
|
21 * @see http://php.net/manual/en/phar.fileformat.phar.php
|
Chris@18
|
22 */
|
Chris@18
|
23 public static function fromContent($content)
|
Chris@18
|
24 {
|
Chris@18
|
25 $target = new static();
|
Chris@18
|
26 $target->manifestLength = Reader::resolveFourByteLittleEndian($content, 0);
|
Chris@18
|
27 $target->amountOfFiles = Reader::resolveFourByteLittleEndian($content, 4);
|
Chris@18
|
28 $target->flags = Reader::resolveFourByteLittleEndian($content, 10);
|
Chris@18
|
29 $target->aliasLength = Reader::resolveFourByteLittleEndian($content, 14);
|
Chris@18
|
30 $target->alias = substr($content, 18, $target->aliasLength);
|
Chris@18
|
31 $target->metaDataLength = Reader::resolveFourByteLittleEndian($content, 18 + $target->aliasLength);
|
Chris@18
|
32 $target->metaData = substr($content, 22 + $target->aliasLength, $target->metaDataLength);
|
Chris@18
|
33
|
Chris@18
|
34 $apiVersionNibbles = Reader::resolveTwoByteBigEndian($content, 8);
|
Chris@18
|
35 $target->apiVersion = implode('.', array(
|
Chris@18
|
36 ($apiVersionNibbles & 0xf000) >> 12,
|
Chris@18
|
37 ($apiVersionNibbles & 0x0f00) >> 8,
|
Chris@18
|
38 ($apiVersionNibbles & 0x00f0) >> 4,
|
Chris@18
|
39 ));
|
Chris@18
|
40
|
Chris@18
|
41 return $target;
|
Chris@18
|
42 }
|
Chris@18
|
43
|
Chris@18
|
44 /**
|
Chris@18
|
45 * @var int
|
Chris@18
|
46 */
|
Chris@18
|
47 private $manifestLength;
|
Chris@18
|
48
|
Chris@18
|
49 /**
|
Chris@18
|
50 * @var int
|
Chris@18
|
51 */
|
Chris@18
|
52 private $amountOfFiles;
|
Chris@18
|
53
|
Chris@18
|
54 /**
|
Chris@18
|
55 * @var string
|
Chris@18
|
56 */
|
Chris@18
|
57 private $apiVersion;
|
Chris@18
|
58
|
Chris@18
|
59 /**
|
Chris@18
|
60 * @var int
|
Chris@18
|
61 */
|
Chris@18
|
62 private $flags;
|
Chris@18
|
63
|
Chris@18
|
64 /**
|
Chris@18
|
65 * @var int
|
Chris@18
|
66 */
|
Chris@18
|
67 private $aliasLength;
|
Chris@18
|
68
|
Chris@18
|
69 /**
|
Chris@18
|
70 * @var string
|
Chris@18
|
71 */
|
Chris@18
|
72 private $alias;
|
Chris@18
|
73
|
Chris@18
|
74 /**
|
Chris@18
|
75 * @var int
|
Chris@18
|
76 */
|
Chris@18
|
77 private $metaDataLength;
|
Chris@18
|
78
|
Chris@18
|
79 /**
|
Chris@18
|
80 * @var string
|
Chris@18
|
81 */
|
Chris@18
|
82 private $metaData;
|
Chris@18
|
83
|
Chris@18
|
84 /**
|
Chris@18
|
85 * Avoid direct instantiation.
|
Chris@18
|
86 */
|
Chris@18
|
87 private function __construct()
|
Chris@18
|
88 {
|
Chris@18
|
89 }
|
Chris@18
|
90
|
Chris@18
|
91 /**
|
Chris@18
|
92 * @return int
|
Chris@18
|
93 */
|
Chris@18
|
94 public function getManifestLength()
|
Chris@18
|
95 {
|
Chris@18
|
96 return $this->manifestLength;
|
Chris@18
|
97 }
|
Chris@18
|
98
|
Chris@18
|
99 /**
|
Chris@18
|
100 * @return int
|
Chris@18
|
101 */
|
Chris@18
|
102 public function getAmountOfFiles()
|
Chris@18
|
103 {
|
Chris@18
|
104 return $this->amountOfFiles;
|
Chris@18
|
105 }
|
Chris@18
|
106
|
Chris@18
|
107 /**
|
Chris@18
|
108 * @return string
|
Chris@18
|
109 */
|
Chris@18
|
110 public function getApiVersion()
|
Chris@18
|
111 {
|
Chris@18
|
112 return $this->apiVersion;
|
Chris@18
|
113 }
|
Chris@18
|
114
|
Chris@18
|
115 /**
|
Chris@18
|
116 * @return int
|
Chris@18
|
117 */
|
Chris@18
|
118 public function getFlags()
|
Chris@18
|
119 {
|
Chris@18
|
120 return $this->flags;
|
Chris@18
|
121 }
|
Chris@18
|
122
|
Chris@18
|
123 /**
|
Chris@18
|
124 * @return int
|
Chris@18
|
125 */
|
Chris@18
|
126 public function getAliasLength()
|
Chris@18
|
127 {
|
Chris@18
|
128 return $this->aliasLength;
|
Chris@18
|
129 }
|
Chris@18
|
130
|
Chris@18
|
131 /**
|
Chris@18
|
132 * @return string
|
Chris@18
|
133 */
|
Chris@18
|
134 public function getAlias()
|
Chris@18
|
135 {
|
Chris@18
|
136 return $this->alias;
|
Chris@18
|
137 }
|
Chris@18
|
138
|
Chris@18
|
139 /**
|
Chris@18
|
140 * @return int
|
Chris@18
|
141 */
|
Chris@18
|
142 public function getMetaDataLength()
|
Chris@18
|
143 {
|
Chris@18
|
144 return $this->metaDataLength;
|
Chris@18
|
145 }
|
Chris@18
|
146
|
Chris@18
|
147 /**
|
Chris@18
|
148 * @return string
|
Chris@18
|
149 */
|
Chris@18
|
150 public function getMetaData()
|
Chris@18
|
151 {
|
Chris@18
|
152 return $this->metaData;
|
Chris@18
|
153 }
|
Chris@18
|
154
|
Chris@18
|
155 /**
|
Chris@18
|
156 * @return mixed|null
|
Chris@18
|
157 */
|
Chris@18
|
158 public function deserializeMetaData()
|
Chris@18
|
159 {
|
Chris@18
|
160 if (empty($this->metaData)) {
|
Chris@18
|
161 return null;
|
Chris@18
|
162 }
|
Chris@18
|
163
|
Chris@18
|
164 $result = Unserialize::unserialize($this->metaData, array('allowed_classes' => false));
|
Chris@18
|
165
|
Chris@18
|
166 $serialized = json_encode($result);
|
Chris@18
|
167 if (strpos($serialized, '__PHP_Incomplete_Class_Name') !== false) {
|
Chris@18
|
168 throw new DeserializationException(
|
Chris@18
|
169 'Meta-data contains serialized object',
|
Chris@18
|
170 1539623382
|
Chris@18
|
171 );
|
Chris@18
|
172 }
|
Chris@18
|
173
|
Chris@18
|
174 return $result;
|
Chris@18
|
175 }
|
Chris@18
|
176 }
|