* @copyright 2007-2014 PrestaShop SA * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of PrestaShop SA */ if (!defined('_PS_VERSION_')) exit; class StGRecaptcha extends Module { private $_prefix_st = 'STGR_'; //modified id to match ps iso_code code public $languages = array( 'ar' => array('name' => 'Arabic', 'id' => 'ar'), 'af' => array('name' => 'Afrikaans', 'id' => 'af'), 'am' => array('name' => 'Amharic', 'id' => 'am'), 'hy' => array('name' => 'Armenian', 'id' => 'hy'), 'az' => array('name' => 'Azerbaijani', 'id' => 'az'), 'eu' => array('name' => 'Basque', 'id' => 'eu'), 'bn' => array('name' => 'Bengali', 'id' => 'bn'), 'bg' => array('name' => 'Bulgarian', 'id' => 'bg'), 'ca' => array('name' => 'Catalan', 'id' => 'ca'), 'zh-HK' => array('name' => 'Chinese(Hong Kong)', 'id' => 'zh-HK'), 'zh-CN' => array('name' => 'Chinese(Simplified)', 'id' => 'zh-CN'), 'zh-TW' => array('name' => 'Chinese(Traditional)', 'id' => 'zh-TW'), 'hr' => array('name' => 'Croatian', 'id' => 'hr'), 'cs' => array('name' => 'Czech', 'id' => 'cs'), 'da' => array('name' => 'Danish', 'id' => 'da'), 'nl' => array('name' => 'Dutch', 'id' => 'nl'), 'en-GB' => array('name' => 'English(UK)', 'id' => 'en-GB'), 'en' => array('name' => 'English(US)', 'id' => 'en'), 'et' => array('name' => 'Estonian', 'id' => 'et'), 'fil' => array('name' => 'Filipino', 'id' => 'fil'), 'fi' => array('name' => 'Finnish', 'id' => 'fi'), 'fr' => array('name' => 'French', 'id' => 'fr'), 'fr-CA' => array('name' => 'French(Canadian)', 'id' => 'fr-CA'), 'gl' => array('name' => 'Galician', 'id' => 'gl'), 'ka' => array('name' => 'Georgian', 'id' => 'ka'), 'de' => array('name' => 'German', 'id' => 'de'), 'de-AT' => array('name' => 'German(Austria)', 'id' => 'de-AT'), 'de-CH' => array('name' => 'German(Switzerland)', 'id' => 'de-CH'), 'el' => array('name' => 'Greek', 'id' => 'el'), 'gu' => array('name' => 'Gujarati', 'id' => 'gu'), 'he' => array('name' => 'Hebrew', 'id' => 'iw'),//iw 'hi' => array('name' => 'Hindi', 'id' => 'hi'), 'hu' => array('name' => 'Hungarain', 'id' => 'hu'), 'is' => array('name' => 'Icelandic', 'id' => 'is'), 'id' => array('name' => 'Indonesian', 'id' => 'id'), 'it' => array('name' => 'Italian', 'id' => 'it'), 'ja' => array('name' => 'Japanese', 'id' => 'ja'), 'kn' => array('name' => 'Kannada', 'id' => 'kn'), 'ko' => array('name' => 'Korean', 'id' => 'ko'), 'lo' => array('name' => 'Laothian', 'id' => 'lo'), 'lv' => array('name' => 'Latvian', 'id' => 'lv'), 'lt' => array('name' => 'Lithuanian', 'id' => 'lt'), 'ms' => array('name' => 'Malay', 'id' => 'ms'), 'ml' => array('name' => 'Malayalam', 'id' => 'ml'), 'mr' => array('name' => 'Marathi', 'id' => 'mr'), 'mn' => array('name' => 'Mongolian', 'id' => 'mn'), 'no' => array('name' => 'Norwegian', 'id' => 'no'), 'fa' => array('name' => 'Persian', 'id' => 'fa'), 'pl' => array('name' => 'Polish', 'id' => 'pl'), 'pt' => array('name' => 'Portuguese', 'id' => 'pt'), 'pt-BR' => array('name' => 'Portuguese(Brazil)', 'id' => 'pt-BR'), 'pt-PT' => array('name' => 'Portuguese(Portugal)', 'id' => 'pt-PT'), 'ro' => array('name' => 'Romanian', 'id' => 'ro'), 'ru' => array('name' => 'Russian', 'id' => 'ru'), 'sr' => array('name' => 'Serbian', 'id' => 'sr'), // 'si' => array('name' => 'Sinhalese', 'id' => 'si'), //is for Slovene in ps, ps is wrong 'sk' => array('name' => 'Slovak', 'id' => 'sk'), 'sl' => array('name' => 'Slovenian', 'id' => 'sl'), 'es' => array('name' => 'Spanish', 'id' => 'es'), 'es-419' => array('name' => 'Spanish(Latin America)', 'id' => 'es-419'), 'sw' => array('name' => 'Swahili', 'id' => 'sw'), 'sv' => array('name' => 'Swedish', 'id' => 'sv'), 'ta' => array('name' => 'Tamil', 'id' => 'ta'), 'te' => array('name' => 'Telugu', 'id' => 'te'), 'th' => array('name' => 'Thai', 'id' => 'th'), 'tr' => array('name' => 'Turkish', 'id' => 'tr'), 'uk' => array('name' => 'Ukrainian', 'id' => 'uk'), 'ur' => array('name' => 'Urdu', 'id' => 'ur'), 'vn' => array('name' => 'Vietnamese', 'id' => 'vi'),//vi 'zu' => array('name' => 'Zulu', 'id' => 'zu'), ); public $forms = array(); public $appends = array(); public $tabs; public $validation_errors = array(); private $_html; function __construct() { $this->name = 'stgrecaptcha'; $this->tab = 'front_office_features'; $this->version = '1.1.0'; $this->author = 'SUNNYTOO.COM'; $this->need_instance = 0; $this->bootstrap = true; parent::__construct(); $this->forms = array( 'login' => array( 'id' => 'login', 'val' => 1, 'name' => $this->l('Login form'), ), /*'quicklogin' => array( 'id' => 'quicklogin', 'val' => 1, 'name' => $this->l('Quick login form'), ),*/ 'register' => array( 'id' => 'register', 'val' => 1, 'name' => $this->l('Register form'), ), 'contact' => array( 'id' => 'contact', 'val' => 1, 'name' => $this->l('Contact form'), ), /*no need 'password' => array( 'id' => 'password', 'val' => 1, 'name' => $this->l('Password forgotten'), ),*/ 'opclogin' => array( 'id' => 'opclogin', 'val' => 1, 'name' => $this->l('One page checkout Login form'), ), 'opcregister' => array( 'id' => 'opcregister', 'val' => 1, 'name' => $this->l('One page checkout register form'), ), 'stnewsletter' => array( 'id' => 'stnewsletter', 'val' => 1, 'name' => $this->l('Newsletter popup'), ), 'blocknewsletter' => array( 'id' => 'blocknewsletter', 'val' => 1, 'name' => $this->l('Block newsletter'), ), 'emailsubscription' => array( 'id' => 'emailsubscription', 'val' => 1, 'name' => $this->l('Newsletter subscription'), ), 'productcomments' => array( 'id' => 'productcomments', 'val' => 1, 'name' => $this->l('Product comments'), ), 'stproductcomments' => array( 'id' => 'stproductcomments', 'val' => 1, 'name' => $this->l('Product comments'), ), 'stecologin' => array( 'id' => 'stecologin', 'val' => 1, 'name' => $this->l('Easy checkout module login form'), ), 'stblogcomments' => array( 'id' => 'stblogcomments', 'val' => 1, 'name' => $this->l('Blog comments'), ), ); $this->displayName = $this->l('Advanced Google reCAPTCHA V2 & Invisible reCAPTCHA'); $this->description = $this->l('Add Google Invisible reCAPTCHA and reCAPTCHA V2 to forms on your site to protect you against spam and other types of automated abuse.'); $this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_); $this->tabs = array( array('id' => '0', 'name' => $this->l('General')), array('id' => '1,'.implode(',', array_keys($this->forms)), 'name' => $this->l('Advanced settings')), ); $this->appends = array( 0 => array( 'id' => 0, 'name' => 'append', ), 1 => array( 'id' => 1, 'name' => 'before', ), 2 => array( 'id' => 2, 'name' => 'after', ), 3 => array( 'id' => 3, 'name' => 'prepend', ), 4 => array( 'id' => 4, 'name' => 'parent append', ), 5 => array( 'id' => 5, 'name' => 'parent before', ), 6 => array( 'id' => 6, 'name' => 'parent after', ), 7 => array( 'id' => 7, 'name' => 'parent prepend', ), 8 => array( 'id' => 8, 'name' => 'parent parent append', ), 9 => array( 'id' => 9, 'name' => 'parent parent before', ), 10 => array( 'id' => 10, 'name' => 'parent parent after', ), 11 => array( 'id' => 11, 'name' => 'parent parent prepend', ), ); } public function avavilabe_forms(){ $forms = $this->forms; if (Tools::version_compare(_PS_VERSION_, '1.7', '<')) { unset($forms['emailsubscription']); unset($forms['stproductcomments']); $forms['opclogin']['name'] .= ' ('.$this->l('Does not support Invisible reCAPTCHA').')'; $forms['opcregister']['name'] .= ' ('.$this->l('Does not support Invisible reCAPTCHA').')'; } else { unset($forms['blocknewsletter']); unset($forms['productcomments']); if(!Module::isInstalled('stproductcomments') && !Module::isInstalled('stproductcommentspro')) unset($forms['stproductcomments']); } if(!Module::isInstalled('stcustomersignin')) unset($forms['quicklogin']); if(!Module::isInstalled('stnewsletter')) unset($forms['stnewsletter']); if(!Module::isInstalled('steasycheckout')){ unset($forms['stecologin']); } if (!Module::isInstalled('stblogcomments')) { unset($forms['stblogcomments']); } return $forms; } function install() { $result = parent::install() && $this->registerHook('actionPostProcessBefore') && $this->registerHook('displayHeader') && Configuration::updateValue($this->_prefix_st.'SITE_KEY', '') && Configuration::updateValue($this->_prefix_st.'SECRET_KEY', '') && Configuration::updateValue($this->_prefix_st.'LOGIN_ATTEMPTS', 5) && Configuration::updateValue($this->_prefix_st.'THEME', 'light') && Configuration::updateValue($this->_prefix_st.'TYPE', 'image') && Configuration::updateValue($this->_prefix_st.'SIZE', 'normal') && Configuration::updateValue($this->_prefix_st.'LANG', 'en') && Configuration::updateValue($this->_prefix_st.'INVISIBLE_V2', 0) && Configuration::updateValue($this->_prefix_st.'LOGGED_IN', 0) && Configuration::updateValue($this->_prefix_st.'NO_CONNECT', 0) && Configuration::updateValue($this->_prefix_st.'NEWS_DELAY', 1) && $this->installBiaos() && $this->installData() && $this->installDB(); if($result && Tools::version_compare(_PS_VERSION_, '1.7', '<')) $this->registerHook('displayCustomerAccountForm'); return $result; } function uninstall() { $this->uninstallData(); return $this->deleteTables() && parent::uninstall(); } public function deleteTables() { return Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'st_grecaptcha`'); } public function installDB() { $return = (bool)Db::getInstance()->execute(' CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'st_grecaptcha` ( `id_st_grecaptcha` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `email` varchar(10) NOT NULL, `disabled` tinyint(1) unsigned NOT NULL DEFAULT 0, `failed_times` tinyint(1) unsigned NOT NULL DEFAULT 0, `lock` datetime DEFAULT NULL, PRIMARY KEY (`id_st_grecaptcha`), KEY `email` (`email`) ) ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8 ;'); return $return; } public function installBiaos() { foreach ($this->forms as $k => $v) { Configuration::updateValue($this->_prefix_st.'FORM_'.Tools::strtoupper($k), ($k=='contact' || $k=='register' ? 1 : 0)); } return true; } public function installData($biao=null,$style=0) { $data = include(_PS_MODULE_DIR_.$this->name.'/stgrecaptchadata.php'); $version = Tools::substr(_PS_VERSION_, 0, 3); $theme = Module::isInstalled('stthemeeditor') && Module::isEnabled('stthemeeditor') ? 'st' : 'classic'; $languages = Language::getLanguages(false); if(array_key_exists($version, $data)) foreach ($data[$version] as $k=>$v) { if($biao!==null && $k!=$biao) continue; $va = array(); if(array_key_exists('selector', $v)) $va = $v; elseif(array_key_exists($theme, $v)) { if(array_key_exists('selector', $v[$theme])) $va = $v[$theme]; elseif(array_key_exists($style, $v[$theme])) { $va = $v[$theme][$style]; if($style && (!isset($va['selector']) || !isset($va['append']) || !isset($va['html']))) $va = array_merge($v[$theme][0], $va); } } if(!count($va)) continue; Configuration::updateValue($this->_prefix_st.Tools::strtoupper($k).'_SELECTOR', (is_array($va['selector']) ? $va['selector'][$theme] : $va['selector']), true); Configuration::updateValue($this->_prefix_st.Tools::strtoupper($k).'_APPEND', (is_array($va['append']) ? $va['append'][$theme] : $va['append'])); $htmls = array(); foreach ($languages as $language) { $htmls[$language['id_lang']] = is_array($va['html']) ? $va['html'][$theme] : $va['html']; } Configuration::updateValue($this->_prefix_st.Tools::strtoupper($k).'_HTML', $htmls, true); // Configuration::updateValue($this->_prefix_st.Tools::strtoupper($k).'_BG', isset($va['bg']) ? $va['bg'] : ''); Configuration::updateValue($this->_prefix_st.Tools::strtoupper($k).'_COLOR', isset($va['color']) ? $va['color'] : ''); Configuration::updateValue($this->_prefix_st.Tools::strtoupper($k).'_CSS', isset($va['css']) ? $va['css'] : ''); $arr = $this->getMP(); foreach ($arr as $key => $value) foreach ($value as $mp) Configuration::updateValue($this->_prefix_st.strtoupper($k.'_'.$mp['id']), isset($va[$mp['id']]) ? $va[$mp['id']] : 0); } return true; } public function uninstallData() { $data = include(_PS_MODULE_DIR_.$this->name.'/stgrecaptchadata.php'); $version = Tools::substr(_PS_VERSION_, 0, 3); if(array_key_exists($version, $data)) foreach ($data[$version] as $k=>$v) { Configuration::deleteByName($this->_prefix_st.Tools::strtoupper($k).'_SELECTOR'); Configuration::deleteByName($this->_prefix_st.Tools::strtoupper($k).'_APPEND'); Configuration::deleteByName($this->_prefix_st.Tools::strtoupper($k).'_HTML'); Configuration::deleteByName($this->_prefix_st.Tools::strtoupper($k).'_BG'); Configuration::deleteByName($this->_prefix_st.Tools::strtoupper($k).'_COLOR'); Configuration::deleteByName($this->_prefix_st.Tools::strtoupper($k).'_CSS'); $arr = $this->getMP(); foreach ($arr as $key => $value) foreach ($value as $mp) Configuration::deleteByName($this->_prefix_st.strtoupper($k.'_'.$mp['id'])); } return true; } public function getContent() { $this->context->controller->addCSS(($this->_path).'views/css/admin.css'); $this->context->controller->addJS(($this->_path).'views/js/admin.js'); if (Tools::isSubmit('resetbiao')) { $biao = Tools::getValue('biao'); if(array_key_exists($biao, $this->forms)){ $style = (int)Tools::getValue('style'); $this->installData($biao, $style); } else $this->installData(); $this->_clearCache('*'); Tools::redirectAdmin(AdminController::$currentIndex.'&configure='.$this->name.'&conf=4&token='.Tools::getAdminTokenLite('AdminModules')); } $this->fields_form = $this->getFieldsForm(); if (Tools::isSubmit('save'.$this->name)) { foreach($this->fields_form as $form) foreach($form['form']['input'] as $field) if(isset($field['validation'])) { $ishtml = ($field['validation']=='isAnything') ? true : false; $errors = array(); $value = Tools::getValue($field['name']); if (isset($field['required']) && $field['required'] && $value==false && (string)$value != '0') $errors[] = sprintf(Tools::displayError('Field "%s" is required.'), $field['label']); elseif($value) { $field_validation = $field['validation']; if (!Validate::$field_validation($value)) $errors[] = sprintf(Tools::displayError('Field "%s" is invalid.'), $field['label']); } // Set default value if ($value === false && isset($field['default_value'])) $value = $field['default_value']; if(count($errors)) { $this->validation_errors = array_merge($this->validation_errors, $errors); } elseif($value==false) { switch($field['validation']) { case 'isUnsignedId': case 'isUnsignedInt': case 'isInt': case 'isBool': $value = 0; break; default: $value = ''; break; } Configuration::updateValue($this->_prefix_st.strtoupper($field['name']), $value); } else Configuration::updateValue($this->_prefix_st.strtoupper($field['name']), $value, $ishtml); } foreach($this->avavilabe_forms() as $k=>$v) { if ($value = Tools::getValue('form_'.$k)) { Configuration::updateValue($this->_prefix_st.'FORM_'.strtoupper($k), $value); } else { Configuration::updateValue($this->_prefix_st.'FORM_'.strtoupper($k), 0); } } $this->updateBiaos(); // if(count($this->validation_errors)) $this->_html .= $this->displayError(implode('
',$this->validation_errors)); else $this->_html .= $this->displayConfirmation($this->l('Settings updated')); $this->_clearCache('*'); } $helper = $this->initForm(); Media::addJsDef(array( 'id_tab_index' => Tools::getValue('id_tab_index', 0), )); return $this->_html.'
'.$this->initTab().'
'.$helper->generateForm($this->fields_form).'
'; } public function updateBiaos() { $languages = Language::getLanguages(false); $defaultLanguage = new Language((int)(Configuration::get('PS_LANG_DEFAULT'))); $form = $this->avavilabe_forms(); $arr = $this->getMP(); foreach($form as $k=>$v) { $htmls = array(); foreach ($languages as $language) $htmls[$language['id_lang']] = Tools::getValue($k.'_html_' . $language['id_lang']) ? Tools::getValue($k.'_html_' . $language['id_lang']) : Tools::getValue($k.'_html_' .$defaultLanguage->id); Configuration::updateValue($this->_prefix_st.Tools::strtoupper($k).'_HTML', $htmls, true); foreach ($arr as $key => $value) foreach ($value as $mp) { $gv = Tools::getValue($k.'_'.$mp['id']); if ($gv!==false) Configuration::updateValue($this->_prefix_st.strtoupper($k.'_'.$mp['id']), $gv); } } } public function initTab() { $html = '
'; return $html; } public function getFieldsForm(){ $fields_form = include(_PS_MODULE_DIR_.$this->name.'/stgrecaptchaform.php'); $forms = $this->avavilabe_forms(); foreach ($forms as $k=>$v) { $fields_form[$k]['form'] = array( 'legend' => array( 'title' => $v['name'], ), 'input' => array( array( 'type' => 'text', 'label' => $this->l('jQuery selector:'), 'name' => $k.'_selector', 'validation' => 'isAnything', ), array( 'type' => 'textarea', 'label' => $this->l('HTML:'), 'name' => $k.'_html', 'cols' => 20, 'rows' => 20, 'lang' => true, 'desc' => sprintf($this->l('Make sure the outermost wrapper has a %s class name, otherwise colors, paddings and margins settings would not work.'), 'stgr_'.$k), ), array( 'type' => 'select', 'label' => $this->l('How to append html to this form:'), 'name' => $k.'_append', 'default_value' => 0, 'options' => array( 'query' => $this->appends, 'id' => 'id', 'name' => 'name', ), 'validation' => 'isUnsignedInt', ), array( 'type' => 'textarea', 'label' => $this->l('Custom CSS Code:'), 'name' => $k.'_css', 'cols' => 80, 'rows' => 20, 'validation' => 'isAnything', ), array( 'type' => 'color', 'label' => $this->l('Text color:'), 'name' => $k.'_color', 'class' => 'color', 'size' => 20, 'validation' => 'isColor', 'desc' => $this->l('Can not change text color on reCAPTCHA badge.'), ), array( 'type' => 'color', 'label' => $this->l('Background color:'), 'name' => $k.'_bg', 'class' => 'color', 'size' => 20, 'validation' => 'isColor', ), 'paddings' => array( 'type' => 'html', 'id' => 'paddings', 'label'=> $this->l('Paddings'), 'name' => '', ), 'margins' => array( 'type' => 'html', 'id' => 'margins', 'label'=> $this->l('Margins'), 'name' => '', ), 'reset' => array( 'type' => 'html', 'id' => '', 'label' => $this->l('Use predfined settings for this form.'), 'name' => '', ), ), 'submit' => array( 'title' => $this->l('Save'), ), ); } return $fields_form; } public function getMP($k=null){ $groups = array( 0 => array( array( 'id' => 'm_l', 'css_name' => 'margin-left', 'label' => $this->l('Left margin'), ), array( 'id' => 'm_t', 'css_name' => 'margin-top', 'label' => $this->l('Top margin'), ), array( 'id' => 'm_r', 'css_name' => 'margin-right', 'label' => $this->l('Right margin'), ), array( 'id' => 'm_b', 'css_name' => 'margin-bottom', 'label' => $this->l('Bottom margin'), ), ), 1 => array( array( 'id' => 'p_l', 'css_name' => 'padding-left', 'label' => $this->l('Left padding'), ), array( 'id' => 'p_t', 'css_name' => 'padding-top', 'label' => $this->l('Top padding'), ), array( 'id' => 'p_r', 'css_name' => 'padding-right', 'label' => $this->l('Right padding'), ), array( 'id' => 'p_b', 'css_name' => 'padding-bottom', 'label' => $this->l('Bottom padding'), ), ), ); return ($k!==null && isset($groups[$k])) ? $groups[$k] : $groups; } public function BuildInputs($group, $k) { $html = '
'; foreach($group AS $mp) { $html .= '
'. '
'; } return $html.'
'; } public function initForm() { $forms = $this->avavilabe_forms(); $this->fields_form[0]['form']['input']['form']['values']['query'] = $forms; $this->fields_form[0]['form']['input']['lang']['options']['query'] = $this->languages; $this->fields_form[1]['form']['input']['reset']['name'] = ''.$this->l('Reset').''; $data = include(_PS_MODULE_DIR_.$this->name.'/stgrecaptchadata.php'); $version = Tools::substr(_PS_VERSION_, 0, 3); $theme = Module::isInstalled('stthemeeditor') && Module::isEnabled('stthemeeditor') ? 'st' : 'classic'; foreach ($forms as $k=>$v) { $this->fields_form[$k]['form']['input']['margins']['name'] = $this->BuildInputs($this->getMP(0), $k); $this->fields_form[$k]['form']['input']['paddings']['name'] = $this->BuildInputs($this->getMP(1), $k); $this->fields_form[$k]['form']['input']['reset']['name'] = ''.$this->l('Style').' 1'; if(!array_key_exists('selector', $data[$version][$k]) && !array_key_exists('selector', $data[$version][$k][$theme]) && count($data[$version][$k][$theme])>1) { for ($i = 1; $i < count($data[$version][$k][$theme]); $i++) { $this->fields_form[$k]['form']['input']['reset']['name'] .= ''.$this->l('Style').' '.($i+1).''; } } } $helper = new HelperForm(); $helper->show_toolbar = false; $helper->module = $this; $helper->table = $this->table; $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); $helper->default_form_language = $lang->id; $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; $helper->identifier = $this->identifier; $helper->submit_action = 'save'.$this->name; $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); $helper->tpl_vars = array( 'fields_value' => $this->getConfigFieldsValues(), 'languages' => $this->context->controller->getLanguages(), 'id_language' => $this->context->language->id ); return $helper; } public function getConfigFieldsValues($type=0) { $fields_values = array( 'invisible_v2' => Configuration::get($this->_prefix_st.'INVISIBLE_V2'), 'site_key' => Configuration::get($this->_prefix_st.'SITE_KEY'), 'secret_key' => Configuration::get($this->_prefix_st.'SECRET_KEY'), 'login_attempts' => Configuration::get($this->_prefix_st.'LOGIN_ATTEMPTS'), 'theme' => Configuration::get($this->_prefix_st.'THEME'), 'type' => Configuration::get($this->_prefix_st.'TYPE'), 'size' => Configuration::get($this->_prefix_st.'SIZE'), 'lang' => Configuration::get($this->_prefix_st.'LANG'), // 'custom_css' => html_entity_decode(Configuration::get($this->_prefix_st.'CUSTOM_CSS')), 'logged_in' => Configuration::get($this->_prefix_st.'LOGGED_IN'), 'no_connect' => Configuration::get($this->_prefix_st.'NO_CONNECT'), 'news_delay' => Configuration::get($this->_prefix_st.'NEWS_DELAY'), ); foreach($this->avavilabe_forms() as $k=>$v) { $fields_values[$k.'_color'] = Configuration::get($this->_prefix_st.Tools::strtoupper($k).'_COLOR'); $fields_values[$k.'_bg'] = Configuration::get($this->_prefix_st.Tools::strtoupper($k).'_BG'); $fields_values[$k.'_css'] = html_entity_decode(Configuration::get($this->_prefix_st.Tools::strtoupper($k).'_CSS')); $arr = $this->getMP(); foreach ($arr as $key => $value) foreach ($value as $mp) $fields_values[$k.'_'.$mp['id']] = Configuration::get($this->_prefix_st.strtoupper($k.'_'.$mp['id'])); if($type) { $fields_values[$k]['enabled'] = ($fields_values['logged_in'] && $this->context->customer->isLogged(true)) ? 0 : Configuration::get($this->_prefix_st.'FORM_'.strtoupper($k)); if (Tools::version_compare(_PS_VERSION_, '1.7', '<')) { if(($k=='opclogin' || $k=='opcregister') && $fields_values['invisible_v2']==0) $fields_values[$k]['enabled'] = 0; } $fields_values[$k]['selector'] = html_entity_decode(Configuration::get($this->_prefix_st.Tools::strtoupper($k).'_SELECTOR')); $fields_values[$k]['html'] = html_entity_decode(Configuration::get($this->_prefix_st.Tools::strtoupper($k).'_HTML', $this->context->language->id)); $fields_values[$k]['append'] = Configuration::get($this->_prefix_st.Tools::strtoupper($k).'_APPEND'); } else{ $languages = Language::getLanguages(false); foreach($this->avavilabe_forms() as $k=>$v) { $fields_values['form_'.$k] = Configuration::get($this->_prefix_st.'FORM_'.strtoupper($k)); $fields_values[$k.'_selector'] = html_entity_decode(Configuration::get($this->_prefix_st.Tools::strtoupper($k).'_SELECTOR')); $fields_values[$k.'_append'] = Configuration::get($this->_prefix_st.Tools::strtoupper($k).'_APPEND'); // $fields_values[$k.'_html'] = array(); foreach ($languages as $language) $fields_values[$k.'_html'][$language['id_lang']] = html_entity_decode(Configuration::get($this->_prefix_st.Tools::strtoupper($k).'_HTML', $language['id_lang'])); } } } return $fields_values; } public function hookHeader($params) { // $controllers = array('authentication', 'contact', 'password', 'order-opc'); // $page = Dispatcher::getInstance()->getController(); // $cache_key = $this->getCacheId((in_array($page, $controllers) ? $page : 'others')); $settings = $this->getConfigFieldsValues(1); if(!$settings['site_key'] || !$settings['secret_key']) return; $this->context->controller->addJS($this->_path.'views/js/stgrecaptcha.js'); $settings['lang'] = ''; if(array_key_exists(strtolower($this->context->language->iso_code), $this->languages)) $settings['lang'] = $this->languages[$this->context->language->iso_code]['id']; if(!$settings['lang'] && array_key_exists(strtolower($this->context->language->language_code), $this->languages)) $settings['lang'] = $this->languages[$this->context->language->language_code]['id']; if(!$settings['lang']) $settings['lang'] = Configuration::get($this->_prefix_st.'LANG'); $form = $this->avavilabe_forms(); $arr = $this->getMP(); $settings['forms'] = $form; $template_file = Tools::version_compare(_PS_VERSION_, '1.7', '<') ? 'stgrecaptcha.tpl' : 'module:stgrecaptcha/views/templates/hook/stgrecaptcha.tpl'; if (!$this->isCached($template_file, $this->getCacheId())) { $custom_css = ''; foreach($form as $k=>$v) { $settings[$k.'_bg'] && $custom_css .= '.stgr_'.$k.'{background-color:'.$settings[$k.'_bg'].';}'; $settings[$k.'_color'] && $custom_css .= '.stgr_'.$k.'{color:'.$settings[$k.'_color'].';}'; $settings[$k.'_css'] && $custom_css .= $settings[$k.'_css']; foreach ($arr as $key => $value) foreach ($value as $mp) $settings[$k.'_'.$mp['id']] && $custom_css .= '.stgr_'.$k.'{'.$mp['css_name'].':'.$settings[$k.'_'.$mp['id']].'px;}'; } $this->context->smarty->assign('stgrecaptcha', array( 'custom_css' => $custom_css, )); } unset($settings['secret_key']); foreach($form as $k=>$v) { unset($settings[$k.'_bg']); unset($settings[$k.'_color']); unset($settings[$k.'_css']); foreach ($arr as $key => $value) foreach ($value as $mp) unset($settings[$k.'_'.$mp['id']]); } Media::addJsDef(array('stgrecaptcha' => $settings)); if(Tools::version_compare(_PS_VERSION_, '1.7', '<')) return $this->display(__FILE__, $template_file, $this->getCacheId()); else return $this->fetch($template_file, $this->getCacheId()); } public function hookDisplayCustomerAccountForm(){ return $this->display(__FILE__, 'create_account_form.tpl'); } public function hookActionPostProcessBefore($params) { $params['call_parent'] = true; if(Configuration::get($this->_prefix_st.'LOGGED_IN') && $this->context->customer->isLogged(true)) return true; $page = Dispatcher::getInstance()->getController(); // Contact us page. if ($page == 'contact' && Tools::isSubmit('submitMessage') && Configuration::get($this->_prefix_st.'FORM_CONTACT')) { $params['call_parent'] = $this->doValidate($params, 'submitMessage'); return true; } // St newsletter if ($page == 'ajax' && Tools::getValue('module') == 'stnewsletter' && Tools::isSubmit('action') && Tools::getValue('email') && !Tools::getValue('action') && Configuration::get($this->_prefix_st.'FORM_STNEWSLETTER') ) { if(!$this->doValidate($params, 'email')) { die(Tools::jsonEncode(array( 'message' => '', 'hasError' => array_pop($params['controller']->errors), ))); } return true; } // St blog comments if ($page == 'default' && Tools::getValue('module') == 'stblogcomments' && Tools::getValue('action') == 'add_comment' && Configuration::get($this->_prefix_st.'FORM_STBLOGCOMMENTS') ) { if(!$this->doValidate($params, 'content')) { die(Tools::jsonEncode($result = array( 'stgr_rest' => '', 'r' => false, 'm' => array_pop($params['controller']->errors), ))); } return true; } // For warehouse theme, it requires to modify the /modules/iqitemailsubscriptionconf/controllers/front/subscription.php file: // Note function postProcess and add code || Tools::getValue('stgrvrs') if (Tools::getValue('module') == 'iqitemailsubscriptionconf' && Tools::getValue('controller') == 'subscription' && Tools::isSubmit('submitNewsletter')) { if(!$this->doValidate($params, 'submitNewsletter')) { Context::getContext()->smarty->assign('nw_error', true); $_GET['stgrvrs'] = 1; } return true; } if (Tools::version_compare(_PS_VERSION_, '1.7', '<')) { if ($page == 'authentication') { // login if (Tools::isSubmit('SubmitLogin') && Configuration::get($this->_prefix_st.'FORM_LOGIN') && !Tools::getValue('ajax')) { $params['call_parent'] = $this->doValidate($params, 'SubmitLogin'); return true; } // opc login if (Tools::isSubmit('SubmitLogin') && Configuration::get($this->_prefix_st.'FORM_OPCLOGIN') && Tools::getValue('ajax')) { $params['call_parent'] = $this->doValidate($params, 'SubmitLogin'); return true; } // register if (Tools::isSubmit('submitAccount') && Configuration::get($this->_prefix_st.'FORM_REGISTER') && !Tools::getValue('ajax')) { $params['call_parent'] = $this->doValidate($params, 'submitAccount'); return true; } // guest checkout. if (Tools::isSubmit('submitAccount') && Configuration::get($this->_prefix_st.'FORM_OPCREGISTER') && Tools::getValue('ajax') && !Tools::getValue('is_new_customer')) { $params['call_parent'] = $this->doValidate($params, 'submitAccount'); return true; } // opc register if (Tools::isSubmit('submitAccount') && Configuration::get($this->_prefix_st.'FORM_OPCREGISTER') && Tools::getValue('ajax') && Tools::getValue('is_new_customer')) { $params['call_parent'] = $this->doValidate($params, 'submitAccount'); return true; } } // Block newsletter if (Tools::isSubmit('submitNewsletter') && Configuration::get($this->_prefix_st.'FORM_BLOCKNEWSLETTER')) { if (!$this->doValidate($params, 'submitNewsletter')) { $this->context->smarty->assign(array('nw_error'=>true, 'msg'=>$this->l('Recaptcha is invalid.'))); } return true; } // Product comments. if ($page == 'default' && Tools::getValue('module') == 'productcomments' && Tools::getValue('action') == 'add_comment' && Configuration::get($this->_prefix_st.'FORM_PRODUCTCOMMENTS') ) { if(!$this->doValidate($params, 'content')) { die(Tools::jsonEncode(array( 'stgr_rest' => '', 'result' => '', 'errors' => $params['controller']->errors, ))); } return true; } } else { if ($page == 'authentication') { if (Tools::isSubmit('submitLogin') && Configuration::get($this->_prefix_st.'FORM_LOGIN')) { $params['call_parent'] = $this->doValidate($params, 'submitLogin'); return true; } if (Tools::isSubmit('submitCreate') && Configuration::get($this->_prefix_st.'FORM_REGISTER')) { $params['call_parent'] = $this->doValidate($params, 'submitCreate'); return true; } } if ($page == 'order') { if (Tools::isSubmit('submitLogin') && Configuration::get($this->_prefix_st.'FORM_OPCLOGIN')) { $params['call_parent'] = $this->doValidate($params, 'submitLogin'); return true; } if (Tools::isSubmit('submitCreate') && Configuration::get($this->_prefix_st.'FORM_OPCREGISTER')) { $params['call_parent'] = $this->doValidate($params, 'submitCreate'); return true; } } // St Easy chckout module. if ($page == 'default' && Tools::getValue('module') == 'steasycheckout') { if (Tools::isSubmit('submitLogin') && Configuration::get($this->_prefix_st.'FORM_STECOLOGIN')) { $params['call_parent'] = $this->doValidate($params, 'submitLogin'); return true; } } // Email subscription if (Tools::isSubmit('submitNewsletter') && Configuration::get($this->_prefix_st.'FORM_EMAILSUBSCRIPTION')) { if (!$this->doValidate($params, 'submitNewsletter')) { Media::addJsDef(array( 'emailsubscription_recaptcha_error' => array_pop($params['controller']->errors), )); die(Tools::jsonEncode(array( 'value' => '', 'msg' => $this->l('Recaptcha is invalid.'), ))); } return true; } // Product comments if ($page == 'default' && (Tools::getValue('module') == 'stproductcomments' || Tools::getValue('module') == 'stproductcommentspro') && (Tools::getValue('action') == 'add_reply' && Tools::getValue('id_parent') || Tools::getValue('action') == 'add_comment' && Tools::getValue('id_product')) && Configuration::get($this->_prefix_st.'FORM_STPRODUCTCOMMENTS') ) { if(!$this->doValidate($params, 'content')) { die(Tools::jsonEncode($result = array( 'stgr_rest' => '', 'r' => false, 'm' => array_pop($params['controller']->errors), ))); } return true; } } } function doValidate($params, $form) { $controller = $params['controller']; if (!$this->validateRecaptcha()) { $params['call_parent'] = false; $controller->errors[] = $this->l('Recaptcha is invalid.'); unset($_POST[$form]); return false; } return true; } function validateRecaptcha() { if ($response = Tools::getValue('g-recaptcha-response')) { $api_url = 'https://www.google.com/recaptcha/api/siteverify'; $params = array( 'secret' => Configuration::get($this->_prefix_st.'SECRET_KEY'), 'response' => $response ); $result = $this->makeCall($params, $api_url, 'POST'); if ($result) { if (isset($result['success']) && $result['success']) { return true; } else { return false; } } else { return Configuration::get($this->_prefix_st.'NO_CONNECT') ? true: false; } } else { return false; } } function makeCall($params = array(), $api_url = '', $method = 'GET') { $params = (array)$params; if (is_array($params) && count($params)) { $param_string = '&' . http_build_query($params); } else { $param_string = null; } $api_url = $api_url . '?' . ('GET' === $method ? ltrim($param_string, '&') : null); try { $curl_connection = curl_init($api_url); curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 60); curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false); if ('POST' == $method) { curl_setopt($curl_connection, CURLOPT_POST, count($params)); curl_setopt($curl_connection, CURLOPT_POSTFIELDS, ltrim($param_string, '&')); } $data = json_decode(curl_exec($curl_connection), true); curl_close($curl_connection); if ($data) { return $data; } return false; } catch (Exception $e) { return false; } } protected function stGetCacheId($key, $name = null) { $cache_id = parent::getCacheId($name); return $cache_id.'_'.$key; } }