mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-05-10 04:24:14 +09:00
Split reCAPTCHA addon into main script and class file
This commit is contained in:
parent
065d295011
commit
9672060be8
3 changed files with 158 additions and 40 deletions
|
|
@ -19,6 +19,78 @@
|
||||||
<title xml:lang="ko">Secret Key</title>
|
<title xml:lang="ko">Secret Key</title>
|
||||||
<title xml:lang="en">Secret Key</title>
|
<title xml:lang="en">Secret Key</title>
|
||||||
</var>
|
</var>
|
||||||
|
<var name="use_signup" type="select">
|
||||||
|
<title xml:lang="ko">회원가입에 사용</title>
|
||||||
|
<title xml:lang="en">Use on Signup Form</title>
|
||||||
|
<options value="Y">
|
||||||
|
<title xml:lang="ko">예</title>
|
||||||
|
<title xml:lang="en">Yes</title>
|
||||||
|
</options>
|
||||||
|
<options value="N">
|
||||||
|
<title xml:lang="ko">아니오</title>
|
||||||
|
<title xml:lang="en">No</title>
|
||||||
|
</options>
|
||||||
|
</var>
|
||||||
|
<var name="use_recovery" type="select">
|
||||||
|
<title xml:lang="ko">ID/PW찾기에 사용</title>
|
||||||
|
<title xml:lang="en">Use on Account Recovery Form</title>
|
||||||
|
<options value="Y">
|
||||||
|
<title xml:lang="ko">예</title>
|
||||||
|
<title xml:lang="en">Yes</title>
|
||||||
|
</options>
|
||||||
|
<options value="N">
|
||||||
|
<title xml:lang="ko">아니오</title>
|
||||||
|
<title xml:lang="en">No</title>
|
||||||
|
</options>
|
||||||
|
</var>
|
||||||
|
<var name="use_document" type="select">
|
||||||
|
<title xml:lang="ko">글쓰기에 사용</title>
|
||||||
|
<title xml:lang="en">Use on New Document</title>
|
||||||
|
<options value="N">
|
||||||
|
<title xml:lang="ko">아니오</title>
|
||||||
|
<title xml:lang="en">No</title>
|
||||||
|
</options>
|
||||||
|
<options value="Y">
|
||||||
|
<title xml:lang="ko">예</title>
|
||||||
|
<title xml:lang="en">Yes</title>
|
||||||
|
</options>
|
||||||
|
</var>
|
||||||
|
<var name="use_comment" type="select">
|
||||||
|
<title xml:lang="ko">댓글쓰기에 사용</title>
|
||||||
|
<title xml:lang="en">Use on New Comment</title>
|
||||||
|
<options value="N">
|
||||||
|
<title xml:lang="ko">아니오</title>
|
||||||
|
<title xml:lang="en">No</title>
|
||||||
|
</options>
|
||||||
|
<options value="Y">
|
||||||
|
<title xml:lang="ko">예</title>
|
||||||
|
<title xml:lang="en">Yes</title>
|
||||||
|
</options>
|
||||||
|
</var>
|
||||||
|
<var name="target_users" type="select">
|
||||||
|
<title xml:lang="ko">사용 대상</title>
|
||||||
|
<title xml:lang="en">Target Users</title>
|
||||||
|
<options value="non_members">
|
||||||
|
<title xml:lang="ko">비회원만 사용</title>
|
||||||
|
<title xml:lang="en">Non-members Only</title>
|
||||||
|
</options>
|
||||||
|
<options value="everyone">
|
||||||
|
<title xml:lang="ko">모든 방문자에게 사용</title>
|
||||||
|
<title xml:lang="en">Everyone</title>
|
||||||
|
</options>
|
||||||
|
</var>
|
||||||
|
<var name="target_frequency" type="select">
|
||||||
|
<title xml:lang="ko">사용 빈도</title>
|
||||||
|
<title xml:lang="en">Target Frequency</title>
|
||||||
|
<options value="every_time">
|
||||||
|
<title xml:lang="ko">매번 사용</title>
|
||||||
|
<title xml:lang="en">Every Time</title>
|
||||||
|
</options>
|
||||||
|
<options value="first_time_only">
|
||||||
|
<title xml:lang="ko">방문자당 최초 1회만 사용</title>
|
||||||
|
<title xml:lang="en">First Time Only</title>
|
||||||
|
</options>
|
||||||
|
</var>
|
||||||
<var name="theme" type="select">
|
<var name="theme" type="select">
|
||||||
<title xml:lang="ko">테마</title>
|
<title xml:lang="ko">테마</title>
|
||||||
<title xml:lang="en">Theme</title>
|
<title xml:lang="en">Theme</title>
|
||||||
|
|
|
||||||
|
|
@ -5,48 +5,34 @@ if (!defined('RX_BASEDIR') || !$addon_info->site_key || !$addon_info->secret_key
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (preg_match('/^dispMemberSignUp/i', Context::get('act')))
|
if ($addon_info->use_signup === 'Y' && preg_match('/^(?:disp|proc)Member(?:SignUp|Insert)/i', Context::get('act')))
|
||||||
{
|
{
|
||||||
getController('module')->addTriggerFunction('moduleObject.proc', 'after', function() use($addon_info) {
|
$enable_captcha = true;
|
||||||
$html = '<div class="g-recaptcha" data-sitekey="%s" data-theme="%s" data-size="%s"></div>';
|
}
|
||||||
$html = sprintf($html, escape($addon_info->site_key), $addon_info->theme ?: 'light', $addon_info->size ?: 'normal');
|
if ($addon_info->use_recovery === 'Y' && preg_match('/^(?:disp|proc)Member(?:FindAccount|ResendAuthMail)/i', Context::get('act')))
|
||||||
Context::addHtmlHeader('<script src="https://www.google.com/recaptcha/api.js" async defer></script>');
|
{
|
||||||
Context::getInstance()->formTags[] = (object)array(
|
$enable_captcha = true;
|
||||||
'name' => 'recaptcha',
|
}
|
||||||
'title' => 'reCAPTCHA',
|
else
|
||||||
'inputTag' => $html,
|
{
|
||||||
);
|
$enable_captcha = false;
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (preg_match('/^procMemberInsert/i', Context::get('act')))
|
if ($enable_captcha)
|
||||||
{
|
{
|
||||||
getController('module')->addTriggerFunction('moduleObject.proc', 'before', function() use($addon_info) {
|
include_once __DIR__ . '/recaptcha.class.php';
|
||||||
$response = Context::get('g-recaptcha-response');
|
reCAPTCHA::init($addon_info);
|
||||||
if (!$response)
|
|
||||||
{
|
|
||||||
return new Object(-1, lang('recaptcha.msg_recaptcha_invalid_response'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$verify_url = 'https://www.google.com/recaptcha/api/siteverify';
|
if (strncasecmp('proc', Context::get('act'), 4) === 0)
|
||||||
$verify_request = \Requests::post($recaptcha_verify_url, array(), array(
|
|
||||||
'secret' => $addon_info->secret_key,
|
|
||||||
'response' => $recaptcha_response,
|
|
||||||
'remoteip' => \RX_CLIENT_IP,
|
|
||||||
));
|
|
||||||
|
|
||||||
$verify = @json_decode($verify_request->body, true);
|
|
||||||
if ($verify && isset($verify['error-codes']) && in_array('invalid-input-response', $verify['error-codes']))
|
|
||||||
{
|
{
|
||||||
return new Object(-1, lang('recaptcha.msg_recaptcha_invalid_response'));
|
getController('module')->addTriggerFunction('moduleObject.proc', 'before', 'reCAPTCHA::check');
|
||||||
}
|
|
||||||
elseif (!$verify || !$verify['success'] || (isset($verify['error-codes']) && $verify['error-codes']))
|
|
||||||
{
|
|
||||||
return new Object(-1, lang('recaptcha.msg_recaptcha_server_error'));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return true;
|
Context::set('captcha', new reCAPTCHA());
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
60
addons/recaptcha/recaptcha.class.php
Normal file
60
addons/recaptcha/recaptcha.class.php
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class reCAPTCHA
|
||||||
|
{
|
||||||
|
protected static $verify = 'https://www.google.com/recaptcha/api/siteverify';
|
||||||
|
protected static $config = null;
|
||||||
|
protected static $script_added = false;
|
||||||
|
|
||||||
|
public static function init($config)
|
||||||
|
{
|
||||||
|
self::$config = $config;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function check()
|
||||||
|
{
|
||||||
|
$response = Context::get('g-recaptcha-response');
|
||||||
|
if (!$response)
|
||||||
|
{
|
||||||
|
return new Object(-1, lang('recaptcha.msg_recaptcha_invalid_response'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$verify_request = \Requests::post(self::$verify, array(), array(
|
||||||
|
'secret' => self::$config->secret_key,
|
||||||
|
'response' => $response,
|
||||||
|
'remoteip' => \RX_CLIENT_IP,
|
||||||
|
));
|
||||||
|
|
||||||
|
$verify = @json_decode($verify_request->body, true);
|
||||||
|
if ($verify && isset($verify['error-codes']) && in_array('invalid-input-response', $verify['error-codes']))
|
||||||
|
{
|
||||||
|
return new Object(-1, lang('recaptcha.msg_recaptcha_invalid_response'));
|
||||||
|
}
|
||||||
|
elseif (!$verify || !$verify['success'] || (isset($verify['error-codes']) && $verify['error-codes']))
|
||||||
|
{
|
||||||
|
return new Object(-1, lang('recaptcha.msg_recaptcha_server_error'));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __toString()
|
||||||
|
{
|
||||||
|
if (!self::$config)
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!self::$script_added)
|
||||||
|
{
|
||||||
|
Context::addHtmlFooter('<script src="https://www.google.com/recaptcha/api.js" async defer></script>');
|
||||||
|
self::$script_added = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$html = '<div class="g-recaptcha" data-sitekey="%s" data-theme="%s" data-size="%s"></div>';
|
||||||
|
$html = sprintf($html, escape(self::$config->site_key), self::$config->theme ?: 'light', self::$config->size ?: 'normal');
|
||||||
|
return $html;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue