One Fuc* up PHP problem ! HELP !

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • qw12er
    Confirmed User
    • Apr 2004
    • 799

    #1

    One Fuc* up PHP problem ! HELP !

    I'm using this class and this function to zip and unzip some files. Unfortunately the file are all scrambled up when unzipped.

    the weirdest part is that if I intercept the zip file and open it with Winzip the files are fine and if I create a zipfile with winzip I can unzip it corretly with my unzip function.

    PLEASE help me I'm going crazy over this !


    class zipfile
    {

    var $datasec = array(); // array to store compressed data
    var $ctrl_dir = array(); // central directory
    var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; //end of Central directory record
    var $old_offset = 0;

    function add_dir($name)

    // adds "directory" to archive - do this before putting any files in directory!
    // $name - name of directory... like this: "path/"
    // ...then you can add files using add_file with names like "path/file.txt"
    {
    $name = str_replace("\\", "/", $name);

    $fr = "\x50\x4b\x03\x04";
    $fr .= "\x0a\x00"; // ver needed to extract
    $fr .= "\x00\x00"; // gen purpose bit flag
    $fr .= "\x00\x00"; // compression method
    $fr .= "\x00\x00\x00\x00"; // last mod time and date

    $fr .= pack("V",0); // crc32
    $fr .= pack("V",0); //compressed filesize
    $fr .= pack("V",0); //uncompressed filesize
    $fr .= pack("v", strlen($name) ); //length of pathname
    $fr .= pack("v", 0 ); //extra field length
    $fr .= $name;
    // end of "local file header" segment

    // no "file data" segment for path

    // "data descriptor" segment (optional but necessary if archive is not served as file)
    $fr .= pack("V",$crc); //crc32
    $fr .= pack("V",$c_len); //compressed filesize
    $fr .= pack("V",$unc_len); //uncompressed filesize

    // add this entry to array
    $this -> datasec[] = $fr;

    $new_offset = strlen(implode("", $this->datasec));

    // ext. file attributes mirrors MS-DOS directory attr byte, detailed
    // at http://support.microsoft.com/support.../Q125/0/19.asp

    // now add to central record
    $cdrec = "\x50\x4b\x01\x02";
    $cdrec .="\x00\x00"; // version made by
    $cdrec .="\x0a\x00"; // version needed to extract
    $cdrec .="\x00\x00"; // gen purpose bit flag
    $cdrec .="\x00\x00"; // compression method
    $cdrec .="\x00\x00\x00\x00"; // last mod time & date
    $cdrec .= pack("V",0); // crc32
    $cdrec .= pack("V",0); //compressed filesize
    $cdrec .= pack("V",0); //uncompressed filesize
    $cdrec .= pack("v", strlen($name) ); //length of filename
    $cdrec .= pack("v", 0 ); //extra field length
    $cdrec .= pack("v", 0 ); //file comment length
    $cdrec .= pack("v", 0 ); //disk number start
    $cdrec .= pack("v", 0 ); //internal file attributes
    $ext = "\x00\x00\x10\x00";
    $ext = "\xff\xff\xff\xff";
    $cdrec .= pack("V", 16 ); //external file attributes - 'directory' bit set

    $cdrec .= pack("V", $this -> old_offset ); //relative offset of local header
    $this -> old_offset = $new_offset;

    $cdrec .= $name;
    // optional extra field, file comment goes here
    // save to array
    $this -> ctrl_dir[] = $cdrec;


    }


    function add_file($data, $name)

    // adds "file" to archive
    // $data - file contents
    // $name - name of file in archive. Add path if your want

    {
    $name = str_replace("\\", "/", $name);
    //$name = str_replace("\\", "\\\\", $name);

    $fr = "\x50\x4b\x03\x04";
    $fr .= "\x14\x00"; // ver needed to extract
    $fr .= "\x00\x00"; // gen purpose bit flag
    $fr .= "\x08\x00"; // compression method
    $fr .= "\x00\x00\x00\x00"; // last mod time and date

    $unc_len = strlen($data);
    $crc = crc32($data);
    $zdata = gzcompress($data);
    $zdata = substr( substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
    $c_len = strlen($zdata);
    $fr .= pack("V",$crc); // crc32
    $fr .= pack("V",$c_len); //compressed filesize
    $fr .= pack("V",$unc_len); //uncompressed filesize
    $fr .= pack("v", strlen($name) ); //length of filename
    $fr .= pack("v", 0 ); //extra field length
    $fr .= $name;
    // end of "local file header" segment

    // "file data" segment
    $fr .= $zdata;

    // "data descriptor" segment (optional but necessary if archive is not served as file)
    $fr .= pack("V",$crc); //crc32
    $fr .= pack("V",$c_len); //compressed filesize
    $fr .= pack("V",$unc_len); //uncompressed filesize

    // add this entry to array
    $this -> datasec[] = $fr;

    $new_offset = strlen(implode("", $this->datasec));

    // now add to central directory record
    $cdrec = "\x50\x4b\x01\x02";
    $cdrec .="\x00\x00"; // version made by
    $cdrec .="\x14\x00"; // version needed to extract
    $cdrec .="\x00\x00"; // gen purpose bit flag
    $cdrec .="\x08\x00"; // compression method
    $cdrec .="\x00\x00\x00\x00"; // last mod time & date
    $cdrec .= pack("V",$crc); // crc32
    $cdrec .= pack("V",$c_len); //compressed filesize
    $cdrec .= pack("V",$unc_len); //uncompressed filesize
    $cdrec .= pack("v", strlen($name) ); //length of filename
    $cdrec .= pack("v", 0 ); //extra field length
    $cdrec .= pack("v", 0 ); //file comment length
    $cdrec .= pack("v", 0 ); //disk number start
    $cdrec .= pack("v", 0 ); //internal file attributes
    $cdrec .= pack("V", 32 ); //external file attributes - 'archive' bit set

    $cdrec .= pack("V", $this -> old_offset ); //relative offset of local header
    // echo "old offset is ".$this->old_offset.", new offset is $new_offset<br>";
    $this -> old_offset = $new_offset;

    $cdrec .= $name;
    // optional extra field, file comment goes here
    // save to central directory
    $this -> ctrl_dir[] = $cdrec;
    }

    function file() { // dump out file
    $data = implode("", $this -> datasec);
    $ctrldir = implode("", $this -> ctrl_dir);

    return
    $data.
    $ctrldir.
    $this -> eof_ctrl_dir.
    pack("v", sizeof($this -> ctrl_dir)). // total # of entries "on this disk"
    pack("v", sizeof($this -> ctrl_dir)). // total # of entries overall
    pack("V", strlen($ctrldir)). // size of central dir
    pack("V", strlen($data)). // offset to start of central dir
    "\x00\x00"; // .zip file comment length
    }
    }
    I have nothing to advertise ... yet.
  • qw12er
    Confirmed User
    • Apr 2004
    • 799

    #2
    function unzip($FileName){
    $path = dirname($FileName).'/';
    $Time = filemtime($FileName);
    $Size = filesize($FileName);

    $oF = fopen($FileName, 'rb');
    $vZ = fread($oF, $Size);
    fclose($oF);

    $aE = explode("\x50\x4b\x05\x06", $vZ);
    $aP = unpack('x16/v1CL', $aE[1]);
    $Comment = substr($aE[1], 18, $aP['CL']);


    $Comment = strtr($Comment, array("\r\n" => "\n",
    "\r" => "\n"));
    $aE = explode("\x50\x4b\x01\x02", $vZ);
    $aE = explode("\x50\x4b\x03\x04", $aE[0]);
    array_shift($aE);

    foreach ($aE as $vZ) {
    $aI = array();
    $aI['E'] = 0;
    $aI['EM'] = '';

    $aP = unpack('v1VN/v1GPF/v1CM/v1FT/v1FD/V1CRC/V1CS/V1UCS/v1FNL', $vZ);
    $bE = ($aP['GPF'] && 0x0001) ? TRUE : FALSE;
    $nF = $aP['FNL'];

    if ($aP['GPF'] & 0x0008) {
    $aP1 = unpack('V1CRC/V1CS/V1UCS', substr($vZ, -12));

    $aP['CRC'] = $aP1['CRC'];
    $aP['CS'] = $aP1['CS'];
    $aP['UCS'] = $aP1['UCS'];

    $vZ = substr($vZ, 0, -12);
    }

    $aI['N'] = substr($vZ, 26, $nF);

    if (substr($aI['N'], -1) == '/')
    continue;

    $aI['P'] = dirname($aI['N']);
    $aI['P'] = $aI['P'] == '.' ? '' : $aI['P'];
    $aI['N'] = basename($aI['N']);

    $vZ = substr($vZ, 26 + $nF);

    if (strlen($vZ) != $aP['CS']) {
    $aI['E'] = 1;
    $aI['EM'] = 'Compressed size is not equal with the value in header information.';
    } else {
    if ($bE) {
    $aI['E'] = 5;
    $aI['EM'] = 'File is encryption is not supported from this class.';
    } else {
    switch($aP['CM']) {
    case 0:
    break;
    case 8:
    $vZ = gzinflate($vZ);
    break;
    case 12:
    if (! extension_loaded('bz2')) {
    if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
    @dl('php_bz2.dll');
    else
    @dl('bz2.so');

    }

    if (extension_loaded('bz2'))
    $vZ = bzdecompress($vZ);
    else {
    $aI['E'] = 7;
    $aI['EM'] = "PHP BZIP2 extension not available.";
    }
    break;

    default:
    $aI['E'] = 6;
    $aI['EM'] = "De-/Compression method {$aP['CM']} is not supported.";
    }

    if (! $aI['E']) {
    if ($vZ === FALSE) {
    $aI['E'] = 2;
    $aI['EM'] = 'Decompression of data failed.';
    } else {
    if (strlen($vZ) != $aP['UCS']) {
    $aI['E'] = 3;
    $aI['EM'] = 'Uncompressed size is not equal with the value in header information.';
    } else {
    if (crc32($vZ) != $aP['CRC']) {
    $aI['E'] = 4;
    $aI['EM'] = 'CRC32 checksum is not equal with the value in header information.';
    }
    }
    }
    }
    }
    }

    $aI['D'] = $vZ;

    // DOS to UNIX timestamp
    $aI['T'] = mktime(($aP['FT'] & 0xf800) >> 11,
    ($aP['FT'] & 0x07e0) >> 5,
    ($aP['FT'] & 0x001f) << 1,
    ($aP['FD'] & 0x01e0) >> 5,
    ($aP['FD'] & 0x001f),
    (($aP['FD'] & 0xfe00) >> 9) + 1980);

    if ($aI['P'] != '') {
    mkdir($path.$aI['P']);
    $f = fopen($path.$aI['P'].'/'.$aI['N'], 'w+');
    } else
    $f = fopen($path.$aI['N'], 'w+');
    fwrite($f, $aI['D']);
    fclose($f);
    }

    }
    I have nothing to advertise ... yet.

    Comment

    • quantum-x
      Confirmed User
      • Feb 2002
      • 6863

      #3
      That's the zend php zip snippet, circa 5 years ago, and totally fucking horrible.

      Try -

      $filename = 'foo.zip';
      $cmd = 'unzip '.$filename;
      $result = `$cmd`;
      PrettyInCash.com - BoozedGFs.com - TeenGFs.com - JizzGFs.com- MilfUploads.com -

      Comment

      • qw12er
        Confirmed User
        • Apr 2004
        • 799

        #4
        Cool it works !

        but I need the unzip function to be distributed on several server which I can't assume any configuration. Will you code works anyway (Or what does it requires).

        (not sur what the ` ` means in php. guess it's some kind of shell execution)

        Thanks A LOT !
        I have nothing to advertise ... yet.

        Comment

        • u-Bob
          there's no $$$ in porn
          • Jul 2005
          • 33063

          #5
          Originally posted by qw12er
          guess it's some kind of shell execution
          correct .

          Comment

          • k0nr4d
            Confirmed User
            • Aug 2006
            • 9231

            #6
            Originally posted by qw12er
            Cool it works !

            but I need the unzip function to be distributed on several server which I can't assume any configuration. Will you code works anyway (Or what does it requires).

            (not sur what the ` ` means in php. guess it's some kind of shell execution)

            Thanks A LOT !
            You're gonna be hard-pressed finding a linux box without the unzip command.
            Mechanical Bunny Media
            Mechbunny Tube Script | Mechbunny Webcam Aggregator Script | Custom Web Development

            Comment

            • qw12er
              Confirmed User
              • Apr 2004
              • 799

              #7
              I really need my code to be portable on what ever plateform there is. Can I assume the 95&#37; + will have the unzip program installed with php ?
              I have nothing to advertise ... yet.

              Comment

              • quantum-x
                Confirmed User
                • Feb 2002
                • 6863

                #8
                Originally posted by qw12er
                I really need my code to be portable on what ever plateform there is. Can I assume the 95% + will have the unzip program installed with php ?
                It's default on linux, and the ZIP GNU library is GPL for windows too.
                Distribute it with your product.

                That said, if you were contemplating using that 'code' above, I don't think unzip is gonna be your biggest problem.....
                PrettyInCash.com - BoozedGFs.com - TeenGFs.com - JizzGFs.com- MilfUploads.com -

                Comment

                Working...