<?php
declare(strict_types=1);
/*
 * sync*gw SpamBot Bundle
 *
 * @copyright  https://syncgw.com, 2013 - 2022
 * @author     Florian Daeumling, https://syncgw.com
 * @license    http://opensource.org/licenses/lgpl-3.0.html
 */
use Contao\Backend;
use Contao\DataContainer;
use Contao\DC_Table;
$GLOBALS['TL_DCA']['tl_module']['config']['onload_callback'][] = [ 'tl_module_SpamBot', 'loadDCA' ];
// IP check palettes
$GLOBALS['TL_DCA']['tl_module']['palettes']['SpamBot-IP'] = 'name,type;'.
    '{spambot},spambot_engines,spambot_mod;'.
    '{spambot_output},spambot_page,spambot_msg;';
// Mail check palettes
$GLOBALS['TL_DCA']['tl_module']['palettes']['SpamBot-Mail'] = 'name,type;'.
    '{spambot},spambot_engines,spambot_mod;';
// engine names
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_engines'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_engines'],
    'inputType'     => 'checkboxWizard',
    'eval'          => [ 'multiple' => TRUE, 'submitOnChange' => TRUE ],
    'options'       => [],
    'sql'           => 'blob NULL',
];
// modes
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_mod'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_mod'],
    'inputType'     => 'select',
    'options'       => [ 1 => 'spambot_mod_first', 2 => 'spambot_mod_spam', 3 => 'spambot_mod_ham' ],
    'reference'     => &$GLOBALS['TL_LANG']['tl_module'],
    'sql'           => 'tinyint(1) NOT NULL default \'1\'',
];
// redirection
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_page'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_page'],
    'exclude'       => TRUE,
    'inputType'     => 'pageTree',
    'explanation'   => 'jumpTo',
    'eval'          => [ 'fieldType' => 'radio', 'tl_class' => 'clr' ],
    'sql'           => 'int(10) unsigned NOT NULL default \'0\'',
];
// message only
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_msg'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_msg'],
    'exclude'       => TRUE,
    'inputType'     => 'checkbox',
    'sql'           => 'tinyint(1) NOT NULL default \'0\'',
];
// Intern
$GLOBALS['TL_DCA']['tl_module']['SpamBot']['spambot_intern'] =
    '{spambot_internal},spambot_internal_exp,spambot_internal_logspam,spambot_internal_logham;';
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_internal_exp'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_internal_exp'],
    'exclude'       => TRUE,
    'inputType'     => 'text',
    'default'       => 2,
    'eval'          => [ 'maxlength' => 3, 'rgxp' => 'digit' ],
    'save_callback' => [[ 'tl_module_SpamBot', 'chkExpiration' ]],
    'sql'           => 'int(3) unsigned NOT NULL default \'0\'',
];
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_internal_logham'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_internal_logham'],
    'default'       => 1,
    'inputType'     => 'checkbox',
    'sql'           => 'tinyint(1) NOT NULL default \'0\'',
];
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_internal_logspam'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_internal_logspam'],
    'default'       => 1,
    'inputType'     => 'checkbox',
    'sql'           => 'tinyint(1) NOT NULL default \'0\'',
];
// Spamhaus
$GLOBALS['TL_DCA']['tl_module']['SpamBot']['spambot_spamhaus'] =
    '{spambot_spamhaus},spambot_spamhaus_mods;';
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_spamhaus_mods'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_spamhaus_mods'],
    'exclude'       => TRUE,
    'inputType'     => 'checkbox',
    'eval'          => [ 'multiple' => TRUE ],
    'load_callback' => [[ 'tl_module_SpamBot', 'loadSH' ]],
    'sql'           => 'varchar(255) NOT NULL default \'\'',
];
// Honeypot
$GLOBALS['TL_DCA']['tl_module']['SpamBot']['spambot_honeypot'] =
    '{spambot_honeypot},spambot_honeypot_key,spambot_honeypot_score;';
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_honeypot_key'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_honeypot_key'],
    'exclude'       => TRUE,
    'inputType'     => 'text',
    'eval'          => ['minlength' => 12, 'maxlength' => 12, 'rgxp' => 'alpha'],
    'save_callback' => [[ 'tl_module_SpamBot', 'chkHoneypotKey' ]],
    'sql'           => 'varchar(12) NULL',
];
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_honeypot_score'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_honeypot_score'],
    'exclude'       => TRUE,
    'inputType'     => 'text',
    'default'       => 25,
    'eval'          => [ 'maxlength' => 3, 'rgxp' => 'digit' ],
    'save_callback' => [[ 'tl_module_SpamBot', 'chkHoneypotScore' ]],
    'sql'           => 'int(3) unsigned NOT NULL default \'0\'',
];
// StopForumSpam
$GLOBALS['TL_DCA']['tl_module']['SpamBot']['spambot_stopforumspam'] =
    '{spambot_stopforumspam},spambot_stopforumspam_score;';
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_stopforumspam_score'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_stopforumspam_score'],
    'exclude'       => TRUE,
    'inputType'     => 'text',
    'default'       => 95.5,
    'eval'          => [ 'maxlength' => 5, 'rgxp' => 'digit' ],
    'save_callback' => [[ 'tl_module_SpamBot', 'chkStopForumSpamScore' ]],
    'sql'           => 'decimal(12,2) NOT NULL default \'0.00\'',
];
// SORBS
$GLOBALS['TL_DCA']['tl_module']['SpamBot']['spambot_sorbs'] =
    '{spambot_sorbs},spambot_sorbs_mods;';
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_sorbs_mods'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_sorbs_mods'],
    'exclude'       => TRUE,
    'inputType'     => 'checkbox',
    'eval'          => [ 'multiple' => TRUE ],
    'load_callback' => [[ 'tl_module_SpamBot', 'loadSORBS' ]],
    'sql'           => 'varchar(255) NOT NULL default \'\'',
];
// Blocklist
$GLOBALS['TL_DCA']['tl_module']['SpamBot']['spambot_blocklist'] =
    '{spambot_blocklist},spambot_blocklist_mods;';
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_blocklist_mods'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_blocklist_mods'],
    'exclude'       => TRUE,
    'inputType'     => 'checkbox',
    'eval'          => [ 'multiple' => TRUE ],
    'load_callback' => [[ 'tl_module_SpamBot', 'loadBlocklist' ]],
    'sql'           => 'varchar(255) NOT NULL default \'\'',
];
// AHBL
$GLOBALS['TL_DCA']['tl_module']['SpamBot']['spambot_ahbl'] =
    '{spambot_ahbl},spambot_ahbl_mods;';
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_ahbl_mods'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_ahbl_mods'],
    'exclude'       => TRUE,
    'inputType'     => 'checkbox',
    'eval'          => [ 'multiple' => TRUE ],
    'load_callback' => [[ 'tl_module_SpamBot', 'loadAHBL' ]],
    'sql'           => 'varchar(255) NOT NULL default \'\'',
];
// BotScout
$GLOBALS['TL_DCA']['tl_module']['SpamBot']['spambot_botscout'] =
    '{spambot_botscout},spambot_botscout_key,spambot_botscout_count;';
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_botscout_key'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_botscout_key'],
    'exclude'       => TRUE,
    'inputType'     => 'text',
    'eval'          => [ 'minlength' => 15, 'maxlength' => 15 ],
    'save_callback' => [[ 'tl_module_SpamBot', 'chkBotScoutKey' ]],
    'sql'           => 'varchar(20) NULL',
];
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_botscout_count'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_botscout_count'],
    'exclude'       => TRUE,
    'inputType'     => 'text',
    'default'       => 5,
    'eval'          => [ 'maxlength' => 3, 'rgxp' => 'digit' ],
    'save_callback' => [[ 'tl_module_SpamBot', 'chkBotScoutScore' ]],
    'sql'           => 'int(3) unsigned NOT NULL default \'0\'',
];
// FSpamList
$GLOBALS['TL_DCA']['tl_module']['SpamBot']['spambot_fspamlist'] =
    '{spambot_fspamlist},spambot_fspamlist_key,spambot_fspamlist_count;';
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_fspamlist_key'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_fspamlist_key'],
    'exclude'       => TRUE,
    'inputType'     => 'text',
    'eval'          => [ 'minlength' => 12, 'maxlength' => 15 ],
    'save_callback' => [[ 'tl_module_SpamBot', 'chkFSpamListKey' ]],
    'sql'           => 'varchar(20) NULL',
];
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_fspamlist_count'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_fspamlist_count'],
    'exclude'       => TRUE,
    'inputType'     => 'text',
    'default'       => 5,
    'eval'          => [ 'maxlength' => 3, 'rgxp' => 'digit' ],
    'save_callback' => [[ 'tl_module_SpamBot', 'chkFSpamListScore' ]],
    'sql'           => 'int(3) unsigned NOT NULL default \'0\'',
];
// IPStack
$GLOBALS['TL_DCA']['tl_module']['SpamBot']['spambot_ipstack'] =
    '{spambot_ipstack},spambot_ipstack_countries;';
