/** * create_log function. * * @access public * @return void */ public function create_log($type, $status, $message, $download, $version) { global $wpdb; $wpdb->hide_errors(); $wpdb->insert($wpdb->download_log, array('type' => $type, 'user_id' => absint(get_current_user_id()), 'user_ip' => DLM_Utils::get_visitor_ip(), 'user_agent' => DLM_Utils::get_visitor_ua(), 'download_id' => absint($download->id), 'version_id' => absint($version->id), 'version' => $version->version, 'download_date' => current_time('mysql'), 'download_status' => $status, 'download_status_message' => $message), array('%s', '%d', '%s', '%s', '%d', '%d', '%s', '%s', '%s')); return $wpdb->insert_id; }
/** * Check blacklist (hooked into dlm_can_download) checks if the download request comes from blacklisted IP address or user agent * * Other plugins can use the 'dlm_can_download' filter directly to change access rights. * * @access public * * @param boolean $can_download * @param mixed $download * * @return boolean */ public function check_blacklist($can_download, $download) { // Check if IP is blacklisted if (false !== $can_download) { $visitor_ip = DLM_Utils::get_visitor_ip(); $ip_type = 0; if (filter_var($visitor_ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { $ip_type = 4; } elseif (filter_var($visitor_ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { $ip_type = 6; } $blacklisted_ips = preg_split("/\r?\n/", trim(get_option('dlm_ip_blacklist', ""))); /** * Until IPs are validated at time of save, we need to ensure entries * are legitimate before using them. Allow formats: * IPv4, e.g. 198.51.100.1 * IPv4/CIDR netmask, e.g. 198.51.100.0/24 * IPv6, e.g. 2001:db8::1 * IPv6/CIDR netmask, e.g. 2001:db8::/32 */ // IP/CIDR netmask regexes // http://blog.markhatton.co.uk/2011/03/15/regular-expressions-for-ip-addresses-cidr-ranges-and-hostnames/ // http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses $ip4_with_mask_pattern = '/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$/'; $ip6_with_mask_pattern = '/^((([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))(\\/[0-9][0-9]?|1([01][0-9]|2[0-8])))$/'; if (4 === $ip_type) { foreach ($blacklisted_ips as $blacklisted_ip) { // Detect unique IPv4 address and ranges of IPv4 addresses in IP/CIDR netmask format if (filter_var($blacklisted_ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) || preg_match($ip4_with_mask_pattern, $blacklisted_ip)) { if (DLM_Utils::ipv4_in_range($visitor_ip, $blacklisted_ip)) { $can_download = false; break; } } } } elseif (6 === $ip_type) { foreach ($blacklisted_ips as $blacklisted_ip) { // Detect unique IPv6 address and ranges of IPv6 addresses in IP/CIDR netmask format if (filter_var($blacklisted_ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) || preg_match($ip6_with_mask_pattern, $blacklisted_ip)) { if (DLM_Utils::ipv6_in_range($visitor_ip, $blacklisted_ip)) { $can_download = false; break; } } } } } // Check if user agent is blacklisted if (false !== $can_download) { // get request user agent $visitor_ua = DLM_Utils::get_visitor_ua(); // check if $visitor_ua isn't empty if (!empty($visitor_ua)) { // get blacklisted user agents $blacklisted_uas = preg_split("/\r?\n/", trim(get_option('dlm_user_agent_blacklist', ""))); if (!empty($blacklisted_uas)) { // loop through blacklisted user agents foreach ($blacklisted_uas as $blacklisted_ua) { if (!empty($blacklisted_ua)) { // check if blacklisted user agent is found in request user agent if (false !== stristr($visitor_ua, $blacklisted_ua)) { $can_download = false; break; } } } } } } return $can_download; }
/** * Check if visitor has downloaded version in the past 24 hours * * @param DLM_Download_Version $version * * @return bool */ private function has_ip_downloaded_version($version) { global $wpdb; return absint($wpdb->get_var($wpdb->prepare("SELECT COUNT(ID) FROM {$wpdb->download_log} WHERE type = 'download' AND `version_id` = %d AND `user_ip` = %s", $version->id, DLM_Utils::get_visitor_ip()))) > 0; }