<?php
namespace 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 ) );
}
}
|