Вход Регистрация
Файл: core/classes/captcha.class.php
Строк: 207
<?php

class KCAPTCHA {

    function 
KCAPTCHA$type ) {

        global 
$kcaptcha;

        if (!isset(
$_SESSION['kcaptcha']['background_color']) || !isset($_SESSION['kcaptcha']['foreground_color'])) {

            
// цвета изображения CAPTCHA (RGB, 0-255)
            
$foreground_color = array( mt_rand0100 ), mt_rand0100 ), mt_rand0100 ) );
            
$background_color = array( mt_rand200255 ), mt_rand200255 ), mt_rand200255 ) ); // фон всегда светлее
        
}
        else {

            
$foreground_color $_SESSION['kcaptcha']['foreground_color'];
            
$background_color $_SESSION['kcaptcha']['background_color'];
        }

        
$alphabet '0123456789abcdefghijklmnopqrstuvwxyz';
        
$allowed_symbols '0123456789';
        
$fontsdir        'captcha';
        
$length          3;
        
$width           90;
        
$height          45;
        
$fluctuation_amplitude 5;
        
$no_spaces    true;
        
$show_credits false;
        
$credits      '';
        
$jpeg_quality 75;

        
$fonts = array();
        
$fontsdir_absolute $_SERVER['DOCUMENT_ROOT'] . '/images/' $fontsdir;

        if (
is_dir($fontsdir_absolute)) {

            if (
$handle opendir($fontsdir_absolute)) {

                while(
false !== ($file readdir($handle))) {

                    if (
preg_match('/.png$/i'$file)) {

                        
$fonts[] = $fontsdir_absolute '/' .$file;
                    }
                }
                
closedir($handle);
            }
            else { exit(); }
        }
        else { exit(); }

        
