source: branches/MootoolsFileManager-Update/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/Assets/getid3/module.archive.gzip.php @ 1300

Last change on this file since 1300 was 1300, checked in by gogo, 8 years ago

Update the MootoolsFileManager? to the latest cpojer with some modifications.
Add a demo for the MFM examples/mootools-file-manager.php
Change the default config for ImageManager? and ExtendedFileManager? for added security.

File size: 9.5 KB
Line 
1<?php
2/////////////////////////////////////////////////////////////////
3/// getID3() by James Heinrich <info@getid3.org>               //
4//  available at http://getid3.sourceforge.net                 //
5//            or http://www.getid3.org                         //
6/////////////////////////////////////////////////////////////////
7// See readme.txt for more details                             //
8/////////////////////////////////////////////////////////////////
9//                                                             //
10// module.archive.gzip.php                                     //
11// module for analyzing GZIP files                             //
12// dependencies: NONE                                          //
13//                                                            ///
14/////////////////////////////////////////////////////////////////
15//                                                             //
16// Module originally written by                                //
17//      Mike Mozolin <teddybearØmail*ru>                       //
18//                                                             //
19/////////////////////////////////////////////////////////////////
20
21
22class getid3_gzip {
23
24        // public: Optional file list - disable for speed.
25        var $option_gzip_parse_contents = false; // decode gzipped files, if possible, and parse recursively (.tar.gz for example)
26
27        function getid3_gzip(&$fd, &$ThisFileInfo) {
28                $ThisFileInfo['fileformat'] = 'gzip';
29
30                $start_length = 10;
31                $unpack_header = 'a1id1/a1id2/a1cmethod/a1flags/a4mtime/a1xflags/a1os';
32                //+---+---+---+---+---+---+---+---+---+---+
33                //|ID1|ID2|CM |FLG|     MTIME     |XFL|OS |
34                //+---+---+---+---+---+---+---+---+---+---+
35                ob_start();
36                fseek($fd, 0);
37                $buffer = fread($fd, $ThisFileInfo['filesize']);
38                $errormessage = ob_get_contents();
39                ob_end_clean();
40
41                $arr_members = explode("\x1F\x8B\x08", $buffer);
42                while (true) {
43                        $is_wrong_members = false;
44                        $num_members = intval(count($arr_members));
45                        for ($i = 0; $i < $num_members; $i++) {
46                                if (strlen($arr_members[$i]) == 0) {
47                                        continue;
48                                }
49                                $buf = "\x1F\x8B\x08".$arr_members[$i];
50
51                                $attr = unpack($unpack_header, substr($buf, 0, $start_length));
52                                if (!$this->get_os_type(ord($attr['os']))) {
53                                        // Merge member with previous if wrong OS type
54                                        $arr_members[$i - 1] .= $buf;
55                                        $arr_members[$i] = '';
56                                        $is_wrong_members = true;
57                                        continue;
58                                }
59                        }
60                        if (!$is_wrong_members) {
61                                break;
62                        }
63                }
64
65                $ThisFileInfo['gzip']['files'] = array();
66
67                $fpointer = 0;
68                $idx = 0;
69                for ($i = 0; $i < $num_members; $i++) {
70                        if (strlen($arr_members[$i]) == 0) {
71                                continue;
72                        }
73                        $thisThisFileInfo = &$ThisFileInfo['gzip']['member_header'][++$idx];
74
75                        $buff = "\x1F\x8B\x08".$arr_members[$i];
76
77                        $attr = unpack($unpack_header, substr($buff, 0, $start_length));
78                        $thisThisFileInfo['filemtime']      = getid3_lib::LittleEndian2Int($attr['mtime']);
79                        $thisThisFileInfo['raw']['id1']     = ord($attr['cmethod']);
80                        $thisThisFileInfo['raw']['id2']     = ord($attr['cmethod']);
81                        $thisThisFileInfo['raw']['cmethod'] = ord($attr['cmethod']);
82                        $thisThisFileInfo['raw']['os']      = ord($attr['os']);
83                        $thisThisFileInfo['raw']['xflags']  = ord($attr['xflags']);
84                        $thisThisFileInfo['raw']['flags']   = ord($attr['flags']);
85
86                        $thisThisFileInfo['flags']['crc16']    = (bool) ($thisThisFileInfo['raw']['flags'] & 0x02);
87                        $thisThisFileInfo['flags']['extra']    = (bool) ($thisThisFileInfo['raw']['flags'] & 0x04);
88                        $thisThisFileInfo['flags']['filename'] = (bool) ($thisThisFileInfo['raw']['flags'] & 0x08);
89                        $thisThisFileInfo['flags']['comment']  = (bool) ($thisThisFileInfo['raw']['flags'] & 0x10);
90
91                        $thisThisFileInfo['compression'] = $this->get_xflag_type($thisThisFileInfo['raw']['xflags']);
92
93                        $thisThisFileInfo['os'] = $this->get_os_type($thisThisFileInfo['raw']['os']);
94                        if (!$thisThisFileInfo['os']) {
95                                $ThisFileInfo['error'][] = 'Read error on gzip file';
96                                return false;
97                        }
98
99                        $fpointer = 10;
100                        $arr_xsubfield = array();
101                        // bit 2 - FLG.FEXTRA
102                        //+---+---+=================================+
103                        //| XLEN  |...XLEN bytes of "extra field"...|
104                        //+---+---+=================================+
105                        if ($thisThisFileInfo['flags']['extra']) {
106                                $w_xlen = substr($buff, $fpointer, 2);
107                                $xlen = getid3_lib::LittleEndian2Int($w_xlen);
108                                $fpointer += 2;
109
110                                $thisThisFileInfo['raw']['xfield'] = substr($buff, $fpointer, $xlen);
111                                // Extra SubFields
112                                //+---+---+---+---+==================================+
113                                //|SI1|SI2|  LEN  |... LEN bytes of subfield data ...|
114                                //+---+---+---+---+==================================+
115                                $idx = 0;
116                                while (true) {
117                                        if ($idx >= $xlen) {
118                                                break;
119                                        }
120                                        $si1 = ord(substr($buff, $fpointer + $idx++, 1));
121                                        $si2 = ord(substr($buff, $fpointer + $idx++, 1));
122                                        if (($si1 == 0x41) && ($si2 == 0x70)) {
123                                                $w_xsublen = substr($buff, $fpointer + $idx, 2);
124                                                $xsublen = getid3_lib::LittleEndian2Int($w_xsublen);
125                                                $idx += 2;
126                                                $arr_xsubfield[] = substr($buff, $fpointer + $idx, $xsublen);
127                                                $idx += $xsublen;
128                                        } else {
129                                                break;
130                                        }
131                                }
132                                $fpointer += $xlen;
133                        }
134                        // bit 3 - FLG.FNAME
135                        //+=========================================+
136                        //|...original file name, zero-terminated...|
137                        //+=========================================+
138                        // GZIP files may have only one file, with no filename, so assume original filename is current filename without .gz
139                        $thisThisFileInfo['filename'] = preg_replace('#\.gz$#i', '', $ThisFileInfo['filename']);
140                        if ($thisThisFileInfo['flags']['filename']) {
141                                while (true) {
142                                        if (ord($buff[$fpointer]) == 0) {
143                                                $fpointer++;
144                                                break;
145                                        }
146                                        $thisThisFileInfo['filename'] .= $buff[$fpointer];
147                                        $fpointer++;
148                                }
149                        }
150                        // bit 4 - FLG.FCOMMENT
151                        //+===================================+
152                        //|...file comment, zero-terminated...|
153                        //+===================================+
154                        if ($thisThisFileInfo['flags']['comment']) {
155                                while (true) {
156                                        if (ord($buff[$fpointer]) == 0) {
157                                                $fpointer++;
158                                                break;
159                                        }
160                                        $thisThisFileInfo['comment'] .= $buff[$fpointer];
161                                        $fpointer++;
162                                }
163                        }
164                        // bit 1 - FLG.FHCRC
165                        //+---+---+
166                        //| CRC16 |
167                        //+---+---+
168                        if ($thisThisFileInfo['flags']['crc16']) {
169                                $w_crc = substr($buff, $fpointer, 2);
170                                $thisThisFileInfo['crc16'] = getid3_lib::LittleEndian2Int($w_crc);
171                                $fpointer += 2;
172                        }
173                        // bit 0 - FLG.FTEXT
174                        //if ($thisThisFileInfo['raw']['flags'] & 0x01) {
175                        //      Ignored...
176                        //}
177                        // bits 5, 6, 7 - reserved
178
179                        $thisThisFileInfo['crc32']    = getid3_lib::LittleEndian2Int(substr($buff, strlen($buff) - 8, 4));
180                        $thisThisFileInfo['filesize'] = getid3_lib::LittleEndian2Int(substr($buff, strlen($buff) - 4));
181
182                        $ThisFileInfo['gzip']['files'] = getid3_lib::array_merge_clobber($ThisFileInfo['gzip']['files'], getid3_lib::CreateDeepArray($thisThisFileInfo['filename'], '/', $thisThisFileInfo['filesize']));
183
184                        if ($this->option_gzip_parse_contents) {
185                                // Try to inflate GZip
186                                $csize = 0;
187                                $inflated = '';
188                                $chkcrc32 = '';
189                                if (function_exists('gzinflate')) {
190                                        $cdata = substr($buff, $fpointer);
191                                        $cdata = substr($cdata, 0, strlen($cdata) - 8);
192                                        $csize = strlen($cdata);
193                                        $inflated = gzinflate($cdata);
194
195                                        // Calculate CRC32 for inflated content
196                                        $thisThisFileInfo['crc32_valid'] = (bool) (sprintf('%u', crc32($inflated)) == $thisThisFileInfo['crc32']);
197
198                                        // determine format
199                                        $formattest = substr($inflated, 0, 32774);
200                                        $newgetID3 = new getID3();
201                                        $determined_format = $newgetID3->GetFileFormat($formattest);
202                                        unset($newgetID3);
203
204                                        // file format is determined
205                                        $determined_format['module'] = (isset($determined_format['module']) ? $determined_format['module'] : '');
206                                        switch ($determined_format['module']) {
207                                                case 'tar':
208                                                        // view TAR-file info
209                                                        if (file_exists(GETID3_INCLUDEPATH.$determined_format['include']) && include_once(GETID3_INCLUDEPATH.$determined_format['include'])) {
210                                                                if (($temp_tar_filename = tempnam(GETID3_TEMP_DIR, 'getID3')) === false) {
211                                                                        // can't find anywhere to create a temp file, abort
212                                                                        $ThisFileInfo['error'][] = 'Unable to create temp file to parse TAR inside GZIP file';
213                                                                        break;
214                                                                }
215                                                                if ($fp_temp_tar = fopen($temp_tar_filename, 'w+b')) {
216                                                                        fwrite($fp_temp_tar, $inflated);
217                                                                        rewind($fp_temp_tar);
218                                                                        $getid3_tar = new getid3_tar($fp_temp_tar, $dummy);
219                                                                        $ThisFileInfo['gzip']['member_header'][$idx]['tar'] = $dummy['tar'];
220                                                                        unset($dummy);
221                                                                        unset($getid3_tar);
222                                                                        fclose($fp_temp_tar);
223                                                                        unlink($temp_tar_filename);
224                                                                } else {
225                                                                        $ThisFileInfo['error'][] = 'Unable to fopen() temp file to parse TAR inside GZIP file';
226                                                                        break;
227                                                                }
228                                                        }
229                                                        break;
230
231                                                case '':
232                                                default:
233                                                        // unknown or unhandled format
234                                                        break;
235                                        }
236                                }
237                        }
238                }
239                return true;
240        }
241
242        // Converts the OS type
243        function get_os_type($key) {
244                static $os_type = array(
245                        '0'   => 'FAT filesystem (MS-DOS, OS/2, NT/Win32)',
246                        '1'   => 'Amiga',
247                        '2'   => 'VMS (or OpenVMS)',
248                        '3'   => 'Unix',
249                        '4'   => 'VM/CMS',
250                        '5'   => 'Atari TOS',
251                        '6'   => 'HPFS filesystem (OS/2, NT)',
252                        '7'   => 'Macintosh',
253                        '8'   => 'Z-System',
254                        '9'   => 'CP/M',
255                        '10'  => 'TOPS-20',
256                        '11'  => 'NTFS filesystem (NT)',
257                        '12'  => 'QDOS',
258                        '13'  => 'Acorn RISCOS',
259                        '255' => 'unknown'
260                );
261                return (isset($os_type[$key]) ? $os_type[$key] : '');
262        }
263
264        // Converts the eXtra FLags
265        function get_xflag_type($key) {
266                static $xflag_type = array(
267                        '0' => 'unknown',
268                        '2' => 'maximum compression',
269                        '4' => 'fastest algorithm'
270                );
271                return (isset($xflag_type[$key]) ? $xflag_type[$key] : '');
272        }
273}
274
275?>
Note: See TracBrowser for help on using the repository browser.