<?php if (!defined('PmWiki')) exit(); /* Copyright 2007 Patrick R. Michaud (pmichaud@pobox.com) This file is part of PmWiki; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See pmwiki.php for full details. Script maintained by Petko YOTOV www.pmwiki.org/petko */ $RecipeInfo['Captcha']['Version'] = '20151002'; SDV($CaptchaValue, rand(1000, 9999)); SDV($CaptchaName, 'response'); SDV($EnableCaptchaImage, (int)function_exists('imagecreatetruecolor')); SDV($FmtPV['$CaptchaKey'], "\$GLOBALS['CaptchaKey']"); SDV($FmtPV['$CaptchaValue'], 'CaptchaValue()'); SDV($FmtPV['$Captcha'], 'CaptchaFn($pn)'); SDV($Conditions['captcha'], '(boolean)IsCaptcha()'); SDVA($InputTags['captcha'], array( ':fn' => 'InputCaptcha', ':html' => "<input type='hidden' name='captchakey' value='\$CaptchaKey' /><input type='text' \$InputFormArgs />", ':args' => array('value'), 'size' => 5, 'autocomplete' => 'off', 'name' => $CaptchaName, )); array_unshift($EditFunctions, 'RequireCaptcha'); function RequireCaptcha($pagename, $page, $new) { global $EnablePostCaptchaRequired, $MessagesFmt, $CaptchaRequiredFmt, $EnablePost; if (!IsEnabled($EnablePostCaptchaRequired, 0)) return; if (IsCaptcha()) return; SDV($CaptchaRequiredFmt, "<div class='wikimessage'>$[Must enter valid code]</div>"); $MessagesFmt[] = $CaptchaRequiredFmt; $EnablePost = 0; } function IsCaptcha() { global $IsCaptcha, $CaptchaName, $EnableCaptchaSession; if (isset($IsCaptcha)) return $IsCaptcha; $key = @$_POST['captchakey']; $resp = @$_POST[$CaptchaName]; $sid = session_id(); @session_start(); if ($key && $resp && @$_SESSION['captcha-challenges'][$key] == $resp) $IsCaptcha = 1; if (IsEnabled($EnableCaptchaSession, 0)) { $IsCaptcha |= @$_SESSION['iscaptcha']; @$_SESSION['iscaptcha'] = $IsCaptcha; } $IsCaptcha = (int)@$IsCaptcha; if (!$sid) session_write_close(); return $IsCaptcha; } function InputCaptcha($pagename, $type, $args) { CaptchaValue(); return Keep(InputToHTML($pagename, $type, $args, $opt)); } function CaptchaValue() { global $CaptchaKey, $CaptchaValue; if ($CaptchaKey > '' && @$_SESSION['captcha-challenges'][$CaptchaKey] == $CaptchaValue) return $CaptchaValue; $sid = session_id(); @session_start(); if ($CaptchaKey == '') $CaptchaKey = count(@$_SESSION['captcha-challenges']); $_SESSION['captcha-challenges'][$CaptchaKey] = $CaptchaValue; if (!$sid) session_write_close(); return $CaptchaValue; } function CaptchaFn($pagename) { global $CaptchaChallenge, $EnableCaptchaImage; if (@$CaptchaChallenge) return $CaptchaChallenge; if ($EnableCaptchaImage) return CaptchaImage($pagename); return CaptchaValue(); } function CaptchaImage($pagename) { global $CaptchaKey,$CaptchaImage, $CaptchaImageFmt; CaptchaValue(); $key = @$CaptchaKey; if ($key == '') return ''; @session_start(); $value = @$_SESSION['captcha-challenges'][$key]; if (!$value) return ''; $width = 60; $height = 22; $fontwidth = 10; $fontheight = 14; $img = imagecreatetruecolor($width, $height); $white = imagecolorallocate($img, 240, 240, 240); imagefilledrectangle($img, 0, 0, $width, $height, $white); imagealphablending($img, 1); imagecolortransparent($img); for($i=0; $i < 100; $i++) { $r = rand(200, 255); $g = rand(200, 255); $b = rand(200, 255); $color = imagecolorallocate($img, $r, $g, $b); imagefilledellipse($img, round(rand(0, $width)), round(rand(0, $height)), round(rand(0, $width/8)), round(rand(0, $height/4)), $color); } $vlen = strlen($value); $x = rand(2, $width/$vlen); for($i=0; $i < $vlen; $i++) { $y = rand(2, $height - $fontheight - 2); $r = rand(0, 150); $g = rand(0, 150); $b = rand(0, 150); $fg = imagecolorallocatealpha($img, $r, $g, $b, 30); $c = substr($value, $i, 1); imagechar($img, 5, $x, $y, $c, $fg); $x += rand($fontwidth + 2, ($width-$x)/($vlen-$i)); } ob_start(); imagejpeg($img); $jpgimg = ob_get_contents(); ob_end_clean(); $base64img = base64_encode($jpgimg); $imgstr = "data:image/jpg;base64,".$base64img; SDV($CaptchaImageFmt, "<img src='".$imgstr."' border='0' align='top' />"); return Keep(FmtPageName($CaptchaImageFmt, $pagename)); }