$GLOBALS['TL_DCA']['tl_module']['fields']['spambot_ipstack_countries'] = [
    'label'         => &$GLOBALS['TL_LANG']['tl_module']['spambot_ipstack_countries'],
    'inputType'     => 'select',
    'options'       => $this->getCountries(),
    'eval'          => [ 'multiple' => TRUE, 'size' => 8, 'tl_class' => 'w50 w50h', 'chosen' => TRUE ],
    'sql'           => 'blob NULL',
];
class tl_module_SpamBot extends Backend {
    /*
     *  Available engines
     *  @var array
     */
    protected $_engines;
    /**
     * Load data container
     */
    public function loadDCA(DC_Table $dc): void {
        $rc = $dc->Database->prepare('SELECT type,spambot_engines FROM tl_module WHERE id=?')->execute($dc->id);
        if (!$rc->spambot_engines) {
            $this->_engines = [];
        } else {
            $this->_engines = deserialize($rc->spambot_engines);
        }
        // update palette
        foreach ($this->_engines as $name) {
            $GLOBALS['TL_DCA']['tl_module']['palettes'][$rc->type] .=
                $GLOBALS['TL_DCA']['tl_module']['SpamBot']['spambot_'.strtolower($name)];
        }
        // Spamhaus options (default will be set later)
        $GLOBALS['TL_DCA']['tl_module']['fields']['spambot_spamhaus_mods']['options'] =
            $GLOBALS['SpamBot']['Engines']['Spamhaus']['Codes'];
        // SORBS options (default will be set later)
        $GLOBALS['TL_DCA']['tl_module']['fields']['spambot_blocklist_mods']['options'] =
            $GLOBALS['SpamBot']['Engines']['Blocklist']['Codes'];
        // Blocklist options (default will be set later)
        $GLOBALS['TL_DCA']['tl_module']['fields']['spambot_sorbs_mods']['options'] =
            $GLOBALS['SpamBot']['Engines']['SORBS']['Codes'];
        // AHBL options (default will be set later)
        $GLOBALS['TL_DCA']['tl_module']['fields']['spambot_ahbl_mods']['options'] =
            $GLOBALS['SpamBot']['Engines']['AHBL']['Codes'];
        // load engines
        $func = 'SpamBot-IP' === $rc->type ? 'CheckIP' : 'CheckMail';
        // engines
        foreach ($GLOBALS['SpamBot']['Engines'] as $k => $v) {
            if (!isset($v[$func])) {
                continue;
            }
            $GLOBALS['TL_DCA']['tl_module']['fields']['spambot_engines']['options'][$k] = $v['HomePage'];
        }
        // it is required to save default, because only if default is changed value will be saved later
        $this->Database->prepare('UPDATE tl_module SET spambot_engines=? WHERE id=?')
                        ->execute(serialize($this->_engines), $dc->id);
    }
    /**
     * Load Spamhaus default values
     */
    public function loadSH(string $varValue, DataContainer $dc): string {
        if ($varValue)
            return $varValue;
        // it is required to save default, because only if default is changed value will be saved
        $this->Database->prepare('UPDATE tl_module SET spambot_spamhaus_mods=? WHERE id=?')
                        ->execute(serialize($GLOBALS['SpamBot']['Engines']['Spamhaus']['Spam']), $dc->id);
        return serialize($GLOBALS['SpamBot']['Engines']['Spamhaus']['Spam']);
    }
    /**
     * Load SORBS default values
     */
    public function loadSORBS(string $varValue, DataContainer $dc): string {
        if ($varValue)
            return $varValue;
        // it is required to save default, because only if default is changed value will be saved
        $this->Database->prepare('UPDATE tl_module SET spambot_sorbs_mods=? WHERE id=?')
                        ->execute(serialize($GLOBALS['SpamBot']['Engines']['SORBS']['Spam']), $dc->id);
        return serialize($GLOBALS['SpamBot']['Engines']['SORBS']['Spam']);
    }
    /**
     * Load Blocklist default values
     */
    public function loadBlocklist(string $varValue, DataContainer $dc): string {
        if ($varValue)
            return $varValue;
        // it is required to save default, because only if default is changed value will be saved
        $this->Database->prepare('UPDATE tl_module SET spambot_blocklist_mods=? WHERE id=?')
                        ->execute(serialize($GLOBALS['SpamBot']['Engines']['Blocklist']['Spam']), $dc->id);
        return serialize($GLOBALS['SpamBot']['Engines']['Blocklist']['Spam']);
    }
    /**
     * Load AHBL default values
     */
    public function loadAHBL(string $varValue, DataContainer $dc): string {
        if ($varValue)
            return $varValue;
        // it is required to save default, because only if default is changed value will be saved
        $this->Database->prepare('UPDATE tl_module SET spambot_ahbl_mods=? WHERE id=?')
                        ->execute(serialize($GLOBALS['SpamBot']['Engines']['AHBL']['Spam']), $dc->id);
        return serialize($GLOBALS['SpamBot']['Engines']['AHBL']['Spam']);
    }
    /**
     * Check cache expiration
     */
    public function chkExpiration(string $varValue, DC_Table $dc): string {
        if (in_array('Intern', $this->_engines, TRUE)) {
            if (!strlen($varValue))
                throw new Exception($GLOBALS['TL_LANG']['tl_module']['spambot_internal_exp'][1]);
            if ($varValue < 1)
                throw new Exception($GLOBALS['TL_LANG']['tl_module']['spambot_val0'].'<br />'.
                                    $GLOBALS['TL_LANG']['tl_module']['spambot_internal_exp'][1]);
            if ($varValue > 365)
                throw new Exception($GLOBALS['TL_LANG']['tl_module']['spambot_val365'].'<br />'.
                                    $GLOBALS['TL_LANG']['tl_module']['spambot_internal_exp'][1]);
        }
        return $varValue;
    }
    /**
     * Check Honeypot API key
     */
    public function chkHoneypotKey($varValue, DC_Table $dc): string {
        if (in_array('Honeypot', $this->_engines, TRUE)) {
            if (!isset($varValue) || !strlen($varValue))
                throw new Exception($GLOBALS['TL_LANG']['tl_module']['spambot_honeypot_key'][1]);
        }
        return $varValue;
    }
    /**
     * Check Honeypot score value
     */
    public function chkHoneypotScore($varValue, DC_Table $dc): string {
        if (in_array('Honeypot', $this->_engines, TRUE)) {
            if (!isset($varValue) || !strlen($varValue))
                throw new Exception($GLOBALS['TL_LANG']['tl_module']['spambot_honeypot_score'][1]);
        }
        return $varValue;
    }
    /**
     * Check StopForumSpam score value
     */
    public function chkStopForumSpamScore($varValue, DC_Table $dc): string {
        if (in_array('StopForumSpam', $this->_engines, TRUE)) {
            if (!isset($varValue) || !strlen($varValue))
                throw new Exception($GLOBALS['TL_LANG']['tl_module']['spambot_stopforumspam_score'][1]);
        }
        return $varValue;
    }
    /**
     * Check BotScout API key
     */
    public function chkBotScoutKey($varValue, DC_Table $dc): string {
        if (in_array('BotScout', $this->_engines, TRUE)) {
            if (!isset($varValue) || !strlen($varValue))
                throw new Exception($GLOBALS['TL_LANG']['tl_module']['spambot_botscout_key'][1]);
        }
        return $varValue;
    }
    /**
     * Check BotScout score value
     */
    public function chkBotScoutScore($varValue, DC_Table $dc): string {
        if (in_array('BotScout', $this->_engines, TRUE)) {
            if (!isset($varValue) || !strlen($varValue))
                throw new Exception($GLOBALS['TL_LANG']['tl_module']['spambot_botscout_score'][1]);
        }
        return $varValue;
    }
    /**
     * Check FSpamList API key
     */
    public function chkFSpamListKey($varValue, DC_Table $dc): string {
        if (in_array('FSpamList', $this->_engines, TRUE)) {
            if (!isset($varValue) || !strlen($varValue))
                throw new Exception($GLOBALS['TL_LANG']['tl_module']['spambot_fspamlist_key'][1]);
        }
        return $varValue;
    }
    /**
     * Check FSpamList score value
     */
    public function chkFSpamListScore($varValue, DC_Table $dc): string {
        if (in_array('FSpamList', $this->_engines, TRUE)) {
            if (!isset($varValue) || !strlen($varValue))
                throw new Exception($GLOBALS['TL_LANG']['tl_module']['spambot_fspamlist_score'][1]);
        }
        return $varValue;
    }
}
?> 
  |