Location: PHPKode > scripts > Admidio > admidio-2.2.9/adm_program/system/classes/captcha.php
<?php
/******************************************************************************
 * Captcha - Klasse
 *
 * Copyright    : (c) 2004 - 2011 The Admidio Team
 * Homepage     : http://www.admidio.org
 * License      : GNU Public License 2 http://www.gnu.org/licenses/gpl-2.0.html
 *
 * Diese Klasse erzeugt ein Captcha-Bildchen und speichert den zu
 * loesenden Code in der Session ab.
 *
 * Erweiterung: Matthias Roberg
 * Die Klasse kann nach Vorgabe auch eine einfache Rechenaufgabe als Captcha
 * erzeugen. Diese wird als reiner Text ausgegeben und ist somit für
 * barriere-freie Seiten geeignet. Der u.g. Ablauf bleibt dabei gleich.
 *
 *
 * Um in einem Formular ein Captcha einzubinden, muss nur diese Datei als
 * Bild eingebunden werden. Zusaetzlich muss natuerlich ein Formularfeld
 * existieren, in das der User den Code eingibt. Die Captcha-Klasse speichert
 * seine eigene Loesung in der SessionVariable $_SESSION['captchacode']. Der
 * vom User eingegebene Code muss nun im aufgerufenen Script verglichen werden.
 *
 * Beispiel:
 *
 * if ( strtoupper($_SESSION['captchacode']) != strtoupper($_POST['captcha']) )
 * {
 *         echo "Das Captcha wurde nicht richtig geloest...";
 * }
 * else
 * {
 *        echo "Das Captcha wurde richtig geloest!";
 * }
 *
 * Wenn die auszuloesende Aktion erfolgreich ausgefuehrt wurde, sollte der
 * CaptchaCode aus der Session geloescht werden, damit man nicht anschliessend
 * erneut das Script aufrufen kann ohne vorher ein neues Captcha geloest zu
 * haben.
 *
 * Zum Beispiel so:
 *
 * // Der CaptchaCode wird bei erfolgreicher Aktion aus der Session geloescht
 * if (isset($_SESSION['captchacode']))
 * {
 *    unset($_SESSION['captchacode']);
 * }
 *
 *****************************************************************************/

// Nur mit einbinden, falls ein Bildchen erzeugt werden soll (dann gibt es immmer einen Type mit dem Wert 'pic')
 if(array_key_exists('type', $_GET))
{
	require_once('../common.php');
}

class Captcha
{
    private $font, $signature, $width, $height, $codeSize, $allowedChars;
    private $backgroundColourR, $backgroundColourG, $backgroundColourB;
    private $backgroundWriting, $backgroundWritingSize;
	private $text_part1,$text_part2,$text_part3_third,$text_part3_half,$text_part4;

    public function __construct()
    {
		global $g_preferences;
		
        // Hier wird jetzt die Schriftart festgelegt. (Standard: Theme)
		if($g_preferences['captcha_fonts'] == 'Theme')
			{$this->font = THEME_SERVER_PATH. '/font.ttf';}
		else
			{$this->font = SERVER_PATH .'/adm_program/system/fonts/'.$g_preferences['captcha_fonts'];}
		
		// Hier wird die Schriftart für die Bildunterschrift festgelegt. (Standard: Theme, nicht wechselbar)
		$this->signature = THEME_SERVER_PATH. '/font.ttf';
		
        // Nun die Bildgroesse des Captchas festlegen
        $this->width = $g_preferences['captcha_width'];
        $this->height = $g_preferences['captcha_height'];

        // Hier wird die Hintergrundfarbe festgelegt. Einzelne RGB-Werte (Umwandlung aus Hex-Wert)
		$color = $g_preferences['captcha_background_color'];
		if($color[0] == '#')
			{$color = substr($color, 1);}
		if(strlen($color) == 6)
			{list($r, $g, $b) = array($color[0].$color[1],$color[2].$color[3],$color[4].$color[5]);}
		elseif(strlen($color) == 3)
			{list($r, $g, $b) = array($color[0].$color[0], $color[1].$color[1], $color[2].$color[2]);}
		$this->backgroundColourR = hexdec($r);
		$this->backgroundColourG = hexdec($g);
		$this->backgroundColourB = hexdec($b);
        
        // Hier wird die Schriftgroesse des CaptchaCodes festgelegt.
        $this->codeSize = $g_preferences['captcha_text_size'];

        // Hier wird der Untertitel festgelegt.
        $this->backgroundWriting = $g_preferences['captcha_signature'];
        $this->backgroundWritingSize = $g_preferences['captcha_signature_font_size'];

        // Diese Zeichen sind erlaubt innerhalb des Captcha-Codes.
        $this->allowedChars = $g_preferences['captcha_signs'];

    }

