diff --git a/inc/statifyblacklist.class.php b/inc/statifyblacklist.class.php index 233c427..3b981ab 100644 --- a/inc/statifyblacklist.class.php +++ b/inc/statifyblacklist.class.php @@ -1,36 +1,49 @@ 0 ) { - /* Get full referer string */ + // Get full referer string. $referer = ( isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : '' ); - /* Merge given regular expressions into one */ + // Merge given regular expressions into one. $regexp = '/' . implode( "|", array_keys( self::$_options['referer']['blacklist'] ) ) . '/'; if ( self::$_options['referer']['regexp'] == 2 ) { $regexp .= 'i'; } - /* Check blacklist (return NULL to continue filtering) */ + // Check blacklist (return NULL to continue filtering). return ( preg_match( $regexp, $referer ) === 1 ) ? true : null; } else { - /* Extract relevant domain parts */ + // Extract relevant domain parts. $referer = strtolower( ( isset( $_SERVER['HTTP_REFERER'] ) ? parse_url( $_SERVER['HTTP_REFERER'], PHP_URL_HOST ) : '' ) ); - /* Get blacklist */ + // Get blacklist. $blacklist = self::$_options['referer']['blacklist']; - /* Check blacklist */ - if ( isset( $blacklist[ $referer ] ) ) { + // Check blacklist. + if ( isset( $blacklist[$referer] ) ) { return true; } } } - /* Target blacklist (since 1.4.0) */ + // Target blacklist (since 1.4.0) if ( isset( self::$_options['target']['active'] ) && self::$_options['target']['active'] != 0 ) { - /* Regular Expression filtering since 1.3.0 */ + // Regular Expression filtering since 1.3.0. if ( isset( self::$_options['target']['regexp'] ) && self::$_options['target']['regexp'] > 0 ) { - /* Get full referer string */ + // Get full referer string. $target = ( isset( $_SERVER['REQUEST_URI'] ) ? wp_unslash( $_SERVER['REQUEST_URI'] ) : '/' ); - /* Merge given regular expressions into one */ + // Merge given regular expressions into one $regexp = '/' . implode( "|", array_keys( self::$_options['target']['blacklist'] ) ) . '/'; if ( self::$_options['target']['regexp'] == 2 ) { $regexp .= 'i'; } - /* Check blacklist (return NULL to continue filtering) */ + // Check blacklist (return NULL to continue filtering). return ( preg_match( $regexp, $target ) === 1 ) ? true : null; } else { - /* Extract target page */ + // Extract target page. $target = ( isset( $_SERVER['REQUEST_URI'] ) ? wp_unslash( $_SERVER['REQUEST_URI'] ) : '/' ); - /* Get blacklist */ + // Get blacklist. $blacklist = self::$_options['target']['blacklist']; - /* Check blacklist */ - if ( isset( $blacklist[ $target ] ) ) { + // Check blacklist. + if ( isset( $blacklist[$target] ) ) { return true; } } } - /* IP blacklist (since 1.4.0) */ + // IP blacklist (since 1.4.0). if ( isset ( self::$_options['ip']['active'] ) && self::$_options['ip']['active'] != 0 ) { if ( ( $ip = self::getIP() ) !== false ) { foreach ( self::$_options['ip']['blacklist'] as $net ) { @@ -209,34 +225,35 @@ class StatifyBlacklist { } } - /* Skip and continue (return NULL), if all blacklists are inactive */ + // Skip and continue (return NULL), if all blacklists are inactive. return null; } /** * Helper method to determine the client's IP address. + * * If a proxy is used, the X-Real-IP or X-Forwarded-For header is checked, otherwise the default remote address. * For performance reasons only the most common flags are checked. This might be even reduce by user configuration. * Maybe some community feedback will ease the decision on that. * - * @return string|bool the client's IP address or FALSE, if none could be determined + * @return string|bool the client's IP address or FALSE, if none could be determined. */ private static function getIP() { foreach ( array( -// 'HTTP_CLIENT_IP', + // 'HTTP_CLIENT_IP', 'HTTP_X_REAL_IP', 'HTTP_X_FORWARDED_FOR', -// 'HTTP_X_FORWARDED', -// 'HTTP_X_CLUSTER_CLIENT_IP', -// 'HTTP_FORWARDED_FOR', -// 'HTTP_FORWARDED', + // 'HTTP_X_FORWARDED', + // 'HTTP_X_CLUSTER_CLIENT_IP', + // 'HTTP_FORWARDED_FOR', + // 'HTTP_FORWARDED', 'REMOTE_ADDR' ) as $k ) { - if ( isset( $_SERVER[ $k ] ) ) { - foreach ( explode( ',', $_SERVER[ $k ] ) as $ip ) { + if ( isset( $_SERVER[$k] ) ) { + foreach ( explode( ',', $_SERVER[$k] ) as $ip ) { if ( filter_var( $ip, FILTER_VALIDATE_IP ) !== false ) { return $ip; } @@ -250,18 +267,18 @@ class StatifyBlacklist { /** * Helper function to check if an IP address matches a given subnet. * - * @param string $ip IP address to check - * @param string $net IP address or subnet in CIDR notation + * @param string $ip IP address to check. + * @param string $net IP address or subnet in CIDR notation. * - * @return bool TRUE, if the given IP addresses matches the given subnet + * @return bool TRUE, if the given IP addresses matches the given subnet. */ private static function cidrMatch( $ip, $net ) { - if ( substr_count( $net, ':' ) > 1 ) { /* Check for IPv6 */ + if ( substr_count( $net, ':' ) > 1 ) { // Check for IPv6. if ( ! ( ( extension_loaded( 'sockets' ) && defined( 'AF_INET6' ) ) || @inet_pton( '::1' ) ) ) { return false; } - if ( false !== strpos( $net, '/' ) ) { /* Parse CIDR subnet */ + if ( false !== strpos( $net, '/' ) ) { // Parse CIDR subnet. list( $base, $mask ) = explode( '/', $net, 2 ); if ( $mask < 1 || $mask > 128 ) { @@ -283,18 +300,18 @@ class StatifyBlacklist { $left = $mask - 16 * ( $i - 1 ); $left = ( $left <= 16 ) ? $left : 16; $maskB = ~( 0xffff >> $left ) & 0xffff; - if ( ( $bytesAddr[ $i ] & $maskB ) != ( $bytesTest[ $i ] & $maskB ) ) { + if ( ( $bytesAddr[$i] & $maskB ) != ( $bytesTest[$i] & $maskB ) ) { return false; } } return true; - } else { /* Check for IPv4 */ + } else { // Check for IPv4. if ( ! filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) { return false; } - if ( false !== strpos( $net, '/' ) ) { /* Parse CIDR subnet */ + if ( false !== strpos( $net, '/' ) ) { // Parse CIDR subnet. list( $base, $mask ) = explode( '/', $net, 2 ); if ( $mask === '0' ) { @@ -304,7 +321,7 @@ class StatifyBlacklist { if ( $mask < 0 || $mask > 32 ) { return false; } - } else { /* Use single address */ + } else { // Use single address. $base = $net; $mask = 32; } diff --git a/inc/statifyblacklist_admin.class.php b/inc/statifyblacklist_admin.class.php index b93158d..cc9b74a 100644 --- a/inc/statifyblacklist_admin.class.php +++ b/inc/statifyblacklist_admin.class.php @@ -1,26 +1,34 @@ $sanitizedReferer ); } elseif ( ! empty( array_diff( $givenIP, $sanitizedIP ) ) ) { return array( 'ip' => array_diff( $givenIP, $sanitizedIP ) ); } - /* Update database on success */ + // Update database on success. if ( ( is_multisite() && array_key_exists( STATIFYBLACKLIST_BASE, (array) get_site_option( 'active_sitewide_plugins' ) ) ) ) { update_site_option( 'statify-blacklist', $options ); } else { @@ -47,33 +55,42 @@ class StatifyBlacklist_Admin extends StatifyBlacklist { } } - /* Refresh options */ + // Refresh options. parent::update_options( $options ); return false; } /** - * Add configuration page to admin menu + * Add configuration page to admin menu. * * @since 1.0.0 */ public function _add_menu_page() { $title = __( 'Statify Blacklist', 'statify-blacklist' ); if ( self::$multisite ) { - add_submenu_page( 'settings.php', $title, $title, 'manage_network_plugins', 'statify-blacklist-settings', array( - 'StatifyBlacklist_Admin', - 'settings_page' - ) ); + add_submenu_page( + 'settings.php', $title, $title, 'manage_network_plugins', 'statify-blacklist-settings', array( + 'StatifyBlacklist_Admin', + 'settings_page' + ) + ); } else { - add_submenu_page( 'options-general.php', $title, $title, 'manage_options', 'statify-blacklist', array( - 'StatifyBlacklist_Admin', - 'settings_page' - ) ); + add_submenu_page( + 'options-general.php', $title, $title, 'manage_options', 'statify-blacklist', array( + 'StatifyBlacklist_Admin', + 'settings_page' + ) + ); } } + /** + * Include the Statify-Blacklist settings page. + * + * @since 1.0.0 + */ public static function settings_page() { include STATIFYBLACKLIST_DIR . '/views/settings_page.php'; } @@ -81,12 +98,13 @@ class StatifyBlacklist_Admin extends StatifyBlacklist { /** * Add plugin meta links * - * @param array $links Registered links - * @param string $file The filename - * - * @return array Merged links - * * @since 1.0.0 + * + * @param array $links Registered links. + * @param string $file The filename. + * + * @return array Merged links. + * */ public static function plugin_meta_link( $links, $file ) { if ( $file == STATIFYBLACKLIST_BASE ) { @@ -97,14 +115,15 @@ class StatifyBlacklist_Admin extends StatifyBlacklist { } /** - * Add plugin action links - * - * @param array $links Registered links - * @param string $file The filename - * - * @return array Merged links + * Add plugin action links. * * @since 1.0.0 + * + * @param array $links Registered links + * @param string $file The filename + * + * @return array Merged links. + * */ public static function plugin_actions_links( $links, $file ) { $base = self::$multisite ? network_admin_url( 'settings.php' ) : admin_url( 'options-general.php' ); @@ -123,9 +142,11 @@ class StatifyBlacklist_Admin extends StatifyBlacklist { * Filter database for cleanup. * * @since 1.1.0 + * + * @global wpdb $wpdb WordPress database. */ public static function cleanup_database() { - /* Check user permissions */ + // Check user permissions. if ( ! current_user_can( 'manage_options' ) && ! ( defined( 'DOING_CRON' ) && DOING_CRON ) ) { die( __( 'Are you sure you want to do this?' ) ); } @@ -141,23 +162,23 @@ class StatifyBlacklist_Admin extends StatifyBlacklist { if ( $cleanRef ) { if ( isset( self::$_options['referer']['regexp'] ) && self::$_options['referer']['regexp'] > 0 ) { - /* Merge given regular expressions into one */ + // Merge given regular expressions into one. $refererRegexp = implode( "|", array_keys( self::$_options['referer']['blacklist'] ) ); } else { - /* Sanitize URLs */ + // Sanitize URLs. $referer = self::sanitizeURLs( self::$_options['referer']['blacklist'] ); - /* Build filter regexp */ + // Build filter regexp. $refererRegexp = str_replace( '.', '\.', implode( '|', array_flip( $referer ) ) ); } } if ( $cleanTrg ) { if ( isset( self::$_options['target']['regexp'] ) && self::$_options['target']['regexp'] > 0 ) { - /* Merge given regular expressions into one */ + // Merge given regular expressions into one. $targetRegexp = implode( "|", array_keys( self::$_options['target']['blacklist'] ) ); } else { - /* Build filter regexp */ + // Build filter regexp. $targetRegexp = str_replace( '.', '\.', implode( '|', array_flip( self::$_options['target']['blacklist'] ) ) ); } } @@ -166,39 +187,44 @@ class StatifyBlacklist_Admin extends StatifyBlacklist { if ( ! empty( $refererRegexp ) || ! empty( $targetRegexp ) ) { global $wpdb; - /* Execute filter on database */ + // Execute filter on database. if ( ! empty( $refererRegexp ) ) { $wpdb->query( - $wpdb->prepare( "DELETE FROM `$wpdb->statify` WHERE " - . ( ( self::$_options['referer']['regexp'] == 1 ) ? " BINARY " : "" ) - . "referrer REGEXP %s", $refererRegexp ) + $wpdb->prepare( + "DELETE FROM `$wpdb->statify` WHERE " + . ( ( self::$_options['referer']['regexp'] == 1 ) ? " BINARY " : "" ) + . "referrer REGEXP %s", $refererRegexp + ) ); } if ( ! empty( $targetRegexp ) ) { $wpdb->query( - $wpdb->prepare( "DELETE FROM `$wpdb->statify` WHERE " - . ( ( self::$_options['target']['regexp'] == 1 ) ? " BINARY " : "" ) - . "target REGEXP %s", $targetRegexp ) + $wpdb->prepare( + "DELETE FROM `$wpdb->statify` WHERE " + . ( ( self::$_options['target']['regexp'] == 1 ) ? " BINARY " : "" ) + . "target REGEXP %s", $targetRegexp + ) ); } - /* Optimize DB */ + // Optimize DB. $wpdb->query( "OPTIMIZE TABLE `$wpdb->statify`" ); - /* Delete transient statify data */ + // Delete transient statify data. delete_transient( 'statify_data' ); } } /** - * Sanitize URLs and remove empty results - * - * @param array $urls given array of URLs - * - * @return array sanitized array + * Sanitize URLs and remove empty results. * * @since 1.1.1 + * + * @param array $urls given array of URLs. + * + * @return array sanitized array. + * */ private static function sanitizeURLs( $urls ) { return array_flip( @@ -214,20 +240,27 @@ class StatifyBlacklist_Admin extends StatifyBlacklist { } /** - * Sanitize IP addresses with optional CIDR notation and remove empty results - * - * @param array $ips given array of URLs - * - * @return array sanitized array + * Sanitize IP addresses with optional CIDR notation and remove empty results. * * @since 1.4.0 + * + * @param array $ips given array of URLs. + * + * @return array sanitized array. + * */ private static function sanitizeIPs( $ips ) { - return array_filter( $ips, function ( $ip ) { - return preg_match( '/^((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]|[1-2][0-9]|3[0-2]))?$/', $ip ) || - preg_match( '/^(([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]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))?$/', $ip ); - } ); + return array_filter( + $ips, function ( $ip ) { + return preg_match( + '/^((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]|[1-2][0-9]|3[0-2]))?$/', $ip + ) || + preg_match( + '/^(([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]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))?$/', $ip + ); + } + ); } } diff --git a/inc/statifyblacklist_system.class.php b/inc/statifyblacklist_system.class.php index 4bdece9..394f16d 100644 --- a/inc/statifyblacklist_system.class.php +++ b/inc/statifyblacklist_system.class.php @@ -1,13 +1,21 @@ array( 'active' => self::$_options['active_referer'], @@ -125,9 +133,9 @@ class StatifyBlacklist_System extends StatifyBlacklist { self::update_options(); } - /* Version older than current major release */ + // Version older than current major release. if ( self::$_options['version'] < self::VERSION_MAIN ) { - /* Merge default options with current config, assuming only additive changes */ + // Merge default options with current config, assuming only additive changes. $options = array_merge_recursive( self::defaultOptions(), self::$_options ); $options['version'] = self::VERSION_MAIN; if ( ( is_multisite() && array_key_exists( STATIFYBLACKLIST_BASE, (array) get_site_option( 'active_sitewide_plugins' ) ) ) ) { diff --git a/statify-blacklist.php b/statify-blacklist.php index 48b1c18..8360206 100644 --- a/statify-blacklist.php +++ b/statify-blacklist.php @@ -1,41 +1,55 @@ array( - 'active' => 0, - 'cron' => 0, + 'active' => 0, + 'cron' => 0, 'regexp' => 0, 'blacklist' => array( 'example.com' => 0, 'example.net' => 1 ) ), - 'target' => array( - 'active' => 0, - 'cron' => 0, + 'target' => array( + 'active' => 0, + 'cron' => 0, 'regexp' => 0, 'blacklist' => array() ), - 'ip' => array( - 'active' => 0, + 'ip' => array( + 'active' => 0, 'blacklist' => array() ), 'version' => StatifyBlacklist::VERSION_MAIN ); - /* No multisite */ + // No multisite. StatifyBlacklist::$multisite = false; - /* No referer */ + // No referer. unset( $_SERVER['HTTP_REFERER'] ); $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); - /* Non-blacklisted referer */ + // Non-blacklisted referer. $_SERVER['HTTP_REFERER'] = 'http://example.org'; $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); - /* Blacklisted referer */ + // Blacklisted referer. $_SERVER['HTTP_REFERER'] = 'http://example.com'; $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); - /* Blacklisted referer with path */ + // Blacklisted referer with path. $_SERVER['HTTP_REFERER'] = 'http://example.net/foo/bar.html'; $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); - /* Activate filter and run tests again */ + // Activate filter and run tests again. StatifyBlacklist::$_options['referer']['active'] = 1; unset( $_SERVER['HTTP_REFERER'] ); @@ -78,53 +105,53 @@ class StatifyBlacklistTest extends PHPUnit_Framework_TestCase { * Test referer filter using regular expressions. */ public function testRefererRegexFilter() { - /* Prepare Options: 2 regular expressions */ + // Prepare Options: 2 regular expressions. StatifyBlacklist::$_options = array( 'referer' => array( - 'active' => 1, - 'cron' => 0, + 'active' => 1, + 'cron' => 0, 'regexp' => 1, 'blacklist' => array( 'example.[a-z]+' => 0, 'test' => 1 ) ), - 'target' => array( - 'active' => 0, - 'cron' => 0, + 'target' => array( + 'active' => 0, + 'cron' => 0, 'regexp' => 0, 'blacklist' => array() ), - 'ip' => array( - 'active' => 0, + 'ip' => array( + 'active' => 0, 'blacklist' => array() ), 'version' => StatifyBlacklist::VERSION_MAIN ); - /* No multisite */ + // No multisite. StatifyBlacklist::$multisite = false; - /* No referer */ + // No referer. unset( $_SERVER['HTTP_REFERER'] ); $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); - /* Non-blacklisted referer */ + // Non-blacklisted referer. $_SERVER['HTTP_REFERER'] = 'http://not.evil'; $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); - /* Blacklisted referer */ + // Blacklisted referer. $_SERVER['HTTP_REFERER'] = 'http://example.com'; $this->assertTrue( StatifyBlacklist::apply_blacklist_filter() ); - /* Blacklisted referer with path */ + // Blacklisted referer with path. $_SERVER['HTTP_REFERER'] = 'http://foobar.net/test/me'; $this->assertTrue( StatifyBlacklist::apply_blacklist_filter() ); - /* Matching both */ + // Matching both. $_SERVER['HTTP_REFERER'] = 'http://example.net/test/me'; $this->assertTrue( StatifyBlacklist::apply_blacklist_filter() ); - /* Mathinc with wrong case */ + // Mathinc with wrong case. $_SERVER['HTTP_REFERER'] = 'http://eXaMpLe.NeT/tEsT/mE'; $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); - /* Set RegExp filter to case insensitive */ + // Set RegExp filter to case insensitive. StatifyBlacklist::$_options['referer']['regexp'] = 2; $this->assertTrue( StatifyBlacklist::apply_blacklist_filter() ); } @@ -133,7 +160,7 @@ class StatifyBlacklistTest extends PHPUnit_Framework_TestCase { * Test the upgrade methodology for configuration options. */ public function testUpgrade() { - /* Create configuration of version 1.3 */ + // Create configuration of version 1.3. $options13 = array( 'active_referer' => 1, 'cron_referer' => 0, @@ -145,28 +172,28 @@ class StatifyBlacklistTest extends PHPUnit_Framework_TestCase { 'version' => 1.3 ); - /* Set options in mock */ + // Set options in mock. update_option( 'statify-blacklist', $options13 ); - /* Execute upgrade */ + // Execute upgrade. StatifyBlacklist_System::upgrade(); - /* Retrieve updated options */ + // Retrieve updated options. $optionsUpdated = get_option( 'statify-blacklist' ); - /* Verify size against default options (no junk left) */ + // Verify size against default options (no junk left). $this->assertEquals( 4, sizeof( $optionsUpdated ) ); $this->assertEquals( 4, sizeof( $optionsUpdated['referer'] ) ); $this->assertEquals( 4, sizeof( $optionsUpdated['target'] ) ); $this->assertEquals( 2, sizeof( $optionsUpdated['ip'] ) ); - /* Verify that original attributes are unchanged */ + // Verify that original attributes are unchanged. $this->assertEquals( $options13['active_referer'], $optionsUpdated['referer']['active'] ); $this->assertEquals( $options13['cron_referer'], $optionsUpdated['referer']['cron'] ); $this->assertEquals( $options13['referer'], $optionsUpdated['referer']['blacklist'] ); $this->assertEquals( $options13['referer_regexp'], $optionsUpdated['referer']['regexp'] ); - /* Verify that new attributes are present in config and filled with default values (disabled, empty) */ + // Verify that new attributes are present in config and filled with default values (disabled, empty). $this->assertEquals( 0, $optionsUpdated['target']['active'] ); $this->assertEquals( 0, $optionsUpdated['target']['cron'] ); $this->assertEquals( 0, $optionsUpdated['target']['regexp'] ); @@ -174,7 +201,7 @@ class StatifyBlacklistTest extends PHPUnit_Framework_TestCase { $this->assertEquals( 0, $optionsUpdated['ip']['active'] ); $this->assertEquals( array(), $optionsUpdated['ip']['blacklist'] ); - /* Verify that version number has changed to current release */ + // Verify that version number has changed to current release. $this->assertEquals( StatifyBlacklist::VERSION_MAIN, $optionsUpdated['version'] ); } @@ -182,63 +209,103 @@ class StatifyBlacklistTest extends PHPUnit_Framework_TestCase { * Test CIDR address matching for IP filter (#7) */ public function testCidrMatch() { - /* IPv4 tests */ + // IPv4 tests. $this->assertTrue( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( '127.0.0.1', '127.0.0.1' ) ) ); $this->assertTrue( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( '127.0.0.1', '127.0.0.1/32' ) ) ); - $this->assertFalse( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( - '127.0.0.1', - '127.0.0.1/33' - ) ) ); - $this->assertFalse( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( - '127.0.0.1', - '127.0.0.1/-1' - ) ) ); - $this->assertTrue( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( - '192.0.2.123', - '192.0.2.0/24' - ) ) ); - $this->assertFalse( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( - '192.0.3.123', - '192.0.2.0/24' - ) ) ); - $this->assertTrue( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( - '192.0.2.123', - '192.0.2.120/29' - ) ) ); - $this->assertFalse( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( - '192.0.2.128', - '192.0.2.120/29' - ) ) ); + $this->assertFalse( + invokeStatic( + StatifyBlacklist::class, 'cidrMatch', array( + '127.0.0.1', + '127.0.0.1/33' + ) + ) + ); + $this->assertFalse( + invokeStatic( + StatifyBlacklist::class, 'cidrMatch', array( + '127.0.0.1', + '127.0.0.1/-1' + ) + ) + ); + $this->assertTrue( + invokeStatic( + StatifyBlacklist::class, 'cidrMatch', array( + '192.0.2.123', + '192.0.2.0/24' + ) + ) + ); + $this->assertFalse( + invokeStatic( + StatifyBlacklist::class, 'cidrMatch', array( + '192.0.3.123', + '192.0.2.0/24' + ) + ) + ); + $this->assertTrue( + invokeStatic( + StatifyBlacklist::class, 'cidrMatch', array( + '192.0.2.123', + '192.0.2.120/29' + ) + ) + ); + $this->assertFalse( + invokeStatic( + StatifyBlacklist::class, 'cidrMatch', array( + '192.0.2.128', + '192.0.2.120/29' + ) + ) + ); $this->assertTrue( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( '10.11.12.13', '10.0.0.0/8' ) ) ); - $this->assertFalse( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( - '10.11.12.345', - '10.0.0.0/8' - ) ) ); + $this->assertFalse( + invokeStatic( + StatifyBlacklist::class, 'cidrMatch', array( + '10.11.12.345', + '10.0.0.0/8' + ) + ) + ); - /* IPv6 tests */ + // IPv6 tests. $this->assertTrue( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( '::1', '::1' ) ) ); $this->assertTrue( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( '::1', '::1/128' ) ) ); $this->assertFalse( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( '::1', '::1/129' ) ) ); $this->assertFalse( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( '::1', '::1/-1' ) ) ); - $this->assertTrue( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( - '2001:db8:a0b:12f0:1:2:3:4', - '2001:db8:a0b:12f0::1/64 ' - ) ) ); - $this->assertTrue( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( - '2001:db8:a0b:12f0::123:456', - '2001:db8:a0b:12f0::1/96 ' - ) ) ); - $this->assertFalse( invokeStatic( StatifyBlacklist::class, 'cidrMatch', array( - '2001:db8:a0b:12f0::1:132:465', - '2001:db8:a0b:12f0::1/96 ' - ) ) ); + $this->assertTrue( + invokeStatic( + StatifyBlacklist::class, 'cidrMatch', array( + '2001:db8:a0b:12f0:1:2:3:4', + '2001:db8:a0b:12f0::1/64 ' + ) + ) + ); + $this->assertTrue( + invokeStatic( + StatifyBlacklist::class, 'cidrMatch', array( + '2001:db8:a0b:12f0::123:456', + '2001:db8:a0b:12f0::1/96 ' + ) + ) + ); + $this->assertFalse( + invokeStatic( + StatifyBlacklist::class, 'cidrMatch', array( + '2001:db8:a0b:12f0::1:132:465', + '2001:db8:a0b:12f0::1/96 ' + ) + ) + ); } /** * Test sanitization of IP addresses */ public function testSanitizeIPs() { - /* IPv4 tests */ + // IPv4 tests. $valid = array( '192.0.2.123', '192.0.2.123/32', '192.0.2.0/24', '192.0.2.128/25' ); $invalid = array( '12.34.56.789', '192.0.2.123/33', '192.0.2.123/-1' ); $result = invokeStatic( StatifyBlacklist_Admin::class, 'sanitizeIPs', array( array_merge( $valid, $invalid ) ) ); @@ -246,7 +313,7 @@ class StatifyBlacklistTest extends PHPUnit_Framework_TestCase { $this->assertInternalType( 'array', $result ); $this->assertEquals( $valid, $result ); - /* IPv6 tests */ + // IPv6 tests. $valid = array( '2001:db8:a0b:12f0::', '2001:db8:a0b:12f0::1', @@ -270,22 +337,22 @@ class StatifyBlacklistTest extends PHPUnit_Framework_TestCase { * Test IP filter (#7). */ public function testIPFilter() { - /* Prepare Options: 2 blacklisted IPs, disabled */ + // Prepare Options: 2 blacklisted IPs, disabled. StatifyBlacklist::$_options = array( 'referer' => array( - 'active' => 0, - 'cron' => 0, + 'active' => 0, + 'cron' => 0, 'regexp' => 0, 'blacklist' => array() ), - 'target' => array( - 'active' => 0, - 'cron' => 0, + 'target' => array( + 'active' => 0, + 'cron' => 0, 'regexp' => 0, 'blacklist' => array() ), - 'ip' => array( - 'active' => 0, + 'ip' => array( + 'active' => 0, 'blacklist' => array( '192.0.2.123', '2001:db8:a0b:12f0::1' @@ -294,29 +361,29 @@ class StatifyBlacklistTest extends PHPUnit_Framework_TestCase { 'version' => StatifyBlacklist::VERSION_MAIN ); - /* No multisite */ + // No multisite. StatifyBlacklist::$multisite = false; - /* Set matching IP */ + // Set matching IP. $_SERVER['REMOTE_ADDR'] = '192.0.2.123'; $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); - /* Activate filter */ + // Activate filter. StatifyBlacklist::$_options['ip']['active'] = 1; $this->assertTrue( StatifyBlacklist::apply_blacklist_filter() ); - /* Try matching v6 address */ + // Try matching v6 address. $_SERVER['REMOTE_ADDR'] = '2001:db8:a0b:12f0::1'; $this->assertTrue( StatifyBlacklist::apply_blacklist_filter() ); - /* Non-matching addresses */ + // Non-matching addresses. $_SERVER['REMOTE_ADDR'] = '192.0.2.234'; $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); $_SERVER['REMOTE_ADDR'] = '2001:db8:a0b:12f0::2'; $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); - /* Subnet matching */ + // Subnet matching. StatifyBlacklist::$_options['ip']['blacklist'] = array( '192.0.2.0/25', '2001:db8:a0b:12f0::/96' ); - $_SERVER['REMOTE_ADDR'] = '192.0.2.123'; + $_SERVER['REMOTE_ADDR'] = '192.0.2.123'; $this->assertTrue( StatifyBlacklist::apply_blacklist_filter() ); $_SERVER['REMOTE_ADDR'] = '192.0.2.234'; $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); @@ -325,7 +392,7 @@ class StatifyBlacklistTest extends PHPUnit_Framework_TestCase { $_SERVER['REMOTE_ADDR'] = '2001:db8:a0b:12f0:0:1111::1'; $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); - /* Filter using proxy header */ + // Filter using proxy header. $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); $_SERVER['HTTP_X_FORWARDED_FOR'] = '192.0.2.123'; @@ -340,50 +407,50 @@ class StatifyBlacklistTest extends PHPUnit_Framework_TestCase { * Test simple target filter. */ public function testTargetFilter() { - /* Prepare Options: 2 blacklisted domains, disabled */ + // Prepare Options: 2 blacklisted domains, disabled. StatifyBlacklist::$_options = array( 'referer' => array( - 'active' => 0, - 'cron' => 0, + 'active' => 0, + 'cron' => 0, 'regexp' => 0, 'blacklist' => array() ), - 'target' => array( - 'active' => 0, - 'cron' => 0, + 'target' => array( + 'active' => 0, + 'cron' => 0, 'regexp' => 0, 'blacklist' => array( '/excluded/page/' => 0, '/?page_id=3' => 1 ) ), - 'ip' => array( - 'active' => 0, + 'ip' => array( + 'active' => 0, 'blacklist' => array() ), 'version' => StatifyBlacklist::VERSION_MAIN ); - /* No multisite */ + // No multisite. StatifyBlacklist::$multisite = false; - /* Empty target */ + // Empty target. unset( $_SERVER['REQUEST_URI'] ); $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); - /* Non-blacklisted targets */ + // Non-blacklisted targets. $_SERVER['REQUEST_URI'] = ''; $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); $_SERVER['REQUEST_URI'] = '/'; $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); $_SERVER['REQUEST_URI'] = '/?page_id=1'; $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); - /* Blacklisted referer */ + // Blacklisted referer. $_SERVER['REQUEST_URI'] = '/excluded/page/'; $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); $_SERVER['REQUEST_URI'] = '/?page_id=3'; $this->assertNull( StatifyBlacklist::apply_blacklist_filter() ); - /* Activate filter and run tests again */ + // Activate filter and run tests again. StatifyBlacklist::$_options['target']['active'] = 1; unset( $_SERVER['REQUEST_URI'] ); @@ -412,9 +479,8 @@ class StatifyBlacklistTest extends PHPUnit_Framework_TestCase { } } -/** - * Helper for testing inaccessible static methods - */ + +/** @ignore */ function invokeStatic( $class, $methodName, $parameters = array() ) { $reflection = new \ReflectionClass( $class ); $method = $reflection->getMethod( $methodName ); @@ -424,18 +490,19 @@ function invokeStatic( $class, $methodName, $parameters = array() ) { } -/* Some mocked functions */ +// Some mocked WP functions. $mock_options = array(); $mock_multisite = false; - +/** @ignore */ function is_multisite() { global $mock_multisite; return $mock_multisite; } +/** @ignore */ function wp_parse_args( $args, $defaults = '' ) { if ( is_object( $args ) ) { $r = get_object_vars( $args ); @@ -452,17 +519,20 @@ function wp_parse_args( $args, $defaults = '' ) { return $r; } +/** @ignore */ function get_option( $option, $default = false ) { global $mock_options; - return isset( $mock_options[ $option ] ) ? $mock_options[ $option ] : $default; + return isset( $mock_options[$option] ) ? $mock_options[$option] : $default; } +/** @ignore */ function update_option( $option, $value, $autoload = null ) { global $mock_options; - $mock_options[ $option ] = $value; + $mock_options[$option] = $value; } -function wp_unslash ( $value ) { +/** @ignore */ +function wp_unslash( $value ) { return is_string( $value ) ? stripslashes( $value ) : $value; -} \ No newline at end of file +} diff --git a/views/settings_page.php b/views/settings_page.php index 18b4328..c1c9ea7 100755 --- a/views/settings_page.php +++ b/views/settings_page.php @@ -1,44 +1,53 @@ array( @@ -61,7 +70,7 @@ if ( ! empty( $_POST['statifyblacklist'] ) ) { ) ); - /* Generate messages */ + // Generate messages. if ( $statifyBlacklistUpdateResult !== false ) { if ( array_key_exists( 'referer', $statifyBlacklistUpdateResult ) ) { $statifyBlacklistPostWarning = __( 'Some URLs are invalid and have been sanitized.', 'statify-blacklist' ); @@ -76,7 +85,7 @@ if ( ! empty( $_POST['statifyblacklist'] ) ) { ?>
-

+

'; @@ -85,191 +94,191 @@ if ( ! empty( $_POST['statifyblacklist'] ) ) { } if ( isset( $statifyBlacklistPostWarning ) ) { print '

' . - esc_html( $statifyBlacklistPostWarning ); + esc_html( $statifyBlacklistPostWarning ); print '
'; esc_html_e( 'Settings have not been saved yet.', 'statify-blacklist' ); print '

'; } if ( isset( $statifyBlacklistPostSuccess ) ) { print '

' . - esc_html( $statifyBlacklistPostSuccess ) . - '

'; + esc_html( $statifyBlacklistPostSuccess ) . + '

'; } ?> -
-
-

- +
-
-

- +
-
-

- +
-

- -


- -
- -

-
+

+ +


+ +
+ + +

+