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
+