From 633da4086dc5ada057903806e5d30ab4ff529a6e Mon Sep 17 00:00:00 2001 From: Stefan Kalscheuer Date: Tue, 25 May 2021 12:08:00 +0200 Subject: [PATCH] unique IP filter list --- inc/class-statifyblacklist-settings.php | 40 ++++++++++++++----------- test/StatifyBlacklist_Settings_Test.php | 5 ++-- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/inc/class-statifyblacklist-settings.php b/inc/class-statifyblacklist-settings.php index 2d5ff26..8973257 100644 --- a/inc/class-statifyblacklist-settings.php +++ b/inc/class-statifyblacklist-settings.php @@ -657,24 +657,28 @@ class StatifyBlacklist_Settings extends StatifyBlacklist { * @since 1.7.0 moved from StatifyBlacklist_Admin to StatifyBlacklist_Settings. */ private static function sanitize_ips( $ips ) { - return array_filter( - array_map( 'strtolower', $ips ), - function ( $ip ) { - return preg_match( - '/^((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])(\/([0-9]|[1-2][0-9]|3[0-2]))?$/', - $ip - ) || - preg_match( - '/^(([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}|([0-9a-f]{1,4}:){1,7}:|([0-9a-f]{1,4}:){1,6}:[0-9a-f]{1,4}' . - '|([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2}|([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3}' . - '|([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4}|([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5}' . - '|[0-9a-f]{1,4}:((:[0-9a-f]{1,4}){1,6})|:((:[0-9a-f]{1,4}){1,7}|:)' . - '|fe80:(:[0-9a-f]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\.){3}(25[0-5]|(2[0-4]' . - '|1?[0-9])?[0-9])|([0-9a-f]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))' . - '(\/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))?$/', - $ip - ); - } + return array_values( + array_unique( + array_filter( + array_map( 'strtolower', $ips ), + function ( $ip ) { + return preg_match( + '/^((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])(\/([0-9]|[1-2][0-9]|3[0-2]))?$/', + $ip + ) || + preg_match( + '/^(([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}|([0-9a-f]{1,4}:){1,7}:|([0-9a-f]{1,4}:){1,6}:[0-9a-f]{1,4}' . + '|([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2}|([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3}' . + '|([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4}|([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5}' . + '|[0-9a-f]{1,4}:((:[0-9a-f]{1,4}){1,6})|:((:[0-9a-f]{1,4}){1,7}|:)' . + '|fe80:(:[0-9a-f]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\.){3}(25[0-5]|(2[0-4]' . + '|1?[0-9])?[0-9])|([0-9a-f]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))' . + '(\/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))?$/', + $ip + ); + } + ) + ) ); } diff --git a/test/StatifyBlacklist_Settings_Test.php b/test/StatifyBlacklist_Settings_Test.php index 16e7620..10b5d6d 100644 --- a/test/StatifyBlacklist_Settings_Test.php +++ b/test/StatifyBlacklist_Settings_Test.php @@ -151,7 +151,7 @@ class StatifyBlacklist_Settings_Test extends PHPUnit\Framework\TestCase { ), 'ip' => array( 'active' => '1', - 'blacklist' => "127.0.0.1/8\r\nthisisnotanip", + 'blacklist' => "127.0.0.1/8\r\nthisisnotanip\r\n127.0.0.1/8", ), 'ua' => array( 'blacklist' => 'MyBot/1.23', @@ -240,6 +240,7 @@ class StatifyBlacklist_Settings_Test extends PHPUnit\Framework\TestCase { '2001:db8:a0b:12f0::1/128', '2001:DB8:A0B:12F0::/64', 'fe80::7645:6de2:ff:1', + '2001:db8:a0b:12f0::', '::ffff:192.0.2.123', ); $invalid = array( @@ -266,7 +267,7 @@ class StatifyBlacklist_Settings_Test extends PHPUnit\Framework\TestCase { 'fe80::7645:6de2:ff:1', '::ffff:192.0.2.123', ), - array_values( $result ) + $result ); }