plugins = $plugins; $this->min_weighting_before_spam = (double)$min_weighting_before_spam; $this->check_usernames = (bool)$check_usernames; $this->check_emails = (bool)$check_emails; $this->check_ips = (bool)$check_ips; $this->log_blocks = (bool)$log_blocks; } /** * Check a user against the 3rd party service to determine whether they are a spammer. * * @param string $username The username of the user to check. * @param string $email The email address of the user to check. * @param string $ip_address The IP address sof the user to check. * @return bool Whether the user is considered a spammer or not. * @throws Exception Thrown when there's an error fetching from the StopForumSpam API or when the data cannot be decoded. */ public function is_user_a_spammer($username = '', $email = '', $ip_address = '') { $is_spammer = false; $checknum = $confidence = 0; if(!filter_var($email, FILTER_VALIDATE_EMAIL)) { throw new Exception("stopforumspam_invalid_email"); } if(!filter_var($ip_address, FILTER_VALIDATE_IP)) { throw new Exception('stopforumspam_invalid_ip_address'); } $is_internal_ip = !filter_var( $ip_address, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ); if($is_internal_ip) { return false; } $username_encoded = urlencode($username); $email_encoded = urlencode($email); $check_url = sprintf(self::STOP_FORUM_SPAM_API_URL_FORMAT, $username_encoded, $email_encoded, $ip_address); $result = fetch_remote_file($check_url); if($result !== false) { $result_json = @json_decode($result); if($result_json != null && !isset($result_json->error)) { if($this->check_usernames && $result_json->username->appears) { $checknum++; $confidence += $result_json->username->confidence; } if($this->check_emails && $result_json->email->appears) { $checknum++; $confidence += $result_json->email->confidence; } if($this->check_ips && $result_json->ip->appears) { $checknum++; $confidence += $result_json->ip->confidence; } if($checknum > 0 && $confidence) { $confidence = $confidence / $checknum; } if($confidence > $this->min_weighting_before_spam) { $is_spammer = true; } } else { throw new Exception('stopforumspam_error_decoding'); } } else { throw new Exception('stopforumspam_error_retrieving'); } if($this->plugins) { $params = array( 'username' => &$username, 'email' => &$email, 'ip_address' => &$ip_address, 'is_spammer' => &$is_spammer, 'confidence' => &$confidence, ); $this->plugins->run_hooks('stopforumspam_check_spammer_pre_return', $params); } if($this->log_blocks && $is_spammer) { log_spam_block( $username, $email, $ip_address, array( 'confidence' => (double)$confidence, ) ); } return $is_spammer; } /** * @param array $sfsSettingsEnabled * * @return string */ public function getErrorText($sfsSettingsEnabled) { global $mybb, $lang; foreach($sfsSettingsEnabled as $setting) { if($setting == 'stopforumspam_check_usernames' && $mybb->settings[$setting]) { $settingsenabled[] = $lang->sfs_error_username; continue; } if($setting == 'stopforumspam_check_emails' && $mybb->settings[$setting]) { $settingsenabled[] = $lang->sfs_error_email; continue; } if($setting == 'stopforumspam_check_ips' && $mybb->settings[$setting]) { $settingsenabled[] = $lang->sfs_error_ip; continue; } } if(sizeof($settingsenabled) > 1) { $lastsetting = $settingsenabled[sizeof($settingsenabled)-1]; unset($settingsenabled[sizeof($settingsenabled)-1]); $stopforumspamerror = implode($lang->comma, $settingsenabled) . " {$lang->sfs_error_or} " . $lastsetting; } else { $stopforumspamerror = $settingsenabled[0]; } return $stopforumspamerror; } }