Вход Регистрация
Файл: IPBMafia.ru_IPB_3.4.6_Final_Rus _Nulled/board/upload/ips_kernel/classCaptchaPlugin/default.php
Строк: 458
<?php
/**
 * @file        default.php     Plugin for the default CAPTCHA GD image
 *~TERABYTE_DOC_READY~
 * $Copyright: (c) 2001 - 2011 Invision Power Services, Inc.$
 * $License: http://www.invisionpower.com/company/standards.php#license$
 * $Author: bfarber $
 * @since        Friday 19th May 2006 17:33
 * $LastChangedDate: 2012-02-10 20:05:52 -0500 (Fri, 10 Feb 2012) $
 * @version        v3.4.6
 * $Revision: 10288 $
 */

/**
 *
 * @class        captchaPlugin
 * @brief        Plugin for the default CAPTCHA GD image
 * @note        This plugin is automatically loaded by classCaptcha class based on the CAPTCHA setting
 *
 */
class captchaPlugin
{
    
/**#@+
     * Registry Object Shortcuts
     *
     * @var        object
     */
    
public $registry;
    public 
$DB;
    public 
$settings;
    public 
$member;
    
/**#@-*/
    
    /**
     * String that stores the backgrounds path
     *
     * @var        string
     */
    
public $path_background        '';
    
    
/**
     * String that stores the fonts path
     *
     * @var        string
     */
    
public $path_fonts            '';

    
/**
     * String that stores the captcha key
     *
     * @var        string
     */
    
public $captchaKey             '';
    
    
/**
     * Constructor
     *
     * @param    object        $registry        Registry Object
     * @return    @e void
     */
    
public function __constructipsRegistry $registry )
    {
        
$this->registry    =  $registry;
        
$this->DB        =  $this->registry->DB();
        
$this->settings    =& $this->registry->fetchSettings();
        
$this->member    =  $this->registry->member();
        
        
/* Settings */
        
$this->path_background    DOC_IPS_ROOT_PATH PUBLIC_DIRECTORY '/style_captcha/captcha_backgrounds';
        
$this->path_fonts        DOC_IPS_ROOT_PATH PUBLIC_DIRECTORY '/style_captcha/captcha_fonts';
    }
    
    
/**
     * Returns the captcha template
     *
     * @return    @e string
     *
     * <b>Example Usage:</b>
     * @code
     * $gdImage = $this->getTemplate();
     * @endcode
     */
    
public function getTemplate()
    {
        
//-----------------------------------------
        // Clear old
        //-----------------------------------------
        
        
$this->_clearSessions$this->member->ip_address );
        
        
//-----------------------------------------
        // Create new ID
        //-----------------------------------------
        
        
$captcha_unique_id md5uniqidtime() ) );
        
$captcha_string    "";
        
        
//-----------------------------------------
        // Create new string
        //-----------------------------------------

        /**
         * Array of characters 
         * Removed: 0, o, O, 1, l, I, i, L (because they're hard to differentiate)
         */
        
$array_of_chars = array( 
                                
'a''b''c''d''e''f''g''h''j''k''m''n''p''q''r''s''t''u''v''w''x''y''z',
                                
'A''B''C''D''E''F''G''H''J''K''M''N''P''Q''R''S''T''U''V''W''X''Y''Z',
                                
'2''3''4''5''6''7''8''9',
                                );
        
        
/* Get 6 random characters */
        
for( $i 0$i 6$i++ )
        {
            
$idx mt_rand0count$array_of_chars ) - );
            
$captcha_string .= $array_of_chars$idx ];
        }        
        
        
//-----------------------------------------
        // Add to the DB
        //-----------------------------------------
        
        
$this->DB->insert'captcha', array( 'captcha_unique_id' => $captcha_unique_id,
                                             
'captcha_string'    => $captcha_string,
                                             
'captcha_ipaddress' => $this->member->ip_address,
                                             
'captcha_date'      => time() ) );
        
        
/* Make available */
        
$this->captchaKey $captcha_unique_id;
        
        
/* Return template */
        
return $this->registry->output->getTemplate('global_other')->captchaGD$captcha_unique_id );
    }
    
    
