Вход Регистрация
Файл: IPBMafia.ru_IPB_3.4.6_Final_Rus _Nulled/board/upload/ips_kernel/classFileManagement.php
Строк: 488
<?php

/**
 * <pre>
 * Invision Power Services
 * IP.Board v3.4.6
 * Wrapper for retrieving file contents.  Methods available for removing files and directories as well.
 * Last Updated: $Date: 2013-04-23 22:13:24 -0400 (Tue, 23 Apr 2013) $
 * </pre>
 *
 * @author         $Author: bfarber $
 * @copyright    (c) 2001 - 2009 Invision Power Services, Inc.
 * @license        http://www.invisionpower.com/company/standards.php#license
 * @package        IP.Board
 * @subpackage    Kernel
 * @link        http://www.invisionpower.com
 * @since        Tuesday 22nd February 2005 (16:55)
 * @version        $Revision: 12195 $
 */
 
if ( ! defined'IPS_CLASSES_PATH' ) )
{
    
/**
     * Define classes path
     */
    
define'IPS_CLASSES_PATH'dirname(__FILE__) );
}

class 
classFileManagement
{
    
/**
     * Use sockets flag
     *
     * @var        integer
     */
    
public $use_sockets    1;
    
    
/**
     * Error array
     *
     * @var        array
     */
    
public $errors        = array();
    
    
/**
     * Key prefix to identify communication strings
     *
     * @var        string
     */
    
public $key_prefix    '';

    
/**
     * HTTP Status Code
     *
     * @var        integer
     */    
    
public $http_status_code    0;
    
    
/**
     * HTTP Status Text
     *
     * @var        string
     */    
    
public $http_status_text    "";
    
    
/**
     * Raw HTTP header output
     * 
     * @var        string
     */
    
public $raw_headers            '';
    
    
/**#@+
     * Set HTTP authentication parameters
     *
     * @var     string
     */
    
public $auth_req        0;
    public 
$auth_user        '';
    public 
$auth_pass        '';
    public 
$auth_raw        '';
    public 
$userAgent        '';
    
/**#@-*/
    
    /**
     * Timeout setting
     *
     * @var        int
     */
    
public $timeout            15;

    
/**
     * Number of redirects we've followed so far with sockets
     *
     * @var        int
     */
    
protected $_redirectsFollowed    0;
    
    
/**
     * Retrieve file contents from either a local file or URL, returning those contents
     *
     * @param    string        URI / File path
     * @param    string        HTTP User
     * @param    string        HTTP Pass
     * @return    @e string
     */
    
public function getFileContents$file_location$http_user=''$http_pass='' )
    {
        
//-------------------------------
        // INIT
        //-------------------------------
        
        
$contents        "";
        
$file_location    str_replace'&amp;''&'$file_location );
        
        
//-----------------------------------------
        // Inline user/pass?
        //-----------------------------------------
        
        
if ( $http_user and $http_pass )
        {
            
$this->auth_req  1;
            
$this->auth_user $http_user;
            
$this->auth_pass $http_pass;
        }
        
        
//-------------------------------
        // Hello
        //-------------------------------
        
        
if ( ! $file_location )
        {
            return 
FALSE;
        }
        
        if ( ! 
stristr$file_location'http://' ) AND ! stristr$file_location'https://' ) )
        {
            
//-------------------------------
            // It's a path!
            //-------------------------------
            
            
if ( ! file_exists$file_location ) )
            {
                
$this->errors[] = "Файл '{$file_location}' не существует, Проверье правильность пути.";
                return;
            }
            
            
$contents $this->_getContentsWithFopen$file_location );
        }
        else
        {
            
//-------------------------------
            // Is URL, try curl and then fall back
            //-------------------------------
            
            
if( ( $contents $this->_getContentsWithCurl$file_location ) ) === false )
            {
                if ( 
$this->use_sockets )
                {
                    
$contents $this->_getContentsWithSocket$file_location );
                }
                else
                {
                    
$contents $this->_getContentsWithFopen$file_location );
                }
            }
        }
        
        return 
$contents;
    }
    
    
