+/**
+ * Check if Jirafeau has a restriction on the IP address for uploading.
+ * @return true if uploading is IP restricted, false otherwise.
+ */
+function jirafeau_upload_has_ip_restriction($cfg)
+{
+ return count($cfg['upload_ip']) > 0;
+}
+
+/**
+ * Test if visitor's IP is authorized to upload at all.
+ *
+ * @param $cfg configuration
+ * @param $challengedIp IP to be challenged
+ * @return true if IP is authorized, false otherwise.
+ */
+function jirafeau_challenge_upload_ip($cfg, $challengedIp)
+{
+ // If no IP address have been listed, allow upload from any IP
+ if (!jirafeau_upload_has_ip_restriction($cfg)) {
+ return true;
+ }
+ return jirafeau_challenge_ip($cfg['upload_ip'], $challengedIp);
+}
+
+/**
+ * Test if visitor's IP is authorized to upload without a password.
+ *
+ * @param $cfg configuration
+ * @param $challengedIp IP to be challenged
+ * @return true if IP is authorized, false otherwise.
+ */
+function jirafeau_challenge_upload_ip_without_password($cfg, $challengedIp)
+{
+ return jirafeau_challenge_ip($cfg['upload_ip_nopassword'], $challengedIp);
+}
+
+/**
+ * Test if visitor's IP is authorized or password is supplied and authorized
+ * @param $ip IP to be challenged
+ * @param $password password to be challenged
+ * @return true if access is valid, false otherwise.
+ */
+function jirafeau_challenge_upload($cfg, $ip, $password)
+{
+ return jirafeau_challenge_upload_ip_without_password($cfg, $ip) ||
+ (!jirafeau_has_upload_password($cfg) && !jirafeau_upload_has_ip_restriction($cfg)) ||
+ (jirafeau_challenge_upload_password($cfg, $password) && jirafeau_challenge_upload_ip($cfg, $ip));
+}
+
+/** Tell if we have some HTTP headers generated by a proxy */
+function has_http_forwarded()
+{
+ return
+ !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ||
+ !empty($_SERVER['http_X_forwarded_for']);
+}
+
+/**
+ * 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']);
+ if ($l === false) {
+ return array();
+ }
+ 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
+ $ipa = explode(':', $ip);
+ if ($ipa === false) {
+ continue;
+ }
+ $ip = $ipa[0];
+ array_push($ip_list, preg_replace('/\s+/', '', $ip));
+ }
+ }
+ return $ip_list;
+}
+