/**
     * Validates the entered captcha code, returning true on success and false on failure
     *
     * @return    @e boolean
     *
     * <b>Example Usage:</b>
     * @code
     * $isValid = $this->validate();
     * @endcode
     */
    
public function validate()
    {
        
/* Init vars */
        
$captcha_unique_id       IPSText::alphanumericalClean$_REQUEST['captcha_unique_id'] );
        
$captcha_input_NOT_CLEAN trim$_REQUEST['captcha_string'] );
        
        
/* Get ID from DB */
        
$captcha $this->DB->buildAndFetch( array( 'select' => '*''from' => 'captcha''where' => "captcha_unique_id='"addslashes$captcha_unique_id )."'" ) );
    
        if ( ! 
$captcha['captcha_unique_id'] )
        {
            return 
FALSE;
        }
        
        
/* Check */
        
if ( $captcha['captcha_string'] != $captcha_input_NOT_CLEAN )
        {
            return 
FALSE;
        }
        else
        {
            
$this->_clearSessions$this->member->ip_address );
            return 
TRUE;
        }
    }
    
    
/**
     * Generates the captcha image.  Returns false on failure.
     *
     * @param    array        $captcha_unique_id        Key 0 of the array contains the Unique ID
     * @return    @e mixed
     *
     * <b>Example Usage:</b>
     * @code
     * $captchaImage = $this->showImage( $captcha_unique_id );
     * @endcode
     */
    
public function showImage$captcha_unique_id )
    {
        
//-----------------------------------------
        // Magic _call method makes an array
        //-----------------------------------------
        
        
$captcha_unique_id    $captcha_unique_id[0];
        
        if ( ! 
$captcha_unique_id )
        {
            return 
false;
        }
        
        
/* Get the info from the DB */
        
$captcha $this->DB->buildAndFetch( array( 'select' => '*''from' => 'captcha''where' => "captcha_unique_id='" $captcha_unique_id "'" ) );
    
        if ( ! 
$captcha['captcha_unique_id'] )
        {
            return 
false;
        }
        
        
/* Show it... */
        
$this->_showGDImage$captcha['captcha_string'] );
    }

    
/**
     * Prints captcha image and headers
     *
     * @param    string        $content        Key to show in the GD image
     * @return    @e void
     *
     * <b>Example Usage:</b>
     * @code
     * $this->_showGDImage( $captcha_string );
     * @endcode
     */
    
protected function _showGDImage$content="" )
    {
        
//-----------------------------------------
        // Is GD Available?
        //-----------------------------------------
        
        
if ( ! extension_loaded('gd') )
        {
            @
header"Content-Type: image/gif" );
            print 
base64_decode"R0lGODlhyAA8AJEAAN/f3z8/P8zMzP///yH5BAAAAAAALAAAAADIADwAAAL/nI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMlgACwEHQXESfzgOzykQAqgMmFMr9Rq+GbHlqAFsFWnFVrfwIAvQAu15P0A14Nn8/ADhXd4dnl2YYCAioGHBgyDbnNzBIV0gYxzEYWdg1iLAnScmFuQdAt2UKZTcl+mip+HoYG+tKOfv3N5l5garnmPt6CwyaFzrranu7i0crObvoaKvMyMhrIQhFuyzcyGwXcOpoLYg7DGsZXk5r6DSN51RNfF0RPU5sy7gpnH5bjLhrk7Y9/RQNisfq2CRJauTR6xUuFyBx/yrWypMMmTlq/9IwQnKWcKG5cvMeShBIMOFIaV9w2eti6SBABAyjvBRFMaZCMaxsqtxl8iShjpj+VfqGCJg4XzOfJCK5DVWliFNXlSIENKjWrVy7ev0KNqzYsWTFwhlFU8waLk+efGF7hi0aSgu3iGmV1cxdoGTinimbiGOeP8SWhps6z3AkeMMWW20mMykqQyuJDbYWdufKBJWc2uWmAJZdO0yOKfTCCqHGiO4E/oKGriTYaBw5g/MDqynNlW9Uhmx66tM2i05dNcM8O6Rg2MHLYKraLTpDcLebTke4APkcduAoku0DWpe24MI96ewZPdiy6Rlx/0Y+XJevlNu/z6vtlHFxZbpv9f9edYkfxgVmjnqSxXYOYPfFVMgXIHGC0ltWDNXYJ6Lsw82AFVpWEk4pEabgbsfBM5FphyDWRh1OLCUgbC06NtNU6UV1T1Jl3YhjjjruyGOPPv4IZJBC6tDXGUDB4UUaK06RhRl/0aWWF3CR4YWESraR1ZCh6dMOiMNIFE2GI/bRJYiIEeULiloyUNSFLzWC3VXcqEJXTBe1qApDpbXUEYxr2tYeQCyyGMuIcxbokHfPvPjHf25mqeWHoLEX0iH0UScmUzSWNxmj20yH6Z+/yNTeM0N1cumkg9E4GHnluLcfeKLm95yLoO5ZKJrhgeaQm4xlFGshcK3pYZ9LradQrmY5nmhVdMm+qqpKYkIqpDyltWkpjJJaaKmd6kXjHUXvDPborOaei2666q7LbrvuvgtvvPLOS2+9YBUAADs=" );
            exit();
        }
                
        