/**
     * Sends a POST request to specified URL and returns the result
     *
     * @param    string            URI to post to
     * @param    array |string      Array of post fields (key => value) OR raw post data
     * @param    string            HTTP User
     * @param    string            HTTP Pass
     * @return    @e string
     */
    
public function postFileContents$file_location=''$post_array=array(), $http_user=''$http_pass='' )
    {
        
//-----------------------------------------
        // Inline user/pass?
        //-----------------------------------------
        
        
if ( $http_user and $http_pass )
        {
            
$this->auth_req  1;
            
$this->auth_user $http_user;
            
$this->auth_pass $http_pass;
        }
        
        
//-------------------------------
        // INIT
        //-------------------------------
        
        
$contents        "";
        
$file_location    str_replace'&amp;''&'$file_location );
        
        if ( ! 
$file_location )
        {
            return 
false;
        }

        if( ( 
$contents $this->_getContentsWithCurl$file_location$post_array ) ) === false )
        {
            
$contents $this->_getContentsWithSocket$file_location$post_array );
        }

        return 
$contents;
    }
    
    
/**
     * Get file contents (with PHP's fopen)
     *
     * @param    string        File location
     * @return    @e string
     */
    
protected function _getContentsWithFopen$file_location )
    {
        
//-------------------------------
        // INIT
        //-------------------------------
        
        
$buffer "";
        
$data   '';
        
        @
clearstatcache();
            
        if ( 
$FILE fopen$file_location"r" ) )
        {
            @
stream_set_timeout$FILE$this->timeout );
            
$status = @stream_get_meta_data($FILE);
            
            while ( ! 
feof$FILE ) && ! $status['timed_out'] )
            {
               
$buffer .= fgets$FILE4096 );
               
               
$status stream_get_meta_data($FILE);
            }

            
fclose($FILE);
        }
        
        if ( 
$buffer )
        {
            
$this->http_status_code 200;
            
            
$tmp  preg_split("/rnrn/"$buffer2);
            
$data trim($tmp[1]);

            
$this->raw_headers    trim($tmp[0]);
        }
        
        return 
$buffer;
    }
    
    
/**
     * Get file contents (with sockets)
     *
     * @param    string        File location
     * @param    array         Data to post (automatically converts to POST request)
     * @return    @e string
     */
    
protected function _getContentsWithSocket$file_location$post_array=array() )
    {
        
//-------------------------------
        // INIT
        //-------------------------------
        
        
$data                null;
        
        
//-------------------------------
        // Parse URL
        //-------------------------------
        
        
$url_parts = @parse_url($file_location);
        
        if ( ! 
$url_parts['host'] )
        {
            
$this->errors[] = "Не найден хост в URL '{$file_location}'!";
            return 
FALSE;
        }
        
        
//-------------------------------
        // Finalize
        //-------------------------------
        
        
$host $url_parts['host'];
         
$port = ( isset($url_parts['port']) ) ? $url_parts['port'] : ( $url_parts['scheme'] == 'https' 443 80 );

         
//-------------------------------
         // Tidy up path
         //-------------------------------
         
         
if ( !empty( $url_parts["path"] ) )
        {
            
$path $url_parts["path"];
        }
        else
        {
            
$path "/";
        }
 
        if ( !empty( 
$url_parts["query"] ) )
        {
            
$path .= "?" $url_parts["query"];
        }
         
         
//-------------------------------
         // Open connection
         //-------------------------------
         
         
if ( ! $fp = @fsockopen$url_parts['scheme'] == 'https' "ssl://" $host $host$port$errno$errstr$this->timeout ) )
         {
            
$this->errors[] = "Не могу установить соединение с {$host}";
            return 
FALSE;
        
        }
        else
        {
            
$final_carriage    = ( $this->auth_req or $this->auth_raw ) ? "" "rn";
            
            
$userAgent = ( $this->userAgent ) ? "rnUser-Agent: " $this->userAgent '';
            
            
//-----------------------------------------
            // Are we posting?
            //-----------------------------------------
            
            
if( $post_array )
            {
                if ( 
is_array$post_array ) )
                {
                    
$post_back    = array();
                    foreach ( 
$post_array as $key => $val )
                    {
                        
$post_back[] = $this->key_prefix $key '=' urlencode($val);
                    }
                    
$post_back_str    implode'&'$post_back);
                }
                else
                {
                    
$post_back_str $post_array;
                }
                
                
