]> git.p6c8.net - jirafeau_mojo42.git/blobdiff - lib/functions.php
[BUGFIX] fix broken admin file listing
[jirafeau_mojo42.git] / lib / functions.php
index 349274546feb7ee851d46b5f80ae16db85c18635..ae3516a49f5331d2e1129d94c2fd3f2dfe416f5f 100644 (file)
@@ -2,7 +2,7 @@
 /*
  *  Jirafeau, your web file repository
  *  Copyright (C) 2008  Julien "axolotl" BERNARD <axolotl@magieeternelle.org>
- *  Copyright (C) 2015  Jerome Jutteau <j.jutteau@gmail.com>
+ *  Copyright (C) 2015  Jerome Jutteau <jerome@jutteau.fr>
  *  Copyright (C) 2015  Nicola Spanti (RyDroid) <dev@nicola-spanti.info>
  *
  *  This program is free software: you can redistribute it and/or modify
@@ -319,6 +319,58 @@ function jirafeau_delete_file($hash)
     return $count;
 }
 
+
+/** hash file's content
+ * @param $method hash method, see 'file_hash' option. Valid methods are 'md5', 'md5_outside' or 'random'
+ * @param $file_path file to hash
+ * @returns hash string
+ */
+function jirafeau_hash_file($method, $file_path)
+{
+    switch ($method) {
+        case 'md5_outside':
+            return jirafeau_md5_outside($file_path);
+        case 'md5':
+            return md5_file($file_path);
+        case 'random':
+            return jirafeau_gen_random(32);
+    }
+    return md5_file($file_path);
+}
+
+/** hash part of file: start, end and size.
+ * This is a partial file hash, faster but weaker.
+ * @param $file_path file to hash
+ * @returns hash string
+ */
+function jirafeau_md5_outside($file_path)
+{
+    $out = false;
+    $handle = fopen($file_path, "r");
+    if ($handle === false) {
+        return false;
+    }
+    $size = filesize($file_path);
+    if ($size === false) {
+        goto err;
+    }
+    $first = fread($handle, 64);
+    if ($first === false) {
+        goto err;
+    }
+    if (fseek($handle, $size < 64 ? 0 : $size - 64) == -1) {
+        goto err;
+    }
+    $last = fread($handle, 64);
+    if ($last === false) {
+        goto err;
+    }
+    $out = md5($first . $last . $size);
+    err:
+    fclose($handle);
+    return $out;
+}
+
 /**
  * handles an uploaded file
  * @param $file the file struct given by $_FILE[]
@@ -333,7 +385,7 @@ function jirafeau_delete_file($hash)
  *   'link' => the link name of the uploaded file
  *   'delete_link' => the link code to delete file
  */
