110 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * WP Captcha
 | |
|  * https://getwpcaptcha.com/
 | |
|  * (c) WebFactory Ltd, 2022 - 2023, www.webfactoryltd.com
 | |
|  */
 | |
| 
 | |
| class WPCaptcha_Captcha {
 | |
|   // convert HEX(HTML) color notation to RGB
 | |
|   static function hex2rgb($color) {
 | |
|     if ($color[0] == '#') {
 | |
|       $color = substr($color, 1);
 | |
|     }
 | |
| 
 | |
|     if (strlen($color) == 6) {
 | |
|         list($r, $g, $b) = array($color[0].$color[1],
 | |
|                                  $color[2].$color[3],
 | |
|                                  $color[4].$color[5]);
 | |
|     } elseif (strlen($color) == 3) {
 | |
|         list($r, $g, $b) = array($color[0].$color[0], $color[1].$color[1], $color[2].$color[2]);
 | |
|     } else {
 | |
|         return array(255, 255, 255);
 | |
|     }
 | |
| 
 | |
|     $r = hexdec($r);
 | |
|     $g = hexdec($g);
 | |
|     $b = hexdec($b);
 | |
| 
 | |
|     return array($r, $g, $b);
 | |
|   } // html2rgb
 | |
| 
 | |
| 
 | |
|   // output captcha image
 | |
|   static function generate() {
 | |
|     $a = rand(0, (int) 10);
 | |
|     $b = rand(0, (int) 10);
 | |
|     $color = @$_GET['color'];
 | |
|     $color = urldecode($color);
 | |
|     if(isset($_GET['id'])){
 | |
|         $captcha_cookie_name = 'wpcaptcha_captcha_' . intval($_GET['id']);
 | |
|     } else{
 | |
|         $captcha_cookie_name = 'wpcaptcha_captcha';
 | |
|     }
 | |
| 
 | |
|     if ($a > $b) {
 | |
|       $out = "$a - $b";
 | |
|       $captcha_value = $a - $b;
 | |
| 
 | |
|     } else {
 | |
|       $out = "$a + $b";
 | |
|       $captcha_value = $a + $b;
 | |
|     }
 | |
| 
 | |
|     setcookie($captcha_cookie_name, $captcha_value, time() + 60 * 5, '/');
 | |
| 
 | |
|     $font   = 5;
 | |
|     $width  = ImageFontWidth($font) * strlen($out);
 | |
|     $height = ImageFontHeight($font);
 | |
|     $im     = ImageCreate($width, $height);
 | |
| 
 | |
|     $x = imagesx($im) - $width ;
 | |
|     $y = imagesy($im) - $height;
 | |
| 
 | |
|     $white = imagecolorallocate ($im, 255, 255, 255);
 | |
|     $gray = imagecolorallocate ($im, 66, 66, 66);
 | |
|     $black = imagecolorallocate ($im, 0, 0, 0);
 | |
|     $trans_color = $white; //transparent color
 | |
| 
 | |
|     if ($color) {
 | |
|       $color = self::hex2rgb($color);
 | |
|       $new_color = imagecolorallocate ($im, $color[0], $color[1], $color[2]);
 | |
|       imagefill($im, 1, 1, $new_color);
 | |
|     } else {
 | |
|       imagecolortransparent($im, $trans_color);
 | |
|     }
 | |
| 
 | |
|     imagestring ($im, $font, $x, $y, $out, $black);
 | |
| 
 | |
|     // always add noise
 | |
|     if (1 == 1) {
 | |
|       $color_min = 100;
 | |
|       $color_max = 200;
 | |
|       $rand1 = imagecolorallocate ($im, rand($color_min,$color_max), rand($color_min,$color_max), rand($color_min,$color_max));
 | |
|       $rand2 = imagecolorallocate ($im, rand($color_min,$color_max), rand($color_min,$color_max), rand($color_min,$color_max));
 | |
|       $rand3 = imagecolorallocate ($im, rand($color_min,$color_max), rand($color_min,$color_max), rand($color_min,$color_max));
 | |
|       $rand4 = imagecolorallocate ($im, rand($color_min,$color_max), rand($color_min,$color_max), rand($color_min,$color_max));
 | |
|       $rand5 = imagecolorallocate ($im, rand($color_min,$color_max), rand($color_min,$color_max), rand($color_min,$color_max));
 | |
|                 
 | |
|       $style = array($rand1, $rand2, $rand3, $rand4, $rand5);
 | |
|       imagesetstyle($im, $style);
 | |
|       imageline($im, rand(0, $width), 0, rand(0, $width), $height, IMG_COLOR_STYLED);
 | |
|       imageline($im, rand(0, $width), 0, rand(0, $width), $height, IMG_COLOR_STYLED);
 | |
|       imageline($im, rand(0, $width), 0, rand(0, $width), $height, IMG_COLOR_STYLED);
 | |
|       imageline($im, rand(0, $width), 0, rand(0, $width), $height, IMG_COLOR_STYLED);
 | |
|       imageline($im, rand(0, $width), 0, rand(0, $width), $height, IMG_COLOR_STYLED);
 | |
|     }
 | |
| 
 | |
|     header('Cache-Control: no-cache, must-revalidate');
 | |
|     header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
 | |
|     header('Content-type: image/gif');
 | |
|     imagegif($im);
 | |
|     die();
 | |
|   } // create
 | |
| } // WPCaptcha_Captcha
 | |
| 
 | |
| 
 | |
| if (isset($_GET['wpcaptcha-generate-image'])) {
 | |
|   WPCaptcha_Captcha::generate();
 | |
| }
 |