$header    "POST {$path} HTTP/1.0rnHost:{$host}rnContent-Type: application/x-www-form-urlencodedrnConnection: Keep-Alive{$userAgent}rnContent-Length: " strlen($post_back_str) . "rn{$final_carriage}{$post_back_str}";
            }
            else
            {
                
$header    "GET {$path} HTTP/1.0rnHost:{$host}rnConnection: Keep-Alive{$userAgent}rn{$final_carriage}";
            }

            if ( ! 
fputs$fp$header ) )
            {
                
$this->errors[] = "Не удалось отправить запрос на {$host}!";
                return 
FALSE;
            }
            
            if ( 
$this->auth_req )
            {
                if ( 
$this->auth_user && $this->auth_pass )
                {
                    
$header "Authorization: Basic ".base64_encode("{$this->auth_user}:{$this->auth_pass}")."rnrn";
                    
                    if ( ! 
fputs$fp$header ) )
                    {
                        
$this->errors[] = "Неверные данные авторизации!";
                        return 
FALSE;
                    }
                }
            }
            elseif ( 
$this->auth_raw )
            {
                
$header $this->auth_raw."rnrn";
                    
                if ( ! 
fputs$fp$header ) )
                {
                    
$this->errors[] = "Authorization Failed!";
                    return 
FALSE;
                }
            }
        }

        @
stream_set_timeout$fp$this->timeout );
        
        
$status = @stream_get_meta_data($fp);
        
        while( ! 
feof($fp) && ! $status['timed_out'] )        
        {
            
$data    .= fgets$fp8192 );
            
$status    stream_get_meta_data($fp);
        }
        
        
fclose ($fp);
        
        
//-------------------------------
        // Strip headers
        //-------------------------------
        
        // HTTP/1.1 ### ABCD
        
$this->http_status_code substr$data9);
        
$this->http_status_text substr$data13, ( strpos$data"rn" ) - 13 ) );

        
//-----------------------------------------
        // Redirect?  Try to fetch the 'location' value then.
        //-----------------------------------------

        
if( ( $this->http_status_code == 301 OR $this->http_status_code == 302 ) AND preg_match"/Location:s*(.+?)(r|n)/i"$data$matches ) )
        {
            if( 
$this->_redirectsFollowed )
            {
                
$this->_redirectsFollowed++;

                return 
$this->_getContentsWithSocket$matches[1], $post_array );
            }
        }

        
//-----------------------------------------
        // Try to deal with chunked..
        //-----------------------------------------
        
        
$_chunked    false;
        
        if( 
preg_match'/Transfer-Encoding:s*chunked/i'$data ) )
        {
            
$_chunked    true;
        }

        
$tmp    preg_split("/rnrn/"$data2);
        
$data    trim($tmp[1]);
        
        
$this->raw_headers    trim($tmp[0]);
        
        
//-----------------------------------------
        // Easy way out :P
        //-----------------------------------------
        
        
if( $_chunked )
        {
            
$lines    explode"n"$data );
            
array_pop($lines);
            
array_shift($lines);
            
$data    implode"n"$lines );
        }

         return 
$data;
    }
    
    
/**
     * Get file contents (with cURL)
     *
     * @param    string        File location
     * @param    array         Data to post (automatically converts to POST request)
     * @return    @e string
     */
    
protected function _getContentsWithCurl$file_location$post_array=array() )
    {    
        if ( 
function_exists'curl_init' ) AND function_exists("curl_exec") )
        {        
            
//-----------------------------------------
            // Are we posting?
            //-----------------------------------------

            
$ch curl_init$file_location );
            
            
curl_setopt$chCURLOPT_HEADER            );
            
curl_setopt$chCURLOPT_TIMEOUT            $this->timeout );
            
curl_setopt$chCURLOPT_RETURNTRANSFER    ); 
            