-function jirafeau_upload($file, $one_time_download, $key, $time, $ip, $crypt, $link_name_length)
+function jirafeau_upload($file, $one_time_download, $key, $time, $ip, $crypt, $link_name_length, $file_hash_method)
 {
     if (empty($file['tmp_name']) || !is_uploaded_file($file['tmp_name'])) {
         return (array(
@@ -361,7 +413,7 @@ function jirafeau_upload($file, $one_time_download, $key, $time, $ip, $crypt, $l
     }
 
     /* file informations */
-    $hash = md5_file($file['tmp_name']);
+    $hash = jirafeau_hash_file($file_hash_method, $file['tmp_name']);
     $name = str_replace(NL, '', trim($file['name']));
     $mime_type = $file['type'];
     $size = $file['size'];
@@ -517,6 +569,14 @@ function check_errors($cfg)
     if (!is_writable(VAR_ASYNC)) {
         add_error(t('ASYNC_DIR_W'), VAR_ASYNC);
     }
+
+    if ($cfg['enable_crypt'] && $cfg['litespeed_workaround']) {
+        add_error(t('INCOMPATIBLE_OPTIONS_W'), 'enable_crypt=true<br>litespeed_workaround=true');
+    }
+
+    if ($cfg['one_time_download'] && $cfg['litespeed_workaround']) {
+        add_error(t('INCOMPATIBLE_OPTIONS_W'), 'one_time_download=true<br>litespeed_workaround=true');
+    }
 }
 
 /**
@@ -567,15 +627,9 @@ function jirafeau_admin_list($name, $file_hash, $link_hash)
         echo t('LS_FILES');
     }
     echo '</legend>';
-    echo '<table border="1" width="1100">';
+    echo '<table>';
     echo '<tr>';
-    echo '<th>' . t('FILENAME') . '</th>';
-    echo '<th>' . t('TYPE') . '</th>';
-    echo '<th>' . t('SIZE') . '</th>';
-    echo '<th>' . t('EXPIRE') . '</th>';
-    echo '<th>' . t('ONETIME') . '</th>';
-    echo '<th>' . t('UPLOAD_DATE') . '</th>';
-    echo '<th>' . t('ORIGIN') . '</th>';
+    echo '<th></th>';
     echo '<th>' . t('ACTION') . '</th>';
     echo '</tr>';
 
@@ -612,22 +666,15 @@ function jirafeau_admin_list($name, $file_hash, $link_hash)
                 echo '<tr>';
                 echo '<td>' .
                 '<strong><a id="upload_link" href="f.php?h='. jirafeau_escape($node) .'" title="' .
-                    t('DL_PAGE') . '">' . jirafeau_escape($l['file_name']) . '</a></strong>';
-                echo '</td>';
-                echo '<td>' . jirafeau_escape($l['mime_type']) . '</td>';
-                echo '<td>' . jirafeau_human_size($l['file_size']) . '</td>';
-                echo '<td>' . ($l['time'] == -1 ? '∞' : jirafeau_get_datetimefield($l['time'])) . '</td>';
-                echo '<td>';
-                if ($l['onetime'] == 'O') {
-                    echo 'Y';
-                } else {
-                    echo 'N';
-                }
-                echo '</td>';
-                echo '<td>' . jirafeau_get_datetimefield($l['upload_date']) . '</td>';
-                echo '<td>' . $l['ip'] . '</td>';
-                echo '<td>' .
-                '<form method="post">' .
+                    t('DL_PAGE') . '">' . jirafeau_escape($l['file_name']) . '</a></strong><br/>';
+                echo t('TYPE') . ': ' . jirafeau_escape($l['mime_type']) . '<br/>';
+                echo t('SIZE') . ': ' . jirafeau_human_size($l['file_size']) . '<br>';
+                echo t('EXPIRE') . ': ' . ($l['time'] == -1 ? '∞' : jirafeau_get_datetimefield($l['time'])) . '<br/>';
+                echo t('ONETIME') . ': ' . ($l['onetime'] == 'O' ? 'Yes' : 'No') . '<br/>';
+                echo t('UPLOAD_DATE') . ': ' . jirafeau_get_datetimefield($l['upload_date']) . '<br/>';
+                echo t('ORIGIN') . ': ' . $l['ip'] . '<br/>';
+                echo '</td><td>';
+                echo '<form method="post">' .
                 '<input type = "hidden" name = "action" value = "download"/>' .
                 '<input type = "hidden" name = "link" value = "' . $node . '"/>' .
                 jirafeau_admin_csrf_field() .
@@ -806,6 +853,10 @@ function jirafeau_async_init($filename, $type, $one_time, $key, $time, $ip)
         return;
     }
 
+    /* touch empty data file */
+    $w_path = $p . $ref . '_data';
+    touch($w_path);
+
     /* md5 password or empty */
     $password = '';
     if (!empty($key)) {
@@ -893,7 +944,7 @@ function jirafeau_async_push($ref, $data, $code, $max_file_size)
   * @param $link_name_length link name length
   * @return a string containing the download reference followed by a delete code or the string 'Error'
   */
-function jirafeau_async_end($ref, $code, $crypt, $link_name_length)
+function jirafeau_async_end($ref, $code, $crypt, $link_name_length, $file_hash_method)
 {
     /* Get async infos. */
     $a = jirafeau_get_async_ref($ref);
@@ -917,7 +968,7 @@ function jirafeau_async_end($ref, $code, $crypt, $link_name_length)
         }
     }
 
-    $hash = md5_file($p);
+    $hash = jirafeau_hash_file($file_hash_method, $p);
     $size = filesize($p);
     $np = s2p($hash);
     $delete_link_code = jirafeau_gen_random(5);
@@ -953,7 +1004,7 @@ function jirafeau_async_end($ref, $code, $crypt, $link_name_length)
     $l = s2p("$hash_link");
     if (!@mkdir(VAR_LINKS . $l, 0755, true) ||
         !rename($link_tmp_name, VAR_LINKS . $l . $hash_link)) {
-        echo "Error";
+        return 'Error';
     }
 
     /* Clean async upload. */
@@ -1284,3 +1335,12 @@ function jirafeau_admin_csrf_field()
 {
     return "<input type='hidden' name='admin_csrf' value='". $_SESSION['admin_csrf'] . "'/>";
 }
+
+function jirafeau_dir_size($dir)
+{
+    $size = 0;
+    foreach (glob(rtrim($dir, '/').'/*', GLOB_NOSORT) as $entry) {
+        $size += is_file($entry) ? filesize($entry) : jirafeau_dir_size($entry);
+    }
+    return $size;
+}

patrick-canterino.de