Răsfoiți Sursa

#327 Antispam: block disposable email domains

Alex Trofimov 9 ani în urmă
părinte
comite
542965f942

+ 2 - 0
modules/boonex/antispam/classes/BxAntispamConfig.php

@@ -22,6 +22,8 @@ class BxAntispamConfig extends BxDolModuleConfig
         'dnsbl_behaviour_login' => 'bx_antispam_dnsbl_behaviour_login',
         'dnsbl_behaviour_join' => 'bx_antispam_dnsbl_behaviour_join',
         'akismet_enable' => 'bx_antispam_akismet_enable',
+        'disposable_email_domains_mode' => 'bx_antispam_disposable_email_domains_mode',
+        'disposable_email_domains_behaviour_join' => 'bx_antispam_disposable_email_domains_behaviour_join',
     );
     /**
      * default local options, it is filled in with real system options in class contructor, @see restoreAntispamOptions

+ 25 - 0
modules/boonex/antispam/classes/BxAntispamCronUpdateDisposableEmailDomains.php

@@ -0,0 +1,25 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Antispam Antispam
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxAntispamCronUpdateDisposableEmailDomains extends BxDolCron
+{
+    function processing()
+    {
+        $o = bx_instance('BxAntispamDisposableEmailDomains', array(), 'bx_antispam');
+
+        $o->updateList('blacklist', 'https://raw.githubusercontent.com/martenson/disposable-email-domains/master/disposable_email_blacklist.conf');
+
+        // TODO: uncomment after adding interface for whitelisting
+        // $o->updateList('whitelist', 'https://raw.githubusercontent.com/martenson/disposable-email-domains/master/whitelist.conf');
+    }
+}
+
+/** @} */

+ 86 - 0
modules/boonex/antispam/classes/BxAntispamDisposableEmailDomains.php

@@ -0,0 +1,86 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Antispam Antispam
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+
+/**
+ *  Check for disposable email domain
+ */
+class BxAntispamDisposableEmailDomains extends BxDol
+{
+    protected $oDb;
+
+    public function __construct()
+    {
+        parent::__construct();
+        $this->oDb = BxDolDb::getInstance();
+    }
+
+    public function isWhitelisted($sEmail)
+    {
+        return $this->isEmailInList($sEmail, 'custom_whitelist');
+    }
+
+    public function isBlacklisted($sEmail)
+    {
+        return !$this->isEmailInList($sEmail, 'whitelist') && ($this->isEmailInList($sEmail, 'blacklist') || $this->isEmailInList($sEmail, 'custom_blacklist'));
+    }
+
+    public function isEmailInList($sEmail, $sList)
+    {
+        $a = explode('@', $sEmail);
+        if (!isset($a[1]))
+            return false;
+        $sEmailDomain = $a[1];
+        return $this->oDb->getOne("SELECT `id` FROM `bx_antispam_disposable_email_domains` WHERE `list` = ? AND `domain` = ?", array($sList, $sEmailDomain));
+    }
+
+    public function updateList ($sList, $sUrl)
+    {
+        if (!($aDomains = file($sUrl, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)))
+            return false;
+
+        $this->oDb->query("DELETE FROM `bx_antispam_disposable_email_domains` WHERE `list` = ?", array($sList));
+        foreach ($aDomains as $sDomain)
+            $this->oDb->query("INSERT INTO `bx_antispam_disposable_email_domains` SET `list` = ?, `domain` = ?", array($sList, $sDomain));
+
+        return true;
+    }
+
+    public function getJoinBehaviourValues ()
+    {
+        return array (
+            'block' => _t('_bx_antispam_disposable_email_domains_behaviour_join_block'),
+            'approval' => _t('_bx_antispam_disposable_email_domains_behaviour_join_approval'),
+        );
+    }
+
+    public function getJoinBehaviourModes ()
+    {
+        return array (
+            'disable' => _t('_bx_antispam_disposable_email_domains_mode_disable'),
+            'blacklist' => _t('_bx_antispam_disposable_email_domains_mode_blacklist'),
+            // TODO: uncomment after adding interface for whitelisting
+            // 'whitelist' => _t('_bx_antispam_disposable_email_domains_mode_whitelist'),             
+        );
+    }
+
+    public function getErrorMessageBlacklisted ()
+    {
+        return _t('_bx_antispam_disposable_email_domains_msg_blacklisted');
+    }
+
+    public function getErrorMessageNotWhitelisted ()
+    {
+        return $this->getErrorMessageBlacklisted ();
+    }    
+}
+
+/** @} */

