Subversion Repositories personal-webbase

Rev

Rev 8 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 daniel-mar 1
<?
2
 
14 daniel-mar 3
if (!defined('WBLEGAL')) die('Kann nicht ohne Personal WebBase ausgef&uuml;hrt werden.');
2 daniel-mar 4
 
5
// 15/07/2006 (2.6)
6
// - Changed the algorithm to parse the ZIP file.. Now, the script will try to mount the compressed
7
//   list, searching on the 'Central Dir' records. If it fails, the script will try to search by
8
//   checking every signature. Thanks to Jayson Cruz for pointing it.
9
// 25/01/2006 (2.51)
10
// - Fixed bug when calling 'unzip' without calling 'getList' first. Thanks to Bala Murthu for pointing it.
11
// 01/12/2006 (2.5)
12
// - Added optional parameter "applyChmod" for the "unzip()" method. It auto applies the given chmod for
13
//   extracted files.
14
// - Permission 777 (all read-write-exec) is default. If you want to change it, you'll need to make it
15
//   explicit. (If you want the OS to determine, set "false" as "applyChmod" parameter)
16
// 28/11/2005 (2.4)
17
// - dUnzip2 is now compliant with old-style "Data Description", made by some compressors,
18
//   like the classes ZipLib and ZipLib2 by 'Hasin Hayder'. Thanks to Ricardo Parreno for pointing it.
19
// 09/11/2005 (2.3)
20
// - Added optional parameter '$stopOnFile' on method 'getList()'.
21
//   If given, file listing will stop when find given filename. (Useful to open and unzip an exact file)
22
// 06/11/2005 (2.21)
23
// - Added support to PK00 file format (Packed to Removable Disk) (thanks to Lito [PHPfileNavigator])
24
// - Method 'getExtraInfo': If requested file doesn't exist, return FALSE instead of Array()
25
// 31/10/2005 (2.2)
26
// - Removed redundant 'file_name' on centralDirs declaration (thanks to Lito [PHPfileNavigator])
27
// - Fixed redeclaration of file_put_contents when in PHP4 (not returning true)
28
 
29
##############################################################
30
# Class dUnzip2 v2.6
31
#
32
#  Author: Alexandre Tedeschi (d)
33
#  E-Mail: alexandrebr at gmail dot com
34
#  Londrina - PR / Brazil
35
#
36
#  Objective:
37
#    This class allows programmer to easily unzip files on the fly.
38
#
39
#  Requirements:
40
#    This class requires extension ZLib Enabled. It is default
41
#    for most site hosts around the world, and for the PHP Win32 dist.
42
#
43
#  To do:
44
#   * Error handling
45
#   * Write a PHP-Side gzinflate, to completely avoid any external extensions
46
#   * Write other decompress algorithms
47
#
48
#  If you modify this class, or have any ideas to improve it, please contact me!
49
#  You are allowed to redistribute this class, if you keep my name and contact e-mail on it.
50
#
51
#  PLEASE! IF YOU USE THIS CLASS IN ANY OF YOUR PROJECTS, PLEASE LET ME KNOW!
52
#  If you have problems using it, don't think twice before contacting me!
53
#
54
##############################################################
55
 
3 daniel-mar 56
// Personal WebBase Zusatz für Kompatibilität mit Safe-Mode-Restriktion
2 daniel-mar 57
 
58
function my_mkdir($dr)
59
{
60
  global $conn_id;
61
  global $konfiguration;
62
  global $uid;
63
  global $modul;
8 daniel-mar 64
  $dr2 = substr($dr, strlen('modules/'.wb_dir_escape($modul).'/temp/'.wb_dir_escape($uid)), strlen($dr)-strlen('modules/'.wb_dir_escape($modul).'/temp/'.wb_dir_escape($uid)));
65
  @ftp_mkdir($conn_id, $konfiguration['core_directftp']['ftp-verzeichnis'].'modules/'.wb_dir_escape($modul).'/temp/'.wb_dir_escape($uid).$dr2);
66
  @ftp_site($conn_id, 'CHMOD 0755 '.$konfiguration['core_directftp']['ftp-verzeichnis'].'modules/'.wb_dir_escape($modul).'/temp/'.wb_dir_escape($uid).$dr2);
2 daniel-mar 67
}
68
 
