1
0

BxAntispamModule.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  1. <?php defined('BX_DOL') or die('hack attempt');
  2. /**
  3. * Copyright (c) UNA, Inc - https://una.io
  4. * MIT License - https://opensource.org/licenses/MIT
  5. *
  6. * @defgroup Antispam Antispam
  7. * @ingroup UnaModules
  8. *
  9. * @{
  10. */
  11. class BxAntispamModule extends BxDolModule
  12. {
  13. private $_bLastSubmittedFormWasToxic;
  14. public function __construct(&$aModule)
  15. {
  16. parent::__construct($aModule);
  17. $this->_bLastSubmittedFormWasToxic = false;
  18. }
  19. public function serviceUpdateDisposableDomainsLists ()
  20. {
  21. $o = bx_instance('BxAntispamDisposableEmailDomains', array(), 'bx_antispam');
  22. $o->updateList('blacklist', 'https://raw.githubusercontent.com/martenson/disposable-email-domains/master/disposable_email_blocklist.conf');
  23. // TODO: uncomment after adding interface for whitelisting
  24. // $o->updateList('whitelist', 'https://raw.githubusercontent.com/martenson/disposable-email-domains/master/whitelist.conf');
  25. }
  26. public function serviceIpTable ()
  27. {
  28. $o = bx_instance('BxAntispamIP', array(), $this->_aModule);
  29. $s = _t('_bx_antispam_ip_table_status', mb_strtolower($o->getIpTableConfigTitle((int)getParam('bx_antispam_ip_list_type'))));
  30. $s .= $this->_grid('bx_antispam_grid_ip_table');
  31. return $s;
  32. }
  33. public function serviceDnsblList ()
  34. {
  35. $s = _t('_bx_antispam_dnsbl_status',
  36. BxTemplFunctions::getInstance()->statusOnOff((bool)$this->_oConfig->getAntispamOption('dnsbl_enable'), true),
  37. BxTemplFunctions::getInstance()->statusOnOff((bool)$this->_oConfig->getAntispamOption('uridnsbl_enable'), true),
  38. mb_strtolower(_t('_bx_antispam_dnsbl_behaviour_login_' . $this->_oConfig->getAntispamOption('dnsbl_behaviour_login'))),
  39. mb_strtolower(_t('_bx_antispam_dnsbl_behaviour_join_' . $this->_oConfig->getAntispamOption('dnsbl_behaviour_join')))
  40. );
  41. $s .= $this->_grid('bx_antispam_grid_dnsbl');
  42. return $s;
  43. }
  44. public function serviceBlockLog ()
  45. {
  46. return $this->_grid('bx_antispam_grid_block_log');
  47. }
  48. /**
  49. * Filter undesired words
  50. *
  51. * @param $sContent content to filter
  52. * @param $sIp IP address of content poster
  53. * @return modified or the same content.
  54. */
  55. public function serviceFilterSpam ($mContent, $sIp = '')
  56. {
  57. if (defined('BX_DOL_CRON_EXECUTE') || isAdmin() || 'on' != $this->_oConfig->getAntispamOption('profanity_enable'))
  58. return $mContent;
  59. $oProfanityFilter = bx_instance('BxAntispamProfanityFilter', array(), $this->_aModule);
  60. return $oProfanityFilter->censor($mContent);
  61. }
  62. /**
  63. * Check text for spam URL.
  64. * It checks URLs found in text for DNSURI black lists (@see BxAntispamDNSURIBlacklists),
  65. *
  66. * @param $sContent content to check for spam
  67. * @return true if spam detected, false if spam isn't detected, null if detection wasn't performed.
  68. */
  69. public function serviceIsSpamUrl ($sContent)
  70. {
  71. $bRet = null;
  72. if ('on' == $this->_oConfig->getAntispamOption('uridnsbl_enable')) {
  73. $oDNSURIBlacklists = bx_instance('BxAntispamDNSURIBlacklists', array(), $this->_aModule);
  74. if ($oDNSURIBlacklists->isSpam($sContent)) {
  75. $oDNSURIBlacklists->onPositiveDetection($sContent);
  76. $bRet = true;
  77. }
  78. else {
  79. $bRet = false;
  80. }
  81. }
  82. return $bRet;
  83. }
  84. /**
  85. * Check text for spam.
  86. * First it check if IP is whitelisted(or under cron execution or user is admin) - for whitelisted IPs check for spam isn't performed,
  87. * then it checks URLs found in text for DNSURI black lists (@see BxAntispamDNSURIBlacklists),
  88. * then it checks text in Akismet service (@see BxAntispamAkismet).
  89. * It can send report if spam is found or tries to inform caller to block the content (depending on configuration).
  90. *
  91. * @param $sContent content to check for spam
  92. * @param $sIp IP address of content poster
  93. * @param $isStripSlashes slashes parameter:
  94. * BX_SLASHES_AUTO - automatically detect magic_quotes_gpc setting
  95. * BX_SLASHES_NO_ACTION - do not perform any action with slashes
  96. * @return true if spam detected and content shouln't be recorded, false if content should be processed as usual.
  97. */
  98. public function serviceIsSpam ($sContent, $sIp = '', $isStripSlashes = BX_SLASHES_AUTO)
  99. {
  100. if (defined('BX_DOL_CRON_EXECUTE') || isAdmin())
  101. return false;
  102. if ($this->serviceIsIpWhitelisted($sIp))
  103. return false;
  104. if (version_compare(phpversion(), '7.4.0', '<') && function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc() && $isStripSlashes == BX_SLASHES_AUTO)
  105. $sContent = stripslashes($sContent);
  106. $bRet = false;
  107. if ('on' == $this->_oConfig->getAntispamOption('uridnsbl_enable')) {
  108. $oDNSURIBlacklists = bx_instance('BxAntispamDNSURIBlacklists', array(), $this->_aModule);
  109. if ($oDNSURIBlacklists->isSpam($sContent)) {
  110. $oDNSURIBlacklists->onPositiveDetection($sContent);
  111. $bRet = true;
  112. }
  113. }
  114. if (!$bRet && 'on' == $this->_oConfig->getAntispamOption('akismet_enable')) {
  115. $oAkismet = bx_instance('BxAntispamAkismet', array(), $this->_aModule);
  116. if ($oAkismet->isSpam($sContent)) {
  117. $oAkismet->onPositiveDetection($sContent);
  118. $bRet = true;
  119. }
  120. }
  121. if ($bRet && 'on' == $this->_oConfig->getAntispamOption('antispam_report')) {
  122. $oProfile = BxDolProfile::getInstance();
  123. $aPlus = array(
  124. 'SpammerUrl' => $oProfile->getUrl(),
  125. 'SpammerNickName' => $oProfile->getDisplayName(),
  126. 'Page' => htmlspecialchars_adv($_SERVER['PHP_SELF']),
  127. 'Get' => print_r($_GET, true),
  128. 'Post' => print_r($_POST, true),
  129. 'SpamContent' => htmlspecialchars_adv($sContent),
  130. );
  131. $aTemplate = BxDolEmailTemplates::getInstance()->parseTemplate('bx_antispam_spam_report', $aPlus);
  132. if (!$aTemplate)
  133. trigger_error('Email template or translation missing: bx_antispam_spam_report', E_USER_ERROR);
  134. sendMail(getParam('site_email'), $aTemplate['Subject'], $aTemplate['Body']);
  135. }
  136. if ($bRet && 'on' == $this->_oConfig->getAntispamOption('antispam_block'))
  137. return true;
  138. return false;
  139. }
  140. /**
  141. * Check text for toxicity.
  142. * It can send report if toxic content is found or tries to inform caller to block the content (depending on configuration).
  143. *
  144. * @param $sContent content to check for spam
  145. * @param $sIp IP address of content poster
  146. * @param $isStripSlashes slashes parameter:
  147. * BX_SLASHES_AUTO - automatically detect magic_quotes_gpc setting
  148. * BX_SLASHES_NO_ACTION - do not perform any action with slashes
  149. * @return true if toxic content detected and content shouln't be recorded, false if content should be processed as usual.
  150. */
  151. public function serviceIsToxic ($sContent, $sIp = '', $isStripSlashes = BX_SLASHES_AUTO, $bSupressNotification = false)
  152. {
  153. if (defined('BX_DOL_CRON_EXECUTE') || isAdmin())
  154. return false;
  155. static $aQuickCache;
  156. $key = md5($sContent);
  157. if (isset($aQuickCache[$key]))
  158. return $aQuickCache[$key];
  159. $aQuickCache[$key] = false;
  160. if (!$this->serviceIsIpWhitelisted($sIp)) {
  161. if (version_compare(phpversion(), '7.4.0', '<') && function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc() && $isStripSlashes == BX_SLASHES_AUTO)
  162. $sContent = stripslashes($sContent);
  163. if ('on' == $this->_oConfig->getAntispamOption('toxicity_enable')) {
  164. $oPerspectiveAPI = bx_instance('BxAntispamPerspectiveAPI', array(), $this->_aModule);
  165. if ($oPerspectiveAPI->isToxic($sContent)) {
  166. $oPerspectiveAPI->onPositiveDetection($sContent);
  167. $aQuickCache[$key] = true;
  168. if (!$bSupressNotification) $this->serviceOnToxicContentFound($sContent);
  169. }
  170. }
  171. }
  172. return $aQuickCache[$key];
  173. }
  174. public function serviceCheckFormForToxicity(&$oForm) {
  175. $this->_bLastSubmittedFormWasToxic = false;
  176. if (!$oForm->isValid() || !$oForm->isSubmitted()) return false;
  177. $sSubmitName = false;
  178. $sFormText = '';
  179. foreach ($oForm->aInputs as $k => $a) {
  180. if (isset($a['visible_for_levels']) && !BxDolForm::isVisible($a))
  181. continue;
  182. if (empty($a['name']) || 'submit' == $a['type'] || 'reset' == $a['type'] || 'button' == $a['type'] || 'value' == $a['type']) {
  183. if (isset($a['type']) && 'submit' == $a['type'])
  184. $sSubmitName = $k;
  185. continue;
  186. }
  187. if ('input_set' == $a['type'])
  188. foreach ($a as $r)
  189. if (isset($r['type']) && 'submit' == $r['type'])
  190. $sSubmitName = $k;
  191. $a['name'] = str_replace('[]', '', $a['name']);
  192. if ($a['type'] != 'textarea' && $a['type'] != 'text')
  193. continue;
  194. $val = BxDolForm::getSubmittedValue($a['name'], $oForm->aFormAttrs['method']);
  195. if (!$val)
  196. continue;
  197. $sFormText .= " ".$val; // collect all text fields into a single text
  198. }
  199. if ($this->serviceIsToxic($sFormText, '', BX_SLASHES_AUTO, true)) {
  200. $this->_bLastSubmittedFormWasToxic = true;
  201. $sActionrequired = $this->_oConfig->getAntispamOption('toxicity_action');
  202. if ($sActionrequired == 'block' || $sActionrequired == 'disapprove' && !$oForm->isStatusFieldSupported()) {
  203. $oForm->setValid(false);
  204. $this->serviceOnToxicContentFound($sFormText);
  205. if ($sSubmitName)
  206. $oForm->aInputs[$sSubmitName]['error'] = _t('_bx_antispam_form_submission_error');
  207. } elseif ($sActionrequired == 'disapprove' && $oForm->isStatusFieldSupported()) {
  208. $oForm->setForceSetToPending(true);
  209. return false;
  210. }
  211. }
  212. }
  213. public function serviceIsLastFormSubmittedToxic() {
  214. return $this->_bLastSubmittedFormWasToxic;
  215. }
  216. public function serviceSetCommentAsPending($iCmtId) {
  217. return $this->_oDb->setCommentStatus($iCmtId, BX_CMT_STATUS_PENDING);
  218. }
  219. public function serviceOnFormSubmitted($sModule, $iEntry) {
  220. if ($this->_bLastSubmittedFormWasToxic) {
  221. $this->serviceOnToxicContentPosted($sModule, $iEntry);
  222. }
  223. }
  224. public function serviceOnToxicContentFound(&$sText) {
  225. if ('on' == $this->_oConfig->getAntispamOption('toxicity_report')) {
  226. $oProfile = BxDolProfile::getInstance();
  227. if (!$oProfile) return;
  228. $aPlus = array(
  229. 'AuthorUrl' => $oProfile->getUrl(),
  230. 'AuthorNickName' => $oProfile->getDisplayName(),
  231. 'Page' => htmlspecialchars_adv($_SERVER['PHP_SELF']),
  232. 'Content' => htmlspecialchars_adv(strip_tags($sText)),
  233. );
  234. $aTemplate = BxDolEmailTemplates::getInstance()->parseTemplate('bx_antispam_toxicity_blocked_report', $aPlus);
  235. if (!$aTemplate)
  236. trigger_error('Email template or translation missing: bx_antispam_toxicity_blocked_report', E_USER_ERROR);
  237. sendMail(getParam('site_email'), $aTemplate['Subject'], $aTemplate['Body']);
  238. bx_alert('bx_antispam', 'toxic_content_found', 0, bx_get_logged_profile_id(), array(
  239. 'text' => $sText,
  240. ));
  241. }
  242. }
  243. public function serviceOnToxicContentPosted($sModule, $iContentId) {
  244. if ('on' == $this->_oConfig->getAntispamOption('toxicity_report') && $sModule) {
  245. $oModule = BxDolModule::getInstance($sModule);
  246. $CNF = &$oModule->_oConfig->CNF;
  247. $sContentUrl = isset($CNF['URI_VIEW_ENTRY']) ? bx_absolute_url(BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_VIEW_ENTRY'] . '&id=' . $iContentId)) : false;
  248. $sManageContentUrl = isset($CNF['URL_MANAGE_ADMINISTRATION']) ? bx_absolute_url(BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URL_MANAGE_ADMINISTRATION'])) : false;
  249. $oProfile = BxDolProfile::getInstance();
  250. if (!$oProfile) return;
  251. $aPlus = array(
  252. 'AuthorUrl' => $oProfile->getUrl(),
  253. 'AuthorNickName' => $oProfile->getDisplayName(),
  254. 'Page' => htmlspecialchars_adv($_SERVER['PHP_SELF']),
  255. 'bx_if:content_url' => [
  256. 'condition' => boolval($sContentUrl),
  257. 'content' => ['c_url' => $sContentUrl],
  258. ],
  259. 'bx_if:manage_content_url' => [
  260. 'condition' => boolval($sManageContentUrl),
  261. 'content' => ['m_url' => $sManageContentUrl],
  262. ],
  263. );
  264. $aTemplate = BxDolEmailTemplates::getInstance()->parseTemplate('bx_antispam_toxicity_posted_report', $aPlus);
  265. if (!$aTemplate)
  266. trigger_error('Email template or translation missing: bx_antispam_toxicity_posted_report', E_USER_ERROR);
  267. sendMail(getParam('site_email'), $aTemplate['Subject'], $aTemplate['Body']);
  268. bx_alert('bx_antispam', 'toxic_content_posted', $iContentId, bx_get_logged_profile_id(), array(
  269. 'module' => $sModule,
  270. 'entry_id' => $iContentId,
  271. 'entry_url' => $sContentUrl,
  272. ));
  273. }
  274. }
  275. /**
  276. * Perform complex check if user is allowed to login.
  277. * First it checks if IP is directly blocked (@see serviceIsIpBlocked),
  278. * then it checks in DNS black lists (@see serviceIsIpDnsBlacklisted).
  279. *
  280. * @param $sIp IP to check, or empty for current IP
  281. * @return empty string - if join should be allowed, error message - if join should be blocked
  282. */
  283. public function serviceCheckLogin ($sIp = '')
  284. {
  285. $bLoginBlock = ('block' == $this->_oConfig->getAntispamOption('dnsbl_behaviour_login'));
  286. $sErrorMsg = '';
  287. $sNote = $bLoginBlock ? 'login block' : 'login log';
  288. if (!$sIp)
  289. $sIp = getVisitorIP();
  290. if (!$sErrorMsg && $this->serviceIsIpBlocked($sIp))
  291. $sErrorMsg = $this->getErrorMessageIpBlocked();
  292. if (!$sErrorMsg && 'on' == $this->_oConfig->getAntispamOption('dnsbl_enable') && $this->serviceIsIpDnsBlacklisted($sIp, $sNote) && $bLoginBlock)
  293. $sErrorMsg = $this->getErrorMessageSpam();
  294. return $sErrorMsg;
  295. }
  296. /**
  297. * Perform complex check if user is allowed to join.
  298. * First it checks if IP is directly blocked (@see serviceIsIpBlocked),
  299. * then it checks in DNS black lists (@see serviceIsIpDnsBlacklisted),
  300. * then it checks in StopForumSpam service (@see BxAntispamStopForumSpam).
  301. *
  302. * @param $sCurIP IP to check, or empty for current IP
  303. * @return empty string - if join should be allowed, error message - if join should be blocked
  304. */
  305. public function serviceCheckJoin ($sEmail, &$bApproval, $sIp = '')
  306. {
  307. $bJoinBlock = ('block' == $this->_oConfig->getAntispamOption('dnsbl_behaviour_join'));
  308. $bApproval = false;
  309. $sErrorMsg = '';
  310. $sNote = $bJoinBlock ? 'join block' : 'join approval';
  311. if (!$sIp)
  312. $sIp = getVisitorIP();
  313. // check if IP is blocked
  314. if (!$sErrorMsg && $this->serviceIsIpBlocked($sIp))
  315. $sErrorMsg = $this->getErrorMessageIpBlocked();
  316. // check in DNSBL lists
  317. if (!$sErrorMsg && 'on' == $this->_oConfig->getAntispamOption('dnsbl_enable') && $this->serviceIsIpDnsBlacklisted($sIp, $sNote)) {
  318. if ('approval' == $this->_oConfig->getAntispamOption('dnsbl_behaviour_join'))
  319. $bApproval = true;
  320. else
  321. $sErrorMsg = $this->getErrorMessageSpam();
  322. }
  323. // check in StopForumSpam service
  324. if (!$sErrorMsg) {
  325. $oStopForumSpam = bx_instance('BxAntispamStopForumSpam', array(), $this->_aModule);
  326. if ($oStopForumSpam->isSpammer(array('email' => $sEmail, 'ip' => $sIp), $sNote))
  327. $sErrorMsg = $this->getErrorMessageSpam();
  328. }
  329. // check for disposable email domains
  330. if (!$sErrorMsg && 'disable' != ($sMode = $this->_oConfig->getAntispamOption('disposable_email_domains_mode'))) {
  331. $bDisposableEmailDomainsBehaviour = $this->_oConfig->getAntispamOption('disposable_email_domains_behaviour_join');
  332. $oDisposableEmailDomains = bx_instance('BxAntispamDisposableEmailDomains', array(), 'bx_antispam');
  333. if ('blacklist' == $sMode && $oDisposableEmailDomains->isBlacklisted($sEmail)) {
  334. if ('approval' == $bDisposableEmailDomainsBehaviour)
  335. $bApproval = true;
  336. else
  337. $sErrorMsg = $oDisposableEmailDomains->getErrorMessageBlacklisted();
  338. }
  339. elseif ('whitelist' == $sMode && !$oDisposableEmailDomains->isWhitelisted($sEmail)) {
  340. if ('approval' == $bDisposableEmailDomainsBehaviour)
  341. $bApproval = true;
  342. else
  343. $sErrorMsg = $oDisposableEmailDomains->getErrorMessageNotWhitelisted();
  344. }
  345. }
  346. return $sErrorMsg;
  347. }
  348. /**
  349. * Check if IP is blacklisted in some DNS chain (@see BxAntispamDNSBlacklists).
  350. *
  351. * @param $sCurIP IP to check, or empty for current IP
  352. * @param $sNote [optional] place where checking is performed, for example 'join', 'login'
  353. * @return true if IP blacklisted and not whiteloisted, or false if under cron execution or if IP isn't blacklisted
  354. */
  355. public function serviceIsIpDnsBlacklisted($sCurIP = '', $sNote = '')
  356. {
  357. if (defined('BX_DOL_CRON_EXECUTE'))
  358. return false;
  359. if (!$sCurIP)
  360. $sCurIP = getVisitorIP();
  361. if ($this->serviceIsIpWhitelisted($sCurIP))
  362. return false;
  363. $o = bx_instance('BxAntispamDNSBlacklists', array(), $this->_aModule);
  364. if (BX_DOL_DNSBL_POSITIVE == $o->dnsbl_lookup_ip(BX_DOL_DNSBL_CHAIN_SPAMMERS, $sCurIP) && BX_DOL_DNSBL_POSITIVE != $o->dnsbl_lookup_ip(BX_DOL_DNSBL_CHAIN_WHITELIST, $sCurIP)) {
  365. $o->onPositiveDetection ($sCurIP, $sNote);
  366. return true;
  367. }
  368. return false;
  369. }
  370. /**
  371. * @see BxAntispamIP::isIpWhitelisted
  372. */
  373. public function serviceIsIpWhitelisted($sIp = '')
  374. {
  375. $o = bx_instance('BxAntispamIP', array(), $this->_aModule);
  376. return $o->isIpWhitelisted($sIp);
  377. }
  378. /**
  379. * @see BxAntispamIP::isIpBlocked
  380. */
  381. public function serviceIsIpBlocked($sIp = '')
  382. {
  383. $o = bx_instance('BxAntispamIP', array(), $this->_aModule);
  384. return $o->isIpBlocked($sIp);
  385. }
  386. /**
  387. * @see BxAntispamIP::blockIp
  388. */
  389. public function serviceBlockIp($mixedIP, $iExpirationInSec = 86400, $sComment = '')
  390. {
  391. $o = bx_instance('BxAntispamIP', array(), $this->_aModule);
  392. return $o->blockIp($mixedIP, $iExpirationInSec, $sComment);
  393. }
  394. /**
  395. * @see BxAntispamIP::pruning
  396. */
  397. public function servicePruning()
  398. {
  399. $o = bx_instance('BxAntispamIP', array(), $this->_aModule);
  400. return $o->pruning();
  401. }
  402. /**
  403. * @see BxAntispamIP::pruning
  404. */
  405. public function serviceConfigValues($s)
  406. {
  407. switch ($s) {
  408. case 'ip_table':
  409. $o = bx_instance('BxAntispamIP', array(), $this->_aModule);
  410. return $o->getIpTableConfigValues();
  411. case 'dnsbl_login':
  412. $o = bx_instance('BxAntispamDNSBlacklists', array(), $this->_aModule);
  413. return $o->getDNSBLConfigValues();
  414. case 'dnsbl_join';
  415. $o = bx_instance('BxAntispamDNSURIBlacklists', array(), $this->_aModule);
  416. return $o->getURIDNSBLConfigValues();
  417. case 'disposable_email_domains_join';
  418. $o = bx_instance('BxAntispamDisposableEmailDomains', array(), $this->_aModule);
  419. return $o->getJoinBehaviourValues();
  420. case 'disposable_email_domains_mode';
  421. $o = bx_instance('BxAntispamDisposableEmailDomains', array(), $this->_aModule);
  422. return $o->getJoinBehaviourModes();
  423. }
  424. }
  425. /**
  426. * @return array with avaliable dictionaries languages
  427. */
  428. public function serviceGetProfanityFilterDicts ()
  429. {
  430. $oProfanityFilter = bx_instance('BxAntispamProfanityFilter', array(), $this->_aModule);
  431. return $oProfanityFilter->getDicts();
  432. }
  433. /**
  434. * @return array with avaliable toxicity filter actions
  435. */
  436. public function serviceGetToxicityFilterActions ()
  437. {
  438. return [
  439. 'none' => _t('_bx_antispam_option_toxicity_filter_action_none'),
  440. 'block' => _t('_bx_antispam_option_toxicity_filter_action_block'),
  441. 'disapprove' => _t('_bx_antispam_option_toxicity_filter_action_disapprove'),
  442. ];
  443. }
  444. protected function getErrorMessageIpBlocked ()
  445. {
  446. bx_import('BxDolLanguages');
  447. return _t('_bx_antispam_ip_blocked', $this->getErrorMessageSubmitFalsePositiveReport());
  448. }
  449. protected function getErrorMessageSpam ()
  450. {
  451. bx_import('BxDolLanguages');
  452. return _t('_bx_antispam_spam_detected', $this->getErrorMessageSubmitFalsePositiveReport());
  453. }
  454. protected function getErrorMessageSubmitFalsePositiveReport ()
  455. {
  456. if (BxDolRequest::serviceExists('bx_contact', 'get_contact_page_url') && ($sUrl = BxDolService::call('bx_contact', 'get_contact_page_url')))
  457. return _t('_bx_antispam_submit_false_positive_report', $sUrl);
  458. return '';
  459. }
  460. protected function _grid ($sObjectGrid)
  461. {
  462. $oGrid = BxDolGrid::getObjectInstance($sObjectGrid);
  463. return $oGrid ? $oGrid->getCode() : '';
  464. }
  465. }
  466. /** @} */