//-----------------------------------------
        // INIT
        //-----------------------------------------
        
        
$content       '  'preg_replace"/(w)/""\1 "$content ) .' ';
        
$use_fonts     0;
        
$tmp_x         135;
        
$tmp_y         20;
        
$image_x       200;
        
$image_y       60;
        
$circles       3;
        
$continue_loop TRUE;
        
$_started      FALSE;
        
        
//-----------------------------------------
        // Get backgrounds and fonts...
        //-----------------------------------------
        
        
$backgrounds $this->_getBackgrounds();
        
$fonts       $this->_getFonts();

        
//-----------------------------------------
        // Got a background?
        //-----------------------------------------
        
$_imgs = array();
        
        while ( 
$continue_loop )
        {
            if ( 
is_array$backgrounds ) AND count$backgrounds ) )
            {
                
$i mt_rand(0count$backgrounds ) - );
            
                
$background      $backgrounds$i ];
                
$_file_extension preg_replace"#^.*.(w{2,4})$#is""\1"strtolower$background ) );
            
                switch( 
$_file_extension )
                {
                    case 
'jpg':
                    case 
'jpe':
                    case 
'jpeg':
                        if ( ! 
function_exists('imagecreatefromjpeg') OR ! $im = @imagecreatefromjpeg($background) )
                        {
                            unset( 
$backgrounds$i ] );
                        }
                        else
                        {
                            
$_imgs[] = $im;
                            
                            if( 
count$_imgs ) > )
                            {
                                
$continue_loop FALSE;
                                
$_started      TRUE;
                            }
                        }
                        break;
                    case 
'gif':
                        if ( ! 
function_exists('imagecreatefromgif') OR ! $im = @imagecreatefromgif($background) )
                        {
                            unset( 
$backgrounds$i ] );
                        }
                        else
                        {
                            
$_imgs[] = $im;
                            
                            if( 
count$_imgs ) > )
                            {
                                
$continue_loop FALSE;
                                
$_started      TRUE;
                            }
                        }
                        break;
                    case 
'png':
                        if ( ! 
function_exists('imagecreatefrompng') OR ! $im = @imagecreatefrompng($background) )
                        {
                            unset( 
$backgrounds$i ] );
                        }
                        else
                        {
                            
$_imgs[] = $im;
                            
                            if( 
count$_imgs ) > )
                            {
                                
$continue_loop FALSE;
                                
$_started      TRUE;
                            }
                        }
                        break;
                }
            }
            else
            {
                
$continue_loop FALSE;
            }
        }
        
        
/* Create a new background */
        
if( count$_imgs ) )
        {
            
/* Setup */
            
$strip_count 8;
            
$strips      ceil$image_x $strip_count );
            
$im          imagecreatetruecolor$image_x$image_y );    
            
$curr_offset 0;
            
$alternate   0;
            
            for( 
$i 0$i $strip_count$i++ )
            {
                
/* Alternate the background */
                
$alternate++;
                
$alternate = ( $alternate ) ? $alternate;
                
                
/* Width of the strip */
                
$end_strip = ( $i $strips ) + mt_rand1$strips );
                
                
/* Copy the splice */
                
imagecopymerge$im$_imgs[$alternate], $curr_offset0$curr_offset0$end_strip$image_ymt_rand1100 ) );
                
                
/* Increment the offset */
                