+ 30 - 0
modules/boonex/antispam/classes/BxAntispamModule.php

@@ -153,9 +153,11 @@ class BxAntispamModule extends BxDolModule
         if (!$sIp)
             $sIp = getVisitorIP();
 
+        // check if IP is blocked
         if (!$sErrorMsg && $this->serviceIsIpBlocked($sIp))
             $sErrorMsg = $this->getErrorMessageIpBlocked();
 
+        // check in DNSBL lists
         if (!$sErrorMsg && 'on' == $this->_oConfig->getAntispamOption('dnsbl_enable') && $this->serviceIsIpDnsBlacklisted($sIp, $sNote)) {
             if ('approval' == $this->_oConfig->getAntispamOption('dnsbl_behaviour_join'))
                 $bApproval = true;
@@ -163,12 +165,34 @@ class BxAntispamModule extends BxDolModule
                 $sErrorMsg = $this->getErrorMessageSpam();
         }
 
+        // check in StopForumSpam service
         if (!$sErrorMsg) {
             $oStopForumSpam = bx_instance('BxAntispamStopForumSpam', array(), $this->_aModule);
             if ($oStopForumSpam->isSpammer(array('email' => $sEmail, 'ip' => $sIp), $sNote))
                 $sErrorMsg = $this->getErrorMessageSpam();
         }
 
+        // check for disposable email domains
+        if (!$sErrorMsg && 'disable' != ($sMode = $this->_oConfig->getAntispamOption('disposable_email_domains_mode'))) {
+
+            $bDisposableEmailDomainsBehaviour = $this->_oConfig->getAntispamOption('disposable_email_domains_behaviour_join');
+            $oDisposableEmailDomains = bx_instance('BxAntispamDisposableEmailDomains', array(), 'bx_antispam');
+            
+            if ('blacklist' == $sMode && $oDisposableEmailDomains->isBlacklisted($sEmail)) {
+                if ('approval' == $bDisposableEmailDomainsBehaviour)
+                    $bApproval = true;
+                else
+                    $sErrorMsg = $oDisposableEmailDomains->getErrorMessageBlacklisted();
+            }
+            elseif ('whitelist' == $sMode && !$oDisposableEmailDomains->isWhitelisted($sEmail)) {
+                if ('approval' == $bDisposableEmailDomainsBehaviour)
+                    $bApproval = true;
+                else
+                    $sErrorMsg = $oDisposableEmailDomains->getErrorMessageNotWhitelisted();
+            }
+
+        }
+
         return $sErrorMsg;
     }
 
@@ -251,6 +275,12 @@ class BxAntispamModule extends BxDolModule
             case 'dnsbl_join';
                 $o = bx_instance('BxAntispamDNSURIBlacklists', array(), $this->_aModule);
                 return $o->getURIDNSBLConfigValues();
+            case 'disposable_email_domains_join';
+                $o = bx_instance('BxAntispamDisposableEmailDomains', array(), $this->_aModule);
+                return $o->getJoinBehaviourValues();                
+            case 'disposable_email_domains_mode';
+                $o = bx_instance('BxAntispamDisposableEmailDomains', array(), $this->_aModule);
+                return $o->getJoinBehaviourModes();                
         }
     }
 

+ 14 - 5
modules/boonex/antispam/install/langs/en.xml