curl_setopt$chCURLOPT_FAILONERROR        ); 
            
curl_setopt$chCURLOPT_MAXREDIRS            10 );
            
curl_setopt$chCURLOPT_SSL_VERIFYPEER    false );
            
curl_setopt$chCURLOPT_SSL_VERIFYHOST    );
            
            if ( 
$this->userAgent )
            {
                
curl_setopt$chCURLOPT_USERAGENT$this->userAgent );
            }
            else
            {
                
/* Some sites, like Facebook, specifically sniff the user agent and complain if it's not as expected */
                
curl_setopt$chCURLOPT_USERAGENT'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13' );
            }
            
            
/**
             * Cannot set this when safe_mode or open_basedir is enabled
             * @link http://forums.invisionpower.com/index.php?autocom=tracker&showissue=11334
             */
            
if ( ! ini_get('open_basedir') AND ! ini_get('safe_mode') )
            {
                
curl_setopt$chCURLOPT_FOLLOWLOCATION); 
            }
            
            if( 
$this->auth_req )
            {
                
curl_setopt$chCURLOPT_USERPWD    "{$this->auth_user}:{$this->auth_pass});
            }
            elseif ( 
$this->auth_raw )
            {
                
curl_setopt$chCURLOPT_HTTPHEADER, array( $this->auth_raw ) );
            }
            
            
//-----------------------------------------
            // Are we posting?
            //-----------------------------------------
            
            
if( is_array($post_array) AND count($post_array) )
            {
                
$post_back    = array();
                
                foreach ( 
$post_array as $key => $val )
                {
                    
$post_back[] = $this->key_prefix $key '=' urlencode($val);
                }
                
                
$post_back_str    implode'&'$post_back);
                
                
curl_setopt$chCURLOPT_POST            true );
                
curl_setopt$chCURLOPT_POSTFIELDS    $post_back_str );
            }
            elseif ( 
$post_array )
            {
                
curl_setopt$chCURLOPT_POST            true );
                
curl_setopt$chCURLOPT_POSTFIELDS    $post_array );
            }
            else
            {
                
curl_setopt$chCURLOPT_POST            false );
            }
            
            
$data curl_exec($ch);
            
            
//-----------------------------------------
            // Handle some errors we can handle
            //-----------------------------------------
            
            
if ( curl_errno($ch) == 60 ||  curl_errno($ch) == 77 )
            {
                
// CURL_SSL_CACERT
                
if ( defined('CA_BUNDLE_PATH') )
                {
                    
curl_setopt$chCURLOPT_CAINFOCA_BUNDLE_PATH );
                }
                else
                {
                    
curl_setopt$chCURLOPT_SSL_VERIFYPEERfalse );
                }
                
                
$data curl_exec($ch);
            }
            else if ( 
curl_errno($ch) == )
            {
                
// Name lookup failed / DNS issues
                
$url_parts    = @parse_url$file_location );
                
$ip            = @gethostbyname$url_parts['host'] );
            
                if ( 
$ip and preg_match'#^d{1,3}.#'$ip ) )
                {
                    
// Turn of verify SSL as the IP will not match domain of cert
                    
curl_setopt$chCURLOPT_SSL_VERIFYPEERfalse );
                    
curl_setopt$chCURLOPT_URL$url_parts['scheme'] . '://' $ip '/' $url_parts['path'] );
                    
$data curl_exec($ch);
                }
            }
        
            
curl_close($ch);
            
            if ( 
stristr$data'HTTP/1.0 100 Continue' ) or stristr$data'HTTP/1.1 100 Continue' ) )
            {
                
$data preg_replace'#^HTTP/1.d 100 Continuernrn(HTTP)/#s''1'$data );
            }
            if ( 
stristr$data'HTTP/1.0 200 Connection established' ) or stristr$data'HTTP/1.1 200 Connection established' ) )
            {
                
$data preg_replace'#^HTTP/1.d 200 Connection establishedrnrn(HTTP)/#s''1'$data );
            }
            
            if ( 
$data )
            {
                
$tmp  preg_split("/rnrn/"$data2);
                
$data trim($tmp[1]);

                
$this->raw_headers    trim($tmp[0]);
            }
            
            
