]> git.p6c8.net - jirafeau_project.git/blobdiff - lib/functions.php
Merge branch 'master' of gitlab.com:mojo42/Jirafeau
[jirafeau_project.git] / lib / functions.php
index b98486f80fd4ed59888b1f086e2b78079d59f08f..2c799f28d4bdd4f10c21e4dd6a4a7a563770be1c 100644 (file)
@@ -98,6 +98,9 @@ function is_ssl() {
             return true;
     } elseif ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) ) {
         return true;
             return true;
     } elseif ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) ) {
         return true;
+    } elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
+        if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
+            return true;
     }
     return false;
 }
     }
     return false;
 }
@@ -443,7 +446,7 @@ jirafeau_upload ($file, $one_time_download, $key, $time, $ip, $crypt, $link_name
 }
 
 /**
 }
 
 /**
- * tells if a mime-type is viewable in a browser
+ * Tells if a mime-type is viewable in a browser
  * @param $mime the mime type
  * @returns a boolean telling if a mime type is viewable
  */
  * @param $mime the mime type
  * @returns a boolean telling if a mime type is viewable
  */
@@ -611,7 +614,7 @@ jirafeau_admin_list ($name, $file_hash, $link_hash)
                     continue;
 
                 /* Filter. */
                     continue;
 
                 /* Filter. */
-                if (!empty ($name) && !preg_match ("/$name/i", $l['file_name']))
+                if (!empty ($name) && !preg_match ("/$name/i", htmlspecialchars($l['file_name'])))
                     continue;
                 if (!empty ($file_hash) && $file_hash != $l['md5'])
                     continue;
                     continue;
                 if (!empty ($file_hash) && $file_hash != $l['md5'])
                     continue;
@@ -623,7 +626,7 @@ jirafeau_admin_list ($name, $file_hash, $link_hash)
                 '<form action = "admin.php" method = "post">' .
                 '<input type = "hidden" name = "action" value = "download"/>' .
                 '<input type = "hidden" name = "link" value = "' . $node . '"/>' .
                 '<form action = "admin.php" method = "post">' .
                 '<input type = "hidden" name = "action" value = "download"/>' .
                 '<input type = "hidden" name = "link" value = "' . $node . '"/>' .
-                '<input type = "submit" value = "' . $l['file_name'] . '" />' .
+                '<input type = "submit" value = "' . htmlspecialchars($l['file_name']) . '" />' .
                 '</form>';
                 echo '</td>';
                 echo '<td>' . $l['mime_type'] . '</td>';
                 '</form>';
                 echo '</td>';
                 echo '<td>' . $l['mime_type'] . '</td>';
@@ -904,7 +907,7 @@ jirafeau_async_push ($ref, $data, $code, $max_file_size)
   * @param $ref asynchronous upload reference
   * @param $code client code for this operation
   * @param $crypt boolean asking to crypt or not
   * @param $ref asynchronous upload reference
   * @param $code client code for this operation
   * @param $crypt boolean asking to crypt or not
-  * @param $link_name_length link name lenght
+  * @param $link_name_length link name length
   * @return  a string containing the download reference followed by a delete code or the string "Error"
   */
 function
   * @return  a string containing the download reference followed by a delete code or the string "Error"
   */
 function
@@ -1081,3 +1084,97 @@ function jirafeau_challenge_upload_password ($cfg, $password)
     return false;
 }
 
     return false;
 }
 
+/**
+ * Test if visitor's IP is authorized to upload.
+ * @param $ip IP to be challenged
+ * @return true if IP is authorized, false otherwise.
+ */
+function jirafeau_challenge_upload_ip ($cfg, $ip)
+{
+    if (count ($cfg['upload_ip']) == 0)
+        return true;
+    forEach ($cfg['upload_ip'] as $i)
+    {
+        if ($i == $ip)
+            return true;
+        // CIDR test for IPv4 only.
+        if (strpos ($i, '/') !== false)
+        {
+            list ($subnet, $mask) = explode('/', $i);
+            if ((ip2long ($ip) & ~((1 << (32 - $mask)) - 1) ) == ip2long ($subnet))
+                return true;
+        }
+    }
+    return false;
+}
+
+/** Tell if we have some HTTP headers generated by a proxy */
+function has_http_forwarded()
+{
+    if (!empty ($_SERVER['HTTP_X_FORWARDED_FOR']))
+        return true;
+    if (!empty ($_SERVER['http_X_forwarded_for']))
+        return true;
+    return false;
+}
+
+/**
+ * Generate IP list from HTTP headers generated by a proxy
+ * return  array of IP strings
+ */
+function get_ip_list_http_forwarded()
+{
+    $ip_list = array();
+    if (!empty ($_SERVER['HTTP_X_FORWARDED_FOR']))
+    {
+        $l = explode (',', $_SERVER['HTTP_X_FORWARDED_FOR']);
+        foreach ($l as $ip)
+            array_push ($ip_list, preg_replace ('/\s+/', '', $ip));
+    }
+    if (!empty ($_SERVER['http_X_forwarded_for']))
+    {
+        $l = explode (',', $_SERVER['http_X_forwarded_for']);
+        foreach ($l as $ip)
+        {
+            // Separate IP from port
+            $ip = explode (':', $ip)[0];
+            array_push ($ip_list, preg_replace ('/\s+/', '', $ip));
+        }
+    }
+    return $ip_list;
+}
+
+/**
+ * Get the ip address of the client from REMOTE_ADDR
+ * or from HTTP_X_FORWARDED_FOR if behind a proxy
+ * @returns an the client ip address
+ */
+function get_ip_address($cfg) {
+    $remote = $_SERVER['REMOTE_ADDR'];
+    if (count ($cfg['proxy_ip']) == 0 || !has_http_forwarded ())
+        return $remote;
+
+    $ip_list = get_ip_list_http_forwarded ();
+    if (count ($ip_list) == 0)
+        return $remote;
+
+    foreach ($cfg['proxy_ip'] as $proxy_ip)
+    {
+        if ($remote != $proxy_ip)
+            continue;
+        // Take the last IP (the one which has been set by the defined proxy).
+        return end ($ip_list);
+    }
+    return $remote;
+}
+
+/**
+ * Convert hexadecimal string to base64
+ */
+function hex_to_base64($hex)
+{
+    $b = '';
+    foreach (str_split ($hex, 2) as $pair)
+        $b .= chr (hexdec ($pair));
+    return base64_encode ($b);
+}

patrick-canterino.de