MDL-67861 libraries: Refactor is_ip_in_subnet_list in ip_utils
authorBrendan Heywood <brendan@catalyst-au.net>
Wed, 5 Feb 2020 11:50:20 +0000 (22:50 +1100)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Thu, 5 Mar 2020 00:28:04 +0000 (01:28 +0100)
lib/classes/ip_utils.php
lib/moodlelib.php
lib/tests/ip_utils_test.php

index 42abcb4..d2e9a3d 100644 (file)
@@ -224,4 +224,25 @@ final class ip_utils {
         }
         return false;
     }
+
+    /**
+     * Is an ip in a given list of subnets?
+     *
+     * @param string $ip - the IP to test against the list
+     * @param string $list - the list of IP subnets
+     * @param string $delim a delimiter of the list
+     * @return bool
+     */
+    public static function is_ip_in_subnet_list($ip, $list, $delim = "\n") {
+        $list = explode($delim, $list);
+        foreach ($list as $line) {
+            $tokens = explode('#', $line);
+            $subnet = trim($tokens[0]);
+            if (address_in_subnet($ip, $subnet)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
 }
index d7fbbfb..65f5a28 100644 (file)
@@ -9170,24 +9170,13 @@ function cleardoubleslashes ($path) {
  * @return bool
  */
 function remoteip_in_list($list) {
-    $inlist = false;
     $clientip = getremoteaddr(null);
 
     if (!$clientip) {
         // Ensure access on cli.
         return true;
     }
-
-    $list = explode("\n", $list);
-    foreach ($list as $line) {
-        $tokens = explode('#', $line);
-        $subnet = trim($tokens[0]);
-        if (address_in_subnet($clientip, $subnet)) {
-            $inlist = true;
-            break;
-        }
-    }
-    return $inlist;
+    return \core\ip_utils::is_ip_in_subnet_list($clientip, $list);
 }
 
 /**
index 035f8d5..238d457 100644 (file)
@@ -376,4 +376,32 @@ class core_ip_utils_testcase extends basic_testcase {
             [false, 'trouble.com.au'] // The allowed domain (above) has a space at the front and so will return false.
         ];
     }
+
+    /**
+     * Data provider for test_is_ip_in_subnet_list.
+     *
+     * @return array
+     */
+    public function data_is_ip_in_subnet_list() {
+        return [
+            [true, '1.1.1.1', '1.1.1.1', "\n"],
+            [false, '1.1.1.1', '2.2.2.2', "\n"],
+            [true, '1.1.1.1', "1.1.1.5\n1.1.1.1", "\n"],
+            [true, '1.1.1.1', "1.1.1.5,1.1.1.1", ","],
+        ];
+    }
+
+    /**
+     * Test checking ips against a list of allowed domains.
+     *
+     * @param  bool $expected Expected result
+     * @param  string $ip IP address
+     * @param  string $list list of  IP subnets
+     * @param  string $delim delimiter of list
+     * @dataProvider data_is_ip_in_subnet_list
+     */
+    public function test_is_ip_in_subnet_list($expected, $ip, $list, $delim) {
+        $this->assertEquals($expected, \core\ip_utils::is_ip_in_subnet_list($ip, $list, $delim));
+    }
+
 }