securimage support as an alternative captcha
This commit is contained in:
parent
6ae4c69358
commit
3bb3ee2e86
4 changed files with 90 additions and 33 deletions
|
@ -1,4 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
require_once "lib/recaptchalib.php";
|
||||||
|
require_once "lib/securimage/securimage.php";
|
||||||
|
|
||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
|
||||||
* Input / Output Sanitising *
|
* Input / Output Sanitising *
|
||||||
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
@ -208,6 +211,60 @@ function theme_file($filepath) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
|
||||||
|
* CAPTCHA abstraction *
|
||||||
|
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
|
||||||
|
function captcha_get_html() {
|
||||||
|
global $config, $user;
|
||||||
|
$captcha = "";
|
||||||
|
if($user->is_anonymous()) {
|
||||||
|
$rpk = $config->get_string("api_recaptcha_pubkey");
|
||||||
|
if(!empty($rpk)) {
|
||||||
|
$captcha = recaptcha_get_html($rpk);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
session_start();
|
||||||
|
$securimg = new Securimage();
|
||||||
|
$base = get_base_href();
|
||||||
|
$captcha = "<br/><img src='$base/lib/securimage/securimage_show.php?sid=". md5(uniqid(time())) ."'>".
|
||||||
|
"<br/>CAPTCHA: <input type='text' name='code' value='' />";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $captcha;
|
||||||
|
}
|
||||||
|
|
||||||
|
function captcha_check() {
|
||||||
|
global $config, $user;
|
||||||
|
|
||||||
|
if($user->is_anonymous()) {
|
||||||
|
$rpk = $config->get_string('api_recaptcha_privkey');
|
||||||
|
if(!empty($rpk)) {
|
||||||
|
$resp = recaptcha_check_answer(
|
||||||
|
$rpk,
|
||||||
|
$_SERVER["REMOTE_ADDR"],
|
||||||
|
$_POST["recaptcha_challenge_field"],
|
||||||
|
$_POST["recaptcha_response_field"]);
|
||||||
|
|
||||||
|
if(!$resp->is_valid) {
|
||||||
|
log_info("core", "Captcha failed (ReCaptcha): " . $resp->error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
session_start();
|
||||||
|
$securimg = new Securimage();
|
||||||
|
if($securimg->check($_POST['code']) == false) {
|
||||||
|
log_info("core", "Captcha failed (Securimage)");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
|
||||||
* Misc *
|
* Misc *
|
||||||
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
<?php
|
<?php
|
||||||
require_once "lib/akismet.class.php";
|
require_once "lib/akismet.class.php";
|
||||||
require_once "lib/recaptchalib.php";
|
|
||||||
|
|
||||||
class CommentPostingEvent extends Event {
|
class CommentPostingEvent extends Event {
|
||||||
var $image_id, $user, $comment;
|
var $image_id, $user, $comment;
|
||||||
|
@ -53,6 +52,7 @@ class CommentList extends SimpleExtension {
|
||||||
$config->set_default_int('comment_limit', 10);
|
$config->set_default_int('comment_limit', 10);
|
||||||
$config->set_default_int('comment_list_count', 10);
|
$config->set_default_int('comment_list_count', 10);
|
||||||
$config->set_default_int('comment_count', 5);
|
$config->set_default_int('comment_count', 5);
|
||||||
|
$config->set_default_bool('comment_captcha', false);
|
||||||
|
|
||||||
if($config->get_int("ext_comments_version") < 2) {
|
if($config->get_int("ext_comments_version") < 2) {
|
||||||
// shortcut to latest
|
// shortcut to latest
|
||||||
|
@ -182,6 +182,7 @@ class CommentList extends SimpleExtension {
|
||||||
public function onSetupBuilding($event) {
|
public function onSetupBuilding($event) {
|
||||||
$sb = new SetupBlock("Comment Options");
|
$sb = new SetupBlock("Comment Options");
|
||||||
$sb->add_bool_option("comment_anon", "Allow anonymous comments: ");
|
$sb->add_bool_option("comment_anon", "Allow anonymous comments: ");
|
||||||
|
$sb->add_bool_option("comment_captcha", "<br>Require CAPTCHA for anonymous comments: ");
|
||||||
$sb->add_label("<br>Limit to ");
|
$sb->add_label("<br>Limit to ");
|
||||||
$sb->add_int_option("comment_limit");
|
$sb->add_int_option("comment_limit");
|
||||||
$sb->add_label(" comments per ");
|
$sb->add_label(" comments per ");
|
||||||
|
@ -336,25 +337,6 @@ class CommentList extends SimpleExtension {
|
||||||
return md5($_SERVER['REMOTE_ADDR'] . date("%Y%m%d"));
|
return md5($_SERVER['REMOTE_ADDR'] . date("%Y%m%d"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private function is_spam_recaptcha($text) {
|
|
||||||
global $config, $user;
|
|
||||||
|
|
||||||
if(strlen($config->get_string('api_recaptcha_privkey')) > 0) {
|
|
||||||
$resp = recaptcha_check_answer(
|
|
||||||
$config->get_string('api_recaptcha_privkey'),
|
|
||||||
$_SERVER["REMOTE_ADDR"],
|
|
||||||
$_POST["recaptcha_challenge_field"],
|
|
||||||
$_POST["recaptcha_response_field"]);
|
|
||||||
|
|
||||||
if(!$resp->is_valid) {
|
|
||||||
log_info("comment", "Captcha failed: " . $resp->error);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function is_spam_akismet($text) {
|
private function is_spam_akismet($text) {
|
||||||
global $config, $user;
|
global $config, $user;
|
||||||
if(strlen($config->get_string('comment_wordpress_key')) > 0) {
|
if(strlen($config->get_string('comment_wordpress_key')) > 0) {
|
||||||
|
@ -430,7 +412,7 @@ class CommentList extends SimpleExtension {
|
||||||
}
|
}
|
||||||
|
|
||||||
// rate-limited external service checks last
|
// rate-limited external service checks last
|
||||||
else if($user->is_anonymous() && $this->is_spam_recaptcha($comment)) {
|
else if($config->get_bool('comment_captcha') && !captcha_check()) {
|
||||||
throw new CommentPostingException("Error in captcha");
|
throw new CommentPostingException("Error in captcha");
|
||||||
}
|
}
|
||||||
else if($user->is_anonymous() && $this->is_spam_akismet($comment)) {
|
else if($user->is_anonymous() && $this->is_spam_akismet($comment)) {
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
class CommentListTheme extends Themelet {
|
class CommentListTheme extends Themelet {
|
||||||
var $comments_shown = 0;
|
var $comments_shown = 0;
|
||||||
|
|
||||||
|
@ -8,7 +7,7 @@ class CommentListTheme extends Themelet {
|
||||||
* the image's comments
|
* the image's comments
|
||||||
*/
|
*/
|
||||||
public function display_comment_list($images, $page_number, $total_pages, $can_post) {
|
public function display_comment_list($images, $page_number, $total_pages, $can_post) {
|
||||||
global $config, $page;
|
global $config, $page, $user;
|
||||||
|
|
||||||
// aaaaaaargh php
|
// aaaaaaargh php
|
||||||
assert(is_array($images));
|
assert(is_array($images));
|
||||||
|
@ -52,8 +51,19 @@ class CommentListTheme extends Themelet {
|
||||||
foreach($comments as $comment) {
|
foreach($comments as $comment) {
|
||||||
$comment_html .= $this->comment_to_html($comment);
|
$comment_html .= $this->comment_to_html($comment);
|
||||||
}
|
}
|
||||||
if($can_post) {
|
if(!$user->is_anonymous()) {
|
||||||
$comment_html .= $this->build_postbox($image->id);
|
if($can_post) {
|
||||||
|
$comment_html .= $this->build_postbox($image->id);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($can_post) {
|
||||||
|
if(!$config->get_bool('comment_captcha')) {
|
||||||
|
$comment_html .= $this->build_postbox($image->id);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$comment_html .= "<a href='".make_link("post/view/".$image->id)."'>Add Comment</a>";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$html = "
|
$html = "
|
||||||
|
@ -145,20 +155,18 @@ class CommentListTheme extends Themelet {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function build_postbox($image_id) {
|
protected function build_postbox($image_id) {
|
||||||
global $config, $user;
|
global $config;
|
||||||
|
|
||||||
$i_image_id = int_escape($image_id);
|
$i_image_id = int_escape($image_id);
|
||||||
$hash = CommentList::get_hash();
|
$hash = CommentList::get_hash();
|
||||||
|
$captcha = $config->get_bool("comment_captcha") ? captcha_get_html() : "";
|
||||||
|
|
||||||
$rpk = $config->get_string("api_recaptcha_pubkey");
|
|
||||||
$reca = (!$user->is_anonymous() || empty($rpk)) ?
|
|
||||||
"" : recaptcha_get_html($rpk);
|
|
||||||
return "
|
return "
|
||||||
<form action='".make_link("comment/add")."' method='POST'>
|
<form name='comment_form' action='".make_link("comment/add")."' method='POST'>
|
||||||
<input type='hidden' name='image_id' value='$i_image_id' />
|
<input type='hidden' name='image_id' value='$i_image_id' />
|
||||||
<input type='hidden' name='hash' value='$hash' />
|
<input type='hidden' name='hash' value='$hash' />
|
||||||
<textarea name='comment' rows='5' cols='50'></textarea>
|
<textarea name='comment' rows='5' cols='50'></textarea>
|
||||||
$reca
|
$captcha
|
||||||
<br><input type='submit' value='Post Comment' />
|
<br><input type='submit' value='Post Comment' />
|
||||||
</form>
|
</form>
|
||||||
";
|
";
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
class CustomCommentListTheme extends CommentListTheme {
|
class CustomCommentListTheme extends CommentListTheme {
|
||||||
public function display_comment_list($images, $page_number, $total_pages, $can_post) {
|
public function display_comment_list($images, $page_number, $total_pages, $can_post) {
|
||||||
global $config, $page;
|
global $config, $page, $user;
|
||||||
|
|
||||||
$page->disable_left();
|
$page->disable_left();
|
||||||
|
|
||||||
|
@ -52,7 +52,17 @@ class CustomCommentListTheme extends CommentListTheme {
|
||||||
$comment_html .= $this->comment_to_html($comment);
|
$comment_html .= $this->comment_to_html($comment);
|
||||||
}
|
}
|
||||||
if($can_post) {
|
if($can_post) {
|
||||||
$comment_html .= $this->build_postbox($image->id);
|
if(!$user->is_anonymous()) {
|
||||||
|
$comment_html .= $this->build_postbox($image->id);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(!$config->get_bool('comment_captcha')) {
|
||||||
|
$comment_html .= $this->build_postbox($image->id);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$comment_html .= "<a href='".make_link("post/view/".$image->id)."'>Add Comment</a>";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$html = "
|
$html = "
|
||||||
|
|
Reference in a new issue