PHP Classes
Icontem

File: class.AbsCaptcha.php


  Search   All class groups All class groups   Latest entries Latest entries   Top 10 charts Top 10 charts   Newsletter Newsletter   Blog Blog   Forums Forums   Help FAQ Help FAQ  
  Login   Register  
Recommend this page to a friend! ReTweet ReTweet Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Costin T  >  AbsCaptcha  >  class.AbsCaptcha.php  
File: class.AbsCaptcha.php
Role: Class source
Content type: text/plain
Description: The base class
Class: AbsCaptcha
Generate CAPTCHA validation images
 

Contents

Class file image Download
<?php
/*
	Changelog
		:: Fri Apr 24, 2009
			I have updated the documentation and the GenerateCaptcha function
			so the session checking is done before generating the captcha image.
*/
/**
* class AbsCaptcha
*
* The AbsCaptcha is a very simple, fully configurable and easy to
* implement class that you can use to generate captcha images.
* While you can change the background color, the text color, the
* width and the height of the image, you cannot change the size of the text.
* It requires the GD library installed and a session started so the
* code from the image can be stored in a session variable.
* This class will regenerate the captcha image for each page request.
*
* Disclaimer:
* This class might not completely stop bots but will definitely
* give them a hard time ;)
*
* @package    AbsCaptcha
* @category   Captcha
* @author     Costin Trifan <costintrifan@yahoo.com>
* @copyright  2009 Costin Trifan
* @licence    http://en.wikipedia.org/wiki/MIT_License   MIT License
* @version    1.0
* 
* Copyright (c) 2009 Costin Trifan <http://june-js.com/>
* 
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
* 
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
final class AbsCaptcha
{
	private function __clone(){}


# PRIVATE PROPERTIES
#==================================

	private
		$sess_name = 'X_CAPTCHA_CODE',	# The name of the session variable that will hold the captcha's generated code
		$save_dir = 'captcha',			# The path to the directory where to store the created captchas(temporary)
		$image_name = 'code_img',		# The name of the captcha image
		$width = 100,					# The width, in pixels, of the captcha image
		$height = 50,					# The height, in pixels, of the captcha image
		$code_length = 6,				# The number of digits and letters to display in the captcha image
		$bgColor = array(0, 0, 0),		# The background color of the captcha image. (r,g,b)
		$fgColor = array(255, 255, 0);	# The image's text color. (r,g,b)
			
		


# PUBLIC METHODS
#==================================

	/**
	* Constructor
	*
	* @param string $captcha_session_name  The name of the session variable that will hold the captcha's generated code. It's important not to use the default assigned name!
	* @param string $save_dir  The path to the directory where to store the created images.
	* @param string $image_name  The name of the image. The image's extension is not required.
	* @param array $image_bg_color  The image's background color.
	* @param array $image_fg_color  The image's text color.
	* @param string $code_length  The number of digits and letters to display in the image.
	* @param string $width  The width, in pixels, of the captcha image.
	* @param string $height  The height, in pixels, of the captcha image.
	*/
	public function __construct( $captcha_session_name='', $save_dir='', $image_name='', $image_bg_color=array(), $image_fg_color=array(), $code_length=NULL, $width=NULL, $height=NULL )
	{
		// GD Library is a MUST !
		if ( !extension_loaded('gd') or !function_exists('gd_info'))
			exit('The <strong>'.__CLASS__.'</strong> class requires the <strong>GD Library</strong> to be able to generate the captcha images!') ;

		$this->SetSessionName($captcha_session_name);
		$this->SetDirectory($save_dir);
		$this->SetImageName($image_name);
		$this->SetImageBgColor($image_bg_color);
		$this->SetImageFgColor($image_fg_color);
		$this->SetCodeLength($code_length);
		$this->SetImageWidth($width);
		$this->SetImageHeight($height);
	}

	/**
	* Create the captcha image.
	* @return boolean
	*/
	public function GenerateCaptcha()
	{
		// update: Fri Apr 24, 2009
		// Makes no sense to generate the image before checking for if the session has been started. (my bad)
		// If the session hasn't been started, the captcha won't work.
		if ( ! isset($_SESSION) )
		exit('Error: The session was not started! The <strong>'.__CLASS__.'</strong> class requires a session to be started in order to function properly!');


		// Create the captcha image
		$captcha = $this->_create_captcha($this->save_dir, $this->image_name, $this->bgColor, $this->width, $this->height);

		// Set the background color for lines
		$line1 		 = @imagecolorallocate($captcha,233,239,239);
		$line2 		 = @imagecolorallocate($captcha, 125, 255, 033);
		$line3 		 = @imagecolorallocate($captcha, 105, 155, 200);
		$line4		 = @imagecolorallocate($captcha, 200, 30, 120);
		$line_yellow = @imagecolorallocate($captcha,255,255,0);
		$line_gray 	 = @imagecolorallocate($captcha, 128, 128, 128);
		$forecolor 	 = @imagecolorallocate($captcha, $this->fgColor[0], $this->fgColor[1], $this->fgColor[2]);
		
		// Draw some lines.
		@imageline($captcha, 0,0,104,129,$line1);
		@imageline($captcha, 10,0,164,129,$line1);
		@imageline($captcha, 50,0,9,139,$line2);
		@imageline($captcha, 70,130,32,32,$line3);
		@imageline($captcha, 80,0,52,52,$line4);
		@imageline($captcha, 90,0,72,72,$line3);
		@imageline($captcha, 84,20,12,72,$line_gray);
		@imageline($captcha, 84,22,13,73,$line_gray);
		@imageline($captcha, 30,0,120,72,$line1);
		@imageline($captcha, 100,122,130,73,$line_gray);
	
		// Generate a random string
		$code = md5(uniqid(rand(), true));
		// cut string to the length of the digits set to be displayed in the image
		$string = strtoupper(substr($code,0,$this->GetCodeLength()));
	
		// Write the string into the image
		@imagestring($captcha, 7, 25, 17, $string, $forecolor);
		
		// Save the new image
		@imagepng($captcha, $this->save_dir.$this->image_name, 9, PNG_ALL_FILTERS);
	
		// Store the code in the SESSION
		//if (isset($_SESSION)) $_SESSION[$this->sess_name] = $string;
		//exit('Error: The session was not started! The <strong>'.__CLASS__.'</strong> class requires a session to be started in order to function properly!');

		// Store the code in the SESSION
		$_SESSION[$this->sess_name] = $string;
	
		return TRUE;
	}


