Seditio Source
Root |
./othercms/dle15_0/upload/engine/classes/zipextract.class.php
<?php
/*
=====================================================
 DataLife Engine - by SoftNews Media Group
-----------------------------------------------------
 http://dle-news.ru/
-----------------------------------------------------
 Copyright (c) 2004-2021 SoftNews Media Group
=====================================================
 This code is protected by copyright
=====================================================
 File: zipextract.class.php
-----------------------------------------------------
 Use: ZIP Extract class
=====================================================
*/

if( !defined( 'DATALIFEENGINE' ) ) {
   
header( "HTTP/1.1 403 Forbidden" );
   
header ( 'Location: ../../' );
    die(
"Hacking attempt!" );
}

class
dle_zip_extract {
   
    private
$root = null;
   
    public
$zip;

    private
$ftp = null;
    private
$ssh = null;
    private
$sftp = null;
    private
$sftpDir = null;
   
    public
$folder_permission = 0755;
    public
$file_permission = 0644;
   
    public
$errors_list = array();
    public
$skip_index = array();
    public
$is_plugin = false;

    public
$zip_root = false;
    public
$zip_numfiles = 0;
    public
$zip_list_with_root = array();
   
    function
__construct( $zip_link = false ) {
        global
$lang;
       
       
$this->root = ROOT_DIR.'/';
       
        if(
$zip_link) {
           
$this->zip = new ZipArchive();
            if(
$this->zip->open( $zip_link, ZIPARCHIVE::CHECKCONS ) !== true) {
                throw new
RuntimeException($lang['upgr_f_error_16']);
            }
           
           
$this->zip_numfiles = $this->zip->numFiles;    
        }
       
    }
   
    public function
FtpConnect( $data ) {
        global
$lang;
       
        if (
$data['type'] == 'ssh2' ) {
           
            if( !
function_exists('ssh2_connect') ) {
                throw new
RuntimeException($lang['upgr_f_error_10']);
            }
           
           
$this->ssh = ssh2_connect( $data['server'], $data['port'] );    

            if (
$this->ssh === false ) {
                throw new
RuntimeException($lang['upgr_f_error_11'].' ' . $data['server'] . ', '.$lang['upgr_ftp_4'].' ' . $data['port']);
            }

            if ( !@
ssh2_auth_password( $this->ssh, $data['username'], $data['password'] ) ) {
                throw new
RuntimeException($lang['upgr_f_error_12']);
            }

           
$this->sftp = @ssh2_sftp( $this->ssh );

            if (
$this->sftp === false ) {
                throw new
Exception($lang['upgr_f_error_13']);
            }
           
            if (
$data['path'] and !@ssh2_sftp_stat( $this->sftp, $data['path'] ) ) {
                throw new
RuntimeException( $lang['upgr_f_error_14'].' '.$data['path'] );
            }
           
           
$this->sftpDir = ssh2_sftp_realpath( $this->sftp, $data['path'] ) . '/';
           
           
$stream = @fopen("ssh2.sftp://".intval($this->sftp).$this->sftpDir."index.php", 'r');
           
            if(!
$stream OR  @stripos(stream_get_contents($stream), 'DATALIFEENGINE') === false ) {
                throw new
RuntimeException($lang['upgr_f_error_15']);
            }

        } else {

            if (
$data['type'] == 'sslftp' ) {
               
$this->ftp = @ftp_ssl_connect( $data['server'], $data['port'], 5 );
            } else {
               
$this->ftp = @ftp_connect( $data['server'], $data['port'], 5 );
            }

            if (
$this->ftp === false ) {
                throw new
RuntimeException($lang['upgr_f_error_11'].' ' . $data['server'] . ', '.$lang['upgr_ftp_4'].' ' . $data['port']);
            }

            if ( !@
ftp_login( $this->ftp, $data['username'], $data['password'] ) ) {
               
               
$this->DisconnectFTP();
               
                throw new
RuntimeException($lang['upgr_f_error_12']);
            }

            @
ftp_pasv( $this->ftp, true );
           
            if (
$data['path'] AND !@ftp_chdir( $this->ftp, $data['path'] ) ) {
               
               
$this->DisconnectFTP();
               
                throw new
RuntimeException( $lang['upgr_f_error_14'].' '.$data['path'] );
            }
           
           
$temp = fopen('php://temp', 'r+');
           
            if (@
ftp_fget($this->ftp, $temp, 'index.php', FTP_BINARY, 0)) {
               
rewind($temp);
               
                if(
stripos(stream_get_contents($temp), 'DATALIFEENGINE') === false ) throw new RuntimeException($lang['upgr_f_error_15']);
           
            } else throw new
RuntimeException($lang['upgr_f_error_15']);
           
           
        }
    }
   
    public function
DisconnectFTP() {
       
        if (
$this->ftp) {
           
            if(
is_resource($this->ftp) ) {
                @
ftp_close($this->ftp);
            }
           
           
$this->ftp = null;
        }
    }
   
    public function
SetFilesRoot( $dir ) {
       
        if (
substr($dir, -1) != '/' )  $dir = $dir.'/';
       
       
$this->root = $dir;
       
       
    }
   
    public function
SetRootZipArchive( $dir ) {
       
        if( !
$dir ) return;
       
       
$file_list = array();
       
        for (
$i = 0; $i < $this->zip->numFiles; $i++ ) {
   
            if (
$this->zip->statIndex($i) ) {
               
               
$file = $this->zip->statIndex($i);
               
                if (
substr($file['name'], -1) == '/' ) continue;
               
                if(
strpos($file['name'], $dir) === 0 ) {
                   
$file_list[] = $file['index'];
                }
   
            }
   
        }
       
        if(
count($file_list) ) {
           
$this->zip_root = $dir;
           
$this->zip_numfiles = count($file_list);
           
$this->zip_list_with_root = $file_list;
        }
   
    }
   
    public function
ExtractZipArchive( $offset = 0, $limit = 0 ) {
       
$done = 0;
   
        if( !
$limit ) $limit = $this->zip_numfiles;
   
        for (
$i = 0; $i < $limit; $i++ ) {
           
$index = $offset + $i;
           
           
$extract_index = false;
           
            if (
$this->zip_root ) {
               
                if ( isset(
$this->zip_list_with_root[$index] )  ) {
                   
$extract_index = $this->zip_list_with_root[$index];
                }
               
            } else
$extract_index = $index;
   
            if (
$extract_index !== false AND $this->zip->statIndex($extract_index) ) {
               
$this->ExtractFile( $extract_index );
               
$done++;
            }
           
        }
       
        return
$done;
    }
   
    public function
FixHtaccess() {
       
       
$search = array (
           
'RewriteRule ^tags/([^/]*)(/?)+$ index.php?do=tags&tag=$1 [L]',
           
'RewriteRule ^tags/([^/]*)/page/([0-9]+)(/?)+$ index.php?do=tags&tag=$1&cstart=$2 [L]',
           
'RewriteRule ^xfsearch/(.*)/page/([0-9]+)(/?)+$ index.php?do=xfsearch&xf=$1&cstart=$2 [L]',
           
'RewriteRule ^xfsearch/(.*)/?$ index.php?do=xfsearch&xf=$1 [L]'
       
);
       
       
$replace = array (
           
'RewriteRule ^tags/([^/]*)(/?)+$ index.php?do=tags&tag=$1 [B,L]',
           
'RewriteRule ^tags/([^/]*)/page/([0-9]+)(/?)+$ index.php?do=tags&tag=$1&cstart=$2 [B,L]',
           
'RewriteRule ^xfsearch/(.*)/page/([0-9]+)(/?)+$ index.php?do=xfsearch&xf=$1&cstart=$2 [B,L]',
           
'RewriteRule ^xfsearch/(.*)/?$ index.php?do=xfsearch&xf=$1 [B,L]'
       
);
       
       
$data = $this->ReadFile( ".htaccess" );
       
        if(
$data) {
           
$data = str_replace($search, $replace, $data);
           
$this->WriteFile( ".htaccess", $data );
        }
       
    }
   
    private function
ExtractFile( $index ) {
        global
$config, $lang;
       
       
$file = $this->zip->statIndex($index);

        if (
substr($file['name'], -1) == '/' ) return;
       
        if(
count($this->skip_index) AND in_array($index, $this->skip_index) ) return;
       
        if(
$this->is_plugin ) {
           
           
$file['name'] = str_ireplace( '{THEME}', $config['skin'], $file['name'] );
           
        }
       
        if (
$this->zip_root ) {
           
           
$file['name'] = str_ireplace( $this->zip_root, '', $file['name'] );
           
        }

       
$dir = dirname( $file['name'] );
       
       
$directories = array( $dir );
       
        while (
$dir != '.' ) {
           
$dir = dirname( $dir );
            if (
$dir != '.' ) {
               
$directories[] = $dir;
            }
        }
       
       
$directories = array_reverse( $directories );

        foreach (
$directories as $dir ) {
           
            if ( !
is_dir( $this->root.$dir ) ) {
               
                if (
$this->sftp ) {
                   
                    if( !@
ssh2_sftp_mkdir( $this->sftp, $this->sftpDir . $dir ) ) {
                       
$this->errors_list[] = array( 'file' => $dir, 'error' => $lang['upgr_f_error_17'] );
                    }
                   
                }
               
                if (
$this->ftp ) {
                   
                    if( !@
ftp_mkdir( $this->ftp, $dir ) ) {
                       
$this->errors_list[] = array( 'file' => $dir, 'error' => $lang['upgr_f_error_17'] );
                    }
                   
                } else {
                   
                    if( !@
mkdir( $this->root.$dir, $this->folder_permission ) ) {
                       
$this->errors_list[] = array( 'file' => $dir, 'error' => $lang['upgr_f_error_17'] );
                    } else {
                        @
chmod( $this->root.$dir, $this->folder_permission );
                    }
               
                   
                }
            }
           
        }

       
$contents = $this->zip->getFromIndex($index);

        if(
$file['name'] == "admin.php" AND $file['name'] != $config['admin_path'] AND $config['admin_path'] ) {
           
$file['name'] = $config['admin_path'];
        }
       
        if (
$this->sftp OR $this->ftp ) {
           
           
$tmpFile = tempnam( ENGINE_DIR . "/cache/system/", 'DLE' );
           
file_put_contents( $tmpFile, $contents );
           
            if (
$this->sftp ) {
               
                if( !@
ssh2_scp_send( $this->ssh, $tmpFile, $this->sftpDir . $file['name'] ) ) {
                   
$this->errors_list[] = array( 'file' => $file['name'], 'error' => $lang['upgr_f_error_18'] );
                }
               
            } else {
               
                if( !@
ftp_put( $this->ftp, $file['name'], $tmpFile, FTP_BINARY ) ) {
                   
                    @
ftp_chmod($this->ftp, $this->file_permission, $file['name']);
                   
                    if( !@
ftp_put( $this->ftp, $file['name'], $tmpFile, FTP_BINARY ) ) {
                       
$this->errors_list[] = array( 'file' => $file['name'], 'error' => $lang['upgr_f_error_18'] );
                    }
                }
               
            }
           
            @
unlink( $tmpFile );
           
        } else {

            if( @
file_exists( $this->root.$file['name'] ) AND !@is_writable( $this->root.$file['name'] ) ) {
                @
chmod( $this->root.$file['name'], $this->file_permission );
            }
           
           
$fh = @fopen( $this->root.$file['name'], 'w+b' );
           
            if (
$fh !== false ) {

                if ( @
fwrite( $fh, $contents ) !== false ) {
                   
                    @
chmod( $this->root.$file['name'], $this->file_permission );
                   
                } else
$this->errors_list[] = array( 'file' => $file['name'], 'error' => $lang['upgr_f_error_18'] );
               
                @
fclose($fh);
               
            } else
$this->errors_list[] = array( 'file' => $file['name'], 'error' => $lang['upgr_f_error_18'] );
           
        }
       
    }

    private function
ReadFile( $file ) {
       
       
$data = '';
       
        if (
$this->sftp ) {
           
           
$temp = @fopen("ssh2.sftp://".intval($this->sftp).$this->sftpDir.$file, 'r');
           
            if(
$temp) {
               
$data = stream_get_contents($temp);
                @
fclose($temp);
            }
           
        } elseif(
$this->ftp ) {
           
           
$temp = fopen('php://temp', 'r+');
           
            if (@
ftp_fget($this->ftp, $temp, $file, FTP_BINARY, 0)) {
               
rewind($temp);
               
$data = stream_get_contents($temp);
                @
fclose($temp);
            }
           
        } else {
           
           
$data = file_get_contents($this->root.$file);
           
        }
       
        return
$data;

    }
   
    private function
WriteFile( $file, $contents ) {
        global
$lang;

        if (
$this->sftp OR $this->ftp ) {
           
           
$tmpFile = tempnam( ENGINE_DIR . "/cache/system/", 'DLE' );
           
file_put_contents( $tmpFile, $contents );
           
            if (
$this->sftp ) {
               
                if( !@
ssh2_scp_send( $this->ssh, $tmpFile, $this->sftpDir . $file ) ) {
                   
$this->errors_list[] = array( 'file' => $file, 'error' => $lang['upgr_f_error_18'] );
                }
               
            } else {
               
                if( !@
ftp_put( $this->ftp, $file, $tmpFile, FTP_BINARY ) ) {
                   
                    @
ftp_chmod($this->ftp, $this->file_permission, $file);
                   
                    if( !@
ftp_put( $this->ftp, $file, $tmpFile, FTP_BINARY ) ) {
                       
$this->errors_list[] = array( 'file' => $file, 'error' => $lang['upgr_f_error_18'] );
                    }
                }
               
            }
           
            @
unlink( $tmpFile );
           
        } else {
           
            if( @
file_exists( $this->root.$file ) AND !@is_writable( $this->root.$file ) ) {
                @
chmod( $this->root.$file, $this->file_permission );
            }
           
           
$fh = @fopen( $this->root.$file, 'w+b' );
           
            if (
$fh !== false ) {

                if ( @
fwrite( $fh, $contents ) !== false ) {
                   
                    @
chmod( $this->root.$file, $this->file_permission );
                   
                } else
$this->errors_list[] = array( 'file' => $file, 'error' => $lang['upgr_f_error_18'] );
               
                @
fclose($fh);
               
            } else
$this->errors_list[] = array( 'file' => $file, 'error' => $lang['upgr_f_error_18'] );
           
        }
       
    }
   
}

?>