$this->http_status_code substr$this->raw_headers9);
            
$this->http_status_text substr$this->raw_headers13, ( strpos$this->raw_headers"rn" ) - 13 ) );

            if ( 
$data AND !$this->http_status_code )
            {
                
$this->http_status_code 200;
            }
            
            return 
$data;
        }
        else
        {
            return 
false;
        }
    }
    
    
/**
     * Tail a file
     *
     * @param    string        Full path to file
     * @param    int            No. lines to tail
     * @return    @e string
     */
    
public function tailFile$file$lines=100 )
    {
        
/* INIT */
        
$content    '';
        
$t            = array();
        
        if ( 
is_file$file ) )
        {
            
$handle = @fopen$file'r' );
            
            if ( 
$handle )
            {
                
$l   $lines;
                
$pos = -2;
                
$beg false;
               
                while ( 
$l )
                {
                    
$_t " ";
                    
                    while( 
$_t != "n" )
                    {
                        if ( @
fseek$handle$posSEEK_END ) == -)
                        {
                            
$beg true
                            break; 
                        }
                        
                        
$_t = @fgetc$handle );
                        
$pos--;
                    }
                    
                    
$l--;
                    
                    if ( 
$beg )
                    {
                        
rewind$handle );
                    }
                    
                    
$t$lines $l ] = @fgets$handle );
                    
                    if ( 
$beg )
                    {
                        break;
                    }
                }
                
                @
fclose ($handle);
                
                
$content trimimplode""array_reverse$t ) ) );
            }
        }
        
        return 
$content;
    }
    
    
/**
     * Copies contents of one directory to another, creating if necessary.  Returns true on success or false on failure.
     *
     * @param    string        File location [from]
     * @param    string        File location [destination]
     * @param    string        [Optional] CHMOD mode to set (WARNING: CHMOD modes should be specified in octal notation, e.g., 0777 and not 777)
     * @return    @e boolean
     */
    
public function copyDirectory($from_path$to_path$mode )
    {
        
$this->errors    = array();
        
$mode            $mode $mode IPS_FOLDER_PERMISSION;
        
        
//-----------------------------------------
        // Strip off trailing slashes...
        //-----------------------------------------
        
        
$from_path    rtrim$from_path'/' );
        
$to_path    rtrim$to_path'/' );
    
        if ( ! 
is_dir$from_path ) )
        {
            
$this->errors[] = "Невозможно найти директорию '{$from_path}'";
            return 
false;
        }
    
        if ( ! 
is_dir$to_path ) )
        {
            if ( ! @
mkdir$to_path$mode ) )
            {
                
$this->errors[] = "Невозможно создать директорию '{$to_path}', проверьте права доступа и попробуйте снова";
                return 
FALSE;
            }
            else
            {
                @
chmod$to_path$mode );
            }
        }
        
        if ( 
is_dir$from_path ) )
        {
            
$handle opendir($from_path);
            
            while ( (
$file readdir($handle)) !== false )
            {
                if ( (
$file != ".") && ($file != "..") )
                {
                    if ( 
is_dir$from_path."/".$file ) )
                    {
                        
$this->copyDirectory$from_path."/".$file$to_path."/".$file );
                    }
                    
                    if ( 
is_file$from_path."/".$file ) )
                    {
                        
copy$from_path."/".$file$to_path."/".$file );
                        @
chmod$to_path."/".$fileIPS_FILE_PERMISSION );
                    } 
                }
            }

            
closedir($handle); 
        }
        
        if ( ! 
count$this->errors ) )
        {
            return 
true;
        }
    }
    
    
/**
     * Removes a directory.  Returns true on success or false on failure.
     *
     * @param    string        File location [from]
     * @return    @e boolean
     */
    
