MDL-65094 registration: don't encourage registration if on localhost
authorShamim Rezaie <shamim@moodle.com>
Mon, 25 Mar 2019 05:39:03 +0000 (16:39 +1100)
committerShamim Rezaie <shamim@moodle.com>
Tue, 26 Mar 2019 05:54:19 +0000 (16:54 +1100)
admin/renderer.php
lib/classes/hub/registration.php
lib/moodlelib.php

index 57eaa0e..2c14f02 100644 (file)
@@ -843,8 +843,7 @@ class core_admin_renderer extends plugin_renderer_base {
      */
     protected function registration_warning($registered) {
 
-        if (!$registered) {
-
+        if (!$registered && site_is_public()) {
             if (has_capability('moodle/site:config', context_system::instance())) {
                 $registerbutton = $this->single_button(new moodle_url('/admin/registration/index.php'),
                     get_string('register', 'admin'));
index 805434f..d2a8672 100644 (file)
@@ -524,13 +524,10 @@ class registration {
             $markasviewed = true;
         } else {
             $showregistration = !empty($CFG->registrationpending);
-            if ($showregistration) {
-                $host = parse_url($CFG->wwwroot, PHP_URL_HOST);
-                if ($host === 'localhost' || preg_match('|^127\.\d+\.\d+\.\d+$|', $host)) {
-                    // If it's a localhost, don't redirect to registration, it won't work anyway.
-                    $showregistration = false;
-                    $markasviewed = true;
-                }
+            if ($showregistration && !site_is_public()) {
+                // If it's not a public site, don't redirect to registration, it won't work anyway.
+                $showregistration = false;
+                $markasviewed = true;
             }
         }
         if ($markasviewed !== null) {
index fc88a13..1b33db8 100644 (file)
@@ -10283,3 +10283,28 @@ function get_callable_name($callable) {
         return $name;
     }
 }
+
+/**
+ * Tries to guess if $CFG->wwwroot is publicly accessible or not.
+ * Never put your faith on this function and rely on its accuracy as there might be false positives.
+ * It just performs some simple checks, and mainly is used for places where we want to hide some options
+ * such as site registration when $CFG->wwwroot is not publicly accessible.
+ * Good thing is there is no false negative.
+ *
+ * @return bool
+ */
+function site_is_public() {
+    global $CFG;
+
+    $host = parse_url($CFG->wwwroot, PHP_URL_HOST);
+
+    if ($host === 'localhost' || preg_match('|^127\.\d+\.\d+\.\d+$|', $host)) {
+        $ispublic = false;
+    } else if (\core\ip_utils::is_ip_address($host) && !ip_is_public($host)) {
+        $ispublic = false;
+    } else {
+        $ispublic = true;
+    }
+
+    return $ispublic;
+}