Location: PHPKode > projects > esoTalk > plugins/Captcha/plugin.php
// Copyright 2009 Simon Zerner, Toby Zerner
// This file is part of esoTalk. Please see the included license file for usage information.

// Captcha plugin: provides image verification during the join process to prevent bots from joining the forum.

if (!defined("IN_ESOTALK")) exit;

class Captcha extends Plugin {
var $id = "Captcha";
var $name = "Captcha";
var $version = "1.0";
var $description = "Provides image verification during the join process to prevent bots from joining the forums";
var $author = "esoTalk team";
var $defaultConfig = array(
	"numberOfCharacters" => 3

function init()
	if ($this->checkEnvironment()) return;
	// Add language definitions and messages.
	$this->esoTalk->addLanguage("Are you human", "Are you human?");
	$this->esoTalk->addLanguage("Type the letters you see", "Type the letters you see in the image");
	$this->esoTalk->addLanguage("Can't make it out", "Can't make it out? <a href='%s'>Try another one!</a>");
	$this->esoTalk->addMessage("captchaError", "warning", "Oops, you got it wrong! Try again with this combination.");
	// Add a hook to the join controller so we can add captcha to the form!
	if ($this->esoTalk->action == "join") $this->esoTalk->controller->addHook("init", array($this, "initCaptchaForm"));

// Check the server environment for errors.
function checkEnvironment()
	global $messages;
	$this->esoTalk->addMessage("gdNotInstalled", "warning", "GD is not installed.");
	$this->esoTalk->addMessage("gdNoSupportOpenType", "warning", "Your version of GD does not support OpenType font rendering.");
	// Check for the gd plugin and support for OpenType font rendering.
	if (!extension_loaded("gd") and !extension_loaded("gd2")) return "gdNotInstalled";
	if (!function_exists("imagettftext")) return "gdNoSupportOpenType";

// When enabling the plugin, return any server environment errors.
function enable()
	return $this->checkEnvironment();

// Add the captcha fieldset and input to the join form.
function initCaptchaForm(&$join)
	global $language;
	$join->addFieldset("areYouHuman", $language["Are you human"], 900);
	$join->addToForm("areYouHuman", array(
		"id" => "captcha",
		"html" => "<label style='width:20em'>{$language["Type the letters you see"]}<br/><small>" . sprintf($language["Can't make it out"], "javascript:getById(\"captchaImg\").src=getById(\"captchaImg\").src.split(\"?\")[0]+\"?\"+(new Date()).getTime();void(0)") . "</small></label> <div><input id='captcha' name='join[captcha]' type='text' class='text' tabindex='500'/><br/><img src='plugins/Captcha/captchaImg.php' style='margin-top:3px' id='captchaImg' alt='Captcha'/></div>",
		"validate" => array($this, "validateCaptcha"),
		"required" => true

// Validate the captcha input.
function validateCaptcha($input)
	if ($_SESSION["captcha"] != md5($input) or !$input) return "captchaError";

// Plugin settings: captcha preview and how many characters to use.
function settings()
	global $config, $language;
	// If there's something wrong with the server environment, output an error.
	if ($msg = $this->checkEnvironment()) return $this->esoTalk->htmlMessage($msg);
	// Add language definitions.
	$this->esoTalk->addLanguage("Sample captcha image", "Sample captcha image");
	$this->esoTalk->addLanguage("Show another one", "Show another one");
	$this->esoTalk->addLanguage("Number of characters", "Number of characters");

	// Generate settings panel HTML.
	$settingsHTML = "<ul class='form'>
	<li><label>{$language["Sample captcha image"]}<br/><small><a href='javascript:getById(\"captchaImg\").src=getById(\"captchaImg\").src.split(\"?\")[0]+\"?\"+(new Date()).getTime();void(0)'>{$language["Show another one"]}</a></small></label> <img src='plugins/Captcha/captchaImg.php?" . time() . "' id='captchaImg' alt='Captcha'/></li>
	<li><label>{$language["Number of characters"]}</label> <input name='Captcha[numberOfCharacters]' type='text' class='text' value='{$config["Captcha"]["numberOfCharacters"]}'/></li>
	<li><label></label> " . $this->esoTalk->skin->button(array("value" => $language["Save changes"], "name" => "saveSettings")) . "</li>
	return $settingsHTML;

// Save the plugin settings.
function saveSettings()
	global $config;
	$config["Captcha"]["numberOfCharacters"] = max(1, min(10, (int)$_POST["Captcha"]["numberOfCharacters"]));
	writeConfigFile("config/Captcha.php", '$config["Captcha"]', $config["Captcha"]);


Return current item: esoTalk