public function removeDirectory($file)
    {
        
$errors 0;
        
        
//-----------------------------------------
        // Remove trailing slashes..
        //-----------------------------------------
        
        
$file rtrim$file'/' );
        
        if ( 
file_exists($file) )
        {
            
//-----------------------------------------
            // Attempt CHMOD
            //-----------------------------------------
            
            
@chmod$fileIPS_FOLDER_PERMISSION );
            
            if ( 
is_dir$file ) )
            {
                
$handle opendir$file );
                
                while ( (
$filename readdir($handle)) !== false )
                {
                    if ( (
$filename != ".") && ($filename != "..") )
                    {
                        
$this->removeDirectory$file "/" $filename );
                    }
                }
                
                
closedir($handle);
                
                if ( ! @
rmdir($file) )
                {
                    
$errors++;
                }
            }
            else
            {
                if ( ! @
unlink($file) )
                {
                    
$errors++;
                }
            }
        }
        
        if( 
$errors == )
        {
            return 
true;
        }
        else
        {
            return 
false;
        }
    }

    
/**
     * Empties a directory.  Returns true on success or false on failure.
     *
     * @param    string        File location [from]
     * @param    int            In a loop (not root folder)
     * @return    @e boolean
     */
    
public function emptyDirectory($file$inLoop=0)
    {
        
$errors 0;
        
        
//-----------------------------------------
        // Remove trailing slashes..
        //-----------------------------------------
        
        
$file rtrim$file'/' );
        
        if ( 
file_exists($file) )
        {
            
//-----------------------------------------
            // Attempt CHMOD
            //-----------------------------------------
            
            
@chmod$fileIPS_FOLDER_PERMISSION );
            
            if ( 
is_dir$file ) )
            {
                
$handle opendir$file );
                
                while ( (
$filename readdir($handle)) !== false )
                {
                    if ( (
$filename != ".") && ($filename != "..") )
                    {
                        
$this->emptyDirectory$file."/".$filename);
                    }
                }
                
                
closedir($handle);
                
                if ( 
$inLoop )
                {
                    if ( ! @
rmdir($file) )
                    {
                        
$errors++;
                    }
                }
            }
            else
            {
                if ( ! @
unlink($file) )
                {
                    
$errors++;
                }
            }
        }
        
        if( 
$errors == )
        {
            return 
true;
        }
        else
        {
            return 
false;
        }
    }

    
/**
     * Receive data from the "send" function, returning an array of field data
     *
     * @param    array    Array of fields to return
     * @return    @e array
     */
    
public function communicationReceiveData$return_fields=array() )
    {
        
//-----------------------------------------
        // INIT
        //-----------------------------------------
        
        
$return_array = array();
        
        
//-----------------------------------------
        // Get data...
        //-----------------------------------------
        
        
foreach( $_REQUEST as $k => $v )
        {
            if ( 
strstr$k$this->key_prefix ) )
            {
                
$k str_replace$this->key_prefix''$k );
                
                
$return_array$k ] = $v;
            }
        }
        
        return 
$this->_filterFields$return_array );
    }

    
/**
     * Filter out fields (optional)
     *
     * @param    array    Array of field data
     * @param    array     Array of fields to look for
     * @return    @e array
     */
    
protected function _filterFields$in_fields=array(), $out_fields=array() )
    {
        
//-----------------------------------------
        // INIT
        //-----------------------------------------
        
        
$return_array = array();
        
        
//-----------------------------------------
        // Check
        //-----------------------------------------
        
        
if ( ! is_array$in_fields ) or ! count$in_fields ) )
        {
            return 
false;
        }
        
        if ( ! 
is_array$out_fields ) or ! count$out_fields ) )
        {
            return 
$in_fields;
        }
        
        
//-----------------------------------------
        // Get data...
        //-----------------------------------------
        
        
foreach( $out_fields as $k => $type )
        {
            if ( 
$in_fields$k ] )
            {
                switch ( 
$type )
                {
                    default:
                    case 
'string':
                    case 
'text':
                        
$return_array$k ] = trim$in_fields$k ] );
                        break;
                    case 
'int':
                    case 
'integar':
                        
$return_array$k ] = intval$in_fields$k ] );
                        break;
                    case 
'float':
                    case 
'floatval':
                        
$return_array$k ] = floatval$in_fields$k ] );
                        break;
                }
            }
        }
        
        return 
$return_array;
    }
}
Онлайн: 1
Реклама