1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427:
<?php
class icms_form_elements_captcha_ImageHandler {
private $code;
public $invalid = FALSE;
private $font;
private $spacing;
private $width;
private $height;
public function __construct() {
if (empty($_SESSION['icms_form_elements_captcha_Object_name'])) {
$this->invalid = TRUE;
}
if (!extension_loaded('gd')) {
$this->mode = "bmp";
} else {
$required_functions = array("imagecreatetruecolor", "imagecolorallocate", "imagefilledrectangle", "imagejpeg", "imagedestroy", "imageftbbox");
foreach ($required_functions as $func) {
if (!function_exists($func)) {
$this->mode = "bmp";
break;
}
}
}
}
public function loadImage() {
$this->createCode();
$this->setCode();
$this->createImage();
}
public function createCode() {
global $icmsConfigCaptcha;
if ($this->invalid) {
return;
}
if ($this->mode == "bmp") {
$icmsConfigCaptcha['captcha_num_chars'] = 4;
$this->code = rand(pow(10, $icmsConfigCaptcha['captcha_num_chars'] - 1), (int) (str_pad("9", $icmsConfigCaptcha['captcha_num_chars'], "9")));
} else {
$raw_code = md5(uniqid(mt_rand(), 1));
if (isset($icmsConfigCaptcha['captcha_skip_characters'])) {
$valid_code = str_replace($icmsConfigCaptcha['captcha_skip_characters'], "", $raw_code);
$this->code = substr($valid_code, 0, $icmsConfigCaptcha['captcha_num_chars']);
} else {
$this->code = substr($raw_code, 0, $icmsConfigCaptcha['captcha_num_chars']);
}
if (!$icmsConfigCaptcha['captcha_casesensitive']) {
$this->code = strtoupper($this->code);
}
}
}
public function setCode() {
if ($this->invalid) {
return;
}
$_SESSION['icms_form_elements_captcha_Object_sessioncode'] = strval($this->code);
$maxAttempts = (int) @$_SESSION['icms_form_elements_captcha_Object_maxattempts'];
if (!empty($maxAttempts)) {
$_SESSION['icms_form_elements_captcha_Object_attempt_' . $_SESSION['icms_form_elements_captcha_Object_name']]++;
if ($_SESSION['icms_form_elements_captcha_Object_attempt_' . $_SESSION['icms_form_elements_captcha_Object_name']] > $maxAttempts) {
$this->invalid = TRUE;
}
}
}
public function createImage($file = "") {
if ($this->invalid) {
header("Content-type: image/gif");
readfile(ICMS_ROOT_PATH . "/images/subject/icon2.gif");
return;
}
if ($this->mode == "bmp") {
return $this->createImageBmp();
} else {
return $this->createImageGd();
}
}
public function createImageGd($file = "") {
$this->loadFont();
$this->setImageSize();
$this->oImage = imagecreatetruecolor($this->width, $this->height);
$background = imagecolorallocate($this->oImage, 255, 255, 255);
imagefilledrectangle($this->oImage, 0, 0, $this->width, $this->height, $background);
global $icmsConfigCaptcha;
switch ($icmsConfigCaptcha['captcha_background_type']) {
default:
case 0:
$this->drawBars();
break;
case 1:
$this->drawCircles();
break;
case 2:
$this->drawLines();
break;
case 3:
$this->drawRectangles();
break;
case 4:
$this->drawEllipses();
break;
case 5:
$this->drawPolygons();
break;
case 100:
$this->createFromFile();
break;
}
$this->drawBorder();
$this->drawCode();
if (empty($file)) {
header("Content-type: image/jpeg");
imagejpeg($this->oImage);
} else {
imagejpeg($this->oImage, ICMS_CACHE_PATH . "/captcha/" . $file . ".jpg");
}
imagedestroy($this->oImage);
}
public function _getList($name, $extension = "") {
$items = array();
$file_path = "{$name}";
$files = icms_core_Filesystem::getFileList($file_path);
foreach ($files as $item) {
if (empty($extension) || preg_match("/(\.{$extension})$/i", $item)) {
$items[] = $item;
}
}
if (function_exists("mod_createCacheFile")) {
mod_createCacheFile($items, "captcha_{$name}", "captcha");
}
return $items;
}
public function loadFont() {
$fonts = $this->_getList("fonts", "ttf");
$this->font = "fonts/" . $fonts[array_rand($fonts)];
}
public function setImageSize() {
$MaxCharWidth = 0;
$MaxCharHeight = 0;
$oImage = imagecreatetruecolor(100, 100);
$text_color = imagecolorallocate($oImage, mt_rand(0, 100), mt_rand(0, 100), mt_rand(0, 100));
global $icmsConfigCaptcha;
$FontSize = $icmsConfigCaptcha['captcha_fontsize_max'];
for ($Angle = -30; $Angle <= 30; $Angle++) {
for ($i = 65; $i <= 90; $i++) {
$CharDetails = imageftbbox($FontSize, $Angle, $this->font, chr($i), array());
$_MaxCharWidth = abs($CharDetails[0] + $CharDetails[2]);
if ($_MaxCharWidth > $MaxCharWidth) {
$MaxCharWidth = $_MaxCharWidth;
}
$_MaxCharHeight = abs($CharDetails[1] + $CharDetails[5]);
if ($_MaxCharHeight > $MaxCharHeight) {
$MaxCharHeight = $_MaxCharHeight;
}
}
}
imagedestroy($oImage);
$this->height = $MaxCharHeight + 2;
$this->spacing = (int) (($icmsConfigCaptcha['captcha_num_chars'] * $MaxCharWidth) / $icmsConfigCaptcha['captcha_num_chars']);
$this->width = ($icmsConfigCaptcha['captcha_num_chars'] * $MaxCharWidth) + ($this->spacing/2);
}
public function loadBackground() {
$RandBackground = NULL;
if ($backgrounds = $this->_getList("backgrounds", "(gif|jpg|png)")) {
$RandBackground = "backgrounds/" . $backgrounds[array_rand($backgrounds)];
}
return $RandBackground;
}
public function createFromFile() {
if ($RandImage = $this->loadBackground()) {
$ImageType = @getimagesize($RandImage);
switch (@$ImageType[2]) {
case 1:
$BackgroundImage = imagecreatefromgif($RandImage);
break;
case 2:
$BackgroundImage = imagecreatefromjpeg($RandImage);
break;
case 3:
$BackgroundImage = imagecreatefrompng($RandImage);
break;
}
}
if (!empty($BackgroundImage)) {
imagecopyresized($this->oImage, $BackgroundImage, 0, 0, 0, 0, imagesx($this->oImage), imagesy($this->oImage), imagesx($BackgroundImage), imagesy($BackgroundImage));
imagedestroy($BackgroundImage);
} else {
$this->drawBars();
}
}
public function drawCode() {
global $icmsConfigCaptcha;
for ($i = 0; $i < $icmsConfigCaptcha['captcha_num_chars'] ; $i++) {
$text_color = imagecolorallocate($this->oImage, mt_rand(0, 100), mt_rand(0, 100), mt_rand(0, 100));
$Angle = mt_rand(10, 30);
if (($i % 2)) {
$Angle = mt_rand(-10, -30);
}
$FontSize = mt_rand($icmsConfigCaptcha['captcha_fontsize_min'], $icmsConfigCaptcha['captcha_fontsize_max']);
$CharDetails = imageftbbox($FontSize, $Angle, $this->font, $this->code[$i], array());
$CharHeight = abs($CharDetails[1] + $CharDetails[5]);
$posX = ($this->spacing/2) + ($i * $this->spacing);
$posY = 2 + ($this->height / 2) + ($CharHeight / 4);
imagefttext($this->oImage, $FontSize, $Angle, $posX, $posY, $text_color, $this->font, $this->code[$i], array());
}
}
public function drawBorder() {
$rgb = rand(50, 150);
$border_color = imagecolorallocate($this->oImage, $rgb, $rgb, $rgb);
imagerectangle($this->oImage, 0, 0, $this->width-1, $this->height-1, $border_color);
}
public function drawCircles() {
global $icmsConfigCaptcha;
for ($i = 1; $i <= $icmsConfigCaptcha['captcha_background_num']; $i++) {
$randomcolor = imagecolorallocate($this->oImage , mt_rand(190,255), mt_rand(190,255), mt_rand(190,255));
imagefilledellipse($this->oImage, mt_rand(0,$this->width-10), mt_rand(0,$this->height-3), mt_rand(10,20), mt_rand(20,30),$randomcolor);
}
}
public function drawLines() {
global $icmsConfigCaptcha;
for ($i = 0; $i < $icmsConfigCaptcha['captcha_background_num']; $i++) {
$randomcolor = imagecolorallocate($this->oImage, mt_rand(190,255), mt_rand(190,255), mt_rand(190,255));
imageline($this->oImage, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $randomcolor);
}
}
public function drawRectangles() {
global $icmsConfigCaptcha;
for ($i = 1; $i <= $icmsConfigCaptcha['captcha_background_num']; $i++) {
$randomcolor = imagecolorallocate($this->oImage , mt_rand(190,255), mt_rand(190,255), mt_rand(190,255));
imagefilledrectangle($this->oImage, mt_rand(0,$this->width), mt_rand(0,$this->height), mt_rand(0, $this->width), mt_rand(0,$this->height), $randomcolor);
}
}
public function drawBars() {
for ($i= 0 ; $i <= $this->height;) {
$randomcolor = imagecolorallocate($this->oImage , mt_rand(190,255), mt_rand(190,255), mt_rand(190,255));
imageline($this->oImage, 0, $i, $this->width, $i, $randomcolor);
$i = $i + 2.5;
}
for ($i = 0;$i <= $this->width;) {
$randomcolor = imagecolorallocate($this->oImage , mt_rand(190,255), mt_rand(190,255), mt_rand(190,255));
imageline($this->oImage, $i, 0, $i, $this->height, $randomcolor);
$i = $i + 2.5;
}
}
public function drawEllipses() {
global $icmsConfigCaptcha;
for ($i = 1; $i <= $icmsConfigCaptcha['captcha_background_num']; $i++) {
$randomcolor = imagecolorallocate ($this->oImage , mt_rand(190,255), mt_rand(190,255), mt_rand(190,255));
imageellipse($this->oImage, mt_rand(0,$this->width), mt_rand(0,$this->height), mt_rand(0,$this->width), mt_rand(0,$this->height), $randomcolor);
}
}
public function drawPolygons() {
global $icmsConfigCaptcha;
for ($i = 1; $i <= $icmsConfigCaptcha['captcha_background_num']; $i++) {
$randomcolor = imagecolorallocate ($this->oImage , mt_rand(190,255), mt_rand(190,255), mt_rand(190,255));
$coords = array();
for ($j=1; $j <= $icmsConfigCaptcha['captcha_polygon_point']; $j++) {
$coords[] = mt_rand(0,$this->width);
$coords[] = mt_rand(0,$this->height);
}
imagefilledpolygon($this->oImage, $coords, $icmsConfigCaptcha['captcha_polygon_point'], $randomcolor);
}
}
public function createImageBmp($file = "") {
$image = "";
if (empty($file)) {
header("Content-type: image/bmp");
echo $image;
} else {
return $image;
}
}
}