    public function getCaptcha()
    {
		// erst einmal einen Code generieren
			$this->generateNewCaptchaCode();

			// und hier wird das Captcha generiert und ausgegeben
			$this->makeCaptcha();
    }
	
	public function getCaptchaCalc($text_part1,$text_part2,$text_part3_third,$text_part3_half,$text_part4)
    {
		// Zuweisung der Einstiegsvariablen
		$number = array(rand(40,60),rand(20,40),rand(1,20));
		$operator_value = array();
		$result = $number[0];
		
		// Rechenaufgabe erstellen
		for($count=1;$count<=2;$count++)
		{
			$operator = rand(1,2);
			if($operator == 1)
			{
				$result = $result+$number[$count];
				$operator_value[$count-1] = '+';
			}
			if($operator == 2)
			{
				$result = $result-$number[$count];
				$operator_value[$count-1] = '-';
			}
			if($count==2 && $result<1)
			{
				$count=1;
				$result = $number[0];
			}
		}
		
		// Individualwert dazurechen
		$ready = 0;
		while($ready < 1)
		{
			$number[3] = rand(20,100);
			if(is_int($number[3]/3))
			{
				$operator_value[2] = $text_part3_third;
				$result = $result+($number[3]/3);
				$ready = 1;
			}
			else if(is_int($number[3]/2))
			{
				$operator_value[2] = $text_part3_half;
				$result = $result+($number[3]/2);
				$ready = 1;
			}
		}
		
		// Lösung in der Session speichern
        $_SESSION['captchacode'] = $result;
		
		// Aufgabe ausgeben
		echo "$text_part1 $number[0]$operator_value[0]$number[1]$operator_value[1]$number[2] $text_part2 $operator_value[2] $number[3] $text_part4";
		//echo "<br>= $result (".$_SESSION['captchacode'].")";
    }	


    private function generateNewCaptchaCode()
    {
        // neuen CaptchaCode erzeugen...

        // Hier wird die Anzahl der Captcha-Zeichen festgelegt
        // (das Captcha soll zwischen 4 und 6 Zeichen beinhalten)
        $this->charCount = rand(4,6);

        $this->captchaCode = '';
        for ($i=0; $i < $this->charCount; $i++)
        {
            $this->captchaCode = $this->captchaCode. $this->allowedChars{rand(0,strlen($this->allowedChars)-1)};
        }

        // hier wird der Code jetzt in der Session gespeichert...
        $_SESSION['captchacode'] = $this->captchaCode;
    }


    private function makeCaptcha()
    {

        // ein leeres Bild definieren
        $image = imagecreate($this->width, $this->height);

        // Hintergrundfarbe setzen...
        $background =  imagecolorallocate($image, $this->backgroundColourR, $this->backgroundColourG, $this->backgroundColourB);
        ImageFilledRectangle($image, 0, 0, $this->width, $this->height, $background);

        // Gitter in den Hintergrund zeichnen...
        // erst vertikal...
        for($i=0; $i < $this->width; $i += intval($this->backgroundWritingSize / 2))
        {
            $color    = imagecolorallocate($image, $this->backgroundColourR - 40, $this->backgroundColourG - 40, $this->backgroundColourB - 40);
            imageline($image, $i, 0, $i, $this->height, $color);
        }

        // ...dann horizontal
        for($i=0; $i < $this->height; $i += intval($this->backgroundWritingSize / 2))
        {
            imageline($image, 0, $i, $this->width, $i, $color);
        }

        // Untertitel in das Captcha reinschreiben...
        ImageTTFText($image, $this->backgroundWritingSize, 0, 15, $this->height-5, imagecolorallocate($image, 0, 0, 0), $this->signature, $this->backgroundWriting);



        // Jetzt wird dem Bild der eigentliche CaptchaCode hinzugefuegt...
        $xStartPosition = 15;

        for ($i=0; $i < $this->charCount; $i++)
        {
                $xPosition = intval($xStartPosition + $i * ($this->width / ($this->charCount +1)));

                $text    = substr($this->captchaCode, $i, 1);
                $color    =  imagecolorallocate($image, $this->backgroundColourR - 125, $this->backgroundColourG - 55, $this->backgroundColourB - 90);
                ImageTTFText($image, $this->codeSize, 0, $xPosition, 35, $color, $this->font, $text);
        }

        // Jetzt noch das finale Bild ausgeben...
        header('Content-type: image/png');
        ImagePNG($image);
        ImageDestroy($image);

    }
}

// Wenn ein Bildchen erzeugt werden soll, wird hier die Klasse initialisiert und die Ausgabe angestossen.
if($g_preferences['captcha_type']=='pic')
{
	$captcha = new Captcha();
	$captcha->getCaptcha();
}

?>
Return current item: Admidio