@@ -58,7 +58,13 @@ This antispam method scan submitted content for the URLs and check them if any o
 	<string name="_bx_antispam_dnsbl_behaviour_login_block"><![CDATA[Block]]></string>
 	<string name="_bx_antispam_dnsbl_behaviour_login_log"><![CDATA[Log]]></string>
 	<string name="_bx_antispam_dnsbl_behaviour_join_block"><![CDATA[Block]]></string>
-	<string name="_bx_antispam_dnsbl_behaviour_join_approval"><![CDATA[Approval]]></string>
+    <string name="_bx_antispam_dnsbl_behaviour_join_approval"><![CDATA[Approval]]></string>
+	<string name="_bx_antispam_disposable_email_domains_mode_disable"><![CDATA[Disable]]></string>
+	<string name="_bx_antispam_disposable_email_domains_mode_whitelist"><![CDATA[Allow whitelisted only]]></string>
+	<string name="_bx_antispam_disposable_email_domains_mode_blacklist"><![CDATA[Disallow blacklisted]]></string>
+	<string name="_bx_antispam_disposable_email_domains_behaviour_join_block"><![CDATA[Block]]></string>
+	<string name="_bx_antispam_disposable_email_domains_behaviour_join_approval"><![CDATA[Approval]]></string>
+    <string name="_bx_antispam_disposable_email_domains_msg_blacklisted"><![CDATA[Your email domain isn't allowed for registration on this site]]></string>
 
 	<string name="_bx_antispam_popup_help"><![CDATA[DNSBL help]]></string>
 	<string name="_bx_antispam_popup_dnsbl_recheck"><![CDATA[Recheck IP/URL in DNSBL/URIDNSBL]]></string>
@@ -114,7 +120,8 @@ This antispam method scan submitted content for the URLs and check them if any o
     <string name="_bx_antispam_adm_stg_cpt_category_dnsbl"><![CDATA[DNSBL]]></string>
     <string name="_bx_antispam_adm_stg_cpt_category_akismet"><![CDATA[Akismet]]></string>
     <string name="_bx_antispam_adm_stg_cpt_category_stopforumspam"><![CDATA[StopForumSpam]]></string>
-
+    <string name="_bx_antispam_adm_stg_cpt_category_disposable_email_domains"><![CDATA[Disposable email domains]]></string>
+    
 	<string name="_bx_antispam_option_block"><![CDATA[Total block all spam content]]></string>
 	<string name="_bx_antispam_option_report"><![CDATA[Send report to admin if spam content discovered]]></string>
 	<string name="_bx_antispam_option_ip_list_type"><![CDATA[IP table mode]]></string>
@@ -125,8 +132,10 @@ This antispam method scan submitted content for the URLs and check them if any o
 	<string name="_bx_antispam_option_akismet_enable"><![CDATA[Enable Akismet]]></string>
 	<string name="_bx_antispam_option_akismet_api_key"><![CDATA[Akismet API Key]]></string>
 	<string name="_bx_antispam_option_stopforumspam_enable"><![CDATA[Enable "Stop Forum Spam"]]></string>
-	<string name="_bx_antispam_option_stopforumspam_api_key"><![CDATA["Stop Forum Spam" API Key]]></string>
-
+    <string name="_bx_antispam_option_stopforumspam_api_key"><![CDATA["Stop Forum Spam" API Key]]></string> 
+	<string name="_bx_antispam_option_disposable_email_domains_mode"><![CDATA[Mode]]></string>
+	<string name="_bx_antispam_option_disposable_email_domains_behaviour_join"><![CDATA[Join behaviour]]></string>
+    
     <string name="_bx_antispam_spam_report_name"><![CDATA[Spam report message]]></string>
     <string name="_bx_antispam_spam_report_subject"><![CDATA[Automatic spam report]]></string>
     <string name="_bx_antispam_spam_report_body"><![CDATA[{email_header}
@@ -149,4 +158,4 @@ This antispam method scan submitted content for the URLs and check them if any o
 {SpamContent}
 </pre>
 {email_footer}]]></string>
-</resources>
+</resources>

+ 10 - 1
modules/boonex/antispam/install/sql/enable.sql

@@ -57,6 +57,14 @@ INSERT INTO `sys_options`(`category_id`, `name`, `caption`, `value`, `type`, `ex
 (@iCategoryId, 'bx_antispam_stopforumspam_enable', '_bx_antispam_option_stopforumspam_enable', 'on', 'checkbox', '', '', '', 10),
 (@iCategoryId, 'bx_antispam_stopforumspam_api_key', '_bx_antispam_option_stopforumspam_api_key', '', 'digit', '', '', '', 20);
 
+INSERT INTO `sys_options_categories` (`type_id`, `name`, `caption`, `order` )  
+VALUES (@iTypeId, 'bx_antispam_disposable_email_domains', '_bx_antispam_adm_stg_cpt_category_disposable_email_domains', 6);
+SET @iCategoryId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options`(`category_id`, `name`, `caption`, `value`, `type`, `extra`, `check`, `check_error`, `order`) VALUES
+(@iCategoryId, 'bx_antispam_disposable_email_domains_mode', '_bx_antispam_option_disposable_email_domains_mode', 'blacklist', 'select', 'a:3:{s:6:"module";s:11:"bx_antispam";s:6:"method";s:13:"config_values";s:6:"params";a:1:{i:0;s:29:"disposable_email_domains_mode";}}', '', '', 10),
+(@iCategoryId, 'bx_antispam_disposable_email_domains_behaviour_join', '_bx_antispam_option_disposable_email_domains_behaviour_join', 'block', 'select', 'a:3:{s:6:"module";s:11:"bx_antispam";s:6:"method";s:13:"config_values";s:6:"params";a:1:{i:0;s:29:"disposable_email_domains_join";}}', '', '', 20);
+
 
 -- page: DNSBL list
 
@@ -201,5 +209,6 @@ INSERT INTO `sys_email_templates` (`Module`, `NameSystem`, `Name`, `Subject`, `B
 -- cron
 
 INSERT INTO `sys_cron_jobs` (`name`, `time`, `class`, `file`, `service_call`) VALUES
-('bx_antispam_pruning', '0 0 * * *', 'BxAntispamCronPruning', 'modules/boonex/antispam/classes/BxAntispamCronPruning.php', '');
+('bx_antispam_pruning', '0 0 * * *', 'BxAntispamCronPruning', 'modules/boonex/antispam/classes/BxAntispamCronPruning.php', ''),
+('bx_antispam_update_disposable_email_domains', '0 0 */14 * *', 'BxAntispamCronUpdateDisposableEmailDomains', 'modules/boonex/antispam/classes/BxAntispamCronUpdateDisposableEmailDomains.php', '');
 

+ 8 - 0
modules/boonex/antispam/install/sql/install.sql

@@ -36,6 +36,14 @@ CREATE TABLE `bx_antispam_dnsbluri_zones` (
   `zone` varchar(64) NOT NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
+CREATE TABLE IF NOT EXISTS `bx_antispam_dnsbluri_zones` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `domain` varchar(255) NOT NULL,
+  `list` enum('blacklist','custom_blacklist','whitelist','custom_whitelist') NOT NULL DEFAULT 'custom_blacklist',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `domain` (`domain`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
 CREATE TABLE `bx_antispam_block_log` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `ip` int(10) unsigned NOT NULL,

+ 1 - 1
modules/boonex/antispam/install/sql/uninstall.sql

@@ -1,5 +1,5 @@
 
-DROP TABLE IF EXISTS `bx_antispam_ip_table`, `bx_antispam_dnsbl_rules`, `bx_antispam_dnsbluri_zones`, `bx_antispam_block_log`;
+DROP TABLE IF EXISTS `bx_antispam_ip_table`, `bx_antispam_dnsbl_rules`, `bx_antispam_dnsbluri_zones`, `bx_antispam_dnsbluri_zones`, `bx_antispam_block_log`;
 
 -- Studio page and widget
 

+ 13 - 4
modules/boonex/russian/data/langs/bx_antispam/ru.xml

@@ -58,8 +58,14 @@ URI DNSBL - это DNSBL, которые перечисляют доменные
 	<string name="_bx_antispam_dnsbl_behaviour_login_block"><![CDATA[Заблокировать]]></string>
 	<string name="_bx_antispam_dnsbl_behaviour_login_log"><![CDATA[Журнал]]></string>
 	<string name="_bx_antispam_dnsbl_behaviour_join_block"><![CDATA[Заблокировать]]></string>
-	<string name="_bx_antispam_dnsbl_behaviour_join_approval"><![CDATA[Неактивные]]></string>
-
+	<string name="_bx_antispam_dnsbl_behaviour_join_approval"><![CDATA[На проверку]]></string>
+	<string name="_bx_antispam_disposable_email_domains_mode_disable"><![CDATA[Отключить]]></string>
+	<string name="_bx_antispam_disposable_email_domains_mode_whitelist"><![CDATA[Пропускать только из разрешенного списка]]></string>
+	<string name="_bx_antispam_disposable_email_domains_mode_blacklist"><![CDATA[Не пропускать из черного списка]]></string>
+	<string name="_bx_antispam_disposable_email_domains_behaviour_join_block"><![CDATA[Блокирвать]]></string>
+    <string name="_bx_antispam_disposable_email_domains_behaviour_join_approval"><![CDATA[На проверку]]></string>
+    <string name="_bx_antispam_disposable_email_domains_msg_blacklisted"><![CDATA[Домен вашего емейла не разрешен для регистрации на этом сайте]]></string>
+    
 	<string name="_bx_antispam_popup_help"><![CDATA[Помощь по DNSBL]]></string>
 	<string name="_bx_antispam_popup_dnsbl_recheck"><![CDATA[Перепроверить IP/URL в DNSBL/URIDNSBL]]></string>
 	<string name="_bx_antispam_popup_dnsbl_add"><![CDATA[Добавить правило для страны]]></string>
@@ -114,6 +120,7 @@ URI DNSBL - это DNSBL, которые перечисляют доменные
     <string name="_bx_antispam_adm_stg_cpt_category_dnsbl"><![CDATA[DNSBL]]></string>
     <string name="_bx_antispam_adm_stg_cpt_category_akismet"><![CDATA[Akismet]]></string>
     <string name="_bx_antispam_adm_stg_cpt_category_stopforumspam"><![CDATA[StopForumSpam]]></string>
+    <string name="_bx_antispam_adm_stg_cpt_category_disposable_email_domains"><![CDATA[Временные е-mail домены]]></string>
 
 	<string name="_bx_antispam_option_block"><![CDATA[Полностью заблокировать весь спам-контент]]></string>
 	<string name="_bx_antispam_option_report"><![CDATA[Послать отчёт администратору при обнаружении спам-контента]]></string>
@@ -126,7 +133,9 @@ URI DNSBL - это DNSBL, которые перечисляют доменные
 	<string name="_bx_antispam_option_akismet_api_key"><![CDATA[Ключ для Akismet API]]></string>
 	<string name="_bx_antispam_option_stopforumspam_enable"><![CDATA[Включить "Stop Forum Spam"]]></string>
 	<string name="_bx_antispam_option_stopforumspam_api_key"><![CDATA[Ключ для "Stop Forum Spam" API]]></string>
-
+	<string name="_bx_antispam_option_disposable_email_domains_mode"><![CDATA[Режим]]></string>
+    <string name="_bx_antispam_option_disposable_email_domains_behaviour_join"><![CDATA[Поведение при регистрации пользователя]]></string>
+    
     <string name="_bx_antispam_spam_report_name"><![CDATA[Сообщение отчёта о спаме]]></string>
     <string name="_bx_antispam_spam_report_subject"><![CDATA[Автоматический отчёт о спаме]]></string>
     <string name="_bx_antispam_spam_report_body"><![CDATA[{email_header}
@@ -149,4 +158,4 @@ URI DNSBL - это DNSBL, которые перечисляют доменные
 {SpamContent}
 </pre>
 {email_footer}]]></string>
-</resources>
+</resources>