# ACCESSOR/MUTATOR METHODS
#==================================

	/**
	* Set the the name of the session variable that will hold the generated code
	*
	* @param string $sess_name  The name of the session variable that will hold the captcha's generated code
	* @return void
	*/
	public function SetSessionName( $sess_name = '' )
	{
		if ( (strlen(trim($sess_name)) > 0) and !isset($_SESSION[$sess_name]))
			$this->sess_name = $sess_name;
	}

	/**
	* Get the the name of the session variable that holds the generated code
	* @return string
	*/
	public function GetSessionName()
	{
		return $this->sess_name;
	}

	/**
	* Set the background color of the image
	*
	* @param array $image_bg_color  The list of colors(r,g,b) to use to fill the image
	* @return void
	*/
	public function SetImageBgColor( $image_bg_color = array() )
	{
		if (count($image_bg_color) < 1) return;

		if (isset($image_bg_color[0]) and $image_bg_color[0] >= 0)
			$this->bgColor[0] = $image_bg_color[0];
		if (isset($image_bg_color[1]) and $image_bg_color[1] >= 0)
			$this->bgColor[1] = $image_bg_color[1];
		if (isset($image_bg_color[2]) and $image_bg_color[2] >= 0)
			$this->bgColor[2] = $image_bg_color[2];
	}

	/**
	* Set the color of the text that will be displayed in the image
	*
	* @param array $image_fg_color  The list of colors(r,g,b) to use for the text
	* @return void
	*/
	public function SetImageFgColor( $image_fg_color = array() )
	{
		if (count($image_fg_color) < 1) return;

		if (isset($image_fg_color[0]) and $image_fg_color[0] >= 0)
			$this->fgColor[0] = $image_fg_color[0];
		if (isset($image_fg_color[1]) and $image_fg_color[1] >= 0)
			$this->fgColor[1] = $image_fg_color[1];
		if (isset($image_fg_color[2]) and $image_fg_color[2] >= 0)
			$this->fgColor[2] = $image_fg_color[2];
	}

	/**
	* Set the image's code length
	*
	* @param string $length  The number of digits and letters to display in the captcha image 
	* @return void
	*/
	public function SetCodeLength( $length )
	{
		if ( !is_null($length) and $length > 0)
			$this->code_length = $length;
	}

	/**
	* Get the image's code length
	* @return number
	*/
	public function GetCodeLength()
	{
		return $this->code_length;
	}

	/**
	* Set the path to the directory where to save the captcha images
	*
	* @param string $save_dir  The path to the directory where to store the created captchas(temporary)
	* @return void
	*/
	public function SetDirectory( $save_dir = '' )
	{
		if ( ! empty($save_dir))
		{
			if (is_dir($save_dir)) $this->save_dir = $save_dir;
			else {
				if (@mkdir($save_dir)) // try to create the directory
					$this->save_dir = $save_dir;
				else exit('Error: The directory where to store the generated captchas could not be found nor created. Please create it manually!');
			}
		}
	}

	/**
	* Get the path to the directory where to save the captcha image
	* @return string
	*/
	public function GetDirectory()
	{
		return $this->save_dir;
	}

	/**
	* Get the captcha's code stored in the session
	* @return string
	*/
	public function GetCaptchaCode()
	{
		$code = 0;
		if ( isset($_SESSION) and isset($_SESSION[$this->sess_name]))
			$code = $_SESSION[$this->sess_name];
		return $code;
	}

	/**
	* Set the the name and extension of the image
	*
	* @param string $image_name  The name of the captcha image
	* @return void
	*/
	public function SetImageName( $image_name = '' )
	{
		if (strlen(trim($image_name)) > 0)
			$this->image_name = $image_name.'.png';
		else $this->image_name .= '.png';
	}

	/**
	* Get the the name and extension of the image
	* @return string
	*/
	public function GetImageName()
	{
		return $this->image_name;
	}

	/**
	* Set the width of the image
	*
	* @param string $width  In pixels, the width of the captcha image
	* @return void
	*/
	public function SetImageWidth( $width )
	{
		if ( !is_null($width) and $width > 0)
			$this->width = $width;
	}

	/**
	* Get the width of the image
	* @return number
	*/
	public function GetImageWidth()
	{
		return $this->width;
	}

	/**
	* Set the the height of the image
	*
	* @param string $height  In pixels, the height of the captcha image
	* @return void
	*/
	public function SetImageHeight( $height )
	{
		if ( !is_null($height) and $height > 0)
			$this->height = $height;
	}

	/**
	* Get the the height of the image
	* @return number
	*/
	public function GetImageHeight()
	{
		return $this->height;
	}



# PRIVATE (INTERNAL) METHODS
#==================================

	/**
	* Convenient function to create the background support image for captchas
	* @access: internal
	* @return resource  An empty image
	*/
	private function _create_captcha( $save_dir, $image_name, array $bgColor, $width, $height )
	{
		// Create image
		$image = @imagecreatetruecolor($width, $height);

		// Set background color
		$color_background = @imagecolorallocate($image, $bgColor[0], $bgColor[1], $bgColor[2]);

		// Fill the image
		@imagefill($image, 0, 0, $color_background);

		return $image;
	}

}
// >> END
?>

 
  Advertise on this site Advertise on this site   Site map Site map   Statistics Statistics   Site tips Site tips   Privacy policy Privacy policy   Contact Contact  

For more information send a message to :
info at phpclasses dot org.
Copyright (c) Icontem 1999-2009 PHP Classes - PHP Class Scripts
  PHP Book Reviews - Reviews of books and other products