69
function my_chmod($dr)
70
{
71
  global $conn_id;
72
  global $konfiguration;
73
  global $uid;
74
  global $modul;
8 daniel-mar 75
  $dr2 = substr($dr, strlen('modules/'.wb_dir_escape($modul).'/temp/'.wb_dir_escape($uid)), strlen($dr)-strlen('modules/'.wb_dir_escape($modul).'/temp/'.wb_dir_escape($uid)));
2 daniel-mar 76
  if (@is_dir($dr))
8 daniel-mar 77
    @ftp_site($conn_id, 'CHMOD 0755 '.$konfiguration['core_directftp']['ftp-verzeichnis'].'modules/'.wb_dir_escape($modul).'/temp/'.wb_dir_escape($uid).$dr2);
2 daniel-mar 78
  else
8 daniel-mar 79
    @ftp_site($conn_id, 'CHMOD 0644 '.$konfiguration['core_directftp']['ftp-verzeichnis'].'modules/'.wb_dir_escape($modul).'/temp/'.wb_dir_escape($uid).$dr2);
2 daniel-mar 80
}
81
 
82
function pre_create_file($dr)
83
{
84
  global $conn_id;
85
  global $konfiguration;
86
  global $uid;
87
  global $modul;
8 daniel-mar 88
  $dr2 = substr($dr, strlen('modules/'.wb_dir_escape($modul).'/temp/'.wb_dir_escape($uid)), strlen($dr)-strlen('modules/'.wb_dir_escape($modul).'/temp/'.wb_dir_escape($uid)));
89
  @ftp_put($conn_id, $konfiguration['core_directftp']['ftp-verzeichnis'].'modules/'.wb_dir_escape($modul).'/temp/'.wb_dir_escape($uid).$dr2, 'modules/'.wb_dir_escape($modul).'/null-file.txt', FTP_ASCII);
90
  @ftp_site($conn_id, 'CHMOD 0777 '.$konfiguration['core_directftp']['ftp-verzeichnis'].'modules/'.wb_dir_escape($modul).'/temp/'.wb_dir_escape($uid).$dr2);
2 daniel-mar 91
}
92
 
93
function file_put_contents_precreate($file, $data)
94
{
95
        pre_create_file($file);
96
        if($tmp = fopen($file, "w")){
97
                fwrite($tmp, $data);
98
                fclose($tmp);
99
                return true;
100
        }
101
        echo "<b>file_put_contents_precreate:</b> Cannot create file $file<br>";
102
        return false;
103
}
104
 
3 daniel-mar 105
// Ende - Personal WebBase Zusatz
2 daniel-mar 106
 
