From bfc212cc096fb28e7b35b0fe352d05fce2bac856 Mon Sep 17 00:00:00 2001 From: Kijin Sung Date: Thu, 26 May 2016 22:52:19 +0900 Subject: [PATCH] Add reCAPTCHA addon for signup page --- addons/recaptcha/conf/info.xml | 47 ++++++++++++++++ addons/recaptcha/lang/en.php | 3 ++ addons/recaptcha/lang/ko.php | 3 ++ addons/recaptcha/recaptcha.addon.php | 53 +++++++++++++++++++ classes/module/ModuleHandler.class.php | 2 +- modules/member/skins/default/signup_form.html | 2 +- 6 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 addons/recaptcha/conf/info.xml create mode 100644 addons/recaptcha/lang/en.php create mode 100644 addons/recaptcha/lang/ko.php create mode 100644 addons/recaptcha/recaptcha.addon.php diff --git a/addons/recaptcha/conf/info.xml b/addons/recaptcha/conf/info.xml new file mode 100644 index 000000000..06cc0b7e2 --- /dev/null +++ b/addons/recaptcha/conf/info.xml @@ -0,0 +1,47 @@ + + + reCAPTCHA + reCAPTCHA + 구글 reCAPTCHA 서비스를 사용하여 자동 가입 스팸을 방지합니다. + Prevent automated signups and spam with Google's reCAPTCHA service. + 1.0.0 + 2016-05-27 + + Kijin Sung + Kijin Sung + + + + Site Key + Site Key + + + Secret Key + Secret Key + + + 테마 + Theme + + 밝은 테마 + Light + + + 어두운 테마 + Dark + + + + 크기 + Size + + 보통 + Normal + + + 작게 + Compact + + + + diff --git a/addons/recaptcha/lang/en.php b/addons/recaptcha/lang/en.php new file mode 100644 index 000000000..5546c69fc --- /dev/null +++ b/addons/recaptcha/lang/en.php @@ -0,0 +1,3 @@ +msg_recaptcha_server_error = 'An error occurred while verifying your reCAPTCHA response.'; +$lang->msg_recaptcha_invalid_response = 'Please check reCAPTCHA.'; diff --git a/addons/recaptcha/lang/ko.php b/addons/recaptcha/lang/ko.php new file mode 100644 index 000000000..510d21bd4 --- /dev/null +++ b/addons/recaptcha/lang/ko.php @@ -0,0 +1,3 @@ +msg_recaptcha_server_error = 'reCAPTCHA 스팸방지 서버와 통신하는 도중 오류가 발생했습니다.'; +$lang->msg_recaptcha_invalid_response = 'reCAPTCHA 스팸방지 기능을 체크해 주십시오.'; diff --git a/addons/recaptcha/recaptcha.addon.php b/addons/recaptcha/recaptcha.addon.php new file mode 100644 index 000000000..b80569e17 --- /dev/null +++ b/addons/recaptcha/recaptcha.addon.php @@ -0,0 +1,53 @@ +site_key || !$addon_info->secret_key || $called_position !== 'before_module_init') +{ + return; +} + +if (preg_match('/^dispMemberSignUp/i', Context::get('act'))) +{ + getController('module')->addTriggerFunction('moduleObject.proc', 'after', function() use($addon_info) { + $html = '
'; + $html = sprintf($html, escape($addon_info->site_key), $addon_info->theme ?: 'light', $addon_info->size ?: 'normal'); + Context::addHtmlHeader(''); + Context::getInstance()->formTags[] = (object)array( + 'name' => 'recaptcha', + 'title' => 'reCAPTCHA', + 'inputTag' => $html, + ); + }); +} + +if (preg_match('/^procMemberInsert/i', Context::get('act'))) +{ + getController('module')->addTriggerFunction('moduleObject.proc', 'before', function() use($addon_info) { + $response = Context::get('g-recaptcha-response'); + if (!$response) + { + return new Object(-1, lang('recaptcha.msg_recaptcha_invalid_response')); + } + + $verify_url = 'https://www.google.com/recaptcha/api/siteverify'; + $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); + var_dump($verify);exit; + 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; + } + }); +} diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index 92ca678d5..fbf27eb4a 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -1301,7 +1301,7 @@ class ModuleHandler extends Handler foreach($trigger_functions as $item) { $before_each_trigger_time = microtime(true); - $item($obj); + $output = $item($obj); $after_each_trigger_time = microtime(true); if ($trigger_name !== 'common.writeSlowlog') diff --git a/modules/member/skins/default/signup_form.html b/modules/member/skins/default/signup_form.html index b3d464d38..435ab05b0 100644 --- a/modules/member/skins/default/signup_form.html +++ b/modules/member/skins/default/signup_form.html @@ -110,4 +110,4 @@ }); })(jQuery); - \ No newline at end of file +