]> git.p6c8.net - jirafeau.git/commitdiff
Add new `admin_ip` configuration option
authorJack Footner <jackrfootner@gmail.com>
Thu, 9 Mar 2023 05:02:57 +0000 (15:32 +1030)
committerJack Footner <jackrfootner@gmail.com>
Wed, 14 Jun 2023 06:41:37 +0000 (06:41 +0000)
admin.php
docker/README.md
docker/docker_config.php
lib/config.original.php
lib/functions.php

index 68e0f3bbe4a26bb282b82c5c584b0fd998120161..79918bea89eb695331cdeb860625b6c19c4b15bc 100644 (file)
--- a/admin.php
+++ b/admin.php
@@ -44,7 +44,8 @@ if (php_sapi_name() == "cli") {
     } else {
         die("No command found. Should be admin.php <clean_expired|clean_async>.\n");
     }
-} else {
+// Second check: Challenge by IP
+} elseif (true === jirafeau_challenge_admin_ip($cfg, get_ip_address($cfg))) {
     /* Disable admin interface if we have a empty admin password. */
     if (empty($cfg['admin_password']) && empty($cfg['admin_http_auth_user'])) {
         require(JIRAFEAU_ROOT . 'lib/template/header.php');
@@ -301,5 +302,7 @@ if (php_sapi_name() == "cli") {
     }
 
     require(JIRAFEAU_ROOT.'lib/template/footer.php');
+} else {
+    jirafeau_fatal_error(t('ACCESS_KO'), $cfg);
 }
 ?>
index 8d367ea48dffb456855f48a17f084516dbeb66e4..b30f63a5cfe5a2e813d50f6540cadaab728db208 100644 (file)
@@ -34,6 +34,7 @@ More details about options in `lib/config.original.php`.
 
 Available options:
 - `ADMIN_PASSWORD`: setup a specific admin password. If not set, a random password will be generated.
+- `ADMIN_IP`: set one or more ip allowed to access admin interface (separated by comma).
 - `WEB_ROOT`: setup a specific domain to point at when generating links (e.g. 'jirafeau.mydomain.com/').
 - `VAR_ROOT`: setup a specific path where to place files. default: '/data'.
 - `FILE_HASH`: can be set to `md5`, `partial_md5` or `random` (default).
index 8c63134df26862039eb32f1c39d65a1024dd8f89..2509fd05b2204a6414ed4cc6dc90c58bbb8fabd9 100644 (file)
@@ -172,6 +172,7 @@ function run_setup(&$cfg)
     env_2_cfg_int($cfg, 'maximal_upload_size');
     env_2_cfg_string_array($cfg, 'upload_password');
     env_2_cfg_string_array($cfg, 'upload_ip');
+    env_2_cfg_string_array($cfg, 'admin_ip');
     env_2_cfg_string_array($cfg, 'upload_ip_nopassword');
     env_2_cfg_string_array($cfg, 'proxy_ip');
     env_2_cfg_bool($cfg, 'store_uploader_ip');
index c666d03fa169c9e675f0f4e96f4f4f04c26b076c..154308955d9f8c7ec81eacc78f126359a89aadf4 100644 (file)
@@ -108,6 +108,14 @@ $cfg['admin_password'] = '';
  */
 $cfg['admin_http_auth_user'] = '';
 
+/* List of IP allowed to access the admin interface.
+ * If the list is empty, then there is no admin interface restriction based on IP.
+ * Elements of the list can be a single IP (e.g. "123.45.67.89") or
+ * an IP range (e.g. "123.45.0.0/16").
+ * Note that CIDR notation is available for IPv4 only for the moment.
+ */
+$cfg['admin_ip'] = array();
+
 /* Allow user to select different options for file expiration time.
  * Possible values in array:
  * 'minute': file is available for one minute
index d6f7cb03cf19c0056100d163a101a2d323bc5392..064d3a1e06dc922edfc27c487f784c42ce6b8e03 100644 (file)
@@ -1385,6 +1385,31 @@ function jirafeau_challenge_upload($cfg, $ip, $password)
             (jirafeau_challenge_upload_password($cfg, $password) && jirafeau_challenge_upload_ip($cfg, $ip));
 }
 
+/**
+ * Check if Jirafeau has a restriction on the IP address for accessing the admin interface.
+ * @return true if admin interface is IP restricted, false otherwise.
+ */
+function jirafeau_admin_has_ip_restriction($cfg)
+{
+    return count($cfg['admin_ip']) > 0;
+}
+
+/**
+ * Test if visitor's IP is authorized to access the admin interface.
+ *
+ * @param $cfg configuration
+ * @param $challengedIp IP to be challenged
+ * @return true if IP is authorized, false otherwise.
+ */
+function jirafeau_challenge_admin_ip($cfg, $challengedIp)
+{
+    // If no IP address have been listed, allow upload from any IP
+    if (!jirafeau_admin_has_ip_restriction($cfg)) {
+        return true;
+    }
+    return jirafeau_challenge_ip($cfg['admin_ip'], $challengedIp);
+}
+
 /** Tell if we have some HTTP headers generated by a proxy */
 function has_http_forwarded()
 {

patrick-canterino.de