$curr_offset += $end_strip;
            }
            
            
$_started TRUE;
            
        }
        
        
//-----------------------------------------
        // Still not got one? DO OLD FASHIONED
        //-----------------------------------------
        
        
if ( $_started !== TRUE )
        {
            
$im  imagecreatetruecolor($image_x$image_y);
            
$tmp imagecreatetruecolor($tmp_x$tmp_y);
            
            
$white  ImageColorAllocate($tmp255255255);
            
$black  ImageColorAllocate($tmp000);
            
$grey   ImageColorAllocate($tmp200200200 );

            
imagefill($tmp00$white);

            for ( 
$i 1$i <= $circles$i++ )
            {
                
$values = array(
                                
0  => mt_rand(0$tmp_x 10),
                                
1  => mt_rand(0$tmp_y 3),
                                
2  => mt_rand(0$tmp_x 10),
                                
3  => mt_rand(0$tmp_y 3),
                                
4  => mt_rand(0$tmp_x 10),
                                
5  => mt_rand(0$tmp_y 3),
                                
6  => mt_rand(0$tmp_x 10),
                                
7  => mt_rand(0$tmp_y 3),
                                
8  => mt_rand(0$tmp_x 10),
                                
9  => mt_rand(0$tmp_y 3),
                                
10 => mt_rand(0$tmp_x 10),
                                
11 => mt_rand(0$tmp_y 3),
                             );

                
$randomcolor imagecolorallocate$tmpmt_rand(100,255), mt_rand(100,255), mt_rand(100,255) );
                
imagefilledpolygon($tmp$values6$randomcolor );
            }

            
$num     strlen($content);
            
$x_param 0;
            
$y_param 0;

            for( 
$i 0$i $num$i++ )
            {
                
$x_param += mt_rand(-1,12);
                
$y_param mt_rand(-3,8);
                
                if( 
$x_param 18 $image_x )
                {
                    
$x_param -= ceil$x_param 18 $image_x );
                }

                
$randomcolor imagecolorallocate$tmpmt_rand(0,150), mt_rand(0,150), mt_rand(0,150) );

                
imagestring($tmp5$x_param+1$y_param+1$content{$i}, $grey);
                
imagestring($tmp5$x_param$y_param$content{$i}, $randomcolor);
            }

            
//-----------------------------------------
            // Distort by resizing
            //-----------------------------------------

            
imagecopyresized($im$tmp0000$image_x$image_y$tmp_x$tmp_y);

            
imagedestroy($tmp);
            
            
//-----------------------------------------
            // Background dots and lines
            //-----------------------------------------

            
$random_pixels $image_x $image_y 10;

            for (
$i 0$i $random_pixels$i++)
            {
                
$randomcolor imagecolorallocate$immt_rand(0,150), mt_rand(0,150), mt_rand(0,150) );
                
ImageSetPixel($immt_rand(0$image_x), mt_rand(0$image_y), $randomcolor);
            }

            
$no_x_lines = ($image_x 1) / 5;

            for ( 
$i 0$i <= $no_x_lines$i++ )
            {
                
ImageLine$im$i $no_x_lines0$i $no_x_lines$image_y$grey );
                
ImageLine$im$i $no_x_lines0, ($i $no_x_lines)+$no_x_lines$image_y$grey );
            }

            
$no_y_lines = ($image_y 1) / 5;

            for ( 
$i 0$i <= $no_y_lines$i++ )
            {
                
ImageLine$im0$i $no_y_lines$image_x$i $no_y_lines$grey );
            }
        }
        else
        {
            
//-----------------------------------------
            // Can we use fonts?
            //-----------------------------------------
            
            
if ( function_exists('imagettftext') AND is_array$fonts ) AND count$fonts ) )
            {
                if ( 
function_exists('imageantialias') )
                {
                    
imageantialias$imTRUE );
                }
                
                
$num       strlen($content);
                
$x_param   = -10;
                
$y_param   0;

                for( 
$i 0$i $num$i++ )
                {
                    
/* Random Font */
                    
$_font       $fontsmt_rand0count$fonts ) - ) ];
                    
                    
$y_param     mt_rand3548 );
                    
                    
# Main color
                    
