| 
<?phpnamespace Jackbooted\Security;
 
 use \Jackbooted\Config\Cfg;
 use \Jackbooted\Forms\Request;
 use \Jackbooted\Forms\Response;
 use \Jackbooted\Html\WebPage;
 use \Jackbooted\Security\Password;
 /**
 * @copyright Confidential and copyright (c) 2016 Jackbooted Software. All rights reserved.
 *
 * Written by Brett Dutton of Jackbooted Software
 * brett at brettdutton dot com
 *
 * This software is written and distributed under the GNU General Public
 * License which means that its source code is freely-distributed and
 * available to the general public.
 */
 
 class Captcha extends WebPage {
 private $value;
 private $hatch;
 
 public function __construct ( $value=null, $hatch=14 ) {
 parent::__construct();
 $this->value     = ( $value == null ) ? Password::passGen ( 6, Password::UPPER_ALPHA ) : $value;
 $this->hatch     = $hatch;
 }
 
 public function imageUrl () {
 $resp = new Response ();
 $url = Cfg::siteUrl () . '/ajax.php?' .
 Response::factory ()
 ->action ( __CLASS__ . '::img()' )
 ->set ( '_CP1', $this->value )
 ->set ( '_CP4', $this->hatch )
 ->toUrl ( Response::UNIQUE_CSRF );
 
 return $url;
 }
 
 public function getValue () {
 return $this->value;
 }
 
 public static function img () {
 header ( 'Expires: Mon, 26 Jul 1997 05:00:00 GMT' );
 header ( 'Last-Modified: ' . gmdate ( 'D, d M Y H:i:s' ) . ' GMT' );
 header ( 'Cache-Control: no-store, no-cache, must-revalidate' );
 header ( 'Cache-Control: post-check=0, pre-check=0', false );
 header ( 'Pragma: no-cache' );
 header ( 'Content-type: image/jpeg' );
 
 $captchaValue = Request::get ( '_CP1' );
 $hatch        = Request::get ( '_CP4' );
 
 $fontAngle = 0.0;
 //$fontFile  = dirname ( __FILE__ ) . '/fonts/luggerbu.ttf';
 //$fontFile  = dirname ( __FILE__ ) . '/fonts/Alanden_.ttf';
 $fontFile  = dirname ( __FILE__ ) . '/fonts/WAVY.TTF';
 $fontSize  = 16.0;
 
 $box = imagettfbbox ( $fontSize, $fontAngle,  $fontFile, $captchaValue );
 $min_x = min (  [ $box[0], $box[2], $box[4], $box[6] ] );
 $max_x = max (  [ $box[0], $box[2], $box[4], $box[6] ] );
 $min_y = min (  [ $box[1], $box[3], $box[5], $box[7] ] );
 $max_y = max (  [ $box[1], $box[3], $box[5], $box[7] ] );
 $w     = ( $max_x - $min_x ) * 1.1;
 $h     = ( $max_y - $min_y ) * 1.4;
 
 $im = imagecreatetruecolor ( $w, $h ) or die ( 'Cannot Initialize new GD image stream' );
 $background_color = imagecolorallocate ( $im, 50, 50, 50 );
 
 // Write the text
 imagettftext ( $im, $fontSize, $fontAngle, 4, $h - 4, self::textColor ( $im ), $fontFile, $captchaValue );
 
 // Hatch
 for ( $i=-$h; $i<$w; $i+=$hatch ) {
 imageline ( $im, $i, 0,  $i + $h, $h, self::lineColor ( $im ) );
 imageline ( $im, $i, $h, $i + $h, 0,  self::lineColor ( $im ) );
 }
 
 // Output
 imagejpeg ( $im );
 imagedestroy ( $im );
 exit;
 }
 
 private static function lineColor ( $im ) {
 $lo = 70;
 $hi = 255;
 return imagecolorallocate ( $im, rand ( $lo, $hi ), rand ( $lo, $hi ), rand ( $lo, $hi ) );
 }
 private static function textColor ( $im ) {
 $lo = 210;
 $hi = 255;
 return imagecolorallocate ( $im, rand ( $lo, $hi ), rand ( $lo, $hi ), rand ( $lo, $hi ) );
 }
 }
 
 |