summaryrefslogtreecommitdiff
path: root/framework/Web/UI/WebControls/assets/captcha.php
diff options
context:
space:
mode:
authorxue <>2007-08-29 19:57:50 +0000
committerxue <>2007-08-29 19:57:50 +0000
commitdd02492f08248bf9b53a20b54a3d49a9f78fc0ad (patch)
tree31ae15e2ed59a6279f09bf639d367d1844e12055 /framework/Web/UI/WebControls/assets/captcha.php
parent9d13a92291fad0a5a5fd46179149654cb357c9d0 (diff)
finished TCaptcha.
Diffstat (limited to 'framework/Web/UI/WebControls/assets/captcha.php')
-rw-r--r--framework/Web/UI/WebControls/assets/captcha.php169
1 files changed, 138 insertions, 31 deletions
diff --git a/framework/Web/UI/WebControls/assets/captcha.php b/framework/Web/UI/WebControls/assets/captcha.php
index 3941eb44..2a4952a9 100644
--- a/framework/Web/UI/WebControls/assets/captcha.php
+++ b/framework/Web/UI/WebControls/assets/captcha.php
@@ -10,9 +10,17 @@
* @package System.Web.UI.WebControls.assets
*/
+define('THEME_OPAQUE_BACKGROUND',0x0001);
+define('THEME_NOISY_BACKGROUND',0x0002);
+define('THEME_HAS_GRID',0x0004);
+define('THEME_HAS_SCRIBBLE',0x0008);
+define('THEME_MORPH_BACKGROUND',0x0010);
+
require_once(dirname(__FILE__).'/captcha_key.php');
$token='error';
+$theme=0;
+
if(isset($_GET['options']))
{
$str=base64_decode($_GET['options']);
@@ -27,12 +35,14 @@ if(isset($_GET['options']))
$tokenLength=$options['tokenLength'];
$caseSensitive=$options['caseSensitive'];
$alphabet=$options['alphabet'];
+ $fontSize=$options['fontSize'];
+ $theme=$options['theme'];
$token=generateToken($publicKey,$privateKey,$alphabet,$tokenLength,$caseSensitive);
}
}
}
-displayToken($token);
+displayToken($token,$fontSize,$theme);
function generateToken($publicKey,$privateKey,$alphabet,$tokenLength,$caseSensitive)
{
@@ -40,10 +50,10 @@ function generateToken($publicKey,$privateKey,$alphabet,$tokenLength,$caseSensit
return $caseSensitive?$token:strtoupper($token);
}
-function hash2string($hex,$alphabet='')
+function hash2string($hex,$alphabet)
{
if(strlen($alphabet)<2)
- $alphabet='234578adefhijmnrtABDEFGHJLMNQRT';
+ $alphabet='234578adefhijmnrtABDEFGHJLMNRT';
$hexLength=strlen($hex);
$base=strlen($alphabet);
$result='';
@@ -59,47 +69,144 @@ function hash2string($hex,$alphabet='')
return $result;
}
-function displayToken($token)
+function displayToken($token,$fontSize,$theme)
{
+ if(($fontSize=(int)$fontSize)<22)
+ $fontSize=22;
+ if($fontSize>100)
+ $fontSize=100;
$length=strlen($token);
- $width=45*$length;
- $height=70;
+ $padding=10;
+ $fontWidth=$fontSize;
+ $fontHeight=floor($fontWidth*1.5);
+ $width=$fontWidth*$length+$padding*2;
+ $height=$fontHeight;
$image=imagecreatetruecolor($width,$height);
+
+ addBackground
+ (
+ $image, $width, $height,
+ $theme&THEME_OPAQUE_BACKGROUND,
+ $theme&THEME_NOISY_BACKGROUND,
+ $theme&THEME_HAS_GRID,
+ $theme&THEME_HAS_SCRIBBLE,
+ $theme&THEME_MORPH_BACKGROUND
+ );
+
$font=dirname(__FILE__).DIRECTORY_SEPARATOR.'verase.ttf';
- $vred=rand(0,100);
- $vgreen=rand(0,100);
- $vblue=rand(0,100);
+
+ if(function_exists('imagefilter'))
+ imagefilter($image,IMG_FILTER_GAUSSIAN_BLUR);
+
+ for($i=0;$i<$length;$i++)
+ {
+ $color=imagecolorallocate($image,rand(150,220),rand(150,220),rand(150,220));
+ imagettftext($image,rand($fontWidth-10,$fontWidth),rand(-30, 30),$padding+$i*$fontWidth,rand($fontHeight-15,$fontHeight-10),$color,$font,$token[$i]);
+ imagecolordeallocate($image,$color);
+ }
+
+ imagepng($image);
+ imagedestroy($image);
+}
+
+function addBackground($image,$width,$height,$opaque,$noisy,$hasGrid,$hasScribble,$morph)
+{
+ $background=imagecreatetruecolor($width*2,$height*2);
+ $white=imagecolorallocate($background,255,255,255);
+ imagefill($background,0,0,$white);
+
+ if($opaque)
+ imagefill($background,0,0,imagecolorallocate($background,100,100,100));
+
+ if($noisy)
+ addNoise($background,$width*2,$height*2);
+
+ if($hasGrid)
+ addGrid($background,$width*2,$height*2);
+
+ if($hasScribble)
+ addScribble($background,$width*2,$height*2);
+
+ if($morph)
+ morphImage($background,$width*2,$height*2);
+
+ imagecopy($image,$background,0,0,30,30,$width,$height);
+
+ if(!$opaque)
+ imagecolortransparent($image,$white);
+}
+
+function addNoise($image,$width,$height)
+{
for($x=0;$x<$width;++$x)
{
for($y=0;$y<$height;++$y)
{
- $vred+=rand(-2,2);
- $vgreen+=rand(-2,2);
- $vblue+=rand(-2,2);
- if($vred<0) $vred=0; if($vred>150) $vred=75;
- if($vgreen<0) $vgreen=0; if($vgreen>150) $vgreen=75;
- if($vblue<0) $vblue=0; if($vblue>150) $vblue=75;
- $col = imagecolorallocate($image, $vred, $vgreen, $vblue);
- imagesetpixel($image, $x, $y, $col);
- imagecolordeallocate($image, $col);
+ if(rand(0,100)<25)
+ {
+ $color=imagecolorallocate($image,rand(150,220),rand(150,220),rand(150,220));
+ imagesetpixel($image,$x,$y,$color);
+ imagecolordeallocate($image,$color);
+ }
}
}
+}
- imagefilter($image,IMG_FILTER_GAUSSIAN_BLUR);
- for($i=0;$i<$length;$i++)
+function addGrid($image,$width,$height)
+{
+ for($i=0;$i<$width;$i+=rand(15,25))
{
- $vred = rand(150, 240);
- $vgreen = rand(150, 240);
- $vblue = rand(150, 240);
- $col = imagecolorallocate($image, $vred, $vgreen, $vblue);
- $char = $token[$i];
- imagettftext($image, rand(40, 50), rand(-10, 20), 13 + (40 * $i), rand(50, imagesy($image) - 10), $col, $font, $char);
- imagecolordeallocate($image, $col);
- }
- imagefilter($image,IMG_FILTER_GAUSSIAN_BLUR);
+ imagesetthickness($image,rand(2,6));
+ $color=imagecolorallocate($image,rand(100,180),rand(100,180),rand(100,180));
+ imageline($image,$i+rand(-10,20),0,$i+rand(-10,20),$height,$color);
+ imagecolordeallocate($image,$color);
+ }
+ for($i=0;$i<$height;$i+=rand(15,25))
+ {
+ imagesetthickness($image,rand(2,6));
+ $color=imagecolorallocate($image,rand(100,180),rand(100,180),rand(100,180));
+ imageline($image,0,$i+rand(-10,20),$width,$i+rand(-10,20),$color);
+ imagecolordeallocate($image,$color);
+ }
+}
- imagepng($image);
- imagedestroy($image);
+function addScribble($image,$width,$height)
+{
+ for($i=0;$i<8;$i++)
+ {
+ $color=imagecolorallocate($image,rand(100,180),rand(100,180),rand(100,180));
+ $points=array();
+ for($j=1;$j<rand(5,10);$j++)
+ {
+ $points[]=rand(2*(20*($i+1)),2*(50*($i+1)));
+ $points[]=rand(30,$height+30);
+ }
+ imagesetthickness($image,rand(2,6));
+ imagepolygon($image,$points,intval(sizeof($points)/2),$color);
+ imagecolordeallocate($image,$color);
+ }
+}
+
+function morphImage($image,$width,$height)
+{
+ $tempImage=imagecreatetruecolor($width,$height);
+ $chunk=rand(1,5);
+ for($x=$y=0;$x<$width;$x+=$chunk)
+ {
+ $chunk=rand(1,5);
+ $y+=rand(-1,1);
+ if($y>=$height) $y=$height-5;
+ if($y<0) $y=5;
+ imagecopy($tempImage,$image,$x,0,$x,$y,$chunk,$height);
+ }
+ for($x=$y=0;$y<$height;$y+=$chunk)
+ {
+ $chunk=rand(1,5);
+ $x+=rand(-1,1);
+ if($x>=$width) $x=$width-5;
+ if($x<0) $x=5;
+ imagecopy($image,$tempImage,$x,$y,0,$y,$width,$chunk);
+ }
}
?> \ No newline at end of file