$col_r       mt_rand(50,200);
                    
$col_g       mt_rand(0,150);
                    
$col_b       mt_rand(50,200);
                    
# High light
                    
$col_r_l     = ( $col_r 50 255 ) ? 255 $col_r 50;
                    
$col_g_l     = ( $col_g 50 255 ) ? 255 $col_g 50;
                    
$col_b_l     = ( $col_b 50 255 ) ? 255 $col_b 50;
                    
# Low light
                    
$col_r_d     = ( $col_r 50 ) ? $col_r 50;
                    
$col_g_d     = ( $col_g 50 ) ? $col_g 50;
                    
$col_b_d     = ( $col_b 50 ) ? $col_b 50;
                    
                    
$color_main  imagecolorallocate$im$col_r$col_g$col_b );
                    
$color_light imagecolorallocate$im$col_r_l$col_g_l$col_b_l );
                    
$color_dark  imagecolorallocate$im$col_r_d$col_g_d$col_b_d );
                    
$_slant      mt_rand( -2040 );
                    
                    if ( 
$i == OR $i == OR $i == )
                    {
                        for( 
$ii $ii $ii++ )
                        {
                            
$a   $x_param 50;
                            
$b   mt_rand(0,100);
                            
$c   $a 20;
                            
$d   $b 20;
                            
$e   = ( $i == ) ? mt_rand280320 ) : mt_rand( -320, -280 );
                            
                            
imagearc$im$a  $b  $c$d0$e$color_light );
                            
imagearc$im$a+1$b+1$c$d0$e$color_main );
                        }
                    }
                    
                    
$text_size mt_rand2430 ); //24
                    
                    
if ( ! $_result = @imagettftext$im$text_size$_slant$x_param 1$y_param 1$color_light$_font$content[$i] ) )
                    {
                        
$use_fonts FALSE;
                        break;
                    }
                    else
                    {
                        @
imagettftext$im$text_size$_slant$x_param 1$y_param 1$color_dark$_font$content[$i] );
                        @
imagettftext$im$text_size$_slant$x_param$y_param$color_main$_font$content[$i] );
                    }
                    
                    
$x_param += mt_rand1316 ); //15,18
                    
                    
if( $x_param 18 $image_x )
                    {
                        
$x_param -= ceil$x_param 18 $image_x );
                    }                    
                }

                
$use_fonts TRUE;
            }
            
            if ( ! 
$use_fonts )
            {
                
//-----------------------------------------
                // Continue with nice background image
                //-----------------------------------------
            
                
$tmp         imagecreatetruecolor($tmp_x  $tmp_y  );
                
$tmp2        imagecreatetruecolor($image_x$image_y);
        
                
$white       imagecolorallocate$tmp255255255 );
                
$black       imagecolorallocate$tmp00);
                
$grey        imagecolorallocate$tmp100100100 );
                
$transparent imagecolorallocate$tmp2255255255 );
                
$_white      imagecolorallocate$tmp2255255255 );
            
                
imagefill($tmp 00$white );
                
imagefill($tmp200$_white);
            
                
$num         strlen($content);
                
$x_param     0;
                
$y_param     0;

                for( 
$i 0$i $num$i++ )
                {
                    if ( 
$i )
                    {
                        
$x_param += mt_rand612 );
                        
                        if( 
$x_param 18 $image_x )
                        {
                            
$x_param -= ceil$x_param 18 $image_x );
                        }
                    }
                
                    
$y_param  mt_rand0);
                
                    
$randomcolor imagecolorallocate$tmpmt_rand(50,200), mt_rand(50,200), mt_rand(50,200) );

                    
imagestring$tmp5$x_param 1$y_param 1$content{$i}, $grey );
                    
imagestring$tmp5$x_param    $y_param    $content{$i}, $randomcolor );
                }
            
                
imagecopyresized($tmp2$tmp0000$image_x$image_y$tmp_x$tmp_y );
            
                
$tmp2 $this->_showGDImageWave$tmp28true );
            
                
imagecolortransparent$tmp2$transparent );
                
imagecopymerge$im$tmp20000$image_x$image_y100 );
        
                
imagedestroy($tmp);
                
imagedestroy($tmp2);
            }
        }
        
        