$alphabet_length strlen($alphabet);

        while( 
true )
        {
            while( 
true )
            {
                
$this->keystring '';

                for (
$i 0$i $length$i++)
                {
                    
$this->keystring .= $allowed_symbols{rand(0strlen($allowed_symbols) - 1)};
                }

                if( !
preg_match('/cp|cb|ck|c6|c9|rn|rm|mm|co|do|cl|db|qp|qb|dp/'$this->keystring) ) break;
            }

            
$_SESSION['captcha_key'] = isset( $_SESSION['captcha_key'] ) ? $_SESSION['captcha_key'] : NULL;

            if( 
$_SESSION['captcha_key'] !== NULL )
            {
                
$this->keystring $_SESSION['captcha_key'];
            }

            
$font_file $fonts[array_rand($fonts)];
            
$font imagecreatefrompng($font_file);
            
imagealphablending($fonttrue);
            
$fontfile_width imagesx($font);
            
$fontfile_height imagesy($font) - 1;
            
$font_metrics = array();
            
$symbol 0;
            
$reading_symbol false;

            for(
$i 0$i $fontfile_width && $symbol $alphabet_length$i++)
            {
                
$transparent = (imagecolorat($font$i0) >> 24) == 127;

                if (!
$reading_symbol && !$transparent)
                {
                    
$font_metrics[$alphabet[$symbol]]=array('start' => $i);
                    
$reading_symbol true;
                    continue;
                }

                if(
$reading_symbol && $transparent)
                {
                    
$font_metrics[$alphabet[$symbol]]['end'] = $i;
                    
$reading_symbol false;
                    
$symbol++;
                    continue;
                }
            }

            
$img imagecreatetruecolor($width$height);
            
imagealphablending($imgtrue);
            
$white imagecolorallocate($img255255255);
            
$black imagecolorallocate($img000);

            
imagefilledrectangle($img00$width 1$height 1$white);

            
$x 1;

            for(
$i 0$i $length$i++)
            {
                
$m $font_metrics[$this->keystring[$i]];

                
$y rand(-$fluctuation_amplitude$fluctuation_amplitude) + ($height $fontfile_height)/2;

                if( 
$no_spaces )
                {
                    
$shift 0;

                    if (
$i 0)
                    {
                        
$shift 1000;

                        for(
$sy 7$sy $fontfile_height 20$sy++)
                        {
                            for(
$sx $m['start'] - 1$sx $m['end']; $sx++)
                            {
                                
$rgb imagecolorat($font$sx$sy);
                                
$opacity $rgb >> 24;

                                if (
$opacity 127)
                                {
                                    
$left $sx $m['start'] + $x;
                                    
$py $sy $y;

                                    if (
$py $height) break;

                                    for(
$px min($left$width 1); $px $left 12 && $px >= 0$px--)
                                    {
                                        
$color imagecolorat($img$px$py) & 0xff;

                                        if (
$color $opacity 190)
                                        {
                                            if (
$shift $left $px)
                                            {
                                                
$shift $left $px;
                                            }

                                            break;
                                        }
                                    }

                                    break;
                                }
                            }
                    }

                        if (
$shift == 1000$shift rand(4,6);
                    }
                }
                else 
$shift 1;

                
imagecopy($img$font$x $shift$y$m['start'], 1$m['end'] - $m['start'], $fontfile_height);

                
$x += $m['end'] - $m['start'] - $shift;
            }

            if (
$x $width 10) break;
        }

        
$center $x/2;

        
$img2 imagecreatetruecolor($width$height + ($show_credits 12 0));
        
$foreground imagecolorallocate($img2$foreground_color[0], $foreground_color[1], $foreground_color[2]);
        
$background imagecolorallocate($img2$background_color[0], $background_color[1], $background_color[2]);
        
imagefilledrectangle($img20$height$width 1$height 12$foreground);
        
$credits = empty($credits) ? $_SERVER['HTTP_HOST'] : $credits;
        
imagestring($img22$width imagefontwidth(2) * strlen($credits)/2$height 2$credits$background);

        
$rand1 rand(750000,1200000)/10000000;
        
$rand2 rand(750000,1200000)/10000000;
        
$rand3 rand(750000,1200000)/10000000;
        
$rand4 rand(750000,1200000)/10000000;
        
$rand5 rand(0,3141592)/500000;
        
$rand6 rand(0,3141592)/500000;
        
$rand7 rand(0,3141592)/500000;
        
$rand8 rand(0,3141592)/500000;
        
$rand9 rand(330,420)/110;
        
$rand10 rand(330,450)/110;

        for(
$x 0$x $width$x++)
        {
            for(
$y 0$y $height$y++)
            {
                
$sx $x + (sin($x $rand1 $rand5) + sin($y $rand3 $rand6)) * $rand9 $width $center 1;
                
$sy $y + (sin($x $rand2 $rand7) + sin($y $rand4 $rand8)) * $rand10;

                if (
$sx || $sy || $sx >= $width || $sy >= $height 1)
                {
                    
$color 255;
                    
$color_x 255;
                    
$color_y 255;
                    
$color_xy 255;
                }
                else
                {
                    
$color imagecolorat($img$sx$sy) & 0xFF;
                    
$color_x imagecolorat($img$sx 1$sy) & 0xFF;
                    
$color_y imagecolorat($img$sx$sy 1) & 0xFF;
                    
$color_xy imagecolorat($img$sx 1$sy 1) & 0xFF;
                }

                if (
$color == && $color_x == && $color_y == && $color_xy == 0)
                {
                    
$newred $foreground_color[0];
                    
$newgreen $foreground_color[1];
                    
$newblue $foreground_color[2];
                }
                else if (
$color == 255 && $color_x == 255 && $color_y == 255 && $color_xy == 255)
                {
                    
$newred $background_color[0];
                    
$newgreen $background_color[1];
                    
$newblue $background_color[2];    
                }
                else
                {
                    
$frsx $sx floor($sx);
                    
$frsy $sy floor($sy);
                    
$frsx1 $frsx;
                    
$frsy1 $frsy;

                    
$newcolor = (
                         
$color $frsx1 $frsy1 
                         
$color_x $frsx $frsy1 
                         
$color_y $frsx1 $frsy 
                         
$color_xy $frsx $frsy);

                    if (
$newcolor 255$newcolor 255;
                    
$newcolor $newcolor 255;
                    
$newcolor0 $newcolor;

                    
$newred $newcolor0 $foreground_color[0] + $newcolor $background_color[0];
                    
$newgreen $newcolor0 $foreground_color[1] + $newcolor $background_color[1];
                    
$newblue $newcolor0 $foreground_color[2] + $newcolor $background_color[2];
                }

                
imagesetpixel($img2$x$yimagecolorallocate($img2$newred$newgreen$newblue));
            }
        }
        
        
header('Last-Modified: ' gmdate('D, d M Y H:i:s') . ' GMT');
        
header('Cache-Control: no-cache, must-relative');

        switch(
$type) {

            case 
'gif':
              
header('Content-Type: image/gif');
              
imagegif($img2);
            break;

            case 
'jpg':
              
header('Content-Type: image/jpeg');
              
imagejpeg($img2NULL$jpeg_quality);
            break;

            case 
'png':
              
header('Content-Type: image/x-png');
              
imagepng($img2);
            break;
        }
    }

    function 
getKeyString() {

        return 
$this->keystring;
    }
}

?>
Онлайн: 1
Реклама