* @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.'