//-----------------------------------------
        // Blur?
        //-----------------------------------------
        
        
if ( function_exists'imagefilter' ) )
        {
            @
imagefilter$imIMG_FILTER_GAUSSIAN_BLUR );
        }
        
        
//-----------------------------------------
        // Render a border
        //-----------------------------------------
        
        
$black imagecolorallocate$im00);
        
        
imageline$im00$image_x0$black );
        
imageline$im000$image_y$black );
        
imageline$im$image_x 10$image_x 1$image_y$black );
        
imageline$im0$image_y 1$image_x$image_y 1$black );
        
        
//-----------------------------------------
        // Show it!
        //-----------------------------------------
        
        
@header"Content-Type: image/jpeg" );
        
        
imagejpeg$im );
        
imagedestroy$im );
        
        exit();
    }

    
/**
     * Create wave effect for GD images
     *
     * @param    resources        $im        Image resource
     * @param    integer            $wave    Wave factor
     * @return    @e resource
     *
     * <b>Example Usage:</b>
     * @code
     * $imageResource = $this->_showGDImageWave( $captcha_string );
     * @endcode
     */
    
protected function _showGDImageWave$im$wave=10 )
    {
        
$_width  imagesx$im );
        
$_height imagesy$im );

        
$tmp imagecreatetruecolor$_width$_height );

        
$_direction = ( time() % ) ? TRUE FALSE;

        for ( 
$x 0$x $_width$x++ )
        {
            for ( 
$y $y $_height $y++ )
            {
                
$xo $wave sin3.1415 $y 128 );
                
$yo $wave cos3.1415 $x 128 );

                
$_x $x $xo;
                
$_y $y $yo;
                
                if ( (
$_x AND $_x $_width) AND ($_y AND $_y $_height) )
                {
                    
$index  imagecolorat($im$_x$_y);
                       
$colors imagecolorsforindex($im$index);
                       
$color  imagecolorresolve$tmp$colors['red'], $colors['green'], $colors['blue'] );
                }
                else
                {
                    
$color imagecolorresolve$tmp255255255 );
                }

                
imagesetpixel$tmp$x$y$color );
            }
        }

        return 
$tmp;
    }

    
/**
     * Removes extinct captcha sessions or 'dead' entries
     *
     * @param    string        $ip_address        Optional IP address to clear out on
     * @return    @e void
     *
     * <b>Example Usage:</b>
     * @code
     * $this->_clearSessions( $ip_address );
     * @endcode
     */
    
protected function _clearSessions$ip_address='' )
    {
        
/* Init vars */
        
$time  time() - 60 3600;
        
$extra = ( $ip_address ) ? " OR captcha_ipaddress='" $ip_address "'" '';
        
        
/* Remove from DB */
        
$this->DB->delete'captcha''captcha_date < ' $time $extra );
    }
    
    
/**
     * Retrieves the list of backgrounds from the specified path
     *
     * @return    @e array
     *
     * <b>Example Usage:</b>
     * @code
     * $images = $this->_getBackgrounds();
     * @endcode
     */
    
protected function _getBackgrounds()
    {
        
/* Init vars */
        
$images = array();
        
$_path  $this->path_background;
        
        
/* Loop */
        
if ( $_dir opendir$_path ) )
        {
            while( 
false !== ( $_file readdir$_dir ) ) )
            {
                if ( 
preg_match"#.(gif|jpeg|jpg|png)$#i"$_file ) )
                {
                    
$images[] = $_path '/' $_file;
                }
            }
        }

        return 
$images;
    }

    
/**
     * Retrieves the list of fonts from the specified path
     *
     * @return    @e array
     *
     * <b>Example Usage:</b>
     * @code
     * $fonts = $this->_getFonts();
     * @endcode
     */
    
protected function _getFonts()
    {
        
/* Init vars */
        
$fonts  = array();
        
$_path  $this->path_fonts;
        
        
/* Loop */
        
if ( $_dir = @opendir$_path ) )
        {
            while( 
false !== ( $_file = @readdir$_dir ) ) )
            {
                if ( 
preg_match"#.(ttf)$#i"$_file ) )
                {
                    
$fonts[] = $_path '/' $_file;
                }
            }
        }
        
        return 
$fonts;
    }
}
Онлайн: 1
Реклама