107
class dUnzip2{
108
        Function getVersion(){
109
                return "2.6";
110
        }
111
        // Public
112
        var $fileName;
113
        var $compressedList; // You will problably use only this one!
114
        var $centralDirList; // Central dir list... It's a kind of 'extra attributes' for a set of files
115
        var $endOfCentral;   // End of central dir, contains ZIP Comments
116
        var $debug;
117
 
118
        // Private
119
        var $fh;
120
        var $zipSignature = "\x50\x4b\x03\x04"; // local file header signature
121
        var $dirSignature = "\x50\x4b\x01\x02"; // central dir header signature
122
        var $dirSignatureE= "\x50\x4b\x05\x06"; // end of central dir signature
123
 
124
        // Public
125
        Function dUnzip2($fileName){
126
                $this->fileName       = $fileName;
127
                $this->compressedList =
128
                $this->centralDirList =
129
                $this->endOfCentral   = Array();
130
        }
131
 
132
        Function getList($stopOnFile=false){
133
                if(sizeof($this->compressedList)){
134
                        $this->debugMsg(1, "Returning already loaded file list.");
135
                        return $this->compressedList;
136
                }
137
 
138
                // Open file, and set file handler
139
                $fh = fopen($this->fileName, "r");
140
                $this->fh = &$fh;
141
                if(!$fh){
142
                        $this->debugMsg(2, "Failed to load file.");
143
                        return false;
144
                }
145
 
146
                $this->debugMsg(1, "Loading list from 'End of Central Dir' index list...");
147
                if(!$this->_loadFileListByEOF($fh, $stopOnFile)){
148
                        $this->debugMsg(1, "Failed! Trying to load list looking for signatures...");
149
                        if(!$this->_loadFileListBySignatures($fh, $stopOnFile)){
150
                                $this->debugMsg(1, "Failed! Could not find any valid header.");
151
                                $this->debugMsg(2, "ZIP File is corrupted or empty");
152
                                return false;
153
                        }
154
                }
155
 
156
                if($this->debug){
157
                        #------- Debug compressedList
158
                        $kkk = 0;
159
                        echo "<table border='0' style='font: 11px Verdana; border: 1px solid #000'>";
160
                        foreach($this->compressedList as $fileName=>$item){
161
                                if(!$kkk && $kkk=1){
162
                                        echo "<tr style='background: #ADA'>";
163
                                        foreach($item as $fieldName=>$value)
164
                                                echo "<td>$fieldName</td>";
165
                                        echo '</tr>';
166
                                }
167
                                echo "<tr style='background: #CFC'>";
168
                                foreach($item as $fieldName=>$value){
169
                                        if($fieldName == 'lastmod_datetime')
170
                                                echo "<td title='$fieldName' nowrap='nowrap'>".date("d/m/Y H:i:s", $value)."</td>";
171
                                        else
172
                                                echo "<td title='$fieldName' nowrap='nowrap'>$value</td>";
173
                                }
174
                                echo "</tr>";
175
                        }
176
                        echo "</table>";
177
 
178
                        #------- Debug centralDirList
179
                        $kkk = 0;
180
                        if(sizeof($this->centralDirList)){
181
                                echo "<table border='0' style='font: 11px Verdana; border: 1px solid #000'>";
182
                                foreach($this->centralDirList as $fileName=>$item){
183
                                        if(!$kkk && $kkk=1){
184
                                                echo "<tr style='background: #AAD'>";
185
                                                foreach($item as $fieldName=>$value)
186
                                                        echo "<td>$fieldName</td>";
187
                                                echo '</tr>';
188
                                        }
189
                                        echo "<tr style='background: #CCF'>";
190
                                        foreach($item as $fieldName=>$value){
191
                                                if($fieldName == 'lastmod_datetime')
192
                                                        echo "<td title='$fieldName' nowrap='nowrap'>".date("d/m/Y H:i:s", $value)."</td>";
193
                                                else
194
                                                        echo "<td title='$fieldName' nowrap='nowrap'>$value</td>";
195
                                        }
196
                                        echo "</tr>";
197
                                }
198
                                echo "</table>";
199
                        }
200
 
201
                        #------- Debug endOfCentral
202
                        $kkk = 0;
203
                        if(sizeof($this->endOfCentral)){
204
                                echo "<table border='0' style='font: 11px Verdana' style='border: 1px solid #000'>";
205
                                echo "<tr style='background: #DAA'><td colspan='2'>dUnzip - End of file</td></tr>";
206
                                foreach($this->endOfCentral as $field=>$value){
207
                                        echo "<tr>";
208
                                        echo "<td style='background: #FCC'>$field</td>";
209
                                        echo "<td style='background: #FDD'>$value</td>";
210
                                        echo "</tr>";
211
                                }
212
                                echo "</table>";
213
                        }
214
                }
215
 
216
                return $this->compressedList;
217
        }
218
        Function getExtraInfo($compressedFileName){
219
                return
220
                        isset($this->centralDirList[$compressedFileName])?
221
                        $this->centralDirList[$compressedFileName]:
222
                        false;
223
        }
224
        Function getZipInfo($detail=false){
225
                return $detail?
226
                        $this->endOfCentral[$detail]:
227
                        $this->endOfCentral;
228
        }
229
 
230
        Function unzip($compressedFileName, $targetFileName=false){
231
                if(!sizeof($this->compressedList)){
232
                        $this->debugMsg(1, "Trying to unzip before loading file list... Loading it!");
233
                        $this->getList(false, $compressedFileName);
234
                }
235
 
236
                $fdetails = &$this->compressedList[$compressedFileName];
237
                if(!isset($this->compressedList[$compressedFileName])){
238
                        $this->debugMsg(2, "File '<b>$compressedFileName</b>' is not compressed in the zip.");
239
                        return false;
240
                }
241
                if(substr($compressedFileName, -1) == "/"){
242
                        $this->debugMsg(2, "Trying to unzip a folder name '<b>$compressedFileName</b>'.");
243
                        return false;
244
                }
245
                if(!$fdetails['uncompressed_size']){
246
                        $this->debugMsg(1, "File '<b>$compressedFileName</b>' is empty.");
3 daniel-mar 247
                        // Verändert für Personal WebBase
2 daniel-mar 248
                        if ($targetFileName)
249
                        {
250
                          $x = file_put_contents_precreate($targetFileName, "");
251
                          my_chmod($targetFileName);
252
                          return $x;
253
                        }
254
                        else
255
                        {
256
                          return "";
257
                        }
258
                }
259
 
260
                fseek($this->fh, $fdetails['contents-startOffset']);
261
                $ret = $this->uncompress(
262
                                fread($this->fh, $fdetails['compressed_size']),
263
                                $fdetails['compression_method'],
264
                                $fdetails['uncompressed_size'],
265
                                $targetFileName
266
                        );
267
                //if($applyChmod && $targetFileName)
268
                        my_chmod($targetFileName);
269
 
270
                return $ret;
271
        }
272
        Function unzipAll($targetDir=false, $baseDir="", $maintainStructure=true){
273
                if($targetDir === false)
274
                        $targetDir = dirname(__FILE__)."/";
275
 
276
                $lista = $this->getList();
277
                if(sizeof($lista)) foreach($lista as $fileName=>$trash){
278
                        $dirname  = dirname($fileName);
279
                        $outDN    = "$targetDir/$dirname";
280
 
281
                        if(substr($dirname, 0, strlen($baseDir)) != $baseDir)
282
                                continue;
283
 
284
                        if(!is_dir($outDN) && $maintainStructure){
285
                                $str = "";
286
                                $folders = explode("/", $dirname);
287
                                foreach($folders as $folder){
288
                                        $str = $str?"$str/$folder":$folder;
289
                                        if(!is_dir("$targetDir/$str")){
290
                                                $this->debugMsg(1, "Creating folder: $targetDir/$str");
291
                                                my_mkdir("$targetDir/$str");
292
                                                //if($applyChmod)
293
                                                        my_chmod("$targetDir/$str");
294
                                        }
295
                                }
296
                        }
297
                        if(substr($fileName, -1, 1) == "/")
298
                                continue;
299
 
300
                        $maintainStructure?
301
                                $this->unzip($fileName, "$targetDir/$fileName"):
302
                                $this->unzip($fileName, "$targetDir/".basename($fileName));
303
                }
304
        }
305
 
306
        Function close(){     // Free the file resource
307
                if($this->fh)
308
                        fclose($this->fh);
309
        }
310
        Function __destroy(){
311
                $this->close();
312
        }
313
 
314
        // Private (you should NOT call these methods):
315
        Function uncompress($content, $mode, $uncompressedSize, $targetFileName=false){
316
                switch($mode){
317
                        case 0:
318
                                // Not compressed
319
                                return $targetFileName?
320
                                        file_put_contents_precreate($targetFileName, $content):
321
                                        $content;
322
                        case 1:
323
                                $this->debugMsg(2, "Shrunk mode is not supported... yet?");
324
                                return false;
325
                        case 2:
326
                        case 3:
327
                        case 4:
328
                        case 5:
329
                                $this->debugMsg(2, "Compression factor ".($mode-1)." is not supported... yet?");
330
                                return false;
331
                        case 6:
332
                                $this->debugMsg(2, "Implode is not supported... yet?");
333
                                return false;
334
                        case 7:
335
                                $this->debugMsg(2, "Tokenizing compression algorithm is not supported... yet?");
336
                                return false;
337
                        case 8:
338
                                // Deflate
339
                                return $targetFileName?
340
                                        file_put_contents_precreate($targetFileName, gzinflate($content, $uncompressedSize)):
341
                                        gzinflate($content, $uncompressedSize);
342
                        case 9:
343
                                $this->debugMsg(2, "Enhanced Deflating is not supported... yet?");
344
                                return false;
345
                        case 10:
346
                                $this->debugMsg(2, "PKWARE Date Compression Library Impoloding is not supported... yet?");
347
                                return false;
348
           case 12:
349
               // Bzip2
350
               return $targetFileName?
351
                   file_put_contents_precreate($targetFileName, bzdecompress($content)):
352
                   bzdecompress($content);
353
                        case 18:
354
                                $this->debugMsg(2, "IBM TERSE is not supported... yet?");
355
                                return false;
356
                        default:
357
                                $this->debugMsg(2, "Unknown uncompress method: $mode");
358
                                return false;
359
                }
360
        }
361
        Function debugMsg($level, $string){
362
                if($this->debug)
363
                        if($level == 1)
364
                                echo "<b style='color: #777'>dUnzip2:</b> $string<br>";
365
                        if($level == 2)
366
                                echo "<b style='color: #F00'>dUnzip2:</b> $string<br>";
367
        }
368
 
369
        Function _loadFileListByEOF(&$fh, $stopOnFile=false){
370
                // Check if there's a valid Central Dir signature.
371
                // Let's consider a file comment smaller than 1024 characters...
372
                // Actually, it length can be 65536.. But we're not going to support it.
373
 
374
                for($x = 0; $x < 1024; $x++){
375
                        fseek($fh, -22-$x, SEEK_END);
376
 
377
                        $signature = fread($fh, 4);
378
                        if($signature == $this->dirSignatureE){
379
                                // If found EOF Central Dir
380
                                $eodir['disk_number_this']   = unpack("v", fread($fh, 2)); // number of this disk
381
                                $eodir['disk_number']        = unpack("v", fread($fh, 2)); // number of the disk with the start of the central directory
382
                                $eodir['total_entries_this'] = unpack("v", fread($fh, 2)); // total number of entries in the central dir on this disk
383
                                $eodir['total_entries']      = unpack("v", fread($fh, 2)); // total number of entries in
384
                                $eodir['size_of_cd']         = unpack("V", fread($fh, 4)); // size of the central directory
385
                                $eodir['offset_start_cd']    = unpack("V", fread($fh, 4)); // offset of start of central directory with respect to the starting disk number
386
                                $zipFileCommentLenght        = unpack("v", fread($fh, 2)); // zipfile comment length
387
                                $eodir['zipfile_comment']    = $zipFileCommentLenght[1]?fread($fh, $zipFileCommentLenght[1]):''; // zipfile comment
388
                                $this->endOfCentral = Array(
389
                                        'disk_number_this'=>$eodir['disk_number_this'][1],
390
                                        'disk_number'=>$eodir['disk_number'][1],
391
                                        'total_entries_this'=>$eodir['total_entries_this'][1],
392
                                        'total_entries'=>$eodir['total_entries'][1],
393
                                        'size_of_cd'=>$eodir['size_of_cd'][1],
394
                                        'offset_start_cd'=>$eodir['offset_start_cd'][1],
395
                                        'zipfile_comment'=>$eodir['zipfile_comment'],
396
                                );
397
 
398
                                // Then, load file list
399
                                fseek($fh, $this->endOfCentral['offset_start_cd']);
400
                                $signature = fread($fh, 4);
401
 
402
                                while($signature == $this->dirSignature){
403
                                        $dir['version_madeby']      = unpack("v", fread($fh, 2)); // version made by
404
                                        $dir['version_needed']      = unpack("v", fread($fh, 2)); // version needed to extract
405
                                        $dir['general_bit_flag']    = unpack("v", fread($fh, 2)); // general purpose bit flag
406
                                        $dir['compression_method']  = unpack("v", fread($fh, 2)); // compression method
407
                                        $dir['lastmod_time']        = unpack("v", fread($fh, 2)); // last mod file time
408
                                        $dir['lastmod_date']        = unpack("v", fread($fh, 2)); // last mod file date
409
                                        $dir['crc-32']              = fread($fh, 4);              // crc-32
410
                                        $dir['compressed_size']     = unpack("V", fread($fh, 4)); // compressed size
411
                                        $dir['uncompressed_size']   = unpack("V", fread($fh, 4)); // uncompressed size
412
                                        $fileNameLength             = unpack("v", fread($fh, 2)); // filename length
413
                                        $extraFieldLength           = unpack("v", fread($fh, 2)); // extra field length
414
                                        $fileCommentLength          = unpack("v", fread($fh, 2)); // file comment length
415
                                        $dir['disk_number_start']   = unpack("v", fread($fh, 2)); // disk number start
416
                                        $dir['internal_attributes'] = unpack("v", fread($fh, 2)); // internal file attributes-byte1
417
                                        $dir['external_attributes1']= unpack("v", fread($fh, 2)); // external file attributes-byte2
418
                                        $dir['external_attributes2']= unpack("v", fread($fh, 2)); // external file attributes
419
                                        $dir['relative_offset']     = unpack("V", fread($fh, 4)); // relative offset of local header
420
                                        $dir['file_name']           = fread($fh, $fileNameLength[1]);                             // filename
421
                                        $dir['extra_field']         = $extraFieldLength[1] ?fread($fh, $extraFieldLength[1]) :''; // extra field
422
                                        $dir['file_comment']        = $fileCommentLength[1]?fread($fh, $fileCommentLength[1]):''; // file comment
423
 
424
                                        // Convert the date and time, from MS-DOS format to UNIX Timestamp
425
                                        $BINlastmod_date = str_pad(decbin($dir['lastmod_date'][1]), 16, '0', STR_PAD_LEFT);
426
                                        $BINlastmod_time = str_pad(decbin($dir['lastmod_time'][1]), 16, '0', STR_PAD_LEFT);
427
                                        $lastmod_dateY = bindec(substr($BINlastmod_date,  0, 7))+1980;
428
                                        $lastmod_dateM = bindec(substr($BINlastmod_date,  7, 4));
429
                                        $lastmod_dateD = bindec(substr($BINlastmod_date, 11, 5));
430
                                        $lastmod_timeH = bindec(substr($BINlastmod_time,   0, 5));
431
                                        $lastmod_timeM = bindec(substr($BINlastmod_time,   5, 6));
432
                                        $lastmod_timeS = bindec(substr($BINlastmod_time,  11, 5));
433
 
434
                                        $this->centralDirList[$dir['file_name']] = Array(
435
                                                'version_madeby'=>$dir['version_madeby'][1],
436
                                                'version_needed'=>$dir['version_needed'][1],
437
                                                'general_bit_flag'=>str_pad(decbin($dir['general_bit_flag'][1]), 8, '0', STR_PAD_LEFT),
438
                                                'compression_method'=>$dir['compression_method'][1],
439
                                                'lastmod_datetime'  =>mktime($lastmod_timeH, $lastmod_timeM, $lastmod_timeS, $lastmod_dateM, $lastmod_dateD, $lastmod_dateY),
440
                                                'crc-32'            =>str_pad(dechex(ord($dir['crc-32'][3])), 2, '0', STR_PAD_LEFT).
441
                                                                                          str_pad(dechex(ord($dir['crc-32'][2])), 2, '0', STR_PAD_LEFT).
442
                                                                                          str_pad(dechex(ord($dir['crc-32'][1])), 2, '0', STR_PAD_LEFT).
443
                                                                                          str_pad(dechex(ord($dir['crc-32'][0])), 2, '0', STR_PAD_LEFT),
444
                                                'compressed_size'=>$dir['compressed_size'][1],
445
                                                'uncompressed_size'=>$dir['uncompressed_size'][1],
446
                                                'disk_number_start'=>$dir['disk_number_start'][1],
447
                                                'internal_attributes'=>$dir['internal_attributes'][1],
448
                                                'external_attributes1'=>$dir['external_attributes1'][1],
449
                                                'external_attributes2'=>$dir['external_attributes2'][1],
450
                                                'relative_offset'=>$dir['relative_offset'][1],
451
                                                'file_name'=>$dir['file_name'],
452
                                                'extra_field'=>$dir['extra_field'],
453
                                                'file_comment'=>$dir['file_comment'],
454
                                        );
455
                                        $signature = fread($fh, 4);
456
                                }
457
 
458
                                // If loaded centralDirs, then try to identify the offsetPosition of the compressed data.
459
                                if($this->centralDirList) foreach($this->centralDirList as $filename=>$details){
460
                                        $i = $this->_getFileHeaderInformation($fh, $details['relative_offset']);
461
                                        $this->compressedList[$filename]['file_name']          = $filename;
462
                                        $this->compressedList[$filename]['compression_method'] = $details['compression_method'];
463
                                        $this->compressedList[$filename]['version_needed']     = $details['version_needed'];
464
                                        $this->compressedList[$filename]['lastmod_datetime']   = $details['lastmod_datetime'];
465
                                        $this->compressedList[$filename]['crc-32']             = $details['crc-32'];
466
                                        $this->compressedList[$filename]['compressed_size']    = $details['compressed_size'];
467
                                        $this->compressedList[$filename]['uncompressed_size']  = $details['uncompressed_size'];
468
                                        $this->compressedList[$filename]['lastmod_datetime']   = $details['lastmod_datetime'];
469
                                        $this->compressedList[$filename]['extra_field']        = $i['extra_field'];
470
                                        $this->compressedList[$filename]['contents-startOffset']=$i['contents-startOffset'];
471
                                        if(strtolower($stopOnFile) == strtolower($filename))
472
                                                break;
473
                                }
474
                                return true;
475
                        }
476
                }
477
                return false;
478
        }
479
        Function _loadFileListBySignatures(&$fh, $stopOnFile=false){
480
                fseek($fh, 0);
481
 
482
                $return = false;
483
                for(;;){
484
                        $details = $this->_getFileHeaderInformation($fh);
485
                        if(!$details){
486
                                $this->debugMsg(1, "Invalid signature. Trying to verify if is old style Data Descriptor...");
487
                                fseek($fh, 12 - 4, SEEK_CUR); // 12: Data descriptor - 4: Signature (that will be read again)
488
                                $details = $this->_getFileHeaderInformation($fh);
489
                        }
490
                        if(!$details){
491
                                $this->debugMsg(1, "Still invalid signature. Probably reached the end of the file.");
492
                                break;
493
                        }
494
                        $filename = $details['file_name'];
495
                        $this->compressedList[$filename] = $details;
496
                        $return = true;
497
                        if(strtolower($stopOnFile) == strtolower($filename))
498
                                break;
499
                }
500
 
501
                return $return;
502
        }
503
        Function _getFileHeaderInformation(&$fh, $startOffset=false){
504
                if($startOffset !== false)
505
                        fseek($fh, $startOffset);
506
 
507
                $signature = fread($fh, 4);
508
                if($signature == $this->zipSignature){
509
                        # $this->debugMsg(1, "Zip Signature!");
510
 
511
                        // Get information about the zipped file
512
                        $file['version_needed']     = unpack("v", fread($fh, 2)); // version needed to extract
513
                        $file['general_bit_flag']   = unpack("v", fread($fh, 2)); // general purpose bit flag
514
                        $file['compression_method'] = unpack("v", fread($fh, 2)); // compression method
515
                        $file['lastmod_time']       = unpack("v", fread($fh, 2)); // last mod file time
516
                        $file['lastmod_date']       = unpack("v", fread($fh, 2)); // last mod file date
517
                        $file['crc-32']             = fread($fh, 4);              // crc-32
518
                        $file['compressed_size']    = unpack("V", fread($fh, 4)); // compressed size
519
                        $file['uncompressed_size']  = unpack("V", fread($fh, 4)); // uncompressed size
520
                        $fileNameLength             = unpack("v", fread($fh, 2)); // filename length
521
                        $extraFieldLength           = unpack("v", fread($fh, 2)); // extra field length
522
                        $file['file_name']          = fread($fh, $fileNameLength[1]); // filename
523
                        $file['extra_field']        = $extraFieldLength[1]?fread($fh, $extraFieldLength[1]):''; // extra field
524
                        $file['contents-startOffset']= ftell($fh);
525
 
526
                        // Bypass the whole compressed contents, and look for the next file
527
                        fseek($fh, $file['compressed_size'][1], SEEK_CUR);
528
 
529
                        // Convert the date and time, from MS-DOS format to UNIX Timestamp
530
                        $BINlastmod_date = str_pad(decbin($file['lastmod_date'][1]), 16, '0', STR_PAD_LEFT);
531
                        $BINlastmod_time = str_pad(decbin($file['lastmod_time'][1]), 16, '0', STR_PAD_LEFT);
532
                        $lastmod_dateY = bindec(substr($BINlastmod_date,  0, 7))+1980;
533
                        $lastmod_dateM = bindec(substr($BINlastmod_date,  7, 4));
534
                        $lastmod_dateD = bindec(substr($BINlastmod_date, 11, 5));
535
                        $lastmod_timeH = bindec(substr($BINlastmod_time,   0, 5));
536
                        $lastmod_timeM = bindec(substr($BINlastmod_time,   5, 6));
537
                        $lastmod_timeS = bindec(substr($BINlastmod_time,  11, 5));
538
 
539
                        // Mount file table
540
                        $i = Array(
541
                                'file_name'         =>$file['file_name'],
542
                                'compression_method'=>$file['compression_method'][1],
543
                                'version_needed'    =>$file['version_needed'][1],
544
                                'lastmod_datetime'  =>mktime($lastmod_timeH, $lastmod_timeM, $lastmod_timeS, $lastmod_dateM, $lastmod_dateD, $lastmod_dateY),
545
                                'crc-32'            =>str_pad(dechex(ord($file['crc-32'][3])), 2, '0', STR_PAD_LEFT).
546
                                                                          str_pad(dechex(ord($file['crc-32'][2])), 2, '0', STR_PAD_LEFT).
547
                                                                          str_pad(dechex(ord($file['crc-32'][1])), 2, '0', STR_PAD_LEFT).
548
                                                                          str_pad(dechex(ord($file['crc-32'][0])), 2, '0', STR_PAD_LEFT),
549
                                'compressed_size'   =>$file['compressed_size'][1],
550
                                'uncompressed_size' =>$file['uncompressed_size'][1],
551
                                'extra_field'       =>$file['extra_field'],
552
                                'general_bit_flag'  =>str_pad(decbin($file['general_bit_flag'][1]), 8, '0', STR_PAD_LEFT),
553
                                'contents-startOffset'=>$file['contents-startOffset']
554
                        );
555
                        return $i;
556
                }
557
                return false;
558
        }
559
}